Hay un modo de fallo común en la ingeniería de producto que desde fuera parece productivo.
Alguien tiene una idea. Se crea un ticket. Un desarrollador empieza a programar rápido. Unos pull requests después, todos se dan cuenta de que estaban resolviendo versiones ligeramente distintas del problema.
Entonces empieza la parte cara:
- producto clarifica la intención a posteriori
- diseño parchea edge cases que nunca se describieron
- ingeniería reescribe flujos que técnicamente funcionan pero no dan en el punto
- QA reporta comportamiento "incorrecto" aunque nadie escribió qué era "correcto"
Ese es el coste de construir desde asunciones en vez de desde una spec.
Cuando digo spec-driven development, no me refiero a documentos pesados escritos por escribir. Me refiero a algo mucho más práctico: definir el comportamiento con la claridad suficiente para que implementar sea un paso de ejecución, no un proceso de descubrimiento.
Ese cambio suena pequeño. Cambia mucho.
Una spec es un registro de decisiones
El mayor malentendido sobre las specs es que son documentación.
No son principalmente documentación. Son una forma de forzar decisiones pronto.
Una buena spec responde preguntas como:
- ¿qué problema resolvemos?
- ¿para quién es?
- ¿qué debería pasar en el path normal?
- ¿qué debería pasar en el path de fallo?
- ¿qué está explícitamente fuera de scope?
- ¿cómo sabremos que está hecho?
Si esas respuestas son vagas, la implementación también será vaga.
La mayoría del desperdicio de ingeniería es desperdicio de ambigüedad
Los equipos suelen hablar de desperdicio en términos de mal código, malas abstracciones o infra lenta. Eso importa. Pero mucho tiempo perdido ocurre antes.
Aparece como:
- construir bien lo incorrecto
- descubrir requisitos tras el merge
- retrabajar UI porque las transiciones de estado nunca se definieron
- backend y frontend implementando asunciones distintas
- tests en verde mientras la feature sigue sintiéndose rota
Eso no es realmente un fallo de ejecución. Es un fallo de especificación.
Una spec fuerte no elimina la iteración. Elimina la iteración de baja calidad.
Cómo se ve "spec-driven" en la práctica
Una buena spec suele ser más pequeña de lo que la gente cree.
Para trabajo de producto y aplicación, quiero que una spec cubra al menos estas áreas:
1. Objetivo
¿Qué outcome de usuario o negocio debería cambiar?
Mal:
Añadir un mejor flujo de onboarding.
Mejor:
Reducir el drop-off del onboarding eliminando pasos innecesarios antes de crear la cuenta.
La segunda versión te dice qué importa. La primera solo suena ambiciosa.
2. Flujo de usuario
¿Cuál es el path exacto por la feature?
Por ejemplo:
- el usuario hace clic en "Start trial"
- el usuario introduce email y password
- la cuenta se crea inmediatamente
- los datos de empresa se recogen tras el login
- si el email ya existe, mostrar error inline y preservar los campos
Ese nivel de claridad previene una cantidad sorprendente de churn.
3. Estados y edge cases
Aquí es donde muchas features se rompen.
No solo especeas el happy path. Especeas el comportamiento real:
- loading
- empty
- validation failure
- permission failure
- timeout
- partial success
- retry path
Si una feature toca dinero, auth, mensajería o acciones destructivas, los edge cases no son secundarios. Son la feature.
4. Restricciones
¿Qué debe seguir siendo verdad?
Ejemplos:
- esta acción debe ser idempotente
- el layout móvil debe soportar uso con una mano
- nada de información personal identificable en logs
- la respuesta de la API debe mantenerse bajo cierto presupuesto de latencia
Las restricciones evitan que la implementación derive hacia decisiones localmente convenientes pero globalmente incorrectas.
5. Criterios de aceptación
Esta es la parte que los equipos se saltan más a menudo, y luego lamentan.
Los criterios de aceptación deberían ser lo bastante específicos para que QA, producto e ingeniería evalúen lo mismo.
Por ejemplo:
- el usuario puede enviar el formulario solo con teclado
- los envíos duplicados no crean registros duplicados
- un pago fallido muestra un estado recuperable y preserva los datos de billing
- el email de confirmación se envía solo tras persistir con éxito
Eso es mucho mejor que "works as expected".
Las specs mejoran la velocidad, no solo la calidad
Algunos ingenieros oyen "spec-driven development" e inmediatamente temen el process drag.
Esa preocupación es comprensible si has visto specs hinchadas que nadie lee. Pero ese no es un problema de las specs. Es un problema de malas specs.
Una spec afilada acelera a los equipos porque:
- menos decisiones se difieren al code review
- la implementación es más fácil de repartir entre personas
- QA tiene un target concreto
- el feedback de diseño se vuelve objetivo más rápido
- las regresiones son más fáciles de detectar porque el comportamiento esperado está escrito
Los equipos más rápidos con los que he trabajado no eran los que empezaban a programar primero. Eran los que eliminaban la incertidumbre primero.
Las specs mejoran los code reviews
La calidad del code review sube mucho cuando hay una spec detrás del cambio.
Sin spec, las reviews suelen derivar a discusiones de estilo o preferencias locales de implementación:
- "Yo estructuraría este hook distinto."
- "¿Renombramos esta variable?"
- "Quizá usar otro patrón aquí."
Esos comentarios a veces sirven, pero no bastan.
Con spec, los reviewers pueden hacer preguntas de más valor:
- ¿la implementación coincide con el comportamiento esperado?
- ¿están cubiertos los estados de fallo?
- ¿falta algún criterio de aceptación?
- ¿el modelo de datos soporta el flujo descrito?
Esa es una review mucho más seria.
Las specs ayudan a discrepar antes, lo cual es bueno
Un beneficio infravalorado del spec-driven development es que crea un lugar para el desacuerdo antes de que exista código.
Eso importa porque discrepar se vuelve más caro una vez que la implementación empieza.
Si producto, diseño e ingeniería tienen modelos mentales distintos, quieres que esa colisión ocurra mientras el artefacto aún es barato de cambiar. Una spec le da al equipo algo concreto que cuestionar.
Eso es sano. Es mucho mejor discutir por un párrafo que por una feature mergeada.
La spec debería estar cerca del trabajo
No me importa mucho si la spec vive en Notion, GitHub, Linear o un Markdown en el repo. Me importa que siga conectada a la implementación.
Un workflow práctico suele verse así:
- escribir la spec en lenguaje llano
- revisarla con las personas afectadas
- convertir los criterios de aceptación en tareas de implementación
- construir contra la spec
- validar el comportamiento shippeado contra los criterios originales
Si la spec está demasiado lejos del código, se pudre. Si es demasiado vaga, se ignora. Si es demasiado grande, nadie puede retenerla en la cabeza.
La spec correcta es el artefacto más pequeño que deja el trabajo sin ambigüedad.
Las specs deberían escalar hacia abajo además de hacia arriba
No toda tarea necesita un documento multi-sección.
Spec-driven development es un mindset, no una plantilla fija. Un bugfix de una hora puede seguir siendo spec-driven si defines:
- comportamiento actual
- comportamiento esperado
- pasos de reproducción
- condición de aceptación
Eso sigue siendo una spec. Solo que proporcionada.
Lo que importa no es el tamaño del artefacto. Lo que importa es si el equipo programa contra comportamiento explícito en vez de intuición.
Mi regla de oro
Si una feature tiene algo de lo siguiente, quiero una spec real antes de implementar:
- múltiples estados de usuario
- workflows asíncronos
- dependencias cross-team
- dinero, permisos o concerns de integridad de datos
- copy visible o UX interpretable de varias formas
Esos son exactamente los casos donde "we'll figure it out while building" sale caro.
Por qué sigo volviendo a ello
Spec-driven development es una de esas prácticas que solo se siente más lenta si mides la primera hora.
Medida en todo el lifecycle de una feature, suele ser más rápida porque reduce:
- retrabajo
- asunciones ocultas
- churn de review
- ambigüedad de QA
- sorpresas en producción
También mejora la calidad del pensamiento de ingeniería. Escribir una spec te obliga a preguntarte si realmente entiendes el problema o solo crees entenderlo.
Esa es disciplina valiosa.
El punto real
El propósito de una spec no es hacer que el trabajo se sienta formal.
El propósito es hacer explícita la intención antes de que el código endurezca la idea equivocada.
Por eso importa spec-driven development. No es burocracia. Es una forma de shippear con menos guesswork.