Co to jest „flaga funkcji”?


115

Wysoka skalowalność wspomina tutaj flagi funkcji:

5 rzeczy toksycznych dla skalowalności , „5. Brak flag funkcji”

Czym dokładnie są flagi funkcji?


1
Jak podkreśla Maxim Vexler, ten post na Flickr jest jednym z kanonicznych, wczesnych artykułów na temat flag funkcji i wyjaśnia ich użycie i implementację w szczegółowym code.flickr.com/blog/2009/12/02/flipping-out
Noah Sussman

Odpowiedzi:


104

`` Flaga funkcji '' (lub Przełącznik funkcji ) to możliwość łatwego włączania / wyłączania funkcji (podsekcji) aplikacji w:

  • być może poprzez ponowne wdrożenie lub
  • jakaś wewnętrzna strona, na której można przełączać strony / funkcje na żywo.

Wydaje mi się, że przykładem jest to, że przydatne jest posiadanie kontroli, aby nieco zmniejszyć zestaw funkcji, jeśli trzeba, powiedzmy, zmniejszyć zapytania db, jeśli obciążenie jest zbyt duże.

Jest jednak mnóstwo innych powodów , dla których warto to wykorzystać - jednym z głównych jest włączenie ciągłego dostarczania : wprowadzanie rzeczy do produkcji / na żywo, ale wyłączanie / przełączanie funkcji, dopóki nie zostanie ukończona. Często używamy czegoś, co nazywamy „plikiem cookie dla programistów”, aby pokazać niedokończone funkcje tylko zespołowi programistów. W ten sposób możemy przetestować częściowo ukończoną pracę w środowisku produkcyjnym (o tak! Czy jest lepsza integracja?) Na wielu wydaniach / wdrożeniach, zanim ją „odblokujemy” (zakończymy) i stanie się ona widoczna dla publiczności.

Oto prosty pakiet, który pomoże ci to zrobić na ziemi ASP.NET MVC: https://github.com/cottsak/DevCookie (pełne ujawnienie: jestem autorem)

Fowler ma również znacznie dłuższy artykuł niż ten, do którego link znajduje się powyżej, z dużo większą ilością szczegółów .

Ten post (również na stronie Fowlera) wyjaśnia różne typy strategii przełączania . DevCookie obsługuje strategię opartą na mainline / trunk i jest w artykule nazywane „ przełącznikiem wydania ”.

Odpowiedź Adila podkreśla, że ​​istnieje wiele terminów i powodów, dla których możesz potrzebować części tej infrastruktury. Pamiętaj, że możesz potrzebować tylko niektórych z tych rzeczy. Na przykład mogę chcieć tylko włączyć prosty i sprawny przepływ pracy przy wdrażaniu / dostarczaniu, więc wystarczy prosta infrastruktura. Jeśli następnie zdecydujesz się przejść do pełnego eksperymentu #leanstartup z A / B, testami kohortowymi i takimi rzeczami, jak kontrolowane wdrażanie, powinieneś rozważyć narzędzie analityczne (np. Heap ), które ułatwia te metodologie rozwoju oparte na danych jako odrębne rozwiązanie . Infrastruktura przełączająca, która wykonuje wszystkie powyższe czynności, doprowadzi do rozdęcia i niepotrzebnej złożoności.

Jeśli dotarłeś tak daleko, może zechcesz przejrzeć inne moje przemyślenia na temat Mainline Development, przełączania funkcji i innych głupich pomysłów, takich jak TEST, QA, SIT, STAND, CROUCH .


1
Co zabawne, zawsze wyobrażałem sobie to samo w wszystkim, co budowałem. To może być tak skuteczna funkcja.
GurdeepS

7
Często takie rzeczy wydają się oczywiste. Okazuje się, że ktoś zawsze wymyślił na to nazwę.
Matt Kocaj

27

Flaga funkcji to technika wyłączania niektórych funkcji aplikacji poprzez konfigurację bez wdrażania nowego kodu.

Flagi funkcji odgrywają kluczową rolę w schemacie CI, w którym funkcje są stale wdrażane, ale niekoniecznie „wypuszczane” do produkcji.

Więcej informacji tutaj:

-- EDYTOWAĆ:

Implementacja flag funkcji w języku Java .


3
Jest to dobrze opisane w sekcji „Ciągłe wdrażanie” i jest prawie wymogiem dla rozwoju „głównego nurtu”. Zamiast rozgałęziania się w SCM dla funkcji, funkcje są włączane lub wyłączane, co pozwala na wydanie kodu z funkcjami, które nie powinny być jeszcze włączone.
Chip McCormick,

Tylko uwaga na temat „poprzez konfigurację, bez wdrażania nowego kodu”: wydaje się, że instrukcja oznacza zmianę konfiguracji, a następnie ponowne wdrożenie aplikacji (nawet jeśli kod się nie zmienił). Może to nadal trwać od sekund do minut, w zależności od potoku wdrażania. Flaga funkcji lub przełącznik funkcji mogą nie być utrwalane w konfiguracji. Może to być gdzieś w sklepie / bazie danych i zachowywać się „na żywo” - tj. Przechodząc do jakiejś strony administratora, na której naciskasz przycisk, aby natychmiast włączyć pewne zachowanie w całej witrynie (bez wdrażania, bez zmiany konfiguracji).
Matt Kocaj

1
Pracuję dla ConfigCat.com i sposób, w jaki to widzę, „zmiana konfiguracji bez wdrażania nowego kodu” oznacza, że ​​konfiguracje są obsługiwane przez usługę flag funkcji, a aplikacja uzyskuje dostęp do wartości, ściągając ten plik konfiguracyjny. W ten sposób możesz mieć pewność, że zmiana wartości nie wymaga żadnego ponownego wdrażania aplikacji. Poza tym pozwala tworzyć reguły, dzięki czemu możesz podawać wartość jednemu użytkownikowi, a innemu drugiemu. fajne jest to, że ocena flag funkcji jest po stronie klienta i cała ta logika działa bez konieczności przesyłania jakichkolwiek danych z powrotem do usługi flag funkcji.
sige


19

Flagi funkcji, przełączniki funkcji, eksperymenty i kontrolowane wdrażanie to synonimy prostego, ale potężnego pomysłu: oddzielne wdrażanie kodu od wdrażania funkcji. Mówiąc najprościej, jest to możliwość przeniesienia zatwierdzeń funkcji do produkcji, jednocześnie wybierając, kto z Twoich klientów - jeśli w ogóle ktoś - zobaczy tę funkcję.

Zostały spopularyzowane częściowo przez Gatekeepera Facebooka . LiX LinkedIn to kolejny dobry przykład.

Przyjęcie tego prostego pomysłu stanowi podstawę wielu najlepszych praktyk, w tym:

Ciągłe wdrażanie / dostarczanie - wiele kodów wypychanych do produkcji w ciągu jednego dnia.

Trunk / Mainline Development - gałęzie funkcji powinny być tworzone tylko dla żądań ściągnięcia, a nie dla długotrwałego rozwoju funkcji.

Nigdy więcej pociągów zwalniających, które grzęzną.

QA / Perf Testing in Production - prawdziwa kontrola jakości i testowanie wydajności odbywa się na infrastrukturze produkcyjnej z ruchem produkcyjnym. Nie trać czasu na tworzenie rozbudowanych laboratoriów wydajnościowych i środowisk przejściowych.

Eksperymentowanie - dowiedz się, w jaki sposób nowa funkcja wpływa na Twoje wskaźniki KPI.

Unikanie poprawek lub wycofywania kodu w przypadku wystąpienia problemów - zarówno poprawki, jak i wycofywanie kodu są stresujące, zajmują dużo czasu i prowadzą do większej liczby problemów niż to konieczne. Zamiast tego wyłącz tę funkcję lub zmniejsz ją.

Inni wspominali o bibliotekach open source. Dobrym przykładem pełnego rozwiązania - takiego jak Gatekeeper i LiX - jest Split . Pracuję dla Splitu.


Myślę, że ważne jest, aby nie łączyć flag funkcji wyłącznie w celu obsługi eksperymentów CI w porównaniu z AB / kohortą / Lean - cele są różne. Na przykład użycie przełącznika funkcji, aby wprowadzić coś do Prod w celu zapewnienia jakości / akceptacji, może być prostym narzędziem wspomagającym CI / CD iw takim przypadku Split może być przesadą. Z drugiej strony, jeśli chcesz przeprowadzić eksperymenty lean lub testy A / B, prawdopodobnie potrzebujesz dobrego narzędzia analitycznego, takiego jak Heap z wbudowanym dodatkowym oprzyrządowaniem i raportowaniem telemetrycznym. Nie podoba mi się pomysł połączenia tych dwóch celów - wygląda na to, że ty może bardzo łatwo wzdęć.
Matt Kocaj

14

Jest tu wiele świetnych odpowiedzi, a wszystkie dotyczą ważnej, podstawowej definicji spopularyzowanej w poście Martina Fowlera :

Są to fragmenty kodu, które „[pozwalają] zespołom modyfikować zachowanie systemu bez zmiany kodu”.

Więc historycznie myśleliśmy o nich jako reprezentowane przez pseudokod:

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

To całkowicie dokładny sposób myślenia o tym, a zarówno Matt, jak i Adil ładnie go rozwijają, korzystając z różnych taktycznych przypadków użycia flagi funkcji.

Ale chciałbym zaproponować poprawioną definicję, która odzwierciedla, jak rzeczywistość ewoluowała w ciągu sześciu lat i zmieniła się od czasu, gdy dotnetdev zadał pierwotne pytanie. Pracuję dla Rollout.io , platformy flagowej , więc miałem miejsce w pierwszym rzędzie na tę ewolucję.

Mówiąc najprościej, flagi funkcji nie są już tylko sposobem włączania i wyłączania niektórych funkcji w aplikacji. To tak, jakby odpowiedzieć „co to jest pozycja faktury”, mówiąc „to opis i kwota w walucie”. To prawda, ale nie prowadzi to do szerszego punktu samej faktury.

Flagi funkcji to taktyczne fragmenty nadrzędnego rozwiązania strategicznego w nowoczesnym oprogramowaniu. Są to środki, dzięki którym odraczasz ważną logikę decyzyjną w swoim kodzie do czasu wykonania, kiedy masz więcej informacji. I, co być może najważniejsze, nie występują już w izolacji, z pojedynczym sprawdzeniem, czy numer wersji jest większy niż 2,7, czy nie; organizacje, które ich używają, zazwyczaj uwzględniają je w ramach kompleksowego, ogólnosystemowego podejścia do produktu.

Jak wspominali inni, Facebook i LinkedIn są pionierami w tym zakresie, ale w 2018 roku robi to całe mnóstwo organizacji. Odkładają pytania związane z logiką decyzyjną o środowisko wykonawcze jako część strategii rozwoju, strategii operacyjnej (lub strategii DevOps, jeśli chcesz) i strategii produktu. Oto przykłady takich pytań.

  • Kto powinien zobaczyć nowy ekran administratora, który wprowadzamy i kiedy?
  • Jaki poziom członkostwa jest wymagany do odblokowania tego pisanka?
  • Kiedy powinniśmy przejść do nowej bazy danych?
  • Czy powinniśmy umieścić zdjęcie geparda lub orła na przycisku kasy, aby zwiększyć konwersję?

Aby mieć aplikację, która odracza znaczną liczbę takich decyzji do czasu wykonania, nie możesz wrzucać flag funkcji do swojej aplikacji w sposób ad-hoc lub pogrzebać się w długu technicznym. W dzisiejszych czasach potrzebujesz kompleksowej strategii zarządzania flagami funkcji, która obejmuje kilka różnych składników.

  • Punkty przełączania służą do przełączania zachowania nowych funkcji.
  • Wiele punktów przełączania łączy się, tworząc router przełączający . Router z przełącznikiem określa stan funkcji.
  • Kontekst przełączany zapewnia routerowi przełączającemu niezbędne informacje kontekstowe (np. Określonego użytkownika).
  • Konfiguracja przełączana udostępnia informacje routera przełączającego o środowisku.

A więc ostatecznie, czym są flagi funkcji?

Cóż, są ważną częścią szerszej strategii posiadania aplikacji, którą można dostosować zarówno do potrzeb technicznych, jak i rynkowych.


9

Flaga funkcji (znana również jako przerzucanie funkcji lub przełączanie funkcji ) to przełącznik służący do włączania lub wyłączania potencjalnie kosztownej funkcji w razie potrzeby (np. Gdy witryna jest obciążana nieoczekiwanym ruchem). To da ci trochę czasu, zanim zwiększysz skalę lub dopóki skok obciążenia nie zniknie.

Oto przykład z dokumentacji SWIG .


6
Jest to jedno użycie flag funkcji, tak, ale najważniejszą koncepcją, którą należy zrozumieć, jest to, że oddzielają one wydanie funkcji od wdrażania kodu, dzięki czemu można udostępniać funkcje w dowolnym momencie, a nie zawsze, gdy kod zostanie wysłany. To podstawa ciągłej integracji.
Eric Elliott

6

W mojej firmie mieliśmy na to własne rozwiązanie. Stworzyliśmy usługę udostępniającą do pobrania plik config ( .json) dla każdej aplikacji. W tej konfiguracji zapisaliśmy flagi funkcji. Na podstawie tej konfiguracji aplikacja może wyświetlać lub ukrywać bieżącą funkcję. (Na przykład pokaż lub ukryj element menu na pasku bocznym).

Stworzyliśmy również wewnętrzną stronę administracyjną, na której możemy skonfigurować flagi funkcji. Przez jakiś czas działało całkiem nieźle, ale później chcielibyśmy przeprowadzić kierowanie na użytkowników i testy A / B. Aby rozwijać się samodzielnie Wydawało się to zbyt trudne, więc wybraliśmy rozwiązanie innej firmy. Jak już wspomniano, istnieje na to wiele rozwiązań.

Wybraliśmy ConfigCat, ponieważ jednocześnie obsługuje niestandardowe grupy docelowe i procentowe wdrożenie. Możesz sprawdzić obsługiwane pakiety SDK Open Source na github .


4

Flagi funkcji (lub przełączniki funkcji) umożliwiają zdalne włączanie funkcji w aplikacji bez konieczności ponownego kompilowania / ponownego wdrażania aplikacji. Dzięki temu możesz wdrożyć kod w środowisku produkcyjnym, ale nie zwolnij funkcji, dopóki nie będziesz gotowy. Możesz kierować reklamy do określonych użytkowników, więc możesz udostępnić użytkownikom beta nową funkcję do przetestowania.

W naszej firmie korzystaliśmy wcześniej z LaunchDarkly i innych sugestii od FeatureFlags.io . Próbowaliśmy również użyć zdalnej konfiguracji Firebase, aby spróbować to zadziałać, ale okazało się, że nie było to odpowiednie do tego celu.

Skończyło się na opracowaniu naszej własnej wersji o nazwie Bullet Train , którą udostępniliśmy jako open source. Łączy w sobie zarówno flagi funkcji / przełączniki, jak i zdalną konfigurację.


4

Flagi funkcji są używane do kilku celów. Ogólną ideą jest delegowanie kontroli nad tym, który użytkownik widzi daną funkcję, do jakiegoś zdalnego pulpitu nawigacyjnego lub zaplecza.

Gdy funkcja zostanie oznaczona w kodzie, możesz teraz skorzystać z kilku metod, aby określić, który użytkownik widzi ją w Twojej aplikacji: 1. Włącz / Wyłącz - pokaż funkcję wszystkim użytkownikom lub żadnemu z nich. 2. Stopniowe udostępnianie - pokazuj tę funkcję tylko procentowi użytkowników, a następnie stopniowo wyświetlaj ją wszystkim użytkownikom. 3. Kierowanie - pokaż funkcję określonym użytkownikom na podstawie właściwości lub cech tego użytkownika.

Narzędzia, które pomagają w kontrolowaniu flag funkcji (wartości logiczne) i konfiguracji funkcji (łańcuchy, liczby itp.) Są zwykle nazywane platformami zarządzania funkcjami. Istnieje świetna usługa do zarządzania funkcjami o nazwie Configz.io


3

Z punktu widzenia kodowania flaga funkcji może być tak prosta, jak ifinstrukcja, która otacza nowy fragment kodu, który piszesz. Kiedy ifinstrukcja uzyska wartość true (flaga funkcji jest włączona), zostanie wykonany nowy kod.

W rzeczywistym przykładzie dostarczania oprogramowania, powyższe ifstwierdzenie będzie oceniane inaczej w zależności od środowiska, w którym oprogramowanie jest uruchomione. Na przykład, jeśli aplikacja jest wykonywana na serwerze kontroli jakości, flaga funkcji zwróci wartość „prawda”, a nowa funkcja będzie widziany. Jeśli jest wykonywany na serwerze produkcyjnym, flaga funkcji zwróci wartość false i funkcja zostanie ukryta.

Z własnego doświadczenia podczas mojej kariery korzystałem z flag funkcji w następujący sposób:

  1. Oddzielenie wdrożeń kodu od udostępniania funkcji klientom. To było moje pierwsze pierwsze użycie flag funkcji w naszym procesie rozwoju. Użyliśmy go do usunięcia zależności między naszym zespołem ds. Marketingu i produktu a zespołem inżynierów, który zajmował się rozwojem i wydaniami. Flagi funkcji pozwoliły nam wdrożyć nasz kod na tygodnie przed premierą, podczas gdy poprzednio wdrażaliśmy kod w noc przed wydaniem!

  2. Testowanie w produkcji. Zanim użyliśmy flag funkcji, kiedy publikowaliśmy nasz kod, było to zdarzenie typu wszystko albo nic, albo wszyscy nasi klienci otrzymali tę funkcję, albo żaden z nich nie. Użyliśmy flag funkcji, aby umożliwić nam wprowadzenie nowej funkcji dla niewielkiego odsetka użytkowników na raz. Pozwoliło nam to zebrać cenne opinie i dane na temat nowej funkcji bez ryzyka jakichkolwiek potencjalnych problemów dla całej bazy klientów.

  3. Włączanie / wyłączanie funkcji dla każdego środowiska w cyklu rozwojowym. Używaliśmy tego szeroko w programowaniu, aby umożliwić znacznie płynniejszy proces wdrażania - mamy potok ciągłej integracji / ciągłego wdrażania, w którym użycie flag funkcji jest kluczowe.

  4. Tworzenie wyłącznika awaryjnego. Niektóre funkcje naszej aplikacji otuliliśmy flagą funkcji, która pozwala nam „zabić” tę funkcję w przypadku jakichkolwiek problemów z aplikacją w tym czasie. Na przykład, jeśli znajdziemy się pod dużym obciążeniem, jesteśmy w stanie wyłączyć niektóre nieistotne funkcje witryny, aby pomóc w rozwiązaniu problemu.

Możesz przeczytać więcej o flagach funkcji tutaj.

Możesz dodawać flagi funkcji do swojego kodu na wiele sposobów.

  1. Możesz utworzyć własną bibliotekę flag funkcji lub skorzystać z biblioteki flag funkcji innej firmy i dodać dane flag funkcji do pliku konfiguracyjnego, który można dołączyć do pakietu wdrożeniowego.
  2. Możesz utworzyć własną lub skorzystać z biblioteki flag funkcji innej firmy i dodać dane flag funkcji do pliku konfiguracyjnego, który można załadować w czasie wykonywania.
  3. Możesz użyć opartej na chmurze usługi zarządzania flagami funkcji, aby zarządzać wszystkimi potrzebami związanymi z flagami funkcji.

Na początku napisanie własnej biblioteki może wydawać się dobrym pomysłem i zwykle można zacząć w ten sposób. Jednak wkrótce możesz napotkać problemy, gdy chcesz zaimplementować bardziej zaawansowane przypadki użycia flag funkcji, takie jak wprowadzenie do procentu użytkowników lub kierowanie na określone grupy użytkowników. Innym problemem związanym z tworzeniem własnej implementacji flag funkcji jest to, że jeśli używasz wielu języków, będziesz musiał wielokrotnie implementować kod.

Najlepszym i najłatwiejszym sposobem korzystania z flag funkcji jest skorzystanie z internetowej usługi zarządzania flagami funkcji, takiej jak Floodgate . W ten sposób możesz wykorzystać platformę do całego podnoszenia ciężarów, co pozwala skoncentrować się na tworzeniu funkcji dla swojej aplikacji.

Oto przykład dodawania flagi funkcji Floodgate do aplikacji przy użyciu zestawu .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...
}

Jeśli pracujesz w zespole programistów i nie używasz flag funkcji i występują problemy z wdrożeniami i zarządzaniem kodem w zespole. Korzystanie z flag funkcji może być świetnym sposobem rozwiązania tych problemów. Jest też fajny efekt uboczny flag funkcji, które przyspieszają rozwój twoich zespołów.

Martin Fowler podaje tutaj bardzo dogłębny opis flag funkcji , z którymi polecam się zapoznać.


2

Rozumiem, że flagi funkcji pomagają w bramkowaniu funkcjonalności, decydując, którzy użytkownicy otrzymają określone funkcje.

Załóżmy na przykład, że chcesz, aby tylko użytkownicy wersji beta widzieli nową funkcję. Możesz „włączyć” tę funkcję dla użytkowników wersji beta, a pozostali użytkownicy jej nie zobaczą.

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
 }

Mam testowanie flagi fabularnych LaunchDarkly w niektórych testach front-end JS A / B - wydaje się działać dobrze. Możesz również sprawdzić tę witrynę, aby znaleźć przełączniki funkcji i biblioteki flag funkcji .


1

Feature Flags w zasadzie daje możliwość włączania i wyłączania funkcji bez dokonywania jakichkolwiek zmian w kodzie lub wydawania nowej wersji. Jest to ważne rozwiązanie, szczególnie dla twórców aplikacji mobilnych, ponieważ nie mają oni żadnej kontroli nad użytkownikami, którzy aktualizują ich aplikację do nowej wersji.

Istnieje kilka firm oferujących tę usługę programistom aplikacji mobilnych.


Uważaj na to. Nie musisz integrować jednej z tych usług, aby utworzyć prosty przełącznik, którego można użyć do ukrycia wielu funkcji przed widocznością / integracją PROD. Również nie koniecznie trzeba to zrobić na żywo - jak w, czekając na wdrożenie nie jest wielka sprawa, gdy rozmieszczenie PROD jest zaledwie kilka minut (co powinno być optymalizacja dla wielu wielu innych powodów).
Matt Kocaj

2
Jako dodatek tutaj jest porównanie najlepszych usług flag prąd cecha: featureflagservices.io
sige

1

W mojej firmie używamy flag funkcji dla każdej nowej funkcji, którą wprowadzamy w naszej aplikacji SaaS. Oprócz korzyści płynących z wydajności pozwala nam również stopniowo wprowadzać nowe funkcje - najpierw wprowadzając nowe funkcje dla zaawansowanych użytkowników, uzyskując od nich opinie i improwizując, zanim będziemy mogli udostępnić je wszystkim użytkownikom.

Pozwala nam również dostosować ofertę do indywidualnych użytkowników - zaawansowani użytkownicy chcą wszystkich funkcji; prości użytkownicy mogą chcieć tylko podstawowych rzeczy i mogą być zdezorientowani przez wszystkie potężne, złożone funkcje. Pozwala również naszemu zespołowi sprzedaży na sprzedaż wyższą.

I oczywiście, jak zauważyli inni, jeśli stwierdzimy, że funkcja powoduje pogorszenie wydajności, możemy po prostu ją wyłączyć (dla wszystkich klientów lub dla jednego klienta, który powoduje problem).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.