Neprogramátor

Z Wikiknih

Myslím si, že Aaronova představa programování jako čarování je vlastně docela 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.)

Tato wikikniha se snaží poskytnout další z mnoha úhlů pohledu na základní principy programování. Pokud se vám zdá, že HTDP postupuje moc rychle, zkuste začít touto wikiknihou. Pokud je to naopak, je tu Scheme Primer a R5RS. A samozřejmě SICP.

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á, že ji č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.

Pokud je kouzelná hůlka DrRacket, REPL je prostor v dolní polovině.

Screenshot DrRacket
REPL kouzelné hůlky DrRacket

Jinak je REPL třeba interaktivní prostředí příkazu mit-scheme.

Screenshot mit-scheme
REPL kouzelné hůlky mit-scheme


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: primitivní datové typy[editovat | editovat zdroj]

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 lež. 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.

Pojmenování informací: definice proměnných[editovat | editovat zdroj]

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.

Vykonat či nevykonat: predikáty a podmínkové výrazy[editovat | editovat zdroj]

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 lež, říká se, že ona kouzelná věta je predikát.

Č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 výkoná kouzelná hůlka jako další. Takovým mocným kouzelným větám se říká podmínkové výrazy.

Nová slovesa: definice funkcí[editovat | editovat zdroj]

Č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 řešení jednoduchého problému ve čtyřech různých kouzelných jazycích.

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ůlku 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.

Stav vývoje: 80% Kouzelné čtení[editovat | editovat zdroj]

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

V následujících kapitolách se pro psaní dopisů pro kouzelnou hůlku používá DrRacket.

Screenshot DrRacket s kódem
Zdrojový kód v DrRacket a jeho vykonání pomocí REPL

Stav vývoje: 100% Čarodějnické řemeslo: zdrojové kódy a repozitář[editovat | editovat zdroj]

Č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é.

Stav vývoje: 50% Kouzelné lektvary: spustitelné soubory a testy[editovat | editovat zdroj]

Čarodějové pomáhají s řešením problémů ostatním, co čarovat nedovedou. Pomocí dopisů a kouzelné hůlky vytváří 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 čarodějové zmírnili dopad chyb, které dělají, vymysleli testy. Testy jsou (zase jen) kouzelné věty, které utvrdí čaroděje v tom, že kouzelné sloveso, které vymyslel, dělá to, co dělat má.

Nekonečně kouzelné jazykolamy[editovat | editovat zdroj]

Stav vývoje: 00% Kouzelné sloveso je kouzelné sloveso: rekurze[editovat | editovat zdroj]

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

Stav vývoje: 00% Nekonečná podstatná jména: seznamy[editovat | editovat zdroj]

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