Monótono por construcción
Una barra de progreso que iba hacia atrás, y por qué un invariante pertenece a la definición de una métrica y no a un test que lo detecta después.
En uno de nuestros productos, una barra muestra cuánto ha acumulado el usuario de una exposición diaria beneficiosa. Durante las pruebas marcaba sesenta y nueve por ciento a los sesenta y un minutos, y quince por ciento a los setenta y siete. No se había perdido nada. El usuario simplemente había seguido haciendo aquello que la barra medía.
El error no estaba en el renderizado. Estaba en la definición.
La formulación rota
La puntuación multiplicaba un beneficio acumulado por una penalización que crecía a medida que el riesgo se acercaba a un umbral personal:
S(t) = B(t) · (1 − P(t))
Cada factor es defendible por separado. B(t) acumula y nunca decrece. P(t) es una sigmoide que sube cuando la dosis acumulada se acerca al umbral. Su producto, en cambio, es libre de caer — y cae con más fuerza justo cuando el usuario está más implicado, porque ahí es donde la sigmoide se desploma más rápido.
Una magnitud que se presenta al usuario como progreso lleva un contrato implícito: no baja mientras él progresa. La fórmula anterior violaba ese contrato, y ningún ajuste de la pendiente de la sigmoide lo habría arreglado. La propiedad que necesitábamos era estructural.
La corrección: componer solo funciones no decrecientes
Reescribimos la puntuación como suma ponderada de términos que saturan, cada uno función no decreciente de una magnitud que a su vez solo acumula:
S(t) = w₁ · min(1, A₁(t) / a₁) + w₂ · min(1, A₂(t) / a₂)
El término de riesgo no desapareció. Se movió a donde le correspondía: su propio indicador, con su escala, sus umbrales y sus avisos. Dos hechos distintos sobre el estado del usuario se muestran ahora como dos números distintos, lo cual además —no por casualidad— es más honesto que fundirlos en uno.
Cuando dos cosas que el usuario necesita saber se combinan en un solo número, ese número suele dejar de poder decir ninguna de las dos.
La regla general
Antes de exponer una magnitud en una interfaz, escribe las propiedades que debe cumplir. Monótona en el tiempo. Acotada en [0, 1]. Continua ante un cambio pequeño de la entrada. Invariante ante un cambio de unidades. Después comprueba que la fórmula las garantiza, en vez de comprobar que los parámetros actuales resultan producirlas.
- Monotonía — ¿decrece alguna vez mientras la actividad subyacente continúa?
- Acotación — ¿puede una sesión larga empujarla por encima de 100, o una entrada rara por debajo de 0?
- Continuidad — ¿produce alguna vez un salto visible una diferencia de un minuto en la entrada?
- Saturación — ¿se comporta razonablemente en el límite, o crece sin cota?
Son cuatro líneas de análisis en una pizarra. Salen considerablemente más baratas que descubrir, después del lanzamiento, que el número sobre el que gira tu producto es capaz de contradecirse delante de un usuario.