Hva er et feature flag?
Et feature flag er en bryter i koden som slår en funksjon på eller av uten at man trenger å slippe en ny versjon. Det brukes til gradvis utrulling, til testing med utvalgte kunder og som nødbryter hvis noe går galt. Flagget skiller produksjonssetting fra lansering, men ubrukte flagg blir teknisk gjeld hvis de aldri ryddes bort.
Feature flags er et av knepene som skiller et modent utviklingsteam fra et som slipper nye funksjoner og krysser fingrene. Begrepet høres teknisk ut, men ideen er hverdagslig: en bryter. Her går vi gjennom hva et feature flag er, hva det brukes til, og hvorfor det er verdt å kjenne til også for deg som kunde.
Definisjonen
Et feature flag, noen ganger kalt feature toggle, er en bryter som bygges inn i koden, og som slår en funksjon på eller av uten at en ny versjon må slippes. Funksjonen er på plass i programvaren, men flagget avgjør om den er synlig og aktiv eller ikke.
Det høres enkelt ut, og det er det. Men effekten er stor: Det bryter koblingen mellom at koden finnes, og at funksjonen er slått på. I stedet for at en ny funksjon uunngåelig går live i samme sekund som den slippes, kan teamet bestemme nøyaktig når, for hvem og hvor raskt den skal rulles ut, og slå den av like enkelt.
De tre hovedbruksområdene
Feature flags brukes først og fremst til tre ting, og alle tre reduserer risiko.
- Gradvis utrulling. I stedet for å slå på en ny funksjon for alle på én gang slår man den først på for en liten andel av brukerne. Ser alt bra ut, utvides den trinnvis. Dukker det opp problemer, er bare en brøkdel berørt, og funksjonen kan slås av før den når flere.
- Testing med utvalgte kunder. En funksjon kan slås på bare for en pilotgruppe (et par utvalgte kunder eller egne ansatte), som får prøve den i produksjon og gi tilbakemeldinger før den åpnes for alle. Man tester under reelle forhold, men i kontrollert omfang.
- Nødbryter ved feil. Viser det seg at en nylig sluppet funksjon skaper trøbbel, kan den slås av umiddelbart med ett klikk. Man slipper å lage en rettelse i all hast og legge ut ny kode under press. Funksjonen blir bare slått av til feilen er undersøkt i ro og mak.
Et konkret scenario
La oss si at en betalingstjeneste skal legge til en ny betalingsmåte. Koden produksjonssettes, men bak et avslått feature flag, så ingen brukere ser noe ennå. Teamet slår det først på for sine egne ansatte, som tester hele flyten i produksjon. Alt fungerer.
Deretter slås det på for fem prosent av kundene. Statistikken ser bra ut, og andelen økes trinnvis til alle. Hadde noe gått galt underveis, hadde flagget blitt slått av på sekundet, uten panikk og uten ny versjon. Samme funksjon, men rullet ut med kontroll i hvert steg i stedet for i ett stort og ugjenkallelig hopp.
Forskjellen på å produksjonssette og å lansere
Scenarioet viser kanskje det viktigste poenget: Feature flags skiller produksjonssetting fra lansering.
Å produksjonssette er å legge ut den nye koden i produksjonsmiljøet. Å lansere er å gjøre funksjonen tilgjengelig for brukerne. Uten flagg er det én og samme hendelse: koden ut, funksjonen live, i samme øyeblikk, ofte sent på kvelden for å begrense skaden hvis noe går galt. Med flagg kan koden produksjonssettes når som helst med flagget slått av, og funksjonen kan slås på senere, på et valgt tidspunkt. Det gjør hver endring roligere og mindre risikabel, noe som er en stor del av verdien.
Vedlikeholdet: Rydd bort gamle flagg
Det finnes en bakside man bør kjenne til. Hvert feature flag er en forgrening i koden, en «hvis flagget er på, gjør slik, ellers slik». Så lenge flagget trengs, er det bra. Men når en funksjon først er fullt utrullet til alle, har flagget gjort jobben sin, og blir det likevel liggende, forsøpler det koden.
Mange glemte flagg gjør koden vanskeligere å lese og lettere å gjøre feil i. Det er en form for teknisk gjeld som bygger seg opp i det stille. Et ansvarlig team rydder derfor bort flagg som har spilt ut sin rolle slik at bare de aktive blir igjen. Det er ikke noe å bekymre seg for, men det er noe av det som skiller disiplinert utvikling fra slurv. Vil dere ha en nøytral vurdering av hvordan systemet deres vedlikeholdes på slike punkter, ta kontakt.
Ofte stilte spørsmål
Hva er et feature flag, enkelt forklart?
Det er en innebygd bryter som styrer om en bestemt funksjon i programvaren er på eller av. I stedet for at en ny funksjon aktiveres for alle i samme øyeblikk som den slippes, kan man med et flagg slå den på for hvem man vil, når man vil, uten å røre koden på nytt. Funksjonen ligger der allerede; flagget avgjør bare om den er slått på.
Hva brukes feature flags til?
Først og fremst tre ting. Gradvis utrulling: En ny funksjon slås på for noen få prosent av brukerne først og utvides hvis alt ser bra ut. Testing med utvalgte kunder: En funksjon slås bare på for en pilotgruppe. Og som nødbryter: Går noe galt, kan funksjonen slås av med en gang uten at man må få ut en rettelse i all hast. Alt skjer ved at man slår om en bryter, ikke ved at man legger ut en ny versjon.
Hva er forskjellen på produksjonssetting og lansering?
Produksjonssetting er å legge ut ny kode i produksjonsmiljøet. Lansering er å gjøre funksjonen tilgjengelig for brukerne. Uten feature flags skjer begge deler samtidig. Med flagg kan man produksjonssette koden med funksjonen slått av og slå den på senere, for eksempel på et bestemt tidspunkt eller etter en test. Stresset forsvinner når koden og den synlige funksjonen ikke lenger må komme i nøyaktig samme øyeblikk.
Kan feature flags skape problemer?
Ja, hvis de ikke vedlikeholdes. Hvert flagg er en forgrening i koden, og et flagg som blir liggende lenge etter at funksjonen er fullt utrullet, gjør koden vanskeligere å lese og mer skjør. Mange glemte flagg blir en form for teknisk gjeld. Løsningen er enkel, men krever disiplin: Rydd bort flagg som har gjort jobben sin slik at bare de som virkelig trengs, blir igjen.
Er feature flags noe jeg som kunde trenger å bry meg om?
Ikke i detalj, men det er nyttig å kjenne til. At et team bruker feature flags, er som regel et godt tegn. Det betyr at teamet kan slippe nye funksjoner forsiktig og raskt slå av noe som skaper trøbbel, noe som senker risikoen ved hver endring. Det du kan spørre om, er hvordan nye funksjoner rulles ut, og hvor raskt en funksjon som ikke fungerer, kan slås av om nødvendig.