{"id":184,"date":"2015-08-05T16:00:54","date_gmt":"2015-08-05T14:00:54","guid":{"rendered":"http:\/\/invidit.de\/blog\/?p=184"},"modified":"2015-08-04T07:57:37","modified_gmt":"2015-08-04T05:57:37","slug":"4-augen-sehen-mehr-als-2","status":"publish","type":"post","link":"https:\/\/invidit.de\/blog\/4-augen-sehen-mehr-als-2\/","title":{"rendered":"4 Augen sehen mehr als 2"},"content":{"rendered":"<p>Hallo Spa\u00df Coder,<\/p>\n<p>ist euer Code immer perfekt? Macht ihr keine Fehler? Habt ihr immer auf Anhieb die beste Struktur und Architektur gefunden? Dann ist dieser Artikel nichts f\u00fcr euch. Heute wollen wir uns mit dem Thema besch\u00e4ftigen, wie wir im Team voneinander lernen k\u00f6nnen.<\/p>\n<p>Eine M\u00f6glichkeit, Wissen im Team zu verteilen und zu lernen, haben wir mit dem <a href=\"http:\/\/invidit.de\/blog\/1-1-3\/\" target=\"_blank\">Pair Programming<\/a> ja bereits vorgestellt. Diesmal schauen wir uns an, wie wir auch in verteilten Teams gemeinsam zu besserem Code kommen k\u00f6nnen. Dabei helfen uns Code Reviews.<\/p>\n<p>&nbsp;<\/p>\n<h1>Was ist ein Code Review?<\/h1>\n<p>Unter einem Review verstehen wir in der Softwareentwicklung die manuelle \u00dcberpr\u00fcfung der Arbeitsergebnisse. Beim Code Review geht es dabei insbesondere darum, den entstandenen Code zu pr\u00fcfen. Wir schauen uns den Code eines Kollegen an und pr\u00fcfen, ob der Code das macht, was er laut Beschreibung tun soll, sich an vereinbarte Standards h\u00e4lt und gut lesbar ist. Wir achten auf eine saubere Struktur, die Einhaltung der <a href=\"http:\/\/invidit.de\/blog\/tag\/solid\/\" target=\"_blank\">SOLID-Prinzipien<\/a>, die sinnvolle Verwendung von Patterns, saubere Fehlerverarbeitung, und so weiter und so weiter.<\/p>\n<p>Wir schauen also kritisch auf den Code und pr\u00fcfen ihn eingehend auf Fehler und Sauberkeit.<\/p>\n<p>&nbsp;<\/p>\n<h1>Warum sollten wir Code Reviews durchf\u00fchren?<\/h1>\n<p>Durch Code Reviews finden wir Fehler bereits im Code, die wir sonst ggf. erst sehr sp\u00e4t in der Testphase entdecken. Ein 4-Augen-Pronzip ist eine g\u00fcnstige Art der Pr\u00fcfung. Dadurch erh\u00f6hen wir die Qualit\u00e4t der Software.<\/p>\n<p>Ein Code Review sollte immer m\u00f6glichst im Dialog erfolgen. Dieser muss nicht zwingend direkt gef\u00fchrt werden, sondern kann auch asynchron erfolgen, etwa via E-Mail oder ein geeignetes Code Review-Werkzeug. Dadurch tauschen wir Wissen zwischen den beteiligten Entwicklern aus. Der Autor bekommt aktives Feedback zu seinem Code. Fehler werden entdeckt, auf m\u00f6gliche Testautomatisierung hingewiesen, schlecht lesbarer (und damit schlecht wartbarer) Code wird aufgedeckt. Der Reviewer liest Code, sieht guten Code und elegante L\u00f6sungen. Aber auch Fehler, die er selbst vielleicht auch gemacht h\u00e4tte. Beide lernen dabei was f\u00fcr sich.<\/p>\n<p>Unterm Strich haben wir also mit recht geringem Kostenaufwand einen hohen Nutzen erzielt. Zus\u00e4tzlich erh\u00f6hen wir die Qualit\u00e4t der Software und die Wartbarkeit des Codes&#8230;und wir verringern den <a href=\"https:\/\/de.wikipedia.org\/wiki\/Truck_Number\" target=\"_blank\">Truck Factor<\/a> als Risiko f\u00fcr das Projekt. Alles in allem erh\u00f6hen wir damit also die Kundenzufriedenheit durch saubere Software.<\/p>\n<p>&nbsp;<\/p>\n<h1>Was brauchen wir f\u00fcr Code Reviews?<\/h1>\n<p>Was generell f\u00fcr Teams gilt, damit diese gut und effizient zusammenarbeiten k\u00f6nnen, gilt f\u00fcr gemeinsam durchgef\u00fchrte Code Reviews insbesondere. So sind Einigungen \u00fcber Namenskonventionen, Code-Formatierung, Einsatz erlaubter Frameworks usw. im Vorfeld zu kl\u00e4ren, damit nicht jeder &#8222;seinen&#8220; Code-Stil\u00a0 durchsetzen will. Im Team kommt es darauf an, einheitlich zu arbeiten. Pers\u00f6nliche Vorlieben m\u00fcssen dabei hinten anstehen.<\/p>\n<p>Damit ein Code Review zu einem guten Ergebnis f\u00fcr alle Beteiligten wird, sollte der Autor kritikf\u00e4hig sein. Es geht darum, den Code zu bewerten, nicht den Autor zu diskreditieren. Wir wollen gemeinsam besseren Code und bessere Softwarequalit\u00e4t erreichen. Rechtfertigungen und unausgesprochene Kritik sind dabei fehl am Platz. Aber auch der Reviewer sollte sich an gewisse <a href=\"https:\/\/de.wikipedia.org\/wiki\/Feedback_(Gruppendynamik)#Feedback-Regeln\" target=\"_blank\">Feedback-Regeln<\/a> halten.<\/p>\n<p>Hilfreich ist es &#8211; vor allem, wenn man gerade im Team mit Code Reviews beginnt &#8211; sich Ziele f\u00fcr das Code Review zu setzen. &#8222;Diese Woche schauen wir insbesondere auf saubere Benennung von Packages, Klassen und Variablen.&#8220; oder &#8222;In diesem Sprint ist uns wichtig, dass es zu m\u00f6glichst jeder Klasse ausreichend automatisierte Tests gibt.&#8220;<\/p>\n<p>Dass jeder Entwickler vor dem Einchecken ins Versionskontrollsystem den eigenen Code noch einmal \u00fcberpr\u00fcft, versteht sich nat\u00fcrlich von selbst.<\/p>\n<p>&nbsp;<\/p>\n<h1>Wie f\u00fchren wir Code Reviews durch?<\/h1>\n<p>Zeitnah nach dem Einchecken des Codes schaut sich der Reviewer den Code an. Es sollten keine Review-Marathons durchgef\u00fchrt werden. Dann fehlt die Konzentration und vor allem, wenn man alle Reviews am Ende macht, die Zeit, die \u00c4nderungen auch noch sauber einzubauen.<\/p>\n<p>Zun\u00e4chst schauen wir uns als Reviewer an, worum es bei dem commiteten Code \u00fcberhaupt geht. Wie ist die User-Story? Wie lauten die Akzeptanzkriterien? Welche Rahmenbedingungen gilt es zu beachten?<\/p>\n<p>Anschlie\u00dfend verschaffen wir uns einen \u00dcberblick \u00fcber die \u00c4nderung. Welche Teile des Systems sind betroffen? Welche Codestellen wurden ge\u00e4ndert? Welche verschoben? Welche entfernt?<\/p>\n<p>Dann schauen wir uns den Code an. Dabei achten wir ggf. besonders auf das Ziel, welches wir uns im Vorfeld gesetzt haben. Wir pr\u00fcfen den Code, ob er der Aufgabenstellung entspricht, suchen nach Fehlern und unsauberen Codestellen.<\/p>\n<p>Finden wir was Auff\u00e4lliges, kommentieren wir dies entsprechend. Hierbei bietet sich nat\u00fcrlich ein entsprechendes Code Review Werkzeug an. Aber auch direktes pers\u00f6nliches Feedback ist angebracht. Wichtig ist, dass wir uns ausreichend Zeit nehmen und f\u00fcr Ruhe sorgen. Es geht nicht darum, die \u00c4nderung abzunicken, sondern zu pr\u00fcfen. Auch positive Anmerkungen sind erlaubt!<\/p>\n<p>Wenn wir als Autor nun Feedback zu unserem Code erhalten, sollten wir nicht gleich in den Rechtfertigungsmodus schalten. Besser schauen wir uns den Kommentar einmal in Ruhe an, versuchen ihn zu verstehen und dann konstruktiv anzunehmen. Sind wir weiterhin der Ansicht, dass unser L\u00f6sungsvorschlag der bessere ist, bietet es sich an, dies mit dem Reviewer zu besprechen und gemeinsam zu einer einvernehmlichen L\u00f6sung zu kommen. Dabei gilt es f\u00fcr beide, kompromissbereit zu sein.<\/p>\n<p>&nbsp;<\/p>\n<h1>Tipps f\u00fcr ein besseres Code Review<\/h1>\n<p>Hier noch ein paar Tipps, die unser Kollege Mario dankenswerterweise zusammengestellt hat.<\/p>\n<h2>F\u00fcr den Autor<\/h2>\n<ul>\n<li>Kritik\/Fehler = Lernen. Nicht pers\u00f6nlich nehmen!<\/li>\n<li>Job erfordert laufende Fortbildung<\/li>\n<li>Es gibt immer jemanden der mehr wei\u00df<\/li>\n<li>Review ersetzt keine Gespr\u00e4che\/Zwischenfragen\/Diskussionen<\/li>\n<li>Reviewer an Review erinnern, wenn wichtig f\u00fcr eigenen Zeitplan<\/li>\n<li>Reviewer hat nicht immer Recht<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>F\u00fcr den Reviewer<\/h2>\n<ul>\n<li>F\u00fcr Ruhe sorgen (kein klingelndes Telefon)<\/li>\n<li>Nicht kurz schauen und OK sagen<\/li>\n<li>Code Reviews nicht vor sich herschieben<\/li>\n<li>&#8222;Das ist falsch!&#8220;, aber wie geht es besser?<\/li>\n<li>Wortwahl: Fragend statt tadelnd, nicht pers\u00f6nlich werden<\/li>\n<li>Nicht den Code selbst fixen (Bad fixes)<\/li>\n<li>Guten Code\/Pers\u00f6nliche Weiterentwicklung loben<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Unsere Erfahrung mit Code Reviews<\/h1>\n<p>Wir beide arbeiten in aller Regel im Pair Programming, die extremste Form des Code Reviews. Wenn wir aber einmal getrennt an Code arbeiten, stellen wir uns diesen gegenseitig vor, besprechen die Idee hinter der L\u00f6sung, den L\u00f6sungsweg, die Architektur usw.<\/p>\n<p>Dabei gibt der andere jeweils seine Einsch\u00e4tzung ab, was man am Code noch verbessern kann. Diese bauen wir bei Kleinigkeiten (Refactorings) dann direkt ein oder merken wir uns f\u00fcr sp\u00e4ter vor, wenn es um gr\u00f6\u00dfere \u00c4nderungen geht.<\/p>\n<p>Der wichtigste Punkt f\u00fcr uns ist dabei immer, das gegenseitige Lernen. Wir lernen unsere gesamte Codebasis kennen, auch, wenn wir sie nicht immer selbst geschrieben haben.<\/p>\n<p>Formellere Reviews, die wir in dem Unternehmen, in dem wir arbeiten durchf\u00fchren, zielen vielmehr auf die Punkte der Codequalit\u00e4t ab. Aber auch hier wollen wir immer m\u00f6glichst viel lernen oder unser Wissen und unsere Erfahrung mit den Kollegen teilen.<\/p>\n<p>&nbsp;<\/p>\n<p>Zum Abschluss noch die Einheit, in der Code-Qualit\u00e4t gemessen wird: <a href=\"http:\/\/davidwalsh.name\/code-review\" target=\"_blank\">WTF\/Minute<\/a>. Je kleiner der Wert, desto besser \ud83d\ude09<\/p>\n<p>&nbsp;<\/p>\n<p>Wir w\u00fcnschen euch viel Spa\u00df beim Ausprobieren.<\/p>\n<p>Eure Spa\u00df-Coder<\/p>\n<p>&nbsp;<\/p>\n<p>Dieser Artikel basiert neben unseren Erfahrungen auf folgenden Quellen:<\/p>\n<p><a href=\"https:\/\/de.wikipedia.org\/wiki\/Review_(Softwaretest)\">http:\/\/de.wikipedia.org\/wiki\/Review_(Softwaretest)<\/a><\/p>\n<p><a href=\"http:\/\/davidwalsh.name\/code-review\" target=\"_blank\">http:\/\/davidwalsh.name\/code-review<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hallo Spa\u00df Coder, ist euer Code immer perfekt? Macht ihr keine Fehler? Habt ihr immer auf Anhieb die beste Struktur und Architektur gefunden? Dann ist dieser Artikel nichts f\u00fcr euch. Heute wollen wir uns mit dem Thema besch\u00e4ftigen, wie wir im Team voneinander lernen k\u00f6nnen. Eine M\u00f6glichkeit, Wissen im Team zu verteilen und zu lernen, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":595,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[90],"tags":[123,65],"_links":{"self":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/184"}],"collection":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/comments?post=184"}],"version-history":[{"count":5,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"predecessor-version":[{"id":739,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/184\/revisions\/739"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media\/595"}],"wp:attachment":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}