Módulo 7: Saying No And The Roadmap
Decir que no bien
Descripción
El roadmap de la lección anterior dejó dos apuestas fuera: sellerTools e improvedSearch. Eso no es un defecto del ejercicio — es lo que pasa siempre que la capacidad es limitada y el backlog no lo es. La pregunta de esta lección no es si hay que decir que no —eso ya está decidido por la aritmética—, es cómo decirlo: en voz alta, con una razón calculada, antes de que alguien tenga que preguntar por qué su apuesta desapareció del plan sin explicación.
Conexión con el módulo. Las lecciones 2 a 5 te dieron todo lo necesario para decir que no con criterio: el costo de oportunidad de una elección (lección 2), el costo de demora de esperar (lección 3), el orden que minimiza ese costo (lección 4), y la prueba de que ese orden es superior a las alternativas (lección 5). Esta lección convierte todo eso en la última pieza que falta: un corte explícito por capacidad, que separa "esto sí, este trimestre" de "esto no, y aquí está exactamente por qué" — antes de la lección 7, que se ocupa de cómo comunicarlo.
Una analogía: la carta de 12 platos, otra vez
Vuelve al restaurante de la presentación del módulo. Un menú de 12 platos no llegó a esos 12 por accidente — el chef probó cincuenta recetas, descartó treinta y ocho, y cada plato descartado tiene una razón que el chef podría explicar si alguien preguntara: "no entró porque el ingrediente principal no está disponible todo el año", "no entró porque compite directamente con otro plato que ya hacemos mejor". Ese descarte explícito es lo que hace que los 12 platos que sí están en la carta sean, en conjunto, mejores que si la carta tuviera 50 — no porque haya menos comida, sino porque cada plato que quedó pagó su lugar contra una alternativa nombrada.
Un roadmap curado funciona igual. sellerTools e improvedSearch no quedaron fuera "porque no había espacio" en abstracto — quedaron fuera porque, comparadas con las otras tres, tienen el wsjfScore más bajo del backlog: entregan menos valor por cada semana de trabajo del equipo. Esa es una razón concreta, calculada, que sobrevive la pregunta de seguimiento. La alternativa —dejar que esas dos apuestas simplemente "se corran" al siguiente trimestre sin que nadie lo haya decidido así— es la carta de 50 platos: nadie dijo que no, y sin embargo, en la práctica, casi todo terminó fuera del plato de alguien.
Ejemplo trabajado: el corte por capacidad, con la razón a la vista
Tomamos la secuencia de WSJF de la lección 4 y la cortamos con la capacidad real del trimestre — los mismos 6 person-months del módulo 3. Cada apuesta que entra, entra en el orden de la secuencia; la primera que no cabe, y todas las que vienen después, quedan fuera con un "no" explícito.
// Decir que no bien: tomamos la secuencia por WSJF (leccion 4/5) y la
// capacidad real del trimestre (6 person-months, modulo 3 leccion 2), y
// marcamos, sin ambiguedad, que apuesta entra y cual queda AFUERA -- un "no"
// explicito, con su razon, no un silencio que nadie decidio.
const capacity = 6;
const wsjfOrder = [
{ feature: 'reviews', jobSize: 1, wsjfScore: 9000 },
{ feature: 'recommendations', jobSize: 3, wsjfScore: 6000 },
{ feature: 'fasterCheckout', jobSize: 2, wsjfScore: 4000 },
{ feature: 'sellerTools', jobSize: 2, wsjfScore: 3000 },
{ feature: 'improvedSearch', jobSize: 3, wsjfScore: 2000 },
];
function cutByCapacity(order, cap) {
let used = 0;
const inQuarter = [];
const explicitNo = [];
for (const bet of order) {
if (used + bet.jobSize <= cap) {
inQuarter.push(bet);
used += bet.jobSize;
} else {
explicitNo.push(bet);
}
}
return { inQuarter, explicitNo, used };
}
const { inQuarter, explicitNo, used } = cutByCapacity(wsjfOrder, capacity);
console.log('=== El roadmap del trimestre: secuencia WSJF, cortada por capacidad (' + capacity + ' person-months) ===\n');
console.log('SI, este trimestre (en orden de construccion):');
inQuarter.forEach((b, i) => console.log(' ' + (i + 1) + '. ' + b.feature.padEnd(16) + 'jobSize=' + b.jobSize + ' wsjf=' + b.wsjfScore));
console.log(' Capacidad usada: ' + used + '/' + capacity + ' person-months\n');
console.log('NO, explicitamente (no "despues", no "tal vez" -- afuera de este trimestre):');
explicitNo.forEach((b) => console.log(' - ' + b.feature.padEnd(16) + 'jobSize=' + b.jobSize + ' wsjf=' + b.wsjfScore));
console.log('\n=== Contraste: que hubiera pasado cortando por RICE (modulo 3) en vez de por WSJF ===\n');
const riceOrder = [
{ feature: 'fasterCheckout', jobSize: 2 },
{ feature: 'reviews', jobSize: 1 },
{ feature: 'improvedSearch', jobSize: 3 },
{ feature: 'sellerTools', jobSize: 2 },
{ feature: 'recommendations', jobSize: 3 },
];
const riceCut = cutByCapacity(riceOrder, capacity);
console.log(' Por RICE entrarian: ' + riceCut.inQuarter.map((b) => b.feature).join(', ') + ' (' + riceCut.used + '/' + capacity + ')');
console.log(' Por RICE quedaria afuera: ' + riceCut.explicitNo.map((b) => b.feature).join(', '));
console.log(
'\nLa diferencia importa: cortar por RICE deja afuera "recommendations" -- la apuesta que\n' +
'en GMV real vale mas que ninguna otra ($185,625/mes, leccion 2). Cortar por WSJF la incluye,\n' +
'y deja afuera "improvedSearch" en su lugar. El "no" de este trimestre no es el mismo\n' +
'segun el criterio que uses, y por eso hay que decirlo explicito, no dejar que "ya se sabra".'
);
Qué esperar. Al correr el archivo con Node, la salida es exactamente esta:
=== El roadmap del trimestre: secuencia WSJF, cortada por capacidad (6 person-months) ===
SI, este trimestre (en orden de construccion):
1. reviews jobSize=1 wsjf=9000
2. recommendations jobSize=3 wsjf=6000
3. fasterCheckout jobSize=2 wsjf=4000
Capacidad usada: 6/6 person-months
NO, explicitamente (no "despues", no "tal vez" -- afuera de este trimestre):
- sellerTools jobSize=2 wsjf=3000
- improvedSearch jobSize=3 wsjf=2000
=== Contraste: que hubiera pasado cortando por RICE (modulo 3) en vez de por WSJF ===
Por RICE entrarian: fasterCheckout, reviews, improvedSearch (6/6)
Por RICE quedaria afuera: sellerTools, recommendations
La diferencia importa: cortar por RICE deja afuera "recommendations" -- la apuesta que
en GMV real vale mas que ninguna otra ($185,625/mes, leccion 2). Cortar por WSJF la incluye,
y deja afuera "improvedSearch" en su lugar. El "no" de este trimestre no es el mismo
segun el criterio que uses, y por eso hay que decirlo explicito, no dejar que "ya se sabra".
Este contraste es el corazón de la lección: el "no" de este trimestre no es fijo — depende del criterio con el que lo calculaste. Cortar por RICE y cortar por WSJF usan la misma capacidad (6/6 en ambos casos) pero producen listas de exclusión distintas: recommendations está adentro con WSJF y afuera con RICE. Eso no es un detalle menor — es la apuesta con el GMV más alto del backlog (lección 2), y un corte hecho con el criterio equivocado la hubiera dejado fuera del trimestre sin que nadie lo notara hasta revisar los números con cuidado. Decir que no bien empieza por elegir el criterio correcto para decidir qué dejar fuera, antes incluso de comunicarlo.
El "no" explícito contra el "no" implícito
Hay una diferencia importante entre las dos filas de la salida de arriba, y vale la pena nombrarla con precisión: sellerTools e improvedSearch no están "pospuestas sin fecha" ni "en veremos" — están explícitamente fuera de este trimestre, con una razón calculada (wsjfScore de 3000 y 2000, los dos más bajos del backlog). Eso es distinto de dejarlas simplemente sin mencionar y confiar en que "ya se sabrá" que no entraron. El "no" implícito —el que nadie dice en voz alta— tiene un costo que no está en ninguna fórmula de este módulo: genera resentimiento en quien defendía esa apuesta, porque desaparece sin explicación, y erosiona la confianza en el proceso de priorización completo, porque parece arbitrario aunque no lo sea.
"No" implicito "No" explicito
────────────────────────────── ──────────────────────────────
La apuesta simplemente no aparece La apuesta aparece con su wsjf,
en ningun plan visible su razon, y su posicion futura
(sellerTools: "candidata para el
proximo trimestre, wsjf=3000, el
tercero mas alto de los que no
entraron")
Nadie sabe si fue una decision o Cualquiera puede pedir el mismo
un olvido calculo y verificarlo
Errores comunes
Dejar que el "no" ocurra por omisión, no por decisión. Qué pasa: el equipo simplemente no incluye sellerTools en el plan del trimestre, sin ninguna comunicación explícita — la apuesta "desaparece" del radar hasta que alguien pregunta qué pasó con ella. Por qué pasa: decir que no en voz alta se siente confrontacional; dejar que algo simplemente no aparezca se siente más cómodo en el momento, aunque cueste más después. Cómo detectarlo: si alguien tiene que preguntar activamente "¿y sellerTools?" para enterarse de que no entró este trimestre, el no fue implícito, no explícito. Cómo corregirlo: como en el ejemplo, cada apuesta que no entra debe aparecer en el plan del trimestre igual que las que sí entran — con su wsjfScore, y con la frase explícita "esto no entra este trimestre, y aquí está por qué".
Justificar el "no" con la capacidad, sin mencionar el criterio de orden. Qué pasa: la explicación de por qué improvedSearch no entró se queda en "no había espacio" — verdad a medias, porque no explica por qué fue justo esa apuesta la que se quedó sin espacio, y no otra. Por qué pasa: "no había espacio" es una razón más corta y menos discutible que "tiene el wsjfScore más bajo del backlog". Cómo detectarlo: si la razón de un "no" no menciona el criterio de orden (WSJF, en este módulo), sino solo la restricción de capacidad, le falta la mitad de la explicación — y esa mitad es precisamente la que hace que el "no" sea defendible en vez de arbitrario. Cómo corregirlo: siempre acompaña "no había espacio" con "y de las que compitieron por ese espacio, esta fue la de menor wsjf" — la razón completa, no solo la restricción.
Tratar el corte de este trimestre como una sentencia final. Qué pasa: al comunicar que sellerTools no entra este trimestre, el mensaje suena a "nunca la vamos a construir", generando una reacción más fuerte de la necesaria de parte de quien la defendía. Por qué pasa: un "no" sin matiz de tiempo se percibe como definitivo, incluso cuando la intención era solo "no ahora". Cómo detectarlo: si la reacción a un "no" de este trimestre es desproporcionada, revisa si comunicaste el matiz de tiempo — "no este trimestre" es una frase muy distinta de "no". Cómo corregirlo: la lección 7 desarrolla esto a fondo, pero adelántalo desde ya: cada "no" de este módulo debería venir con su posición relativa entre las que no entraron (como sellerTools con wsjf 3000, la mejor candidata para el próximo corte) — es información real sobre qué tan cerca estuvo de entrar.
Ejercicios
Ejercicio 1 — Corta un backlog distinto por capacidad. Con la misma secuencia de WSJF de esta lección, ¿qué pasaría si la capacidad del trimestre fuera 4 person-months en vez de 6? ¿Qué apuestas entrarían, y cuáles quedarían explícitamente fuera?
Ver solución
Recorriendo la secuencia WSJF en orden: reviews (jobSize=1, acumulado 1), recommendations (jobSize=3, acumulado 4 — justo al límite). fasterCheckout (jobSize=2) ya no entra: 4 + 2 = 6 > 4. Entrarían solo reviews y recommendations, usando los 4 person-months completos. Quedarían explícitamente fuera: fasterCheckout, sellerTools, improvedSearch — tres de las cinco, más del doble que con la capacidad de 6. Esto ilustra algo importante: entre menos capacidad tiene un equipo, más apuestas defendibles quedan fuera, y más importa que cada "no" venga con su razón — con solo dos apuestas adentro, la conversación sobre qué se sacrificó se vuelve más difícil, no menos.
Ejercicio 2 — Defiende el "no" a improvedSearch frente a quien la propuso. El ingeniero que propuso improvedSearch pregunta por qué su apuesta quedó fuera si "arregla un problema real que los usuarios reportan". Usando los números de esta lección, escribe la respuesta que le darías, sin descartar que el problema sea real.
Ver solución
Una respuesta posible: "El problema es real, y por eso improvedSearch sigue en el backlog, no se descartó para siempre. La razón por la que no entra este trimestre es que su wsjfScore (2000) es el más bajo de las cinco apuestas que comparamos — su costOfDelay ($6,000/semana) es el más bajo del grupo, y su jobSize (3 person-months) es de los más grandes, así que entrega menos valor por cada semana de trabajo del equipo que las otras cuatro. Si aparece evidencia de que el costo de esperar es más alto de lo que estimamos —por ejemplo, si las búsquedas fallidas están causando que usuarios abandonen la plataforma, no solo que se frustren—, ese número cambiaría y con él su posición en la fila. Por ahora, es la primera candidata a revisar para el próximo trimestre." La estructura clave: no niega el problema, explica el criterio con el número exacto, y deja abierta la puerta a revisar si cambia la evidencia — ni un "no" definitivo ni un "sí" disfrazado.
Ejercicio 3 — Distingue el "no" explícito del implícito en tu propio contexto. Piensa en un proyecto o tarea de tu trabajo (o de un proyecto personal) que "simplemente no se hizo" este trimestre o mes, sin que nadie lo haya decidido en voz alta. ¿Qué información te hubiera dado un "no" explícito, calculado con un criterio como WSJF, que el silencio no te dio?
Ver solución
No hay una única respuesta correcta —el ejercicio es de reflexión personal—, pero una buena respuesta debería identificar al menos dos de estas tres cosas que el "no" explícito aporta y el silencio no: (1) una razón concreta y verificable de por qué esa tarea específica, y no otra, quedó fuera; (2) una posición relativa —qué tan cerca estuvo de entrar, comparado con lo que sí entró—; y (3) una expectativa de tiempo —si es un "no" de este período o un "no" definitivo—. El costo del silencio no es solo la incertidumbre de quien esperaba esa tarea; es que nadie puede verificar si la decisión (tácita) fue razonable, porque nunca existió como decisión explícita.
Resumen y siguiente paso
En esta lección convertiste la secuencia de WSJF en un roadmap cortado por la capacidad real del trimestre: reviews, recommendations y fasterCheckout entran (6/6 person-months); sellerTools e improvedSearch quedan explícitamente fuera, con su wsjfScore a la vista como razón. Viste, con el contraste contra un corte por RICE, que el criterio que uses para cortar cambia cuál apuesta queda fuera — no es un detalle técnico, es la diferencia entre dejar afuera la apuesta de menor valor real (improvedSearch) o la de mayor valor real (recommendations). Y nombraste la diferencia entre un "no" explícito, calculado y comunicado, y un "no" implícito que nadie decidió y que solo genera resentimiento cuando alguien lo descubre.
Antes de avanzar deberías poder: cortar cualquier backlog ordenado por capacidad, separando lo que entra de lo que queda explícitamente fuera; explicar por qué el criterio de orden (RICE contra WSJF) puede cambiar cuál apuesta específica se sacrifica; y distinguir, con un ejemplo propio, un "no" explícito de uno implícito.
Ya sabes qué decir que no, y por qué. La lección 7 —la última de tema del módulo— se ocupa de cómo decirlo: la forma exacta de comunicar un roadmap de apuestas a un equipo o a un stakeholder, para que el "sí" y el "no" de cada apuesta lleguen con su razón, no como una sorpresa.
Recursos
- LogRocket, "The art of saying 'no' as a product manager" — blog.logrocket.com/product-management/the-art-of-saying-no-as-a-product-manager. Estrategias prácticas para comunicar un "no" sin que se perciba como un rechazo arbitrario — el puente hacia la lección 7. En inglés.
- Marty Cagan / SVPG, "The Alternative to Roadmaps" — svpg.com/the-alternative-to-roadmaps. Sobre por qué los mejores equipos de producto tratan el "no" como parte normal del proceso de decisión, no como una excepción incómoda. En inglés.
- Donald G. Reinertsen, The Principles of Product Development Flow — goodreads.com/book/show/6278270. El mismo argumento económico de las lecciones 4 y 5, aplicado aquí a la decisión de qué queda fuera de la capacidad disponible. En inglés.