Módulo 7: Strategy To Roadmap

RICE alto, fuera de estrategia

Descripción

La lección anterior ya mostró el patrón una vez: las dos apuestas con mayor riceScore de todo el backlog de Mercado no pasan el filtro estratégico. Esta lección se detiene ahí, de lleno, porque es el error más caro —y más fácil de cometer— de todo el módulo: dejarse convencer por un número grande y saltarse la pregunta de pertenencia. Un riceScore alto no es evidencia de que una apuesta merece construirse primero. Es evidencia de que, si perteneciera a la estrategia, merecería construirse primero. La condición nunca deja de aplicar, y esta lección enseña a no olvidarla justo cuando el número es más tentador.

Conexión con el módulo. Esta lección no introduce ningún mecanismo nuevo — toma strategicFilter, tal como quedó terminado en la lección 3, y lo pone a competir de frente contra lo que un equipo haría si solo mirara RICE, sin el filtro. La comparación directa, ranking contra ranking, es la forma más clara de ver cuánto cambia la decisión cuando el filtro corre primero.

Una analogía cotidiana: la ganga que no necesitas

Entras a una tienda buscando, específicamente, una cafetera nueva. En el camino hacia la sección de electrodomésticos, pasas frente a una mesa con un letrero enorme: "70% de descuento — solo hoy" sobre una parrilla eléctrica para asados. El descuento es real. El precio es, objetivamente, una ganga extraordinaria — probablemente el mejor precio por unidad de valor de toda la tienda ese día. Y sin embargo, si no tienes patio, ni terraza, ni ningún lugar donde usar una parrilla, comprarla no te ahorra dinero: te lo hace gastar en algo que no ibas a comprar de todos modos, solo porque el descuento era demasiado bueno para ignorarlo.

Eso es exactamente lo que le pasa a una apuesta con riceScore alto pero fuera de estrategia. El número —como el descuento— es real, y objetivamente atractivo comparado con el resto de las opciones disponibles. Pero "atractivo en abstracto" y "algo que necesitas, dado lo que viniste a hacer" son preguntas completamente distintas. La parrilla con descuento nunca debió competir por tu atención — no porque sea un mal producto, sino porque no estaba en tu lista, sin importar cuán buena fuera la oferta. lowestPriceMatch, con el mejor riceScore de todo el backlog de Mercado, es exactamente esa parrilla: una ganga real, para una tienda que no es la de Mercado.

Ejemplo trabajado: lo que RICE solo hubiera elegido primero

Corremos el backlog completo de Mercado dos veces: primero, ordenado solo por RICE, como lo haría un equipo que nunca aplicó el filtro estratégico —exactamente el resultado que obtendrías siguiendo, sin ningún paso adicional, el método de product-thinking-for-engineers-guide—; después, el mismo backlog pasado por strategicFilter, para comparar los dos primeros lugares de cada ranking, uno al lado del otro.

function riceScore({ reach, impact, confidence, effort }) {
  return (reach * impact * confidence) / effort;
}

function prioritize(items) {
  return items
    .map((item) => ({ feature: item.feature, riceScore: Number(riceScore(item.rice).toFixed(2)) }))
    .sort((a, b) => b.riceScore - a.riceScore);
}

function strategicFilter(backlog, strategy) {
  return backlog.map((bet) => {
    const reinforces = bet.servesDimensions.filter((d) => strategy.winOn.includes(d));
    const conflicts = bet.servesDimensions.filter((d) => strategy.avoid.includes(d));
    return {
      feature: bet.feature,
      servesDimensions: bet.servesDimensions,
      reinforces,
      conflicts,
      inStrategy: reinforces.length > 0 && conflicts.length === 0,
      riceScore: Number(riceScore(bet.rice).toFixed(2)),
    };
  });
}

const mercadoStrategy = { winOn: ['curatedDiscovery', 'sellerTrust'], avoid: ['price'] };

const backlog = [
  { feature: 'fasterCheckout', servesDimensions: ['convenience'], rice: { reach: 8000, impact: 2, confidence: 0.8, effort: 2 } },
  { feature: 'recommendations', servesDimensions: ['curatedDiscovery'], rice: { reach: 5000, impact: 1, confidence: 0.5, effort: 3 } },
  { feature: 'sellerTools', servesDimensions: ['sellerTrust'], rice: { reach: 1200, impact: 2, confidence: 0.8, effort: 2 } },
  { feature: 'reviews', servesDimensions: ['sellerTrust'], rice: { reach: 6000, impact: 0.5, confidence: 0.8, effort: 1 } },
  { feature: 'improvedSearch', servesDimensions: ['catalogBreadth'], rice: { reach: 9000, impact: 1, confidence: 0.5, effort: 3 } },
  { feature: 'lowestPriceMatch', servesDimensions: ['price'], rice: { reach: 9500, impact: 3, confidence: 0.8, effort: 3 } },
];

console.log('=== Si priorizaras SOLO por RICE (sin filtro estrategico) ===\n');
console.table(prioritize(backlog));

console.log('\n=== El mismo backlog, pasado por strategicFilter ANTES de mirar el riceScore ===\n');
const filtered = strategicFilter(backlog, mercadoStrategy).sort((a, b) => b.riceScore - a.riceScore);
console.table(filtered.map((b) => ({ feature: b.feature, riceScore: b.riceScore, inStrategy: b.inStrategy })));

const top2Naive = prioritize(backlog).slice(0, 2).map((b) => b.feature);
console.log('\nLos 2 primeros solo-por-RICE: ' + top2Naive.join(' y ') + '.');
console.log('Los 2 primeros con el filtro estrategico aplicado antes: ' + filtered.filter((b) => b.inStrategy).slice(0, 2).map((b) => b.feature).join(' y ') + '.');

Qué esperar. Al correr el archivo con Node, la salida es exactamente esta:

=== Si priorizaras SOLO por RICE (sin filtro estrategico) ===

┌─────────┬────────────────────┬───────────┐
│ (index) │      feature       │ riceScore │
├─────────┼────────────────────┼───────────┤
│    0    │ 'lowestPriceMatch' │   7600    │
│    1    │  'fasterCheckout'  │   6400    │
│    2    │     'reviews'      │   2400    │
│    3    │  'improvedSearch'  │   1500    │
│    4    │   'sellerTools'    │    960    │
│    5    │ 'recommendations'  │  833.33   │
└─────────┴────────────────────┴───────────┘

=== El mismo backlog, pasado por strategicFilter ANTES de mirar el riceScore ===

┌─────────┬────────────────────┬───────────┬────────────┐
│ (index) │      feature       │ riceScore │ inStrategy │
├─────────┼────────────────────┼───────────┼────────────┤
│    0    │ 'lowestPriceMatch' │   7600    │   false    │
│    1    │  'fasterCheckout'  │   6400    │   false    │
│    2    │     'reviews'      │   2400    │    true    │
│    3    │  'improvedSearch'  │   1500    │   false    │
│    4    │   'sellerTools'    │    960    │    true    │
│    5    │ 'recommendations'  │  833.33   │    true    │
└─────────┴────────────────────┴───────────┴────────────┘

Los 2 primeros solo-por-RICE: lowestPriceMatch y fasterCheckout.
Los 2 primeros con el filtro estrategico aplicado antes: reviews y sellerTools.

Compara las dos primeras filas de cada tabla, porque ahí está el costo completo de saltarse el filtro. Un equipo que solo mira RICE construye, primero, lowestPriceMatch y después fasterCheckout — dos apuestas que, juntas, consumen la capacidad más valiosa del trimestre sin reforzar ni una sola vez el descubrimiento curado o la confianza en el vendedor, las dos dimensiones que Mercado, con cinco módulos de trabajo, decidió que eran su juego. Un equipo que aplica el filtro primero construye reviews y sellerTools — apuestas con un riceScore bastante menor en términos absolutos, pero que son, ambas, refuerzos directos de la estrategia. La diferencia entre los dos equipos no está en el cálculo de RICE —es idéntico en ambos casos, la misma fórmula, los mismos números—. Está en cuándo se hace la pregunta de pertenencia: antes de mirar el número, o nunca.

Profundización: por qué el numerador grande es, precisamente, lo que engaña

Vale la pena entender por qué las apuestas fuera de estrategia tienden a tener un riceScore alto, en vez de asumir que es una coincidencia de este ejemplo. lowestPriceMatch tiene reach: 9500 e impact: 3 (el nivel máximo de la escala) porque casi todo el mundo responde a un precio más bajo — es, casi por definición, la palanca de mayor alcance y mayor impacto bruto que existe en cualquier negocio de consumo. Eso no es un accidente ni una manipulación de los números: es la razón exacta por la que tantos equipos, sin una estrategia explícita que los detenga, terminan compitiendo en precio tarde o temprano. Precio es la apuesta más fácil de justificar con RICE puro, precisamente porque mueve a más gente, más rápido, con más certeza, que casi cualquier alternativa más especializada.

Esa es la trampa completa, en una frase: las apuestas más genéricas —las que le sirven a cualquier negocio, no a este negocio en particular— tienden a ganar en RICE puro, porque RICE mide alcance e impacto agregados, no ajuste con una estrategia específica. Una estrategia real, por definición, elige un juego angosto —un segmento, una diferenciación, un conjunto pequeño de dimensiones donde apostar fuerte— y ese angostamiento, casi siempre, sacrifica alcance bruto a cambio de profundidad en un lugar específico. recommendations, la apuesta con el riceScore más bajo de todo el backlog, sirve exactamente a los explorers de Mercado, no a cualquier comprador de cualquier tienda — y por eso su alcance es menor, no porque sea una apuesta débil.

Errores comunes

Dejarse deslumbrar por el numerador grande sin preguntar de dónde sale. Qué pasa: al ver un riceScore inusualmente alto, el equipo lo interpreta como señal de que la apuesta es excepcionalmente buena, sin preguntarse si ese número grande viene, precisamente, de ser una apuesta genérica que le sirve a cualquier negocio. Por qué pasa: un número grande se siente como una validación objetiva —más difícil de cuestionar en una reunión que un argumento cualitativo sobre estrategia—. Cómo detectarlo: si la apuesta de mayor riceScore de tu backlog serviría exactamente igual de bien a un competidor con una estrategia completamente distinta a la tuya, sospecha — como viste en esta lección, lowestPriceMatch funcionaría para cualquier marketplace, no específicamente para el que Mercado decidió ser. Cómo corregirlo: antes de celebrar un riceScore alto, corre strategicFilter y pregunta a qué dimensión de tu estrategia particular refuerza — si la respuesta es "a ninguna en particular, ayudaría a cualquiera", ese es exactamente el patrón de esta lección.

Racionalizar la trampa después de verla, en vez de aceptar el resultado del filtro. Qué pasa: cuando el filtro marca una apuesta popular y de alto RICE como fuera de estrategia, alguien del equipo intenta reetiquetar retroactivamente su servesDimensions para que sí pase —el error inverso de la lección 2, ahora aplicado con toda la presión de un número que ya se conoce y que ya generó entusiasmo—. Por qué pasa: es más incómodo decirle que no a una apuesta que el equipo ya vio con un número atractivo, que decirle que no antes de calcular nada. Cómo detectarlo: si la etiqueta de servesDimensions de una apuesta cambia después de ver su riceScore, y no antes, esa reetiquetación es sospechosa casi por definición. Cómo corregirlo: etiqueta servesDimensions siempre antes de calcular RICE —el orden de las operaciones no es un detalle cosmético, es la disciplina completa de este módulo—; si la etiqueta se decide después de ver el número, el filtro deja de proteger contra nada.

Asumir que un riceScore alto ya implica, por sí solo, encaje estratégico. Qué pasa: se trata al riceScore como una medida compuesta que ya incluiría, de alguna forma implícita, qué tan bien encaja la apuesta con la estrategia —"si tiene tanto alcance e impacto, algo bueno debe tener para nosotros"—. Por qué pasa: RICE se siente como un análisis completo porque combina cuatro variables distintas en un solo número — esa combinación puede dar la falsa sensación de que ya capturó todo lo que importa. Cómo detectarlo: revisa qué mide cada uno de los cuatro inputs de RICE (reach, impact, confidence, effort, de product-thinking-for-engineers-guide, módulo 3) — ninguno de los cuatro pregunta nada sobre segmento, posicionamiento, diferenciación o moats. Cómo corregirlo: trata riceScore y inStrategy como dos preguntas completamente distintas, calculadas con inputs completamente distintos, y nunca dejes que un valor alto del primero sustituya la respuesta del segundo — exactamente como demostró la tabla comparativa de esta lección.

Ejercicios

Ejercicio 1 — Diseña tu propia trampa. Inventa una apuesta hipotética para Mercado, distinta de lowestPriceMatch, que tendría un riceScore muy alto pero que se caería en strategicFilter. Escribe su objeto completo (feature, servesDimensions, rice) y explica en una frase por qué tendría un RICE alto y por qué no pertenece.

Ver solución

Una respuesta razonable: { feature: 'freeDeliveryForEveryone', servesDimensions: ['deliverySpeed'], rice: { reach: 9000, impact: 3, confidence: 0.8, effort: 2 } } — con un riceScore de (9000 × 3 × 0.8) / 2 = 10800, más alto incluso que lowestPriceMatch. Tendría un RICE altísimo por la misma razón que lowestPriceMatch: envío gratis para todos es una palanca genérica que mueve a casi cualquier comprador, sin importar su estrategia. No pertenecería a la estrategia de Mercado porque deliverySpeed no está en winOn (['curatedDiscovery', 'sellerTrust']) — sería, con reinforces: [], exactamente el mismo patrón "neutral" que fasterCheckout en la lección 3, aunque con un número todavía más grande y todavía más tentador.

Ejercicio 2 — Calcula el costo de oportunidad en person-months. lowestPriceMatch cuesta 3 person-months (effort: 3) y fasterCheckout cuesta 2 — un total de 5 person-months si el equipo hubiera construido ambas por RICE puro. Si la capacidad del trimestre es 6 person-months (el mismo límite usado en product-thinking-for-engineers-guide, módulo 3), ¿cuánta capacidad le quedaría al equipo para construir algo que sí refuerce la estrategia, después de haber caído en la trampa?

Ver solución

Quedaría apenas 1 person-month (6 − 5 = 1), insuficiente para construir cualquiera de las tres apuestas que sí pertenecen a la estrategia: reviews (effort: 1) apenas entraría, pero sellerTools (effort: 2) y recommendations (effort: 3) ya no cabrían. El costo real de la trampa no es solo "construir algo que no ayuda" — es, además, consumir la capacidad que necesitabas para construir lo que sí importaba, dejando al equipo con recursos insuficientes para ejecutar su propia estrategia ese mismo trimestre.

Ejercicio 3 — Defiende lowestPriceMatch como haría alguien de ventas, y luego respóndele. Un compañero de ventas argumenta: "los clientes piden precio bajo todo el tiempo, y esta apuesta tiene el mejor RICE del backlog — construyámosla". Escribe, en un párrafo, una respuesta que reconozca la validez de la demanda del cliente sin aceptar la conclusión.

Ver solución

Un ejemplo de respuesta: "Tienes razón en que los clientes piden precio bajo — casi todos los clientes de cualquier negocio lo piden, y por eso lowestPriceMatch tiene el mejor RICE del backlog: es la palanca más universal que existe. Pero universal no es lo mismo que nuestro. Elegimos, con esfuerzo, no competir en esa dimensión —un jugador de la escala de un megastore genérico siempre nos va a ganar ahí—, y competir en cambio en descubrimiento curado y confianza en el vendedor, donde sí podemos ganar de verdad. Construir lowestPriceMatch no le hace daño a Mercado en el sentido de que la gente lo usaría — pero consume la capacidad que necesitamos para profundizar la ventaja que sí es nuestra, y nos mete, sin darnos cuenta, en la pelea de precio y escala que ya decidimos que no podemos ganar."

Resumen y siguiente paso

Esta lección aisló el patrón más caro de todo el módulo: las apuestas de mayor riceScore no son, automáticamente, las apuestas correctas — a menudo son exactamente lo opuesto, porque las palancas más genéricas (precio, envío, conveniencia universal) tienden a ganar en alcance e impacto bruto precisamente por ser genéricas, no por estar alineadas con ninguna estrategia particular. Viste, con números reales, que las dos apuestas de mayor RICE de todo el backlog de Mercado —lowestPriceMatch y fasterCheckout— son las dos que el filtro estratégico rechaza.

Antes de avanzar deberías poder: explicar por qué las apuestas genéricas tienden a ganar en RICE puro, y reconocer, en tu propio trabajo, cuándo un número atractivo te está por desviar de una estrategia que ya elegiste con esfuerzo.

La lección 5 mira, de cerca, a las tres apuestas que pasaron el filtro —reviews, sellerTools, recommendations— y pregunta algo que todavía no respondiste: ¿esas tres apuestas se refuerzan entre sí, construyendo una ventaja cada vez más profunda, o simplemente comparten la casualidad de no haber conflictuado con avoid?

Recursos