Perché hanno tutti tanta fretta?
Entrate in qualunque libreria, e vedrete come Imparare da soli Java in 7 giorni, insieme a innumerevoli variazioni che offrono di insegnare Visual Basic, Windows, Internet eccetera in pochi giorni o poche ore. Ho fatto la seguente ricerca avanzata su Amazon.com:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
ottenendo 248 risultati. I primi 78 erano libri di informatica (il settantanovesimo era Imparate il Bengali in 30 giorni). Ho sostituito "giorni" con "ore"
ottenendo risultati sorprendentemente simili: altri 253 libri, con 77 libri d'informatica seguiti da Imparate da soli grammatica e stile in 24 ore in settantottesima posizione. Dei primi 200, il 96% erano libri d'informatica.
La conclusione è che le persone hanno una gran fretta di imparare i computer, oppure che i computer sono in qualche modo incredibilmente più semplici da imparare di qualunque altra cosa. Non ci sono libri per imparare in pochi giorni Beethoven, o la fisica quantistica, e nemmeno la toelettatura di un cane.
Proviamo ad analizzare cosa potrebbe significare un titolo come Imparate il Pascal in tre giorni:
- Imparare: In 3 giorni non avrete il tempo di scrivere vari programmi significativi, né di imparare dai vostri successi e fallimenti. Non avrete tempo di lavorare con un programmatore esperto e di capire cosa significa vivere in quell'ambiente. In breve, non avrete il tempo di imparare granché. Per cui si sta parlando solo di una familiarità superficiale, non di una comprensione profonda. Come ha detto Alexander Pope, un apprendimento limitato è pericoloso.
- Pascal: In tre giorni potreste essere in grado di apprendere la sintassi del Pascal (se già conoscete un linguaggio simile), ma non potrete apprendere molto sull'uso della sintassi. In breve, se per esempio foste un programmatore Basic, potreste imparare a scrivere programmi nello stile del Basic usando la sintassi del Pascal, ma non potreste sapere per cosa il Pascal è effettivamente buono (o cattivo). Allora qual è il punto? Alan Perlis disse una volta: "Non vale la pena di conoscere un linguaggio che non influisce sul modo in cui pensate alla programmazione". Una possibilità è che dobbiate imparare un po' di Pascal (o più probabilmente qualcosa come Visual Basic o JavaScript) perché avete bisogno di interfacciarvi con uno strumento già esistente per portare a termine un compito specifico. In questo caso però non state imparando a programmare: state imparando a portare a termine quel compito.
- In tre giorni: Sfortunamente non bastano, come mostra la sezione seguente.
Imparate a programmare in dieci anni
Alcuni ricercatori (Hayes, Bloom)
hanno mostrato come siano necessari circa dieci anni per padroneggiare un vasto numero di attività, fra cui gli scacchi, la composizione musicale, la pittura, il pianoforte, il nuoto, il tennis, la ricerca in neuropsicologia e in antropologia. Sembra proprio che non esistano scorciatoie: perfino Mozart, che era un fenomeno musicale a 4 anni, ebbe bisogno di altri 13 anni prima di produrre musica di livello mondiale. In un genere differente, i Beatles sembrarono esplodere sulla scena con una serie di numeri uno in classifica e un'apparizione alla trasmissione di Ed Sullivan nel 1964, ma suonavano in piccoli club di Liverpool e Amburgo dal 1957, e da quando iniziarono ad avere successo di massa in poi, il loro primo successo decisivo Sgt. Peppers, apparve nel 1967. Samuel Johnson riteneva ci volessero più di dieci anni: "L'eccellenza in qualunque settore può essere raggiunta con il lavoro di una vita, non la si puņ acquistare a prezzo ridotto". E Chaucer lamentava che "la vita è così breve, l'abilità così lunga da apprendere".
Questa è la mia ricetta per il successo nella programmazione:
- Interessatevi alla programmazione, e fatelo perché è divertente. Assicuratevi che sia abbastanza divertente da volerci spendere dieci anni.
- Parlate con altri programmatori, e leggete altri programmi. È più importante di qualsiasi libro o corso di formazione.
- Programmate. Il modo migliore di imparare è imparare facendo. Per metterla in modo più tecnico, "in un dato dominio, il massimo livello di prestazioni di una persona non viene raggiunto automaticamente come funzione dell'estendersi dell'esperienza; però anche individui molto esperti possono aumentare il livello delle prestazioni come risultato di deliberati tentativi di miglioramento" (p. 366). E "l'apprendimento più efficace richiede un compito ben definito, con un livello di difficoltà su misura del singolo, feedback informativo e possibilità di ripetizione e correzione degli errori" (p. 20-21). Il volume Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life è da questo punto di vista un riferimento interessante.
- Se lo credete, impiegate quattro anni in una scuola, o anche più in un'università. Questo vi darà accesso a lavori che richiedono credenziali, e vi darà una comprensione più profonda del settore. Se non vi piace la scuola, potete (con un po' di dedizione) acquisire un'esperienza simile sul campo. In ogni caso, l'apprendimento sui libri non sarà sufficiente da solo. "L'educazione in informatica, da sola, non renderà nessuno un esperto programmatore più di quanto lo studiare pennelli e pigmenti possa rendere qualcuno un esperto pittore", dice Eric Raymond, autore del The New Hacker's Dictionary. Uno dei migliori programmatori che io abbia mai assunto aveva solo un diploma di scuola secondaria: ha prodotto una gran quantità di grande software, ha i suoi newsgroup personali, e grazie al mercato azionario è senza dubbio molto più ricco di quanto io potrò mai essere.
- Lavorate a progetti con altri programmatori. Siate il miglior programmatore in alcuni progetti, il peggiore in altri. Quando sarete il migliore, potrete collaudare la vostra capacità di condurre un progetto e di ispirare altri con la vostra visione. Quando sarete il peggiore, imparerete cosa fanno i maestri, e cosa a loro non piace fare (perché lo faranno fare a voi al posto loro).
- Lavorate a progetti dopo altri programmatori. Immergetevi nel comprendere un programma scritto da qualcun altro. Scoprite cosa serve per imparararlo e modificarlo quando i suoi programmatori non sono vicini. Pensate a come voi concepite i vostri programmi, per rendere più facile la correzione a quelli che dovranno farne la manutenzione dopo di voi.
- Imparate almeno una mezza dozzina di linguaggi di programmazione. Includeteci un linguaggio che supporti le astrazioni di classe (come Java o C++), uno che supporti l'astrazione funzionale (come Lisp o ML), uno che supporti l'astrazione sintattica (come il Lisp), uno che supporti le specificazioni dichiarative (come Prolog o i modelli C++) uno che supporti le coroutines (come Icon or Scheme), e uno che supporti il parallelismo (come Sisal).
- Ricordate che nell'informatica [computer science] c'è un computer. Imparate quanto tempo serve al vostro computer per eseguire un'istruzione, recuperare una parola dalla memoria (con e senza cache), leggere dal disco parole consecutive, e cercare una nuova posizione sul disco. (Risposte qui.)
- Immergetevi in un tentativo di standardizzazione dei linguaggi. Potrebbe essere il comitato ANSI C++, oppure decidere se il vostro stile locale di programmazione avrà indentazioni di 2 o 4 spazi. In ogni modo, capirete cosa apprezzano gli altri in un linguaggio, quanto profondamente lo provano, e forse anche un po' perché lo provino in questo modo.
- Abbiate il buon senso di abbandonare la standardizzazione dei linguaggi prima che potete.
Con tutto ciò in mente, ci si può chiedere quanto lontano si possa arrivare col solo apprendimento sui libri. Prima che nascesse il mio primo figlio, lessi tutti i libri Come fare a, e continuavo a sentirmi un novellino inesperto. Trenta mesi dopo, quando stava arrivando il secondo figlio, tornai ai libri per un ripasso? No. Mi basai piuttosto sulla mia esperienza personale, che si rivelò per me molto più utile e rassicurante delle migliaia di pagine scritte da esperti.
Fred Brooks, nel suo saggio No Silver Bullets ha identificato un piano in tre fasi per trovare grandi progettisti di software:
- Identificare il più presto possibile, sistematicamente, i migliori progettisti.
- Affidare a un tutore la responsabilità dello sviluppo del prospetto e la tenuta di un registro sulla formazione.
- Fornire ai progettisti in crescita l'opportunita di interagire e stimolarsi l'un l'altro
Questo dà per scontato che alcuni abbiano già le qualità necessarie a essere un grande progettista; il compito è di plasmarli correttamente nel frattempo. Alan
Perlis lo esprime in modo più sintetico: "A chiunque si può insegnare a scolpire. A Michelangelo si sarebbe dovuto insegnare come non farlo. Lo stesso avviene con i grandi programmatori".
Quindi proseguite e comprate quel libro sul Java, probabilmente vi servirà a qualcosa. Ma non cambierà la vostra vita, né la vostra vera esperienza complessiva in quanto programmatore, in 24 ore, giorni, e nemmeno mesi.
Riferimenti
Bloom, Benjamin (ed.) Developing Talent in Young People [Sviluppare il talento nei giovani], Ballantine, 1985.
Brooks, Fred, No Silver Bullets [Nessun proiettile d'argento], IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R.,Complete Problem Solver [Il completo risolutore di problemi] Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life [La cognizione in pratica: mente, matematica e cultura nella vita quotidiana], Cambridge University Press, 1988.
Risposte
Cronometraggio approssimativo per alcune operazioni con un tipico PC da 1GHz (estate 2001):
esecuzione di una singola istruzione
| 1 nsec = (1/1.000.000.000) sec
|
recupero di una parola dalla cache L1
| 2 nsec
|
recupero di una parola dalla memoria principale
| 10 nsec
|
recupero di una parola da una posizione del disco contigua
| 200 nsec
|
recupero di una parola da una nuova posizione del disco (seek)
| 8.000.000 nsec = 8 msec
|
Appendice: Scelta del linguaggio
Parecchi hanno chiesto quale linguaggio dovrebbero scegliere per primo. Non c'è un'unica risposta, ma considerate questi punti:
- Usate i vostri amici. Quando mi chiedono "che sistema operativo dovrei usare: Windows, Unix o Mac?", di solito rispondo: "Usa quello che usano i tuoi amici". Il vantaggio che otterrete imparando dai vostri amici supererà qualunque differenza intrinseca fra i SO o fra i linguaggi di programmazione. Considerate anche i vostri amici futuri: la comunità di programmatori di cui farete parte se continuerete. Il linguaggio che avete scelto ha una grande comunità in crescita o una piccola che sta morendo? Ci sono libri siti e forum da cui avere risposte? Vi piace la gente che c'è in quei forum?
- Siate semplici. Linguaggi di programmazione come C++ e Java sono progettati per lo sviluppo professionale compiuto da vasti team di programmatori esperti preoccupati dell'efficienza esecutiva del loro codice. Il risultato è che ci sono parti complesse progettate a questo scopo. Il vostro scopo è imparare a programmare. Non vi serve quella complessità. Avete bisogno di un linguaggio progettato perché un singolo programmatore agli inizi impari e ricordi con facilità.
- Giocate. In che modo preferireste imparare a suonare il piano: il modo normale, interattivo, in cui ascoltate ciascuna nota mentre premete un tasto, o il modo 'batch', in cui ascoltate le note solo dopo aver completato una canzone? È chiaro che il modo interattivo rende più facile l'apprendimento del piano, e lo stesso è per la programmazione. Insistete su un linguaggio con un modo interattivo e usatelo.
Con questi presupposti, come primo linguaggio di programmazione raccomanderei Python o Scheme. Ma la vostra situazione può essere diversa. Se la vostra età ha una sola cifra, potreste preferire Alice o Squeak (che potrebbe apprezzare anche chi ha più anni). La cosa importante è che scegliate e cominciate.
Appendice: Libri e altre risorse
Parecchie persone hanno chiesto libri e pagine web da cui imparare. Ripeto, l'apprendimento libresco da solo non sarà sufficiente, ma posso raccomandare quanto segue:
Note
T. Capey fa notare che la pagina Complete Problem Solver su Amazon ha ora i libri Teach Yourself Bengali in 21 days e Teach Yourself Grammar and Style nella sezione "i clienti che hanno acquistato questo libro hanno comprato anche questi". Sospetto che una gran parte delle persone che hanno guardato quel libro provengano da questa pagina.
Traduzioni
Grazie ai seguenti traduttori, la pagina di Peter Norvig è disponibile in:
Cinese (Xiaogang Guo)
Cinese tradizionale (Jason Chen)
Coreano (John Hwang)
Francese (P.E. Allary)
Giapponese (yomoyomo)
Norvegese (Andre Reffhaug)
Polacco (Kuba Nowak)
Rumeno (Ştefan Lazăr)
Spagnolo (Carlos Rueda)
Tedesco (Stefan Ram)
Turco (Çağıl Uluşahin)
Peter Norvig (Copyright 2001)