Módulo 6: Postmortems And Iterating

Cuándo un "ganador" no aguanta en producción: el efecto novedad

Descripción

La lección 6 confirmó que la latencia se sostiene después del relanzamiento — el guardrail dejó de ser un riesgo. Pero un guardrail sano no contesta la pregunta que la lección 5 dejó explícitamente abierta: ¿el lift de la métrica primaria —lo que hizo que recommendations "ganara" en primer lugar— se sostiene con el tiempo, o era, al menos en parte, un efecto pasajero de que los usuarios notaran algo nuevo? Esta lección nombra ese fenómeno con su término técnico —efecto novedad (novelty effect)— y construye el chequeo que lo detecta: noveltyCheck(), un modelo que mira la forma de la serie de lift semana a semana y distingue un patrón que se desvanece de uno que se sostiene.

Vale la pena ser preciso sobre los límites de esta lección: noveltyCheck() es un modelo pedagógico que mira la forma general de una serie —cuánto cae del primer al último dato—, no un análisis estadístico riguroso. Medir el efecto novedad con el rigor que merece una decisión real de negocio —significancia semana a semana, intervalos de confianza, ventanas pre-registradas— es territorio de product-metrics-and-experimentation-guide, que ya trató este mismo fenómeno a fondo.

Conexión con el módulo. Esta lección cierra el arco temático del módulo: después del postmortem (lecciones 2-4) y el loop de iteración (lecciones 5-6), esta es la última pieza antes de declarar, con evidencia y no solo con esperanza, que un ganador es real. La lección 8, el proyecto, aplica noveltyCheck() exactamente al caso de recommendations.

Una analogía: el juguete nuevo que se abandona en un cajón

Cualquiera que haya visto a un niño recibir un juguete nuevo conoce el patrón: la primera semana, el juguete es lo único que importa — se juega con él todo el tiempo, se lleva a todos lados, genera una emoción que parece que va a durar para siempre. Un mes después, muchas veces, ese mismo juguete está en el fondo de un cajón, sin tocarse, mientras la atención se movió a otra cosa. Nadie diría que el juguete "se rompió" o que "dejó de funcionar" — funciona exactamente igual que el primer día. Lo que cambió fue la novedad: la emoción inicial no era, nunca, una medida confiable de cuánto le iba a gustar ese juguete específico a largo plazo, comparado con el resto de sus juguetes ya conocidos.

El lift de un lanzamiento reciente puede tener exactamente el mismo patrón. Un carrusel de recomendaciones nuevo, un botón que nunca estuvo ahí antes, una animación llamativa en el checkout — cualquier cosa visiblemente nueva genera curiosidad la primera semana, simplemente por ser nueva, sin que eso diga nada todavía sobre si va a seguir generando ese mismo interés una vez que deja de ser una novedad y se vuelve parte de la rutina del producto. La única forma de saber si un "ganador" es el juguete favorito de verdad, o el juguete nuevo que se va a abandonar en el cajón, es mirar qué pasa varias semanas después del entusiasmo inicial.

Ejemplo trabajado: noveltyCheck() sobre dos features distintas

// noveltyCheck: modelo pedagogico que, dada la serie semana a semana del
// lift medido despues de un lanzamiento, distingue un patron que SE
// DESVANECE (efecto novedad) de uno que SE SOSTIENE (efecto real). Mira
// solo la FORMA de la serie (cuanto cae del primer al ultimo dato). La
// medicion rigurosa -- significancia semana a semana, intervalos de
// confianza -- sigue siendo territorio de product-metrics-and-experimentation-guide.
function noveltyCheck(weeklyLift) {
  const first = weeklyLift[0];
  const last = weeklyLift[weeklyLift.length - 1];
  const decayPct = Math.round(((first - last) / first) * 1000) / 10;
  const verdict = decayPct > 50 ? 'NOVELTY (se desvanece)' : 'HOLDS (se sostiene)';
  return { weeklyLift, first, last, decayPct, verdict };
}

// Ejemplo A: una animacion de confeti en el checkout -- el engagement se
// dispara la primera semana y se apaga rapido, semana a semana.
const cartDecorationsLift = [0.22, 0.14, 0.08, 0.04, 0.02, 0.015];

// Ejemplo B: un boton de "pedir de nuevo con un clic" -- el lift arranca
// mas chico, pero se mantiene estable seis semanas seguidas.
const oneClickReorderLift = [0.12, 0.125, 0.118, 0.121, 0.119, 0.122];

console.log('=== noveltyCheck: cartDecorations (animacion de confeti) ===');
console.log(noveltyCheck(cartDecorationsLift));

console.log('\n=== noveltyCheck: oneClickReorder (boton de recompra) ===');
console.log(noveltyCheck(oneClickReorderLift));

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

=== noveltyCheck: cartDecorations (animacion de confeti) ===
{
  weeklyLift: [ 0.22, 0.14, 0.08, 0.04, 0.02, 0.015 ],
  first: 0.22,
  last: 0.015,
  decayPct: 93.2,
  verdict: 'NOVELTY (se desvanece)'
}

=== noveltyCheck: oneClickReorder (boton de recompra) ===
{
  weeklyLift: [ 0.12, 0.125, 0.118, 0.121, 0.119, 0.122 ],
  first: 0.12,
  last: 0.122,
  decayPct: -1.7,
  verdict: 'HOLDS (se sostiene)'
}

Las dos series cuentan historias muy distintas. cartDecorations arranca con el lift más alto de las dos (0.22, un 22%) y termina con el más bajo (0.015, apenas 1.5%) — una caída del 93.2% respecto al valor inicial, muy por encima del umbral de 50% que el modelo usa para marcar NOVELTY. oneClickReorder arranca más modesto (0.12) pero termina prácticamente en el mismo lugar (0.122) — de hecho, decayPct da negativo (-1.7), porque el último valor es más alto que el primero, no más bajo. Un decayPct negativo no es un error: simplemente confirma, con el signo, que no hay ninguna caída que detectar — el efecto, si acaso, se mantuvo o creció levemente.

Fíjate en algo importante que separa estas dos historias más allá del veredicto: el lift inicial de cartDecorations (22%) es casi el doble que el de oneClickReorder (12%) — si alguien midiera solo la primera semana, cartDecorations parecería, por lejos, el ganador más impresionante de los dos. Es exactamente al revés de lo que importa para decidir qué feature vale la pena mantener a largo plazo: el número más alto en la semana 1 puede ser, precisamente, el que menos se sostiene.

Profundización: por qué el efecto novedad no significa que el resultado original era falso

Vale la pena ser cuidadoso con una confusión común, sobre todo después de haber visto un ganador con guardrail roto en esta misma guía: encontrar un efecto novedad no significa que el resultado del A/B test original —el que product-metrics-and-experimentation-guide ya midió y confirmó con p=0.0114— era falso o estaba mal calculado. Esa guía hermana ya resolvió, con rigor estadístico, exactamente este riesgo: el protocolo del experimento midió checkoutConversion sobre una ventana de seis semanas completas, precisamente para dejar que cualquier efecto novedad inicial tuviera tiempo de disiparse antes de calcular el lift oficial. El +18.75% que esta guía entera usa como punto de partida ya es el número estable, medido después de que la curiosidad se asentara — no el pico inflado de los primeros días.

Esto significa algo importante para el proyecto de la lección 8: el chequeo de noveltyCheck() sobre recommendations, después del relanzamiento, no está buscando confirmar si el +18.75% original era real —eso ya está confirmado—. Está confirmando algo distinto y igual de necesario: que el relanzamiento, con el sistema arreglado y bajo condiciones de producción completa (100% de la base, no la muestra de 24,000 del experimento original), reproduce ese mismo comportamiento estable, y no introduce una dinámica nueva —por ejemplo, que los usuarios reaccionen distinto a recommendations una vez que se convierte en algo omnipresente, en vez de un experimento que solo tocó a una fracción de ellos—.

Errores comunes

Medir el lift una sola vez, el mismo día del lanzamiento al 100%, y declarar victoria con ese único dato. Qué pasa: apenas recommendations llega al 100% de la base, alguien mide checkoutConversion ese mismo día, ve un número alto, y lo reporta como "el resultado del relanzamiento", sin esperar ninguna semana adicional. Por qué pasa: un número alto y temprano es más fácil de comunicar con entusiasmo que una serie de seis semanas, y la presión por reportar resultados rápido compite con la paciencia que el efecto novedad exige. Cómo detectarlo: si el reporte de resultado del relanzamiento tiene una sola fecha de medición, en vez de una serie semanal como la de noveltyCheck(), no hay forma de distinguir un ganador real de uno que todavía no tuvo tiempo de desinflarse. Cómo corregirlo: como en el ejemplo de hoy, el veredicto de noveltyCheck() depende de comparar el primer dato con el último de una serie — un solo punto de datos no puede, por definición, mostrar una tendencia.

Usar decayPct como si fuera un cálculo de significancia estadística. Qué pasa: alguien reporta el decayPct de noveltyCheck() en una presentación como si fuera equivalente a un p-value o un intervalo de confianza, dándole el mismo peso formal. Por qué pasa: ambos son números que salen de una función y tienen la forma de un resultado "medido", y sin el contexto correcto es fácil tratarlos como intercambiables. Cómo detectarlo: si alguien pregunta "¿y esto es estadísticamente significativo?" sobre el resultado de noveltyCheck(), y la respuesta no es un claro "eso no es lo que este modelo mide", hay una confusión de rigor en curso. Cómo corregirlo: noveltyCheck() es, explícitamente, un modelo pedagógico que mira la forma de una serie —útil para tener una primera intuición rápida—, no un reemplazo del análisis riguroso de product-metrics-and-experimentation-guide. Cualquier decisión de negocio real sobre si mantener o descontinuar una feature debería pasar por ese análisis más riguroso, no solo por este chequeo.

Asumir que todo lanzamiento sufre efecto novedad, y descontar el lift inicial de cualquier feature por sistema. Qué pasa: después de aprender sobre el efecto novedad, alguien empieza a tratar cualquier número alto de la primera semana como sospechoso, incluyendo casos donde el lift genuinamente se sostiene —como oneClickReorder en el ejemplo de hoy—. Por qué pasa: una lección memorable sobre un patrón real puede generalizarse de más, hasta el punto de aplicarse incluso cuando la evidencia dice lo contrario. Cómo detectarlo: si alguien descarta un resultado fuerte diciendo "seguro es efecto novedad" sin haber medido ni una sola semana de seguimiento, está prediciendo sin datos, exactamente el mismo error —al revés— que medir una sola vez y declarar victoria. Cómo corregirlo: el efecto novedad es una hipótesis que se confirma o se descarta con datos, como muestra oneClickReorder en este ejemplo —un lift que se sostiene, casi sin caída, es tan válido como resultado de noveltyCheck() como uno que se desvanece—. Ninguno de los dos veredictos se asume de antemano.

Ejercicios

Ejercicio 1 — Calcula el decayPct a mano. Una feature de Mercado mide un lift de 0.30 en la semana 1 y de 0.24 en la semana 6. Calcula decayPct con la fórmula de noveltyCheck() y determina el veredicto.

Ver solución

decayPct = ((0.30 - 0.24) / 0.30) * 100 = (0.06 / 0.30) * 100 = 20%. Como 20 no es mayor que el umbral de 50, el veredicto sería HOLDS (se sostiene) — aunque hay una caída real y medible del 20%, no es lo suficientemente pronunciada como para que este modelo la clasifique como efecto novedad. Este ejercicio es un buen recordatorio de que el umbral de 50% en noveltyCheck() es una elección pedagógica simplificada, no una ley física: una caída del 20% podría, en un análisis más riguroso, seguir mereciendo atención, aunque este modelo simplificado la deje pasar como "sostenida".

Ejercicio 2 — Diseña una serie que dé exactamente en el límite. Escribe una serie weeklyLift de seis semanas donde decayPct sea exactamente 50 (ni más ni menos), y explica qué primer y último valor usaste.

Ver solución

Una serie posible: [0.20, 0.18, 0.15, 0.13, 0.11, 0.10], con first = 0.20 y last = 0.10. decayPct = ((0.20 - 0.10) / 0.20) * 100 = 50. Como la condición del verdict es decayPct > 50 (estrictamente mayor, no mayor o igual), un decayPct de exactamente 50 daría HOLDS (se sostiene), no NOVELTY — un detalle importante del código que vale la pena notar: el límite de 50% pertenece al lado de "se sostiene", no al de "se desvanece".

Ejercicio 3 — Explica la diferencia entre los dos ejemplos a un compañero de negocio. Usando la analogía del juguete nuevo, escribe en 2-3 frases por qué cartDecorations, con un lift inicial más alto que oneClickReorder, terminaría siendo la peor apuesta de las dos para mantener a largo plazo.

Ver solución

Una respuesta razonable: "cartDecorations es como el juguete nuevo que emociona la primera semana y termina en el cajón — arrancó con el doble de interés que oneClickReorder, pero ese interés se desplomó casi por completo en seis semanas. oneClickReorder arrancó más modesto, pero seis semanas después sigue generando prácticamente el mismo valor que el primer día — es el juguete que de verdad se sigue usando. Si tuviéramos que elegir en cuál invertir más, oneClickReorder es la apuesta más segura, aunque su número inicial se vea menos impresionante en una presentación."

Resumen y siguiente paso

En esta lección construiste noveltyCheck(), el chequeo que cierra la pregunta pendiente del loop ship → measure → learn: ¿un lift se sostiene, o era efecto novedad? Sobre dos ejemplos contrastantes —cartDecorations, que cae 93.2% y se marca NOVELTY, y oneClickReorder, que se mantiene estable (decayPct: -1.7) y se marca HOLDS— viste que el número más alto de la primera semana no siempre es el mejor predictor del valor real de largo plazo. También viste por qué el +18.75% original de recommendations ya está protegido de este riesgo —se midió sobre seis semanas completas en product-metrics-and-experimentation-guide—, y qué pregunta distinta queda por confirmar después del relanzamiento de la lección 6.

Antes de avanzar deberías poder: explicar la diferencia entre un efecto novedad y un resultado experimental mal medido; calcular decayPct dado un primer y último valor de una serie; y justificar por qué noveltyCheck() es un chequeo rápido, no un reemplazo del rigor estadístico de la guía de métricas.

Con esto cierras el arco temático de este módulo: postmortem blameless (lecciones 2-4), el loop ship → measure → learn (lección 5), iterar sobre el ganador (lección 6), y detectar si ese ganador aguanta en el tiempo (esta lección). La lección 8, el proyecto, junta buildPostmortem(), rolloutPlan() y noveltyCheck() sobre el caso completo de recommendations, de punta a punta.

Recursos

  • Ron Kohavi y Stefan Thomke, "The Surprising Power of Online Experiments" (Harvard Business Review, sept-oct 2017) — hbr.org/2017/09/the-surprising-power-of-online-experiments. Los mismos autores citados en product-metrics-and-experimentation-guide discuten el efecto novedad (y el efecto primacía, su contraparte) como uno de los riesgos más comunes al interpretar resultados de lanzamientos recién encendidos. En inglés.
  • product-metrics-and-experimentation-guide, módulo 7, lección 7, "Efecto novedad y p-hacking". La guía hermana que ya trató este mismo fenómeno con rigor estadístico completo sobre el propio caso de recommendations —incluyendo por qué el protocolo de seis semanas del módulo 5 de esa guía protege el +18.75% oficial de esta contaminación—. Léela si necesitas el análisis riguroso, no solo el modelo rápido de esta lección.
  • Google SRE Book, Capítulo 3, "Embracing Risk" — sre.google/sre-book/embracing-risk. El concepto de error budget, ya visto en el módulo 4, comparte la misma disciplina de fondo: ningún resultado se declara "confirmado" sin observarlo sostenerse en el tiempo, no solo en el instante del lanzamiento. En inglés.