So rollen Sie eine Funktion nur für einige wenige Benutzer aus

11

Ein gutes Beispiel für das, wonach ich fragen möchte, wäre die neue Timeline-Funktion von Facebook. Am Anfang hatten nur einige wenige Zugriff auf die Zeitleiste. Als sich die Funktionsweise der Funktion verfestigte und Fehler darin behoben wurden, wurde zusätzlichen Benutzern der Zugriff auf die Funktion gewährt. Zu einem späteren Zeitpunkt wurde einer großen Gruppe von Benutzern Zugriff auf die Funktion gewährt, und jetzt ist sie eine allgemeine Funktion für alle Benutzer. Wie verwaltet ein Entwicklungsteam diese Art der Einführung von Funktionen?

Ich habe mit der Idee gespielt, Konfigurationseinstellungen zu verwenden, um den Zugriff selektiv zu steuern, wenn sich etwas im Test oder in der Produktion befindet, und zwar über eine Konfigurationsdatei und bedingte if-Anweisungen im Code. Obwohl dies für einfache Funktionen in Ordnung ist, glaube ich, dass es unüberschaubar werden würde, wenn wir versuchen würden, dies in einem größeren Funktionsumfang zu implementieren.

Was wäre der beste Weg, um Feature-Rollouts auf diese Weise zu verwalten?

Chris
quelle
3
ACL & RBAC sind zwei (sehr ähnliche) Möglichkeiten, um das zu tun, wonach Sie suchen.
Yannis
@YannisRizos: Zugegeben, das ist eine kleine / kurze Antwort, aber ich denke, es ist zu Recht nützlich. Sie sollten es als Antwort posten.
Steven Evers
Ist das nicht grundsätzlich für alle Funktionen gleich, nicht nur für neue? Abhängig von den Anmeldeinformationen hat der Benutzer Zugriff auf x Optionen? Zum Beispiel kann die Administratorebene Einstellungen ändern und die Grunzebene kann nur Daten eingeben?
Pieter B

Antworten:

2

Wie verwaltet ein Entwicklungsteam diese Art der Einführung von Funktionen?

Es ist leicht zu erraten, dass ein System wie Facebook weitgehend von Datenbanken gesteuert wird. Alle Benutzerdaten werden offensichtlich in Datenbanken gespeichert, und dazu gehören wahrscheinlich Informationen zum Rendern der Benutzerdaten. Es ist unmöglich, genau zu wissen, wie die Datenbank von Facebook eingerichtet ist, aber es muss der Fall sein, dass eine Funktion wie die Zeitleiste schrittweise für Benutzer bereitgestellt wird, indem regelmäßig Benutzer in der Datenbank anhand einiger Kriterien ausgewählt und der Wert geändert werden ( s) einiger Felder.

Zum Beispiel, vielleicht haben sie ein Feld in der Benutzertabelle wie timeline_statusdie Werte , zB not offered, offered, preview, und public. Allein auf dieser Grundlage könnte das Facebook-System entscheiden, wie die Infoseite des Benutzers gerendert werden soll. Das FB-Team kann dann die Timeline-Funktion ausprobieren, indem es eine Benutzergruppe auswählt und den Wert dieses Felds ändert.

In der Praxis ist es sicher etwas komplizierter, aber die Kernidee ist, dass ein Benutzerkonto nur aus Daten besteht und einige dieser Daten bestimmen können, welche Funktionen verfügbar sind. Die Einführung einer neuen Funktion ist nur eine Frage der Aktualisierung der Benutzerdatensätze in der Datenbank.

Caleb
quelle
9

... und bedingte if-Anweisungen im Code.

Ja, das ist der falsche Weg. Was auch immer Feature X ist, wenn es konfigurierbar ist, muss es etwas erweitern oder ersetzen. Tun Sie das im Code. Zum Beispiel könnte das FB-Ding so etwas haben:

class UserPageView;
class HatedTimelineView : UserPageView;
class OldViewEveryoneLikes : UserPageView;

Dann würden Sie eine Factory erstellen, die UserPageView-Objekte erstellt, wenn Sie eine Benutzerseite basierend auf der Konfiguration besuchen. Sie würden diese Ansicht aktivieren. Keine dummen Zweige.

Sie möchten es auf diese Weise tun, denn wenn jemand Sie bittet, es einmal zu ändern, wird er erneut danach fragen. Weiter werden sie darum bitten, etwas anderes zu ändern. Rätseln Sie Ihre Architektur mit Sonderfällen, und wenn es überall ist, haben Sie eine riesige Schüssel mit nicht zu wartenden, schimmeligen Spaghetti anstelle eines funktionsreichen, ausgereiften Produkts.

Edward Strange
quelle
Sie müssen bedingte if-Anweisungen verwenden. Woher weiß Ihre Fabrik sonst, welche UserPageView zurückgegeben werden soll? Trotzdem stimme ich zu, dass es eine schlechte Idee ist, Anweisungen zu zentralisieren, wenn sie im gesamten Code enthalten sind.
Briddums
1

Stellen Sie sich die Funktion genauso vor wie eine Verwaltungsfunktion auf einer Website.

Überprüfen Sie beim Laden einer Seite, ob der Benutzer über die richtigen Berechtigungen für die Funktion verfügt, wenn Sie sie laden.

Facebook scheint bei der Einführung neuer Funktionen einen standortbasierten Ansatz zu verwenden. Dies kann so einfach sein, als würden Sie die IP-Adresse des Benutzers überprüfen, um seinen Standort zu finden.

Gordon
quelle