Aprende a escribir restricciones y no-objetivos en especificaciones de apps para reducir el retrabajo. Usa un formato simple para fijar stack, presupuesto, fecha límite y lo que puede cambiar.

El retrabajo ocurre cuando construyes algo que funciona, pero es lo incorrecto para el proyecto. Los equipos rehacen pantallas, reescriben lógica, migran datos o reconstruyen una funcionalidad porque una decisión clave aparece tarde.
Suele manifestarse de formas conocidas: se reconstruye un flujo porque se asumieron mal los roles de usuario; se rediseñan pantallas porque se esperaba soporte móvil que nunca se declaró; el modelo de datos cambia porque “necesitamos historial de auditoría” aparece después de la versión uno; se cambia una integración porque el cliente no puede usar un servicio de terceros; o la app debe moverse de hosting por cumplimiento o reglas regionales.
Las restricciones faltantes crean decisiones sorpresa más tarde. Cuando una especificación dice “construir un CRM”, deja decenas de preguntas abiertas: quién lo usa, qué plataformas importan, qué reglas de seguridad aplican, qué debe quedar fuera de alcance, cuál es el presupuesto y la línea de tiempo reales. Si las respuestas llegan después de que existe código, el proyecto paga dos veces: primero por construir, y otra vez por deshacer.
Un ejemplo simple: un fundador pide “citas + recordatorios”. La semana uno se envían recordatorios por email. La semana dos mencionan que necesitan SMS, pero el SMS no está permitido en su país o rompe el presupuesto. Ahora el sistema de recordatorios se rediseña, cambian pantallas y las pruebas se reinician. El retrabajo no fue causado por mal código. Fue causado por restricciones que llegaron tarde.
El objetivo es reducir el ida y vuelta antes de que se escriba o genere cualquier código. Ya sea que programes a mano o uses un generador por chat, el resultado solo puede seguir las reglas que le das. Si las reglas aparecen tarde, el trabajo se mueve y lo rehaces.
No se trata de escribir un documento largo. Una especificación ligera puede ser estricta donde importa. Al principio, debería responder:
Cuando las restricciones y los no-objetivos se escriben primero, actúan como barandillas. Tienes menos sorpresas, menos reconstrucciones y decisiones más claras desde el primer día.
Las restricciones son decisiones fijas con las que el proyecto debe convivir. Ignorarlas significa trabajar dos veces, porque construyes en una dirección que no puede lanzarse.
Los no-objetivos son elecciones explícitas de no construir algo. Si los omites, la especificación crece silenciosamente a medida que la gente añade “pequeños” extras. Ahí es donde terminas rehaciendo pantallas, flujos y modelos de datos.
Una regla rápida: las restricciones limitan cómo construyes; los no-objetivos limitan qué construyes.
Una restricción es un requisito que no cambia sin una decisión real (y un trade-off).
Ejemplos:
Cuando una restricción es real, escríbela como una oración con la que no se pueda discutir. Si alguien dice “tal vez”, aún no es una restricción.
Un no-objetivo es un “no vamos a hacer esto” explícito, aunque parezca útil. Protege el primer lanzamiento.
Ejemplos:
Los no-objetivos no son negatividad. Previenen desvíos caros. Por ejemplo, “no roles personalizados en v1” puede ahorrar semanas de casos límite de permisos que obligarían a rediseñar la base de datos y la UI.
Antes de escribir páginas de detalles, redacta una oración que fije el proyecto. Mantiene a todos alineados cuando aparecen trade-offs.
Una buena one-liner responde: ¿para quién es esto y cuál es la tarea principal que debe realizar?
Ejemplos de one-liners:
Luego añade una pequeña definición de éxito: 3 a 5 resultados que un usuario real debería lograr cuando el proyecto esté terminado. Escríbelos como resultados de usuario, no como características.
Para el ejemplo de reservas del tutor:
Si aún no tienes métricas, describe el éxito con palabras. “Rápido” es vago, pero “se siente ágil en un teléfono” sigue siendo útil. “Fácil” es vago, pero “no requiere llamada de configuración” es más claro. Puedes añadir números más adelante.
Mantén esta sección corta. Se convierte en el contexto para todo lo que sigue: qué debe ser verdad, qué no debe ocurrir y qué puede cambiar.
El retrabajo a menudo comienza cuando el cronograma y el proceso de decisiones viven solo en la cabeza de alguien. Pon las restricciones del proyecto en la especificación antes de describir pantallas y funciones.
Escríbelas como enunciados simples y comprobables:
Un ejemplo simple:
“La primera release debe enviarse antes del 30 de mayo. Incluye login, una lista básica de clientes y un informe mensual. Sin integraciones en v1. El presupuesto está limitado a $8,000 incluyendo el hosting del primer mes. Las revisiones se realizan en 24 horas los días laborables. El product owner es Sam, quien aprueba cambios de alcance.”
La velocidad de retroalimentación merece su propia línea porque controla cuánto puedes avanzar con seguridad. Si los stakeholders solo pueden revisar una vez a la semana, la especificación debería favorecer lanzamientos más pequeños y menos casos límite.
Elige una cadencia de revisión que refleje la realidad: retroalimentación el mismo día, 24 a 48 horas en días laborables, reunión semanal de revisión únicamente, o (raro) “no se necesita feedback.”
Si no escribes restricciones técnicas temprano, la gente llena los huecos con suposiciones. Ahí es donde los equipos terminan rehaciendo pantallas, migraciones o integraciones después de que el trabajo ya comenzó.
Empieza declarando qué está bloqueado y qué es solo una preferencia. “Preferimos React” no es lo mismo que “debe ser React porque dependemos de una librería interna”. Una oración por decisión basta.
Sé explícito en toda la app: web, backend, base de datos y móvil. Si una parte es flexible, dilo y añade un límite (por ejemplo, “móvil es solo web en v1”).
Una forma simple de escribirlo:
Luego lista las integraciones que no puedes evitar. Nombra los sistemas (pagos, email, analítica, CRM) y anota límites estrictos. Ejemplos: “Debe usarse Stripe para cobros”, “El email debe enviarse vía nuestro proveedor existente”, “La analítica no debe rastrear datos personales”. Si la autenticación está fijada (SSO, Google login, passwordless), dilo.
Las decisiones de hosting cambian la arquitectura. Escribe dónde debe ejecutarse la app y por qué: “Debe ejecutarse en Alemania”, “Los datos deben permanecer en la UE” o “Puede ejecutarse globalmente”.
Si tienes necesidades de cumplimiento, mantenlas concretas: período de retención, reglas de eliminación y necesidades de auditoría.
Ejemplo: “Almacenar registros por 7 años, eliminar dentro de 30 días tras una solicitud verificada, mantener un log de auditoría de quién vio un registro y desplegar solo en el país donde residen los pacientes.” Estas líneas previenen sorpresas justo cuando estás listo para lanzar.
Los no-objetivos son las barandillas de una especificación. Dicen qué no vas a construir, no soportar o no intentar perfeccionar en la primera versión. Esta es una de las formas más rápidas de reducir sorpresas, porque muchas peticiones “pequeñas” llegan después y cambian el plan por completo.
Un buen no-objetivo es lo suficientemente específico como para que un compañero detecte scope creep en una sola oración. También debe estar acotado en el tiempo. “No en v1” es más claro que “no lo haremos”.
Empieza con funciones que la gente suele asumir incluidas. Para una app de reservas simple, podría verse así:
Estas no son malas funciones. Son funciones caras. Escribirlas mantiene la primera release enfocada.
También señala elementos de “detalle” que causan trabajo en cascada: roles, permisos y flujos edge-case. “No roles personalizados. Solo dos roles: Owner y Member.” Esa línea puede ahorrar semanas.
Los equipos a menudo olvidan no-objetivos que no son características. Aparecen más tarde como retrabajo doloroso.
Decide qué no vas a optimizar. Por ejemplo: “No optimizaremos para 1M de usuarios. Asumimos hasta 500 usuarios activos semanales en v1.”
También indica qué no soportarás, para mantener las pruebas realistas: “No Internet Explorer”, “No diseños específicos para tablet” o “Login solo por email y contraseña (sin SSO, sin magic links).”
Una especificación se siente más segura cuando permite que pequeñas decisiones evolucionen. Si solo escribes lo que está fijo, cada nueva idea se convierte en un debate. Una breve lista de “puede cambiar” da espacio para mejorar el producto sin reiniciar el plan.
Manténlo práctico. Cubre lo que esperas aprender tras ver una versión funcional, no grandes funciones nuevas. Elementos flexibles comunes incluyen texto de UI, pequeños ajustes de flujo, columnas en reportes, nombres (roles, estados, categorías) y elecciones básicas de layout.
Luego decide cómo se aceptan los cambios. Sin una regla de aprobación simple, los “ajustes rápidos” se convierten en scope creep silencioso.
Un flujo simple que funciona para la mayoría de equipos pequeños:
La regla clave: los cambios flexibles no deben romper las restricciones fijas. Si tu stack es React + Go + PostgreSQL, una petición “puede cambiar” no puede convertirse en “cambiemos el backend”. Si la fecha límite está fija, “puede cambiar” no puede significar añadir un módulo que necesite dos semanas extra.
Añade una nota de trade-off que todos acepten. Ejemplo: “Si añadimos un nuevo rol de usuario con permisos personalizados, retrasamos el reporting avanzado a la fase 2.”
Una buena especificación empieza limitando opciones, no ampliándolas. Este formato te obliga a escribir las reglas antes de que alguien comience a construir.
Usa esto como encabezado en tu doc:
SPEC v0.1 (date)
Owner:
Reviewers:
1) One-liner
- Build: [what it is]
- For: [who]
- So they can: [main benefit]
2) Success definition (3 outcomes)
- Outcome 1: [measurable result]
- Outcome 2: [measurable result]
- Outcome 3: [measurable result]
3) Fixed constraints (cannot change without re-approval)
- Deadline: [date]
- Budget: [$ or hours]
- People: [who is available]
- Tech stack: [fixed choices]
- Hosting/region: [where it must run]
4) Non-goals (must NOT happen)
- [explicit “no”]
- [explicit “not in v1”]
- [explicit “we won’t support”]
5) Open questions
- Q: [question]
Owner: [name]
Due: [date]
6) Lock rule
- After review: changes require: [what approval looks like]
(El bloque de código anterior debe conservarse tal cual al copiarlo; no lo traduzcas dentro de los backticks.)
La mayoría de las sorpresas no son mala suerte. Ocurren porque la especificación deja margen para diferentes interpretaciones.
Una trampa común es mezclar objetivos y soluciones. Los equipos saltan directamente a pantallas y flujos antes de escribir qué está fijo (fecha límite, presupuesto, stack) y qué está fuera de alcance. El resultado es un plan de UI bonito que no encaja en las restricciones.
Otra trampa es tener no-objetivos vagos. “Sin características extra” suena estricto, pero no te protege cuando alguien pide “solo un informe más” o “un panel de administración rápido”. Los buenos no-objetivos son específicos y comprobables.
El presupuesto oculto o una fecha límite “blanda” también son bombas de alcance. Si el presupuesto real es $5k y la especificación parece un producto de $50k, el equipo construirá lo incorrecto. Pon los números incómodos en la página.
Las integraciones y la propiedad de datos causan sorpresas silenciosas también. Si dices “conectar con Stripe” pero no defines qué eventos, qué campos y quién posee los datos, volverás una y otra vez sobre las mismas decisiones.
Una última trampa es cambiar restricciones a mitad del desarrollo sin nombrar el trade-off. Pasar de “solo web” a “web + móvil”, o de “usar Postgres” a “usar lo más barato”, cambia el plan. Puedes cambiarlo, pero debes actualizar el alcance, la línea de tiempo o las expectativas de calidad.
Añade una nota corta en tu spec que responda cinco puntos:
Antes de que alguien empiece a construir, debes poder responder las preguntas de “qué está fijo?” sin buscar en un documento largo.
Chequeo rápido:
Si falta alguno, la primera construcción ocurrirá, pero la segunda construcción será la real.
Próximos pasos para mantener el impulso sin encajarte en malas decisiones:
Si estás usando Koder.ai (koder.ai), “Planning Mode” más una sección clara de restricciones y no-objetivos ayuda a la plataforma a generar un primer borrador que coincida con tu stack, región de hosting y alcance. Y si las prioridades cambian, snapshots y rollback te permiten probar cambios sin perder una línea base estable.
Cuando estas reglas se escriben temprano, las discusiones sobre funcionalidades son más sencillas porque todos saben qué debe permanecer fijo y qué puede moverse.
El retrabajo es cuando construyes algo que funciona, pero no puede lanzarse porque una decisión tardía cambia las reglas. Suele ocurrir cuando las especificaciones no plantean las restricciones clave desde el inicio, así que el equipo toma suposiciones razonables que luego resultan ser incorrectas.
Empieza por lo que no puede cambiar sin un verdadero trade-off, como la fecha límite, el tope de presupuesto, la región de hosting, el stack requerido y las reglas de cumplimiento. Luego añade una breve sección de no-objetivos para que la gente no amplíe el alcance silenciosamente con “pequeños” extras.
Una restricción limita cómo construyes, por ejemplo “debe ejecutarse en la UE” o “debe usar React y PostgreSQL”. Un no-objetivo limita qué construyes, por ejemplo “no app móvil en v1” o “no roles personalizados en el lanzamiento”.
Escríbelo como una oración que pueda ser comprobada, no como una preferencia. Si alguien puede decir “tal vez” y nadie puede imponerlo, aún no es una restricción real y deberías tratarlo como una pregunta abierta.
Elige de 3 a 5 resultados que describan qué significa el éxito para la primera versión, en lenguaje llano. Los outcomes mantienen al equipo enfocado en lo que los usuarios deben lograr, lo que facilita decir no a funciones que no sirven a la primera release.
Los más comunes son soporte móvil, roles y permisos, historial de auditoría, residencia de datos e integraciones que el cliente no puede usar. Si sacas estos puntos desde el principio, evitas rediseñar pantallas, cambiar el modelo de datos o sustituir proveedores tarde en el proyecto.
Sé específico y limitado en el tiempo, por ejemplo “no en v1” o “no soportaremos tablets”. Un no-objetivo vago como “sin características extra” no detendrá el scope creep porque no bloquea ninguna petición concreta.
Escribe quién aprueba cambios, la rapidez de las revisiones y la cadencia para evaluar peticiones. La retroalimentación lenta es una restricción real porque afecta cuán seguro puedes iterar y cuánta incertidumbre puedes tolerar.
Enuméralos como preguntas abiertas con un único responsable y una fecha límite, y no comiences a construir el área afectada hasta que la respuesta esté bloqueada. Si debes empezar, anota explícitamente la suposición que usas para poder revisarla sin confusión.
Usa planning para bloquear restricciones y no-objetivos antes de generar nada, así el primer borrador coincide con tu stack, región y alcance. Si las prioridades cambian, funciones como snapshots y rollback te permiten probar cambios sin perder una línea base estable, y la exportación de código ayuda si necesitas mover el trabajo fuera más adelante.