Experimentación progresiva con marcas de funciones

A medida que los equipos de DevOps cambian a una metodología ágil que se centra en la entrega continua de funciones, la necesidad de controlar de qué forma quedan disponibles para los usuarios se vuelve cada vez más importante. Las marcas de funciones son una excelente solución para limitar el acceso de los usuarios a nuevas funciones, ya sea con fines de marketing o para pruebas en producción.

Desacoplamiento de la implementación y exposición

Con las marcas de funciones, un equipo puede determinar si un conjunto determinado de funciones sea visible en la experiencia del usuario o se invoca dentro de la funcionalidad. Las nuevas funciones se pueden compilar e implementar como parte del proceso de desarrollo normal sin que a esas funciones se les dé un acceso generalizado. La implementación de funciones se desacopla debidamente de su exposición.

Las marcas dan control a un usuario en concreto en el tiempo de ejecución

Las marcas también dan a un usuario en concreto un control granular y completo. Cuando es el momento de habilitar una función, ya sea para un usuario, un grupo pequeño o todo el mundo, el equipo cambia la marca de función para activarla sin tener que volver a implementarla.

El tipo de uso de una marca de función variará según la naturaleza de la función y del público. En algunos casos, una marca de función habilitará automáticamente la funcionalidad para todos los usuarios. En otros casos, se habilitará una función por usuario. Los equipos también pueden usar marcas de funciones para que los usuarios puedan habilitar una función, si así lo desean. Realmente no hay ningún límite en la forma en que se implementan las marcas de funciones.

Incluir comentarios y experimentación en una fase temprana

Las marcas de funciones son una excelente manera de incorporar el proceso de experimentación en fase temprana. Algunas funciones pueden presentar ciertas aristas al principio, lo que puede ser interesante solo para usuarios en la primera fase. Si se intenta habilitar estas funciones sin preparar a un público más amplio, esto podría generar insatisfacción. La ventaja de reunir comentarios de usuarios dispuestos a trabajar con una función en desarrollo es incalculable.

Desactivación rápida

A veces resulta útil poder desactivar algo. Por ejemplo, supongamos que hay una nueva función que no responde según lo previsto y hay efectos secundarios que causan problemas en otro lugar. Puede usar marcas de funciones para desactivar rápidamente la nueva funcionalidad y así revertir la acción de confianza sin tener que volver a implementar. Aunque las marcas de funciones suelen tener considerar funciones de interfaz de usuario, también se pueden usar fácilmente para cambios en la arquitectura o la infraestructura.

Fases estándar

Microsoft hace uso de un proceso de implementación estándar para activar las marcas de funciones. Hay dos conceptos independientes: anillos, que son para las implementaciones y fases, que son para las marcas de funciones. Obtenga más información sobre los anillos y las fases.

Las fases tienen que ver con la difusión o la exposición. Por ejemplo, la primera fase podría ser para la cuenta de un equipo y las cuentas personales de los miembros. La mayoría de usuarios no verían nada nuevo porque las únicas marcas de posición activadas son de esta primera fase. Esto permite que un equipo las aproveche en su totalidad y experimente con ellas. Una vez que el equipo cierra la sesión, los clientes seleccionados podrán participar a través de la segunda fase de las marcas de funciones.

Participar

Se recomienda permitir a los usuarios participar en las marcas de funciones si es factible. Por ejemplo, el equipo puede exponer un panel de vista previa asociado a las preferencias o la configuración del usuario.

Screenshot of opt-in preview pane.

Usar marcas con telemetría

Las marcas de funciones brindan una forma de exponer actualizaciones de forma gradual. Sin embargo, los equipos deben supervisar continuamente las métricas adecuadas para evaluar la fase de preparación para una exposición más amplia. Estas métricas deben incluir la actividad de uso, así como el impacto de las actualizaciones en el estado del sistema. Es importante evitar la trampa de asumir que todo está bien solo porque no parece que esté pasando nada malo.

Ejemplo de marca de función

Veamos el siguiente ejemplo. El equipo ha añadido aquí un par de botones para Cherry-pick (Selección exclusiva) y Revert (Volver) en la interfaz de usuario de solicitud de incorporación de cambios. Esto se implementaron mediante marcas de funciones.

Screenshot of pull request UI example.

Definir marcas de funciones

La primera función expuesta era el botón Revert (Volver). La solución usa un archivo XML para definir todas las marcas de funciones. En este caso, hay un archivo por servicio, que crea un incentivo para quitar marcas antiguas y evitar que la sección sea demasiado larga. El equipo eliminará las marcas antiguas por la motivación natural por controlar el tamaño de ese archivo.

<?xml version="1.0" encoding="utf-8"?>
<!--
  In this group we should register Azure DevOps specific features and sets their states.
-->
<ServicingStepGroup name="AzureDevOpsFeatureAvailability" … >
  <Steps>
    <!-- Feature Availability -->
    <ServicingStep name="Register features" stepPerformer="FeatureAvailability" … >
      <StepData>
        <!--specifying owner to allow implicit removal of features -->
        <Features owner="AzureDevOps">
           <!-- Begin TFVC/Git -->
           <Feature name="SourceControl.Revert" description="Source control revert features" />

Una estructura de servidor común fomenta la reutilización y las economías de escala en todo el equipo. En teoría, el proyecto tendrá la infraestructura necesaria para que un desarrollador pueda definir una marca en un almacén central y tener el resto de la infraestructura controlada para ellos.

Comprobar marcas de funciones en tiempo de ejecución

La marca de función que se usa aquí se denomina SourceControl.Revert. Este es el TypeScript real de la página que refleja la llamada a una comprobación de disponibilidad de funciones.

private addRevertButton(): void {
 if (FeatureAvailability.isFeatureEnabled(Flags.SourceControlRevert)) {
     this._calloutButtons.unshift(
         <button onClick={ () => Dialogs.revertPullRequest(
             this.props.repositoryContext,
             this.props.pullRequest.pullRequestContract(),
             this.props.pullRequest.branchStatusContract().sourceBranchStatus,
             this.props.pullRequest.branchStatusContract().targetBranchStatus)
         }
         >
             {VCResources.PullRequest_Revert_Button}
         </button>
        );
     }
}

En el ejemplo anterior se representa el uso en TypeScript, pero se puede acceder igual de fácil mediante C#. El código comprueba si la función está habilitada y, si es así, representa un botón para mostrar la funcionalidad. Si la marca no está habilitada, se omitirá el botón.

Controlar una marca de función

Una buena plataforma de marcas de funciones facilitará varias maneras de administrar si se establece una marca determinada. Normalmente, hay casos en los que la marca se controla a través de PowerShell y la interfaz web. En PowerShell, todo lo que debe exponerse son formas de obtener y establecer el estado de una marca de función, junto con parámetros opcionales para elementos, como identificadores de cuenta de usuario específicos, si procede.

Controlar marcas de funciones a través de la interfaz de usuario web

En el ejemplo siguiente se usa la interfaz de usuario web de este producto expuesta por el equipo. Tenga en cuenta la marca de función de SourceControl.Revert. Hay dos cuentas personales que aparecen aquí: hallux y buckh-westeur. El estado cambia a hallux, que se ejecuta en Centro-norte y se borra en la otra cuenta en Oeste de Europa.

Screenshot of controlling feature flags through web UI.

La naturaleza de la marca de función determinará la forma en que se exponen las funciones. En algunos casos, la exposición seguirá un modelo de anillo y fase. En otros, los usuarios pueden optar por la interfaz de usuario de configuración o incluso enviando un correo electrónico al equipo para obtener acceso.

Observaciones sobre las marcas de funciones

La mayoría de las marcas de funciones se pueden retirar una vez que se ha implementado una función para todos los usuarios. En ese momento, el equipo puede eliminar todas las referencias a la marca en el código y la configuración. Se recomienda incluir una revisión de marcas de funciones, como al principio de cada sprint.

Al mismo tiempo, puede haber un conjunto de marcas de funciones que se conserven por diversos motivos. Por ejemplo, es posible que el equipo quiera mantener una marca de función que se ramifique para algo infraestructural durante un período de tiempo después de que el servicio de producción haya cambiado completamente. Sin embargo, tenga en cuenta que esta posible ruta de código podría reactivarse en el futuro durante una desactivación expresa de la marca de función, por lo que debe probarse y mantenerse hasta que se quite la opción.

Marcas de funciones y estrategia de bifurcación

Las marcas de funciones permiten a los equipos de desarrollo incluir funciones incompletas en main sin afectar a nadie más. Siempre que la ruta de código esté aislada detrás de una marca de función, generalmente no hay problema en compilar y publicar ese código sin que se produzcan efectos secundarios que afecten al uso normal. Pero si hay casos en los que una función requiere dependencias, como al exponer un punto de conexión REST, los equipos deben tener en cuenta cómo esas dependencias pueden crear tareas de seguridad o mantenimiento aunque no se exponga la función.

Marcas de funciones para mitigar el riesgo

A veces, las nuevas funciones son el origen de que se introduzcan cambios destructivos o perjudiciales. Por ejemplo, en el producto se puede estar realizando una transformación que pasa de un esquema de base de datos amplio a otro largo. En este caso, el desarrollador debe crear una rama de funciones en un pequeño espacio de tiempo. A continuación, este debe realizar cambios desestabilizadores en la rama y dejar la función detrás de una marca. Lo que muchas veces se hace es que los equipos combinen los cambios en main siempre que no causen ningún daño. Esto no sería viable sin la opción de mantener oculta la función sin terminar detrás de una marca de función.

Las marcas de funciones ayudan a trabajar en main

Si sigue los procedimientos lógicos en la fase de desarrollo, trabajar en main es una buena manera de ajustar un ciclo de DevOps. Cuando esto se acompaña de marcas de funciones, los desarrolladores pueden combinar rápidamente funciones ascendentes e insertarlas a través de la batería de pruebas. El código de calidad puede publicarse rápidamente para realizar pruebas en producción. Después de unos pocos sprints, los desarrolladores reconocerán las ventajas de las marcas de funciones y las usarán de forma proactiva.

Cómo decidir si se debe usar una marca de función

Los equipos de funciones tienen el poder de decisión si necesitan una marca de función o no para un cambio determinado. No todos los cambios requieren una, por lo que será criterio del desarrollador cuando necesiten realizar un cambio determinado. En el caso de la función Revert (Volver) mencionada anteriormente, era importante usar una marca de función para controlar la exposición. Permitir a los equipos tomar decisiones importantes sobre el ámbito de funciones en el que trabajan forma parte de fomentar la autonomía en una organización de DevOps eficaz.

Diferencias entre compilación y compra

Aunque es posible crear su propia infraestructura de marcas de funciones, generalmente se recomienda usar una plataforma como LaunchDarkly o Split. Es preferible invertir tiempo en crear funciones en lugar de volver a generar la funcionalidad de la marca de función.

Pasos siguientes

Obtenga más información sobre cómo usar marcas de funciones en una aplicación ASP.NET Core.