Random thoughts and musings. Part of an oliology.

oliology.diary

Freitag, Juni 20, 2008

Code Review Howto
Code-Review-Spickzettel

I've compiled a list of how I do code reviews:

  • If possible, do the code reviews in an ordner that makes checking in the patches easy. You can use the bug dependencies for this (in addition to other things).
  • Don't do reviews when you feel unconcentrated or snarfy. (Snarfiness affects your perception and your judgement so that your reviews become unconstructive and unhelpful.)
  • Use Bugzilla's function Details > Edit Attachment as Comment to write your comment to source code. This will create different colours for the original (cited) code and your comment, making your review easier to read.
  • Leave the file names (and the underline) in your review so trhe coder knows which file you're referring to.
  • Only cite the code to which your comment refers, and then maybe some context. Delete code that is not relevant for your review—this will make reading your review easier, and it will reduce the probably of you comments getting lost. This will look like this:
>Index: locallang_db.xml
>===================================================================

>- <label index="tx_rep_locations.country_iso2">Country</label> >+ <label index="tx_rep_locations.country_id">Country</label> As you are renaming a key, please remove the hashes and the copies of the original strings and have llxml run over the file to create new hashes.
  • Your review time is precious. Use it well. If you see that the coder has overlooked basic stuff so that the patch needs to be considerably reworked or extended or it still contains severe bugs, immediately stop your review and mention the reason for this in your comment. Possible reasons for this are:
    • Some unit tests are still missing.
    • With this patch, some unit tests fail.
    • The coder hasn't taken all comments from your previous review into account (or written a comment why he/she thinks that that particular comment doesn't apply).
    • The coder hasn't read his/her own patch before submitting it, so that there still are many oversights or copy'n'paste errors.
  • Be kind. The coder doesn't mean any harm with his/her errors. Not every sentence of your review needs to contain a verb, but please use the word please in abundance.
  • Even when a coder does the same error over and over or misses the same thing again and again: He/she really means no harm and isn't stupid either. Old habits just are hard to lose. So patiently repeat yrou comments and don't take it personally. If needed, you can use copy'n'paste for your comments or write Ditto..
  • Especially pay attention to the following things:
    • Is the code easy to read and understand?
    • Are there any bad smells that may hint that a refactoring is needed? (For details, please have a look into the book Refactoring.)
    • Are the comments complete and easy to understand?
    • Does the code communicate the intent behind it clearly?
    • Does the code adhere to our coding style guidelines?
    • Are all functions and edge cases covered by unit tests?
    • Is the code consistent?
    • Is there duplicate code that needs to be refactored?
    • Does the code prevent SQL injection and cross-site scripting (XSS)?
    • Are all error cases caught (eg. an object is null, a UID that is provided via the URL might not be an integer after all, a link text is empty?
  • In addition the improve the code quality for the short term, the aim of code reviews is to facilitate learning for the code (so that the code quality is high for the long term, and the reviews take less time). So explain the rartionale of your comments.
  • Point out when something which you write is a general rule or principle.
  • Point out when something is an exception to a general rule or principle (and why it makes sense to make and exception in this case).
  • If you find a solution to be very elegant or good craftsmanship, write a praise.

Ich habe mal zusammengetragen, wie ich an Code-Reviews herangehe:

  • Erledige die Reviews möglichst in einer Reihenfolge, in der sich die Patches gut einchecken lassen. Du kannst dich dabei (auch, aber nicht nur) an den Abhängigkeiten der Bugs orientieren.
  • Mache keine Reviews, wenn du unkonzentriert oder genervt/wütend bist. (Gernervtsein beeinträchtigt deine Wahrnehmung und dein Urteilsvermögen, so dass deine Reviews unkonstruktiv und nicht hilfreich werden.)
  • Benutze in Bugzilla die Funktion Details > Edit Attachment as Comment, um Kommentare zum Sourcecode schreiben. Das führt dazu, dass der ursprüngliche (zitierte) Code und deine Kommentare unterschiedliche Farben bekommen und daher leicht zu lesen sind.
  • Lasse den Namen der Datei plus die Unterstreichung stehen, damit der Coder weiß, auf welche Datei du dich beziehst.
  • Lasse nur den Code stehen, auf den du dich beziehst, und vielleicht noch ein bisschen Kontext. Lösche daher Code, der für deinen Review nicht relevant ist – das macht es für den Coder einfacher, deinen Review zu lesen, und reduziert die Warscheinlichkeit, dass er manche deiner Kommentare übersieht. Das sieht dann in etwa so aus:
>Index: locallang_db.xml
>===================================================================

>- <label index="tx_rep_locations.country_iso2">Country</label> >+ <label index="tx_rep_locations.country_id">Country</label> Da du einen Key umbenennst, entferne bitte noch die Hashes und Kopien des Originalstrings und lasse llxml über die Datei laufen, um neue Verwaltungsdaten zu erzeugen.
  • Deine Reviewzeit ist kostbar. Nutze sie gut. Wenn du merkst, dass der Coder grundlegende Dinge vergessen hat, so dass der Patch noch wesentlich überarbeitet oder erweitert werden muss oder noch schwere Fehler enthält, dann höre sofort mit dem Review auf und erwähne den Grund in einem Kommentar. Mögliche Gründe dafür:
    • Es fehlen noch Unit-Tests.
    • Unit-Tests schlagen mit dem Patch fehl.
    • Der Coder hat noch nicht alle Punkte deines letzten Reviews umgesetzt bzw. abgelehnt.
    • Der Coder hat seinen Patch vor dem Hochladen selbst noch nicht durchgelesen, so dass noch viele Flüchtigkeitsfehler oder Copy'n'Paste-Fehler zu finden sind.
  • Sei höflich. Der Coder meint seine Fehler nicht böse. Nicht jeder Satz deines Reviews muss ein Verb haben, aber benutze das Wort bitte reichlich.
  • Auch wenn ein Coder den gleichen Fehler immer wieder macht oder die gleiche Sache immer wieder übersieht: Er meint es wirklich nicht böse und ist auch nicht dumm. Alte Gewohnheiten sind einfach schwer wieder loszuwerden. Wiederhole daher geduldig deine Kommentare und nimm es nicht persönlich. Bei Bedarf kannst du ja Copy'n'Paste machen oder Dito. schreiben.
  • Achte besonders auf folgende Dinge:
    • Ist der Code gut verständlich?
    • Gibt es schlechte Gerüche, die auf ein notwendiges Refactoring hinweisen könnten? (Mehr dazu im Refactoring-Buch.)
    • Sind die Kommentare vollständig und gut verständlich?
    • Kommuniziert der Code die Absicht dahinter klar und deutlich?
    • Hält der Code unsere Coding-Guidelines ein?
    • Sind alle Funktionen und die Randfälle von Unit-Tests abgedeckt?
    • Ist der Code konsistent?
    • Ist doppelter Code da, der refactort werden sollte?
    • Werden SQL-Injections und Cross-Site-Scripting (XSS) verhindert?
    • Werden Fehler abgefangen (z.B. ein Objekt ist null, eine in der URL übergebene UID ist gar kein Integer, ein Linktext ist leer)?
  • Das Ziel von Reviews ist nicht nur, kurzfristig die Qualität des Codes zu verbessern, sondern der Coder soll auch etwas dabei lernen (damit der Code langfristig gut ist und die Reviews weniger Arbeit sind). Erkläre deswegen auch die Hintergründe deiner Anmerkungen.
  • Weise darauf hin, wenn etwas, was du anmerkst, einen generelle Regel oder ein generelles Prinzip ist.
  • Weise darauf hin, wenn etwas eine Ausnahme von einer generellen Regel ist (und warum man da eine Ausnahme machen kann).
  • Wenn du etwas elegant gelöst oder handwerklich sauber findest, schreibe auch mal ein Lob in deinen Review.

Oliver @ 10:44 | Permalink | 0 comments/Kommentare

|

Good people

Good Software

Archive