Neprogramátor
Myslím si, že Aaronova představa programování jako čarování je vlastně dost přesná. Čaroděj vytvoří kouzelnou větu v neznámém jazyce, neznámého významu, která se neznámo jak vykoná, aby nakonec dostal, co chtěl.
Ale přece každý jazyk je neznámý, dokud se nenaučíme slova a skladbu věty. A žádná věta nedává smysl, dokud se v jazyce nenaučíme vyjádřit své myšlenky. Zbývá pak už jediný rozdíl mezi čarodějem a neprogramátorem – kouzelná hůlka, která kouzelnou větu vykoná. A ani čaroděj většinou netuší, jak to ta hůlka provede.
Kdybych se někdy znovu učil programovat, chtěl bych začít s How to Design Programs (HTDP). Kouzelný jazyk, který HTDP používá, se jmenuje Racket a kouzelná hůlka je vývojové prostředí DrRacket. (Racket a DrRacket jde stáhnout najednou.)
Neprogramátor je kniha pro ty, co chtějí vědět, cože to to programování vlastně je. Zároveň je i pro ty, co se chtějí naučit programovat, ale HTDP pro ně postupuje moc rychle – po přečtení by měli HTDP zvládnout. Naopak pro ty, které HTDP nudí, je tu Scheme Primer a R5RS. A samozřejmě SICP.
Kniha je napsaná od začátku do konce a stejně tak by se nejspíš měla i číst, protože následující kapitoly staví na těch předchozích: Dialog s kouzelnou hůlkou představuje interaktivní způsob programování, Dopis pro kouzelnou hůlku vysvětluje práci programátorů a Nekonečně kouzelné jazykolamy pojednávají o tom, jak a proč toho programátoři tolik zvládnou. Kouzelné čtení a Čarodějnický žargon doplňují základní témata knihy.
Člověk se učí ve spirále stoupající vzhůru a Neprogramátor aspiruje být první částí spirály k pochopení programování. Jinými slovy: napoprvé netřeba porozumět všemu.
Kouzelný jazyk, kouzelná hůlka
[editovat | editovat zdroj]Jazyk čeština má deset druhů slov: podstatná jména (třeba "kniha"
), přídavná jména (třeba "kouzelná"
), zájmena, číslovky (třeba 0
a 3.14
), slovesa (třeba sečti
a spoj
), a pak ještě příslovce, předložky, spojky, částice a citoslovce. Každá věta začíná velkým písmenem, pak jsou slova oddělená mezerami, a nakonec tečka .
, vykřičník !
, nebo otazník ?
.
Sečti 0 a 3.14!
Spoj "kouzelná" a "kniha".
V jazyce čeština je stavba věty celkem složitá. Příklady vět výše zní kostrbatě a nejspíš by se použily spíše věty:
Prosím, sečti pro mě čísla nula a 3.14.
Co vznikne, když ke slovu "kouzelná" přidáš slovo "kniha"?
Kouzelný jazyk Racket má jen dva druhy slov: podstatná jména a slovesa. Podstatná jména ukrývají nějakou informaci. Třeba "kniha"
, "kouzelná"
, 0
a 3.14
jsou všechno podstatná jména kouzelného jazyka. Slovesa říkají, co se má s podstatnými jmény stát. Třeba +
a string-append
jsou slovesa kouzelného jazyka. Každá kouzelná věta začíná závorkou (
a hned po ní následuje sloveso. Potom jsou podstatná jména oddělená mezerami a úplně nakonec zase závorka )
.
(+ 0 3.14)
(string-append "kouzelná" "kniha")
Aby čaroděj mohl v kouzelném jazyce vyjádřit, co chce, kromě slov a skladby věty (odborně syntax) potřebuje znát i význam slov (odborně sémantika), protože i když slova zná a vytvoří kouzelnou větu podle správných pravidel, výsledek nemusí dávat smysl. Věta
Prosím, sečti pro mě nulu a "kniha".
smysl nedává, stejně tak ani kouzelná věta
(+ 0 "kniha")
A nakonec je tu kouzelná hůlka, která umí vykonat kouzelné věty zapsané v kouzelném jazyce Racket. Kouzelná hůlka vykoná kouzelnou větu
(+ 0 3.14)
tak, že se z ní stane
3.14
a z kouzelné věty
(string-append "kouzelná" "kniha")
"kouzelnákniha"
Když kouzelná hůlka vykoná kouzelnou větu, výsledek je slovo kouzelného jazyka. Může to být podstatné jméno ukrývající informaci, kterou chtěl čaroděj získat. Nebo to může být sloveso, které čaroděj použije pro další čarování.
Protože výsledek vykonání kouzelné věty je slovo kouzelného jazyka, může čaroděj použít více jednodušších vět, aby vytvořil jednu dlouhou mocnou kouzelnou větu.
(+ (+ 0 3.14) (+ 0 3.14))
6.28
Jenže aby se vykonala kouzelná věta složená z menších, musí se nejprve vykonat ty menší. O to se už ale postará kouzelná hůlka.
Dialog s kouzelnou hůlkou
[editovat | editovat zdroj]Kouzelná hůlka poslouchá, jestli po ní čaroděj něco nechce. Pokud ji čaroděj předá kouzelnou větu, kouzelná hůlka kouzelnou větu přečte a vykoná, vytiskne výsledek a pak čeká, až jí čaroděj předá nějakou další kouzelnou větu. Anglicky se Přečti, Vykonej, Vytiskni (výsledek), Opakuj řekne Read, Evaluate, Print, Loop, a tak se dialogu s kouzelnou hůlkou říká zkrátka REPL.
REPL je ve vývojovém prostředí DrRacket prostor v dolní polovině. V následujících kapitolách se REPL používá pro sdílení kouzelných vět s kouzelnou hůlkou.
Podstatná jména kouzelného jazyka uchovávají nějakou informaci. Jsou ale různé druhy informací, jako třeba desetinná čísla, celá čísla, nebo text, či pravdivostní hodnota: pravda nebo nepravda. S každým typem podstatných jmen je potřeba zacházet trochu jinak, a tak se pro každý typ podstatného jména hodí trochu jiná slovesa.
Když se stejná informace, třeba číslo nebo text, používá na více místech, hodí se si ji zapamatovat. To se nejlépe udělá tak, že se informace pojmenuje a její jméno se pak použije všude tam, kde je informace třeba.
Když kouzelná hůlka vykoná kouzelnou větu, výsledkem je slovo kouzelného jazyka. A když je to slovo podstatné jméno a informace v něm ukrytá buď pravda, nebo nepravda, říká se, že ona kouzelná věta je predikát. (Je rozdíl mezi lží a nepravdou – nepravda je opak pravdy a lež je uvedení v omyl.)
Čarodějové často tvoří mocné kouzelné věty, ve kterých používají predikáty, aby na kouzelné hůlce nechali rozhodnutí, kterou z jednodušších vět vykoná kouzelná hůlka jako další. Takovým mocným kouzelným větám se říká podmínkové výrazy.
Čaroděj občas ví, jakou kouzelnou větu by sestavil – jaké by použil sloveso a co by se mělo stát s podstatnými jmény, ale kouzelná hůlka žádné takové sloveso nezná. Pak čaroději nezbývá než kouzelnou hůlku nové sloveso naučit. Musí ale použít jen slovesa a podstatná jména kouzelného jazyka, kterým kouzelná hůlka rozumí.
Epilog dialogu s kouzelnou hůlkou
[editovat | editovat zdroj]Máme za sebou čtyři kapitoly popisující základy kouzelného jazyka: jaká jsou podstatná jména a která slovesa se k nim hodí, jak pojmenovat konkrétní informace ukryté v podstatných jménech, rozhodování ponechané na kouzelné hůlce a jak kouzelnou hůlku naučit nová kouzelná slovesa.
Nedá se říci, že neprogramátor je teď čaroděj. Ještě chvíli potrvá, než dokáže v kouzelném jazyce plynule vyjádřit své myšlenky, než přijde na to, jaké myšlenky to vlastně mají být, než se naučí čarodějnické triky ověřené staršími generacemi, jak zaznamenat a zkontrolovat kouzelné věty a jak spolupracovat s ostatními čaroději.
Neprogramátor by ale měl už vědět, cože to to programování-čarování vlastně je, že je to vytváření kouzelných vět, které vykoná kouzelná hůlka, a měl by umět přečíst a rozumět jednoduchým větám kouzelného jazyka.
Poslední věc, kterou se snad neprogramátor naučil, je, že kouzelné (programovací) jazyky se liší. Liší se skladbou kouzelné věty a kouzelnými slovy a jejich významem. Z toho plyne, co by měl neprogramátor hledat, setká-li se s novým kouzelným jazykem: skladbu věty, význam slov, co jsou podstatná jména a která slovesa se k nim hodí, jak podstatná jména pojmenovat, jak funguje rozhodování a jak tvořit nová kouzelná slovesa.
Kouzelných (programovacích) jazyků je hodně (moc velká spousta). Pro zajímavost:
Kouzelné čtení
[editovat | editovat zdroj]Jazyk je jeden ze způsobů, jak se dají sdílet myšlenky. Použije se při mluvení a poslouchání a psaní a čtení. To, že kouzelná hůlka dokáže vykonat věty zapsané v některém z jazyků, neovlivňuje možnost sdílet v jazyce myšlenky. Vykonání kouzelné věty kouzelnou hůlkou ale souvisí s tím, jak se dá s myšlenkami vyjádřenými v kouzelném jazyce pracovat, protože dost práce udělá právě kouzelná hůlka.
Zde se hodí zopakovat, že kouzelný jazyk Racket má jen dva druhy slov: podstatná jména a slovesa. Podstatná jména ukrývají nějakou informaci. Třeba "kniha"
, "kouzelná"
, 0
a 3.14
jsou všechno podstatná jména kouzelného jazyka. Slovesa říkají, co se má s podstatnými jmény stát. Třeba +
a string-append
jsou slovesa kouzelného jazyka. Každá kouzelná věta začíná závorkou (
a hned po ní následuje sloveso. Potom jsou podstatná jména oddělená mezerami a úplně nakonec zase závorka )
.
A tady je několik myšlenek o nekouzelném světě zapsaných ve větách kouzelného jazyka:
Dopis pro kouzelnou hůlku
[editovat | editovat zdroj]Povídat si s kouzelnou hůlkou má své kouzlo, ale mnohdy je efektivnější nechat kouzelnou hůlku najednou vykonat vše, co má čaroděj na srdci.
Čaroděj často přemýšlí, ptá se kouzelné hůlky a dělá si poznámky – dokud nemá sepsáno vše, co chce vykonat. Nakonec předá kouzelné hůlce všechny kouzelné věty najednou a kouzelná hůlka je všechny, jednu po druhé, vykoná.
Pro psaní dopisu kouzelné hůlce ve vývojovém prostředí DrRacket se používá horní polovina a výsledek vyhodnocení dopisu kouzelnou hůlkou se objeví v REPL, v dolní polovině.
Čarodějnické řemeslo je o vynalézání a psaní. Vynalézání většinou znamená hledání řešení problému. Mnohdy je vynalézání ale také hledání problému, a hlavně hledání dobrého popisu problému. V každém případě je k vynalézání potřeba znalost, která nesouvisí s programováním. Často je to matematika a fyzika, ale pokud je zadání problému vyhrát šachy, je nutné znát pravidla šachu.
A pak je tu psaní. Stejně jako knihy, programy se jednou napíšou a mnohokrát čtou. Vyplatí se proto napsat je dobře. Hezky. Takže čarodějové jsou vlastně spisovatelé.
Čarodějové pomáhají s řešením problémů ostatním, co čarovat nedovedou. Pomocí dopisů a kouzelné hůlky vytvářejí kouzelné lektvary, které stačí vypít. Samozřejmě je rozumné pít lektvary jen od důvěryhodných čarodějů.
Epilog dopisu pro kouzelnou hůlku
[editovat | editovat zdroj]Teď už bychom měli znát všechny čtyři oblasti čarodějnického řemesla: psaní zdrojového kódu a dokumentace (komentářů), zaznamenávání historie, vytváření spustitelných souborů a psaní testů.
Je potřeba zdůraznit, že programy se jednou napíšou a mnohokrát čtou, protože programy, potažmo zdrojový kód, je třeba udržovat. Technologie zastarávají a čarodějové stárnou, takže pokud má program technologie a čaroděje přežít, je potřeba, aby zdrojový kód programu pochopili další a další čarodějové.
Spolupráce čarodějů je nesmírně důležitá, pokud má jejich program změnit svět; žádný čaroděj nenapíše program, který změní svět, sám. Základ spolupráce čarodějů je sdílení změn v kouzelných větách, tedy sdílení změn částí zdrojového kódu. To úzce souvisí se zaznamenáváním historie, protože to, co mezi sebou čarodějové ve skutečnosti sdílí, je historie změn, jež mohou vést k vylepšení zdrojového kódu. Alespoň to si čarodějové myslí. No a spolupráce spočívá v tom, že se zeptají ostatních čarodějů, jestli si to myslí také.
Aby čarodějové byli užiteční, je potřeba, aby pomáhali ostatním. To dělají tím, že z kouzelných vět, zdrojových kódů, vytváří lektvary, programy, které může spustit každý.
Čarodějové dělají chyby a dělají je dost často. Aby se chybám vyhnuli, vymysleli testy. Testy jsou (zase jen) kouzelné věty, které utvrdí čaroděje v tom, že kouzelné věty, které vymyslel, dělají to, co dělat mají.
Nekonečně kouzelné jazykolamy
[editovat | editovat zdroj]Kouzelná hůlka je až neuvěřitelně rychlá a přesná. I kdyby se čaroděj snažil sebevíc, kouzelnou větu (+ 123 456)
vyhodnotí kouzelná hůlka rychleji a bez chyb. A co teprve (* 123 456)
!
Protože je kouzelná hůlka velký pomocník, snaží se čarodějové formulovat kouzelné věty tak, aby toho napsali málo, ale kouzelná hůlka toho hodně vykonala. To je důvod, proč čarodějové píší kouzelné hůlce dopisy. Dialog s kouzelnou hůlkou čarodějové vedou jen tehdy, když potřebují něco málo velmi rychle.
Navíc mohou čarodějové naučit kouzelnou hůlku, aby kouzelné věty vykonávala pořád dokola, nebo aby zpracovala dohromady velké množství informací.
Čarodějové často potřebují vykonat nějaké kouzlo znovu a znovu a znovu. Psát stejné kouzelné věty pod sebe je nudné a navíc není vždy jasné, kolik kouzelných vět bude nakonec potřeba. V takových situacích čarodějové naučí kouzelnou hůlku nové kouzelné sloveso, které použijí na to, aby kouzelnou hůlku ono nové kouzelné sloveso naučili.
Kouzelná podstatná jména ukrývají informace, které chce čaroděj získat. Většinou chce čaroděj získat více než jednu informaci, a tak potřebuje kouzelná podstatná jména spojit. Před první kouzelné podstatné jméno přidá druhé, před druhé přidá třetí, před třetí přidá čtvrté a tak dále a tak dále a tak dále...
Epilog nekonečně kouzelných jazykolamů
[editovat | editovat zdroj]Poslední dvě kapitoly nastínily, jak čarodějové přistupují k nekonečnu. Nekonečno je vlastně opakování a je jedno, jestli se tím myslí opětovné vykonávání kouzelné věty nebo rozšiřování a zpracovávání seznamu.
Opakování je důležité, protože pomáhá čarodějům popsat problémy, které čarodějové řeší. Navíc je kouzelná hůlka v opakování vážně dobrá. Zbývá tak jen dát pozor, aby čaroděj stál nohama na zemi a k nekonečnu přistupoval pragmaticky – pokud chce od kouzelné hůlky výsledek vykonání kouzelných vět, musí zajistit, že opakování jednou skončí.
Čarodějnický žargon
[editovat | editovat zdroj]Občas může neprogramátor zaslechnout čaroděje říkat slova, která sice nejsou kouzelná, ale stejně jim nerozumí. Občas jsou podobná slovům, které zná, a občas samotná slova dávají smysl, ale sousloví už ne. Třeba:
- Imperativní a procedurální programování, vedlejší jev (side effect)
- Objektově orientované programování (OOP)
- Deklarativní a funkcionální programování, čistá funkce (pure function)
- Rekurze, iterace, nebo cyklus?
- Funkce vyššího řádu (higher order function)
- Uzávěry (closure) a anonymní (lambda) funkce
Epilog Neprogramátora
[editovat | editovat zdroj]Z neprogramátora je teď skoroprogramátor. „Skoro” proto, že řemeslo programátorů nejde popsat v jedné kapitole o Dopisu pro kouzelnou hůlku. Podle mě žádné řemeslo nejde popsat textem, jakkoli dlouhým. „Skoro” proto, že na rozdíl od neprogramátora ví, jak vést Dialog s kouzelnou hůlkou. Zná tedy syntax a sémantiku programovacího jazyka Racket. „Skoro” proto, že i když zná Nekonečně kouzelné jazykolamy, nejspíš ještě chvíli potrvá, než pochopí důsledky a jak je využít.
Neprogramátor aspiruje být první částí spirály k pochopení programování, takže skoroprogramátor je více než dobrý výsledek.