Ist eine Codeüberprüfung subjektiv oder objektiv (quantifizierbar)?


55

Ich stelle einige Richtlinien für die Codeüberprüfung zusammen. Wir haben noch keinen formalen Prozess und versuchen ihn zu formalisieren. Und unser Team ist geografisch verteilt.

Wir verwenden TFS für die Quellcodeverwaltung (wir haben es auch für Aufgaben / Fehlerverfolgung / Projektmanagement verwendet, aber das haben wir zu JIRA migriert ) und Visual Studio 2008 für die Entwicklung.

Worauf achten Sie bei einer Codeüberprüfung?

  • Das sind die Dinge, die ich mir ausgedacht habe
    1. Erzwinge FxCop- Regeln (wir sind ein Microsoft-Shop)
    2. Überprüfen Sie die Leistung (alle Tools?) Und die Sicherheit (denken Sie an die Verwendung von OWASP-Code-Crawler ) sowie die Thread-Sicherheit
    3. Namenskonventionen einhalten
    4. Der Code sollte Randfälle und Randbedingungen abdecken
    5. Sollte mit Ausnahmen richtig umgehen (Ausnahmen nicht schlucken)
    6. Überprüfen Sie, ob die Funktionalität an anderer Stelle dupliziert wurde
    7. Ein Methodenkörper sollte klein sein (20-30 Zeilen) und Methoden sollten nur eine und eine Sache tun (keine Nebenwirkungen und zeitliche Kopplung vermeiden -)
    8. Übergeben / geben Sie in Methoden keine Nullen zurück
    9. Vermeiden Sie toten Code
    10. Dokumentieren Sie öffentliche und geschützte Methoden / Eigenschaften / Variablen

Auf welche anderen Dinge sollten wir allgemein achten?

Ich versuche herauszufinden, ob wir den Überprüfungsprozess quantifizieren können (er würde bei Überprüfung durch verschiedene Personen zu identischen Ergebnissen führen) Körper sollte klein sein ".

Oder ist die Codeüberprüfung sehr subjektiv (und würde sich von Überprüfer zu Überprüfer unterscheiden)?

Das Ziel ist ein Markierungssystem (z. B. -1 Punkt für jede Verletzung der FxCop-Regel, -2 Punkte für die Nichteinhaltung von Namenskonventionen, 2 Punkte für das Refactoring usw.), damit Entwickler beim Einchecken ihres Codes vorsichtiger vorgehen. Auf diese Weise können wir Entwickler identifizieren, die ständig guten / schlechten Code schreiben. Das Ziel ist, dass der Prüfer maximal 30 Minuten Zeit hat, um eine Überprüfung durchzuführen (ich weiß, dass dies subjektiv ist, wenn man bedenkt, dass das Änderungsset / die Revision möglicherweise mehrere Dateien / große Änderungen an der vorhandenen Architektur usw. enthält, aber Sie erhalten Die allgemeine Idee ist, dass der Prüfer nicht Tage damit verbringen sollte, den Code einer Person zu überprüfen.

Welchem ​​anderen objektiven / quantifizierbaren System folgen Sie, um guten / schlechten Code zu identifizieren, der von Entwicklern geschrieben wurde?

Buchreferenz: Clean Code: Ein Handbuch für agiles Software-Handwerk von Robert Martin .


8
Was wird bei der Rückgabe von Nullen als schädlich angesehen? Ich verstehe, warum es in Hochsprachen wie C # normalerweise besser ist, leere Arrays anstelle von NULL-Werten zurückzugeben (macht Code viel eleganter und leichter, Fehler zu vermeiden). Manchmal müssen Sie jedoch eine NULL-Referenz zurückgeben, oder?

4
Wenn wir die Rückgabe von Nullen vermeiden, können wir die Überprüfung auf Nullen überspringen, wenn der Client / die konsumierende App / Bibliothek unsere Methode aufruft. aus Clean Code von Robert Martin - Kapitel 7 (Fehlerbehandlung) pp: 110 "Wenn wir null zurückgeben, schaffen wir im Wesentlichen Arbeit für uns selbst und schieben unseren Anrufern Probleme auf. Es genügt ein fehlender Null-Check, um eine Anwendung zu versenden der Kontrolle. "

3
Können Sie es jemandem erklären, der das Buch nicht kaufen möchte, um eine Seite zu lesen :)? Es scheint, dass für die meisten C # -Programme das Vermeiden von NULL-Werten den Code komplexer macht, was wiederum ein Rezept für mehr Fehler ist ...

2
Hier ist ein Blog-Beitrag, der erklärt, warum es eine schlechte Idee ist, null zurückzugeben. thehackerchickblog.com/2008/10/… . Und noch ein leedumond.com/blog/should-we-return-null-from-our-methods . Was Bob in seinem Buch vorschlägt, ist, wenn wir versucht sind, null zurückzugeben, können wir stattdessen eine Null-Referenzausnahme auslösen oder ein SPECIAL_CASE-Objekt zurückgeben. Denken Sie an das Verketten von Methodenaufrufen. this.Foo().FooBar().FooBarBar(); Wenn das von Foo zurückgegebene Objekt null ist, können Sie beim Aufrufen von FooBar ()

@SoloBold: Und nur um zu verdeutlichen, dass es sich nur um Richtlinien handelt. Wenn es einen sehr zwingenden Grund gibt, null zurückzugeben (kann in einigen Fällen sein), ist die Rückgabe von null sinnvoller als die Rückgabe eines SPECIAL_CASE-Objekts

Antworten:


25

Die Benotung von Einzelpersonen in einem Review widerspricht den meisten erfolgreichen Systemen, mit denen ich gearbeitet habe, vielleicht allen. Aber das Ziel, das ich seit mehr als 20 Jahren zu erreichen versuche, ist weniger Bugs und eine Steigerung der Produktivität pro Ingenieurstunde. Wenn die Benotung von Einzelpersonen ein Ziel ist, könnten vermutlich Bewertungen verwendet werden. Ich habe noch nie eine Situation gesehen, in der es erforderlich war, als Arbeiter oder als Anführer.

Einige objektive Studien (Fagan usw.) und viele weit verbreitete Erkenntnisse legen nahe, dass Peer-Beziehungen die Überprüfung von Codes erleichtern, um Fehler zu reduzieren und die Produktivität zu steigern. Arbeitsmanager können als Arbeiter teilnehmen, aber nicht als Manager. Diskussionspunkte werden zur Kenntnis genommen, Änderungen zur Zufriedenheit der Prüfer sind im Allgemeinen eine gute Sache, aber nicht erforderlich. Daher die Peer-Beziehung.

Jegliche automatisierten Tools , die können ohne weitere Analyse angenommen oder Urteil sind gut - Flusen in C, C ++, Java. Regelmäßige Zusammenstellung. Compiler sind WIRKLICH gut darin, Compiler-Fehler zu finden. Das Dokumentieren von Abweichungen bei automatisierten Überprüfungen klingt nach einer subtilen Anzeige der automatisierten Überprüfungen. Code-Direktiven (wie Java), die Abweichungen zulassen, sind meiner Meinung nach ziemlich gefährlich. Hervorragend zum Debuggen geeignet, damit Sie den Kern der Sache schnell erfassen können. Nicht so gut zu finden in einem schlecht dokumentierten Code-Block von 50.000 Nicht-Kommentarzeilen, für den Sie verantwortlich geworden sind.

Einige Regeln sind dumm, aber leicht durchzusetzen. Standardwerte für jede switch-Anweisung, auch wenn sie beispielsweise nicht erreichbar sind. Dann ist es nur ein Kontrollkästchen, und Sie müssen keine Zeit und Geld für Tests mit Werten aufwenden, die mit nichts übereinstimmen. Wenn Sie Regeln haben , haben Sie Torheit , sie sind untrennbar miteinander verbunden . Der Nutzen einer Regel sollte die Dummheit wert sein, die sie kostet, und diese Beziehung sollte in regelmäßigen Abständen überprüft werden.

Auf der anderen Seite ist "Es läuft" keine Tugend vor der Überprüfung oder Verteidigung in der Überprüfung. Wenn die Entwicklung dem Wasserfallmodell folgte , möchten Sie die Überprüfung durchführen, wenn die Codierung zu 85% abgeschlossen ist, bevor komplizierte Fehler gefunden und behoben wurden, da die Überprüfung eine kostengünstigere Methode ist, um sie zu finden. Da das wirkliche Leben nicht das Modell eines Wasserfalls ist, ist die Überprüfung eine Kunst und eine soziale Norm. Leute, die Ihren Code tatsächlich lesen und nach Problemen darin suchen, sind solides Gold. Management, das dies kontinuierlich unterstützt, ist eine Perle über dem Preis. Überprüfungen sollten früh und häufig durchgeführt werden .

Ich habe diese Dinge für nützlich befunden:

1) Keine Stilkriege . Wohin offene geschweifte Klammern gehen, sollte in einer bestimmten Datei nur eine Konsistenzprüfung durchgeführt werden. Alles das selbe. Das ist dann gut. Dito Einrückungstiefe ** s und ** Registerbreiten . Die meisten Organisationen stellen fest, dass sie einen gemeinsamen Standard für Registerkarten benötigen, der als großer Bereich verwendet wird.

2) zackig

   looking

Text, der nicht

   line up is hard to read 

für den Inhalt. "

Übrigens, K & R hat fünf (FÜNF) Felder eingerückt, sodass Einsprüche gegen die Autorität wertlos sind. Sei einfach konsequent.

3) Auf eine zeilenweise nummerierte, unveränderte, öffentlich zugängliche Kopie der zu überprüfenden Datei sollte 72 Stunden oder länger vor der Überprüfung hingewiesen werden.

4) Kein Design-on-the-Fly. Wenn es ein Problem gibt, notieren Sie sich dessen Position und bleiben Sie in Bewegung.

5) Tests, die alle Pfade in der Entwicklungsumgebung durchlaufen, sind eine sehr, sehr, sehr gute Idee. Tests, die massive externe Daten, Hardwareressourcen, die Nutzung des Kundenstandorts usw. erfordern, sind Tests, die ein Vermögen kosten und nicht gründlich sind.

6) Ein Nicht- ASCII- Dateiformat ist akzeptabel, wenn Werkzeuge vorhanden sind, angezeigt, bearbeitet usw. werden oder zu Beginn der Entwicklung erstellt werden. Dies ist eine persönliche Tendenz von mir, aber in einer Welt, in der das dominierende Betriebssystem mit weniger als 1 Gigabyte RAM nicht aus dem Weg geht, kann ich nicht verstehen, warum Dateien mit weniger als beispielsweise 10 Megabyte irgendetwas sein sollten anders als ASCII oder ein anderes kommerziell unterstütztes Format. Es gibt Standards für Grafiken, Sound, Filme, ausführbare Dateien und dazugehörige Tools. Es gibt keine Entschuldigung für eine Datei, die eine binäre Darstellung einiger Objekte enthält.

Bei der Wartung, Überarbeitung oder Entwicklung von freigegebenem Code nutzte eine Gruppe von Mitarbeitern, die ich von einer anderen Person begutachtet hatte, die auf einem Display saß und einen Unterschied zwischen Alt und Neu betrachtete , als Tor zum Einchecken in einer Filiale. Mir hat es gefallen, es war billig, schnell, relativ einfach zu machen. Kurzanleitungen für Benutzer, die den Code nicht im Voraus gelesen haben, können für alle hilfreich sein, verbessern den Code des Entwicklers jedoch nur selten.

Wenn Sie geografisch verteilt sind, ist es relativ einfach, Unterschiede auf einem Bildschirm zu betrachten, während Sie mit anderen Personen sprechen, die sich die gleichen Unterschiede ansehen. Das deckt zwei Personen ab, die Änderungen betrachten. Für eine größere Gruppe, die den fraglichen Code gelesen hat, sind mehrere Sites nicht viel schwieriger als alle in einem Raum. Mehrere Räume, die durch gemeinsame Computerbildschirme und Squak-Boxen verbunden sind, funktionieren meiner Meinung nach sehr gut. Je mehr Sites, desto mehr Meeting-Management wird benötigt. Ein Manager als Moderator kann sich hier seinen Lebensunterhalt verdienen. Denken Sie daran, die Websites, auf denen Sie nicht sind, weiterhin abzufragen.

Zu einem bestimmten Zeitpunkt verfügte dieselbe Organisation über automatisierte Komponententests, die als Regressionstests verwendet wurden. Das war sehr schön. Natürlich haben wir dann die Plattformen gewechselt und den automatisierten Test hinter uns gelassen. Wie das Agile Manifest feststellt, sind Beziehungen wichtiger als Prozesse oder Tools . Nach der Überprüfung sind automatisierte Komponententests / Regressionstests die zweitwichtigste Hilfe bei der Erstellung guter Software.

Wenn Sie die Tests auf Anforderungen stützen können , naja, wie die Dame in "Als Harry Sally traf" sagt , werde ich haben, was sie hat!

Alle Überprüfungen müssen über einen Parkplatz verfügen , um Anforderungen und Entwurfsprobleme auf der Ebene über der Kodierung zu erfassen. Sobald etwas auf dem Parkplatz als zugehörig erkannt wird, sollte die Diskussion in der Überprüfung unterbrochen werden.

Manchmal denke ich, dass die Codeüberprüfung wie eine schematische Überprüfung im Hardware-Design aussehen sollte - vollständig öffentlich, gründlich, Tutorial, das Ende eines Prozesses, ein Gateway, nach dem es erstellt und getestet wird. Aber schematische Reviews sind schwergewichtig, weil das Wechseln physischer Objekte teuer ist. Architektur-, Schnittstellen- und Dokumentationsprüfungen für Software sollten wahrscheinlich schwergewichtig sein. Code ist flüssiger. Die Codeüberprüfung sollte leichter sein.

In vielerlei Hinsicht denke ich, dass Technologie genauso viel mit Kultur und Erwartung zu tun hat wie mit einem bestimmten Werkzeug. Denken Sie an all die „ Schweizer Familie Robinson “ / Familie Feuerstein / McGyver Improvisationen, die das Herz erfreuen und den Geist herausfordern. Wir wollen, dass unsere Sachen funktionieren . Es gibt keinen einzigen Weg dahin, genauso wenig wie es "Intelligenz" gab, die irgendwie von KI- Programmen der 1960er Jahre abstrahiert und automatisiert werden konnte.


Das ist eine gute Antwort, insbesondere im Hinblick auf die Einstufung von Personen - dies sollte nicht der Punkt einer Codeüberprüfung sein.
Paddy

25

Die meisten Punkte, die Sie beschrieben haben, sind nur eine Frage der Code-Formatierung oder "Oberfläche":

  • Namenskonventionen einhalten
  • Vermeiden Sie toten Code
  • Dokumentieren
  • ...

All dies könnte mit einem automatisierten Tool überprüft werden : Es ist nicht erforderlich, dass ein erfahrener Entwickler Zeit damit verbringt, den Code zu durchlaufen, um darauf zu achten.

Ich weiß überhaupt nichts über .NET , aber für PHP haben wir Tools, um solche Dinge zu überprüfen. Angesichts der Tatsache, dass .NET oft als "industrieller" als PHP eingestuft wird, wäre ich überrascht zu hören, dass es kein Tool gibt, mit dem man solche Dinge überprüfen kann.


Das automatisierte Tool kann beides:

  • Integrieren Sie sich in einen automatischen Build-Prozess , der jede Nacht ausgeführt wird
  • Senden Sie E-Mail-Berichte
    • Warnungen (z. B. eine Methode ist länger als 20 Zeilen)
    • Fehler (z. B. eine Methode ist länger als 50 Zeilen)

Die Mail kann gesendet werden , um entweder das ganze Team, oder der Typ, der den Code verpflichtet , die keinen Test nicht bestanden - oder man könnte etwas verwenden Reporting Web-Interface (gleiche Note über .NET und PHP)


Ich möchte auch hinzufügen, dass automatisierte Tests sehr hilfreich sein können, um eine bestimmte Anzahl von Fehlern zu erkennen, bevor der Code in der Produktion verwendet wird. Und automatisierte Tests können auch bei einigen Metriken helfen, nehme ich an.


Code-Reviews , die von erfahrenen Entwicklern durchgeführt wurden, haben noch einen weiteren großen Vorteil, über den Sie nicht gesprochen haben:

  • Ein erfahrener developper kann oft eine Vielzahl von Fehlern erkennen , indem nur auf dem Quellcode suchen (ich ziemlich oft Fehler finden , wenn ich Code - Reviews zu tun)
  • Eine Codeüberprüfung durch einen erfahrenen Entwickler ermöglicht es ihm , Kommentare und Empfehlungen an das Team zu richten :
    • Er wird versuchen, die im Code verwendeten Algorithmen zu verstehen und möglicherweise bessere Lösungen vorzuschlagen.
    • Wenn Sie nur den Code lesen, sehen Sie oft Dinge, die ein automatisiertes Tool nicht erkennt.

Aber für eine Code-Überprüfung, die über die reine Code-Formatierung hinausgeht, benötigen Sie mehr als eine halbe Stunde ...


Dieses Tool für .Net (jetzt nur C #) ist StyleCop. code.msdn.microsoft.com/sourceanalysis
Bryan Anderson

15

Meine Erfahrungen mit der Codeüberprüfung sind, dass es eine gemeinsame Anstrengung zur Verbesserung des Codes sein sollte, nicht eine "Maßnahme", um zu entscheiden, wer bei seiner Arbeit gut oder schlecht ist. Wenn es keine Rolle spielt, ob Sie während der Codeüberprüfung viele Anmerkungen erhalten, sind die Überprüfer strenger und geben daher Vorschläge zur Verbesserung des Codes.

Um die Qualität des eingecheckten Codes zu verbessern, erzwingen Sie, dass Überprüfungskommentare verarbeitet werden (lassen Sie den Überprüfer die verarbeiteten Kommentare genehmigen), und verwenden Sie außerdem Tools zur Überprüfung des statischen Codes, um eine Qualitätsstufe für das anfängliche Festschreiben zu erzwingen.


2
+1 für Ihre Bemerkung, dass dies kein Vergleich darüber sein soll, wer in seinem Beruf besser ist. Das wäre schlecht für die Moral!

2
@KarstenF: Stimmt. Außerdem arbeitet DeveloperA möglicherweise mit einer komplexeren Aufgabe (mehr Codezeilen), während DeveloperB möglicherweise in einer einfachen Aufgabe arbeitet und weniger Punkte erzielt (auf der Punkteskala). Es wäre unfair zu sagen , dass DevA einen schlechten Job gemacht , wenn es keine Möglichkeit gibt , sowohl ihre Jobs / Aufgaben zu normalisieren

2
Einige Entwickler könnten auch versuchen, ihre Kollegen zu diskreditieren.

Dieser Punkt ist richtig. Kleinliche Konzepte (wie die Benotung) führen zu Kleinlichkeit.
Dan Rosenstark

+1 zu diesem sehr wichtigen Punkt. Sobald Ihr Prozess beginnt, eine Zahl zu produzieren, werden die Leute ihren Code spielen, um ihre Zahlen zu steigern. Sie schreiben zum Beispiel viele Zeilen einfachen Codes, so dass ihre Strafen / Methodenbewertung sehr niedrig ist. Oder sie verbringen die ganze Zeit damit, perfekte Variablennamen zu finden. Und dann wird es zu einer politischen Sache, weil niemand auf kleinere Fehler im Code seines Freundes hinweisen will, weil dies seine Punktzahl senkt und ihn schlecht aussehen lässt! Oh nein! Kurz gesagt, Ihr Herz ist am richtigen Ort, aber schlechte Idee. Programmierer sind keine Showhunde.
Roger

5

Ich halte Ihr Bewertungssystem für eine schlechte Idee. Was ist der Sinn? Um gute und schlechte Programmierer zu identifizieren? Jeder in dieser Codeüberprüfung kann auf der Grundlage des in der Codeüberprüfung dargestellten Codes eine Beurteilung über einen bestimmten Programmierer abgeben, die besser ist als die willkürliche Zuweisung von Werten zu einem etwas willkürlichen Satz von Merkmalen. Wenn Sie gute und schlechte Programmierer identifizieren möchten, fragen Sie die Programmierer. Ich garantiere, dass Menschen diese Einschätzung besser als Ihre alberne Heuristik machen können.

Mein Vorschlag wäre, die Codeüberprüfungen so zu verbessern, dass die Menschen ihre Ideen und Meinungen in einer nicht wertenden und nicht feindlichen Umgebung offen austauschen. Wenn Sie das tun könnten, wären Sie 100-mal besser dran, als Programmierer anhand Ihrer albernen Checklisten zu beurteilen, die vorgeben, Programmierer gut einzuschätzen. Ich denke, viele Programmierer sind bereits stolz und hart auf sich selbst, wenn sie in Code-Reviews schlecht abschneiden. Ich frage mich, ob eine weitere „Bestrafung“ für schlechte Leistungen generell hilfreich ist.


4

Mein einziger Rat wäre, zu vermeiden, dass Ihr Codeüberprüfungsprozess zu streng wird - das Wichtigste ist, dass die Codeüberprüfung tatsächlich stattfindet und dass sie ernst genommen wird .

Je anstrengender der Prozess für den Reviewer ist, desto unwahrscheinlicher ist es, dass Code-Reviews stattfinden und dass sie ernst genommen werden, anstatt nur als Ärger gesehen zu werden. Außerdem liegt der wahre Wert von Code-Überprüfungen in der Fähigkeit des Überprüfers, seine eigene Beurteilung zu verwenden. Mit automatisierten Tools kann geprüft werden, ob die FXCop-Regeln erfüllt sind.


+100! Ich meine, +1, aber das ist wirklich nicht der springende Punkt: Für Code-Reviews und Unit-Tests (und andere Dinge) ist weniger mehr. Dies ist nur wahr, weil mehr nur mehr ist, bis es null wird :)
Dan Rosenstark

4

Als Faustregel gilt, dass Sie keine Zeit mit Codeüberprüfungen verbringen sollten, die maschinell durchgeführt werden könnten. Ihr erster Punkt ist beispielsweise, "FxCop-Regeln durchzusetzen", aber vermutlich kann dies von FxCop durchgeführt werden, ohne dass Menschen dies ebenfalls tun müssen.


3

Wenn Sie es messen können, wenn es objektiv und quantifizierbar ist, lassen Sie es von einem Werkzeug tun. Wo Sie einen erfahrenen Rezensenten brauchen, ist für die unscharfen subjektiven Sachen.


100 Stunden, um das Werkzeug herzustellen, 1000, die mit ihm gespeichert werden.
Dan Rosenstark

3

Es wurden bereits viele gute Kommentare zu Stilfragen abgegeben, was wichtig ist. Bei einem Teamprojekt ist es hilfreich, wenn der gesamte Code so aussieht, als ob er von einem einzelnen Autor geschrieben wurde. Auf diese Weise können andere Teammitglieder leichter vorbeischauen und Probleme beheben, wenn sie auftreten. Welche quantitativen Maßnahmen Sie wählen, um dieses umfassendere Ziel zu erreichen, ist weniger wichtig.

Ein weiterer Punkt ist die Sicherstellung, dass der Code mit der für den Rest des Systems vereinbarten Gesamtarchitektur übereinstimmt. Ähnliche Probleme sollten alle auf die gleiche Weise gelöst werden. Wenn die Anwendungslogik auf mehrere Ebenen aufgeteilt wurde, zerbricht der zu überprüfende Code seine Funktionalität so wie der Rest des Systems? Oder lehrt der betrachtete Code etwas Neues, das über den Rest des Systems hinweg zurückgezogen werden sollte? So wie die Stilprüfungen sicherstellen, dass der Code alle gleich aussieht, sollte die Überprüfung der Architektur sicherstellen, dass der Code alle gleich funktioniert. Auch hier liegt der Schwerpunkt auf der Wartbarkeit. Jeder im Team sollte in der Lage sein, in diesen Code einzusteigen und sofort zu verstehen, was passiert.

Die Benotungsidee scheint eine Katastrophe zu sein, aber Sie kennen Ihr Team am besten. Es ist möglich, dass sie durch ein solches System motiviert werden, aber ich denke, es ist wahrscheinlicher, dass sich die Leute mehr Gedanken über ihre Note machen als Probleme lösen. Eine der wirklich wertvollen Nebenwirkungen von Code Reviews sind die Mentoring-Möglichkeiten, die sie bieten. Der Prüfer sollte die Person, die den Code geschrieben hat, als Mentor behandeln. Jedes gefundene Problem ist kein Problem, sondern eine Gelegenheit, ein sachkundigeres und anspruchsvolleres Teammitglied und insgesamt ein engeres Team zusammenzustellen.


2

Ich interessiere mich eigentlich mehr für das "subjektive" Zeug als für alles andere, ehrlich gesagt. Was ich von einer guten Codeüberprüfung möchte, ist, dass jemand meine Logik überprüft und nicht meine Eingabe. Und darauf konzentriere ich mich, wenn ich einen Code-Review gebe.

Das allgemeine Format, das ich gerne nehme, ist:

  1. Was reparieren wir?
  2. Was hat es verursacht? (siehe Code)
  3. Wie beheben wir das?
  4. Zeig mir den neuen Code
  5. Zeig mir, wie der Code funktioniert

Ohne das neigt das bloße Betrachten von Unterschieden dazu, Beiträge zu kleinen Problemen oder stilistischen Punkten zu liefern. Mir geht es viel mehr darum, ob die Logik stimmt, der Ansatz insgesamt gut ist und ob die Lösung wartbar ist.

Als Beispiel habe ich mir kürzlich einen Code von einem Kollegen angesehen. Das ursprüngliche Problem war eine Verletzung von FxCop. Es wurde jedoch versucht, das Vorhandensein oder Fehlen einer Windows-Funktion durch Überprüfen der Versionsnummer festzustellen. Mein Haupteingang war, dass dies ein fragiler Weg war, und wir sollten den Dienst besser direkt abfragen, da sich die Zuordnung zwischen Feature-Existenz und Windows-Sku in Zukunft ändern könnte und überhaupt nicht zukunftssicher war.


Nicht klar aus Ihrer Antwort: Hat FxCop diese Zerbrechlichkeit bemerkt, oder haben Sie?
Dan Rosenstark

2

Cyclomatic Complexity (CC) ist eine Möglichkeit, Code zu bewerten, der nicht schlecht ist.

In tatsächlichem Code mit hohem CC habe ich einen hohen Faktor "Was ist hier los, ich erinnere mich nicht". Ein niedrigerer CC-Code ist leichter herauszufinden.

Offensichtlich gelten die üblichen Einschränkungen für Metriken.


1
@ AfermeraInfo: nicht wahr?
Paul Nathan

1

Code-Reviews sind sowohl subjektiv als auch objektiv. Regeln wie "Der Methodenkörper muss 20-30 Zeilen lang sein" sind subjektiv (einige Leute denken vielleicht, dass 100 Zeilen in Ordnung sind), aber wenn Ihr Unternehmen entschieden hat, dass 20-30 Zeilen das Limit sind, ist das in Ordnung und Sie können das messen. Ich denke, dass das Punktesystem, das Sie sich ausgedacht haben, eine großartige Idee ist. Sie müssen es regelmäßig neu bewerten, da Sie feststellen, dass bestimmte Regeln mehr oder weniger Gewicht in der Wertung haben müssen, aber solange jeder die Regeln kennt, sieht es wie ein gutes System aus.

Andere Dinge, nach denen ich suchen würde:

  • Klarheit des Codes - Manchmal kann ein Teil des Codes in eine oder mehrere Zeilen geschrieben werden. Der durchschnittliche Programmierer sollte nicht mehrere Minuten damit verbringen müssen, herauszufinden, was eine Codezeile bewirkt. In diesem Fall sollte der Code möglicherweise einfacher umgeschrieben werden. Dies ist subjektiv, aber der entscheidende Punkt ist, dass der Code für die meisten Programmierer in Ihrem Unternehmen sofort verständlich sein sollte.
  • Eingabeparameter der Funktion prüfen - Es sollte ein Code vorhanden sein, mit dem überprüft werden kann, ob die Eingabeparameter in akzeptablen Bereichen liegen. Dies sollte auch mit der Funktionsdokumentation übereinstimmen.
  • beschreibende Variablennamen - mit Ausnahme einiger Sonderfälle (Schleifenindizes usw.) sollten Variablennamen beschreibend sein. Eine Ressource, die Sie möglicherweise nach Namenskonventionen usw. durchsuchen möchten, ist Code Complete

1

Es scheint, als würden Sie zu schnell zu detailliert. Sie sollten es mehr aufschlüsseln. Sie sollten den Code auf seine Codequalität und auf seine Funktionskompatibilität hin beobachten. Ihr hättet euch trennen sollen und das ist noch nicht einmal das Ende der Geschichte ... also hier ist mein Vorschlag:

Codequalität:

  • Automatisierte Überprüfungen:
    • Konformation des Stils: Ist die Namenskonvention korrekt? Sind alle Codes richtig eingerückt?
    • Effizienzstandard: Überprüfung auf Speicherlecks, Komplexitätsprüfung, redundante Variablen usw.
  • Aktuelle Peer Review:
    • Ein einfacher Spaziergang durch das Design
    • Erklärung von Abweichungen von den automatisierten Prüfungen
    • Einfache Wartung, sprechen Sie darüber, wie Sie es und alles warten können
    • Testbarkeit: Wie einfach ist es, diesen Code zu testen? Hast du einen Plan?

Funktionskompatibilität:

  1. Eine Überprüfung der Featureanforderungen und aller Änderungen seit der Überprüfung der Anforderungen und / oder des Designs
  2. Demonstrieren Sie die mit den Anforderungen verbundenen Funktionen und aktivieren Sie sie nacheinander
  3. Diskutieren Sie alle zusätzlichen Anforderungen in den anderen Aspekten der Software, die während der Implementierung auftreten (z. B. Bereitstellungspläne, Infrastruktur usw.).
  4. Erläuterung etwaiger Abweichungen von den Anforderungen bis zu diesem Zeitpunkt.

Wenn Sie sich mit diesen beiden Aspekten einer Codeüberprüfung befassen können, sind Sie goldrichtig.



1

Es hängt davon ab, ob.

Einige Teile der Überprüfung sind leicht quantifizierbar (keine FxCop-Probleme, keine StyleCop- Fehler, keine CAT.NET- Fehler usw.).

Der Stil kann jedoch subjektiv sein - aber wie Sie sagen, wenn Sie erst einmal genauer sind (keine Methode> 20 Zeilen), können Sie ihn messen, und Tools wie NDepend können dies automatisch tun. Einige Dinge werden jedoch niemals automatisch ablaufen - für die Prüfung der Edge-Case-Bearbeitung sind Tests erforderlich, wodurch die Codeabdeckung erhöht wird. In vielen Fällen ist 100% ein unerreichbares Ideal. Die automatische Überprüfung von Duplikaten ist schwierig. Ich bin mir nicht sicher, ob ich mit Ihnen einverstanden bin, aber Sie können möglicherweise NDepend-Regeln oder FxCop-Regeln für diese schreiben.

Je mehr Tools desto besser. Wenn Entwickler ihre Arbeit vor dem Festschreiben von Änderungen überprüfen und Prüfungen als Teil des CI- Prozesses durchführen können, wird der Überprüfungsbedarf auf ein Minimum reduziert.


0

Ein Markierungssystem klingt schwierig, aber es lohnt sich, es als Messinstrument zu haben: Sie können nicht verbessern, was Sie nicht messen können. Aber Sie sollten wahrscheinlich akzeptieren, dass es schwierig / unmöglich sein wird, einige Dinge genau zu quantifizieren. Die schwierige Aufgabe wird es sein, herauszufinden, wie viele Punkte jede Qualität erzielen soll: Wenn beispielsweise die Einhaltung von Namenskonventionen 2 Punkte ergibt, wie viele Punkte sind dann für die Kleinhaltung von Methoden erforderlich?

Vielleicht wäre so etwas wie eine einfache Checkliste besser, damit der Code als konform, teilweise konform oder nicht konform mit einer bestimmten Qualität gekennzeichnet werden kann. Später können Sie der Checkliste Punkte hinzufügen, sobald Sie feststellen, welche Qualitätsprobleme am häufigsten auftreten oder die meisten Probleme verursachen.

Der Überprüfungsprozess sollte auch so flexibel sein, dass Code Teile der Überprüfung nicht bestehen kann, sofern dies gerechtfertigt und dokumentiert werden kann. Es ist eine schlechte Idee, sich blind an einen Code-Qualitätsstandard zu halten, der dazu führt, dass eine Komponente unnötig komplex / unhandlich wird.


Präfekt Dinge passieren.

0

Wenn Sie möchten, dass der Code der Benutzer standardisierter wird, ohne dass sie "ihre Zeit mit dem Formatieren verschwenden", wie sich einige Entwickler beschweren. Investieren Sie in ein Tool wie ReSharper, da das Korrigieren von Formatierungs- und anderen Re-Factoring-Aufgaben fast automatisch erfolgt.


0
  • Wenn eine Maschine dies überprüfen kann, sollten es die Leute nicht tun.
  • Nur ein Checklistenpunkt: Wird jeder Fehlerfall überall korrekt behandelt?
  • Verwenden Sie Codeüberprüfungen, um die Qualität zu verbessern und Wissen zu übertragen.
  • Verwenden Sie keine Codeüberprüfungen, um "schlechte" Entwickler zu identifizieren.
  • Ich-Dinge sind effektiver als explizite Punkte.
  • Halten Sie es kurz - 90 Minuten und 500 Zeilen ist riesig.
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.