Qué son las métricas DORA: Velocidad y estabilidad DevOps

Resumen

Las métricas DORA miden cinco aspectos clave de la entrega de software: tiempo de cambio, frecuencia de despliegue, tiempo de recuperación, tasa de fallos y retrabajos. Usadas correctamente, identifican cuellos de botella en tu sistema de entrega sin que el equipo juegue con los números.

Escritorio de ingeniero por la noche con un monitor mostrando líneas de tendencia de entrega

Qué son las métricas DORA: Midiendo la velocidad y estabilidad del despliegue

Las métricas DORA son cinco medidas del rendimiento de entrega de software: tiempo de cambio, frecuencia de despliegue, tiempo de recuperación ante fallos de despliegue, tasa de cambios fallidos y tasa de retrabajos de despliegue. Las primeras tres describen el throughput, las últimas dos describen la estabilidad. En conjunto, te dicen qué tan rápido llegan los cambios a producción y con qué frecuencia esos cambios generan problemas. Cuando se usan bien, apuntan el cuello de botella. Cuando se usan mal, se convierten en un boletín de calificaciones que tu equipo aprende a falsear.

De dónde vienen los números, y por qué la terminología se quedó

Un líder de plataforma está en una revisión trimestral. El CTO hace una sola pregunta: ¿Estamos entregando más rápido que hace un año y rompemos menos? Sin vocabulario compartido, la respuesta es un montón de anécdotas. Las métricas DORA existen para reemplazar las anécdotas con cuatro o cinco números que puedas obtener de sistemas que ya estás ejecutando.

El nombre proviene de DevOps Research and Assessment, el programa de investigación que pasó años encuestando equipos de ingeniería y correlacionando sus prácticas de entrega con resultados organizacionales. Ahora es parte de Google Cloud, y los hallazgos se publican cada año. El libro Accelerate popularizó las cuatro métricas originales. El marco se ha revisado desde entonces, y esa revisión importa más de lo que la mayoría de los posts admite.

Aquí está la parte que se pierde: las métricas nunca fueron pensadas como un ranking. Surgieron de un hallazgo estadístico. Los equipos que puntuaban bien en velocidad también puntuaban bien en estabilidad. Velocidad y seguridad no eran un tradeoff, se movían juntas. Ese es un reclamo sobre correlación entre muchos equipos, no una meta para el tuyo.

Las cinco métricas, definidas como un ingeniero on-call las definiría

Las definiciones actuales se dividen en dos grupos. Léelas con un servicio específico en mente, porque cada definición se desmorona si la aplicas a "la empresa".

Tiempo de cambio (Lead Time). El tiempo desde que un commit entra en main hasta que ese commit se ejecuta en producción. No desde que se abre el ticket, y no desde que se aprueba el pull request. Desde commit a prod. Si tu pipeline tarda cuarenta minutos y tu release train sale los jueves, tu lead time está dominado por los jueves.

Frecuencia de despliegue. Qué tan seguido despliegas a producción. Puedes contar despliegues en un período o medir el espacio entre ellos. Un servicio que despliega once veces al día y un servicio que despliega una vez al mes son animales diferentes, y promediarlos oculta ambos.

Tiempo de recuperación ante fallos. Cuánto tarda en recuperarse cuando un despliegue causa un problema que requiere intervención. Solía llamarse tiempo medio de reparación, y el cambio de nombre es deliberado. Solo cuenta incidentes causados por tu propio cambio, no un apagón del proveedor cloud un martes.

Tasa de cambios fallidos. La parte de despliegues que requieren intervención inmediata después: un rollback, un hotfix, un fix hacia adelante enviado a toda velocidad. Diez despliegues, dos de ellos revertidos, una tasa de cambios fallidos del veinte por ciento.

Tasa de retrabajos. La parte de despliegues que son no planificados, desencadenados por un incidente en producción en lugar de trabajo de roadmap. Esta es la adición más nueva, y captura algo que la tasa de cambios fallidos se pierde: el equipo que nunca revierte pero gasta media semana desplegando patches de emergencia.

Cronómetro descansando en un panel de rack de servidor, una imagen del tiempo de cambio

Throughput versus estabilidad: por qué nunca lees una métrica sola

Las primeras tres métricas son throughput. Las últimas dos son estabilidad. La agrupación es todo el punto.

Si solo vigilas throughput, celebrarás un equipo que despliega cuarenta veces al día y silenciosamente revierte una cuarta parte de ellos. Si solo vigilas estabilidad, recompensarás un equipo que envía una vez al mes con un historial impecable, porque nadie cambia nada. Cada métrica tiene una forma barata de mejorarla que empeora el sistema.

Frecuencia de despliegue sube cuando divides un deploy en cinco deploys vacíos. Tasa de cambios fallidos baja cuando dejas de contar los hotfixes como fallos. El lead time se reduce cuando redefines cuándo empieza el reloj. Esta es la ley de Goodhart en acción: cuando una medida se convierte en objetivo, deja de ser una buena medida. La guía oficial la lista primero entre sus advertencias, y es la que más duele.

Entonces la regla de trabajo es en pares. Lee lead time junto a tasa de cambios fallidos. Lee frecuencia de despliegue junto a tasa de retrabajos. Un movimiento en una dirección sin una historia coincidente en la otra es una señal de mirar más de cerca, no una victoria que anunciar.

Los benchmarks circulan en cada deck de vendedor, y son una trampa. El patrón reportado de recientes reportes DORA es consistente en forma: el cluster más fuerte de equipos despliega on-demand, con un lead time bajo un día, y se recupera de un despliegue fallido en menos de una hora. El cluster más lento se sienta en el rango de semanas a meses en ambos.

Esas cifras son útiles para una cosa: calibrar tu intuición sobre qué es posible. Son pobres como objetivos. Un servicio de pagos con una puerta de auditoría obligatoria no coincidirá con un sitio de marketing, y no debería intentarlo. La orientación oficial es explícita en que debes comparar solo aplicaciones o servicios similares, y que debes apuntar a mejorar contra tu propia línea base en lugar de competencia entre equipos.

Comienza con tu propia mediana. Mídela durante un mes antes de establecer cualquier objetivo. El primer número casi siempre es vergonzoso, y eso está bien. Una línea base que te avergüenza es una línea base en la que realmente puedes confiar.

Cómo instrumentarlas sin construir una data platform

La mayoría de los equipos sobrecargan esto. No necesitas un proyecto de warehouse. Necesitas cuatro timestamps y una bandera.

Los timestamps: commit fusionado a main, build terminado, despliegue iniciado en producción, despliegue terminado. La bandera: si el despliegue fue revertido posteriormente, parcheado o seguido de un deploy no planificado dentro de una ventana definida.

Aquí hay un sketch mínimo en TypeScript. Toma una lista de registros de despliegue y devuelve los números que importan.

type Deploy = {
  service: string;
  committedAt: Date;
  deployedAt: Date;
  failed: boolean;       // reverted, hotfixed, or manual intervention
  unplanned: boolean;    // triggered by an incident, not by roadmap work
  recoveredAt?: Date;    // set when failed is true
};

const median = (xs: number[]) => {
  const s = [...xs].sort((a, b) => a - b);
  return s.length ? s[Math.floor(s.length / 2)] : 0;
};

export function doraSummary(deploys: Deploy[], days: number) {
  const leadHours = deploys.map(
    d => (d.deployedAt.getTime() - d.committedAt.getTime()) / 36e5,
  );
  const failures = deploys.filter(d => d.failed);
  const recoveryMins = failures
    .filter(d => d.recoveredAt)
    .map(d => (d.recoveredAt!.getTime() - d.deployedAt.getTime()) / 6e4);

  return {
    leadTimeHoursP50: median(leadHours),
    deploysPerDay: deploys.length / days,
    changeFailRate: failures.length / Math.max(deploys.length, 1),
    recoveryMinutesP50: median(recoveryMins),
    reworkRate: deploys.filter(d => d.unplanned).length / Math.max(deploys.length, 1),
  };
}

Dos decisiones en ese snippet llevan el peso. Primero, usa la mediana, no el promedio. Una mala semana con una recuperación de tres días destrozará un promedio y no te dirá nada sobre un martes típico. Segundo, calcula todo por servicio. Agrega a un equipo o departamento solo después de que hayas mirado los servicios debajo.

La parte difícil no es el código. La parte difícil es la bandera failed. Alguien tiene que decidir qué cuenta como un fallo, escribirlo, y aplicarlo de la misma forma cada vez. Si tu incident tracker vincula incidentes al despliegue que los causó, obtienes esto casi gratis. Si no, empieza ahí.

Panel de interruptores industrial con una palanca roja jalada, una imagen de un cambio fallido

La pregunta de herramientas viene después de la pregunta de datos. Ya posees la mayoría de los datos brutos. Tu host de Git tiene tiempos de commit. Tu CI tiene eventos de build y despliegue. Tu herramienta de incidentes tiene los fallos. El trabajo es uniéndolos en un identificador de despliegue compartido.

Las plataformas de observabilidad son un lugar natural para superponer marcadores de despliegue sobre tasas de error y latencia, para que puedas ver cuál deploy precedió cuál pico.

Si prefieres mantener el stack abierto y autohospedado, una capa de dashboard sobre tu propia base de datos de eventos de despliegue hace el mismo trabajo a menor costo, con más fontanería de tu lado.

También hay una categoría de herramientas que lee tus repositorios e historial de entrega y expone el riesgo, como hotspots donde el code churn y los defectos pasados se agrupan. No reemplazará los cuatro timestamps, pero explica por qué un servicio tiene una alta tasa de cambios fallidos cuando sus vecinos no.

Una advertencia sobre comprar algo aquí. Un dashboard que muestre los números no es lo mismo que un equipo que actúe sobre ellos. Si nadie posee el gráfico de tiempo de recuperación, comprar un gráfico más bonito no cambia nada.

Las palancas que realmente mueven cada número

Las métricas son un diagnóstico. El tratamiento está en otro lado, y es diferente para cada una.

Para lead time, mira la espera, no el trabajo. Extrae una docena de cambios recientes y marca dónde cada uno estaba inactivo: esperando revisión, esperando un slot de build, esperando una ventana de release. En la mayoría de los equipos el tiempo inactivo supera el tiempo de codificación varias veces. Pulls requests más pequeños y una expectativa de nivel de servicio de revisión vencen cualquier ajuste de pipeline.

Para frecuencia de despliegue, la palanca es el tamaño de lote. Los cambios más pequeños son más fáciles de revisar, más fáciles de razonar, y más fáciles de revertir. El desarrollo trunk-based y las feature flags existen para dejarte fusionar trabajo inacabado de forma segura, que es cómo desacloplas deployar de releaser.

Para tasa de cambios fallidos, la palanca es cuánto del blast radius puedes ver antes de que sea toda la flota. Un rollout que expone el uno por ciento del tráfico, vigila una tasa de error contra un SLO, y se detiene en una brecha convierte un incidente potencial en un no-evento. Esa es la brecha entre un despliegue fallido y un cambio fallido que nadie fuera del equipo notó.

Para tiempo de recuperación, la palanca es el revert. Si el fix más rápido es rollback, entonces el tiempo de recuperación es qué tan rápido detectas el problema más qué tan rápido presionas el botón. Automatizar el revert en un threshold reduce el humano de los primeros diez minutos. A las 3am eso importa más que cualquier runbook.

Para tasa de retrabajos, la palanca es upstream. Un número alto significa que los incidentes están generando despliegues. Mira qué servicios producen los patches de emergencia, y lee sus post-mortems como un conjunto en lugar de uno a la vez.

Qué cambia cuando la IA escribe más de tu código

La investigación DORA reciente apunta a algo incómodo para quien venda un asistente de codificación. Los asistentes aceleran tareas de bajo nivel, pero las ganancias no se llevaron claramente al lead time o tasa de cambios fallidos. Más código escrito por hora no es lo mismo que más valor entregado por semana.

Si acaso, un volumen más grande de cambios generados empuja presión en revisión y en tu pipeline de entrega. Lotes más grandes lastiman la estabilidad, y la capacidad de revisión no escala con la velocidad de escritura. Vigila tu tasa de cambios fallidos y tasa de retrabajos de cerca en los meses después de que un equipo adopte un asistente. Si lead time cae pero retrabajos suben, no conseguiste ir más rápido, moviste el costo.

Cuaderno con gráficos de tendencia dibujados a mano para una retro de equipo

Cómo usarlas en una retro sin romper tu equipo

Aquí está lo que funciona en la práctica. Pon las líneas de tendencia en pantalla para el último trimestre y haz una sola pregunta: ¿Qué cambió aquí, y por qué? No preguntes quién. El objetivo es una hipótesis sobre el sistema, no un veredicto sobre una persona.

Tres hábitos mantienen los números honestos.

Primero, nunca las pongas en revisiones de desempeño individual. En el momento en que una métrica se une a un nombre, la gente optimiza la métrica, y tus datos dejan de describir la realidad.

Segundo, empareja cada número con una historia. Un pico en tiempo de recuperación es un incidente con un nombre y un post-mortem. Lee el post-mortem antes de leer el gráfico.

Tercero, cambia una cosa a la vez. Si adoptas feature flags, encoges pull requests, y automatizas rollbacks en el mismo mes, nunca aprenderás cuál fue el que movió la aguja.

Salta la slide del modelo de madurez que ordena tu org en tiers y reparte un trofeo. Que valga la pena en su lugar: una sola página por servicio, actualizada mensualmente, listando los cinco números, el valor del mes anterior, y una oración sobre qué cambió.

Supongamos que tuviste noventa días de datos limpios en un servicio, y viste la tasa de cambios fallidos escalando hacia arriba mientras la frecuencia de despliegue se mantenía plana. ¿Dónde mirarías primero: el tamaño de los cambios, la calidad de la revisión, o la visibilidad que tienes en un rollout mientras aún es pequeño? Tu respuesta dice más sobre tu sistema de entrega que cualquier benchmark.

Preguntas frecuentes

¿Cuál es la diferencia entre tasa de cambios fallidos y tasa de retrabajos?
La tasa de cambios fallidos mide despliegues que requieren intervención inmediata (rollbacks, hotfixes). La tasa de retrabajos mide despliegues no planificados causados por incidentes en producción. Un equipo puede tener una tasa de fallos baja pero una tasa de retrabajos alta si cada fallo se corrige lentamente, generando múltiples despliegues de emergencia.
¿Por qué las métricas DORA se deben leer en pares?
Porque cada métrica tiene una forma cheap de mejorar que empeora el sistema. Leer frecuencia de despliegue con tasa de cambios fallidos evita celebrar más despliegues que producen más fallos. Leer lead time con tasa de fallos evita acelerar el pipeline sacrificando estabilidad. Los pares revelan si el sistema mejora realmente o solo se está gaming la métrica.
¿Necesito una plataforma de datos compleja para instrumentar DORA?
No. Solo necesitas cuatro timestamps (commit, build, deploy start, deploy end) y una bandera (si fue fallido o no). Tu Git host, CI y herramienta de incidentes ya tienen estos datos. El trabajo es unirlos con un identificador de despliegue compartido, lo que se puede hacer con queries simples o un pequeño script.
¿Debería comparar mis métricas DORA con benchmarks de la industria?
Los benchmarks son útiles para calibrar intuición sobre qué es posible, no como objetivos. Un servicio de pagos con puertas de auditoría no debería compararse con un sitio de marketing. La guía oficial recomienda comparar solo servicios similares y apuntar a mejora contra tu propia línea base, no competencia entre equipos.
¿Cómo empezar a medir DORA en un equipo que nunca lo ha hecho?
Comienza simple: recolecta cuatro timestamps para tus últimos 30 despliegues (commit, build, deploy start, deploy end) y marca cuáles fallaron. Calcula la mediana, no el promedio. Mide un mes antes de establecer cualquier objetivo. El primer número será vergonzoso, pero es una línea base en la que confiar. Luego, identifica dónde el equipo pierde más tiempo: revisión, build, deployment window, o recuperación. Eso te dice dónde enfocarte primero.