Nehmen wir im Gegensatz zu all den Neinsagern einen echten Geschäftsbedarf an.
(Lieferbar ist beispielsweise Quellcode, Kunden sind aus demselben Geschäftsbereich und daher Konkurrenten, und Ihr Geschäftsmodell verspricht, ihre Geheimnisse geheim zu halten.)
Angenommen , Ihr Unternehmen verfügt über die erforderlichen Tools, um alle Niederlassungen zu verwalten. Dies sind entweder Mitarbeiter (beispielsweise 100 Entwickler, die sich für die Zusammenführung einsetzen, vorausgesetzt, dass die Veröffentlichung um 5 Tage verzögert wird, oder 10 Entwickler, wenn eine Verzögerung von 50 Tagen in Ordnung ist) oder Ein so beeindruckendes automatisiertes Testen, dass automatisierte Zusammenführungen in jedem Zweig sowohl auf Kernspezifikation als auch auf Erweiterungsspezifikation getestet werden und daher nur Änderungen, die nicht "sauber" zusammengeführt werden, menschliches Eingreifen erfordern. Wenn Ihre Kunden nicht nur für Anpassungen, sondern auch für deren Wartung bezahlen, kann dies ein gültiges Geschäftsmodell sein.
Meine (und Neinsager) Frage ist, haben Sie eine engagierte Person, die für die Lieferung an jeden Kunden verantwortlich ist? Wenn Sie beispielsweise ein Unternehmen mit 10.000 Mitarbeitern sind, kann dies der Fall sein.
Dies könnte in einigen Fällen von der Plug-in- Architektur übernommen werden. Nehmen wir an, Ihr Kern ist "trunk", Plug-ins können in "trunk" oder "branches" gespeichert werden, und die Konfiguration für jeden Kunden ist entweder eine Datei mit einem eindeutigen Namen oder befindet sich in einer Kundenniederlassung.
Plugins können zur Laufzeit geladen oder zur Kompilierungszeit eingebaut werden.
Wirklich viele Projekte werden auf diese Weise durchgeführt. Grundsätzlich gilt immer noch dasselbe Problem. Einfache Kernänderungen sind einfach zu integrieren. Konfliktänderungen müssen entweder rückgängig gemacht werden oder Änderungen an vielen Plugins sind erforderlich.
Es gibt Fälle, in denen Plugins nicht gut genug sind. In diesem Fall müssen so viele Interna des Kerns optimiert werden, dass die Anzahl der Plugin-Schnittstellen zu hoch wird, um sie verarbeiten zu können.
Idealerweise wird dies durch aspektorientierte Programmierung erledigt , wobei Trunk der Kerncode ist und Zweige Aspekte sind (dh zusätzlicher Code und Anweisungen zum Verbinden von Extras mit dem Kern).
Ein einfaches Beispiel: Sie können festlegen, dass custom foo
vor oder nach dem Core ausgeführt wird klass.foo
oder dass er ihn ersetzt oder ihn umschließt und die Eingabe oder Ausgabe ändern kann.
Dafür gibt es eine Menge Bibliotheken, aber das Problem der Zusammenführungskonflikte lässt sich nicht lösen - saubere Zusammenführungen werden von AOP gehandhabt und Konflikte erfordern immer noch menschliches Eingreifen.
Letztendlich muss sich ein solches Unternehmen wirklich mit der Wartung von Filialen befassen. Ist das kundenspezifische Feature X so weit verbreitet, dass es billiger ist, es auf den Core zu verschieben, obwohl nicht alle Kunden dafür bezahlen?