A lo largo de las últimas décadas, la programación ha experimentado una metamorfosis significativa que no solo ha transformado las habilidades requeridas por los desarrolladores, sino la manera misma en que se enseña esta disciplina. Iniciando en los años 90, con el icónico curso de "Introduction to Programming" basado en el influyente libro "Structure and Interpretation of Computer Programs" (SICP), impartido en el Instituto Tecnológico de Massachusetts (MIT), la enseñanza de la programación se centraba en construir abstracciones de forma artesanal desde sus cimientos. En aquel entonces, la elección del lenguaje Scheme, derivado de Lisp, no era un capricho, sino una herramienta para enseñar a los estudiantes a crear una jerarquía de abstracciones conceptuales, donde cada componente podía ser comprendido en profundidad. Los programadores aprendían a manejar un conjunto de primitivas y combinadores con los cuales edificaban soluciones que eran claras, elegantes y teóricamente perfectas. Esta metodología perseguía que el alumno no solo resolviera problemas, sino que entendiera la estructura misma del cómputo, modelando dominios de problemas y diseñando lenguajes personalizados para expresar soluciones de manera limpia y comprensible.
Para muchos estudiantes, acostumbrados a lenguajes imperativos y más sencillos como BASIC o Pascal, esta aproximación funcional y algebraica fue en un principio desconcertante y ajena. Sin embargo, con el tiempo y la práctica, este enfoque formó una base sólida que celebraba la puridad conceptual y la construcción meticulosa de programas. La realidad del software profesional no obstante, empezó a distanciarse de esta pureza. A medida que la complejidad de los sistemas crecía y la disponibilidad de librerías y frameworks ampliaba las posibilidades, la necesidad de entender cada piedra del edificio daba paso a la necesidad de integrar componentes externos, a menudo poco documentados o desconocidos en detalle. Gerald Sussman, uno de los autores de SICP, explicaba en una charla en 2009 que la programación había dejado de ser un arte cercano a la física elemental, donde cada pieza era completamente comprendida, para convertirse en una ciencia empírica: probar, experimentar, investigar cómo funcionaban los sistemas que se usaban, muchas veces como una investigación básica para descubrir su comportamiento.
Este nuevo contexto hacía evidente que el enfoque educativo debía evolucionar. Continuar privilegiando la construcción desde cero y la pureza conceptual ya no se ajustaba a las demandas de la industria ni a la práctica profesional. La integración, el manejo de sistemas complejos y la gestión de incertidumbres reales requerían habilidades diferentes: robustez ante fallos, razonamiento probabilístico, y una mentalidad más pragmática. En este escenario, en 2007, MIT tomó la decisión histórica de reemplazar el curso 6.001 basado en Scheme por el 6.
01, centrado en Python y en la programación robótica. Esta transición no fue un repliegue ni un abandono de lo enseñado anteriormente, sino una adaptación honesta y madura a las nuevas realidades tecnológicas y pedagogógicas. Python emergió como un candidato natural por su extensa biblioteca estándar, su filosofía de "baterías incluidas" y su facilidad para interactuar con hardware robótico. La enseñanza pasó a enfocarse en problemas concretos, donde los robots debían navegar entornos impredecibles con sensores poco confiables y ruedas que patinaban. La programación dejó de ser el diseño perfecto de sistemas idealizados para enfrentar la incertidumbre del mundo físico, haciendo hincapié en la resiliencia y la adaptabilidad.
Este cambio reflejaba una nueva forma de pensar. Ya no bastaba con concebir programas hermosos y minimalistas; el reto era usar herramientas disponibles, integrarlas eficazmente y validar los resultados empíricamente. No se esperaba que el programador construyera cada algoritmo desde cero, sino que gestionara la complejidad inherente a sistemas heterogéneos y en evolución. La historia de la programación muestra que estos cambios de paradigma no son inéditos. La transición desde el lenguaje ensamblador hacia lenguajes de alto nivel y compiladores tuvo inicialmente una resistencia fuerte dentro de la comunidad, con miedos legítimos sobre la pérdida de control y destrezas técnicas específicas.
Sin embargo, aquel salto permitió elevar el nivel de abstracción, liberar a los desarrolladores de los detalles de memoria y registros, y enfocarse en la lógica y el diseño. De modo análogo, la adopción de Python y su ecosistema a finales del siglo XX y principios del XXI marcó otro paso trascendental, uno en el que la integración y la practicidad destronaron a la pureza y la teorización rígida. Hoy, en la actualidad, estamos ante una tercera transformación: la irrupción de la inteligencia artificial en la programación. Las herramientas de codificación asistida por IA, como GitHub Copilot, Cursor y Aider, suponen un cambio en el rol tradicional del programador. Más que escribir manualmente el código desde cero, se les pide generar, verificar, depurar e integrar código creado por modelos de lenguaje avanzados.
El desafío ya no está tanto en dominar la sintaxis o los algoritmos al detalle, sino en formular buenas preguntas, interpretar resultados, identificar errores y diseñar arquitecturas de alto nivel. Esta nueva realidad genera incertidumbres y temores similares a los observados en transiciones anteriores. Hay preocupaciones sobre la pérdida de control, la posible pérdida de habilidades y la calidad del código generado automáticamente. Sin embargo, la historia indica que estas etapas no indican una disminución del papel del programador, sino una elevación hacia tareas más abstractas, complejas y estratégicas. En el entorno académico, esta revolución plantea retos importantes.
Los profesores deben encontrar cómo enseñar programación cuando los estudiantes tienen acceso a poderosos asistentes de código capaces de realizar tareas que antes eran dominio exclusivo del trabajo humano. Ignorar estas herramientas es más insostenible que lo fue resistirse a Python o a los compiladores. La pedagogía debe evolucionar para incluir el manejo crítico y ético de estas tecnologías, fomentando la capacidad de supervisar, cuestionar, y aprovechar inteligentemente la colaboración con máquinas inteligentes. El "ascenso del programador" descrito no es solo una cuestión de lenguajes o herramientas, sino un proceso continuo de adaptación y crecimiento. Cada salto tecnológico libera a los humanos de las tareas más mecánicas y las reemplaza por tareas intelectuales superiores.