Wo ich arbeite, sagen mir die Entwickler immer: "Ich habe dies nur für den Fall der Zukunft hinzugefügt" oder "Ich denke, es ist eine gute Idee, dies zu tun, weil sie es wahrscheinlich eines Tages wollen werden." Ich finde es großartig, dass sie proaktiv versuchen, zukünftige Änderungen zu antizipieren, aber ich kann nicht anders, als zu denken, dass dies unnötig ist und das Risiko besteht, Code zu schreiben, der möglicherweise nie benötigt wird und daher unproduktiv ist (ich denke auch, dass einige Entwickler nur etwas ausprobieren möchten) neu deswegen). Sind die Argumente für die Zukunftssicherung ungültig, wenn Sie nur guten, übersichtlichen Code schreiben?
productivity
programming-practices
John Shaft
quelle
quelle
Antworten:
Zunächst einmal gibt es einige Dinge, die geklärt werden müssen:
Dies bedeutet, dass das Schreiben von "zukunftssicherem" Code sicherstellt, dass der Code lose gekoppelt und ausreichend abstrakt geschrieben ist, aber auch Code, der Abstraktionsebenen nicht vollständig verbirgt, sodass es immer einen Weg gibt, zu den niedrigeren Abstraktionsebenen zu gelangen im Bedarfsfall.
Das Schreiben von zukunftssicherem Code ist eine Kunst für sich und steht in engem Zusammenhang mit SOLID-Verfahren für die Versionsverwaltung von Komponenten, die Trennung von Bedenken, die Schichtung und die Abstraktheit der Funktionalität. Die Zukunftssicherheit hat nichts damit zu tun, Features vorab hinzuzufügen, sondern sicherzustellen, dass Sie Features in Zukunft auf unterbrechungsfreie Weise hinzufügen können, indem Sie vorhandene Codes / Bibliotheken gut gestalten.
Mein 2c
quelle
Schreiben Sie keinen Code, der für längere Zeit nicht verwendet wird. Es wird nutzlos sein, da es höchstwahrscheinlich nicht den Anforderungen zu diesem Zeitpunkt entspricht (die Sie per Definition noch nicht kennen).
Machen Sie den Code robust gegen unerwartete Problemsituationen, die eine ordnungsgemäße Wiederherstellung oder ein schnelles Fehlschlagen ermöglichen. Schreiben Sie jedoch keinen Code für eine mögliche spätere Verwendung.
Ein guter Weg, dies sicherzustellen, ist die Verwendung von testgetriebenem Design und Entwicklung. Testfälle werden aus der Spezifikation und den Anwendungsfällen abgeleitet. Der gesamte Code muss einen Test bestehen. Nicht benötigter Code sollte nicht geschrieben werden. Auf diese Weise lässt sich leicht feststellen, ob dies erforderlich ist oder nicht.
quelle
Es ist wichtig zu wissen, dass es zwei sehr unterschiedliche Dinge sind , Code zukunftssicher zu machen und Code für den Fall zu schreiben , dass er in Zukunft benötigt wird . Ersteres ist für eine gute Anwendung von entscheidender Bedeutung, weniger ist normalerweise keine gute Codierungspraxis.
Wenn ich den Code für die Zukunft prüfe, schreibe ich ihn so, dass er mit den sich entwickelnden Technologien interagieren kann. Dies beinhaltet die Modularisierung Ihres Codes, sodass jeder Teil Ihrer Anwendung unabhängig von der Sprache und Technologie der gesamten Anwendung interagieren kann. Ein gutes Beispiel hierfür wäre die Verwendung von XML oder JSON, um Daten zwischen verschiedenen Teilen der Anwendung zu übertragen. Unabhängig von der technologischen Entwicklung ist es sehr wahrscheinlich, dass XML und JSON immer gelesen werden können.
Ähnlich wie oben erzielt das Offenlegen eines Teils Ihrer Anwendung über eine SOAP- oder REST-API ein ähnliches Ergebnis. Unabhängig davon, welche Technologien sich weiterentwickeln, müssen Sie nicht unbedingt jeden Teil der Anwendung neu schreiben, da neue Technologien weiterhin mit alten kommunizieren können.
Wenn es darum geht , Code für den Fall zu schreiben , dass er benötigt wird , halte ich dies für sehr gefährlich, da der Code wahrscheinlich kaum oder gar nicht getestet wird.
Machen Sie Code also auf jeden Fall zukunftssicher (die NASA sendet immer noch Raumschiffe mit Fortran), aber schreiben Sie keinen Code 'nur für den Fall'.
quelle
Überlegen Sie, wie oft Sie einen Code in einer Produktionsumgebung aktiviert haben und dachten: "Gott sei Dank, das habe ich vor 2 Jahren geschrieben!".
Der Code sollte leicht modifizierbar / erweiterbar sein. Fügen Sie keinen Code hinzu, der nicht sofort erforderlich ist, da dies ein sehr falsches Sicherheitsgefühl vermittelt und Entwicklungs- / Testressourcen in einer Welt sich ändernder Anforderungen verschwendet.
quelle
Viele der anderen Antworten befassen sich mit größeren Designproblemen oder sind eher abstrakt. Wenn Sie überlegen, was in Zukunft passieren wird, können Sie klare Techniken definieren, um den Code zukunftssicherer zu machen .
Denken Sie in erster Linie, dass in Zukunft jemand versuchen wird, dem Code eine Funktion hinzuzufügen, oder versuchen wird, Ihren Code an einer anderen Stelle wiederzuverwenden. Möglicherweise versuchen sie auch, eine Funktion im Code zu korrigieren. Natürlich ist nur ein guter sauberer Code ein erforderlicher Ausgangspunkt, aber es gibt auch einige spezifische Techniken, die durchgeführt werden können.
Defensive Programmierung : Überprüfen Sie Ihre Eingaben über das hinaus, was Ihre aktuelle Anwendung tatsächlich benötigt. Stellen Sie beim Aufrufen von APIs sicher, dass Ihre Eingaben erwartungsgemäß sind. In Zukunft werden die Leute neue Codeversionen zusammenmischen, so dass sich der Umfang der Fehler und die API-Rückgaben von dem, was sie jetzt sind, ändern werden.
Nicht definiertes Verhalten eliminieren : Viele Codes weisen ein Verhalten auf, das sich nur aus dem Nichts entwickelt. Bestimmte Kombinationen von Eingaben führen zu bestimmten Ausgaben, die eigentlich niemand beabsichtigt hat, aber nur so geschehen. Jetzt wird sich zwangsläufig jemand auf dieses Verhalten verlassen, aber niemand wird davon erfahren, da es nicht definiert ist. Jeder, der versucht, das Verhalten in Zukunft zu ändern, wird die Dinge versehentlich zerbrechen. Verwenden Sie jetzt Sicherheitsüberprüfungen und versuchen Sie, alle nicht definierten Verwendungen des Codes zu entfernen / zu blockieren.
Automated Test Suite : Ich bin sicher, Sie finden Bände, die über die Notwendigkeit von Komponententests geschrieben wurden. In Bezug auf die Zukunftssicherheit ist dies jedoch ein kritischer Punkt, damit jemand den Code umgestalten kann. Refactoring ist für die Aufrechterhaltung eines sauberen Codes unabdingbar. Fehlt jedoch eine gute Testsuite, kann das Refactoring nicht sicher durchgeführt werden.
Isolation und Trennung : Die Verkapselung und ordnungsgemäße Modularisierung ist ein gutes Konstruktionsprinzip, aber Sie müssen darüber hinausgehen. Sie werden häufig feststellen, dass Sie eine Bibliothek, eine API oder ein Produkt verwenden müssen, die / das eine fragwürdige Zukunft haben könnte. Möglicherweise aufgrund von Qualitätsproblemen, Lizenzproblemen oder der Weiterentwicklung durch die Autoren. In diesen Fällen dauert es etwas länger, bis eine Ebene zwischen Ihnen und diesem Code liegt. Reduzieren Sie die API auf das, was Sie benötigen, sodass die Kopplung sehr gering ist, um in Zukunft einen einfacheren Austausch zu ermöglichen.
quelle
Guter, sauberer und gut organisierter Code ist in dem Sinne zukunftssicher, dass Änderungen und Ergänzungen leichter korrekt implementiert werden können.
quelle
"Zukunftssicher" bedeutet bestenfalls "lose gekoppelte Konstruktion". 80% der Menschen meinen "flexibel", wenn sie "zukunftssicher" sagen. Manchmal sagen sie es, um zu versuchen, cool zu klingen. Aber zumindest liefern sie pünktlich etwas, das funktioniert.
"Future Proof" ist im schlimmsten Fall bedeutungslos. In 20% der Fälle ist dies eine Ausrede, um Zeit mit der Erforschung alternativer Technologien zu verschwenden, anstatt einfach etwas zu liefern. Sie liefern nichts (oder was sie liefern, ist zu komplex für das jeweilige Problem.)
Es gibt zwei Randfälle.
Unvergessliche Voraussicht. Man kann die Zukunft tatsächlich genau vorhersagen. In diesem Fall wenden Sie diese leistungsstarke Voraussicht an, um den Code zukunftssicher zu machen. Wenden Sie besser die unermüdliche Voraussicht an, um Markttrends vorherzusagen, sich vorzeitig zurückzuziehen und das Programmieren zu beenden.
Man "fährt" die Zukunft. Das heißt, man verfügt über eine neue Technologie, die in Zukunft bereitgestellt werden kann und die eine Neuformulierung der derzeit bereitgestellten Technologie erfordert. Das ist komisch, dass man diese coole Zukunftssache nicht zuerst einsetzt.
Wir müssen Projekt "A" liefern, da wir wissen, dass Projekt "B" zu einer sofortigen Neufassung von "A" führen wird. Nur in diesem Fall können wir möglicherweise "A" für die Zukunft prüfen.
quelle
YAGNI = Du wirst es nicht brauchen .
Ihre Instinkte sind korrekt: Ihr Code ist überflüssig, erhöht die Wartungs- und Testlast und verschwendet Zeit mit Dingen, die keinen konkreten Geschäftswert haben.
Siehe auch: Vergolden .
quelle
Ignorieren Sie den Titel der Frage und bleiben Sie bei der Hauptsache "Sachen einbauen, weil jemand sie eines Tages haben möchte" ...
Die Antwort ist nein. Noch nie. Schreiben Sie keinen Code, den Sie heute nicht brauchen. Hier ist der Grund:
Ich denke, der erste Punkt ist der wichtigste. Wenn Sie jemals mit einem System gearbeitet haben, das mit generischem Code für verschiedene Kunden durchsetzt ist oder überfüllt ist mit Funktionen, die Sie nicht benötigen, dann wissen Sie, wie viel zusätzlicher Zeit und Aufwand erforderlich ist, um die Funktionalität zu warten oder zu erweitern Das. Also unbedingt meiden.
quelle