Zasto su svi u takvoj zurbi?
Idite u bilo koju knjizaru, i videcete kako da Naucite Sami Javu za 7 Dana zajedno sa bezbrojnim varijacijama koje nude ucenje Visual Basic-a, Windows-a, Internet-a, i tako dalje za par dana ili sati.
Uradio sam sledecu pretragu na Amazon.com: (datum publikacije: posle 1992, naslov: nauci ili naslov: nauci 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) (Naucite Bengali za 30 dana). Zamenio sam "days" (dani) sa
"hours" (sati)
i dobio neverovatno slicne rezultate: 253 knjiga sa 77 komputerskih knjiga pracenim sa
Teach
Yourself Grammar and Style in 24 Hours (Naucite gramatiku i izrazavanje za 24 sata) na mestu 78. Od prvih 200 ukupno, 96% su nile kompjuterske knjige.
Zakljucak
je da su ljudi ili u velikoj zurbi da uce o kompjuterima, ili da su
kompjuteri nekako neverovatno laksi da se nauce nego bilo sta drugo.
Nema knjiga za ucenje Betovena, ili Kvantne Fizike, ili cak ni Nege Pasa za par dana.
Analizirajmo sta bi naslov kao sto je Learn Pascal in Three Days (Naucite Paskal za Tri Dana)
mogao da znaci:
- Nauci: Za 3 dana necete imati vremena da napisete nekoliko
ozbiljnijih programa, i da naucite iz svojih uspeha i neuspeha.
Necete imati vremena da radite sa iskusnim programerom
i razumete kako je to ziveti u takvoj sredini. Ukratko, necete
imati mnogo vremena za ucenje. Znaci oni mogu samo da pricaju o
povrsnom poznavanju materije, a ne o sustinskom razumevanju.
Kao sto je Alexandar Pop rekao, malo ucenja je opasno ucenje.
- Paskal: Za 3 dana cete mozda moci da naucite sintaksu Paskala
(ako ste vec znali slican jezik), ali nebi mogli da naucite kako
da koristite sintaksu. Ukratko, ako ste naprimer programer Basic-a
mogli biste nauciti da napisete program u stilu Basic-a koristeci
sintaksu Paskala, ali nebiste mogli nauciti zasta je Paskal dobar
(ili los). U cemu je onda poenta? Alan
Perlis je jednom rekao: "Jezik koji ne utice na nacin kako mislite o
programiranju nije vredan poznavanja." Jedna moguca poenta je
ucenje malecnog dela Paskala (ili verovatnije, necega kao sto je
Visual Basic ili JavaScript) zato sto vam treba interfejs sa
postojecim alatom za postizanje specificnog zadatka. Ali tada ne
ucite kako da programirate; ucite kako da obavite taj zadatak.
- za Tri Dana: Nazalost, ovo nije dovoljno, kao sto sledeci paragrafi pokazuju.
Naucite Sami da Programirate za 10 Godina
Istrazivaci (Hayes, Bloom)
su pokazali
da treba oko 10 godina da se razvije strucnost u bilo kojoj od mnogobrojnih
oblasti, ukljucujuci igranje saha, komponovanja muzike, slikanje, sviranje
klavira, plivanje, tenis, i istrazivanje u neuropsihologiji i topologiji.
Izgleda da nema precica: cak je Mocartu, koji je bio muzicko cudo od deteta sa
4 godine, trebalo 13 i vise godina pre nego sto je poceo da pravi muziku svetke
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
kritican veliki uspeh, Sgt. Peppers, je objavljen u 1967. Samuel
Johnson je mislio da treba vise od 10 godina: "Savrsenstvo u bilo kojoj oblasti
se moze postici samo radom tokom celog zivota; nemoze se postici manjom cenom."
I Chaucer se zalio "zivot tako kratak, vestina toliko mnogo vremena zahteva."
Evo mog recepta za uspeh u programiranju:
- Zainteresujte se za programiranje, i to zato sto je zabavno.
Pobrinite se da ono ostane zabavno tako da ce te biti zeljni
da ulozite deset godina.
- Pricajte sa drugim programerima; citajte tudje programe.
Ovo je vaznije od bilo koje knjige ili kursa/treninga.
- Programirajte. Najbolje se uci kroz rad. Da se izrazim formalnije, "maksimalan nivo ucinka za pojedinca u
datoj delatnosti se ne postize automatski kao funkcija veceg iskustva,
nego stepen ucinka moze da se uveca cak i kod veoma iskusnih osoba kao
rezultat namernog truda ka usavrusavanju." (p. 366)
i "najefikasnije
ucenje zahteva dobro definisan zadatak sa primerenom tezinom za datu
osobu, informativan savet, i prilike za ponavljanje i ispravljanje
gresaka." (p. 20-21) Knjiga
Cognition in Practice: Mind, Mathematics, and Culture in Everyday
Life je zanimljiva
referenca za ovo razmisljanje.
- Ako zelite, ulozite cetiri godine u fakultet (ili vise na postdiplomskim
studijama). To ce vam dati pristum nekim poslovima koji zahtevaju
diplome, i dace vam bolje razumevanje oblasti, ali ako ne uzivate
u skoli, mozete (sa izvesnom posvecenostu) dobiti slicno iskustvo na poslu.
U svakom slucaju, ucenje iz udzbenika samo po sebi nece biti dovoljno.
"Obrazovanje iz oblasti racunarska tehnika i informatika nemoze nikog
uciniti ekspertom u programiranju, nista vise nego sto studiranje cetkica
i boja moze nekog uciniti majstorom slikarstva" kaze Eric
Raymond, autor The New Hacker's Dictionary. Jedan od najboljih programera
koje sam ikada zaposlio je imao samo srednjoskolsku diplomu; napravio je
mnogo impresivnog programa, ima svoju news group,
i kroz stok deonice je nema sumnje mnogo bogatiji nego sto cu ja ikada biti.
- Radite na projektima sa drugim programerima. Budite najbolji programer na
nekim projektima; budite najgori na nekim drugim. Kada ste najbolji, imacete
prilike da istestirate svoje sposobnosti da upravljate projektom, i da
inspirisete druge svojom vizijom. Kada ste najgori, naucite sta najbolji rade,
i naucite sta ne vole da rade (zato sto to nateraju vas da uradite).
- Radite na projektima posle drugih programera. Budite ukljuceni u
razumevanje programa koje su pisali drugi. Vidite sta je potrebno da biste
razumeli i popravili program kada njegovi originalni programeri nisu tu.
Mislite kako da dizajnirate vase programe da ih napravite jednostavnije
za one koji ce ih odrzavati posle vas.
- Naucite bar nekolicinu programskih jezika. Ukljucite jedan jezik koji podrzava abstrakciju
klasa (kao Java ili C++), jedan koji podrzava abstrakciju funkcija
(kao Lisp ili ML), jedan koji podrzava abstrakciju sintakse
(kao Lisp), jedan koji podrzava deklarativne specifikacije
(kao Prolog ili C++ templates), jedan koji podrzava korutine
(kao Icon ili Scheme), i jedan koji podrzava paralelizam (kao Sisal).
- Zapamtite da postoji i "racunar" u "racunarskoj tehnici i informatici".
Znajte koliko dugo treba vasem racunaru da obavi instrukciju, procita
rec iz memorije (sa ili bez kesa), procita susednu rec iz diska, i
potrazi novu lokaciju na disku. (Odgovori ovde.)
- Ukljucite se u standardizaciju jezika. To moze biti ANSI C++ komitet,
ili odlucivanje dal lokalan stil kodiranja treba da ima 2 ili 4
prazna mesta za intendaciju. U svakom slucaju, naucicete sta drugi
ljudi vole u jeziku, koliko ozbiljno, ili mozda koliko malo o tome misle.
- Have the good sense to get off the language standardization effort as
quickly as possible. (Prevod fali jer bas i ne razumem najbolje ovu recenicu.)
Sa svim tim na umu, diskutabilno je koliko daleko mozete stici samo sa
ucenjem iz knjige. Pre nego sto sam dobio prvo dete, procitao sam sve
Kako da knige, i dalje sam se osecao 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 licno
iskustvo, koje se ispostavilo mnogo korisnije i ohrabrujuce za mene nego
hiljade strana napisanih od strane eksperta.
Fred Brooks, u njegovom radu No Silver Bullets
identifikuje plan od tri dela
za nalazenje sjajnih dizajnera aplikacija:
- Sistematicno identifikuj najbolje dizajnere sto je ranije moguce.
- Dodeli mentora za karijeru da bude odgovoran za razvoj kandidata, i
pazljivo belezi razvoj karijere.
- Omoguci za dizajnere u razvoju da komuniciraju i stimulisu jedni druge.
Ovo podrazumeva da neki ljudi vec imaju kvalitete neophodne da bi se postao
sjajan dizajner; cilj je prepoznati ih. Alan
Perlis je to rekao lepse: "Svako se moze nauciti da valja skulpture:
Mikelandjelo bi se verovatno morao nauciti kako da ne valja. Tako je i sa velikim
programerima".
Znaci, samo napred i kupite knigu o Javi; verovatno ce vam biti od neke koristi.
Ali nece vam promeniti zivot, ili vasu stvarnu sveukupnu ekspertizu kao programera
u 24 sata, dana, pa cak i meseca.
Reference
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.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday
Life, Cambridge University Press, 1988.
Odgovori
Priblizna vremena raznih operacija na tipicnom 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 nauce prvo.
Nema jednog odgovora, ali razmotrite sledece stavke:
- Koristite prijatelje. Kada me neko pita "koji operativni sistem
bi trebao da koristim, Windows, Unix, or Mac?", moj odgovor je obicno: "koristi
stagod tvoji drugovi koriste." Prednost koju dobijete uceci od drugova ce nadmasiti
svaku svojstvenu razliku izmedju OS, ili izmedju programskih jezika.
Takodje razmotrite buduce prijatelje: krugovi programera kojih cete biti deo ako nastavite.
Dali vas izabran jezik ima veliko rastuce drustvo, 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 izvrsenja njihovog koda.
Kao rezultat, ovi jezici imaju komplikovane delove dizajnirane za te okolnosti.
Vasa briga je da naucite da programirate. Ne trebaju vam dodatne komplikacije.
Zelite jezik koji je napravljen da moze brzo da se uci i da se zapamti od strane pojedinacnog
programera.
- Igrajte se. Na koji nacin biste radije naucili da svirate klavir:
na prirodan, interaktivan nacin, u kome cujete svaku notu cim pritisnete klavijaturu,
ili u "batch" modu, u kome cujete note posto ste zavrsili celu melodiju?
Ocigledno, interaktivan nacin cini ucenje jednostavnije za klavir, a takodje i za
programiranje. Insistirajte na jeziku sa interaktivnom mogucnoscu, i koristite je.
Imajuci ove kriterijume u vidu, moji predlozi za prvi programerski jezik bi bio
Python ili
Scheme. Ali vase okolnosti mogu
da se razlikuju, i postoje i drugi dobri izbori. Ako imate manje od deset godina,
mozda cete vise voleti Alice ili Squeak
(stariji ucenici ce mozda takodje uzivati u ovim). Vazno je da odaberete i pocnete.
Dodatak: Knjige i drugi izvori
Nekoliko ljudi je pitalo iz kojih knjiga i web stranica bi trebalo da uce.
Ponavljam da "ucenje samo iz kniga nece biti dovoljno", ali mogu da preporucim sledece:
|
|