Per dare una panoramica - una laurea in informatica insegna la "scienza" di un computer. Per studiare la scienza di qualcosa, si studiano i principi di funzionamento.
Se qualcuno ti chiedesse come funziona una bicicletta, probabilmente andresti a spiegare come il pedale trasferisce energia alle ruote attraverso la catena. Allo stesso modo, Computer Science è fondamentalmente una risposta a "Come funziona il computer?".
A quanto pare, non tutte le lauree in informatica sono uguali. Ecco quello che ho studiato io. È un po' datato (mi sono laureato nel 2002, quasi due decenni fa)
Di solito si inizia con alcune classi di codifica di base. Personalmente ho avuto 3 classi che insegnano la programmazione. Due su C++ e una su Java. Le due classi di C++ hanno richiesto due semestri, e quella di Java è solo un'estate. Questo è tutto ciò che sono le classi di "programmazione". Per come la vedo io, il punto è avere un linguaggio per parlare dei principi. Non si può essere un programmatore esperto solo con queste classi.
A differenza di ciò che si pensa di solito - i corsi di informatica non sono tanto per insegnare a scrivere codice. Proprio come se avete una classe che vi insegna come funziona una bicicletta, probabilmente non passerà molto tempo ad insegnarvi come andare in bicicletta. Questo è probabilmente il più grande fraintendimento di sempre sull'educazione informatica.
Un computer è un trilione di volte più complicato di una bicicletta. L'aggettivo "un trilione di volte" non è solo molti, è letteralmente un trilione di volte. Se pensate ad una bicicletta che ha poche parti, il pedale, la catena, le ruote, e così via. Un microprocessore da solo ha 1.400.000.000 di transistor. Il modo in cui lo capiamo è il principio di astrazione. In breve, non aprire la scatola. Basta accenderla e godersi la magia.
Questo è il modo in cui la maggior parte delle persone guarda al computer. Studiare l'informatica, invece, fa esattamente il contrario. Apre tutte le scatole.
Nel mio programma, in particolare, abbiamo iniziato con la progettazione di circuiti. In fin dei conti, un computer è fatto di circuiti. Solo se capiamo i circuiti capiamo l'unità di base di un computer. La progettazione di circuiti è un grande argomento, personalmente sono passato attraverso progetti analogici di base (resistenze, diodi, transistor polari bi-giunzione), progetti digitali di base (porte logiche, latches, flip flops), progettazione di processori di base (unità aritmetiche, data-path, pipelining), questa catena di lezioni termina quando ho progettato un layout di silicio di un semplice componente (nel mio caso un interruttore a croce) e una discussione sulle architetture moderne (come funziona l'hyper-threading, che era la tecnologia più in voga ai miei tempi)
Poco sopra l'hardware, abbiamo iniziato con il software di sistema. Impariamo come funziona un sistema operativo. Come può il computer eseguire più programmi contemporaneamente? Come può il computer condividere le risorse in modo equo ed efficiente tra diversi processi? Come programmare un micro-controller? (un micro-controller è un microprocessore molto ridotto che è tipicamente usato in dispositivi diversi dai computer). La mia scuola non aveva un corso di compilatore, se l'avessi avuto, avrei imparato come un programma di alto livello viene compilato ed eseguito su un computer.
Più avanti, arrivo a studiare i componenti software molto comunemente usati. Iniziando dalle strutture dati di base (come una lista, un albero o un grafico), capendo come implementare un database usando le strutture dati. Come assicurarsi che l'accesso ai dati sia veloce, come rendere i dati disponibili quando gli accessi sono concomitanti, come assicurarsi che l'integrità dei dati rimanga intatta quando potrebbero verificarsi dei guasti. Alla fine, questo porta a studiare gli algoritmi (cioè metodi ben prescritti) per risolvere problemi computazionali difficili.
Lo studio degli algoritmi richiede un certo livello di maturità matematica. A tal fine, studiavamo algebra lineare, calcolo multivariabile, probabilità e statistica, e alcune equazioni differenziali di base.
Più in alto, ci veniva insegnato il funzionamento dei sistemi distribuiti. (Distribuito significa fondamentalmente più di 1 computer). Per fare ciò, abbiamo iniziato con le basi del networking. Come si modellano i segnali, come trasformarli in modo che siano adatti ad essere trasmessi attraverso i media> Come rilevare e correggere gli errori? Come instradare il messaggio a destinazione in una rete enorme (come Internet)? Come assicurarsi che i messaggi siano protetti da intercettazioni, manomissioni o semplicemente cadute?
Abbiamo avuto una classe che insegna l'ingegneria del software. Questa classe è molto pratica e ci si aspetta che implementiamo un sistema moderatamente grande in un semestre. Questo ci dà una certa esperienza limitata.
Il resto sono elettivi. Possiamo scegliere di specializzarci in un sacco di argomenti diversi. Avevamo lezioni di IA (che ho preso), computer grafica (che non ho fatto), programmazione funzionale, ingegneria wireless, e molte altre cose.
Con tutti questi, un laureato in informatica può dire con orgoglio che abbiamo capito un computer da cima a fondo. Da grande come un sistema distribuito (come Google) a piccolo come un transistor (che è solo pochi nanometri, o 0.000000005m) in dimensioni.
Il tema generale dell'intera laurea è spiegare come funziona il computer. Non si tratta di insegnare ad essere un ingegnere del software. Questo è l'equivoco chiave. Proprio come andare a un corso che vi insegna come funziona una bicicletta, probabilmente non vi farà andare meglio in bicicletta.