Primer curso de IA para desarrolladores con experiencia
Formacion practica para usar IA sobre un proyecto Spring Boot de verdad: Java, Thymeleaf, tests, configuracion, SQL, Git y PRs. Menos demo bonita, mas criterio, diffs y decisiones defendibles.
Ruta del Curso y Diagnostico Inicial
Que vas a practicar, que te vas a llevar y como medir si ya estas usando la IA con criterio tecnico
Mapas y criterio
Patrones de uso, fallos tipicos, limites de autonomia y elecciones de herramienta con foco en Spring Boot real.
Micro-labs
Cambios pequenos sobre backend, tests, Thymeleaf, config y SQL para entrenar decision y revision, no solo escritura.
Diff y guardrails
Checklist de PR, seguridad, configuracion y validacion del output. El criterio humano manda en cada iteracion.
Proyecto y kits
Starter Spring Boot ampliado, canvas de prompts, rubrica de PR y plantillas para el equipo.
Diagnostico inicial (10 min)
Haz este chequeo rapido antes de empezar. Si puntuas bajo, empieza por los micro-labs guiados. Si puntuas alto, fuerza mas el reto final y la parte de agentes.
1Uso reactivo
La usas para autocompletar o pedir codigo suelto, pero no tienes un flujo estable de diff, tests y decision.
2Uso tactico
Ya pides contexto, generas tests y revisas mejor, pero aun te cuesta decidir cuando subir de IDE a agente o tocar config y UI.
3Uso controlado
Tienes playbook, sabes acotar alcance y puedes defender un PR asistido por IA sin esconderte detras del prompt.
- Puedes explicar por que aceptas o rechazas una sugerencia.
- Sabes distinguir un test verde de un test util.
- No pegas secretos ni config sensible.
- Has tocado alguna vez algo mas que clases Java: template, SQL, profile o PR description.
Como va a respirar el curso
Ese ciclo aparece en todos los modulos. Lo que cambia es la superficie: IDE, agente, template, config, SQL o PR.
Vocabulario minimo antes de tocar nada
La idea básica es sencilla: un modelo genera texto o código a partir del contexto que le das; el editor o la terminal son la superficie donde trabajas; y algunas herramientas añaden un agente que puede leer ficheros, ejecutar comandos y proponerte cambios más amplios. No hace falta entenderlo en profundidad para usarlo bien, pero sí conviene saber qué pieza hace qué.
| Término | Idea ligera | Cómo aparece en tu día a día |
|---|---|---|
| Modelo | El motor que genera texto, sugerencias o código | Chat, autocompletado, análisis y borradores |
| Contexto | Todo lo que el modelo ve para responder | Archivos abiertos, instrucciones del proyecto, errores, diff |
| Prompt | La instrucción que le das | Objetivo, restricciones, referencias y definición de terminado |
| Asistente en IDE | Ayuda integrada en el editor | Autocompletado, chat, explicación y generación local |
| Agente | Un asistente con más autonomía y acceso a herramientas | Lee repo, ejecuta comandos, propone cambios multiarchivo |
| MCP | Un protocolo para conectar contexto externo | Tickets, BD, repos, logs o documentación sin copiar y pegar todo |
¿Qué es MCP y por qué importa?
MCP (Model Context Protocol) es un estándar abierto que permite conectar herramientas de IA con fuentes de contexto: bases de datos, sistemas de tickets, repositorios privados, logs de aplicaciones, etc. Sin MCP, tendrías que copiar y pegar manualmente todo el contexto. Con MCP, el asistente lo trae automáticamente.
Si tu equipo usa Jira, Slack, Grafana, Confluence o bases de datos privadas, MCP permite que Claude (o cualquier herramienta compatible) acceda a ellas sin exponer datos sensibles fuera de tu infraestructura.
| Escenario | Sin MCP (manual) | Con MCP (automático) |
|---|---|---|
| Investigar un bug desde Jira | Copiar issue → pegar en chat → pedir que revise logs en otra ventana | MCP trae issue + últimos logs + historial de cambios automáticamente |
| Generar código basado en BD existente | Hacer screenshot del schema de BD, pegarlo como imagen | MCP accede a BD y proporciona schema completo y actualizado |
| Revisar cambios según SLA actual | Copiar SLA document del Confluence, incrustar en prompt | MCP conecta a Confluence, trae documento actualizado al momento |
📌 Estado actual (2026)
MCP es soportado nativamente por Claude, está en roadmap de GitHub Copilot, y es adoptado por empresas con requisitos de seguridad y privacidad altos. Para el primer curso puedes mencionarlo como "el futuro de contexto seguro", pero la mayoría de usuarios aún no lo usan day-to-day.
Cómo funciona la IA por dentro
Lo justo para no caer en trampas — sin necesitar un máster en ML
- Por qué la IA "alucina" y cómo lo puedes mitigar
- Qué son tokens, contexto y temperatura — y por qué importan al día a día
- Cómo funciona un transformer de forma que te permita predecir sus fallos
- Qué es RAG y cuándo te interesa conocerlo aunque no lo implementes tú
- Dónde seguir aprendiendo (recursos gratuitos curados)
0.1 La caja negra que usas todos los días
Antes de abrir la caja: el flujo básico de cualquier LLM cuando le mandas un prompt es siempre el mismo — da igual que sea Claude, Copilot o ChatGPT.
La realidad en una frase
Un LLM no "piensa" ni "entiende" — predice el token más probable dado todo el contexto anterior. Es estadística extremadamente sofisticada entrenada con cantidades ingentes de texto. Esto explica el 90% de sus fallos.
0.2 Tokens — la unidad real de trabajo
El modelo no ve letras ni palabras: ve tokens, trozos de texto de tamaño variable (3-4 caracteres de media en inglés). La misma frase tokenizada puede ser 10 o 40 tokens dependiendo del idioma y los caracteres.
Ejemplo visual — cómo tokeniza un modelo esta frase:
Cada bloque de color = 1 token. Fíjate cómo "getPendingReviewOrders" se parte en 4 tokens y "NullPointerException" en 3.
Por qué importa para ti
- Coste: las APIs cobran por token. Un fichero de 200 líneas puede ser 1.500-2.000 tokens.
- Contexto: el límite del modelo es en tokens, no en líneas ni en KB.
- Aritmética: el modelo cuenta mal porque "23" es 1 token, no "2" y "3" por separado.
- Español: gasta ~20% más tokens que el inglés equivalente.
Regla rápida
En inglés: 1 token ≈ 4 caracteres ≈ 0.75 palabras.
En español: 1 token ≈ 3-3.5 caracteres.
Un contexto de 200.000 tokens (Claude) equivale a unas 150.000 palabras — el volumen de una novela entera.
Pero ojo: más contexto no significa mejor resultado. Ver sección 0.4.
0.3 De redes neuronales a transformers — la versión útil
No necesitas saber backpropagation. Pero sí vale la pena entender por qué los transformers son distintos a lo que había antes.
Antes: modelos secuenciales (RNN)
Procesaban el texto palabra a palabra, como un for loop. Para cuando llegaban al final, ya se habían "olvidado" del principio.
Problema: si pones "La clave del éxito en el desarrollo es... [200 palabras después] ...por eso la clave es..." el modelo ya no conectaba "la clave" del final con el principio.
Ahora: transformers (desde 2017)
Procesan toda la secuencia a la vez, como un map() paralelo. Y con atención: cada token puede "mirar" a cualquier otro token del contexto.
Resultado: "bank" en "The river bank" atiende a "river" y sabe que es orilla, no banco financiero.
El mecanismo de atención — la clave del transformer
0.4 Ventana de contexto — no es solo un número grande
Los modelos actuales tienen contextos enormes: Claude tiene 200.000 tokens, Gemini llega al millón. Pero hay un problema que la industria llama "context rot" (putrefacción del contexto):
⚠️ El problema real
Los modelos no leen su contexto de forma uniforme. La información que está en el medio de un contexto muy largo se olvida o se ignora con más frecuencia. Solo el principio y el final del contexto tienen atención alta de forma consistente.
💡 Implicación práctica
- Pon las instrucciones clave al principio y al final del prompt, no en el medio
- Si repites una restricción importante, ponla también justo antes del "hazme esto"
- En conversaciones largas, reestablece el contexto importante de vez en cuando
- Prefiere context files concisos (CLAUDE.md, copilot-instructions) a dumps masivos
0.5 Temperatura y otros parámetros — el dial de creatividad
Cuando usas la API (o configuras un agente), tienes control sobre cómo el modelo elige los siguientes tokens. El parámetro más importante es la temperatura.
Parámetros que ves en las APIs
0.6 Alucinaciones — por qué pasa y cómo lo limitas
Una "alucinación" es cuando el modelo genera algo que suena perfectamente correcto pero es falso. No es un bug — es una consecuencia directa de cómo funciona.
Causa 1: Predice, no recuerda
El modelo no tiene una "base de datos de hechos". Genera el siguiente token más probable. Si los datos de entrenamiento asociaban "Spring Boot 2.7" con cierto patrón, puede generarlo aunque ya sea obsoleto.
Causa 2: Siempre responde
El modelo está entrenado para generar texto, no para decir "no sé". Si no tiene suficiente información, en lugar de callarse, completa con lo que estadísticamente encaja. Inventando APIs, versiones, nombres de métodos.
Causa 3: Datos de entrenamiento
Si en el dataset de entrenamiento aparecía findByCustomerAndStatus() más veces que findByCustomerNameAndStatus(), el modelo preferirá el primero aunque en tu proyecto no exista.
Señales de alarma de alucinación en código
OrderRepository.findByStatusAndCreatedAfterWithPagination()"0.7 RAG — cuando el modelo necesita saber cosas que no sabe
RAG (Retrieval Augmented Generation) es el patrón estándar para darle al modelo acceso a datos actualizados o privados sin reentrenarlo. No necesitas implementarlo tú — pero sí conviene saber cómo funciona para entender herramientas como GitHub Copilot Enterprise o las búsquedas de Claude.
Cuándo te importa como dev
- Cuando usas Copilot Enterprise con tu código privado
- Cuando configuras un chatbot interno sobre documentación
- Cuando entiendes por qué el asistente "sabe" de tu Confluence
- Cuando decides si fine-tuning o RAG para un caso de uso nuevo
Fine-tuning vs RAG — la decisión práctica
| Actualizar datos | → RAG |
| Cambiar estilo/tono | → Fine-tuning |
| Datos privados | → RAG |
| Empezar | → Prompt eng. |
0.8 Chain of Thought — el truco del "piensa paso a paso"
Una de las técnicas más sencillas y efectivas: pedir al modelo que razone en voz alta antes de responder. El output intermedio se convierte en contexto para los siguientes pasos, mejorando drásticamente la precisión en tareas complejas.
💡 Cuándo y cómo usarlo
- Añade "piensa paso a paso" o "antes de responder, lista los casos" para problemas complejos
- En Claude: usa
/thinko/ultrathinkpara activar razonamiento extendido - Pide que desglose el análisis antes de generar código: el plan = mejor código
- Solo mejora resultados en modelos grandes (los modelos pequeños pueden empeorar con CoT)
0.9 Para profundizar — recursos gratuitos y buenos
Si quieres ir más allá de lo operativo, estos son los recursos que más valor aportan a un developer con experiencia:
Prompt Engineering Tutorial (Anthropic)
9 capítulos con ejercicios interactivos directamente en el modelo. El mejor recurso para prompt engineering estructurado.
Gratis InteractivoThe Illustrated Transformer (Jay Alammar)
La explicación visual más famosa de cómo funcionan los transformers. Diagramas animados paso a paso. Lectura obligada.
GratisTransformer Explainer (Georgia Tech)
Escribe texto y mira cómo fluye por cada capa del transformer en tiempo real. Herramienta interactiva en el navegador.
Gratis Demo en vivoAttention (3Blue1Brown)
El capítulo de atención de la serie de deep learning con animaciones matemáticas. Sin código, pura intuición visual.
Gratis VídeoHow Transformer LLMs Work (DeepLearning.AI)
Mini-curso de ~1 hora de Andrew Ng sobre la arquitectura transformer. Técnico pero accesible para devs.
Gratis CursoAnthropic Prompt Engineering Docs
Documentación oficial de Anthropic sobre prompting, XML, extended thinking, herramientas y buenas prácticas con Claude.
GratisLLM Course (Hugging Face)
Curso completo sobre LLMs: transformers, fine-tuning, RAG, agentes. Más técnico — para quien quiera construir, no solo usar.
Gratis Con códigoGoogle ML Crash Course — LLMs
La sección de LLMs del crash course de Google. Buenas explicaciones de tokenización, transformers y prompt engineering.
Gratis EjerciciosMódulo 1: Fundamentos Operativos para Trabajar con IA
Ritmo del modulo
Cuando la IA acelera de verdad, donde mete riesgo y que contexto minimo necesita para darte algo revisable.
Humano -> contexto -> modelo -> diff -> tests -> decision. Si una pieza falta, no hay flujo serio.
Reescribir un prompt vago de exportacion hasta convertirlo en una peticion con referencias, limites y Definition of Done.
En 12 minutos, convierte una peticion generica en un prompt que toque controller, test y template sin abrir la puerta a cambios accidentales.
Checklist de revision del modulo
- El prompt incluye objetivo, referencias, restricciones y Definition of Done.
- El cambio propuesto no introduce capas, dependencias o APIs no pedidas.
- Hay un criterio explicito para decidir si iterar, aceptar o parar.
- Entender qué tareas acelera la IA y en cuáles añade más riesgo que valor
- Distinguir entre autocompletado, chat contextual y agentes con acceso al repositorio
- Aprender a dar contexto útil sin escribir prompts kilométricos
- Detectar rápido errores típicos: APIs inventadas, edge cases olvidados y sobreingeniería
- Trabajar con una regla práctica: prompt, diff, tests, revisión y decisión
1.1 Qué aporta realmente la IA a un desarrollador con experiencia
Para esta audiencia la IA no sustituye criterio técnico. Lo que hace bien es acelerar trabajo mecánico, ofrecer primeros borradores razonables y ayudarte a explorar opciones sin partir de cero. Lo que sigue siendo tuyo es el diseño, la validación y la responsabilidad sobre el cambio.
| Situación | Qué suele aportar | Riesgo principal | Regla práctica |
|---|---|---|---|
| Boilerplate y wiring | Te ahorra tecleo y acelera el primer borrador | Copiar patrones incorrectos del proyecto | Dale un archivo de referencia y revisa el diff completo |
| Tests unitarios | Cubre casos base con rapidez | Happy path sin casos límite reales | Pide explícitamente errores, vacíos y validaciones |
| Lectura de código legacy | Resume, explica y propone mapas del flujo | Conclusiones convincentes pero falsas | Úsala para orientarte, no para cerrar la investigación |
| Refactorización mecánica | Renombrados, extracción de métodos, limpieza repetitiva | Romper contratos implícitos | Haz cambios pequeños y ejecuta tests a cada paso |
| Decisiones delicadas | Sirve para explorar alternativas y trade-offs | Tomar la primera propuesta como diseño final | Pide opciones, no autoridad |
💡 Idea central
Trata la IA como un colaborador rápido pero poco fiable: produce mucho, se equivoca con seguridad y necesita restricciones claras. Si tu proceso no incluye revisión, pruebas y diff, el problema no es el prompt: es el flujo de trabajo.
1.2 Cómo funciona por dentro (lo justo para no caer en trampas)
No necesitas un máster en machine learning, pero sí entender tres conceptos que explican el 90% de los fallos que vas a ver:
Tokens, no palabras
El modelo no lee "palabras" — lee tokens (trozos de 3-4 caracteres). Esto explica por qué a veces se le dan mal los cálculos, cuenta mal letras o trocea mal un nombre de variable largo.
"OrderController" ≈ 3 tokens
"getPendingReviewOrders" ≈ 5 tokens
Ventana de contexto
Todo lo que el modelo "ve" cabe en una ventana finita. Si le pegas 8.000 líneas de código, las primeras instrucciones se diluyen. Por eso importa dar contexto relevante, no todo el contexto.
Regla: cuanto más largo el prompt, más probable que olvide restricciones del principio.
Predicción, no comprensión
Un LLM predice el siguiente token más probable. No "entiende" tu código como tú lo entiendes. Por eso puede generar algo que parece perfecto pero tiene un bug sutil: es estadísticamente plausible, no lógicamente verificado.
📌 Implicación práctica
Estos tres conceptos explican por qué: (1) olvida restricciones en conversaciones largas, (2) inventa APIs que suenan correctas pero no existen, y (3) genera código que compila pero no hace lo que esperas. No es un bug de la herramienta — es una limitación fundamental del enfoque. Saberlo te convierte en un mejor usuario.
1.3 Tres modos de uso que debes distinguir
No todas las herramientas hacen lo mismo. La decisión útil no es “qué marca uso”, sino qué grado de autonomía le doy y cuánta superficie del cambio le dejo tocar.
| Modo | Cuándo usarlo | Ventaja | Qué revisar |
|---|---|---|---|
| Autocompletado | Mientras ya estás escribiendo y sabes hacia dónde vas | Reduce fricción y acelera código repetitivo | Nombres, tipos, imports y convenciones del proyecto |
| Chat contextual | Para entender código, pedir tests o acotar una tarea | Buena relación entre control y velocidad | Que no invente APIs ni suponga archivos que no existen |
| Agente con repo | Para cambios multiarchivo, refactors o tareas con terminal | Puede ejecutar un flujo completo con menos intervención | Scope del cambio, comandos ejecutados, diff, tests y efectos colaterales |
1.4 Qué contexto necesita para ayudarte de verdad
Los mejores resultados no salen de prompts “creativos”, sino de contexto útil. Para código casi siempre bastan cinco piezas: objetivo, restricciones, archivos de referencia, definición de terminado y qué no debe tocar.
📋 Regla rápida de contexto
- Objetivo: Qué cambio quieres y para qué sirve
- Restricciones: Stack, convenciones, arquitectura, límites de seguridad
- Referencias: Qué archivos o ejemplos debe imitar
- Definición de terminado: Tests, comportamiento esperado, casos límite
- Límites: Qué no debe modificar ni asumir
1.5 Fallos frecuentes que debes detectar pronto
Los errores de la IA no suelen ser exóticos. Son muy parecidos a los de un desarrollador junior con mucha velocidad y poca memoria de contexto.
| Fallo | Señal de alarma | Respuesta correcta |
|---|---|---|
| APIs inventadas | Usa métodos, clases o flags que no existen en tu stack | Abre archivos reales, pega la firma y exige ajustarse a ellos |
| Arregla el test en vez del código | La build pasa pero la lógica sigue mal | Indica explícitamente que el test es correcto y que debe corregir la implementación |
| Sobreingeniería | Cuatro clases nuevas para resolver algo simple | Pide la solución más simple posible y rechaza abstracciones prematuras |
| Olvida restricciones | Vuelve a usar patrones que ya prohibiste | Repite las reglas clave y muévelas a un archivo de instrucciones del proyecto |
| Confianza injustificada | Afirma compatibilidades o features sin comprobarlas | Para versiones, APIs y precios: verificar siempre en documentación oficial |
1.6 Cuándo usar IA y cuándo no
✅ Úsala
- Para primeros borradores de código repetitivo
- Para generar tests, fixtures y datos de ejemplo
- Para explorar refactors mecánicos o renombrados
- Para resumir código legacy antes de leerlo en detalle
- Para revisar diffs, detectar huecos y proponer checklists
⛔ Párate y decide antes
- Si el problema ni siquiera está bien formulado
- Si afecta a seguridad, auth, criptografía o datos sensibles
- Si el cambio es pequeño y ya sabes hacerlo más rápido tú
- Si llevas varias iteraciones y la herramienta no converge
- Si no podrías defender el cambio en una review sin la IA delante
📋 Regla práctica para empezar como equipo
- Primero: úsala en tareas acotadas y reversibles
- Siempre: branch propia, diff limpio y tests ejecutados
- Obligatorio: el autor humano revisa todo antes del commit
- Si hay duda: reduce el alcance o vuelve a hacerlo manualmente
Checkpoint del modulo 1
Entregable observable: un prompt canvas completo para una mejora sobre OrderController o orders/list.html, con tres casos borde y un limite claro de alcance.
- Si la tarea es pequena y reversible, IDE o chat contextual.
- Si toca varios artefactos y necesita comandos, empieza a pensar en agente.
- Si no puedes defender el diff sin la IA abierta, todavia no esta listo.
Elegir Herramienta sin Casarte con una Marca
45 minutosRitmo del modulo
Elegir entre IDE, chat, agente local o revision de PR segun superficie de cambio, autonomia y riesgo.
Tarea corta y local -> IDE. Tarea explicativa -> chat. Multiarchivo con comandos -> agente. Revision final -> PR.
Clasificar una mejora de endpoint, un bug de template, una migracion SQL y una investigacion de logs usando la herramienta adecuada.
En parejas, justificar que herramienta usar para cinco tareas reales del proyecto base y donde pondrias el freno.
Scope bajo
Autocomplete, test pequeno, ajuste de metodo o fragmento aislado. La mejor herramienta es la que te deja revisar mas rapido.
Scope medio
Endpoint + DTO + test, bug de Thymeleaf, ajuste de profile. Normalmente chat contextual o edicion guiada.
Scope alto
Multiarchivo con comandos, logs, config y PR. Aqui ya quieres plan, diff, tests y supervisar un agente.
Checklist de revision del modulo
- Cuantos archivos y artefactos toca la tarea.
- Si hace falta ejecutar comandos, tests o inspeccionar logs.
- Si la tarea requiere mas exploracion que generacion.
El árbol de decisión — ¿qué herramienta para esta tarea?
Antes de abrir cualquier asistente, hazte estas tres preguntas. La respuesta determina el modo óptimo:
Lo importante no es la marca: es el patrón de trabajo
El ecosistema cambia muy deprisa. Por eso aquí no vamos a memorizar un ranking de productos, sino a distinguir qué categoría encaja mejor según la tarea, el riesgo y el nivel de autonomía que quieres conceder.
| Categoría | Úsala cuando | Ventaja real | Qué vigilar |
|---|---|---|---|
| Autocompletado en IDE | Ya sabes la solución y quieres menos fricción al escribir | Velocidad y continuidad de flujo | Aceptar sugerencias erróneas por inercia |
| Chat contextual | Necesitas entender código, pedir tests o explorar una solución | Buen equilibrio entre control y productividad | Contexto insuficiente o respuestas demasiado confiadas |
| Agente en IDE | Quieres cambios guiados sin salir del editor | Menos saltos entre conversación y código | Que el cambio toque más ficheros de lo esperado |
| Agente en terminal/desktop | La tarea implica archivos, comandos, tests y diff | Más contexto operativo y mejor encaje con Git | Perder trazabilidad si no revisas comandos y resultados |
| Ejecución remota o cloud | Necesitas aislamiento, trabajo asíncrono o paralelizar | Escala mejor en tareas largas o repetibles | Menos control inmediato y más dependencia del setup |
💡 Estrategia recomendada
La secuencia que suele funcionar mejor en equipos de desarrollo es esta:
- Primero: autocompletado y chat para trabajo que ya sabes evaluar
- Después: agentes locales para tareas multiarchivo con tests y diff
- Más tarde: automatización o ejecución remota cuando ya existan guardrails
- Siempre: elige por flujo de trabajo, no por la marca del momento
Setup mínimo útil
No intentes desplegar todo el mercado el primer día. Deja lista una categoría, úsala en trabajo real y amplía solo cuando ya entiendas sus límites.
# 1. Instalar la extensión o cliente
# → IDE o aplicación de escritorio
# 2. Iniciar sesión y abrir un proyecto real
# → Mejor un proyecto pequeño o una rama de pruebas
# 3. Añadir contexto útil
# → Instrucciones del proyecto
# → Archivos de referencia
# → Restricciones técnicas
# 4. Ejecutar un primer ciclo completo
# → Generación
# → Diff
# → Tests
# → Revisión humana
Ese patrón es mucho más estable que cualquier nombre de plan o comando: activar → contextualizar → probar en pequeño → revisar → medir.
🎯 Consejo para Java/Spring developers
Antes de pedir generación, enseña un patrón real del proyecto. La herramienta mejora más por contexto correcto que por cambiar de proveedor.
Usa OrderController.java y OrderService.java como referencia.
Genera el nuevo endpoint siguiendo ese patrón, sin exponer entidades y añadiendo tests.
Eso obliga al asistente a parecerse a tu base de código, no a un ejemplo genérico.
Ejemplos orientativos, no exhaustivos
Asistente integrado en IDE
Útil cuando el equipo quiere quedarse dentro del editor para autocompletado, chat contextual y cambios pequeños. Aquí importa más la calidad del contexto y del diff que la marca concreta.
Agente con terminal y repositorio
Encaja mejor cuando la tarea exige leer varios archivos, ejecutar comandos, lanzar tests y preparar una PR revisable. La diferencia real está en el grado de control operativo.
Si quieres enseñar nombres concretos en clase, limita esta parte a uno o dos ejemplos como soporte visual y vuelve enseguida al criterio de elección.
Ejemplo práctico: generar un endpoint con Copilot
Aquí mostramos cómo pedir a Copilot que genere un endpoint nuevo siguiendo patrones existentes.
@RestController
@RequestMapping("/api/orders")
public class OrderController {
@Autowired private OrderService orderService;
@GetMapping("/{id}")
public ResponseEntity getOrder(@PathVariable Long id) {
OrderDTO order = orderService.getOrderById(id);
return ResponseEntity.ok(order);
}
@PostMapping
public ResponseEntity createOrder(@RequestBody CreateOrderRequest request) {
OrderDTO created = orderService.createOrder(request);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
}
@GetMapping("/pending")
public ResponseEntity> getPendingOrders(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
PageRequest pageable = PageRequest.of(page, size);
Page pending = orderService.getPendingOrders(pageable);
return ResponseEntity.ok(pending);
}
✓ Lo que salió bien
- Respetó el patrón de anotaciones y tipos de retorno
- Usó correctamente ResponseEntity
- Añadió paginación con PageRequest (estándar Spring)
- No cambió métodos existentes
Matriz de decisión: qué elegir según la tarea
| Tu necesidad | Categoría recomendada | Criterio de elección |
|---|---|---|
| Autocompletado mientras escribo | Autocompletado en IDE | Prioriza integración natural con tu editor y baja fricción |
| Entender un módulo o pedir tests | Chat contextual | Necesitas control fino y capacidad de iterar rápido |
| Hacer cambios automáticos en proyecto | Agente local o en terminal | La tarea toca varios archivos y requiere comandos, diff y pruebas |
| Refactorizar código existente | Chat contextual o agente local | Depende de si quieres propuesta guiada o ejecución supervisada |
| Escribir tests | Chat contextual | Pide explícitamente casos de error, vacíos y edge cases |
| Depurar problema complejo | Terminal/desktop con acceso a logs y repo | Necesitas combinar conversación, comandos y lectura de varios archivos |
📌 Nota editorial
Modelos, planes, comandos concretos y precios cambian con frecuencia. Antes de impartir el curso conviene revisar la documentación oficial de las herramientas citadas. El objetivo aquí es enseñar criterios transferibles, no una comparativa congelada.
Checkpoint del modulo 2
Entregable observable: matriz propia de "que herramienta uso segun tarea" con al menos un ejemplo para Java, Thymeleaf, test y configuracion.
- Si necesitas leer y decidir, no hace falta un agente.
- Si necesitas plan + comandos + varios artefactos, ya no es solo chat.
- La mejor herramienta es la que deja menos superficie sin revisar.
IA dentro del IDE: contexto corto, iteración rápida
75 minutosRitmo del modulo
Como usar el IDE para cambios cortos y medianos en Java, tests, Thymeleaf, configuracion y errores funcionales.
Controller + service + test + template abiertos a la vez. Si el contexto cabe ahi, el IDE suele ser la mejor superficie.
Endpoint pequeno, test nuevo y ajuste de template sin salir del editor ni delegar demasiado pronto.
Corregir un template Thymeleaf y endurecer un DTO de entrada sin inventar fragments, anotaciones ni config.
Java
Bueno para controllers, services, DTOs y tests cuando tienes patrones abiertos delante.
HTML server-side
Funciona si le das fragments reales. Falla rapido cuando le pides "hazme una vista bonita" sin referencias.
Config y errores
Muy util para stacktraces, profiles y Advice, siempre que revises defaults, nombres y riesgo operativo.
Checklist de revision del modulo
- Hay archivos de referencia abiertos antes de pedir cambios.
- El diff no inventa fragments, perfiles o contratos nuevos.
- El resultado incluye pruebas o evidencia, no solo una respuesta convincente.
Este módulo puede impartirse con Copilot, Continue u otra herramienta equivalente. El aprendizaje no depende del producto: depende de usar el editor como superficie principal de trabajo, con contexto local, iteraciones cortas y revisión inmediata.
Qué ve el asistente cuando abres el IDE
Entender qué contexto recibe el asistente explica por qué a veces acierta perfectamente y otras parece que no tiene ni idea de tu proyecto. Aquí un ejemplo real de lo que Copilot o Claude ven versus lo que tú ves:
💡 La regla de los archivos abiertos
Antes de pedir cualquier cambio: abre en el IDE todos los archivos que quieres que el asistente imite o respete. Lo que no está abierto no existe para él — salvo que uses @workspace (Copilot) o hayas configurado un CLAUDE.md con el contexto del proyecto.
Referencia rápida de atajos — los que usarás a diario
No hace falta memorizar todo de golpe. En las primeras semanas basta con saber los 5-6 que aceleran más el ciclo prompt→diff→test.
Qué aporta de verdad dentro del editor
| Situación | Cuándo aporta | Qué revisar siempre |
|---|---|---|
| Autocompletado | Boilerplate, wiring, tests base, cambios mecánicos | Imports, nombres, tipos y APIs inventadas |
| Chat contextual | Entender código, proponer un cambio pequeño, pedir explicación | Que la respuesta se apoye en archivos reales del proyecto |
| Edición guiada | Cambios acotados en uno o pocos ficheros | Alcance del diff y casos límite no cubiertos |
Flujo mínimo útil en IDE
1. Abrir contexto real
Abre controller, service, tests y cualquier DTO o entidad de referencia. Si hay una convención del proyecto, ponla a la vista.
2. Pedir un cambio pequeño y verificable
Una sola intención por iteración. Mejor un endpoint o un test que una “feature completa”.
3. Revisar el diff antes de confiar
Busca acoplamiento nuevo, decisiones ocultas, validaciones ausentes y efectos laterales no pedidos.
4. Ejecutar y corregir
Compila, ejecuta tests y devuelve feedback preciso. El editor acelera el ciclo, no sustituye la verificación.
Guía paso a paso: primera hora con Copilot
Objetivo: Tener Copilot funcionando en VSCode con contexto de tu proyecto.
Tiempo: 15-20 minutos
Paso 1: Instalar extensión (2 min)
Abre VS Code → Extensiones (Ctrl+Shift+X) → busca "GitHub Copilot" → instala oficial de GitHub. Reinicia VSCode.
Paso 2: Autenticar (3 min)
Abre Command Palette (Ctrl+Shift+P) → "Copilot: Sign In" → se abrirá un navegador → autoriza tu cuenta de GitHub → vuelve a VSCode.
Paso 3: Abrir tu proyecto (1 min)
File → Open Folder → elige tu proyecto Spring Boot. Copilot ahora ve la estructura.
Paso 4: Crear archivo de instrucciones (5 min)
En la raíz del proyecto, crea .copilot-instructions.md con el contexto técnico (ver sección siguiente). Copilot lo leerá automáticamente.
Paso 5: Prueba en pequeño (5 min)
Abre un Controller existente → crea una nueva línea en blanco → empieza a escribir una ruta → Copilot debería sugerir. Prueba también el chat lateral (Ctrl+Shift+I o icono de chat).
# Instrucciones para Copilot
## Stack
- Java 17 + Spring Boot 3.5
- JPA + Hibernate
- MockMvc para tests
## Convenciones de este proyecto
- Controllers: sufijo Controller, en paquete `com.company.api.controller`
- Services: sufijo Service, en paquete `com.company.business.service`
- Entities: en paquete `com.company.persistence.entity`
- DTOs: sufijo DTO, usados en responses de endpoints
## Patrones esperados
- DTOs siempre en responses, nunca expongas entidades JPA
- Tests unitarios usan @SpringBootTest con MockMvc
- Métodos privados innecesarios; mantener público solo lo que es necesario
## Qué NO cambiar
- No modificar archivos de configuración (application.properties)
- No tocar la estructura del build.gradle
- No cambiar nombres de métodos públicos existentes
## Definición de terminado para cada tarea
- Código compila sin warnings
- Tests pasan (ejecuta `./gradlew test`)
- Cambios aparecen en un diff limpio, sin reformateo accidental
💡 Pro tip
Este archivo es transferible a cualquier miembro del equipo. Cada uno copia el proyecto, instala Copilot, y automáticamente todos usan las mismas restricciones y patrones.
Archivo de instrucciones del proyecto
No importa tanto el nombre del fichero como su función: darle al asistente un marco estable de arquitectura, restricciones y definición de terminado.
# Contexto del proyecto
- Stack: Java 17 + Spring Boot + JPA
- Capas: Controller -> Service -> Repository
- No exponer entidades JPA fuera del dominio
- Inyección por constructor
- Logs sin datos sensibles
# Cómo pedir cambios
- Sigue los patrones de OrderController y OrderService
- Si falta contexto, pregunta antes de inventar
- Genera tests para errores y casos límite
# Definición de terminado
- Diff revisable
- Tests ejecutados
- Sin helpers no usados
- Sin cambios fuera de alcance
Qué no debe ser el centro de este módulo
Atajos, botones concretos, comandos de chat, nombres de plan y pantallas del proveedor envejecen rápido. Si enseñas un producto concreto, úsalo solo como soporte visual del flujo, no como temario principal.
3.X — Sesión Real en IDE: De Ticket a Commit
El objetivo es ver el ciclo completo con un caso único y consistente. Aquí usamos el dominio de pedidos para que el patrón luego conecte con el taller central.
🎫 Contexto: el ticket
BACK-412 — Añadir endpoint GET /api/orders/pending-review que devuelva pedidos pendientes de revisión con antigüedad mayor al umbral configurable. Incluir tests.
Iteración 1 — El primer prompt (demasiado vago)
El asistente generó algo aparentemente correcto, pero ignoró convenciones del proyecto: devolvía la entidad Order directamente, dejó el umbral hardcodeado y no cubrió los casos de error.
Iteración 2 — Prompt mejorado con contexto
@GetMapping("/pending-review")
public ResponseEntity<List<OrderPendingReviewResponse>> getPendingReview(
@RequestParam(defaultValue = "7") Integer days) {
if (days < 0) {
throw new IllegalArgumentException("Days must be positive");
}
return ResponseEntity.ok(orderService.findPendingReview(days));
}
Bug sutil que la IA no detectó: la condición days < 0 deja pasar days = 0, que incumple la regla de negocio. La validación correcta es days <= 0. Los casos límite siguen siendo trabajo tuyo.
Iteración 3 — Pedir los tests adecuados
Dentro del IDE la IA rinde mejor cuando el alcance es corto y el feedback es inmediato. Si el cambio ya requiere varios comandos, muchos ficheros o aislamiento en ramas, ya no estás en un patrón de IDE puro: estás entrando en agentes y terminal.
3.Y — Spring Boot mas alla de Java: templates, config y advice
En equipos reales no solo iteras sobre clases. Tambien tocas templates, fragments, profiles y respuestas de error. Si eso no aparece en el curso, el alumno se lleva una vision demasiado estrecha del trabajo con IA.
Template Thymeleaf
Pidele que reutilice fragments, ids, formularios y nombres reales. El HTML generico queda bonito un minuto y rompe la app al siguiente.
application.yml
Sirve para practicar cambios de profile, logging y propiedades de negocio sin tocar secretos ni configuracion sensible.
@ControllerAdvice
Buen terreno para validacion, errores coherentes y tests de borde con poco codigo pero mucho criterio.
En este proyecto Spring Boot:
1. Ajusta orders/list.html para resaltar pedidos en revision reutilizando el fragment existente.
2. Refuerza CreateOrderRequest con validacion minima sin cambiar el contrato JSON.
3. Si falta, agrega manejo de error coherente en @ControllerAdvice para validaciones.
4. Genera tests del controller y explica cualquier supuesto antes de editar.
No metas CSS nuevo salvo el minimo. No inventes fragments ni cambies application.yml.
VSCode como base: las tres herramientas principales
VSCode es el IDE de referencia para este módulo porque concentra la mayor parte del ecosistema. Las mecánicas son transferibles a JetBrains, Neovim o cualquier editor con extensiones equivalentes. Aquí comparamos las tres opciones que más se usan en equipos Java/Spring.
GitHub Copilot en VSCode
La integración más madura en el IDE. Autocompletado inline, panel de chat con contexto del editor y Agent Mode para tareas multiarchivo. Funciona dentro del editor sin salir al terminal.
Modos de uso en VSCode
Autocompletado Inline
Sugiere código mientras escribes. Tab acepta, Alt+] alterna sugerencias. Útil para boilerplate, getters, builders y wiring de Spring.
Copilot Chat
Panel lateral con contexto del fichero activo. Comandos: /explain, /fix, /tests, /doc. Usa @workspace para contexto del proyecto.
Agent Mode
Modo autónomo para tareas que implican varios ficheros. El agente propone un plan, edita ficheros y ejecuta comandos. Supervisa cada paso antes de confirmar.
Inline Edit (Ctrl+I)
Edición directa sobre el código seleccionado. Muestra diff antes de aplicar. Ideal para refactors pequeños, renombres y extracciones de método.
Archivo de instrucciones del proyecto
Copilot lee .github/copilot-instructions.md automáticamente. Sin él, no sabe nada de tus convenciones. Con él, el autocompletado y el chat se alinean al estilo real del proyecto.
# Instrucciones para GitHub Copilot
## Stack y arquitectura
- Java 17 + Spring Boot 3.5 + JPA
- Capas: Controller → Service → Repository
- DTOs como records de Java 17
## Convenciones
- Inyección SIEMPRE por constructor
- No exponer entidades JPA en respuestas de API
- Tests con JUnit 5 + Mockito, sin @SpringBootTest salvo integración
- Logs con SLF4J, sin datos personales ni tokens
## Al generar código
- Sigue el patrón de OrderController y OrderService
- Si falta contexto, pregunta antes de inventar
- Genera siempre el test unitario junto al código
Skills de Copilot (Enterprise)
En Copilot Enterprise puedes definir Skills: paquetes de instrucciones + ejemplos de código que el equipo comparte. Un Skill de "Revisión de Seguridad" o "Generador de Tests Spring" aplica el mismo criterio a todos los desarrolladores del equipo sin que cada uno configure su prompt desde cero.
Valor real de los Skills: estandarizar cómo el equipo usa la IA, no solo cómo escribe código. Si tienes 10 developers, un Skill bien definido multiplica el criterio del más experto.
Copilot Coding Agent (cloud)
Desde GitHub.com puedes asignar issues a Copilot como si fuera un colaborador del repositorio. El agente trabaja en un sandbox aislado, abre una PR con sus cambios y la notifica al equipo. El equipo revisa la PR como cualquier otra. Revisar disponibilidad antes de impartir
La PR del agente no es una entrega: es un borrador de punto de partida. La revisión humana del diff es obligatoria antes de mergear.
Claude Code en VSCode / Terminal
Claude Code es principalmente un agente de terminal, pero se integra en VSCode vía extensión. Su punto diferencial es el contexto largo (1M tokens), el archivo CLAUDE.md como memoria persistente y un sistema de Skills y Hooks para automatizar flujos repetidos.
Características propias de Claude Code
CLAUDE.md — Memoria del proyecto
Fichero de contexto persistente que lee en cada sesión. Arquitectura, reglas, convenciones y definición de terminado. Mantenlo bajo 200 líneas para que siga siendo efectivo.
Ultrathink
Activa razonamiento extendido para problemas complejos. Usa /think o /ultrathink. Útil para diseño de arquitectura, refactors con muchas dependencias o debugging difícil.
/loop — Tareas recurrentes
Permite definir una tarea que se repite automáticamente. Útil para pipelines de validación, generación de snapshots o revisiones programadas sobre nuevos commits.
/voice — Voz a prompt
Push-to-talk para dictar prompts. Soporta más de 15 idiomas. Útil cuando ya tienes las manos ocupadas en el teclado o prefieres explorar el problema verbalmente antes de escribir.
Skills en Claude Code
Un Skill es un fichero SKILL.md que define un flujo de trabajo reutilizable: instrucciones paso a paso, contexto necesario y criterio de validación. Claude lo lee y lo ejecuta de forma consistente en cada sesión.
# Skill: Code Review de PR
## Objetivo
Revisar el diff de una PR antes de pedir revisión humana.
## Pasos
1. Lee el diff completo con `git diff main`
2. Busca: entidades JPA expuestas, NPE potenciales, SQL concatenado, logs con datos sensibles
3. Verifica que hay tests para casos feliz, borde y error
4. Genera un resumen de riesgos en formato:
- 🔴 Crítico: [descripción]
- 🟡 Atención: [descripción]
- ✅ OK: [descripción]
## Reglas
- No modifiques código sin pedirlo explícitamente
- Si algo no está claro, señálalo como "revisar con el equipo"
Hooks — automatización con control
Los Hooks ejecutan comandos antes o después de que Claude use una herramienta. PreToolUse puede interceptar y pedir confirmación; PostToolUse puede ejecutar linters, tests o formatters automáticamente tras cada edición.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "mvn spotless:apply && mvn test -q"
}]
}
]
}
}
Con este hook, cada vez que Claude edite un fichero Java, se aplica el formatter y se ejecutan los tests automáticamente. El agente ve el output y corrige antes de continuar.
Otras herramientas e integraciones
Además de Copilot y Claude Code, existen opciones más especializadas. La elección depende de tu stack, tu equipo y tus restricciones (coste, privacidad, ecosistema).
Opciones complementarias
Continue.dev
Extensión de VS Code open source que integra múltiples backends (Copilot, Claude, local). Útil si quieres cambiar de proveedor sin cambiar de IDE.
Modelos locales (Ollama)
Ejecuta modelos pequeños en tu máquina sin conexión a internet. Trade-off: menos poder a cambio de privacidad total y sin costes por tokens.
APIs genéricas (OpenAI, Anthropic)
Si necesitas control fino sobre prompts, modelos o contexto, puedes usar las APIs directamente en scripts o herramientas custom.
💡 Consejo práctico
En tu primer curso, enfócate en una sola herramienta (recomendamos Copilot o Claude Code). Las habilidades de prompt engineering, revisión de código y gestión de contexto son transferibles a cualquier otra.
Checkpoint del modulo 3
Entregable observable: un cambio pequeno desde IDE que toque al menos dos artefactos del proyecto base: Java + test, o Java + template, o config + controller.
- Si el HTML que genera no se parece al proyecto, vuelve a darle fragments y referencias.
- Si toca config, revisa perfiles, defaults y nombres antes de aceptar el diff.
- El objetivo no es salir con mas codigo, sino con una iteracion corta y defendible.
Comparativa de las tres herramientas en el IDE
Agentes Locales con Repositorio y Terminal
75 minutosRitmo del modulo
Cuando merece la pena subir del IDE a un agente y como acotar cambios multiarchivo sobre backend, config, tests y PR.
Controller + service + repository + template + config + tests. Si la tarea cruza esa frontera, empieza el terreno del agente.
Un bug que combina stacktrace, profile, template y test: suficiente para un agente, demasiado para un prompt de una sola capa.
Redactar un encargo seguro para agente sobre tres artefactos y definir que comandos si puede ejecutar y cuales no.
Checklist de revision del modulo
- El agente recibe alcance, limites y validacion esperada.
- El cambio se puede revisar por diff y no por fe en el resumen.
- Hay plan de salida: test, log o evidencia antes de mergear.
Piensa en este módulo como un patrón de trabajo, no como una herramienta concreta. Un agente local compensa cuando necesita leer varios archivos, ejecutar comandos, lanzar tests y dejar un diff que puedas revisar con el mismo rigor que una PR normal.
El loop del agente — cómo piensa y actúa
Un agente no es solo "el modelo con más permisos". Su diferencia fundamental está en el bucle de razonamiento-acción: percibe el entorno, planifica, ejecuta, observa el resultado y vuelve a empezar. Entender este loop te ayuda a saber dónde poner los guardrails.
✅ Cuándo un agente compensa
- La tarea cruza 3 o más archivos relacionados
- Necesita ejecutar tests para verificar su propio trabajo
- Hay un flujo repetible: leer → cambiar → validar → seguir
- Quieres separarte del teclado mientras él trabaja
- Tienes un CLAUDE.md o context file bien definido
⚠️ Cuándo el agente es peor que el IDE
- La tarea es de un solo archivo y ya sabes la solución
- El scope no está claro — el agente lo interpretará mal
- Hay lógica de negocio delicada sin tests que la cubran
- El agente ha "divergido" — está dando vueltas sin avanzar
- No tienes tiempo de revisar el diff antes del commit
🎯 Mini-ejercicio: ¿agente o IDE?
Para cada tarea, decide mentalmente qué usarías. Haz clic en cada opción para ver la respuesta.
Estructura de carpetas recomendada para Agentes
Si vas a trabajar con agentes (más autonomía), asegúrate de que el proyecto tiene una estructura clara para que el agente entienda los límites.
proyecto/
├── .agent-instructions.md # Instrucciones para el agente
├── SKILL.md # Skills reutilizables
├── README.md # Documentación general
├── src/
│ ├── main/
│ │ └── java/com/company/
│ │ ├── api/
│ │ │ ├── controller/ # Controllers (REST endpoints)
│ │ │ └── dto/ # DTOs (request/response)
│ │ ├── business/
│ │ │ └── service/ # Services (lógica)
│ │ └── persistence/
│ │ ├── entity/ # Entidades JPA
│ │ └── repository/ # Repositories
│ └── test/
│ └── java/com/company/ # Tests espejo de main
├── build.gradle # Build config
└── .gitignore
💡 Para el agente
Cuando des una tarea al agente, referencia esta estructura explícitamente: "Añade una nueva clase Service en src/main/java/com/company/business/service/. Añade sus tests en src/test/java/com/company/business/service/"
Cuándo merece la pena pasar del IDE a un agente local
| Tarea | Por qué encaja | Guardrail mínimo |
|---|---|---|
| Cambio multiarchivo | Necesita seguir referencias, tocar tests y comprobar varios puntos del repositorio | Acotar alcance y revisar el diff completo |
| Depuración con logs y terminal | Combina lectura de código, ejecución y análisis de errores | No aceptar el primer diagnóstico sin contrastarlo |
| Preparación de PR | Puede resumir cambios, riesgos y pruebas ejecutadas | Revisión humana del código y del texto final |
Contrato de trabajo seguro
- Define el alcance: qué puede tocar y qué no
- Da contexto persistente: arquitectura, reglas y validación
- Supervisa comandos y diffs: la trazabilidad es obligatoria
- Cierra con tests: build, pruebas y resumen de riesgos
Archivo de contexto del agente
Llámalo AGENT.md, CLAUDE.md o como encaje en tu herramienta. Lo importante es que concentre las reglas que no quieres repetir en cada conversación.
# Proyecto
- Stack: Java 17 + Spring Boot + JPA
- Dominio principal: Orders
- Capas: Controller -> Service -> Repository
# Reglas
- No exponer entidades JPA en respuestas
- Inyección por constructor
- Nada de logs con datos sensibles
- No cambiar configuración sin pedirlo
# Validación
- Ejecuta tests relevantes
- Resume qué has cambiado
- Señala riesgos y supuestos
- Si falta contexto, no inventes
Qué sí conviene enseñar aquí
- Cómo acotar tareas: un cambio revisable, no una feature difusa
- Cómo dar contexto: reglas del proyecto y archivos de referencia
- Cómo validar: comandos, diff, tests y resumen de riesgos
Qué no debe dominar este módulo
Comandos concretos, diagramas del proveedor, funciones premium, subagentes propietarios, hooks y automatismos específicos cambian demasiado rápido. Para clase basta con entender el patrón: contexto persistente, tarea acotada, ejecución supervisada y validación explícita.
4.X — Debugging Asistido por IA: Cómo No Perder el Tiempo
La IA puede ser muy útil para debugging, pero solo si le das el contexto correcto. El error más común es pegar un stack trace y esperar magia. La clave es dar contexto de tres capas: qué esperabas, qué ocurrió y dónde crees que está el problema.
Flujo de debugging con agente
1. Reproduce el error
Antes de pedirle nada al agente, confirma que puedes reproducir el bug. Si no se reproduce de forma consistente, el agente va a inventar causas raíz.
2. Dale el contexto relevante
Stack trace completo, archivos implicados, versión del framework, qué has probado y qué no ha funcionado. Cuanto más preciso, menos alucinaciones.
3. Pide diagnóstico antes que fix
"Explica por qué ocurre antes de proponer una solución." Si el diagnóstico es incorrecto, el fix también lo será.
4. Verifica el fix y pide el test
No aceptes un fix sin un test que demuestre que el bug queda cubierto. Si el agente no puede escribir un test para su propio fix, desconfía.
⚠️ Cuidado con el diagnóstico confiado
La IA siempre te dará una explicación. Siempre sonará razonable. Pero en debugging, la primera hipótesis correcta es la que puedes reproducir con un test. Si el fix funciona pero no entiendes por qué, no lo merges.
4.Y — Evals practicas para agentes
El agente no se valida por lo convincente que suena, sino por la evidencia que deja. Para este curso usa siempre una mini-rubrica:
Hipotesis
Puede explicar por que cree que falla algo y que archivos uso para llegar ahi.
Prueba
Puede mostrar test, comando, diff o reproduccion que respalde su diagnostico.
Alcance
Puede justificar por que toco esos archivos y no quince mas "por si acaso".
4.X — MCP: conectando el agente con contexto útil
MCP (Model Context Protocol) permite conectar el agente con fuentes externas sin pegar manualmente tickets, logs, documentación o metadatos de repositorio en cada prompt.
Sin MCP
Tú copias y pegas tickets, logs, schema o decisiones del equipo cada vez que arrancas una tarea.
El contexto es parcial, repetitivo y fácil de perder por el camino.
Con MCP
El agente puede consultar esas fuentes de manera controlada y traer solo lo relevante para la tarea.
Tú sigues validando el resultado, pero reduces fricción y omisiones de contexto.
Conectores que suelen aportar más
| Fuente conectada | Qué aporta | Riesgo a vigilar |
|---|---|---|
| Issue tracker | Criterios de aceptación, historial del ticket, decisiones previas | Asumir que el ticket está completo cuando no lo está |
| Repositorio y PRs | Patrones reales, discusiones técnicas y contexto del cambio | Copiar decisiones antiguas ya obsoletas |
| Logs y errores | Síntomas operativos y trazas de fallo | Exponer datos sensibles o sobrediagnosticar |
| BD o documentación | Schema, contratos, restricciones y notas del sistema | Usar fuentes desactualizadas sin verificar |
Las credenciales nunca van en texto plano. Secretos y tokens deben ir fuera del prompt y fuera del repositorio, usando variables de entorno o el mecanismo seguro equivalente de la herramienta que uses.
Subagentes: delegar subtareas a agentes especializados
Los subagentes son una evolución del agente único: en lugar de un agente que lo hace todo, defines un agente coordinador que delega subtareas a agentes especializados. Cada subagente trabaja en paralelo, con su propio contexto y objetivo. El coordinador integra los resultados.
Cuándo usar subagentes en tu trabajo diario
| Caso de uso | Subagentes que lanzar | Lo que supervisa el developer |
|---|---|---|
| Revisión de PR compleja | Seguridad · Rendimiento · Cobertura de tests | Informe consolidado antes del merge |
| Refactor de módulo grande | Análisis de dependencias · Generación de tests · Actualización de docs | Diff por capa y lista de riesgos |
| Debug en producción | Análisis de logs · Revisión de código · Propuesta de fix | Causa raíz y fix antes de aplicar |
| Migración de dependencias | Inventario de usos · Borrador de cambios · Verificación de tests | Alcance real del cambio y riesgos |
Subagentes ≠ más rapidez automática. Cada subagente tiene su propio contexto y puede llegar a conclusiones divergentes. El coordinador (tú, o el agente principal) necesita integrar esos resultados con criterio. Los subagentes amplían el alcance de lo que puedes revisar, no eliminan la revisión.
Skills: flujos de trabajo reutilizables entre sesiones
Un Skill es un fichero de texto que describe un flujo de trabajo completo: qué contexto necesita, qué pasos sigue y cómo valida el resultado. El agente lo lee al principio de la sesión y lo aplica de forma consistente. Sirve para que el equipo comparta criterio, no solo código.
Anatomía de un Skill útil
# Skill: Preparar PR para revisión
## Cuándo usarlo
Antes de pedir review a un compañero. Corre este Skill
y corrige lo que encuentre antes de abrir la PR.
## Contexto necesario
- Acceso al repositorio y al diff completo (git diff main)
- Stack: Java 17 + Spring Boot + JPA
## Pasos
1. Lee el diff con `git diff main --stat` para ver el alcance
2. Para cada fichero modificado, busca:
a. Entidades JPA expuestas en DTOs o respuestas REST
b. Validaciones ausentes (nulos, rangos, formatos)
c. SQL construido por concatenación
d. Logs con datos sensibles (PII, tokens, passwords)
3. Comprueba cobertura: ¿hay test para caso feliz, borde y error?
4. Genera resumen estructurado:
🔴 Crítico (bloquea merge): ...
🟡 Importante (corregir antes de merge): ...
🔵 Sugerencia (puede ir en ticket): ...
✅ Sin issues detectados en: ...
## Criterio de salida
- Resumen entregado
- Ningún item 🔴 sin respuesta
- Riesgos señalados explícitamente aunque no sean bloqueantes
Reutilizable entre proyectos
El Skill describe el patrón, no el proyecto. Con pequeños ajustes en "contexto necesario" funciona en cualquier repositorio Java.
Compartible con el equipo
Commiteado en el repositorio, todos los developers usan el mismo criterio de revisión. La calidad no depende de quién ejecuta el agente.
Versionable y mejorable
Con cada PR puedes mejorar el Skill basándote en los fallos que encontró o los que se le escaparon. Mejora iterativa como cualquier otro código.
Mantén la 200-línea limit
Un Skill largo se vuelve ambiguo. Si supera las 200 líneas, sepáralo en dos Skills con responsabilidades distintas.
Checkpoint del modulo 4
Entregable observable: encargo de agente listo para ejecutar, con alcance, limites, comandos permitidos y criterio de aceptacion sobre al menos tres artefactos del proyecto.
- Si el agente toca mas de lo acordado, se para y se reduce scope.
- Si el diagnostico no se puede reproducir, no vale como conclusion.
- MCP, subagentes y skills suman contexto; no sustituyen tu responsabilidad sobre el diff final.
Prompts y Revisión para Código
Cómo pedir, revisar y corregir código generado sin perder criterio técnico
Ritmo del modulo
Como pedir codigo, tests, templates y configuracion con suficiente contexto para que la salida sea revisable.
Prompt malo -> prompt mejorado -> diff -> pruebas -> decision. El texto del prompt solo es una parte del trabajo.
Generar un Advice, tocar application.yml y refinar un fragment Thymeleaf sin dejar huecos en borde, seguridad o naming.
Completar un prompt con huecos para una migracion SQL o un cambio de profile y revisar que no abra riesgos innecesarios.
Checklist de revision del modulo
- El prompt nombra capas, archivos de referencia y limites claros.
- La Definition of Done incluye borde, error y validacion.
- La salida se revisa por diff, test o evidencia y no por tono de seguridad.
Este módulo no va de escribir prompts “bonitos”, sino de escribir instrucciones que reduzcan ambigüedad y generen salidas revisables. El prompt bueno no es el más largo: es el que deja claro el objetivo, el contexto y las restricciones.
Anatomía de un prompt que funciona
Todo prompt útil para código tiene 5 bloques. Cuantos más incluyas, menos iteraciones necesitarás. Aquí el mismo prompt con y sin anatomía:
❌ Prompt sin estructura
Resultado probable: genera algo genérico que no sigue tus convenciones, expone entidades, sin tests y con paginación omitida.
✅ Prompt con los 5 bloques
El framework CRISP para prompts de código
Una regla mnemotécnica para comprobar antes de enviar cualquier prompt importante:
💡 Regla de los 30 segundos
Antes de enviar un prompt importante: léelo como si te lo diera un compañero. ¿Podrías implementarlo sin preguntar nada más? Si no, añade lo que falta. CRISP es el checklist mental que te hace esa pregunta.
Templates de prompt listos para copiar
Guárdalos en tu .copilot-instructions.md o en tu CLAUDE.md como ejemplos de referencia. El equipo los adapta y ya tiene un estándar compartido desde el primer día.
Añade [MÉTODO HTTP] [RUTA] al proyecto.
Stack: Java 17, Spring Boot 3, JPA + H2.
Sigue el patrón de [CONTROLLER_REFERENCIA] y [SERVICE_REFERENCIA].
Restricciones:
- Devuelve DTO, nunca entidades JPA
- Inyección por constructor (sin @Autowired)
- No cambies contratos existentes ni métodos públicos ya definidos
- Si falta contexto, describe el plan antes de escribir código
Definition of Done:
- [CASO FELIZ]: [descripción]
- [CASO ERROR]: [qué lanzar / qué devolver]
- [CASO VACÍO]: [lista vacía / 404 / etc.]
- Tests con MockMvc o Mockito siguiendo [TEST_REFERENCIA]
Genera tests para [CLASE.metodo()].
Sigue el patrón de [TEST_EXISTENTE_REFERENCIA].
Stack: JUnit 5 + Mockito (unitarios) / MockMvc (controller).
Cubre obligatoriamente:
- Caso feliz: [describe el happy path]
- Caso error: [excepción esperada o código HTTP de error]
- Casos límite: lista vacía, null, valor negativo, string vacío
- [CASO ESPECÍFICO DEL NEGOCIO]: [descripción]
Restricciones:
- No uses @SpringBootTest salvo tests de integración explícitos
- Nombres de test: should_[resultado]_when_[condición]
- No modifiques la clase que estás probando
Revisa el siguiente código como un senior developer en code review.
Sé directo. Para cada problema indica:
🔴 Crítico / 🟡 Atención / 🟢 Menor
Categorías:
1. Seguridad: inputs sin validar, SQL concatenado, datos sensibles en logs
2. Rendimiento: N+1 queries, findAll() en tablas grandes, loops costosos
3. Solidez: NPE potenciales, excepciones genéricas, Optional mal usado
4. Diseño: violaciones SOLID, métodos que hacen demasiado, acoplamiento
5. Tests: qué casos faltan que deberían existir
Por cada hallazgo: línea aproximada + qué hay mal + cómo arreglarlo.
NO me des el código completo corregido — dame instrucciones para que yo lo corrija.
Tengo un bug. Te doy el contexto completo:
Stack trace:
[PEGA EL STACK TRACE COMPLETO]
Código relevante:
[PEGA EL MÉTODO / CLASE DONDE FALLA]
Qué esperaba:
[COMPORTAMIENTO ESPERADO]
Qué ocurre:
[COMPORTAMIENTO ACTUAL]
Pasos para reproducir:
[ENDPOINT / INPUT / DATOS]
Qué ya probé:
[LO QUE YA DESCARTASTE]
Por favor:
1. Identifica la causa raíz
2. Explica por qué ocurre
3. Propón el fix mínimo sin refactorizar lo que no sea necesario
Checklist: cómo revisar un diff generado por IA
El diff es tu línea de defensa final. Incluso si el prompt fue perfecto, siempre revisa completamente el cambio propuesto.
⚠️ Red flags comunes
- Reticencia: "No estoy 100% seguro pero..." - rechaza e itera
- Complejidad sorpresa: 3 clases nuevas para algo que debería ser 1 función
- Cambios sin pedir: Se supone que iba a tocar FileA pero también modificó FileB y FileC
- Contratos rotos: Cambió una firma pública sin actualizar los callsites
- Test de mentiras: El test pasa porque verifican solo el happy path
Para no tener que recordar este checklist manualmente, considera una pre-commit hook que ejecute análisis estático (SpotBugs, Sonar, linters). Si el hook falla, rechaza el commit automáticamente.
Framework CRISP: Desglose de un Prompt Efectivo
CRISP es un recordatorio útil, no una ley. Sirve para no olvidar las piezas que más impacto tienen en calidad y revisabilidad.
| Elemento | Descripción | Ejemplo |
|---|---|---|
| Context | Qué proyecto, tecnología, restricciones | "Estoy en [stack actual], con [framework y versión si afectan] y estas restricciones" |
| Role | Quién eres en este prompt | "Actúa como ingeniero backend senior y prioriza mantenibilidad" |
| Instructions | Qué exactamente necesitas | "Genera una entidad Usuario y su DTO con validaciones coherentes" |
| Specifications | Detalles técnicos específicos | "Usa las librerías del proyecto, respeta la arquitectura y evita helpers innecesarios" |
| Polish | Formato, estilo, preferencias | "Documenta solo lo necesario y explica supuestos si faltan datos" |
Prompt Deficiente
Malo:
"Hazme un controlador"
Falta: contexto, tecnología, especificaciones
Prompt Excelente
Bueno:
"Como ingeniero backend en este proyecto, genera un controlador para gestionar usuarios. Usa el stack y las convenciones de los archivos adjuntos, valida la entrada, separa controller, service y repository, y señala cualquier supuesto antes de generar código."
Claro, específico, contextualizado
Patrones avanzados de prompting para código
No son “trucos”. Son formas de trocear el trabajo para que la salida sea más revisable, más alineada con el proyecto y menos propensa a inventar decisiones importantes.
1. Plan antes de tocar código
Pide análisis, alcance y riesgos antes del diff. Es especialmente útil cuando el cambio afecta a varias capas o no tienes claro el impacto.
"Antes de proponer cambios, resume cómo funciona hoy este flujo, enumera riesgos y plantea un plan en pasos. No generes código todavía."
2. Contrato o tests antes que implementación
Sirve para fijar comportamiento esperado antes de pedir código. Reduce regresiones y obliga a pensar en entradas inválidas, nulos y casos límite.
"Primero propón los tests o el contrato de esta API. Cuando estén claros, genera la implementación mínima para que pasen."
3. Refinamiento por capas
Evita pedir “la solución completa” de una vez. Primero estructura, luego validaciones, después errores, observabilidad y finalmente tests.
"Empieza con una versión simple y correcta. En la siguiente iteración añade validaciones, manejo de errores y pruebas. Explica cada cambio."
4. Contexto real del repositorio
La mejor forma de reducir respuestas genéricas es aportar ficheros de referencia, convenciones del proyecto y una definición clara de terminado.
"Usa estos archivos como referencia de estilo y arquitectura. No inventes capas nuevas. Si falta contexto, dilo antes de generar cambios."
Errores Comunes y Soluciones
| Error Común | Síntoma | Solución |
|---|---|---|
| Falta de contexto | Código genérico, no alineado con tu stack | Siempre abre con: "Estoy en [stack real], con estas restricciones y estos archivos de referencia" |
| Especificaciones vagas | Resultado correcto pero no lo que querías | Sé explícito: "Usa Lombok, no data classes" |
| Olvidar seguridad | Código sin validaciones ni SQL injection prevention | Pide explícitamente: "Incluye validaciones de entrada y prepared statements" |
| Prompt muy largo | AI se pierde en detalles | Estructura: Context → Role → Instructions → Specs. Una idea por pregunta. |
| No mostrar requisitos no-funcionales | Falta logging, monitoreo, documentación | Menciona: "Incluye logging SLF4J y métricas" |
Plantillas de Prompts Reutilizables
Úsalas como punto de partida y adapta stack, restricciones y convenciones del proyecto. Si el equipo ya tiene patrones claros, esas referencias valen más que cualquier prompt genérico.
Plantilla: Entidad + DTO
Estoy en [stack backend] con [ORM o framework]. A partir de este contexto, genera: 1. Una entidad [NombreEntidad] con estos campos: [listar campos con tipos] 2. Un DTO separado para entrada o salida, según corresponda 3. Validaciones y anotaciones solo si encajan con este proyecto Restricciones: - Respeta la arquitectura y convenciones de los archivos adjuntos - No inventes helpers, utilidades ni capas nuevas - Si detectas una decisión ambigua, enumérala antes de generar código - Devuelve imports correctos y nombres consistentes con el repositorio
Plantilla: Servicio
Genera un servicio de aplicación para [NombreDominio] siguiendo la arquitectura existente del proyecto. Necesito: 1. Métodos y casos de uso concretos: [listar] 2. Dependencias ya existentes que debe reutilizar 3. Transaccionalidad donde aplique 4. Validación de entrada y errores de negocio coherentes 5. Logging solo donde aporte trazabilidad real No pongas lógica de negocio en el controller. Si la capa service actual del proyecto sigue otro patrón, ajústalo a ese patrón en lugar de inventar uno nuevo.
Plantilla: Tests
Genera tests para [Clase o caso de uso] usando el framework que ya tiene este proyecto. Quiero que cubras: 1. Caso correcto 2. Entradas inválidas o incompletas 3. Casos límite y nulos 4. Errores esperados del dominio 5. Verificación de efectos laterales relevantes Reglas: - No dependas del orden de ejecución - No uses sleeps ni temporizadores arbitrarios - Si faltan dependencias o contexto para un test fiable, indícalo antes de inventar mocks irreales
Plantilla: Thymeleaf
Genera un template Thymeleaf para [caso de uso] siguiendo la estructura visual y de fragments que ya usa el proyecto. Incluye: 1. Tabla o formulario según el caso 2. Enlaces y acciones con `th:href` o `th:action` 3. Mensajes de validación y estados vacíos 4. Nombres de variables coherentes con el controller 5. Clases CSS existentes antes de proponer estilos nuevos Si el proyecto mezcla Thymeleaf con Bootstrap u otra librería, reutiliza los componentes reales en lugar de crear HTML genérico.
Plantilla: application.yml
Ajusta application.yml y, si aplica, application-dev.yml para este proyecto Spring Boot. Necesito: 1. Añadir o modificar estas propiedades: [listar] 2. Mantener perfiles existentes y defaults seguros 3. No introducir secretos ni credenciales reales 4. Explicar el impacto operativo del cambio Devuelve: - diff propuesto - supuestos - riesgos - comprobaciones manuales o tests recomendados
Plantilla: SQL / migracion
Genera una migracion para [cambio de esquema] siguiendo el patron del proyecto. Condiciones: 1. Debe ser segura con datos existentes 2. No puede borrar informacion sin explicarlo 3. Incluye cambios minimos en entity, repository o test si son necesarios 4. Resume primero tablas afectadas, riesgo de compatibilidad y forma de verificarla No inventes datos de produccion ni cambies otras migraciones antiguas.
5.X — Cuando la IA Falla: Señales y Soluciones
Saber cuándo no confiar en el output es tan importante como saber promtear bien. Estas son las señales de alarma que debes reconocer desde el primer día.
| Señal de alarma | Por qué ocurre | Qué hacer |
|---|---|---|
| Inventa métodos que no existen Ej: repository.findByActiveAndNotDeleted() no existe |
El modelo genera nombres plausibles basándose en patrones. No verifica la API real. | Especifica la versión exacta del framework. Abre los archivos relevantes antes de preguntar. |
| Olvida restricciones a mitad de conversación Empieza a usar @Autowired después de que le dijiste que no |
La ventana de contexto se llena y las instrucciones iniciales pierden peso. | Usa /compact y repite las restricciones clave. Mejor aún: ponlas en CLAUDE.md. |
| Genera código que compila pero no hace lo que pediste El test pasa pero la lógica está mal |
Optimiza para satisfacer el prompt literal, no la intención real. | Describe el comportamiento esperado, no la implementación. Añade casos de prueba al prompt. |
| Arregla el test en lugar del código Cambia el assert para que el test pase |
El objetivo "pasar el test" puede cumplirse de varias formas. Elige la fácil. | Sé explícito: "El test es correcto, arregla la implementación, no el test." |
| Responde con confianza algo incorrecto Afirma que una versión o API concreta soporta X (y no es verdad) |
Los LLMs no saben lo que no saben. Generan con el mismo tono sea verdad o no. | Para afirmaciones sobre versiones o APIs específicas, verifica siempre en la documentación oficial. |
| Genera solución demasiado compleja Un factory pattern de 4 clases para un if-else |
Entrenado con código de repositorios "impresionantes", tiende al over-engineering. | Añade al prompt: "La solución más simple posible. Prioriza legibilidad sobre sofisticación." |
⏱ La regla de los 3 intentos
Si después de 3 iteraciones el output sigue sin ser correcto, para y hazlo tú. Seguir iterando con un modelo que no entiende el problema consume más tiempo del que ahorras. Usa la IA para el siguiente subtarea más pequeña y bien definida.
5.X — Museo de los Horrores: Código Real Generado por IA
Estos ejemplos vienen de proyectos reales (anonimizados). El objetivo no es reírse, sino entrenar el ojo para detectar estos patrones en tus propias revisiones.
Horror #1: El Service que era un God Object
Prompt: "Crea un servicio para gestionar pedidos"
Resultado: un solo OrderService de 800 líneas con validación, cálculo de impuestos, envío de emails, generación de PDF y llamadas a 3 APIs externas. Todo en una clase. Sin interfaces. Sin separación.
Lección: si no acotaste el alcance, la IA no lo va a hacer por ti.
Horror #2: El test que probaba... nada
@Test
void testCreateOrder() {
CreateOrderRequest req = new CreateOrderRequest(
"Cliente", "Desc", BigDecimal.TEN);
// El service devuelve lo que el mock dice
when(repo.save(any())).thenReturn(new Order());
OrderDTO result = service.createOrder(req);
assertNotNull(result); // ← esto SIEMPRE pasa
// No verifica campos, no verifica que se llamó al repo,
// no prueba validación, no prueba errores
}
Lección: un test que solo hace assertNotNull es teatro de calidad.
Horror #3: SQL injection en 2026
@Query(value = "SELECT * FROM users WHERE name = '"
+ "#{ #name }" + "'", nativeQuery = true)
// La IA generó concatenación de strings en una query
// nativa. Vulnerable a SQL injection.
Lección: revisa SIEMPRE las queries. Usa parámetros con :name, nunca concatenación.
Horror #4: La dependencia fantasma
La IA añadió al pom.xml:
spring-boot-starter-data-redis
Nadie lo pidió. Nadie usa Redis en el proyecto. Pero al generar un "servicio de caché" que nadie solicitó, decidió que necesitaba Redis. El build funcionaba, pero en producción intentaba conectarse a un Redis que no existía.
Lección: revisa los cambios en pom.xml / build.gradle como si fueran código de seguridad.
Horror #5: El template Thymeleaf genérico
La IA generó una vista bonita, pero eliminó el fragment compartido, cambió th:field por HTML plano y rompió el filtro que esperaba el controller.
Lección: en server-side rendering la estructura importa tanto como el aspecto. Sin fragments reales, la salida es decorativa pero no usable.
Horror #6: application.yml "limpio"
El asistente mezcló valores de dev y prod, activó logs excesivos y dejó una URL de datasource hardcodeada porque "así era más claro".
Lección: la configuracion tambien es codigo. Revisa perfiles, defaults y secretos con el mismo rigor que revisas Java.
5.X — Cuándo NO Usar la IA
La IA no es la herramienta correcta para todo. Usarla indiscriminadamente genera código que no entiendes, deuda técnica invisible, y dependencia que te hace menos productivo a largo plazo.
✅ IA muy útil
- Boilerplate y código repetitivo
- Convertir especificación a código inicial
- Generar tests para código ya escrito
- Entender código ajeno o legacy
- Refactoring mecánico (renombrar, extraer método)
- Documentación y JavaDoc
- Primeras implementaciones que luego refinas
⚠️ IA con precaución
- Decisiones de arquitectura (la IA no conoce tu contexto de negocio)
- Lógica de negocio crítica sin revisión exhaustiva
- Código de seguridad (auth, criptografía, validación)
- Migraciones de base de datos
- Problemas que no sabes describir claramente
- Algo que no entenderías aunque lo leyeras
Checkpoint del modulo 5
Entregable observable: una plantilla de prompt propia para una tarea no trivial del proyecto, por ejemplo un cambio de profile, una migracion SQL o un fragment Thymeleaf reutilizable.
- El prompt describe comportamiento esperado y limites, no solo tecnologia.
- Incluye al menos un caso borde y una evidencia de validacion.
- Si el resultado no se puede revisar por diff, test o output claro, todavia no esta bien pedido.
Taller Central: Del Prompt al PR
El núcleo del curso: generar, revisar, corregir, probar y decidir
Ritmo del modulo
Practicar el ciclo completo desde el prompt hasta la decision final con roles de piloto y reviewer.
Java + tests + UI o config. El taller solo cuenta si toca mas de una superficie del proyecto.
Un primer ejercicio guiado y luego iteraciones en parejas con registro de errores, refinamientos y decisiones.
Completar la hoja de iteraciones y defender un diff pequeno antes de pasar al reto final.
Piloto
Escribe prompts, ordena la iteracion y explica por que pide cada cambio.
Reviewer
Busca fallos en arquitectura, borde, seguridad, template, config y testing.
Entregable
Diff pequeno, decision defendida y hoja de iteraciones con errores detectados y refinamientos hechos.
Este taller es la parte más importante del curso. El objetivo no es ver una demo bonita, sino practicar el ciclo que luego usarás en proyectos reales: contexto, prompt, diff, tests, revisión y decisión. El primer ejercicio es guiado, el segundo semi-guiado y el tercero queda como trabajo posterior.
Ejercicio 1 — Guiado (20 min): Endpoint con Test
El instructor ejecuta esto en vivo. El equipo sigue en sus propias máquinas.
🎯 Objetivo
Implementar GET /api/orders/summary que devuelva el número total de pedidos, importe total y pedido de mayor valor. El foco no es “no tocar código a mano”, sino aprender a dirigir la IA y a revisar el resultado con el nivel de exigencia de una PR real.
Paso 1 — Inicializar el contexto (2 min)
Antes de escribir ningún prompt, abre estos archivos en tabs: Order.java, OrderRepository.java, OrderService.java, OrderController.java. Si usas un agente con instrucciones persistentes, prepara el archivo de contexto del proyecto antes de pedir cambios.
Paso 2 — El prompt inicial (5 min)
Paso 3 — Revisar el output (5 min)
Antes de ejecutar nada, revisa el código generado buscando estos puntos concretos:
- ¿Usa
@Autowireden campo? → Incorrecto, pide que lo corrija - ¿El record tiene todos los campos? → Comprueba que coincide con el prompt
- ¿Los tests cubren lista vacía? → Si no, pide que los añada
- ¿Hay algún
get(0)sin comprobar si la lista está vacía? → Bug potencial
Paso 4 — Ejecutar y verificar (5 min)
# Ejecutar solo los tests nuevos
mvn test -Dtest=OrderServiceTest -q
# Si pasan, arrancar y probar el endpoint
mvn spring-boot:run &
curl http://localhost:8080/api/orders/summary | jq .
Paso 5 — Optimizar con un segundo prompt (3 min)
Ejercicio 2 — Semi-guiado (30 min): Revisión Manual de Pedidos
Ahora trabajáis en parejas. Tenéis el esqueleto del prompt — completadlo y ejecutadlo.
🎯 Objetivo
Implementar un flujo de revisión manual de pedidos (OrderReview): un pedido puede quedar marcado para revisión con motivo y estado, pero no debe tener dos revisiones abiertas al mismo tiempo.
Vuestro punto de partida
El objetivo del ejercicio no es terminar. Es practicar el ciclo: prompt → revisar → iterar → revisar. Anotad cuántas iteraciones necesitasteis y qué errores encontrasteis al revisar.
Criterios de revisión para vuestro propio PR
- ¿La restricción "una revisión abierta por pedido" está en BD, en servicio o en ambos?
- ¿Qué pasa si el pedido no existe al crear la revisión? ¿Hay un test para eso?
- ¿Están cubiertos los cambios de estado inválidos?
- ¿El endpoint de listado tiene paginación o devuelve todo?
Ejercicio 3 — Libre (para casa): Code Review de vuestro propio código
🎯 Objetivo
Coge un Service real de vuestro proyecto en producción — uno que lleve tiempo ahí y que nadie haya revisado en profundidad. Pásalo por el asistente o agente que use el equipo con el prompt de abajo. Comparad los hallazgos con lo que vosotros hubierais encontrado.
Ejercicio 4 — Reto: Refactorización Guiada por IA
🎯 Objetivo
Coged el OrderService del proyecto base y añadid una funcionalidad de exportación a CSV. Pero con trampa: la IA va a querer hacerlo todo en el Service. Vuestro trabajo es dirigirla para que separe responsabilidades correctamente.
El reto concreto
- Pedir a la IA que implemente
GET /api/orders/export?format=csv - Revisar si mete la lógica de serialización CSV directamente en el Service (probablemente sí)
- Dirigirla para que extraiga un
OrderCsvExporterseparado - Pedir tests para: lista vacía, caracteres especiales en campos, encoding UTF-8
- Verificar que el Content-Type y los headers de descarga son correctos
📌 Qué aprender de este ejercicio
La IA tiende a meter todo en un sitio. Parte de tu trabajo como senior es dirigir la separación de responsabilidades, no solo revisar si compila. Este ejercicio entrena exactamente eso: el criterio de diseño que la IA no tiene.
Ejercicio 5 — UI y Config (15 min): Thymeleaf + profile
🎯 Objetivo
Ajustar orders/list.html para resaltar pedidos en revision y revisar un cambio pequeno en application.yml o application-dev.yml sin romper defaults ni mezclar perfiles.
- Pide reutilizar fragments existentes y no generar HTML generico.
- Comprueba que el nombre de los atributos sigue alineado con el controller.
- Si toca config, revisa secretos, profile activo y consecuencias del cambio.
Proyecto Base para los Ejercicios
📦 Descarga el proyecto Spring Boot base
Este starter ampliado incluye backend, tests, Thymeleaf, fragments, perfiles y migracion SQL para que el taller no se quede solo en clases Java sueltas.
⬇️ Descargar curso-ia-spring-base-proyecto.zip
Para arrancar:
# 1. Descomprime el proyecto
unzip curso-ia-spring-base-proyecto.zip
cd curso-ia-spring-base-proyecto
# 2. Compila y ejecuta tests
mvn clean test
# 3. Arranca la aplicación
mvn spring-boot:run
# 4. Prueba que funciona
curl http://localhost:8080/api/orders | jq .
# 5. Abre el proyecto en tu IDE y empieza los ejercicios
Requisitos: Java 17+ y Maven. Si no tienes Maven en la maquina del aula, deja el proyecto preparado antes de impartir.
Checkpoint del modulo 6
Entregable observable: una hoja de iteraciones completada y un diff pequeno que toque Java + test + UI o config, defendido por la pareja delante del grupo.
- Cuenta mas detectar un fallo serio que "terminar" a toda costa.
- El reviewer puede bloquear la decision si el diff no se entiende.
- Sin justificacion del cambio no hay reto final.
Reto Final: Mejora Completa y Defendible
La prueba real: tocar varias capas del proyecto y justificar cada decision sin esconderte detras del asistente
Encargo
Implementa una mejora pequena pero completa sobre el proyecto base. Debe tocar como minimo backend + tests + una pieza de UI o configuracion.
- Añadir una mejora funcional visible.
- Pedir el cambio con contexto y restricciones reales.
- Revisar el diff y recortar todo lo que se salga de alcance.
- Ejecutar o planificar verificaciones claras.
- Escribir una mini descripcion de PR con riesgos y decisiones.
Rubrica
- Arquitectura: capas separadas y sin sobreingenieria gratuita.
- Testing: caso feliz, borde y error donde toque.
- UI / config: reuse de fragments o profiles sin romper convenciones.
- Revision: el equipo puede explicar por que acepta el diff.
- Transparencia: riesgos abiertos y supuestos explicitados.
Ideas de reto
Review board
Endpoint + filtro Thymeleaf + test de controller para pedidos en revision.
Export CSV
Backend + headers + test + boton o enlace desde la vista.
Configuracion
Nuevo profile o propiedad de negocio bien documentada y probada.
Migracion
Columna nueva + ajuste de entity + test o verificacion del repository.
Kits y Plantillas Descargables
Material reutilizable para que el curso siga vivo despues de la sesion
Kit del alumno
Canvas, checklist de diff, rubrica de PR y hoja de iteraciones para usar en tickets reales del equipo.
Kit del instructor
Tiempos, errores esperados, variantes por ritmo del grupo y criterios para evaluar el reto final.
Prompt Canvas
Plantilla rapida para aterrizar objetivo, referencias, restricciones y Definition of Done antes de pedir codigo.
Rubrica y hoja de taller
Rubrica de PR y registro de iteraciones para trabajo en parejas, reviews internas y retrospectivas del equipo.
Adopción Real en Equipos de Desarrollo
Qué debe cambiar en el trabajo diario para que la IA aporte sin degradar la calidad
Checklist de Mejores Prácticas
HAZLO
- ✓ Revisa y edita todo código generado
- ✓ Verifica seguridad y cumplimiento
- ✓ Mantén el control de versiones limpio
- ✓ Contextualiza tus prompts (CRISP)
- ✓ Usa prompts específicos para cada tarea
- ✓ Combina AI con pruebas automáticas
- ✓ Documenta decisiones de diseño
- ✓ Itera y refina con feedback
- ✓ Mantén un journal de patrones efectivos
- ✓ Comparte conocimiento del equipo
NO HAGAS
- ✗ No uses prompts genéricos o vagos
- ✗ No confíes ciegamente en sugerencias
- ✗ No copies-pegues sin entender
- ✗ No desatiendas la seguridad
- ✗ No ignores las mejores prácticas del equipo
- ✗ No olvides documentar por qué cambios
- ✗ No uses AI sin tests posteriores
- ✗ No dejes código sin revisar
- ✗ No asumas que el AI siempre está correcto
- ✗ No pierdas el aprendizaje en el proceso
Consideraciones de Seguridad
Datos Sensibles
Nunca compartas con AI público: contraseñas reales, tokens, keys, datos de clientes, IPs internas.
✓ Usa entornos privados o corporativos para código sensible.
✓ Sanitiza ejemplos antes de compartir.
Inyección de Prompts
Si usas AI para procesar input de usuarios, valida y sanitiza siempre.
El mismo cuidado que con SQL injection: nunca concatenes user input directamente en prompts.
Derechos de Autor
Verifica que el código generado no infriga licencias (GPL, AGPL, etc.).
Revisa la política de licencias y entrenamiento del proveedor que uses antes de incorporar código generado a un proyecto real.
Prácticas Seguras
- Revisa todas las dependencias que AI sugiere
- Usa SBOM (Software Bill of Materials) tools
- Mantén dependencias actualizadas
- Ejecuta SAST (Static Analysis) en código generado
- Prueba edge cases y errores específicos
Qué debería salir del curso
Si el curso funciona, al terminar no tendrás un catálogo memorizado: tendrás un método de trabajo reutilizable dentro del equipo.
Integración con tu Flujo Git y PRs
La IA no vive fuera de tu workflow — tiene que encajar en él. Aquí el patrón que funciona mejor en equipos con PRs y code review:
1. Crea la rama antes de abrir la IA
La IA va a editar archivos. Trabaja siempre en una feature branch y revisa el estado del repo antes de empezar. Si necesitas descartar cambios, hazlo con criterio sobre el diff, no con comandos globales y ciegos.
2. Commits atómicos mientras iteras
Haz commits pequeños después de cada bloque que hayas revisado y validado. No esperes al final — si el agente rompe algo en la siguiente iteración, tienes un punto de retorno limpio.
# Opcional: indica en el commit que fue asistido por IA
git commit -m "feat(orders): add summary endpoint [ai-assisted]"
# Así el equipo sabe qué revisar con más atención en el PR
3. Antes del PR: revisa el diff completo
Ejecuta git diff main y lee cada cambio. El code review de tus compañeros no reemplaza tu propia revisión — tú eres el responsable de lo que pushas, lo haya escrito un humano o una IA.
4. En la descripción del PR, sé transparente
No es obligatorio, pero si una parte significativa fue generada por IA, mencionarlo ayuda al reviewer a saber dónde poner más atención. Muchos equipos están adoptando convenciones como [ai-assisted] en el título.
5. Usa la IA para revisar PRs de otros
Pega el diff en el chat o usa la integración disponible y pide una revisión con el prompt del Ejercicio 3. La IA no sustituye la aprobación humana, pero sí puede ayudarte a llegar con mejores preguntas a la review.
Checklist de Revisión para Código Generado por IA
Úsala en tus primeras semanas hasta que desarrolles el instinto. Después la habrás interiorizado.
| Categoría | Qué revisar | Señal de problema |
|---|---|---|
| 🔴 Seguridad | Inputs validados, no hay SQL concatenado, no hay datos sensibles en logs | String query = "SELECT * FROM users WHERE id=" + userId |
| 🔴 Nulos | Optional usado correctamente, no hay NPE potenciales | user.getAddress().getCity() sin comprobar nulos |
| 🟡 Rendimiento | No hay queries N+1, no hay findAll() sobre tablas grandes | Loop con llamada a repository dentro |
| 🟡 Transacciones | @Transactional en métodos que modifican datos, rollback correcto | Dos saves sin @Transactional — si el segundo falla, el primero ya está en BD |
| 🟡 Edge cases | Lista vacía, valor 0, string vacío, fecha en el pasado | Asumir que la lista siempre tiene al menos un elemento |
| 🟢 Convenciones | Inyección por constructor, nomenclatura, formato | @Autowired en campo, nombres en inglés cuando el proyecto usa español |
| 🟢 Tests | Cubren el caso feliz Y los casos de error | Solo el test del happy path, sin probar excepciones |
Seguridad: Qué No Pegar Nunca en el Chat
| Tipo de dato | ¿Pegar? | Alternativa |
|---|---|---|
| Código de negocio, entidades, services | ✅ Sí | — |
| Stack traces y logs de error (sin datos de usuarios) | ✅ Sí | — |
| API keys, tokens, passwords | ❌ Nunca | Usa placeholders: API_KEY_HERE |
| Datos personales de usuarios reales (emails, nombres, DNIs) | ❌ Nunca | Anonimiza o usa datos ficticios |
| application.properties con credenciales de producción | ❌ Nunca | Pega solo la estructura con valores como ${DB_PASS} |
| Logs con datos de producción | ⚠️ Con cuidado | Elimina IDs de usuarios, IPs, emails antes de pegar |
| Código propietario de clientes bajo NDA | ⚠️ Consultar | Revisa la política de vuestra empresa antes |
Tu Plan de los Primeros 30 Días
El error más común es querer usar todo a la vez desde el día uno. La adopción que funciona en equipos serios es progresiva: primero criterio, luego repetibilidad, después automatización.
Semana 1 — Uso acotado
Úsala solo en tareas que ya sabes evaluar: boilerplate, tests sencillos, lectura de código y dudas localizadas. Objetivo: aprender a detectar rápido cuándo ayuda y cuándo estorba.
Semana 2 — Chat y revisión
Empieza a pedir explicaciones, tests y revisiones de diffs. Objetivo: convertir la IA en una ayuda para pensar y revisar, no solo para escribir.
Semana 3 — Cambio real y pequeño
Haz una tarea de producción bien delimitada: un endpoint, un DTO, unos tests o una refactorización mecánica. Objetivo: completar una PR pequeña con revisión exhaustiva.
Semana 4 — Flujo supervisado
Solo entonces prueba agentes multiarchivo o terminal con una tarea que siga siendo reversible. Objetivo: que el equipo tenga un flujo repetible y no una colección de trucos personales.
Apéndice Operativo: Referencia Temporal
Lo minimo que conviene revisar antes de impartir, sin convertir el curso en una comparativa comercial
Que mirar y que no sobrecargar
Los precios, limites y nombres de plan envejecen rapido. Esta parte solo existe para no impartir el curso sobre supuestos falsos o planes incompatibles con el flujo real del equipo.
| Revisar | Pregunta util | Impacto real |
|---|---|---|
| Gobernanza | Permite políticas de datos, trazabilidad y control del equipo? | Sin eso, la adopcion en entorno serio se frena aunque la herramienta sea buena. |
| Limites | Se queda corto para taller, agentes o review continuada? | Un plan limitado rompe el flujo justo cuando el equipo empieza a coger traccion. |
| Integracion | Encaja con IDE, terminal, Git y PRs reales del equipo? | La friccion mata mas adopciones que el precio. |
| Retorno | Ahorra tiempo en PRs, tests, refactors o soporte a legacy? | La decision correcta depende del workflow y del riesgo, no del marketing. |
Regla docente
Para clase suele bastar con una herramienta fuerte en IDE y otra orientada a agente/terminal. Todo lo demas es apendice, no temario.
Checklist de Adopción: Primeros 30 Días
Un plan mínimo para pasar de la curiosidad a un uso repetible y supervisado
Día 1: dejar un flujo mínimo funcionando
Semana 1: crear criterio, no dependencia
Día 30: adopción controlada en el equipo
Señales de que la adopción va bien
| Señal | Qué significa | Qué hacer si no ocurre |
|---|---|---|
| PRs más pequeñas y mejor explicadas | La IA se está usando con alcance controlado | Reducir el scope de las tareas y exigir diff más corto |
| Más tests y más casos límite cubiertos | Se usa para reforzar calidad, no solo para teclear menos | Obligar a pedir tests y revisar vacíos, nulos y validaciones |
| Menos tiempo en arrancar tareas mecánicas | El equipo ha encontrado dónde realmente aporta | Volver a casos simples y evitar tareas ambiguas |
| Las reviews detectan menos “sorpresas” | Hay contexto, reglas y guardrails compartidos | Reforzar instrucciones del proyecto y checklist de revisión |
Cursos Gratuitos y Fuentes Primarias
Material de ampliacion para seguir practicando despues del curso sin perder el foco tecnico
Material curado para seguir aprendiendo después del curso. No es una lista de todos los recursos que existen — es una selección de los que más valor aportan a un developer con experiencia.
Prompt Engineering Tutorial — Anthropic
9 capítulos interactivos directamente con el modelo. El mejor recurso estructurado para prompt engineering.
GratisInteractivoPrompt Engineering for Developers — DeepLearning.AI
Mini-curso de Andrew Ng orientado a código. Jupyter notebooks ejecutables, en inglés, ~2 horas.
GratisCon códigoGitHub Copilot Developer Path — Microsoft Learn
Ruta modular con ejercicios prácticos, evaluaciones y certificado. Cubre IDE, tests, agentes y PR review.
GratisGitHub Skills — Copilot Labs
Ejercicios repo-based cortos: Getting Started, MCP con Copilot, Coding Agent. Práctico desde el minuto 1.
GratisRepo-basedAgents Course — Hugging Face
Cómo funcionan los agentes de IA: tool use, multi-agent, ReAct loop. Más técnico, con ejemplos en Python.
GratisMCP Course — Hugging Face
El único curso específico sobre Model Context Protocol. Explica cómo conectar herramientas externas a modelos.
GratisThe Illustrated Transformer — Jay Alammar
La explicación visual más famosa. Diagramas animados del mecanismo de atención. Lectura obligada.
GratisTransformer Explainer — Georgia Tech
Escribe texto y mira cómo fluye por cada capa del transformer en tiempo real en el navegador.
GratisDemo vivaAttention — 3Blue1Brown
Animaciones matemáticas del mecanismo de atención. Sin código, pura intuición visual. Serie completa en YouTube.
GratisVídeoHow Transformer LLMs Work — DeepLearning.AI
Mini-curso de ~1h con Andrew Ng y Jay Alammar sobre la arquitectura completa. Técnico pero accesible.
GratisCursoAnthropic Prompt Engineering Docs
Guía oficial de prompting, XML structuring, extended thinking, tool use y buenas prácticas con Claude.
OficialGitHub Copilot Docs
Todo sobre Copilot: planes, features por IDE, Agent Mode, skills, instrucciones y límites actualizados.
OficialOpenAI Codex / Platform Docs
Documentación de la API de OpenAI, incluyendo Codex CLI, function calling y guías para developers.
OficialSpring Boot + Spring Framework Docs
Para verificar todo lo que la IA afirme sobre anotaciones, perfiles, MVC, JPA, validación o tests.
Referencia💡 La regla de las fuentes primarias
Si la IA te dice que una feature existe, que un método se llama así, o que una versión soporta algo: verifica en la documentación oficial antes de convertirlo en código de producción o en material del curso. Las alucinaciones son más frecuentes sobre versiones específicas y APIs nuevas.