Atlasingeniería

Code review en la prácticaCambios de comportamiento que el diff no muestraTema 3

Condiciones de un A/B incompletas y banderas que ya ganaron

Una condición que contempla la variante nueva y se olvida de qué pasa cuando el experimento no está activo. Y el problema opuesto: banderas encendidas hace un año que nadie se anima a sacar.

En un producto que prueba cambios con experimentos, cada funcionalidad nueva nace detrás de una condición. Y esa condición tiene más estados de los que uno escribe: no son dos, son cuatro.

El usuario puede estar en la variante nueva, en la de control, fuera del experimento, o el servicio que asigna variantes puede no haber respondido. Los comentarios de review sobre esto apuntan casi siempre a los dos últimos.

Los cuatro estados

EstadoQué se suele escribirQué debería pasar
Variante nuevaSe contempla siempreLa funcionalidad nueva
ControlSe contempla casi siempreEl comportamiento anterior, intacto
Fuera del experimentoCae en el `else`, junto con el controlEl comportamiento anterior — que puede no ser lo mismo que «control»
Sin respuesta del servicioNadie lo piensaEl comportamiento anterior, sin bloquear la pantalla ni esperar
El tercero y el cuarto son los que aparecen en producción y no en las pruebas.

El cuarto es el más caro: si la pantalla espera la asignación para decidir qué mostrar, el día que ese servicio esté lento la aplicación queda en blanco para todos, con el experimento que no era crítico como causa.

Las condiciones que se olvidan de un caso

Los tres olvidos frecuentes

  1. Sólo se cubre el camino feliz de la variante nueva. El evento de analítica se dispara sólo en una rama, y después las métricas del experimento no cierran porque falta la mitad de la muestra.
  2. La condición se evalúa en un lugar y el efecto en otro. El usuario entra al experimento después de que la pantalla ya decidió, y ve una mezcla de las dos variantes.
  3. Se asume que quien está fuera del experimento es equivalente al control. A veces sí; a veces el control es una variante deliberada con instrumentación propia, y mezclarlos ensucia el resultado.

El problema opuesto: la bandera que ya ganó

El experimento termina, la variante nueva gana, y la bandera queda. Al año hay treinta condiciones encendidas que nadie se anima a tocar porque no sabe si algo todavía depende de ellas.

Antes de seguir, predecí

Una bandera lleva seis meses al cien por ciento. ¿Qué es lo más seguro?

Ese código muerto tiene un costo que se subestima: cada persona que toca esa pantalla tiene que entender las dos ramas, y los tests tienen que cubrir ambas o dejar una sin cubrir.

Lo que hace que no se acumulen

Cuatro reglas baratas

  1. Fecha de vencimiento al crearla. La bandera nace con una fecha y un dueño. Sin eso, la limpieza nunca es prioridad de nadie.
  2. Una lista visible. Un lugar donde estén todas las banderas activas, desde cuándo y en qué porcentaje. Si nadie la mira, ya se acumularon.
  3. La limpieza es parte de terminar el experimento, no un ticket futuro. El experimento termina cuando se borró la rama perdedora, no cuando se leyó el resultado.
  4. Separar tipos de bandera. Las de experimento son temporales por definición; las de configuración por país o marca son permanentes y no se limpian nunca. Mezclarlas en el mismo mecanismo es lo que hace imposible saber cuáles se pueden borrar.
Más a fondo · nivel seniorLa bandera como interruptor de emergencia

Hay un tercer tipo que conviene conservar: el interruptor que permite apagar una funcionalidad en producción sin desplegar. Ése no vence, pero necesita su propia disciplina —que esté probado que apagarlo funciona—. Un interruptor de emergencia que nadie ejercitó nunca es una suposición, y el día del incidente no es el momento de descubrir que la rama apagada ya no compila.

Los cuatro estados en un diff

src/checkout/checkout-button.tsx+7−1

Hay 4 problemas en este cambio. Tocá la línea donde creas que está.

@@ -5,10 +5,20 @@ import { useExperiment } from '../experiments';
55
6
6
7
8
9
10
11
12
713

Dos ramas escritas, cuatro estados posibles, y los dos que faltan se ven exactamente iguales al control.

La vida de una bandera

Cierre

Autoevaluación

¿Lo entendiste?

¿Por qué conviene escribir la condición por la afirmativa —mostrar lo nuevo sólo si la variante es la nueva—?
¿Cuándo se considera terminado un experimento?