Feature Flags: velocidad y reducción de riesgos

Juan Carlos Galvis
Bancolombia Tech
Published in
7 min readMay 4, 2020

“Feature Toggles (often also referred to as Feature Flags) are a powerful technique, allowing teams to modify system behavior without changing code.” Martin Fowler

La nube trajo consigo muchos beneficios y nuevas prácticas que a diario son más atractivas entre los líderes de los proyectos, quienes buscan evolucionar sus productos con una velocidad mayor para satisfacer las necesidades de los usuarios. Entre ellas encontramos:

  • La infraestructura es descrita como código y se puede escalar fácilmente.
  • La estrategia DevOps toma fuerza.
  • Las pruebas, el análisis de código y los despliegues son automáticos, siendo cada vez más rápidos.

Además, los desarrolladores buscamos crear o mejorar las funcionalidades de los productos que hacen parte de nuestros proyectos. Para ello, nos apoyamos en herramientas de versionamiento de código como git, donde podemos adoptar enfoques como git flow o trunk based development para versionar nuevas características y promoverlas hasta ambientes productivos.

Photo by Will H McMahan on Unsplash

Con esto, los despliegues a producción son cada vez más rápidos y generamos mayor valor dentro del marco de trabajo ágil; que está orientado a entregas en plazos cortos que son definidos de manera previa.

No obstante, el continuo paso a producción trae algunos riesgos, que se materializan en errores que generan malas experiencias en los usuarios. Por eso, para los equipos de tecnología, se hace necesario adoptar medidas como DevOps o DevSecOps que regulen el nivel de cobertura de las pruebas requerido y la cantidad de deuda técnica. En Bancolombia, a su vez, aprovechamos otra práctica nacida en la nube que nos permite velocidad y reducción de riesgos; los feature flags.

Feature Flags es una estrategia que tiene el objetivo de habilitar o deshabilitar características en producción sin necesidad de realizar nuevos despliegues.

Esta práctica nos permite realizar la liberación de características antes de los plazos de entrega que se definan y que podemos verlo como un valor que permite decidir entre ejecutar una lógica u otra.

Si pensamos esto como hace un tiempo lo realizábamos, podemos imaginarnos en un fragmento de código como este:

if (feature) {
return new NewImplementation();
} else {
return new OldImplementation();
}

Si el valor de la variable feature es tomado del entorno de ejecución de la aplicación o de un archivo de configuración, modificarla nos implicaría un nuevo despliegue. Además, la lógica para habilitar o deshabilitar características es muy limitada.

Cuando usamos feature flags, validar si una característica está habilitada o no, es realizado por un servicio externo que centraliza todos esos parámetros. Este servicio cuenta con capacidades similares a las de un motor de reglas, donde dependiendo de unos atributos de entrada puede dar un valor u otro para ese feature flag. (Generalmente usamos las características: habilitado o deshabilitado).

Ventajas de implementar Feature Flags

Un feature flag nos permite realizar despliegues de funcionalidades completas y, a su vez, asociar funciones que aún estamos desarrollando, pero poniéndolas en un estado deshabilitado, sin afectar la experiencia de los usuarios, quienes solo podrán interactuar con las soluciones habilitadas.

Por otro lado, permite a los líderes del proyecto realizar despliegues de funcionalidades a un grupo de usuarios limitado, con el fin de realizar experimentación sobre una nueva funcionalidad; en búsqueda de obtener retroalimentación y la posibilidad de hacer mejoras continuas en aspectos técnicos y de experiencia de usuario.

Cuando trabajamos en una estrategia de versionamiento de código Trunk Based Development, tiene una rama principal trunk y cada característica se trabaja sobre una rama feature, con la ideología de que las ramas feature deben tener una corta duración. Feature flags encaja perfectamente con esta estrategia. Cuando una rama feature sea integrada en la rama trunk, se desplegará a producción. En caso que no se desee publicar el cambio a los usuarios, se podrá usar un feature flag para deshabilitar esta nueva funcionalidad.

En desarrollos para dispositivos móviles es una práctica que genera mucho valor. Por ejemplo, realizar un despliegue en móviles implica:

Photo by Yura Fresh on Unsplash
  • Saber la versión instalada o el tipo de dispositivo.
  • El tiempo de espera para que las tiendas ejecuten su proceso de verificación y publicación.
  • El tiempo que toma a un usuario actualizar la aplicación o que incluso no lo hagan.

Con los feature flags, podemos habilitar y deshabilitar características con parámetros preestablecidos y segmentados, generando mayor velocidad en la entrega de soluciones a los usuarios.

Durante el tiempo que llevamos implementando la práctica en Bancolombia, obtuvimos los siguientes beneficios:

  • Entrega continua de nuevas características.​
  • Habilitar el despliegue continuo a producción incluso con características incompletas.
  • Facilitar la adopción de la estrategia Trunk Base Development.
  • Permitir la experimentación de características nuevas a un segmento de usuarios.​
  • Permitir el aislamiento de errores mientras se realiza una corrección.​

Herramientas de administración de Feature Flags

Una estrategia de feature flags promueve la liberación continua de características a producción, permitiendo tener un control y una reacción temprana frente a posibles errores.

La administración de habilitar, deshabilitar o limitar el segmento de usuarios que tienen disponible el uso de una característica, es un proceso estratégico que se vuelve recurrente a medida que se realizan más despliegues. La administración debe llevarse a cabo en cada ambiente, puesto que las reglas difieren entre estos; teniendo reglas y segmentos de usuarios que pueden ser diferentes.

En el mercado existen diversos Software as a Service (SaaS), que ofrecen estas capacidades de administración, así como diversos mecanismos de integración disponibles para diferentes lenguajes de programación. Existen también iniciativas open source como flagr, unleash que permiten instalar un servicio propio de administración de feature flags.

En Bancolombia usamos un Fork de Unleash el cual evolucionamos acorde a nuestras necesidades. Es allí donde de manera centralizada gestionamos el estado de los feature flags de nuestras aplicaciones.

Ciclo de vida de un feature flag

Un feature flag en un caso práctico, es un conjunto de reglas que dependiendo de los valores en su entrada dará como resultado un valor de salida, podemos resumirlo en el concepto de función.

Una regla se compone de un atributo, un operador y los valores con los cuales se aplica el operador al valor del atributo. En la siguiente imagen podrás ver un ejemplo.

Configuración de un feature flag

Un feature flag es creado en una plataforma de administración centralizada, en la cual configuramos las reglas asociadas a los atributos y las salidas esperadas. Luego, usando el identificador del feature flag pasamos a la implementación en la aplicación, utilizando la lógica esperada cuando se encuentre habilitado o deshabilitado.

Un concepto que surge en la administración de características es la reutilización de reglas, esto se consigue con la creación de segmentos. Estos son un conjunto de reglas que son usadas en uno o varios feature flags.

Por ejemplo, si tenemos un segmento llamado “preview” en el cual incluimos usuarios de prueba o con reglas basadas en atributos como edad, región o números de identificación; este segmento podrá ser utilizado desde un feature flag indicando una regla como: habilitado a usuarios que pertenecen al segmento “preview”.

Cuándo utilizar un feature flag

  • Requerimos realizar un despliegue pero existe una característica que aún no está completamente desarrollada o lo está, pero aún no se desea liberar. Creamos un feature flag el cual se asocia a la característica que se necesita deshabilitar. Este feature flag solo debería existir mientras se completa el desarrollo.
  • Requerimos realizar experimentación de una característica nueva, que aún no fue liberada a los usuarios finales. Creamos un feature flag con unas reglas de activación que incluyen un grupo de usuarios a los cuales sí les aparecerá habilitada la característica y podrán interactuar con ella. El resto de los usuarios no verán esta nueva característica. Este tipo de feature flags sólo deberá existir mientras estabilizamos la característica sobre la cual estamos experimentando.
  • Requerimos tener la capacidad de deshabilitar cierta funcionalidad en cualquier momento. Creamos un feature flag con el cual podamos habilitar o deshabilitar la característica. Este tipo de features debe ser correctamente identificado porque es inmantenible tener un feature flag por cada condición en una aplicación. Con estos podemos tomar acciones rápidas ante posibles errores y deshabilitar características. La duración de este feature flag está asociada a la existencia de la funcionalidad en la aplicación, sin embargo, si ese feature flag nunca más será deshabilitado o habilitado podríamos considerar eliminarlo.

Adoptar esta práctica trae ventajas competitivas para nuestros desarrollos, pues permiten tener un mayor control sobre las aplicaciones e incrementan la velocidad en que nuevas características llegan a los usuarios.

Referencias

Para profundizar en los conceptos y la práctica puede acudir a estos libros

--

--