Saltar al contenido
← Ideas

Cómo retirar feature flags obsoletas sin dejar ramas ocultas en el producto

Una guía para identificar cuándo retirar una feature flag, comprobar sus dependencias, eliminar rutas alternativas y validar el cambio sin perder control del producto.

Equipo revisando una feature flag y las ramas de código que se eliminarán tras decidir el comportamiento definitivo

Una feature flag permite separar el despliegue de código de la activación de una funcionalidad. Esa separación es útil mientras se valida o coordina un cambio, pero una bandera que permanece sin revisión puede dejar ramas de código olvidadas y añadir complejidad a cada mantenimiento. Retirarla no consiste solo en borrar una condición: hay que decidir qué comportamiento queda, comprobar quién depende de ella y validar que la limpieza no altera otros flujos.

El objetivo práctico es tratar cada bandera temporal como un elemento con propósito, responsable y criterio de salida. Así, el equipo puede conservar las banderas que todavía cumplen una función y eliminar las que ya solo representan deuda técnica.

Qué tipo de bandera tienes y para qué sirve

Qué tipo de bandera tienes y para qué sirve

Antes de cambiar código, identifica la función de la bandera. No todas deberían retirarse con el mismo calendario, y algunas no son temporales. Una clasificación sencilla ayuda a evitar tanto la eliminación prematura como la permanencia por inercia:

  • Bandera de lanzamiento: controla el acceso a una funcionalidad que se está incorporando. Si el comportamiento nuevo ya es el producto elegido y no se necesita volver al anterior mediante la bandera, suele ser candidata a retirada.
  • Bandera de experimentación: permite comparar variantes o limitar una prueba. Debe revisarse cuando termine el experimento y se haya decidido qué variante mantener. Conservar sus condiciones sin una hipótesis activa puede dejar resultados y rutas ambiguos.
  • Configuración permanente: permite ajustar un comportamiento operativo o una opción de producto de forma continuada. No es necesariamente deuda temporal; requiere documentación, controles y un responsable, como cualquier configuración mantenida.

También puede haber banderas de emergencia o de operación que facilitan desactivar una función en circunstancias concretas. No las retires solo porque lleven tiempo en el sistema: primero confirma si existe una necesidad vigente y si otro mecanismo cubre esa función. La pregunta clave no es cuánto tiempo lleva una bandera, sino qué decisión o capacidad habilita hoy.

Define responsable y condición de retirada desde el inicio

La forma más eficaz de reducir el inventario olvidado es registrar el ciclo de vida al crear la bandera. Incluye, como mínimo, su propósito, un responsable identificable, el comportamiento que se espera dejar activo y una fecha o evento de revisión. No hace falta que la fecha implique una eliminación automática: sirve para que la decisión no quede sin dueño.

Escribe la condición de salida de forma comprobable. Por ejemplo, el equipo puede acordar que la bandera se revisará cuando termine una prueba, se complete una migración o se confirme la adopción del comportamiento nuevo. Evita descripciones vagas como “quitar cuando se pueda”. Si el criterio depende de una decisión de producto, indica quién debe tomarla y qué información necesita.

Una ficha mínima puede incluir:

  • Nombre y ubicación de la bandera.
  • Tipo y motivo por el que se creó.
  • Responsable de la decisión y del cambio de código.
  • Usuarios, entornos o servicios potencialmente afectados.
  • Condición de retirada y fecha de revisión.

Si una bandera no tiene responsable, el primer paso no es borrarla a ciegas. Asigna a alguien que pueda comprobar el propósito y las dependencias, o escala la decisión al equipo que mantiene esa parte del producto.

Comprueba quién depende de la bandera

Antes de consolidar una ruta, revisa todos los lugares donde la bandera se evalúa o se configura. Una búsqueda en el repositorio puede revelar referencias directas, pero no siempre muestra consumidores indirectos, reglas guardadas fuera del código o diferencias entre entornos. Contrasta el resultado con el sistema de configuración y los procedimientos del equipo.

Comprueba, de forma ordenada:

  1. Referencias en el código: localiza las condiciones, funciones auxiliares, pruebas y componentes que leen la bandera. Busca también nombres antiguos si se renombró.
  2. Configuración por entorno: verifica si los valores difieren entre desarrollo, pruebas y producción. No asumas que un estado observado en un entorno se aplica a los demás.
  3. Alcance de usuarios: confirma si la condición se aplica a toda la audiencia o a segmentos, cuentas o roles concretos. Una ruta aún activa para un grupo puede pasar inadvertida en pruebas generales.
  4. Dependencias externas: revisa documentación operativa, tareas automatizadas y otros componentes que lean o cambien el estado de la bandera.
  5. Uso observado: cuando haya telemetría disponible, consulta si la bandera se evalúa y en qué contexto. La ausencia de eventos solo es útil si la instrumentación cubre los flujos relevantes.

La telemetría aporta evidencia, pero no sustituye la revisión del diseño. Una ruta poco frecuente, un entorno sin tráfico o una métrica incompleta pueden dar una falsa impresión de que nadie depende de la bandera.

Elimina las ramas alternativas con un cambio controlado

Una vez acordado el comportamiento definitivo, simplifica la lógica para que la aplicación exprese directamente esa decisión. Si se mantiene la variante nueva, retira la rama antigua y la condición que ya no aporta valor. Si se elige la anterior, elimina la alternativa que se descarta. Evita reemplazar una bandera antigua por otra sin una necesidad operativa clara: eso desplaza la deuda, no la resuelve.

Haz el cambio en partes comprensibles. Elimina primero referencias de código y pruebas que solo existían para la opción descartada; después, retira la definición y los valores de configuración. Si la bandera afecta varios servicios o repositorios, coordina el orden para que una actualización no deje componentes esperando una opción que ya no existe. Cuando no puedas hacerlo en un único cambio, documenta las dependencias pendientes y quién cerrará cada una.

Las pruebas deben cubrir el comportamiento que permanece, no solo demostrar que la bandera desapareció. Ejecuta las pruebas relevantes para las rutas modificadas y añade o ajusta casos para los límites que dependían de la condición: permisos, errores, estados vacíos o diferencias por entorno, cuando correspondan al sistema. Revisa el cambio para detectar condiciones redundantes, código inalcanzable y supuestos que hayan quedado sin probar.

Valida el cierre con señales y documentación

Antes de dar la tarea por terminada, comprueba que el código compilado o ejecutado ya no consulta la bandera y que su configuración se ha retirado de los entornos pertinentes. Revisa también que los paneles, alertas, instrucciones de soporte y documentación no sigan indicando que alguien puede cambiarla. Si el cambio modifica un flujo visible, valida el resultado con los criterios habituales del producto y observa las señales disponibles después de su entrega.

Define de antemano qué observarás y durante cuánto tiempo según el riesgo del cambio. Puede ser suficiente comprobar errores, finalización de tareas o incidencias asociadas al flujo; no inventes un umbral si el equipo no dispone de una línea base. Si aparece una regresión, identifica si se debe a la decisión funcional, a una dependencia no detectada o a la eliminación de una protección operativa.

Cuando el riesgo justifique conservar una vía de recuperación, decide explícitamente cuál será. Mantener durante un periodo acotado una opción de reversión documentada puede ser razonable; dejar la bandera indefinidamente sin dueño ni criterio de uso no lo es. Anota la decisión y programa una nueva revisión si la retirada queda aplazada.

Cuándo mantenerla y lista de comprobación

Cuándo mantenerla y lista de comprobación

Conviene mantener una bandera si sigue controlando una configuración necesaria, una prueba aún abierta o una capacidad de respuesta que no tenga sustituto. En cambio, son señales de retirada que la decisión de producto ya esté tomada, la alternativa no se use ni se necesite y no haya un equipo o proceso que dependa de ella. Que una bandera esté siempre activada es un indicio, no una prueba: primero verifica que ese estado representa todos los usuarios y entornos pertinentes.

Incorpora la limpieza a la revisión habitual del equipo. En cada revisión de producto o mantenimiento, busca banderas vencidas, sin responsable, sin condición de salida o vinculadas a experimentos finalizados. Prioriza las que añaden ramificaciones a rutas frecuentes o dificultan cambios próximos. Una lista breve evita convertir la limpieza en una iniciativa separada que siempre se pospone.

  • ¿Está claro el propósito y el tipo de bandera?
  • ¿Hay responsable y condición de retirada documentados?
  • ¿Se han revisado código, configuración, entornos y consumidores?
  • ¿Se decidió qué comportamiento queda y se eliminaron las ramas descartadas?
  • ¿Las pruebas cubren los flujos afectados y se revisarán señales posteriores?
  • ¿Se actualizaron documentación y procedimientos, y se retiró la configuración obsoleta?

Una retirada bien hecha deja menos caminos posibles y una decisión más visible en el código. Si alguna respuesta de la lista sigue abierta, convierte esa incertidumbre en una tarea concreta, con responsable y fecha de revisión. Así, las feature flags temporales cumplen su función sin transformarse en ramas ocultas permanentes.

Fuentes y referencias

  1. MDN Web DocsMozilla
  2. Web performanceweb.dev
  3. OWASP Cheat Sheet SeriesOWASP Foundation