Proyecto compartido. En el taller de Intermodular que abre esta semana has trabajado defender el producto y el proceso sobre la misma versión. En Servidor continúas la implementación del mismo producto.
Se explica
25 minutos · explicación y demostración
La versión final ya está preparada y documentada. Hoy defenderás las decisiones del backend con demostraciones sobre el mismo commit. La memoria técnica conecta requisito, implementación y evidencia para que la evaluación no dependa de una explicación de memoria.
La defensa se coordina con Intermodular 26: se hace una sola demostración y cada módulo aplica sus criterios. Relaciona las decisiones técnicas con el balance final del proyecto y reutiliza las comprobaciones de Intermodular.
La prueba definitiva: La Defensa Técnica
Llegar a la Sesión 52 significa que has completado el viaje completo: desde las primeras peticiones HTTP en la UD1 hasta un sistema empresarial complejo, seguro, observable y conectado.
En el mundo profesional y académico, el valor de un ingeniero se demuestra en la defensa de sus decisiones:
- Un comercial habla de lo atractiva que es la interfaz.
- Un ingeniero de backend explica por qué utilizó un tipo
NUMERIC(12,2)para evitar pérdidas de precisión en dinero, cómo configuró un timeout de 2 segundos enRestClientpara evitar el agotamiento de hilos en Tomcat, y cómo una política CORS bien diseñada protege a sus usuarios.
El principio de la defensa técnica
No defiendas que tu código es perfecto: defiende que conoces sus decisiones, sus compromisos y sus límites.
Un tribunal respeta al desarrollador que reconoce con honestidad: «Esta relación la resolvimos con paginación en memoria por simplicidad, pero en una versión con un millón de registros introduciríamos un índice compuesto en PostgreSQL y particionamiento».
Estructura de la Defensa Técnica (15 minutos)
Distribuye tu exposición con rigor profesional siguiendo este minutaje:
- 0–3 min: Arquitectura, modelo relacional y decisiones de diseño
- 3–8 min: Demostración en vivo en Bruno (Happy Path y Casos Límite)
- 8–12 min: Seguridad RBAC/ABAC, Resiliencia y Observabilidad (Logs MDC)
- 12–15 min: Deuda técnica, límites honestos y turno de preguntas
- Bloque 1: Arquitectura y Modelo (3 minutos):
- Muestra el diagrama de agregados (
Proyecto,Tarea,Incidencia,Usuario). - Justifica la elección de tipos de datos (
BIGINT IDENTITY,NUMERIC(12,2)para dinero) y la estrategia de esquemas versionados conddl-auto=validate.
- Muestra el diagrama de agregados (
- Bloque 2: Demostración en vivo en Bruno (5 minutos):
- No uses diapositivas estáticas: abre Bruno y ejecuta peticiones reales.
- Demuestra el camino feliz: autenticación JWT → creación de proyecto → respuesta
201 Createdcon cabeceraLocation. - Demuestra la robustez ante errores de negocio: intenta sobrepasar el presupuesto total de un proyecto y muestra el error
400 Bad Requesto intenta cerrar con tareas pendientes mostrando el código409 Conflict.
- Bloque 3: Seguridad, Resiliencia y Observabilidad (4 minutos):
- Muestra la matriz de permisos: autentícate con un rol no autorizado y muestra el
403 Forbidden. - Demuestra la degradación elegante: simula la desconexión de la red de Open-Meteo y enseña cómo la incidencia se guarda con aviso en lugar de romper con un 500.
- Abre la terminal y enseña el archivo de logs: filtra por un
X-Correlation-IDy demuestra la trazabilidad de la llamada.
- Muestra la matriz de permisos: autentícate con un rol no autorizado y muestra el
- Bloque 4: Límites y Compromisos de Ingeniería (3 minutos):
- Explica los compromisos adquiridos (Trade-offs): qué optimizaste (velocidad de desarrollo, consistencia) y qué quedó como deuda técnica para una futura versión 2.0 (ej: migrar a Transactional Outbox para webhooks).
Se trabaja
140 minutos · implementación guiada sobre el proyecto propio
Paso 1 · Retomar el proyecto y preparar la comprobación
- Abre el repositorio, la aplicación y la documentación de la versión final. Comprueba que todos corresponden al commit que vas a presentar.
- Prepara un recorrido permitido, uno rechazado, una regla transaccional y una prueba automatizada. Localiza sus clases antes del ensayo.
- Elige también un fallo que hayas corregido y conserva la evidencia que explica causa, cambio y comprobación.
Paso 2 · Preparación del guion y simulación de preguntas
Las cuatro preguntas clásicas que formulará el tribunal y cómo argumentarlas:
| Pregunta del tribunal | Enfoque de respuesta profesional con evidencias |
|---|---|
| «¿Por qué utilizaste tokens JWT en lugar de sesiones tradicionales con cookies en el servidor?» | “Porque nuestra arquitectura desacopla el backend de múltiples clientes potenciales (web Angular y clientes móviles de campo); el token JWT stateless permite escalar horizontalmente sin replicar memoria de sesiones en Tomcat.” |
| «¿Qué ocurre si dos usuarios intentan crear tareas al mismo tiempo y el presupuesto no alcanza para ambas?» | “La comprobación y el guardado se ejecutan dentro de una transacción con aislamiento en PostgreSQL; además hemos evaluado el uso de bloqueos pesimistas (PESSIMISTIC_WRITE) sobre la fila del proyecto para serializar las operaciones concurrentes.” |
| «¿Por qué no guardas los ficheros directamente en una tabla de base de datos como campos BLOB?» | “Porque saturaría el tamaño de las copias de seguridad de PostgreSQL y penalizaría la memoria RAM del motor relacional; almacenar los binarios en un volumen de almacenamiento externo con nombres UUID opacos y guardar solo los metadatos en la base de datos es el estándar de la industria.” |
| «Si tu servicio meteorológico externo se congela, ¿se congela tu backend?» | “No, porque hemos configurado un Connect Timeout de 2 segundos y un Read Timeout de 3 segundos mediante SimpleClientHttpRequestFactory en RestClient, acompañado de un bloque de degradación elegante que devuelve datos por defecto.” |
| «Me dices que tienes un 80 % de cobertura. ¿Qué parte del sistema es la que peor está probada?» | “La cobertura de líneas es engañosa. Nuestro punto más débil es la concurrencia sobre el presupuesto: los tests la comprueban en secuencia, no con hilos simultáneos. Lo detectamos en la sesión 51 y está anotado como riesgo abierto en la memoria.” |
| «Enséñame dónde está escrita la regla de que un operario no puede cerrar un proyecto.» | Aquí no se contesta con palabras: se abre el código. “Está en dos sitios, y a propósito: el @PreAuthorize de este método y el test operario_noPuedeCerrarProyecto que lo vigila. Si alguien quita la anotación, la suite se pone en rojo.” |
| «¿Qué harías distinto si empezaras hoy?» | La peor respuesta es «nada». “Habría sacado el esquema a Flyway desde el primer día en vez de a schema.sql: lo hicimos en la sesión 47 y ya arrastrábamos datos que hubo que migrar a mano.” |
Escribe tu guion en una tabla de tres columnas. La tercera es la que decide si apruebas:
| Minuto | Lo que digo | Lo que enseño mientras lo digo |
|---|---|---|
| 0–3 | El modelo y por qué estos tipos de datos | El diagrama y la clase Proyecto con su @Column(precision = 12, scale = 2) |
| 3–8 | El camino feliz y dos casos límite | La colección ejecutándose en vivo |
| 8–12 | Seguridad, resiliencia y trazas | Un 403 real, la red caída y el log filtrado por correlationId |
| 12–15 | Lo que no está terminado | La lista de deuda técnica de la memoria |
Cualquier fila cuya tercera columna quede vacía es una afirmación sin prueba. O le buscas evidencia, o la quitas del guion: en una defensa técnica, lo que no se enseña no cuenta.
Una demostración se cae por logística, no por código. Prepara esto antes del día:
-
Una carpeta en tu cliente HTTP llamada
defensa, con las peticiones en el orden exacto del guion y numeradas:01-login-admin,02-crear-proyecto,03-crear-tarea… -
Variables de entorno configuradas para que el token se guarde solo tras el login. Nadie debe verte copiando y pegando un JWT de 300 caracteres en directo.
-
Un
data.sqlcon datos de demostración creíbles: proyectos con nombres reales, noaaanitest1. -
Una segunda ventana de terminal con los logs ya corriendo, y el tamaño de letra subido para que se lea desde el fondo del aula.
-
Un plan B: si la red del centro falla, tu degradación elegante hará que la demostración siga funcionando. Practica contando eso como una virtud, porque lo es.
-
Intercambia proyectos con otro equipo.
-
Cada uno prepara cinco preguntas sobre el proyecto ajeno, mirando el código, no la memoria.
-
Realiza la defensa completa cronometrada, con turno de preguntas al final.
-
Anota las preguntas que no supiste contestar: esa lista es tu única tarea pendiente hasta el día de la defensa.
Paso 3 · Ensayo general cronometrado
Prepara la versión que has entregado con su configuración de demostración y datos ficticios. Comprueba acceso, base de datos y proveedor antes de iniciar el cronómetro. Si utilizas PowerShell, sigue el log con Get-Content logs/aplicacion.log -Tail 30 -Wait; en Linux/macOS, con tail -f. Ensaya los bloques del guion con margen para preguntas. Si cambia algún dato o estado durante la demostración, reconstruye el escenario con la colección antes del siguiente ensayo.
- Prepara el entorno:
- Arranca Docker con PostgreSQL limpio.
- Levanta el backend con
./mvnw spring-boot:run. - Abre Bruno con la colección ordenada de la defensa.
- Abre la terminal con
tail -f logs/aplicacion.log.
- Ejecuta el ensayo con cronómetro en mano:
- Comprueba que completas la exposición en exactamente 12 minutos, dejando 3 minutos limpios para preguntas.
- Si alguna petición falla en vivo, no entres en pánico: copia el
correlationIddel JSON de error, búscalo en la terminal de logs y explica al tribunal con total calma qué regla de validación o seguridad ha actuado. Eso demuestra madurez de ingeniería.
Paso 4 · Si algo se tuerce en directo
| Lo que pasa | Lo que no hay que hacer | Lo que demuestra madurez |
|---|---|---|
| Una petición devuelve un error que no esperabas | Recargar cinco veces en silencio | Leer el detail en voz alta, buscar el correlationId en los logs y explicar qué ha pasado |
| No hay red en el aula | Abandonar la demostración | Enseñar que la degradación elegante mantiene la aplicación en pie: es una prueba mejor que la prevista |
| Te preguntan algo que no sabes | Improvisar una explicación falsa | «No lo he medido, así que no te lo puedo afirmar. Lo que sí sé es…» |
| Se te acaba el tiempo | Acelerar y saltarte los límites | Ir directo al bloque 4: reconocer la deuda técnica puntúa más que un caso feliz de más |
| El tribunal encuentra un fallo real | Justificarlo o minimizarlo | Reconocerlo, decir qué test lo habría cazado y dónde lo colocarías |
Paso 5 · Redactar la Memoria Técnica de la Defensa
Prepara una explicación técnica del proyecto. Para cada apartado sigue requisito → decisión → archivo o método → prueba y resultado; enlaza los registros de sesiones cuando contengan la evidencia para no volver a copiarla. Añade el commit y la URL de la versión demostrada, más las limitaciones conocidas. La explicación debe corresponder al código y a las pruebas que realmente funcionan.
- Resumen ejecutivo: qué resuelve el sistema y con qué tecnologías, en una página.
- Modelo de datos: diagrama entidad-relación y justificación del esquema SQL, tipo por tipo en los campos delicados (dinero, fechas, estados).
- Contrato de la API: matriz de seguridad RBAC/ABAC frente a la lista de endpoints, con el
openapi.jsonde la sesión 51 como anexo. - Resiliencia: qué servicios externos consumes, con qué timeouts, qué pasa cuando fallan y cómo lo has comprobado.
- Estrategia de pruebas: qué cubre la suite, qué no cubre, y el dato de la sesión 51 sobre cuántos fallos encontró la pasada manual que los tests no vieron.
- Deuda técnica: inventario honesto de lo que dejarías distinto, ordenado por lo que más duele. Este apartado, bien hecho, vale más que cualquier otro: es el que demuestra que sabes juzgar tu propio trabajo.
- Trazabilidad del curso: una tabla final que asocie cada capacidad del sistema con la unidad donde la aprendiste. Es tu propio índice de lo que sabes hacer, y es lo que te llevas del módulo.
- Cómo saber que lo has terminado
- Has completado la defensa entera dentro del tiempo, con la demostración en vivo funcionando de principio a fin; cada afirmación del guion tiene una evidencia que la acompaña; sabes contestar las cinco preguntas que te hizo el equipo con el que ensayaste; y la memoria incluye un apartado de límites que no rebaja lo que hiciste, sino que lo sitúa.
Formato de entrega
Guarda la memoria y el guion de defensa en la explicación técnica del proyecto y enlázalos desde el README.
Paso 6 · Comprobar y registrar el resultado del proyecto
- Ensaya la demostración y explica el camino de una petición desde el cliente hasta el dato persistido, incluyendo identidad y reglas.
- Entrega la memoria y los enlaces dentro del repositorio; deben permitir revisar los mismos resultados aunque se termine la demostración en clase.
Ampliación si has completado el trabajo
Primero termina y verifica los pasos anteriores. Estos retos profundizan en el mismo contenido; no sustituyen la entrega ni obligan a iniciar otro proyecto.
Reto · Automatización de la demo con Newman o Bruno CLI
En lugar de pulsar las peticiones una a una en la interfaz gráfica durante la defensa, automatiza la ejecución de toda la suite de pruebas desde la línea de comandos:
- Instala el CLI de Bruno (
@usebruno/cli) o utiliza Newman. - Ejecuta la colección completa por consola:
bru run --env local - Muestra al tribunal cómo se ejecutan 30 peticiones secuenciales con aserciones automatizadas de códigos HTTP, cabeceras y esquemas JSON en menos de 5 segundos.
Ver respuestas
1 · Porque demuestra de forma irrefutable que el sistema está vivo, que el código compila, que la base de datos persiste datos reales y que la aplicación responde a las reglas de negocio acordadas.
2 · Manteniendo la calma, leyendo el código de estado devuelto, acudiendo a los logs mediante el correlationId e interpretando con fundamento qué ha ocurrido; depurar un fallo en vivo con soltura transmite enorme competencia técnica.
3 · Porque ningún software real es perfecto; demostrar que eres consciente de los cuellos de botella y que sabes cómo resolverlos en una siguiente versión refleja pensamiento crítico y madurez profesional.
4 · La integridad de los datos (persistencia transaccional en PostgreSQL), la seguridad (autenticación y autorización RBAC/ABAC) y la resiliencia (observabilidad, timeouts y degradación elegante ante fallos externos).
Cierre
15 minutos · resultado comprobable y explicación individual
Al terminar la sesión:
Se evalúan individualmente comprensión, implementación y verificación del backend; Intermodular utiliza sus propias evidencias del flujo de trabajo.
Cada integrante explica una decisión del código apoyándose en una de las comprobaciones realizadas.