Was ist ein realistischer Weg, um mit kundenspezifischen Software-Patches umzugehen?

16

Ich versuche effektive Wege zu finden, wie andere das folgende Problem gelöst haben. Bei der Arbeit mussten wir einen Software-Patch (zur Installation auf Endbenutzersystemen) veröffentlichen, der nur für einen bestimmten Kunden sichtbar sein soll. Der benutzerdefinierte Code befindet sich in einem eigenen Versionsverwaltungszweig. Das Problem ist, dass wir zwei parallele Codezeilen (und Build-Skripte) haben, um synchron zu bleiben, und jedes Mal, wenn wir den ursprünglichen Code patchen, müssen wir den kundenspezifischen Code patchen und testen.

Ich bin gespannt, wie andere Organisationen mit diesem Szenario umgehen. Wir sind offen für Geschäftslösungen und nicht nur für technische Lösungen (im Zusammenhang mit der Quellcodeverwaltung). Wir haben beispielsweise darüber gesprochen, dem Kunden mitzuteilen, dass er keine Updates für diesen Zweig erhalten kann.

Unsere Verzweigungsstrategie ist wie folgt (basierend auf dem Visual Studio TFS Branching Guide , obwohl wir Subversion dafür verwenden) Bildbeschreibung hier eingeben

Mumm
quelle
Wenn Sie Patch-Warteschlangen ( Mercurial Queues Extension oder Stacked Git ) verwenden, hgoder gitich schlage vor, dass Sie dies in Betracht ziehen, aber ich weiß nicht, ob TFS etwas Ähnliches hat.
Mark Booth
Vielleicht hätte ich angeben sollen, dass wir Subversion verwenden, obwohl wir eine Verzweigungsstrategie verwenden, die TFS vorschlägt: P Würden Patch-Warteschlangen die erforderlichen Tests reduzieren? Es sieht so aus, als wären dies Patches für die Versionskontrolle? Wir beschäftigen uns mit Patches, die der Kunde auf Endbenutzersystemen installiert.
Mumm
2
Eine Geschäftslösung wäre: Tu es nicht.
JeffO
@JeffO good call =) Kann man das auf jeden Fall zu einem datengesteuerten Runtime-Switch machen?
Patrick Hughes
1
@JohnB - Sorry, ich weiß nicht, aber wenn Sie Source - Patches haben dann Ihr Build - System sollte in der Lage sein , die Tests zu automatisieren, sowie die Aufbewahrung pro Kunden Patches außerhalb der svnMittel , die sie Ihren normalen Arbeitsablauf nicht vollstopfen. Wenn Patch-Warteschlangen nützlich erscheinen, können Sie sie mit git-svn oder hgsubversion ausprobieren . Die Verwendung eines DVCS-Frontends, um einen kniffligen Arbeitsablauf zu glätten, svnkann sogar dazu führen, dass Menschen über einen Umstieg auf einen DVCS-Großhandel nachdenken, um alle anderen Vorteile zu nutzen.
Mark Booth

Antworten:

5

Wenn Sie kundenspezifische Patches ausgeben, haben Sie sofort eine neue Version Ihres Produkts erstellt, die neben dem Produkt gepflegt werden muss. Das bedeutet, dass Änderungen zwischen den beiden Versionen weitergegeben werden müssen. In der Regel sind kundenspezifische Patches Anpassungen, deren Eigentümer der Kunde sein sollte, einschließlich des Quellcodes.

Es ist unwahrscheinlich, dass ein Patch zur Behebung eines Problems in den Hauptzweig gelangt, es sei denn, dies ist eine nicht optimale vorübergehende Behebung für ein unmittelbares Problem. In diesem Fall muss der Patch nur so lange gepflegt werden, bis der erwartete Fix in die Hauptlinie gelangt.

Charles Lambert
quelle
5

Mir scheint, der Schlüssel ist "sichtbar" - was ist, wenn überhaupt kein separater Code-Zweig vorhanden ist, sondern eine Konfigurationsoption, die das Verhalten ändert?

Loren Pechtel
quelle
Dies könnte für einfache Anpassungen funktionieren, aber komplexere können das Produkt für alle Kunden umständlicher und instabiler machen.
FrustratedWithFormsDesigner
3
@FrustratedWithFormsDesigner Komplexe Anpassungen für einzelne Kunden verursachen grobe Fahrlässigkeit beim Produktmanagement und -design. Jede Lösung, die eine separate Niederlassung für einen einzelnen Kunden für ein Produkt erfordert, stellt eine grobe Unzulänglichkeit des Produkts dar, um alle Kundenbedürfnisse zu erfüllen, und eine unzureichende Produktverantwortung seitens des Produktbesitzers.
maple_shaft
2
Ich habe diesen Biss auch immer wieder bei meinem früheren Arbeitgeber gesehen. Es ist nur eine schlechte Übung, aber normalerweise ist es etwas, was das Management möchte und das nicht zurückgeht. Insbesondere wenn Sie Subversion verwenden, ist dies nur ein Albtraum, der nicht vergehen wird. Wenn Sie den Code synchron halten, wird dies immer wieder schaden.
Steve Hill
1
@maple_shaft - Aber haben Sie sich die Frage gestellt, ob Sie jemals die Code-Verzweigung verwendet haben, um die Internationalisierung umzusetzen?
PSR
3
@maple_shaft - Ich habe einen Scherz gemacht, aber genau das war mein Punkt. Die Verwendung der Verzweigung zur Bewältigung der Internationalisierung ist mindestens so schlecht wie die Verwendung von kundenspezifischen Verzweigungen. Es ist nicht strittig in dem Sinne, dass Sie wahrscheinlich auch nicht an einem solchen Ort arbeiten möchten. Es ist strittig, dass ich ziemlich vom Thema abwich.
PSR
3

Sehen Sie das als kurzfristige oder langfristige Sache? Tatsache ist, dass das Unternehmen bereits beschlossen hat, diesen Kunden so kurzfristig aufzunehmen, dass es bereits eine Geschäftsentscheidung ist, die in erster Linie durch Geschäftspraktiken zu lösen ist (Übernahme der zusätzlichen Kosten / Belastung des Kunden für die Kosten).

Auf lange Sicht werden Sie wahrscheinlich Einsparungen erzielen, wenn Sie die Software neu faktorisieren, um den Kundenanforderungen durch Konfiguration (oder Einrichtung usw.) gerecht zu werden.

Wenn dies relativ kurzfristig bedeutet, dass Sie diese Änderungen bald wieder in der Haupt- / Entwicklungsbranche zusammenführen und alle Benutzer die Änderungen ebenfalls sehen, ist es wahrscheinlich akzeptabel, innerhalb der Grenzen Ihrer aktuellen Situation zu arbeiten. Wie ich bereits sagte, sollte die Entscheidung, was zu tun ist, getroffen worden sein, als die Entscheidung getroffen wurde, den Kunden aufzunehmen.

Um es kurz zu machen. Langfristig technisch reparieren, kurzfristig damit umgehen.

Natürlich gibt es einen Punkt, an dem es sich um einen Münzwurf handelt. Wenn Sie an diesem Punkt sind, würde ich tun, was die Entwickler bevorzugen.

ElGringoGrande
quelle
2

Wir verwenden auch Subversion - und wir stoßen auf genau dieses Szenario.

Hier sind einige wichtige Punkte zu beachten:

  1. Während es notwendig ist, spezifische Filialen für Kunden zu vermeiden, muss der Bedarf so gering wie möglich gehalten werden. Fragen Sie immer, ob es möglich ist, die Lösung zu verallgemeinern, die möglicherweise für alle funktioniert.

  2. Kundenspezifische Filialen müssen aus einem neuen Release stammen. Angenommen, Sie haben eine Version 1.2 und haben von Version 1.2.1 bis 1.2.11 abgeleitete Versionen - den Kundenzweigen sollten alle Patches erlaubt sein, daher muss der Kundenzweig mit der Hauptversion kompatibel bleiben .

  3. Die kundenspezifische Filiale muss neu erstellt werden, wenn Sie eine neue, nicht kompatible Version starten. Der unglückliche Teil ist, dass Sie die Arbeit möglicherweise erneut ausführen müssen . Eine Lösung kann darin bestehen, alle Patches aus Kundenfilialen zu erstellen, die extrahiert werden müssen, und alle noch kompatiblen Patches können auf neue Kundenfilialen angewendet werden.

  4. Unter keinen Umständen sollten Sie kundenspezifische Änderungen zurückschieben, um Zweigstellen oder Amtsleitungen freizugeben. Idealerweise sollte man jedoch versuchen, die Arbeit so zu verallgemeinern, dass diese kundenspezifische Arbeit reduziert bleibt.

Ich habe versucht, diese Idee zusammenzustellen, um zu zeigen, in Diagramm unten:

Dipan Mehta
quelle
1

Wie wäre es mit der Einführung eines Erweiterungsmechanismus in Ihren Code?

Ihr Hauptcode hat:

class Foo
{
}

Wenn das Programm gestartet wird, sucht es in seinem Startordner nach DLL / moralischen Äquivalenten für lokale Anpassungen. Wenn es eine findet, wird sie geladen und enthält möglicherweise eine firmenspezifische Version von Foo

class FooForABC : Foo
{
}

FooForABC implementiert dasselbe Verhalten wie Foo, überschreibt jedoch die erforderlichen Funktionen, um das von ABC benötigte Verhalten bereitzustellen. Die Technik sollte flexibel genug sein, um jedes Szenario zu bewältigen, das Sie unterstützen müssen.

Winston Ewert
quelle