- Este texto es la segunda parte sobre cómo adaptar la experiencia previa de programación al mundo de las computadoras conversacionales (LLM, agentes)
- En la primera parte, "Cómo programar con LLM", se explicó cómo integrar los LLM en herramientas existentes para usarlos como autocompletado o como reemplazo de búsqueda
- Esta vez se comparten experiencias e ideas prácticas sobre la programación basada en agentes, que es más difícil pero también más gratificante
Definición y realidad de los agentes
- Tiene sentido definir qué significa el término "agente" en el contexto de los LLM (modelos de lenguaje grandes)
- Aunque se ha usado durante mucho tiempo como una palabra de moda en la industria de la IA, apenas recientemente se ha consolidado como una estructura realmente útil
- En ese proceso se le ha cargado mucha retórica de marketing y cierto aire de misticismo
- Desde la perspectiva de un ingeniero, ahora se puede definir de forma clara y simple: un agente son 9 líneas de código, es decir, un bucle
for que incluye llamadas a un LLM
- Dentro de ese bucle, el LLM ejecuta instrucciones, puede verificar directamente los resultados y repetir el proceso sin intervención humana
- Puede sonar simple, pero en la práctica esta estructura mejora drásticamente la capacidad de programación frente al uso de un LLM puro
La diferencia entre programar en pizarrón y con agentes
- Supongamos que estás frente a un pizarrón escribiendo con marcador una función en C para validar una cadena UTF-8
- (Es una situación de entrevista que el autor realmente vivió y también una tarea común en entrevistas)
- El éxito o fracaso de esa tarea depende de tu experiencia como programador y de tu capacidad para disimular las limitaciones de no poder consultar fuentes externas
- Hay que recordar las reglas de codificación UTF-8 y tener cuidado de no confundir la sintaxis de C con la de otros lenguajes de la familia C (orden nombre-tipo, tipo-nombre, etc.)
- En el trabajo cotidiano, en cambio, puedes validar el código y encontrar errores con retroalimentación del compilador, búsqueda en documentación,
printfs y muchos otros métodos
- Pedirle a un LLM que escriba código sin un agente se parece a programar en un pizarrón sin ayuda externa
- Es un trabajo de sacar recuerdos vagos, intentar cuadrar la sintaxis de manera ineficiente y evitar errores como imaginar interfaces equivocadas
- El logro técnico de que un LLM genere programas completamente nuevos es impresionante, pero un pizarrón virtual conectado a GPUs no aumenta tanto la productividad real de programación
- Pero, ¿qué pasa si al LLM se le da algo más que un pizarrón virtual?
- ¿Y si puede invocar el compilador, revisar los errores de compilación y corregirse por sí mismo?
- ¿Y si puede leer archivos existentes con
grep y cat, parchear varios archivos —incluidas pruebas unitarias— y repetir las pruebas una y otra vez?
- Eso es exactamente un agente: un LLM guiado por retroalimentación.
Agente = LLM que opera en un entorno con feedback
- Un LLM que, como una persona, funciona bien en un entorno con retroalimentación puede demostrar capacidad real de programación con solo unas cuantas herramientas familiares
bash(cmd): ejecutar comandos de terminal (find, cat, grep, etc.)
patch(hunks): parchear archivos, aplicar cambios de código
todo(tasks): administrar lista de tareas
web_nav(url), web_eval(script), web_logs(), web_screenshot(): navegación web, evaluación, logs, capturas de pantalla, etc.
keyword_search(keywords): búsqueda por palabras clave
codereview(): revisión de código
- Con la herramienta
bash, puede explorar eficientemente una base de código e incluso automatizar control de versiones con git add/commit
- A diferencia de un LLM que solo genera código sin estas herramientas, un agente tiene ventajas claras
- Mayor precisión en el uso de APIs (busca documentación y la incorpora directamente al contexto)
- Menos errores de sintaxis e interfaces gracias al feedback del compilador
- Mejor manejo de dependencias y versiones (puede identificar características de versiones específicas)
- Detección de errores mediante fallas en pruebas y mayor hábito de escribir código de prueba
- Procesamiento de bases de código más allá de la ventana de contexto (lee selectivamente solo lo necesario)
- Experimentación directa con resultados de ejecución: ejecutar código, recibir feedback de capturas de pantalla del navegador, ajustar CSS automáticamente, rastrear errores con logs del servidor y agregar pruebas
- También hay desventajas
- Una solicitud de una sola frase puede generar decenas de miles de tokens intermedios (llamadas a herramientas, búsquedas web, repeticiones de pruebas, etc.), y el trabajo puede tardar varios minutos o más
- También hay costo por llamadas a APIs, aunque se espera que eso vaya perdiendo peso con la mejora del hardware
- En última instancia, el trabajo intermedio lo hacen CPU/GPU, ahorrando tiempo al desarrollador y permitiéndole terminar más programas de los que quería escribir
- En la práctica, es fácil introducir agentes en un proyecto y probarlos con tareas pequeñas para revisar los resultados
Ejemplo: desarrollo de autenticación para Github App
- Este es un caso real en el que se usó un agente para implementar el flujo de autenticación de Github App en sketch.dev
- Con solo 3 o 4 rondas de feedback se completó rápidamente todo el flujo de autenticación
- Cuando aparecía un error o una condición nueva, bastaba explicarlo con una frase y el agente mejoraba de inmediato el código y el comportamiento
- Ayudó mucho a mantener el impulso de productividad al reducir al mínimo el "trabajo tedioso" de la vida real: integraciones repetitivas de API, sistema de build, gestión de paquetes, configuración de librerías, etc.
- En los requisitos iniciales se incluyó “usar solo la autenticación global de la app sin guardar tokens por usuario”, y el agente lo implementó así
- Pero como resultado apareció una vulnerabilidad de seguridad grave (cualquiera podía ver todos los repositorios)
- Al darle feedback con una sola frase explicando el problema, introdujo de inmediato una verificación de permisos por usuario y generó un commit corregido
- Después surgió un problema de rendimiento
- De hecho, el número de palabras usadas para explicar este proceso en el artículo fue mayor que el total de palabras ingresadas en Sketch para obtener el código de autenticación
- En pocas palabras, hoy los agentes todavía no están al nivel de reemplazar a un desarrollador, pero sí ayudan a hacer en un solo día trabajos repetitivos que tradicionalmente tomarían varios días
- El grado de automatización llega a permitir que el desarrollador siga avanzando “mientras limpia el cuarto de su hijo”
Ejemplo: aplicar reglas SQL basadas en JSON
- Uno de los trabajos que el agente hacía con frecuencia era aplicar un estilo peculiar de SQL aprendido en Tailscale
- En todas las tablas, solo hay una columna real (datos JSON), y el resto se maneja como generated columns derivadas de ese JSON
- Estructura de tabla de ejemplo:
CREATE TABLE IF NOT EXISTS Cookie (
Cookie TEXT NOT NULL AS (Data->>'cookie') STORED UNIQUE, -- PK
UserID INTEGER NOT NULL AS (Data->>'user_id') STORED REFERENCES User (UserID),
Created INTEGER NOT NULL AS (unixepoch(Data->>'created')) STORED,
LastUsed INTEGER AS (unixepoch(Data->>'last_used')) CHECK (LastUsed>0),
Data JSONB NOT NULL
);
- Este enfoque cumple una especie de papel de poor man’s ORM, facilita ampliar el esquema y hace que las restricciones SQL ayuden a validar la calidad de los datos JSON
- La desventaja es que aumenta la cantidad de datos almacenados por fila y que todos los
INSERT/UPDATE deben hacerse a nivel de JSON
- Sin embargo, el agente no siempre seguía este estilo de forma consistente
- Al crear tablas nuevas generalmente lo hacía bien, pero cuando había excepciones se confundía o cambiaba el estilo arbitrariamente
- Solución simple: agregar una explicación de 3 oraciones al inicio del archivo de esquema SQL
- Se añadió una frase clave: “cada tabla tiene una sola columna JSON real llamada Data y todas las demás columnas derivan de ahí”
- En las tablas que no seguían esta regla, se indicaba explícitamente en comentarios que eran excepciones
- Después de eso, el comportamiento del agente mejoró de forma notable
- Lo interesante es que este tipo de explicación y comentarios, que los ingenieros humanos suelen ignorar o considerar de poca utilidad,
- sí son aprovechados activamente por agentes basados en LLM al escribir código
- con solo documentar bien, la calidad de la generación de código mejora de manera evidente
El modelo de código como “activo” y “deuda”
- Una crítica común a las herramientas de generación de código basadas en LLM es que generar código en sí representa solo una fracción mínima del costo total del software
- En realidad, la mayor parte del tiempo se va en manejar dependencias del código existente, acoplamientos e interfaces complejas
- En productos grandes, antiguos y con muchos usuarios, el costo de mantenimiento es abrumador
- En ese entorno, pedirle a un LLM “escribe bubble sort en Fortran” puede sentirse como un juguete o una molestia inútil
- A veces se compara con los conceptos financieros de “activo/deuda”, aunque esa analogía tampoco encaja del todo
- Sin embargo, no toda la ingeniería de software consiste en proyectos grandes y de largo plazo
- La mayoría de los programas tienen pocos usuarios o una vida corta
- No se debe extrapolar la experiencia de mantenimiento a gran escala como si definiera toda la industria
- El valor de los agentes no se limita a generar código
- Combinan varias herramientas con LLM para automatizar el cambio mismo: leer código, editar archivos, borrar o modificar código
- Así como agregan código, también eliminan código y refactorizan con naturalidad
- Al final, el objetivo del ingeniero es el cambio
- Aunque el proceso exige trabajo adicional para que quien conduce entienda el cambio, los agentes ya muestran capacidad para producir cambios graduales incluso en proyectos de tamaño mediano
- Aunque todavía no sea suficiente, están avanzando rápido en la dirección correcta
- También existe la opinión de que los lenguajes complejos y los sistemas de build actúan como barrera de entrada para un proyecto
- Algunos sostienen que, si herramientas que facilitan escribir código (LMM, type safety, garbage collection, gestión de paquetes, agentes, etc.) reducen esa barrera, podría bajar la calidad
- Si el objetivo es frenar el ritmo del cambio o aumentar el control, entonces herramientas de automatización como los agentes no encajan
¿Por qué agentes ahora?
- A diferencia de principios complejos de IA como los transformers, poner un ciclo de retroalimentación en un LLM es un enfoque intuitivamente claro
- Para quien piensa en herramientas para desarrolladores, parece una dirección de evolución natural
- De hecho, hace un año la primera versión de sketch.dev apenas conectaba herramientas de Go a un LLM, pero comparada con los agentes actuales hay una gran diferencia en utilidad práctica
- Incluso en ML, el aprendizaje por refuerzo (aprendizaje basado en feedback) ha sido un principio básico durante más de 50 años
- La aparición real de los agentes está directamente ligada a la evolución de los LLM
- En 2023, los LLM tenían capacidades pobres de uso de herramientas, así que su papel como agentes era limitado
- En 2025, los LLM ya están optimizados para llamadas a herramientas y trabajo iterativo, lo que hace posible el uso práctico de agentes
- Los modelos frontier (comerciales de última generación) llevan una gran ventaja sobre los modelos abiertos en capacidad de uso de herramientas
- Se espera que en los próximos 6 meses los modelos abiertos los alcancen
- La capacidad de hacer llamadas repetitivas y útiles a herramientas es el mayor cambio de los LLM modernos
Hacia dónde va esto: contenedores y ejecución en paralelo
- El campo de los agentes LLM aún está en una etapa temprana y de cambios rápidos que la mayoría de los ingenieros todavía no ha adoptado de forma real
- Por ahora, los agentes se usan sobre todo para funcionar dentro del IDE o en repositorios locales
- Se puede empezar fácilmente instalando un fork de VSCode o una herramienta de línea de comandos
- Pero hay dos limitaciones importantes
- Primero, falta de protecciones: existe riesgo de exponer información sensible como credenciales de producción guardadas en la computadora real
- Si el agente ejecuta comandos no deseados, como scripts de despliegue, puede provocar incidentes de seguridad graves
- Aunque se pide confirmación manual para cada comando, sigue existiendo la posibilidad de exponer datos sensibles por error
- Segundo, limitaciones para paralelismo y automatización: como cada desarrollador debe ejecutar solo un agente a la vez en su propio entorno,
- si cada ejecución tarda varios minutos, resulta difícil avanzar varias tareas al mismo tiempo y se vuelve ineficiente
- En sketch.dev están intentando resolver esto con un entorno de contenedores
- Se crea un contenedor de desarrollo aislado para cada tarea, se clona el código fuente y solo se extraen al exterior elementos como commits de git
- Eso permite ejecutar varios agentes a la vez, y otros proyectos también están explorando esta misma idea
- Caso real: mientras se trabajaba en la autenticación de Github, se mejoró al mismo tiempo la UI de un formulario en una sesión separada de agente
- Sin registrar nada en un issue tracker aparte, se dio feedback de diseño con una captura de pantalla y una sola línea de solicitud breve
- La experiencia fue la de obtener resultados razonables con apenas 30 segundos de inversión
- Resultado de experimentos de UX durante los últimos 6 meses:
- Se llegó a la conclusión de que los contenedores (entornos de ejecución aislados) son lo más práctico para el desarrollo basado en agentes
¿En qué se convierte el IDE?
- En un entorno de desarrollo basado en agentes, qué papel tendrá el IDE (entorno de desarrollo integrado) sigue siendo una pregunta abierta
- El flujo real de trabajo puede llegar a ser: escribir instrucciones para el agente, ejecutarlo en un contenedor, revisar los cambios como diff y hacer push en una rama o PR
- En la práctica, la mayoría de los commits generados por el agente necesitan cierto nivel de pulido humano
- Al principio, casi todos los commits requieren corrección manual, pero conforme mejora la habilidad para redactar prompts, la cantidad de correcciones va bajando
- Las correcciones pueden ir desde editar comentarios o cambiar nombres de variables hasta refactors más complejos
- La cuestión clave es cómo hacer este tipo de ajustes de forma eficiente dentro del entorno de contenedores
- Flujo de trabajo que se está probando en sketch.dev y otros
- Interfaz que permite editar directamente la vista de diff
- Si editas directamente el código en el lado derecho de la pantalla de diff de Sketch, el cambio se refleja en ese commit y se hace push de inmediato
- Esto es muy eficiente para cambios pequeños de una sola línea
- Acceso SSH al contenedor
- Puedes entrar directamente con shell o manipular el código desde una terminal web
- También se puede abrir con una URL
vscode:// para trabajar en un IDE tradicional
- Comentarios estilo code review directamente sobre el diff para enviar feedback al agente
- Aprovechando la experiencia de revisión de código, se pueden comunicar explicaciones o requisitos con una entrada mínima
- Balance general
- El entorno de contenedores integra generación, modificación, validación y revisión de código,
haciendo posible un verdadero desarrollo basado en agentes más allá de solo escribir código
- Antes no quería desarrollar dentro de contenedores,
pero la experiencia de limpiar y ajustar en un contenedor los diffs generados por un agente ha resultado muy interesante y productiva
Cierre
- El proceso de aprender y experimentar con tecnología basada en LLM ha sido una lección de humildad
- Antes también resultaba emocionante cuando cambiaba la naturaleza de la programación con cosas como multicore, SSDs o expansión de redes,
pero los LLM, y especialmente los agentes, están rehaciendo por completo el “proceso mismo” de programar
- A diferencia de cambios que influían en algoritmos, lenguajes o selección de librerías,
los agentes obligan a reexaminar de raíz todos los supuestos sobre la forma de trabajar
- A veces el cambio es tan grande que uno llega a pensar: “quizá sería mejor volver a aprender desde cero, como si no supiera nada de programación”
- Y este cambio sigue ocurriendo ahora mismo
- La manera en que lo estamos viviendo hoy ya es totalmente distinta de hace 6 meses, y ni siquiera se ha estabilizado todavía
- Parece probable que pronto cambien mucho también los estándares de cultura de desarrollo, como la colaboración en equipo y el review
- Por ejemplo, el code review que se hacía de forma meramente ritual ya no está resolviendo problemas reales
- Es momento de reinventar el proceso mismo de revisión de código
- Lo mismo pasa con el IDE: más que seguir defendiendo su integración tradicional, llegó la hora de rehacerlo por completo
- La industria ya reconoce este cambio, pero el enfoque centrado en agentes apenas está comenzando
- Se anticipan cambios aún mayores,
y la curiosidad y la humildad son probablemente la mejor forma de atravesarlos bien
- Incluso ahora quizá sea mejor alejarse de los foros de internet sobre tecnología,
y dejar este tipo de discusiones y resúmenes también en manos de agentes
1 comentarios
Opinión de Hacker News
Como yo programo principalmente solo para mis propias herramientas, no termino de ver el gran mérito de que otra persona o alguna otra cosa escriba el código por mí y luego yo tenga que leerlo, entenderlo y corregirlo; claro, pedirle a un LLM que encuentre en la documentación del API la parte que necesito sí es bastante útil y ahorra tiempo, así que independientemente de si su rendimiento futuro mejora o no, simplemente no me gusta mucho leer código ajeno
Estoy completamente de acuerdo con la parte donde el autor dice que el code review es deficiente y casi nunca funciona bien. En una era donde los agentes escriben código, el cuello de botella real no es escribir sino leer código. Si la gente revisa por encima o usa el review solo para mostrar gustos personales, los agentes pueden meter fácilmente problemas graves de seguridad o de rendimiento. Sinceramente, el problema real muchas veces ni siquiera se ve leyendo el código: hace falta depurarlo a mano o validar supuestos
Por fin siento que vi un análisis realista sobre los LLM. El término “agente” me desespera un poco porque en la práctica no es mucho más que ponerle nombre a un
forloop que llama recursivamente a un LLM, pero como el talento para nombrar cosas en esta industria tampoco es muy alto, lo aceptoSobre la parte de “todos estamos de acuerdo en que los contenedores son útiles y necesarios en programación”, esto explica por qué Solomon Hykes, creador de Docker, abrió recientemente como open source el proyecto Container Use: para que los agentes puedan ejecutarse en paralelo de forma segura. Algunas plataformas, como Sketch, ya traen entornos de desarrollo locales aislados, pero otros agentes de programación no; además recomiendo este video de YouTube
El loop agéntico, el cerebro dentro de la máquina, me parece en esencia un reemplazo del motor de reglas. Todavía tiene desventajas propias, pero creo que varias personas importantes ya dieron en el clavo. “Conectas herramientas al agente, lo prompeas a partir de la solicitud del usuario, lo pones a correr en loop, y hasta el prompt mismo cambia dinámicamente según la situación”. Sin necesidad de imitar de forma deliberada la interacción o el razonamiento humano, eso ya resulta bastante útil para orquestación, múltiples etapas y automatización o reemplazo de tareas ambiguas. Antes había que programar la ambigüedad manualmente, y ahora quizá eso desaparezca. En producción todavía preocupa ejecutarlo sin
dry run, pero supongo que las herramientas y servicios van a evolucionar. Si más de 100 servicios similares se conectan con una interfaz consistente al mundo exterior (p. ej., SMS, correo, clima, redes sociales, etc.), creo que saldrá un asistente muchísimo más potente, o incluso algo más que esoLeer código siempre fue tan importante como escribirlo, pero ahora lo es cada vez más. Es mi pesadilla. Escribir código a veces es divertido; leerlo siempre es trabajo
Me pregunto cuánta gente que usa agentes realmente disfruta “programar”, es decir, pensar cómo resolver problemas y la diversión misma de expresarlo en código. Cuando veo mucho trabajo actual con agentes, siento que ese proceso desaparece y se reemplaza por explicar requisitos en lenguaje natural y luego solo esperar que el LLM no meta bugs
Hay algunas áreas donde me gusta usar AI al programar (¡de verdad lo escribí yo!):
divespecífico dentro de un WordPress complicado se vuelve algo rápido después de unos pocos intentosLa parte sobre “activo” y “pasivo” me pareció interesante, pero no estoy de acuerdo. Muchos programas empiezan para unos pocos usuarios y luego terminan convirtiéndose en proyectos grandes. He visto demasiadas veces código científico escrito rápidamente para un solo uso que, sin querer, acaba creciendo durante años y extendiéndose muchísimo. Por eso yo escribo mi código pensando en que dure más tiempo y abarque más, incluso por consideración hacia mí mismo y hacia otras personas. Si alguna vez viste cómo un side project personal de un colega fue ascendido por un manager a proyecto del equipo, seguro entiendes este problema
Creo que usar LLM no para escribir o diseñar código sino para hacer code review podría ser la verdadera killer feature. Ahora mismo el code review está roto en muchos sentidos, y espero que en el futuro crezca mucho su utilidad para seguridad, comportamiento indefinido, mal uso de funcionalidades y doble verificación de warnings del compilador. En lo personal, uso más los LLM como si fueran un buscador para diagnosticar errores o depurar, con una tasa de acierto de alrededor del 50%, y me parece suficientemente buena
code review/design, ya existe un LLM especializado en code review dentro de GitHub Copilot, en modo revisor. Todavía no está al máximo nivel, pero tiene calidad suficiente como para usarlo dentro del loop