Muchos desarrolladores afirman usar feature flags o feature toggles, pero este año nos hemos dado cuenta de que hay cierta confusión con este término. Así pues, hemos decidido crear este artículo sobre feature toggles / flags, teniendo en cuenta su popularidad al alza.

A medida que los equipos de desarrollo buscan mayor agilidad, las herramientas y técnicas para el desarrollo de software y la entrega contínua evolucionan año tras año. Las prácticas DevOps y CI/CD proveen un framework sólido que permite a los equipos lanzar software con mayor automatización y menores riesgos. Una de las mejoras maneras de lograr esto es incorporando feature flagging en las prácticas de desarrollo de software.

Propugnada por el influyente Martin Fowler, la entrega contínua (Continuous Delivery) es una disciplina de desarrollo de software mediante la cual el software se puede lanzar a producción en cualquier momento. Esta disciplina ha sido adoptada por empresas de software líderes de todo el mundo, y se espera que sus equipos sean capaces de entregar software estable y sin bugs de forma rápida a sus usuarios. El feature flagging potencia la entrega contínua y la integración contínua (Continuous Integration) facilitando esta “continuidad”. Las feature flags y feature toggles son un componente clave en la implementación de la entrega contínua, permitiendo separar el feature rollout del despliegue de código. Las funcionalidades inacabadas se pueden unir a la base de código de producción pero escondidas tras feature flags. Uniendo la entrega contínua con la gestión de las feature flags, un equipo puede lanzar, controlar y medir sus funcionalidades a escala.

Feature toggles o flags te permiten conmutar una funcionalidad de on a off en cualquier momento, incluso tras haber desplegado tu código. Te ayudan a tomar el control de tus entregas al enviar nuevas funcionalidades a segmentos específicos de tu audiencia y te ayudan a elegir el porcentaje exacto de usuarios que recibirán un experimento. Los feature toggles han ido derivando hacia la gestión del ciclo completo de una funcionalidad completa – gestionando el proceso de desarrollo a QA y a producción. También pueden suponer una forma de agregar analítica de rendimiento y testear el impacto de una funcionalidad en la arquitectura de tu sistema.

 

¿Que son las feature toggles?

Antes de seguir, vamos a aclarar exactamente qué son las feature toggles. Feature toggles, conocidas también como feature flags, son una técnica muy potente que permiten a los equipos de desarrollo modificar el comportamiento de un sistema sin cambiar el código. Esto permite a los desarrolladores tomar el control del lanzamiento de sus funcionalidades, dark launch y retirar funcionalidades que no rindan bien.

Esto llevó a un ascenso de librerías de feature toggles de código abierto creadas para lenguajes específicos, como Java o PHP. Se usa feature toggle para esconder, habilitar o deshabilitar una funcionalidad durante su ejecución. Por ejemplo, durante el proceso de desarrollo, un desarrollador puede habilitar una funcionalidad para testear y deshabilitarla para los demás usuarios.

Las feature toggles son principalmente variables que se usan dentro de declaraciones condicionales. Por lo tanto, los bloques que encontramos dentro de estas declaraciones condicionales se pueden activar o desactivar según el valor de las feature toggles. Un bloque de código en ‘off’ es similar a si estuviera comentado. Esto permite a los desarrolladores controlar el flujo del software y evitar las funcionalidades que no están listas para el lanzamiento. Sin embargo, uno de los usos más comunes de las feature flags es evitar el conflicto que puede nacer de mezclar cambios en un software justo antes de lanzarlo.

Las feature toggles se pueden utilizar en los siguientes escenarios:

  • Añadir una nueva funcionalidad a una aplicación
  • Mejorar una funcionalidad ya existente
  • Esconder o deshabilitar una funcionalidad
  • Extender una interfaz

Es importante mencionar que las feature toggles requieren un proceso de ingeniería robusto, un diseño técnico sólido y una gestión madura de la conmutación del ciclo de vida. Sin estas 3 consideraciones, el uso de las feature toggles puede ser contraproducente.

Las feature toggles funcionan bien con la práctica de CI/CD y con técnicas como el A/B testing o canary releases.

 

Feature toggles más populares

 

Hay varios tipos de feature toggles, siendo estos algunos de los más populares:


Release toggle

A veces hay integrantes de un equipo trabajando en una funcionalidad que puede necesitar varios sprints para completarse. Una release toggle permite a los desarrolladores poner en cuarentena la funcionalidad inacabada del resto del código y poder activar y desactivarla en entorno local para testearla.

 

Ops toggle
Hay varias razones por las que un equipo pueda querer usar un toggle operacional (ops toggle) para activar o desactivar una funcionalidad en un entorno de producción. Un uso de la ops toggle es en funcionalidades que pueden tener un impacto desconocido en el rendimiento de tu entorno de producción. Si esta nueva funcionalidad empeora el rendimiento del sistema, podrás desactivarla rápidamente para evitar fallos del sistema más graves.

 

Experiment toggle
Este tipo de toggle es más común en el sector comercial. Cuando estás experimentando con un nuevo tipo de workflow, como puede ser un componente nuevo de interfaz de usuario o una nueva manera de reportar información, y quieres el feedback de tus usuarios de producción o bien analizar su comportamiento usando la funcionalidad. La experiment toggle te permite ejecutar un A/B testing que enviará a tus usuarios en caminos distintos para que decidas cual es la mejor funcionalidad para tus usuarios, A o B.

 

Permissioning toggles
Permiten cambiar las funcionalidades o experiencias de producto que ciertos usuarios reciben. Por ejemplo, puedes tener un grupo de funcionalidades “premium” que solo activarás para los clientes que paguen.

 

Principales beneficios de las feature toggles o feature flags


1.Invisibilidad

Uno de los beneficios más evidentes de las feature toggles es que te permiten lanzar nuevas funcionalidades que están aún en desarrollo. Ya que cada nueva funcionalidad está detrás de un conmutador (toggle), no se hará visible hasta que no decidas activarla. Si tienes un método para actualizar tus toggles en producción, se pueden separar los calendarios de desarrollo de los despliegue. El riesgo implícito en una entrega a altas horas de la noche se substituye con un simple click de un botón que se puede hacer en cualquier momento.

 

2. Velocidad
Las feature toggles son especialmente útiles de cara a acelerar el proceso de desarrollo al combinarlas con CI/CD. Más que trabajar en ramas largas que se vuelven difíciles de unir, se puede trabajar en pull requests pequeños que se fusionan frecuentemente con la rama de código principal. Esto hace que los desarrolladores sean más productivos, ya que se lidia con este tipo de conflictos cuando aún están “frescos”. Los bugs también se tratan de forma más eficiente: si alguien encuentra un error o bug con una funcionalidad tras una feature toggle, puedes conmutarla inmediatamente a off. Esto no solo previene la interrupción y el riesgo de retirada de cambios, permite que los nuevos cambios se vayan lanzando a producción para que tu pipeline se mantenga rápida y productiva.

 

3. A/B Testing
Las feature toggles son una buena manera de facilitar la experimentación, testear ideas y comprobar que es lo mejor para tus usuarios.

 

4. Flexibilidad
Las ideas para mejorar un producto también pueden venir de parte del equipo de ingeniería. Las feature toggles facilitan el testear las suposiciones, y así, a medida que la gente empieza a ver cómo sus ideas cobran vida, se sienten más involucrados en el producto y el proceso.
Las feature toggles ayudan a empujar la cultura de equipo hacia la aceptación de los cambios. Eso provoca que haya menos presión en intentar que todo salga perfecto a la primera.

 

5. Seguridad
Testea funcionalidades en producción de forma segura mientras recolectas feedback de los usuarios. Muchas apps populares usan el feature flagging para ver cómo responden los usuarios a las nuevas funcionalidades. A medida que reciben feedback positivo, se incrementa el número de personas que recibirán esta nueva versión sin precisar de una actualización de la app.

 

6. Reducción del riesgo
Tienes la habilidad de revertir tu producto o funcionalidad de forma inmediata si detectas un bug o recibes feedback negativo que podría dañar tu reputación.

 

7. Actualiza las funcionalidades que ya están en vivo
Haz cambios a features ya publicadas sin tener que re-desplegar o requerir actualizaciones de la app.

 

Feature Flag driven development

Un nuevo término se ha puesto de moda: feature flag driven development, que cómo su nombre indica, trata de aprovechar el potencial de TDD. Es el proceso de lanzar e iterar funcionalidades rápidamente, testear estas funcionalidades, y mejorarlas. Se lanzan funcionalidades ligeras al mercado para recibir feedback. Se itera a partir de ese feedback, creando mejoras, y se vuelve a desplegar. Feature flag driven development es la forma de recibir feedback iterativo de mercado para tu producto, en vez de depender exclusivamente del feedback aislado de algunos clientes. Es una forma de comprobar el rendimiento de tus funcionalidades en el mundo real y no solo en un entorno de pruebas artificial.

 

Gestión de las Feature flags

A pesar de sus numerosas ventajas, existen algunos riesgos en la gestión de las feature flags que pueden llevar a una deuda técnica. A continuación, los métodos principales para gestionar mejor tus feature flags:

 

  • Flag naming
    Una correcta convención de nombre para tus feature flags es el primer paso hacia una mejor gestión. La ausencia de la misma puede llevar a los miembros de un equipo a confundir las flags o peor, crear otras con el mismo nombre. Si no nombras tus flags con cuidado, alguien de tu equipo las puede disparar por error, lo que puede llevar, en casos extremos, a disrupciones importantes.
  • Logging
    De cara a trackear mejor los cambios, considera el loguear todos los cambios de una feature flag. Al hacerlo, podrás ver quién introdució un determinado cambio y a en qué momento. En equipos distribuidos, esto puede significar un ahorro importante de tiempo invertido en averiguar quién es responsable de un determinado cambio.
  • Separación de flags
    Las feature flags se pueden clasificar principalmente en dos tipos: release flags y business flags. Las release flags permiten a los equipos de desarrollo y operaciones esconder funcionalidades en desarrollo o arriesgadas de forma temporal, mientras que las business toggles se usan en funcionalidades estables pero que se deben esconder o mostrar solo a determinados públicos. Gestionar los dos tipos en archivos de configuración distintos puede ayudarte a reducir la complejidad y aligerar el soporte y debugging.

 

Conclusión

El feature flagging se está utilizando en la actualidad por grandes empresas como Flickr, Disqus, Etsy, reddit, Gmail, Netflix o Apiumhub. Y así como funcionan bien, también es cierto que es preferible que estas sean cortas y no muy numerosas. Un exceso de flags o con periodos de vida largos añaden complejidad y suponen una deuda técnica deliberada. Limpiar estas feature flags es una tarea indispensable para mantener una base de código sensata. El uso de las feature flags puede ayudar a las empresas a realizar envíos más frecuentemente, minimizar riesgos, incrementar la productividad e incluso ayuda a dirigirse a ciertos usuarios y funcionalidades A/B test. La evaluación de la estrategia de ramificación de una empresa mediante feature flags puede ser muy potente, especialmente si necesitas realizar envíos de forma frecuente.