Feature flags

Comment exposer progressivement vos fonctionnalités grâce à des feature flags.

Ian Buchanan Ian Buchanan

Résumé : le feature flagging (également connu sous le nom de feature toggling) est une technique d'ingénierie logicielle qui permet d'activer et de désactiver certaines fonctionnalités pendant l'exécution, sans déployer de nouveau code. Cela permet aux équipes d'apporter des changements sans pusher de code supplémentaire et assure une expérimentation plus contrôlée sur le cycle de vie des fonctionnalités.

Si vous planifiez d'intégrer continuellement des fonctionnalités à votre application lors du développement, vous pouvez envisager d'utiliser des feature flags. Après tout, il se peut que vous souhaitiez activer/désactiver des fonctionnalités et les masquer. Vous pourriez également vouloir dévoiler différentes variations de fonctionnalités aux utilisateurs afin de découvrir la plus adaptée. Les feature flags, également appelés « toggles », « bits », « flippers » ou « switches » vous permettent de faire cela et plus encore.

Qu'est-ce que les feature flags ?

Les feature flags (également connus sous le nom de feature toggles) sont une technique d'ingénierie logicielle qui permet d'activer et de désactiver certaines fonctionnalités pendant l'exécution, sans déployer de nouveau code. Les équipes peuvent ainsi apporter des changements sans avoir à pusher du code supplémentaire et expérimenter de façon plus contrôlée sur le cycle de vie des fonctionnalités. Pour cette raison, les feature flags ouvrent la voie à de nombreux workflows novateurs qui sont incroyablement utiles à un style de gestion Agile et aux environnements de CI/CD.

Pendant le développement, les ingénieurs logiciels encapsulent les chemins de code souhaités dans un feature flag. Voici un exemple de feature flag de base codé en JavaScript :

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

Ce code illustre un énoncé simple qui vérifie si la fonctionnalité « new-cool-feature » est activée. Même avec des frameworks et des outils avancés qui aident à gérer les données de flag ou l'ajout et la suppression du nouveau chemin logique, les feature flags sont essentiellement des instructions « if ». Par conséquent, cet outil binaire d'activation/de désactivation est similaire aux synonymes.

Lorsque ce code est prêt à être livré en production, il sera déployé comme d'habitude. Toutefois, il sera inactif en production jusqu'à ce que le feature flag soit explicitement activé. Les flags peuvent être assignés à un sous-ensemble d'utilisateurs, ce qui permet un comportement hautement ciblé.

Avantages des feature flags

Diagramme mettant en évidence le développement basé sur le feature flag

À un niveau fondamental, les feature flags permettent de commiter le code et de le déployer en production à l'état inactif, puis de l'activer ultérieurement. Les équipes ont ainsi plus de contrôle sur l'expérience utilisateur dans le produit final. Les équipes de développement peuvent choisir quand et à quels utilisateurs le nouveau code est livré.

Validation de la fonctionnalité
Les développeurs peuvent tirer parti des feature flags pour effectuer des « déploiements souples » des nouvelles fonctionnalités produit. De nouvelles fonctionnalités peuvent être développées grâce à l'intégration immédiate de feature flags dans le cadre de la livraison attendue. Le feature flag peut être défini comme « inactif » par défaut de sorte qu'une fois le code déployé, il reste inactif lors de la production et la nouvelle fonctionnalité sera désactivée jusqu'à ce que le feature flag soit explicitement activé. Les équipes choisissent ensuite quand activer le feature flag, ce qui active le code, et permet aux équipes de procéder au QA et de vérifier que le code fonctionne comme prévu. Si l'équipe identifie un problème au cours de ce processus, elle peut immédiatement désactiver le feature flag pour désactiver le nouveau code et minimiser l'exposition de l'utilisateur au problème.

Réduction des risques
En s'inspirant de l'idée des déploiements en douceur évoquée ci-dessus, les équipes assidues peuvent utiliser les feature flags ainsi que la surveillance et les métriques du système en réponse à tout problème intermittent observable. Par exemple, si une application connaît un pic de trafic et que le système de surveillance signale une hausse des tickets, l'équipe peut utiliser des feature flags pour désactiver les fonctionnalités peu performantes.

Modifie le comportement du système sans changements disruptifs
Les feature flags peuvent être utilisés pour limiter les scénarios compliqués d'intégration de code et de déploiement. De nouvelles fonctionnalités compliquées ou un refactoring sensible peuvent être difficiles à intégrer dans la branche de production principale d'un dépôt. C'est encore plus compliqué si plusieurs développeurs travaillent sur des parties de la base de code qui se chevauchent.

Des feature flags peuvent être utilisés pour isoler de nouveaux changements quand le code stable connu ne change pas. Les développeurs peuvent éviter les branches de fonctionnalités au long cours en effectuant fréquemment des commits dans la branche principale d'un dépôt derrière le flag de fonctionnalité. Lorsque le nouveau code est prêt, aucun scénario de merge et de déploiement collaboratif disruptif n'est à prévoir ; l'équipe peut basculer le feature flag pour activer le nouveau système.

Cas d'usage des feature flags

Les feature flags constituent un utilitaire innovant, qui offre aux équipes travailleuses une variété de cas d'usage créatifs. Les exemples suivants mettent en évidence certaines applications populaires des feature flags dans un environnement Agile.

Tests de produits
Les feature flags peuvent être utilisés pour livrer progressivement de nouvelles fonctionnalités de produit. Il peut être difficile de savoir d'emblée si une nouvelle fonctionnalité proposée sera adoptée par les utilisateurs et si le retour sur investissement en vaut la peine. Les équipes peuvent livrer une nouvelle fonctionnalité du produit ou une idée partielle de la fonctionnalité dans un feature flag et la déployer auprès d'un sous-ensemble d'utilisateurs pour recueillir des commentaires. Le sous-ensemble d'utilisateurs peut être constitué d'utilisateurs puissants qui sont ravis de faire des tests bêta et des révisions. Si l'idée du nouveau produit s'avère être un succès, l'équipe de développement peut alors déployer le feature flag à une plus grande base d'utilisateurs. Si, au contraire, l'idée s'avère être un échec, l'équipe de développement peut facilement désactiver le feature flag et le retirer ultérieurement de la base de code.

Mener des expériences
Les expériences ou tests A/B sont un exemple de feature flag principal. Dans leur forme la plus simple, les feature flags permettent d'activer et de désactiver l'état d'une fonctionnalité. Les feature flags avancés utilisent plusieurs flags à la fois pour activer différentes expériences pour des sous-ensembles d'utilisateurs. Par exemple, imaginez que vous divisez votre base d'utilisateurs en tiers. Chaque tiers reçoit son flag unique et son expérience utilisateur. Vous pouvez ensuite mesurer les performances de ces trois flags l'un par rapport à l'autre pour déterminer la version finale commitée.

Migrations
Il arrive qu'une application ait besoin d'une migration de données qui nécessite des changements du code d'application dépendant. Ces scénarios sont des tâches de déploiement sensibles et multi-phases. Un champ de base de données peut être modifié, supprimé ou ajouté dans une base de données d'application. Si le code d'application n'est pas préparé pour cette modification de base de données, des échecs et des erreurs surviennent. Si cela se produit, cela nécessite un déploiement coordonné entre les modifications de la base de données et le code d'application.

Les feature flags contribuent à atténuer la complexité de ce scénario en permettant aux équipes de préparer à l'avance les changements d'application dans un feature flag. Une fois que l'équipe a apporté les changements à la base de données, elle peut immédiatement basculer le feature flag pour qu'il corresponde au code d'application. Cela élimine les risques et les délais liés à l'attente du déploiement du nouveau code d'application et à l'échec éventuel du déploiement qui désynchronise l'application de la base de données.

Lancements de type « canary »
Dans ce contexte, le terme « canary » fait référence à une ancienne pratique morbide où les mineurs de charbon envoyaient des canaris dans la mine pour détecter le monoxyde de carbone. Les oiseaux ont un métabolisme plus élevé et une respiration rapide, ils succombaient au monoxyde de carbone avant les mineurs.

Les lancements « canary » dans le développement logiciels se produisent lorsqu'une nouvelle fonctionnalité ou un changement de code est déployé auprès d'un petit sous-ensemble d'utilisateurs afin de surveiller son comportement avant de le livrer à l'ensemble des utilisateurs. Si la nouvelle fonctionnalité présente des signes d'erreur ou d'échec, elle est automatiquement annulée. Les feature flags sont essentiels à ce processus, car le public est limité et les fonctionnalités peuvent facilement être désactivées.

Pannes système
Un feature flag peut également être utilisé comme outil de panne système. Une app web peut utiliser un feature flag pour « désactiver » l'ensemble du site web à des fins de maintenance ou de temps d'arrêt. Le feature flag peut être instrumenté dans l'ensemble de la base de code pour pusher les transactions sensibles et afficher le contenu des pannes aux utilisateurs finaux. Cela peut être très utile lors de déploiements sensibles ou si un problème inattendu est découvert et doit être résolu de toute urgence. Les équipes ont alors la confiance et la capacité nécessaires pour procéder à une panne contrôlée si nécessaire.

Déploiement continu
Les feature flags peuvent être utilisés en tant que composant à part entière pour développer un système de déploiement réellement continu. Dans le déploiement continu, un pipeline automatisé prend le nouveau code des développeurs et le déploie automatiquement en production auprès des utilisateurs finaux. Le déploiement continu dépend de couches de tests automatisés qui vérifient que le nouveau code se comporte comme prévu par rapport à une spécification correspondante au fur et à mesure qu'il avance dans le pipeline.

Les feature flags rendent le déploiement continu plus sûr en séparant les changements de code de la révélation des fonctionnalités aux utilisateurs. Le nouveau code peut être automatiquement être mergé et déployé en production, puis attendre derrière un feature flag. Le système de déploiement continu peut surveiller le comportement des utilisateurs ainsi que le trafic, puis automatiquement activer le feature flag. Inversement, le système de déploiement continu peut surveiller le nouveau code de feature flag pour vérifier s'il se comporte comme prévu, et le restaurer si besoin.

Branches de fonctionnalités et feature flags

Comment implémenter des feature flags

Il existe de nombreuses façons d'implémenter des feature flags et, selon les cas, les considérations logistiques et le retour sur investissement varient. La voie à suivre dépend des besoins de votre équipe et des objectifs organisationnels.

Pour que le feature flagging fonctionne correctement, il est nécessaire de prendre en compte ses dépendances d'infrastructure. Les équipes font petit à petit évoluer leur utilisation des feature flags. L'activation et la désactivation des flags deviennent une décision métier. Il est donc essentiel de disposer d'un stockage de données faisant autorité et d'un mécanisme de gestion des flags. De nombreux services de feature flags tiers fournissent cette dépendance de stockage de données.

Les services de feature flags hébergés par des tiers sont souvent la meilleure solution. Ils s'occupent de la logistique lourde et proposent des bibliothèques faciles à intégrer qui accélèrent le processus d'installation. Les équipes peuvent alors se concentrer sur les tâches métier fondamentales plutôt que sur la gestion de l'infrastructure. Toutefois, si votre équipe a des préoccupations concernant la sécurité des tiers, il peut être dans votre intérêt d'implémenter votre flag de sécurité back-end.

Séparément, les ingénieurs doivent mettre en place une nouvelle logique de code qui récupère l'état du flag dans le service pour activer le contenu marqué. Cela nécessite de merger le code marqué et de le déployer avant de l'activer. Étant donné que de nombreux feature flags sont temporaires, n'oubliez pas de supprimer ceux qui ne sont plus nécessaires.

Conclusion…

Les feature flags sont un ajout puissant à un arsenal de développement Agile. Il existe de nombreuses façons créatives de les utiliser. Ils sont complémentaires au déploiement continu et au contrôle de version Git. Dans l'ensemble, les feature flags permettent aux équipes de mieux contrôler leur base de code, leur déploiement ainsi que l'expérience de l'utilisateur final.