Wie lange muss ich warten, bevor ich eine veraltete Methode lösche? [geschlossen]

38

Ich verwalte eine öffentliche API und muss eine Methode ablehnen.

Gibt es eine allgemeine Regel darüber, wie viele Monate / Jahre / Versionen vor dem Löschen eine Methode abgelehnt werden soll?

deviDave
quelle
27
Die allgemeine Regel lautet: "Behalten Sie es so lange bei sich, wie Sie und / oder Ihre Kunden es brauchen."
Robert Harvey
15
Definieren Sie "öffentlich". Kostenlose Open-Source-Software mit dem üblichen Haftungsausschluss "auf eigene Gefahr"? Oder verkaufte Software, wo ein Vertrag besteht?
Doc Brown
11
Dies hängt stark davon ab, auf welchem ​​Markt Ihre Benutzer tätig sind und ob sie Ihnen Geld für die API zahlen.
17. vom 26.
10
Es kommt auch darauf an, warum Sie es "abschreiben" müssen; ist der alte weg ein sicherheitsrisiko? Haben Sie gerade einen Grund gefunden, warum der alte Weg aufgrund einer unglücklichen Designentscheidung grundlegend und unfixierbar instabil ist? Ist der alte Weg jetzt viel langsamer als früher? Ist auf Ihrem Zielsystem (z. B. einem eingebetteten System) nicht genügend Arbeitsspeicher vorhanden und können nicht beide APIs darauf passen? Oder haben Sie einfach einen "besseren" Weg gefunden und möchten einfach den alten Code entfernen, um den Wartungsaufwand zu verringern?
JRH
8
java.io.StringBufferInputStreamveraltet seit JDK 1.1 (1997?). Es gibt keine gute oder falsche Antwort auf diese Frage. Es hängt von Ihren Anforderungen ab, Abwärtskompatibilität bereitzustellen.
Laiv

Antworten:

52

Zumindest sollten Sie veraltete Methoden in einer Version belassen, bevor Sie sie entfernen, was beim Ausschreiben offensichtlich erscheint. Ich glaube nicht, dass es eine maximale Zeit gibt, aber wenn Sie sie nie wirklich entfernen, wird die Abwertung ein wenig sinnlos.

Hauptversionsversionen sind ein guter Zeitpunkt, um veraltete Methoden zu entfernen. Kleinere Releases sollten normalerweise keine wichtigen Änderungen enthalten. Wie cHao in den Kommentaren angemerkt hat, impliziert die Nichtbeachtung nicht unbedingt, dass eine eventuelle Entfernung erfolgt. Wenn Sie also vorhaben, Dinge nach der Nichtbeachtung zu entfernen, sollten Sie dies ausdrücklich beachten und einige Hinweise auf der Zeitachse geben.

JimmyJames
quelle
58
Bei der Ablehnung geht es nicht unbedingt um das spätere Entfernen. Daher ist eine Ablehnung ohne Entfernung nicht sinnlos (und ist häufig die richtige Wahl, wenn Abwärtskompatibilität wichtig ist). Oft ist der Punkt nichts anderes als "Wir haben jetzt einen besseren Weg, also solltest du es nicht mehr so ​​machen".
cHao
9
@cHao Wenn etwas veraltet ist, sollten Sie nicht damit rechnen, dass es weiterhin vorhanden ist. Ich nehme an, wenn Sie in Ihrem Projekt eine spezielle Aussage machen möchten, die besagt, dass Sie veraltete Funktionen nicht entfernen, ist das in Ordnung, aber ansonsten impliziert dies, dass es letztendlich zu einer Entfernung kommt. Der Punkt, den ich anspreche, ist, dass die Leute glauben, dass es niemals passieren wird, wenn Sie diesbezüglich keine Strenge einhalten. Dies ist bei den jüngsten Java-Versionen der Fall, bei denen Funktionen, die seit einem Jahrzehnt oder länger veraltet sind, nun entfernt werden.
JimmyJames
6
@cHao Ich würde lieber ein Projekt entfernen, dessen veraltete Funktionalität. Dies hat nicht nur den Vorteil, dass Benutzer tatsächlich zum Wechseln motiviert werden, sondern verhindert auch, dass die veraltete Benutzeroberfläche andere Verbesserungen beeinträchtigt.
jpmc26
9
@cHao Es ist eine kontextsensitive Sache. Nach meiner Erfahrung ist die Politik der Abwertung klar. Es ist eindeutig festgelegt, dass veraltete Funktionen zu einem späteren Zeitpunkt entfernt werden. Häufig treten bei veralteten Funktionen Probleme auf, die die Verwendung problematisch machen, und es kommt nicht nur darauf an, ob Sie Wert auf Abwärtskompatibilität legen oder nicht.
JimmyJames
6
Ich werde mich anschließen, um @JimmyJames zuzustimmen, dass die Abwertung eindeutig eine bevorstehende Entfernung impliziert. Der Verfallszeitraum dient dazu, eine vorübergehende Abwärtskompatibilität zu gewährleisten, damit die Konsumenten auf die neueren Funktionen migrieren können. Es ist absolut nicht zu erwarten, dass die veraltete Funktionalität auf unbestimmte Zeit erhalten bleibt. Wenn die alte Funktionalität erhalten bleibt, gibt es keinen Grund, sie zu verwerfen.
Eric King
17

Dies hängt ausschließlich davon ab, welche Stabilitätsgarantien Sie Ihren Benutzern gegeben haben und wie viel Schmerz Sie Ihren Benutzern zufügen möchten.

Idealerweise verwendet Ihre API Semver, sodass bei jeder Änderung die Hauptversionsnummer erhöht wird. In der Praxis ist es wünschenswert, dies so gut wie nie zu tun. Wenn Ihre API über einen Paketmanager installiert wird, möchten Sie möglicherweise nach einer Änderung einen neuen Paketnamen erstellen, damit bei einem einfachen Upgrade keine Konflikte auftreten (z . B. myapi2 v2.123.4vs myapi3 v3.2.1). Dies ist möglicherweise nicht erforderlich, wenn Ihr Paketmanager engere Versionsabhängigkeiten unterstützt (z. B. eine solche Abhängigkeitsspezifikation ~v2.120enthält keine v3.*). Unterschiedliche Paketnamen haben jedoch den Vorteil, dass inkompatible Versionen sehr einfach nebeneinander verwendet werden können. Auch bei der Verwendung von Semver kann es sinnvoll sein, einen Verfallszeitraum festzulegen.

Semver ist nicht immer anwendbar. Dann ist es wichtiger, eine klare Stabilitätspolitik zu kommunizieren. Beispielsweise:

  • Experimentelle Funktionen können ohne vorherige Ankündigung entfernt werden.
  • Funktionen können aus Sicherheitsgründen jederzeit entfernt werden.
  • Andere Funktionen werden nur entfernt
    • … Nachdem sie in einer veröffentlichten Version veraltet waren
    • … Wo diese Version mindestens drei Monate alt ist
    • … Und werden in der Hauptversion durch eine Unebenheit gekennzeichnet.

Solche Richtlinien funktionieren besonders gut, wenn Sie regelmäßige Veröffentlichungen haben, sodass ein eindeutiger Verfallszeitraum vorliegt, z. B. ein Jahr.

Abgesehen davon, dass Sie Teile der API als veraltet markieren, sollten Sie die Veraltetheit weithin bekannt machen. Beispielsweise:

  • Verfügen Sie in Ihrem Änderungsprotokoll über zukünftige Anweisungen und Ablehnungen.
  • Übertragen Sie Ihre Absicht, zu missbilligen, bevor Sie die Missbilligung durchführen, und lauschen Sie der Community, um festzustellen, ob wesentliche Einwände bestehen.
  • Teilen Sie mit, welchen Nutzen diese Änderungen haben werden. Je nach Benutzerbasis sind Newsletter, Präsentationen, Blogposts oder Pressemitteilungen geeignete Medien. Eine Runde drehen “Wir entwickeln eine großartige neue Funktion! (was erfordert, dass dieses weit verbreitete alte Feature entfernt wird) “ist ein bisschen weniger frustrierend als das Entfernen eines Features ohne Kontext.

Prüfen Sie zunächst, ob Sie den genauen Verfallszeitraum festlegen müssen, für den Sie Support-Verträge mit Ihren Benutzern abschließen müssen. Solche Verträge erfordern möglicherweise, dass Sie die Kompatibilität für einen bestimmten Zeitraum aufrechterhalten. Wenn nicht, ziehen Sie nachgeschaltete Auswirkungen in Betracht. Versuchen Sie, weniger schnell als nachgeschaltete Benutzer zu wechseln, damit sie einen eigenen Verfallszyklus durchlaufen können. Nachgeschaltete Benutzer werden einige Zeit benötigen, um sich an Ihre Änderungen anzupassen. Sie sollten daher niemals einen kürzeren Verfallszeitraum als einen Monat festlegen.

amon
quelle
3
Aus diesem Grund herabgestuft: Ideally, your API uses semver so that any breaking change causes the major version number to be incremented. In practice, it is desirable to do this almost never.Wozu Semver verwenden, um aktuelle Änderungen anzuzeigen, wenn Sie dem folgen und sagen, dass Sie niemals eine neue Hauptversion einführen sollten?
mrsmn
6
Ist es wirklich eine gute Idee, das Paket umzubenennen, wenn es eine größere Änderung gibt? Dafür sind Versionsnummern da. Ich hasse es, wenn sie sie auch umbenennen. Das bringt das Maven-Abhängigkeitsmanagement durcheinander.
AJPerez
@AJPerez Ich verstehe, dass das nicht ideal ist, aber es kann Konflikte in großen Abhängigkeitsgraphen mit transitiven Abhängigkeiten verhindern: Ich bin von libfoo abhängig, das von libconflict v1.2.3 abhängt, und ich bin auch von libbar abhängig, das von libconflict v2.3.4 abhängt. Dann kann ich keine libconflict-Version auswählen, die alle Abhängigkeiten erfüllt - es sei denn, libconflict und libconflict2 sind unterschiedliche Pakete. Speziell für Java ist eine solche Umbenennung ärgerlich, da ich alle Importe ändern muss. Glücklicherweise unterstützt Java 9 (Module) die Verwendung widersprüchlicher Versionen.
amon
1
@mrsmn Breaking Changes sind ärgerlich, egal wie Sie sie verpacken oder benennen. Semver behebt nur einen kleinen Teil dieses Problems: Er kann feststellen, ob ein Upgrade irgendetwas kaputt macht. Aber wenn Sie einmal eine Änderung vorgenommen haben, müssen Sie sich immer noch anstrengen, um diese Änderung zu bewältigen. Daher ist es besser, wenn APIs sich sehr bemühen, so stabil wie möglich zu sein. Im Idealfall sind sie so konzipiert, dass sie erweitert werden können, ohne die Abwärtskompatibilität zu beeinträchtigen.
amon
@ AjPerez ja. Ja es ist gut. Die Leute vermasseln die Versionsverwaltung ständig. Fehlerkorrekturen (vermutet xxx ++) brechen häufig (vermutet x ++. Xx). Amon weist darauf hin, dass Sie (und ich meine Sie als Benutzer der Abhängigkeit) ein Problem haben, das Sie beheben müssen. Ich weiß, dass mein Code mit foo 3.2.1 funktioniert. Möglicherweise funktioniert er mit foo 3.3.0. Ich weiß, dass mein Code mit foo funktioniert, es kann mit foo-2 funktionieren. Ich benutze Semver, weil Popularität und es per se nicht weh tut, aber es ist mir wirklich nicht klar, dass es dir so viel einkauft.
Jared Smith
14

Idealerweise sollten Sie warten, bis niemand mehr die veraltete Methode verwendet. Angesichts der Tatsache, dass Sie eine öffentliche API verwenden, ist dies leicht nachzuverfolgen, aber Sie müssen möglicherweise sehr lange warten.

2015 hatte Google ein ähnliches Problem mit der stlport-API auf seinem Android-Betriebssystem. Sie hatten es abgelehnt und wollten es entfernen, aber Tonnen von Apps verwendeten es immer noch. Sie fanden eine clevere Lösung:

Bildbeschreibung hier eingeben

Im Wesentlichen fügten sie während des Startvorgangs einer App, die noch die API mit einer entsprechenden Protokollmeldung für die Entwickler verwendete, 8 Sekunden sleep () hinzu. Einen Monat später verdoppelten sie es auf 16 Sekunden. Dann, einen weiteren Monat später, konnten sie die API-Schnittstelle sicher entfernen, da niemand mehr damit beschäftigt war.

Dies kann ein sehr effektiver Weg sein, dies zu tun. Das einzige wirkliche Problem besteht darin, dass Ihre API sehr alt ist und aktiv Konsumenten verwendet hat, die nicht mehr aktiv unterstützt werden. Leider werden Sie solche Konsumenten wahrscheinlich nicht selbst reparieren können, aber zu diesem Zeitpunkt können Sie nicht mehr tun, als die Methode zu löschen und den Konsumenten zu brechen.

Nzall
quelle
5
Süß. Sehr hübsch.
David Hammen
8

Die Mindestzeit für die Bereitstellung veralteter Methoden hängt von den Entwicklungszyklen der Programme ab, die Ihre API verwenden. Als Richtwert sollte ein Jahr ausreichen.

In Bezug auf die maximale Zeit, bevor Sie veraltete Methoden entfernen müssen, würde ich argumentieren, dass es so etwas nicht gibt. Unabhängig davon, wie lange Sie warten, führt das Entfernen einer veralteten Methode immer zu Problemen. Einige Programme, die Ihre veraltete API verwenden, werden nicht aktiv gewartet, und ein Abbruch der Kompatibilität bedeutet das Ende der Lebensdauer solcher Programme.

Ich schlage vor, dass Sie veraltete Methoden entfernen, wenn Sie durch das Entfernen etwas gewinnen :

  • Es wird ein Fehler festgestellt, der sich speziell auf veraltete Methoden auswirkt
  • Sie sind dabei, den Code umzugestalten, und die Wartung veralteter Methoden würde erheblichen Aufwand erfordern
  • Sie optimieren die interne Struktur Ihrer Bibliothek, und veraltete Methoden passen nicht mehr hinein.

Das Entfernen veralteter Methoden, nur weil sie für X Monate / Jahre veraltet waren oder weil Sie eine neue Version veröffentlichen, führt zu einer willkürlichen Beeinträchtigung der Kompatibilität ohne triftigen Grund.

Dmitry Grigoryev
quelle
7

Zuerst sollten Sie überlegen, ob Sie veraltet oder veraltet sein möchten.

Veraltet sollte für Methoden verwendet werden, die auf irgendeine Weise schädlich sind: Sicherheit, Leistung, falsche Ergebnisse. Sie wollen sie relativ schnell loswerden, nicht mehr als 2 Hauptversionen und bis zum 3. gegangen. Veraltete werden möglicherweise in der nächsten Nebenversion gelöscht, wenn es zu erheblichen Problemen kommt.

Veraltet ist für Dinge, die aus irgendeinem Grund weniger nützlich sind, zum Beispiel weniger Informationen zurückgeben oder nicht so gut funktionieren, nicht so viele Optionen enthalten und so weiter. Diese können auf unbestimmte Zeit herumhängen, sollten aber in der nächsten Hauptversion mindestens vorhanden sein.

jmoreno
quelle
Ich würde sagen, dass eine Methode, die falsche Ergebnisse liefert oder die Sicherheit beeinträchtigt, entweder sofort deaktiviert oder behoben werden sollte. Eine Methode mit schlechter Leistung kann unbegrenzt herumhängen, solange ihre Leistung für einige Benutzer akzeptabel ist.
Dmitry Grigoryev
@DmitryGrigoryev: eine einzelne Nebenversion ist ziemlich nah an sofort.
Jmoreno
4

Die Antwort hängt davon ab, welche Art von Service Sie Ihren Kunden anbieten.

Am Ende des Extrems gibt es in Windows.h Fehler aus der Win 3.1-Ära, die sich über zwei Jahrzehnte verbreiteten, weil Microsoft sehr stark an die Abwärtskompatibilität glaubte.

Am anderen Ende des Spektrums entfernen viele Web-Apps Funktionen, ohne dass eine Warnung vor Verfall ausgegeben wird.

Wie viel Ihre Kunden für Ihre Software bezahlen, ist häufig von Bedeutung, ebenso wie die Art ihrer Arbeit. Forscher sind in der Regel eher bereit, im Zuge des Fortschritts eine Abwertung zu akzeptieren als etwa Banker oder die FAA.

Ich arbeitete für eine Firma, die Software für den internen Gebrauch entwickelte. Ich habe im Laufe der Jahre viele Gruppen unterstützt. Eine Gruppe hatte eine Mentalität "Niemals irgendein Merkmal entfernen". Sie mussten vor fünf bis zehn Jahren in der Lage sein, auf Dateien zurückzugreifen und diese in zu kurzer Zeit zu analysieren, um die Entwickler dazu zu bringen, die Funktionen wieder einzubauen kann sie später finden. " In der Mitte hatten wir eine Gruppe, deren Regel lautete: "Features müssen für mindestens eine Version mit einer gedruckten Warnung veraltet sein, wenn sie vor dem Entfernen verwendet werden." Diese Gruppe verfügte über eine Testsuite, die die benötigten Funktionen abdeckte. Immer wenn wir eine neue Version herausbrachten, überprüften sie ihre Testsuite, um festzustellen, ob eine der Abwertungen Probleme bereitete.

Cort Ammon
quelle
4

Ich verwalte eine öffentliche API und muss eine Methode ablehnen.

Warum musst du das tun? Liegt es daran, dass es eine neue, glänzende Art gibt, Dinge zu tun, sodass die alte Methode jetzt nicht mehr empfohlen wird, aber immer noch funktioniert? Oder muss die alte Methode tatsächlich gehen, weil sich die Dinge grundlegend geändert haben?

  • Wenn die alte Methode keine tatsächlichen Probleme verursacht und durchhalten kann , kann dies auch der Fall sein. Wenn es nicht kaputt ist, reparieren Sie es nicht. Müssen Sie es wirklich entfernen? Markieren Sie es möglicherweise als veraltet und fügen Sie in die Dokumentation den Hinweis ein, dass eine andere Methode möglicherweise effizienter ist, oder was auch immer, aber es ist wahrscheinlich in Ordnung, sie an Ort und Stelle zu belassen.

  • Wenn die alte Methode wirklich zu Ende gehen muss, weil sie Ihnen Wartungsprobleme bereitet oder weil sie aufgrund anderer Änderungen keinen Sinn mehr ergibt, überwachen Sie ihre Verwendung und teilen Sie den Kunden die Ablehnung klar mit. Geben Sie ein klares Datum an, nach dem die Methode entfernt wird. (Entfernen Sie es an diesem Datum im Idealfall nicht sofort. Warten Sie, bis es noch von niemandem verwendet wird, bevor Sie es tatsächlich entfernen. Wenn es wirklich Probleme verursacht, muss es möglicherweise früher beendet werden. Warten Sie jedoch mindestens, bis die Verwendung a gelöscht wird wenig.)

  • Wenn die alte Methode Sicherheitsprobleme verursacht, müssen Sie möglicherweise schneller vorgehen und diese möglicherweise sogar ohne Vorwarnung entfernen. Sie sollten diese Änderung jedoch an einer sehr gut sichtbaren Stelle dokumentieren und sinnvolle Nachrichten an Clients zurückgeben, die versuchen, die alte Methode zu verwenden.

(Die zweiten beiden Punkte sind in anderen Antworten gut behandelt, aber ich denke, der erste ist neu.)

TRiG
quelle
1

Entfernen Sie ein öffentliches Projekt nur dann, wenn dies erforderlich ist.

Wenn Sie unnötige API-Entfernungen durchführen, kosten Sie Unternehmen und Auftragnehmern so viel Geld, dass Sie aufgrund kostspieliger Abwanderung nicht einmal kalkulieren können.

Möchten Sie, dass Unternehmen und unabhängige Programmierer Ihr Projekt nicht mehr verwenden? Brechen Sie ihre Sachen oft genug, wenn Sie nicht unbedingt erforderlich sind und Sie in kürzester Zeit in diesem Boot sind.

deprecation != eventual_removal. Wenn eine API gefährlich ist, entfernen Sie sie. Wenn es nur alt ist, lassen Sie es und dokumentieren Sie seinen Ersatz.

kayleeFrye_onDeck
quelle