Sunday, June 14, 2026

Cómo evitar la sobreingeniería cuando trabajas con agentes

Uno de los problemas más frecuentes al trabajar con agentes no es que produzcan soluciones incorrectas.

Muchas veces ocurre exactamente lo contrario.

La solución funciona.

Pero es innecesariamente compleja.

Lo que podría resolverse con una función termina convertido en un framework. Lo que requería una clase termina distribuido en múltiples capas. Lo que necesitaba una consulta SQL termina envuelto en patrones, abstracciones y componentes adicionales.

Si has trabajado algunos días con agentes de desarrollo, probablemente ya has visto este comportamiento.

El modelo no siempre busca la solución más simple.

Con frecuencia busca la solución más completa.

Y ambas cosas no son equivalentes.

Por qué los agentes tienden a sobreingenierizar

Los modelos fueron entrenados con enormes cantidades de código, documentación técnica, artículos de arquitectura, patrones de diseño y proyectos open source.

Como resultado, suelen conocer muchas formas sofisticadas de resolver un problema.

Cuando el requerimiento es ambiguo, el agente tiende a asumir escenarios futuros que nadie pidió.

Empieza a prepararse para:

  • Escalabilidad futura.
  • Posibles extensiones.
  • Nuevos tipos de usuarios.
  • Casos hipotéticos.
  • Requerimientos que todavía no existen.

En otras palabras, comienza a resolver problemas imaginarios.

El resultado suele ser más código, más complejidad y más mantenimiento.

La regla más importante: resolver el problema actual

Existe una técnica extremadamente efectiva para reducir la sobreingeniería.

Consiste en obligar al agente a trabajar únicamente sobre el problema presente.

Por ejemplo:

Resuelve únicamente el requerimiento descrito. No agregues extensiones, puntos de configuración, abstracciones o funcionalidades para posibles necesidades futuras.

Esta instrucción parece simple.

Pero cambia radicalmente el comportamiento del modelo.

La mayoría de los excesos aparecen cuando el agente intenta anticipar el futuro.

Eliminar esa necesidad reduce gran parte de la complejidad innecesaria.

Haz que justifique cada capa adicional

Una práctica útil consiste en pedir al agente que justifique cualquier elemento que incremente la complejidad de la solución.

Por ejemplo:

Toda nueva abstracción debe tener una justificación clara. Si no existe un beneficio inmediato y demostrable, utiliza la alternativa más simple.

Esto obliga al modelo a pensar antes de agregar:

  • Interfaces.
  • Patrones de diseño.
  • Capas de servicios.
  • Configuraciones adicionales.
  • Mecanismos de extensibilidad.

Muchas veces descubrirá que no son necesarios.

Pide siempre la solución más simple primero

Los agentes suelen responder con la primera solución que consideran técnicamente sólida.

Pero no necesariamente es la más sencilla.

Por eso resulta útil agregar una restricción explícita:

Antes de implementar, identifica la solución más simple que cumpla completamente el requerimiento.

Esta pequeña instrucción suele generar resultados sorprendentemente mejores.

Obliga al modelo a evaluar simplicidad como un criterio de calidad.

No únicamente corrección técnica.

La complejidad tiene un costo

Cuando un desarrollador escribe código adicional, normalmente piensa en el beneficio que aporta.

Pero muchas veces olvida el costo que introduce.

Lo mismo ocurre con los agentes.

Cada nueva capa implica:

  • Más código que mantener.
  • Más puntos de fallo.
  • Más pruebas.
  • Más tiempo de comprensión.
  • Más dificultad para nuevos miembros del equipo.

La pregunta correcta no es:

¿Puede hacerse?

Sino:

¿Realmente necesitamos hacerlo?

Desconfía de las arquitecturas para un futuro hipotético

Una de las señales más claras de sobreingeniería aparece cuando el agente comienza a prepararse para escenarios que todavía no existen.

Por ejemplo:

  • Diseñar para múltiples proveedores cuando solo existe uno.
  • Crear sistemas de plugins cuando no hay extensiones planificadas.
  • Implementar arquitecturas distribuidas para una aplicación pequeña.
  • Agregar decenas de configuraciones que nunca serán modificadas.

Este comportamiento suele parecer profesional.

Pero muchas veces genera más problemas de los que resuelve.

La mejor arquitectura para hoy suele ser la que resuelve el problema de hoy.

Utiliza el principio YAGNI

Existe un principio muy conocido dentro del desarrollo de software:

YAGNI (You Aren't Gonna Need It).

Su idea es simple.

No implementes algo hasta que realmente sea necesario.

Este principio funciona extraordinariamente bien con agentes.

Puedes convertirlo en una regla explícita:

Aplica YAGNI en todas las decisiones de diseño. No implementes funcionalidades, extensiones o puntos de configuración que no sean requeridos actualmente.

Muchos equipos descubren que esta única instrucción reduce significativamente la complejidad generada por la IA.

La simplicidad también es una característica de calidad

Existe una creencia equivocada en ingeniería de software.

Algunas personas asumen que una solución compleja demuestra mayor capacidad técnica.

La experiencia suele mostrar lo contrario.

Las mejores soluciones suelen ser aquellas que:

  • Son fáciles de entender.
  • Son fáciles de probar.
  • Son fáciles de modificar.
  • Resuelven exactamente el problema requerido.

La simplicidad no es falta de ingeniería.

Es una forma de ingeniería.

Conclusión

Los agentes tienen una enorme capacidad para construir soluciones sofisticadas.

Pero la sofisticación no siempre aporta valor.

Cuando trabajes con agentes, recuerda que el objetivo no es producir la solución más impresionante.

El objetivo es producir la solución correcta con la menor complejidad posible.

Definir límites claros, aplicar YAGNI, exigir justificaciones para cada capa adicional y priorizar la simplicidad permite obtener sistemas más mantenibles y más fáciles de evolucionar.

Porque en ingeniería de software, la mejor solución rara vez es la más compleja.

Generalmente es la más simple que resuelve el problema.

Límites y estructura: cómo trabajar con agentes sin perder el control

En el artículo anterior vimos 8 técnicas de prompting que ayudan a obtener mejores resultados de un modelo. Sin embargo, cuando comenzamos a utilizar agentes para tareas más complejas, aparece un problema diferente.

Ya no basta con escribir buenos prompts.

Ahora necesitamos diseñar un entorno donde los agentes trabajen con reglas claras, responsabilidades definidas y límites explícitos.

La diferencia es similar a la que existe entre un desarrollador escribiendo una función y un equipo completo trabajando sobre un producto.

Mientras más autonomía tenga el sistema, más importante se vuelve la estructura.

El problema de la libertad excesiva

Cuando empezamos a trabajar con agentes solemos asumir que más libertad significa mejores resultados.

La realidad suele ser la contraria.

Un agente con demasiada libertad puede:

  • Modificar cosas que no debía tocar.
  • Tomar decisiones fuera de su responsabilidad.
  • Cambiar arquitecturas completas para resolver problemas simples.
  • Generar soluciones inconsistentes entre sí.
  • Desviarse del objetivo original.

En otras palabras, el agente no falla porque sea incapaz.

Falla porque no conoce los límites dentro de los cuales debe operar.

Lo mismo ocurriría con un desarrollador nuevo que recibe la instrucción:

Haz lo que creas conveniente.

Probablemente trabajará mucho, pero no necesariamente en la dirección correcta.

Los agentes funcionan mejor dentro de un sistema

Una idea común es pensar que el prompt es el centro del trabajo con IA.

En realidad, el prompt es solo una pieza.

Lo que produce resultados consistentes es el sistema completo:

  • Reglas.
  • Restricciones.
  • Roles.
  • Flujo de trabajo.
  • Criterios de aceptación.

Cuando observamos equipos de ingeniería maduros, vemos exactamente el mismo patrón.

Los desarrolladores no trabajan únicamente con instrucciones verbales.

Trabajan dentro de un conjunto de normas:

  • Convenciones de código.
  • Arquitectura definida.
  • Estándares de calidad.
  • Revisiones de código.
  • Pruebas automatizadas.

Los agentes también necesitan ese contexto.

Define responsabilidades explícitas

Uno de los errores más comunes consiste en asignar demasiadas responsabilidades a un único agente.

Por ejemplo:

Analiza el requerimiento, diseña la solución, implementa el código, escribe pruebas y revisa la arquitectura.

Puede funcionar.

Pero generalmente funciona mejor cuando cada responsabilidad está claramente separada.

Por ejemplo:

  • Agente Analista.
  • Agente Diseñador.
  • Agente Implementador.
  • Agente Revisor.

Cada uno recibe un objetivo específico.

Esto reduce ambigüedad y facilita detectar errores.

Cuando algo sale mal, resulta evidente dónde ocurrió el problema.

Las reglas deben ser concretas

Muchas personas escriben reglas demasiado generales.

Por ejemplo:

Escribe código de calidad.

¿Qué significa exactamente calidad?

La interpretación puede variar enormemente.

Una mejor regla sería:

  • No modificar archivos fuera del alcance de la tarea.
  • Mantener compatibilidad con las pruebas existentes.
  • No introducir nuevas dependencias sin justificación.
  • Seguir la arquitectura actual.
  • Generar pruebas automatizadas para cambios funcionales.

Mientras más observable sea una regla, más fácil será cumplirla.

Limita el espacio de decisión

No todas las decisiones deben quedar abiertas.

Supongamos que una organización utiliza:

  • ASP.NET Core
  • Entity Framework Core
  • SQL Server

No tiene sentido que el agente evalúe:

  • Node.js
  • Django
  • Spring Boot
  • PostgreSQL
  • MongoDB

Ese trabajo ya fue resuelto anteriormente por el equipo.

Una buena instrucción podría ser:

Las decisiones tecnológicas ya están tomadas. Trabaja únicamente dentro del stack existente.

Este tipo de restricciones reduce ruido y mejora la velocidad de ejecución.

La diferencia entre restricciones y microgestión

Algunas personas creen que limitar a un agente reduce su utilidad.

No necesariamente.

Existe una diferencia importante entre:

Restricciones

y

Microgestión.

Una restricción define el marco de trabajo.

Por ejemplo:

No modificar la arquitectura existente.

La microgestión intenta controlar cada detalle.

Por ejemplo:

Escribe exactamente 14 líneas en cada método y utiliza tres variables locales.

Las restricciones útiles reducen errores.

La microgestión reduce capacidad de adaptación.

Utiliza listas de verificación

Los agentes responden muy bien a checklists.

Antes de ejecutar una tarea, puedes pedirles validar condiciones específicas.

Por ejemplo:

Antes de generar código:

  • ¿Entendiste el requerimiento?
  • ¿Existe una solución más simple?
  • ¿La implementación respeta la arquitectura actual?
  • ¿Se requieren pruebas?
  • ¿Se está modificando algo fuera del alcance?

Este pequeño mecanismo suele prevenir muchos errores antes de que ocurran.

Piensa como un arquitecto de sistemas

Cuando trabajamos con agentes, dejamos de ser únicamente usuarios de IA.

Pasamos a diseñar sistemas donde la IA opera.

La pregunta deja de ser:

¿Cuál es el mejor prompt?

Y se transforma en:

¿Cuál es el mejor entorno para que este agente trabaje?

Ese cambio de mentalidad suele marcar una gran diferencia.

Los equipos que obtienen resultados consistentes no dependen de prompts mágicos.

Construyen estructuras claras donde los agentes pueden tomar decisiones sin salirse del camino.

Conclusión

La calidad de un agente no depende únicamente de su modelo.

También depende del sistema que construimos alrededor de él.

Definir límites claros, separar responsabilidades, establecer reglas concretas y reducir el espacio de decisión permite obtener resultados más predecibles y más útiles.

Los agentes no necesitan libertad absoluta.

Necesitan un marco de trabajo bien diseñado.

Y, al igual que ocurre en los equipos de ingeniería, las mejores soluciones suelen aparecer cuando existe suficiente autonomía para actuar, pero también suficiente estructura para mantener el rumbo.

Tuesday, June 9, 2026

8 técnicas de prompting que te ahorran bugs (y horas) cuando trabajas con agentes

En los artículos anteriores cerramos una idea: tu trabajo no es escribir más rápido, es decidir mejor. Aprendimos qué delegar y qué retener usando tres filtros —claridad, precisión y control— y repetimos el principio que sostiene toda la serie: conserva el pensamiento, delega la escritura.

Pero hay un problema práctico. Puedes tener clarísimo qué quieres delegar y aun así obtener basura, porque el prompt es el contrato entre tu pensamiento y el agente. Si el contrato es vago, el agente rellena los huecos con suposiciones, y esas suposiciones se convierten en bugs que tú vas a tener que cazar después.

Este artículo abre un nuevo bloque de la serie —técnicas, reglas y control— y empieza por lo más cercano al teclado: cómo pedir las cosas. No son trucos para "engañar" al modelo. Son hábitos para que el agente trabaje dentro de tus reglas y no contra ellas.

Por qué un buen prompt es prevención de bugs, no decoración

Un junior suele pensar en el prompt como una pregunta: "hazme un endpoint". Un desarrollador que trabaja en serio con agentes lo piensa como una especificación pequeña: contexto, restricciones y forma de salida.

La diferencia se nota en el coste. Un prompt vago genera código que compila pero que asume la versión equivocada del framework, mete una dependencia que no querías o rompe una convención de tu proyecto. Tú no lo ves al instante: lo descubres en code review, en un test que falla o —peor— en producción. Cada suposición no controlada del agente es deuda que pagas con tu tiempo.

Las ocho técnicas que siguen atacan justo eso: reducir el espacio de suposiciones para que el agente acierte a la primera.

1. Contexto antes que instrucción

El error más común del junior es ir directo a la orden: "créame un repositorio para usuarios". El agente no sabe en qué versión de .NET estás, qué ORM usas ni cómo organizas las capas, así que adivina —y suele adivinar lo más popular en su entrenamiento, no lo que tú tienes.

Pon el contexto primero, en una o dos líneas:

Stack: .NET 10, ASP.NET Core, EF Core 9, arquitectura por capas
(Domain / Application / Infrastructure / Web).
Tarea: crea un repositorio para la entidad Experto.

Qué bug evitas: código para una versión que no usas, APIs obsoletas (o aún no disponibles) y patrones que no encajan con tu arquitectura. El contexto recorta de golpe el 80% de las suposiciones malas.

2. Define qué significa "terminado"

"Hazme la búsqueda de expertos" no tiene un final claro. ¿Incluye paginación? ¿Filtra por categoría? ¿Devuelve un DTO o la entidad? El agente decidirá por ti, y rara vez como tú querías.

Dale criterios de aceptación, igual que harías en una historia de usuario:

Terminado cuando:
- Busca expertos por nombre o categoría (coincidencia parcial).
- Devuelve una lista de ExpertoDto, no la entidad de dominio.
- Soporta paginación (page, pageSize), con valores por defecto 1 y 20.
- Si no hay resultados, devuelve lista vacía, nunca null.

Qué bug evitas: el clásico NullReferenceException por devolver null en vez de lista vacía, y rondas enteras de "no, en realidad necesitaba que también…". Definir el final por adelantado es la forma más barata de no iterar cinco veces.

3. Da un ejemplo de tu propio código (few-shot)

Los modelos imitan muy bien. Si le pegas un ejemplo de cómo ya escribes tú, el resultado se parecerá a tu código y no al de un tutorial random de internet.

Antes de pedir un repositorio nuevo, pega uno que ya tengas:

Sigue exactamente este estilo (nombres, async, manejo de IQueryable):

public class CategoriaRepository : ICategoriaRepository
{
    private readonly AppDbContext _db;
    public CategoriaRepository(AppDbContext db) => _db = db;

    public async Task<Categoria?> GetByIdAsync(int id) =>
        await _db.Categorias.FindAsync(id);
}

Ahora hazme el ExpertoRepository con los mismos criterios.

Qué bug evitas: inconsistencias de estilo que ensucian el code review, mezcla de patrones (un método síncrono aquí, otro async allá) y convenciones de nombres que rompen con el resto del proyecto. Un ejemplo vale más que tres párrafos de instrucciones.

4. Restricciones explícitas: dile también qué NO hacer

Esta técnica es la que más sorprende a los juniors, porque parece contraintuitivo gastar tokens diciendo lo que no quieres. Pero los agentes tienden a "ayudar de más": meten una librería, refactorizan algo que no tocaba, cambian una firma pública.

Restricciones:
- No agregues paquetes NuGet nuevos.
- No uses AutoMapper; el mapeo a DTO va a mano.
- No cambies la firma de los métodos públicos existentes.
- No toques la configuración de DI.

Qué bug evitas: dependencias sorpresa que tú no decidiste, cambios fuera de alcance que rompen otras partes y refactors no pedidos que disparan tu diff de 10 a 200 líneas. Las restricciones son tu primer mecanismo de control —y, no por casualidad, el tema del próximo artículo.

5. Pensar antes de escribir: primero el plan, luego el código

Para lógica no trivial, pedir el código directamente es arriesgado: el agente se compromete con un diseño en la primera línea y luego "defiende" ese diseño aunque esté mal. Sepáralo en dos pasos.

Antes de escribir nada, explícame en 4-5 puntos cómo vas a
resolver la validación de la solicitud de búsqueda
(orden de las validaciones, qué devuelves ante cada error).
No escribas código todavía.

Lees el plan, lo corriges si hace falta, y recién entonces le dices "ok, impleméntalo". Aquí sigues siendo el navegante: el plan es donde está tu pensamiento, y revisarlo cuesta segundos frente a revisar 80 líneas de código equivocado.

Qué bug evitas: errores de diseño que se vuelven errores de implementación. Es mucho más barato corregir un plan en texto que un código ya escrito que parece correcto.

6. Descompón la tarea en pasos pequeños

"Hazme toda la funcionalidad de búsqueda de expertos, de la entidad al controlador" es pedir mucha superficie de una sola vez. Cuanto más grande el output, más difícil es revisarlo y más se esconden los bugs.

Ve capa por capa, en el mismo orden en que tú lo construirías:

  1. Entidad y configuración de EF Core.
  2. DTO de salida.
  3. Interfaz del repositorio.
  4. Implementación del repositorio.
  5. Servicio de aplicación.
  6. Controlador.
  7. Tests.

Revisas y das el visto bueno a cada paso antes de pasar al siguiente. Qué bug evitas: el efecto "muro de código" donde apruebas 300 líneas que no leíste de verdad. Pasos pequeños = revisión real = menos bugs colándose por cansancio.

7. Trata el test como especificación

Si ya trabajas con TDD o BDD, esta técnica encaja sola: pide el test primero (o junto con el código), porque el test es una forma ejecutable de decir qué significa "correcto".

Primero escribe los tests xUnit para BuscarExpertosAsync:
- Devuelve expertos que coinciden por nombre parcial.
- Devuelve lista vacía cuando no hay coincidencias.
- Respeta la paginación.
Luego implementa el método para que esos tests pasen.

Qué bug evitas: el código que "parece" funcionar pero no cubre los casos borde. Cuando el test define el contrato, el agente no puede irse por las ramas: tiene un objetivo verificable, no una interpretación libre. Además te quedas con la red de seguridad puesta para el refactor.

8. Feedback específico en la iteración

Cuando algo sale mal, el reflejo del junior es escribir "no funciona" o "sigue mal". Eso obliga al agente a adivinar otra vez, y suele cambiar cosas al azar hasta que algo encaja —o hasta que rompe más.

Dale el error exacto, igual que se lo darías a un compañero:

Lanza NullReferenceException en BuscarExpertosAsync, línea 24,
cuando _db.Expertos no tiene registros. El Where devuelve un
IQueryable vacío, pero luego haces .First() en vez de
.FirstOrDefault(). Corrige solo eso.

Qué bug evitas: las "correcciones" que generan tres bugs nuevos. Un error concreto produce un arreglo concreto; un "no anda" produce una ruleta. Y fíjate en el detalle final —"corrige solo eso"— que es otra vez una restricción para que no aproveche para refactorizar de más.

El hilo que conecta las ocho

Si las relees, todas hacen lo mismo: reducen lo que el agente tiene que suponer. Contexto, criterios de "terminado", ejemplos, restricciones, plan previo, pasos pequeños, tests y feedback exacto son ocho maneras de cerrar huecos antes de que se conviertan en bugs.

Y todas son coherentes con el principio de la serie. No estás escribiendo menos para pensar menos; estás escribiendo prompts precisos porque ahí es donde vive tu pensamiento. El agente teclea; tú decides qué teclear.

Estas técnicas funcionan a nivel de cada interacción. Pero cuando trabajas con agentes de forma seria —varios pasos, varias sesiones, un proyecto real como una API en ASP.NET Core— necesitas algo más que buenos prompts sueltos: necesitas límites y estructura que el agente respete siempre, sin que tengas que repetirlos cada vez. De eso trata el próximo artículo.

Saturday, June 6, 2026

Qué delegar a los agentes y qué no (y cómo decidirlo sin equivocarte)

En el artículo anterior quedó establecido algo incómodo: tú eres el navegante permanente y el agente es el conductor rápido. El agente teclea más rápido que tú, no se cansa y no se distrae. Pero el rumbo lo pones tú, siempre. Lo que no resolvimos ahí es la pregunta que aparece a los cinco minutos de trabajar así: vale, soy el navegante… pero entonces, ¿qué le doy exactamente al conductor y qué hago yo?

Este artículo va de eso. Y empieza desmontando la intuición con la que casi todos los juniors arrancan.

La pregunta equivocada: "¿qué es lo fácil?"

Cuando alguien empieza a delegar en un agente, casi siempre delega por dificultad. La lógica parece sensata: "lo aburrido y mecánico se lo doy a la IA, lo difícil me lo quedo yo". El problema es que esa regla te lleva justo al peor sitio.

Porque "difícil" suele significar dos cosas distintas que no tienen nada que ver entre sí. A veces "difícil" es tedioso pero perfectamente definido (escribir veinte DTOs casi idénticos). Y a veces "difícil" es que aún no sabes qué quieres (decidir cómo modelar un agregado del dominio). El primero es el candidato perfecto para delegar. El segundo es exactamente lo que jamás deberías soltar. Y la palabra "difícil" no te ayuda a distinguirlos.

La pregunta correcta no es qué es fácil. Es: ¿puedo especificar esto con precisión y verificar el resultado de forma barata? Eso cambia todo el criterio.

El reparto que de verdad importa: pensar vs. teclear

Hay una forma muy simple de ver el reparto correcto, y es la que distingue al que de verdad programa con IA del que solo pega código:

Quédate con el pensamiento. Delega el tecleo.

La trampa del junior es hacer justo lo contrario: deja que el agente decida el diseño ("hazme la API de usuarios") y luego se pone él a teclear correcciones encima de lo que el agente decidió. Ha delegado el pensamiento y se ha quedado con el tecleo. Es el peor reparto posible, porque el pensamiento es donde está tu valor y el tecleo es donde está el del agente.

El profesional invierte el reparto. Piensa el modelo, el contrato, el orden de las cosas y qué significa "terminado". Y entonces deja que el agente convierta esa decisión en código. El agente no decide nada importante: ejecuta decisiones que tú ya tomaste.

Tres criterios para decidir en el momento: claridad, precisión y control

"Quédate con el pensamiento" es la idea; los tres criterios son la herramienta para aplicarla tarea a tarea. Antes de delegar algo, pásalo por estos tres filtros. Tienen que pasar los tres. Si falla uno, no delegues todavía.

1. Claridad: ¿puedes decir qué es "terminado"?

Si no eres capaz de describir con palabras qué quieres y cómo sabrás que está bien, el agente tampoco lo sabrá. Va a rellenar los huecos por su cuenta —siempre rellena— y vas a recibir algo plausible que no es lo que necesitabas.

Aquí hay un matiz clave: cuando una tarea no es clara, eso no significa "no se puede delegar". Significa "tu trabajo ahora mismo es hacerla clara". Convertir un deseo difuso en una especificación precisa es trabajo de navegante, y es de lo más valioso que haces. La especificación no es el paso previo a programar; es la parte de programar que no puedes delegar.

2. Precisión: ¿puedes verificar el resultado de forma barata y objetiva?

La pregunta es si existe un juez automático y barato que diga "esto está bien" o "esto está mal" sin que tengas que leerlo línea a línea: una prueba que pasa o falla, el compilador, el sistema de tipos, un esquema, un linter, un endpoint que devuelve la forma esperada.

Cuando la corrección es objetiva y verificable, delegar es seguro: aunque el agente se equivoque, el juez lo caza. Cuando la corrección es subjetiva o contextual —si un nombre refleja bien el dominio, si una responsabilidad vive en la capa correcta, si una abstracción merece la pena— no hay juez automático. Ahí el único verificador eres tú, y por tanto la decisión también.

Esto explica por qué los agentes encajan tan bien con TDD y BDD. Una prueba escrita primero es el juez. El ciclo rojo-verde-refactor convierte "implementa esto" en una tarea con corrección verificable, y por eso se delega tan limpiamente.

3. Control: ¿qué pasa si se equivoca y cuánto cuesta deshacerlo?

Este es el criterio que la gente olvida, y el que más caro sale. Una tarea puede ser clarísima y perfectamente verificable y aun así no debes delegarla, porque el radio de explosión de un error es enorme o difícil de revertir.

Una migración que toca datos de producción es clara. Un cambio en el contrato público de tu API es claro. Una decisión de seguridad o de autenticación puede ser clara. Y aun así te quedas con la mano en el volante, porque equivocarte ahí no es un test en rojo: es datos corruptos, clientes rotos o un agujero. El control manda sobre los otros dos criterios. Cuando el coste del error es alto e irreversible, la claridad y la verificabilidad no bastan.

Al revés también funciona: trabajo de bajo radio, fácilmente reversible y fácilmente verificable es donde puedes delegar con los ojos casi cerrados.

Aterrizándolo en .NET

Con esos tres filtros, el reparto en un proyecto real (una API en ASP.NET Core, por ejemplo) se ordena solo.

Buenos candidatos para delegar —alta claridad, verificación barata, radio contenido—:

  • DTOs, records de request/response y código de mapeo entre capas.
  • Scaffolding repetitivo de repositorios o CRUD una vez decidido el contrato.
  • Implementar un método cuya firma y contrato ya diseñaste tú.
  • Escribir el código que hace pasar un escenario o una prueba que tú ya definiste.
  • Refactors mecánicos y transformaciones repetidas en muchos ficheros.
  • La migración de EF Core una vez que el modelo está decidido.
  • Borradores de documentación, de mensajes de commit, búsqueda de sintaxis o de uso de una API.

Lo que te quedas tú —baja claridad de entrada, corrección subjetiva o radio de explosión grande—:

  • El modelo de dominio y las fronteras de los agregados: ahí vive tu comprensión del negocio.
  • El contrato público de la API: qué significan los endpoints y qué prometen.
  • Las decisiones de arquitectura y sus trade-offs (dónde vive cada responsabilidad, qué capa depende de qué).
  • Qué construir y en qué orden: el alcance y los criterios de aceptación.
  • Las fronteras de seguridad y autenticación.
  • Los nombres que cargan significado de dominio.
  • La elección de dependencias e infraestructura.
  • La revisión final: ¿esto hace de verdad lo que el negocio necesita?

Fíjate en que la lista de la izquierda no es "lo fácil" y la de la derecha no es "lo difícil". Escribir veinte mappers es tedioso; decidir una frontera de agregado puede hacerse en una frase. El eje no es la dificultad: es si puedes especificar y verificar sin riesgo.

Cómo se ve esto en un ciclo real con agentes

Si trabajas con un flujo de varios agentes —un especificador, un arquitecto, un programador, un revisor—, este reparto deja de ser una intuición y se convierte en la propia estructura del ciclo. No es casualidad: ese montaje es exactamente "quédate con el pensamiento, delega el tecleo" hecho proceso.

El humano sujeta dos puertas: la de entrada (la especificación: qué se construye y cómo sabremos que está bien) y la de salida (la revisión: ¿pasa lo que tenía que pasar y dice lo que tenía que decir?). Entre esas dos puertas, los agentes hacen el trabajo mecánico. Tú no tecleas la implementación; tú garantizas que la tarea entró clara y que salió correcta.

Por eso los baby steps de XP no son un detalle estético: el incremento pequeño y bien especificado es, literalmente, la unidad mínima que pasa los tres criterios a la vez. Un trozo grande y difuso falla en claridad, falla en verificación barata y tiene un radio de explosión grande. Trocearlo en pasos pequeños es lo que lo vuelve delegable. Delegar bien y avanzar en pasos pequeños son la misma disciplina vista desde dos ángulos.

Señales de que delegaste de más

Sabrás que cruzaste la línea cuando notes alguno de estos síntomas:

  • Estás corrigiendo a mano, una y otra vez, decisiones de diseño que el agente tomó por ti. (Delegaste el pensamiento.)
  • No sabrías explicar por qué el código está estructurado así. (No revisaste de verdad; aceptaste.)
  • Para verificar si está bien tienes que leerlo entero con lupa. (No había juez automático: faltaba precisión.)
  • Te da miedo tocar lo que produjo porque no entiendes el radio de explosión. (Perdiste el control.)

Ninguno de esos problemas se arregla pidiéndole al agente que lo haga mejor. Se arreglan subiendo un nivel: especificar más claro, poner un juez antes de delegar, o sencillamente recuperar esa decisión y tomarla tú.

El objetivo no es delegar lo máximo posible

Es tentador medir tu progreso por cuánto le pasas al agente, como si delegar más fuera ser mejor. No lo es. El objetivo es mantener tu juicio donde de verdad importa y soltar todo lo demás. Un buen navegante no demuestra su valía conduciendo menos; lo demuestra eligiendo bien el rumbo y sabiendo, en cada curva, qué puede ceder al volante y qué no.

Claridad, precisión y control son los tres instrumentos del navegante. Mientras los uses antes de cada tarea, da igual lo rápido que teclee el conductor: el coche va a donde tú decides.

Wednesday, May 27, 2026

eXtreme Programming en la era de los agentes

Una metodología de 1999 que resulta ser el manual de instrucciones perfecto para trabajar con IA.

Cuando Kent Beck publicó Extreme Programming Explained en 1999, nadie imaginaba que sus principios iban a encajar perfectamente con los agentes de IA de 2025. Y sin embargo, aquí estamos.


XP no es lo que parece

El nombre suena radical. eXtreme Programming. Como si se tratara de escribir código colgado de un bungee o programar bajo presión extrema. Nada más lejos de la realidad.

XP es una metodología ágil creada por Kent Beck que parte de una pregunta incómoda: ¿qué pasa si tomamos las buenas prácticas del desarrollo de software y las llevamos al extremo?

Si el code review es bueno, hagámoslo continuamente — eso es el pair programming. Si probar el código es bueno, probemos antes de escribir el código — eso es TDD. Si integrar cambios frecuentemente es bueno, integremos varias veces al día. Si entregar valor es bueno, entreguemos en iteraciones pequeñísimas.

"XP no inventa nada nuevo. Simplemente deja de tolerar las excusas para no hacer lo que ya sabemos que funciona." — Kent Beck, Extreme Programming Explained

No es metodología de héroes. Es metodología de sistemas. Y eso es exactamente lo que la hace tan poderosa hoy.


Las 4 prácticas que deberías conocer

Pair Programming. Dos cerebros en el mismo teclado. Uno escribe, el otro piensa en el diseño. Se revisa mientras se crea, no después.

TDD (Test-Driven Development). Red → Green → Refactor. Primero el test que falla. Luego el código mínimo para pasarlo. Después, limpiar.

Baby Steps. Cambios pequeños y seguros. Cada paso debe ser tan pequeño que sea imposible equivocarse en grande.

Refactor Continuo. El código nunca está "terminado". Siempre hay una forma más clara, más simple, más expresiva de decir lo mismo.

TDD en .NET — el ciclo que cambia todo

// PASO 1: Escribe el test que falla (RED)
[Fact]
public void BuscarExperto_PorNombre_DebeRetornarResultados()
{
    var resultado = _servicio.Buscar("Kent Beck");
    Assert.NotEmpty(resultado);  // falla: método no existe
}

// PASO 2: Código mínimo para que pase (GREEN)
public IEnumerable<Experto> Buscar(string nombre)
    => _repo.BuscarPorNombre(nombre);  // test verde

// PASO 3: Limpia sin miedo (REFACTOR)
public async Task<IReadOnlyList<ExpertoDto>> BuscarAsync(
    BusquedaQuery query,
    CancellationToken ct = default)
    => await _repo.BuscarAsync(query, ct);  // limpio y expresivo

El ciclo completo — Red, Green, Refactor — no es un dogma religioso. Es un ritmo de trabajo que te da algo muy valioso: confianza. Confianza para cambiar. Confianza para refactorizar. Confianza para avanzar rápido sin romper nada.

Los baby steps no son para principiantes. Son para profesionales que entienden que el código que "casi funciona" es el código más peligroso que existe. Cada commit debe ser tan pequeño y autocontenido que revertirlo sea trivial.

Principio de oro de XP: Si te duele hacerlo frecuentemente, la solución no es hacerlo menos. Es hacerlo tan frecuentemente que tengas que encontrar la manera de que deje de doler.

Por qué XP y los agentes de IA son compatibles de manera natural

Cuando empiezas a trabajar con agentes de IA — Claude, Copilot, Cursor, o cualquier LLM que genere código — te das cuenta de algo: los principios de XP no solo siguen siendo válidos, son más necesarios que nunca.

  • TDD primero: el agente tiene contexto claro. Los tests son su especificación. Genera código que pasa tests, no código que hay que testear después.
  • Baby steps: los agentes cometen errores. Cambios pequeños hacen que los errores sean pequeños, detectables y revertibles en segundos.
  • Refactor continuo: la IA puede generar código que funciona pero que es verboso o redundante. El refactor te mantiene en control del diseño.
  • Pair programming: tú eres el que piensa en el diseño. El agente escribe. La dinámica es exactamente la misma que en pair tradicional.

El agente como tu par de programación

Trabajar con un agente de IA no es usar un autocompletado avanzado. Es hacer pair programming asíncrono. Tú piensas en el "qué" y el "por qué". El agente ejecuta el "cómo".

Pero hay un error común: darle al agente demasiado contexto de golpe, pedirle que resuelva un problema grande en un solo paso. Eso viola el principio de baby steps. Y cuando el agente falla en un paso grande, pasas más tiempo debuggeando su output que el problema original.

// Sin disciplina XP — pedir demasiado de una vez
"Crea el módulo completo de búsqueda de expertos con
 filtros, paginación, caché y logging"

// Con disciplina XP — baby steps + TDD como guía
"Escribe un test para BuscarExpertosPorCategoria
 que verifique que retorna lista vacía si no hay resultados"

// → Agente escribe el test
// → Tú lo revisas
// → Agente implementa lo mínimo para pasarlo
// → Tú revisas y refactorizas si hace falta
// → Siguiente baby step

El resultado no es más lento. Es significativamente más rápido, porque cada paso que da el agente está validado por un test antes de continuar. El agente nunca se va por las ramas, nunca genera código que nadie pidió, y tú siempre sabes exactamente en qué estado está el código.

"Los tests no son para verificar que el código funciona. Son para describir lo que el sistema debe hacer, antes de que exista." — Dan North

El developer no desaparece — evoluciona

El miedo que tienen muchos developers con la IA es que los va a reemplazar. XP da una respuesta clara a eso: el rol del developer que piensa en arquitectura, diseño y calidad no desaparece con la IA. Al contrario, se vuelve el rol más crítico del equipo.

En pair programming tradicional, el "navegador" — quien piensa en el diseño global — es el rol más estratégico. Con un agente de IA, ese rol lo tienes tú, siempre. El agente es un driver extraordinariamente rápido. Tú sigues siendo el cerebro del sistema.

XP te enseña a ser ese cerebro de manera estructurada: con tests que definen el comportamiento, con pasos pequeños que mantienen el control, con refactor constante que preserva la salud del código. Todo eso, en la era de los agentes, vale más que saber escribir código rápido.


Para llevarte algo claro

XP no es una metodología antigua que hay que archivar. Es el framework mental que necesitas precisamente ahora que los agentes de IA pueden generar cientos de líneas de código en segundos.

Porque el peligro no es que la IA escriba código lento. Es que escriba mucho código malo muy rápido. Y sin disciplina XP — sin TDD, sin baby steps, sin refactor continuo — ese código malo se acumula hasta que el proyecto colapsa bajo su propio peso.

La combinación ganadora no es "developer vs IA". Es developer con mentalidad XP + agente de IA como par de programación. Eso sí es velocidad sostenible.

En los próximos artículos vamos a ver esto en la práctica: cómo aplicar el ciclo BDD → TDD con agentes en un proyecto .NET real, y cómo estructurar los prompts para que el agente respete tus tests como especificación.

Friday, May 22, 2026

Lo que diferencia al que programa con IA del que solo pega código de ChatGPT

Los 3 niveles de uso — y por qué casi todos se quedan atascados en el primero.


Hay una escena que se repite todos los días en miles de equipos de desarrollo. Alguien abre ChatGPT, escribe "dame el código para X", copia lo que sale, lo pega en el editor y reza para que funcione. Si funciona, sigue. Si no, vuelve a preguntar.

Eso no es programar con IA. Eso es buscar en Google con pasos extra.

Y el problema no está en la herramienta. Está en el nivel de uso. Porque la IA tiene capas, y la mayoría de los developers viven congelados en la primera. No por falta de inteligencia, sino porque nadie les ha mostrado que hay algo mucho más potente debajo.

En este artículo voy a describir los tres niveles con los que un developer puede relacionarse con la IA. Verás en cuál estás tú ahora mismo. Y lo más importante: verás adónde puedes ir — y cómo llegar.


Primero: ¿qué diferencia a quien programa con IA del que solo pega código?

La respuesta corta es: la dirección del flujo de pensamiento.

El que pega código delega el pensamiento en la IA. El que programa con IA usa la IA para amplificar su propio pensamiento. La diferencia parece sutil, pero produce resultados completamente distintos.

Cuando delegas el pensamiento, obtienes código que responde a tu pregunta literal. Cuando amplificas tu pensamiento, obtienes código que resuelve tu problema real dentro del contexto real de tu sistema.

La IA en ambos casos hace lo mismo. Eres tú quien cambia.


Los 3 niveles de uso

Nivel 1 El buscador glorificado

Este es el nivel en el que está el 80% de las personas que dicen "usar IA en su trabajo". El patrón es siempre el mismo: tienes un problema puntual, escribes una pregunta genérica, obtienes código, lo copias, lo pegas, ves si funciona. No hay contexto. No hay conversación real. Cada prompt es una isla desconectada de la anterior.

La IA no sabe quién eres, qué estás construyendo, cuáles son tus convenciones de código ni cuál es la arquitectura de tu sistema. Es como contratar a un consultor brillante y hablar con él durante dos minutos cada vez, sin contarle nada de tu empresa.

El resultado predecible: código que funciona en el vacío pero que no encaja en tu base de código real. Soluciones que resuelven la pregunta literal pero ignoran el problema de fondo. Una sensación constante de que "la IA a veces acierta y a veces no" — cuando en realidad el problema es que no le estás dando lo que necesita para acertar siempre.

Señales de que estás en el Nivel 1:

  • Tus prompts casi nunca superan las 2-3 líneas.
  • Cada conversación empieza desde cero, sin contexto previo.
  • Copias el código sin entenderlo del todo, a ver si funciona.
  • Cuando falla, vuelves a preguntar sin analizar por qué falló.
  • Usas la IA para cosas que ya sabrías hacer tú solo, solo que más rápido.
Nivel 2 El colaborador con contexto

El developer que llega al Nivel 2 entiende algo fundamental: la IA es tan buena como el contexto que le das. No es una máquina de respuestas — es un colaborador que necesita entender el proyecto, las restricciones y el objetivo para ayudarte de verdad.

En este nivel, los prompts cambian de forma. En lugar de "dame un endpoint para crear usuarios", el developer escribe algo como: "Estoy construyendo una API REST en ASP.NET Core con arquitectura limpia. El dominio tiene una entidad User con estas propiedades. Necesito el handler del comando CreateUser siguiendo el patrón que ya uso en otros handlers. El resultado debe ser un Result monad, no excepciones. Aquí está un handler de referencia para que te guíes..."

La diferencia en la calidad de la respuesta es abismal. Y no porque la IA sea mágicamente mejor — sino porque tú le estás hablando como un developer senior le hablaría a un colega junior muy capaz.

Señales de que estás en el Nivel 2:

  • Das contexto de arquitectura, stack y convenciones antes de pedir código.
  • Tienes conversaciones largas y continuas, no preguntas sueltas.
  • Iteras sobre el output: "esto está bien pero ajusta X porque en mi proyecto Y".
  • Usas la IA para cosas que serían difíciles o lentas para ti solo.
  • El código que obtienes encaja en tu base de código real sin cirugía mayor.
Nivel 3 El arquitecto que orquesta agentes

En este nivel, la IA deja de ser una herramienta de productividad y se convierte en una palanca de capacidad. El developer no solo usa la IA para generar código — la usa para pensar en sistemas, validar decisiones de arquitectura, ejecutar flujos de trabajo complejos y coordinar agentes que trabajan sobre diferentes partes del proyecto de forma coordinada.

Hablamos de setups donde múltiples agentes especializados colaboran: uno analiza requerimientos, otro implementa, otro hace code review. O de pipelines donde la IA genera escenarios BDD, código de producción y tests de forma encadenada. El developer de Nivel 3 diseña el flujo — y la IA lo ejecuta.

Lo que diferencia a este developer no es el tooling. Es la mentalidad: no le pide a la IA que escriba código. Le pide que razone sobre trade-offs, que proponga estructuras, que identifique inconsistencias en el diseño. La IA no es el que escribe — es el que piensa junto a ti.

Señales de que estás en el Nivel 3:

  • Diseñas prompts como si fueran especificaciones técnicas.
  • Tienes flujos de trabajo donde la IA encadena tareas de forma autónoma.
  • Usas la IA para decisiones de arquitectura, no solo para implementación.
  • Tienes agentes con roles distintos: analista, coder, reviewer.
  • Tu velocidad de entrega ha cambiado de forma estructural, no incremental.

Por qué casi todos se quedan en el Nivel 1 — y cómo salir de ahí

No es por falta de ambición. Es porque el Nivel 1 ya se siente como una ganancia. Si antes tardabas 30 minutos buscando en Stack Overflow y ahora tardas 2 minutos pegando en ChatGPT, la mejora es real y visible. El cerebro humano tiende a optimizar lo que ya funciona y a no buscar lo que todavía no conoce.

Además, pasar del Nivel 1 al 2 requiere algo que muchos developers evitan: pensar más antes de escribir el prompt. En el corto plazo, eso parece más lento. No lo es — pero lo parece. Y ese freno psicológico es suficiente para que la mayoría nunca dé el salto.

El Nivel 3 exige algo más profundo todavía: entender lo suficiente tu propia arquitectura y flujos de trabajo como para poder delegarlos en un agente. Sin fundamentos sólidos, la orquestación de agentes produce caos, no productividad.

"La IA amplifica lo que ya sabes. Si tus fundamentos son débiles, te ayuda a cometer errores más rápido. Si tus fundamentos son sólidos, te convierte en un developer diez veces más potente."

Cómo pasar del Nivel 1 al 2: empieza a dar contexto

El primer paso es el más accesible. Antes de escribir cualquier prompt, hazte tres preguntas: ¿Qué sabe la IA sobre mi proyecto? ¿Qué restricciones tiene que respetar? ¿Cuál es el resultado exacto que necesito y en qué formato?

Responder esas tres preguntas antes de escribir transforma la calidad de lo que obtienes. No es magia — es ingeniería de contexto. Y es una habilidad que se entrena.

Cómo pasar del Nivel 2 al 3: aprende a delegar sistemas, no tareas

La diferencia entre el Nivel 2 y el 3 no es solo técnica. En el Nivel 2 piensas en "qué quiero que la IA haga ahora". En el Nivel 3 piensas en "cómo diseño un flujo donde la IA opera de forma autónoma y confiable".

Eso requiere conocer bien tu dominio, tus patrones de código y tus invariantes de calidad. Primero construye ese conocimiento. Después delégalo.

Si llegaste hasta aquí, ya estás pensando de forma diferente al 80% de los developers que usan IA hoy. El siguiente paso es convertir ese pensamiento en práctica — proyecto real, código real, sistema real.

¿En qué nivel estás ahora mismo? ¿Y adónde quieres llegar?


Thursday, May 7, 2026

Ya no programamos. Ahora dirigimos.

 Andrej Karpathy, uno de los fundadores de OpenAI y quien hizo funcionar el piloto automático de Tesla, dijo hace unos meses algo que me resultó sorprendente viniendo de él: que nunca se había sentido tan rezagado como programador.

No lo dijo con angustia. Lo dijo con la curiosidad de alguien que acaba de ver algo que cambia las reglas del juego. Y creo que vale la pena detenerse en eso, porque lo que describe no es una anécdota personal. Es una señal de que el paradigma cambió.


Software 1.0, 2.0, 3.0

Durante décadas programamos de la misma manera: le decíamos a la máquina exactamente qué hacer, línea a línea. Eso es el Software 1.0. Instrucciones explícitas, deterministas, sin ambigüedad.

Luego vino el Software 2.0: en lugar de escribir reglas, organizábamos datos y entrenábamos redes neuronales. Ya no programabas la lógica directamente, sino que la aprendías de los ejemplos. El código se volvió implícito.

Ahora estamos en el Software 3.0. Y aquí la palanca de programación es el lenguaje natural. Lo que pones en el contexto de un modelo de lenguaje es tu forma de instruir al intérprete. El LLM es ese intérprete. Y la pregunta ya no es qué función escribo, sino qué texto le doy a mi agente.

"Puedes externalizar tu forma de pensar, pero no puedes externalizar tu comprensión."

Eso no es solo una metáfora. Es un cambio en cómo concebimos la construcción de software. Y la mayoría de nosotros todavía está usando la mentalidad del paradigma anterior.


El momento en que algo hizo click

Karpathy describe que en diciembre pasado, durante sus vacaciones, empezó a notar algo distinto. Los fragmentos de código que pedía simplemente salían bien. Ya no tenía que corregirlos. Y siguió pidiendo más. Y seguían saliendo bien. Hasta que se dio cuenta de que no recordaba la última vez que había tenido que editar algo manualmente.

Lo que vivió no es solo una mejora cuantitativa en las herramientas. Es una transición cualitativa en el flujo de trabajo. Y creo que muchos developers estamos justo en ese borde, sin haberlo atravesado todavía, o habiéndolo cruzado sin nombrarlo.

Hay un agujero de conejo ahí adentro. Una vez que confías en el sistema, tus proyectos personales se multiplican. Las cosas que antes parecían demasiado grandes para empezarlas solas, de repente son abordables. Eso tiene un costo, claro, porque también tienes que aprender a dirigir, no solo a ejecutar.


El problema de la inteligencia irregular

Pero seamos honestos. Estos modelos son notablemente inconsistentes. Karpathy los llama "irregulares". Un modelo puede refactorizar una base de código de 100,000 líneas y encontrar vulnerabilidades de día cero, y en el mismo día decirte que camines 50 metros para lavar tu carro porque está "muy cerca".

Eso no es un error menor. Es una señal de cómo funcionan por dentro. Los modelos son entrenados con aprendizaje por refuerzo sobre dominios donde la verificación es posible: código, matemáticas, lógica formal. En esos dominios, avanzan rápidísimo. En dominios donde no hay señal de recompensa clara, el modelo navega a ciegas.

La conclusión práctica es importante: si tu problema vive dentro de los circuitos que el modelo entrenó bien, vas a volar. Si estás fuera de esos circuitos, vas a pelear. Y la única forma de saber en cuál estás es explorando. No hay manual. Hay que probar.


Vibe coding vs. ingeniería agéntica

Hay una distinción que me parece clave y que a menudo se mezcla: el vibe coding y la ingeniería agéntica no son lo mismo.

El vibe coding sube el piso. Cualquier persona, con conocimiento técnico limitado, puede construir algo funcional. Eso es enorme. Democratiza la creación de software de maneras que hace cinco años eran impensables.

Pero la ingeniería agéntica busca otra cosa: mantener los estándares de calidad del software profesional mientras usas agentes para ir más rápido. No introduces vulnerabilidades porque "el agente lo hizo". Sigues siendo responsable. Lo que cambia es la velocidad a la que puedes operar.

"El ingeniero 10x de antes se magnifica mucho más ahora. Y 10x ya no es la velocidad que se obtiene."

El techo sube, no baja. Y quienes aprenden a coordinar agentes con criterio de ingeniería son los que van a operar en ese techo. Eso requiere algo que ningún modelo tiene todavía de forma confiable: gusto, juicio, diseño.


Qué sigue valiendo la pena

Si los modelos se encargan de los detalles de las APIs, de los parámetros de las funciones, de la sintaxis específica de cada framework, ¿qué queda para nosotros?

Queda lo más difícil: entender qué estamos construyendo y por qué. Saber que hay un tensor subyacente y qué implica manipular su vista. Diseñar que los usuarios tengan un ID único y que todos los sistemas lo usen, en lugar de intentar cruzar correos electrónicos de distintas plataformas. Eso es diseño de sistemas. Eso es criterio. Y ningún modelo lo va a sustituir en el corto plazo, no porque sea imposible, sino porque nadie ha puesto esa señal de recompensa todavía.

La comprensión no se puede externalizar. Puedes delegar el pensamiento, pero no el entendimiento. Y si no entiendes qué le estás pidiendo al agente, estás firmando en blanco.


El momento en que estamos

Estamos en un punto raro. Las herramientas cambiaron de forma suficientemente profunda como para que los flujos de trabajo viejos ya no sean los óptimos, pero la mayoría del ecosistema todavía está organizado para humanos. La documentación está escrita para que la lea una persona. Los procesos de contratación evalúan si resuelves puzzles algorítmicos. Las empresas miden productividad con métricas diseñadas antes de que existieran los agentes.

Todo eso va a cambiar. Ya está cambiando. Y quienes se adapten primero no son los que abandonen el rigor técnico, sino los que aprendan a aplicarlo en este nuevo paradigma: dirigiendo agentes con la misma exigencia con la que antes escribían código.

La pregunta ya no es si sabes programar. Es si sabes dirigir.

Este artículo está basado en ideas expresadas por Andrej Karpathy en una conversación reciente sobre el estado actual del desarrollo de software y la inteligencia artificial.

Fuente: https://x.com/stephzhan/status/2049518659513852109