Qu'est-ce qu'un «indicateur de fonctionnalité»?

115

La haute évolutivité mentionne les indicateurs de fonctionnalité ici:

5 éléments toxiques pour l'évolutivité , "5. Manque d'indicateurs de fonctionnalités"

Que sont exactement les indicateurs de fonctionnalité?

GurdeepS
la source
1
Comme le souligne Maxim Vexler, cet article sur Flickr est l'un des premiers articles canoniques sur les indicateurs de fonctionnalités, et explique en détail leur utilisation et leur mise en œuvre code.flickr.com/blog/2009/12/02/flipping-out
Noah Sussman

Réponses:

104

Un `` indicateur de fonctionnalité '' (ou fonctionnalité Toggle ) est la possibilité d'activer / désactiver facilement les fonctionnalités (sous-sections) de votre application:

  • peut-être via un redéploiement, ou
  • une page interne où les pages / fonctionnalités peuvent être activées en direct.

Je suppose que l'exemple là-bas était qu'il est pratique d'avoir le contrôle pour réduire quelque peu l'ensemble de fonctionnalités si vous devez, par exemple, réduire les requêtes de base de données si la charge est trop élevée.

Cependant, il existe de nombreuses autres raisons pour lesquelles vous voudriez l'utiliser - l'une des principales étant l'activation de la livraison continue : pousser les choses en production / en direct tout en désactivant / basculant la fonctionnalité jusqu'à ce qu'elle soit terminée. Nous utilisons souvent ce que nous appelons un «cookie de développement» pour montrer les fonctionnalités inachevées uniquement à l'équipe de développement. De cette façon, nous pouvons tester un travail partiellement achevé en production (oh oui! Y a-t-il une meilleure intégration?) Sur plusieurs versions / déploiements avant de le «dégager» (terminé) et qu'il devienne visible au public.

Voici un package simple qui vous aide à le faire dans ASP.NET MVC land: https://github.com/cottsak/DevCookie (divulgation complète: je suis l'auteur)

Fowler a également un article beaucoup plus long que celui lié ci-dessus avec beaucoup plus de détails .

Cet article (sur le site de Fowler également) explique les différents types de stratégies de bascule . DevCookie prend en charge la stratégie basée sur la ligne principale / le tronc et s'appelle un « basculement de version » dans l'article.

La réponse d'Adil souligne qu'il existe de nombreux termes et raisons pour lesquelles vous pourriez vouloir une partie de cette infrastructure. Gardez à l'esprit que vous n'aurez peut-être besoin que de certaines de ces choses. Par exemple, il se peut que je veuille uniquement activer un flux de travail de déploiement / livraison simple et agile et une infrastructure simple suffira donc. Si vous choisissez ensuite de passer à une expérimentation #leanstartup complète avec A / B, des tests de cohorte et des choses comme le déploiement contrôlé, vous devriez envisager un outil d'analyse (par exemple Heap ) qui facilite ces méthodologies de développement basées sur les données en tant que solution distincte . Une infrastructure à bascule qui fait tout ce qui précède entraînera des ballonnements et une complexité inutile.

Si vous êtes arrivé jusque-là, vous voudrez peut-être consulter certaines de mes autres réflexions sur le développement Mainline, le basculement des fonctionnalités et d'autres idées idiotes comme TEST, QA, SIT, STAND, CROUCH .

Matt Kocaj
la source
1
Curieusement, j'ai toujours imaginé la même chose dans tout ce que je construis. Cela peut être une fonctionnalité si efficace.
GurdeepS
7
Vous trouverez souvent des choses comme celle-ci qui semblent évidentes. Il s'avère que quelqu'un a toujours trouvé un nom pour cela.
Matt Kocaj
27

L'indicateur de fonctionnalité est une technique pour désactiver certaines fonctionnalités de votre application, via la configuration, sans déployer de nouveau code.

Les indicateurs de fonctionnalités jouent un rôle clé dans le schéma CI où les fonctionnalités sont constamment déployées mais pas nécessairement «publiées» en production.

Plus d'infos ici:

-- ÉDITER:

Implémentation java des indicateurs de fonctionnalités .

Maxim Veksler
la source
3
Ceci est bien décrit dans «Déploiement continu» et est à peu près une exigence pour le développement «principal». Plutôt que de créer des branches dans SCM pour les fonctionnalités, les fonctionnalités sont activées ou désactivées, ce qui vous permet de publier du code avec des fonctionnalités qui ne devraient pas encore être activées.
Chip McCormick
Juste une note sur "via la configuration, sans déployer un nouveau code": il semble que l'instruction signifie changer une configuration puis déployer à nouveau l'application (même si peut-être aucun code n'a changé). Cela peut prendre de quelques secondes à quelques minutes en fonction de votre pipeline de déploiement. Un indicateur de fonctionnalité ou une bascule de fonctionnalité ne peut pas être conservé dans la configuration. Il pourrait être dans un magasin / db quelque part et se comporter de manière "en direct" - c'est-à-dire en naviguant vers une page d'administration où vous appuyez sur un bouton pour activer instantanément un comportement à l'échelle du site (pas de déploiement, pas de changement de configuration).
Matt Kocaj
1
Je travaille pour ConfigCat.com et la façon dont je le vois "changer une configuration, sans déployer de nouveau code" signifie que les configurations sont servies par le service d'indicateur de fonctionnalités et que votre application accède aux valeurs en tirant ce fichier de configuration. De cette façon, vous pouvez être sûr que la modification d'une valeur ne nécessite aucun type de redéploiement de l'application. En plus de cela, il vous permet de créer des règles afin de servir une valeur à un utilisateur et une valeur différente à un autre. cool est que toute l'évaluation de l'indicateur de fonctionnalité est du côté client et toute cette logique fonctionne sans qu'il soit nécessaire de renvoyer des données au service d'indicateur de fonctionnalité.
sige
techblog.outbrain.com/tag/feature-flags - L'URL ne fonctionne pas
Sathish
19

Les indicateurs de fonctionnalités, les basculements de fonctionnalités, les expériences et les déploiements contrôlés sont des synonymes d'une idée simple mais puissante: séparer les déploiements de code des déploiements de fonctionnalités. En clair, c'est la possibilité de pousser les engagements de votre fonctionnalité vers la production tout en choisissant qui parmi vos clients - le cas échéant - peut voir cette fonctionnalité.

Ils ont été popularisés en partie par le Gatekeeper de Facebook . LiX de LinkedIn est un autre bon exemple.

Adopter cette idée simple jette les bases de nombreuses bonnes pratiques, notamment:

Déploiement / livraison continus - plusieurs codes poussés en production en une journée.

Développement Trunk / Mainline - les branches de fonctionnalités ne doivent être créées que pour les demandes d'extraction, pas pour le développement de fonctionnalités de longue durée.

No More Release Trains pour embourber les choses.

Test QA / Perf en production - les tests réels d'assurance qualité et de performance se font sur l'infrastructure de production avec le trafic de production. Ne perdez pas de temps à créer des laboratoires de performances étendus et des environnements de préparation.

Expérimentation - sachez comment une nouvelle fonctionnalité déplace l'aiguille sur vos KPI.

Éviter les correctifs ou les annulations de code en cas de problèmes - les correctifs et les annulations de code sont stressants, prennent beaucoup de temps et entraînent plus de problèmes que nécessaire. Au lieu de cela, désactivez la fonction ou diminuez-la.

D'autres ont mentionné les bibliothèques open source. Un bon exemple de solution complète - comme Gatekeeper et LiX - est Split . Je travaille pour Split.

Adil Aijaz
la source
Je pense qu'il est important de ne pas confondre les indicateurs de fonctionnalités uniquement pour prendre en charge les expériences AB / cohorte / lean de CI - les objectifs sont différents. Par exemple, utiliser une bascule de fonctionnalité pour obtenir quelque chose dans Prod pour QA / acceptation pourrait être un outil simple pour aider CI / CD et dans un tel cas, Split pourrait être excessif. Là encore, si vous voulez faire des expériences Lean ou des tests A / B, vous avez peut-être besoin d'un bon outil d'analyse comme Heap avec des outils supplémentaires et des rapports de télémétrie intégrés. Je n'aime pas l'idée de fusionner ces deux objectifs - il semble que vous pourrait gonfler très facilement.
Matt Kocaj
14

Il y a beaucoup de bonnes réponses ici, toutes conduisant à l'importante définition de base popularisée dans l'article de Martin Fowler :

Ce sont des morceaux de code qui «[permettent] aux équipes de modifier le comportement du système sans changer de code».

Nous les avons donc historiquement considérés comme représentés par le pseudo-code:

if(app_settings["beta-mode"] == "true")
  showAwesomeNewGui();
else
  sameOldSnoozeFeset();

C'est une façon totalement précise d'y penser, et Matt et Adil le développent bien avec une variété de cas d'utilisation tactiques pour l'indicateur de fonctionnalité.

Mais j'aimerais offrir une définition révisée qui reflète la façon dont la réalité a évolué au cours des six années et a changé depuis que dotnetdev a posé la question initiale. Je travaille pour Rollout.io , une plate-forme de drapeau de fonctionnalités, donc j'ai eu un siège au premier rang pour cette évolution.

En termes simples, les indicateurs de fonctionnalités ne sont plus simplement un moyen d'activer et de désactiver des fonctionnalités dans votre application. C'est comme répondre "qu'est-ce qu'une ligne de facture" en disant "c'est une description et un montant de devise". C'est vrai, mais cela ne conduit pas au point le plus large de la facture elle-même.

Les indicateurs de fonctionnalités sont les éléments tactiques d'une solution stratégique globale dans les logiciels modernes. Ils sont le moyen par lequel vous reportez la logique de décision importante dans votre code jusqu'à l'exécution lorsque vous avez plus d'informations. Et, peut-être plus important encore, ils ne se produisent plus de manière isolée, avec une seule vérification pour voir si le numéro de version est supérieur ou non à 2,7; les organisations qui les utilisent les incluent généralement dans le cadre d'une approche produit complète à l'échelle du système.

Comme d'autres l'ont mentionné, Facebook et LinkedIn ont été les premiers à le faire, mais en 2018, de nombreuses organisations le font. Ils reportent les questions de logique de décision pour l'exécution dans le cadre de la stratégie de développement, de la stratégie opérationnelle (ou de la stratégie DevOps, si vous le souhaitez) et de la stratégie produit. Voici des exemples de telles questions.

  • Qui devrait voir le nouvel écran d'administration que nous déployons et quand?
  • Quel niveau d'adhésion est requis pour débloquer cet œuf de Pâques?
  • Quand devrions-nous passer à la nouvelle base de données?
  • Devrions-nous mettre une photo d'un guépard ou d'un aigle sur le bouton de paiement pour améliorer les conversions?

Pour avoir une application qui reporte un nombre important de ces décisions jusqu'à l'exécution, vous ne pouvez pas lancer des indicateurs de fonctionnalité dans votre application de manière ad hoc ou vous vous enterrerez dans des dettes techniques. Vous devez, ces jours-ci, avoir une stratégie complète de gestion des indicateurs de fonctionnalités, qui comprend quelques composants différents.

  • Les points de basculement sont utilisés pour changer de comportement pour les nouvelles fonctionnalités.
  • Plusieurs points de bascule se réunissent pour former un routeur à bascule . Un routeur à bascule détermine l'état d'une fonctionnalité.
  • Basculer le contexte fournit au routeur bascule les informations contextuelles nécessaires (par exemple, un utilisateur spécifique).
  • La configuration à bascule fournit les informations du routeur à bascule sur l'environnement.

Alors, à la fin, que sont les indicateurs de fonctionnalité?

Eh bien, ils constituent un élément important d'une stratégie plus large visant à disposer d'une application adaptable aux besoins techniques et du marché.

Erez Rosovsky
la source
9

Un indicateur de fonctionnalité (également connu sous le nom de retournement de fonctionnalité ou de basculement de fonctionnalité ) est un commutateur permettant d'activer ou de désactiver une fonctionnalité potentiellement coûteuse selon les besoins (comme, par exemple, lorsqu'un site subit un trafic inattendu). Cela vous fera gagner un peu de temps avant de passer à l'échelle ou jusqu'à ce que la pointe de charge disparaisse.

Voici un exemple de la documentation SWIG .

Michael Petrotta
la source
6
C'est une utilisation des indicateurs de fonctionnalité, oui, mais le grand concept à comprendre est qu'ils découplent la publication de fonctionnalités et le déploiement de code, de sorte que vous puissiez publier des fonctionnalités quand vous le souhaitez, au lieu de chaque fois que le code est livré. C'est la pierre angulaire de l'intégration continue.
Eric Elliott
6

Dans mon entreprise, nous avions une solution propre pour cela. Nous avons créé un service fournissant un .jsonfichier config ( ) téléchargeable pour chaque application. Dans cette configuration, nous avons stocké les indicateurs pour les fonctionnalités. Sur la base de cette configuration, l'application peut afficher ou masquer la fonctionnalité actuelle. (Par exemple, afficher ou masquer un élément de menu dans la barre latérale).

Nous avons également créé une page d'administration interne où nous pouvons configurer les indicateurs de fonctionnalité. Cela a bien fonctionné pendant un certain temps, mais après cela, nous aurions aimé faire du ciblage des utilisateurs et des tests A / B. Développer par nos propres moyens Cela nous a semblé trop d'effort, nous avons donc choisi une solution tierce. Comme déjà mentionné ici, il existe de nombreuses solutions pour cela.

Nous avons choisi ConfigCat car il prend en charge les groupes cibles personnalisés et le déploiement basé sur un pourcentage à la fois. Vous pouvez vérifier les sdks open-source pris en charge sur github .

lun
la source
4

Les indicateurs de fonctionnalité (ou bascules de fonctionnalité) vous permettent d'activer des fonctionnalités à distance sur une application sans avoir besoin de recréer / redéployer l'application. Cela vous permet de déployer le code en production mais de ne pas publier la fonctionnalité tant que vous n'êtes pas prêt. Vous pouvez cibler des utilisateurs spécifiques, vous pouvez donc activer une nouvelle fonctionnalité pour vos utilisateurs bêta à tester.

Dans notre entreprise, nous avons déjà utilisé LaunchDarkly et d'autres suggestions de FeatureFlags.io . Nous avons également essayé d'utiliser la configuration à distance de Firebase pour essayer de faire fonctionner cela, mais nous avons trouvé qu'il n'était pas vraiment adapté à cet objectif.

Nous avons fini par développer notre propre version appelée Bullet Train , que nous avons open source. Il combine à la fois les indicateurs / bascules de fonction et la configuration à distance.

TStu
la source
4

Les indicateurs de fonctionnalité sont utilisés à plusieurs fins. L'idée générale est de déléguer le contrôle sur quel utilisateur voit quelle fonctionnalité à un tableau de bord distant ou à un back-office.

Une fois qu'une fonctionnalité est signalée dans le code, vous pouvez désormais utiliser plusieurs méthodes pour déterminer quel utilisateur la voit dans votre application: 1. Activé / Désactivé - affiche la fonctionnalité à tous ou aucun de vos utilisateurs. 2. Version graduelle - affichez la fonctionnalité uniquement à un pourcentage de vos utilisateurs, puis montrez-la progressivement à tous les utilisateurs. 3. Ciblage - montrez la fonctionnalité à des utilisateurs spécifiques en fonction des propriétés ou des caractéristiques de cet utilisateur.

Les outils qui aident à contrôler les indicateurs de fonctionnalités (booléens) et les configurations de fonctionnalités (chaînes, nombres, etc.) sont généralement appelés plates-formes de gestion des fonctionnalités.Il existe un excellent service de gestion des fonctionnalités appelé Configz.io

Les monades sont comme ...
la source
3

Du point de vue du codage, un indicateur de fonctionnalité peut être aussi simple qu'une ifinstruction qui entoure un nouveau morceau de code que vous écrivez. Lorsque l' ifinstruction prend la valeur true (l'indicateur de fonctionnalité est activé), le nouveau code est exécuté.

Dans un exemple concret de livraison de logiciel, l' ifinstruction décrite ci-dessus s'évaluerait différemment selon l'environnement dans lequel le logiciel s'exécute. Par exemple, si l'application est exécutée sur votre serveur d'assurance qualité, l'indicateur de fonctionnalité retournera true et la nouvelle fonctionnalité sera vu. S'il est exécuté sur votre serveur de production, l'indicateur de fonctionnalité retournera false et la fonctionnalité sera masquée.

D'après mon expérience personnelle au cours de ma carrière, j'ai utilisé les indicateurs de fonctionnalités des manières suivantes:

  1. Découpler les déploiements de code de la publication de fonctionnalités aux clients. C'était ma première utilisation initiale des indicateurs de fonctionnalités dans notre processus de développement. Nous l'avons utilisé pour supprimer la dépendance entre notre équipe marketing et produit et l'équipe d'ingénierie qui effectuait le développement et les versions. Les drapeaux de fonctionnalités nous permettaient de déployer notre code des semaines avant un lancement alors qu'avant, nous déployions du code la nuit avant une sortie!

  2. Essais en production. Avant d'utiliser des indicateurs de fonctionnalités lorsque nous avons publié notre code, il s'agissait d'un événement tout ou rien, soit tous nos clients ont obtenu la fonctionnalité, soit aucun d'entre eux ne l'a fait. Nous avons utilisé des indicateurs de fonctionnalité pour nous permettre de déployer une nouvelle fonctionnalité à un petit pourcentage d'utilisateurs à la fois. Cela nous a permis de collecter des commentaires et des données précieux sur une nouvelle fonctionnalité sans risquer de problèmes potentiels pour l'ensemble de la clientèle.

  3. Activation / désactivation d'une fonctionnalité par environnement dans le cycle de vie du développement. Nous l'avons largement utilisé dans le développement pour permettre un processus de déploiement beaucoup plus fluide - nous avons un pipeline CI / CD dans lequel l'utilisation d'indicateurs de fonctionnalités est vitale.

  4. Création d'un kill switch. Nous avons enveloppé certaines fonctionnalités de notre application avec un indicateur de fonctionnalité qui nous permet de «tuer» cette fonctionnalité en cas de problèmes que nous rencontrions avec l'application à ce moment-là. Par exemple, si nous nous trouvons sous une charge importante, nous sommes en mesure de désactiver certaines fonctionnalités non essentielles du site Web pour résoudre le problème.

Vous pouvez en savoir plus sur les indicateurs de fonctionnalité ici.

Vous pouvez ajouter des indicateurs de fonctionnalité à votre code de plusieurs manières.

  1. Vous pouvez créer la vôtre ou utiliser une bibliothèque d'indicateurs de fonctionnalités tierce et ajouter vos données d'indicateurs de fonctionnalités dans un fichier de configuration qui peut être inclus dans votre package de déploiement.
  2. Vous pouvez créer les vôtres ou utiliser une bibliothèque d'indicateurs de fonctionnalités tierce et ajouter vos données d'indicateurs de fonctionnalités dans un fichier de configuration qui peut être chargé au moment de l'exécution.
  3. Vous pouvez utiliser un service de gestion d'indicateurs de fonctionnalités basé sur le cloud pour gérer tous vos besoins d'indicateurs de fonctionnalités à votre place.

Écrire votre propre bibliothèque peut sembler une bonne idée au début et cela peut généralement commencer de cette façon. Cependant, vous pouvez bientôt rencontrer des problèmes lorsque vous souhaitez implémenter les cas d'utilisation plus avancés des indicateurs de fonctionnalité, tels que le déploiement à un pourcentage d'utilisateurs ou le ciblage de groupes d'utilisateurs spécifiques. Un autre problème avec la création de votre propre implémentation d'indicateur de fonctionnalité est que si vous utilisez plusieurs langues, vous devrez implémenter votre code plusieurs fois.

Le moyen le meilleur et le plus simple d'utiliser les indicateurs de fonctionnalités est d'utiliser un service de gestion d'indicateurs de fonctionnalités en ligne tel que Floodgate . De cette façon, vous pouvez tirer parti de la plate-forme pour tous les travaux lourds, ce qui vous permet ensuite de vous concentrer sur la création de la fonctionnalité pour votre application.

Voici un exemple de la façon d'ajouter un indicateur de fonctionnalité Floodgate à une application à l'aide du SDK .NET.

using FloodGate.SDK;

var floodgateClient = new FloodGateClient("API-KEY");

var flag = floodgateClient.GetValue("a-new-feature", false);

if (flag)
{
  // Execute the code for my new feature here...
}

Si vous travaillez dans une équipe de développement et que vous n'utilisez pas d'indicateurs de fonctionnalité et que vous rencontrez des problèmes de déploiement et de gestion de code au sein de l'équipe. L'utilisation d'indicateurs de fonctionnalité peut être un excellent moyen de résoudre ces problèmes. Il y a aussi un bel effet secondaire des indicateurs de fonctionnalités qui accélèrent la vitesse de développement de vos équipes.

Martin Fowler donne une écriture-up très approfondie des indicateurs de fonctionnalité ici que je vous recommande de lire.

Eugène
la source
2

Je crois comprendre que les indicateurs de fonctionnalité vous aident à accéder à la fonctionnalité en décidant quels utilisateurs reçoivent certaines fonctionnalités.

Par exemple, disons que vous souhaitez uniquement que vos utilisateurs bêta voient une nouvelle fonctionnalité. Vous «activez» cette fonctionnalité pour les utilisateurs bêta et le reste de vos utilisateurs ne la verra pas.

LDUser user = new LDUser("[email protected]");

boolean showFeature = ldClient.toggle("your.feature.key", user, false);

if (showFeature) {
     // application code to show the feature 
 }
else {
     // the code to run if the feature is off
 }

Je teste les indicateurs de fonctionnalités de LaunchDarkly pour certains tests JS A / B frontaux - semble bien fonctionner. Vous pouvez également consulter ce site pour les bascules de fonctionnalités et les bibliothèques d'indicateurs de fonctionnalités .

Hbitspark
la source
1

Les indicateurs de fonctionnalités vous donnent essentiellement la possibilité d'activer et de désactiver une fonctionnalité sans apporter de modifications au code ou sans publier une nouvelle version. C'est une solution importante, en particulier pour les développeurs d'applications mobiles, car ils n'ont aucun contrôle sur les utilisateurs pour mettre à jour leur application vers une nouvelle version.

Il existe plusieurs entreprises offrant ce service aux développeurs d'applications mobiles.

OFK
la source
Méfiez-vous de ceux-ci. Vous n'avez pas besoin d'intégrer l'un de ces services pour créer un commutateur simple qui peut être utilisé pour masquer plusieurs fonctionnalités de la visibilité / intégration de PROD. Vous n'avez pas non plus nécessairement besoin de le faire en direct - car dans, l'attente d'un déploiement n'est pas un gros problème lorsqu'un déploiement PROD ne dure que quelques minutes (pour de nombreuses autres raisons, vous devriez l'optimiser).
Matt Kocaj
2
En complément, voici une comparaison des meilleurs services de drapeau de fonctionnalités actuels: featureflagservices.io
sige
1

Dans mon entreprise, nous utilisons des indicateurs de fonctionnalités pour chaque nouvelle fonctionnalité que nous introduisons dans notre application SaaS. Outre les avantages en termes de performances, cela nous permet également de déployer progressivement de nouvelles fonctionnalités - en introduisant d'abord de nouvelles fonctionnalités aux utilisateurs expérimentés, en obtenant des commentaires de leur part et en les improvisant avant de pouvoir les déployer à tous les utilisateurs.

Cela nous permet également de personnaliser l'offre aux utilisateurs individuels - les utilisateurs expérimentés veulent toutes les fonctionnalités; les utilisateurs simples peuvent simplement vouloir les éléments de base et peuvent être déroutés par toutes les fonctionnalités complexes et puissantes. Cela permet également à notre équipe commerciale de faire des ventes incitatives.

Et bien sûr, comme d'autres l'ont souligné, si nous constatons qu'une fonctionnalité entraîne une dégradation des performances, nous pouvons simplement désactiver cette fonctionnalité (soit pour tous les clients, soit pour le client qui cause un problème).

Dharmendar Kumar 'DK'
la source