Was bedeutet es, „guten Code“ zu schreiben? [geschlossen]

41

In dieser Frage habe ich gefragt, ob Sie als schlechter Autor daran gehindert werden, guten Code zu schreiben. Viele der Antworten begannen mit "es kommt darauf an, was Sie mit gutem Code meinen".

Es scheint, dass die Begriffe "guter Code" und "schlechter Code" sehr subjektiv sind. Da ich eine Ansicht habe, kann es sehr unterschiedlich sein, wie andere sie sehen.

Was bedeutet es also, "guten Code" zu schreiben? Was ist "guter Code"?

gablin
quelle
15
Guter Code ist, wenn Sie ihn sich nach zwei Jahren ansehen und Ihr erster Gedanke nicht "Dude, wtf" ist.
Bobby

Antworten:

91

Ein guter Coder ist wie ein guter Poolspieler.

Wenn Sie einen professionellen Poolspieler sehen, werden Sie vielleicht zunächst nicht beeindruckt sein: "Sicher, sie haben alle Bälle reingelegt, aber sie hatten nur einfache Schüsse!" Dies liegt daran, dass eine Poolspielerin, wenn sie schießt, nicht darüber nachdenkt, welcher Ball in welche Tasche passt, sondern auch darüber nachdenkt, wo der Spielball landen wird . Das Einrichten für den nächsten Schuss erfordert enormes Geschick und Übung, bedeutet aber auch, dass es einfach aussieht.

Mit dieser Metapher schreibt ein guter Codierer Code, der einfach und unkompliziert zu sein scheint . Viele der Beispiele von Brian Kernighan in seinen Büchern folgen diesem Muster. Ein Teil des "Tricks" besteht in der richtigen Konzeptualisierung des Problems und seiner Lösung . Wenn wir ein Problem nicht gut genug verstehen, verkomplizieren wir unsere Lösungen mit größerer Wahrscheinlichkeit, und wir werden keine einheitlichen Ideen erkennen.

Mit einer richtigen Konzeptualisierung des Problems erhalten Sie alles andere: Lesbarkeit, Wartbarkeit, Effizienz und Korrektheit. Da die Lösung so einfach zu sein scheint, wird es wahrscheinlich weniger Kommentare geben, da keine zusätzlichen Erklärungen erforderlich sind. Ein guter Programmierer kann auch die langfristige Vision des Produkts erkennen und deren Konzeptualisierung entsprechend gestalten.

Macneil
quelle
10
"Ein guter Programmierer schreibt Code, der so aussieht, als sei er einfach und unkompliziert zu handhaben." << GENAU! Ich denke, das liegt daran, dass die Leute normalerweise denken, ein guter Programmierer sei jemand, der sehr "clevere" Hacks schreiben kann. Wenn der Code sauber und nicht übermäßig "clever" ist, muss er einfach sein, oder?
Hasen
3
Meine zwei Cent: Wenn Sie eine Sprache mit EASY Automatic Refactorings haben - Java und C # sind die beiden Beispiele, die ich am besten kenne -, ist es einfach, iterativ auf guten Code umzusteigen. Ansonsten muss man sich zunächst gut vorstellen, aber da gibt es eine Art Hühnerei-Problem.
Dan Rosenstark
3
Einige Algorithmen sind von Natur aus komplex. Ein guter Programmierer sollte keine Probleme damit haben, sie zu schreiben, wenn sie wirklich benötigt werden - und sie so lesbar wie möglich zu halten.
J-16 SDiZ
2
@hasenj: Ja, das liegt an diesem Lemma: Dumme Leute schreiben Code, den der Compiler versteht. Kluge Leute schreiben Code, dumme Leute verstehen.
v.oddou
49

WTFs pro Minute

( original )


BEARBEITEN: Die Grundidee ist, dass "Codequalität" nicht in Regeln festgelegt werden kann, genauso wie Sie "Gute Kunst" oder "Gute Poesie" nicht in Regeln festlegen können, sodass ein Computer bestimmen kann, ob "Ja, gute Kunst". oder "Nein, schlechte Poesie". Derzeit besteht die einzige Möglichkeit darin, festzustellen, wie leicht der Code für andere Menschen verständlich ist.


quelle
1
Wir haben dies bei der Arbeit auf unserem Whiteboard festgeklebt :-)
Nobody
1
@Cape Cod Gunny war auch in einem Buch von Onkel Bob
mlvljr
2
Abgesehen davon, dass es ein großartiger Cartoon ist, denke ich, dass es wirklich auf den Punkt kommt - guter Code ist Code, den andere Menschen als angenehm empfinden, zu lesen und zu pflegen.
FinnNk
1
Richtig, guter Code ist jeder Code, der nicht schlecht ist. ZB ist es schwierig, guten Code zu definieren, es ist einfacher, schlechten Code zu definieren.
Ernelli
5
Normalerweise finde ich, dass diese "WTF?" In der guten Code-Besprechung kurz von "Oooooh Okay ... ich verstehe, was du getan hast."
AndrewKS
7

Es gibt wirklich keine guten Kriterien, außer wie schnell Sie den Code verstehen können. Sie machen Ihren Code gut, indem Sie den perfekten Kompromiss zwischen Prägnanz und Lesbarkeit finden.

Die "WTFs pro Minute" (oben) sind wahr, aber sie sind nur eine Folge der allgemeineren Regel. Je mehr WTFs, desto langsamer das Verständnis.

Mojuba
quelle
1
@RMX: Definieren Sie "Den Job gut machen"
Mojuba
2
Nun, dass die RemoveCustomerMethode tatsächlich das Cutomer entfernt, ohne es zu vermasseln. Sie können Stunden damit verbringen, es hübsch aussehen zu lassen, aber das bedeutet nicht, dass es tatsächlich funktioniert. "Wie schnell Sie Code verstehen können" ist nicht das einzige Kriterium für "guten Code", was ich sage.
Niemand
2
@rmx: aber fehlerfrei zu sein ist impliziert, nicht wahr? Wenn Ihr Code die Aufgabe nicht richtig erledigt, ist er (noch) kein Code.
Mojuba
4
@ rmx: in der Tat nein. Wenn Ihr Code leicht zu verstehen ist, ist es leicht zu verstehen, ob er schlecht funktioniert. OTOH, wenn es schwer zu verstehen ist, ist es schwer zu verstehen, ob es überhaupt seinen Job macht.
Pillmuncher
2
@rmx: PS einfach ausgedrückt, dein decrement () ist eine klassische WTF und verlangsamt somit das Verständnis von Codeteilen, in denen diese Funktion verwendet wird
mojuba
5

Sie wissen, dass Sie guten Code schreiben, wenn ...

  1. Der Kunde ist glücklich
  2. Kollegen leihen Ihren Code als Ausgangspunkt aus
  3. Dem brandneuen Mann / der brandneuen Frau / dem brandneuen Mann wurde nur gesagt, dass er / sie Änderungen an einem System vornehmen soll, das Sie vor 6 Monaten gebaut haben, und er / sie hat Ihnen nie eine Frage gestellt
  4. Ihr Chef bittet Sie, neue Widgets für das Team zu entwickeln
  5. Sie sehen sich den Code an, den Sie heute schreiben, und sagen sich: "Ich wünschte, ich hätte vor zwei Jahren so einen Code geschrieben."

Wie messen Sie, ob der Code gut ist ...

  • Wie ist die Reaktionszeit?
  • Wie viele Roundtrips zum Server werden durchgeführt?
  • Würden Sie die Anwendung persönlich nutzen oder finden Sie sie klobig?
  • Würden Sie es das nächste Mal genauso bauen?

Guter Code funktioniert, wenn es sein soll. Guter Code kann bei Bedarf problemlos geändert werden. Guter Code kann wiederverwendet werden, um Gewinn zu erzielen.

Michael Riley - AKA Gunny
quelle
2
"Der Kunde ist glücklich" ist orthogonal dazu.
1
@TRA - Wenn der Kunde zufrieden ist, bedeutet dies, dass Sie die Anforderungen verstanden und eine von ihm erwartete Lösung bereitgestellt haben.
Michael Riley - AKA Gunny
6
Sicher, aber schlechter Code kann dasselbe tun.
4

Ein Code, der ist

  1. Bug-frei

  2. wiederverwendbar

  3. unabhängig

  4. weniger komplex

  5. gut dokumentiert

  6. leicht zu chagen

heißt guter Code.

Ein gutes Programm funktioniert einwandfrei und hat keine Fehler. Aber welche inneren Qualitäten erzeugen eine solche Perfektion? Es ist kein Rätsel, wir müssen nur gelegentlich daran erinnern. Unabhängig davon, ob Sie in C / C ++, C #, Java, Basic, Perl, COBOL oder ASM programmieren, alle guten Programme weisen dieselben bewährten Eigenschaften auf: Einfachheit, Lesbarkeit, Modularität, Schichtung, Design, Effizienz, Eleganz und Klarheit, Effizienz und Eleganz und Klarheit

Quelle: MSDN

Chankey Pathak
quelle
Einfachheit, Lesbarkeit, Eleganz und Klarheit sind dasselbe. Modularität und Layering sind nur Methoden, um Ihren Code klar und elegant zu gestalten. Das einzige, was dann noch auf der Liste steht, ist die Effizienz, die impliziert wird, und außerdem ist es oft eine Frage des Kompromisses zwischen Effizienz und Klarheit.
Mojuba
Überprüfen Sie dies: goo.gl/hdQt8
Chankey Pathak
2
Code kann fehlerfrei sein?
Casey Patton
Nein, das kann es nicht. (Praktisch)
Chankey Pathak
Effizient sollte zu Ihrer Liste hinzugefügt werden. Geschwindigkeit ist nicht unbedingt ein Hauptindikator für guten Code, aber guter Code sollte nicht unnötig langsam oder verschwenderisch sein.
Caleb
3

Kommt Ihnen das bekannt vor?

Philips gab mir die Möglichkeit, das Design eines neuen Produkts zu beobachten. Als es sich entwickelte, wurde ich immer unruhiger und fing an, meine Bedenken meinem Vorgesetzten anzuvertrauen. Ich sagte ihm wiederholt, dass die Entwürfe nicht „sauber“ seien und dass sie so „schön“ sein sollten, wie die Entwürfe von Dijkstra schön seien. Er fand dies nicht als nützlichen Kommentar. Er erinnerte mich daran, dass wir Ingenieure und keine Künstler waren. In seinen Gedanken drückte ich einfach meinen Geschmack aus und er wollte wissen, nach welchem ​​Kriterium ich mein Urteil fällte. Ich konnte es ihm nicht sagen! Da ich nicht erklären konnte, gegen welche Grundsätze verstoßen wurde, wurden meine Kommentare einfach ignoriert und die Arbeit ging weiter. In dem Bewusstsein, dass es eine Möglichkeit geben muss, meinen „Geschmack“ zu erklären und zu motivieren, Ich fing an, ein Prinzip zu finden, das gute von schlechten Designs unterscheidet. Ingenieure sind sehr pragmatisch; sie mögen die Schönheit bewundern, aber sie suchen nach Nützlichkeit. Ich habe versucht, eine Erklärung dafür zu finden, warum „Schönheit“ nützlich ist.

Bitte sehen Sie den Rest hier .

mlvljr
quelle
1
Da der Link in @ mlvljrs Post nicht funktioniert, ist hier ein Link zur Google Books-Seite: books.google.co.in/…
balajeerc
@balajeerc Danke (Ich habe auch den Link repariert, so dass er auf eine von Springer gehostete Version desselben PDF
verweist
1

Abgesehen von natürlichen Codequalitätskriterien (minimales Kopieren / Einfügen, keine Spaghetti usw.) sollte ein guter Industriecode immer ein bisschen naiv, ein bisschen zu ausführlich aussehen

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

im Gegensatz zu

Record r = cache.get(i++, false);
Bobah
quelle
Aber do_not_create = falseheißt es " falseals do_not_createArgument übergeben, damit es erstellt wird" oder " falseals do_createArgument übergeben, damit es nicht erstellt wird"? In einer Sprache, in der Sie Argumentnamen verwenden können, würde ich bevorzugen cache.get (key:i, create: false); i += 1;.
PJTraill
1

Vielleicht würde eine Antwort durch Abbildung des Gegenteils helfen (und es ist eine Ausrede, XKCD hier reinzuholen ).

Alt-Text

Guter Code ist

  • einfach zu verstehen,
  • pflegeleicht,
  • versucht nicht, alle Probleme zu lösen, sondern nur das zur Hand liegende
  • lebt lange, ohne dass Entwickler nach Alternativen suchen

Beispiele beinhalten

  • Apache Commons
  • Frühlingsrahmen
  • Ruhezustand
Gary Rowe
quelle
1

Ich gehe einfach mit "wartbar"

Der gesamte Code muss gepflegt sein: Keine Notwendigkeit, diese Aufgabe schwieriger als nötig zu machen

Wenn ein Leser diese einfache Anforderung nicht versteht oder sie benötigt, sollte er keinen Code schreiben ...

gbn
quelle
1

Guter Code wird für jede Person anders sein, und die Sprache, mit der sie arbeitet, hat auch Einfluss auf den Code, der als guter Code angesehen wird. Wenn ich mich einem Projekt nähere, suche ich im Allgemeinen nach folgenden Dingen:

  • Wie ist das Projekt organisiert? Sind die Quelldateien sauber organisiert und kann ich Code ohne großen Aufwand finden?
  • Wie ist der Code aufgebaut? Ist klar dokumentiert, was der Code in der Datei bewirkt, z. B. durch die Verwendung eines Datei-Headers oder durch die Verwendung jeder Klasse, die sich in einer eigenen Datei befindet? Gibt es Funktionen in der Datei, die in der Anwendung nicht mehr verwendet werden?
  • Wie sind die Funktionen organisiert? Gibt es ein klares Muster für die Deklaration von Variablen oder ist es ein ziemlich zufälliges Muster? Verfügt der Code über einen logischen Ablauf und vermeidet er unnötige Kontrollstrukturen? Ist alles klar dokumentiert, wobei der Code sich selbst dokumentiert, wo dies erforderlich ist, und Kommentare drücken klar das Warum und / oder das Wie aus, was der Code tut?

Ist das Design der Anwendung darüber hinaus insgesamt sinnvoll? Der in der Anwendung enthaltene Code kann der beste der Welt sein, es kann jedoch dennoch schwierig sein, mit dem Code zu arbeiten, wenn das Gesamtdesign der Anwendung keinen Sinn ergibt.

rjzii
quelle
1

Lassen Sie mich in Bezug auf die Lesbarkeit nicht einverstanden sein. Nein, nicht ganz: Guter Code sollte lesbar sein, und das kann mit genügend Kommentaren problemlos erreicht werden.

Aber ich betrachte zwei Arten von WTF: die, bei denen man sich fragt, ob der Programmierer weiter gekommen ist als die Programmierung 101, und die, bei denen man die Genialität des Codes absolut nicht versteht. Einige Codes können auf den ersten Blick sehr seltsam aussehen, sind jedoch eine sehr erfinderische Lösung für ein schweres Problem. Die zweite sollte nicht im WTF-Meter gezählt werden und kann durch Kommentare vermieden werden.

Sehr lesbarer Code kann sehr, sehr langsam sein. Eine weniger lesbare Lösung kann die Geschwindigkeit um ein Vielfaches verbessern. R ist ein großartiges Beispiel für eine Sprache, in der dies häufig zutrifft. Dort vermeidet man gerne For-Loops. Im Allgemeinen würde ich den schnellsten Code als den besseren Code betrachten, obwohl er weniger lesbar ist. Das heißt, wenn die Verbesserung erheblich vom Kurs abweicht und genügend Kommentare eingefügt werden, um zu erklären, was der Code tut.

Darüber hinaus kann die Speicherverwaltung in vielen wissenschaftlichen Anwendungen von entscheidender Bedeutung sein. Code, der sehr gut lesbar ist, ist in der Hauptspeicherauslastung in der Regel schlampig: Es werden nur mehr Objekte erstellt. In einigen Fällen wird der Code durch eine intelligente Speichernutzung wieder weniger lesbar. Wenn Sie zum Beispiel mit Gigabyte DNA-Sequenzen jonglieren, ist das Gedächtnis ein entscheidender Faktor. Auch hier halte ich den weniger speicherintensiven Code für den besseren Code, unabhängig von der Lesbarkeit.

Also ja, Lesbarkeit ist wichtig für guten Code. Ich kenne das Adagium von Uwe Liggis: Denken tut weh und Computer sind billig. In meinem Bereich (statistische Genomik) werden Rechenzeiten von einer Woche und eine Speichernutzung von über 40 GB nicht als abnormal angesehen. Eine Verbesserung um die doppelte Geschwindigkeit und die Hälfte des Speichers ist also weit mehr wert als die zusätzliche Lesbarkeit.

Joris Meys
quelle
Keine Regel / Regeln ohne Ausnahme
user2664856
1
Lassen Sie mich Ihrer Uneinigkeit nicht zustimmen: Sie sagen, dass Geschwindigkeit in Ihrem Feld sehr wichtig ist und dass es wichtiger ist als Lesbarkeit. Ich bin anderer Meinung, Sie sollten sich bemühen, das richtige Gleichgewicht zu finden. Wenn Geschwindigkeit nicht benötigt wird, zum Beispiel für eine High-Level-Benutzeroberfläche, ist möglicherweise etwas Wartungsfreundliches vorzuziehen. Wenn Geschwindigkeit benötigt wird, stimme ich Ihnen zu. Statt strenger Regeln ist es besser, gesunden Menschenverstand zu verwenden, und Sie sollten ohnehin eine vorzeitige Optimierung vermeiden.
BlueTrin
@BlueTrin Warum kompilieren nicht beide diese hochperfekten Quellcodes und dokumentieren auch die Hölle von dem, was dort vor sich geht (genau dort in Kommentaren)?
mlvljr
1

Was mich betrifft ... Ich weiß, dass ich guten Code schreibe, wenn ein Mitarbeiter, der an einem anderen Projekt arbeitet, vorbeikommt und in der Lage ist, zu verstehen, was ich tue, ohne jeden Codeblock durchzugehen und zeigen, was es tut.
Anstatt dass er sagte: "Moment mal, was ?!" Er sagt: "Oh, ok, ich verstehe, was du dort getan hast."

Guter Code hat auch nicht viele hinterhältige Problemumgehungen oder "Hacks". Zeilen, in denen Sie sich während des Schreibens auch sagen: "Ich weiß, das ist kein guter Weg, es zu tun, aber ich werde es erst einmal so machen müssen. Ich werde daran erinnern mich später zu verbessern ... "

Chiurox
quelle
1

Es gibt viele Funktionen von 'gutem' Code, aber die wichtigsten, meiner Meinung nach, sind Lesbarkeit und Wartbarkeit.

Ihr Code wird Bugs enthalten, wird wahrscheinlich erweitert und wiederverwendet und sollte irgendwann überarbeitet werden - selbst wenn Sie ihn erneut besuchen, besteht die Möglichkeit, dass Sie keine Ahnung haben, was zum Teufel Sie haben in erster Linie getan, um sich selbst einen Gefallen zu tun und keine Hindernisse in den Weg zu stellen.

Verwenden Sie diesen komplexen und dennoch äußerst effizienten Algorithmus. Nehmen Sie sich jedoch etwas mehr Zeit, um ihn zu dokumentieren, und machen Sie Ihren Code ansonsten klar und konsistent.

cjmUK
quelle