Che cos'è un "flag di funzionalità"?


115

L'elevata scalabilità menziona i flag delle funzionalità qui:

5 cose tossiche per la scalabilità , "5. Mancanza di contrassegni di funzionalità"

Cosa sono esattamente i flag di funzionalità?


1
Come sottolinea Maxim Vexler, questo post di Flickr è uno dei primi articoli canonici sui flag di funzionalità e spiega il loro uso e implementazione in alcuni dettagli code.flickr.com/blog/2009/12/02/flipping-out
Noah Sussman

Risposte:


104

Un 'flag di funzionalità' (o Feature Toggle ) è la capacità di attivare / disattivare facilmente le funzionalità (sottosezioni) della tua applicazione:

  • forse tramite una ridistribuzione, o
  • alcune pagine interne dove le pagine / funzionalità possono essere attivate dal vivo.

Immagino che l'esempio sia stato che è utile avere il controllo per ridurre un po 'il set di funzionalità se è necessario, ad esempio, ridurre le query db se il carico è troppo alto.

Ci sono un sacco di altri motivi per cui vorresti usarlo, uno dei principali è l'abilitazione della consegna continua : spingere le cose in produzione / live ma avere la funzione disabilitata / attivata fino al completamento. Spesso usiamo quello che chiamiamo "dev cookie" per mostrare funzionalità non completate solo al team di sviluppo. In questo modo possiamo testare il lavoro parzialmente completato in produzione (oh yeh! Esiste una migliore integrazione?) Su più rilasci / distribuzioni prima di "disattivarlo" (completato) e renderlo visibile al pubblico.

Ecco un semplice pacchetto che ti aiuta a farlo in ASP.NET MVC land: https://github.com/cottsak/DevCookie (divulgazione completa: sono l'autore)

Fowler ha anche un articolo molto più lungo di quello collegato sopra con molti più dettagli .

Questo post (anche sul sito di Fowler) spiega i vari tipi di strategie di commutazione . DevCookie supporta la strategia basata su mainline / trunk ed è chiamato " Release Toggle " nell'articolo.

La risposta di Adil evidenzia che ci sono molti termini e ragioni per cui potresti volere parte di questa infrastruttura. Tieni presente che potresti aver bisogno solo di alcune di queste cose. Ad esempio, potrei voler abilitare solo un flusso di lavoro di distribuzione / consegna semplice e agile, quindi sarà sufficiente una semplice infrastruttura. Se poi scegli di passare alla sperimentazione #leanstartup completa con A / B, test di coorte e cose come il roll-out controllato, dovresti considerare uno strumento di analisi (ad es. Heap ) che faciliti quelle metodologie di sviluppo basate sui dati come una soluzione distinta . Un'infrastruttura a commutazione che fa tutto quanto sopra porterà a una complessità eccessiva e inutile.

Se sei arrivato così lontano, potresti dare un'occhiata ad alcuni dei miei altri pensieri su Mainline Development, funzionalità di commutazione e altre idee sciocche come TEST, QA, SIT, STAND, CROUCH .


1
Stranamente, ho sempre immaginato la stessa cosa in qualunque cosa costruissi. Questa può essere una caratteristica così efficace.
GurdeepS

7
Spesso troverai cose come questa che sembrano ovvie. Si scopre che qualcuno ha sempre trovato un nome per questo.
Matt Kocaj

27

Feature Flag è una tecnica per disattivare alcune funzionalità dell'applicazione, tramite configurazione, senza distribuire nuovo codice.

I flag di funzionalità svolgono un ruolo chiave nello schema CI in cui le funzionalità vengono costantemente distribuite ma non necessariamente "rilasciate" in produzione.

Maggiori informazioni qui:

-- MODIFICARE:

Implementazione Java di Feature Flags .


3
Questo è ben descritto in "Distribuzione continua" ed è praticamente un requisito per lo sviluppo "principale". Piuttosto che ramificarsi in SCM per le funzionalità, le funzionalità vengono attivate o disattivate, consentendo di rilasciare codice con funzionalità che non dovrebbero essere ancora abilitate.
Chip McCormick

Solo una nota su "tramite configurazione, senza distribuire nuovo codice": sembra che l'istruzione significhi cambiare una configurazione e quindi distribuire nuovamente l'app (anche se forse nessun codice è cambiato). Ciò può comunque richiedere da pochi secondi a minuti a seconda della pipeline di distribuzione. Un flag di funzionalità o un interruttore di funzionalità potrebbe non essere persistente in config. Potrebbe trovarsi in un negozio / db da qualche parte e comportarsi in modo "live" - ​​ovvero, navigare in una pagina di amministrazione in cui si preme un pulsante per abilitare istantaneamente un comportamento a livello di sito (nessuna distribuzione, nessuna modifica della configurazione).
Matt Kocaj

1
Lavoro per ConfigCat.com e per come la vedo io "cambiare una configurazione, senza distribuire nuovo codice" significa che le configurazioni sono servite dal servizio di flag delle caratteristiche e la tua applicazione accede ai valori estraendo quel file di configurazione. In questo modo puoi essere certo che la modifica di un valore non richiede alcun tipo di ridistribuzione dell'app. Inoltre, ti consente di creare regole in modo da offrire un valore a un utente e uno diverso a un altro. cool è tutto ciò che la valutazione del flag di funzionalità è sul lato client e tutta questa logica funziona senza la necessità di inviare alcun dato al servizio di flag di funzionalità.
sige


19

I flag di funzionalità, i toggle di funzionalità, gli esperimenti e le implementazioni controllate sono sinonimi di un'idea semplice ma potente: distribuzioni di codice separate dalle implementazioni di funzionalità. In parole povere, è la capacità di spingere gli impegni della tua funzione nella produzione mentre scegli chi tra i tuoi clienti, se qualcuno, può vederla.

Sono stati resi popolari in parte dal Gatekeeper di Facebook . Il LiX di LinkedIn è un altro buon esempio.

Abbracciare questa semplice idea getta le basi per molte best practice, tra cui:

Distribuzione / consegna continua : più codici push in produzione in un giorno.

Sviluppo trunk / linea principale : i rami delle funzionalità devono essere creati solo per le richieste pull, non per lo sviluppo di funzionalità di lunga durata.

Niente più treni di rilascio per impantanare le cose.

QA / Perf Testing in Production : il vero QA e il test delle prestazioni sono sull'infrastruttura di produzione con traffico di produzione. Non perdere tempo a costruire laboratori di prestazioni e ambienti di staging estesi.

Sperimentazione : scopri come una nuova funzionalità sposta l'ago sui tuoi KPI.

Evitare hotfix o rollback del codice in caso di problemi : sia gli hotfix che i rollback del codice sono stressanti, richiedono molto tempo e portano a più problemi del necessario. Invece, disattiva la funzione o riducila.

Altri hanno menzionato le librerie open source. Un buon esempio di una soluzione completa, come Gatekeeper e LiX, è Split . Lavoro per Split.


Penso che sia importante non confondere i flag delle funzionalità esclusivamente per supportare CI verses AB / coorte / esperimenti magri: gli obiettivi sono diversi. Ad esempio, l'utilizzo di un interruttore di funzionalità per ottenere qualcosa in Prod per QA / accettazione potrebbe essere uno strumento semplice per aiutare CI / CD e in tal caso Split potrebbe essere eccessivo. Poi di nuovo, se vuoi fare esperimenti snelli o test A / B, allora forse hai bisogno di un buon strumento di analisi come Heap con gli strumenti aggiuntivi e la reportistica di telemetria incorporata. Non mi piace l'idea di unire questi due obiettivi - sembra che tu potrebbe gonfiarsi molto facilmente.
Matt Kocaj

14

Ci sono molte ottime risposte qui, tutte guidate dall'importante definizione di base resa popolare nel post di Martin Fowler :

Sono frammenti di codice che "[consentono] ai team di modificare il comportamento del sistema senza cambiare codice".

Quindi storicamente li abbiamo pensati come rappresentati dallo pseudo-codice:

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

Questo è un modo totalmente accurato di pensarlo, e sia Matt che Adil lo espandono piacevolmente con una varietà di casi d'uso tattici per la flag delle caratteristiche.

Ma vorrei offrire una definizione rivista che rifletta come la realtà si è evoluta nei sei anni e come è cambiata da quando dotnetdev ha posto la domanda originale. Lavoro per Rollout.io , una piattaforma di flag di funzionalità, quindi ho avuto un posto in prima fila per questa evoluzione.

In poche parole, i flag di funzionalità non sono più solo un modo per attivare e disattivare bit di funzionalità nella tua applicazione. È come rispondere "che cos'è una voce di fattura" dicendo "è una descrizione e un importo in valuta". Vero, ma non funziona nel punto più ampio della fattura stessa.

I flag di funzionalità sono i bit tattici di una soluzione strategica globale nel software moderno. Sono i mezzi con cui rinviare la logica decisionale importante nel codice fino al runtime quando si hanno più informazioni. E, forse la cosa più importante, non si verificano più solo in isolamento, con un singolo controllo per vedere se il numero di versione è maggiore di 2.7 o meno; le organizzazioni che li utilizzano in genere li includono come parte di un approccio al prodotto completo a livello di sistema.

Come altri hanno già detto, Facebook e LinkedIn hanno aperto la strada a questo, ma nel 2018 molte organizzazioni lo stanno facendo. Rimandano le domande sulla logica decisionale per il runtime come parte della strategia di sviluppo, della strategia operativa (o della strategia DevOps, se lo si desidera) e della strategia del prodotto. Ecco alcuni esempi di tali domande.

  • Chi dovrebbe vedere la nuova schermata di amministrazione che stiamo lanciando e quando?
  • Quale livello di iscrizione è richiesto per sbloccare questo uovo di Pasqua?
  • Quando dovremmo passare al nuovo database?
  • Dovremmo mettere la foto di un ghepardo o di un'aquila sul pulsante di pagamento per migliorare le conversioni?

Per avere un'applicazione che rimanda un numero significativo di tali decisioni fino al runtime, non è possibile lanciare flag di funzionalità nell'applicazione in modo ad hoc o ti seppellirai in un debito tecnico. Oggigiorno è necessario disporre di una strategia di gestione dei flag di funzionalità completa, che includa alcuni componenti diversi.

  • I punti di commutazione vengono utilizzati per cambiare il comportamento per le nuove funzionalità.
  • Più punti di commutazione si uniscono per formare un router di commutazione . Un toggle router determina lo stato di una funzionalità.
  • Toggle context fornisce al toggle router le informazioni contestuali necessarie (ad esempio, utente specifico).
  • Attiva / disattiva configurazione fornisce le informazioni di attivazione / disattivazione del router sull'ambiente.

Quindi, alla fine, cosa sono i flag di funzionalità?

Bene, sono una parte importante di una strategia più ampia per avere un'applicazione adattabile alle esigenze sia tecniche che di mercato.


9

Un flag di funzionalità (noto anche come funzione capovolgimento o commutazione di funzionalità ) è un interruttore per abilitare o disabilitare una funzionalità potenzialmente costosa secondo necessità (come, ad esempio, quando un sito viene martellato da traffico imprevisto). Questo ti farà guadagnare un po 'di tempo fino a quando non aumenti la scala o fino a quando il picco di carico non scompare.

Ecco un esempio dalla documentazione SWIG .


6
Questo è un uso dei flag di funzionalità, sì, ma il grande concetto da capire è che disaccoppiano il rilascio delle funzionalità e la distribuzione del codice, in modo che tu possa rilasciare le funzionalità quando vuoi, invece che ogni volta che il codice viene spedito. È una pietra angolare dell'integrazione continua.
Eric Elliott

6

Nella mia azienda avevamo una soluzione per questo. Abbiamo creato un servizio che fornisce un file config ( .json) scaricabile per ogni app. In quella configurazione abbiamo memorizzato i flag per le funzionalità. In base a tale configurazione l'app può mostrare o nascondere la funzionalità corrente. (Ad esempio mostra o nascondi una voce di menu sulla barra laterale).

Abbiamo anche creato una pagina di amministrazione interna dove possiamo configurare i flag delle funzionalità. Ha funzionato abbastanza bene per un po ', ma dopo ci sarebbe piaciuto fare il targeting degli utenti e il test A / B. Sviluppare autonomamente Sembrava uno sforzo eccessivo, quindi abbiamo scelto una soluzione di terze parti. Come già accennato qui ci sono molte soluzioni per questo.

Abbiamo scelto ConfigCat perché supporta gruppi target personalizzati e implementazioni basate su percentuali contemporaneamente. Puoi controllare gli SDK open source supportati su GitHub .


4

I flag di funzionalità (o gli interruttori di funzionalità) consentono di abilitare le funzionalità in remoto su un'applicazione senza la necessità di ricostruire / ridistribuire l'applicazione. Ciò consente di distribuire il codice alla produzione ma non rilasciare la funzionalità finché non si è pronti. Sei in grado di scegliere come target utenti specifici, in modo da poter abilitare una nuova funzione per i tuoi utenti beta da testare.

Nella nostra azienda abbiamo già utilizzato LaunchDarkly e altri suggerimenti da FeatureFlags.io . Abbiamo anche provato a utilizzare la configurazione remota di Firebase per provare a farlo funzionare, tuttavia abbiamo scoperto che non era davvero adatto a questo scopo.

Abbiamo finito per sviluppare la nostra versione chiamata Bullet Train , che abbiamo reso open source. Combina sia Feature Flags / Toggles che Remote Config.


4

I flag di funzionalità vengono utilizzati per diversi scopi. L'idea generale è quella di delegare il controllo su quale utente vede quale funzionalità a qualche dashboard remoto o back-office di qualche tipo.

Una volta che una funzionalità è stata contrassegnata nel codice, è ora possibile utilizzare diversi metodi per determinare quale utente la vede nell'applicazione: 1. On / Off : mostra la funzionalità a tutti o a nessuno dei tuoi utenti. 2. Rilascio graduale : mostra la funzione solo a una percentuale dei tuoi utenti, quindi mostrala gradualmente a tutti gli utenti. 3. Targeting : mostra la funzione a utenti specifici in base alle proprietà o alle caratteristiche di quell'utente.

Gli strumenti che aiutano a controllare i flag di funzionalità (booleani) e le configurazioni di funzionalità (stringhe, numeri, ecc.) Sono solitamente chiamati piattaforme di gestione delle funzionalità Esiste un ottimo servizio per la gestione delle funzionalità chiamato Configz.io


3

Dal punto di vista della codifica, un flag di funzionalità può essere semplice come ifun'istruzione che avvolge un nuovo pezzo di codice che stai scrivendo. Quando l' ifistruzione restituisce true (il flag della funzionalità è attivo), il nuovo codice verrà eseguito.

In un esempio del mondo reale di fornitura di software, l' ifaffermazione sopra descritta valuterebbe in modo diverso a seconda dell'ambiente in cui è in esecuzione il software. Ad esempio, se l'applicazione viene eseguita sul tuo server QA, il flag della funzione restituirà true e la nuova funzione sarà visto. Se viene eseguito sul server di produzione, il flag della funzionalità restituirà false e la funzionalità verrà nascosta.

In base alla mia esperienza personale durante la mia carriera, ho utilizzato i flag di funzionalità nei seguenti modi:

  1. Separare le distribuzioni di codice dal rilascio di funzionalità ai clienti. Questo è stato il mio primo utilizzo iniziale di flag di funzionalità nel nostro processo di sviluppo. Lo abbiamo utilizzato per rimuovere la dipendenza tra il nostro team di marketing e di prodotto e il team di ingegneri che stava facendo lo sviluppo e le versioni. I flag di funzionalità ci hanno permesso di distribuire il nostro codice settimane prima del lancio, mentre in precedenza stavamo distribuendo il codice la notte prima del rilascio!

  2. Test in produzione. Prima che usassimo i flag di funzionalità quando abbiamo rilasciato il nostro codice era un evento tutto o niente, tutti i nostri clienti hanno ottenuto la funzionalità o nessuno di loro l'ha ricevuta. Abbiamo utilizzato flag di funzionalità per consentirci di implementare una nuova funzionalità per una piccola percentuale di utenti alla volta. Questo ci ha permesso di raccogliere feedback e dati preziosi su una nuova funzionalità senza rischiare potenziali problemi per l'intera base di clienti.

  3. Abilitazione / disabilitazione di una funzionalità per ambiente nel ciclo di vita dello sviluppo. Lo abbiamo utilizzato ampiamente nello sviluppo per consentire un processo di distribuzione molto più fluido: abbiamo una pipeline CI / CD in cui l'uso dei flag di funzionalità è vitale.

  4. Creazione di un kill switch. Abbiamo racchiuso alcune funzionalità della nostra applicazione con un flag di funzionalità che ci consente di "eliminare" quella funzionalità in caso di problemi con l'applicazione in quel momento. Ad esempio, se ci troviamo sotto carico pesante, siamo in grado di disattivare alcune funzionalità non essenziali del sito Web per risolvere il problema.

Puoi leggere di più sui flag delle funzionalità qui.

Puoi aggiungere flag di funzionalità al tuo codice in diversi modi.

  1. È possibile creare la propria o utilizzare una libreria di flag di funzionalità di terze parti e aggiungere i dati dei flag di funzionalità in un file di configurazione che può essere incluso nel pacchetto di distribuzione.
  2. È possibile crearne uno personalizzato o utilizzare una libreria di flag di funzionalità di terze parti e aggiungere i dati dei flag di funzionalità in un file di configurazione che può essere caricato in fase di esecuzione.
  3. Puoi utilizzare un servizio di gestione dei flag di funzionalità basato su cloud per gestire tutte le esigenze dei flag di funzionalità per te.

Scrivere la tua libreria può sembrare una buona idea all'inizio e di solito può iniziare in questo modo. Tuttavia, potresti presto incorrere in problemi quando desideri implementare casi d'uso più avanzati di flag di funzionalità come la distribuzione a una percentuale di utenti o il targeting di gruppi di utenti specifici. Un altro problema con la creazione della propria implementazione del flag di funzionalità è che se si utilizzano più lingue sarà necessario implementare il codice più volte.

Il modo migliore e più semplice per utilizzare i flag di funzionalità è utilizzare un servizio di gestione dei flag di funzionalità online come Floodgate . In questo modo puoi sfruttare la piattaforma per tutto il sollevamento pesante che ti consente quindi di concentrarti sulla creazione della funzionalità per la tua applicazione.

Di seguito è riportato un esempio di come aggiungere un flag di funzionalità Floodgate a un'applicazione utilizzando .NET SDK.

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...
}

Se si lavora in un team di sviluppo e non si utilizzano flag di funzionalità e si verificano problemi nelle distribuzioni e nella gestione del codice all'interno del team. L'utilizzo dei flag di funzionalità può essere un ottimo modo per risolvere questi problemi. C'è anche un piacevole effetto collaterale dei flag di funzionalità che accelerano la velocità di sviluppo del tuo team.

Martin Fowler dà una molto approfondita write-up di lungometraggi bandiere qui , che vi consiglio di leggere.


2

La mia comprensione è che i flag di funzionalità ti aiutano a bloccare la funzionalità decidendo quali utenti ricevono determinate funzionalità.

Ad esempio, supponiamo che desideri che solo gli utenti beta vedano una nuova funzionalità. Dovresti "attivare" quella funzione per gli utenti beta e il resto dei tuoi utenti non la vedrebbe.

LDUser user = new LDUser("user@test.com");

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
 }

Sto testando i flag di funzionalità di LaunchDarkly per alcuni test JS A / B front-end - sembra funzionare bene. Puoi anche controllare questo sito per alternare funzionalità e librerie di flag di funzionalità .


1

I flag di funzionalità ti danno fondamentalmente la possibilità di attivare e disattivare una funzione senza apportare modifiche al codice o rilasciare una nuova versione. È una soluzione importante soprattutto per gli sviluppatori di applicazioni mobili poiché non hanno alcun controllo sugli utenti per aggiornare la loro applicazione a una nuova versione.

Esistono diverse società che offrono questo servizio agli sviluppatori di applicazioni mobili.


Diffidare di questi. Non è necessario integrare uno di questi servizi per creare un semplice interruttore che può essere utilizzato per nascondere più funzionalità dalla visibilità / integrazione PROD. Inoltre, non è necessariamente necessario farlo dal vivo, come in, l'attesa di una distribuzione non è un grosso problema quando una distribuzione PROD richiede solo pochi minuti (che dovresti ottimizzare per molti altri motivi).
Matt Kocaj

2
In aggiunta: ecco un confronto tra la caratteristica migliore corrente servizi bandiera: featureflagservices.io
SiGe

1

Nella mia azienda utilizziamo flag di funzionalità per ogni nuova funzionalità che introduciamo nella nostra app SaaS. Oltre ai vantaggi per le prestazioni, ci consente anche di implementare gradualmente nuove funzionalità, introducendo prima nuove funzionalità agli utenti esperti, ottenendo feedback da loro e improvvisando prima di poterlo distribuire a tutti gli utenti.

Ci consente inoltre di personalizzare l'offerta ai singoli utenti: gli utenti esperti vogliono tutte le funzionalità; gli utenti semplici potrebbero volere solo le cose di base e potrebbero essere confusi da tutte le potenti funzionalità complesse. Consente inoltre al nostro team di vendita di eseguire l'up-sell.

E ovviamente, come altri hanno sottolineato, se troviamo che una funzionalità sta causando un degrado delle prestazioni, possiamo semplicemente disattivare quella funzione (per tutti i client o per l'unico client che sta causando un problema).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.