Apr. 15, 2025
Codificación Vibe
Sobre el poder y el peligro de programar con IA
Facturando más de $48 mil al mes, el juego de simulador de vuelo de Pieter Levels impulsó una oleada de innovación. Sin un conocimiento detallado de la tecnología de motores de juegos 3D, él 'codificó por vibra' su juego usando IA. Los críticos de su trabajo señalaron problemas de seguridad y escalabilidad, mientras que los defensores elogiaron el asombroso resultado. ¿Qué podemos aprender de esto?
Codificación por ambiente
La codificación por ambiente es un método de programación impulsado por IA donde describes un problema en unas pocas frases como una solicitud para un modelo de lenguaje ajustado para la codificación. El modelo genera software, cambiando el rol del programador a guiar, probar y refinar el resultado. Los defensores afirman que permite a los programadores novatos crear programas sin una amplia capacitación o habilidades de ingeniería de software.
Pieter Levels creó el juego fly.pieter.com. En las redes sociales mantuvo un registro abierto de sus esfuerzos: desde su idea inicial hasta la publicación. Atrajo patrocinadores para anuncios dentro del juego y vende mejoras premium (como aviones especiales) en su juego, recaudando miles de dólares cada mes.

Su historia de éxito planteó preguntas sobre el futuro de la programación de juegos, o incluso de la programación en general. Si una persona con una computadora portátil puede crear un gran éxito como este, ¿cuál es la necesidad de estudios de gran presupuesto? O, preguntado inversamente, ¿qué pasaría con los estudios de gran presupuesto si adoptaran un enfoque de "codificación por ambiente" similar para la producción?
Probándolo yo mismo
Teniendo algo de experiencia en el desarrollo de a game yo mismo (Snake 97, más de 40 millones de descargas), la historia de Pieter me inspiró a investigar la tecnología 3D que usó para su juego: ThreeJS. Construir un juego es difícil, hacerlo en 3D es aún más difícil. Las matemáticas que sustentan un mundo en tres dimensiones agregan un desafío adicional. En muchos sentidos, es diferente a los programas ordinarios o a los juegos bidimensionales simples. Aunque he hecho algunos experimentos antes, encontré la curva de aprendizaje de las matemáticas 3D bastante pronunciada. Aquí es donde la IA puede ayudar.

Para Gran Fondo app usé la IA para generar una three dimensional presentation of a recorded running activity. Formulé mi objetivo en lenguaje sencillo y el modelo de IA generó el código necesario para usar ThreeJS para mostrar mi entrenamiento en un panel giratorio. Los resultados iniciales no fueron buenos, pero entendí lo suficiente de los resultados generados para continuar pidiendo refinamientos específicos. Algunas horas más tarde tenía algo que me gustaba, pero además sentía que había aprendido mucho sobre la viabilidad de mi concepto inicial. La IA me permitió aprender más rápido.

Decidí explorar otra idea que había dejado de lado por algún tiempo: un juego sobre partículas de colesterol buenas y malas en el torrente sanguíneo de una persona. Con aspectos de un endless runner-style game, pensé que esto sería una buena opción para seguir experimentando, ya que estos juegos cuentan con niveles generados por computadora. Construir un generador de niveles automatizado parece algo con lo que la IA podría ayudarme.
Aprovechando las nuevas capacidades 3D, pensé que el juego debería moverse dentro de las arterias en lugar del movimiento lateral común en los juegos 2D clásicos. Esto introduce desafíos como el recorte visual, gráficos distorsionados debido a que la posición de la cámara está fuera de la escena 3D. Otro desafío es la mayor complejidad de la detección de colisiones de los elementos del juego, un requisito para la mecánica del juego. El código generado por el modelo de IA creció y creció con cada iteración.

Después de unas 800 líneas de código, comencé a experimentar las limitaciones del modelo de IA, ya que comenzó a cometer errores y fallos que había resuelto en iteraciones anteriores. Cada nueva iteración introducía nuevos problemas y el modelo seguía olvidando los refinamientos y las correcciones que había aplicado anteriormente. Esto se debe a los límites de las capacidades de contexto (tokens de entrada) que se importan para que los modelos de lenguaje grandes funcionen. En pocas palabras: no puede recordar lo suficiente como para continuar iterando sobre todo a la vez.

Dejé de desarrollar el motor del juego usando IA después de algunos días de experimentación intensa. Llegué a un punto en el que estaba poniendo más esfuerzo en administrar el modelo de IA que en el motor del juego en sí. Pensé que simplemente sería mejor conseguir algunos libros sobre las tecnologías, leerlos, volverme más competente yo mismo y luego construir el motor del juego a mano. Cuando las cosas se vuelven complejas, nuestros cerebros humanos parecen ser capaces de concentrarse en partes específicas de una tarea compleja mientras respetan el conjunto más amplio tal como es.
Sobre la locura de la "Programación en lenguaje natural"
Además de los límites en el contexto que un modelo de IA puede comprender, creo que existe el problema de la ambigüedad. Recomiendo leer las palabras de Edsger Wybe Dijkstra, reflexionando sobre la locura de la "programación en lenguaje natural" en su EWD667. Una descripción inequívoca, libre de pensamientos confusos, forma la base del código confiable. Sin embargo, nuestra lengua materna deja demasiado espacio para todo tipo de tonterías y errores. En su lugar, deberíamos dominar nuestras palabras, pensar con agudeza y especificar con audacia.
Un lenguaje formal, como un lenguaje de programación o un modelo matemático o una especificación exhaustiva de entrada y salida, podría ser una herramienta increíblemente eficaz para descartar la ambigüedad y los errores. En pocas palabras: obtendrás el mejor resultado cuando proporciones la mejor entrada.
Solicitando a la IA con código
Para probar si la IA me daría un mejor código, decidí cambiar mi lenguaje de solicitud. En lugar de describir lo que quería en lenguaje natural, subí un fragmento de código que escribí anteriormente, con algunas características muy específicas:
- el código provenía de un sistema de producción, sabía que funcionaba bien
- el código contenía varias declaraciones de manejo de errores, lo que aumentaba su robustez
- el código no contenía errores de sintaxis y utilizaba variables y funciones con nombres lógicos
- el código tenía un alcance muy específico, con interfaces claramente definidas con el mundo exterior
Además del código, le pedí específicamente a la IA que cambiara un aspecto particular del código en cuestión. Tenía que eliminar el uso de un determinado programa externo (el módulo NodeJS 'lwip') y reemplazarlo por otro programa externo (ImageMagick). Debido a que tanto lwip como ImageMagick son código abierto, el modelo de IA conoce bien estos programas. Le di la receta perfecta para su cocina.
El código que obtuve de la IA fue un reemplazo perfecto del 99% para mi propio código. El código generado tenía un error que causaba que algunos parámetros no se escaparan correctamente, lo que provocó un fallo. Pude detectar el error manualmente y corregirlo a mano, ya que me sentía completamente cómodo y conocedor dentro del contexto de este software específico. Después de algunas pruebas más, decidí poner en producción el código generado por la IA, ya que la nueva biblioteca funcionó mucho mejor que la que reemplazó.
Conclusión
La codificación por ambiente con IA permite la creación rápida de prototipos y el aprendizaje, como se ve en el éxito de Pieter Levels, pero falla con proyectos complejos que requieren precisión. Plantea una pregunta: ¿la IA amplía nuestro potencial o nos limita a sus limitaciones? La maestría combina el pensamiento humano con el poder de la IA. Reflexione sobre la artesanía: ¿cuándo las herramientas agudizan su habilidad y cuándo podrían desafilarla?