Introduzione

Sono passati circa 8 anni da quando ho scritto l'articolo Imparare a programmare. Sebbene sono stato tentato diverse volte di modificare il contenuto di quell'articolo per farlo sembrare piu' professionale (lo scrissi quando avevo 15 anni), ho resistito la tentazione e l'ho lasciato immutato nel corso degli anni. Trovo che nonostante il linguaggio molto informale, il messaggio che volevo comunicare e' arrivato alle persone che l'hanno letto e riscrivendolo penso che avrei perso parte del messaggio. In quel periodo avevo imparato a programmare, ma ero distante dall'essere un buon programmatore. Diventare un programmatore e' un'esperienza di apprendimento che dura tutta la vita. Non importa quante scuole si frequentano, quando tempo si investe nella programmazione o quanti progetti si creano, qui nel nostro campo dell'informatica le tecnologie evolvono ad un passo straordinario. Per rimanere al passo, bisogna continuare a studiare. Il che e' non e' una maledizione, e' una grande opportunita' per migliorarsi.

Ho deciso cosi' di scrivere un nuovo articolo in continuazione del precedente. Nel corso di 8 anni ho continuato lo studio della programmazione da autodidatta, all'universita' e per lavoro. In questo articolo voglio condividere la mia esperienza e gli argomenti che, in mia opinione, hanno migliorato in maniera sostanziale alle mie abilita' di programmatore.

Quest'articolo contiene una lista di argomenti / libri che in mia opinione offrono una grande opportunita' per un programmatore di migliorarsi. Questo non vuol dire che argomenti o libri non citati nell'articolo non siano degni di considerazione; nella mia vita ho letto una minuscola frazione dei libri d'informatica disponbili e ho studiato una piccolissima parte degli argomenti sull'informatica. Sarebbe impossibile creare una lista esaustiva. Per questo motivo commenti e suggerimenti su come migliorare quest'articolo sono i benvenuti (scrivete nei commenti o postate nel forum).

Come ultima nota, l'ordine degli elementi nella lista non ha alcun significato di importanza (es. il primo elemento non e' piu' importante dell'ultimo). Ogni argomento e' ugualmente importante. Detto questo, spero che questa lista possa essere d'aiuto per quelle persone che hanno imparato le basi della programmazione e vogliono migliorarsi come programmatori.

La lista

Imparare o migliorare il proprio inglese

Nonostante l'italiano sia una lingua molto piu' elegante, per ragioni storiche e pratiche l'inglese rimane la lingua dominante nel campo dell'informatica. Leggere fluentemente in inglese ti permette di avere accesso a materiali che non sono stati ancora o che non verranno mai tradotti in italiano, di capire i sorgenti dei progetti di livello internazionale e di navigare i forum dei medesimi. Fare lo sforzo iniziale di leggere manuali in inglese e di avere un dizionario a disposizione per le parole sconosciute e' un investimento di tempo che paghera' i suoi frutti col tempo. Praticamente tutti gli acronimi nell'informatica sono inglesi, conoscere l'inglese e' un modo per ricordarsi meglio a cosa corrisponde ogni acronimo. Ne vale la pena.

Code Complete di Steve McConnell

Hai imparato programmazione da autodidatta, a scuola o al lavoro. C'e' sicuramente qualcosa nel libro di McConnell che hai dimenticato di studiare, oppure qualcosa che stai facendo in modo non ottimale o sconsigliato. Il suo libro e' una panoramica su diversi argomenti della programmazione con una particolare attenzione alle pratiche migliori da seguire durante lo sviluppo di software. Ogni capitolo termina con una lista di ulteriori libri e links da leggere per approfondire ogni argomento.

Unix

Non e' una questione di preferire un sistema operativo oppure un altro; se una persona e' seria con la programmazione, c'e' tanto da imparare dall'esperienza con un sistema Unix. Se non si e' mai usato un sistema Unix la prima cosa sarebbe quella di installarlo e comprarsi una guida sulle basi del sistema (un libro dalla parte dell'utente). Dopodiche' il libro Advanced Programming in the Unix Environment offre una bellissima panoramica dello standard POSIX, mantenendo sempre il lettore a conoscenza delle differenze tra diversi sistemi.

Team Geek di Fitzpatrick e Collins-Sussman

Tutti i grandi software di successo sono il risultato di una collaborazione tra piu' persone. Scrivere software, con l'eccezione di software personali e qualche medio/piccolo progetto, e' un lavoro di squadra. Capire come lavorare con altre persone e' probabilmente piu' importante che conoscere come programmare. Questo libro di piacevole lettura descrive come farlo.

Controllo versione

Imparare a conoscere almeno un sistema di controllo versione e' un'abilita' che non puo' mancare dall'arsenale di un programmatore. Non importa quale sistema studiare, ma almeno uno e' da conoscere. Tra i piu' popolari ci sono svn, git, mercurial. Compra un manuale cartaceo (o in formato elettronico) per il sistema che vuoi studiare. Le lacune che derivano dallo studiare su un tutorial online si faranno di solito sentire nel lungo periodo.

Seguire un corso di compilatori

Se sei all'universita' e offrono un corso sui compilatori, seguilo. Se non sei all'universita' oppure se non offrono un corso nella tua universita', iscriviti ad uno online (tieni d'occhio https://www.coursera.org/course/compilers). Imparare a conoscere i meccanismi interni di un compilatore ti permette di capire meglio gli errori che ti si presentano durante l'attivita' di programmazione. E' un modo per capire cosa c'e' dietro alla logica di certi costrutti in un linguaggio di programmazione.

The Art of Software Testing di Myers

Creare software di qualita' significa creare software che reagisce secondo le nostre aspettative e che non fallisce quando un caso inaspettato si presenta. Imparare a scrivere programmi in questa maniera richiede lo sviluppo di una mentalita' orientata ai test e questo libro e' una buona introduzione all'argomento. Nonostante la lettura possa essere un po' noiosa, i concetti presentati nel libro sono estremamente importanti per ogni buon programmatore.

Imparare il C/C++

Non c'e' niente di male ad usare un linguaggio di piu' alto livello come Java, .NET, Ruby o Python. Questi linguaggi sono spesso la scelta piu' sensata per risolvere un problema. Ci sono tuttavia delle importanti lezioni da imparare dallo studio del C/C++, in particolare in relazione allo studio dell'architettura di un computer. Queste nozioni sono nascoste nei linguaggi di piu' alto livello. Come bonus, C/C++ e' usato in tanti, tanti, tanti progetti.

Collaborare o creare un progetto open-source

La teoria e' utile, ma la pratica e' essenziale. Trova un progetto open-source che ti interessa (oppure creane uno) e dedica una parte del tuo tempo libero al progetto. Collaborare con altre persone ad un progetto e' un'esperienza di grande valore per migliorare le proprie abilita' di programmatore. Imparare dagli altri, accettare critiche e coordinare le attivita' tra piu' persone sono delle abilita' essenziali nella vita, non solo per noi programmatori.

Insegnare agli altri

Partecipare in un forum, scrivere un articolo, aprire un blog sull'informatica, organizzare un webinar, tutti sono modi per trasmettere la propria conoscenza agli altri. Quando si vuole imparare un argomento per bene, non c'e' miglior modo che cercare di insegnarlo a qualcun'altro. Per essere in grado di insegnare qualcosa bisogna forzatamente conoscere quello che si va ad insegnare. Il segreto per beneficiare dall'insegnamento non e' di scegliere un argomento in cui si e' gia' esperti, e' di scegliere un argomento di cui si sa poco e di usare l'oppportunita' di insegnare per approfondire l'argomento. Ero agli inizi del mio studio quando ho pianificato la mia lezione sul Ruby.

Sviluppare per una piattaforma mobile

Software e' dappertutto; nel tuo telefono, nel sistema di accensione della tua macchina, nel tuo orologio. Nel futuro questo trend non fara' che aumentare. Sviluppare per una piattaforma con meno risorse di un normale computer ti insegna a prestare attenzione ai limiti imposti dalla piattaforma. Che sia un cellulare Android o un Arduino, non fa differenza. L'importante e' conoscere e capire quali sono le limitazioni.

In Conclusione

Diventare un buon programmatore non e' un obiettivo che si raggiunge dopo un certo numero di anni di studio. E' uno che si raggiunge tramite una continuata dedizione verso la materia e che va mentenuto tramite la continuazione dello studio. Per questo universita' e scuole superiori sono poco credibili quando rilasciano un titolo di programmatore o ingegnere del software. Le scuole dopo un certo numero di anni finiscono. Dei buoni programmatori non finiscono mai di studiare.

Commenti e suggerimenti per migliorare la lista sono ben accetti.