Mostrando entradas con la etiqueta Vibe coding. Mostrar todas las entradas
Mostrando entradas con la etiqueta Vibe coding. Mostrar todas las entradas

miércoles, 11 de febrero de 2026

La evolución del desarrollo software: productividad frente a deskilling

El desarrollo de software ha sido siempre una actividad que me ha encantado y con la que, en su momento, he disfrutado muchísimo. Y digo en su momento porque tanto en los últimos años de mis estudios universitarios, como en los primeros de mi carrera profesional, dediqué muchísimas horas a esta actividad, como aficionado como ingeniero de software.

Y he podido asistir, dada mi edad, a casi toda su historia (me perdí un poco del principio) y a cómo ha ido evolucionando. Y lo cierto es que la transformación es enorme. Ha cambiado en filosofía, lenguajes, herramientas y requisitos profesionales del desarrollador.

En este post quisiera revisar esa evolución, y lo que los cambios suponen, de bueno y de malo


Un análisis en cinco fases


Y, para ello, propongo identificar las fases principales de la evolución.

Que yo sepa, no existe ninguna forma de marco concreta para clasificar esta evolución de la forma de construir software, (aunque sí se habla a veces de generaciones, sobre todo tercera y cuarta, pero con base en mi percepción personal, hablaría de cinco fases, a saber:


  • Fase 1: código máquina
  • Fase 2: ensamblador
  • Fase 3: lenguajes de alto nivel
  • Fase 4: 'low-code' / 'no-code'
  • Fase 5: 'vibe coding' o 'prompt based coding'


Veamos brevemente lo que significa y aporta cada una de ellas.


Fase 1: código máquina


En esta fase, que sinceramente creo que pocos desarrolladores han vivido salvo, como mucho, durante sus estudios, se trabaja directamente con el hardware, con el microprocesador y se expresa el programa en los famosos unos y ceros que caso nadie ha visto.

Es una programación muy, muy cercana al hardware, e implica conocer en detalle el microprocesador, sus registros, las instrucciones que maneja y cómo se codifican, las direcciones de la memoria etc. Los programas son, a poco que el programador sepa lo que hace, extraordinariamente eficientes en recursos computacionales y rápidos en ejecución, pero eso sí, son muy dificultosos de desarrollar y depurar y, por tanto, en general de un alcance muy modesto.  


Fase 2: ensamblador


En realidad, es muy similar a la anterior, pero ahora hay un cierto lenguaje, el ensamblador, que al menos expresa las instrucciones mediante nemónicos textuales (típicamente de tres letras) con lo que, aunque con criterios de hoy en día siguen siendo enormemente crípticos, para su momento fueron una gran aportación en cuanto a claridad.


Fase 3: lenguajes de alto nivel


Son, quizá, el primer tipo de lenguajes ampliamente conocidos. En ellos el lenguaje de programación se basa en formas textuales más o menos destiladas del inglés, pero circunscritos a una serie de instrucciones muy concretas y con una estructura en general muy bien definida. Aunque hable de una forma de inglés no tiene nada que ver con el lenguaje natural: se trata de lenguajes muy acotados, muy estructurados y muy ligados a gramáticas estrictas.

Introducen ya los tipos de datos, las variables, las estructuras de control del tipo de bucles y condiciones o la capacidad de crear funciones. Con el tiempo, con el auge de la orientación a objetos, se introduce también esta idea de los objetos (que unen datos y comportamiento) y a capacidad de crearlos y utilizarlos.

Son lenguajes ya independientes del microprocesador e incluso del sistema operativo en que se ejecutan y un programa auxiliar, el compilador o el intérprete según el caso, se encarga de traducir esas instrucciones textuales de alto nivel al código máquina.

Se fueron acompañando de entornos de desarrollo del tipo IDE ('Integrated Development Environment') que incluyen capacidades de control y organización del código, capacidades de depuración, ayudas, etc. 

En esta categoría caben casi todos los lenguajes de programación más conocidos, desde algunos más antiguos como COBOL o Pascal, y pasando por Basic, C, C++, Java o python, por decir algunos.

El salto de productividad es inmenso respecto a la programación en ensamblador, una productividad que se refuerza por la posibilidad de creación y reutilización de librerías de funciones u objetos que proporcionan, ya empaquetadas y listas para ser usadas, capacidades más o menos sofisticadas. Creo que es con base estos lenguajes que se produce el verdadero 'boom' del software.

Aunque en varios momentos me he referido a ellos en pasado, siguen estando muy presentes hoy en día, muy especialmente python.


Interludio: los lenguajes de cuarta generación 4GL


No los he llegado a proponer como una fase diferenciada, pero por encima de los lenguajes de alto nivel (que a estos efectos se consideran de tercera generación), proporcionan mayores niveles de abstracción y un enfoque algo más declarativo, normalmente orientados a software de características bastante comunes y estructuradas como la gestión de bases de datos.

Hay quien los considera como un antecedente de lo que veremos a continuación: el 'low-code'.


Fase 4: low-code / no-code


La fase 4 nos conduce a la filosofía y soluciones 'low-code' o, en su extremo, 'no-code'. 

La idea es que el desarrollador ya no trabaje con código fuente (que se expresa en un lenguaje de tercera generación) o que lo haga en la menor medida posible. ¿Cómo se consigue eso? Pues proporcionando entornos de desarrollo gráficos o semi-gráficos, donde con frecuencia los bloques de ejecución se representan por cuadrados o círculos, que se unen mediante líneas o flechas para representar una lógica completa. Además, el entorno de desarrollo ofrece ya una amplia librería (normalmente ampliable) de bloques constructivos

En general el desarrollo tiende a convertirse en 'dibujar' la lógica de ejecución complementada por la configuración (habitualmente mediante cuadros de diálogo) de los parámetros y variantes de ejecución de cada uno de los bloques constructivos, así como la definición de variables.

En los casos más extremos ('no-code') no es necesario incluir código fuente tradicional y en otros casos ('low-code') sí existen determinados puntos donde se complementa la lógica, digamos gráfica, con pequeños elementos de lenguaje de programación de tercera generación. 

Esta filosofía es cada vez más común para construir todo tipo de soluciones, pero, por citar algunas muy representativas, tendríamos, en el ámbito de la automatización, casi todos los entornos RPA ('Robotic Process Automation') o BPMS ('Business Process Management Systems'), así como soluciones de automatización de workflow (como Make o N8N) e, incluso, algún entorno de construcción de agentes IA como LangFlow. También es común, por ejemplo, en visualizadores de datos como Power BI.

En este salto, no es ya que nos hayamos alejado del hardware y el microprocesador, es que incluso nos hemos alejado de los lenguajes de programación como tales, si entendemos los lenguajes de programación como algo con base textual. Incluso, gran parte de la lógica detallada, viene resuelta por los bloques constructivos disponibles sinq ue el desarrollador la conozca en detalle, sino sólo por su comportamiento externo.


Fase 5: Vive coding o 'prompt based coding'


El último salto, es la creación de software a partir de prompts usando herramientas de inteligencia artificial generativa. En el primer post de este blog que dediqué al 'vibe coding', comentaba la diferenciación entre el uso de inteligencia artificial como una especie de ayuda o copiloto, lo que Addy Osmani denominaba 'Ingeniería de software asistida por IA' frente al uso de la IA para construir toda la aplicación, siendo esto último a lo que asignaba el término 'Vibe coding'.

En realidad, si usamos la IA como copiloto, estamos realmente reforzando una de las dos fases anteriores (lenguaje de alto nivel o 'low-code'/'no-code') pero no sería una fase realmente diferenciada. 

Lo que considero como una fase diferenciada es cuando usamos la herramienta para la generación completa de aplicaciones o módulos a partir de prompts en lenguaje natural.  Como en este caso la forma de actuar que tiene el desarrollador es únicamente mediante 'prompts', me he querido inventar el término 'prompt based coding'.

En este caso el alejamiento ya es total: el desarrollador no es que no conozca el hardware o el sistema operativo, y no es ya que no utilice un lenguaje de programación, es que, incluso, salvo que se preocupe por ello, hasta desconoce la lógica interna del software que ha generado o cómo está estructurado. El desarrollador, en teoría, se centra sólo en la necesidad, que expresa mediante lenguaje natural, no en los detalles internos del software.

Se trata de una fase probablemente poco madura en estos momentos y que hay que ver hasta dónde es capaz de llegar, pero, en teoría, es una fase de altísima productividad y, además, casi al alcance de cualquiera, una fase donde el propio término 'desarrollador', al menos tal y como lo hemos entendido hasta ahora, puede que pierda sentido.


Consecuencias


A medida que se avanza en las diferentes fases, creo que se producen los siguientes efectos:


  • Se aumenta (y mucho) la productividad del desarrollo software
  • Se baja la barrera de entrada (los conocimientos y la especialización necesarios) para crear software
  • El desarrollador pierde conocimiento del detalle de lo que está haciendo (el hardware, el sistema operativo, las lógicas internas, etc)
  • Debido a esa pérdida de conocimiento (y gestión) del detalle, en general el software generado es menos eficiente en el uso de recursos computacionales: memoria, tiempo de CPU, disco, etc 


En general, la evolución de la industria ha apostado por los dos primeros beneficios (productividad y bajada de la barrera de entrada) frente a los dos últimos inconvenientes (perdida de conocimiento y menor eficiencia en recursos computacionales).

Voy pararme un momento en dos aspectos.


La productividad y las barreras de entrada


En efecto, el gran beneficio de esta evolución es, sobre todo, la altísima mejora de productividad en la construcción de software, no sólo en cuanto a cantidad de código creado sino en cuanto a potencia y capacidades de las soluciones generadas. Por ejemplo, hace  20 o 30 años, hacer la interfaz de usuario (las ventanas, por entendernos) de un sistema, era tremendamente trabajoso... y hoy es casi trivial en algunos casos. 

A esto se une, especialmente en las dos últimas fases, en unos menores requisitos, una menor cualificación, para ser creador de software, llegándose ya hace unos años al concepto acuñado por Microsoft de 'Citizen developer' (un concepto muy ligado al 'low-code') en que ya parte del software empresarial podría ser creado, no por desarrolladores profesionales del departamento de IT, sino por profesionales del ámbito del negocio (ventas, marketing, operaciones, etc)


El deskilling


Sin embargo, ese menor conocimiento requerido supone en parte un peligro para el propio software en el sentido de que el desarrollador puede ser mucho menos capaz de hacer un software eficiente, escalable e incluso seguro, o que le puede costar depurar los errores más extraños. 

De cara al desarrollador, como profesión, el avance en estas fases, muy especialmente la última, pone en riesgo la profesión en sí misma, en riesgo de desaparición o, quizá más probable, de profunda redefinición y, quizá, sólo quizá, menor cualificación y por tanto consideración profesional.

En el fondo, se produce una forma particular de 'deskilling' (término del que he hablado en los dos últimos posts), en que el desarrollador cada vez sabe menos de sistemas, cada vez sabe menos, por supuesto del hardware, pero también sabe menos de las mejores arquitecturas, de los mejores criterios y mejores prácticas de construcción de software. Y eso es un riesgo potencial para la propia calidad del software y para su mantenibilidad y, quizá, un empobrecimiento personal y profesional del desarrollador.


Conclusiones


El desarrollo de software ha sufrido a lo largo de las últimas décadas, una enorme transformación en su forma de realización, una evolución que le ha conducido, a través de cinco fases, a recorrer un camino en el que ha ganado una enorme productividad y sencillez, pero a cambio de una menor eficiencia en recursos computacionales y en una progresiva descualificación técnica de los profesionales que la ejercen. 


viernes, 9 de enero de 2026

Conociendo el Vibe coding y más con Addy Osmani

'Beyond Vibe coding' es un libro que, como el título sin duda expresa, nos habla del 'Vibe coding', es decir, de la generación de código software usando grandes modelos de lenguaje a los que se les aportan los requisitos y necesidades en lenguaje natural. Pero, como también el título expresa, no se queda ahí sino que, en realidad, nos habla de todo el campo de la ingeniería de software apoyada, en mayor o menor medida, en la inteligencia artificial (en esencia, en grandes modelos de lenguaje).

Se trata de un libro fundamentalmente dirigido a desarrolladores y arquitectos, pero que creo aporta valor a cualquiera implicado o familiarizado con la ingeniería de software.

El libro, de mediana, casi corta, extensión, se extructura en once capítulos agrupados en tres partes, como sigue:
  • 'I. FOUNDATIONS': Aporta los conceptos fundamentales sobre 'Vibe coding' pero también sobre el uso de lenguaje natural para relacionarse con los modelos de lenguaje en forma de 'prompts'. Incluye los dos primeros capítulos:

    • '1. Introduction: What is Vibe coding?': Comienza exponiendo el origen del término 'Vibe coding' (debido a Andrej Karpathy) y hace una distinción entre el, digamos, 'puro vibe coding', en que toda la interacción para la generación de código se hace mediante lenguaje natural y lo que denomina ingeniería asistida por IA ('AI-assisted engineering') en que la IA se integra dentro de los entornos de desarrollo o IDE ('Integrated Development Environment') como un apoyo. Luego habla de la intención ('intent') como aquello que el desarrollador quiere conseguir de su software y delinea el uso de los prompts para expresarlo. Además muestra un esquema de ciclo de vida o mecánica de trabajo y añade un vistazo a las principales herramientas y los principales modelos para finalizar cantando los beneficios del uso de la IA en el desarrollo software.

    • '2. The art of the prompt: communicating effectively with AI': Un capítulo dedicado a la ingeniería de instrucciones ('prompt engineering') aplicada al desarrollo de software. Habla de características fundamentales como la claridad y especificidad y propone un trabajo iterativo. Luego describe técnicas habituales de prompting tanto básicas como más avanzadas.

  • 'II: AI CODING IN PRACTICE': La parte nuclear del libro y que aborda los diferentes elementos de la ingeniería de software apoyada en IA. Esta compuesta por cinco capítulos, a saber:

    • '3. The 70% problem: AI-assisted workflows that actually work': Plantea el problema del 70% en el sentido de que esa es la proporción aproximada en que el trabajo con código es casi sencillo y que sigue patrones bien definidos, siendo por tanto objeto claro de la ayuda de la IA, mientras que el 30% restante necesita intervención humana. Tras repasar cómo los desarrolladores trabajan en la práctica con la IA, aporta unas 'reglas de oro'.

    • '4. Beyond the 70%: maximizing human contribution': Se centra en la parte de la aportación humana y lo hace distinguiendo tres niveles: ingenieros senior, ingenieros de nivel medio y desarrolladores junior.

    • '5. Understanding generated code: review, refine, own': Aborda la revisión y prueba del código generado por la IA. Nos advierte de que la IA tiende a generar un código basado en los patrones más habituales pero que no siempre resultan óptimos. Luego presenta estrategias para la depuración del código o para el denominado 'refactoring' (rediseño y construcción) para conseguir mejores características de explotación y mantenimiento. Y finaliza enfatizando la importancia de las pruebas en sus diferentes niveles: unitarias, de integración y extremo-a-extremo.

    • '6. AI-driven prototyping: tools and techniques': Se centra en el prototipado, quizá uno de los ámbitos donde mejor se puede aplicar el 'vibe coding'. Nos habla de herramientas incluyendo las que generan sólo el 'mockup' (ej. Vercel), las que generan aplicaciones completas (como Lovable o Bolt.new) o las más avanzadas que se integran en los IDEs, como Cursor, Windsurf o Cline. Y luego trata algunas mecánicas de trabajo que incluyen la iteración hasta conseguir el prototipo deseado, la forma de evolucionar un prototipo a un sistema en producción o como hacer frente a algunos desafíos en el prototipado.

    • '7. Building web applications with AI': Y finaliza esta parte dedicada al desarrollo en sí mismo con otro caso paradigmatico para el uso de 'vibe coding': las páginas web. Describe cómo trabajar tanto en el 'front-end', como en el 'back-end' (sobre todo uso de APIs), como integrar bases de datos, llegando a una integración 'full-stack'. Y no deja de aportar también sugerencias en cuanto a prueba y validación.

  • 'III. TRUST AND AUTONOMY': Por un lado aborda aspectos más propios de la operación (seguridad, despliege, mantenimeinto, etc), y por otro revisa consideraciones éticas y tendencias. Incluye los cuatro capítulos finales:

    • '8. Security, maintanability, and reliability': Comienza enfocándose en los aspectos de seguridad, identificando primero algunas vulnerabilidades comunes y describiendo luego elementos de auditoría de seguridad. Luego salta a elementos de mantenibilidad aportando consejos sobre cómo conseguir esa mantenibilidad y también sugiriendo y explicando cómo hacer revisiones de código. Finaliza con consejos sobre el despliegue ('deployment`) y cómo hacerlo más confiable.

    • '9. The ethical implications of vibe coding': Se centra en tres grandes problemáticas, a saber: propiedad intelectual, sesgos y equidad y trasparencia y atribución. Como guía para un desarrollo ético aporta, además, cinco reglas de oro.

    • '10. Autonomous background coding agents': Explora una línea emergente como es el salto de la IA como asistente o generador de código pero bajo petición humana a los agentes autónomos de codificación en que, siguiendo la filosofía de los agentes, se les marcan a éstos unos objetivos de alto nivel y los agentes se encargan del resto. Tras explicar el concepto, describe las líneas básicas de cómo funcionan estos agentes y finaliza comparando su comportamiento con el de un IDE.

    • '11. Beyond code generation: the future of AI-augmented development': Un capítulo de mirada al futuro con tendencias que estructura en varios apartados: prueba y depuración, diseño y experiencia de usuario, dirección de proyectos, agentes autónomos y lenguajes de programación. Remata el capítulo y el libro destacando cinco grandes ideas sobre cómo el 'vibe coding' está transformando la industria de la ingeniería software.
'Beyond Vibe coding' me ha parecido un gran libro porque describe de manera comprensible y muy correcta todos los conceptos, porque es abarcador en el sentido de no atacar sólo el puro desarrollo sino todo el contexto de la ingeniería de software y, sobre todo, porque, pese a tratar un tema de máxima actualidad y muy propicio para el 'hype', el tratamiento es muy realista, muy sensato y se nota que basado en experiencia real.

Sin duda, lo recomiendo.

Addy Osmani

(Fuente: traducción asistida con IA de su entrada en página oficial)

Addy Osmani
Addy Osmani es un ingeniero de software irlandés que actualmente trabaja en el navegador web Google Chrome y Gemini con Google DeepMind.

Desarrollador desde hace más de 25 años, lleva más de trece años trabajando en Google, centrado en hacer que la web sea más fluida para los usuarios y los desarrolladores web. Le apasionan la ingeniería asistida por IA y las herramientas de desarrollo. Anteriormente trabajó en sitios web de empresas de la lista Fortune 500.

Addy es autor de varios libros, entre los que se incluyen 'Learning JavaScript Design Patterns', 'Leading Effective Engineering Teams', 'Stoic Mind' e 'Image Optimization'.

Ha impartido más de 175 charlas en todo el mundo. También en su blog, Substack y LeadDev.

Puedes conocer más del autor visitando su página oficial, su perfil en LinkedIn o siguiéndole en X donde se identifica como @addyosmani.

lunes, 29 de septiembre de 2025

Lo que no reluce en el 'Vibe coding': retos, limitaciones y equilibrios

Aunque la promesa de productividad y facilidad del 'vibe coding' es muy importante, y hasta cierto punto bastante creíble, conviene ser realistas y tomar consciencia de que la generación de código mediante inteligencia artificial, al menos hoy en día, tiene limitaciones que hay que conocer y gestionar.

En un post anterior decía por ello que 'no era oro todo lo que relucía'. En este post, precisamente, quiero sacar a colación aquello que 'no reluce' en el 'vibe coding'.

Y para ello me baso, como en posts anteriores, en las aportaciones de Addy Osmani en su libro 'Beyond Vibe Coding: From Coder to AI-Era Developer'.


Recordatorio 'express'


Antes, un recordatorio brevísimo, express. El término 'Vibe coding', acuñado por Andrej Karpathy, y de fronteras difusas, designa la generación de código mediante el uso de inteligencia artificial, normalmente grandes modelos de lenguaje generalistas o especializados en generación de código. Es decir, el desarrollador expresa en lenguaje natural lo que quiere que haga una aplicación, función o lo que sea, y el modelo de lenguaje genera el código correspondiente.

Como digo, las fronteras del término no son claras, pero personalmente creo que se aplica más a cuando esa generación de código es completa o casi completa, es decir, que se genera una aplicación completa o gran parte de ella. De forma más general, podemos hablar de ingeniería de software asistida por IA donde el nivel de ambición puede ser menor y lo que el desarrollador puede solicitar al modelo de lenguajes es, a lo mejor, sólo una función, o una pantalla o que le ayude a resolver un error sintáctico o de ejecución.

En cualquier caso, hablamos de generación de código y un código que el desarrollador solicita a la IA mediante lenguaje natural.


Bajando un poco a la realidad


Si bajamos un poco a la realidad, al menos actualmente, no resulta posible generar aplicaciones que sean completas, fiables, seguras y escalables sólo mediante un 'prompt', por largo, sofisticado y bien elaborado que éste sea.

Se pueden conseguir resultados espectaculares generando aplicaciones sencillas en modo demostración o prototipo, pero no aplicaciones pensadas para producción real.

La realidad actual apunta más a un trabajo conjunto entre un desarrollador y la IA, donde la IA genera grandes partes del código e incluso ayuda a corregirlo pero con intervención, supervisión y modificaciones por parte del desarrollador humano.


Aspectos que aún le cuestan al 'vibe coding'


Osmani, en su libro, destaca cinco facetas, como aspectos que le cuestan (que no suele conseguir) el 'vibe coding' actual:


  • Sistemas complejos: El 'vibe coding' funciona bien con aplicaciones sencillas y típicas, como ventanas web que recubren operaciones CRUD (Create, Read, Update, Delete) en bases de datos. En general, aplicaciones sencillas y comunes que los LLMs 'han visto' con frecuencia en sus datos de entrenamiento. Pero lo tienen muy difícil ante el caso de algoritmos complejos o planteamientos novedosos que no existen en los datos de entrenamiento o que se encuentren poco representados. En estos casos, la IA tiende a generar un código que se acerca al correcto, pero no lo es en realidad.

  • Optimizaciones de bajo nivel y programación a nivel sistema: Los LLMs actuales están fundamentalmente entrenados con código escrito en lenguajes de alto nivel y problemas también de alto nivel, cercanos al negocio o la funcionalidad. Sin embargo, la optimización de ciertos algoritmos implica la programación a muy bajo nivel, muy cerca del sistema, para reducir complejidad algorítmica y tiempos de procesamiento, optimizar el uso de recursos hardware, para adaptar los algoritmos al hardware subyacente, etc. Por tanto, el código que generan suele ser subóptimo. Para muchas aplicaciones no críticas puede ser más que suficiente, pero para otras más especiales no tanto.

  • Frameworks únicos o de nicho: De nuevo, estos modelos están entrenados con base en código fuente basado en librerías y frameworks más o menos populares y, por tanto, pueden ser incapaces de generar un código correcto en el caso de frameworks o librerías muy nuevos o muy de nicho (y con pocos ejemplos en los datos de entrenamiento)

  • Interfaces de usuario creativas: Una vez más, los modelos generan correctamente código para formas de resolver un problema comunes. En lo relativo a la interfaz de usuario, generan correctamente, por ejemplo, formularios, dashboards y otras formas comunes y probadas de interfaz de usuario. Pero les resulta muy complicado generar una experiencia nueva, especial, diferente, inspiradora.

  • Interpretación de intenciones y requisitos: En este caso, el problema puede estar más en el lado del desarrollador, pero lo cierto es que los modelos no siempre resuelven bien unas especificaciones con requisitos implícitos o contradictorios.


Limitaciones y equilibrios


Además de las facetas vistas más arriba, Osmany también nos alerta de algunas limitaciones de los LLMs o de algunas circunstancias que pueden precisar de adoptar algún tipo de equilibrio, de solución de compromiso:


  • Calidad variable de la salida: Como sucede en otros ámbitos de su aplicación, los LLMs pueden generar un código que parezca correcto pero que no funcione del todo bien, o que, por ejemplo, no reaccione bien ante errores. También puede producir un código funcional pero ineficiente. Por tanto, parece inevitable una supervisión responsable y real por parte del desarrollador humano de todo lo que genera mediante IA.

  • La ambigüedad en los 'prompt's conduce a ambigüedad en el código: Como ocurre en general con la ingeniería de instrucciones ('prompt enmgineering') y como , en el fondo, también ocurre con la especificación de requisitos tradicional, si las instrucciones (que actúan como requisitos) son ambiguos, incompletos o incorrectos, el resultado también presentará carencias.

  • Confianza excesiva y atrofia de habilidades: Quizá aún sea pronto para ver con claridad este efecto, pero parece previsible que si un desarrollador confía en exceso en la IA y apenas hace aportaciones propias, poco a poco sus habilidades se irán deteriorando y con ello su capacidad de detectar errores, de optimizar el código, de depurar el resultado y, en general, se empobrecerá como desarrollador. Y también se empobrecerá el código que genere, cada vez más apoyado en la IA

  • Aspectos de seguridad y privacidad: Con frecuencia, los entornos de 'vibe coding' se apoyan en el envío de código a terceros en la nube, lo cual puede plantear preocupaciones en cuanto a privacidad. Igualmente, existe el riesgo de que el código que genere la IA sea casi una copia de un código real quizá protegido por propiedad intelectual.

  • Sesgos en las salida: Los LLMs usados para generar código, también pueden presentar sesgos como otros modelos de IA o como estos mismos modelos en otros ámbitos de aplicación. En el ámbito de la generación de código suelen ser sesgos 'inocentes' como tener preferencia por dar ciertos nombres a las variables, pero conviene estar vigilantes de que no se introducen sesgos más graves.

  • Factores humanos y confianza: Finalmente entra el factor humano que puede hacer que los desarrolladores no acepten esta forma de trabajar, quizá por desconfianza en los resultados, o quizá, incluso, porque cambia la naturaleza de su trabajo que hasta ese momento, antes del 'vibe coding', quizá percibían como más divertido, independiente y creativo.


Conclusiones


Como en el fondo cabía imaginar, el 'vibe coding' no es algo mágico, sino que tiene sus limitaciones y problemáticas, unas limitaciones y problemáticas que tienden a resolverse, en la mayor parte de los casos, siendo conscientes de que el trabajo de desarrollo basado en IA implica una importante supervisión por parte de desarrolladores humanos de cara a la verificación, optimización, depuración, etc. Y unos desarrolladores humanos que, además, deben estar mentalizados y tener altas capacidades por que, si no, seguramente les pasarán inadvertidos los errores o soluciones subóptimas que les proponga la IA.


Artículos de este blog relacionados


miércoles, 24 de septiembre de 2025

Doce reglas de oro del 'Vibe coding'

En el post anterior, hice una pequeña introducción a lo que es este nuevo concepto del 'vibe coding', un tema novedoso (aunque con presente y mucho futuro) y que cambia la forma de desarrollar software.

En este artículo voy a aportar unas buenas prácticas, en forma de reglas de oro, que propone Addy Osmani en su libro 'Beyond Vibe Coding: From Coder to AI-Era Developer'. 

 

Un breve recordatorio: qué es el 'vibe coding'


Antes, y a modo de muy breve recordatorio, decir que el término 'vibe coding' denomina, de una forma que hay que reconocer que algo confusa, el uso de la inteligencia artificial para la generación de código software.

Aunque, como digo el término no es académico ni de límites claros, personalmente tiendo a asimilarlo al caso en que la IA hace gran parte del trabajo, que genera todo o gran parte del código fuente, mientras que para otras situaciones en que es una ayuda pero más atomizada, generando secciones relativamente limitadas de código o ayudando en depuración de errores concretos y cosas así, podríamos adoptar el término de ingeniería de software asistida por IA que propone el propio Osmani.

En cualquier caso, creo que no vale la pena en este caso 'ponerse estupendos' con las definiciones. Hablamos de generación de código (e incluso de intervención en todo el ciclo de vida de la ingeniería software) basado en inteligencia artificial y, en concreto, en grandes modelos de lenguaje

Para más detalles, invito al lector a visitar mi post anterior 'Conociendo el vibe coding', incluyendo la referencia bibliográfica al libro de Osmani, o a las aportaciones de Andrej Karpathy, creador del término 'vibe coding' 


Las doce reglas de oro del 'vibe coding'


Bueno, y sin más dilación éstas son las doce reglas de oro que propone Osmani en su libro, a las que me tomo la libertad de añadir algunos comentarios propios:


  • Sé claro y específico en lo que quieres: Se trata de proporcionarle instrucciones muy claras a la IA sobre la aplicación, función o lo que sea que se le está solicitando. Esto, en realidad, es la fusión de dos buenas prácticas: la de la especificación de requisitos clara, propia de la ingeniería de software tradicional (sobre todo en el modelo en cascada) y la de proporcionar instrucciones claras y precisas propio del 'prompt engineering'

  • Valida siempre la salida de la IA frente a tu intención: Osmani utiliza el término intención ('intent') para indicar aquello que realmente queremos, aquello que esperamos del software que vamos a crear. Y lo que propone, en el fondo, es algo que también se realiza en ingeniería de software tradicional bajo el término 'validación', y que significa asegurarse de que el software satisface los requisitos del negocio. En este caso, lo que creo que es más relevante es la llamada de atención a 'no fiarse' sin más de lo que genera de IA, sino realizar una validación activa y por humanos del resultado.

  • Trata a la IA como a un desarrollador junior: Básicamente, significa, de nuevo, no fiarse directamente del código generado por la IA. Con la metáfora del desarrollador junior, se traslada la idea de supervisar las tareas. Es decir, delegar tareas de desarrollo pero revisar el resultado.

  • Usa la IA para expandir tus capacidades no para sustituir tu pensamiento: Una juiciosa llamada de atención a no renunciar a la propia capacidad de resolución de problemas y de toma de decisiones. Aparte de lo que para la persona supone, el propio estado del arte de la generación automática de código requiere actualmente que el humano asuma muchas de las decisiones o planteamientos más complejos.

  • Coordina por anticipado con el equipo antes de generar código: Se trata de un lógico establecimiento de ciertas reglas de juego comunes, tanto de estilo como de operación. Pero, además, hay que tener en cuenta que la IA puede decidir modificar módulos (eventualmente desarrollados por otra persona o por otra persona ayudada por IA), por lo que es necesario coordinar y poner reglas.

  • Trata el uso de la IA como una parte normal de la conversación del desarrollo: De igual forma que los equipos de desarrollo hablan de herramientas, hallazgos y buenas prácticas, lo que propone Osmani es algo tan lógico y natural como que en esas conversaciones se incluyan experiencias, éxitos, fallos etc encontrados en el trabajo con la IA.

  • Separa los cambios en Git mediante 'commits' diferentes: Se trata de gestionar de forma separada, en lo que a control de versiones se refiere, el código generado por humanos del generado de la IA: Es una regla de orden práctico para facilitar revisiones, vueltas atrás, etc

  • Asegura que todo el código pasa por una revisión de código: La revisión de código ('code review') es una buena práctica tradicional en ingeniería software. Se trata de que el software  generado, no sólo se prueba en funcionamiento, sino que el propio código fuente es inspeccionado y revisado, en general por otro desarrollador o por un arquitecto de soluciones. Personalmente aseguraría que esta práctica está bastante en desuso y, sin embargo, Osmani la propone como una regla de oro. Por un lado, propone usarla para que una persona revise el código generado por la IA, lo cual puede estar perfectamente alineada con esa metáfora del desarrollador 'junior' que mencionábamos antes. Pero además, propone también revisar el código generado por humanos. Es decir, es una apuesta general y en toda regla por la revisión de código.

  • No hagas 'merge' de código que no entiendes: Para aquellos no familiarizados con el trabajo en software, indicar que  'hacer un merge' significa fusionar en una sola instancia dos versiones del código fuente del mismo módulo para lo cual de alguna forma hay que decidir (automáticamente o por una persona) qué parte sobrevive de cada versión en el resultado unificado. Cuando Osmani propone esta regla, lo que propone en el fondo es no fiarse sin más de un código generado por la IA, sino primero entenderlo como haría el desarrollador con el código generado por él mismo, y sólo entonces incorporarlo al repositorio común de código y eventualmente mezclarlo o fusionarlo con otro código.

  • Prioriza los comentarios y documentación: De nuevo, se trata de rescatar, y aplicar al caso del código generado por IA, una buena práctica de la ingeniería de software tradicional. Una práctica que consiste en insertar comentarios y generar documentación que ayude a entender a un tercero (o al propio desarrollador pasado un tiempo) el código fuente. Eso es fundamental sobre todo de cara al mantenimiento y evolución.

  • Comparte y reutiliza los prompts efectivos: una vez más, la adaptación de una buena práctica del mundo del software que consiste en generar módulos reutilizables, aunque en este caso aplicada a los prompts. En este caso, también, se trata de una buena práctica de ingeniería de instrucciones. Si un prompt (una instrucción) ha demostrado que ha generado buenos resultados, un código que funciona y hace lo que tiene que hacer, es bueno reutilizarlo y compartirlo con el resto del equipo.

  • Reflexiona regularmente e itera: Propone una revisión periódica de todo la mecánica y 'workflow' de desarrollo como una forma de mejora. Se trata un poco de la adaptación de la filosofía de la calidad total o de las llamadas 'retrospectivas' usadas en enfoques agile como Scrum.


No es oro todo lo que reluce


En cierto modo, en estas reglas de oro que propone Osmani, observamos muchas dosis de revisión,  intervención humana y aplicación de buenas prácticas de ingeniería de software tradicional.

¿Por qué?

Pues porque aunque no sabemos a dónde puede llegar el 'vibe coding', en la actualidad, y pese a los extraordinarios avances y aportaciones, y pese a lo que ya aporta en el proceso de desarrollo de software, todavía no te puedes fiar, en muchos sentidos, del código generado por la IA, y es preciso revisar, probar y mejorar el proceso.

En algún post futuro, comentaré algunas de estas limitaciones actuales.


Conclusiones


El 'vibe coding' permite, de forma muy sencilla, obtener código generado por inteligencia artificial. Sin embargo, en este momento no es mágico, y de cara a una creación de sofware efectiva y de calidad, es preciso aplicar ciertas pautas metodológicas y ciertas buenas prácticas procedentes muchas de ellas de la propia ingeniería de software tradicional o de la ingeniería de instrucciones ('prompt engineering') 


Artículos de este blog relacionados


lunes, 22 de septiembre de 2025

Conociendo el 'Vibe coding'

En este dinámico y acelerado mundo de la tecnología en que nos movemos, no sólo surgen nuevas tecnologías, sino también nuevos planteamientos, nuevos conceptos y nuevos términos, no todos ellos de fronteras definidas, no todos realmente novedosos y no todos llamados a perpetuarse en el tiempo y superar la mera moda, pero que ahí están, para nuestro estudio y asimilación.

Uno de los conceptos con cierta 'tracción mediática', al menos en ambientes tecnológicos, y uno de los términos de surgimiento muy reciente es el de 'vibe coding'.

En este post busco sólo hacer una introducción rápida a la idea


Un inciso: lenguajes de programación y desarrollo de software


Probablemente muchos de los lectores de este blog conozcan cómo funciona el mundo del software, y además lo he abordado hace poco en el post titulado 'Exactitud vs. flexibilidad en modelos de inteligencia artificial (III): ingeniería software y 'vibe coding'' pero, no obstante, recuerdo alguna idea básica.

Como sabemos, los ordenadores digitales tratan todo, tanto información como algoritmia, en lenguaje binario (los famosos unos y ceros). Por tanto, para programar un ordenador, al final tenemos que darle el código binario que representa la lógica y los datos. Pero, claro, esto no es fácil ni práctico. Por ello hace ya muchos años, se inventaron primero los lenguajes ensambladores (que hacían una ligera abstracción de ese código binario) y no mucho después los entonces denominados 'lenguajes de programación de alto nivel', unos lenguajes de programación que, aunque son lenguajes formales, se aproximaban bastante más a cómo una persona se expresa y piensa desde un punto de vista lógico o matemático que le mero código binario o el ensamblador. Los lenguajes de programación de alto nivel incorporaron en seguida las buenas prácticas de la programación estructurada y unos años después de la programación orientada a objetos. Los lenguajes de programación más conocidos, y que se usan abundantemente hoy en día, son lenguajes de alto nivel donde encontramos nombres tan conocidos como C, C++, Java o python.

Con estos lenguajes, el trabajo del desarrollador, en buena medida, se centraba (y se sigue centrando en muchos casos) en traducir la lógica o el algoritmo que él/ella mismo/a ha pensado (o que le ha trasladado el analista que lo ha pensado) a los elementos e instrucciones que le proporciona el lenguaje de programación. Lo que escribe el desarrollador es un texto, un texto expresado en un lenguaje de programación y que se denomina código fuente. Ese texto se traduce luego a binario por medio de los programas compiladores o se ejecuta mediante los intérpretes.

Y, aunque en su visión más básica el desarrollo se puede acometer con poco más que un editor de texto para generar el código fuente y un compilador para traducirlo a binario, lo cierto es que existen muchas capacidades interesantes adicionales para ordenar el código fuente, depurarlo, compartirlo, etc, que lleva a la creación de los denominados IDE ('Integrated Development Environment'), aplicaciones completas con toda una suite de utilidades para uso por parte del desarrollador. De todas formas, en esencia, la parte nuclear del desarrollo sigue siendo el crear el código fuente para expresar una lógica o algoritmo.

Cierto es que desde hace unos años existen las plataformas de desarrollo 'low-code' que incluyen herramientas de aún más alto nivel para que los desarrolladores puedan expresar la mayoría de las veces la lógica que pretenden no como instrucciones de un lenguaje de programación sino como flujos, o diseños visuales y más cercanos a la aplicación final


El fundamento: grandes modelos de lenguaje y generación de código


Pues bien, lo que yo identifico como punto de partida del 'vibe coding' es la capacidad actual de los grandes modelos de lenguaje para generar código fuente.

Ya lo he comentado con cierta frecuencia pero recuerdo de nuevo que un lenguaje de programación es un lenguaje, como el humano, con sus reglas y sus gramáticas. Y digo que igual que el humano pero en realidad es más sencillo, acotado y formal, con las reglas mucho más claras que el lenguaje humano.

Y por ello, en seguida los grandes modelos de lenguaje se han adaptado para la generación de software, para la creación de código fuente. De forma similar a como le solicitas a un modelo generativo que, por ejemplo, te sugiera actividades para el fin de semana, le puedes pedir que te genere un software que haga algo.

Lo 'único' (y pongo 'único' con comillas a propósito) que tienes que hacer es explicarle al modelo de lenguaje en tu instrucción, en tu 'prompt', qué es lo que quieres que haga el programa.

Nótese lo siguiente: más arriba decía que el trabajo fundamental del desarrollador tradicional es traducir a las instrucciones de un lenguaje de programación la lógica que el desarrollador ha pensado o que ha recibido de un analista. Pues bien, cuando se utiliza un modelo generativo para crear el código, no es el desarrollador quien hace la traducción de la lógica a las instrucciones, es el propio modelo generativo quien lo hace.


Una explicación


Buscando profundizar en los planteamientos y herramientas del 'vibe coding' me encuentro finalizando la lectura del libro 'Beyond Vibe Coding: From Coder to AI-Era Developer' de Addy Osmani. En el primer capítulo, el autor expresa esta idea de la siguiente forma:


Imagine writing software by simply describing what you want it to do—almost like talking to a teammate—while an AI translates those ideas into code.


Ahí está el 'quid' de la cuestión: la IA (el modelo de lenguaje) traduce tus ideas en código. Acto seguido, el autor explica, casi define, de una manera un poco más formal, lo que es el 'Vibe coding'.


This is the essence of vibe coding, a prompt-first, exploratory approach where you describe what you want in natural language and let a large language model (LLM) fill in the blanks.


De nuevo se repite la idea: se comienza por un prompt ('prompt-first') en que se describe lo que se desea y es un gran modelo de lenguaje el que genera el código.

A lo mejor el lector avezado nota el uso de los términos 'exploratory' y 'fill in the blanks'.

Ese uso tiene 'más miga' de la que parece, pero de momento me abstendré de entrar en ello.


El origen del término


Esta nueva capacidad de los modelos generativos, de los grandes modelos de lenguaje, está con nosotros, aunque mejorando, desde hace unos años. Pero el término 'Vibe coding' como tal, fue acuñado hace unos meses, en Febrero de este 2025, por Andrej Karpathy, intuyo que sin ser consciente de que ese término iba a hacer fortuna, en un post en la red X en que comenzaba diciendo: 


There's a new kind of coding I call "vibe coding", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It's possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good.


Es interesante la mención a que el desarrollador casi se olvida de que el código existe, puesto que es el LLM el que lo genera. Veremos que ese olvido del código fuente por parte del desarrollador, al menos hoy en día, no es realista del todo, pero como filosofía y aspiración esa es la idea: la inteligencia artificial, a través de uno o varios modelos de lenguaje seguramente especializados, se encarga de generar el código fuente.

Un poco más abajo en el mismo post en X, Karpathy dice:


The code grows beyond my usual comprehension, I'd have to really read through it for a while


De nuevo, como llamada de atención, como explicación de una sensación e, incluso, de una filosofía o una aspiración, la frase es muy interesante y descriptiva pero, de nuevo, veremos que un desarrollador responsable no puede permitirse demasiado que ese código generado por el LLM se escape a su comprensión.


Hasta dónde llega la IA en la generación de código


Dado que el término 'vibe coding' no tiene un origen académico ni mucho menos, ni siquiera es un término surgido de la un fabricante como Open AI o Google, o una gran consultora, su significado y fronteras son algo difusos.

Personalmente, y no sé si con acierto, tiendo a pensar en 'Vibe coding' cuando el LLM asume una gran parte, si no toda, de la generación de una aplicación, un escenario que aunque no es completamente impensable, pero que hoy día tiene serias limitaciones prácticas que ya veremos.

En el libro que mencionaba más arriba, el autor también tiende a reservar el término 'vibe coding' para las situaciones en que la IA se hace cargo de toda gran parte de la generación del código.

Cuando lo que hace la IA es estar integrada dentro de los entornos de desarrollo (los IDEs), y actuar como una suerte de ayudante (un copiloto) para generar pequeñas secciones de código, corregir o hacer sugerencias de corrección de errores, etc, este autor, Addy Osmani, opta por denominarlo una ingeniería de software asistida por IA. Ignoro si Karpathy estaría de acuerdo con esta diferenciación o si para Karpathy toda generación de código mediante una IA es 'Vibe coding'.


Lo de las vibraciones


Un punto que me resulta algo confuso es el por qué Karpathy utiliza este termino 'Vibe' que, creo que la traducción adecuada es 'vibración', pero no vibración en el sentido físico del término sino en el de un ambiente o una sensación (como cuando decimos que algo nos transmite 'buenas vibraciones' o 'buen rollo'). En alguna otra acepción, se podría quizá hablar de relax.

Creo, pero confieso que no estoy seguro, que lo que Karpathy quiere transmitir es que la IA, el LLM, está ahí para ayudarte y, sobre todo, que le pides más o menos (una aplicación completa o sólo una función o la corrección de un error) en función de cómo se encuentre el propio desarrollador.

Admito, no obstante, que no tengo claro cien por cien si ese es el sentido que Karpathy le ha querido dar. Espero averiguarlo en breve.


Conclusiones: la esencia del Vibe coding


En cualquier caso, y como ya decíamos, en la esencia del Vibe coding se encuentra en que la IA, a través de modelos de lenguaje más o menos especializados es ya capaz de asumir y con razonable eficacia muchas tareas de generación de desarrollo software y eso cambia, seguramente de forma radical e irreversible, la disciplina de la ingeniería de software y, sobre todo, la forma en que los desarrolladores tenían hasta ahora de ejercer su labor.

No se acaba aquí la disertación sobre 'Vibe coding'. En próximas fechas hay algún tema más relacionado con el 'vibe coding' y que querría publicar en este medio.