Zukunftssicherer Code

33

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?

John Shaft
quelle
5
Ich denke, dass der einzige zukunftssichere Code ... gut Leerzeichen ist. :)
Adam Arold
6
"Just in time, nicht nur für den Fall".
Rein Henrichs
4
@edem Ich bin anderer Meinung, diese Sprache unterscheidet sich nicht von anderen für die Zukunftssicherheit ... (^ _—) de.wikipedia.org/wiki/Whitespace_(programming_language)
Izkata

Antworten:

62

Zunächst einmal gibt es einige Dinge, die geklärt werden müssen:

  • Zukunftssicherheit fügt nichts hinzu.
  • Die Zukunftssicherheit stellt sicher, dass Sie Code / Funktionen problemlos hinzufügen können , ohne die vorhandenen Funktionen zu beeinträchtigen.

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

Pop Catalin
quelle
Diese und @ Thorbjørn Ravn Andersens Antwort bezüglich der kombinierten Tests wäre die perfekte Antwort.
Andy Lowry
2
Ich habe es oft gesehen, "ho wir werden das hinzufügen, weil wir es eines Tages brauchen", entweder kommt der Tag nie, oder wenn es gut geht, stecken Sie mit einer Datenstruktur oder Programmstruktur fest, die nicht wirklich passt der tatsächliche Bedarf, wenn es endlich entsteht. Der richtige Weg wäre dann, das alte Zeug herauszunehmen und neu aufzubauen, aber normalerweise ist die Tendenz zur Zukunftssicherheit wie diese oft mit einer starken Verachtung verbunden, Code wegzuwerfen, der bereits getan wurde, egal ob er gut ist oder nicht. Solche Teams tendieren normalerweise zum Zwiebel-Design und maskieren Fehler aus einer Ebene mit einer weiteren Ebene.
Newtopian
Zukünftiges Prüfen fügt möglicherweise keine Funktionen hinzu , Sie können jedoch Code hinzufügen. Eine Technik besteht darin, Sicherheitsüberprüfungen hinzuzufügen und undefiniertes Verhalten explizit zu verbieten.
edA-qa mort-ora-y
18

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
+1: Es ist so schwer, die Zukunft vorherzusagen. Einfach gutes Design zu verwenden - und es als "gutes Design" zu bezeichnen - ist besser, als vorzugeben, die Zukunft vorherzusagen.
S.Lott
17

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'.

mrwooster
quelle
1
+1 für die Unterscheidung zwischen "zukunftssicher" und "für den Fall, dass es für die Zukunft benötigt wird"
John Shaft
2
Sound Design Beratung. Das einzige, was dabei fehlt, ist eine klare Aussage, dass "zukunftssicher" nur eine bedeutungslose Parole ist, die "einigermaßen gut designt" bedeutet.
S.Lott
11

Ü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.

Subu Sankara Subramanian
quelle
3
Schlagen Sie vor "Gott sei Dank habe ich das vor 2 Jahren geschrieben!" ist selten? Nach meiner Erfahrung ist es nie passiert, aber vielleicht bin das nur ich.
S.Lott
4
Es ist ein sehr seltenes Ereignis, da Codebasen, die ohne 2 Jahre solide bleiben / Änderungen in 2 Jahren vorhersagen, sehr schwer zu bekommen sind.
Subu Sankara Subramanian
2
Nun, ich hatte tatsächlich einige Momente "Gott sei Dank, ich habe das vor einem Jahr geschrieben". Ich bin schlauer als ich denke.
Falcon
1
@ Falcon möchten auf diese Momente näher eingehen? Es wäre sehr interessant zu wissen, welche Sie richtig verstanden haben.
7

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.

edA-qa mort-ora-y
quelle
6

Guter, sauberer und gut organisierter Code ist in dem Sinne zukunftssicher, dass Änderungen und Ergänzungen leichter korrekt implementiert werden können.

Larry Coleman
quelle
5

"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.

  1. 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.

  2. 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.

S.Lott
quelle
5

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
4

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:

  1. Das Programm ist jetzt komplizierter als es sein muss.
  2. Möglicherweise benötigen Sie die Funktion nie, daher haben Sie Ihre Zeit verschwendet.
  3. Sie wissen nicht, welche Anforderungen an die Funktion gestellt werden, falls Sie jemals danach gefragt werden. Also musst du es herausfinden und es trotzdem modifizieren.

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.

Dave
quelle