In Kürze: es kommt darauf an
Im Detail
Wirst du das aufgeräumte, glänzende Zeug brauchen?
Hier gilt es Vorsicht walten zu lassen, und Sie müssen die Grenze zwischen dem, was real und messbar ist, und Ihrer persönlichen Präferenz und der potenziellen schlechten Angewohnheit, Code zu berühren, der nicht sein sollte, herausfinden.
Genauer gesagt:
Es ist ein Anti-Pattern und es gibt einige Probleme:
- es kann erweiterbarer sein , aber es kann nicht einfacher zu erweitern sein,
- es ist vielleicht nicht einfacher zu verstehen ,
- last, but not least hier: Sie könnten den gesamten Code verlangsamen.
Einige könnten auch das KISS-Prinzip als Referenz erwähnen , aber hier ist es kontraintuitiv: Ist der optimierte Weg der einfache Weg oder der rein architektonische Weg? Die Antwort ist nicht unbedingt absolut, wie im Folgenden erläutert.
Das YAGNI-Prinzip ist nicht ganz orthogonal zum anderen Thema, aber es hilft, sich die Frage zu stellen: Werden Sie es brauchen?
Ist die komplexere Architektur für Sie wirklich von Vorteil, abgesehen davon, dass Sie den Anschein haben, dass sie wartbarer ist?
Schreiben Sie dies auf ein großes Poster und hängen Sie es neben Ihren Bildschirm, in die Küche bei der Arbeit oder in den Entwickler-Besprechungsraum. Natürlich gibt es noch viele andere Mantras, die es wert sind, wiederholt zu werden, aber gerade dieses ist wichtig, wenn Sie versuchen, "Wartungsarbeiten" durchzuführen und den Drang verspüren, es "zu verbessern".
Es ist für uns selbstverständlich, den Code "verbessern" zu wollen oder ihn sogar nur unbewusst zu berühren, während wir ihn lesen, um zu versuchen, ihn zu verstehen. Das ist eine gute Sache, da es bedeutet, dass wir uns eine Meinung bilden und versuchen, ein tieferes Verständnis für die Interna zu erlangen, aber es hängt auch von unserem Können und unserem Wissen ab (wie entscheiden Sie, was besser ist oder nicht?) ...) und all die Annahmen, die wir darüber machen, was wir glauben, dass wir die Software kennen ...:
- tatsächlich tut,
- muss eigentlich tun,
- wird irgendwann tun müssen,
- und wie gut es das macht.
Muss es wirklich optimiert werden?
All dies sagte, warum wurde es in erster Linie "optimiert"? Sie sagen, dass vorzeitige Optimierung die Wurzel allen Übels ist, und wenn Sie undokumentierten und anscheinend optimierten Code sehen, könnten Sie normalerweise annehmen, dass er wahrscheinlich nicht den Optimierungsregeln entsprach und den Optimierungsaufwand nicht so dringend benötigte und dass es nur der war Die Hybris eines gewöhnlichen Entwicklers setzt ein. Vielleicht redet es jetzt nur noch bei Ihnen.
Wenn ja, innerhalb welcher Grenzen wird es akzeptabel? Wenn es nötig ist, gibt es dieses Limit und es gibt dir Raum, Dinge zu verbessern, oder eine harte Linie, um zu entscheiden, es loszulassen.
Achten Sie auch auf unsichtbare Merkmale. Es besteht die Möglichkeit, dass Ihre "erweiterbare" Version dieses Codes auch zur Laufzeit mehr Arbeitsspeicher zur Verfügung stellt und sogar einen größeren statischen Speicherbedarf für die ausführbare Datei aufweist. Shiny OO-Funktionen sind mit solchen Kosten verbunden, die für Ihr Programm und die Umgebung, auf der sie ausgeführt werden sollen, von Bedeutung sein können.
Messen, Messen, Messen
Wie die Google-Leute jetzt, dreht sich alles um Daten! Wenn Sie es mit Daten sichern können, ist es notwendig.
Es gibt diese nicht so alte Geschichte, dass für jeden in die Entwicklung investierten Dollar mindestens ein Test- Dollar und mindestens ein Support-Dollar hinzukommen (aber es ist wirklich viel mehr).
Veränderungen wirken sich auf viele Dinge aus:
- Möglicherweise müssen Sie einen neuen Build erstellen.
- Sie sollten neue Komponententests schreiben (definitiv, wenn es keine gäbe, und Ihre erweiterbarere Architektur lässt wahrscheinlich Platz für mehr, da Sie mehr Oberfläche für Fehler haben).
- Sie sollten neue Leistungstests schreiben (um sicherzustellen, dass diese auch in Zukunft stabil bleiben und um zu sehen, wo die Engpässe liegen), und dies ist schwierig .
- Sie müssen es dokumentieren (und erweiterbar bedeutet mehr Platz für Details);
- Sie (oder jemand anderes) müssen es in der Qualitätssicherung ausgiebig erneut testen.
- Code ist (fast) nie fehlerfrei, und Sie müssen ihn unterstützen.
Es ist also nicht nur Hardware - Ressourcen Verbrauch (Ausführungsgeschwindigkeit oder Speicherbedarf) , die Sie hier messen müssen, es ist auch Team - Ressourcen Verbrauch. Beide müssen vorhergesagt werden, um ein Ziel zu definieren, gemessen, berücksichtigt und basierend auf der Entwicklung angepasst zu werden.
Und für Sie als Manager bedeutet dies, dass Sie es in den aktuellen Entwicklungsplan integrieren. Kommunizieren Sie also darüber und beschäftigen Sie sich nicht mit der Kodierung von Cowboys, U-Booten und Black-Ops.
Im Allgemeinen...
Ja aber...
Versteht mich im Allgemeinen nicht falsch, ich würde es begrüßen, wenn ihr mir vorschlägt, warum, und ich befürworte es oft. Sie müssen sich jedoch der langfristigen Kosten bewusst sein.
In einer perfekten Welt ist es die richtige Lösung:
- Computerhardware wird mit der Zeit besser,
- Compiler und Laufzeitplattformen werden mit der Zeit besser,
- Sie erhalten nahezu perfekten, sauberen, wartbaren und lesbaren Code.
In der Praxis:
Sie können es noch schlimmer machen
Sie benötigen mehr Augäpfel, um es zu betrachten, und je komplexer Sie es gestalten, desto mehr Augäpfel benötigen Sie.
Sie können die Zukunft nicht vorhersagen
Sie können nicht mit absoluter Gewissheit wissen, ob Sie es jemals brauchen werden und auch nicht, ob die "Erweiterungen", die Sie brauchen, einfacher und schneller in der alten Form zu implementieren gewesen wären und ob sie selbst superoptimiert werden müssten .
Aus Sicht des Managements bedeutet dies enorme Kosten ohne direkten Gewinn.
Machen Sie es Teil des Prozesses
Sie erwähnen hier, dass es sich um eine eher kleine Änderung handelt und Sie einige spezifische Probleme im Auge haben. Ich würde sagen, dass es in diesem Fall normalerweise in Ordnung ist, aber die meisten von uns haben auch persönliche Geschichten über kleine Änderungen, fast chirurgische Eingriffe, die schließlich zu einem Alptraum für die Instandhaltung wurden und beinahe versäumte oder explodierte Fristen, weil Joe Programmer keine sah der Gründe hinter dem Code und berührte etwas, das nicht hätte sein sollen.
Wenn Sie einen Prozess haben, um solche Entscheidungen zu treffen, nehmen Sie ihnen den persönlichen Vorteil:
- Wenn Sie die Dinge richtig testen, werden Sie schneller wissen, ob die Dinge kaputt sind.
- Wenn Sie sie messen, werden Sie wissen, ob sie sich verbessert haben,
- Wenn Sie es überprüfen, wissen Sie, ob es Leute abschreckt.
Testabdeckung, Profilerstellung und Datenerfassung sind schwierig
Aber natürlich leiden Ihr Testcode und Ihre Messdaten möglicherweise unter denselben Problemen, die Sie bei Ihrem eigentlichen Code vermeiden möchten: Testen Sie die richtigen Dinge und sind sie die richtigen für die Zukunft und messen Sie die richtigen Dinge?
Im Allgemeinen gilt: Je mehr Sie testen (bis zu einem bestimmten Grenzwert) und messen, desto mehr Daten erfassen Sie und desto sicherer sind Sie. Schlechte Analogiezeit: Betrachten Sie es als Autofahren (oder als Leben im Allgemeinen): Sie können der beste Fahrer der Welt sein, wenn das Auto auf Ihnen kaputt geht oder wenn sich jemand entschlossen hat, heute mit seinem eigenen Auto in Ihr Auto zu fahren Fähigkeiten könnten nicht genug sein. Es gibt sowohl Umweltsachen, die Sie treffen können, als auch menschliche Fehler, die von Bedeutung sind.
Code Reviews sind die Flurtests des Entwicklungsteams
Und ich denke, der letzte Teil ist der Schlüssel hier: Codeüberprüfungen durchführen. Sie werden den Wert Ihrer Verbesserungen nicht kennen, wenn Sie sie solo machen. Codeüberprüfungen sind unsere "Flurtests": Befolgen Sie die Raymond-Version des Linus-Gesetzes, um sowohl Fehler als auch Überentwicklungen und andere Anti-Muster zu erkennen und sicherzustellen, dass der Code den Fähigkeiten Ihres Teams entspricht. Es hat keinen Sinn, den "besten" Code zu haben, wenn niemand anders als Sie ihn verstehen und pflegen kann, und das gilt sowohl für kryptische Optimierungen als auch für 6-Schichten-Architekturentwürfe.
Denken Sie zum Schluss daran:
Jeder weiß, dass das Debuggen doppelt so schwer ist wie das Schreiben eines Programms. Also, wenn Sie so schlau sind, wie Sie können, wenn Sie es schreiben, wie werden Sie es jemals debuggen? - Brian Kernighan