Risposta breve:
per arrivare ad un livello base (ma moolto base) di conoscenza, senza sapere nulla, ti serve un/due libri e 6 mesi di tempo.
per arrivare ad un livello medio basso di conoscenza ti serve 2 o 3 anni ed una decina di libri.
per arrivare ad un livello medio alto di conoscenza, ti serve 4 o 5 anni ed un centinaio di libri di testo.
per arrivare ad un livello alto di conoscenza di servono una decina d'anni ed 200/400 libri di testo.
Risposta lunga:
il C++ e' solo uno dei possibili linguaggi di programmazione procedurali/ad oggetti.
Ma non e' l'unico paradigma di programmazione. Ne esistono altri: funzionale, logico, a regole, a vincoli, concorrente/parallela, distribuita, ecc.
Molti di questi paradigmi sono presenti in quasi tutti i linguaggi di programmazione moderni: basti pensare che la programmazione funzionale e' stata introdotta in C++11.
Ma il linguaggio di programmazione e' solo lo strumento per rappresentare un algoritmo su un computer. O, se vuoi, il linguaggio con cui insegnare ad un computer a risolvere il problema.
La sfida e' la progettazione degli algoritmi/inventare un modo efficiente per rappresentare il problema e farlo risolvere al computer.
Questo dipende, ovviamente, dal tipo di problema. In ogni caso, serve qualche tipo di conoscenza scientifica:
- algebra astratta
- teoria dei grafi
- analisi matematica
- algebra lineare
- geometria
- fisica, chimica, ecc..
Per esempio: per un gioco di ruolo ti serve: grafica 3d, basata sulla geometria, per i personaggi e le scene, teoria della luce per la rappresentazione delle ombre e delle ambientazioni, teoria dei grafi per la parte relativa alla storia ed al movimento dei personaggi, ecc..
Altro problema: generalmente, per risolvere un problema esistono diversi algoritmi. Ma non sono tutti ugualmente efficienti. A seconda delle caratteristiche del problema alcuni algoitmi possono essere piu' efficienti di altri. Naturalmente non si parla di essere 2 o 4 volte piu' efficiente, ma di complessita' computazionale.
Altro argomento: come ben saparai, oggi tutti i computer sono multicore. La programmazione concorrente e' un tipo di programmazione complicata: la possibilita' di generare situazioni di "abbracci mortali" (deadlock) e' piu' semplice di quanto credi. Saper risolvere o affrontare situazioni del genere non e' una cosa dia 10 minuti. Ci possono voler anche giorni o settimane (mi e' capitato!).
Altro argomento: archivi dati, detti database. La rappresentazione dei dati in modo efficiente non e' assolutamente un problema banale. Una rappresentazione sbagliata dei dati ha diverse conseguenze: l'impossibilite' di fare query efficienti, l'impossibilita' di aggiornare i dati mantenendo la consistenza...
I database non sono solo MySQL, Oracle o SQLServer, ma anche le strutture dati interne ad un programma. A volte potresti avere la necessita' di implementare un database a mano!
Altro argomento: immagino vorrai poter comunicare con l'esterno. Per fare questo devi conoscere come funziona il TCP/IP ed i suoi protocolli correlati. Certo, ci sono librerie in gradi di nascondere buona parte dei dettagli. Ma questo non evita di dover sapere come affrontare le situazioni strane come: non c'e' la rete, il server non e' piu' disponibile, i dati arrivano corrotti, ...
Ma non basta: per progettare un programma, non basta sapere implementare un algoritmo. A meno che il programma non sia particolarmente semplice, e' importante:
- saper scomporlo in moduli indipendenti, possibilmente mantenendo un'organizzazione ad albero o a GRAFO DIRETTO ACICLICLO (ecco i concetti di teoria dei grafi). Se le dipendenze formano un ciclo, puo' risultare estremamente complicata la manutenzione
- decidere il tipo di interazione che ogni modulo deve avere con gli altri: la modularizzazione permette di sostituire, in caso d inecessita' un modulo con uno di nuova progettazione
- saper testare ogni modulo: la fase di testing e' estremamente importante. Per uqnato un programmatore sia bravo, c'e' sempre la possibilita' che si dimentichi qualche cosa. Sopprattutto quando fa parte di un team e deve comunicare con moduli fatti da altri o estendere un modulo fatto da altri
- saper progettare moduli mantenibili e' un'arte non banale: la scelta dei nomi delle funzioni o delle classi, utilizzare la corretta documentazione, sono pratiche fondamentali per poter correggere i malfunzionamenti che si possono presentare
.......
E questo solo per iniziare
Mi sono dimenticato qualcosa? Eccome no, a decinaia (per non dire a centinaia, ma e' solo una miserevole sottostima).
Tieni anche presente la seguente considerazione: anche se esistono librerie gia' pronte per risolvere moti dei problemi che potresti affrontare durante lo sviluppo di un programma, non basta conoscere le API della libreria per saperla usare, serve sapere anche i concetti su cui la libreria e' stata realizzata per sapere come adattare il tuo problema alla libreria.
.......
Insomma, non sperare di poter risolvere tutto in 6 mesi, un anno di studio. Piu' studi, piu' ti accorgerai di quanti sono i dettagli da conoscere.
Per iniziare, ti consiglio questo esperimento: ti prendi almeno i seguenti libri:
= The C++ Programming Language by Bjarne Stroustrup (23 May 2013)
= The C++ Standard Library: A Tutorial and Reference by Nicolai M. Josuttis (30 Mar 2012)
= un testo su teoria dei grafi
e cerchi di implementare una libreria stile STL per strutture dati a grafo. Naturalmente la libreria deve essere flessibile, riutilizzabile, mantenibile.
In aggiunta ai libri sopra indicati, ti consiglio (sono tutti 'must to have", non banali lbretti tanto per leggere):
= C++ Templates: The Complete Guide by David Vandevoorde and Nicolai M. Josuttis (12 Nov 2002)
= Design patterns : elements of reusable object-oriented software by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides (31 Oct 1994)
= Introduction to the Boost C++ Libraries; Volume I - Foundations by Robert Demming and Daniel J. Duffy (1 Nov 2010)
= Introduction to the Boost C++ Libraries; Volume II - Advanced Libraries by Robert Demming and Daniel J. Duffy (3 Feb 2012)
= Boost.Asio C++ Network Programming by John Torjo (22 Feb 2013)
Nota: "boost" e' una liberria aggiuntiva alle STL che aggiunge un sacco di funzionalita' alla libreria standard del liguaggio.
A gia': avevo detto un libro e 6 mesi? Dovevo dire 8 libri e 6 mesi .
E questo solo per iniziare
Il consiglio piu' banale che ti posso dare e': vai all'universita'!
Il secondo consiglio e': studia, studia, e ancora studia.
Mi sono dimenticato qualcosa? A si, devi studiare!!!
Ma non disperare, se ci sono riuscito io che non sono un genio, ci puo' riuscire chiunque. Serve solo buona volonta'
Auguri