Feature-Flags

So stellt man Funktionen schrittweise mit Feature-Flags bereit

Ian Buchanan Ian Buchanan

Zusammenfassung: Feature-Flagging (auch bekannt als Feature-Toggling) ist eine Softwareentwicklungstechnik, die ausgewählte Funktionen während der Laufzeit ein- und ausschaltet, ohne neuen Code bereitzustellen. Dies ermöglicht Teams, ohne die Übertragung zusätzlichen Codes Änderungen vorzunehmen, und während des gesamten Lebenszyklus kontrollierter mit Funktionen zu experimentieren.

Wenn du während der Entwicklung kontinuierlich Funktionen in deine Anwendung integrieren möchtest, solltest du Feature-Flags in Betracht ziehen. Schließlich möchtest du möglicherweise Funktionen umschalten und ausblenden, deaktivieren oder aktivieren. Vielleicht möchtest du den Benutzern auch verschiedene Funktionsvarianten aufzeigen, um herauszufinden, welche besser ist. Feature-Flags, auch bekannt als "Toggles", "Bits", "Flossen" oder "Switches", ermöglichen dies und mehr.

Was sind Feature-Flags?

Feature-Flags (auch allgemein bekannt als Feature-Toggles) ist eine Softwareentwicklungstechnik, die ausgewählte Funktionen während der Laufzeit ein- und ausschaltet, ohne neuen Code bereitzustellen. So können Teams Änderungen vornehmen, ohne zusätzlichen Code zu übertragen, und während des gesamten Lebenszyklus kontrollierter mit Funktionen experimentieren. Daher ermöglichen Feature-Flags viele neuartige Workflows, die für einen agilen Managementstil und CI/CD-Umgebungen unglaublich nützlich sind.

Während der Entwicklung verpacken Softwareentwickler die gewünschten Codepfade in einem Feature-Flag. Hier ist ein Beispiel für ein in Javascript geschriebenes einfaches Feature-Flag:

  if(featureFlags[‘new-cool-feature’] == true){
renderNewCoolFeature();
}

Dieser Code zeigt eine einfache Anweisung, die überprüft, ob ein "neues cooles Feature" aktiviert ist. Selbst mit erweiterten Frameworks und Tools, die helfen, Flag-Daten oder die Einführung und das Entfernen des neuen Logikpfads zu verwalten, sind Feature-Flags im Wesentlichen nur "Wenn"-Anweisungen. Daher haben alle Synonyme diesen binären Schalter gemeinsam.

Wenn dieser Code für die Auslieferung an die Produktion bereit ist, wird er wie gewohnt bereitgestellt. Er wird jedoch in der Produktion inaktiv sein, bis das Feature-Flag explizit aktiviert ist. Flags können einer Untergruppe von Benutzern zugewiesen werden, sodass ein zielgerichtetes Verhalten ermöglicht wird.

Vorteile des Feature-Flagging

Diagramm zur Hervorhebung der Feature-Flag-orientierten Entwicklung

Auf einer grundlegenden Ebene ermöglichen Feature-Flags, Code in einem ruhenden Zustand zu committen und für die Produktion bereitzustellen, um ihn dann später zu aktivieren. Dies gibt Teams mehr Kontrolle über die Benutzererfahrung des Endprodukts. Entwicklerteams können wählen, wann an welche Benutzer neuer Code geliefert wird.

Validierung der Feature-Funktionalität
Entwickler können Feature-Flags nutzen, um "Soft Rollouts" neuer Produktfunktionen durchzuführen. Neue Funktionen können durch die sofortige Integration von Feature-Toggles als Teil des erwarteten Release erstellt werden. Das Feature-Flag kann standardmäßig deaktiviert werden, sodass der Code nach dem Deployment während der Produktion inaktiv bleibt und die neue Funktion deaktiviert wird, bis der Feature-Toggle explizit aktiviert wird. Die Teams wählen dann, wann das Feature-Flag eingeschaltet werden soll, das den Code aktiviert, sodass Teams in der Qualitätssicherung sicherstellen können, dass er sich wie erwartet verhält. Wenn das Team während dieses Vorgangs ein Problem entdeckt, kann es das Feature-Flag sofort wieder ausschalten, um den neuen Code zu deaktivieren und die Gefahr zu minimieren, dass Benutzer auf Probleme treffen.

Risikominimierung
Aufbauend auf der oben genannten Idee der Soft-Rollouts können fleißige Teams Feature-Flags in Verbindung mit Systemüberwachung und Metriken als Reaktion auf beobachtbare zeitweilig auftretende Probleme nutzen. Wenn beispielsweise eine Anwendung einen Anstieg des Datenverkehrs verzeichnet und das Überwachungssystem einen Anstieg der Probleme meldet, kann das Team Feature-Flags verwenden, um schlecht funktionierende Funktionen zu deaktivieren.

Ändern des Systemverhaltens ohne Störungen
Feature-Flags können für komplizierte Code-Integrations- und Deployment-Szenarien verwendet werden. Es kann schwierig sein, komplizierte neue Funktionen oder sensible Refactoring-Aufgaben in den Hauptproduktions-Branch eines Repositorys zu integrieren. Dies wird noch komplizierter, wenn mehrere Entwickler an überlappenden Teilen der Codebasis arbeiten.

Mit Feature-Flags lassen sich neue Änderungen isolieren, während bekannter, stabiler Code erhalten bleibt. Entwickler können so lang laufende Feature-Branches vermeiden, indem sie häufig in den Haupt-Branch eines Repositorys hinter dem Feature-Toggle committen. Wenn der neue Code fertig ist, sind keine Unterbrechungen erforderlich, um ihn zu mergen und bereitzustellen. Das Team kann das Feature-Flag umschalten, um das neue System zu aktivieren.

Anwendungsfälle für Feature-Flags

Feature-Flags bieten emsigen Teams eine Vielzahl kreativer Anwendungsfälle. In den folgenden Beispielen zeigen wir dir einige beliebte Anwendungen von Feature-Flags in einer agilen Umgebung.

Produkttests
Feature-Flags können verwendet werden, um nach und nach neue Produktfunktionen zu veröffentlichen. Nicht immer ist von vornherein klar, ob eine vorgeschlagene neue Funktion von den Benutzern angenommen wird und die Kapitalrendite wert ist. Teams können ein neues Produkt-Feature oder ein Teil-Feature in einem Feature-Flag veröffentlichen und es für einen kleinen Benutzerkreis bereitstellen, um Feedback zu erhalten. Dieser Benutzerkreis kann beispielsweise aus mitteilungsfreudigen Power-Usern bestehen, die gerne an Beta-Tests teilnehmen und ihre Meinung dazu äußern. Wenn sich die neue Produktidee als Hit erweist, kann das Entwicklerteam das Feature-Flag dann für eine größere Benutzerbasis veröffentlichen. Wenn sich stattdessen die neue Produktidee als Flop herausstellt, kann das Entwicklerteam das Feature-Flag einfach deaktivieren und später aus der Codebasis entfernen.

Durchführung von Experimenten
Experimente oder A/B-Tests sind ein Beispiel für primäre Feature-Flags. In ihrer einfachsten Form fungieren Feature-Flags als Umschalter des Status "Ein" und "Aus" für ein Feature. Erweiterte Feature-Flags verwenden mehrere Flags gleichzeitig, um verschiedene Erfahrungen für Benutzergruppen zu aktivieren. Stelle dir beispielsweise vor, du teilst deine Benutzerbasis in drei Teile. Jedes Drittel erhält sein eigenes Flag und seine dementsprechend einzigartige Benutzererfahrung. Hierduch kannst du die Leistung dieser drei Flags im Vergleich messen, um zu bestimmen, welches du als finale Version committen möchtest.

Migrationen
Es gibt Zeiten, in denen eine Anwendung eine Datenmigration benötigt, die abhängige Änderungen des Anwendungscodes erfordert. Diese Szenarien sind sensible mehrphasige Deployment-Tasks. Ein Datenbankfeld kann geändert, entfernt oder in einer Anwendungsdatenbank hinzugefügt werden. Wenn der Anwendungscode nicht für diese Datenbankänderung vorbereitet ist, führt dies zu Fehlern und Ausfällen. In diesem Fall ist ein koordiniertes Deployment der Datenbankänderungen und des Anwendungscodes erforderlich.

Feature-Flags tragen dazu bei, die Komplexität dieses Szenarios zu verringern, indem Teams Anwendungsänderungen in einem Feature-Flag im Voraus vorbereiten können. Sobald das Team die Änderungen an der Datenbank vornimmt, kann es sofort das Feature-Flag umschalten, um die Änderung mit dem Anwendungscode zu koordinieren. Dies beseitigt Risiken und Verzögerungen, die entstehen, wenn erst auf das Deployment gewartet werden muss, das Deployment anschließend möglicherweise fehlschlägt und daraufhin die Synchronisierung der Anwendung mit der Datenbank aufgehoben werden muss.

Canary-Launches
"Canary", also ein Kanarienvogel, nimmt in diesem Zusammenhang Bezug auf eine alte, makabre Praxis, bei der Bergleute Kanarienvögel in das Kohlebergwerk mitnahmen, um Kohlenmonoxid festzustellen. Die Vögel haben einen schnelleren Stoffwechsel und eine höhere Atemfrequenz, was dazu führte, dass sie vor den Bergarbeitern dem Kohlenmonoxid erlagen.

In der Softwareentwicklung bezeichnet man das Deployment einer neuen Funktion oder Codeänderung vor dem allgemeinen Release an eine kleine Gruppe von Benutzern zur Überwachung des Verhaltens als Canary-Launches. Wenn es bei der neuen Funktion Anhaltspunkte für Fehlverhalten oder Ausfälle gibt, wird sie automatisch zurückgesetzt. Feature-Flags sind für diesen Prozess von wesentlicher Bedeutung, da sie den Benutzer-Pool einschränken und Funktionen einfach ausschalten können.

Systemausfall
Ein Feature-Flag kann auch als Systemausfalltool verwendet werden. Eine Webanwendung kann ein Feature-Flag verwenden, um die gesamte Website für Wartungs- oder Ausfallzeiten "auszuschalten". Das Feature-Flag kann in der gesamten Codebasis instrumentiert werden, um sensible Transaktionen zu pushen und den Endbenutzern Ausfallinformationen anzuzeigen. Dies kann bei sensiblen Deployments oder wenn ein unerwartetes Problem festgestellt wird und dringend behoben werden muss, unglaublich hilfreich sein. Es gibt den Teams das Selbstvertrauen und die Fähigkeit, einen kontrollierten Ausfall herbeizuführen, wenn dies als notwendig erachtet wird.

Continuous Deployment
Feature-Flags können als integrale Komponente verwendet werden, um ein echtes Continuous Deployment-System aufzubauen. Continuous Deployment ist eine automatisierte Pipeline, die neuen Code von Entwicklern entgegennimmt und automatisch für Produktionsendbenutzer bereitstellt. Continuous Deployment stützt sich auf Schichten automatisierter Tests, die sicherstellen, dass sich der neue Code wie erwartet gegenüber einer übereinstimmenden Spezifikation verhält, während er sich durch die Pipeline bewegt.

Feature-Flags machen das kontinuierliche Deployment sicherer, indem Codeänderungen und die Veröffentlichung von Funktionen für die Benutzer getrennt werden. Neuer Code kann automatisch gemergt und in der Produktion bereitgestellt werden und dann hinter einem Feature-Flag warten. Das Continuous Deployment-System kann das Benutzerverhalten und den Datenverkehr überwachen und dann automatisch das Feature-Flag aktivieren. Umgekehrt kann das Continuous Deployment-System den neuen Feature-Flag-Code überwachen, um zu sehen, ob er sich wie erwartet verhält, und ihn zurücksetzen, falls dies nicht der Fall ist.

Feature-Branches vs. Feature-Flags

So implementiert man Feature-Flags

Es gibt viele Möglichkeiten, Feature-Flags auf Basis verschiedener logistischer Überlegungen und mit unterschiedlichem Return on Investment zu implementieren. Die Wahl des Wegs hängt von den Anforderungen deines Teams und den Zielen der Organisation ab.

Feature-Flagging bringt einige Infrastrukturabhängigkeiten mit sich, die für ein ordnungsgemäßes Funktionieren berücksichtigt werden müssen. Da Teams ihre Verwendung von Feature-Flags skalieren und das Ein- und Ausschalten von Flags zu einer Geschäftsentscheidung wird, ist ein maßgeblicher Datenspeicher und ein Verwaltungsmechanismus für die Flags unabdingbar. Viele Feature-Flag-Services von Drittanbietern stellen diese Datenspeicherabhängigkeit bereit.

Gehostete Feature-Flag-Services von Drittanbietern sind häufig die beste Lösung. Die Anbieter kümmern sich um die zentrale Logistik und bieten einfach zu integrierende Bibliotheken, die den Installationsprozess beschleunigen. Auf diese Weise können sich Teams auf die Aufgaben des Kerngeschäfts anstatt auf das Infrastrukturmanagement konzentrieren. Wenn dein Team jedoch Sicherheitsbedenken bezüglich Drittanbietern hat, ist es möglicherweise am besten dein eigenes Sicherheits-Flag-Backend zu implementieren.

Unabhängig davon müssen die Entwickler eine neue Code-Logik instrumentieren, die den Flag-Status des Service abruft, um den markierten Inhalt zu aktivieren. Dies erfordert Code-Merges und Deployments des Flag-Codes, bevor er aktiviert wird. Da viele Feature-Flags temporär sind, solltest du nicht vergessen, die nicht mehr benötigten Feature-Flags zu entfernen.

Fazit

Feature-Flags sind eine leistungsstarke Ergänzung eines agilen Entwicklungsarsenals. Es gibt viele kreative Möglichkeiten, Feature-Flags zu nutzen. Feature-Flags ergänzen Continuous Deployment und die Git-Versionskontrolle. Insgesamt geben Feature-Flags Teams mehr Kontrolle über ihre Codebasis, ihr Deployment und die Endbenutzererfahrung.