Vojdite do ktoréhokoľvek kníhkupectva a hneď zbadáte knihu s názvom Naučte sa programovať v Jave za 7 dní, spolu s nekonečným množstvom variácií, ktoré ponúkajú že naučia Visual Basic, Windows, Internet, a tak ďalej, za niekoľko dní či hodín. Keď som na Amazon.com dal vyhľadávať nasledujúcu kombináciu:
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
vrátilo sa mi 248 výsledkov. Prvých 78 z toho boli knihy o počítačoch (79. v poradí bola Learn Bengali in 30 days [Nauč sa bengálsky za 30 dní]). Keď som nahradil slovo "days" [dni] za "hours" [hodiny], získal som pozoruhodne podobné výsledky: ďalších 253 kníh, pričom 77 kníh o počítačoch bolo nasledované knihou Teach Yourself Grammar and Style in 24 Hours [Nauč sa gramatiku a štýl za 24 hodín] ako 78. v poradí. Celkovo z prvých 200 kníh bolo 96% o počítačoch.
Záver z toho je, že buď sa ľudia veľmi ponáhľajú, aby sa naučili niečo o počítačoch, alebo že sa veci okolo počítačov dajú naučiť neskutočne rýchlejšie než čokoľvek iné. Nie sú žiadne knihy o tom, ako sa naučiť Beethovena, kvantovú fyziku, ba ani ošetrovanie psov, za niekoľko dní. Felleisen a kol. pritakáva tomuto trendu v knihe How to Design Programs [Ako navrhovať programy], keď píše: "Zlé programovanie je jednoduché. Každý blázon sa ho vie naučiť za 21 dní, ak ked je to úplný hlupák."
Skúsme rozobrať, čo sa môže skrývať v titule Learn C++ in Three Days [Nauč sa C++ za tri dni]:
Nauč sa: Za 3 dni nebudete mať čas napísať žiadny významný program, a teda sa ani poučiť z jeho úspechu či neúspechov. Nebudete mať čas spolupracovať so skúsenm programátorom a pochopiť, aké je to žiť v prostredí C++. V krátkosti, nebudete mať čas sa naučiť niečo viac. Takže kniha môže hovoriť len o povrchnom oboznámení, nie o hlbokom porozumení. Ako povedal Alexander Pope [anglický básnik 18. storočia, pozn. prekl.], trocha učenia je nebezpečná vec.
C++: Za 3 dni sa môžete naučiť trocha syntaxe C++ (ak už poznáte nejaký iný jazyk), ale nemôžete sa naučiť viac o tom, ako sa jazyk používa. V krátkosti, ak už ste boli povedzme programátor v Basicu, môžete sa naučiť písať programy v štýle Basicu s použitím syntaxe C++, ale nemôžete sa naučiť, načo je vlastne C++ dobré (a na čo nie). Tak načo sa to vôbec učiť? Alan Perlis raz povedal: "Jazyk, ktorý neovplyví spôsob, akým nazeráte na programovanie, nestojí za to, aby ste ho vedeli." Jeden možný dôvod by mohol byť, že sa potrebujete naučiť trocha C++ (alebo viac pravdepodobne niečo ako JavaScript alebo Flash Flex) pretože potrebujete využiť rozhranie nejakého existujúceho nástroja aby ste splnili nejakú konkrétnu úlohu. Ale to sa potom neučíte spôsob ako programovať, ale spôsob ako sa vysporiadať s danou úlohou.
za tri dni: Bohužiaľ, toto nestačí, ako je ukázané v nasledujúcom odstavci.
Výskumníci (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) ukázali, že dosiahnutie úrovne experta v akomkoľvek odbore – vrátane hrania šachov, skladania hudby, prevádzkovania telegrafie, maľovania, hrania na klavíri, plávania, tenisu a výskumu v oblasti neuropsychológie a topológie – trvá zhruba desať rokov. Podstatný je cieľavedomý tréning – nejde len o opakovanie nejakej činnosti znova a znova, ale ide o to motivovať samého seba úlohami, ktoré sú tesne za hranicou momentálnych schopností, pokúsiť sa o ne, analyzovať svoj výkon počas pokusu a po ňom, a napraviť chyby. A toto opakovať. A znova opakovať. Zdá sa, že neexistuje žiadna skratka: dokonca aj Mozartovi, ktorý bol zázračným hudobníkom vo veku 4 rokov, trvalo 13 rokov, kým začal tvoriť hudbu svetovej úrovne. Ak sa pozrieme na iný žáner, zdalo by sa, že Beatles z ničoho nič v roku 1964 prerazili sériou hitov ktoré dosiahli vrchol rebríčka a dostali sa na show Eda Sullivana. Lenže oni hrali v malých kluboch v Liverpoole a Hamburgu už od roku 1957, a aj keď pomerne skoro dosiahli masový úspech, ich prvý kritikou kladne prijatý album, Sgt. Peppers, bol vydaný v roku 1967. Malcolm Gladwell v práci skúmajúcej študentov Berlin Academy of Music [Berlínskej hudobnej akadémie] porovnával hornú, strednú a spodnú tretinu ročníka, a pýtal sa ich, koľko cvičili:
Všetci, zo všetkých troch skupín, začali hrať na hudobnom nástroji zhruba v tom istom čase – okolo piatich rokov veku. V tých prvých rokoch všetci cvičili zhruba rovnako, asi dve-tri hodiny týždenne. Ale okolo veku osem rokov sa začali objavovať skutočné rozdiely. Tí študenti, ktorí sa neskôr stali najlepšími z triedy, cvičili viac než ostatní: šesť hodín týždenne vo veko osem rokov, osem hodín vo veku 12 rokov, 16 hodín vo veku 14 rokov, a stále viac a viac, až kým okolo veku 20 rokov cvičili viac než 30 hodín týždenne. Do veku 20 rokov, všetci vrcholní interpreti mali za sebou celkovo vyše 10,000 hodín cvičenia. Naproti tomu mali priemerní žiaci odohraných asi 8,000 hodín, a budúci učitelia hudby mali za sebou o málo viac než 4,000 hodín.
Možno je to tak, že magickou hranicou je teda 10,000 hodín a nie 10 rokov. Samuel Johnson (1709-1784) [anglický spisovateľ a literát, pozn.prekl.] mienil, že je to trvá dlhšie: "Excelentnosť v akomkoľvek odbore sa dá dosiahnuť len celoživotnou prácou; nedá sa zadovážiť za menšiu cenu." A Chaucer (1340-1400) [Geoffrey Chaucer, anglický básnik, autor Canterburských poviedok, pozn.prekl.] sa sťažuje, "život taký krátky, majstrovstvo tak dlho trvá sa naučiť." Hippokrates (asi 400 p.n.l.) má známe porekadlo "ars longa, vita brevis", čo je skrátená verzia dlhšieho výroku "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile", čo znamená "Život je krátky, majstrovstvo zdĺhavé, príležitosť prchavá, experiment klamlivý, úsudok zložitý." Hoci v latinčine môže ars znamenať umenie aj remeslo, v gréckom origináli slovo "techne" znamená len majstrovstvo, nie umenie.
Toto je môj recept pre úspech v programovaní:
Začnite sa zaujímať o programovanie a trocha aj programujte, lebo je to zábavné. Starajte sa, by tej zábavy bolo dosť na to, aby vystačila na desať rokov.
Rozprávajte sa s inými programátormi, čítajte programy iných. Toto je dôležitejšie ako akákoľvek kniha či kurz.
Programujte. Najlepší spôsob učenia sa je učenie prácou. Alebo, povedané viac odborne, "maximálna úroveň výkonnosti jedinca v danom odbore sa nedosahuje automaticky v závislosti od množstva získaných skúseností, avšak úroveň výkonnosti sa dá zvýšiť dokonca aj u veľmi skúsench jedincov prostredníctvom cieleného úsilia o zlepšenie." (str. 366) a "najefektívnejšie učenie vyžaduje dobre definovanú úlohu s vhodnou úrovňou obtiažnosti pre daného jedinca, relevantnú spätnú väzbu, a príležitosti na opakovanie a na nápravu chýb." (str. 20-21) Kniha Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life je zaujímavým zdrojom tohoto uhla pohľadu.
Pracujte na projektoch spoločne s inými programátormi. V niektorých projektoch buďte tým najlepším programátorom v tíme, v iných buďte tým najhorším. Keď ste najlepší, to otestuje vaše schopnosti viesť projekt a inšpirovať ostatných svojou víziou. Keď ste najhorší, naučíte sa, čo a ako robia majstri, a aj to, čo robia neradi (pretože vás prinútia to urobiť za nich).
Ak chcete, investujte štyri roky do vysokoškolského štúdia [resp. toľko, koľko daná vysoká škola či univerzita vyžaduje, pozn. prekl.] (alebo ešte viac do postgraduálneho štúdia). Toto vám umožní prístup k niektorým druhom pracovných príležitostí, kde sa vyžaduje vysokoškolský titul, a poskytne vám hlbšie vedomosti v danej oblasti, ale ak nemáte radi školu, (s určitou dávkou cieľavedomosti) môžete získať podobnú skúsenosť aj v zamestnaní. V každom prípade, učenie z knihy samo osebe nestačí. "Formálne vzdelanie v oblasti počítačov neurobí z nikoho o nič lepšieho experta na programovanie, ako urobí štúdium štetcov a farieb z kohokoľvek akademického maliara," hovorí Eric Raymond, autor The New Hacker's Dictionary [dlhoročnej kultovej zbierky počítačového žargónu, ktorá bola pod Raymondovým vedením zrevidovaná a vydaná knižne, pozn. prekl.] Jeden z najlepších programátorov ktorých som kedy najal mal len stredoškolské vzdelanie, napriek tomu vyprodukoval veľa prvotriedneho softwaru, má svoju vlastnú diskusnú skupinu, a na zamestnaneckých akciách zarobil dosť na to aby si otvoril svoj vlastný nočný klub.
Pracujte na projektoch po iných programátoroch. Snažte sa pochopiť program, ktorý napísal niekto iný. Spoznajte, aké to je pochopiť a upraviť program, keď pôvodní autori nie sú k dispozícii. Uvažujte o tom, ako navrhnete svoje vlastné programy, aby ste uľahčili prácu tým, ktorí ho budú po vás udržiavať.
Naučte sa aspoň pol tucta programovacích jazykov. Zahrňte do toho aspoň jeden jazyk, ktorý podporuje abstrakciu tried (ako Java alebo C++), jeden, ktorý podporuje abstrakciu funkcií (ako Lisp alebo ML), jeden, ktorý podporuje syntaktickú abstrakciu (ako Lisp), jeden, ktorý podporuje deklaratívnu špecifikáciu (ako Prolog alebo C++ templaty), jeden, ktorý podporuje korutiny (ako Icon alebo Scheme), a jeden, ktorý podporuje paralelizmus (ako Sisal).
Nezabudnite, že študijný odbor "počítače" je od slova "počítač". Spoznajte, koľko trvá vášmu počítaču vykonať jednu inštrukciu, načítať slovo z pamäte (ktoré je alebo nie je v cache), načítať za sebou nasledujúce slová z disku, a prejsť na nové miesto na disku. (Odpovede sú tu.)
Zaujímajte sa o štandardizáciu. Môže to byť formou účasti vo výbore ANSI [americký normalizačný ústav, pozn.prekl.] pre C++, alebo prispejte k rozhodnutiu o tom, či váš firemný štýl bude v odsadzovaní používať 2 alebo 4 medzery. V každom prípade sa naučíte, čo sa iným ľuďom páči na nejakom jazyku, nakoľko je tento vzťah intenzívný, a možno tak trocha zistíte aj to, že prečo je to tak.
Majte sa na pozore, aby ste stihli včas uniknúť zo štandardizačného procesu.
Berúc toto všetko do úvahy, je otázne, ako ďaleko sa dá dostať čiste učením z kníh. Keď sa malo narodiť moje prvé dieťa, prečítal som všetky knihy typu Ako na to, a stále som sa cítil byť bezradným začiatočníkom. Čo myslíte, keď sa o 30 mesiacov neskôr malo narodiť moje druhé dieťa, vrátil som sa ku knihám aby som si občerstvil vedomosti? Nie. Namiesto toho som sa spoľahol na moju osobnú skúsenosť, ktorá sa ukázala byť omnoho užitočnejšia a poskytla mi väčší pocit istoty, než tisíce strán napísaných odborníkmi.
Fred Brooks vo svojej eseji No Silver Bullet [Niet striebornej guľky] uviedol tento trojbodový plán na nájdenie vynikajúcich softwarových návrhárov:
Systematicky rozpoznávajte vrcholných návrhárov tak skoro, ako je to len možné.
Prideľte mu mentora, ktorý bude zodpovedný za vývoj adepta, a veďte dôkladný kariérny spis.
Poskytujte príležitosti rozvíjajcim sa návrhárom aby navzájom prichádzali do styku a stimulovali sa.
To predpokladá, že niektorí ľudia majú už v sebe vlastnosti potrebné pre to aby sa stali vynikajúcimi návrhármi, a je potrebné ich len patrične usmerniť. Alan Perlis to povedal výstižne: "Každého je možné naučiť robiť sochy, Michelangela by však bolo treba učiť, ako ich nerobiť. A tak je to aj s vynikajúcimi programátormi."
Takže sa pustite do toho a kúte si tú knihu o Jave; pravdepodobne sa vám v niečom zíde. Ale život ani vaše celkové programátorské schopnosti sa nezmenia za 24 hodín, dní a ani mesiacov.
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, 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.
Približné časovanie jednotlivých operácií na typickom 1GHz PC v roku 2001:
vykonanie jednej inštrukcie |
1 ns = (1/1,000,000,000) s |
načítanie slova z L1 cache |
2 ns |
načítanie slova z hlavnej pamäte |
10 ns |
načítanie slova zo za sebou nasledujúcich pozícií na disku |
200 ns |
načítanie slova z novej pozície na disku (seek [vyhľadanie]) |
8,000,000 ns = 8 ms |
Viacerí ľudia sa ma pýtali, ktorý programovací jazyk sa majú učiť ako prvý. Na toto neexistuje jednoznačná odpoveď, ale mali by ste zvážiť nasledujúce body:
Využite svojich priateľov. Keď sa ma pýtajú, "ktorý operačný systém mám použiť, Windows, Unix, alebo Mac?", moja odpoveď obvykle znie: "použi ktorýkoľvek čo používajú tvoji priatelia." Výhoda možnosti učenia sa od priateľov vyváži rozdiely ktoré existujú medzi OS, a tak je to aj s programovacími jazykmi. Uvážte tiež vašich budúcich priateľov: ak budete v programovaní pokračovať určitú dobu, stanete sa členom komunity programátorov. Má vami zvolený jazyk rastúcu komunitu, alebo pomaly vymierajúcu? Existujú knihy, webové stránky a online fóra, na ktorých môžete dostať odpovede na vaše otázky? Sú vám ľudia na tých fórach sympatickí?
Držte sa jednoduchosti. Progrmovacie jazyky ako sú C++ a Java sú navrhnuté pre profesionálne použitie veľkým tímom skúsených programátorov, ktorí venujú dôraz efektivite vykonávaného kódu. Následkom tohoto majú tieto jazyky zložité súčasti určené pre spomínané okolnosti. Vy sa však chcete učiť programovať. Nepotrebujete komplikácie. Potrebujete jazyk, ktorý bol navrhnutý na to, aby sa ho ktorýkoľvek nový programátor vedel ľahko naučiť a zapamätať.
Hrajte sa. Ako by ste sa chceli učiť hrať na klavíri: normálnym, interaktívnym spôsobom, kde vždy keď stlačíte klávesu počujete zahraný tón, alebo "dávkovým" spôsobom, kde by ste počuli tóny až potom čo dokončíte celú pesničku? Je jasné, že interaktivita uľahčuje učenie hrania na klavíri, a tak isto je to aj s programovaním. Trvajte na jazyku, ktorý má interaktívny mód, a používajte ho.
Na základe týchto kritérií by som ako prvé programovacie jazyky doporučoval Python alebo Scheme. Ale vaše okolnosti môžu byť iné, a sú tu aj ďalšie dobré možnosti. Ak máte jednociferný vek, možo uprednostníte Alice alebo Squeak (ale aj starším žiakom sa môžu páčiť). Dôležité je, aby ste si vybrali a začali pracovať.
Niekoľko ľudí sa pýtalo na knihy a webové stránky, z ktorých by sa mohli učiť. Opakujem, že "učenie z kníh samo osebe nestačí", ale môžem doporučiť nasledovné
Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) [Štruktúra a interpretácia počítačových programov] je pravdepodobne najlepší úvod do počítačov, a učí programovanie ako spôsob chápania počítačov. Môžte si prezrieť online videá z prednášok z tejto knihy, ako aj completný text online. Kniha je náročná a pravdepodobne odradí niektorých ľudí, pre ktorých je vhodnejší iný prístup.
Scheme: How to Design Programs (Felleisen et al.) [Ako navrhovať programy] je jednou z najlepších kníh o tom, ako navrhovať programy elegantným a funkčným spôsobom..
Python: Python Programming: An Intro to CS (Zelle) [Programovanie v Pythone: Ǔvod do počítačov] je dobrý úvod s použitím Pythonu.
Python: Niekoľko online tutorialov je k dispozícii na Python.org.
Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) [Koncepcie, techniky a modely programovania počítačov] niektorí pokladajú za modernú verziu Abelsona & Sussmana. Je to prierez veľkých myšlienok programovania, a má širší záber než Abelson & Sussman, pričom je snáď o niečo čitateľnejší a ľahšie pochopiteľný. Používa sa v ňom jazyk Oz, ktorý nie je príliš známy, ale slúži ako základ na výuku iných jazykov.
T. Capey poukázal na to, že stránka Complete Problem Solver na Amazone obsahuje teraz v sekcii "Customers who shopped for this item also shopped for these items" knihy "Teach Yourself Bengali in 21 days" a "Teach Yourself Grammar and Style" . Toto môže byť vďaka veľkému množstvu ľudí, ktorí prichádzajú k tejto knihe z tejto stránky.
Poďakovanie Rossovi Cohenovi za pomoc s Hippokratom.