C++ - cosa imparare?

di il
7 risposte

C++ - cosa imparare?

Buonasera a tutti,

Voglio avvicinarmi al mondo della programmazione una volta per tutte, ho già studiato qualcosa di C++ ma penso che siano solo le basi. Il mio obiettivo finale sarebbe quello di padroneggiare il linguaggio ad un buon livello fino ad arrivare anche alla creazione di giochi od altro (ciò che mi interessa maggiormente è comunque imparare a spostarmi tra i vari linguaggi agevolmente e con un breve periodo di apprendimento della sintassi).
Il mio problema è quello di non sapere cosa studiare. Essendo un autodidatta non devo contare solo sulle informazioni sul web che non sono quasi mai approfondite come vorrei.

Dopo questa brevissima ( ) introduzione, vi pongo quindi la domanda. Cosa devo imparare per dire di saper programmare (in particolare in C++)? Banalizzando, il lavoro di un programmatore non è altro che quello di risolvere dei problemi tramite degli algoritmi utilizzando un linguaggio di programmazione come mezzo no?
Quindi ciò che devo imparare è:
- Come creare degli algoritmi efficienti.
- Come "tradurre" gli algoritmi in linguaggio di programmazione.

Ho scritto qualcosa di sbagliato? Quali sono i vari step da seguire per arrivare ad un buon livello in questi due campi?

Vi faccio un esempio della risposta che vorrei che mi venisse data:
Mettiamo caso che io voglia imparare a far di conto.
Per arrivare ad un livello di base devo conoscere somma, sottrazione, divisione e moltiplicazione e le loro proprietà
Per arrivare ad un livello medio devo imparare elevazioni al quadrato e radice quadrata
Per arrivare ad un livello medio-alto devo imparare logaritmi e studio di funzioni.
In questo modo io potrei cercare informazioni sulla "somma", impararne le basi, le proprietà ed infine esercitarmi su ciò senza il rischio di approfondire troppo qualcosa di inutile (che poi alla fine non è mai inutile) oppure non fare qualcosa di importante.

(se siete arrivati fino a qui... )

Spero di essermi spiegato bene ed aspetto vostre risposte. Grazie a tutti in anticipo

7 Risposte

  • Re: C++ - cosa imparare?

    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
  • Re: C++ - cosa imparare?

    Visto che ci sono ti do un'altro esperimento da fare:

    implementa un "parallel_for" cioe' un ciclo "for" che sfrutta i thread per essere eseguito in parallelo.

    Che cosa e' un 'thread'? Studia!

    Comunque trovi tutto sui testi indicati precedentemente (che sono da STUDIARE, non da leggere, ovviamente).

    In aggiunta, c'e' anche questo ottimo libro (da studiare, ovviamente, ):

    = Structured Parallel Programming: Patterns for Efficient Computation by Michael McCool (31 Jul 2012)
  • Re: C++ - cosa imparare?

    Inizio col dirti che non penso di studiare ciò all'università perché ho scelto di fare giurisprudenza (anche se comunque ho ancora la quinta superiore per pensarci). Per lavorare come programmatore, a quanto ne so, non serve il titolo per fortuna ma basta semplicemente saper programmare, ovviamente sarà più difficile e ci metterò più tempo ma quello non mi interessa. Tanto per fare un esempio so di gente laureata in lettere o con la licenza media che lavora in grandi software house; probabilmente questo è dovuto al fatto che ciò che si studia all'università (non il metodo ma tutto il resto) serve solo per una decina di anni perché poi, con la velocità d'innovazione della tecnologia, i linguaggi, gli standard e tutto il resto diventano ormai vecchi e superati.

    Ti ringrazio per la risposta, era proprio ciò che volevo sapere. Tento di riassumere per vedere se ho capito bene il tutto:

    Le conoscenze matematiche che dovrei avere sono l'algebra astratta, quella lineare, la teoria dei grafi (che tu mi consigli di fare per prima) e l'analisi matematica. La geometria, la fisica, la chimica come anche l'anatomia, e tutte le varie scienze applicate servono per i vari casi specifici ma non in generale (ad esempio se volessi fare un gioco di macchine dovrei studiarmi tutta la fisica che c'è dietro e via dicendo).

    Per quanto riguarda la parte più legata al computer vero e proprio devo:
    - conoscere la teoria sulle reti
    - creare algoritmi efficienti (per questo dovrei conoscere bene come lavora un pc dal punto di vista "meccanico" oltre che scegliere le giuste strutture ed avere le conoscenze matematiche di cui sopra)
    - conoscere i database (che comunque rientrano nel fare algoritmi efficienti).

    I primi tre libri che mi consigli servono ad:
    - introdurmi al linguaggio C++ presentandomi la sintassi
    - introdurmi (tutta?) la libreria standard
    - studiare la teoria dei grafi per iniziare a creare algoritmi con un minimo di logica (qualche titolo? Inglese o italiano è indifferente).

    Questo per avere una visione d'insieme del linguaggio e della programmazione.

    Successivamente:
    - il testo per la programmazione per template
    - un testo che mi spiega come scrivere al meglio il codice per essere poi riutilizzato
    - tre testi sulle librerie boost.

    Mi sono dimenticato qualcosa?

    Ti ringrazio nuovamente per la risposta, ora il problema è trovare oltre 100€ per i primi tre libri
  • Re: C++ - cosa imparare?

    Visto che se giovane, non ti rispondo im modo sarcastico, ma in modo serio.

    Come puoi immaginare, e come in tutti i lavori, ci sono diversi livelli di professionalita'.
    Faccio un banale esempio: il cuoco.
    C'e' il cuoco per la mensa dei poveri, quello della trattoria, quello di ristorante, lo chef.

    Se vuoi fare il cuoco per la mensa dei poveri, e' assolutamente una tua scelta.
    Ma per diventare chef, non ti basta saper fare gli spaghetti. Devi avere un corpo di conoscenze vasto e approfondito su: carne, pesce, verdure, vini, dolci, cucine nel modo, caratteristiche chimiche dei prodotti, e migliaia di altri argomenti,e passione per il mestiere.

    Lo stesso vale per i programmatori.

    Secondo me, se vuoi fare giurisprudenza, dedicati alla giurisprudenza, studia la materia, dedicaci tempo, passione. Ed alla fine potrai diventare un bravo giurista.
    Se fai giurisprudenza solo per riemprire il tempo prima di andare a fare il programmatore, allora il tuo approccio e' quello giusto. Ma e' anche evidente potrai essere solo l'equivalente del cuoco della mensa dei poveri. Anche se lavorerai in una grossa software house.

    Anche nelle grandi softwarehouse servono diversi livelli di competenza: serve la bassa manovalanza per sviluppare le parti noiose, servono i superspecialisti per affrontare e risolvere i problemi complessi (e piu' interessanti).
  • Re: C++ - cosa imparare?

    Da quanto ne so l'università non è molto professionalizzante (come anche le superiori, faccio ragioneria e non so compilare un documento che sia uno, l'unica cosa che ci insegnano ci serve per controllare se il gestionale fa bene il suo lavoro, nessuno fa più la partita doppia a mano).

    Ormai sul web si trova di tutto. Se cercassi l'elenco dei libri universitari e studiassi da solo tutto quello (senza fare esami) e in caso di dubbi chiedessi in forum come questi (ce ne sono una marea) la differenza tra studente autodidatta e studente universitario laureato non si vede più di tanto e comunque si assottiglia sempre di più con la pratica e magari collaborando in alcuni progetti.

    Se hai notato non sono uno di quelli che cerca "i programmi per fare giochi" o cose del genere, sono cosciente del fatto che c'è da studiare molto e non solo codice (tanto più che ho chiesto anche informazioni sulla teoria e sugli algoritmi).

    Secondo me l'unica differenza tra lo studio all'università e quello da autodidatta è il fatto di non avere un riferimento per chiedere pareri e consigli, cosa che comunque si può ormai trovare nei vari forum in giro per il web.
  • Re: C++ - cosa imparare?

    Per quanto ne sai tu, pero'!

    Se ne sei convinto, non saro' certo io a contraddirti.
  • Re: C++ - cosa imparare?

    Magari poi cambio idea, alla fine ho ancora un anno per pensare.

    C'è qualcosa di sbagliato nel riassunto che ho fatto qualche post più indietro? Potresti rispondere alle domande di quel post per favore? Grazie mille. Soprattutto mi interesserebbe il titolo di un testo sui grafi.
Devi accedere o registrarti per scrivere nel forum
7 risposte