Perfektionismus kann beim Programmieren gut und schlecht sein.
- Wann und wo ziehen Sie die Grenze, wenn Sie Probleme lösen?
- Wann entscheiden Sie, wann eine Lösung übertrieben, zu allgemein oder einfach zu futuristisch ist?
Bitte kommentieren Sie, wenn die Frage unklar ist.
methodology
time-management
problem-solving
decisions
Amir Rezaei
quelle
quelle
Antworten:
KISS und YAGNI , insbesondere YAGNI.
Entwickeln Sie nur eine Lösung für die Dinge, von denen Sie wissen, dass Sie sie bald brauchen werden. Entwickeln Sie es nicht für die Dinge, die in zwei Jahren benötigt werden, da Sie höchstwahrscheinlich sehr unterschiedliche Dinge benötigen und es trotzdem neu entwickeln müssen.
In dem Moment, in dem Sie anfangen, über "mit diesem Design könnten wir irgendwann in der Zukunft X oder sogar Y machen" zu sprechen, anstatt "mit diesem Design können wir Kundenanforderung Z in der nächsten Version machen" in die Architekturastronomie.
Als Antwort auf die Kommentare:
quelle
YAGNI
bis heute noch nie davon gehört .Verwenden Sie einen iterativen Ansatz und dieses Problem verschwindet meistens. Ihr Code sollte am ersten Tag und danach fast jeden Tag ausgeführt werden. Erfüllen Sie zuerst die Mindestanforderungen und fügen Sie mehr hinzu, wenn Sie Zeit haben. Verirren Sie niemals große Veränderungen, bei denen Sie Ihren Code für eine lange Zeit nicht ausführen können.
quelle
Eine Lösung ist zu viel des Guten, wenn die zusätzliche Zeit, die für ihre Fertigstellung benötigt wird, mehr wert ist als die potenziellen negativen Auswirkungen, die von der Fertigstellung der einfacheren Lösung bis zur nächsten natürlichen Aktualisierung / Änderung ausgehen.
Grundsätzlich handeln Sie jetzt mit der Zeit später. Wenn Sie jetzt mehr Zeit aufwenden, als Sie später sparen, machen Sie es falsch. Wenn Sie das Engineering wirklich hinter sich lassen, verbringen Sie jetzt Zeit, die sich nicht darauf auswirkt, wie viel Zeit Sie später verbringen (oder sogar dafür sorgen, dass mehr Zeit anfällt).
Je mehr Erfahrung Sie haben, desto besser können Sie das herausfinden. Der beste Weg, um Dinge zu erledigen (aus meiner Erfahrung), besteht darin, das zu tun, was Sie jetzt brauchen, aber auf eine Weise, die am einfachsten zu ergänzen ist, wenn spätere Anforderungen dies erfordern. Das herauszufinden, wie man das macht, ist das Knifflige.
quelle
Früher war ich sehr perfektionistisch (verbrachte viel Zeit damit, Frameworks zu erstellen, keine Lösungen).
Aber das, was mir wirklich geholfen hat, meine Produktion zu beschleunigen, war das Lernen und Befolgen der BDD / TDD-Prinzipien, einschließlich der Prinzipien von außen (die ich besonders schwer zu verstehen gelernt habe).
Das hat mich wirklich gelehrt, keine einzige Codezeile zu schreiben, bevor ein Test dafür existiert. Der Unit-Test existiert aber auch nicht, bevor ein Abnahmetest dafür existiert. Und die Abnahmetests basieren auf den tatsächlichen Bedürfnissen der Benutzer.
Daher stammen alle Codezeilen von einem tatsächlichen Benutzerbedarf.
Wenn Sie im Prinzip nicht mit dem Äußeren vertraut sind, müssen Sie Tests für die äußerste Ebene in Ihrer Anwendung (dh in praktisch allen Fällen für die grafische Benutzeroberfläche) mit Test-Doubles schreiben, um das Verhalten der unteren Ebenen zu simulieren. Dann implementieren Sie gerade genug, damit die Tests bestanden werden. Diese Implementierung der oberen Ebene bestimmt dann die Tests, die Sie für die nächste Ebene usw. schreiben müssen, bis Sie die untere Ebene Ihrer Anwendung erreichen.
quelle
Ich merke, dass ich durch Erfahrung besser werde.
Als ich (sehr) jung war, habe ich immer die perfekte Lösung gewählt, keine Kompromisse. Jetzt bin ich besser darin, Dinge wie Budget und Zeit im Auge zu behalten.
quelle
Das Zeitlimit macht diese Linie ziemlich deutlich.
quelle
Mein Chef macht eigentlich :)
Ich muss zugeben, dass es mir besser geht, aber ich bin immer noch nicht sehr kompromissbereit. Zum Glück habe ich meinen Chef, der mich zügelt;)
Ich würde gerne ein anderes Problem ansprechen als das Überingenieurwesen, da das Überingenieurwesen recht einfach zu erkennen ist.
Mein Hauptproblem ist das Refactoring. Das Problem ist, dass ich die meiste Zeit, obwohl ich versucht habe, den Code so gut wie möglich zu schreiben, nicht wusste, was ich jetzt weiß (mehr Codes, mehr Muster, neue Redewendungen, neue Probleme, neue Lösungen). Und so, obwohl es funktioniert, weiß ich jetzt bessere Möglichkeiten, es zu tun:
Es funktioniert jedoch so, wie es ist, und daher hat die Umgestaltung keine Priorität, und die Wahrheit ist, dass es mich nervt. Ich verstehe die wirtschaftlichen Gründe und die Kundenerwartungen (sie sehen den Code nicht und bevorzugen neue Funktionen und Fehlerbehebungen), aber ich wünschte, ich hätte noch Zeit, daran zu arbeiten.
Im Moment folge ich einfach der Anweisung meines Chefs, aber ich muss zugeben, dass ich mir nicht sicher bin, dass der in die Produktion gelieferte Code nicht der beste ist, den ich mir jetzt einfallen lassen kann. Perfektionismus, denke ich.
quelle
Sowohl beruflich als auch persönlich ist der Standard, den ich versuche, auf mich selbst anzuwenden:
Sei zufrieden mit dem Gewinnen.
Wenn mein Code das Problem löst, das es lösen soll, und keine neuen Probleme schafft *, ist es sehr wahrscheinlich, dass wir weitermachen. Wenn Sie lernen, die Messlatte so hoch wie nötig einzustellen, wird "Gut genug" gut genug.
Perfektion ist wie Lichtgeschwindigkeit: Sie werden nie dort ankommen, aber der Energie, die Sie beim Ausprobieren aufwenden können, sind keine Grenzen gesetzt.
(* - Beachten Sie, dass sowohl "Buggy" als auch "Schwer zu warten" fest unter die Überschrift "Neue Probleme" fallen. Ich nenne es also erst dann vollständig, wenn der Code getestet wurde, die überflüssigen Bits gekürzt wurden und die Kommentare / API-Dokumentation auf den neuesten Stand gebracht.)
quelle
Aus Erfahrung habe ich gemerkt, dass Perfektionismus erst möglich ist, wenn ich in einem bestimmten Kontext (Sprache, Framework, Plattform, Standard) mindestens ein paar Jahre hinter mir habe. Als Neuling wird es alle Arten von Eigenheiten geben, die Sie nicht kennen werden (Flucht, Vorrang, reservierte Wörter, syntaktischer Zucker, Zeitüberschreitungen, asynchrone Aufrufe, undokumentierte Funktionen und Fehler), also versuche ich nur nach einer guten Lösung beim Lernen so viel wie möglich. Wichtig ist, dass ich immer versuche, die Umgestaltung des Ergebnisses zu vereinfachen - modulare Architektur, Kommentare bei Bedarf und keine cleveren Tricks .
quelle
Ich habe, wie viele andere Programmierer, viel Legacy-Code zu pflegen. Die Versuchung, alles zu wiederholen, wird immer da sein, aber ich habe es im Wesentlichen auf ein Prinzip reduziert:
Das erledigt normalerweise eine Menge Spaghetti-Code in etwas überschaubareren Spaghetti-Chunk-Code. Entziehen Sie einige der Stücke, werfen Sie Ihre Tests ein, und jetzt sieht es nicht mehr so perfekt aus.
quelle