Preskoči na sadržaj

Naučite programirati u deset godina (Teach Yourself Programming in Ten Years)

U nastavku je prijevod Tvrtka Bedekovića eseja Teach Yourself Programming in Ten Years autora Petera Norviga. Pravopisne i stilske popravke prijevoda izveo je dr. sc. Vedran Miletić.

Zašto se svi toliko žure?

Uđite u bilo koju knjižaru, i vidjet ćete naslove kao Naučite Javu u 7 dana uz beskonačne varijacije koje nude učenje Visual Basica, Windowsa, Interneta i ostalog u nekoliko dana ili sati. Napravio sam sljedeći upit na Amazonu:

pubdate: after 1992 and title: days and (title: learn or title: teach yourself)

i dobio 248 rezultata. Prvih 78 bile su kompjuterske knjige (broj 79 je bila Naučite Bengali u 30 dana). Zamjenio sam "dane" u "sate" i dobio primjetno slične rezultate: 253 knjige, 77 kompjuterskih knjiga praćenih s Naučite gramatiku i stil u 24 sata na broju 78. Od prvih 200, 96% bile su kompjuterske knjige.

Zaključak je da su ljudi ili u velikoj žurbi u učenju o kompjuterima, ili se o kompjuterima nekako izuzetno jednostavno može naučiti u usporedbi sa bilo čim drugim. Nema knjiga kako naučiti Beethovena, ili kvantnu fiziku, ili čak njegovanje pasa u nekoliko dana.

Analizirajmo što neki naslov kao Naučite Pascal u tri dana može značiti:

  • Naučite: U 3 dana nećete imati vremena napisati nekoliko značajnijih programa, i naučiti iz svojih uspjeha i neuspjeha s njima. Nećete imati vremena raditi sa iskusnim programerom i razumjeti što znači živjeti u takvom okruženju. Ukratko, nećete imati vremena naučiti mnogo. Znači oni govore o površnom učenju, ne dubinskom razumijevanju. Kao što je Alexander Pope rekao, malo učenja je opasna stvar.
  • Pascal: U 3 dana mogli bi naučiti sintaksu Pascala (ako već znate slični jezik), ali ne bi mogli naučiti dovoljno kako koristiti sintaksu. Ukratko, da ste recimo Basic programer, mogli bi naučiti kako pisati programe u stilu Basica koristeći sintaksu Pascala, ali ne bi mogli naučiti za što je Pascal dobar (ili loš). Pa u čemu je onda poanta? Alan Perlis jednom je rekao: "Jezik koji ne utjeće na način na koji razmišljate o programiranju, je jezik koji nije vrijedno znati". Jedna poanta bi mogla biti da morate naučiti manji di Pascala (ili vjerojatnije, nešto kao Visual Basic ili Javascript) jer se morate povezati sa postojećim alatom kako bi postigli određeni cilj. Ali tada ne učite programirati; učite postizati taj cilj.
  • u tri dana: Nažalost, to nije dovoljno, kao što sljedeći odlomak pokazuje.

Naučite programirati u deset godina

Istraživači (Hayes, Bloom) su pokazali da treba oko deset godina za postati stručnjakom u bilo kojem od raznih područja, uključujući igranje šaha, komponiranje glazbe, slikanje, sviranje glasovira, plivanje, tenis, i istraživanje neuropsihologije i topologije. Izgleda da nema prečaca: čak je Mozart, koji je bio glazbeno čudo od djeteta sa 4 godine, trebao još 13 godina prije nego je počeo stvarati glazbu svjetske kvalitete. U drugom žanru, Beatlesi su upali na scenu sa nizom #1 hitova i nastupom na Ed Sullivan showu u 1964 godini. Ali svirali su u malim klubovima u Liverpoolu i Hamburgu od 1957, i iako privlačili pažnju od početka, njihov prvi veliki kritični uspjeh, Sgt. Peppers, izdan je 1967. Samuel Johnson drži da treba i dulje od deset godina: "Izvrsnost u bilo kojem području može se postići samo radom kroz cijeli život; nije ju moguće kupiti za manju cijenu." I Chaucer se žalio "život tako kratak, vještina tako duga za svladati."

Evo mog recepta za uspjeh u programiranju:

  • Zainteresirajte se za programiranje, i programirajte jer je zabavno. Potrudite se da ostane dovoljno zabavno kako bi ste uložili deset godina.
  • Razgovarajte s drugim programerima; čitajte druge programe. Ovo je važnije od bilo koje knjige ili tečaja.
  • Programirajte. Najbolje učenje je učenje kroz praktični rad. Preciznije "najviši stupanj učinkovitosti pojedinca u određenoj domeni ne dostiže se automatski kao funkcija većeg iskustva, ali stupanj učinkovitosti može se povećati čak i kod vrlo iskusnih pojedinaca kao rezultat namjernog truda prema usavršavanju" (p. 366) i "najučinkovitije učenje zahtjeva dobro definirani zadatak sa primjerenom težinom za određenog pojedinca, korisnu povratnu informaciju, i priliku za ponavljanje i ispravljanje grešaka." (p. 20-21) Knjiga Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life je zanimljiva referenca za ovo stajalište.
  • Ako želite, uložite četiri godine na fakultetu (ili više na postdiplomskom studiju).To će vam dati pristup poslovima koji zahtjevaju diplomu, i dati vam dublje razumijevanje područja, ali ako ne uživate u školovanju, možete (sa određenim trudom) steći slično iskustvo na poslu. U svakom slučaju, isključivo učenje iz knjiga neće biti dovoljno. "Studij računarstva ne može nikoga učiniti izvrsnim programerom jednako kao što studiranje kistova i pigmenata nikoga ne može učiniti izvrsnim slikarom." kaže Eric Raymond, autor knjige The New Hacker's Dictionary. Jedan od najboljih programera kojeg sam zaposlio imao je samo završenu srednju školu; napisao je mnogo izvrsnih programa, ima vlastitu news grupu, i zaradio je dovoljno da otvori vlastiti noćni klub.
  • Sudjelujte u projektima s drugim programerima. Budite najbolji programer na nekim projektima; najgori na drugim. Kada ste najbolji, imate priliku isprobati svoje sposobnosti vođenja projekta i nadahnuti druge svojom vizijom. Kada ste najgori, učite što rade stručnjaci, i učite što oni ne vole raditi (zato što vas tjeraju da napravite umjesto njih).
  • Radite na projektima nakon drugih programera. Potrudite se razumijeti programe drugih ljudi. Iskusite što je potrebno da bi ga razumjeli i popravili kada autor programa nije prisutan. Razmišljajte kako bi dizajnirali vlastiti program koji će biti jednostavan za održavanje drugim programerima.
  • Naučite više programskih jezika. Uključite jedan jezik koji podržava abstrakciju klase (kao Java ili C++), jedan koji podržava funkcijsku abstrakciju (kao LISP i ML), jedan koji podržava sintaksnu abstrakciju (kao Lisp), jedan koji podržava deklarativne specifikacije (kao Prolog ili C++ template), jedan koji podržava koprocedure (kao Icon ili Scheme), i jedan koji podržava paralelizam (kao Sisal).
  • Ne zaboravite da je računalo dio računarstva. Budite svjesni koliko vremena računalu treba za izvršavanje naredbe, dohvat riječi iz memorije (sa i bez promašaja u priručnoj memoriji), čitanje slijednih riječi sa diska, i postavljanje na novu lokaciju na disku (Odgovori su ovdje.)
  • Uključite se u standardizaciju jezika. To može biti ANSI C++ komitet, ili odlučivanje hoće li vaš lokalni stil programiranja imati 2 ili 4 prazna mjesta kod nivoa uvlačenja teksta. Kako god odlučite, naučiti će te što se drugim ljudima sviđa u jeziku, koliko im je do toga stalo, i možda nešto malo o razlozima zašto im je do toga stalo.
  • Budite dovoljno razumni da se što prije moguće prestanete baviti standardizacijom jezika.

Sa svime time na umu, upitno je koliko daleko možete stići samo učeći iz knjiga. Prije nego mi se rodilo prvo dijete, čitao sam sve "Kako" knjige, i dalje se osjećao kao izgubljeni početnik. 30 mjeseci nakon, kada se moje drugo dijete trebalo roditi, jesam li otišao natrag po te knjige? Ne. Naprotiv, pouzdao sam se u svoje iskustvo, koje se pokazalo puno korisnije i ohrabrujuće njego tisuće stranica koje su napisali stručnjaci.

Fred Brooks, u svom eseju No Silver Bullet identificirao je plan od tri dijela za nalaženje izvrsnih dizajnera programa:

  1. Sistematski identificiraj najbolje dizajnere što ranije moguće
  2. Postavi mentora karijere koji je odgovoran za razvoj budućeg dizajnera i brižno održavaj dosje o karijeri
  3. Stvori prilike da dizajneri u razvoju komuniciraju i potiću jedni druge

Ovo pretpostavlja da neki ljudi već imaju kvalitete velikog dizajnera; posao je usmjeriti ih. Alan Perlis je to sažeo sa: "Svi mogu biti naučeni kako izrađivati skulpture: Michelangela bi trebalo naučiti kako ih ne izrađivati. Tako je i sa izvrsnim programerima".

Slobodno kupite tu Java knjigu; vjerojatno će vam biti od neke koristi. Ali nećete promijeniti svoj život, ili vašu sveukupnu stručnost kao programer u 24 sata, dana ili čak mjeseci.

Reference

  1. Bloom, Benjamin (ed.), Developing Talent in Young People, Ballantine, 1985.
  2. Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
  3. Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
  4. Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

Odgovori

Približna trajanja raznih operacija na tipičnom 1GHz PC-u na ljeto 2001. godine:

izvrši jednu naredbu 1 nanosekunda = (1/1 000 000 000) sekunda
dohvati riječ iz L1 priručne memorije 2 nanosekunde
dohvati riječ iz glavne memorije 10 nanosekundi
dohvati riječ sa slijedne lokacije na disku 200 nanosekundi
dohvati riječ sa nove lokacije na disku 8 000 000 nanosekundi = 8 milisekundi

Dodatak: izbor jezika

Nekoliko ljudi me pitalo koji programski jezik bi trebali prvo naučiti. Nema jednog određenog odgovora, ali razmotrite slijedeće:

  • Iskoristite svoje prijatelje. Kada me pitaju "koji operacijski sustav trebam koristiti, Windowse, Unix ili Mac?", moj odgovor je obično: "koristite onaj koji koriste vaši prijatelji." Prednost koju dobijete učenjem od prijatelja nadmašiti će bilo koju razliku između OS, ili između programskih jezika. Ima li jezik koji ste odabrali veliku rastuću zajednicu ili malu umiruću? Ima li knjiga, web stranica, i online foruma sa kojih možete dobiti odgovore? Sviđaju li vam se ljudi u forumima?
  • Ne komplicirajte. Programski jezici kao što su C++ i Java dizajnirani su za profesionalni razvoj sa velikim timovima iskusnih programera koji se brinu za efikasnost izvršavanja svog koda. Kao rezultat toga, jezici koje koriste imaju komplicirane dijelove dizajnirane za te slučajeve. Vas zanima učiti programirati. Ne trebaju vam komplikacije. Želite jezik koji je osmišljen sa ciljem da bude jednostavan novom programeru kod učenja i pamćenja.
  • Igrajte se. Na koji bi način rađe učili svirati glasovir: normalan, interaktivan način, u kojem čujete svaku notu čim pritisnete tipku, ili u "grupiranom" načinu, u kojem samo čujete note kada ste završili cijelu pjesmu? Jasno, interaktivni način omogućava lakše učenje glasovira, i također programiranja. Inzistirajte na jeziku sa interaktivnim načinom i koristite ga.

Uz ove kriterije, moja preporuka za prvi programski jezik bila bi Python ili Scheme. Ali vaše okolnosti mogu biti drukčije, i postoje drugi dobri odabiri. Ako su vaše godine jednoznamenkaste, možda će vam se svidjeti Alice ili Squeak (stariji učenici bi također mogli u njima uživati). Važno je da odaberete i započnete.

Dodatak: knjige i ostali izvori

Nekoliko ljudi me pitalo iz kojih bi knjiga i web stranica trebali učiti. Ponavljam da "učenje samo iz knjiga neće biti dovoljno" ali mogu preporučiti slijedeće:

Bilješke

T. Capey ukazuje da stranica Complete Problem Solver na Amazonu sada ima "Naučite Bengali u 21 dan" i "Naučite gramatiku i stil" pod "Kupci koji su pregledavali ovaj predmet također su pregledavali ove predmete" odjeljku. Pretpostavljam da veliki dio ljudi koji su pregledali tu knjigu dolaze sa ove stranice.

Author: Peter Norvig