Článek
Chtěl bych, aby čtenář pochopil nejen, co programátor dělá, ale hlavně proč to dělá a proč je to náročné a proč to bude trvat rok a já z toho budu napůl šílený.
Tajný život kódu aneb „Jak jsme naučili počítač přemýšlet jako knihovník“. Článek je o tom, co se děje na pozadí, když programátor píše kód, který má spravovat tisíce položek, ať už jde o sklad, seznam zaměstnanců nebo databáze knih. Nahlédneme pod pokličku jednoho skutečného vývoje a uvidíme, že programování je často detektivní práce, boj s logikou a hledání „jedinečného“ řešení, které usnadní život nejen uživateli, ale i samotnému počítači (serveru).
Kapitola 1: Problém s „prázdným místem“ aneb Proč chybí číslo 5? Představte si, že máte seznam zaměstnanců s čísly 1, 2, 3, 4, 6, 7. Číslo 5 chybí, protože dotyčný dal výpověď. Počítač dělá to, co se mu řekne. Většina programů to udělá jednoduše, přidává k nejvyššímu. Když přidáte nového zaměstnance, prostě mu dá číslo 8. Je to jednoduché, ale nepořádné. Ta díra v řadě vám pak může dělat problémy při vyhledávání.
Myšlenka: „Automatická inteligence“. Lepší zadání znělo: „Napiš mi funkci, která najde první volné místo v řadě a vloží tam nové číslo.“ To je jako když knihovník vidí prázdné místo mezi dvěma knihami a novou knihu nevloží na konec police, ale přesně do té mezery. Počítač se musí podívat na celý seznam, najít díru (např. chybějící číslo 5) a toto číslo přiřadit. Toto řešení zajišťuje kontinuitu. Znamená to, že pokud někdy budete chtít seznam porovnat s jiným, nikdy vám nebude chybět „propojovací“ článek. Je to ukázka toho, že programátor myslí na budoucnost a na to, aby data zůstala logicky uspořádaná i po mnoha změnách.
Kapitola 2: Kde se bere číslo 000? (Zápas s formátováním). Bitva o nuly. V zadání si všimnete, že čísla se mají ukládat jako „001“, „002“, a ne jako „1“ nebo „2“. Proč? Protože systém potřebuje pořádek. Když ví, že kód má například vždy tři znaky, je to pro něj snazší na třídění a vyhledávání než z něj dělat čísla, ta rovnat podle hodnot do řady a pak zase zpět. Kód „1“ není „01“ a to není „001“. Na to je nutné myslet.
Problém: Programátor dostal za úkol přidat automatické číslování. Zjistil ale, že i když existuje přepínač, který říká „Doplňuj nuly zleva“, systém si to stejně dělal po svém a občas číslo vygeneroval jako „1“ místo „001“. Detektivní práce: Musel projít stovky řádků kódu, aby našel „starý bug“ - kus kódu, který kdysi dávno někdo napsal a kterého si AI nevšimla při novém nastavení. To je, jako kdybyste v autě měli dva plynové pedály; jeden ovládá nový motor a druhý ten starý, zapomenutý v kufru, který ale zasahuje do toho hlavního. Netušíte to, protože program píše AI. Má 11 tisíc řádků, utopíte se. Ale pak přijde chyba a vy jste detektiv. Už zase. A zíráte, na co jste přišli. Musíte se AI správně zeptat a být podezíraví, jinak nepřijdete na nic.
Oprava spočívala v tom, že se našla ona „stará cesta“ a přepsala se tak, aby poslouchala nové centrální nastavení, když už nejde vynechat úplně. Pokud by se to udělalo „správně“ a byla cesta jen jedna, uživatel by po otevření obrazovky čekal sekundu. Ale stará cesta hned po startu překlopí data do kolonek a tabulky, a nečeká se, až všechno naběhne, aby se dělal regulérní dotaz. Naběhne to za třetinu sekundy, ale cesty jsou dvě. Rychlost vždy něco stojí. A výsledkem je peklo. AI to v trénovacích datech nemá. Spoléháme na emergenci systému a to, co si odvodí. Programátor nevytváří novou funkci, ale synchronizuje tu starou. Musí v PHP simulovat, co ta druhá dělá v javascriptu (jiný jazyk). Náročné. Velmi. Pro programátora i pro AI. Sice je to formálně „špatně“ (má být vždy jediná cesta), ale skoro sekunda za to stojí. Za dvacet let ji lidé ušetří milionkrát a systém je čilejší a data jsou vidět hned po startu.
Kapitola 3: Děsivé tlačítko „Uložit“ aneb proč se data ztrácí. Opět detektivní práce. Hodiny a hodiny. Uživatel měl problém: Když uložil nový záznam, v tabulce se neobjevil. Musel stisknout Ctrl+F5 (tvrdé obnovení stránky), aby ho viděl. Co se děje? Počítač má dvě „cesty“, jak data získat: Rychlá cesta (AJAX): Když uložíte, počítač pošle dotaz na server, server řekne „Mám to“ a pošle zpět jen nové číslo. Jenže nic nedorazilo. Co se mohlo stát, je minimálně 50 věcí. Od toho je diagnostika F12. „Vysyp mi do konzole výpisy ze všech míst, kde může dojít ke kolizi a nezapsání.“ Byl jsem líný, nezkontroloval soubory. Pak se ukázalo, že problém je čtení. A nakonec se ukázalo, že hlavní problém je špatně přidělené ID položky, se kterým si to nevědělo rady. Jak říkám, detektivka. A jsme zase na začátku, nezafungoval totiž systém přidělování nových čísel. Místo aby zaplnil mezeru, hodil tam tři nuly.
Kapitola 4: Křehká rovnováha aneb jak sladit záhlaví s řádky. Rozjeté sloupce. Programátor dostal za úkol spočítat šířku sloupců. Zadefinoval si je tak, že celková šířka měla být např. 70 jednotek. Zadal šířky jednotlivých sloupců, ale ony se mu v záhlaví a v řádcích rozjely (záhlaví bylo při obsahu širší než řádky, musely se měnit pravidla, dohlédnout, aby nic nepřeteklo a nic se „automaticky“ nerozšiřovalo, tři hodiny ladění a desítky iterací). Navíc musel zadávat pozice s kalkulačkou a vždy vycházet z celkového součtu. To je práce navíc. Děláme framework (šablonu) a ta má práci ulehčit a ne zkomplikovat. Tak si ji zkomplikujeme nyní a ušetříme 100× více práce v budoucnu. Klasika. Nikdy nic není dost složité.
Záleželo na tom, jak je text zarovnaný (doleva, doprava, na střed) a hlavně na odsazení (padding). Každý sloupec měl uvnitř trochu místa navíc, aby se text „nelepil“ na okraje. Toto místo ale při výpočtu šířky AI zapomněla přičíst. Matematické řešení: Programátor musel vytvořit algoritmus, který: Sečte všechny zadané šířky. Vydělí jimi celkovou šířku tabulky (získá poměr). Přičte k výsledku procento za „odstupy“ (padding). Poslední sloupec natáhne tak, aby vyplnil zbytek místa (kompenzace zaokrouhlovacích chyb). A AI to odflákla, nechtělo se jí to dělat, pořád to zjednodušovala nebo „nepochopila“ (rozuměj nepovažovala to za důležité). Bylo to na tři posty a mraky tokenů.
Kapitola 5: Ochranná síť aneb „Nesmíš opustit kolonku!“. Nenechám tě udělat chybu. Toto je jedna z nejdůležitějších funkcí programu. Protože je obecná a vázaná na různé zvolené kolonky a chová se pokaždé stejně. Představte si, že vyplňujete důležité pole (např. kód zboží) a omylem napíšete kód, který už existuje. Chování: Systém má na takový případ připravenou past. Jakmile se pokusíte přesunout myší na jiné políčko, program vás nepustí. Zkontroloval to za vás, že kód už existuje. Objeví se červená zpráva „Změňte údaj v kolonce“ a kurzor zůstane v chybném poli, dokud to neopravíte. Stejně tak zabrání uložení, pokud je povinné pole prázdné.
Je to mnohem lepší, než když systém uloží chybu a vy ji pak hodinu hledáte. Tento princip se nazývá „Validace za běhu“ (On-the-fly validation). Program nečeká na tlačítko „Uložit“, ale kontroluje vás průběžně. Je to jako mít přísného učitele, který vám přes rameno kontroluje, že nepíšete blbosti, a hned vás opraví, než to hodíte do koše.
Kapitola 6: Kopírovací stroj aneb proč se to musí dělat pořád dokola? Univerzální řešení. Na konci deníku dnešní práce je vidět, že jsem udělal opravu v jednom souboru (obsluha.php) a pak ji musel aplikovat na 20 dalších souborů. To zní jako nuda, ale je to absolutně nezbytné. Myšlenka: Všechny stránky používají stejný základ (framework). Když programátor objeví chybu v základu, musí ji opravit všude. Ano, myslel si, že už má mustr hotový a tak ho rozkopíroval a ohnul dvacetkrát jinak. Předčasně. Až s praxí vidí, co všechno je ještě špatně.
Místo toho, aby opravoval každou stránku zvlášť jinak, vytváří stejný návod ("záplatu"), který aplikuje na všechny. To zajišťuje, že se všechny stránky chovají stejně. Uživatel pak nemusí přemýšlet: "Na „Dokladech“ to dělá tohle, ale ve „Skladu“ zase něco jiného. Přitom princip je stejný. Tlačítko hledat, zpět, vložit, OK. Vše musí jednotné a tlačítka v místech, kde je člověk čeká. A svítit právě to tlačítko, které je při práci na řadě. To je základ dobrého UX (User Experience).
Na první pohled to vypadá jako strašná zdlouhavá nuda. Opravování nul, počítání šířek tabulek a hlídání prázdných polí. Ve skutečnosti je to ale boj o řád, rychlost a jednoduchost. Brilantní programátor není ten, kdo napíše složitý kód. Je to ten, kdo napíše kód, který přemýšlí za uživatele. Vyhledá díru v číselné řadě za něj, srovná mu tabulku přesně na pixely, nenechá ho uložit duplicitní položku a udělá to na všech dvaceti obrazovkách úplně stejně.
Když příště uvidíte program, kde se vám něco zdá „samozřejmé“ (např. že nová položka dostane správné číslo), vězte, že za tím stojí hodiny detektivní práce, matematiky a logiky, která toto „samozřejmé“ umožnila.
Programování většího projektu není otázka dnů, ani měsíců, ale let. Projekt, který není triviální, ale komplexní, tak je minimálně na rok práce, spíše na dva, někdy na tři. Až poté za něj dostanete svou první korunu. A nebo také ne. AI sice vše zrychlí, ale člověk je ten, kdo musí mít vizi, kdo to dotlačí tam, kde to chce mít, aby to šlo použít. AI je totiž zatím slepá. Tvrdí, jak vše funguje a i kdyby ano, tak s překvapením. A co je nejhorší, tak UX (uživatelské rozhraní a zážitek) je téměř vždy tragický. Je to celé jen o vás. A nenechat se zmást grafiky, kteří tvrdí, že „je to ošklivé“ a nechápou, že u něčeho, s čím člověk dělá každý den, nejde o krásu. Jde o přehlednost, pomáhání uživateli, vedení a nulovou únavu očí. Takže barvičky vyloženě škodí. A ikonky zase nafukují zbytečně tlačítka a kradou prostor. Pak musíte rolovat menu a je to práce navíc. Tisíckrát, den co den. Samozřejmě je to věc názoru. Ale přesně takto se liší dobrý program od špatného, že ten dobrý vám pomáhá a ulehčuje práci.
Programování je totiž mnohem více, než si často člověk uvědomuje. Není to řemeslo, je to umění. Řemeslo dnes zvládne AI, ale bez architekta to nejde. Malujete Monu Lisu. A začínáte tím, že si strouháte cihly do oleje, aby byla pěkná červená, se kterou budete malovat. Tak tady musí nejdříve vzniknout pokročilý grid, který zvládne statisíce položek a neshodí prohlížeč (na to padl první rok - běžné gridy prohlížeč shodí a chovají se jinak, zdržují). Až druhý rok vzniká a ladí se vlastní framework. A třetí rok bude teprve projekt i když jsou k němu už nyní stovky stran. Žádná legrace to není. Ale když má člověk vizi, tak co může dělat. Nechtějí mě zaměstnat, musím si odtrpět tuhle cestu.
Zdroj: https://jirikoudela.eu/






