Was ist der Zweck einer Codeüberprüfung?

76

Ich bin gerade dabei, meine Organisation nach dem Wert von Code-Reviews zu verkaufen. Ich habe an verschiedenen Orten gearbeitet, an denen sie beschäftigt waren. Ich habe gesehen, dass sie dazu verwendet wurden, Styling-Entscheidungen und funktionale Entscheidungen zu ignorieren, und ich habe gesehen, dass sie nichts weiter als eine Darmüberprüfung waren, um sicherzustellen, dass nichts Gefährliches implementiert wird. Mein Bauchgefühl ist, dass der effektivste Zweck irgendwo zwischen den beiden Optionen liegt.

Was ist der Zweck einer Codeüberprüfung?

SoylentGray
quelle
16
Related (on Stack Overflow): Der Zweck der Code Reviews
Yannis
16
- Wie würden Sie wissen, ob Sie lesbaren und leicht zu wartenden Code geschrieben haben? - Ihr Peer sagt es Ihnen, nachdem Sie den Code überprüft haben. Begründung: Sie können dies nicht selbst bestimmen, da Sie als Autor mehr wissen, als der Code von sich selbst sagt. Ein Computer kann Ihnen nicht sagen, aus den gleichen Gründen, aus denen er nicht sagen kann, ob ein Gemälde Kunst ist oder nicht. Daher benötigen Sie einen anderen Menschen, der in der Lage ist, die Software zu warten, um sich Ihre Texte anzusehen und seine Meinung zu äußern. Der offizielle Name dieses Prozesses lautet "Peer Review" . '
gnat
3
"Was ist der Zweck einer Codeüberprüfung?" um Entwickler daran zu hindern, Terribad-Code zu schreiben und sie in die richtige Richtung zu lenken.
zzzzBov
7
Scheint, Code Review könnte eine indirekte Antwort auf diese Frage haben. Schauen Sie sich einfach die Fragen und Antworten dort an, der Zweck einer Code-Überprüfung wird ziemlich offensichtlich :)
Mathieu Guindon
3
Ich frage mich, wie oft Programmierer Fehler in ihrem eigenen Code entdeckt haben, nur durch das einfache Erklären ihres Codes während einer Überprüfung?
Beil inaktiv

Antworten:

75

Es gibt mehrere Gründe, warum Sie eine Codeüberprüfung durchführen möchten:

  • Schulung anderer Entwickler. Stellen Sie sicher, dass alle Benutzer die mit einer Fehlerbehebung oder -verbesserung verbundenen Änderungen sehen, damit sie den Rest der Software verstehen können. Dies ist besonders nützlich, wenn Personen an Komponenten arbeiten, die integriert werden müssen, oder an komplexen Systemen, bei denen eine Person möglicherweise längere Zeit unterwegs ist, ohne sich bestimmte Module anzusehen.
  • Finden von Mängeln oder Verbesserungsmöglichkeiten. Sowohl der lieferbare Code als auch Testcode und Daten können auf Schwachstellen überprüft werden. Dies stellt sicher, dass der Testcode robust und gültig ist und dass das Design und die Implementierung in der gesamten Anwendung konsistent sind. Wenn zusätzliche Änderungen vorgenommen werden müssen, wird die Gelegenheit näher am Einstiegspunkt ergriffen.

Es gibt mehrere Geschäftsfälle für die Durchführung von Überprüfungen:

  • Finden von Defekten oder Problemen, die näher an ihrer Injektion nachbearbeitet werden müssten. Das ist billiger.
  • Gemeinsames Verständnis des Systems und Cross-Training. Ein Entwickler hat weniger Zeit, sich auf den neuesten Stand zu bringen und Änderungen vorzunehmen.
  • Identifikation möglicher Systemerweiterungen.
  • Öffnung der Implementierung, um sicherzustellen, dass die Tester eine angemessene Abdeckung bieten. Aus einer Testperspektive wird aus einer schwarzen Box eine graue Box oder eine weiße Box.

Wenn Sie eine umfassende Diskussion zu den Vorteilen und Implementierungsstrategien von Peer Reviews wünschen, empfehlen wir Ihnen, Peer Reviews in Software: Ein praktischer Leitfaden von Karl Wiegers zu lesen .

Thomas Owens
quelle
7
+1, ich denke, Sie haben die wichtigsten Punkte mit den richtigen Prioritäten gut erkannt. Die Konstanz des Designs im Umgang mit Mitarbeitern, die ständig sehr kreative "WTF" -Lösungen finden, kann nur durch regelmäßige Codeüberprüfungen erreicht werden.
Doc Brown
Wir führen Codeüberprüfungen in unserem JavaScript-Code durch, um sicherzustellen, dass sich die Entwickler an die angegebenen Standards halten. Dabei verwenden wir das angegebene Muster beim Entwerfen von Modulen, die bereitgestellten Komponenten und beginnen nicht mit der Ninja-Codierung (absichtlich oder absichtlich) bei Problemen, für die wir bereits Lösungen haben zum. Sie sind auch großartig, um jemanden zu entdecken, der versehentlich den thisKontext überschreibt und ihn nicht .hasOwnPropertyan Orten verwendet, an denen er sein sollte, usw. usw. - Hauptsächlich für Standards. In einer verwalteten Sprache wie C # haben Sie natürlich mehrere Gründe weniger als für dynamische Sprachen.
Nope
1
Bisher spielt Ihre Antwort nur auf Verbesserungen der Code-Korrektheit an. Die Lesbarkeit / Wartbarkeit des Codes, die vom Entwickler nur selten genau quantifiziert werden kann, wird nicht berücksichtigt.
Kunst
51

Code Reviews sind ein Werkzeug für den Wissenstransfer .

  • Wenn Entwickler sich gegenseitig den Code ansehen, werden sie in allen Bereichen des Systems vertraut. Dies reduziert den Busfaktor eines Projekts und macht Entwickler effizienter, wenn sie einen Teil des Systems warten müssen, den sie nicht geschrieben haben.

  • Wenn ein Junior-Programmierer den Code eines Senioren überprüft, kann der Junior-Programmierer Tricks lernen, die sonst nur durch Erfahrung erlernt wurden. Dies kann auch als Korrekturmaßnahme gegen übermäßig komplizierten Code wirken.

    Eine gründliche Codeüberprüfung erfordert häufige Überprüfungen anhand verschiedener Unterlagen. Es ist eine großartige Möglichkeit, eine Sprache oder API zu lernen.

  • Wenn ein erfahrener Programmierer den Code eines Juniors überprüft, ist dies eine Gelegenheit, Probleme auszubügeln, bevor sie in technische Schulden umgewandelt werden. Eine Codeüberprüfung kann eine gute Einstellung für die Betreuung von Nachwuchsprogrammierern sein.

Code Reviews handeln nicht von:

  • … Fehler finden. Dafür sind Tests da. Es kommt immer noch häufig vor, dass eine Codeüberprüfung ein Problem feststellt.

  • … Keine Auswahl bei Stilproblemen - geben Sie sich mit einem Stil zufrieden und verwenden Sie automatisierte Formatierer, um ihn durchzusetzen. Es gibt jedoch viele Dinge, die ein automatisiertes Tool nicht überprüfen kann. Codeüberprüfungen sind ein guter Ort, um sicherzustellen, dass der Code ausreichend dokumentiert ist oder sich selbst dokumentiert.

amon
quelle
2
Ihr letzter Punkt zu Stilproblemen, mit denen ich nicht ganz einverstanden bin - wir hatten gerade eine erschütternde Erfahrung beim Überprüfen des Codes eines Junior-Entwicklers und die auffälligste Beschwerde betraf tatsächlich den Stil, aber nicht die Art von Stilproblemen, die sich leicht programmatisch lösen lassen erzwungen .... waaaaaay zu viele if-Anweisungen für Edgecases etc; Probleme, die man ja in einigen Fällen von einem Computer finden lassen könnte, aber die meisten waren es nicht wert, generisch per Skript gefunden zu werden. Es dauert 30 Sekunden, bis wir es gelesen haben, weitere 30 Sekunden, um es dem Entwickler zu erklären und das Problem hoffentlich zu beheben. Immer noch unter Schock: /
Pazifist
7
@pacifist Das ist nicht der Stil, den der Antwortende beschreibt. Bei Style geht es um Positionen von Klammern, Einrückungen und so weiter. Wenn Ihr Nachwuchsentwickler zu viele if-Anweisungen verwendet, haben Sie ein ganz anderes Problem als der Stil. Ein allgemeines Attribut der Codierung von STYLE ist, dass es die Leistung nicht beeinträchtigt. Und ich denke, dass eine beträchtliche Anzahl von if-Anweisungen die Leistung beeinflussen wird.
Pimgd
12
Wenn ich eine Überprüfung durchführe, entdecke ich oft Dinge, bei denen ich denke, dass dies wie ein Fehler aussieht. Dann schreibe ich einen bestimmten Testfall, um zu beweisen, dass es sich um einen Fehler handelt. Eines der vielen Ziele der Codeüberprüfung ist es, Fehler zu finden. Aus diesem Grund halte ich den Standpunkt "Entweder Codeüberprüfung oder Tests" für etwas zu einschneidig.
Doc Brown
2
Zusätzlich zu @DocBrown gibt es Fälle, die nicht einfach zu testen sind - Datenrassen, einige Arten von Deadlocks, Livelocks, undefinierte Verhaltensweisen / Werte (meist in C / C ++, aber auch die Reihenfolge der Elemente in Hash-Tabellen in undefined) oder Ressourcen-Lauch (Das Öffnen einer Datei in einer Schleife kann auch mit GC eine schlechte Idee sein.) Einige dieser Dinge können durch eine ausreichend intelligente, compilerstatische Analyse erkannt werden .
Maciej Piechotka
2
@pacifist Ihr spezielles Beispiel würde in einer Codeüberprüfung total durcheinander geraten. Es wäre auch eine rote Fahne für jeden statischen Code-Analysator (zyklomatische Komplexität 17!). Eine Codeüberprüfung würde diese Funktion schnell als ein Problem im semantischen Stil (oder sogar den Algorithmus!) Identifizieren. Jedoch. Diese Art von Ausgabe ist nicht nur eine "Art" Ausgabe. Wenn Sie es als solches behandeln, haben Sie in Kürze wirklich bösen Code in Ihrem Repository. Immerhin ist es nur "Stil".
Pimgd
12

Das Wertvollste, was ich persönlich bei einer Codeüberprüfung erhalte, ist die Gewissheit, dass der Code für eine andere Person klar ist . Sind Variablen eindeutig benannt? Ist der Zweck jedes Codeblocks einigermaßen offensichtlich? Wird etwas Zweideutiges mit einem Kommentar geklärt? Sind Randfälle und gültige Werte für Parameter in Kommentaren angegeben und im Code geprüft?


quelle
2
Dies scheint nichts Wesentliches zu bieten als die vorherigen 4 Antworten
Mücke
2
@gnat: Die anderen Antworten befassen sich mit Wissenstransfer und dem Erkennen von Fehlern. Diese sind wichtig, aber zu einer Codeüberprüfung gehört noch mehr.
1
Soweit ich das beurteilen kann, wird in dieser Antwort ein vernünftiger Teil mehr angesprochen : "Wenn Sie eine umfassende Diskussion über die Vorteile und Implementierungsstrategien von Peer Reviews suchen, empfehle ich, Peer Reviews in Software zu lesen: Ein praktischer Leitfaden von Karl Wiegers. " Diese Antwort behandelt es auch: "Eine Korrektur gegen übermäßig komplizierten Code"
Mücke
2
@gnat Hier wird ein anderer Aspekt der in anderen Antworten angesprochenen Punkte hervorgehoben. Warst du jemals verwirrt über deinen eigenen Code, den du vor sechs Monaten geschrieben hast? Mit der Codeüberprüfung können Sie diesen Prozess beschleunigen. Wenn Ihr Kollege von Ihrem Code verwirrt ist, können Sie ihn dennoch klären, während das Problem noch in Ihrem Gedächtnis liegt.
200_success
1
@ 200_erfolg vielleicht. Aber dieser Punkt, wenn es tatsächlich da ist, sieht wirklich schlecht dargestellt aus. Sogar Ihr Kommentar kann es besser kommunizieren als diese "Antwort". Ganz zu schweigen davon, dass es nur wiederholt , was in einem darauf wurde eine vorherige Stellungnahme erklärt , dies in einer verwandten Frage, die kanonische Antwort bezieht sich
gnat
7

Ich möchte zwei Bereiche hinzufügen, die von den anderen großartigen Antworten nicht abgedeckt werden:

Ein guter Grund für Code-Reviews ist der Hawthorne-Effekt, der sich in unserem Fall wie folgt niederschlägt: Wenn Sie wissen, dass sich jemand Ihren Code später ansieht, ist es weitaus wahrscheinlicher, dass Sie ihn überhaupt besser schreiben.

Ein weiterer wichtiger Grund ist die Verbesserung der Sicherheit der Entwicklungspraktiken. Man muss sich nur Apples goto fail (eine versehentlich duplizierte Codezeile) oder den Heartbleed-Fehler (ein grundlegender Fehler bei der Eingabevalidierung) ansehen, um zu verstehen, wie wichtig ordnungsgemäße Codeüberprüfungen für einen sicheren Entwicklungslebenszyklus sind.

Chris Knight
quelle