spinny:~/writing $ less openfeature-feature-flags-progressive-delivery.md
12Il deploy è quando il codice arriva in produzione. Il rilascio è quando qualcuno può davvero usarlo. Confondere le due cose è uno dei modi più veloci per rendere ogni deploy un piccolo momento di tensione.34I feature flag servono a mettere spazio tra questi due momenti. Puoi deployare oggi, accendere domani per il team interno, poi per un cliente pilota, poi per il 10% degli utenti. Se qualcosa va male, spegni il flag. Non devi per forza fare rollback di tutta la release.56## Il flag non è solo un if78Tecnicamente spesso è un `if`. Culturalmente è molto di più.910```typescript11if (await flags.isEnabled('checkout.v2.enabled', context)) {12 return newCheckout(input);13}1415return oldCheckout(input);16```1718Quel piccolo `if` può rappresentare un rollout graduale, un esperimento, una migrazione, un permesso enterprise o un kill switch operativo. Il problema è che, se non lo gestisci bene, può diventare anche debito tecnico che resta nel codice per due anni.1920## Dove entra OpenFeature2122OpenFeature è una specifica aperta per valutare feature flag con una API comune. L'idea è semplice: il codice applicativo non dovrebbe dipendere direttamente dal vendor o dal sistema interno che usi per i flag.2324L'app chiede:2526```typescript27const enabled = await client.getBooleanValue('checkout.v2.enabled', false, {28 targetingKey: user.id,29 plan: user.plan,30 country: user.country,31});32```3334Il provider decide da dove arrivano le regole: SaaS, file, servizio interno, flagd, configurazione GitOps. Se un giorno cambi backend di feature flagging, l'applicazione non deve essere riscritta ovunque.3536Questa separazione sembra un dettaglio architetturale, ma si sente quando il progetto cresce.3738## Il contesto è metà del lavoro3940Un flag acceso o spento per tutti è utile, ma limitato. La progressive delivery vive nel contesto:4142- utente interno o esterno;43- piano free o enterprise;44- paese;45- organizzazione;46- versione dell'app;47- percentuale stabile di traffico.4849La chiave importante è `targetingKey`: deve essere stabile. Se cambia a ogni request, un utente può finire una volta nella variante A e una volta nella variante B. Per un esperimento è pessimo, per un checkout può essere disastroso.5051## Un rollout sensato5253Un flusso che mi piace è questo:54551. deploy con flag spento;562. accensione per sviluppatori e QA;573. accensione per un cliente o un tenant pilota;584. rollout al 5%;595. rollout al 25%;606. rollout al 100%;617. rimozione del vecchio codice e del flag.6263Il punto spesso dimenticato è l'ultimo. Un flag temporaneo deve avere una data di morte. Se resta per sempre, ogni refactor futuro dovrà chiedersi: "ma questo ramo serve ancora?".6465## Kill switch: prepararli prima6667Il kill switch è il flag che ti salva quando una dipendenza esterna inizia a fare scherzi, un job consuma troppe risorse o una nuova logica produce errori strani.6869Un buon kill switch deve essere:7071- facile da trovare;72- documentato nel runbook;73- testato ogni tanto;74- osservabile quando viene attivato;75- indipendente, per quanto possibile, dalla parte che potrebbe rompersi.7677La cosa peggiore è scoprire durante l'incidente che il flag esiste, ma nessuno sa se funziona ancora.7879## Osservabilità o non è progressive delivery8081Accendere una feature al 10% senza guardare metriche è solo ottimismo con più passaggi.8283Ogni rollout dovrebbe rispondere a domande semplici:8485- gli errori sono aumentati?86- la latenza è cambiata?87- gli utenti completano il flusso?88- ci sono più ticket o retry?89- una variante impatta solo un segmento?9091OpenFeature supporta hook attorno alla valutazione dei flag. Sono utili per loggare errori, aggiungere metriche o collegare la valutazione a una trace.9293## Naming e ownership9495I nomi contano. `new_ui` non dice nulla. `checkout.v2.enabled` dice molto di più.9697Per ogni flag segnerei almeno:9899- nome;100- descrizione;101- owner;102- default sicuro;103- motivo per cui esiste;104- data o condizione di rimozione.105106Un flag senza owner è quasi sempre un flag che nessuno cancellerà.107108## Dove valutarli109110Frontend, backend o edge? Dipende.111112Se il flag riguarda layout, copy o onboarding, il frontend va bene. Se riguarda permessi, billing, limiti o dati sensibili, deve stare sul backend. Se riguarda routing o esperimenti ad alto traffico, l'edge può avere senso.113114La regola semplice: il frontend può migliorare l'esperienza, ma non deve essere l'unica barriera di sicurezza.115116## Conclusione117118I feature flag fatti bene cambiano il rapporto con la produzione. Non eliminano il rischio, ma lo rendono più piccolo e gestibile. Puoi rilasciare a fette, osservare, fermarti, tornare indietro, imparare.119120OpenFeature aggiunge una base pulita: una API comune, provider intercambiabili e un modo più ordinato di far crescere il sistema. Però la disciplina resta tua: default sicuri, nomi chiari, metriche, owner e pulizia.121122Il flag migliore è quello che ti aiuta a rilasciare con calma e poi sparisce quando non serve più.123124## Fonti125126- [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: rilasciare senza trattenere il respirolines 1-131 (END) — press q to close