Ich arbeite an einem großen Softwareprojekt, das für verschiedene Kunden auf der ganzen Welt maßgeschneidert ist. Dies bedeutet, dass wir vielleicht 80% Code haben, der zwischen den verschiedenen Kunden gemeinsam ist, aber auch viel Code, der sich von einem Kunden zum anderen ändern muss. In der Vergangenheit haben wir unsere Entwicklung in separaten Repositorys (SVN) durchgeführt und zu Beginn eines neuen Projekts (wir haben nur wenige, aber große Kunden) ein weiteres Repository erstellt, das auf dem früheren Projekt basiert, das die beste Codebasis für unsere Anforderungen bietet. Dies hat in der Vergangenheit funktioniert, aber wir sind auf mehrere Probleme gestoßen:
- Fehler, die in einem Repository behoben wurden, werden in anderen Repositorys nicht behoben. Dies mag ein organisatorisches Problem sein, aber ich finde es schwierig, einen Fehler in 5 verschiedenen Repositorys zu beheben und zu beheben, wenn ich bedenke, dass sich das Team, das dieses Repository verwaltet, möglicherweise in einem anderen Teil der Welt befindet und wir keine Testumgebung haben Weder kennen sie ihren Zeitplan noch wissen sie, welche Anforderungen sie haben (ein "Bug" in einem Land könnte ein "Feature" in einem anderen sein).
- Für ein Projekt vorgenommene Funktionen und Verbesserungen, die auch für ein anderes Projekt nützlich sein können, gehen verloren oder verursachen bei der Verwendung in einem anderen Projekt häufig große Kopfschmerzen beim Zusammenführen dieser Funktionen von einer Codebasis zur anderen (da beide Zweige möglicherweise ein Jahr lang unabhängig voneinander entwickelt wurden) ).
- Refactorings und Code-Verbesserungen, die in einem Entwicklungszweig vorgenommen wurden, gehen entweder verloren oder verursachen mehr Schaden als Nutzen, wenn Sie alle diese Änderungen zwischen den Zweigen zusammenführen müssen.
Wir diskutieren jetzt, wie diese Probleme gelöst werden können, und haben bisher die folgenden Ideen zur Lösung dieser Probleme entwickelt:
Halten Sie die Entwicklung in getrennten Zweigen aufrecht, aber organisieren Sie sie besser, indem Sie ein zentrales Repository haben, in dem allgemeine Fehlerkorrekturen zusammengeführt werden, und alle Projekte regelmäßig (z. B. täglich) Änderungen aus diesem zentralen Repository in ihre eigenen übernehmen. Dies erfordert enorme Disziplin und viel Aufwand beim Zusammenführen der Filialen. Ich bin also nicht davon überzeugt, dass es funktionieren wird, und wir können diese Disziplin beibehalten, insbesondere wenn Zeitdruck aufkommt.
Verzichten Sie auf die separaten Entwicklungszweige und verfügen Sie über ein zentrales Code-Repository, in dem sich unser gesamter Code befindet, und passen Sie unsere Einstellungen an, indem Sie über steckbare Module und Konfigurationsoptionen verfügen. Wir verwenden bereits Abhängigkeitsinjektionscontainer, um Abhängigkeiten in unserem Code aufzulösen, und wir folgen dem MVVM-Muster in den meisten unserer Codes, um die Geschäftslogik sauber von unserer Benutzeroberfläche zu trennen.
Der zweite Ansatz scheint eleganter zu sein, aber wir haben viele ungelöste Probleme in diesem Ansatz. Zum Beispiel: Wie gehen Sie mit Änderungen / Ergänzungen in Ihrem Modell / Ihrer Datenbank um? Wir verwenden .NET mit Entity Framework, um stark typisierte Entitäten zu haben. Ich verstehe nicht, wie wir mit Eigenschaften umgehen können, die für einen Kunden erforderlich, für einen anderen Kunden jedoch nutzlos sind, ohne unser Datenmodell zu überfrachten. Wir denken darüber nach, dies in der Datenbank zu lösen, indem wir Satellitentabellen verwenden (mit separaten Tabellen, in denen unsere zusätzlichen Spalten für eine bestimmte Entität mit einer 1: 1-Zuordnung zur ursprünglichen Entität leben), aber dies ist nur die Datenbank. Wie gehst du damit im Code um? Unser Datenmodell befindet sich in einer zentralen Bibliothek, die wir mit diesem Ansatz nicht für jeden Kunden erweitern könnten.
Ich bin sicher, dass wir nicht das einzige Team sind, das mit diesem Problem zu kämpfen hat, und ich bin schockiert, so wenig Material zu diesem Thema zu finden.
Meine Fragen lauten also wie folgt:
- Welche Erfahrungen haben Sie mit hochgradig kundenspezifischer Software gemacht, welchen Ansatz haben Sie gewählt und wie hat das bei Ihnen funktioniert?
- Welchen Ansatz empfehlen Sie und warum? Gibt es einen besseren Ansatz?
- Gibt es gute Bücher oder Artikel zu dem Thema, die Sie empfehlen können?
- Haben Sie spezielle Empfehlungen für unsere technische Umgebung (.NET, Entity Framework, WPF, DI)?
Bearbeiten:
Danke für all die Vorschläge. Die meisten Ideen stimmen mit denen überein, die wir bereits in unserem Team hatten, aber es ist sehr hilfreich, Ihre Erfahrungen mit ihnen zu sehen und Tipps zu finden, um sie besser umzusetzen.
Ich bin mir immer noch nicht sicher, welchen Weg wir gehen werden und ich treffe die Entscheidung nicht (allein), aber ich werde dies in meinem Team weitergeben und ich bin sicher, dass es hilfreich sein wird.
Momentan scheint der Tenor ein einziges Repository mit verschiedenen kundenspezifischen Modulen zu sein. Ich bin mir nicht sicher, ob unsere Architektur diesen Anforderungen gerecht wird oder wie viel wir investieren müssen, um sie fit zu machen. Einige Dinge könnten für eine Weile in separaten Repositories gespeichert sein, aber ich denke, es ist die einzige langfristige Lösung, die funktionieren wird.
Nochmals vielen Dank für alle Antworten!