Wo ziehen Sie die Grenze für Ihren Perfektionismus? [geschlossen]


37

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.


7
Gute Frage - damit habe ich immer zu kämpfen.
Niemand

Antworten:


40

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:

  • KISS = Halte es einfach, Dumm = tu so als wärst du ein Idiot und musst das Design verstehen
  • YAGNI = Du wirst es nicht brauchen = Hör auf so zu tun, als könntest du die Zukunft in deinem Design vorhersagen

5
+1 - Es ist schwer genug, die Probleme zu lösen, von denen wir wissen, dass wir sie haben, ohne auch zu versuchen, Probleme zu lösen, von denen wir glauben, dass wir sie haben.
Jon Hopkins

6
Ich mag das, aber eine klare Definition der Akronyme wäre hilfreich. Ich hatte YAGNIbis heute noch nie davon gehört .
Philip Regan

+1 für Philip, der heute etwas lernt! +1 auch für KISS.

Nun, die Antwort ist gut. Obwohl offensichtlich jede Schnittstelle (es den permanenten Speicher sein (Dateien), das Netzwerk oder IPC) muss mindestens versionierbar oder Sie kennen Ihre Re-Design zurück-compat unmöglich machen wird.
Deduplizierer

7

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.


6

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.


6

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.


5

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.


1
+1 Für Erfahrung machen Sie mehr Kompromisse.
Amir Rezaei

4

Das Zeitlimit macht diese Linie ziemlich deutlich.


1
Guter Punkt, aber eine schlechte Lösung braucht möglicherweise mehr Zeit, um sie in Zukunft zu beheben.
Amir Rezaei

Ich denke, Sie müssen ein Urteil darüber fällen, welche Software "gut genug" ist. Die Linie sollte durch die Spezifikation und Ihren gesunden Menschenverstand definiert werden.
Niemand

3

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:

  • Möglichkeiten, die die Benutzerfreundlichkeit verbessern und die Wahrscheinlichkeit verringern, dass ein Fehler auftritt
  • Möglichkeiten, um die Abhängigkeiten zu verringern und die Kompilierungszeit zu verbessern

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.


Ich teile mit dir das Nörgeln. Ich glaube, Programmieren ist wie eine Art Kunst, in der es keine Perfektion gibt.
Amir Rezaei

2

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


0

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 .


Perfektionismus ist auch nach vielen Jahren Erfahrung nicht möglich. das heißt, wenn Sie jemals etwas tatsächlich LIEFERN möchten. Das Wertvollste, was die Erfahrung lehrt, ist, wenn man "gut genug" erkennt.
Jeff Knecht

0

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:

Muss ich (oder jemand anderes) das noch einmal herausfinden ?

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.

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.