Feature flags: cómo lanzar funcionalidades sin riesgo
- feature flags
- despliegue
- software
- desarrollo
- riesgo
Lanzar una nueva funcionalidad a producción siempre conlleva un riesgo. Da igual cuánto testing hayas hecho, el momento del deploy es donde la teoría se encuentra con la realidad de los usuarios y el entorno productivo. La manera más efectiva de mitigar este miedo y permitir despliegues continuos sin paralizar el equipo es mediante el uso de feature flags.
Los feature flags —también conocidos como toggles de funcionalidad o banderas de características— son una técnica que permite activar o desactivar partes específicas del código en tiempo de ejecución. Esto significa que puedes desplegar código nuevo a producción, mantenerlo inactivo y activarlo solo cuando estés listo, o incluso para un subconjunto de usuarios.
Qué son las feature flags y por qué las necesitas
Un feature flag es, en esencia, una variable de configuración booleana que envuelve una sección de código. Si la bandera está activa, el código se ejecuta; si está inactiva, no. Esto te da un control granular sobre qué funcionalidades están visibles o activas para tus usuarios.
La principal ventaja de esta estrategia es que desacopla el deploy del lanzamiento de una funcionalidad. Puedes desplegar código incompleto o experimental sin que afecte a los usuarios. Cuando la funcionalidad está lista, simplemente activas el flag y se vuelve accesible, sin necesidad de un nuevo despliegue.
Implementación básica de un feature flag
La forma más sencilla de implementar un feature flag es una declaración condicional en tu código. En un entorno de producción, la decisión de si un flag está activo se consulta a un servicio centralizado, una base de datos o un archivo de configuración.
Aquí tienes un ejemplo básico de cómo podría verse:
// featureFlagsService.js
const getFeatureFlagStatus = (flagName) => {
// En un entorno real, esta función consultaría un servicio
// de gestión de feature flags (LaunchDarkly, ConfigCat, o uno propio).
// Para este ejemplo, simulamos la lógica.
const flags = {
'nuevaCaracteristicaABC': true, // true para activa, false para inactiva
'betaDashboard': false,
'emailNovedades': true
};
return flags[flagName] || false; // Por defecto, si no existe, está inactiva
};
// En tu aplicación (por ejemplo, un componente de interfaz de usuario)
const mostrarBotonNuevaFuncionalidad = () => {
if (getFeatureFlagStatus('nuevaCaracteristicaABC')) {
console.log("Mostrando el botón de la nueva característica ABC.");
// renderizar_boton_nueva_funcionalidad();
} else {
console.log("El botón de la nueva característica ABC está oculto.");
// renderizar_boton_antigua_funcionalidad();
}
};
mostrarBotonNuevaFuncionalidad();
Este código permite que el binario con la nueva funcionalidad ya esté en los servidores, pero solo se muestre si el flag nuevaCaracteristicaABC está activo. Los feature flags desacoplan el deploy del lanzamiento, permitiendo que el código nuevo esté en producción pero inactivo. Esto reduce drásticamente el riesgo y te da la capacidad de hacer deploys sin miedo a un rollback cuando algo falla.
El tradeoff honesto de trabajar con feature flags
Como toda herramienta, las feature flags tienen ventajas y complejidades asociadas. Entender ambas caras es clave para usarlas bien.
Lo que ganas:
- Reducción de riesgo: Puedes activar o desactivar funcionalidades al instante si detectas un problema, sin necesidad de un nuevo despliegue. Esto actúa como un “kill switch” de emergencia.
- Despliegues continuos: El equipo de desarrollo puede desplegar código a producción con mucha más frecuencia, ya que las nuevas funcionalidades están ocultas por defecto.
- Experimentación: Facilitan el A/B testing y los lanzamientos graduales a un porcentaje de usuarios, lo que permite validar ideas con datos reales antes de un lanzamiento completo.
- Separación de responsabilidades: El equipo de marketing o producto puede decidir cuándo lanzar una funcionalidad, independientemente del ciclo de despliegue técnico.
Lo que complicas:
- Complejidad del código: El código se vuelve más complejo al incluir condicionales por cada flag, creando múltiples caminos de ejecución.
- Gestión de flags: Necesitas un sistema para gestionar los estados de los flags, quién puede cambiarlos y cuándo. Si tienes muchos flags, esto puede volverse abrumador.
- Explosión de pruebas: Probar todas las combinaciones de flags activos e inactivos puede ser costoso y lento, especialmente en sistemas grandes.
- Deuda técnica: Los flags, una vez que la funcionalidad está completamente lanzada y estable, deben eliminarse del código para evitar que se acumule complejidad innecesaria.
Lo que no negocias:
- Limpieza de flags: Mi regla es que un flag tiene una vida útil. Una vez que la funcionalidad está probada y lanzada al 100% de los usuarios, el flag y el código condicional asociado deben eliminarse. La acumulación de flags es una deuda técnica peligrosa.
- Consistencia de estado: Asegúrate de que el estado de los flags sea consistente en todo tu sistema. Un usuario no debería ver una parte de la funcionalidad activa y otra inactiva.
- Seguridad: El acceso a la gestión de flags debe ser estricto. Un cambio accidental en producción puede tener un impacto significativo.
Gestionar los toggles de funcionalidad en producción
Para que los feature flags sean útiles, su gestión debe ser adecuada. Esto implica tener una interfaz clara para activarlos y desactivarlos, idealmente con control de versiones de los cambios y un log de auditoría. Cuando un cliente me llega con problemas de estabilidad en producción, a menudo les propongo implementar feature flags como una primera capa de seguridad. Esto complementa otras estrategias como el testing automatizado, añadiendo una capa de seguridad en tiempo real que puedes controlar al instante.
Puedes usar servicios dedicados como LaunchDarkly o ConfigCat, o construir una solución interna más simple. La elección depende del tamaño de tu equipo, la complejidad de tus lanzamientos y el nivel de control que necesites. Es necesario que los flags sean fáciles de manejar y que su estado sea visible para todos los equipos relevantes.
Si te preocupa la estabilidad de tus aplicaciones en entornos complejos, entender cómo manejar el estado de las aplicaciones es un paso lógico. Además, para asegurar que tus cambios se integran sin problemas, es útil revisar cómo documentar una API correctamente para que todos los sistemas involucrados entiendan las nuevas funcionalidades.
Técnico freelance especializado en desarrollo a medida, automatizaciones con IA y gestión técnica para negocios en España. Más sobre mí →
¿Necesitas desarrollo a medida?
Desarrollo funcionalidades específicas, integraciones entre sistemas y herramientas internas. Si se puede programar, probablemente puedo hacerlo.