Concordo con l'approccio suggerito da John, anche se secondo la mia visione il modello è più ciclico che lineare. Tento di stendere la descrizione di un "percorso di conoscenza", che sia abbastanza valido da essere preso come riferimento anche per ogni richiesta futura del tipo: "Che libro devo scegliere per imparare C++?". Tento.
Il C++ è un linguaggio molto vasto: impararlo
tutto (ovverosia: imparare tutti gli elementi del linguaggio, da quelli di base a quelli più avanzati, e comprenderne le implicazioni profonde) è già un'impresa che richiede degli
anni. Fortunatamente
per programmare bene in C++ non è necessario conoscerne ogni funzionalità, e a volte è molto meglio conoscere il linguaggio parzialmente, ma avere studiato le tecniche avanzate limitatamente a quella porzione di linguaggio, piuttosto che avere un'infarinatura di tutto il linguaggio completamente scorrelata dalle problematiche tecniche e pratiche. E' qui che entra in gioco un approccio ciclico all'apprendimento. L'ideale è:
1) Imparare un sottoinsieme di funzionalità del linguaggio
2) Fare pratica relativamente a ciò che si è imparato
3) Imparare le tecniche di programmazione avanzate relative a quell'insieme
4) Goto 1.
Suddividere il linguaggio negli "insiemi" giusti è uno dei compiti più difficili per un insegnante o per un divulgatore, tanto che solitamente gli autori falliscono miseramente, e nessuno in questo campo (me compreso, ovviamente) può dire di avere idee definitive a riguardo.
Molti libri, ad esempio, si affannano a spiegare prima il "sottoinsieme C" del C++, per poi passare al resto. Con l'andare del tempo sono sempre più convinto (assieme a tanti altri personaggi più in gamba di me -
Stroustrup compreso, il quale esprime ancor meglio la sua posizione
qui) che sia
un approccio dannoso, che non fa altro che confondere le idee al povero studente e imbottirlo di nozioni e tecniche inutili, che dovranno essere abbandonate e rispiegate da zero in un secondo tempo.
Il lavoro migliore che abbia mai visto in questo senso, invece, è senz'altro quello di Koenig (stavolta John non c'entra, parlo del leggendario Andrew

), con il suo
Accelerated C++: un libro coraggioso ed efficace, che non si fa scrupoli a partire subito con stream, contenitori STL, e funzionalità avanzate, e riesce comunque a risultare scorrevole, pratico, e semplice da leggere per il neofita. Tutto ciò lo rende ai miei occhi il testo di base dall'approccio metodologico più rivoluzionario, fra tutti quelli in circolazione.
Se si vuole cercare
una guida d'ingresso più convenzionale, si possono considerare i testi di Eckel della serie
Thinking in C++ (testi ben fatti e gratuiti - combinazione più unica che rara per la manualistica tecnica), o buon il lavoro introduttivo di Stephen Prata
C++ primer plus.
Dopo la guida di ingresso è necessario procurarsi un buon
manuale di riferimento: un testo che è solitamente troppo ostico per essere affrontato da un neofita, ma che gli esperti tengono per anni sulla scrivania, consultandolo ogni volta che gli serva sviscerare gli aspetti del linguaggio nel dettaglio.
La Bibbia, in questo campo è
lo Stroustrup [genuflettersi, prego], terza edizione (possibilmente in inglese: la versione italiana è tradotta molto bene, ma è indietro di troppi errata-corrige), uno di quei fortunati testi scritti dallo stesso autore del linguaggio di cui parlano. Oltre a trattare i dettagli del C++, Stroustrup si diverte a seminare interessanti elementi di riflessione - spesso buttandolì lì, sotto forma di spunti - che puntualmente si rivelano essere di grande ispirazione quando si è nello spirito di coglierli.
In alternativa, si può considerare un manuale a metà strada fra l'ingresso e il riferimento: l'eccellente lavoro di Stan Lippmann
C++ Primer (assolutamente quarta edizione), ottima trattazione del linguaggio, tecniche e
best practices.
E' fondamentale anche disporre di una buona
guida introduttiva alla programmazione per templates (come l'ottimo
C++ Templates: The Complete Guide, di Vandevoorde), e di una solida
guida di riferimento per la libreria standard (come
quella di Josuttis).
Tuttavia lo studio del linguaggio non si ferma qui. Esistono maree di idioms, stili, problemi, e affini che non vengono spiegati dai Testi Sacri Di Riferimento, e richiedono invece un grande approfondimento se non si vuole perdere tempo inutilmente.
I tre "Must Have" in questo campo sono i testi del mitologico Scott Meyers, cioè l'intera
collana degli Effective:
Effective C++,
More Effective C++ e
Effective STL. Chi non ha la nausea a studiare incollato allo schermo, può comprare la
versione onnicomprensiva su CD.
Solo dopo (perché danno per scontato la lettura dei testi precedenti) si possono affrontare
i testi "eccezionali" di Herb Sutter Exceptional C++,
More Exceptional C++, e soprattutto
Exceptional C++ Style.
L'insieme di questi testi fornisce già un background del linguaggio "coi fiocchi". Tuttavia esistono libri che trattano anche di argomenti più avanzati, e che sono necessari per compiti particolari, ad esempio
l'espansione della (carente) libreria standard del C++.
Un testo che introduca alla
libreria boost è fondamentale - vedi, ad esempio
Beyond C++ Standard Library, An Introduction To Boost, di Karlsson.
Il testo di Karlsson dev'essere considerato, appunto, un'introduzione, che illustra le magie di Boost senza svelare i trucchi che le permettono dietro le quinte. La parola magica, quasi sempre, è
metaprogrammazione. In questo campo, la lettura di
C++ Template Metaprogramming del mai-abbastanza-riverito Abrahams è impegnativa, ma molto gratificante. E un altro passo avanti è lo sconvolgente
Modern C++ Design di Andrei Alexandrescu, da leggersi il congiunzione con l'esplorazione della
libreria Loki, nella speranza che un giorno i compilatori riescano a svolgere il loro lavoro tanto decentemente da farci apprezzare il
policy based design senza rischiare suicidi di massa.
Parallelamente, sarà probabilmente necessario
scegliere uno o più framework di riferimento che permettano la programmazione visuale, e altre amenità del genere. Qui la scelta è talmente ramificata che è impossibile fornire un insieme di riferimenti generali, e valgono le considerazioni fatte in
altri post.
Se pensate che abbia esagerato nei testi di riferimento, tenete presente che
ce ne sono tanti altri che non ho citato e sono di importanza fondamentale in campi più specifici, per capire l'approccio di fondo del C++, o per stupire i colleghi alle conferenze. Se qualcuno è interessato a questo genere di bibliografia "posso integrare".
