Softwarearchitektur, viele klein(st)e Anpassungen je Kunde
-
Fallstudie:
Eine PHP-basierte Weblösung. Im Großen und Ganzen nutzt jeder Kunde die selben Module (Suche A, Suche B, Suche C, Suchergebnis, Detailseite, etc.) -> hin und wieder evtl. ein Sondermodul. Allerdings gibt es in den 10-20 Modulen pro Kunde sicherlich pro Kunde 5 Extrawünsche. Dort ein Feld mehr, hier eine ComboBox zusätzlich, der andere will auf der Startseite noch eine Extrasuche, zusätzliche Filter, uvm.
Es ist kein wirkliches CMS, die Weblösung muss sich in die Homepage des Kunden integrieren. D.h. auch im Bereich Layout müssen manches Mal Umstellungen durchführen weil eine Box da floaten muss um sich ins Design einzufügen, etc.
Damit das funktioniert wird die Basisversion derzeit schlichtweg kopiert. Globale Änderungen in den Modulen werden dann für die rund 30 Kunden alle *einzeln nachgezogen*!! Hin und wieder auch nur für die besseren Kunden...d.h. inzwischen ist das ein riesiger Software-Flickenteppich.
Da das Unternehmen jetzt wachsen möchte ist das keine praktikable Lösung mehr.
Eine riesige if(CFG_ANPASSUNG_15_SET) { do this } else { do else } ist aber imho auch nicht viel wartbarer...
Was ist da der gängige Weg? (Ich weiß...der gängige Weg ist es dem Kunden bestimmte Anforderungen einfach aufzuzwingen, da das Unternehmen aber nicht SAP heißt ist das nicht möglich...)
Kennt zu diesem Fall gute Literatur? Evtl. Artikel? Wie geht ihr mit solchen Situationen um? Ich will da ein besserer Softwarearchitekt werden
MfG SideWinder
-
Naja, irgendwo musst du diese ganzen feinen Unterschiede ja unterbringen und bei 30 Kunden ist das natürlich eine eklige Sache, da kommst du nicht drumherum. Kommt also nur drauf an, wo und in welcher Form du diese Besonderheiten speicherst und wie sie dann in das Endprodukt harmonisiert werden. Mir fallen da spontan zwei Ansätze ein, die jeweils auf einem einzelnen Basisprodukt arbeiten:
- Für jeden Kunden hast du ein eigenes Postprocessing, das die jeweiligen Besonderheiten einflechtet. Relevante Stellen im Quellcode könnte man, sofern sonst schwierig ermittelbar, mit Annotationen versehen, die dann natürlich beim Postprocessing rausfliegen.
- Eine DSL dazwischenschalten, bei der Übersetzung wird durch unterschiedliche und entsprechend flexible Grammatiken angepasster Quellcode erzeugt.
(Die sich unterscheidenden Dinge in separate CSS- oder sonstige Files auszulagern hast du ja sicher schon versucht, deshalb schätze ich, dass das nicht ordentlich geht.)
-
Ich hoffe doch ihr habt für jeden Kunden einen eigenen Branch, dann sollte das Mergen des Hauptentwicklungszweigs mit den Kundenzweigen eigentlich kein Problem sein. Und wenn ihr dann Layout und Code vernünftig getrennt habt seh ich auch keinen großen Mehraufwand da bei einzelnen Kunden jeweils Änderungen vorzunehmen.
-
ich hoffe doch schrieb:
Ich hoffe doch ihr habt für jeden Kunden einen eigenen Branch, dann sollte das Mergen des Hauptentwicklungszweigs mit den Kundenzweigen eigentlich kein Problem sein. Und wenn ihr dann Layout und Code vernünftig getrennt habt seh ich auch keinen großen Mehraufwand da bei einzelnen Kunden jeweils Änderungen vorzunehmen.
Ich weiß eigentlich nicht, dass VCS bereits so stark sind. Also ich kann x Branches haben und einen Teil (bspw. eine Zeile) einer Datei im Hauptentwicklungszweig in alle anderen Zweige mergen -> auch wenn dort diese Datei überall anders aussieht?
Es gibt zwar ein VCS (Subversion), allerdings wurde das erst später eingeführt. Dementsprechend gibt es nur einen einzigen Branch und schlimmer noch, für vieles überhaupt keine Historie. Also das wurde erst sehr spät in der Entwicklung eingeführt.
MfG SideWinder
-
Ich glaub, es bleibt nix anderes übrig, alle Versionen konzeptional auf eine zu Verallgemeinen und die Kundenwunschen in Konfiguration zu speichern.
-
SideWinder schrieb:
ich hoffe doch schrieb:
Ich hoffe doch ihr habt für jeden Kunden einen eigenen Branch, dann sollte das Mergen des Hauptentwicklungszweigs mit den Kundenzweigen eigentlich kein Problem sein. Und wenn ihr dann Layout und Code vernünftig getrennt habt seh ich auch keinen großen Mehraufwand da bei einzelnen Kunden jeweils Änderungen vorzunehmen.
Ich weiß eigentlich nicht, dass VCS bereits so stark sind. Also ich kann x Branches haben und einen Teil (bspw. eine Zeile) einer Datei im Hauptentwicklungszweig in alle anderen Zweige mergen -> auch wenn dort diese Datei überall anders aussieht?
Es gibt einige Systeme die damit werben, aber kein mir bekanntes womit es wirklich brauchbar geht.
----
Ich kann auf die Schnelle nur das Stichwort "dependency injection" (aka. "inversion of control") anbieten.
Sollte gerade in PHP super-einfach gehen, da man das "zusammenstöpseln" der Objekte auch einfach über ein PHP Skript machen kann. (In anderen Sprachen steckt man die Objekte data-driven zusammen, damit man die Konfiguration austauschen/ändern kann, ohne das Programm neu übersetzen zu müssen)
-
Ich habe das gleiche Problem.
Die Hauptanwendung wird für einige gute Kunden angepasst. Manchmal nur Kleinigkeiten wie ein Bildchen austauschen, manchmal aber auch Änderugen, die es erfordern das DB-Schema abzuändern. Gelegentlich verwenden die Kunden eigene Hardware (Kameras) die angesteuert werden muss. Trotz Direct-Show hat jede Kamera ihre Tücken und je nach Bildqualität müssen sogar die Bildverarbeitungsalgorithmen angepasst werden.
Für die Hauptanwendung steht in diesem Jahr eine Erweiterung an, die natürlich in alle Kundenversionen einfließen muss.
Es ist ein Verwaltungs- und Updatehorror und eine Lösung ist nicht in Sicht.