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:
- Identifică în mod sistematic pe cei mai buni
programatori cât mai devreme cu putinţă.
- Desemnează un mentor pentru carieră care să fie responsabil
cu dezvolarea candidaţilor şi care cu grijă să întocmescă o fişă
de carieră.
- 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ă. |
|
|