So starten Sie eine neue Hauptversion meiner Anwendung, halten aber die alte Version am Leben.

8

Ich habe zwei Anwendungen, A und B. Die aktuelle Version dieser Anwendungen ist 7.x (einige Kunden führen 7.1 aus, andere 7.2, ...). Beide Anwendungen verwenden dasselbe gemeinsame Framework (nennen wir dies C) wie folgt:

+---+ +---+
| A | | B |
+---------+
|    C    |
+---------+

Aufgrund einiger wichtiger Neukunden möchte ich die Funktionalität von A und B in einer großen Anwendung haben. Das Zusammenführen von A und B zu einer Anwendung ist nicht möglich, daher versuche ich jetzt, die Funktionalität von A in B zu integrieren. Bisher so gut, aber ich stoße auf einige Probleme.

Erstens sind Kunden, die nur die Basisfunktionalität von B verwenden, nicht an allen neuen Funktionen von A interessiert, die hinzugefügt werden (und die zusätzlichen Overhead für sie verursachen). Sie möchten nur ihre Version B mit Unterstützung für neue Windows-Versionen aktualisieren, ... und vielleicht auch alle netten Funktionen, die C (dem gemeinsamen Framework) hinzugefügt wurden.

Zweitens möchten Kunden, die derzeit Anwendung A verwenden, nicht direkt zu Anwendung B wechseln, obwohl die kombinierte Funktionalität von A + B ihnen langfristig helfen würde. Für einfache Upgrades möchten sie bei A bleiben und sogar einige Verbesserungen in C sehen.

Drittens könnten alle Entwicklungen, die ich in B mache, Auswirkungen auf die gemeinsame Schicht CEg haben, um die Leistung eines Moduls in B zu verbessern. Ich muss ein Modul in C umgestalten, aber da C auch in A verwendet wird, Ich muss viel mehr arbeiten. Darüber hinaus ist A eine ältere, weniger strukturierte Anwendung, und jede Änderung in C kann A instabiler machen.

Frage ist, wie es weitergeht? Ich denke derzeit darüber nach, B in eine 7.x-Version aufzuteilen (ich könnte hier noch einige kleinere Entwicklungen vornehmen und bei Bedarf in den kommenden Jahren 7.3, 7.4 veröffentlichen) und eine 8.x-Version (die alle neuen Funktionen enthalten würde). . Um das Problem der gemeinsamen Ebene zu lösen, könnte ich C auch in ein altes C (7.x) und ein neues C (8.x) aufteilen. Dies ergibt das folgende Ergebnis:

+-------+ +-------+  +-------+
| A 7.x | | B 7.x |  | B 8.x |
+-----------------+  +-------+
|      C 7.x      |  | C 8.x |
+-----------------+  +-------+

Anwendung A würde sich nicht mehr weiterentwickeln und sich an die 7.x-Version der gemeinsamen Schicht C halten.

Das Aufteilen von C bedeutet, dass alle Entwicklungen in C entweder nicht in den alten Versionen A und B zu sehen sind (die noch in Version 7.x enthalten wären), oder wenn sie in Version 7.x von A und B durchgeführt werden müssen, dies erforderlich wäre Entwicklungen in beiden Releases.

Eine Alternative könnte darin bestehen, B in B 7.x und B 8.x aufzuteilen. Dies würde jedoch die Refactoring-Möglichkeiten in C einschränken und tatsächlich nur die ersten beiden Probleme lösen.

Hat jemand Erfahrung mit solch einer großen Release-Änderung? Irgendwelche anderen Ideen?

Patrick
quelle
3
Ihr letzter Vorschlag scheint in Ordnung zu sein, wenn Sie nur geringfügige Updates und Fehlerbehebungen für die 7.x-Versionen vornehmen möchten. Anschließend teilen Sie Ihren Kunden mit, dass Sie 7.x auslaufen lassen und dass sie auf 8.x umsteigen müssen, wenn sie jemals zusätzliche Funktionen wünschen. In 8.x konfigurieren Sie (und vielleicht auch separat verkaufen) Module der Funktionalität - zunächst 2, sehr viel , die Funktionalität von A und B Technisch ähneln, von jetzt an Sie 2 separate Codebasen erhalten.
Jan Doggen

Antworten:

3

Erstens sind Kunden, die nur die Basisfunktionalität von B verwenden, nicht an allen neuen Funktionen von A interessiert, die hinzugefügt werden (und die zusätzlichen Overhead für sie verursachen).

Dies ist normalerweise nur ein Problem mit der Benutzeroberfläche: Bringen Sie die Funktionalität von A in Ihre kombinierte Anwendung "B 8.x" ein, trennen Sie sie jedoch so, dass sie von den Kunden von B auf der Ebene der Benutzeroberfläche nicht gesehen wird. Bauen Sie einen Switch in die Anwendung ein, damit Sie die A-Funktionalität nur für "A-Kunden" aktivieren können. Wahrscheinlich benötigen Sie einen weiteren Schalter, um die B-Funktionalität für A-Kunden auszublenden (dies gibt Ihnen auch die Möglichkeit, ihnen die B-Funktionalität als separates Modul zu verkaufen).

Zweitens möchten Kunden, die derzeit Anwendung A verwenden, nicht direkt zu Anwendung B wechseln, obwohl die kombinierte Funktionalität von A + B ihnen langfristig helfen würde.

Ich denke, das wird kein Problem sein, wenn Sie sich um zwei Dinge kümmern:

  • Finden Sie eine Möglichkeit, Ihre Benutzeroberfläche für die "A-Funktionalität" in "B 8.x" so zu gestalten, dass sie sich nicht zu stark von A 7.x unterscheidet
  • Bieten Sie diesen A-Kunden den Übergang zu B 8.x zum gleichen Preis wie von A 7.x zu A 7. (x + 1). Oder deklarieren Sie "A 8.x" mit den deaktivierten B-Funktionen als "A 7. (x + 1)" gegenüber den A-Kunden (wie ein Follow-up benannt werden kann, kann ein Vertragsproblem sein, sollten Sie dies überprüfen).

Wenn Sie Ihre A-Kunden auf diese Weise auf B 8.x migrieren können, lösen Sie automatisch Ihr drittes Problem.

Eine Sache hinzuzufügen: Ich pflege eine Anwendung, die sich vor ungefähr 15 Jahren in einer sehr ähnlichen Situation befand ("A 7.x" war ein MS DOS-Programm, "B 7.x" war ein Windows-Programm mit vielen neuen Funktionen und "B 8.x" enthielten alle Funktionen beider Vorgänger, wobei die alten "A 7.x" -Funktionen in B integriert und als separates Modul verkauft wurden. Sie werden nicht überrascht sein, wenn ich Ihnen sage, dass wir seit mehr als 10 Jahren keine MS DOS-Kunden mehr haben, sodass der Übergang überhaupt kein Problem war.

Doc Brown
quelle