{"id":984,"date":"2010-06-20T18:27:48","date_gmt":"2010-06-20T18:27:48","guid":{"rendered":"http:\/\/www.navision-blog.de\/2010\/06\/20\/codingdojo-in-tdd-die-einfachste-loesung-siegt\/"},"modified":"2010-06-20T19:10:09","modified_gmt":"2010-06-20T19:10:09","slug":"codingdojo-in-tdd-die-einfachste-loesung-siegt","status":"publish","type":"post","link":"http:\/\/www.navision-blog.de\/blog\/2010\/06\/20\/codingdojo-in-tdd-die-einfachste-loesung-siegt\/","title":{"rendered":"CodingDojo in TDD &ndash; Die einfachste L&ouml;sung siegt"},"content":{"rendered":"<p>Auf dem <a href=\"http:\/\/karlsruhe.netopenspace.de\">.NET OpenSpace S&#252;d<\/a> in Karlsruhe hatte ich heute die Gelegenheit bei einem Coding Dojo mit Ilker Cetinkaya mitzumachen. Leider ist das Dojo nicht so richtig in Fahrt gekommen und wir haben es praktisch nicht geschafft auch nur eine einzige Regel der Kata.RomanNumerals zu implementieren. Der Grund daf&#252;r war (sicherlich nicht nur) aus meiner Sicht, dass es zwei starke Fraktionen innerhalb des Teams gab. Auf der einen Seite \u201cCoder\u201d, die sich tats&#228;chlich von den Tests treiben lassen wollten und auf der anderen Seite eine Gruppe der \u201cKnobler\u201d, die sich nicht mit dem Test-first-Ansatz identifizieren k&#246;nnen und lieber am Board einen Algorithmus entwickeln.<\/p>\n<p>Aus meiner Sicht sind beide Ans&#228;tze f&#252;r sich betrachtet auch v&#246;llig in Ordnung und k&#246;nnen zu sehr guten L&#246;sungen f&#252;hren.<\/p>\n<p>Wer z.B. nicht glaubt, dass der strikte Test-first-Ansatz f&#252;r Kata.RomanNumerals funktioniert, der kann gern die Teilnehmer vom <a href=\"http:\/\/www.navision-blog.de\/2010\/06\/18\/bericht-vom-2-ten-net-coding-dojo-in-hamburg\/\">2.ten Hamburger Coding Dojo<\/a> fragen oder das <a href=\"http:\/\/github.com\/forki\/DojoHamburg\/commits\/master\">github-Repository<\/a> dazu durch browsen und die Entwicklung der Commits verfolgen. <\/p>\n<p>Was aber offensichtlich &#252;berhaupt nicht funktioniert ist der Mittelweg. Wenn sich beide Gruppen nicht auf das Vorgehen einigen und im Zweifel immer nur der \u201clauteste\u201d &#196;nderungsvorschlag gewinnt, dann wird das Ergebnis mitunter unbefriedigend f&#252;r beide Seiten. Beim Karlsruher-Dojo hatten wir am Ende nach einer gescheiterten Implementierungsphase und abrupten Abbruch sogar nur 7 rote und einen gr&#252;nen Test vorzuweisen. Bei dem Gr&#252;nen frage ich momentan sogar immer noch warum ausgerechnet dieser Test &#252;berhaupt gelaufen ist.<\/p>\n<p>Um also eine solche Situation zu vermeiden sollte man sich also am Anfang entscheiden wie man sein Dojo gemeinsam durchziehen will. Im weiteren werde ich jetzt eher auf die von mir favorisierte Variante mit striktem TDD eingehen, auch wenn mich eine Knobler-Session mit ausgepr&#228;gter Analysephase auch mal als Vergleichswert interessieren w&#252;rde. <\/p>\n<p>Wie gesagt: Ich bin ausdr&#252;cklich davon &#252;berzeugt, dass beide L&#246;sungswege funktionieren k&#246;nnen \u2013 je nach Problem mal besser und mal schlechter.<\/p>\n<h5>Striktes TDD und der einfachste L&#246;sungsvorschlag gewinnt<\/h5>\n<p>Ein oft genanntes Argument der \u201cKnobler\u201d-Fraktion am TDD-Ansatz ist, dass nicht vorrausschauend entwickelt wird. Hey Jungs &#8211; das ist doch genau der Trick. Solange ich keine Anforderung f&#252;r irgendwelche Dinge habe (nicht im Kopf oder auf dem Papier, sondern als Test) wird keine Komplexit&#228;t hinzugef&#252;gt. Es wird dann behauptet, dass bei Test-first am Anfang sinnfreie Implementierungen gew&#228;hlt werden und dass man diesen Code am Ende ganz offensichtlich sowieso wieder wegschmei&#223;en w&#252;rde. Aber das stimmt einfach nicht. Auch wenn ich immer mehr Tests hinzunehme und meine Implementierung immer generischer wird, so wird die vorherige L&#246;sung letztlich immer ein Spezialfall der generischen Variante sein und geht somit nie verloren.<\/p>\n<p>Gerade der Fokus auf diese minimal m&#246;gliche Generalsierung der aktuellen Implementierung sorgt daf&#252;r, dass der Algorithmus am Ende korrekt herausf&#228;llt. Das Knobeln kommt an dieser Stelle nat&#252;rlich wieder in den Ablauf herein. Allerdings knobeln wir so an wesentlich kleineren und damit leichteren Problemen&#160; \u2013 selbstverst&#228;ndlich nun viel &#246;fter und in k&#252;rzeren Zyklen.<\/p>\n<p>Bei zuk&#252;nftigen Coding Dojos w&#252;rde ich also gern als Regel sehen, dass der einfachste Vorschlag, der zu Gr&#252;n f&#252;hrt implementiert wird.<\/p>\n<h5>Temposteigerung durch gruppenweises Anlegen von roten Tests<\/h5>\n<p>Zu bestimmten Zeitpunkten und insbesondere auch am Anfang von vielen Katas sieht man jedoch oft Implementierungsmuster die gleich eine ganze Klasse an Tests abdecken k&#246;nnten. Wenn man so eine Idee hat, dann sollte man die nat&#252;rlich auch nutzen und so das Tempo steigern. Anstatt aber diese Idee einfach zu programmieren w&#252;rde ich erst die komplette Gruppe von Tests schreiben und sicherstellen, dass alle neuen Tests auch wirklich &quot;rot sind. Dieser Shortcut ist aus meiner Sicht methodisch v&#246;llig unproblematisch, da zu diesem Zeitpunkt nur neue Anforderungen im System dokumentiert werden und diese dann als Begr&#252;ndung f&#252;r neue Komplexit&#228;t herangezogen werden k&#246;nnen.<\/p>\n<p>Aber auch hier sollte die selbe Regel gelten: Die leichteste Implementierung gewinnt. Wenn also ein Teilnehmer eine einfachere L&#246;sung anbieten kann, dann wird die genommen.<\/p>\n<h5>Training durch Wiederholung<\/h5>\n<p>Wie Ilker in der Auswertung bereits gesagt hat, w&#252;rde ich auch gern nochmal in der selben Truppe ein Dojo machen. Vielleicht ergibt sich das ja sogar beim n&#228;chsten OpenSpace. Denn selbstverst&#228;ndlich geht es beim Coding Dojo nicht nur um Code sondern auch um die beteiligten Menschen.    <br \/>Obwohl wir am Ende keine L&#246;sung vorweisen konnten, habe ich in der kurzen Zeit sehr viel &#252;ber die Entwicklungsmethodik anderer Teilnehmer gelernt &#8211; ich denke das hat mir wirklich eine Menge gebracht.<\/p>\n<h5>Training durch Wiederholung &#8211; Reloaded<\/h5>\n<p>Da ein wichtiges Element bei Katas auch die Wiederholung ist (und mir im Zug langweilig ist), habe ich zus&#228;tzlich f&#252;r mich selbst und andere noch eine aufger&#228;umtere Variante der Kata mit minimalen Commits in das Repository hochgeladen. Unter <a title=\"http:\/\/github.com\/forki\/DojoHamburg\/commits\/Karlsruhe\" href=\"http:\/\/github.com\/forki\/DojoHamburg\/commits\/Karlsruhe\">http:\/\/github.com\/forki\/DojoHamburg\/commits\/Karlsruhe<\/a> kann man die &#196;nderungen von unten nach oben genau nachvollziehen. Wenn jemand ein Stelle findet wo ich zu viel implementiert habe oder wo die &#196;nderung nicht sinnvoll und einfach erscheint, dann w&#252;rde ich mich freuen dar&#252;ber diskutieren zu k&#246;nnen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Auf dem .NET OpenSpace S&#252;d in Karlsruhe hatte ich heute die Gelegenheit bei einem Coding Dojo mit Ilker Cetinkaya mitzumachen. Leider ist das Dojo nicht so richtig in Fahrt gekommen und wir haben es praktisch nicht geschafft auch nur eine einzige Regel der Kata.RomanNumerals zu implementieren. Der Grund daf&#252;r war (sicherlich nicht nur) aus meiner [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,588,586],"tags":[591,590],"_links":{"self":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/984"}],"collection":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=984"}],"version-history":[{"count":6,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/984\/revisions"}],"predecessor-version":[{"id":990,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/984\/revisions\/990"}],"wp:attachment":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=984"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}