INVERUDIO: Programming ::: Web Optimization ::: My Resume ::: Lazar ::: Contact ::: Interesting Links
Programs: Schrodinger Wave Equation |code ::: Prey Predator |code ::: Magnets |code ::: Task Logger |code ::: Time Series Analysis Software |code
Websites: Anonymous forum ::: Best Google Video ::: Google Optimization ::: Popular Links ::: Recipe Finder ::: SMS Politics ::: math tutoring software
Plugins: 404 Error? | File Not Found? ::: Nofollow 4 Nofollow

Dobrodošli! Na ovoj stranici možete pročitati sastav direktora istraživanja u Google, Petra Norviga, koji objašnjava zašto treba dugo vremena da se nauči programiranje, i koje jezike je najbolje početi učiti.

Naučite Sami Da Programirate za 10 Godina

Teach Yourself Programming in Ten Years - Petar Norvig (Google Director of Research)

Ћирилица | Original na Engleskom i prevodi na druge jezike.

Zašto su svi u takvoj žurbi?

Idite u bilo koju knjižaru, i videćete Naučite Sami Javu za 7 dana zajedno sa bezbrojnim varijacijama koje nude učenje Visual Basic-a, Windows-a, Internet-a, i tako dalje za par dana ili sati. Uradio sam sledeću pretragu na Amazon.com: (datum publikacije: posle 1992, naslov: nauči ili naslov: nauči sam)
pubdate: after 1992 and title: days and
title: learn or title: teach yourself)
i dobio 248 pogodaka. Prvih 78 su kompjuterske knjige (broj 79 je bila Learn Bengali in 30 days) (Naučite Bengali za 30 dana). Zamenio sam "days" (dani) sa "hours" (sati) i dobio neverovatno slične rezultate: 253 knjiga sa 77 kompjuterskih knjiga praćenim sa Teach Yourself Grammar and Style in 24 Hours (Naučite gramatiku i izražavanje za 24 sata) na mestu 78. Od prvih 200 ukupno, 96% su bile kompjuterske knjige.

Zaključak je da su ljudi ili u velikoj žurbi da uče o kompjuterima, ili da su kompjuteri nekako neverovatno lakši da se nauče nego bilo šta drugo. Nema knjiga za učenje Betovena, ili Kvantne Fizike, ili čak ni Nege Pasa za par dana.

Analizirajmo sta bi naslov kao sto je Learn Pascal in Three Days (Naučite Paskal za Tri Dana) mogao da znači:

  • Nauči: Za 3 dana nećete imati vremena da napišete nekoliko ozbiljnijih programa, i da naučite iz svojih uspeha i neuspeha. Nećete imati vremena da radite sa iskusnim programerom i razumete kako je to živeti u takvoj sredini. Ukratko, nećete imati mnogo vremena za učenje. Znači oni mogu samo da pričaju o površnom poznavanju materije, a ne o suštinskom razumevanju. Kao što je Aleksandar Popa rekao, malo učenja je opasno učenje.

  • Paskal: Za tri dana ćete možda moći da naučite sintaksu Paskala (ako ste već znali sličan jezik), ali nebi mogli da naučite kako da koristite sintaksu. Ukratko, ako ste na primer programer Bejzika, mogli biste naučiti da napišete program u stilu Bejzika koristeći sintaksu Paskala, ali ne biste mogli naučiti zašta je Paskal dobar (ili loš). U čemu je onda poenta? Alan Perlis je jednom rekao: "Jezik koji ne utiče na način kako mislite o programiranju nije vredan poznavanja." Jedna moguća poenta je učenje malecnog dela Paskala (ili verovatnije, nečega kao sto je Vižual Bejzik ili Javaskript) zato što vam treba interfejs sa postojećim alatom za postizanje specifičnog zadatka. Ali tada ne učite kako da programirate; učite kako da obavite zadatak.

  • zz Tri Dana: Na žalost, ovo nije dovoljno, kao sto sledeći paragrafi pokazuju.

Naučite Sami Da Programirate za 10 Godina

Istraživači (Hejs, Blum) su pokazali da treba oko 10 godina da se razvije stručnost u bilo kojoj od mnogobrojnih oblasti, uključujući igranje šaha, komponovanje muzike, slikanje, sviranje klavira, plivanje, tenis, i istraživanje u neuropsihologiji i topologiji. Izgleda da nema prečica: čak je i Mocartu, koji je bio muzičko čudo od deteta sa 4 godine, trebalo 13 i više godina pre nego što je počeo da pravi muziku svetske klase. U drugom polju, Bitlsi su postali slavni sa nizom hitova i pojavljivanjem u emisiji Eda Sulivana u 1964. Ali oni su pre toga svirali u malim klubovima u Liverpulu i Hamburgu od 1957, i dok ih je publika volela i ranije, prvi kritičan veliki uspeh, Sgt. Peppers, je objavljen u 1967. Samjuel DŽonson je mislio da treba više od 10 godina: "Savršenstvo u bilo kojoj oblasti se može postići samo radom tokom celog života; ne može se postići manjom cenom." I Šaucer se žalio "život tako kratak, veština toliko mnogo vremena zahteva."

Evo mog recepta za uspeh u programiranju:

  • Zainteresujte se za programiranje, i to što je zabavno. Pobrinite se da ono ostane zabavno tako da će te biti željni da uložite deset godina.

  • Pričajte sa drugim programerima; čitajte tuđe programe. Ovo je važnije od bilo koje knjige ili kursa-treninga.

  • Programirajte. Najbolje se uči kroz rad. Da se izrazim formalnije, "maksimalan nivo učinka za pojedinca u datoj delatnosti se ne postiže automatski kao funkcija većeg iskustva, nego stepen učinka može da se uveća čak i kod veoma iskusnih osoba kao rezultat namernog truda ka usavršavanju." (p. 366) i "najefikasnije učenje zahteva dobro definisan zadatak sa primerenom težinom za datu osobu, informativan savet, i prilike za ponavljanje i ispravljanje grešaka." (p. 20-21) Knjiga Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (Kognicija u Praksi: Um, Matematika, i Kultura u Svakodnevnom Životu) je zanimljiva referenca za ovo razmišljanje.

  • Ako želite, uložite četiti godine u fakultet (ili više na postdiplomskim studijama). To će vam dati pristup nekim poslovima koji zahtevaju diplome, i daće vam bolje razumevanje oblasti, ali ako ne uživate u školi, možete (sa izvesnom posvećenošću) dobiti slično iskustvo na poslu. U svakom slučaju, učenje iz udžbenika samo po sebi neće biti dovoljno. "Obrazovanje iz oblasti računarske tehnike i informatike ne može nikog učiniti ekspertom u programiranju, ništa više nego što studiranje četkica i boja može nekog učiniti majstorom slikarstva" kaže Erik Rejmond, autor The New Hacker's Dictionary (Novi Rečnik Hakera). Jedan od najboljih programera koje sam ikada zaposlio je imao samo srednjoškolsku diplomuč napravio je mnogo impresivnog programa, ima svoju news group, i kroz stok deonice je nema sumnje mnogo bogatiji nego što ću ja ikada biti.

  • Radite na projektima sa drugim programerima. Budite najbolji programer na nekim projektima; budite najgori na nekim drugim. Kada ste najbolji, imaćete prilike da istestirate svoje sposobnosti da upravljate projektom, i da inspirišete druge svojom vizijom. Kada ste najgori, naučite šta najbolji rade, i naučite šta ne vole da rade (zato što to nateraju vas da uradite).

  • Radite na projektima posle drugih programera. Budite uključeni u razumevanje programa koje su pisali drugi. Vidite šta je potrebno da biste razumeli i popravili program kada njegovi originalni programeri nisu tu. Mislite kako da dizajnirate vaše programe da ih napravite jednostavnije za one koji će ih održavati posle vas.

  • Naučite bar nekolicinu programskih jezika. Uključite jedan jezik koji podržava abstrakciju klasa (kao Java ili Ce++), jedan koji podrzava abstrakciju funkcija (kao Lisp ili ML), jedan koji podrzava abstrakciju sintakse (kao Lisp), jedan koji podrzava deklarativne specifikacije (kao Prolog ili Ce++ templates), jedan koji podrzava korutine (kao Icon ili Scheme), i jedan koji podrzava paralelizam (kao Sisal).

  • Zapamtite da postoji i "računar" u "računarskoj tehnici i informatici". Znajte koliko dugo treba vašem računaru da obavi instrukciju, pročita reč iz memorije (sa ili bez keša), pročita susednu reč iz diska, i potraži novu lokaciju na disku. (Odgovori ovde.)

  • Uključite se u standardizaciju jezika. To može biti ANSI Ce++ komitet, ili odlučivanje dal lokalan stil kodiranja treba da ima 2 ili 4 prazna mesta za intendaciju. U svakom slucaju, naučićete sta drugi ljudi vole u jeziku, koliko ozbiljno, ili možda koliko malo o tome misle.

  • Znaj kada je vreme da se skineš s jezične standardizacije, što je pre moguće.
Sa svim tim na umu, diskutabilno je koliko daleko možete stići samo sa učenjem iz knjige. Pre nego što sam dobio prvo dete, pročitao sam sve Kako da knige, i dalje sam se osećao kao zeleni bez ikakvog znanja. 30 meseci kasnije, kad sam trebao da dobijem drugo dete, dali sam ponovo obnavljao gradivo iz tih kniga? Ne. Umesto toga, oslonio sam se na lično iskustvo, koje se ispostavilo mnogo korisnije i ohrabrujuće za mene nego hiljade strana napisanih od strane eksperta.

Fred Bruks, u njegovom radu No Silver Bullets (Nema Srebrnih Metkova) identifikuje plan od tri dela za nalaženje sjajnih dizajnera aplikacija:

  1. Sistematično identifikuj najbolje dizajnere što je ranije moguće.

  2. Dodeli mentora za karijeru da bude odgovoran za razvoj kandidata, i pažljivo belezi razvoj karijere.

  3. Omogući za dizajnere u razvoju da komuniciraju i stimulišu jedni druge.

Ovo podrazumeva da neki ljudi već imaju kvalitete neophodne da bi se postao sjajan dizajner; cilj je prepoznati ih. Alan Perlis je to rekao lepše: "Svako se moze naučiti da vaja skulpture: Mikelanđelo bi se verovatno morao naučiti kako da ne vaja. Tako je i sa velikim programerima".

Znači, samo napred i kupite knigu o Javi; verovatno će vam biti od neke koristi. Ali neće vam promeniti život, ili vašu stvarnu sveukupnu ekspertizu kao programera u 24 sata, dana, pa čak i meseca.


Reference

Blym, Benjamin (ed.) Developing Talent in Young People, Balantine, 1985.

Bryks, Fred, No Silver Bullets, IEEE Kompjuter, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver Lorvence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Kejmbridž Univerzitetska Štampa, 1988.


Odgovori

Približna vremena raznih operacija na tipičnom 1GHz PC leta 2001:

execute single instruction 1 nsec = (1/1,000,000,000) sec
fetch word from L1 cache memory 2 nsec
fetch word from main memory 10 nsec
fetch word from consecutive disk location 200 nsec
fetch word from new disk location (seek) 8,000,000nsec = 8msec


Dodatak: Izbor Jezika

Nekoliko ljudi me je pitalo koji programski jezik bi trebalo da nauče prvo. Nema jednog odgovora, ali razmotrite sledeće stavke:

  • Koristite prijatelje. Kada me neko pita "koji operativni sistem bi trebao da koristim, Vindovs, Uniks, ili Mak?", moj odgovor je obično: "koristi štagod tvoji drugovi koriste." Prednost koju dobijete učeći od drugova će nadmašiti svaku svojstvenu razliku između OS, ili između programskih jezika. Takođe razmotrite buduće prijatelje: krugovi programera kojih ćete biti deo ako nastavite. Dali vaš izabran jezik ima veliko rastuće društvo, ili malo koje se gubi? Ima li knjiga, web stranica, internet foruma, od kojih mogu da se dobiju odgovori? Da li vam se svidjaju ljudi na tim forumima?
  • Ne komplikujte. Programerski jezici kao sto su C++ i Java su dizajnirani za profesionalni razvoj od strane velikih timova iskusnih programera koje brine efikasnost izvršenja njihovog koda. Kao rezultat, ovi jezici imaju komplikovane delove dizajnirane za te okolnosti. Vaša briga je da naučite da programirate. Ne trebaju vam dodatne komplikacije. Zelite jezik koji je napravljen da moze brzo da se uči i da se zapamti od strane pojedinačnog programera.
  • Igrajte se. Na koji način biste radije naučili da svirate klavir: na prirodan, interaktivan način, u kome čujete svaku notu čim pritisnete klavijaturu, ili u "batch" modu, u kome čujete note pošto ste završili celu melodiju? Očigledno, interaktivan način čini učenje jednostavnije za klavir, a takodje i za programiranje. Insistirajte na jeziku sa interaktivnom mogućnosšu, i koristite je.
Imajući ove kriterijume u vidu, moji predlozi za prvi programerski jezik bi bio Python ili Scheme. Ali vaše okolnosti mogu da se razlikuju, i postoje i drugi dobri izbori. Ako imate manje od deset godina, mozda ćete više voleti Alice ili Squeak (stariji učenici će možda takođe uživati u ovim). Važno je da odaberete i počnete.

Dodatak: Knjige i drugi izvori

Nekoliko ljudi je pitalo iz kojih knjiga i veb stranica bi trebalo da uče. Ponavljam da "učenje samo iz kniga neće biti dovoljno", ali mogu da preporučim sledeće:


Autorska prava: Petar Norvig (2001) Prevod: Lazar Kovačević (2006) -- pošaljite primedbe na prevod