Les bases:
- Maths discrets -- vous devez maîtriser tous les concepts d'ensembles, de logique booléenne, de combinatoire, de théorie des nombres, de probabilité, d'algèbre, etc. pour avoir une base solide en informatique. Les maths continues (calcul, etc.) ne sont pas très importantes je pense 🙂
Les suivantes auxquelles je peux penser:
- Le concept d'états. Cela rend possible la compréhension des états, de la machine d'état, des transitions d'état, de tous les concepts de conception stateful vs stateless, du cache, de la cohérence du cache, de la persistance, des soft states, etc. Beaucoup de mes amis non-programmeurs ne'comprennent pas ce concept.
- Le concept d'instruction et la séquentialité du traitement des instructions. Certains programmeurs juniors que j'ai connus au départ ne comprenaient pas que les instructions sont exécutées séquentiellement. (Les processeurs n'ont pas vraiment besoin d'être séquentiels, mais c'est ce que la grande majorité des processeurs supportent principalement à l'heure actuelle).
- Complexité d'un morceau de programme (complexité d'exécution et complexité spatiale). Nécessité de comprendre profondément ce que signifient O(1), O(N), O(N log N), etc. avant de comprendre pourquoi certains algorithmes / structures de données sont fondamentalement (et pas seulement artificiellement / empiriquement) plus performants que les autres.
- Concepts autour des données. Entrée et sortie et formes intermédiaires, mutable vs immuable, sérialisé vs forme objet, programmation orientée objet, canonique vs dérivé, représentations (normalisées vs dénormalisées), chargement avide vs paresseux, concepts de base de données comme ACID et BASE, encodage et décodage, cryptage et décryptage, compression et décompression, sécurité de l'information.
- Concepts autour de la mémoire : espace mémoire virtuel, pile, tas, pointeurs, référents vs références, allocation et désallocation, garbage collection, working set, pagination sur disque, etc.
- Concepts autour des processus : l'instance de code en cours d'exécution. Concepts : compilation, thread, processus, bibliothèques chargées statiquement vs. bibliothèques chargées dynamiquement, erreurs d'exécution vs. erreurs de compilation, comment le système d'exploitation planifie les processus et les threads, etc.
Les concepts de plus haut niveau après ceux-ci appartiennent probablement au domaine du génie logiciel, des systèmes, ou à certaines spécialisations de l'informatique théorique.
.