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

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).

EBF16

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.

63 názorů Vstoupit do diskuse
poslední názor přidán 24. 2. 2016 8:14

Školení: Měření a vyhodnocování kampaní

  •  
    Jak připravit a plánovat kampaně
  • Jak vyhodnocovat a využít důležité metriky
  • Jak to dělat u různých obchodních aktivit

Detailní informace o školení Měření a vyhodnocování kampaní»