Învaţă singur să programezi în Zece Ani

Peter Norvig

Versiunea originală
Traducere liberă: Ştefan Lazăr

De ce se grăbeşte aşa toată lumea?

Intră în orice librărie şi vei vedea cum poţi Învăţa singur Java în 7 Zile alături de nesfârşite variaţii oferind-se să te înveţe Visual Basic, Windows, Internet şi altele la fel, în doar câteva zile sau chiar ore. Am făcut următoarea căutare la Amazon.com:
     pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
şi am obţinut 248 de rezulate. Primele 78 erau cărţi despre calculatoare ( numărul 79 era Învaţă Bengali în 30 zile ). Am înlocuit "days"(zile) cu "hours"(ore) şi în mod remarcabil am obţinut rezultate similare: 253 de cărţi, cu 77 cărţi despre calculatoare urmate de Învaţă Singur Gramatică şi Stil în 24 de Ore la numărul 78. Din totalul primelor, 96% erau cărţi despre calculatoare.

Concluzia este sau că oamenii sunt într-o mare grabă să înveţe despre calculatoare, sau că acestea sunt cumva fabulos mai uşor de învăţat decât orice altceva. Nu există cărţi despre cum să înveţi Beethoven sau Fizică Cuantică sau chiar Îngrijitul câinilor în doar câteva zile.

Haideţi să analizăm ceea ce un titlu ca Învaţă Pascal în Trei Zile poate să însemne:

  • Învaţă: În 3 zile nu vei avea timp să scrii câteva programe importante, şi să înveţi din succese sau eşecuri cu ele. Nu vei avea timp să lucrezi alături de un programator cu experienţă şi să înţelegi cum este de fapt să trăieşti în acel mediu. Pe scurt, nu vei avea timp să înveţi mai nimic. Deci nu se poate vorbi decât de o superficială familiarizare, şi nu o înţelegere în profunzime. După cum a spus Alexander Pope, învăţătura puţină este un lucru periculos.
  • Pascal: În 3 zile poate vei fi în stare să înveţi sintaxa limbajului Pascal (dacă ştiai dinainte un limbaj asemănător), dar nu vei putea învăţa prea mult cum să foloseşti această sintaxă. Pe scurt, dacă ai fi, să spunem, un programator de Basic, ai putea învăţa să scrii programe în stilul Basic folosind sintaxa din Pascal, dar nu ai putea învăţa la ce este de fapt bun (sau la ce nu este bun) limbajul Pascal. Dar atunci ce rost are? Alan Perlis a spus cândva: “Un limbaj care nu-ţi afectează modul cum gândeşti despre programare, nu merită să fie ştiut”. O variantă posibilă este că vei învăţa o mică părticică din Pascal (sau mai probabil, ceva în genul Visual Basic sau JavaScript) deoarece ai nevoie de o interfaţă la un program existent pentru a îndeplini o sarcină anume. Dar atunci nu înveţi cum să programezi; înveţi cum să îndeplineşti sarcina.
  • în Trei Zile: Din păcate, asta nu este deajuns, aşa cum arată paragrafele următoare.

Învaţă singur să programezi în Zece Ani

Cercetătorii (Hayes, Bloom) au arătat că durează aproape zece ani pentru a căpăta competenţă în oricare dintr-o largă varietate de domenii, incluzând jocul de şah, compoziţia de muzică, pictura, pianul, înnotul, tenisul, şi cercetarea în neuropsihologie şi topologie. Se pare că nu există scurtături: chiar şi lui Mozart, care era un fenomen muzical la vârsta de 4 ani, i-au mai trebuit încă 13 ani înainte să înceapă să producă muzică de valoare universală. Într-un alt gen muzical Beatles au izbucnit pe scenă cu un şir de succese numărul #1 şi o apariţie în spectacolul Ed Sullivan în anul 1964. Dar ei cântaseră în cluburi mici în Liverpool şi Hamburg încă din anul 1957, şi în timp ce au atras masele de timpuriu, primul lor succes critic, Sgt. Peppers, a apărut în 1967. Samuel Johnson credea că ar trebui mai mult de zece ani: “Excelarea în orice domeniu poate fi atinsă numai prin munca de o viaţă; nu poate fi cumpărată la un preţ mai mic”. Şi Chaucer s-a plâns “ viaţa-i aşa de scurtă, meşteşugul atât de greu de deprins.”

Iată reţeta mea pentru succesul în programare:

  • Apropie-te de programare, şi încearc-o pentru că merită. Fă în aşa fel încât să te întreţină în permanenţă, aşa încât să-ţi doreşti să petreci zece ani alături de ea.
  • Vorbeşte cu alţi programatori; citeşte alte programe. Asta este mai important decât orice carte sau curs.
  • Programează. Cel mai bun mod de învăţare este învaţă făcând. Pentru a vorbi mai tehnic, "nivelul maxim de performanţă pentru indivizii dintr-un domeniu nu este atins în mod automat ca rezultat al unei experienţei extinse, ci nivelul de performanţă poate fi mărit chiar şi de către indivizi cu înaltă experienţă ca rezultat al eforturilor deliberate de a progresa." (p. 366) şi "cel mai eficient mod de învăţare necesită o temă bine definită cu un grad de dificultate potrivit pentru individul respectiv, "feedback" informativ, şi posibilităţi de repetiţie şi corecţie a erorilor." (p. 20-21) Cartea Cunoaştere în Practică: Minte, Matematică, şi Cultură în Viaţa de Toate Zilele este o referinţă interesantă din acest punct de vedere.
  • Dacă vrei, petrece patru ani într-o facultate ( sau şi mai mult la o specializare). Asta îţi va da acces la unele slujbe care cer diplomă, şi îţi va da o înţelegere mai profundă a domeniului, dar dacă nu te omori cu cartea, poţi căpăta ( cu oarece devoţiune) o experienţă similară lucrând. În orice caz învăţatul doar din carte nu va fi suficient. "Educaţia în Ştiinţa Calculatoarelor nu poate face pe nimeni un programator expert tot aşa cum studiul pensulelor şi al pigmenţilor nu poate face pe cineva un pictor experimentat." spune Eric Raymond, autor al Noul Dicţionar al "Hacker-ului". Unul dintre cei mai buni programatori pe care i-am angajat vreodată avea numai liceul; el a produs mult software de calitate, are propriul "news group", şi prin opţiuni de bursă este fără îndoială cu mult mai bogat decât voi fi eu vreodată.
  • Lucrează la proiecte cu alţi programatori. Fii cel dintâi la unele proiecte; fii cel din urmă la altele. Când eşti cel dintâi, poţi să-ţi încerci puterile pentru a conduce proiectul, şi să-i inspiri pe ceilalţi cu viziunea ta. Când eşti cel mai urmă, vei învăţa ceea ce fac maieştri, şi vei învăţa ceea ce nu le place să facă (pentru că te vor pune pe tine să faci în locul lor).
  • Lucrează la proiecte în urma altor programatori. Fii implicat în înţelegerea unui program scris de altcineva. Află ce trebuie pentru a înţelege şi corectează când programatorii iniţiali nu sunt în jur. Gândeşte-te cum să-ţi proiectezi programele pentru a le face mai uşor de înţeles pentru cei care le vor întreţine după tine.
  • Învaţă cel puţin jumătate de duzină de limbaje de programare. Include un limbaj care să aibă abstracţiile claselor ( ca Java sau C++), unul care care să aibă abstracţii funcţionale ( ca Lisp sau ML), unul care să aibă abstracţii sintactice ( ca Lisp), unul care să aibă specificaţii declarative ( ca Prolog sau C++ templates), unul care să aibă corutine ( ca Icon sau Scheme), şi unul care să aibă paralelism ( ca Sisal).
  • Ţine minte că există şi cuvântul "calculator" în termenul "Ştiinţa Calculatorului". Trebuie să ştii cât timp îi ia calculatorului tău pentru a executa o instrucţiune, pentru a extrage un cuvânt din memorie ( cu şi fără un “cache miss”), pentru a citi cuvinte consecutive de pe disc, sau a căuta o nouă locaţie pe disc. (Răspunsuri aici.)
  • Implică-te într-un efort de standardizare a unui limbaj. Poate fi comitetul ANSI C++, sau poate fi decizia locală dacă stilul tău de codare va avea 2 sau 4 spaţii de indentare. Şi într-un caz şi celălalt vei învăţa despre ceea ce le place altora într-un limbaj, cât de ataşaţi sunt, şi poate chiar puţin despre de ce simt aşa.
  • Ai bunul simţ să renunţi la efortul de standardizare cât mai rapid cu putinţă.
Ţinând cont de toate acestea, este discutabil cât de departe poţi să ajungi doar învăţând din cărţi. Înainte de a mi se naşte primul copil, am citit toate cărţile despre Cum să … şi tot m-am simţit ca un novice fără reper. 30 de luni mai târziu, când aşteptam al doilea copil, m-am dus din nou la cărţi ca să-mi repîmprospătez cunoştinţele? Nu. În schimb, m-am bazat pe experienţa personală, care s-a dovedit a fi cu mult mai folositoare şi liniştitoare decât mii de pagini scrise de experţi.

Fred Brooks, în eseul său Nu există metodă miraculoasă identifică un plan în trei părţi pentru a găsi programatori de talent:

  1. Identifică în mod sistematic pe cei mai buni programatori cât mai devreme cu putinţă.

  2. Desemnează un mentor pentru carieră care să fie responsabil cu dezvolarea candidaţilor şi care cu grijă să întocmescă o fişă de carieră.

  3. Asigură tinerilor programatori ocazii de a interacţiona şi a se antrena reciproc.
Asta presupune că unii oameni deja au calităţile necesare de a fi un programator de talent; ceea ce mai rămâne de făcut este să-i îndrumăm corespunzător. Alan Perlis a spus mai succint: "Oricine poate fi învăţat să sculpteze: Michelangelo ar fi trebuit să fie dezvăţat. La fel este şi cu programatorii de talent".

Deci mergi şi cumpără o carte de Java; probabil că îţi va folosi într-un fel. Dar nu-ţi vei schimba viaţa, sau competenţa reală ca programator în 24 de ore, zile, sau chiar luni.


Referinţe

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.


Răspunsuri

Timpii aproximativi pentru diverse operaţii pe un Calculator Personal tipic la 1GHz în vara lui 2001:

execuţia unei singure instrucţiuni 1 nsec = (1/1,000,000,000) sec
extragerea unui cuvânt din memoria cache L1 2 nsec
extragerea unui cuvânt din memoria principală 10 nsec
extragerea unui cuvânt de pe disc de la o locaţie consecutivă 200 nsec
extragerea unui cuvânt de pe disc de la o locaţie nouă (seek) 8,000,000nsec = 8msec


Anexă: Alegerea Limbajului

Mai mulţi oameni au întrebat ce limbaj de programre să înveţe mai întâi. Nu există un singur răspuns, dar consideră următoarele:
  • Foloseşte-ţi prietenii. Când sunt întrebat "ce sistem de operare ar trebui să folosesc, Windows, Unix, sau Mac?", răspunsul meu de obicei este: “foloseşte ceea folosesc ce şi prietenii tăi.” Avantajul pe care îl ai de a învăţa de la prieteni va anula orice diferenţă intrinsecă între sistemele de operare, sau între limbajele de programare. De asemenea ia în seamă viitori prieteni: comunitatea de programatori din care vei face parte dacă vei comtinua. Limbajul pe care l-ai ales are o comunitate foarte mare, sau una mică pe cale de dispariţie? Există cărţi, site-uri de web, şi grupuri de discuţie de unde poţi afla răspunsuri? Îţi plac oamenii din acele grupuri?
  • Nu te complica. Limbajele de programare precum C++ şi Java au fost proiectate pentru programare profesionistă de echipe mari de programatori cu experienţă care au fost preocupaţi de eficienţa la rulare a codului lor. Ca urmare, aceste limbaje au părţi complicate proiectate pentru astfel de situaţii. Tu te preocupi de învăţarea unui limbaj. Nu-ţi trebuie aceste complicaţii. Vrei un limbaj care a fost proiectat pentru a fi uşor de învăţat şi ţinut minte de către un singur programator novice.
  • Joacă-te. Cum ai prefera să învăţi să cânţi la pian: în mod normal, interactiv, în care auzi fiecare notă atunci când apeşi pe clape, sau în modul “grupat”, în care auzi notele abia după ce ai terminat de învăţat întregul cântec? În mod clar modul interactiv face învăţarea pianului mai uşoară, şi la fel este şi cu programarea. Alege-ţi un limbaj cu mod interactiv şi foloseşte-l.
Ţinând cont de aceste criterii, recomandarea mea pentru primul limbaj de programare ar fi Python sau Scheme. Dar circumstanţele tale pot varia, şi mai sunt şi alte soluţii bune. Dacă vârsta ta are o singură cifră, poate preferi Alice sau Squeak (o alegere potrivită şi pentru cei mai în vârstă). Lucrul important este să faci alegerea şi să începi.

Anexă: Cărţi şi alte Resurse

Mai mulţi oameni au întrebat din ce cărţi şi pagini de web ar trebui să înveţe. Repet că “doar învăţatul din cărţi nu este deajuns” dar pot recomanda următoarele:
  • Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) este probabil cea mai bună introducere în Ştiinţa Calculatoarelor, şi cuprinde atât programare cât şi modul de înţelegere a Ştiinţei Calculatoarelor. Poţi vedea video-urile cu cursurile pentru această carte. Această carte este incitantă şi va “cerne”pe unii care probabil că au succes cu altă metodă.
  • Scheme: How to Design Programs (Felleisen et al.) este una dintre cele mai bune cărţi despre cum să proiectezi de adevărat programe într-un mod elegant şi funcţional.
  • Python: Python Programming: An Intro to CS (Zelle) este o bună introducere folosind Python.
  • Python: Câteva cursuri online sunt disponibile la Python.org.
  • Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) este considerat de unii ca succesorul zilelor noastre al Abelson & Sussman. Este un tur printre marile idei ale programării, acoperind o gamă mai largă decât Abelson & Sussman în timp ce probabil este mai uşor de citit şi urmărit. Foloseşte un limbaj, Oz, care nu este de largă circulaţie dar serveşte ca bază de învăţare pentru alte limbaje.


Note

T. Capey arată că pagina de la Amazon Complete Problem Solver  acum are “Învaţă singur Bengali în 21 de zile” precum şi “Învaţă singur Gramatică şi Stil” cărţi de la secţia “Clienţi care au cumpărat acest articol deasemenea au cumpărat şi aceste articole”. Bănuiesc că o mare parte din clienţii care au căutat acea cartea au pornit de la această pagină.
          

Peter Norvig (Copyright 2001)
gipoco.com is neither affiliated with the authors of this page nor responsible for its contents. This is a safe-cache copy of the original web site.