Hlavní navigace

Senzory Martina Malého: Pokud chcete být špičkový programátor…

Martin Malý 10. 2. 2016

Mám moc rád programátorská škádlení. Takové to kdo je Opravdový Programátor a kdo jen neschopný lepič kódu.

Pokud chcete být špičkový programátor, naučte se psát pro jednočipy. Aspoň pro dva až tři, a tím myslím složitější úlohu než blikání dvěma LEDkama z 8052, co jste dělali na škole.

Silné prohlášení na úvod, že? Vysvětlím… Mám moc rád programátorská škádlení. Takové to kdo je Opravdový Programátor a kdo jen neschopný lepič kódu. Když vedete třeba webový magazín o programování, jak se to stalo mně, máte hodně příležitostí sledovat to z první ruky, a stejně tolik příležitostí být takovými pseudospory otráven.

Na Zdrojáku byly nejčastější spory u článků o nějaké webové technologii. Pravidelně dorazili komentátoři, co sami psali v Javě nebo C++, a posmívali se “webařům”. Někteří jednodušší se zastydlou pubertou dokonce sami sebe nazývali “programátorskou šlechtou”… (Ne, nic z toho nevyvozuju, jen ukazuju, jakým materiálem se člověk musí brodit.) Každopádně bylo moc fajn sledovat, jak se tihle vývojáři kasají na “webaře”, nazývají je pohrdavými slovy, jejich práci označují za “patlání”, a přitom vědět, že o dvě úrovně níž by tihle hoši s rameny přes celý monitor byli ztraceni.

Tímto verbálně agresivním úvodem jsem se propracoval k tématu, o kterém chci dnes psát, totiž jak se vyvíjí pro taková připojená zařízení s jednočipem. Trošku se možná dotkneme i důvodů, proč je Raspberry Pi, alespoň v diskusích na českých programátorských webech, mnohem oblíbenější než Arduino. Odpověď zní: úroveň použitého jazyka.

Ve světě embedded technologií, kam většina zařízení pro IoT spadá, se hraje na úplně jiné úrovni, než v běžném aplikačním vývoji. Dokonce i trošku jinde, než je třeba vývoj ovladačů. Jakmile sestoupíte na úroveň mikrořadičů, tak musíte zapomenout na většinu svých “dobrých programátorských návyků”, a musíte hrát tvrdou a nekompromisní hru. Java? Zapomeňte! C#? Taky! C++? Ano, ale hodně opatrně. C většinou ano, ale v některých případech musíte jít ještě níž, až k assembleru, a využívat špinavé triky, jako třeba vedlejší efekty instrukcí. 

Při programování jednočipů jste zkrátka neustále něčím omezováni: velikostí paměti (co dokážete v jednom kilobajtu programové paměti typu FLASH?), rychlostí, tím, že je zařízení nějak zapojené a vy nemůžete říct “přehoďte to na jiné piny…”, zkrátka musíte hledat kompromisy, a někdy i jít za ně, protože máte na výběr pouze ze dvou možností: Buď to nějak uděláte a bude to, i když ne zcela čistými metodami, nebo to nebude! A pokud nedokážete nadřadit cíl (“bude to!”) nad prostředky (“ale to je programátorská prasárna!”), tak se o vývoj embedded zařízení, a myslím tím opravdový vývoj, ne psaní aplikací v Pythonu na Raspberry s Linuxem, ani nepokoušejte.

Velkou výhodou je průprava z osmibitů. Pokud jste začínali na nějakém Commodoru, Spectru, Atari či jiném osmibitu z 80. let, jste zvyklí i na takovou formu programování, jakému by se dneska řeklo extrémní: “256 bajtů volné paměti? Tam se vejde ještě několik funkcí!” Ale důležitější je, že máte představu, jak takový procesor pracuje. Moderní jednočip není zařízení, které by bylo nějak výrazně jiné než tehdejší osmibit – míněno koncepčně. Ano, většina z nich používá harvardskou architekturu, takže triky se samomodifikujícím kódem nejsou úplně na místě, ale jinak je to plusmínus stejný zážitek. Ale představte si běžného absolventa VŠ s pětiletou praxí v Javě / C++ (bez ohledu na to, jestli se považuje za “šlechtu” či nikoli), posazeného před nějakou úlohu pro jednočip. A dejme tomu, že je to znalý člověk, co umí i Python, trochu C a mnoho frameworků.

Já si to představovat nemusím, já to mnohokrát viděl. Vývojář zajásá, že nemusí nutně do assembleru, céčko vezme jako přijatelnou alternativu a začne psát krásný kód. Strukturovaný, objektový, správně si alokuje paměť, správně ji uvolňuje, protože ví, že garbage collector je zlo, a nakonec napíše velmi krásný kód, který má jen několik drobných chybek, třeba to, že se do jednočipu nevejde, že má málo paměti RAM a že je mnohem pomalejší, než by mohl být. No jo. Nikdo učený z nebe nespadl.

A tak si sednete a vysvětlujete. Že alokace paměti má obrovskou režii a že ve stroji, co má 512 bajtů RAM, se na dynamickou alokaci paměti z haldy asi moc hrát nemůže. Nebo že objekty jsou dnešní standard, ale mají taky velkou režii. Ta je u velkých strojů překrytá obrovskou silou jejich procesorů, ale u jednočipu je vidět každý bajt, každý takt… 

Že je potřeba otevřít mentální krabičku s nápisem PROGRAMÁTORSKÉ PEKLO, pevně přibouchnutou od třetího semestru, a vytáhnout odtamtud pojmy, jako je globální proměnná, podprogram, GOTO, tabulkové GOTO. Zvyknout si, že paměť je jediná struktura, totiž pole bajtů, a všechny ostatní struktury jsou jen abstrakce, která může taky stát reálné prostředky. Zvyknout si, že lokální proměnné v pravém slova smyslu nejsou, a když jsou, tak hodně omezené. 

Nestydět se znovuvyužívat proměnné k jinému účelu, když jsou už nepotřebné. A tak dále. Naštěstí moderní překladače spoustu takových věcí pohlídají a programátora od možného dopadu jeho akcí ochrání, ale nejsou všespásné, takže se připravte na to, že dříve nebo později stejně do toho assembleru budete muset sestoupit, podívat se, jak váš překladač generuje určité konstrukce, a zamyslet se nad tím, jestli to nelze napsat lépe, jednodušeji, přímočařeji (většinou to půjde).

V jednom článku, co jsem kdysi překládal, psal autor o tom, co potřebuje programátor k tomu, aby byl špičkový. Znát několik různých jazyků s různými koncepcemi, hodně programovat, mít hlavu otevřenou podnětům z jiných oblastí a oborů, a jako jeden z bodů bylo: zkusit si navrhnout vlastní jazyk a napsat k němu kompiler. Naprosto se s autorem v tomto bodě ztotožňuju. Dnes bych doplnil ještě jeden bod: Zkusit si napsat něco pro IoT, pro jednočip. Věřte, že i když se pak vrátíte do svého bezpečného světa enterprise aplikací, tak už nikdy nenapíšete takový nesmysl, jako “programátorská šlechta”, a že se na každý řádek kódu budete dívat jinak. Uvidíte prosté sčítání a před očima vám proběhnou i instrukce, které ten procesor doopravdy dělá.

Je to zkušenost k nezaplacení, a navíc ve světě Internetu věcí máte spoustu příležitostí vyzkoušet si to nejen jako mentální cvičení, ale i na něčem praktickém.

Našli jste v článku chybu?

10. 2. 2016 7:22

Souhlas hlavně proto, že jsem začínal na ZX Spectrum, četl jsem knihu "Bity do Bytu" a programoval jsem embedded zařízení (ještě než se jim začalo říkat embedded :-))

Ale musím autora upozornit, že existují disciplíny (třebas real time systémy, low latency apod.) kde si člověk také zažije opravdové peklo - třeba když honí super kód se za určitých okolností provede o milisekundu pomaleji.

Zase je pravda, že 99% programátorů, když mu řeknu přerušení, to spíš považují za vstup šéfa do kanclu a tí…

10. 2. 2016 6:54

pojke (neregistrovaný)

Dnes je k neuvereni, ze mne (pred revoluci) ucili programovat v assembleru na beznem gymnaziu v ramci povinne volitelneho predmetu ... samozrejme, zadna velka hloubka, ale neco malo v cloveku zustane z toho "programovami" PMD85

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Měšec.cz: Přejete si číslo účtu na přání?

Přejete si číslo účtu na přání?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Root.cz: Telegram spustil anonymní blog Telegraph

Telegram spustil anonymní blog Telegraph

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

DigiZone.cz: HD programy ČT i v UPC Horizon

HD programy ČT i v UPC Horizon

Měšec.cz: Platby do zahraničí: pozor na tučné poplatky

Platby do zahraničí: pozor na tučné poplatky

DigiZone.cz: Milan Kruml: procházka TV historií

Milan Kruml: procházka TV historií

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

120na80.cz: Rovnátka, která nejsou vidět

Rovnátka, která nejsou vidět

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

Root.cz: Mirai má nový cíl 5 milionů routerů

Mirai má nový cíl 5 milionů routerů

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Podnikatel.cz: Dárky v podnikání. Jak je uplatnit v daních?

Dárky v podnikání. Jak je uplatnit v daních?

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

Podnikatel.cz: Zavře krám u #EET Malá pokladna a Teeta?

Zavře krám u #EET Malá pokladna a Teeta?

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU