Los básicos:
- Matemáticas discretas -- necesitas dominar todos los conceptos de conjuntos, lógica booleana, combinatoria, teoría de números, probabilidad, álgebra, etc. para tener una base sólida para la informática. Las matemáticas continuas (cálculo, etc.) no son muy importantes creo 🙂
Las siguientes que se me ocurren:
- El concepto de estados. Esto hace posible la comprensión de los estados, de la máquina de estados, de las transiciones de estado, de todos los conceptos de diseño stateful vs stateless, de la caché, de la coherencia de la caché, de la persistencia, de los estados blandos, etc. Muchos de mis amigos no programadores no entienden este concepto.
- El concepto de instrucción y la secuencialidad del procesamiento de las instrucciones. Algunos programadores junior que conocí inicialmente no entendían que las instrucciones se ejecutan secuencialmente. (Los procesadores realmente no tienen que ser secuenciales, pero es lo que la gran mayoría de los procesadores soportan ahora mismo).
- La complejidad de un programa (tanto la complejidad en tiempo de ejecución como en espacio). Es necesario comprender en profundidad lo que significa O(1), O(N), O(N log N), etc. antes de entender por qué ciertos algoritmos / estructuras de datos son fundamentalmente (no sólo artificialmente / empíricamente) más performantes que los otros.
- Conceptos en torno a los datos. Formas de entrada y salida y formas intermedias, mutable vs. inmutable, forma serializada vs. forma de objeto, programación orientada a objetos, canónica vs. derivada, representaciones (normalizada vs. desnormalizada), carga ansiosa vs. perezosa, conceptos de bases de datos como ACID y BASE, codificación y decodificación, cifrado y descifrado, compresión y descompresión, seguridad de la información.
- Conceptos en torno a la memoria: espacio de memoria virtual, pila, montón, punteros, referentes vs. referencias, asignación y desasignación, recolección de basura, conjunto de trabajo, paginación a disco, etc.
- Conceptos en torno a los procesos: la instancia de código en ejecución. Conceptos: compilación, hilo, proceso, bibliotecas cargadas estáticamente vs. cargadas dinámicamente, errores en tiempo de ejecución vs. errores en tiempo de compilación, cómo el sistema operativo programa los procesos y los hilos, etc.
Los conceptos de nivel superior después de estos probablemente pertenezcan al dominio de la ingeniería de software, sistemas, o algunas especializaciones de la informática teórica.