Ich arbeite seit mehr als zehn Jahren bei derselben Softwarefirma. Als Ergebnis habe ich eine große Codebasis mit verschiedenen objektorientierten Programmiersprachen implementiert. Ich war ein Anfängerprogrammierer, als ich meine Karriere begann, und ich wusste nicht viel über gute Schnittstellen- und Klassendesignprinzipien. Ich würde gerne glauben, dass sich meine Designfähigkeiten im Laufe der Zeit verbessert haben, aber ich habe jetzt aufgrund von Bedenken hinsichtlich der Abwärtskompatibilität immer mehr Schwierigkeiten, meinen früheren Code zu verbessern. Mein Code wird von einer großen Anzahl von Kunden als Teil der Produkte verwendet, die mein Unternehmen verkauft.
Meine Frage ist: Wann sollte man aufhören zu versuchen, die Abwärtskompatibilität alter Schnittstellen aufrechtzuerhalten und die Kugel für die Implementierung eines brandneuen Designs zu beißen?
Ich denke, irgendwann kommt die Beibehaltung der Abwärtskompatibilität zu einer so großen Belastung, dass nützliche Änderungen an den Schnittstellen unmöglich werden. Hat jemand ähnliche Bedenken gehabt, wer kann ein Feedback geben?
quelle
I think there comes a point where keeping backward compatibility becomes such a big burden that useful changes to interfaces become impossible.
- Und ich denke, Sie haben dort Ihre eigene Frage beantwortet ...Antworten:
Während "wann" eine gute Frage ist, denke ich, dass "wie" noch relevanter ist. Es kann schwierig sein, einen bahnbrechenden Übergang so durchzuführen, dass Benutzer nicht frustriert oder unglücklich werden. Einige Punkte zu berücksichtigen:
Was das "Wann" betrifft, haben Sie wahrscheinlich eine bessere Idee für Ihre Anwendung als jeder andere. Im Allgemeinen kann es jedoch Zeit für eine saubere Pause sein, wenn Ihre technischen Schulden und Ihre Architektur die Stabilität vollständig beeinträchtigen, eine angemessene Leistung verhindern und die Entwicklung neuer Funktionen überwältigend oder unnötig schwierig machen.
Alles, was gesagt wurde, machen Sie diesen Schritt nicht leichtfertig. Selbst wenn man es richtig macht, ist es eine große Sache, die Abwärtskompatibilität zu brechen. Sie sollten nachdrücklich in Betracht ziehen, zuerst Ihre Testabdeckung und das Refactoring zu erhöhen, und wenn möglich, bevor Sie eine Pause in Betracht ziehen.
quelle
Im Allgemeinen stimme ich James Anderson zu. Nach meiner Erfahrung gibt es jedoch zusätzliche Aspekte, die möglicherweise berücksichtigt werden müssen und auf eine Option hinweisen, die tatsächlich die Entwicklung von Schnittstellen ermöglicht.
Dieses Beispiel stammt aus einem der Teams, mit denen ich zusammenarbeite. Sie versenden ein Produkt regelmäßig, mindestens einmal im Monat, manchmal sogar wöchentlich. Kunden werden aufgefordert, ein Upgrade durchzuführen, da neue Funktionen und neue Plattformen nur in neueren Versionen unterstützt werden. Das Upgrade ist einfach und Kunden können sogar Versionen dazwischen überspringen. Ein Downgrade wird nicht unterstützt. Außerdem werden Versionen nur 3 Jahre lang unterstützt. Danach gibt es eine Nachfrist von einem Jahr, wenn sich die Wartungsgebühren verdoppeln.
Infolgedessen aktualisiert die überwiegende Mehrheit - etwa 95% der Kunden - regelmäßig, mindestens einmal im Jahr. Dies bedeutet auch, dass Sie schrittweise neue Schnittstellen einführen können.
Wie wäre es mit alten Schnittstellen? Die Technik, die dieses Team verwendet, besteht darin, alte Schnittstellen als "End-of-Life" zu deklarieren. Dann gibt es einen Zeitraum von 12 Monaten, in dem die neue Schnittstelle verfügbar ist und die alte Schnittstelle noch nicht in den Ruhestand versetzt wurde. Die neuen Schnittstellen bieten bessere Funktionen als die alte Schnittstelle, daher gibt es zwei Anreize: Das Ende der Lebensdauer der alten Schnittstelle und die neue Schnittstelle sind viel besser.
Die konkrete alte Schnittstelle war in diesem Fall eine plattformspezifische Technologie, die derzeit schrittweise durch eine Service-Schnittstelle ersetzt wird, die auf der Standard-Mainstream-Technologie basiert.
Natürlich geschieht diese Änderung nicht über Nacht und es dauert viele Jahre, bis sie abgeschlossen ist. Aber es erlaubte, die Investition in die alte Technologie zu stoppen und stattdessen in die neue Technologie zu investieren. Kunden erhalten Unterstützung und haben einen Weg nach vorne. Die meisten von ihnen begrüßen auch die Umstellung auf neuere Technologien.
Beachten Sie jedoch, dass dieser spezielle Ansatz in Ihrem Szenario möglicherweise nicht funktioniert. Es funktioniert auf jeden Fall für das Team, mit dem ich zusammenarbeite.
quelle
Sie haben hier bereits einige gute Antworten erhalten, daher möchte ich nur einen Hinweis auf einen sehr schönen Artikel von Joel Spolsky zu diesem Thema hinzufügen. Er diskutiert die Pläne, die Abwärtskompatibilität in IE 8 aufzugeben, was im Wesentlichen Ihrem Problem entspricht:
http://www.joelonsoftware.com/items/2008/03/17.html
quelle
Die kurze Antwort lautet Nie!
Die Erfahrung zeigt, dass ein Rückgang der Abwärtskompatibilität Kunden und Benutzer zumindest stört und sie im schlimmsten Fall vollständig verliert.
Wenn Sie Ihre Benutzer bitten, Code neu zu schreiben, werden sie nach Beendigung des üblichen Fluchens von Ihnen und all Ihren Nachkommen denken: "Wenn ich trotzdem neu schreiben muss, sollte ich vielleicht einfach zu der netten ACME-Bibliothek wechseln, die ich gelesen habe so viel über? ".
Der Trick besteht darin, entweder die aktuelle Benutzeroberfläche so zu verbessern, dass die Abwärtskompatibilität nicht beeinträchtigt wird, oder eine völlig neue glänzende und offensichtlich überlegene Benutzeroberfläche anzubieten, während die ältere Benutzeroberfläche beibehalten wird. Irgendwann wird es Funktionen in der neuen Benutzeroberfläche geben, die in der älteren Benutzeroberfläche einfach nicht möglich sind, aber dies gibt den Menschen nur einen Anreiz, sich zu bewegen, ohne das Problem zu erzwingen.
Bearbeiten, um dies weiter zu verdeutlichen.
Was Sie als Programmierer denken, ist -
"Ich werde diese API verbessern und das System so gut wie möglich machen, und jeder wird mich bewundern."
Was die Benutzer Ihrer API denken werden, ist -
"A * * * e er denkt, dass meine Zeit und mein Zeitplan nicht wichtig sind. Ich muss aufhören, was ich tue, und meinen gesamten Code aus keinem anderen Grund umgestalten, als um sein Ego zu befriedigen. Wenn ich umgestalten muss, werde ich wechseln zu einer anderen API, nur um es ihm auch zu stecken. "
quelle
Dies ist wirklich eher eine Geschäftsentscheidung als eine technische. Normalerweise erfolgt dies im Rahmen einer Hauptversion (z. B. von Version 3.5 auf Version 4.0), und häufig werden die beiden Versionen für eine Weile parallel unterstützt. Dies bedeutet, dass Sie die alte Version warten, aber alle neuen Funktionen nur in der neuen Version angezeigt werden. Die alte Version wird unterstützt, solange das Unternehmen damit Geld verdient oder zumindest genug, um die Wartungskosten auszugleichen. Seien Sie bereit, dies dem Management vorzulegen.
quelle
Ich war auf der Kundenseite, also würde ich sagen, dass es wirklich davon abhängt, was Sie mit dem Übergang vorhaben.
Wir aktualisieren derzeit unser Kontosystem. Das Unternehmen, das das Upgrade durchführt, unterstützt auch die vorherige inkompatible Version. Sie planen, die Daten zu übernehmen und in das neue System zu verschieben, damit (theoretisch) alle alten Daten dort sind. Wir werden ein paar hundert Pfund für die Datenkonvertierung bezahlen. Kein Problem.
Vergleichen Sie mit einer früheren Situation bei einem anderen Unternehmen, für das ich gearbeitet habe. Der Lieferant hatte keine Möglichkeit, von den alten zu den neuen Systemen überzugehen. Dies brachte sie in die gleiche Situation wie alle anderen Lieferanten. Tatsächlich war ihre Situation schlimmer, weil wir wussten, dass sie nicht verpflichtet waren, uns bei den Upgrades zu helfen. Sie haben den neuen Vertrag nicht bekommen.
Sie haben die harte Arbeit geleistet, um Kunden zu gewinnen und zu halten. Wie können Sie den Übergang erleichtern?
quelle