Le basi:
- Matematica discreta -- è necessario padroneggiare tutti i concetti di insiemi, logica booleana, combinatoria, teoria dei numeri, probabilità, algebra, ecc. per avere una forte base per l'informatica. La matematica continua (calcolo, ecc.) non è molto importante, credo 🙂
Il prossimo che mi viene in mente:
- Il concetto di stato. Questo rende possibile la comprensione di stati, macchine a stati, transizioni di stato, l'intero concetto di design stateful vs. stateless, caching, coerenza della cache, persistenza, soft states, ecc. Molti dei miei amici non programmatori non capiscono questo concetto.
- Il concetto di istruzione e la sequenzialità dell'elaborazione delle istruzioni. Alcuni programmatori junior che ho conosciuto all'inizio non capivano che le istruzioni vengono eseguite in modo sequenziale. (I processori non devono essere realmente sequenziali, ma è ciò che la stragrande maggioranza dei processori sta supportando in questo momento).
- Complessità di un pezzo di programma (sia runtime che complessità spaziale). Necessità di capire profondamente cosa significa O(1), O(N), O(N log N), ecc. prima di capire perché certi algoritmi / strutture dati sono fondamentalmente (non solo artificialmente / empiricamente) più performanti degli altri.
- Concetti sui dati. Input e output e forme intermedie, mutabile vs. immutabile, serializzato vs. forma oggetto, programmazione orientata agli oggetti, canonico vs. derivato, rappresentazioni (normalizzate vs. denormalizzate), eager vs. lazy loading, concetti di database come ACID e BASE, codifica e decodifica, crittografia e decrittografia, compressione e decompressione, sicurezza delle informazioni.
- Concetti sulla memoria: spazio di memoria virtuale, stack, heap, puntatori, referenti vs. riferimenti, allocazione e deallocazione, garbage collection, working set, paginazione su disco, etc.
- Concetti sui processi: l'istanza di codice in esecuzione. Concetti: compilazione, thread, processo, librerie caricate staticamente vs. librerie caricate dinamicamente, errori di runtime vs. errori di compilazione, come il sistema operativo programma i processi e i thread, etc.
I concetti di livello superiore dopo questi probabilmente appartengono al dominio dell'ingegneria del software, dei sistemi, o ad alcune specializzazioni dell'informatica teorica.