Leistungen

Backend Engineering, Produkt

Branche

B2B-Marktplatz

Jahr

2022-2024

Feature Flags, die die Daten entscheiden lassen.

Ein B2B-Marktplatz musste UI-Varianten, Backend-Verhalten und ganze Features testen, ohne separate Codepfade zu deployen oder eine Drittanbieter-Experimentierplattform zu kaufen. Der bestehende Stack war ein Django-Monolith. Die Lösung: django-waffle Flags mit prozentualer Ausrollung, besucherbasierter Persistenz und einer benutzerdefinierten Admin-Oberfläche, die dem Produktteam erlaubt, Experimente in Sekunden umzuschalten.

01.
DIE HERAUSFORDERUNG

Testen ohne Testplattform

Die Plattform hatte keine Experimentierinfrastruktur. Jede Änderung war ein vollständiger Deploy. Rollbacks erforderten einen weiteren Deploy. Es gab keine Möglichkeit, Feature X 20% der Besucher zu zeigen und den Unterschied zu messen. Das Produktteam wollte Kontaktformular-Layouts, Preisanzeigen und Onboarding-Abläufe A/B-testen. Eine vollständige Experimentierplattform zu bauen lag außerhalb des Umfangs. Die Lösung musste innerhalb des bestehenden Django-Stacks ohne zusätzliche Infrastruktur funktionieren.

Jeder Deploy war eine Alles-oder-Nichts-Wette. Feature Flags verwandelten Deploys in Experimente mit Rollback-Button.

02.
DIE LÖSUNG

Waffle Flags mit Besucher-Persistenz

django-waffle bietet Feature Flags, die pro Nutzer, pro Gruppe oder als Prozentsatz aller Requests umgeschaltet werden können. Das System bindet die Flag-Auswertung an die Visitor-Tracking-Middleware: Jeder Besucher erhält einen deterministischen Hash, und der Prozentschwellenwert des Flags entscheidet, ob er Variante A oder B sieht. Einmal zugewiesen, sieht der Besucher dieselbe Variante für seine gesamte Session. Der Flag-Status wird über einen Context Processor in jedes Template injiziert, was Template-Conditionals ohne Python-Änderungen ermöglicht. Dieselben Flags steuern Backend-Verhalten über Python-Level-Checks.

Der benutzerdefinierte FlagAdmin mit Inline-Toggles:

Python
class FlagAdmin(WaffleFlagAdmin):
    list_display = [
        'name',
        'everyone',
        'percent',
        'superusers',
        'staff',
        'authenticated',
        'note',
        'created',
        'modified',
    ]
    list_editable = [
        'everyone',
        'percent',
        'superusers',
        'staff',
        'authenticated',
        'note',
    ]
    list_filter = ['everyone', 'superusers', 'staff']

Ausrollung beobachten

Ein Live-Flag-Simulator. Flag umschalten, Ausrollungs-Prozentsatz anpassen und beobachten, wie Besucher in Echtzeit Varianten zugewiesen werden.

show_new_contact_form
50%
0Visitors
0Variant A
0Variant B
0%Actual B%

Template-Level Flag-Conditionals:

HTML
{# base template — contact form A/B test #}

{% load waffle_tags %}

{% flag "show_new_contact_form" %}
  {# Variant B: simplified form #}
  {% include "contact/_form_v2.html" %}
{% else %}
  {# Variant A: original form #}
  {% include "contact/_form_v1.html" %}
{% endflag %}

Produktionsmuster

Stufenweise Ausrollungsstrategie

Neue Features starten bei 0% und steigen stufenweise: 5% für internes QA, 10% für frühe Signale, 50% für statistische Signifikanz, 100% für vollen Launch. Jede Stufe läuft für eine definierte Periode mit Monitoring. Wenn die Conversion sinkt oder Fehlerraten steigen, rollt das Flag sofort auf 0% zurück - kein Deploy nötig.

Flag-Hygiene und Bereinigung

Jedes Flag hat ein zugehöriges Ticket mit Ablaufdatum. Nach Abschluss eines Tests wird die gewinnende Variante zum Standard-Codepfad und das Flag entfernt. Tote Flags werden über auskommentierte Model-Felder nachverfolgt, die als historischer Nachweis vergangener Experimente dienen. Das verhindert Flag-Ansammlung und hält die Codebasis lesbar.

Backend- und Frontend-Konsistenz

Dasselbe Waffle-Flag steuert sowohl die Template-Ausgabe als auch die Python-Logik. Wenn Variante B ein anderes Kontaktformular-Layout zeigt, prüft auch der Backend-Endpoint, der das Formular verarbeitet, das Flag, um variantenspezifische Validierungsregeln anzuwenden. Das verhindert Inkonsistenzen, bei denen das Frontend eine Variante zeigt, aber das Backend eine andere erwartet.

03.
DAS ERGEBNIS

Datengestützte Produktentscheidungen

Das Flag-System führte 14 A/B-Tests über 18 Monate durch. Die neue Kontaktformular-Variante steigerte die Conversion um 23%. Eine vereinfachte Preisanzeige reduzierte die Absprungrate um 11%. Drei vorgeschlagene Features wurden vor der vollständigen Entwicklung eingestellt, weil frühe Flag-Daten kein Nutzerinteresse zeigten. Durchschnittliche Zeit von der Idee zum Live-Experiment: 2 Stunden. Durchschnittliche Rollback-Zeit: 30 Sekunden. Null experimentbezogene Vorfälle.

WICHTIGE KENNZAHLEN

0A/B-Tests
+0%Beste Conversion-Steigerung
0sRollback-Zeit
WAS DER KUNDE SAGT

"Früher haben wir wochenlang über Features diskutiert. Jetzt liefern wir beide Versionen, lassen 500 Besucher entscheiden und machen weiter. Drei Features, von denen wir überzeugt waren, erwiesen sich als wertlos. Die Daten haben uns Monate verschwendeter Entwicklung gespart."

Product Manager

B2B-Marktplatz · Produktteam

FAQ

Warum django-waffle statt LaunchDarkly oder Ähnlichem?

Wie werden Experimentergebnisse gemessen?

Was verhindert Flag-Konflikte?

TECHNOLOGIE-STACK