8 min read

Code-Review-Kultur bei Aliz: warum und wie wir Code überprüfen

Published on
September 8, 2020
Author
Ármin Scipiades
Ármin Scipiades
Software Architect
Subscribe to our newsletter
Subscribe
Code-Review-Kultur bei Aliz: warum und wie wir Code überprüfen

Code-Reviews sind in Softwareunternehmen inzwischen eine weit verbreitete agile Technik, die jedoch oft missbraucht wird. Manchmal wird sie zu einem Wettkampfsport zwischen Entwicklern. Manchmal ist es nur der leitende Entwickler, der die Arbeit seiner Untergebenen korrigiert, so wie ein Lehrer die Hausaufgaben korrigiert. Manchmal ist es nur ein Blick auf den Pull Request (PR) vor dem Zusammenführen, eine obligatorische und nutzlose Aufgabe. Manchmal wird es sogar ganz fallen gelassen, weil es Zeitverschwendung ist. In diesem Beitrag werde ich ein wenig über unsere Überprüfungsgewohnheiten in unserem Team hier bei Aliz sprechen, seit es Teil unserer Unternehmenskultur geworden ist.

Hardcore-Reviews

Wir machen ernsthafte Code-Reviews. Wir sind sozusagen Hardcore. Von jedem Entwickler im Projekt wird erwartet, dass er mehr oder weniger vom ersten Tag an dabei ist. Sie haben vielleicht das Gefühl, dass Sie nichts Sinnvolles zu sagen haben (mir ging es jedenfalls so!), aber das haben Sie tatsächlich. Wenn Sie einen Kommentar oder einen Teil des Codes nicht verstehen, ist das allein schon ein Problem. Wir bauen ein großes System auf, an dem noch jahrelang gearbeitet wird und dessen Code auch nach Jahren noch überarbeitet werden muss. Es muss unbedingt sichergestellt werden, dass alle unsere Entwickler in der Lage sind, ihn zu verstehen. Und die Teilnahme an der Codeüberprüfung ist eine großartige Möglichkeit, die Codebasis kennen zu lernen. Sie tauchen in den Programmierstil, die Praktiken und die Werte des Teams ein. Sie sehen auch die Kommentare der anderen Prüfer und lernen auf diese Weise, worauf es ankommt. Es gibt keine festen Regeln darüber, wie viel Zeit Sie mit der Überprüfung verbringen sollten oder wie oft, aber es wird von Ihnen erwartet, dass Sie es zu einem Teil Ihrer Routine machen.

Reviewing zum Spaß und zum Profit

Wir verwenden Reviewable, ein ziemlich cooles Tool, das vollständig mit GitHub integriert ist. Ich überprüfe Reviewable immer dann, wenn ich etwas Freizeit habe. Wenn ich eine neue Pull-Anfrage sehe, schaue ich sie mir an: Das hilft mir, bei Änderungen auf dem Laufenden zu bleiben. Es ist, als hätte ich den Finger am Puls des Projekts. Und wenn ich offensichtliche Probleme entdecke, weise ich sofort darauf hin: schnelles Feedback ist wichtig.

Ich versuche auch, mir jeden Tag etwa eine Stunde Zeit zu nehmen, um PRs gezielt zu prüfen:

  • Zuerst lese ich die Jira-Meldung, die den PR auslöst, und versuche, den Geschäftsfall zu verstehen. Wenn die Problembeschreibung nicht klar ist, ist das an sich schon ein Problem.
  • Ich prüfe die Schnittstelle: Methodennamen, Signaturen, Javadoc. Wenn es unklar ist, hinterlasse ich einen Kommentar.
  • Ich überprüfe die Implementierung und weise sofort auf elementare Fehler hin. Ich hinterlasse auch einen Kommentar, wenn ich etwas sehe, das ich nicht verstehe. Wenn ich nicht verstehe, warum ein Teil des Codes so ist, wie er ist, wird der nächste Entwickler, der fünf Jahre später daran arbeitet, wahrscheinlich genauso verwirrt sein. Seien wir höflich und lassen wir ihnen wenigstens einen erklärenden Kommentar da.
  • Ich weise nicht nur auf Schwachstellen hin: Wenn ich etwas Beeindruckendes sehe, hinterlasse ich einen lobenden Kommentar.
  • Dann wird es schwierig. Sind die Grenzfälle abgedeckt? Ist es einfach zu warten? Ist es leistungsfähig? Gibt es einen besseren Weg, das Ganze zu realisieren? Sind die Tests gut? Ich meine, nicht nur okay, sondern gut? Das ist der schwierigste Teil. Es erfordert ziemlich viel geistige Anstrengung, da ich das ganze Problem überdenken und vielleicht neu entwerfen muss.

Am besten ist es, eine PR zu überprüfen, an der man nicht maßgeblich beteiligt war. Wenn Sie an der Lösung mitgewirkt haben, werden Sie die Fehler darin nicht erkennen! Aber natürlich, wenn Sie eine PR über einen Teil des Codes überprüfen, über den Sie absolut nichts wissen, nun, dann wird das eine Menge Arbeit für Sie bedeuten. Und höchstwahrscheinlich werden Sie nicht in der Lage sein, tiefere Probleme zu erkennen, aber das ist in Ordnung. Wie bei jedem agilen Prozess besteht der Trick darin, dass wir ihn jederzeit abbrechen können. Wenn ich mich wirklich überfordert fühle, bitte ich jemanden, der mehr Erfahrung hat, es ebenfalls zu überprüfen.

Die Freuden des Rezensierens

Ihre Arbeit wird also überprüft werden. Es werden Probleme, Fehler und Unklarheiten gefunden werden, aber das ist zu erwarten (der natürliche Zustand von Code ist, dass er fehlerhaft ist). Manchmal wird es bedeuten, dass die Hälfte des Pull Requests umgeschrieben und neu entworfen werden muss, und das wird unangenehm sein. Es besteht die Möglichkeit, dass Sie sich kritisiert fühlen, vielleicht sogar verletzt.

Aber es ist wichtig zu erkennen, dass nicht Sie bewertet werden, sondern die Lösung, die Sie erstellen. Ihre Kompetenz wird nicht in Frage gestellt. Sie werden nicht kritisiert. Ihre Prüfer sind nicht darauf aus, Fehler an Ihnen zu finden, sondern an Ihrem Code; sie wollen Ihnen helfen. Es geht nur darum, gemeinsam etwas zu schaffen. Es kann einige Zeit dauern, bis Sie sich an diese Denkweise gewöhnt haben, vor allem, wenn Sie aus einer sehr hierarchischen Unternehmenskultur kommen.

Es mag anfangs schwierig sein, überprüft zu werden, aber die Belohnungen, oh Mann, die Belohnungen sind einfach großartig:

  • Es werden Bugs gefunden. Sicher, Sie haben Ihren Code doppelt geprüft, darüber nachgedacht und alle Tests geschrieben, aber Sie sind nur eine Person. Selbst wenn Sie sich denselben Code zweimal ansehen, sehen Sie ihn mit denselben Vorurteilen, die Sie hatten, als Sie ihn zum ersten Mal schrieben.
  • Ihr Code wird höchstwahrscheinlich besser werden. Er wird leichter zu lesen und zu verstehen sein, sich besser in die Programmierkonventionen des Teams einfügen und generell schöner anzusehen sein.
  • Die Verantwortung wird auf mehrere Schultern verteilt. Wenn das Problem von der Qualitätssicherung oder, Gott bewahre, von der Produktion zurückkommt, wird es helfen, das Schuldgefühl zu lindern, dass andere es überprüft haben und es für gut befunden haben. Es trägt dazu bei, eine Unternehmenskultur aufzubauen, in der das Team die Verantwortung gemeinsam trägt und nicht mit dem Finger auf andere zeigt, wenn etwas schief läuft.
  • Der Bus-Faktor sinkt. Wenn ein Entwickler von einem Bus überfahren wird (oder einfach nur in den Urlaub fährt), wird das Team nicht so hart getroffen. Sicher, vielleicht kannte er den Teil mit dem Füllen der Bar ganz genau, aber hey, Sie haben den PR gelesen, in dem sie diese knifflige Umstrukturierung vorgenommen haben, und Sie wissen im Allgemeinen, wie es funktionieren soll.
  • Der Wissenstransfer wird einfacher. Sie sehen das coole Muster, das andere verwenden, und Sie fangen an, es auch zu verwenden. Da Sie es in Aktion sehen, hinterlässt es einen stärkeren Eindruck, als wenn Sie es in einer Präsentation sehen würden.
  • Ihr Codestil wird sich auf natürliche Weise an den des Teams anpassen. Wir haben nicht einmal einen detaillierten Styleguide; das geschieht einfach auf natürliche Weise.

Fallstricke und Vorsichtsmaßnahmen

Okay, genug der Lobeshymnen.

Die Codeüberprüfung als Prozess ist nicht ohne Schwierigkeiten und Fallstricke. Zum einen zerbricht die Codeüberprüfung, wenn es sich nicht um eine Diskussion unter Gleichen handelt, wenn Hierarchie ins Spiel kommt. Man sollte nicht einfach jedem glauben, dass er Recht hat. Sie sollten Ihren Code nicht ändern, nur weil man es Ihnen sagt; Sie sollten immer versuchen, die Gründe dafür zu verstehen. Seien Sie selbstbewusst, wenn Sie prüfen und wenn Sie geprüft werden. Das ist manchmal schwierig. Man braucht Mut, um einem erfahrenen Entwickler zu sagen, dass er eine Funktion falsch verwendet, oder um ihm zu sagen, dass dieser Vorschlag zwar toll ist, aber nicht in diese Ausgabe gepackt werden sollte.

Denn, ja, Code-Reviews führen manchmal zu schleichenden Verbesserungen. Ich habe mich dessen auch schon schuldig gemacht. Wenn es sich nicht um eine dringende Problemlösung handelt, verliert man leicht den Fokus, weil man den PR immer weiter verbessern will. Auch hier gilt: Seien Sie durchsetzungsfähig und konzentriert.

Es besteht auch die Gefahr, dass Meinungsverschiedenheiten ins Leere laufen. Diese entstehen in der Regel dadurch, dass der Gutachter sich nicht klar genug ausdrückt oder der Begutachtete an diesem Tag ein wenig langsam ist. Glücklicherweise kommt dies selten vor. Wenn es nach dem ersten Austausch ein Missverständnis oder eine Meinungsverschiedenheit gibt, rufen wir uns schnell gegenseitig an und besprechen das Problem persönlich. Wenn wir es dann immer noch nicht klären können, ziehen wir eine dritte Partei hinzu, die uns bei der Entscheidung hilft. Es ist wichtig, die endgültige Entscheidung auch in einem abschließenden Kommentar in der Rezension zu dokumentieren. Das Lesen von Überprüfungskommentaren vergangener PRs ist eine gute Möglichkeit, mehr über ein altes Problem herauszufinden.

Eine weitere häufige Beschwerde gegen Code-Reviews ist, dass es zu lange dauert, bis jemand die Sache überprüft. Dieses Problem haben wir auch manchmal: Wenn Ihr PR groß und einschüchternd ist, werden sich die Leute scheuen, ihn überhaupt zu prüfen. Eine Möglichkeit, dies zu bekämpfen, ist es, ihn in kleinere Commits aufzuteilen (was wir sowieso alle anstreben sollten), oder in mehrere PRs. Es hilft auch, wenn Sie den Mut haben, jemanden als Überprüfer zu markieren: Die Leute ignorieren selten, wenn man sie auf diese Weise darauf hinweist.

Trotzdem sind verspätete Überprüfungen ein Problem, vor allem weil es den Entwickler zu häufigen Kontextwechseln zwingt.

Asynchrone, skalierbare, automatisch dokumentierte Paarprogrammierung

Code Review ist kein Allheilmittel, keine magische Lösung, die alle Probleme löst. Es ist nur eine Technik, die in der Softwareentwicklung eingesetzt wird. Sie erfordert eine starke Unternehmenskultur und kann leicht missbraucht werden.

Die offensichtliche Alternative ist die Paarprogrammierung, die (wenn sie richtig gemacht wird) so etwas wie ein Code-Review auf Steroiden ist. Aber im Gegensatz zur Paarprogrammierung sind Reviews asynchron und erfordern keine physische Anwesenheit. Pair Programming ist auch nicht wirklich skalierbar: Mob Programming macht zwar Spaß, ist aber kaum effizient. Die Asynchronität von Code-Reviews macht Mob Programming zu einer echten Möglichkeit! All dies lässt sich gut mit Teams vereinbaren, die aus der Ferne und mit flexiblen Arbeitszeiten arbeiten, und das ist in der derzeitigen Pandemie eine große Sache.

Code-Reviews sind konservativer als Pair Programming und trunk-basierte Entwicklung und eignen sich besser für die Arbeit an großen, veralteten Systemen. Zum Beispiel werden die Ergebnisse der Überprüfung automatisch dokumentiert, während die Diskussionen während der Paararbeit verloren gehen.

Code-Review funktioniert bei uns, sozusagen, die meiste Zeit. Und ich mag es sehr.

Wie sieht es bei Ihnen aus?

Author
Ármin Scipiades
Software Architect
Subscribe to our newsletter
Subscribe