web-dev-qa-db-fra.com

Fonctionnalité bascule vs branches de fonction

Que sont les "bascules de fonction" et les "branches de fonction" et quelle est la différence entre elles?

Quels sont les avantages et les inconvénients? Pourquoi est-ce meilleur que l'autre?

J'ai trouvé quelques articles sur Google à ce sujet, et j'ai tendance à être dans le camp "Feature Toggles", mais je ne suis pas convaincu que "Feature Toggles" soit le meilleur choix dans tous les cas.

38
Sergiu

Les bascules de fonction sont la méthodologie utilisée dans une chaîne d'intégration continue/livraison continue (CI/CD) (méthodologie de projet Agile/Kanban). Fondamentalement, vous envoyez de nouvelles fonctionnalités à la production dans un état désactivé, puis dans une console d'administration, activez la fonctionnalité (ou désactivez-la si vous découvrez qu'elle est endommagée).

Branches de fonctionnalités peut être partie d'une méthodologie de publication et intégrée dans une chaîne d'intégration continue. Vous pouvez développer dans une branche de fonctionnalités, déployer la branche vers DEV/QA, obtenir la certification, fusionner la branche de fonctionnalités vers le tronc, puis pousser le tronc vers les environnements SIT/UAT/PROD.

Il y a des avantages et des inconvénients associés à cette approche. Le basculement des fonctionnalités nécessite une discipline très stricte car le code cassé/sombre arrive en production. C'est idéal pour les startups et les magasins où la direction sait comment retirer cela et a des outils d'automatisation du système en place (Chef/Puppet/cfengine, etc.) Google, Facebook, LinkedIn, WordPress tous déploient aux environnements de production en utilisant le basculement des fonctionnalités et l'automatisation du système.

Il existe des "technologies" prérequises pour effectuer correctement le basculement des fonctionnalités: livraison/déploiement continu, intégration continue, tests unitaires automatisés, tests d'intégration automatisés, tests de stress/performances automatisés, automatisation du système. Si vous ne les avez pas en place, envisagez une stratégie de publication plus simple (par exemple, ramification des fonctionnalités).

41
Electrawn

J'en discute en profondeur sur mon blog: http://geekswithblogs.net/Optikal/archive/2013/02/10/152069.aspx

En bref, les branches de fonctionnalités vous offriront une meilleure isolation, mais vous obligeront à faire face à la douleur de l'intégration différée et des fusions. Les bascules vous offrent une intégration continue, mais vous obligent à concevoir/implémenter votre code de manière à prendre en charge les bascules et à introduire le risque qu'un code de fonctionnalité inachevé puisse affecter négativement la production.

Vous pouvez utiliser à la fois les branches et les bascules (elles ne s'excluent pas mutuellement). En ce qui concerne le choix de celui à utiliser dans chaque scénario, je pense que les bascules devraient être le choix par défaut, sauf si les conditions suivantes sont vraies:

  • difficile de cacher la fonctionnalité derrière une bascule
  • a un impact potentiel sur une zone de l'application qui n'a pas de tests approfondis

Si l'une de ces conditions est vraie, j'utiliserais probablement une branche de fonctionnalité au lieu de basculer.

19
Dylan Smith

Le basculement des fonctionnalités nécessite une discipline très stricte car le code cassé/sombre arrive en production.

Je suis d'accord avec Electrawn, j'utilise la fonction de branchement depuis 6 ans, car dans notre cas, nous n'avons pas les pré-exigences.

Il est également important de comprendre que la "stratégie Google" transfère les efforts consacrés à la stratégie des branches de fonctionnalités (fusion) à un autre moment.

http://martinfowler.com/bliki/FeatureToggle.html

Il est très important de retirer les bascules une fois que les fonctionnalités en attente ont été mises en production. Cela implique de supprimer les définitions du fichier de configuration et tout le code qui les utilise. Sinon, vous obtiendrez une pile de bascules que personne ne se souviendra comment utiliser. Dans un exemple mémorable dont j'ai entendu parler, il fallait faire une recompilation spéciale du noyau Linux pour gérer suffisamment de commutateurs de ligne de commande.

Remarque: En suivant les principes SCM, si quelqu'un ouvre et modifie un fichier, cela peut être du code cassé.

Donc, selon moi, je ne crois pas à un "meilleur choix dans tous les cas", car cela dépend de la culture de votre équipe et si vous avez la couverture du test.

Eh bien, c'est une question très polémique.

Je préfère toujours la stratégie des branches de fonctionnalité dans mon cas. Conserver les meilleures pratiques SCM et planifier la feuille de route, le processus de fusion a tendance à être un moyen facile. Au cours de cette année, j'ai entendu beaucoup de gens se plaindre du processus de fusion, mais dans de nombreux cas, le problème de la fusion est le même dans mon expérience, "La communication échoue" :)

Désolé pour la réponse imprécise, mais je pense qu'il y a des aspects humains autour de ce sujet de meilleur choix dans SCM.

5
Eduardo Fabricio