Originální esej v angličtině najdete zde.
Navštivte jakékoliv knihkupectví a najdete Naučte se Javu za 24 hodin a další nespočet variací nabízejících, že Vás naučí C, SQL, Ruby, algoritmy atd. během pár dní či hodin. Pokročilé vyhledávání na Amazonu ve formě [název: naučte, se, hodin, od roku: 2000 ] našlo takových knih 512. Z top deseti jich 9 bylo o programování (ta desátá je o účetnictví). Podobné výsledky se objevily i po nahrazení „naučte se“ slovem „ovládněte“ nebo „hodiny“ za „dny“.
Závěrem je, že buď lidé při učení se programování velmi chvátají, anebo se programování nějakým zázrakem učí mnohem jednodušeji než cokoliv jiného. Felleisen et al. s tímto trendem v jejich knize How To Design Programs (česky Jak navrhovat programy) souhlasí, když tvrdí „Špatné programování je jednoduché. Idioti se ho můžou naučit během 21 dnů, i pokud to jsou troubové“. Svůj pohled nabízí i komiks Abtruse Goose.
Pojďme si zanalyzovat, co by mohl znamenat například titul Naučte se C++ za 24 hodin:
Naučte se: Během 24 hodin nebudete mít čas napsat několik sobě příbuzných programů a učit se z vyplynulých zdarů a chyb. Nebudete mít čas pracovat se zkušeným programátorem a pochopit, jaké to je pohybovat se v prostředí C++. Zkrátka nebudete mít čas naučit se moc. Takže tato kniha může hovořit jen o povrchním seznámení, ne hlubokém pochopení. Jak řekl Alexandr Pope, krátké učení je nebezpečná věc.
C++: Během 24 hodin se možná budete schopni naučit něco ze syntaxu C++ (pokud už ovládáte jiný jazyk), ale nemůžete se naučit moc o jeho samotném používání. Zkrátka, pokud byste měli, řekněme, znalost Basicu, můžete se naučit psát programy ve stylu Basic s použitím syntaxu C++, ale už byste se nedozvěděli, k čemu vlastně C++ je (nebo není) dobrý. Takže co je účel? Alan Perlis jednou řekl „Jazyk, který neovlivňuje to, jak přemýšlíte o programování, nestojí za to, abyste jej znali“. Jedním možným názorem je, že se potřebujete naučit trochu z C++ (anebo spíše z něčeho jako JavaScript nebo Processing), protože ke splnění konkrétního úkolu tento nástroj potřebujete. Ale to se potom neučíte jak programovat, ale jak plnit úkoly.
za 24 hodin: Bohužel, to nestačí, jak už ukazuje následující sekce.
Vědci (Bloom (1985), Bryan & Harter (1899), Hayes (1989) , Simmon & Chase (1973)) prokázali, že v jakémkoliv z široké škály oborů se stát expertem zabere deset let, a to včetně hraní šachů, skládání hudby, ovládání telegrafu, malby, hry na piano, plavání, hraní tenisu i výzkumu v oblastech neuropsychologie a topologie. Klíčem je uvědomělé trénování: nejenom to opakovat znovu a znovu, ale připravovat si výzvy o krok před vašimi schopnostmi, zkoušet to, porovnávat svůj výkon během a po plnění úkolu a opravovat jakékoliv chyby. Pak to zopakujte. A zase zopakujte. Nezdá se, že by se to dalo nějak obejít: dokonce i Mozart, který byl ve čtyřech letech hudebním géniem, potřeboval dalších 13 let, než začal produkovat hudbu světové úrovně. V jiném žánru to vypadalo, že Beatles vpálili na scénu se sérií hitů a vystoupením v Show Eda Sullivana v roce 1964. Ale už od roku 1957 hráli v malých klubech v Liverpoolu a Hamburku, a i když masový obdiv získali brzy, až roku 1967 zaznamenali první zlomový úspěch, Sgt. Peppers.
Malcolm Gladwell tuto myšlenku zpopularizoval, i když se soustředí na 10 000 hodin spíš než na 10 let. Henri Cartier-Bresson (1908-2004) měl jiné měřítko: „Vašich prvních 10 000 fotografií je těch nejhorších.“ (To nespojoval s digitálními fotoaparáty, někteří lidé tuto hranici překonají za týden.) Pravá odbornost může zabrat celý život. Samuel Johnson (1709-1784) řekl „Dokonalé ovládnutí jakéhokoliv oboru může být dosaženo pouze celoživotní prací; nemělo by přijít za nižší cenu.“ A Chaucer (1340-1400) si stěžoval „tak krátký život, tak zdlouhavé řemeslo na naučení.“ Hippokratés (asi 400 př. n. l.) je znám pro výňatek „Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicum difficle“, což se do češtiny překládá jako „Život je krátký, řemeslo dlouhé, příležitost prchavá, pokus zrádný, posuzování těžké“ Samozřejmě, že žádné číslo nemůže být definitivní odpovědí: není rozumné předpokládat, že všechny dovednosti (např. programování, hraní šachu, hraní dámy, hraní hudby) mohou obnášet na chlup stejné množství času. Jak dodává prof. K. Anders Ericsson „Ve většině oblastí je pozoruhodné, kolik času potřebují i ti nejnadanější jednotlivci k jejich nejlepšímu výkonu. Číslo 10 000 hodin jen ukazuje, že se bavíme o letech s deseti až dvaceti hodinami týdně, které tito, o kterých by se někteří hádali, že jsou od přírody nejvíc talentovaní, stále potřebují, aby se dostali na nejvyšší úroveň.
Tady je můj recept na úspěch v programování:
Začněte se zajímat o programování a věnujte se mu, protože je to zábava. Ujistěte se, že je to dostatečná zábava, abyste mu byli ochotni věnovat vašich 10 let/10 000 hodin.
Programujte. Nejlepší způsob učení je učení praxí. Řečeno více technicky, „nejlepší výkon jednotlivce není v dané oblasti dosažen automaticky díky jeho delším zkušenostem, ale i vysoce zkušenými jednotlivci může být úroveň výkonu zvýšena jako výsledek záměrné snahy o zlepšení.“ (str. 366) a „nejefektivnější učení vyžaduje dobře definovaný úkol s přiměřenou obtížností pro konkrétního jednotlivce, informativní zpětnou vazbu a příležitosti pro opakování a opravu chyb.“ (str. 20-21) kniha Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life je zajímavou referencí pro tento úhel pohledu.
Mluvte s dalšími programátory; čtěte další programy. To je více důležité než jakákoliv knížka nebo tréninkový kurz.
Pokud chcete, věnujte tomu čtyři roky na vysoké (nebo víc v pokračujícím studiu – PhD obory). To Vám poskytne přístup k některým zaměstnáním, která obnáší renomé a dá Vám hlubší porozumění tomuto poli, pokud Vás ale škola nebaví, můžete (s určitou oddaností) získat podobné zkušenosti i sami anebo v práci. V každém případě, samotné učení z knihy nepostačí. „Výuka informatiky nemůže z nikoho učinit programátora-experta o nic víc, než studování štětců a pigmentu může z někoho udělat nejlepšího malíře“ říká Eric Raymond, autor knihy The New Hacker´s Dictionary (česky Nový hackerský slovník). Jeden z nejlepších programátorů, co jsem kdy najal, měl jen maturitu; přišel se skvělými programy, má svou vlastní diskusní skupinu a akcie mu vydělaly tolik, že si koupil noční klub.
Pracujte na projektech s ostatními programátory. V některých projektech buďte nejlepšími programátory; buďte nejhorší v některých jiných. Když jste nejlepší, otestujete své schopnosti vést projekt a inspirovat svou vizí ostatní. Když jste nejhorší, naučíte se, co dělají experti a naučíte se i, co dělají neradi (protože to nechají dělat Vás).
Pracujte na projektech po dalších programátorech. Pochopte program napsaný někým jiným. Zjistěte, co znamená porozumět a zapamatujte si to, když původní programátoři nebudou na dosah. Myslete na to, jak napsat Vaše programy, aby byly jednodušší pro ty, kteří je budou zachovávat po Vás.
Naučte se alespoň půl tuctu programátorských jazyků. Zahrňte jeden jazyk, který klade důraz na třídní abstrakce (jako Java nebo C++), jeden, který klade důraz na funkční abstrakce (jako Lisp nebo ML nebo Haskell), jeden, který podporuje syntatické abstrakce (jako Lisp), jeden podporující deklarativní specifikace (jako Prolog nebo C++ templates) a jeden, který klade důraz na paralelní programování (jako Clojure nebo Go).
Pamatujte, že v „počítačové vědě“ je slovo „počítač“. Zjistěte, jak dlouho Vašemu počítači trvá provést pokyn, najít slovo v paměti (s a bez cache missu), přečíst za sebou jdoucí slova z disku a najít nové místo na disku. (Odpovědi zde.)
Zapojte se do snahy o standardizaci jazyka. Může to být komise ANSI C++, nebo by to mohlo být rozhodnutí, jestli Váš lokální kódovací styl bude mít 2 nebo 4 úrovně odsazení mezery. Každopádně se naučíte, co se ostatním lidem v jazyce líbí, jak hluboce to tak cítí a možná dokonce i trochu o tom, proč to tak cítí.
Mějte zdravý úsudek o tom, kdy vystoupit ze standardizace jazyka, tak rychle, jak to jen jde.
S tím vším na mysli je diskutabilní, jak daleko se můžete dostat pouze čtením knihy. Předtím, než se narodilo mé první dítě, jsem přečetl všechny Jak na to knihy a stejně se cítil jako nic netušící nováček. O 30 měsíců později, kdy přišlo mé druhé dítě, vrátil jsem se k těm knihám pro osvěžení paměti? Ne. Místo toho jsem se spoléhal na svou osobní zkušenost, což se ukázalo být mnohem víc užitečné a ujišťující než tisíce stran napsaných experty.
Ve své eseji No Silver Bullet (česky Žádné zázračné řešení) vyčlenil Fred Brooks plán o třech krocích, jak najít výborné softwarové designery:
Co nejdřív systematicky rozpoznejte nejlepší designery.
Přidělte kariérního mentora odpovědného za vývoj této „šance“ a opatrně si zachovejte kariérní spis.
Poskytujte rostoucím designérům možnosti, aby společně interagovali a ovlivňovali se.
Tento plán předpokládá, že někteří lidé už mají kvality potřebné k tomu být skvělý designér; úkolem je, správně je nasměrovat. Alan Perlis to konstatoval stručněji: „Každý se může naučit dělat sochy, Michelangelo by se ale musel učit, jak je nedělat. Tak je to i s velkými programátory“. Perlis říká, že velikáni mají jistou vnitřní kvalitu, která přesahuje jejich trénink. Ale kde se tahle kvalita bere? Je vrozená? Nebo ji vyvíjí jejich píle? Jak říká Auguste Gusteau (fiktivní šéfkuchař z Ratatouille), „vařit může každý, ale jen odvážní vaří skvěle“. Já nad tím uvažuji spíše jako nad ochotou zasvětit velkou porci života uvědomělému tréninku. Ale možná, že slovo odvážný je způsob, jak to shrnout. Anebo jak říká Gusteaův kritik Anton Ego „Ne každý se může stát velkým umělcem, avšak velký umělec může vzejít odkudkoliv.“
Tak jen do toho, kupte si tu knihu o Javě/Ruby/Javasriptu/PHP; nejspíš Vám něco dá. Ale nezměníte svůj život, anebo Vaši celkovou odbornost programátora za 24 hodin nebo 21 dnů. Co takhle tvrdě pracovat, abyste se postupně zlepšili za 24 měsíců? No, teď už se někam dostáváte…
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullet, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. "Perception in Chess" Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
Přibližná délka různých instrukcí na klasickém počítači.
provést běžnou instrukci | 1/1,000,000,000 s = 1 nanosekunda |
číst z L1 cache | 0,5 nanosekundy |
nesprávná předpověď větve | 5 nanosekund |
číst z L2 cache | 7 nanosekund |
lock/unlock mutexu | 25 nanosekund |
číst z operační paměti | 100 nanosekund |
poslat 2K bajtů přes 1Gpbs síť | 20 000 nanosekund |
Přečíst sekvenčně 1MB paměti | 250 000 nanosekund |
číst z nové lokace na disku (seek) | 8 000 000 nanosekund |
Přečíst sekvenčně 1MB z disku | 20 000 000 nanosekund |
Poslat paket z USA do Evropy a zpět | 150 milisekund = 150 000 000 nanosekund |
Využijte své přátele. Když jsem tázán, který operační systém používat, Windows, Unix nebo Mac, má odpověď je obvykle: „Používejte to, co mají Vaši přátelé.“ Výhoda, kterou získáte z učení se od svých přátel vykompenzuje jakoukoliv vnitřní odlišnost mezi OS, nebo mezi programovacími jazyky. Také zvažte své budoucí přátele: komunitu programátorů, jíž budete součástí, pokud vytrváte. Má Vámi vybraný jazyk velkou rostoucí komunitu, nebo malou umírající? Existují knihy, webové stránky a online fóra, ze kterých získat odpovědi? Máte rádi lidi z těchto fór?
Snažte se, ať je to jednoduché. Programovací jazyky jako C++ a Java jsou navrženy pro profesionální vývoj obrovskými týmy zkušených programátorů, které znepokojuje rychlost efektivity jejich kódu. Výsledkem jsou komplikované části těchto programů navrženy pro tyto okolnosti. Vy se zajímáte o učení programu. Tuhle komplikaci nepotřebujete. Chcete jazyk, který byl navržen ke snadnému naučení a zapamatování novým programátorem.
Hrajte si. Jak byste raději hráli na piano: normálně, tedy interaktivně, kdy slyšíte každou notu, jakmile stisknete klávesu, anebo mód „hromada“, kdy uslyšíte všechny noty teprve, když dohrajete celou skladbu? Interaktivní mód zjevně učení usnadňuje jak u piana, tak i u programování. Trvejte na interaktivním jazyku a používejte ho.
S přihlédnutím k těmto kritériím by byla má doporučení pro první programovací jazyk Python nebo Scheme. Další volbou je Javascript, ne proto, že je perfektně navržen pro začátečníky, ale protože k němu je plno online tutoriálů, třeba na Khan Academy. Ale Vaše podmínky se mohou lišit a je plno dobrých voleb. Pokud má Váš věk jednu číslici, mohli byste preferovat Alice nebo Squeak nebo Blockly (to si možná užijí i starší učenci). Důležité je, že si vyberete a začnete.
Několik lidí se zeptalo, z jakých knih a webů by se měli učit. Opakuji, že samotné učení z knih nebude stačit, ale mohu doporučit následující:
Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) je pravděpodobně nejlepším úvodem do informatiky a učí programování jako způsob porozumění informatice. Můžete najít videa lekcí z této knihy, stejně tak i celý text. Tato kniha je náročná a odradí některé lidi, kteří by možná mohli být úspěšní s jiným přístupem.
Scheme: How to Design Programs (Felleisen et al.) je jedna z nejlepších knih o tom, jak psát programy elegantně a funkčně.
Python: Python Programming: An Intro to CS (Zelle) je dobré seznámení za použití Pythonu.
Python: Na Python.org je několik online tutoriálů.
Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) je některými považována za moderního nástupce Abelsona & Sussmana. Je to cesta velkými programátorskými nápady, která zaznamenává širší škálu než Abelson & Sussman, i když je možná jednodušší ke čtení a následování. Používá jazyk Oz, který není moc známý, ale slouží jako základ k pochopení dalších jazyků.
T. Capey poukazuje na to, že stránka Complete Problem Solver (Kompletní řešitel problémů) na Amazonu má teď knihy „Naučte se Bengálsky za 21 dnů“ a „Naučte se gramatiku a styl“ pod záložkou „Zákazníci, kteří zakoupili tuto položku, také koupili tyto položky.“ Hádám, že velká porce lidí, kteří se na tu knihu dívají, pochází z této stránky. Díky Rossu Cohenovi za pomoc s Hippokratem.
Přeložila Barbora Prošková.
Při překladu jsme nahradili několik rozbitých odkazů novými. Zde je seznam upravených odkazů
During translation, we updated a few links that were broken. Here is a list of the updated links