La definición estaba bien. El código decía otra cosa. Y nadie estaba leyendo el código.
Una empresa agrícola con la que trabajé medía la rotación de personal, y la definición era de manual: el número de empleados que se van durante un período, dividido entre el promedio de la planilla en ese período. Nadie la discutía. No había nada que discutir.
Lo que me hizo mirar no fue desconfianza del método. Fue que los números no cuadraban entre sí: la rotación del año no se parecía al promedio de las rotaciones de cada mes, y debería. Un promedio de promedios no se aleja tanto de sus partes. Así que fui a ver cómo se calculaba el denominador.
Era la planilla del primer día del período más la del último, dividido entre dos. Un promedio de dos puntos. Para una empresa con una planta de personal estable, está bien. Esta no lo era: unos 7.000 empleados, cerca del 60% temporales, con la planta creciendo y encogiéndose al ritmo de la cosecha. Buena parte de esos temporales viaja a Nicaragua a fin de año, así que el 31 de diciembre y el 1 de enero, los dos días exactos que el cálculo usaba como denominador, caían siempre en el valle estacional.
Fijate lo que hace eso. Esos dos días en el borde deciden todo el promedio. Como acá el fin de año era siempre un valle, el promedio de dos puntos salía bajo, el denominador se encogía, y la rotación parecía más alta de lo que fue. En otra empresa, donde el corte cayera en un pico, pasaría lo contrario: el denominador se infla y la rotación parece más baja. En cualquiera de los dos casos el número está mintiendo sobre el año, porque dos días en los bordes no pueden representar una curva que se movió los doce meses. Lo comprobé de la forma más simple: entre el 15% y el 20% de las personas que trabajaron ese año no aparecían en ninguno de los dos cortes. Uno de cada cinco empleados reales nunca entró al denominador que decía contarlos.
La versión fiel no es complicada: promediás la planilla de cada mes, los trece puntos de corte, para que el denominador refleje el período que dice describir. La definición decía “promedio de planilla en el período.” El código decía “promedio de dos días.” Son dos afirmaciones distintas sobre la empresa, y nadie lo había notado, porque las dos producen un porcentaje creíble.
Una fórmula es una afirmación sobre el negocio
Esta falla no se parece a ninguna otra de la serie. Hasta ahora escribí sobre números que engañaban por cómo estaban definidos, agregados, acotados o manipulados. Este es sobre un número cuya definición era correcta y cuya implementación no lo era.
El código no inventa significado. Lo materializa. Cuando el código que implementa una métrica se aleja de la definición que el negocio acordó, no tira un error ni levanta una alerta. Simplemente empieza, en silencio, a hacer una afirmación distinta sobre el negocio, en un número que se ve exactamente tan plausible como se vería el correcto. No hay falla técnica que atrapar. Hay solo una cifra creíble que significa algo distinto de lo que se prometió.
Y esa plausibilidad es todo el problema, por cómo se revisan estas cosas. Cuando alguien valida una medida, casi nadie lee la fórmula contra la definición. Miran el resultado y se preguntan si parece razonable. Una rotación del 14% parece razonable. Una rotación del 19% también parece razonable. Un promedio de dos puntos es invisible en la capa del resultado, porque su salida es un porcentaje de aspecto perfectamente común. La revisión chequea si el número se ve bien, nunca si la fórmula dice lo que el modelo quería decir. El camuflaje viene de fábrica.
La que todos recuerdan a medias
La versión de manual de esto es margen contra markup, y seguro la viste discutir en internet. El modelo define el margen bruto con precisión:
// Definición: Margen Bruto % = (Ventas - Costo) / Ventas
El desarrollador que implementa la medida escribe esto otro:
// MAL -- esto es markup, no margen bruto
Margen Bruto % = DIVIDE( [Ventas Netas] - [Costo de Ventas], [Costo de Ventas] )
Las dos devuelven un porcentaje. Las dos se ven razonables en un dashboard. Nadie lo atrapa, porque nadie chequea la fórmula contra la definición: chequean que los números “se vean bien.” El error sale a la superficie tres meses después, cuando el equipo de categoría compara contra un benchmark de la industria. El modelo reporta 42% de margen en una categoría donde el sector corre al 28%. La brecha no es el mercado. Es el denominador.
Acá está la parte que las discusiones de internet se pierden. Se obsesionan con la matemática: cuál denominador es el correcto, cómo recordar la diferencia. Esa no es la lección. La lección es que durante tres meses el dashboard estuvo haciendo una afirmación distinta sobre el negocio de la que la empresa creía estar haciendo, y la gente estuvo fijando precios, planeando y comparando apoyada en eso. La corrección es una línea de DAX:
// CORRECTO -- fiel a la definición del modelo
Margen Bruto % = DIVIDE( [Ventas Netas] - [Costo de Ventas], [Ventas Netas] )
Una línea. Un trimestre de decisiones tomadas sobre un negocio distinto al que estaba en la sala. Y fijate dónde vivió la traición: el mismo lugar donde vivió en el caso de la rotación. El numerador era honesto. El denominador era la mentira. En el caso cotidiano ese es exactamente el patrón: el numerador se porta bien y el denominador hace el daño silencioso. Las invenciones más audaces pueden darle la vuelta, eso sí, y mover la mentira al numerador mismo.
Cuando la fórmula se vuelve pública
Dentro de una empresa, una fórmula traicionada te cuesta unas cuantas decisiones malas y una reunión incómoda. Cuando la fórmula se reporta a inversionistas, te puede costar una demanda.
En 2004, Netflix reportó la rotación de suscriptores (churn). Su fórmula dividía las cancelaciones del trimestre entre la suma de los suscriptores iniciales y los nuevos suscriptores brutos sumados ese trimestre. Leé ese denominador otra vez: incluía a los nuevos suscriptores. Así que en cualquier trimestre en que Netflix estuviera sumando muchos clientes (que era casi siempre), el denominador se inflaba y la tasa de churn salía baja. Más baja de lo que sugeriría la experiencia de los clientes que de verdad se iban. La definición de churn que usaban otras empresas, telcos como Sprint y Nextel, dividía las cancelaciones entre el número promedio de suscriptores en el período.
Cuando Netflix reveló las cifras reales de cancelación de trimestres anteriores en julio de 2004, la brecha quedó visible, y siguió una demanda de accionistas que alegaba que la empresa había subestimado su churn a través del propio método de cálculo. No te voy a contar cómo se resolvió ese litigio, y no importa para el punto. El punto es que una elección de denominador (el tipo de cosa que vive sin comentarios en una hoja de cálculo, decidida una vez por quien construyó la medida) se volvió la base de una acusación de fraude de valores. La fórmula era una afirmación sobre el negocio, y las afirmaciones que una empresa le hace a sus inversionistas son legalmente portantes.
Se pone más filoso cuando la fórmula no es un error sino una invención. Groupon llegó a su IPO de 2011 con una métrica que llamó Adjusted Consolidated Segment Operating Income. El truco estaba en lo que dejaba fuera: amortizaba los costos de marketing en línea como si fueran una inversión de capital en lugar del costo de comprar los clientes del trimestre. Ese solo movimiento convirtió una pérdida operativa de $420 millones en $60 millones de “ingreso”, hasta que la SEC empujó de vuelta y la métrica salió antes de que la empresa saliera a bolsa.
WeWork le hizo la misma cirugía a la rentabilidad. Su “Community-Adjusted EBITDA” restaba los intereses e impuestos de siempre, y después seguía restando (renta, marketing, gastos generales y administrativos) hasta que un negocio que perdía dinero en cada edificio se leía como rentable. Los juegos del denominador se esconden en porcentajes de aspecto normal; estas invenciones reescriben el numerador mismo, sumando de vuelta los costos que definen si el negocio funciona o no. Los mercados y los reguladores aprendieron a tratar una fórmula creativa por lo que es: una afirmación sobre el negocio, disfrazada de medición.
La cura: leer la fórmula contra la promesa
Esto no se arregla con mejor aritmética. Se arregla cambiando qué es lo que se revisa.
Validá la fórmula contra la definición, no contra el resultado. El resultado siempre se va a ver plausible: esa es la trampa, no la excepción. Alguien tiene que poner el DAX o el SQL al lado de la definición declarada en el modelo y confirmar, línea por línea, que hacen la misma afirmación. En la empresa agrícola nadie había puesto esas dos cosas lado a lado; el día que por fin lo hice, la distancia entre “promedio del período” y “promedio de dos días” apareció en una tarde. El “promedio de planilla” de la definición tiene que ser el mismo promedio que el código calcula. El “margen bruto” tiene que dividir entre ventas, porque eso es lo que se prometió que la palabra significaba. Este es trabajo aburrido y es el único trabajo que atrapa la traición.
Tratá el modelo como el contrato. Cuando el código no puede implementar la definición exacta (una limitación de datos, un techo de rendimiento), la jugada es volver a la definición y cambiarla, a la vista, donde todos puedan ver la nueva promesa. No parchás el código en silencio para que haga algo que la definición no describe. Un parche silencioso es cómo un contrato se reescribe sin que nadie lo firme, y es indistinguible, tres meses después, del bug que pretende no ser.
Hacé que la definición y el código sean trazables entre sí. La medida debería cargar su definición consigo: una descripción, documentación, el modelo bajo control de versiones para que la historia de la fórmula sea visible. Así un revisor puede chequear la promesa contra la implementación, y también un auditor un año después, y también, si alguna vez llega a eso, el perito que lea tu medida en una declaración judicial. Una fórmula que no podés rastrear hasta una definición es una afirmación que nadie puede defender.
Cierre
Acá es donde empezó la serie, dada vuelta. El primer post fue sobre una definición que todos acordaban y que dos personas nunca compartieron de verdad: significado que faltaba. Este es sobre una definición que todos acordaban, que se capturó, se firmó y era correcta, y que el código ignoró en silencio: significado que estaba presente, y que después se reescribió en la traducción, en el único lugar que nadie estaba leyendo.
Una fórmula no es un detalle técnico para delegar y olvidar. Es la afirmación más precisa que tu organización hace sobre sí misma, y está escrita en un idioma que la mayoría de la gente que depende de ella no sabe leer. Esa brecha (entre las personas que deciden qué significa un número y las personas que implementan lo que en realidad calcula) es donde vive la traición, silenciosa y plausible, hasta el día en que es un benchmark que no cuadra, una junta directiva que no puede defender su cifra de crecimiento, o un tribunal leyéndote tu fórmula de churn de vuelta.
Así que leé la fórmula contra la promesa. Y cuando quieras saber qué está afirmando de verdad una métrica, hacé lo que casi nadie hace: leé la parte que nadie más se molesta en leer (el denominador, o el ajuste silencioso metido en el numerador) porque el numerador que todos citan te dice qué midieron, y esa parte silenciosa te dice qué querían decir.


Deja una respuesta