Memlernu Programadon en Dek Jaroj
eseo de Peter Norvig (2001)
Kial estas ĉiuj tiel hastemaj?
Promenu en ajnan librovendejon, kaj vi trovos flanke al lernolibro Memlernu Ĝavon en 7 Tagoj senfinajn variaĵojn ofertante memlernadon de Visual Basic, Vindozon, Interreton, kaj simile en malmultaj tagoj aŭ horoj. Mi faris la sekvan plenpovan serĉadon tra Amazon.com:
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
kaj obtenis revene 248 rezultojn. La unuaj 78 estis prinformadikajn librojn (numero 79 estis Memlernu la Bengalan en 30 tagoj). Mi substituis "tagojn" kun "horoj" kaj obtenis notinde similajn rezultojn: 253 pliajn librojn, kun 77 prinformadikaj sekvitaj de Memlernu Gramatikon kaj Stilon en 24 Horoj je numero 78. El la 200 unuaj rezultoj, 96% estis prinformadikaj libroj.
La eltiro estas, ke aŭ homoj kutime hastemas kiam ili devas lerni pri informadiko, aŭ komputiloj estas iel mirinde plifacile ellerneblaj ol ĉia alia temo. Ne estas libroj pri kiel lerni Beethoven, aŭ Kvantuman Fizikon, aŭ eĉ hundotrejnadon, en malmultaj tagoj. Felleisen et al. diretas ion interesan pri ĉi tiu tendenco en sia libro Kiel Bone Desegni Komputilajn Programojn: "mallerta programado estas facila. Idiotoj povas lerni en 21 tagoj, eĉ se ili estas stultaj."
Ni analizu kion memlernolibro kies titolo estas Lernu C++ en Tri Tagoj povus signifi:
- Lerni: en 3 tagoj oni ne havos la tempon verki multajn
signifoplenajn programojn, kaj lerni ion el sukcesoj kaj
malsukcesoj. Oni ne havos la tempon labori kun sperta programisto
kaj lerni kio signifas vivi en C++-medio. Mallonge dirite, oni ne
havos la tempon lerni multe. Do, la libro povas nur paroli pri
surfaca ekkono, ne profunda kompreno. Kiel Alexander Pope asertis,
lerni malmulte ion estas danĝere.
- C++: en 3 tagoj oni povus eble lerni iom da sintakso de C++
(se oni jam konas alian programlingvaĵon), sed oni ne povus
lerni multe pri la maniero uzi la lingvaĵon mem. Mallonge: se vi
estus, ekzemple, BASIC-programisto, vi povus lerni kiel verki programojn
en BASIC-stilo uzante C++sintakson, sed vi ne povus lerni por kio C++
estas bona (kaj malbona). Do, kio estas la punkto? Alan
Perlis iam deklaris: "Programlingvaĵon kiu ne
ŝanĝas onian manieron pripensi programadon, ne valoras la
penon lerni". Povas esti, ke oni devas lerni iom da C++ (aŭ,
pli probable, Ĝavoskripto aŭ Flash) ĉar oni devas
interligi ekzistan ilon por plenumi difinitan taskon. Sed tiukaze
oni ne estas lernanta kiel programi; oni estas lernanta kiel plenumi
tiun taskon.
- en 3 tagoj: malbonŝance, tiu ĉi tempo ne sufiĉas, kiel la proksima sekcio montras.
Memlernu programadon en dek jaroj
Esploristoj (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) montris, ke oni bezonas plimapli dek jarojn por disvolvi spertadon en multaj diversaj areoj, inklude ŝakludadon, muzik-komponadon, telegrafion, pentradon, pianoludadon, naĝadon, tenis-ludadon, kaj esploradon en neŭropsikologio kaj topologio. La kerna punkto estas intenca praktiko: ne nur fari kaj refari, sed defii mem per tasko kiu estas ĝuste preter la aktuala kapabla limo, kaj korekti la erarojn. Poste ripeti. Kaj ripeti denove. Verŝajne ne ekzistas mallongigoj al la vojo: eĉ Mozart, kiu estis muzika geniulo je la aĝo 4, bezonis 13 jarojn antaŭ ol produkti ĉefverkan muzikon. Aligenre, Beatles ŝajnis alveni la muzikan scenon per aro da unurangaj kanzonoj kaj apero ĉe spektaklo Ed Sullivan en 1964. Sed ili ludis en klubetoj de Liverpulo kaj Hamburgo ekde 1957. Krome, kvankam ili kreis amason da entuziasmo frue, la unua mondfama sukceso, Sgt. Peppers, estis publikigita en 1967. Malcolm Gladwell rakontas, ke studo de studentoj ĉe la Berlina Akademio de Muziko komparis tri grupoj de la klaso: la plej lertaj, la averaĝaj kaj la malplej lertaj, demandante pri kiom da tempo ili praktikas ludadon:
Ĉiu membro de la tri grupoj komencis lerni ludadon plimalpli samtempe -- ĉirkaŭ je la kvina jaraĝo. En tiuj unuaj malmultaj jaroj, ĉiu praktikis plimalpli la saman kvanton da tempo -- plimalpli du aŭ tri jarojn ĉiun jaron. Sed je la oka jarâo realaj diferencoj ekemerĝiĝis. La studentoj kiuj iĝos la plej lertaj komencis praktiki pli ol ĉiuj aliaj: po ses horojn semajne je la naŭa jaraĝo, ok je la 12a, 16 je la 14a, ĉiam pli kaj pli, ĝis pli ol 30 horojn ĉiusemajne je la 20a jarâo. Je la 20a jaraĝo, la elitaj ludistoj studis entute 10.000 horojn da praktikado dum la disvolviĝo de sia vivo. La studentoj kiuj estis nur bonaj entute studis 8.000 horojn, kaj la estontaj muzik-instruistoj nur 4.000 horojn.
Do eble temis pri 10.000 horoj, ne 10 jaroj, jen la magia nombro. (Henri Cartier-Bresson (1908-2004) asertis "Viaj unuaj 10.000 fotaĵoj estos viaj plej aĉaj," sed li fotis pli ol unu ĉiun horon.) Samuel Johnson (1709-1784) pensis pri tio eble pli longe: "Eksterordinareco ajnafake povas esti atingita nur per vivlonga laboro; ĝi ne povas estis atingita je malpli prezo." Kaj Chaucer (1340-1400) plendis "vivo tiel mallongas, slojdo tiel longe por lerni." Hipokrato (ĉ. 400 a.K.) konatas por la citaĵo "ars longa, vita brevis", kiu estas parto de pli longa latina citaĵo "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile", kiu en la esperanta iĝas "Arto longas, vivo mallongas, okazoj fuĝas, eksperimenti danĝeras, juĝi malfacilas." Kvankam en la latina ars povas signifi kaj arto kaj slojdo, la originala vorto tekné (tekno) signifas "lerteco", ne "arto".
Fine vi volas iĝi programisto
Jen mia recepto por sukcesi rilate al programado:
- Interesiĝu je programado, kaj kondutu tiel ĉar
estas amuziĝe. Certigu, ke vi amuziĝu sufiĉe por
daŭre esti parto de tio por dek jaroj aŭ 10.000 horoj.
- Programu. La plej maniero lerni estas lernado
per farado (ligo en la angla). Esprimante la koncepton pli
teknike, "la plej alta nivelo de lerteco por individuoj en
difinita areo ne estas aŭtomate atingita kiel funkcio de la
spertado, sed la nivelo de lerteco povas esti plialtigita eĉ
de altkvalite trejnitaj individuoj kiel rezulto de volaj
streĉoj pliboniĝi." (p. 366)
kaj "la plej efika lernado bezonas bone difinitan taskon kun
taŭga nivelo da malfacileco por speciala individuo,
informriĉan retroagadon, kaj okazojn por ripetado kaj
korektado de la eraroj." (p. 20-21) La libro
Cognition in Practice: Mind, Mathematics, and Culture in Everyday
Life [Konivo en Praktiko: Menso, Matematiko, kaj Kulturo en la
Ĉiutaga Vivo] estas interesa fontindiko por ĉi vidpunkto.
- Babilu kun aliaj program-ŝatantoj; legu aliies
programojn. Ĉ tio estas pli grava ol ajna libro aŭ
trejniga kurso.
- Se vi volas, utiligu kvar aŭ pli jarojn en universitato
aŭ altkvalita lernejo. Tio permesus al vi akiri kelkajn
postenojn kiuj bezonas diplomojn, kaj donos al vi pliprofundan
komprenadon de la fako, sed kaze, ke vi ne ŝatas lernejojn, vi
povas (kune kun iom da sindediĉo) obteni similan spertadon
memlerne aŭ dum laborado. Ĉiukaze, nura librolernado
kiel sola konkreta agado neniel
sufiĉos. "Informadika edukado igas neniun sperta
programisto samkiel studi pentrilojn kaj pigmentojn povas igi
neniun sperta pentristo" asertas Eric Raymond, aŭtoro de
La Nova Hakisma Vortaro. Unu el la plej lertaj programistoj,
kiun mi iam ajn laborigis, havis nur altlernejan diplomon; li faris grandan softvaron, havas propran novaĵgrupon,
kaj obtenis sufiĉan monkvanton en akcioj por aĉeti
propran noktoklubon.
- Laboru en projektoj kun aliaj program-amantoj. Estu la
plej lerta programisto en kelkaj projektoj; la plej mallertaj en
aliaj. Kiam vi estas la plej lerta, vi testu vian lertecon gvidi
projekton, kaj inspiri aliajn kun via perspektivo. Kiam vi estas la
malplej lerta, vi lernu kion la majstroj faras, kaj vi lernas kion ili
ne ŝatas (ĉar ili faras tion por ili).
- Laboru en projektoj post aliaj programistoj.
Komprenu programon skribitan de aliaj. Rimarku kion oni bezonas por
kompreni kaj ripari kiam la originaj programistoj ne estas je dispono.
Pripensu kiel desegni viajn programojn por faciligi homojn kiuj
vivigos ilin post vi.
- Lernu almenaŭ duonan dekduon da
programlingvaĵoj. Inkludu unu lingvaĵon kiu enhavas
klas-abstraktiĝon (kiel Ĝavon aŭ C++), unu kiu
enhavas funkci-abstraktiĝon (kiel Lisp aŭ ML), unu kiu
enhavas sintaks-abstraktiĝon (kiel Lisp), unu kiu enhavas
deklar-specifadon (kiel Prolog aŭ C++-ŝablonojn), unu kiu
enhavas kun-rutinojn (kiel Icon aŭ Scheme), kaj unu kiu enhavas
paraleladon (kiel Sisal).
- Memoru, ke estas "komputilo" en
"komputil-scienco". Sciu kiom da tempo bezonas komputilo por
plenumi instrukcion, eltiri vorton el memoro (kun kaj sen
kaŝmemoro), legi sinsekvan vorton el disko, kaj trovi novan
lokiĝon en disko (Respondoj sube.)
- Partoprenu streĉojn pri normigado de
lingvaĵo. Tio povas esti la komitato ANSI C++, aŭ se la
lokgrupa kodstilo havos 2 aŭ 4
spac-krommarĝenojn. Ambaŭkaze, lernu kion aliaj homoj
ŝatas en lingvaĵo, kiel profounde ili sentas sin komfortaj
uzi ĝin, kaj eĉ iomete kial.
- Havu la bonan sencon eliri la streĉadon normigi lingvaĵon pli rapide kiel eble.
Kun ĉio ĉi en la menso, dubeblas kiom vi obtenas nur per librolernado. Antaŭ la naskiĝo de mia unua filo, mi legis ĉiun libron kiel Kiel esti bona patro, kaj daŭre mi sentis min mem komencanto kiam la dua filo estis alvenonta, 30 monatojn poste. Ĉu mi reprenis la librojn por refreŝigi la nociojn? Ne. Male, mi fidis je mia persona sperto, kiu estis finfine multe pli utila al mi ol miloj da paĝoj verkitaj de fakuloj.
Fred Brooks, en sia eseo No Silver Bullet (ligo en la angla) [Ne ekzistas panaceo] starigis tripartan planon por trovi grandan softvaran desegnistojn:
- Sisteme identigi la plej bonajn desegnistojn pli rapide kiel eble.
- Asignu al ili karierian mentoron por esti respondeca pri la
disvolviĝo de la eblecoj kaj zorge tenu karierian arkivon.
- Provizu okazojn por kreskigi desegnistojn en interaga medio
kiu stimulas la rilato inter unu kun la alia.
Tio pretendas, ke kelkaj homoj jam havas la necesajn kvalitojn por esti grandaj desegnistoj; la laboro estas propre ilin flati. Alan Perlis diris tio pli mallonge: "Ĉiun oni povas instrui kiel skulpti: Michelangelo-n oni devus instrui kiel nefari. Same okazas kun grandaj programistoj". Perlis estas dirante, ke la granduloj havas internan kvaliton kiu preteriras sian trejnadon. Sed de kie tiu ĉi kvalito venas? Ĉu denaske? Aŭ ĉu ili disvolviĝas per diligenteco? Kiel Auguste Gusteau (la fikcia kuiristo de kartunfilmo Ratatouille) klarigas, "ĉiu povas kuiri, sed nur la sentimaj povas esti grandaj." Mi pensas pri tio pli ligita al obstino dediĉi larĝan parton de onia vivo al plenvola praktiko. Sed eble sentima estas maniero resumi la koncepton. Aŭ, kiel la kritikisto de Gusteau, Anton Ego, asertas: "Ne ĉiuj povas iĝi grandajn artistojn, sed granda artisto povas fonti de ie ajn."
Do, daŭrigu kaj aĉetu tiu libron pri Ĝavo, Rubeno, Ĝavaskripto aŭ PHP. Sed vi ne ŝanĝos vian vivon, aŭ vian ĝeneralan kapablon kiel programisto en 24 horoj, tagoj aŭ eĉ semajnoj. Kion vi pensas pri laboregi por daŭre pliboniĝi dum 24 monatoj? Bone, nun estas via vico komenci el ie...
Bibliografio
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.
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.
Respondoj
Proksimuma tempo por variaj operacioj en normala persona komputilo:
plenumi tipan instrukcion | 1/1.000.000.000 sekundon = 1 nanosekundon |
alpreni el L1-kaŝmemoro | 0,5 nanosekundojn |
branĉa misantaŭvidon | 5 nanosekundojn |
alpreni el L2-kaŝmemoro | 7 nanosekundojn |
Mutex-on (mal)ŝlosi | 25 nanosekundojn |
alpreni el ĉefmemoro | 100 nanosekundojn |
sendi 2 kilobitokojn tra 1Gbpoj-reto | 20.000 nanosekundojn |
legi 1MB-on sinsekve el memoro | 250.000 nanosekundojn |
alpreni el nova disko-lokiĝo (serĉi) | 8.000.000 nanosekundojn |
sendi pakaĵon el Usono al Eŭropo kaj reen | 150 milisekundojn = 150.000.000 nanosekundojn |
Apendico: Elekti la Lingvaĵon
Multaj homoj demandis al mi kiun program-lingvaĵon oni devus lerni unue. Estas neniu ĉiamvalida respondo, sed konsideru la sekvajn rimarkojn:
- Amikecoj. Kiam pridemandite "kiun Operaciuman Sistemon mi devus uzi: Vindozo, Unikso aŭ Makintoŝo?", mia kutima respondo estas: "uzu kion ajn viaj amikoj uzas." La avantaĝon kiun vi obtenas el la peramika lernado estas multe pli granda ol la internaj diferencoj inter diversaj OSoj, aŭ programlingvaĵoj. Krome, konsideru viajn estontecajn amikojn: la komunumo de programistoj kiun vi volas eniri se vi daŭrigas la lernadon. Ĉu la elektita programlingvaĵo havas kreskantan, larĝan komunumon, aŭ ĉu ĝi estas malgranda kaj mortanta? Ĉu ekzistas libroj, retejoj, retforumoj de kie obteni respondojn? Ĉu vi ŝatas homojn partoprenantaj tiujn retforumojn?
- Restu simpla. Programlingvaĵoj kiel C++ kaj Ĝavo estis desegnitaj por profesia kodigo fare de grandaj teamoj de spertaj programistoj kiuj alfrontas interalie la temon de kodorapideco. Rezulte, ĉi tiuj programlingvaĵoj havas komplikajn partojn desegnitaj por tiuj cirkumstancoj. Vi alfrontas la taskon lerni programadon. Vi ne bezonas tiun komplikiĝon. Vi volas programlingvaĵon kiu estis desegnita por esti facile lernebla kaj memorebla de ununura freŝbakita programisto.
- Ludu. Kiamaniere vi lernus ludi pianon: per la normala, interaga maniero, en kiu vi aŭdas ĉiun noton apenaŭ vi tuŝas klavon, aŭ per tuŝodosiero, en kiu vi nur aŭdas la notojn post kiam vi finis tutan kanzonon? Klare, interaga modo faciligas piano-lernadon, kaj same programo-. Insistu je lingvaĵo prezentanta interagan manieron kaj uzu ĝin.
Donite tiujn rimarkojn, mia rekomendo kiel unua programlingvaĵo estus Pitono [kiu havas Esperantlingvan subkomunumon, NdT] aŭ Scheme [Esperanta Vikipedia retpaĝo]. Sed viaj cirkumstancoj povas varii, kaj ekzistas aliaj bonaj elektoj. Se via aĝo estas unucifera, vi povus preferi ion kiel Alice aŭ Squeak (pliaĝaj lernantoj same povas amuziĝi). La grava fakto estas, ke vi elektas kaj komencas uzi.
Apendico: Libroj kaj Aliaj Referencoj
Multaj homoj demandis al mi ekde kiuj libroj aŭ retpaĝoj ili devus komeci. Mi ripetas, ke "librolernado sole ne sufiĉas", sed mi povas rekomendi la sekvajn:
- Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) [Strukturo kaj Interpretado de Komputil-Programoj] estas eble la plej bona enkonduko en informadikon, kaj instruas programadon kiel maniero por kompreni informadikon. Vi povas vidi enretajn filmeton de lecionoj pri tiu ĉi libro, krome la kompleta teksto enretas. La libro estas defio kaj malproksimigos kelkajn homojn kiuj eble estus sukcesaj sekvanta alian alirmanieron.
- Scheme: How to Design Programs (Felleisen et al.) [Kiel Desegni Programojn] estas unu el la plej bonaj libroj pri kiel reale desegni programojn en eleganta kaj funkcia maniero.
- Pitono: Python Programming: An Intro to CS (Zelle) estas bona enkonduko al Pitono.
- Pitono: Multaj enretaj referencaj paŝ' al paŝaj prezentoj estas je dispono en Python.org [en Esperanto, baza prezento troveblas ĉi-tie, kontrolite je 16 nov 2012, NdT].
- Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) [Konceptoj, Teknikoj, kaj Modeloj de Komputil-Programado] videblas de kelkaj kiel moderna posteulo al libro de Abelson & Sussman. Temas pri vojaĝo tra la grandaj ideoj de programado, kovranta pli larĝan idearon ol Abelson & Sussman dum eble pli facile legebla kaj sekvebla. Ĝi uzas programlingvaĵo, Oz, ne multe konata sed utila kiel bazo por lerni aliajn lingvaĵojn.