Tabla de Contenidos
¡Esta es una revisión vieja del documento!
Cómo se programa con IA
Una hora para ver cómo se programa hoy con un agente: qué es, qué hay que darle y cómo se comprueba lo que hace. Todo con el mismo ejemplo, una API REST de pedidos en Spring Boot. Cada bloque enlaza con el tema del curso que lo desarrolla.
1. Lo caro ya no es escribir código
Escribir código ha dejado de ser lo caro. Lo caro es decir bien qué hay que hacer y saber si lo que ha salido está bien.
Un proyecto real hecho con agentes, en líneas sin blancos ni comentarios:
| Líneas | |
|---|---|
Aplicación (src/main) | 33.681 |
Tests (src/test) | 42.436 |
| Instrucciones para el agente (skills, agentes, ficheros de contexto) | 30.527 |
Hay más líneas de tests que de aplicación, y casi tantas de instrucciones como de aplicación. Ahí es donde se ha ido el trabajo, que ahora son tres cosas:
- Especificar: decidir qué se hace.
- Dar contexto: que el agente tenga lo que necesita.
- Comprobar: que lo que hizo sirve.
2. El agente
El modelo recibe texto y genera texto. Tres rasgos que condicionan todo lo demás:
- No tiene memoria: cada petición empieza de cero.
- No es determinista: la misma petición dos veces da dos códigos distintos.
- Su conocimiento tiene fecha: no sabe nada de tu proyecto, y lo que no sabe se lo inventa con toda seguridad.
Un agente es ese modelo metido en un bucle con herramientas. Un chat te da texto; el agente actúa y ve las consecuencias: si el test falla, lee el error y corrige el código.
El programa que monta el bucle es Claude Code u OpenCode. Los dos viven en la terminal y trabajan sobre la carpeta en la que se lanzan:
cd pedidos claude
Trabajan en dos modos, y se cambia con Mayús+Tab en Claude Code:
- Plan: lee, analiza y propone un plan sin editar nada.
- Build: edita ficheros y lanza órdenes.
Una petición sirve cuando lleva objetivo, restricciones y criterio de terminado:
Malo: arregla este código
Bueno: arregla el NullPointerException de PedidoService.calcularTotal,
explica qué estaba mal, no cambies la firma pública del método
y deja pasando los tests de PedidoServiceTest
Más información: Conceptos básicos e Ingeniería de prompts.
3. El contexto
El contexto es todo lo que ve el modelo en una petición. Como no tiene memoria, en cada turno se le manda entero: las instrucciones, la conversación y cada fichero que ha leído y cada salida de orden.
/clear.
Lo que hay que repetirle en cada sesión se escribe en AGENTS.md, en la raíz del repositorio. Lo leen todos los agentes y se carga entero en todas las sesiones, así que tiene que ser pequeño:
# Pedidos API REST de pedidos. Compilar y probar: `./mvnw verify`. - Los importes son `BigDecimal` con escala 2; nunca `double`. - Antes de crear cualquier clase, lee `.claude/skills/arquitectura/SKILL.md`.
Para cada problema, una pieza:
| El problema | Lo que necesitas |
|---|---|
| «Tengo que repetirle lo mismo en cada sesión» | Una línea en AGENTS.md |
| «Cada vez lo hace distinto» | Una skill: un SKILL.md que dice cómo se hace esa tarea en tu equipo |
| «Se inventa los datos» o «no puede consultarlo» | Un servidor MCP: herramientas nuevas |
| «Se llena el contexto» | Un subagente: trabaja en su propia ventana y devuelve un resumen |
| «No sé por dónde empieza» | Ninguna: falta especificación |
AGENTS.md y las skills: son ficheros de texto y arreglan la mitad de los problemas.
Más información: El contexto e Ingeniería de contexto.
4. Especificar antes de implementar
La petición, tal y como llega:
hay que poder exportar los pedidos
Ahí hay cinco decisiones escondidas, y el agente las va a tomar por su cuenta sin avisar:
- ¿En qué formato?
- ¿Qué pedidos: todos, los del usuario, los que su rol puede ver?
- ¿Cuántos? Diez y diez millones no se resuelven igual.
- ¿En el momento, o se genera y se avisa al terminar?
- ¿Qué pasa si no hay ninguno?
El resultado compila, pasa los tests y no es lo que pedías. Un error en los requisitos se corrige cambiando una frase; en el código, rehaciendo el trabajo y los tests.
Spec-driven development (SDD) saca esas decisiones a un documento, antes del código. El trabajo se parte en fases, y entre fase y fase hay una persona que aprueba:
| Documento | Qué contesta |
|---|---|
requirements.md | Qué tiene que pasar y cómo se comprueba |
design.md | Cómo se va a hacer: arquitectura, modelo de datos, decisiones |
tasks.md | El plan: pasos pequeños, ordenados y verificables uno a uno |
Cada requisito se escribe para que se pueda comprobar:
Cuando un usuario solicita la exportación de pedidos, el sistema DEBERÁ generar un fichero CSV con los pedidos visibles para su rol. Si la consulta supera los 10.000 pedidos, el sistema DEBERÁ generarlo en segundo plano y avisar por correo al terminar. Si no hay ningún pedido, el sistema DEBERÁ informar de ello y no generar ningún fichero.
- No es cascada: se especifica una funcionalidad pequeña, no el sistema entero, y se vuelve atrás cuando hace falta.
- Revisas otra cosa: una página de requisitos en vez de dos mil líneas de diff.
- Si cabe en una frase sin ambigüedad, no se especifica: un arreglo de una línea va directo.
Más información: Spec-driven development.
5. Comprobar lo que hace
El agente no es determinista y dice «listo» con la misma seguridad cuando está bien y cuando no. Lo que vale es lo que se comprueba, y lo comprueba el propio agente dentro de su bucle: escribe, lanza la comprobación, lee el resultado y corrige hasta que pasa.
| Comprobación | Quién juzga | Qué pilla |
|---|---|---|
| Compilador y tests | Regla fija | Lo que se rompe y lo que no cumple la spec |
| SonarQube, Snyk | Regla fija | Duplicación, código sin test, dependencias vulnerables |
| Otro agente que revisa | Un modelo | Lo que no se puede escribir como regla. Se puede equivocar |
Primero lo determinista, que da siempre el mismo resultado. El modelo, para lo que queda.
Cuando el agente se equivoca, no se corrige solo esa salida: se cambia el sistema para que el error no vuelva a ocurrir. Si usa double para un importe:
- Se añade la regla a
AGENTS.md. - Si lo vuelve a hacer, se escribe un test de arquitectura que falle: una instrucción se puede ignorar, un test en rojo no.
Auto en Claude Code) solo con todo commiteado, para poder volver atrás.
Más información: Ingeniería de harneses y patrón Ejecutor-Revisor.
6. Demo: exportar los pedidos
La funcionalidad del bloque 4, de principio a fin, con cc-sdd: el flujo de SDD empaquetado como skills para el agente que ya usas.
- Instalarlo en el proyecto, una sola vez:
npx cc-sdd@latest --claude-skills --lang es
- Crear la memoria del proyecto, una sola vez. Lee el repositorio y escribe el producto, el stack y las convenciones en
.kiro/steering/:
/kiro-steering
- Crear la especificación. El nombre de la carpeta lo genera él:
/kiro-spec-init Exportar a CSV los pedidos que el rol del usuario puede ver, en segundo plano si son más de 10.000
- Requisitos. Se lee
requirements.mdy se corrige lo que no sea:
/kiro-spec-requirements exportar-pedidos
- Diseño.
-ysignifica «he leído los requisitos y me valen»:
/kiro-spec-design exportar-pedidos -y
- Tareas.
-yaprueba ahora el diseño:
/kiro-spec-tasks exportar-pedidos -y
- Implementación:
/kiro-impl exportar-pedidos
- Revisión, en una sesión nueva (
/clear), para que no se fíe de lo que hizo:
Compara el diff de esta rama con .kiro/specs/exportar-pedidos/requirements.md. Para cada requisito, di si está implementado y qué test lo cubre. No arregles nada.
7. Por dónde empezar
- Instala Claude Code, o OpenCode si quieres empezar con modelos gratuitos.
- Crea un
AGENTS.mdde diez líneas: cómo se compila, cómo se prueba y las reglas que no se deducen del código. - Coge una tarea pequeña y hazla en modo Plan: lee el plan antes de dejarle tocar nada.
- Una tarea, una sesión.
/clearentre tareas. - Cada vez que se equivoque en lo mismo, escríbelo en
AGENTS.md. - Cuando la tarea no quepa en una frase, especifica.
Lo que no ha cabido en esta hora:
| Tema | Para qué |
|---|---|
| Skills y Estructura de un skill | Dejar escrito cómo se hace cada tarea en tu equipo |
| Agentes | Escribir subagentes propios |
| herdr y Orca | Llevar varios agentes a la vez |
| Patrones agénticos | Combinar agentes: revisores, adversarios, orquestadores |
| Ingeniería de bucles | Dejar a un agente trabajando solo |
