spinny:~/writing $ less openfeature-feature-flags-progressive-delivery.md
12Le déploiement a lieu lorsque le code arrive en production. La libération, c'est le moment où quelqu'un peut réellement l'utiliser. Confondre les deux est l’un des moyens les plus rapides de faire de chaque déploiement un moment un peu tendu.34Les feature flag servent à mettre de l'espace entre ces deux moments. Vous pouvez déployer aujourd'hui, lancer demain pour l'équipe interne, puis pour un client pilote, puis pour 10 % des utilisateurs. Si quelque chose ne va pas, éteignez le drapeau. Vous n'êtes pas nécessairement obligé de restaurer l'intégralité de la version.56## Le drapeau n'est pas qu'un si78Techniquement, c'est souvent un `if`. Culturellement, c'est bien plus.910```typescript11if (await flags.isEnabled('checkout.v2.enabled', context)) {12 return newCheckout(input);13}1415return oldCheckout(input);16```1718Ce petit `if` peut représenter un déploiement progressif, une expérimentation, une migration, un permis d'entreprise ou un kill switch opérationnel. Le problème est que si on ne la gère pas bien, cela peut aussi devenir une dette technique qui reste dans le code pendant deux ans.1920## Où entre OpenFeature2122OpenFeature est une spécification ouverte pour évaluer feature flag avec un API commun. L'idée est simple : le code de votre application ne doit pas dépendre directement du fournisseur ou du système interne que vous utilisez pour les indicateurs.2324L'application demande :2526```typescript27const enabled = await client.getBooleanValue('checkout.v2.enabled', false, {28 targetingKey: user.id,29 plan: user.plan,30 country: user.country,31});32```3334Le fournisseur décide d'où viennent les règles : SaaS, fichier, service interne, flagd, configuration GitOps. Si un jour vous modifiez le backend de marquage des fonctionnalités, l'application n'a pas besoin d'être réécrite partout.3536Cette séparation semble être un détail architectural, mais elle se ressent au fur et à mesure que le projet grandit.3738## Le contexte représente la moitié de la bataille3940Un drapeau d'activation ou de désactivation pour tout le monde est utile, mais limité. La livraison progressive vit dans son contexte :4142- utilisateur interne ou externe ;43- plan gratuit ou entreprise ;44- village;45- organisation;46- version de l'application ;47- pourcentage de trafic stable.4849La clé importante est `targetingKey` : elle doit être stable. Si cela change à chaque requête, un utilisateur peut se retrouver une fois dans la variante A et une fois dans la variante B. Pour une expérience c'est terrible, pour une caisse cela peut être désastreux.5051## Un déploiement judicieux5253Un flux que j'aime est celui-ci :54551. déployer sans drapeau ;562. allumage pour les développeurs et l'assurance qualité ;573. mise en marche pour un client ou locataire pilote ;58Déploiement de 4, 5 % ;595. déploiement à 25% ;606. Déploiement à 100 % ;617. suppression de l'ancien code et du drapeau.6263Le point souvent oublié est le dernier. Un drapeau temporaire doit avoir une date de décès. Si elle reste pour toujours, chaque futur refactor devra se demander : "mais cette branche est-elle toujours utile ?".6465## Kill switch : préparez-les d'abord6667Le kill switch est l'indicateur qui vous sauve lorsqu'une dépendance externe commence à vous déranger, qu'un travail consomme trop de ressources ou qu'une nouvelle logique produit des erreurs étranges.6869Un bon kill switch doit être :7071- facile à trouver ;72- documenté dans le runbook ;73- testé occasionnellement ;74- observable lorsqu'il est activé ;75- indépendant, autant que possible, de la pièce qui pourrait se briser.7677Le pire est de découvrir lors de l'accident que le drapeau existe, mais personne ne sait s'il fonctionne encore.7879## Observabilité ou livraison non progressive8081Activer une fonctionnalité à 10 % sans regarder les métriques n'est qu'un optimisme en plusieurs étapes.8283Chaque déploiement doit répondre à des questions simples :8485- les erreurs ont-elles augmenté ?86- la latence a-t-elle changé ?87- les utilisateurs terminent-ils le flux ?88- y a-t-il plus de tickets ou de tentatives ?89- une variante impacte-t-elle un seul segment ?9091OpenFeature prend en charge les crochets autour de l'évaluation des drapeaux. Ils sont utiles pour enregistrer les erreurs, ajouter des métriques ou lier la note à un trace.9293## Dénomination et propriété9495Les noms comptent. `new_ui` ne dit rien. `checkout.v2.enabled` en dit beaucoup plus.9697Pour chaque drapeau, je marquerais au moins :9899- nom ;100- description;101- propriétaire;102- défaut sûr ;103- la raison pour laquelle il existe ;104- date ou condition d'enlèvement.105106Un drapeau sans propriétaire est presque toujours un drapeau que personne ne nettoiera.107108## Où les évaluer109110Frontend, backend ou edge ? Cela dépend.111112Si l'indicateur concerne la mise en page, la copie ou l'intégration, le frontend convient. S’il s’agit d’autorisations, de facturation, de limites ou de données sensibles, cela doit être sur le backend. S’il s’agit d’expériences de routage ou de trafic élevé, l’avantage peut avoir du sens.113114La règle simple : le frontend peut améliorer l’expérience, mais il ne doit pas être la seule barrière de sécurité.115116## Conclusion117118Les feature flag bien faits changent le rapport à la production. Ils n’éliminent pas le risque, mais le réduisent et le rendent plus gérable. Vous pouvez relâcher par tranches, observer, arrêter, revenir en arrière, apprendre.119120OpenFeature ajoute une base propre : un API commun, des fournisseurs interchangeables et une manière plus ordonnée de développer le système. Mais la discipline reste la vôtre : valeurs par défaut sûres, noms clairs, mesures, propriétaires et propreté.121122Le meilleur drapeau est celui qui vous aide à vous libérer sereinement et qui disparaît ensuite lorsqu'on n'en a plus besoin.123124##Sources125126- [OpenFeature: Introduction](https://openfeature.dev/docs/reference/intro/)127- [OpenFeature: Node.js SDK](https://openfeature.dev/docs/reference/sdks/server/javascript/)128- [OpenFeature Specification: Flag Evaluation API](https://openfeature.dev/specification/sections/flag-evaluation)129- [OpenFeature: Hooks](https://openfeature.dev/docs/reference/concepts/hooks/)130- [CNCF: OpenFeature](https://www.cncf.io/projects/openfeature/)131
:Feature flag : relâchez sans retenir votre soufflelines 1-131 (END) — press q to close