Marcas de función

Cómo exponer de forma progresiva las funciones con marcas de función.

Ian Buchanan Ian Buchanan

Resumen: las marcas de función (también conocidas como “botones de función”) constituyen una técnica de ingeniería de software que activa y desactiva determinadas funciones durante el tiempo de ejecución, sin implementar código nuevo. Esto permite a los equipos realizar cambios sin introducir código adicional y facilita una experimentación más controlada durante el ciclo de vida de las funciones.

Si tienes pensado integrar funciones continuamente en tu aplicación durante el desarrollo, podrías plantearte usar las marcas de función. Seguramente quieras alternar funciones y ocultarlas, deshabilitarlas o habilitarlas. También puede que quieras revelar a los usuarios diferentes variaciones de funciones para descubrir cuál es mejor. Las marcas de función, también conocidos como “botones”, “bits”, “flippers” o “conmutadores”, permiten hacer esto y más.

¿Qué son las marcas de función?

Las marcas de función (también conocidos como “botones de función”) constituyen una técnica de ingeniería de software que activa y desactiva determinadas funciones durante el tiempo de ejecución, sin implementar código nuevo. Esto permite a los equipos realizar cambios sin introducir código adicional y facilita una experimentación más controlada durante el ciclo de vida de las funciones. Debido a esto, las marcas de función permiten muchos flujos de trabajo novedosos que resultan sumamente útiles para adoptar un estilo de gestión ágil y entornos de CI y CD.

Durante el desarrollo, los ingenieros de software hacen que las rutas de código seleccionadas dependan de una marca de función. El siguiente es un ejemplo de una marca de función básica escrita en Javascript:

  if(featureFlags[‘new-cool-feature’] == true){
renderNewCoolFeature();
}

Este código muestra una declaración simple que comprueba si se ha habilitado una “nueva función genial”. Incluso con marcos y herramientas avanzadas que ayudan a gestionar los datos de las marcas o la introducción y la eliminación de la nueva ruta lógica, las marcas de función son únicamente estructuras condicionales “if”. Por lo tanto, este cambio binario es lo que tienen en común todos los sinónimos.

Cuando este código esté listo y se pueda lanzar a producción, se implementará como de costumbre; sin embargo, permanecerá inactivo en producción hasta que se active de forma explícita la marca de función. Las marcas se pueden asignar a un grupo de subconjuntos de usuarios, lo que permite un comportamiento muy específico.

Ventajas de las marcas de función

Diagrama en el que se destaca el desarrollo basado en las marcas de función

En un nivel básico, las marcas de función permiten que el código se confirme y se implemente en producción en un estado inactivo y se active más tarde, lo que proporciona a los equipos un mayor control sobre la experiencia del usuario del producto final. Los equipos de desarrollo pueden elegir cuándo y a qué usuarios se lanza el código nuevo.

Validación de la funcionalidad de las funciones
Los desarrolladores pueden aprovechar las marcas de función para realizar “implementaciones paulatinas” de funciones nuevas del producto. Las funciones nuevas se pueden desarrollar con la integración inmediata de los botones de funciones como parte de la publicación esperada. La maca de la función se puede desactivar de forma predeterminada para que, una vez implementado el código, permanezca inactivo durante la producción y la función nueva se desactive hasta que se active de manera explícita el botón de esta. A continuación, los equipos eligen cuándo activar la marca de la función, que activará el código y les permitirá realizar el control de calidad y verificar que se comporta como se espera. Si el equipo descubre una incidencia durante este proceso, puede desactivar de inmediato la marca de función para deshabilitar el código nuevo y minimizar la exposición del usuario a la incidencia.

Disminución de riesgos
Basándose en la idea de las implementaciones paulatinas que se han comentado con anterioridad, los equipos diligentes pueden aprovechar las marcas de función junto con la supervisión y las métricas del sistema como respuesta a cualquier incidencia intermitente observable. Por ejemplo, si una aplicación experimenta un pico en el tráfico y el sistema de supervisión informa de un aumento de las incidencias, el equipo puede utilizar las marcas de función para deshabilitar las funciones que presenten un rendimiento bajo.

Modificación del comportamiento del sistema sin que se produzcan cambios perjudiciales
Las marcas de función se pueden utilizar para ayudar a minimizar los casos complicados de integración e implementación de código. Las nuevas funciones complicadas o la tarea de refactorización delicada pueden resultar difíciles de integrar en la rama principal de producción de un repositorio. Esto se dificulta aún más si varios desarrolladores trabajan en partes del código base que se solapan.

Las marcas de función se pueden utilizar para aislar los cambios nuevos mientras el código conocido y estable sigue aplicado. Esto ayuda a los desarrolladores a evitar las ramas de función de larga duración, ya que pueden confirmar con frecuencia en la rama principal de un repositorio manteniendo los cambios inactivos con el conmutador de la función. Cuando el código nuevo está listo, no hace falta fusionar e implementar de forma disruptiva y colaborativa; el equipo puede conmutar la marca de función para habilitar el nuevo sistema.

Casos de uso de las marcas de función

La novedosa utilidad de las marcas de función permite una variedad de casos de uso creativo para los equipos diligentes. En los siguientes ejemplos, se destacan algunas aplicaciones populares de las marcas de función en un entorno de metodología ágil.

Pruebas de productos
Las marcas de función se pueden utilizar para publicar de forma gradual nuevas funciones del producto. Puede que no quede claro de antemano si los usuarios adoptarán una nueva función propuesta y si resulta rentable. Los equipos pueden publicar una función nueva del producto o una idea parcial de esta en una marca de función e implementarla a un subconjunto de usuarios para recopilar opiniones. Dicho subconjunto de usuarios puede ser el de los mejores usuarios, es decir, aquellos que están dispuestos a realizar pruebas de versiones beta y dejar reseñas. Si la nueva idea del producto resulta ser un éxito, el equipo de desarrollo podrá implementar la marca de función a una base de usuarios más amplia. Si, por el contrario, dicha idea resulta ser un fracaso, el equipo de desarrollo podrá deshabilitar con facilidad la marca de función y, a continuación, eliminarla del código base.

Experimentos
Los experimentos o las pruebas A/B son un ejemplo de marcas de función primarias. Explicado de la forma más simple, las marcas de función actúan como un botón que activa o desactiva una función. Las marcas de función avanzadas utilizan varias marcas a la vez para activar diferentes experiencias para subconjuntos de usuarios. Por ejemplo, imagínate que divides tu base de usuarios en tercios. Cada tercio recibe su propia marca y experiencia de usuario. A continuación, puedes medir el rendimiento de estas tres marcas entre sí para determinar la versión final confirmada.

Migraciones
Hay ocasiones en las que una aplicación necesita una migración de datos que requiere cambios en el código de la aplicación dependiente. Estos casos son tareas delicadas de implementación en varias fases. Un campo de base de datos se puede modificar, eliminar o añadir en una base de datos de aplicación. Si el código de la aplicación no está preparado para este cambio de base de datos, se producen fallos y errores. Si esto ocurre, se requiere una implementación coordinada entre los cambios de la base de datos y el código de la aplicación.

Las marcas de función ayudan a aliviar la complejidad de este caso permitiendo a los equipos preparar de antemano los cambios de aplicación en una marca de función. Una vez que el equipo realiza los cambios en la base de datos, puede cambiar de inmediato la marca de función para que coincida con el código de la aplicación, lo que elimina el riesgo y el retraso de esperar a implementar el nuevo código de la aplicación y que posiblemente la implementación falle y desincronice la aplicación de la base de datos.

Publicaciones "canarias"
El término “canario” en este contexto hace referencia a una antigua práctica en la que los mineros del carbón llevaban pájaros canarios a la mina de carbón para detectar el monóxido de carbono. Las aves tienen un metabolismo más alto y una respiración más rápida, lo que las llevaba a sucumbir ante el monóxido de carbono antes que los mineros.

Las publicaciones "canarias" en el desarrollo de software se producen cuando una función nueva o un cambio de código se implementa a un pequeño subconjunto de usuarios para supervisar su comportamiento antes de la publicación para todo el conjunto de usuarios. Si la función nueva muestra algún indicio de error o fallo, se revierte automáticamente. Las marcas de función son fundamentales para este proceso, ya que restringen el público y las funciones se pueden desactivar con facilidad.

Interrupción del sistema
Una marca de función también se puede utilizar como herramienta para interrumpir el sistema. Una aplicación web puede utilizar una marca de función para “apagar” todo el sitio web con el fin de realizar el mantenimiento o activar un tiempo de inactividad. La marca de función se puede instrumentar a través del código base para enviar las transacciones delicadas y mostrar el contenido de la interrupción a los usuarios finales. Esto puede resultar increíblemente útil cuando se realizan implementaciones delicadas o si se encuentra una incidencia inesperada que se debe resolver con urgencia. Da a los equipos la seguridad y la capacidad de realizar una interrupción controlada si se considera necesario.

Implementación continua
Las marcas de función se pueden utilizar como un componente integral para desarrollar un verdadero sistema de implementación continua. La implementación continua es una canalización automatizada que toma el código nuevo de los desarrolladores y lo implementa automáticamente a los usuarios finales de producción. La implementación continua depende de capas de pruebas automatizadas que verifican que el código nuevo se comporta como se espera con respecto a una especificación que coincide a medida que se mueve a través de la canalización.

Las marcas de función consiguen que la implementación continua sea más segura al separar los cambios de código de la revelación de las funciones a los usuarios. El código nuevo se puede fusionar e implementar automáticamente en producción y, a continuación, esperar detrás de una marca de función. El sistema de implementación continua puede supervisar el comportamiento y el tráfico de los usuarios y, a continuación, activar automáticamente la marca de función. A la inversa, el sistema de implementación continua puede supervisar el código de la marca de función nueva para ver si se comporta como se espera, y revertirla si no es así.

Comparación entre ramas de función y marcas de función

Forma de implementar las marcas de función

Hay muchas formas de implementar las marcas de función teniendo en cuenta las diversas posibilidades logísticas y de retorno de la inversión. Elegir una u otra dependerá de las necesidades de tu equipo y de los objetivos de la organización.

Las marcas de función tienen algunas dependencias de infraestructura que se deben tratar para que funcionen correctamente. A medida que los equipos escalan el uso de las marcas de función y la activación o desactivación de estas se convierte en una decisión empresarial, resulta fundamental contar con un almacén de datos autorizado y un mecanismo de gestión para las marcas. Muchos servicios de marcas de función de terceros proporcionan esta dependencia del almacén de datos.

Los servicios de marcas de función alojadas por terceros suelen ser la mejor solución. Se encargan de la logística pesada y ofrecen bibliotecas fáciles de integrar que agilizan el proceso de instalación, lo que permite a los equipos centrarse en las tareas principales del negocio en lugar de en la gestión de la infraestructura. Sin embargo, si a tu equipo le preocupa el tema de la seguridad que ofrecen terceros, os convendría implementar vuestro propio backend de marca de seguridad.

Por otra parte, los ingenieros deben instrumentar una lógica de código nueva que recupere el estado de la marca del servicio para activar el contenido marcado, lo que requiere fusiones de código e implementaciones del código de las marcas antes de que se active. Dado que muchas marcas de función son temporales, no olvides eliminar las que ya no son necesarias.

En conclusión...

Las marca de función son una adición potente al arsenal del desarrollo ágil. Hay muchas formas creativas de utilizar las marcas de función. Dichas marcas son complementarias a la implementación continua y al control de versiones de Git. En general, las marcas de función dan a los equipos más control sobre el código base, la implementación y la experiencia del usuario final.

A continuación
Platform as a Service