Artículos en profundidad sobre la tecnología que da forma al futuro.

Cada capa de revisión hace que tu equipo vaya más lento

Más revisión de código no significa mejor código. Cómo los procesos excesivos crean cuellos de botella, frustran a los desarrolladores y reducen la calidad.

Un pequeño rollo de papel atascado detrás de una larga fila de sellos de goma y puertas de control

Una startup lanza un bug a producción. La respuesta de la dirección: añadir un requisito de revisión de código. Se cuela otro bug. Respuesta: exigir dos revisores. Luego llega un incidente de seguridad. Respuesta: añadir un paso de revisión de seguridad. Después, una inconsistencia de diseño. Respuesta: añadir una revisión de diseño. En dos años, cada cambio, por pequeño que sea, pasa por cuatro etapas de revisión, tarda tres días en integrarse, y los desarrolladores que antes desplegaban a diario ahora dedican más tiempo a revisar código que a escribirlo.

Este patrón es tan común que casi es una ley del comportamiento organizacional: cada incidente crea una nueva capa de revisión, y ninguna capa de revisión se elimina jamás. El resultado es un proceso optimizado para evitar el último incidente a costa de frenar todo el progreso futuro.

La matemática de las colas de revisión

Cada capa de revisión no solo suma, sino que multiplica. Si una sola revisión tarda de media 4 horas en completarse (no la revisión en sí, que lleva 20 minutos, sino el tiempo que el PR pasa en la cola esperando a que un revisor llegue a él), dos revisiones secuenciales tardan 8 horas. Tres, 12. Cuatro, 16.

Pero es peor por el cambio de contexto. Un desarrollador envía un PR y empieza otro trabajo. Cuando el feedback llega horas después, tiene que volver al trabajo anterior, recargar el contexto, atender los comentarios, reenviar y esperar de nuevo. Cada ronda de revisión cuesta entre 30 y 60 minutos de sobrecarga por cambio de contexto, además del tiempo en cola.

Y está el efecto en cascada. Si el revisor A pide cambios, el desarrollador los aplica y reenvía. Ahora el revisor B, que aún no ha visto el PR, lo revisa y pide cambios distintos. El desarrollador los aplica. Ahora el revisor A tiene que volver a revisar para verificar que su feedback se atendió, pero ya ha pasado a otro trabajo y el PR vuelve a la cola.

Timeline of a PR through a 3-reviewer process:
Day 1 9:00  — Developer submits PR
Day 1 14:00 — Reviewer A reviews, requests changes
Day 1 15:00 — Developer addresses feedback, resubmits
Day 2 10:00 — Reviewer B reviews, requests different changes
Day 2 11:00 — Developer addresses, resubmits
Day 2 16:00 — Reviewer A re-reviews, approves
Day 3 11:00 — Reviewer C reviews, approves
Day 3 11:30 — Reviewer B re-reviews, approves
Day 3 12:00 — PR merges
Elapsed time: ~3 business days
Actual review time: ~90 minutes total
Actual code change time: ~2 hours
Time waiting in queues: ~22 hours
Queue time is 80% of the total elapsed time.

La paradoja de la calidad

La suposición detrás de añadir capas de revisión es que más revisión produce mejor código. Esto es cierto hasta cierto punto, y a partir de ahí se invierte.

Un revisor atento detecta problemas reales: errores lógicos, casos límite olvidados, fallos de seguridad, dudas sobre el diseño de la API. Un segundo revisor ocasionalmente encuentra cosas que el primero pasó por alto, quizá entre el 10 y el 20 % de las veces. Un tercero casi nunca encuentra algo que los dos anteriores no vieran. El valor marginal de cada revisor adicional cae en picado.

Mientras tanto, el coste en calidad de las integraciones lentas es real y no se contabiliza. Las ramas de larga duración se desvían de main, lo que obliga a hacer rebase y puede introducir errores de fusión. Los desarrolladores agrupan más cambios en cada PR para evitar la sobrecarga de revisión, lo que hace cada PR más grande y más difícil de revisar con cuidado. Los revisores se cansan: cuando la cola tiene 15 PR, lees por encima en vez de leer con atención.

La paradoja: añadir capas de revisión para mejorar la calidad puede reducirla, porque crea incentivos (PR más grandes, revisiones apresuradas, ramas obsoletas) que socavan el propio proceso de revisión.

Lo que realmente previenen los procesos de revisión pesados

Los procesos de revisión suelen justificarse con incidentes concretos. 'Lanzamos un bug porque nadie revisó el código'. Pero preguntarse si una revisión habría detectado un bug concreto es distinto de preguntarse si exigir revisión mejora los resultados globales.

Los estudios sobre la eficacia de la revisión de código coinciden en que detecta alrededor del 60 % de los defectos, sobre todo problemas superficiales como nombres, formato y errores lógicos obvios. Los errores de arquitectura profunda, los problemas de concurrencia y las vulnerabilidades de seguridad rara vez los detecta la revisión, porque exigen entender todo el sistema, no solo el diff. Los bugs que causan incidentes en producción son desproporcionadamente del tipo que la revisión no detecta.

Lo que realmente previene los incidentes en producción son las pruebas, la monitorización y la capacidad de desplegar y revertir rápido. Un equipo que entrega deprisa, con buenas pruebas, feature flags y rollbacks instantáneos, tendrá menos incidentes que uno con cuatro capas de revisión, sin pruebas de integración y con ciclos de despliegue de una hora.

La cantidad justa de revisión

La revisión de código es valiosa. Un revisor por PR, con expectativas claras sobre qué debe revisar, es el punto óptimo para la mayoría de los equipos. Así se ve en la práctica.

  • Un revisor, no dos ni tres. El primer revisor detecta el 80 % de lo que la revisión llegará a detectar. El segundo aporta un valor marginal a un coste considerable. Reserva los procesos con varios revisores para cambios de alto riesgo de verdad (migraciones de base de datos, cambios de autenticación, modificaciones de APIs públicas).
  • Pon límite de tiempo a la cola de revisión. Si un PR no se ha revisado en 4 horas, es un fallo del proceso, no un problema de revisor perezoso. El equipo necesita priorizar la capacidad de revisión o aceptar que tiene más desarrolladores de los que su proceso puede sostener.
  • PR pequeños, no grandes. Un PR de 50 líneas recibe una revisión cuidadosa en 10 minutos. Uno de 500 líneas recibe una revisión superficial en 30. El de 50 líneas se revisa mejor pese a tardar menos. Los límites de tamaño (200-300 líneas como máximo) mejoran la calidad de la revisión más que añadir revisores.
  • Omite la revisión en cambios de bajo riesgo. Cambios de configuración, actualizaciones de texto, subidas de dependencias o nuevos tests no necesitan el mismo escrutinio que la lógica de negocio. Define una categoría de 'bajo riesgo' y permite el merge propio con revisión posterior.
  • Automatiza lo que hacen mejor las máquinas. Linting, formateo, comprobación de tipos y cobertura de tests son tareas de revisión que las máquinas hacen más rápido y de forma más consistente que las personas. No malgastes la atención del revisor en lo que resuelve un check de CI.

El problema cultural

Reducir capas de revisión es difícil porque parece reducir la seguridad. Nadie quiere ser quien pidió menos revisión justo antes de un incidente en producción. Es un problema de cultura organizacional, no técnico.

El enfoque que ayuda: la revisión es uno de muchos mecanismos de seguridad, y tiene rendimientos decrecientes. Añadir un cuarto revisor para evitar bugs es como añadir un cuarto candado para evitar robos: el primero hace casi todo el trabajo, y cada candado extra añade molestias sin una seguridad proporcional. Nadie pondría cuatro candados. No pongas cuatro revisores.

Los equipos que avanzan rápido y rompen menos suelen invertir en los mecanismos que de verdad previenen incidentes: pruebas automatizadas completas, feature flags para despliegues graduales, monitorización robusta con alertas, rollbacks en un clic y una cultura sin culpables que trate los incidentes como oportunidades de aprendizaje y no como objetivos a señalar. Estas inversiones se acumulan con el tiempo de una forma que las capas de revisión no hacen.

Eliminar una capa de revisión

Si tu equipo ha acumulado demasiados requisitos de revisión, así puedes reducirlos sin provocar pánico.

Empieza midiendo el proceso actual. ¿Cuánto tardan los PR desde que se envían hasta que se integran? ¿Cuánto de ese tiempo es espera en cola frente a revisión activa? ¿Cuántos PR hay en la cola de revisión en cada momento? Estas cifras hacen visible el coste: la mayoría de los equipos se sorprende al ver que su PR medio tarda 3 días en integrarse.

Después, haz un experimento. Durante un mes, exige un revisor en lugar de dos y mide las mismas métricas. ¿Cambiaron las tasas de incidentes? ¿Cambió la calidad del código, medida con tasas de defectos y no con sensaciones? Casi siempre la respuesta es: los incidentes no aumentaron, la calidad se mantuvo y el rendimiento mejoró notablemente.

El objetivo no es cero revisión, sino la revisión mínima que mantiene la calidad maximizando el rendimiento. Ese mínimo casi siempre es menor de lo que los equipos hacen ahora, porque las capas de revisión se acumulan con la respuesta a incidentes pero nunca se eliminan mediante la optimización de procesos. Como con la mayoría de cosas al construir buen software, la respuesta no es más proceso, sino el proceso adecuado.