Ruta de aprendizaje: Programación en C
Hola, STEAMdiantes.
Hay una pregunta que he escuchado mil veces en los pasillos de la universidad y en la industria, es esta.
Es la primera gran encrucijada. El aspirante a ingeniero ve C++ y oye hablar de “objetos”, “videojuegos”, “sistemas modernos”. Luego ve C y oye “viejo”, “difícil”, “punteros”. La tentación de saltar directo a C++ es enorme.
Como tu mentor, no es mi intención darte la respuesta fácil, sino la correcta. Y la respuesta correcta, para cualquiera que quiera ser un verdadero ingeniero en programación, es contundente e innegociable.
Pero primero, entendamos el dilema con una analogía.
Imagina que quieres ser un maestro mecánico, un ingeniero capaz de construir un coche de carreras desde cero.
Aprender C++ primero es como aprender a conducir un coche deportivo moderno con transmisión automática, GPS y control de tracción. Puedes ir muy rápido y llegar a tu destino. Pero si el coche falla, abres el capó y no tienes ni la más remota idea de lo que estás viendo. No sabes cómo funciona la inyección de combustible, ni la caja de cambios, ni el diferencial. Eres un usuario avanzado, no un constructor.
Aprender C primero es como empezar tu aprendizaje en el taller, con el motor desarmado. Aprendes qué es un pistón, un árbol de levas y una biela. Aprendes a usar una transmisión manual, a sentir la máquina. Te ensuciarás las manos con grasa (punteros). Aprenderás a la fuerza cómo funciona la combustión interna (la memoria).
El que empezó con C++ solo sabe usar la abstracción (el coche). El que empezó con C entiende qué se está abstrayendo (el motor).
Nosotros, en este campo, no somos usuarios. Somos los que construimos el motor.
Como ingenieros, basamos nuestras decisiones en fundamentos técnicos, no en modas. Aquí está el por qué empezamos con C.
C es la lingua franca del hardware
Abre la hoja de datos (datasheet) de cualquier microcontrolador, sea un humilde PIC, un ESP32 o un potente STM32. ¿cómo configuras un registro? ¿cómo activas un periférico? ¿cómo configuras el reloj del sistema?
Lo haces manipulando direcciones de memoria directas, usando operaciones a nivel de bits. Y el lenguaje para hacer eso, el lenguaje en el que están escritos todos los ejemplos de los fabricantes es C puro.
C no tiene “objetos” que se interpongan entre tú y el metal. Es el lenguaje más cercano al ensamblador que sigue siendo legible y portable. Para hablar con el hardware, debes hablar C.
Debes entender la memoria
El concepto más difícil y poderoso de C es la gestión manual de la memoria. El uso de malloc() y free(), y el “infierno” de los punteros, no es un error de diseño; es una característica que te da control absoluto.
En C, tú eres el responsable. Si pides memoria, tú debes liberarla. Si no lo haces, tienes una fuga de memoria (memory leak). Si liberas algo incorrectamente, corrompes el stack o el heap. Es doloroso, pero te enseña con sangre el costo de cada byte.
En C++, se inventaron soluciones brillantes para este problema. El principal es RAII (Resource Acquisition Is Initialization), que se implementa con constructores, destructores y, modernamente, con punteros inteligentes (std::unique_ptr, std::shared_ptr).
No puedes apreciar la genialidad de la solución (los smart pointers de C++) si nunca has sufrido el problema (la gestión manual de C). Un ingeniero que salta a C++ nunca entiende realmente por qué std::unique_ptr es tan importante, y por eso, no teme volver a usar punteros crudos (new/delete), reintroduciendo los mismos errores que C++ intentó solucionar.
C++ es un lenguaje multiparadigma construido sobre C
C es un lenguaje puramente estructurado (procedural). Te enseña a pensar en algoritmos, en funciones que procesan datos.
C++ es una bestia mucho más compleja: es un lenguaje multi-paradigma. Es C, además de POO, además de programación genérica (plantillas).
El 90% del firmware de bajo nivel (leer un sensor, configurar un timer, enviar un byte por SPI) es lógica procedural pura. Es C. La POO de C++ es una capa de abstracción que pones encima para organizar esa lógica. Por ejemplo, creas una clase SensorI2C que por dentro usa las mismas funciones de C para manipular los registros I2C.
Si intentas aprender POO (la abstracción) sin saber C (la base), no sabrás qué estás abstrayendo. Tu base será débil.
Entonces, ¿empezar con C o C++?
La respuesta es: empieza con C.
Dominarás la programación estructurada. Te pelearás con los punteros y entenderás la memoria. Aprenderás a pensar algorítmicamente.
Luego, y solo entonces, avanzarás a C++ y lo aprenderás en etapas:
- C++ como un “mejor C”: aprenderás const, referencias, new/delete y la sobrecarga de funciones.
- C++ como un lenguaje de objetos: aprenderás clases, constructores, destructores, herencia y polimorfismo. Aquí es donde aplicarás la POO para organizar tu código de C.
- C++ moderno: aprenderás RAII, smart pointers y la STL (templates).
Este es el camino. No es el más rápido, pero es el único que te formará como un ingeniero completo, capaz de depurar un problema hasta el nivel del metal.
Siguiente lección: Programación Estructurada o Programación Orientada a Objetos, ¿cuál estudiar y por qué?
Lección anterior: ¿Qué es un lenguaje de programación?
Gracias por leernos.
Si te gusto este artículo, únete a nuestra comunidad en Facebook o WhatsApp para más…
¡Hasta la próxima!



