Sauberer lesbarer Code im Vergleich zu schnellem, schwer lesbarem Code. Wann ist die Grenze zu überschreiten?


67

Wenn ich Code schreibe, versuche ich immer, meinen Code so sauber und lesbar wie möglich zu machen.

Hin und wieder kommt eine Zeit, in der Sie die Grenze überschreiten und von nettem sauberem Code zu etwas hässlicherem Code wechseln müssen, um ihn schneller zu machen.

Wann ist es in Ordnung, diese Grenze zu überschreiten?


69
Du hast deine eigene Frage beantwortet, du überquerst die Linie, wenn du die Linie überqueren
musst

6
Außerdem funktioniert Ihr "Dirty Code" in 6 Monaten möglicherweise genauso schnell wie "Clean Code" auf Hardware. Gehen Sie jedoch nicht über Bord wie Windows. :)
Mateen Ulhaq

21
Es gibt einen signifikanten Unterschied zwischen einem schwer verständlichen Algorithmus und einem schwer verständlichen Code. Manchmal ist der Algorithmus, den Sie implementieren müssen, kompliziert und der Code wird notwendigerweise verwirrend sein, einfach weil er eine komplexe Idee zum Ausdruck bringt. Aber wenn der Code selbst der schwierige Punkt ist, sollte der Code behoben werden.
Tylerl

8
In vielen Fällen kann ein intelligenter Compiler / Interpreter sauberen, lesbaren Code optimieren, sodass er die gleiche Leistung wie "hässlicher" Code aufweist. Es gibt also kaum eine Entschuldigung, es sei denn, die Profilerstellung sagt etwas anderes.
Dan Diplo

1
Wenn es heutzutage um Compiler geht, ist Ihr hässlicher Code höchstwahrscheinlich derselbe wie Ihr sauberer Code (vorausgesetzt, Sie machen keine wirklich seltsamen Dinge). Insbesondere in .NET ist es nicht wie in C ++ / MFC-Tagen, in denen sich die Definition Ihrer Variablen auf die Leistung auswirkt. Schreiben Sie wartbaren Code. Manche Codes werden einfach komplex, aber das heißt nicht, dass sie hässlich sind.
DustinDavis

Antworten:


118

Sie überqueren die Grenze, wenn

  • Sie haben festgestellt , dass Ihr Code für die beabsichtigte Verwendung zu langsam ist .
  • Sie haben alternative Verbesserungen ausprobiert, bei denen der Code nicht überarbeitet werden muss.

Hier ist ein Beispiel aus der Praxis: Ein experimentelles System, das ich verwende, produzierte Daten zu langsam. Es dauerte über 9 Stunden pro Lauf und verbrauchte nur 40% der CPU. Anstatt den Code zu sehr durcheinander zu bringen, habe ich alle temporären Dateien in ein In-Memory-Dateisystem verschoben. Es wurden 8 neue Zeilen nicht hässlichen Codes hinzugefügt, und die CPU-Auslastung liegt jetzt über 98%. Problem gelöst; Keine Hässlichkeit erforderlich.


2
Sie stellen auch sicher, dass Sie den ursprünglichen, langsameren und saubereren Code behalten, sowohl als Referenzimplementierung als auch, wenn sich die Hardware ändert und Ihr schnellerer, hackigerer Code nicht mehr funktioniert.
Paul R

4
@PaulR Wie behältst du diesen Code? In Form von Kommentaren? Das ist falsch, Imokommentare werden veraltet, niemand liest sie und wenn ich auskommentierten Code sehe, entferne ich ihn normalerweise - dafür ist die Quellcodeverwaltung gedacht. Ein Kommentar zu einer Methode, die erklärt, was sie tut, ist besser, imo.
Evgeni

5
@Eugene: Normalerweise behalte ich die ursprüngliche Version einer Routine mit dem Namen foound benenne sie um. Normalerweise befindet foo_refsie sich direkt darüber fooin der Quelldatei. In meinem Testgeschirr fordere ich foound foo_refzur Validierung und relativen Leistungsmessung.
Paul R

5
@Paul Wenn Sie dies tun, ist es möglicherweise eine gute Idee, den Test nicht zu bestehen, wenn die optimierte Version jemals langsamer als die ref-Funktion ist. Dies kann passieren, wenn die Annahmen, die Sie getroffen haben, um es schneller zu machen, nicht mehr zutreffen.
user1852503

58

Es ist eine falsche Zweiteilung. Sie können Code schnell und einfach pflegen.

Die Art und Weise, wie Sie es tun, ist, es sauber zu schreiben, insbesondere mit einer möglichst einfachen Datenstruktur.

Dann finden Sie heraus, wo die Zeit abläuft (indem Sie es ausführen, nachdem Sie es geschrieben haben, nicht vorher), und beheben Sie sie nacheinander. (Hier ist ein Beispiel.)

Hinzugefügt: Wir hören immer von Kompromissen, richtig, wie einem Kompromiss zwischen Zeit und Gedächtnis oder einem Kompromiss zwischen Geschwindigkeit und Wartbarkeit? Obwohl solche Kurven durchaus existieren können, sollte nicht angenommen werden, dass sich ein bestimmtes Programm auf der Kurve oder in der Nähe davon befindet.

Jedes Programm, das sich auf der Kurve befindet, kann auf einfache Weise (indem es einem bestimmten Programmierer übergeben wird) sowohl langsamer als auch weitaus weniger wartbar gemacht werden, und dann ist es bei weitem nicht in der Nähe der Kurve. Ein solches Programm hat dann viel Platz, um sowohl schneller als auch wartungsfreundlicher zu werden.

Nach meiner Erfahrung beginnen hier viele Programme.


Genau. Tatsächlich wird schneller Code, der nicht sauber ist, mit der Zeit langsamer, da Sie ihn nicht richtig ändern können.
edA-qa mort-ora-y

22
Ich stimme nicht zu, dass es eine falsche Zweiteilung ist; IMO gibt es Szenarien, insbesondere im Bibliothekscode (weniger im Anwendungscode ), in denen die Aufteilung sehr real ist. Siehe meine Antwort für mehr.
Marc Gravell

1
Marc, du kannst mit der "Link" -URL auf Antworten in Kommentaren verlinken. programmers.stackexchange.com/questions/89620/…

Wir haben alle Zeiten gefunden, in denen wir versuchen müssen, den Code schneller zu machen. Aber nach dem Experimentieren mit dem Profiler, um die beste Lösung zu finden (wenn der Code hässlich wird), bedeutet dies nicht, dass der Code hässlich bleiben muss. Es geht darum, die beste Lösung zu finden, die auf den ersten Blick nicht offensichtlich erscheint, die sich jedoch in der Regel sauber codieren lässt. Daher halte ich es für eine falsche Zweiteilung und nur eine Ausrede, Ihr Zimmer nicht aufzuräumen, nachdem Sie den Spaß an Ihren Spielsachen gehabt haben. Ich sage, saug es auf und räum dein Zimmer auf.
Martin York

Ich bin nicht einverstanden, dass es eine falsche Zweiteilung ist. Da ich viel Grafik arbeite, ist das offensichtlichste Beispiel für mich die enge Grafikschleife: Ich weiß nicht, wie oft dies noch gemacht wird, aber früher war es üblich, dass in C geschriebene Game-Engines Assembly für das Core-Rendering verwenden Schleifen, um den letzten Tropfen der Geschwindigkeit herauszudrücken. Das lässt mich auch an Situationen denken, in denen Sie in Python programmieren, aber in C ++ geschriebene Module verwenden. "Schwer zu lesen" ist immer relativ; Immer wenn Sie aus Gründen der Geschwindigkeit in eine niedrigere Sprache wechseln, ist dieser Code schwerer zu lesen als der Rest.
jhocking

31

In meiner OSS-Existenz mache ich eine Menge Bibliotheksarbeit, die auf Leistung abzielt und stark mit der Datenstruktur des Aufrufers (dh außerhalb der Bibliothek) verknüpft ist , ohne (beabsichtigt) das Mandat über die eingehenden Typen. Hier ist der beste Weg, um diese Performance zu verbessern, die Meta-Programmierung, was (da ich in .NET-Land bin) IL-Emit bedeutet. Das ist ein hässlicher, hässlicher Code, aber sehr schnell.

Auf diese Weise akzeptiere ich gerne, dass Bibliothekscode möglicherweise "hässlicher" als Anwendungscode ist, nur weil er weniger (oder möglicherweise keine) Kontrolle über die Eingaben hat und daher einige Aufgaben über verschiedene Mechanismen erledigen muss. Oder wie ich es neulich ausdrückte:

"Codierung über die Klippe des Wahnsinns, damit Sie nicht müssen "

Jetzt ist der Anwendungscode etwas anders, da "normale" (vernünftige) Entwickler in der Regel einen Großteil ihrer gemeinsamen / beruflichen Zeit investieren. Die Ziele und Erwartungen der einzelnen (IMO) sind leicht unterschiedlich.

IMO, die obigen Antworten, die darauf hindeuten, dass es schnell und einfach zu warten ist, beziehen sich auf Anwendungscode , bei dem der Entwickler mehr Kontrolle über die Datenstrukturen hat und keine Tools wie Metaprogrammierung verwendet. Das heißt, es gibt verschiedene Möglichkeiten, Metaprogramme zu erstellen, mit unterschiedlichem Wahnsinn und unterschiedlichem Overhead. Auch in diesem Bereich müssen Sie die entsprechende Abstraktionsebene auswählen. Aber wenn Sie aktiv und positiv sind, möchten Sie wirklich, dass unerwartete Daten auf die absolut schnellste Art und Weise verarbeitet werden. es kann durchaus hässlich werden. Beschäftige dich damit; p


4
Nur weil der Code hässlich ist, heißt das nicht, dass er nicht mehr zu warten ist. Kommentare und Einrückungen sind frei und hässlicher Code kann normalerweise in eine verwaltbare Entität (Klasse, Modul, Paket, Funktion, abhängig von der Sprache) eingekapselt werden. Der Code mag ebenso hässlich sein, aber dann können die Leute zumindest die Auswirkungen von Änderungen beurteilen, die sie daran vornehmen werden.
Tdammers

6
@tdammers in der Tat, und ich versuche dies so weit wie möglich zu tun; Aber es ist ein bisschen so, als würde man einem Schwein Lippenstift geben.
Marc Gravell

1
Nun, vielleicht sollte man zwischen hässlicher Syntax und hässlichen Algorithmen unterscheiden - hässliche Algorithmen sind manchmal notwendig, aber hässliche Syntax ist im Allgemeinen nicht zu entschuldigen.
Tdammers

4
@IMO hässliche Syntax ist ziemlich unvermeidlich, wenn das, was Sie tun, von Natur aus mehrere Abstraktionsebenen unterhalb der üblichen Sprachebene ist.
Marc Gravell

1
@ Marc ... das ist interessant. Meine erste Reaktion darauf, dass Meta / Abstract hässlich ist, war der Verdacht, dass die spezifische Sprache / Plattenform der Meta-Codierung nicht förderlich ist, und nicht ein Grundgesetz, das die beiden verbindet. Das, was mich glauben machte, war das Beispiel für fortschrittliche Metallebenen in der Mathematik, die mit Mengenlehre enden, deren Ausdruck kaum hässlicher ist als Algebra oder sogar konkretes Rechnen. Aber dann ist die Set-Notation wahrscheinlich eine völlig andere Sprache und jede darunter liegende Abstrationsstufe hat ihre eigene Sprache ...
explorest

26

Wenn Sie den Code profiliert und überprüft haben, dass er tatsächlich zu einer erheblichen Verlangsamung führt.


3
Und was ist "bedeutsam"?
Rook

2
@ hotpaw2: Es ist die intelligente Antwort - es wird davon ausgegangen, dass die Entwickler zumindest etwas kompetent sind. Ansonsten ist es (normalerweise) eine gute Idee, etwas schneller als die Blasensortierung zu verwenden. Aber zu oft tauscht jemand (um die Sortierung beizubehalten) die Quicksortierung gegen die Heapsortierung, um einen Unterschied von 1% zu erzielen. Nur um zu sehen, dass jemand anderes sie sechs Monate später aus demselben Grund zurücktauscht.

1
Es gibt nie einen Grund, nicht sauberen Code zu erstellen. Wenn Sie Ihren effizienten Code nicht sauber und pflegeleicht machen können, machen Sie etwas falsch.
edA-qa mort-ora-y

2
@SF. - Der Kunde wird es immer zu langsam finden, wenn es schneller sein kann. Er kümmert sich nicht um "cleanless" des Codes.
Rook

1
@Rook: Der Kunde findet den (trivialen) Schnittstellencode möglicherweise zu langsam. Einige ziemlich einfache psychologische Tricks verbessern das Benutzererlebnis, ohne die Ereignisse der Code-Verschiebung auf eine Hintergrundroutine zu beschleunigen, anstatt die Aktionen im laufenden Betrieb auszuführen, einen Fortschrittsbalken oder ähnliches anzuzeigen, und stellen einige unbedeutende Fragen, während die Aktivität im Hintergrund ausgeführt wird ... wenn diese nicht ausreichen, können Sie die tatsächliche Optimierung in Betracht ziehen.
SF.

13

Sauberer Code ist nicht unbedingt exklusiv für schnell ausgeführten Code. Normalerweise wurde schwer lesbarer Code geschrieben, weil er schneller zu schreiben war und nicht, weil er schneller ausgeführt wurde.

Es ist wohl unklug, "schmutzigen" Code zu schreiben, um ihn schneller zu machen, da Sie nicht sicher sind, ob Ihre Änderungen tatsächlich etwas verbessern. Knuth drückte es am besten aus:

"Wir sollten kleine Wirkungsgrade vergessen, sagen wir in 97% der Fälle: Vorzeitige Optimierung ist die Wurzel allen Übels . Dennoch sollten wir unsere Chancen in diesen kritischen 3% nicht verpassen. Ein guter Programmierer wird von solchen nicht zur Selbstzufriedenheit gebracht." Wenn er argumentiert, wird er sich den kritischen Code genau ansehen, aber erst, nachdem dieser Code identifiziert wurde . "

Mit anderen Worten, schreiben Sie den Code zuerst sauber. Profilieren Sie dann das resultierende Programm und prüfen Sie, ob dieses Segment tatsächlich ein Leistungsengpass ist. Wenn dies der Fall ist, optimieren Sie den Abschnitt nach Bedarf und fügen Sie zahlreiche Dokumentationskommentare (möglicherweise einschließlich des Originalcodes) hinzu, um die Optimierungen zu erläutern. Erstellen Sie dann ein Profil des Ergebnisses, um zu überprüfen, ob Sie tatsächlich eine Verbesserung vorgenommen haben.


10

Da die Frage "schnell schwer lesbarer Code" lautet, lautet die einfache Antwort "nie". Es gibt keine Entschuldigung dafür, schwer lesbaren Code zu schreiben. Warum? Zwei Gründe.

  1. Was passiert, wenn Sie heute Abend auf dem Heimweg von einem Bus angefahren werden? Oder (optimistischer und typischer) dieses Projekt abgebrochen und einer anderen Aufgabe zugewiesen? Der kleine Vorteil, den Sie sich mit Ihrem Wirrwarr an Code vorstellen, wird durch die Tatsache aufgewogen, dass niemand anderes es verstehen kann . Das Risiko, das dies für Softwareprojekte darstellt, ist schwer zu übertreiben. Ich habe einmal mit einer großen Telefonanlage gearbeitetHersteller (wenn Sie in einem Büro arbeiten, haben Sie wahrscheinlich eines ihrer Telefone auf Ihrem Schreibtisch). Der Projektmanager erzählte mir eines Tages, dass sein Kernprodukt - die proprietäre Software, die aus einer Standard-Linux-Box eine voll funktionsfähige Telefonvermittlung machte - im Unternehmen als "the blob" bekannt war. Niemand verstand es mehr. Jedes Mal, wenn sie eine neue Funktion implementierten. Sie drückten Compile, traten zurück, schlossen die Augen, zählten bis zwanzig und sahen dann mit den Fingern nach, ob es funktionierte. Kein Unternehmen benötigt ein Kernprodukt, das es nicht mehr kontrolliert, aber es ist ein erschreckend verbreitetes Szenario.
  2. Aber ich muss optimieren! OK, Sie haben alle hervorragenden Ratschläge befolgt, um diese Frage zu beantworten: Ihr Code besteht seine Leistungstestfälle nicht, Sie haben es sorgfältig analysiert, die Engpässe identifiziert, eine Lösung gefunden ... und es wird geschehen beinhalten ein bisschen Twiddling . Gut: Jetzt mach weiter und optimiere. Aber hier ist das Geheimnis (und vielleicht möchten Sie sich für dieses hier hinsetzen): Optimierung und Verkleinerung des Quellcodes sind nicht dasselbe. Kommentare, Leerzeichen, Klammern und aussagekräftige Variablennamen sind wichtige Hilfsmittel für die Lesbarkeit, die Sie absolut nichts kosten, da der Compiler sie wegwirft. (Oder wenn Sie eine nicht kompilierte Sprache wie JavaScript schreiben - und ja, es gibt sehr gute Gründe, JavaScript zu optimieren -, können sie von einem Kompressor verarbeitet werden .) Lange Zeilen mit beengtem, minimalistischem Code (wie der von muntoo) hier gepostet ) haben nichts mit Optimierung zu tun: Das ist ein Programmierer, der versucht zu zeigen, wie schlau sie sind, indem er so viel Code wie möglich in so wenig Zeichen wie möglich packt. Das ist nicht klug, es ist dumm. Ein wirklich kluger Programmierer ist einer, der seine Ideen klar anderen mitteilen kann.

2
Ich kann nicht zustimmen, dass die Antwort "nie" ist. Einige Algorithmen sind von Natur aus sehr schwer zu verstehen und / oder effizient zu implementieren. Das Lesen des Codes kann unabhängig von der Anzahl der Kommentare sehr schwierig sein.
Rex Kerr

4

Wenn es Wegwerfcode ist. Ich meine das wörtlich: wenn Sie ein Skript schreiben , eine einmalige Berechnung oder Aufgabe auszuführen, und wissen so sicher werden Sie nie wieder , dass die Aktion zu tun haben , dass Sie ‚rm Quelle-Datei‘ , ohne zu zögern, dann können Sie wählen , die hässliche Route.

Ansonsten ist es eine falsche Zweiteilung - wenn Sie denken, dass Sie es hässlich machen müssen, um es schneller zu machen, machen Sie es falsch. (Oder Ihre Prinzipien über das, was guter Code ist, müssen überarbeitet werden. Die Verwendung von goto ist in der Tat recht elegant, wenn es die richtige Lösung für das Problem ist. Dies ist jedoch selten der Fall.)


5
Es gibt keinen Wegwerfcode. Wenn ich einen Cent für jedes Mal hätte, wenn "Wegwerf-Code" in die Produktion kam, weil "es funktioniert, wir haben nicht die Zeit, es umzuschreiben", wäre ich Millionär. Jede Codezeile, die Sie schreiben, sollte so geschrieben sein, dass ein anderer kompetenter Programmierer sie morgen abholen kann, nachdem Sie heute Abend vom Blitz getroffen wurden. Ansonsten schreibe es nicht.
Mark Whitaker

Ich stimme nicht zu, dass es eine falsche Zweiteilung ist; IMO gibt es Szenarien, insbesondere im Bibliothekscode (weniger im Anwendungscode), in denen die Aufteilung sehr real ist. Siehe meine Antwort für mehr.
Marc Gravell

@mark, wenn der "andere kompetente Programmierer" wirklich kompetent ist, dann sollte der

@Mark - Einfach. Schreiben Sie einfach den Wegwerfcode, damit er keine Produktionstests durchläuft, möglicherweise auf unfixierbare Weise.
hotpaw2

@Mark, wenn Ihr Wegwerfcode es in die Produktion schafft, dann ist das kein Wegwerfcode . Beachten Sie, dass ich mir in meiner Antwort die Zeit genommen habe, um zu verdeutlichen, dass es sich um Code handelt, der buchstäblich weggeworfen wird: Löschen nach der ersten Verwendung. Ansonsten stimme ich Ihrer Meinung zu und habe dies auch in meiner Antwort gesagt.
Maaku

3

Immer wenn die geschätzten Kosten für eine geringere Leistung auf dem Markt höher sind als die geschätzten Kosten für die Codewartung für das betreffende Codemodul.

Die Leute machen immer noch verdrehte handcodierte SSE / NEON / etc. Versammlung, zum der Software irgendeines Konkurrenten auf dem populären CPU-Span dieses Jahres zu versuchen und zu schlagen.


Eine gute Geschäftsperspektive, manchmal müssen Programmierer über das rein Technische hinausschauen.
this.josh

3

Vergessen Sie nicht, dass Sie schwer lesbaren Code durch entsprechende Dokumentation und Kommentierung leicht verständlich machen können.

Im Allgemeinen Profil, nachdem Sie einfach zu lesenden Code geschrieben haben, der die gewünschte Funktion ausführt. Bei Engpässen müssen Sie möglicherweise etwas tun, das das Erscheinungsbild komplizierter macht, aber Sie beheben dies, indem Sie sich selbst erklären.


0

Für mich ist es ein gewisses Maß an Stabilität (wie in Beton zementiert, im Ofen gebrannter Ton, in Stein gemeißelt, in permanenter Tinte geschrieben). Je instabiler Ihr Code ist, je höher die Wahrscheinlichkeit ist, dass Sie ihn in Zukunft ändern müssen, desto flexibler muss er sein, um wie nasser Lehm produktiv zu bleiben. Ich betone auch die Geschmeidigkeit und nicht die Lesbarkeit. Für mich ist die Leichtigkeit, Code zu ändern, wichtiger als die Leichtigkeit, ihn zu lesen. Code kann einfach zu lesen und ein Albtraum zu ändern sein, und was nützt es, Implementierungsdetails zu lesen und leicht zu verstehen, wenn sie ein Albtraum sind, der geändert werden muss? Wenn es sich nicht nur um eine akademische Übung handelt, müssen Sie in der Regel in der Lage sein, Code in einer Produktionscodebasis leicht zu verstehen, um ihn bei Bedarf leichter ändern zu können. Wenn es schwierig ist, zu ändern, Dann gehen viele der Vorteile der Lesbarkeit aus dem Fenster. Lesbarkeit ist im Allgemeinen nur im Zusammenhang mit Nachgiebigkeit nützlich, und Nachgiebigkeit ist nur im Zusammenhang mit Instabilität nützlich.

Natürlich ist selbst der schwierigste Code, den man sich vorstellen kann, unabhängig davon, wie einfach oder schwer er zu lesen ist, kein Problem, wenn es keinen Grund gibt, ihn zu ändern, sondern nur zu verwenden. Und es ist möglich, eine solche Qualität zu erzielen, insbesondere für Low-Level-Systemcode, bei dem die Leistung häufig am meisten zählt. Ich verwende immer noch regelmäßig C-Code, der sich seit Ende der 80er Jahre nicht geändert hat. Es musste sich seitdem nicht mehr ändern. Der Code ist flüchtig und wurde in den Tagen des Fummelns geschrieben, und ich verstehe ihn kaum. Trotzdem ist es bis heute gültig, und ich muss die Implementierung nicht verstehen, um es optimal nutzen zu können.

Gründliches Schreiben von Tests ist eine Möglichkeit, die Stabilität zu verbessern. Ein anderer ist die Entkopplung. Wenn Ihr Code von nichts anderem abhängt, besteht der einzige Grund für eine Änderung darin, dass er sich selbst ändern muss. Manchmal kann eine geringe Menge an Code-Duplikaten als Entkopplungsmechanismus dienen, um die Stabilität auf eine Weise dramatisch zu verbessern, die es zu einem angemessenen Kompromiss macht, wenn Sie im Gegenzug Code erhalten, der jetzt völlig unabhängig von allem anderen ist. Jetzt ist dieser Code für Änderungen an der Außenwelt unverwundbar. In der Zwischenzeit hat Code, der von 10 verschiedenen externen Bibliotheken abhängt, den zehnfachen Grund, sich in Zukunft zu ändern.

Eine andere hilfreiche Sache in der Praxis ist es, Ihre Bibliothek von den instabilen Teilen Ihrer Codebasis zu trennen, möglicherweise sogar separat zu erstellen, wie dies für Bibliotheken von Drittanbietern der Fall ist (die ebenfalls nur dazu gedacht sind, verwendet zu werden, zumindest nicht von Ihnen geändert zu werden) Mannschaft). Nur diese Art von Organisation kann verhindern, dass Menschen daran manipulieren.

Ein weiterer Grund ist der Minimalismus. Je weniger Ihr Code versucht zu tun, desto wahrscheinlicher ist es, dass er das kann, was er gut kann. Monolithische Designs sind fast permanent instabil, da sie umso unvollständiger erscheinen, je mehr Funktionen hinzugefügt werden.

Stabilität sollte Ihr vorrangiges Ziel sein, wenn Sie Code schreiben möchten, der unweigerlich nur schwer zu ändern ist, z. Sie wirken der Schwierigkeit der Codewartung entgegen, indem Sie die Wahrscheinlichkeit maximieren, dass Sie den Code nicht ändern müssen und ihn daher in Zukunft nicht mehr warten müssen. Das senkt die Wartungskosten auf null, egal wie schwierig die Wartung des Codes ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.