Memlernu Programadon en Dek Jaroj

eseo de Peter Norvig (2001)

Lasta aktualigo de la traduko: Novembro 2012

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:

  1. Sisteme identigi la plej bonajn desegnistojn pli rapide kiel eble.

  2. Asignu al ili karierian mentoron por esti respondeca pri la disvolviĝo de la eblecoj kaj zorge tenu karierian arkivon.

  3. 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.

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.


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:


Notoj

T. Capey rimarkas, ke la retpaĝo Complete Problem Solver en Amazono nun havas "Teach Yourself Bengali in 21 days" [Memlernu la Bangalan en 21 tagoj] kaj "Memlernu Gramatikon kaj Stilon" librojn sub la sekcio "Klientoj kiuj aĉetis ĉi tiun aĵon ankaŭ aĉetis ĉi tiujn. Mi supozas, ke granda parto de homoj kiuj rigardis tiun libron venas de ĉi tiu retpaĝo. Dankon al Ross Cohen por helpado kun Hipokrato.
alsupren