<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.NET Stories: Digitale Erfahrungen &#187; Anforderungen</title>
	<atom:link href="http://www.gmbsg.com/tag/anforderungen/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gmbsg.com</link>
	<description>So einfach wie möglich. Aber nicht einfacher.</description>
	<lastBuildDate>Tue, 31 Aug 2010 22:21:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Räumliche Nähe wird unterschätzt</title>
		<link>http://www.gmbsg.com/raumliche-nahe-wird-unterschatzt/</link>
		<comments>http://www.gmbsg.com/raumliche-nahe-wird-unterschatzt/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 13:54:23 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1262</guid>
		<description><![CDATA[Mit Interesse habe ich den Artikel von Golo über Scrum-Teams und seine Meinung zu räumlicher Nähe in agilen Teams gelesen. Der Titel seines Artikels ist durchaus provokant: &#8220;Räumliche Nähe wird überbewertet&#8220;. 
Nun, dem muss ich deutlich widersprechen. Genau das Gegenteil ...]]></description>
			<content:encoded><![CDATA[<p>Mit Interesse habe ich den Artikel von Golo über Scrum-Teams und seine Meinung zu räumlicher Nähe in agilen Teams gelesen. Der Titel seines Artikels ist durchaus provokant: &#8220;<a href="http://www.des-eisbaeren-blog.de/post/2010/08/19/Raumliche-Nahe-wird-uberbewertet.aspx">Räumliche Nähe wird überbewertet</a>&#8220;. </p>
<p>Nun, dem muss ich deutlich widersprechen. Genau das Gegenteil ist der Fall &#8211; und sowohl sein Artikel als auch die Kommentare dazu sind in meinen Augen eine Bestätigung: Räumliche Nähe wird einfach noch viel zu oft unterschätzt!</p>
<h3>Professional Engineering</h3>
<p>Ich möchte das Beispiel von Golo aufgreifen, in dem er die gute Zusammenarbeit zwischen ihm und Peter schildert:</p>
<blockquote><p>&#8220;&#8230; Peter Bucher und ich sind ein solches Team. David Tielke und ich sind ein solches Team. Beide habe ich in meinem Leben noch nicht all zu oft getroffen – jeden von beiden höchstens fünf Mal. Und dennoch harmoniert die Zusammenarbeit in einem Ausmaß, das für Außenstehende nicht nachvollziehbar ist.</p>
<p>Auch wenn uns hunderte von Kilometern trennen, führen wir regelmäßig Programmieren in Paaren durch – per Skype und Teamviewer. Und die Zusammenarbeit funktioniert einwandfrei. Keiner von uns käme auf die Idee, zu sagen, dass wir effektiver oder effizienter sein könnten, wenn wir gemeinsam vor einem PC arbeiten würden.</p>
<p>Vermutlich wären wir dies noch nicht einmal, weil dann nicht jeder seine vertraute Arbeitsumgebung hätte, in der er sich rundum wohlfühlt&#8230;. &#8220;</p></blockquote>
<p>Das Beispiel ist ein Zeugnis von professioneller Software-Entwicklung. Da arbeiten offensichtlich zwei Profis zusammen. Sehr gut. Golo leitet daraus ab, dass es nicht zwingend notwendig sei, Teammitglieder an einem Ort, in einem Gebäude, in einem Raum zu haben, um effektiv ein &#8220;Team&#8221; zu sein. Nun, das mag ja schön und gut sein. Aber Golo: Hast Du denn Vergleiche? Und wenn ja, hast Du gemessen, wie &#8220;effektiv&#8221; denn beides ist? Ich befürchte nein. Wäre dem so, dann wäre mit großer Wahrscheinlichkeit Dein Fazit anders ausgefallen.</p>
<p>Was ich damit zum Ausdruck bringen will, ist, daß Golo und Peter wohl nie in einem Raum über längere Zeit zusammen gearbeitet haben. Ich unterstelle das jetzt einfach einmal Golo & Peter; bitte korrigiert mich und verzeiht mir, wenn dem nicht so ist. Es dient mir zur Illustration meiner Perspektive zum Thema.</p>
<p>Also, wäre dem so, so hätte Golo gar keinen Vergleich der Effektivität &#038; Effizienz des Teamgefüges zwischen ihm und Peter. Beide sind ausgewiesene Profis in der Software-Entwicklung und schaffen aus der Distanz gemeinsam gute und effiziente Teamarbeit. Der Artikel von Golo beweist es. Man stelle sich nur vor, welche Produktivität und Ingenieursleistung möglich wäre, wenn zwei solche Profis an einem Tisch arbeiten würden. Wow.</p>
<p>Damit sind wir auch schon an einem wichtigen Punkt. Agile Software-Entwicklung und deren Verfahrensweisen behaupten nicht, dass es notwendig sei, ein Team an einem Fleck zu haben, um (gut) Software zu entwickeln. Aber sie behaupten, dass sich spätestens mittelfristig die Produktivität &#038; Effizienz eines Teams steigert, wenn sie an einem Fleck miteinander zusammenarbeiten. Diese Behauptung ist kein Wunschtraum, sondern messbar &#038; belegbar.</p>
<p>Doch es gibt noch einen weiteren, ganz entscheidenden Aspekt der Forderung nach Teamnähe in der Agilität. Golo überspringt in seiner Betrachtung meines Erachtens die Interdisziplinarität agiler Teams. Das ist für mich besonders verwunderlich, zumal er in seinem gelungenen Artikel über die <a href="http://www.des-eisbaeren-blog.de/post/2010/08/18/Featurebezogene-Entwicklung.aspx">Feature-Orientierung in agilen Methoden</a> sich selbst genug Indizien gibt, die interdisziplinäre Aufstellung von Teams zu fordern &#038; zu fördern.</p>
<h3>Agile Teams sind Interdisziplinär</h3>
<p>Was heisst das? Das heisst, erst einmal, das Entwickler alleine kein Team sind. Zumindest mal in der agilen Software-Entwicklung nicht. Ein agiles Team ist ein Team, welches eigenständig dazu in der Lage ist, das geforderte Produkt bzw. deren Features ausliefern zu können. Manchmal &#8211; besser gesagt: eher selten &#8211; reichen dazu Entwickler. Doch meist braucht es mehr, viel mehr. Es braucht Produktmanager, Systemingenieure, Usability-Experten, Designer, Tester und manchmal sogar noch mehr, um ein Feature eines Produktes wirklich fertigstellen zu können.</p>
<p>Ein agiles Team ist ein Team, welches all diese Rollen und Aufgabenbereiche berücksichtigt und mit den Teammitgliedern umsetzen kann. Dass heisst nicht unbedingt, dass Designer ein &#8220;fester Bestandteil&#8221; des Teams sein muss, wenn er nur zwei Websites designen soll, das Produkt aber weitaus mehr darstellt (z.B. im Backend oder durch Dienste). Doch wichtig ist hier die Erkenntnis, dass ein agiles Team interdisziplinär ist; idealerweise sogar mit dem Kunden (oder Kundenvertreter) an seiner Seite.</p>
<p>Vor diesem Hintergrund macht die Forderung nach räumlicher Nähe von Teammitgliedern in einem Team noch viel mehr Sinn. Leider gibt es noch viel zu oft die Situation, dass Entwickler von der Marketing-Abteilung die Anforderungen über ein Feature (&lt;Ironie&gt;als &#8220;Story&#8221; natürlich, haha&lt;/Ironie&gt;) in einem &#8220;agilen&#8221; Ticketsystem vorgesetzt bekommen. Die Entwickler &#8220;sprinten&#8221; dann und liefern das Ergebnis an die Testabteilung, um danach ein Paket der Infraktruktur bzw. Installation-Engineers &#8220;über den Zaun&#8221; zu werfen. In meinen Augen haben es solche Teams echt schwer, denn sie sind nicht agil, sondern fragil.</p>
<h3>Keine Scheu vor Transparenz</h3>
<p>Die Emergenz, die durch interdisziplinare Teams entsteht, ist nämlich erst dann wirklich mess- und spürbar, wenn die Kommunikationsmittel als auch die Kommunikationsbarrieren untereinander so gering wie möglich ist. Doch nicht nur gute Kommunikation ist ein Ziel der Co-location. Ein aus meiner Sicht wesentlich wichtigerer Faktor ist der Faktor der Transparenz.</p>
<p>Durch die Nähe zueinander sieht man auch, was der andere so macht. Soll heissen, man lernt seinen Tagesablauf, seine Aufgaben, seine Tools, seine Herausforderungen &#8211; na eben das ganze Arbeitsumfeld. Umgekehrt sehen andere, mit welchen Dingen man selbst tagtäglich konfrontiert ist und was es tatsächlich bedeutet, Software zu entwickeln. Durch die Transparenz entsteht mehr Verständnis zu der Aufgabe und der Leistung des anderen Teammitglieds. Man versucht sich gegenseitig zu helfen und aufzubauen. Das wiederum hilft der Kommunikation und der Produktivität im Team.</p>
<p>Abschließend kann ich nur sagen, dass ich nicht nur ein Befürworter von räumlicher Nähe bin, sondern als Agilist versuche, so nah wie möglich an meinen Teammitgliedern und dem Kunden dran zu sein. Manchmal macht man es sich meiner Meinung nach zu einfach, wenn man Distanzen unter gemeinsam arbeitenden Kollegen als gegeben hinnimmt.</p>
<h3>Be Agile!</h3>
<p>Ich möchte in diesem Zusammenhang gerne nochmal an zwei Punkte des <a href="http://agilemanifesto.org/">agilen Manifests</a> erinnern: People over Process (and Tools), sowie Collaboration over Contracting. Für mich steht fest: wer von sich behaupten möchte, agile Software-Entwicklung zu betreiben, der wird früher oder später die Vorteile von räumlicher Nähe von Teams erkennen und versuchen, diese Nähe von Teams so gut wie möglich herzustellen. Alles andere sind in meinen Augen nur Lippenbekenntnisse und Halbwahrheiten über Agilität.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/raumliche-nahe-wird-unterschatzt/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ratatouille Estimation Scale</title>
		<link>http://www.gmbsg.com/ratatouille-estimation-scale/</link>
		<comments>http://www.gmbsg.com/ratatouille-estimation-scale/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 18:19:56 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Team]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1158</guid>
		<description><![CDATA[Manchmal ist es nicht einfach, umzudenken. Manchmal will man verstehen, tut sich aber schwer. Mir ist das schon einige Male passiert. Ich denke, jedem passiert das ab und an einmal.
So oder ähnlich erging es auch dem ein oder anderen beim ...]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist es nicht einfach, umzudenken. Manchmal will man verstehen, tut sich aber schwer. Mir ist das schon einige Male passiert. Ich denke, jedem passiert das ab und an einmal.</p>
<p>So oder ähnlich erging es auch dem ein oder anderen beim jüngsten Estimation Meeting, welches wir in einem Projekt durchgeführt haben. Für einige war es das erste Schätzmeeting, bei dem nicht einfach so Manntage herausposaunt wurden, sondern das von agilen Methoden wie XP oder Scrum bekannte schätzen in <a href="http://de.wikipedia.org/wiki/Extreme_Programming#Aufwandsabsch.C3.A4tzung">Relationsgrößen (z.B. Story Points)</a> umgesetzt wurde.</p>
<p>Für den Anfänger ist der Zeitbezug im Schätzungsverfahren meist so manifestiert, dass er sich schwer tut, überhaupt anders denken und schätzen zu können. Die erste, wichtige Hürde hin zum relativen schätzen ist eine klare Vorstellung davon, was nun der Unterschied zwischen größenorientiertem Umfang und zeitorientiertem Aufwand ist. Um den Teilnehmern und Neulingen im agilen Schätzzirkus den Einstieg zu erleichtern, habe ich mich einer kleinen Metapher bedient:</p>
<p><a href="http://www.gmbsg.com/wp-content/uploads/2010/07/ratatouille_scale.jpg"><img src="http://www.gmbsg.com/wp-content/uploads/2010/07/ratatouille_scale.jpg" alt="ratatouille_scale" title="ratatouille_scale" width="700" height="495" class="aligncenter size-full wp-image-1161" /></a></p>
<p>Da ist er, der „<strong>Ratatouille Estimation Scale</strong>“. Klassisch, einfach. Fibonacci und am Ende Hightower-Zahlen. Das war’s. Doch es ist mehr dahinter als nur die blanken Zahlen. Es ist die Metapher, die Schätzen besonders geholfen hat.</p>
<p>Denn der Film „<a href="http://disney.go.com/disneyvideos/animatedfilms/ratatouille/">Ratatouille</a>“ und die Liebe zu Gaumenschmaus ist ein schönes Beispiel, an dem sich größenorientiertes Schätzen erklären lässt. Bei der Menge der Köstlichkeiten geht es nämlich nicht darum, wie „schnell“ man diese Leckereien herunterwürgen kann. Es geht auch nicht darum, einfach wahllos seinen Hunger zu befriedigen. Nein, es geht darum, den <a href="http://www.youtube.com/watch?v=wlCAq45TcxU">Umfang und Wert der Köstlichkeiten zu erfassen</a> ;-) </p>
<p>Nur ein Häppchen? Wohl eher eine 1 oder 2. Ein echtes Stück Käse? Eher die 5. Viel Käse und Trauben dazu? Lecker. An die 20. Kistenweise Käse, Gemüse, Obst und Wein? Wow. 50 oder mehr!</p>
<p>Die Besonderheit dabei: Es wird schnell deutlich, dass es nicht um die Zeit geht. Schließlich kann man ein Stück Käse sicherlich in ein paar Stunden „abfrühstücken“ – oder aber scheibchenweise über eine Woche lang genießen. Mit steigendem Umfang wird es allerdings schwerer. Denn jetzt kommen andere Lebensmittel hinzu, die vielleicht andere Haltbarkeitsmerkmale aufweisen oder aber besondere Behandlung bzw. Lagerung benötigen. Das ist ein relativ schönes Bild für den Begriff der “Komplexität im Umfang“.</p>
<p>Den Neulingen im Estimation Meeting hat diese Metapher sehr geholfen, denn schon nach den ersten paar Schätzrunden war die &#8220;Zeit&#8221; in der Besprechung der Features „wie verschwunden“ :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/ratatouille-estimation-scale/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Unit Tests sind immer dabei</title>
		<link>http://www.gmbsg.com/unit-tests-sind-immer-dabei/</link>
		<comments>http://www.gmbsg.com/unit-tests-sind-immer-dabei/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 23:20:17 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1133</guid>
		<description><![CDATA[Vor knapp einer Woche stellte Stefan die Frage „Wohin mit den Tests?“ gestellt. Er selbst schreibt, er trenne die Implementierung und deren Tests strikt, ließ sich allerdings zu einem Experiment hinreißen, in dem er Implementierung und Tests in einem einzigen ...]]></description>
			<content:encoded><![CDATA[<p>Vor knapp einer Woche stellte Stefan die Frage „<a href="http://www.lieser-online.de/blog/?p=235">Wohin mit den Tests</a>?“ gestellt. Er selbst schreibt, er trenne die Implementierung und deren Tests strikt, ließ sich allerdings zu einem Experiment hinreißen, in dem er Implementierung und Tests in einem einzigen Projekt ließ. Alles in einer Assembly also. Motiviert wurde er wohl durch meine Aussage, dass es <a href="http://www.gmbsg.com/auf-dem-eisberg/">schlichtweg einfach nicht mehr zeitgemäß</a> ist, Tests vom SUT zu trennen.</p>
<p>Und genau so ist es auch. Zumindest für mich. Ich habe lange Zeit Tests und Implementierung in separaten Projekten entwickelt. Bis ich bemerkt habe, dass es mir nicht hilft, sondern mich eher bei meiner Entwicklung stört. Seitdem halte ich Tests und Implementierung immer ganz nah beieinander, sozusagen „Seite an Seite“. Ich möchte in diesem Post meine Beweggründe &#038; Konsequenzen für Side-by-Side-Specs (oder Near-Specs, wie ich es gerne nenne) schildern, und somit meine Antwort auf Stefan’s Frage geben.</p>
<p>Nun zunächst einmal beschränke ich mit bei den Near-Specs auf Unit Tests. Ganz klassisch im Sinne des TDD. Integrationstests sind bei mir nach wie vor Far-Specs, also separate Projekte. Doch es soll ja um die Unit Tests gehen, besser gesagt um Tests, die aus dem Test-First-Ansatz heraus entstehen. Das können Tests bei TDD oder aber auch Specs bei BDD sein. Ergo: Tests, mit denen ich meinen Code designe &#038; entwickle, halte ich sehr nah am Code.</p>
<h3>Verhalten greifbar formen</h3>
<p>Doch wieso sind bei mir die Tests nun an der Implementierung dran? Es gibt einen ganz einfachen und für mich auch unschlagbar effektiven Grund: Die Tests sind greifbar. Sie sind dort, wo ich sie brauche, nämlich an dem Verhalten, für das ich sie zur Spezifikation gebraucht habe. Seit dem ich die Tests an der Implementierung habe, „forme“ ich auch mehr und öfter. Soll heissen: Ich führe öfter und effizienter Refactorings durch. Nicht nur vom SUT, sondern natürlich auch von den Tests selbst.</p>
<p>Überhaupt ist es mit den Tests im Implementierungsprojekt ein ganz anderes, viel effizienteres arbeiten. Wenn ich nach einiger Zeit wieder einmal in einem Projekt etwas zu tun habe, schaue ich mir die Tests an. Das Schöne bei den Near-Specs ist jetzt, dass ich sehr schnell zwischen Spezifikations- und Implementierungssicht wechsle und deutlich zügiger navigieren kann. Das fällt mir besonders bei Tests mit mehreren Abhängigkeiten / Mocks auf.  Ich komme mit dieser Art von „Code lesen“ viel besser zurecht als vorher mit dem hin- und herspringen zwischen mehreren Projekten.</p>
<p>Zugegeben, anfangs tat ich mir noch ein wenig schwer, denn schließlich ist die Anzahl der Testklassen &#8211; genereller: die Menge an Testcode &#8211; für ein SUT meist deutlich mehr. Neben der Umgewöhnung des „nicht mehr über Assembly-Boundaries“ hinweg arbeitens hatte ich das Gefühl, dass mich der Testcode „stört“ oder mir „im Weg steht“. Doch dieses Gefühl war schnell wieder weg, als ich das Prinzip auf größere Projekte angewendet habe und immer wieder die Tests für die Spezifikation und das Codeverständnis gebraucht habe. Spätestens dann war bei mir die Erkenntnis da: Side-By-Side-Specifications Rule!</p>
<p>Doch mit dieser „Colocation“ der Tests an die Implementierung tauchen neue Fragen auf. Eine ganz besonders oft gestellte Frage ist die der Auslieferung der Tests in Release-Assemblies. Es ist schließlich erstrebenswert, nur das in ein Release einfliessen zu lassen, was auch wirklich vom Benutzer gebraucht wird: die Funktionalität. So stand ich auch vor dieser Aufgabe, welches sich aber sehr schnell und vor allem einfach bewältigen ließ.</p>
<h3>Reduce to the Max</h3>
<p>Die Idee ist denkbar einfach: Wenn ich Tests und Implementierung zur Entwicklungszeit nicht trenne, dann trenne ich sie eben später, undzwar zur Auslieferungszeit. In einfachen Worten: der Build muss diese Aufgabe erledigen. Da ich sowieso meinen Code über Build-Skripte bauen lasse, lag es sehr nah, diese Skripte einfach anzupassen. Für meine eigenen Projekte habe ich oft ein kleines Powershell-Skript. Bei größeren Projekten oder CI-Umgebungen ist der Aufruf eines eigenen Post-Clean-Events vor dem Build ein guter Extension-Point.</p>
<p>Als ich die Menge und den Inhalt der Kommentare bei Stefan’s Post gesehen habe, dachte ich mir nur: warum schreiben so viele darüber und finden es „schwierig“ oder „unsauber“, ohne es offensichtlich einmal probiert zu haben? Ich habe es probiert und ich fand es überhaupt nicht schwierig – ganz im Gegenteil. Jetzt ist das für mich eine viel angenehmere, effizientere und vor allem intuitivere Arbeitsweise. Das Build-Skript zum filtern der Testartefakte ist denkbar einfach, bei mir sind das meistens nur so 10 bis 20 Zeilen. Schließlich ist es ja auch „nur“ ein Release-Build. Ich rufe es nicht die ganze Zeit auf wie ein CI-Build, und CD mache bzw. brauche ich derzeit auch nicht.</p>
<p>„Soooo lange, wie ich brauche, diese Kommentare überhaupt zu lesen, brauche ich nicht einmal, wenn ich sogar das Build-Skript per TDD erstelle“ war mein Gedanke, als ich mit dem Lesen der Kommentare fertig war. Und da ich ein Freund von <a href="http://twitter.com/ilkerde/status/18264412106">empirischen Erkenntnissen</a> bin, dachte ich mir: „Auf geht’s, das machst Du jetzt!“. Gesagt getan. Das <a href="http://github.com/ilkerde/funbench/tree/master/codekatas/fizzbuzz/fizzbuzz-sidebyside/">Ergebnis</a> kann man sich auf github ansehen. Erkenntnis: Die Entwicklung des Build-Skripts (ohne TDD Framework und mit meinen „bescheidenen“ Powershell-Kenntnissen) hat etwas mehr als eine Stunde gedauert. So lange habe ich in etwa auch zum Lesen der Kommentare gebraucht ;-)</p>
<h3>Separation of Concerns</h3>
<p>Doch zurück zum Thema. Beim Lesen der Kommentare ist mir auch aufgefallen, dass man öfter das Argument der „Separation of Concerns“ (SoC) gegen die Zusammenführung von Tests und Implementierung anbringt. Es sei im Sinne der SoC, Tests von der Implementierung zu trennen. Auch gute Freunde von mir, wie z.B. <a href="http://twitter.com/tehlike">Tehlike</a> – für den ich im Übrigen diesen Post <a href="http://www.gmbsg.com/to-whom-it-may-concern/">auch auf Englisch verfasst habe</a> &#8211; entgegneten mir das gleiche Argument. Dazu mein Statement:</p>
<p><strong>Tehlike, yanılıyorsun! ;-)</strong><br />
<i>(Auf deutsch: Tehlike, Du irrst Dich!)</i></p>
<p>Ja, ich denke diejenigen irren sich, die SoC als Argument für eine Trennung von Tests &#038; Implementierung anbringen. Sie irren sich meiner Meinung nach sogar gewaltig. Denn SoC ist in meinen Augen bei genauerer Betrachtung sogar ein Argument für die Zusammenlegung von Tests und Implementierung.</p>
<p><a href="http://en.wikipedia.org/wiki/Separation_of_concerns">Separation of Concerns</a> besagt nämlich, dass unterschiedliche Zuständigkeiten eines Objekts voneinander getrennt werden sollten. Zuständigkeiten sind im Sinne der Domänenmodellierung und Systemanalyse Aspekte von Verhalten und Funktionalität. Ergo: Unterschiedliche Zuständigkeiten eines Verhaltens sollten voneinander getrennt werden. Ein schönes Beispiel ist der Taschenrechner. Die Funktionalität des Addierens des Taschenrechners gestaltet sich aus dem Tastenfeld, der Recheneinheit, und der Anzeige. All das sind Aspekte der Funktionalität, die in eigenständige Zuständigkeiten münden. Im Sinne der „Separation of Concerns“ sind diese Aspekte zu trennen und damit die Komponentenorientierung und Wiederverwendbarkeit zu stärken.</p>
<h3>Completeness of Concern</h3>
<p>So weit, so gut. Doch Separation of Concerns bedeutet für mich im Umkehrschluß auch, dass man eine Zuständigkeit einer Funktionalität auch zusammenhalten sollte. Ein einziger „Concern“ sollte in sich geschlossen sein. „Das ist er doch automatisch“ denkt man sich. Naja, ganz so einfach ist es meiner Meinung nach nicht. Denn eine Zuständigkeit einer Funktionalität findet man in der Software-Entwicklung oftmals nicht als „ganze Einheit“ an einem Fleck, sondern überall verteilt.</p>
<p>So wird z.B. in der klassischen Softwareentwicklung die Zuständigkeit in den Requirements erfasst. Man findet sie in der Use-Case-Dokumentation und in UML-Diagrammen wieder, diesmal mit ein oder zwei Szenarien. Natürlich wird das Verhalten und dessen Aspekt auch in den Tests manifestiert – dazu sind sie ja da. Und – wer hätte das gedacht – die Funktionalität findet man auch im Code wieder. Resultat: Ein einziger Concern, der im Entwicklungsprozess an allen möglichen Stellen auftaucht. In einem solchen Szenario ist es für den Entwickler meistens wie ein Puzzle, bei dem die Puzzlestücke überall sind – nur nicht auf dem Tisch.</p>
<p>Es ist also für die „Vollständigkeit einer Zuständigkeit“ nicht hilfreich, Tests und Implementierung voneinander zu trennen. Weiterhin hat das Trennen von Tests und Implementierung nichts mit Separation of Concerns zu tun, denn schließlich geht es sowohl bei den Tests als auch bei der Implementierung um einen einzigen Concern – dem Aspekt der Funktionalität, die das SUT eben abbilden soll.</p>
<p>Es ist gerade die Fraktion der BDD-Anhänger, die genau diesem Umstand mit all Ihren Argumentationen und Prinzipien hervorheben möchten. Sie reden nicht von Tests, sondern von Spezifikationen, sie reden nicht über Verifikation, sondern über Verhalten. Ja, sie gehen sogar soweit und reden im Sinne der Context-Specifications von „Concerns“, also „Zuständigkeiten“. Das alles sind klare Hinweise, das die Spezifikation eines Verhaltens und deren Umsetzung als unzertrennliches Paar zu betrachten sind. Übrigens ist diese „Expressivität“ auch ein Grund, warum „BDD“ so gut geeignet ist für Einsteiger in TDD bzw. Test-First.</p>
<h3>Feels just like it should</h3>
<p>Wenn man mal eine gewisse Zeit per TDD/BDD entwickelt, dann fällt einem oft auf, dass man bei jeder Änderung mindestens zwei Dinge ändert. Man ändert oder erweitert die Tests und man ändert oder erweitert die Implementierung. Ein Verhalten, eine Zuständigkeit, doch zwei Perspektiven, zwei Änderungspunkte. </p>
<p>Das ist bei Far-Specs, (also getrennten Tests und Implementierung über Assembly-Boundaries) genauso wie auch bei Near-Specs (Tests &#038; Implementierung Seite-An-Seite). Doch bei Near-Specs ist es einfacher, schneller und intuitiver, Änderungen am System durchzuführen. Darüber hinaus wird das Streben nach „Vollständigkeit eines Verhaltens und deren Zuständigkeit“ gestärkt. Das wiederum zahlt auf Lesbarkeit, Wartbarkeit und Flexibilität ein.</p>
<p>Seit nun seit knapp 3 Monaten entwickle ich Unit Tests, TDD &#038; BDD ausschließlich per „Side-By-Side-Specifications. Diese „andere“ Art der Codeorganisation ist für mich äußerst angenehm und effektiv gleichermaßen. Für mich ist es ein stückweit näher dran am „TDD-Spirit“, dem test- bzw. spezifikationsgetriebenen designen und entwickeln von Software. Mit Tests &#038; Implementierung nebeneinander fühlt es sich so an, wie es eigentlich sein sollte. </p>
<p>Also: <a href="http://www.youtube.com/watch?v=9LCEsRno1cg">Feels just like it should</a> ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/unit-tests-sind-immer-dabei/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>To Whom It May Concern ?!?</title>
		<link>http://www.gmbsg.com/to-whom-it-may-concern/</link>
		<comments>http://www.gmbsg.com/to-whom-it-may-concern/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 23:16:33 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[MSBuild]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1144</guid>
		<description><![CDATA[Note: Diesen Artikel gibt es auch auf Deutsch
It’s been something like a week since Stefan asked a provoking question in his blog (german): „Where to put the Tests?” He wrote that he’s strictly separating tests from their implementation in separate ...]]></description>
			<content:encoded><![CDATA[<div style="background-color: #dedede;margin:2px;"><small>Note: <i>Diesen Artikel gibt es auch auf <a href="http://www.gmbsg.com/unit-tests-sind-immer-dabei/">Deutsch</a></i></small></div>
<p>It’s been something like a week since Stefan asked a provoking question in his blog (german): „<a href="http://www.lieser-online.de/blog/?p=235">Where to put the Tests?</a>” He wrote that he’s strictly separating tests from their implementation in separate projects. However, motivated by a statement of me, he gave the idea of having tests &#038; implementation in the same project a try. Wow, all code in one assembly. He as well as a punch of commentators on his blog came to the conclusion, that separating tests from implementation using separate projects is better. I argue the converse.</p>
<p>It’s simply <a href="http://www.gmbsg.com/auf-dem-eisberg/">old-fashioned style to separate tests &#038; implementation with separate projects</a>. I did separate my tests from implementation code for years. However, about half a year ago, I realized that this separation doesn’t help me much. Instead, it hinders my development process. Since then I keep tests &#038; implementation together in one project. They are located as near to each other as possible. Let’s name this “side-by-side” residency. In this post I want to show and explain the main reasons, consequences and experiences in favor of “side-by-side specifications” or “near specs”.</p>
<p>Well, first of all, I reduce the practice of „near specs” to unit tests only. Just as in classical sense of TDD. Integration tests and verification-driven tests are located in separate projects (thus being “far specs”), as usual. For me, putting tests and implementation altogether in one project makes sense in test-first approaches. That is, TDD testing or BDD specifications. Ergo: It’s about tests I use to drive my implementation. Tests, which I’m using to design and develop the desired functionality.</p>
<h3>The grip of behavior</h3>
<p>So, what’s the point then to put tests and implementation side-by-side? In my opinion there’s a quite naive, yet effective reason: You get grip of your tests. The tests are simply there. They’re where I need them; they’re there where I expect them. They are right there where the behavior is. Since I keep tests next to my implementation, I’m just better able to “put them in shape”. Means: I do refactorings a lot more effective and frequent. Naturally not only on SUT, but tests as well.</p>
<p>Generally speaking, it’s a kind of different, more efficient style of development to work with implementation &#038; tests right at hand. Coming back to projects after some time makes it a breeze. I just look and read the tests. Then, I navigate frequently between tests and implementation to understand the details. “Near specs” make it less painful and more pleasant to read the code. This is especially the case for tests where several dependencies / mocks exist. No jumps through projects, no loading of solutions here and there. Just reading, that’s it.</p>
<p>To put it candidly, it was hard at start. The number of test classes – or the amount of test code in general – is quite a lot compared to implementation code only. I had to get used to it somehow. From time to time, I had a strange feeling that my tests are distracting me. It was so unusual for me that I felt that my tests “messed up” my organization in my “production” project. It didn’t last long though. As I continued to keep my tests right where my implementation is, I more and more realized how cool and beneficiary it is to do so. Especially as I utilized this approach on a larger codebase. Since then, it’s clear for me: putting specifications/tests side-by-side rules!</p>
<p>Wait, the world’s not shining always. New questions arise with this new “colocation” of tests right where the implementation is. Probably the most often asked is how the release assemblies of such applications look like. Needless to say, it’s desirable to let release assemblies contain only what the customer actually needs: the functionality. However, with tests in same assembly, how would you achieve this?</p>
<h3>Reduce to the Max</h3>
<p>The solution is quite simple: If tests and implementation are no longer divided in design- or development-time, then the split-up needs to take place later on, at delivery-time! Simply put, the build needs to take care of this task. Since I’m used to use build scripts for my projects, it’s quite a common thing for me to adjust end enhance my scripts to filter out the test classes and test-related references. For my own tiny projects, I most often use powershell scripts. At larger contexts with CI and Buildsystems, a call to a cleanup extension is an obvious, handy task.</p>
<p>Back to Stefan’s post. As I read through comments, I thought to myself: Why do so many people write so much about it and judge this approach as “tricky” or “dirty” without obviously not having tried it once? I did give it a try and I’m feeling very fine with it. It’s neither difficult, not dirty at all. The contrary is the case. Now that I use „near specs“, my daily TDD and development life is more pleasant and effective than before. Building a filter for test-related artifacts is an easy task. In my scripts, I usually need about 10 lines for this. Moreover, it’s worth to keep in mind that filtering is “only” needed for release builds. No CI build whatsoever affected.</p>
<p>Once read through the whole thread, I just said to myself: „I even would build my build script test-first faster than reading all this”. As some of you know me as a <a href="http://twitter.com/ilkerde/status/18264412106">friend of empiric results and measurement</a>, it’s obvious that I needed to check if my statement really would turn out true. Just do it and see if it’s really that fast and easy. No sooner said than done! I pushed the <a href="http://github.com/ilkerde/funbench/tree/master/codekatas/fizzbuzz/fizzbuzz-sidebyside/">results to my github repository</a>. Brief summary: Even without test-framework and with my „limited“ powershell knowledge, I was able to build my test-artifact filtering in about the same amount of time I spent to read the blog. ;-)</p>
<h3>Separation of Concerns</h3>
<p>Another argument quite often rose against putting tests and implementation together is “Separation of Concerns” (SoC). “Partitioning tests and implementation in separate projects is following this principle”, it’s being said. Even good friends of mine, like <a href="http://twitter.com/tehlike">Tehlike</a> bring SoC onto the table against “near specs”. By the way, I specially write this article in <a href="http://twitter.com/tehlike/status/18223527988">English for Tehlike</a>, and therefore:</p>
<p><strong>Tehlike, yanılıyorsun! ;-)</strong><br />
<i>(In english: Tehlike, you are mistaken!)</i></p>
<p>Yes, I think that those are mistaken who think that SoC is a reason to split tests and implementation. From my perspective, the opposite is the case. SoC is – once considered to look at it carefully &#8211; even a reason to put tests and implementation side-by-side.</p>
<p>The essence of <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">Separation of Concerns</a> is quite easy: diverse perspectives, say „concerns“, of a behavior of an object should be separated. „Concerns“, in context of domain modeling and system analysis, are aspects of behavior and functionality. Take the calculator example. The functionality of „addition“ of a calculator has different aspects. You need to enter the numbers through keys, the calculation unit needs to add the numbers, and the sum needs to be displayed. All concerns – better: different concerns – of one functionality. With respect to „Separation of Concerns“, those aspects need to be separated. In consequence, a component-oriented and reusable solution is fostered.</p>
<h3>Completeness of Concern</h3>
<p>So far, so good. But wait. For my understanding, Separation of Concerns means by implication, that a single concern should strive towards entirety. That is, one single concern ideally should aim completeness. „Isn’t this automatically the case?“ you might think. Mhh, not really, in my opinion. Most often, one concern is located on very diverse and unusual locations within a software development process.</p>
<p>Take the „classical“ software engineering scenario as an example. A behavior and its concern is described in requirements documentation. You can find different, mostly edgy details of the same concern in UML diagrams and Use Case documents. Of course, tests reflect the concern again. Well crafted, tests most likely specify the concern at its best. Naturally, the concern is in production code, implanted as final functionality of the system. And what’s the result now? Straight answer: The result is a mess. Most often, a developer finding himself in such a situation is faced with puzzle pieces everywhere – but not on the table. </p>
<p>Hence, for me it’s obvious that partitioning tests and implementation in separate projects is not helping me to strive towards „Completeness of Concern“. Moreover, splitting up tests an implementation is not related to Separation of Concerns. Both tests and implementation care about the same concern, that’s the simple truth.</p>
<p>BDD lovers in the wild will clap their hands. The abovementioned is more or less the same they proclaim over and over. They don’t talk about tests; they care about “specs”. They don’t talk about verification; they care about “behavior”. Yes, they even care about concerns, drivers and observations. Altogether, this is even for beginners quite a good hint towards a mindset, where tests and implementation build a chained, inseparable pair.</p>
<h3>Feels just like it should</h3>
<p>Let’s face it. Once developing a reasonable time in TDD/BDD style, you clearly realize one thing: Whenever you need to change or extend the system, you have at least two „changepoints“. First, you change tests. Right afterwards, you change your implementation. One single behavior, one single concern. But two perspectives, two edits. That’s the case for „far specs“ (that is, tests located in a separate project) as well as for “near specs” (that is, tests residing in the same project along with the implementation “side-by-side”).</p>
<p>The difference: With near specs, you change and develop the system faster, &#038; easier. It’s simply more efficient and intuitive. Near specs foster „Completeness of Concern“. This essentially contributes to better readability, maintainability and flexibility of the overall system.</p>
<p>It’s been more than 3 months now since I started to structure my unit tests strictly side-by-side along to my implementation. For me, this “different” style of code organization is absolutely pleasant and effective. Right now, I can’t think of switching back. In my opinion, putting tests and implementation as near as possible is in favor of the “TDD spirit”. With tests and implementation being at the same place, for me TDD now more and more “<a href="http://www.youtube.com/watch?v=9LCEsRno1cg">feels just like it should</a>” ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/to-whom-it-may-concern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scrum: Der bessere Scrum Master</title>
		<link>http://www.gmbsg.com/scrum-der-bessere-scrum-master/</link>
		<comments>http://www.gmbsg.com/scrum-der-bessere-scrum-master/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 16:15:37 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[System]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Lean Management]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Scrum Master]]></category>
		<category><![CDATA[Scrum Norris]]></category>
		<category><![CDATA[Selbstorganisation]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1050</guid>
		<description><![CDATA[Es ist zwar schon eine Weile her, als über die Fünf Schwachpunkte von Scrum geschrieben habe. Die Resonanz auf diesen provokanten, aber aus meiner Sicht treffenden Artikel war durchaus unterschiedlich. Man hat mich des Plagiats bezichtigt, man hat mich als ...]]></description>
			<content:encoded><![CDATA[<p>Es ist zwar schon eine Weile her, als über die <a href="http://www.gmbsg.com/funf-schwachpunkte-von-scrum/">Fünf Schwachpunkte von Scrum</a> geschrieben habe. Die Resonanz auf diesen provokanten, aber aus meiner Sicht treffenden Artikel war durchaus unterschiedlich. Man hat mich des Plagiats bezichtigt, man hat mich als unkonstruktiven Satzbauartisten bezeichnet, man hat mir Rollen-Personifizierung vorgeworfen und mich als nachhilfebedürftig abgestempelt (inkl. Links zu „guten Coaches“). Ach ja, es gab auch tatsächlich einige ernsthafte Diskussionen, die von nachdenklichen Lesern über die einzelnen Punkte geführt worden sind.</p>
<p>Wie dem auch sei, am Ende des besagten Artikels hatte ich einen Ausblick darauf gegeben, dass ich nicht nur die Punkte nennen werde, die ich als Schwachstelle in Scrum sehe, sondern auch meine Ideen dazu beitragen werde, diese Schwachstellen zu stärken und damit Scrum als agile Managementmethode für mein Verständnis erfolgreicher zu implementieren. Das habe ich für das Thema &#8220;<a href="http://www.gmbsg.com/scrum-die-bessere-sprintdauer/">bessere Sprintdauer</a>&#8221; schon getan,  und damit widme ich mich heute einem ganz besonderen „Schwachpunkt“ – dem Scrum Master. </p>
<h3>Die innere Handbremse</h3>
<p>„Oh je, der Scrum Master ist ein Schwachpunkt von Scrum?“ werden sich nun viele stirnrunzelnd denken. Ja, genau so ist es, der Scrum Master ist meiner Meinung nach sogar eine richtig hinterlistige Schwachstelle in Scrum-Projekten. Das liegt viel weniger an dem Scrum Master als Person als am Scrum Master als Rollenimplementierung, wie er in vielen Büchern beschrieben wird und von Scrum-Trainern bei Unternehmen „antrainiert“ wird.</p>
<p>Viele Scrum Master in heutigen Organisationen sind „Vollzeit-Scrum Master“, die dediziert ein Scrum Team betreuen und sich tagtäglich mit den Sorgen, Nöten und Bedürfnissen Ihres Teams auseinandersetzen. Meiner Meinung nach ist hier schon der erste Schwachpunkt erkennbar. Obwohl die Rollendefinition in „Scrum-Bibeln“ nicht oft vom Scrum Master als institutionalisierte Position spricht, wird sie überall <a hrtef="https://www.xing.com/net/leansoftwaredevelopment/diskussionen-fragen-und-antworten-400978/ist-scrummastern-ein-vollzeitjob-26488808/">diskutiert</a>, <a href="http://borisgloger.com/2009/04/21/4711-is-a-scrummaster-a-full-time-position">implementiert</a> und <a href="http://jobsuche.monster.de/Search.aspx?q=scrum%20master&#038;cy=de&#038;lid=163&#038;re=130">implantiert</a>.</p>
<p>Ein Scrum Master ist dazu da, sich überflüssig zu machen. Eines seiner größten Ziele ist es, sein Team in die <a href="http://de.wikipedia.org/wiki/Selbstorganisation">Selbstorganisation</a> zu führen und dort zu halten. Doch wie geht das bei einem Scrum Master, der eine Planstelle in einer Organisation ist? Mehr noch, hinter der Rolle Scrum Master verbirgt sich dann eine konkrete Person, ein konkreter Arbeitsplatz, ein konkretes Schicksal. Und diese Person soll sich jetzt überflüssig machen? Das wird wohl selbst der barmherzigste Mensch nicht tun. Jetzt könnte man diesen Vorwurf mit „don’t blame the tool“ abwiegeln, aber das wäre zu einfach. Die Schwachstelle liegt viel tiefer begraben als es auf der Oberfläche sichtbar ist.</p>
<h3>Zwischen den Stühlen</h3>
<p>Zumeist befindet man sich als Scrum Master innerhalb einer „agilen“ Organisation sowieso in der Zwickmühle. Einerseits sollte man das Team nicht führen, sondern begleiten. Andererseits bleibt das Management als „Chicken“ selten mehr als die ersten paar Sprints ruhig. Nicht selten trägt es „Erwartungen“ und „Strategische Leitlinien“ an den oder die Scrum Master heran. Schließlich ist der Scrum Master ja überzeugt von Scrum und der Idee, dass der Product Owner nun das Management betreiben soll. Die Kennzahlen über Team- und Projektperformance holt man dennoch beim Scrum Master ein, weil der „einfach näher dran am Geschehen ist“.</p>
<p>Viele Scrum Master fügen sich in diese organisatorische „Kneifzange“, anstatt sie mit Kraft zu durchbrechen. Wie soll man auch, wenn z.B. der eigene Job daran hängt oder die letzte (dicke) Auszahlung des Dienstleistungsvertrages mit dem Kunden noch aussteht?</p>
<h3>Der Alleskönner</h3>
<p>Viele eingefleischte Scrum-Experten und erfahrene Trainer stellen deshalb die Rolle des Scrum Masters auf ein hohes Podest. Der Scrum Master sei „<a href="http://borisgloger.com/2010/03/22/scrum-wurden-agiles-schwachen-geerbt-eine-antwort/">eine Führungsrolle im Prozess</a>“, es dauere tausende von Stunden, die Charakteristika und schwierigen Aufgaben eines Scrum Masters zu meistern. Ein Change Agent und Facilitator hat es eben nicht leicht. </p>
<p>Der Scrum Master als Rolle wird oft als Alleskönner dargestellt. Schließlich muss er die Grundlagen des Managements beherrschen, ein absoluter Teamplayer sein und obendrein auch noch ein feiner Kerl den jeder mag. Der Scrum Master ist der neue <a href="http://de.wikipedia.org/wiki/MacGyver">MacGyver</a> in der agilen Software-Entwicklungslandschaft und kann selbst aus den schwierigsten und aussichtslosesten Situationen mit Einfallsreichtum, Know-How und Cleverness den Erfolg hin zur effektiven &#038; profitablen Software-Entwicklung gestalten.</p>
<p>Eine schöne Vorstellung. Doch die Realität ist eine andere. In der Realität gibt es nur einen MacGyver, und den sogar nur im Fernsehen. Schade für die vielen Softwarefabriken und Weborganisationen, schade für die vielen Scrum Trainer und Berater, schade für die Tausenden von „Certified Scrum Master“. Doch Karten auf den Tisch: Es wäre auch zu schön gewesen, oder?<br />
Mittlerweile ziehen sogar Alpha-Agilisten und Scrum-Kenner das „Scrum Is Always Better, Scrum Master Is Always Hero“-Gefühl durch den Kakao. Mit wunderbar leichtem und gleichzeitig nachdenklich stimmendem Humor schreitet seit einiger Zeit „<a href="http://blog.shino.de/2010/02/20/scrum-norris/">Scrum Norris</a>“ durch die geistigen Pfade der Agilität.</p>
<h3>Quo Vadis Scrum Master?</h3>
<p>Doch weder Humor noch Lamentiererei helfen einem dabei, diesen Schwachpunkt des „Scrum Master-Daseins“, nämlich die viel zu starke Fokussierung der Rolle und deren Implementierung, zu verbessern. Was tun? Wie kann man in einem Scrum-Team oder in einer Organisation mit Scrum-Teams diesen viel zu starken Fokus auf den Scrum Master mindern? Ich möchte hier einen konkreten Verbesserungsvorschlag und eine konzeptionelle Perspektivänderung als Diskussionsgrundlage vorstellen.</p>
<p>Dazu möchte ich ein Szenario aus der Entwicklung selbst voranstellen, um den Effekt der Maßnahme deutlicher hervorzuheben. Es wäre meines Erachtens sehr hilfreich für Team und Scrum Master, wenn die Abhängigkeiten zum Scrum Master zu allen anderen Rollen sowie zu der umgebenden Organisation so gering wie möglich sind. Um Abhängkeiten voneinander zu entkoppeln, gibt es in der Software-Entwicklung einige bewährte Methoden. Eine davon ist die sog. <a href="http://de.wikipedia.org/wiki/Inversion_of_Control">„Dependency Inversion“ oder „Inversion of Control“</a>. Das hört sich doch genau nach dem an, was gebraucht wird, nämlich eine „Inversion of Control“ im wörtlichen Sinne. Nicht der Scrum Master organisiert das Team, das Team organisiert das Team.</p>
<h3>Scrum Master in Bewegung</h3>
<p>Übertragen auf den Prozess und die Rahmenbedingungen, die die Scrum-Methode vorgibt, ließe sich eine solche Indirektion mit einem einfachen Mittel erreichen: Die Rolle des Scrum-Masters wird im Team rotierend „durchgereicht“. Statt eines Scrum Masters, der sich dediziert um ein (oder noch schlimmer mehrere) Teams kümmert, kümmert sich das Team um die Erfüllung der Rolle des Scrum Masters. In der Praxis kann man den „Scrum Master-Hut“ z.B. sprintweise, monatsweise, oder quartalsweise von Team-Mitglied zu Team-Mitglied weiterreichen.</p>
<p>So ist jeder einmal mit der „Verantwortung“ des Scrum Masters konfrontiert und lernt obendrein eine weitere, wichtige Perspektive des Prozesses kennen. Dadurch erschließt sich sukzessive dem ganzen Team eine tiefere Kenntnis der Vorgehensweise. Es ergibt sich eine induktive Selbstorganisation: Man lernt die Probleme und Aufgaben der Scrum Master Rolle kennen und hilft sich gegenseitig im Team, dass es nicht zu Problemen kommt oder diese schnell ausgeräumt werden.</p>
<p>Aus Sicht des Prozesses mündet das Rotationsprinzip in mehrere Vorteile. Zunächst wird einmal wird nicht nur die Selbstorganisation gefördert, sondern auch das Know-How effektiv verteilt. Der <a href="http://en.wikipedia.org/wiki/Bus_factor">Bus-Faktor</a> wird im Kontext des Prozesses und der Methodensicherheit massiv erhöht.</p>
<h3>Refokussierung der Kommunikation</h3>
<p>Für den Product Owner ist der wechselnde Scrum Master ein regelrechter Segen: Statt sich die ganze Zeit auf den Scrum Master zu konzentrieren, kann (und muss) er sich nun mit dem ganzen Team auseinandersetzen – so wie es am effektivsten ist und sich auch „gehört“. Darüber hinaus lernt der Product Owner, seine geschäftlichen Anforderungen und Interessen mit der „Masse Team“ zu koordinieren, statt mit dem „Ansprechpartner“ Scrum Master, wenn es mal wieder Abstimmungsprobleme oder Missverständnisse gibt.</p>
<p>Nicht nur der Prozess, sondern auch die umgebende Organisation – also das Unternehmen – profitiert von dieser Maßnahme. Statt wieder neue Stellen oder Stufen in die Organisation zu implementieren, wird durch die Rotation der Scrum Master von „allen“ getragen. Ergebnis: Keine neue „Position“ Scrum Master, keine Kompetenz- und Verantwortlichkeitskonflikte mit Teamleads (Gruppenleiter) oder Head-Of’s (Abteilungsleiter), keine Skalierungsprobleme. Die Führungsmöglichkeiten sind klar und bei einem <a href="http://de.wikipedia.org/wiki/Menschenf%C3%BChrung">partizipativen Führungsstil</a> höchst effektiv.</p>
<p>Die Rückkopplung zum mittleren Management und der strategischen Führung wird greifbarer, denn jetzt kann sich das Management nicht mehr den „Scrum Master“ als Mittelsmann für Mitarbeiterführung herauspicken. Der Fokus für wird stattdessen zum Product Owner gelenkt. Der wiederum wird – wie auch das Management selbst – realisieren und anerkennen müssen, dass sich eine Selbstorganisation nicht kommandieren lässt, sondern sich nach Bedürfnissen orientiert.</p>
<h3>Scrum Master: Kein Platz für Projektleiter</h3>
<p>Das Unternehmen wird schlanker, weil der „klassische“ Projektmanager nun nicht mehr in die für ihn äußerst angenehme „Scrum Master“-Schiene flüchten kann, sondern sie entscheiden muss: Entweder Product Owner oder Team! </p>
<p>Ich selbst dachte vor ein paar Jahren noch, dass der <a href="http://www.gmbsg.com/die-zukunft-des-projektmanagers-in-der-software-entwicklung/">klassische Projektmanager nur die Wahl zwischen Scrum Master und Product Owner hat</a>. Falsch! Heute darf ich die Lehre ziehen, dass ich damals auf den Scrum Master als Rolle viel zu Stark fokussiert gewesen bin. Team und Product Owner sind die &#8220;Key Player&#8221;, der Scrum Master ist nur Mittel zum Zweck, und das &#8211; wenn möglich &#8211; nur soviel wie unbedingt notwendig.</p>
<p>Mein Fazit: Mit einem rotierenden Scrum Master schafft man viele inherente Hürden aus dem Weg. Das Team, der Product Owner und die umgebende Organisation fokussieren sich deutlicher auf die Aufgabe. Der Prozess Scrum wird dadurch im Software-Entwicklungs-Theater wieder mehr zum Bühnenbild, das Team zu den Schauspielern und der Product Owner zum Regisseur. Damit ist dann auch eine gute agile Vorstellung wesentlich einfacher und schmerzfreier umsetzbar. Vorhang auf!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/scrum-der-bessere-scrum-master/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Über das Ziel von Coding Dojos II</title>
		<link>http://www.gmbsg.com/uber-das-ziel-von-coding-dojos-ii/</link>
		<comments>http://www.gmbsg.com/uber-das-ziel-von-coding-dojos-ii/#comments</comments>
		<pubDate>Mon, 31 May 2010 07:55:47 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[München]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MTC]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Unterschleißheim]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1040</guid>
		<description><![CDATA[Es ist Mittwoch, 18:30 Uhr. Die „Bude“ im Microsoft Technology Center in Unterschleißheim ist gerammelt voll. Der Meetingraum ist für 20 Personen ausgelegt, knapp 30 versuchen mehr oder minder erfolgreich, sich im Raum ein Plätzchen zu ergattern. Freudige Gesichter, alle ...]]></description>
			<content:encoded><![CDATA[<p>Es ist Mittwoch, 18:30 Uhr. Die „Bude“ im Microsoft Technology Center in Unterschleißheim ist gerammelt voll. Der Meetingraum ist für 20 Personen ausgelegt, knapp 30 versuchen mehr oder minder erfolgreich, sich im Raum ein Plätzchen zu ergattern. Freudige Gesichter, alle lächeln und sind locker – anscheindend. Doch irgendwie ist eine Spannung anzumerken. Es ist nicht so wie immer in München. Das MTC strahlt viel Professionalität aus. Man fühlt sich wie in Mitten einem wichtigen, kreativen und äußerst exklusiven Schaffenskreis.</p>
<p>Vorne sitzt <a href="http://ralfw.blogspot.com">Ralf Westphal</a>, der Architekt, der Wissenvermittler, der Konferenzorganisator – kurzum eine .NET Lichtgestalt. Er klickt und tippt noch schnell Dinge in sein Laptop. Die Teilnehmer warten. Komisch, üblicherweise macht man Witze und redet über einige interessante Blogposts, bevor es losgeht. Ich hätte z.B. erwartet, dass einer in die Runde „<a href="http://www.gmbsg.com/kein-yin-ohne-yang-kein-null-ohne-pointer/">Null oder nicht null, Hauptsache Ergebnis!</a>“ wirft und so ein wenig die Runde auflockert. Doch Nein. Es liegt Konferenzduft in der Luft. Alle starren und warten.</p>
<p>18:45 Uhr &#8211; Es geht los: Nach ein paar einleitenden Worten und dem lieben Dank an <a href="http://www.der-evangelist.de">Jan, dem Hüteträger und Evangelisten</a> für die super Organisation der Location geht es schon los. Ralf ist am Zug. Was danach genau im Münchener .NET Coding Dojo passiert ist, beschreibt Ralf akribisch und meiner Meinung nach ziemlich treffend in seiner <a href="http://ralfw.blogspot.com/2010/05/coding-dojo-muc-retrospektive.html">Retrospektive für das Coding Dojo</a>. Inhaltlich kann ich dem kaum etwas hinzufügen und möchte mich nochmals bei Ralf für diese gute Session bedanken.</p>
<p>Doch ganz so unkommentiert möchte ich es dabei natürlich nicht belassen. Steffen, der vor kurzem sehr erfolgreich das Hambuger .NET Coding Dojo initiiert hatte, hat in einem Tweet seine <a href="http://twitter.com/sforkmann/status/15062018368">Bedenken über den „Community-Gedanken“</a> geäußert. Seiner Meinung nach ist ein Coding Dojo keine <a href="http://twitter.com/sforkmann/status/15063976231">„One-Man-Show“ mit Musterlösung</a>. Ich habe ihm per Twitter schon <a href="http://twitter.com/ilkerde/status/15085255327">geantwortet</a>, möchte aber hier noch ein wenig detaillierter auf meine Auffassung eingehen.</p>
<h3>Das „Format“ Coding Dojo</h3>
<p>Ich hatte schon vor über einem halben Jahr einmal über das <a href="http://www.gmbsg.com/uber-das-ziel-von-coding-dojos/">Ziel von Coding Dojo’s</a> gebloggt. Damals, in einem Coding Dojo mit Pete, habe ich im Nachhinein mir einige Gedanken über das „Format“ Dojo gemacht. In besagtem Coding Dojo lief nämlich alles – also wirklich alles – gerade nicht so, wie es sich Pete und ich vorgestellt hatten. Wir hatten uns mit ein paar Kata’s vorbereitet und den Ablauf schon ein wenig vorgedacht. Aber es kam alles anders. Warum?</p>
<p>Die Antwort ist einfach: Weil wir es zugelassen haben. Wir haben eine Sache beherzigt: Ein Coding Dojo ist eine Veranstaltung für die Teilnehmer. Jeder sollte nach einem Dojo mit dem Gefühl nach Hause gehen können, dass er etwas gelernt hat. Im Coding Dojo mit dem KataBlog war den Teilnehmern die Komponentenorientierung und das IOC nicht so wichtig wie grundlegendere Themen, wie z.B. MVC als Pattern oder die HTTP-Request-Response-Pipeline von ASP.NET. Das haben wir beachtet und unseren Plan zurückgestellt.</p>
<h3>Aber warum ein Coding Dojo ohne Coding?</h3>
<p>Adaptiert auf das Coding Dojo von letzter Woche von Ralf lässt sich folgendes hinzufügen: Wir als Münchener .NET Coding Dojo Crew haben Ralf eingeladen, weil es die Teilnehmer &#8211; also wir, die Coding Dojo Community &#8211; so wollten. Wir haben Ralf nicht eingeladen, damit er eine Show abzieht. Wir haben Ralf auch nicht eingeladen, weil er der Ralf ist. </p>
<p>In einigen vorangegangenen Coding Dojo’s kam als Feedback der Teilnehmer immer wieder „zuwenig Architektur“, „zuwenig Design“, „zuwenig Vorgabe“. Als ich mit Ralf auf der VSOne darüber geredet habe, schlug er ein „Architektur-Dojo“ vor. „Super!“ dachte ich mir und freute mich, den Dojo-Teilnehmern mit einer Einladung ihren „Wunsch“ erfüllen zu können.</p>
<p>Wer beim .NET Coding Dojo vergangenen Mittwoch dabei war, der wird mir beipflichten, dass diesmal wirklich über Architektur, Design, Anwendungsaufbau und Komponenten-Orientierung ausgiebig diskutiert wurde. Ralf hat sein Versprechen gehalten. Er kam, dachte, designte und diskutierte. Genau so, wie es oftmals in Feedbackrunden vorheriger Dojo’s angefordert wurde.</p>
<h3>Coding Dojo ist kein Workshop</h3>
<p>Trotzdem. Es war anders als die vorherigen Coding Dojo’s. Ganz anders. Keine Diskussionen über die Kata-Wahl, keine Diskussion über Anforderungsanalyse, keine Design-Strittigkeiten. Statt dessen Ralf. Ralf wie er leibt und lebt. Das ist die Aufgabe, das ist die Vorgehensweise, das ist EBC, das ist State-Of-The-Art, das ist Regelwerk &#038; Konvention. Punkt. Natürlich mit fester und stichhaltiger Argumentation und der Erläuterung der Beweggründe.</p>
<p>Aber irgendwie war es kein Coding Dojo so wie ich es kannte. Es gab hier und da mal Rückfragen an Ralf, „wieso“ und „weshalb“. Aber aktiv mitgemacht – aktiv Architektur gemacht – das hat meiner Meinung nach mehrheitlich Ralf getan. Ralf hat schon ab und an probiert per Rückfrage die Teilnehmer einzubinden. Doch andererseits gab es für die Teilnehmer nicht wirklich viele Optionen. Besser gesagt: Es war ein geplante Session, mit strukturierter Vorgehensweise und festem Rahmen. Da bleibt nicht viel Luft und Platz für anderes.</p>
<p>Man kann mir „als Veranstalter“ jetzt natürlich alles mögliche vorwerfen. Z.B. dass ich ja hätte eingreifen können, wenn es mir zu „passiv“ und zu „vorgetragen“ erscheint. Oder man könnte mir den Vorwurf machen, dass ich in den vorangegangen Coding Dojo’s einfach nur chaotisch in die Tasten gehauen habe, anstatt strukturiert vorzugehen und damit praktisch immer wieder so ein „wir brauchen Architektur“-Feedback provoziert habe. Ok, dann soll man mir die Vorwürfe machen. Meine Antwort dazu ist: Ich habe es zugelassen, weil es wichtig ist, Dinge zuzulassen. Darüber sollte man nachdenken.</p>
<h3>Coding Dojo und Community</h3>
<p>Jetzt transportiere ich mal meine persönliche Auffassung etwas deutlicher, damit es nicht wieder heisst, ich wäre zu objektiv oder würde mich hinter geschnörkeltem Satzbau verstecken. Ich persönlich denke, dass das letzte Coding Dojo absolut kein Coding Dojo war. Es war ein Architektur-Workshop mit Ralf Westphal. Und wenn ich das so sagen darf: Es war ein guter Architektur-Workshop. Aber es war für mich mit Sicherheit kein Coding Dojo. Es gab keine aktive Einbindung der Teilnehmer, es gab keine lockere Atmosphäre, es gab kein Coding und keine großen Diskussionen. Ich finde, das war kein Coding Dojo, wie ich es mir wünsche und wie ich es auch gut finde.</p>
<p>Aber meine Meinung ist nicht wichtig – das habe ich nach nun mehr als 50 Coding Dojo’s gelernt. Es ist nicht wichtig, wie ich Probleme löse. Es ist auch nicht wichtig, welches Framework ich verwende. Und es ist schon garnicht wichtig, wie ich Analyse, Architektur, Design oder Entwicklung betreibe. Denn das einzige was zählt im Coding Dojo sind die Akteure. Die Akteure im Coding Dojo sind die Teilnehmer. Das ist entscheidend.</p>
<h3>Dojo = Lernen?</h3>
<p>Wenn also die Teilnehmer des „Coding-Dojo’s“ mit Ralf in der Feedback-Runde sagen „Ja, das hat mir gut gefallen, ich habe super mitgemacht &#038; viel gelernt“ – dann, ja dann ist es wohl ein Dojo gewesen. Vielleicht kein „Coding“ Dojo, aber es war ein echtes Dojo. Aber wenn die meisten kommentarlos und höflich klatschend das Dojo beenden, dann, ja dann war es wohl kein Dojo. Wie gesagt: Für mich war das kein Dojo – schon garnicht ein Coding Dojo. Aber das Feedback am Ende von Ralf’s Session war durchaus positiv. Also scheint es für einige Teilnehmer ein Dojo gewesen zu sein.</p>
<p>Natürlich möchte ich an dieser Stelle noch ein paar weitere Dinge loswerden. Ich möchte nicht, dass man die Definition des „Coding Dojo“‘s auf „Hat es dir gefallen?“, &#8220;Konntest Du mitmachen?&#8221; oder „Hast du etwas gelernt?“ reduziert. Ein echtes Coding Dojo hat einige weitere Parameter, die entscheidend sind für den speziellen, magischen Charakter und den guten Erfahrungsaustausch. Der aufmerksame Leser wird z.B. erkannt haben, dass ich nicht ein einziges Mal TDD erwähnt habe. Wenn Interesse daran besteht, die Bestandteile und das Format „Coding Dojo“ aus meiner Perspektive genauer kennenzulernen, dann bitte sagt mir das (schreibt einen Kommentar oder eine Email), und ich werde es niederschreiben.</p>
<h3>Fazit &#038; Ausblick</h3>
<p>Abschließend möchte ich zu „Ralf’s Coding Dojo“ noch folgendes loswerden. Es war der Wunsch der Community und ich (und Ralf) haben versucht, diesem Wunsch gerecht zu werden. Es war eine gute Erfahrung. Ich habe viel daraus gelernt und ich denke, dass auch die Teilnehmer etwas mitnehmen konnten. Es war ein guter Architektur-Workshop und Ralf hat viel investiert, um den Teilnehmern seine Sicht zu zeigen und Wissen zu transportieren. Danke, Ralf.</p>
<p>Doch eines steht heute schon fest: das nächste .NET Coding Dojo, welches im Übrigen wieder ein ganz besonderes Dojo ist, wird mit absoluter Sicherheit ganz anders ablaufen. Nicht nur, weil diesmal nicht der Ralf eine Aufgabe stellen wird. Nein. Es wird ganz anders, weil die Partizipation und das aktive teilnehmen exemplarisch exerziert werden. Das nächste <a href="https://www.xing.com/events/net-coding-dojo-empowered-508914">Münchener .NET Coding Dojo findet am 22. Juni</a> im Rahmen des <a href="http://www.dotnetpro-powerday.de/">dotnetpro.powerday’s</a> statt und hat den treffenden Titel „.NET Coding Dojo Empowered!“. Sei dabei und erlebe, wie man gemeinsam Lernen &#038; Lehren kann, wie man gemeinsam eine Problemstellung mit Logik &#038; Spaß lösen kann, wie man professionelle Software-Entwicklungs-Methoden im Team einsetzt! Es wird wieder einmal einzigartig und sehr lehrreich werden. <a href="https://www.xing.com/events/net-coding-dojo-empowered-508914">Zur Anmeldung</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/uber-das-ziel-von-coding-dojos-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kein Yin ohne Yang, kein Null ohne Pointer</title>
		<link>http://www.gmbsg.com/kein-yin-ohne-yang-kein-null-ohne-pointer/</link>
		<comments>http://www.gmbsg.com/kein-yin-ohne-yang-kein-null-ohne-pointer/#comments</comments>
		<pubDate>Sun, 02 May 2010 21:58:57 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[NULL]]></category>
		<category><![CDATA[Null Reference]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1002</guid>
		<description><![CDATA[Es ist eine schwierige Zeit heutzutage. Besonders für Software-Entwickler. Denn heutzutage gibt es für einen Software-Entwickler viele Dinge, die er lernen, können und beachten muss. Da gibt es die Tools, die Programmiersprachen, die Methoden, die Anforderungen, die Domäne, die Kollegen ...]]></description>
			<content:encoded><![CDATA[<p>Es ist eine schwierige Zeit heutzutage. Besonders für Software-Entwickler. Denn heutzutage gibt es für einen Software-Entwickler viele Dinge, die er lernen, können und beachten muss. Da gibt es die Tools, die Programmiersprachen, die Methoden, die Anforderungen, die Domäne, die Kollegen und noch vieles mehr. Da gibt es schon einmal Momente, in denen man sich unsicher ist. „Mache ich das richtig?“, „gibt es bessere Lösungen?“ oder „hoffentlich passt das&#8230;“. Zumindest geht es mir manchmal so, z.B. bei neuen Dingen oder besonders komplexen Problemstellungen. Ich bin dann froh, wenn ich um mich herum jemanden habe oder finde, der mich und mein Problem versteht und mir helfen kann. Helfen mit seiner Einschätzung, seiner Meinung und seinen Erfahrungen.</p>
<h3>Helfen ist schön, geholfen werden ist schöner!</h3>
<p>Ich weiß es nicht genau, aber ich vermute es ein wenig, dass <a href="http://blog.thomasbandt.de/39/de/blog.html">Thomas</a> auch froh ist, wenn er durch Meinungsaustausch seine eigenen Herausforderungen besser einzuschätzen vermag. Ich persönlich empfinde diese „Kalibrierung“ als wichtigen Baustein zur Festigung der eigenen Meinung.</p>
<p>Thomas hat mit <a href="http://blog.thomasbandt.de/39/2333/de/blog/null-verstaendnis.html">Null Verständnis</a> gefragt, wie die Handhabung von NULL als Rückgabe von Methoden bei anderen Entwicklern umgesetzt und eingeschätzt wird. Viele haben kommentiert, einige haben auch Blog-Post-Antworten geschrieben. Ich habe das mit Kommentaren und dem <a href="http://www.gmbsg.com/null-toleranz/">Null Toleranz-Beitrag</a> auch getan, der <a href="http://ralfw.blogspot.com/2010/05/null-oder-nicht-null-das-ist-hier-die.html">unermüdliche Ralf hat auch kräftig in die Tasten gehauen</a>. Überraschenderweise mit mehreren Aussagen.</p>
<p>Ralf geht in seinem „<a href="http://ralfw.blogspot.com/2010/05/es-hilft-nichts-dass-es-darauf-ankommt.html">Plädoyer für Regeln</a>“ auch auf einige Punkte ein, die ich über die Handhabung von NULL in Anwendungsszenarien bemerkt hatte. Ralf hat so vieles geschrieben, dass es mir schwer fällt, wirklich alle Themen in einem oder mehreren Blog-Posts zu erwidern. Einen Überblick über meine Perspektive möchte ich dennoch geben. </p>
<h3>Mind the Null!</h3>
<p>Ralf stellt im Namen der Community die erste Null-Regel auf: </p>
<blockquote><p>&#8220;Man darf Null benutzen und auch als Wert zurückgeben – aber Vorsicht! Erst prüfen, ob es nicht auch anders geht&#8221;</p></blockquote>
<p>D’accord! Das hatte ich ja auch schon in Kommentaren und <a href="http://twitter.com/ilkerde/status/13197888337">per Twitter</a> erwähnt. Doch wann kann man Null verwenden, wann nicht? Gibt es dafür eine „kontextarme“ Regel? Kann man pauschal sagen: „<a href="http://twitter.com/DerAlbert/status/13246967481">Verwende es nicht!</a>“. Meiner Meinung nach ist das nicht so einfach. Klar kann ich auch sagen, dass man Null einfach nicht anwenden soll, aber ich mache es mir nicht so einfach.</p>
<p>Wenn ich nämlich obige Regel einem Embedded-Entwickler entgegenbringe, dann lacht der mich mal gepflegt vor seinen Kollegen aus. In der Embedded-Entwicklung, wie auch bei sehr ressourcenintensiven Geschäftsanwendungen ist es nämlich durchaus erstrebenswert, oft NULL zurückzugeben, um damit z.B. eine leere Liste oder leere Suche zu signalisieren. Es mögen sich wenige daran erinnern, aber NIL (als Synonym für NULL) ist die Abkürzung für „<a href="http://www.mirrorservice.org/sites/www.gnu-pascal.de/gpc/nil.html">Not-In-List</a>“.</p>
<h3>Null für Hacker</h3>
<p>Ich selbst durfte schon mehrere serverseitige Komponenten von „Exception-Flut“ befreien, in dem ich sie in einigen Stellen durch NULL ersetzt habe. Danach lief der Service doppelt so schnell bei 25% weniger Ressourcenverbrauch. Bin ich jetzt ein Aussetziger, weil ich die Regel nicht befolgt habe?</p>
<p>Ich denke nein. Denn: In einigen Anwendungsszenarien ist es gang und gäbe NULL als Mittel einzusetzen. Mehr noch, es ist „normal“, soz. &#8220;die Regel&#8221;. Deswegen sage ich nach wie vor: Die Regel ist richtig, man sollte vorsichtig mit NULL umgehen und es mit bedacht einsetzen. Doch eine „Faustregel“ ist es für mich noch nicht, denn man kann es (noch) in bestimmten Anwendungsfällen vorteilhaft und stringent einsetzen.</p>
<h3>CatastrophicFailureException ??  Null</h3>
<p>Ralf schreibt: </p>
<blockquote><p>„Null-Regel #2 (von Ilker; noch zu diskutieren): In Katastophenfällen darf Null zurükgegeben werden.“</p></blockquote>
<p>Das ist keine Regel. Den Regelbedarf und die Kreativität zum Design eines Regelwerks wie Ralf habe ich (noch) nicht. Ich habe dafür aber Programme, die Probleme lösen. Bei einigen, wenigen Programmen habe ich NULL als Rückgabe für „katastrophale Fehler“ zurückgegeben. </p>
<p>Das hat mir bei der <a href="http://de.wikipedia.org/wiki/Defensives_Programmieren">defensiven Programmierung</a> geholfen, denn es ging um eine etwas kritischere Komponente, die an Schnittstellen sog. „Guards“ hatte, die alle möglichen Exceptions abgefangen haben. Im Nachhinein betrachtet hätte ich es wohl auch mit einer „CatastrophicFailureException“ oder mehreren, spezifischeren Exceptions lösen können. C&#8217;est ca!</p>
<h3>Null nur bei „gleicher Kategorie“</h3>
<p>Die dritte Regel von Ralf:<br />
<blockquote>&#8220;Null darf nur Rückgabewert sein, wenn Null zur selben Kategorie gehört wie ein Nicht-Null Rückgabewert&#8221;.</p></blockquote>
<p>Naja, streng genommen ist NULL ja nichts, und damit kann man es auch nicht kategorisieren. Antizipieren kann ich da nur, dass es um das <a href="http://blog.thomasbandt.de/39/2331/de/blog/kleiner-helper-fuer-linq-to-sql-tolistordefault-update.html">Beispiel von Thomas mit der Liste</a> gehen kann. Dem kann ich nur zustimmen. Hier ist ein Ausnahmefall zwar auch möglich, aber doch eher selten.</p>
<h3>Dein Pflock ist mein Maibaum!</h3>
<p>Ralf hatte mir zu viel &#8220;Rumgeeiere&#8221; in meinen Aussagen über NULL attestiert. Das will ich doch gerne versuchen besser zu machen und Ralf‘s „Pflock in Boden“ in meine triviale niederbayrische Welt übertragen und damit mal den „Maibaum ins Dorf“ stellen. Also, auf geht’s, Maderl &#038; Buam – mein Maibaum im Dorf „Nullinger“!</p>
<p>Ilker&#8217;s Statement zu Null als Rückgabe von Methoden:</p>
<blockquote><p>
NULL ist gefährlich, meide NULL, außer es gibt triftige Gründe. Triftige Gründe können Performance, Speicher oder dynamische Datenstrukturen sein. Solltest Du NULL als „Indikator“ für etwas verwenden (z.B. „Nicht gefundener Benutzer“), ziehe eine Vermeidungsstrategie mit Exceptions oder ReturnCodes in Erwägung. Sei auf der Hut, NULL ist überall. Prüfe, ob deine Parameter oder deine Methoden NULL zurückgeben. Prüfe besonders, wenn Du parallelisierst oder wichtige Schnittstellen bedienst. Solltest Du ein NULL finden, versuche zunächst damit umzugehen. Geht das nicht mehr, signalisiere die Ausnahme. Achte darauf, dass ein NULL die Methode nicht verlässt.
</p></blockquote>
<p>So, ich hoffe das war <a href="http://de.wikipedia.org/wiki/Kanak_Sprak_%E2%80%93_24_Mi%C3%9Ft%C3%B6ne_vom_Rande_der_Gesellschaft">konkret krass korrekt</a> genug!</p>
<h3>Immer diese Abhängigkeiten</h3>
<p>Nachdem nun der Maibaum in Django Asül-Manier aufgestellt ist, möchte ich neben dem Ausgangsthema mich noch ein wenig den neuen Themen widmen, die Ralf in seinem <a href="http://ralfw.blogspot.com/2010/05/es-hilft-nichts-dass-es-darauf-ankommt.html">Rules of Null-Post</a> erwähnt hat. Ralf regt sich dabei ganz besonders über die „It depends“-Phrase auf. Ja, „It depends“, die allmächtige und einzige Antwort auf alles, was so im Leben an Fragen auf einen zukommen kann. Die Antwort „It depends“ ist kurz, erfüllt die Aufgabe und ist hochgradig flexibel bei gleichzeitig maximaler Wiederverwendbarkeit. Geradezu traumhafte Eigenschaften aus der „Nerd-Software-Entwickler“-Perspektive, oder nicht? Vielleicht ist es deshalb auch so beliebt in unserer Banche?</p>
<p>Spaß beiseite. „It depends“ ist eine Phrase, die mehr oder minder Inhalt liefern kann. Ich stimme Ralf zu, wenn er sagt, dass dieses „Es kommt drauf an“-Getue mit der Zeit nicht mehr auszuhalten ist. Deswegen kann ich die Reaktion von Ralf auch gut verstehen. Ich selbst finde es teilweise immer wieder erschreckend, wie oft auf diese Floskel zurückgegriffen wird, ohne darüber nachzudenken. Dennoch verwende ich es &#8211; ab und an zumindest, wenn ich es für erwähnenswert erachte.</p>
<h3>Niemals ist niemals niemals</h3>
<p>Fakt ist auch, dass „It depends“ nicht nur eine Bierdeckelweisheit ist, sondern auch als Abkürzung verwendet wird. Im Stile „ich erspare mir und Dir jetzt nähere Details“. Das kann gut und schlecht interpretiert werden. So oder so, es kommt darauf an :-) Genauer gesagt, auf den, der es interpretiert.</p>
<p>Womit wir bei der <a href="http://de.wikipedia.org/wiki/Quadratur_des_Kreises">Quadratur des Kreises</a> angelangt wären: Es ist nunmal so, dass wir Systeme vereinfachen und Abstraktionen schaffen, um es zu verstehen. Dabei geht auch Genauigkeit und Wahrheit verloren. Manchmal sogar so sehr, dass die aus der Vereinfachung abgeleitete Erkenntnis nicht mehr adequat bzw. erwartungsgerecht ist. Insofern ist „It depends“ nicht nur eine Fassade oder Ausrede, sondern eine zuweilen notwendige Mahnung, den Kontext und die Erkenntnis zu hinterfragen, sich bewußt mit der Lösung und Problemstellung auseinanderzusetzen. Für die Agilisten unter uns: „It depends“ ist ein auch ein Aufruf zum „Inspect &#038; Adapt“.</p>
<p>Ich kann mich guten Gewissens Ralf anschließen, wenn es darum geht, Leitfäden und Empfehlungen über die Anwendung von NULL mit der Community zu erarbeiten. Meinungsaustausch ist Katalysator für Lernen, Entdecken, Erfahren und Bestätigen. Doch ein Regelwerk will ich nicht erstellen. Ich gebe meine Meinung und meinen Standpunkt gerne wieder. So wie ich es erfahren habe und so, wie ich es für gut empfinde.</p>
<p>Regeln habe ich auch. Ich habe meine eigenen Regeln, ich habe Teamregeln und ich habe noch eine Reihe weiterer Regeln, die ich für mich beachte und schätze. Regeln sind für mich wichtig. Ich möchte damit sagen, dass ich durchaus Ralfs Motivation nachvollziehen kann. Doch ich habe meine Beiträge nicht mit dieser Motivation mit der Community geteilt. Mein Ziel ist die Kommunikation und der Erfahrungsaustausch. Das wird auch so bleiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/kein-yin-ohne-yang-kein-null-ohne-pointer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Null Toleranz</title>
		<link>http://www.gmbsg.com/null-toleranz/</link>
		<comments>http://www.gmbsg.com/null-toleranz/#comments</comments>
		<pubDate>Sun, 02 May 2010 00:09:32 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[NULL]]></category>
		<category><![CDATA[Null Reference]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Tony Hoare]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=986</guid>
		<description><![CDATA[Eine angeregte Diskussion ist gestern &#8220;ent-Bandt&#8221; :-) mit den Blog-Posts über den kleinen ToListOrDefault()-Helper und die dadurch entstandende Null-Verständnis-Thematik sowie der philosophischen Ausführung über das Null oder nicht Null in Anwendungen. Man kann in den Posts wunderbar nachlesen, worum es ...]]></description>
			<content:encoded><![CDATA[<p>Eine angeregte Diskussion ist gestern &#8220;ent-Bandt&#8221; :-) mit den Blog-Posts über den kleinen <a href="http://blog.thomasbandt.de/39/2331/de/blog/kleiner-helper-fuer-linq-to-sql-tolistordefault-update.html">ToListOrDefault()-Helper</a> und die dadurch entstandende <a href="http://blog.thomasbandt.de/39/2333/de/blog/null-verstaendnis.html">Null-Verständnis-Thematik</a> sowie <a href="http://ralfw.blogspot.com/2010/05/null-oder-nicht-null-das-ist-hier-die.html">der philosophischen Ausführung über das Null oder nicht Null</a> in Anwendungen. Man kann in den Posts wunderbar nachlesen, worum es geht &#8211; deswegen hier nur eine kleine Rekapitulation.</p>
<p>Thomas stellt zur Debatte, ob man aus Repository-Methoden ab und zu auch mal null zurückgeben darf/kann/soll. So z.B. bei so einer Methode:</p>
<pre name="code" class="brush: csharp">
User GetUserByName(string name);
</pre>
<h3>Mache das Unmögliche möglich?!?</h3>
<p>Einige Leute finden das garnicht besonders gut. Sie bevorzugen lieber soetwas wie einen &#8220;nicht-existenten&#8221; User zurückzugeben. Also eine Instanz einer Klasse, die eigentlich garnicht möglich wäre (weil sie ja die nicht exsistierende Instanz darstellt). Programmtechnisch ist das sicherlich recht einfach lösbar &#8211; oftmals mit einer statischen Property, die sich wiederum eines privaten Konstruktors bedient. In dem obigen Beispiel könnte eine derartige Implementierung ungefähr so aussehen:</p>
<pre name="code" class="brush: csharp">
public User GetUserByName(string name)
{
  if (!repository.UserExists(name))
    return User.NotExistent;

  //user laden und zurückgeben
}
</pre>
<p>Eine zweite, nicht minder bevorzugte Alternative zur Rückgabe von NULL ist die beliebte Exception. Falls also kein Benutzer unter dem angefragten Namen existieren sollte, dann soll eine Ausnahme signalisiert werden. Ganz einfach implementiert:</p>
<pre name="code" class="brush: csharp">
public User GetUserByName(string name)
{
  if (!repository.UserExists(name))
    throw new UserNotFoundException(name);

  // user laden und zurückgeben
}
</pre>
<p>Beides sind sicherlich mögliche und sogar gute Alternativen zu der Implementierungsvariante, die Thomas zur Diskussion gestellt hat:</p>
<pre name="code" class="brush: csharp">
public User GetUserByName(string name)
{
  if (!repository.UserExists(name))
    return null;

  // user laden und zurückgeben
}
</pre>
<p>Um es kurz zu fassen: Alle drei Varianten sind möglich, alle drei Varianten sind gut, alle drei Varianten sind schlecht. Es kommt auf den Anwendungsfall an. Die beliebte &#8220;It-Depends&#8221;-Weisheit streckt das Thema mit geballter Kraft nieder. Dennoch ist es eine Untersuchung wert, denn ungewöhnlicherweise wird die NULL-Variante kategorisch als falsch und &#8220;böse&#8221; bewertet.</p>
<h3>Nullbivalenz</h3>
<p>NULL ist ein besonderer Wert. Er ist der Wert, der eigentlich nicht zugewiesen werden kann. Genauer genommen ist er kein Wert, sondern nichts anderes als die knapp in vier Buchstaben formulierte Aussage &#8220;Ein für eine bestimmte Werteklasse belegter Ort wurde mit keinem Wert belegt&#8221;. Ergo: Null ist kein Wert. Ja, aber ist das denn nicht genau das, was <code>GetUserByName</code> ausdrücken und zurückgeben muss, wenn es keinen Benutzer für den gegebenen Namen findet?</p>
<p>Schaut man sich die erste Alternative zu NULL an (also das <code>User.NonExistent</code>-Konstrukt), dann kann man sagen: Joa, ok &#8211; ist aber das Gleiche. User.NonExistent ist sicherlich expliziter als NULL. NULL ist aber schon da und genau für solche Dinge gedacht. Die Aufgabe von NULL ist ja genau die, keinen Wert darzustellen.</p>
<p>Und wie sieht es mit Alternative Zwei &#8211; der <code>UserNotFoundException</code> aus? Die Excpetion ist auch explizit. Mehr noch, die Exception ist flexibel und rigoros gleichermaßen. Flexibel, weil sie jederzeit aus dem Nichts auftauchen kann. Rigoros, weil sie eine Fülle von Informationen über den Kontext sammeln und mitgeben kann. Die Exception sagt hier klar und deutlich: &#8220;Es gibt keinen Wert, weil der Benutzer {name} nicht gefunden wurde.&#8221;. Scheinbar ein Vorteil gegenüber den anderen Varianten. Im Ergebnis ist es jedoch nicht wesentlich von den anderen Herangehensweisen unterscheidbar.</p>
<h3>Null Sicherheit</h3>
<p>Nun, offensichtlich ist die sprechendere Variante der Exception vorteilhaft und damit dem NULL vorzuziehen. Doch beim zweiten Blick entpuppt sich der Vorteil als nicht so deutlich als zunächst vermutet. Denn in der Praxis kann sich die &#8220;unklare&#8221; und &#8220;unexplizite&#8221; Art von NULL wieder als erwünscht erweisen. </p>
<p>So muss man bei Exceptions, um den Mehrwert zu kennen, auch deren Typ genau kennen. Man muss also Wissen, das es sich um eine <code>UserNotFoundException</code> handelt. Erst dann kann man auch erfahren, welcher ominöse Benutzer unauffindbar ist. Das kann durchaus problematisch werden, wenn man also im höheren Callstack wissen muss, um welche Exception es geht, denn schliesslich schafft man sich dadurch eine Abhängigkeit auf den niedrigeren Code.</p>
<p>Null ist also eine unsichere, uninformative, aber immer verfügbare und unabhängige Variante, dem Aufrufer zu sagen: &#8220;Es gibt keinen Wert für das, was Du von mir verlangst&#8221;. Wenn man sich mit der Anwendung von NULL jahrelang auseinandergetzt hat und auch ein wenig die ungeliebten Interna von Speichermanagement &#038; Datenstrukturen hineinblickt, dann wird NULL schnell zu einer praktikablen Lösung für schwierige Situationen. </p>
<p>Doch vor Allem bei NULL stellt man immer wieder fest: praktikabel und elegant sind zwei verschiedene paar Schuhe. Denn NULL ist genauso nichtssagend wie vielseitig. NULL zwingt den Aufrufer zum Abwägen: Soll ich das Ergebnis gleich auswerten oder lieber überprüfen? Ein wunderbares Beispiel dafür ist sicherlich der &#8220;if (x != null)&#8221;-Check &#8211; die Null-Prüfung. Das wird vor Allem dann zum Problem, wenn man mit (gewollt oder ungewollt) unbekannten Komponenten arbeitet. Im Interface oder in der Typsignatur steht es jedenfalls sehr selten erkennbar drin, ob nun in Einzelfällen NULL zurückgeliefert wird oder nicht.</p>
<h3>Null ist nicht gleich Null</h3>
<p>Für mich gibt es beim Umgang und bei der Anwendung von Null keine Faustregel. Ich gebe in einigen Methoden NULL zurück. Meistens genau dann, wenn ich wirklich damit ausdrücken möchte, dass etwas katastrophales passiert ist. Ich finde es sehr schwerwiegend, NULL als Zuweisung oder Rückgabe stehen zu lassen &#8211; aber ich mache es manchmal ganz bewusst. In einer Anwendung, in der ich z.B. Benutzer über einen Authentifizierungsdienst identifizieren muss, bevor ich überhaupt etwas anderes machen kann, kann die folgende Signatur NULL zurückliefern:</p>
<pre name="code" class="brush: csharp">
interface IAuthenticationService
{
  Account SignIn(string user, string password);
}
</pre>
<p>Es kann alles mögliche passiert sein  &#8211; keine Verbindung zum Server, falscher Server, Verbindungsfehler, Connection Timouts, Benutzer nicht gefunden, Benutzer gesperrt, Passwort abgelaufen, falsches Passwort &#8211; all dies würde ich versuchen über Exceptions oder Return-Codes zu erledigen. Die meisten der Exceptions gibt es ja schon frei Haus vom Framework. Aber für das mich Unbekannte und Unerwartete gibt es immer noch eine Rückgabe, und die heisst NULL.</p>
<h3>Null-Summen-Spiel</h3>
<p>Generell kann ich für mich nur sagen, dass ich gelernt habe mit NULL sehr vorsichtig umzugehen. Ich vermeide es so gut wie möglich. Exceptions sind ein gutes Mittel &#8211; allerdings setze ich sie auch nicht sehr oft ein. Die Bürde der Abhängigkeit ist schon da &#8211; obwohl es natürlich in der Contract-Assembly definiert ist. Bei Repositories habe ich (fast) immer Ergebnisse die nicht NULL liefern. Andererseits setze ich NULL als Rückgabe auch öfter ein, wenn ich nur eine &#8220;schwere&#8221; Ausnahme in meinem Code feststelle.</p>
<p>Im obigen Beispiel hätte ich wohl NULL als Rückgabe toleriert, vor Allem, wenn ich davon ausgehen kann, dass es oft &#8211; oder sehr oft &#8211; dazu kommen kann und diese Tatsache ein schwerwiegendes Problem darstellt. Ein schönes Beispiel sind immer wieder die Brute-Force und DOS-Attacken auf Webportale. </p>
<p>Ich hätte wahrscheinlich nicht NULL zurückgegeben, sondern eine Exception ausgelöst, wenn ich das Ganze als wiederverwendbare, allgemeine Kompontente entwickeln würde. </p>
<p>So oder so &#8211; beides ist machbar und beides hat seine Berechtigung. Klar und deutlich soll aber abschließend erwähnt sein: NULL zu vermeiden ist eine gute Sache. Es macht den Code expliziter, offensichtlicher und lesbarer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/null-toleranz/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Meta-Test: NSpec &#8211; der spezifizierende BDD-Veteran</title>
		<link>http://www.gmbsg.com/meta-test-nspec-der-spezifizierende-bdd-veteran/</link>
		<comments>http://www.gmbsg.com/meta-test-nspec-der-spezifizierende-bdd-veteran/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 20:19:47 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Meta-Test]]></category>
		<category><![CDATA[NSpec]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=950</guid>
		<description><![CDATA[Einige meiner Freunde hatten schon Mutmaßungen geäußert, das xUnit wohl das nächste Framework sein wird, welches ich mit &#8220;FizzBuzz&#8221; bearbeite. Keine Sorge, xUnit ist auch auf meiner Liste, aber heute soll zunächst einmal ein etwas weniger bekanntes Framework beäugelt werden: ...]]></description>
			<content:encoded><![CDATA[<p>Einige meiner Freunde hatten schon Mutmaßungen geäußert, das <a href="http://xunit.codeplex.com/">xUnit</a> wohl das nächste Framework sein wird, welches ich mit &#8220;FizzBuzz&#8221; bearbeite. Keine Sorge, xUnit ist auch auf meiner Liste, aber heute soll zunächst einmal ein etwas weniger bekanntes Framework beäugelt werden: <a href="http://nspec.tigris.org/">NSpec</a>.</p>
<p><a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/06/27/146872.aspx">NSpec ist einer der ersten &#8211; wenn nicht sogar das erste explizite &#8211; BDD-Framework für .NET</a>. Mittlerweile wird es auch nicht mehr aktiv betreut. &#8220;Schade&#8221;, denkt man sich auf der einen Seite. Andererseits jedoch nicht sooo schlimm. Schließlich war der Autor mit dieser &#8220;finalen&#8221; Version offensichtlich zufrieden. Überdies ist die NSpec-Basis auch in andere Test-Frameworks eingeflossen &#8211; dazu aber später mehr. Bleibt auch noch anzumerken, dass man NSpec und MSpec nicht miteinander verwechseln sollte. Die Frameworks unterscheiden sich massiv, obwohl die Namensähnlichkeit das nicht vermuten lässt. Auch <a href="http://github.com/machine/machine.specifications">MSpec</a> wird in meiner kleinen Serie sicherlich in der Zukunft noch seinen Platz finden. Doch nun zurück zu NSpec (N wie Nordpol) :-).</p>
<p>Bei NSpec dreht sich, wie nicht anders zu erwarten war, alles um Spezifikationen. Ich werde hier nicht näher auf die <a href="http://www.gmbsg.com/bdd-thebetterwayofunittesting/">Gemeinsamkeiten oder Unterschiede zwischen TDD und BDD</a> eingehen, werde auch nicht groß ausholen, wie und wieso BDD entstanden ist. Es sei nur kurz angerissen, dass bei BDD nicht das &#8220;testen&#8221; im Vordergrund steht, sondern die Spezifizierung des Verhaltens &#8211; Behavior Driven Design eben. Abgesehen von der Terminologie ergeben sich weitere Unterschiede, die auch am Beispiel von NSpec feststellbar sind. Genug Vorgeplänkel, auf geht&#8217;s zum Test-Training mit dem <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">FizzBuzz-Kata</a>!</p>
<h3>Der Ton macht die Musik &#8211; das Wort macht die Geschichte</h3>
<p>Visual Studio öffnen, Projekt anlegen, Referenz hinzufügen, los geht&#8217;s! Äähhh&#8230; wohl doch nicht&#8230; wie schreibt man eigentlich Spezifikationen im Code? Also Finger wieder weg von der Tastatur und überlegen, um was es eigentlich geht. Ok, es geht um FizzBuzz. FizzBuzz ist ein Spiel mit <strong>Spielregeln</strong> &#8211; das ist es im Endeffekt, worum es hier geht. So eine Spielregel ist recht einfach, denn es gibt zu einer bestimmten Spielsituation &#8211; sagen wir mal zu einem bestimmten <strong>Kontext</strong> &#8211; immer eine Regel, die man anwenden muss, damit man weiter im Spiel bleibt. Anders ausgedrückt ist bei einer Spielsituation zu prüfen, ob die Regel richtig angewendet wird &#8211; ob also die <strong>Erwartungen</strong> an das Spielverhalten erfüllt werden.</p>
<p>Aha &#8211; so ist das also. Hört sich vielleicht etwas abgedreht an, aber dieses kurze <a href="http://de.wikipedia.org/wiki/Repetitorium">Repetitorium</a> hilft beim Schreiben der ersten Spezifikation ungemein. Denn NSpec kennt zwei Attribute, namentlich <code>[Context]</code> und <code>[Specification]</code>. Mit der kleinen o.g. FizzBuzz-Geschichte macht das auch Sinn, wie man dann auch im Code sehen kann:</p>
<pre name="code" class="brush: csharp">
using NSpec.Framework;

namespace FizzBuzzNSpec.Specs
{
    [Context]
    public class when_a_number_is_a_multiple_of_three
    {
        [Specification]
        public void then_translation_should_return_fizz()
        {
            Specify.That(game.Translate(6)).ShouldEqual("Fizz");
        }

        private readonly FizzBuzz game = new FizzBuzz();
    }
}
</pre>
<h3>Anderes Framework, andere Sitten</h3>
<p>Die Konsequenz dieser Verbalisierung und Strukturierung ist zunächst einmal eine verbesserte Lesbarkeit. Weiterhin fällt auf, dass es nicht mehr eine einzige &#8220;Testklasse&#8221; gibt, sondern 4 verschiedene Spezifikationsklassen. Für jede Spielregel eine. Das Stukturierungssystem ist zwar mit klassischen Test-Frameworks auch möglich, wird aber nicht so offensichtlich &#8220;verlangt&#8221; wie es das BDD-Test-Framework NSpec hier tut.<br />
<a href="http://www.gmbsg.com/wp-content/uploads/2010/04/nspec_structure.png"><img src="http://www.gmbsg.com/wp-content/uploads/2010/04/nspec_structure.png" alt="nspec_structure" title="nspec_structure" width="353" height="235" class="alignright size-full wp-image-962" /></a><br />
Den Code für die anderen Spielregeln spare ich mir &#8211; es sieht dem o.g. Beispiel sehr ähnlich :-). Hat man erst einmal das &#8220;sprechendere&#8221; schreiben der Tests bzw. Spezifikationen verinnerlicht, geht es mit NSpec auch zügig voran. Schade ist hier die fehlende Integration und Unterstützung für Visual Studio und die üblichen Code-Assistenten. Mir blieb also nichts anderes übrig, als in der Konsole meine Tests auszuführen. Das hat mich beim implementieren schon gebremst.</p>
<h3>Bewertung</h3>
<ul>
<li><b>Dauer</b><br/>Naja, knapp 15 Minuten für FizzBuzz ist doch schon dreimal länger als mit NUnit. Die mangelnde Integration und die 4 Klassen machen schon etwas aus.</li>
<li><b>Größe</b><br/>Statt wie bei den &#8220;Klassikern&#8221; 4 Methoden sind es nun 4 Klassen. Schon etwas mehr Code &#8211; hält sich aber noch &#8220;in Grenzen&#8221;.</li>
<li><b>Tooling</b><br/>Schlecht. Der Runner ist dabei &#8211; das war&#8217;s.</li>
<li><b>Usability</b><br/>Geht so. Die Assertions mit <code>Specify</code> reichen für die gröbsten Fälle aus.</li>
<li><b>Support</b><br/>Die Entwicklung von NSpec ist eingestellt. Support damit auch. Zukunftssicherheit ist etwas anderes.</li>
</ul>
<h3>NSpec for a taste of BDD</h3>
<p>NSpec &#8211; ein Vorreiter im .NET-Bereich was BDD angeht. Man merkt dem Framework deutlich an, dass es ein &#8220;erster Wurf&#8221; von der Adaption der BDD-Methodik ist. Nichtsdestotrotz ist as Framework schlank, stabil und gut anwendbar. Es zeigt schon in der Anwendung, wie das &#8220;System BDD&#8221; die Herangehensweise an die Spezifikation und Verifikation von Code ändert. Man beschäftigt sich automatisch mehr mit Kernaussagen und ist &#8220;gezwungen&#8221;, sich deutlicher und expliziter in der Domänensprache zu artikulieren. NSpec kann diesen systematischen Aspekt transportieren, ist aber mittlerweile auf Grund der mangelnden Integration und des fehlenden Supports nicht mehr für &#8220;Real-World&#8221;-Projekte ernstzunehmen. Trotzdem hat mir der Ausflug mit NSpec Spaß gemacht. Da bekomme ich glatt Lust &#038; Laune mir schon das nächste Framework anzuschauen. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/meta-test-nspec-der-spezifizierende-bdd-veteran/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Meta-Test: TDD &amp; BDD Test-Frameworks im Vergleich</title>
		<link>http://www.gmbsg.com/meta-test-tdd-bdd-test-frameworks-im-vergleich/</link>
		<comments>http://www.gmbsg.com/meta-test-tdd-bdd-test-frameworks-im-vergleich/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:45:26 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[MSpec]]></category>
		<category><![CDATA[MSTest]]></category>
		<category><![CDATA[NBehave]]></category>
		<category><![CDATA[NSpec]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[SpecFlow]]></category>
		<category><![CDATA[StoryQ]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[XUnit]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=827</guid>
		<description><![CDATA[Unit Testing, TDD und BDD &#8211; das alles sind zur Zeit &#8211; außer dem Visual Studio 2010 Launch natürlich &#8211; aktuelle Themen, die die .NET Community ein Stückweit bewegt. Ich z.B. habe vor ein paar Wochen angefangen, intensivere Forschungen zur ...]]></description>
			<content:encoded><![CDATA[<p>Unit Testing, TDD und BDD &#8211; das alles sind zur Zeit &#8211; außer dem <a href="http://www.microsoft.com/germany/visualstudio/default.aspx">Visual Studio 2010 Launch</a> natürlich &#8211; aktuelle Themen, die die .NET Community ein Stückweit bewegt. Ich z.B. habe vor ein paar Wochen angefangen, intensivere Forschungen zur Verwandschaft &#038; Beziehung zwischen TDD und BDD durchzuführen. Ich habe zwar schon einige TDD- und BDD-Frameworks hinter mir, doch nicht zuletzt die in jüngster Zeit individuellen, manchmal irritierenden <a href="http://www.gmbsg.com/bdd-thebetterwayofunittesting/">Aussagen zu TDD und BDD</a> geben mir Anlass genug, nachzuforschen.</p>
<p>Ein Bereich, den ich mir dabei näher angeschaut habe ist das Tooling. Ich wurde in der Vergangenheit schon öfters gefragt, welches Test-Framework ich denn einsetze. In letzter Zeit werde ich aber auch ab und an gefragt, welches Test-Framework denn jetzt besser sei. Als Hilfestellung zur Findung einer Antwort auf diese Fragen sowie einen Überblick über die gängigsten Test Frameworks soll dieser Artikel beitragen.</p>
<h3>Die Kandidaten</h3>
<p>Mit diesem Artikel beginnt die kleine Blog-Serie &#8220;Meta-Test&#8221;, die Stück für Stück die populärsten Test-Frameworks für .NET und C# unter die Lupe nimmt, sie bewertet und natürlich auch vergleichen wird. Bisher gab es schon folgende Tests:</p>
<ul>
<li><a href="http://www.gmbsg.com/?p=859">MS Test &#8211; Visual Studio On Board Test-Framework</a>
<li><a href="http://www.gmbsg.com/?p=920">NUnit &#8211; All-Time-Hall-Of-Fame-Most-Valueable-Tester</a>
<li><a href="http://www.gmbsg.com/?p=950">NSpec &#8211; der spezifizierende BDD-Veteran</a>
</ul>
<h3>Die Hypothese</h3>
<p>Vorab möchte ich allerdings noch eine &#8211; für mich wichtige &#8211; Anmerkung äußern. Beim Test der Testframeworks habe ich mehrere Code Kata&#8217;s mit allen Frameworks geschrieben. Am häufigsten habe ich wohl <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">FizzBuzz</a> geschrieben, gefolgt von <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataDictionaryReplacer">Replacer</a>, <a href="http://codekata.pragprog.com/2007/01/kata_thirteen_c.html">LineCounter</a> und ein paar Mal <a href="http://stefanomasini.com/index.php/2009/10/29/code-kata-minesweeper/">Minesweeper</a>. Ich habe dabei schon deutliche Unterschiede nicht nur in den Frameworks, sondern auch in der Adaption selbst festgestellt. Für den hier gezeigten Vergleich gelten folgende Hypothesen: </p>
<ul>
<li>TDD &#038; BDD sind gleichwertig.</li>
<li>TDD &#038; BDD sind prinzipiell das Gleiche, mit Unterschieden in Benennung und Teststruktur</li>
<li>TDD &#038; BDD wendet man für die selbe Aufgabe an, zum Software-Design</li>
</ul>
<p>So, und jetzt der Disclaimer:<br />
<strong>Achtung: Die genannten Hypothesen sind nicht meine Meinung über TDD bzw. BDD!</strong></p>
<p>Ganz im Gegenteil. Ich habe zu TDD ein gefestigtes Meinungsbild. Ich habe auch Erfahrung mit BDD. Gerade deswegen bin ich sehr vorsichtig mit beiden Begriffen. Ich denke, TDD und BDD sind nicht das Gleiche. Doch eine weitere Vertiefung in das Thema lenkt nur von den Frameworks ab. Deswegen wieder schnell zurück zu den Test-Frameworks.</p>
<h3>Die Anforderungen</h3>
<p><asa>Als</asa> <role>Entwickler</role> <iwant>möchte man</iwant> <feature>ein möglichst effektives und intuitives Test-Framework als Werkzeug</feature>, <sothat>um</sothat> <benefit>testgestriebenes Softwaredesign</benefit> durchzuführen. <given>Beim</given> <context>programmieren mit Visual Studio</context> zum Beispiel, <when>wenn</when> <action>man die Tests für die gerade zu entwickelnde Klasse oder Methode formuliert</action>,
<then>da</then> <expectation>gehört die Unterstützung von Tools wie Resharper, CodeRush oder Gallio heutzutage schon zum guten Ton</expectation>. </p>
<p><emotion>Ebenso geht es bei dem Vergleich um die <goal>Anwendbarkeit und Effizienz</goal>. <desire>Also wie expressiv, wie deutlich kann ich meine Tests formulieren und wie intuitiv ist die Umsetzung der Tests</desire>. Die Umsetzungsgeschwindigkeit spielt dabei genauso eine Rolle wie die <wish>Lesbarkeit</wish>, <wish>Wartbarkeit</wish> und <wish>gutes Reporting</wish>. Dazu noch später mehr.</emotion></p>
<h3>Das Ziel</h3>
<p>Um auch eine konkrete, relativ faire Vergleichssituation zu erreichen, stelle ich alle Frameworks an einem einzigen Beispiel vor, nämlich dem <a href="<a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">KataFizzBuzz</a>. FizzBuzz ist eine sehr einfache Kata, die gerade genug &#8220;Widerstand&#8221; bietet, um die Grundzüge des treibenden Software-Designs sowie des Test-First zu vermitteln. Ich habe mich bei der Programmierung der Kata sogar nur auf das Teilproblem der &#8220;Fizz&#8221;- und &#8220;Buzz&#8221;-Übersetzung konzentriert. Es gibt unzählige Implementierungen von FizzBuzz. Bei dem Vergleich der Test-Frameworks habe ich mich für die &#8220;triviale&#8221; und &#8220;zügige&#8221; Implementierung entschlossen. Konkretisiert bedeutet dies, das es mein Test-Ziel war, das ich mit allen Test-Frameworks ungefähr folgenden Code produziere:</p>
<pre name="code" class="brush: csharp">
    public class FizzBuzz
    {
        public string Translate(int number)
        {
            if (number % 15 == 0)
                return "FizzBuzz";

            if (number % 5 == 0)
                return "Buzz";

            if (number % 3 == 0)
                return "Fizz";

            return number.ToString();
        }
    }
</pre>
<h3>Die Metriken</h3>
<p>Um nun die einzelnen Frameworks untereinander vergleichen zu können, braucht es nicht nur einer gemeinsamen Basis &#038; Ziels, sondern auch einer gemeinsamen Messmetrik. Um es nicht zu theoretisch zu gestalten, habe ich einige ganz einfache, aber wie ich finde dennoch aussagekräftige Metriken ausgewählt:</p>
<ul>
<li>Die <b>Dauer</b> der Implementierung</li>
<li>Die <b>Größe</b> der Test-Artefakte (Klassen usw.)</li>
<li>Das <b>Tooling</b>, also die Unterstützung durch VS / Frameworks / Codetools</li>
<li>Die <b>Usability</b>, also handbuchnachschlagefreie Handhabung der API / Tools</li>
<li>Der <b>Support</b> durch Hersteller, Community und User</li>
</ul>
<p>Doch die wichtigste Metirk ist mit Abstand die Bewertung des Ergebnisses der Test-Frameworks &#8211; also der Tests ansich. Die Tests werden unter die vier Grundmerkmale Intuitivität, Expressivität, Lesbarkeit und Wartbarkeit gestellt. Natürlich bleibt da meine eigene subjektive Note an der ein oder anderen Stelle hängen, schließlich habe ich die Frameworks eigenständig getestet und habe auch keinen Anspruch auf gestelzte Objektivität :-).</p>
<p>So, damit sollten die Vorbereitungen und Rahmenbedinungen für den ultimativen Vergleich der Test-Frameworks für das .NET Framework &#038; C# abgeschlossen sein. Dieser gigantische Vergleich von einer Unmenge an Test-Frameworks &#8211; für den ich keine Kosten und Mühen gescheut habe :-) &#8211; wird als Blog-Post-Serie in den nächsten Tagen veröffentlicht.</p>
<p>Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/meta-test-tdd-bdd-test-frameworks-im-vergleich/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>#BDD #TheBetterWayOfUnitTesting</title>
		<link>http://www.gmbsg.com/bdd-thebetterwayofunittesting/</link>
		<comments>http://www.gmbsg.com/bdd-thebetterwayofunittesting/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 16:52:50 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=791</guid>
		<description><![CDATA[Der Titel sagt alles, oder? Ich möchte den Tweet von @SimonHoh zum Anlaß nehmen, den Publikumsjoker zu Rate zu ziehen. Um den Joker so gut wie möglich auszuschöpfen, werde ich vorab aus strategischen Gründen keine Äusserungen dazu abgeben ;-).
Um beim ...]]></description>
			<content:encoded><![CDATA[<p>Der Titel sagt alles, oder? Ich möchte den <a href="http://twitter.com/SimonHoh/status/10708643753">Tweet von @SimonHoh</a> zum Anlaß nehmen, den <a href="http://de.wiktionary.org/wiki/Publikumsjoker">Publikumsjoker</a> zu Rate zu ziehen. Um den Joker so gut wie möglich auszuschöpfen, werde ich vorab aus strategischen Gründen keine Äusserungen dazu abgeben ;-).</p>
<p>Um beim Bild der <a href="http://de.wikipedia.org/wiki/Wer_wird_Million%C3%A4r%3F">Rateshow</a> zu bleiben, muss es natürlich auch eine Frage und vier Auswahlantworten geben.</p>
<div style="clear:both"></div>
<p><strong><big>Was verstehen Sie unter BDD ?</big></strong></p>
<ul>
<li><strong>A:</strong> BDD ist TDD, nur besser</li>
<li><strong>B:</strong> BDD ist etwas anderes als TDD</li>
<li><strong>C:</strong> BDD ist TDD, und noch viel mehr</li>
<li><strong>D:</strong> BDD ist der Bundesverband Deutscher Detektive</li>
</ul>
<p>Ich bin gespannt auf die Bewertung des Publikums (gerne auch mit Begründung). <strong>Deine Meinung zählt!</strong> Ach ja, Frei nach <a href="http://www.youtube.com/watch?v=C3vMRQCcdT0">Sigi Schwarz</a> kann natürlich auch jede Antwort genannt werden, die nicht in der Auswahl genannt wurde (also &#8216;was zum Naschen!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/bdd-thebetterwayofunittesting/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Re: Was hast Du vor 10 Jahren programmiert?</title>
		<link>http://www.gmbsg.com/re-was-hast-du-vor-10-jahren-programmiert/</link>
		<comments>http://www.gmbsg.com/re-was-hast-du-vor-10-jahren-programmiert/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 20:41:05 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Works]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Nostalgie]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[VB6]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=686</guid>
		<description><![CDATA[Es ist zwar schon ein wenig her, als Dariusz, Alex, Thomas und Thomas sich selbst diese Frage gestellt und beantwortet haben. Dennoch ist es für mich Anlaß genug, auch mal in den Archiven nachzukramen und zu schauen, was ich denn ...]]></description>
			<content:encoded><![CDATA[<p>Es ist zwar schon ein wenig her, als <a href="http://blogs.msdn.com/dparys/archive/2010/03/05/was-hast-du-vor-ber-zehn-jahren-programmiert.aspx">Dariusz</a>, <a href="http://blog.alexonasp.net/post/2010/03/05/Was-hast-Du-vor-uber-zehn-Jahren-programmiert.aspx">Alex</a>, <a href="http://blog.thomasbandt.de/39/2324/de/blog/re-was-hast-du-vor-ueber-zehn-jahren-programmiert.html">Thomas</a> und <a href="http://thomas.mentzel.name/2010/03/05/was-hast-du-vor-uber-zehn-jahren-programmiert/">Thomas</a> sich selbst diese Frage gestellt und beantwortet haben. Dennoch ist es für mich Anlaß genug, auch mal in den Archiven nachzukramen und zu schauen, was ich denn so vor 10 Jahren an Software &#8220;verbrochen&#8221; habe.</p>
<p>Nun, vor genau 10 Jahren (Frühjahr 2000) habe ich erstaunlich vielschichtiges getan. Da bin ich selbst schon überrascht. Ich habe z.B. einen HTML-Editor (versucht) in VB6 zu programmieren. Und habe ich einen PDF-Scanner in C geschrieben (um Bilder bzw. 2D-Polygone aus dem PDF zu &#8220;extrahieren&#8221;). Doch beides möchte ich hier nicht vorstellen, sondern ein ganz anderes Programm, mit vorerst letztem CVS-Commit am 15.03.2000: <strong>ScanDirNavian</strong>.</p>
<p>ScanDirNavian ist ein kleines Ameisenprogramm in VB6. Es durchforstet einen gesamten Verzeichnisbaum auf bestimmte Dateien (mit bestimmten Patterns im Dateinamen) und listet diese in einer Logdatei auf. Als Zusatzfeature kann es nicht nur die Dateiinformationen loggen, sondern auch einfache Transformationsaufgaben erledigen. Z.B. &#8220;Nehme die ersten 3 Zeichen des Dateinamens, falls es eine Zahl ist, stelle Sie an das Ende des Dateinamens.&#8221;</p>
<p><img src="http://www.gmbsg.com/wp-content/uploads/2010/03/scandirnavian.png" alt="scandirnavian" title="scandirnavian" width="542" height="314" class="aligncenter size-full wp-image-693" /></p>
<p>Ich bin mir nicht mehr sicher, welchen Zweck ich damit eigentlich bedient habe. Ich kann mich vage daran erinnern, dass ich tausende von Logdateien (von Linux, Raytracern und diversen anderen Programmen) irgendwie umstrukturieren bzw. in andere Verzeichnisstrukturen überführen wollte. Ein Codeschnipsel gefällig? Bitte gerne:</p>
<pre style="brush: vb">
Private Sub CommandScan_Click()
    Dim StartDirectory As String
    Dim ScanTimeString As String
    AllFileCounter = 0
    AllScanTime = 0

    StartDirectory = DirSource.Path
    LabelInfo.Caption = "Scanning Directory" &#038; vbCrLf &#038; vbCrLf &#038; _
        StartDirectory &#038; vbCrLf &#038; vbCrLf &#038; _
        "Please wait until scan is complete."
    TabLog.Tabs(3).Selected = True
    FormMain.MousePointer = 11
    TimerScanDuration.Enabled = True
    DoEvents

    If InStr(TextHeader.Text, LogTypeCommand(7)) > 0 Then
        TextHeader.Text = _
            Left(TextHeader.Text, _
            InStr(TextHeader.Text, LogTypeCommand(7)) - 1) &#038; _
            DirSource.Path &#038; _
            Right(TextHeader.Text, Len(TextHeader.Text) - _
            InStr(TextHeader.Text, LogTypeCommand(7)) - _
            Len(LogTypeCommand(7)) + 1)
    End If
    If InStr(TextHeader.Text, LogTypeCommandShortCut(7)) > 0 Then
        TextHeader.Text = _
            Left(TextHeader.Text,
            InStr(TextHeader.Text, LogTypeCommandShortCut(7)) - 1) &#038; _
            DirSource.Path &#038; _
            Right(TextHeader.Text, Len(TextHeader.Text) - _
            InStr(TextHeader.Text, LogTypeCommandShortCut(7)) - _
            Len(LogTypeCommandShortCut(7)) + 1)
    End If

    If Len(TextLog.Text) = 0 And Len(TextHeader.Text) > 0 Then _
        TextLog.Text = TextHeader.Text &#038; vbCrLf &#038; _
        String(Len(TextHeader.Text), "-") &#038; vbCrLf &#038; vbCrLf

    ScanDirectory DirSource.Path, TextOutput.Text
    DirSource.Path = StartDirectory
    TimerScanDuration.Enabled = False

    FormMain.MousePointer = 0
    ScanTimeString = Trim(Str(AllScanTime / 10))
    If Left(ScanTimeString, 1) = "." Then ScanTimeString = "0" &#038; ScanTimeString
    LabelInfo.Caption = "Scan complete !" &#038; vbCrLf &#038; vbCrLf &#038; _
        "Successfully passed through " &#038; Trim(Str(AllFileCounter)) &#038; " files." &#038; _
        vbCrLf &#038; "Elapsed time: " &#038; ScanTimeString &#038; " seconds."
End Sub
</pre>
<p>Oh je, da habe ich mich nicht gerade mit Ruhm bekleckert :-) Funktioniert hat es &#8211; Ja. Aber lange zufrieden war ich auch nicht damit. Immerhin hat es seinen Zweck erfüllt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/re-was-hast-du-vor-10-jahren-programmiert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum: Die bessere Sprintdauer</title>
		<link>http://www.gmbsg.com/scrum-die-bessere-sprintdauer/</link>
		<comments>http://www.gmbsg.com/scrum-die-bessere-sprintdauer/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 08:35:57 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=661</guid>
		<description><![CDATA[Vor einiger Zeit hatte ich über die Fünf Schwachpunkte von Scrum gebloggt. Am Ende des Artikels hatte ich versprochen, mir Gedanken darüber zu machen, wie man diese Schwierigkeiten besser meistern kann. Mein erstes &#8220;Scrum-Schwachstellenthema&#8221; ist heute die Sprintdauer. Eingangs möchte ...]]></description>
			<content:encoded><![CDATA[<p>Vor einiger Zeit hatte ich über die <a href="http://www.gmbsg.com/funf-schwachpunkte-von-scrum/">Fünf Schwachpunkte von Scrum</a> gebloggt. Am Ende des Artikels hatte ich versprochen, mir Gedanken darüber zu machen, wie man diese Schwierigkeiten besser meistern kann. Mein erstes &#8220;Scrum-Schwachstellenthema&#8221; ist heute die Sprintdauer. Eingangs möchte ich noch einmal kurz erläutern, was denn nun an der Sprintdauer so schwierig ist und wieso es meiner Meinung nach eine Schwachstelle ist.</p>
<p>In vielen Fachblättern und Artikeln wird <a href="http://de.wikipedia.org/wiki/Scrum#Zyklusmodell">eine Sprintdauer von 30 Tagen</a> (4 Wochen) vorgeschlagen. Manchmal findet man auch <a href="http://www.scrumalliance.org/learn_about_scrum">2-4 Wochen als empfohlene Sprintdauer</a>. In jedem Fall aber sollte die Sprintdauer stabil über Sprints hinweg bleiben.</p>
<p>Mein Einwand: Die Sprintdauer ist eine Schwachstelle in Scrum. Besser gesagt: lange Sprintzyklen sind eine Gefahrenquelle für den Erfolg von Scrum-Teams. Denn gerade lange Sprintzyklen sind für die meisten Teams der erste große Fallstrick. Die meisten Teams, die mit Scrum beginnen, fangen mit langen Sprints von 4 Wochen und z.T. sogar mehr an. Schwierig in mehrfacher Hinsicht, denn dadurch berauben sie sich eigenmächtig der Vorteile agiler Verfahren. Die Flexibilität wird eingeschränkt, die Feedbackschleife des Inspect &#038; Adapt wird verlängert und dem Team wird hohe Planungskompetenz bzw. -verantwortung aufgebürdet.</p>
<p>Was kann man tun um diesen Risiken entgegenzuwirken? Ganz einfach: Kurze Sprints! Mit kurzen Sprints meine ich auch kurze Sprints. Aus meiner Sicht ist die ideale Sprintdauer eine Woche lang. Ja, richtig gelesen, nur 5 Werktage! Jede Woche Planung, jede Woche Review, jede Woche Retro.</p>
<h3>Daily Scrum, Weekly Sprint</h3>
<p>Was erreicht man dadurch? Zunächst einmal schafft man durch so eine kurze Sprintdauer eine hohe Planungsfrequenz. Das ist für fast alle Beteiligten nur von Vorteil. Der PO hat hohe Flexibilität, während das Team einen sehr überschaubaren Planungszeitraum hat. Das Team geht genauer auf die Stories und das Design ein, bricht in der Planung genauer Tasks auf. Dadurch ergeben sich quasi automatisch verbesserte Schätzung und stabiles Commitment. Das wiederum stärkt die Vorausplanung und Releaseabstimmung auf der Product Owner-Seite.</p>
<p>Ein-Wochen-Sprints bedeuten aber auch schnelleres Inspect &#038; Adapt. Jede Woche gibt es eine Retrospektive, das wichtigste agile Gremium in Scrum. Jede Woche eine Retrospektive zu haben ist ein wenig wie &#8220;und wöchentlich grüßt das Scrumeltier&#8221; &#8211; es kommen Anfangs immer wieder die gleichen Themen ins Gespräch. Das liegt vor Allem daran, dass es viel einfacher ist, wöchentlich &#8220;inspect&#8221; zu betreiben, als effektiv &#8220;adapt&#8221; durchzuführen. Doch genau das ist das schöne am schnellen, wöchentlichen Sprint-Puls. Es wird die Agilität förmlich &#8220;antrainiert&#8221;. Das Team lernt wesentlich schneller, wirklich zu adaptieren, anstatt es irgendwie auf die lange Bank zu schieben.</p>
<h3>&#8220;Accelerate&#8221; für eine gute &#8220;Velocity&#8221;</h3>
<p>Ein nicht ganz auf den ersten Blick erkennbarer Vorteil der Wochensprints ist der schnelle &#8220;Ramp-up&#8221; des Teams zur stabilen Velocity. Während ein Team mit 4-Wochen-Sprints nach den ersten 3-5 Sprints (also nach 3-5 Monaten!) erst so halbwegs stabile Produktivität und Schätzkompetenz aufweisen kann, gelingt einem Team mit Wochensprints nach der gleichen Sprintzahl (also nach 3-5 Wochen) noch mehr. Ergo: Ein zügiges Teaming wird erreicht.</p>
<p>Gerade Wochensprints haben meiner Meinung nach die Bezeichnung &#8220;Sprint&#8221; verdient. Denn wöchentliche Iterationen &#8220;fühlen&#8221; sich nicht nur wie ein Sprint an, sondern sind auch so intensiv und ergiebig wie ein Sprint. Das liegt nicht nur am höheren Takt, sondern auch an einer ganz lapidaren Tatsache: Die Arbeitswoche.</p>
<p>Unsere gesamte Lebens- und Arbeitskultur tickt in diesem &#8220;Wochentakt&#8221;. Viele denken, planen und organisieren in Wochenzyklen. Das kommt auch dem wöchentlichen Scrumsprint zu Gute. Teams mit Wochensprints kommen mit dem Wochentakt &#8220;einfach besser zurecht&#8221; &#8211; wissentlich oder unwissentlich. Höchstwahrscheinlich ist dies dem Fakt geschuldet, dass die gesamte Arbeitswelt sich an diesem Takt orientiert. Egal ob nun Scrum oder nicht, die Kalenderwoche ist und bleibt eine präsente Zeiteinheit, die für Planung, Vereinbarung und Organisation angewendet wird.</p>
<h3>Kurz und Knackig</h3>
<p>Bei all den Vorteilen, die eine kurze, nach meinem Ermessen am Besten wöchentliche Sprintdauer hat &#8211; es gibt auch hier wieder einige Dinge, die man vor der Einführung oder beim &#8220;Sprinten&#8221; beachten sollte. Ein allgemeiner Fallstrick kann es werden, die Planung des Sprints auf den Montag zu legen, und die Retrospektive auf den Freitag. So wie es bei klassischen <a href="http://de.wikipedia.org/wiki/Jour_fixe">Jour-Fixe Meetings</a> zum guten Ton gehört Planungsgespräche an das Ende der Woche zu legen, ist das bei Wochensprints auch förderlich. Eine mögliche Variante wäre es, die Planung auf den Freitag zu legen und Review/Retro auf Montag.</p>
<p>Damit ist der nächste Achtungspunkt schon implizit genannt: Nicht versuchen, alle &#8220;Scrum-Meetings&#8221; in einen Tag zu quetschen. Ganz im Gegenteil, die Planung kann Freitag vormittags erfolgen. Der Nachmittag ist reserviert für Konzentrationsarbeit, Tageskommunikation, Vorbereitung des Boards und des Reviews / Retro&#8217;s. </p>
<p>Montag ist vormittags &#8220;Tabu&#8221; &#8211; denn genau dann befindet man sich in der &#8220;Twilight Zone&#8221;. Ende des letzten Sprints oder Anfang des nächsten Sprints &#8211; schon durch die Planung oder noch im Review &#8211; noch Montagsmüde oder schon im Tatendrang &#8211; ein Montag Morgen eben. Der späte Nachmittag kann dann nach dem üblichen Daily für die kurze Review/Retro investiert werden. Bei Wochensprints ist eine 4 stündige Planung angemessen, eine Review/Retro von einer Stundes komfortabel ausreichend.</p>
<p>Fazit: <strong>Kurz &#038; Knackig &#8211; das ist die bessere Sprintdauer in Scrum!</strong><br />
Es gibt natürlich noch mehr Aspekte als die aufgeführten, um zu einer ausgewogenen Sprintdauer für sein Team zu kommen. Für mich bleibt jedoch die in den meisten Fällen zutreffende Erkenntnis: Kurz &#038; Knackig ist besser als Lang &#038; Weilig. Was denken Sie? Ihre Meinung ist gefragt!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/scrum-die-bessere-sprintdauer/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>.NET Coding Dojo Massiv</title>
		<link>http://www.gmbsg.com/net-coding-dojo-massiv/</link>
		<comments>http://www.gmbsg.com/net-coding-dojo-massiv/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 13:45:18 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=637</guid>
		<description><![CDATA[Massiv! Das ist das treffende Wort, die neuesten Nachrichten über das .NET Coding Dojo und die Bewegung im Allgemeinen zu beschreiben.
Massiv Sportlich
Schon das letzte Münchener .NET Coding Dojo im Februar war wieder eine spannende und anregend erkenntnisreiche Veranstaltung. Das Lösen ...]]></description>
			<content:encoded><![CDATA[<p>Massiv! Das ist das treffende Wort, die neuesten Nachrichten über das .NET Coding Dojo und die Bewegung im Allgemeinen zu beschreiben.</p>
<h3>Massiv Sportlich</h3>
<p>Schon das letzte Münchener .NET Coding Dojo im Februar war wieder eine spannende und anregend erkenntnisreiche Veranstaltung. Das Lösen des <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataTennis">KataTennis</a> hat sich als eine wunderbare Übung für den überlegten, soz. &#8220;wohl bedachten&#8221; einsatz von Test-Driven-Design und -Development herausgestellt. </p>
<p>TDD kann viel im Design und in der Implementierung bewirken. Es fördert lose Kopplung, gestaltet aktiv die Trennung der Verantwortlichkeiten mit und unterstützt das minimalistische &#8220;<a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself">DRY</a>&#8220;-Denken. Es gibt auch frequentiven Feedback in der Entwicklung. Sei es nun, dass man sich auf dem grünen Pfad bestätigt fühlt &#8211; oder aber frühzeitig &#8220;riecht&#8221;, das da etwas nicht ganz ausgereift ist. In jedem Fall war KataTennis im Februar-Dojo eine schöne Aufgabe, die all diese Faktoren präsentierte. Mehr noch, das Dojo zeigte, dass es sich lohnt, die Analyse der Problemdomäne nicht außer Acht zu lassen. Der Code lässt sich wie immer auf dem <a href="http://netdojo.codeplex.com/SourceControl/changeset/view/46517#603241">Codeplex-Projekt</a> einsehen.</p>
<h3>Massiv Interessant</h3>
<p>Doch das war noch lange nicht alles, was sich zum Thema .NET Coding Dojo im Februar getan hat! Vorreiter war schon im Januar die <a href="http://www.dotnet-ka.de/2010_01_21/2010_01_21.html">.NET User Group Karlsruhe mit einem .NET Coding Dojo der &#8220;Schwarzgurt-Klasse&#8221;</a>. Es wurde <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataPotter">KataPotter</a> angegriffen. Die DNUG hat gespürt, dass ein Coding Dojo schweißtreibend ist &#8211; aber auch spannend und fesselnd. Denn schon einen Monat später gab es in professionell agiler Manier eine <a href="http://blog.alexonasp.net/post/2010/02/17/NET-Usergroup-Karlsruhe-Coding-Dojo-Retrospektive.aspx">Retrospektive zum Coding Dojo</a>. Die DNUG Karlsruhe bleibt also am Ball! </p>
<p>Auch ich konnte noch einen kleinen Beitrag zur Coding Dojo Idee leisten, in dem ich auf der diesjährigen <a href="http://www.vsone.de/">VSOne</a> das Format und die Ziele des .NET Coding Dojo vorgestellt habe. Doch bei der Vorstellung alleine bleibt es bei Dojojanern natürlich nicht &#8211; in der Session wurde demonstrativ ein &#8220;Mini-Dojo&#8221; mit <a href="http://www.codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">KataFizzBuzz</a> gestartet. Es war eine wunderbare Erfahrung, wie interessiert und motiviert unvoreingenommene Teilnehmer im Coding Dojo mitmachen. Danke für das zahlreiche Interesse!</p>
<p>Im Übrigen möchte ich dabei noch betonen, dass die diesjährige VSOne eine wirklich gelungene und qualitative Veranstaltung gewesen ist.</p>
<p>Last but not least: Die .NET Coding Dojo-Idee ist grenzübergreifend! Angespornt und motiviert durch die Events in Deutschland gab es im Februar auch ein eigenständig von Andreas organisiertes <a href="http://www.andreas-schlapsi.at/2010/02/11/net-coding-dojo-wien/">.NET Coding Dojo in Wien</a>! Es wird also auch schon in Österreich kräftig trainiert. Kurzum: Massiv Interessant!</p>
<h3>Massiv Im März</h3>
<p>Natürlich steht auch schon das nächste <a href="https://www.xing.com/events/net-coding-dojo-massiv-marz-475994">Münchener .NET Coding Dojo</a> vor der Tür. Am 10. März erwartet die Teilnehmer ein Coding Dojo der Extra-Klasse. Im März-Dojo werden die gebündelten Kräfte und Kompetenzen von .NET Enthusiasten, Software-Entwicklern &#038; TDD-Interessierten gebraucht. Soviel sei schon vorab verraten: dieser Coding Dojo wird eine Herausforderung!</p>
<p>Im &#8220;Massiv-Im-März&#8221; Coding Dojo werden wir drei spannende Code Kata&#8217;s im Angebot haben, die wieder besondere Techniken sowie Praktiken fordern und fördern. Es geht dabei um Analyse, Design und Implementierung gangbarer, nachhaltiger, effektiver Lösungen zu einem kleinen Programmierproblem. Kurzum: Gemeinsam lernen &#038; lehren von profesioneller Software-Entwicklung mit TDD, CCD und Design Patterns.</p>
<p>Was heißt das? Ganz einfach &#8211; auf geht&#8217;s zum Dojo! Anmeldung per <a href="https://www.xing.com/events/net-coding-dojo-massiv-marz-475994">Xing Event</a> oder <a href="http://www.facebook.com/#!/event.php?eid=336479659946">Facebook Event</a>!</p>
<p>Übrigens, ein schöner Zufall will es, dass das Münchener .NET Coding Dojo parallel zu den Tagen des <a href="http://www.dotnetpro-powerday.de/">dotnetpro.powerday</a> stattfindet. Wer es noch nicht weiß, in den dotnetpro.powerday zeigen <a href="http://ralfw.blogspot.com/">Ralf</a> &#038; <a href="http://www.lieser-online.de/blog/">Stefan</a> auf Ihre gewohnt einprägsame Weise, welche Werte, Prinzipien &#038; Praktiken es bedarf, um nachhaltigen, wartbaren und erweiterbaren &#8211; also <a href="http://www.cleancodedeveloper.de/">Clean Code zu schreiben</a>. Die frisch gewonnen Erkenntnisse kann man dann natürlich bei uns im Coding Dojo einsetzen! :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/net-coding-dojo-massiv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fünf Schwachpunkte von Scrum</title>
		<link>http://www.gmbsg.com/funf-schwachpunkte-von-scrum/</link>
		<comments>http://www.gmbsg.com/funf-schwachpunkte-von-scrum/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 23:12:23 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=576</guid>
		<description><![CDATA[Die fünf Schwachpunkte von Scrum, in klaren Worten.

Rahmenwerk, aber kein Werkzeug
Die Sprintdauer
Die Planung &#038; Das Design
Der Scrum Master
Die Skalierung

Scrum ist ein wunderbares agiles Management-Framework. Ich mag Scrum. Um ehrlich zu sein ist Scrum als &#8220;Agile für Einsteiger&#8221; ein genauso geeignetes ...]]></description>
			<content:encoded><![CDATA[<p>Die fünf Schwachpunkte von Scrum, in klaren Worten.</p>
<ol>
<li>Rahmenwerk, aber kein Werkzeug</li>
<li>Die Sprintdauer</li>
<li>Die Planung &#038; Das Design</li>
<li>Der Scrum Master</li>
<li>Die Skalierung</li>
</ol>
<p>Scrum ist ein wunderbares <a href="/?p=64">agiles Management-Framework</a>. Ich mag Scrum. Um ehrlich zu sein ist Scrum als &#8220;Agile für Einsteiger&#8221; ein genauso geeignetes methodisches Rahmenwerk wie für den enthusiastischen Agilisten. Ich habe mittlerweile einige Jahre Scrum-Erfahrung und darf mich ja selbst als &#8220;Zertifizierter Scrum Master&#8221; bezeichnen. Trotzdem &#8211; oder gerade aus dieser Erfahrung heraus &#8211; ist Kritik an Scrum meines Erachtens angebracht. Die kritischen Stimmen zu Scrum werden immer deutlicher, allen voran die erst kürzlich von <a href="http://groups.yahoo.com/group/scrumdevelopment/message/44851">UncleBob aufgestellten 7 Thesen der Mängel von agiler Software-Entwicklung mit XP &#038; Scrum</a>. In diesem Artikel möchte ich dazu meine Sicht der Dinge wiedergeben.</p>
<p>Scrum ist nicht Perfekt. Ganz im Gegenteil. Mit steigender Erfahrung kann man z.T. gravierende Schwachpunkte in der Methodik feststellen. Das soll jetzt nicht heißen, daß Scrum für ein agiles Projekt zu schlecht oder ungeeignet wäre &#8211; Nein. Vielmehr sollte man bei der Anwendung von Scrum ein besonderes Augenmerk auf die Schwachpunkte der Methode legen &#8211; um so im Ergebnis weniger Stolpersteine auf dem Weg zum Projektziel zu haben.</p>
<h3>Rahmenwerk, aber kein Werkzeug</h3>
<p>Scrum ist ein Framework. Nicht für Software-Entwicklungs-Methoden, sondern für Projekt-Management. Doch als Framework für die Projekt-Management-Methodik ist Scrum in vielen Teilen zu unspezifisch. Natürlich ist Scrum gerade durch die wenigen Regeln &#038; Rollen leicht verständlich und relativ zügig einsetzbar. Auf der anderen Seite jedoch ist die Eigenschaft von Scrum, eine &#8220;leichtgewichtige&#8221; Methodik des agilen Projektmanagements zu sein eine schwere Bürde &#8211; sei es inhaltlich oder praxisbezogen. Beispiele gefällig?</p>
<ul>
<li><i>Scrum verlangt Dailies am Scrum Board</i><br/>Scrum sagt aber nicht wie dieses Board denn verwendet werden soll, welches die primären Ziele des Boards sind und welche Mittel &#038; Wege man hat mit dem Board umzugehen. Wie ist das mit dem Sprint Backlog auf dem Board? Wie werden die Stories abgearbeitet? Wie geht man mit Ausnahmen (z.B. Bugs) um? Scrum schlägt bei diesen Themen sehr leise Töne an.</li>
<li><i>Scrum nennt Product &#038; Sprint Backlogs</i><br/>Scrum verrät aber nichts über den Aufbau der Einträge der Backlogs. Ein Product-Backlog ist eine &#8220;Wunschliste&#8221;, ein Sprint-Backlog ist eine &#8220;Taskliste&#8221;. Pofessionelle Agilisten belächeln mittlerweile die flachen Scrum-Backlogs und deren mangelhafte Vorgaben.</li>
<li><i>Scrum hat ein Sprint-Planungs-Meeting</i><br/>&#8220;Gut, daß man bei Scrum auch plant&#8221; mag es einem in den Sinn kommen. Doch in Scrum konzentriert sich die Planung zumeist auf ein einziges Meeting, in dem der gesamte, meist 4 Wochen lange Sprint und die in dieser Zeit zu erstellenden Features designed &#038; geplant werden. Software-Entwickler mit gesundem Respekt gegenüber der Ingenieurskunst des &#8220;Software Engineerings&#8221; würden mit großer Wahrscheinlichkeit so eine Vorgehensweise als &#8220;unausgereift&#8221; bezeichnen.</li>
</ul>
<h3>Die Sprintdauer</h3>
<p>Scrum baut auf Mikro-Organisation. Tägliche Einsatzbesprechung, Aufgabenverteilung und Updates. Scrum stützt dadurch Agilität. Anforderungen können sich ändern, unbedachte Situationen können eintreten. Darauf kann Scrum reagieren mit den Sprints, die die Gesamtleistung in viele kleine Schritte zerlegen. Hier, genau bei den Sprints (Iterationen) und deren Dauer ist die Methodik (bzw. die Umsetzung von Scrum) zumeist deutlich mangelhaft.</p>
<p>Wieso? Scrum schlägt eine Sprint-Dauer von 2-4 Wochen vor. Vorzuziehen sei eine kürzere Sprintdauer, maximal sollte sie jedoch 4 Wochen sein. Doch für ein Rahmenwerk, welches sehr stark auf die Mikro-Organisation fokussiert ist, sind 4 Wochen eine lange Zeit. Denn in der Praxis gibt es wenige Scrum-Projekte, die wirklich den 2-Wochen-Takt implementieren. Die Gründe dafür sind vielfältig. Einer der Hauptgründe ist wohl der Schwenk von einer &#8220;klassischen&#8221; Projektplanung hin zum agilen Management. In so einem Kontext tendiert man lieber zur 4 Wochen Zeitspanne, weil</p>
<ul>
<li>man angeblich mehr Zeit zum implementieren hat;</li>
<li>angeblich alle 2 Wochen ein ganzer Tag Team-Meeting &#8220;ineffizient&#8221; ist;</li>
<li>die wenigsten Anforderungen eines Produktes in 2 Wochen einsatzfähig fertiggestellt werden können.</li>
</ul>
<p>Im Grunde mehr oder minder schwachbrüstige Argumentationen. Als Randnotiz: meine persönliche Ansicht ist bei diesem Thema ist noch fordernder als die der reinen Scrum-Lehre: 2-wöchige Sprints sind gut, Wochen-Sprints noch viel besser.</p>
<p>Lange Sprintzyklen wirken für agile Verfahrensweisen wie eine angezogene Handbremse. Einen 4-Wochen-Sprint in 4 Stunden Sprint-Planungs-Meeting zu planen ist gelinde gesagt tollkühn. Bei langer Sprintdauer ist die Zahl der Stories und Tasks auf dem Board meist unbeherrschbar. Mehr noch, bei 4 Wochen schleichen sich gerne andere, minder relevante Aufgaben wieder auf&#8217;s Board. </p>
<p>Die Releasefähigkeit wird stark eingeschränkt und das obere Management durch die langen Sprintzyklen implizit dazu aufgefordert, mehr &#8220;Termin-Management&#8221; und Koordinationsleistung zu betreiben. Die empirische Messung der Velocity und die Schätzgenauigkeit des Teams ist mit langen Sprints von deutlich geringerem Wert und Aussagekraft als bei (sehr) kurzen Sprints.</p>
<h3>Die Planung &#038; Das Design</h3>
<p>In den vorangegangenen Punkten ist dieser Makel schon ein wenig angeklungen; Planung &#038; Design in Scrum sind unfassbar &#8211; im wahrsten Sinne des Wortes. Wer schon einmal vor der Aufgabe stand, in einem Sprint-Planungs-Meeting mit den anderen dutzende Stories &#8220;implementierungsreif&#8221; zu planen &#038; zu designen, der kann sich denken, worauf ich hinaus möchte.</p>
<p>Doch vor der Betrachtung und Kritik am &#8220;Planungs-Meeting&#8221; möchte ich die generell mangelhafte Planungssituation von Scrum nicht unerwähnt lassen. So sucht man in der Scrum-Methodik vergebens unterstützende Merkmale zu adequater Business-Analyse und der anschließenden Anforderungs-Analyse. &#8220;Ohh&#8221; &#8211; wird sich jetzt manch einer denken &#8211; &#8220;Ist dass denn dann noch agil?&#8221;. Antwort dazu: Es wäre für die Vertreter der agilen Software-Entwicklung schlichtweg ein Debakel, wenn eine wichtige Disziplin des Software Engineerings nicht agil betrieben werden könnte. </p>
<p>In der Praxis wird Scrum leichtsinnig und konzeptfrei mit allem möglichen &#8220;agilen Zubehör&#8221; bepackt. Da gibt es dann User Stories, Planning Poker, Story Points, Estimation Meetings, Business Value Estimations und vieles mehr. Aus Sicht der Prediger der Scrum-Fibel auch durchaus verständlich, schließlich sei &#8220;Scrum ja auch nur ein Rahmenwerk&#8221; (siehe 1. Schwachpunkt).</p>
<p>Doch zurück zum Thema Planung &#038; Design von Software und Software-Entwicklung. Man mag wieder argumentieren, das habe nichts mit Scrum, dem Management-Rahmenwerk, zu tun. Dies wäre eine fadenscheinige, viel zu oberflächliche Argumentation, denn auch Management-Methoden sollten die Problemstellungen Ihrer Domäne (hier: Software-Entwicklung) stützen, fördern und verwalten können. </p>
<p>Scrum will dies mit dem Sprint-Planungs-Meeting erreichen. Bedauernswerter Weise in vielerlei Hinsicht inadequat. Was in den Lehrbüchern zu Scrum so einfach klingt, ist in der Praxis kaum durchführbar. Zum Einen ist es eine schier berzerrte Wahrnehmung der Realität anzunehmen, dass eine Gruppe von Software-Entwicklern innerhalb von 4-8 Stunden die meist dutzenden Anforderungen für die nächsten paar Wochen &#8220;durchdesignen&#8221; können. Zum Anderen soll in diesem Meeting so viel wie möglich an offenen Punkten bzgl. der Anforderungen geklärt werden (um der oft mangelnde Anforderungsanalyse entgegenzuwirken). </p>
<p>Bei aller Liebe zu &#8220;Embrace Change&#8221; &#8211; die Sprint-Planung stellt bei vielen Scrum-Teams mit langen Sprintzyklen eine unvollständige &#8220;Erstanalyse&#8221; der Geschäftsanforderung dar. Aus einer solchen Besprechung eine adequates und professionelles Software-Design zu verlangen, ist schlichtweg naiv. Für viele, angebliche &#8220;Agilisten&#8221; ist die Sprint-Planung ein Alibi für Design &#038; Planung. &#8220;Ja, wir haben doch schon im Planning darüber nachgedacht &#8211; das reicht&#8221;. Andere wiederum kommen mit der hochkomprimierten, verlustbehafteten Planung wenig zurecht und lagern in der Planung noch kräftig Analyse-Tasks, Design-Tasks, Dokumentations-Tasks nach. Sogar  Analyse-Stories bis hin zu ganzen Analyse-Sprints oder Refactoring-Sprints sind schon gesichtet worden. &#8220;Willkommen zurück im Wasserfall&#8221; kann man da nur sagen.</p>
<h3>Der Scrum Master</h3>
<p>Mit dem Scrum Master wird ein heikles Kapitel der Schwachpunkte von Scrum geöffnet. Denn der Scrum Master &#8211; als Rolle versteht sich &#8211; mag auf den ersten Blick alles andere als eine Schwachstelle in der gesamten Methode verstanden werden. Scrum versteht den Scrum Master als &#8220;Facilitator&#8221;, als &#8220;Change Agent&#8221;, als &#8220;Servant Leader&#8221; &#8211; was für lobenswerte Werte. Eine Hymne, die auf den Scrum Master gesungen wird. Er überwacht die (wenigen) Scrum-Regeln, er schafft &#8220;Impediments&#8221; aus dem Weg, er fördert &#8220;die gesunde Veränderung&#8221; und moderiert durch die Meetings. Ein smarter Typ, dieser Scrum Master.</p>
<p>Doch der Schein trügt. In der Realität ist der Scrum Master oft keines von all den genannten Dingen. In den meisten Unternehmen ist der <a href="/?p=52">Scrum Master Nachfolger des klassischen Projekt-Managers</a>. Er schmückt sich mit der Feder des &#8220;Change Agents&#8221;, nimmt aber aktiven Einfluß auf Planung, verteilt Tasks &#038; Aufgaben, zweifelt Entwicklungsaufgaben an, mahnt bei Refaktorisierungsaufgaben zur Beachtung des &#8220;Business Values&#8221; und erklärt sich selbst zum &#8220;Manager des Teams&#8221;.</p>
<p>Andererseits ist der Scrum Master oft V-Mann und Sklave des konservativen Managements. Er wird genötigt, Aussagen über Releasepläne zu geben, Executive Reports zu erstellen, die Zeiterfassung für die Bilanzierung zu erledigen und gleichzeitig (parallel zur &#8220;modischen, agilen Methode&#8221;) noch Projektpläne zu erarbeiten, in denen penibel Zeitabläufe, Ressourcen &#038; Meilensteine durchgeplant werden.</p>
<p>Der Scrum Master kann auch ein Entwickler sein, der sich dann auserkoren fühlt und Review-Pate spielt. Er ändert Tasks, ist bei Estimations der Führende und setzt den anderen &#8220;seinen Programmierstil&#8221; (unbewußt) vor die Nase. Er ist meist zu unkooperativ gegenüber dem Product Owner und pocht auf die &#8220;Einhaltung von Abmachungen&#8221; (Contracting), anstatt den Aspekt für das Geschäft im Auge zu behalten.</p>
<p>All diese Dinge sind kontraproduktiv für das eigentliche Ziel &#8211; eine koordinierte, produktive, agile Software-Entwicklung. Es gibt ganz wenige, um nicht zu sagen äußerst selten anzutreffende Scrum Master, die Agilität &#038; Professionalität in Einklang bringen und die überspitzten, gar realitätsfremden Scrum-Prädikate &#8220;Alles-Könner&#8221;, &#8220;Jeden-Versteher&#8221; und &#8220;Komplett-Überblicker&#8221; erfüllen.</p>
<h3>Die Skalierung</h3>
<p>Ein offensichtlicher Schwachpunkt von Scrum ist die Skalierung. Scrum in seiner ersten und &#8220;reinen&#8221; Form ist eher für ein einzelnes Team konzipiert &#8211; maximal ein paar Teams. Aber Scrum im Großen, &#8220;Scrum in the Enterprise&#8221; &#8211; das ist dann schon eine etwas andere Sache. Klar, es gibt &#8220;Scrum of Scrums&#8221; und &#8220;Company Backlogs&#8221;. Dennoch ist bei Scrum die Integration von ganzen Abteilungen, die Organisation von dutzenden Teams und Koordination zu einem größeren Produkt ein Punkt, der in den Lehrbüchern nur mit der magischen &#8220;unsichtbaren Tinte&#8221; zwischen den Zeilen geschrieben zu sein scheint.</p>
<p>Ominös umnebelt sind hierbei besonders die Themen Synchronisation und Team-Aufteilung. Sind die Teams jetzt funktional (z.B. ein B2B und ein B2C-Team) oder horizontal (z.B. UI-Team, DWH-Team) oder vertikal (z.B. CMS-Team, CRM-Team) oder kann doch jeder alles? Sprintet jeder synchron? Gibt es einen Release-Plan oder mehrere? Wie können die Ergebnisse zusammengeführt werden? Muss jedes Team einen eigenen Branch und eigenes Board haben? Kann ein Scrum Master drei Teams &#8220;betreuen&#8221;? Fragen über Fragen, auf die Scrum &#8211; wenn überhaupt &#8211; nur unscharfe Antworten gibt.</p>
<h3>Das Dilemma</h3>
<p>Es ist schon ein Dilemma. Scrum ist so verbreitet, weil es einfach ist. Es ist überschaubar und kann auf einem Bierdeckel zusammengefasst werden. Scrum ist so populär, weil es einen einfachen Start in die Agilität bietet. Scrum ist so erfolgreich, weil man damit Geschäfte machen kann. Scrum bringt dem Implementierenden auf mittlere Sicht mehr Produktivität und bietet den Unterbau für eine wesentlich flexiblere professionelle Software-Entwicklung. Nicht zuletzt profitiert auch die Unternehmens- und IT-Consulting-Branche von Scrum.</p>
<p>Doch Scrum ist weit mehr als das. Scrum ist unpräzise. Viele denken, sie praktizieren Scrum, dabei machen Sie kleine Wasserfall-Iterationen. Sie stehen an den Boards und berichten über Status und Aufwände, statt gemeinsam den &#8220;Einsatz des Tages&#8221; zu besprechen und zu planen. Einige verwalten Bugs am Board und haben eine &#8220;Ongoing-Tasks&#8221;-Zeile, andere wiederum Pochen auf Tickets, Zeiterfassung und &#8220;Live-Burndown-Charts&#8221;. </p>
<p>Scrum ist transparent. &#8220;Hört sich gut an&#8221; mag man denken. Das ist auch richtig, ist aber für prokrastinierende Entwickler-Veteranen und altgediente Unternehmens-Manager kein Spaß. Überwachungskultur und Big-Brother-Gefühle eingeschlossen. Politik und der staubige Filz von Konzern-Lobbyisten tragen dann dazu bei, daß &#8220;Agil&#8221; und &#8220;Scrum&#8221; mit &#8220;Planungslos&#8221; und &#8220;Chaotisch&#8221; substituiert und verunglimpft werden. </p>
<p>Scrum ist leider aber auch oftmals ein Ausreden-Paket für Entwickler. &#8220;Nein nein, das Board macht der Scrum Master&#8221;. Der Review? Macht der Scrum Master &#8211; der kann doch Powerpoint. Die Transparenz und die plötzliche Selbstorganisation schleudert so manchen festgefahrenen Entwickler aus seiner Bahn. Committed wird nur das nötigste. Ausserdem bestimmt ja das &#8220;Team&#8221; was gemacht wird oder nicht? &#8220;Bloß kein Stress&#8221; ist hier die Devise. </p>
<p>Die Qualitätsansprüche der modernen, agilen Software-Entwicklung werden oftmals mit dem Level-Of-Done wieder relativiert &#8211; wer braucht schon Dokumentation, Unit Tests oder Analyse? Im Übrigen, geplant wird mit einem Tag sowieso schon zu viel &#8211; ansonsten sei man &#8220;nicht agil&#8221;.</p>
<p>Um es etwas provokant auszudrücken: <a href="/?p=78">Scrum ist für Erwachsene</a>.</p>
<p>Die oben genannten Mängel können gravierende Auswirkungen nach sich ziehen. Sie können Scrum-Projekte behindern. Ja, sie sind manchmal sogar Grund für das Scheitern von Scrum. Doch man kann diesen Schwachpunkten entgegenwirken. Und es sei nochmals daran erinnert: nur weil Scrum Schwachpunkte hat, heißt es nicht, daß es absolut ungeeignet ist, um agile Sotware-Entwicklung zu betreiben.</p>
<p>Konsequenterweise bleibt nach dieser mehr oder minder langen Kritikliste an Scrum eine große Frage offen: Was kann man tun, um diese Schwachpunkte zu eliminieren bzw. zu mitigieren? Die Antwort auf diese Frage ist &#8211; wie Scrum selbst &#8211; nicht so einfach wie es scheint. Dennoch würde ich eine Blog-Serie über Verbesserungsmöglichkeiten anstreben. </p>
<p>Haben Sie selbst die Erfahrung über die genannten Schwachpunkte gemacht? Gibt es Ihrer Meinung nach andere, schwerwiegendere Schwachpunkte? Wollen Sie mehr darüber erfahren, wie man den o.g. Schwierigkeiten entgegenwirken kann? Ihre Meinung ist gefragt!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/funf-schwachpunkte-von-scrum/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Jede Codezeile zählt beim .NET Coding Dojo</title>
		<link>http://www.gmbsg.com/jede-codezeile-zaehlt-beim-net-coding-dojo/</link>
		<comments>http://www.gmbsg.com/jede-codezeile-zaehlt-beim-net-coding-dojo/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 21:20:30 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=520</guid>
		<description><![CDATA[Gestern Abend war es wieder einmal soweit. Das .NET Coding Dojo in München öffnete die Tore für alle .NET Enthusiasten, TDD Interessierte, CCD Jünger und neugierige Software-Entwickler.
Und das erste Münchener .NET Coding Dojo des Jahres startete wahrhaftig mit einem Paukenschlag! ...]]></description>
			<content:encoded><![CDATA[<p>Gestern Abend war es wieder einmal soweit. Das .NET Coding Dojo in München öffnete die Tore für alle .NET Enthusiasten, TDD Interessierte, CCD Jünger und neugierige Software-Entwickler.</p>
<p>Und das erste Münchener .NET Coding Dojo des Jahres startete wahrhaftig mit einem Paukenschlag! Erstmals überstieg die Teilnehmerzahl den Rahmen einer Dojo Session, so dass wir zwei Teams machen mussten (und wollten), die gegeneinander in einem &#8220;Dojo-Battle&#8221; antreten und ein Code Kata lösen sollten.</p>
<p>Nach einer kurzen Willkommens-Einwärm-Phase ging es auch schon zur Wahl des Code Kata&#8217;s für den Abend. Zur Auswahl standen <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataBowling">KataBowling</a>, <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataMinesweeper">KataMinesweeper</a> und der <a href="http://codekata.pragprog.com/2007/01/kata_thirteen_c.html">KataLocCounter</a> in der C# Variante. Nach der kurzen Vorstellung der Code Kata&#8217;s entschied sich die Dojo-Gemeinde für den <a href="http://codekata.pragprog.com/2007/01/kata_thirteen_c.html">KataLocCounter</a>. Eine besonders erfrischende und spaßbringende Wahl, wie sich im Laufe des Abends herausstellen sollte.</p>
<h3>Starke Teams denken, testen, zählen</h3>
<p>Das Code Kata ist gewählt, die Aufgabe und Rahmenbedingungen erklärt, nun konnte es schon losgehen. Fast. Die Teams mußten noch formiert werden. Die wurden im Zählverfahren (wie denn sonst ;-)) aufgeteilt. Wie es der Zufall will, waren die Teamstärken gut verteilt. </p>
<p><b>Team 1</b> war stark besetzt mit der analytischen Expertise von <a href="http://www.cotago.de/">Andre</a>, den CCD- und .NET Guru&#8217;s <a href="http://ralfw.blogspot.com/">Ralf</a> und <a href="http://www.lieser-online.de/blog/">Stefan</a>. Hinzu kamen erfahrene Dojojaner wie <a href="http://blog.aztec-project.org/">Thomas und Christina</a>, gestärkt mit einem Dutzend weiterer .NET-Entwickler.</p>
<p>Doch wer nun dachte, <b>Team 2</b> wäre schwächer aufgestellt, der irrte sich gewaltig. <a href="http://www.deger-it.de/">Christian</a>, ein Dojo-Gänger der ersten Stunde und kraftvoll vorandesignender C# Architekt, der durch zahlreiche Dojo&#8217;s durchtrainierte <a href="http://www.stefankoelle.de/">Stefan</a>, die geballte TDD/BDD-Erfahrung von <a href="http://www.bjro.de/">Björn</a> und ein starkes Dutzend .NET-Coder waren ein anspruchsvolles Lineup. </p>
<p>Die Teams waren aufgeteilt, das gedankliche Stretching und Warmup getan. Es konnte losgehen!</p>
<h3>Jede Codezeile zählt</h3>
<p>In einer ersten Phase wollten die Teams sich ein wenig detaillierter mit den Anforderungen an den Line-Counter auseinandersetzen, um eine &#8220;Design-Strategie&#8221; auszuarbeiten. </p>
<pre class="brush: csharp">
string code="Diese Zeile zählt!";
// Einzeilige Kommentare zählen nicht

// Dieser Kommentar und die leere Zeile davor zählen auch nicht
int count = 0; // Diese Zeile zählt natürlich!
bool countComments = false; /* Diese Zeile zählt auch */

/* So ein Kommentar
über mehrere Zeilen hinweg
zählt natürlich nicht als Code! */
</pre>
<p><small><i>Ein paar Kommentarbeispiele :-)</i></small></p>
<p>Interessante Erkenntnis hierbei: Man hat sich zwar mit den fachlichen Anforderungen und den daraus ergebenden Features bzw. Rahmenbedingungen auseinandergesetzt, dabei aber die Analyse und eine gemeinsame Implementierungsstrategie nicht wirklich erarbeitet. Geklärt war zumindest, dass es galt, Kommentare im Code zu erkennen und nicht mitzuzählen. Das <b>Wie</b> und eine gemeinsame Übereinkunft über die Strategie fiel bei beiden Teams &#8220;unter den Tisch&#8221;.</p>
<p>Doch das war offensichtlich zunächst nicht weiter schlimm, denn es schien erstmal wichtiger, das die Teams in den TDD-Rythmus kommen. Die ersten Tests gingen traditionell etwas schwerer vom Kopf in die Tastatur über, doch nachdem man sich auf den Happy-Pfad im Testing und eine inkrementelle Auslieferung des Programmes geeinigt hat ging es dann flotter.</p>
<p>Das Ergebnis innerhalb der Count-Methode des Team 1 war bis dato recht überschaubar:</p>
<pre class="brush: csharp">
            var lines = source.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            return lines
                .Select(x => x.Trim())
                .Where(x => !String.IsNullOrEmpty(x))
                .Where(x => !x.StartsWith("//"))
                .Count();
</pre>
<p>Soweit so gut.</p>
<h3>Stolperstein Block-Kommentare</h3>
<p>Nach den einfacheren Fällen trafen beide Teams mit den mehrzeiligen Block-Kommentaren auf eine etwas härtere Nuss, die es zu knacken galt.</p>
<p>Wie sollte man denn die mehrzeiligen Kommentare erkennen? Vor Allem, wie sollte man dann mit besonders &#8220;außergewöhlichen&#8221; Kommentierungen umgehen?</p>
<pre class="brush: csharp">
int count = 1; /* mehrzeilige
kommentare können */ count++ /* herausfordernd sein */ ;
</pre>
<p><small><i>Außergewöhnliche Kommentare</i></small></p>
<p>An dieser Stelle holte die Teilnehmer die &#8220;zu kurze Analyse&#8221; zu Beginn wieder ein. Welche Strategie sollte man wählen? Die zeilenbasierte Verarbeitung aufgeben und zeichenbasiert arbeiten? Umschwenken auf schweißtreibende, aber mächtige Regular Expressions? Oder sogar eine Kombination von allem?</p>
<p>Das besondere und mich nicht überraschende: beide Teams wählten unterschiedliche Strategien. Während Team 1 die Eleganz des &#8220;Flows&#8221; der LINQ-Expression nicht aufgeben wollte und es mit Regular Expressions angereichtert hat, entschloss sich Team 2 für eine kleine Status-Maschine und einen Mix aus zeilen- und zeichenbasierter Verarbeitung.</p>
<h3>Showdown</h3>
<p>Nach knapp 3 Stunden war es dann soweit. Die Teams klopften die letzten Tests und Codezeilen ein, um sich dann im Schlußvoting dem gegnerischen Team zu stellen. Gespannt warteten die Teams auf den Code und die Resultate des Gegners.</p>
<p>Team 1 präsentierte zunächst das lauffähige Programm, danach das gute Dutzend Tests und den damit getriebenen Code. Auffällig: Der Code erschien dem Gegner auf den ersten Blick als kompakt und elegant.</p>
<p>Team 2 konterte prompt. Eine äußerst saubere Test-Suite, ein durch die differierende Implementierung etwas längerer Code und die Besonderheit, dass die Implementierung sogar (teilweise) Kommentar-Tokens innerhalb von Strings ignorieren konnte.</p>
<p>Ergebnis: Beide Lösungen waren unvollständig &#8211; aber gut vorangetrieben. Während Team 1 stärkeren Wert auf Auslieferbarkeit &#038; Effizienz gelegt hatte, engagierte sich Team 2 mehr in den Bereichen saubere Tests &#038; Funktionalität. Ausnahmsweise gab es beim ersten Dojo-Battle keinen Verlierer &#8211; beide Teams waren gleich stark. Die Ergebnisse von <a href="http://netdojo.codeplex.com/sourcecontrol/changeset/view/45800?projectName=netdojo#594598">Team 1</a> und <a href="http://netdojo.codeplex.com/sourcecontrol/changeset/view/45800?projectName=netdojo#594599">Team 2</a> lassen sich auf dem <a href="http://netdojo.codeplex.com">Dojo-Projekt bei Codeplex</a> begutachten.</p>
<p>Fazit: Ein wirklich gelungener Abend mit engagierten Teams, die trotz der Herausforderungen und Schwierigkeiten eine gute Leistung abgeliefert haben! Danke an alle Teilnehmer! <strong>Chapeau!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/jede-codezeile-zaehlt-beim-net-coding-dojo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Code Contracts: To Contract Or Not To Contract&#8230;</title>
		<link>http://www.gmbsg.com/code-contracts-to-contract-or-not-to-contract/</link>
		<comments>http://www.gmbsg.com/code-contracts-to-contract-or-not-to-contract/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 15:07:21 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CLR]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=461</guid>
		<description><![CDATA[Oder: Würdet Ihr auf Geschenke, die das Leben vereinfachen, verzichten?
Viele werden schon davon gehört haben, und viele werden es auch schon kennen: Code Contracts. Obwohl Code Contracts noch nicht offiziell veröffentlicht wurden, sind Code Contracts mittlerweile keine neue Sache. Im ...]]></description>
			<content:encoded><![CDATA[<h3>Oder: Würdet Ihr auf Geschenke, die das Leben vereinfachen, verzichten?</h3>
<p>Viele werden schon davon gehört haben, und viele werden es auch schon kennen: <a href="http://research.microsoft.com/en-us/projects/contracts/">Code Contracts</a>. Obwohl Code Contracts noch nicht offiziell veröffentlicht wurden, sind Code Contracts mittlerweile keine neue Sache. Im Gegenteil, Durch die massive, jahrelange Forschungsarbeit von Microsoft sind Code Contracts seit über einem Jahr sehr stabil und zuverlässig. Interessanterweise wurden Code Contracts nicht spezifisch erforscht, sondern sind als &#8220;Nebenprodukt&#8221; der Forschungen zu Boogie/Clousot (der statischen Verifikationskomponente von <a href="http://research.microsoft.com/en-us/projects/specsharp/">Spec#</a>) entstanden.</p>
<p>Man findet mittlerweile sehr viele Beispiele und Casts zu Code Contracts und all den Features, die Code Contracts mit sich bringen. Ein aktuelles Video und eine wirklich sehenswerte, einfache Einführung in die Features ist die <a href="http://microsoftpdc.com/Sessions/VTL01">PDC09 Session über Code Contracts und PEX</a> (dem automatisierten Unit Testing Tool). Es ist konsequenterweise nicht verwunderlich, dass Code Contracts seit über einem halben Jahr in den <a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx">DevLabs zur Verfügung gestellt werden</a> und mit .NET 4.0 in der mscorlib integriert sein werden (also in .NET 4.0 mit enthalten sein werden).</p>
<h3>Parameterverifikation mit Stil</h3>
<p>Eine besondere und herausstechende Eigenschaft der Code Contracts ist jedoch, dass es sich wunderbar einfach in eine existierende Code-Basis einführen lässt. Dadurch das Code Contracts viele Vorteile mit sich bringen, kann man eine stufenweise Integration anstreben. So ist es eine gangbare Methode, Code Contracts im ersten Schritt für die Dinge einzusetzen, die man sowieso schon jahrelang macht, wie z.B. Parameterprüfungen in Methoden (Vorbedingungen):</p>
<pre class="csharp">//...
public void ProcessOrder(IOrder order)
{
  if (order == null) throw new ArgumentNullException();
  //...
}
//...</pre>
<p>Diese &#8220;Contracts&#8221; werden mittlerweile von Tools wie ReSharper oder CodeRush auf Wunsch automatisch generiert, um dem Entwickler den Tippaufwand zu ersparen. Es gibt in manchenvielen Anwendungen und API&#8217;s auch nette Hilfsklassen, die diese Prüfungen beschleunigen:</p>
<pre class="csharp">//...
public void ProcessOrder(IOrder order)
{
  Argument.MayNotBeNull(order);
  //...
}

public static class Argument
{
  public static void MayNotBeNull(object o)
  {
    if (o == null) throw new ArgumentNullException();
  }
}</pre>
<p>Genau dieser, ich möchte schon fast sagen tagtägliche Anwendungsfall kann mit Code Contracts sofort umgesetzt werden:</p>
<pre class="csharp">public void ProcessOrder(IOrder order)
{
  Contract.Requires(order != null);
  //...
}</pre>
<p>Lesbar, einfach und effektiv gesehen exakt das selbe, was man schon seit Jahren &#8220;per Hand&#8221; programmiert. Das Schöne ist hier allerdings, das es die Tür für die weiteren Tools (z.B. statische Verifikationsanalyse) öffnet. Mit der Zeit kann man auch nicht nur die Preconditions mit den Code Contracts umsetzen, sondern auch die Postconditions und Invariants einsetzen.</p>
<p>In einem späteren Schritt kann man zu den Prüfungen zur Laufzeit auch die statische Verifikation noch mit einführen, um kritische Anwendungsteile in der Stabilität zu stärken. Es gibt noch viele weitere Vorteile, die Code Contracts mit sich bringen (z.B. Verifikationsdefinitionen auf Schnittstellen), auf die ich hier nicht näher eingehen werde. Ich denke jedoch, dass jeder, der sich ein wenig mit den Code Contracts auseinandersetzt, die klaren Vorteile erkennen wird.</p>
<h3>Weihnachten ohne Geschenke?</h3>
<p>Die Frage ist nun: würde man Code Contracts in eine bestehende heute schon Codebasis integrieren wollen? Die aktuelle Version der Code Contracts muss man separat referenzieren, denn die Contracts werden erst mit .NET 4.0 ein fester Bestandteil der BCL sein. Man stelle sich nun ein agiles Projekt vor, in dem wöchtenliche Releases keine Seltenheit sind. Würde man in so einer Situation den Einsatz von Code Contracts befürworten oder eher abwarten, bis es .NET 4.0 veröffentlicht wurde. Lizenzteichnisch gäbe es keine Probleme, zumal die Code Contracts in der aktuellen Version schon über eine Going-Live-Lizenz verfügen.</p>
<p>Dafür spricht, dass die Code Contract API schon seit über einem Jahr stabil ist. Die Contract-Assembly wurde sehr sorgfältig über einige Jahre hinweg entwickelt. Ein weiteres Pro-Argument ist sicherlich die definitive Integration mit .NET 4.0. Schon heute steht fest, dass System.Diagnostics.Contracts eine fester Bestandteil der neuen .NET-Version sein wird. Die Vorteile, die die Code Contracts selbst mit sich bringen (also verbesserte Verifikation zur Laufzeit, statische Verifikation, erleichterter Einsatz von weiterführenden Tools wie z.B. PEX) erwähne ich nur nebenbei.</p>
<p>Dagegen würde wohl momentan nur die Tatsache sprechen, dass die Contracts noch nicht Final sind. Die API kann sich in den einigen Monaten bis zur Veröffentlichung von .NET 4.0 noch ändern (obwohl es lt. Aussage der Entwicklungsmannschaft wohl unwahrscheinlich ist). Ein weiteres Gegenargument für den sofortigen Einsatz ist wohl das Deployment. Abhängig vom Anwendungstyp muss man da einige Parameter berücksichtigen. Doch für den jetzigen Anwendungsfall möge man von einem agilen Software-Projekt mit frequentiven Releases ausgehen, z.B. ganz klassisch bei einer Web-Anwendung. Hier muss man abwägen, ob man die Contracts-Assembly auf den Webservern im GAC installiert oder mit den eigenen Assemblies mit ausliefert.</p>
<p>Nach dieser kurzen Pro-Contra-Gegenüberstellung würde mich Eure Meinung interessieren. Was meint Ihr? Wer setzt es heute schon ein? Wer möchte es noch vor dem .NET 4.0 Release einsetzen? Wer möchte lieber abwarten bis .NET 4.0?</p>
<p>Die Frage ist: Das Geschenk &#8220;Code Contracts&#8221; heute schon annehmen und einsetzen? Ja oder Nein?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/code-contracts-to-contract-or-not-to-contract/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unit Tests, TDD und Testbarkeit: Ja!</title>
		<link>http://www.gmbsg.com/unit-tests-tdd-und-testbarkeit-ja/</link>
		<comments>http://www.gmbsg.com/unit-tests-tdd-und-testbarkeit-ja/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 22:05:16 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[MDD]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=401</guid>
		<description><![CDATA[Vor ein paar Tagen stellte Golo die Frage &#8220;Wieviel Sinn machen Unit Tests?&#8221; in seinem Blog. Dieser Frage stellten sich schon Peter sowie Thomas in ihren Blogs. Ich habe die Fragestellung schon vor einiger Zeit mit dem Artikel &#8220;Wozu Unit ...]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen stellte <a href="http://www.des-eisbaeren-blog.de/post/2009/11/01/Wie-viel-Sinn-machen-Unittests.aspx">Golo die Frage &#8220;Wieviel Sinn machen Unit Tests?&#8221;</a> in seinem Blog. Dieser Frage stellten sich schon <a href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/11/01/wieviel-sinn-machen-unittests.aspx">Peter</a> sowie <a href="http://blog.thomasbandt.de/39/2291/de/blog/unit-tests-sind-gut.html">Thomas</a> in ihren Blogs. Ich habe die Fragestellung schon vor einiger Zeit mit dem Artikel &#8220;<a href="http://www.gmbsg.com/stories/?p=315">Wozu Unit Tests?</a>&#8221; aufgegriffen und beantwortet, möchte aus aktuellem Anlass meine bescheidene Meinung noch ein wenig mehr ausformulieren.</p>
<h3>Unit Tests &#038; TDD machen Sinn!</h3>
<p>Ganz ehrlich, <strong>Unit Tests &#038; TDD machen sogar richtig viel Sinn</strong>. Unit Testing selbst macht schon sehr viel Sinn, weil eine Verifikation von Anforderungen (fachlicher und technischer Natur) ein wichtiger Bestandteil in der Beurteilung von Leistungsanforderungen an eine Software sind. Ha! Komischer Satz irgendwie, aber im Endeffekt einfach abkürzbar: Wer will ein Auto ohne getestete Bremsen fahren? Übrigens auch ein ziemlich netter Vergleich, denn &#8220;bremsen&#8221; ist das Feature, welches von verschiedensten Komponenten und Faktoren abgedeckt wird (Bremsflüssigkeit, ABS, Bremsscheiben, Bremsbacken, Bremsblöcke usw usf.). Naja, ich glaube da gibt es nicht viel mehr darüber zu sagen.</p>
<p>Darüber hinaus geht es beim Testing &#038; Test-Driven-Development um die Entwicklung von stabiler Software. Stabil ist in diesem Sinne nicht nur die Verifikation der Funktionalität (&#8221;Im Werk wurde einmal auf die Bremse getreten, der Wagen blieb stehen &#8211; Passt.&#8221;), sondern um die Haltbarkeit der Funktionalität als Subsystem (die gesamte Bremsanlage) und innerhalb des Gesamtsystems (Auto). Kurz und bündig: Wer heutzutage stabile, wartbare und erweiterbare Software entwickeln möchte wird ernsthaft TDD einsetzen wollen.</p>
<h3>TDD ist ein mächtiges Entwicklungswerkzeug</h3>
<p>Wie Ralf es schon in <a href="http://ralfw.blogspot.com/2009/10/tdd-wofur-oop-2010-endlich-cleannet.html">seinem Post über TDD</a> erklärt und in vielen Kommentaren wiederholt, darf man TDD nicht als das &#8220;Allheilmittel&#8221; ansehen, sondern als dediziertes, mächtiges Werkzeug. Mit TDD als Tool kann man viele Dinge sicherer und schneller gestalten. Mittlerweile kann ich behaupten, dass ich TDD in keinem Projekt außer acht lassen will und werde, weil es ein essentielles Werkzeug in meinem &#8220;Software-Entwicklungs-Baukasten&#8221; ist &#8211; wie z.B. eine gute IDE oder Patterns oder SCM oder CI&#8230; TDD ist einfach mit dabei.</p>
<p>Manch einer macht hierbei noch eine feine Unterscheidung. Es heisst: &#8220;Bei neuen Projekten  TDD, ok. Aber bei den alten Dingern? Boa, nee&#8221;. Ehrlich gesagt habe ich das am Anfang auch so gesehen. Aber Mittlerweile sehe ich das ganz anders. Egal ob Green- oder Brownfield &#8211; TDD ist immer gut. Bei schon existierenden Projekten (die evtl. sogar wenig Tests haben) treibt TDD die Testbarkeit und die lose Kopplung voran, fördert die Effektivität der Arbeit an Erweiterungen und erleichtert vehement die Umstrukturierung und Wartung des Codes. Dort wo es machbar ist, sollte TDD auch gemacht werden, denke ich.</p>
<p>Jaaa, aber wo ist denn TDD nicht machbar? Klare Antwort: I/O und Parallelität / Multithreading. Alles was mit Ein- und Ausgabegeräten zu tun hat, eine Ressource für Ein- oder Ausgabe darstellt oder in einem asynchronen Verarbeitungskontext liegt. In der Praxis: Joystick, Komplexe Eingaben, User Interfaces, Datenbank. Das sind kritische Punkte, ja. Und gerade dort wünscht man sich TDD, obwohl genau dort die Grenzen früher oder später erreicht werden, weil man einfach keinen Einfluss mehr auf den Status, die Eingabe, die Ausgabe oder die Erwartung derer hat.</p>
<h3>TDD im Grenzbereich</h3>
<p>Dennoch darf man sich nicht durch diese &#8220;Schwierigkeiten&#8221; abschrecken lassen. Ich habe gerade bei diesen Situationen festgestellt, dass es enorm hilfreich sein kann, am &#8220;Grenzbereich&#8221; von TDD sprichwörtlich &#8220;bis zum geht nicht mehr&#8221; umzusetzen. Man stellt schnell fest, dass man an diesen &#8220;Nahtstellen&#8221; der Anwendung sauberer und klarer strukturiert, Verantwortlichkeiten besser aufteilt. Danach betrachtet man das Ergebnis mit anderen Augen. Man stellt fest, dass die UI wirklich nur noch das nötigste macht, absolut schlank ist und dass viele Dinge, die in der UI hilfreich sind (wie z.B. &#8220;Pagination&#8221;) auch komplett ohne UI wunderbar anwendbar werden. Da ist TDD ein wenig wie beim Autorennen: Im Grenzbereich ist es anstrengend, ist aber hocheffektiv und macht obendrein noch Spass.</p>
<p>Für die TDD-Stirnrunzler, die wirklich mal wissen wollen, wie sich das dann im Endeffekt anfühlen kann, denen lege ich wärmstens ein paar Code Kata&#8217;s an&#8217;s Herz. Zum Beispiel ist das populäre <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_FizzBuzz">KataFizzBuzz</a> im letzten Einsteiger-Dojo als <a href="http://www.gmbsg.com/stories/?p=352">Windows-Forms-Kata</a> implementiert worden. Dort gab es viele, die sich gefragt haben, wie man überhaupt die UI testen kann. Doch statt sich mit der &#8220;Untestbarkeit&#8221; der GUI zufrieden zu geben, hat man konsequent das TDD ausgereizt und dadurch ein einfaches MVP-Pattern umgesetzt.</p>
<p>Für TDD-Neulinge empfehle ich auch das <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_Blog">KataBlog</a>. Es ist eine wunderbar einfache Programmieraufgabe, die sehr subtil zeigt, wie man über TDD Design &#038; Entkopplung der Verantwortlichkeiten treibt und welche (anfangs ungeahnten) Vorteile man sich dadurch schaffen kann. Jedoch warne ich die Interessierten schon vor: KataBlog zeigt die Erkenntnisse subtil, zwischen den Zeilen.</p>
<p><strong>Fazit: TDD &#038; Unit Testing ist ein absolutes Muss in der modernen Software-Entwicklung!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/unit-tests-tdd-und-testbarkeit-ja/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.NET Coding Dojo: Zahlenspiele</title>
		<link>http://www.gmbsg.com/net-coding-dojo-zahlenspiele/</link>
		<comments>http://www.gmbsg.com/net-coding-dojo-zahlenspiele/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 17:17:16 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=395</guid>
		<description><![CDATA[Mein Bericht vom .NET Coding Dojo für Experten diese Woche lässt sich relativ einfach zusammenfassen: Toll!
Wir haben im Experten-Dojo uns einem neuen Code Kata gewidmet, dem KataMinesweeper. Anfangs waren wir noch am Grübeln, ob wir nicht das Taschenrechner Kata vom ...]]></description>
			<content:encoded><![CDATA[<p>Mein Bericht vom .NET Coding Dojo für Experten diese Woche lässt sich relativ einfach zusammenfassen: Toll!</p>
<p>Wir haben im Experten-Dojo uns einem neuen Code Kata gewidmet, dem <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_Minesweeper">KataMinesweeper</a>. Anfangs waren wir noch am Grübeln, ob wir nicht das Taschenrechner Kata vom letzten Mal weiter lösen wollen, aber nach einer kurzen Abfragerunde war klar, wir werden uns Minesweeper &#8220;zur Brust&#8221; nehmen. Gut fand&#8217; ich diesmal im Übrigen auch das wir uns gleich auf den Modus geeinigt haben. Wir haben uns für den Prepari Modus entschlossen &#8211; eine gute Entscheidung.</p>
<p>Das Minesweeper Kata ist ein besonders schönes und ergiebiges Kata, mit dem man wirklich viele Konzepte und Methoden trainieren kann. Überraschender Weise haben wir ziemlich lange für den &#8220;Ramp-Up&#8221; gebraucht. Einige Teilnehmer waren sich nicht im Klaren, welche Testing-Strategie angegangen werden soll. Nach einer kurzen Diskussion war aber wieder Einigkeit. Es sollte zunächst einmal die Einlese-Routine der Spielfeld-Definition getestet werden. Verdutzt war ich auch über den Fakt, dass es Schwierigkeiten bei der Vergabe der Namen für die Testmethoden gab. Schon hier war zu erkennen, dass die Teilnehmer des Dojo&#8217;s mit unterschiedlichen Grundkenntnissen umgehen mussten. Ich kann schon jetzt verraten, dass der Know-How-Transfer dem Experten-Team gut gelungen ist.</p>
<p>Nach über einer Stunde waren wir soweit, das Spielfeld war implementiert. In der 15-minütigen obligatorischen Pause wurde neben der Frischluft auch kräftig News über das <a href="http://netopenspace.de/2009/">.NET Open Space Leipzig</a> und das <a href="http://barcampmunich.mixxt.de/">BarCamp München</a> Event vom Wochenende getankt.</p>
<p>In der &#8220;zweiten Halbzeit&#8221; des Dojo&#8217;s ging es an&#8217;s Eingemachte: der Minesweeper-Algorithmus sollte entwickelt werden. Auch hier wieder die Startschwierigkeiten: Während einige schon die Test-Strategie nach einem &#8220;zu erarbeitenden Algorithmus&#8221; ausarbeiten wollten, waren andere der Meinung, man solle die Tests das Design treiben lassen. Ich habe so gut wie möglich versucht, die erste Partei davon zu überzeugen, dass es beim TDD fundamental um das Design geht. Der &#8220;Verifikations-Gedanke&#8221; spielt im TDD eine untergeordnete (aber sicherlich angenehme) Rolle.</p>
<p>Wir haben es schlußendlich alle gemeinsam geschafft, mit Hilfe der Tests einen validen Algorithmus aufzubauen. Yea! Wir haben das Minesweeper Kata geschafft! Abschliessend haben wir uns noch darüber unterhalten, wie wir den Code weiter bearbeiten wollen würden und welche Strategien die geeigneten wären. Ich persönlich würde mich freuen, wenn wir im nächsten Dojo dort weitermachen könnten, wo wir diesen Mittwoch aufgehört haben. Auf der anderen Seite bin ich auch gespannt genug, welche Erkenntnisse wohl die anderen Kata&#8217;s mit sich bringen. Sei&#8217;s drum. Fakt ist &#8211; es war wieder mal erkenntnisreich und spannend gleichermaßen!</p>
<p>Ich freue mich schon auf das nächste <a href="https://www.xing.com/events/net-coding-dojo-experten-416950">Experten-Dojo am 28. November</a>! Übrigens, besonders empfehlen kann ich auch das nächste <a href="https://www.xing.com/events/net-coding-dojo-munchen-starter-415986">Einsteiger-Dojo am 4. November</a>, dort wird ein wunderbares Kata mit ASP.NET MVC angegangen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/net-coding-dojo-zahlenspiele/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Zukunft des Projektmanagers in der Software-Entwicklung</title>
		<link>http://www.gmbsg.com/die-zukunft-des-projektmanagers-in-der-software-entwicklung/</link>
		<comments>http://www.gmbsg.com/die-zukunft-des-projektmanagers-in-der-software-entwicklung/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 06:54:54 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Team]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=52</guid>
		<description><![CDATA[In letzter Zeit kommt es öfter vor, das ich mich verstärkt auch mit &#8220;allgemeinen&#8221; Themen der Software-Entwicklung auseinandersetze. Heute habe ich mich mit den im Alltag allgegenwärtigen Themen Projekt und Projektmanagement auseinandergesetzt. Mein Ziel und mein Interesse ist dabei auf ...]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit kommt es öfter vor, das ich mich verstärkt auch mit &#8220;allgemeinen&#8221; Themen der Software-Entwicklung auseinandersetze. Heute habe ich mich mit den im Alltag allgegenwärtigen Themen Projekt und Projektmanagement auseinandergesetzt. Mein Ziel und mein Interesse ist dabei auf das Management von Software-Projekten gerichtet, besser gesagt dem Projektmanager in der Software-Entwicklung gewidmet.</p>
<p>Aber bevor man sich dem &#8220;Management&#8221; einer Sache annimmt, sollte man definieren was diese Sache &#8211; also das <a href="http://de.wikipedia.org/wiki/Projekt">Projekt</a> &#8211; überhaupt ist. Da wären zum einen eine Reihe von formalen, klassischen Definitionen. Die gängigste ist wohl die des <a href="http://www.pmi.org/Pages/default.aspx">PMI</a>:</p>
<blockquote><p>&#8220;Ein Projekt ist ein zeitlich begrenztes Vorhaben, das unternommen wird, um ein einmaliges Produkt, eine Dienstleistung oder ein Ergebnis zu erzeugen.&#8221;</p>
<p><i><a href="http://en.wikipedia.org/wiki/A_Guide_to_the_Project_Management_Body_of_Knowledge">Project Management Body of Knowledge</a> (PMI)</i>
</p></blockquote>
<p>Um es also in deutlicheren Worten zu sagen: Ein Projekt ist prinzipiell alles, um ein bestimmtes Ziel in einer bestimmten Zeitspanne mit bestimmten Mitteln zu erreichen. Aus der &#8220;Entwickler-Brille&#8221; betrachtet kann also ein Projekt alles mögliche sein: Ein Bug-Fix, ein Change-Request, eine Komponente, ein Mini-Tool, eine Website, ein Framework oder eine super-duper Mega-Anwendung. Das ist für meinen Geschmack (und den vieler anderer) etwas zu schwammig, denn wenn alles ein Projekt wäre, müsste man alles auch managen &#8211; das ist offensichtlich zuviel des Guten.</p>
<p>Also müssen weitere Kriterien herangezogen werden, um ein &#8220;Vorhaben&#8221; und die damit verbundenen Maßnahmen als &#8220;Projekt&#8221; zu rechtfertigen. In der Software-Entwicklung gibt es eine einfache Faustregel, um Vorhaben &#038; Aufgaben nach einer bestimmten &#8220;Komplexität&#8221; für ein Projekt auszusieben:</p>
<h3>Die &#8220;3 mal 1 Projekt-Regel&#8221;</h3>
<p>Alle Vorhaben oder Aufgaben, die offensichtlich </p>
<ul>
<li>länger als einen Tag andauern können, oder</li>
<li>mehr als eine einzelne Aktion erfordern, oder</li>
<li>mehr als eine Person beschäftigt</li>
</ul>
<p>sind Projekte.</p>
<p>Dieser sehr groben Faustregel ist natürlich nicht strikt zu folgen, sondern eher als richtungsweisende Orientierungsregel zu verstehen und hat sich eigentlich gut bewährt. Das Fatale an dieser Regel ist natürlich, dass es potenziell viele kleine Mini-Projekte verursacht &#8211; aber das sei für&#8217;s Erste mal ausser acht gelassen. Prinzipiell gilt: Ein Projekt hat eine Zielvorgabe, eine Zeitvorgabe und natürlich die Personen &#038; Mittel, die diese Vorgabe in der &#8220;gegebenen&#8221; Zeit umsetzen sollen.</p>
<p>Hat man nun ein Projekt definiert &#8211; also sich ein Ziel gesetzt, welches man bis zu einem bestimmten Datum erreicht haben will, geht es um das Management des Projektes. Auch hier gibt es wieder eine Menge an trockenen Definitionen dafür, was <a href="http://de.wikipedia.org/wiki/Projektmanagement">Projektmanagement</a> eigentlich ist. Hier die Definition nach DIN-Norm:</p>
<blockquote><p>&#8220;Projektmanagement ist die Gesamtheit von Führungsaufgaben, -organisation, -techniken und -mitteln für die Abwicklung eines Projektes.&#8221;</p>
<p><i><a href="http://de.wikipedia.org/wiki/DIN_69901">DIN 69901</a></i>
</p></blockquote>
<p>Eine in meinen Augen äußerst &#8220;harte&#8221; Defintion. Demnach braucht ein Projektmanager eigentlich nichts anderes zu tun, als alle Projektbeteiligten und das Projekt selbst zu &#8220;führen&#8221;. Ein Projektmanager ist also für ein Projekt eine Führungskraft. Meiner Meinung nach ist da mehr dahinter &#8211; oder besser gesagt, eigentlich etwas ganz anderes. Intuitiv stellt man sich dabei nämlich die Frage: Was muss man denn eigentlich bei einem Projekt alles &#8220;verwalten&#8221; ?</p>
<h3>Was macht eigentlich ein Projektmanager ?</h3>
<p>Genau hinter dieser Frage versteckt sich das eigentliche Dilemma des Projektmanagements. Abhängig von der Größe, der Dauer, der Inhalte, der Umsetzung, des Teams, der Investitionen und vielem Anderen mehr kann oder muss man besonders viele oder besonders wenige Verwaltungs- und Organisationsmaßnahmen durchführen. Das gesamte Betätigungsfeld eines Projektmanagers ist dermaßen variabel und abhängig vom Projekt, dass man es kaum greifen kann. </p>
<p>Trotz dieser ausgesprochen hohen Variabilität versucht man beim Projektmangament, alles mögliche zu organisieren, zu strukturieren, zu planen oder gar zu reglementieren. Das macht man natürlich nicht aus Spaß, sondern primär um die Zielvorgabe des Projektes zu realisieren &#8211; also ein Projekt erfolgreich durchzuführen. Im &#8220;klassischen&#8221; Projektmanagement gibt es da verschiedene Leitfäden, wie z.B. das <a href="http://de.wikipedia.org/wiki/Projektmanagement#Stakeholdererwartungen">Magische Dreieck</a>, die <a href="http://de.wikipedia.org/wiki/Projektumfeldanalyse">Projektumfeldanalyse</a> oder das sagenumwobene <a href="http://www.google.de/search?hl=de&#038;q=teufelsquadrat">Teufelsquadrat</a>.</p>
<p>Ich möchte noch ein klein wenig bei der bis dato sehr allgemeinen und abstrakten Betrachtungsweise des Projektmanagements bleiben, bevor ich die Dinge auf die Software-Entwicklung konkretisiere. Denn aus meiner Sicht kann man ganz allgemein unter Projektmanagement einfach die Aufgaben verstehen, allen Beteiligen</p>
<ul>
<li>die benötigten Informationen zu liefern,</li>
<li>die notwendigen organisatorischen Maßnahmen (bzgl. Meetings, Listen, Dokumente) zu übernehmen,</li>
<li>bei der Bewältigung von technischen, sozialen oder anderweitigen Problemstellungen zu helfen,</li>
<li>den Überblick über das Projektgeschehen zu haben und zu vermitteln.</li>
</ul>
<p>Betrachtet man meine obige &#8220;naive&#8221; Beschreibung des Projektmanagements näher, stellt man fest, dass die Aufgaben sich stark dem Aufgabenbereich z.B. eines Sekretärs oder einer ähnlicher Bürokraft annähern. Insofern ist die Aussage für mich zulässig, dass ein Projektmanager für ein Projekt und alle Beteiligten im positiven Sinne nichts anderes als eine Hilfskraft darstellt.</p>
<p>Ich möchte keineswegs den Berufsstand oder die Kompetenzen des &#8220;Projektmanagers&#8221; dadurch mindern &#8211; aber dennoch klar feststellen, das Projektmanagement in erster Instanz nichts mit Mitarbeiter- oder Teamführung zu tun hat.</p>
<h3>Projektmanagement in der Software-Entwicklung</h3>
<p>Vielmehr beschäftigt sich ein Projektmanager mit Kennzahlen, Analysen oder Rahmenbedingungen wie z.B. Zeit-, Ressourcen- und Budgetplanung. Das ist vor Allem in der Software-Entwicklung eine nicht zu unterschätzende Aufgabe, schließlich ist Software ein &#8220;weiches&#8221;, während der Konstruktion schwer greifbares Produkt.</p>
<p>Hier kommt ein in meinen Augen ganz wesentlicher Aspekt, den jeder Software-Projektmanager im Fokus haben sollte: Die Arbeit am Produkt und das Produkt so gut wie möglich &#8220;greifbar&#8221; zu machen. Greifbar nicht nur im Sinne von Metriken für Fortschritt, Dauer, Leistung, Fehlerquote oder ROI. Nein, ich meine überdies andere Dinge, wie z.B. die Visualisierung des Produktes in Form von Continuous Build / Integration, Test- oder Betaversionen, klare Anforderungs- und Informationskanäle mit geeignetem und auf das Team abgestimmten Toolset, leicht verständliche, einfache Prozesse zur Organisation der Arbeitsabläufe oder konkrete Koordinationsunterstützung mit Hilfe von Meetings, Zusammenfassungen und Dokumentationen.</p>
<p>Leider ist es oftmals der Fall, das Projektmanager aber auch andere Dinge tun. Ein besonderes Steckenpferd scheint dabei das Mitwirken bei technischen Entscheidungen zu sein. Manchmal geht das sogar soweit, das der Projektmanager die Richtung geradezu vorgibt. Man mag argumentieren, das in der Software-Entwicklung öfters Projektmanager schon eine &#8220;Entwickler-Vergangenheit&#8221; nachweisen können. Das alleine rechtfertigt eine technische Mitbestimmung meiner Meinung nach noch lange nicht. </p>
<p>Im Gegenteil, es wird dadurch für Entwickler und Manager nicht einfacher &#8211; während der Entwickler dem Manager mangelnde Detailkenntnisse entgegenwirft, entgegnet der Manager dem Entwickler seine Einschätzung zu Aufwendungen und Vorgehensweisen. Ich bin mir sicher, das viele Entwickler schon die Sätze &#8220;Der Bugfix dauert niemals so lange&#8221;, &#8220;Das kann man doch einfach runter programmieren&#8221; oder &#8220;In PHP ist das ganz easy&#8221; aus dem Munde des Projektmanagers gehört haben. Diese Aussage sollte nicht missverstanden werden &#8211; jeder Projektmanager darf und kann aus einer &#8220;Entwickler-Vergangenheit&#8221; Vorteile und Erfahrungen in seine jetzige Aufgabe einbringen &#8211; nur das &#8220;Wie?&#8221; ist entscheidend.</p>
<p>Abgesehen davon legen manche Projektmanager besonderen Wert darauf, die anstehenden Aufgaben den Entwicklern zuzuweisen und aktiv an der Arbeitsaufteilung mitzuwirken. Der Projektmanager hat zugegebenermaßen den &#8220;Überblick&#8221;. Aus seiner Perspektive ist er also im Idealfall wie ein Schachspieler, der das Spielfeld bzw. die Spielsituation überblickt und entscheidet, welche Spielfigur für den nächsten Zug eingesetzt wird und wie sich dadurch die Spielsituation verändert. </p>
<p>Die Fehleinschätzung dabei ist aus meiner Sicht schlicht und einfach die Tatsache, das man Software-Entwicklung nicht mit Schach vergleichen kann. Im Schach gibt es einen Gegner, kein Zeitdruck, keine Korrektur des Spielzugs, keine variable Leistung der Spielfiguren, keine äußeren Einflüsse und ein festes Reglement.</p>
<p>In der Software-Entwicklung jedoch gibt es all dies nicht. Dafür spielen andere Faktoren eine große Rolle. Das Know-How jedes einzelnen Entwicklers, die technologische Plattform, die Anforderungen und Wünsche des Kunden und vieler Abteilungen, die Altlasten, Fehler und Wartungsmechanismen, das Teamwork der Entwickler. Insofern ist es geradezu eine Überheblichkeit, das ein Projektmanager sich selbst zumutet, die Einschätzung über Aufgabenverteilung zu übernehmen oder zu steuern.</p>
<h3>Aliges Software-Management: Rettung oder Untergang ?</h3>
<p>Nun, mittlerweile ist in nahezu jeder professionellen Software-Entwicklung das Thema &#8220;<a href="http://de.wikipedia.org/wiki/Agile_Softwareentwicklung">Agile Software-Entwicklung</a>&#8221; angekommen und wird auch schon breit praktiziert. Methoden wie <a href="http://de.wikipedia.org/wiki/Scrum">Scrum</a> oder <a href="http://de.wikipedia.org/wiki/Crystal_Family">Crystal</a> bringen neue Denk- und Arbeitsweisen ins Management. Das interessante an den agilen Ansätzen ist die latente Ignoranz der klassischen Projektmanager-Rolle gegenüber. So ist z.B. in Scrum weit und breit kein Projektmanager in Sicht. Statt dessen gibt es <a href="/?p=547">Scrum Master und Product Owner</a>. Es liegt die Schlußfolgerung nahe, das man ja eigentlich gar keinen Projektmanager benötigt.</p>
<p>Die Wahrheit liegt wie so oft in der Mitte. Obwohl es bei agilen Managementmethoden wie Scrum keine &#8220;echten&#8221; Projektmanager gibt, gibt es sie doch. Die &#8220;Reinkarnation&#8221; des Projektmanagers kommt dabei in vielschichtigen Formen. Der Scrum Master ist so eine Reinkarnation &#8211; er übernimmt klassische technische und soziale Teamaufgaben und hilft bei Koordination und Organisation. Der Product Owner kümmert sich um das &#8220;geschäftliche&#8221;, also Kunden, Anforderungen, Budgets und zeitliche Abläufe. Die übrigen Aufgaben des Projektmanagements werden auf das gesamte Team verteilt. Doch der Projektmanager als Person ist von der Bildfläche verschwunden.</p>
<p>Wenn man diese &#8220;reine Scrum-Lehre&#8221; in größeren Projekten oder Organisationen umsetzt und lebt, stellt man schnell fest, das <a href="/?p=78">Scrum kein einfaches Management-Modell</a> ist. Die &#8220;Eliminierung&#8221; des Projektmanagers aus dem Vorgehensmodell bürdet den bleibenden Rollen automatisch Teilaufgaben eines Projektmanagers auf. Nach einigen Monaten spürt jeder in einem Scrum-Team, das das managen von Projekten keine leichte, erquickende Aufgabe ist. Obgleich es eine gute Idee ist, die Verantwortung des Projektes auf mehrere Schultern zu verteilen und das Team durch das gemeinschaftliche Verantwortungsbewusstsein zu stärken, ist deren Umsetzung ungleich schwerer.</p>
<h3>Master oder Owner, das ist hier die Frage</h3>
<p>An dieser Stelle möchte ich nicht zu tief in die Unwegsamkeiten und Potenziale von Scrum eintauchen und den Blick wieder auf den klassischen Projektmanager und dessen Aufgaben fokussieren. Einem Projektmanager bleibt in agilen Projekten und Modellen wie z.B. Scrum eigentlich nur die Wahl, sich für eine der Rollen (Scrum Master oder Product Owner) zu entscheiden. Die meisten wählen den Pfad des Scrum Masters &#8211; auf den ersten Blick scheint der Scrum Master mehr mit einem Projektmanager gemein zu haben als der Product Owner.</p>
<p>Die Entscheidung, ob der originäre Projektmanager ein Scrum Master oder Product Owner werden soll, ist meiner Meinung nach eine Frage des menschlichen Charakters und der Fähigkeiten. Die essentielle Entscheidungsgrundlage ist dabei die Erkenntnis eines wichtigen Unterschieds zwischen Scrum Master und Product Owner: Während der Scrum Master ein &#8220;Projektbegleiter&#8221; ist, ist der Product Owner ein &#8220;Projektführer&#8221;. Der eingangs erwähnte klassische Anspruch, das ein Projektmanager &#8220;Führungsaufgaben&#8221; übernimmt, wird in Scrum eher dem Product Owner zugeschrieben. Der Scrum Master allerdings ist der &#8220;Begleiter&#8221;. Er deckt die Sicht des Entwicklers auf den Projektmanager, worin dieser wie schon beschrieben nur &#8220;Miittel zum Zweck&#8221; oder eine Hilfskraft darstellt.</p>
<p>Ist also ein Projektmanager stark in den Disziplinen Kundenkontakt, Analyse, Steuerung, Budgetierung und hat das &#8220;Führungs-Gen&#8221;, dann sollte er sich mit der Rolle des Product Owners anfreunden. Ist er jedoch stark bei technischer Kenntnis, sozialem Umgang, Hilfsbereitschaft, Metriken und Dokumentation (siehe <a href="http://www.12manage.com/methods_greenleaf_servant_leadership_de.html">Servant Leadership</a>), ist für Ihn wohl eher der Scrum Master ein geeignetes Tätigkeitsfeld.</p>
<h3>Einsichten &#038; Erkenntnisse</h3>
<p>Aus all diesen Gedanken heraus erschließt sich für mich die Erkenntnis, das die klassische Rolle des Projektmanagers ausgedient hat &#8211; ja sogar mittel- bis langfristig zum Aussterben verurteilt ist. Denn für Software-Unternehmen ist es entscheidend, Projekte und deren Durchführung stetig zu verbessern &#8211; also besser steuern, kontrollieren und hervorsagen zu können. Die &#8220;Zertrümmerung&#8221; der Aufgaben, Wirkungsbereiche und Verantwortlichkeiten eines klassischen Projektmanagers in verschiedene, spezialisierte &#8220;Unter-Rollen&#8221; ist dabei für mich eine normale, evolutionäre Entwicklung. Die Dezentralisierung des Managements parallelisiert die Durchführung der Aufgaben, beschleunigt die Teilumsetzung bei gleichzeitiger Optimierung durch Spezialisierung. </p>
<p>Natürlich bleibt die Gefahr des Scheiterns bei diesem agilen Modell, ist aber durch die Diversifikation der Aufgaben auf die einzelnen Rollen im Vergleich zum klassischen Modell minimiert. Besonders herausfordernd sind die Bereiche Kommunikation und Koordination. Nur durch eine abgestimmte Kommunikation und einfache, prägnante Koordinationsregeln kann aus der Aufgabenteilung ein direkter positiver Effekt erreicht werden.</p>
<p>Für den &#8220;klassischen Projektmanager&#8221; heisst das nicht, das er schwere Zeiten vor sich hat. Im Gegenteil, Projektmanager können und sollten diese Entwicklung für sich nutzen und sich für die einzelnen Teilaufgaben spezialisieren. Zumindest gilt das für die operative Ebene. Für besonders kompetente und erfahrene Projektmanager tut sich ein neues Tätigkeitsfeld auf, denn durch die Dezentralisierung der Aufgaben entsteht der Bedarf des koordinierten Bündelns und Steuerns der operativen Teile aus der strategischen Ebene heraus.</p>
<p>Ich als Entwickler freue mich für meine Kollegen, denn für die Entwickler bedeutet dieser Schritt zur Optimierung des Managements mehr Verständnis und aktive, effektive Unterstützung auf Entwicklungsebene. Die Informationskanäle werden durch Konsolidierung geringer und man kann sich besser auf seine Aufgaben konzentrieren. Des Weiteren wird der Entwickler mehr in die Verantwortung für seine Tätigkeit genommen. In den meisten Fällen geht das einher mit einer gesteigerten Anerkennung der Leistung des Entwicklers bei gleichzeitiger Professionalisierung im Sinne von Mitwirkung, Kommunikation und Detailplanung.</p>
<p>Es bleibt spannend!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/die-zukunft-des-projektmanagers-in-der-software-entwicklung/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Effektives &amp; effizientes Bug Reporting</title>
		<link>http://www.gmbsg.com/effektives-effizientes-bug-reporting/</link>
		<comments>http://www.gmbsg.com/effektives-effizientes-bug-reporting/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 06:48:36 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Works]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=82</guid>
		<description><![CDATA[In letzter Zeit hatte ich das Vergnügen, mich mit ein paar (vermeintlichen und echten) Bugs auseinanderzusetzen. In diesem Zusammenhang hat das Thema Bug Reporting mein Interesse geweckt. Ich gebe zu, das hört sich ziemlich komisch an &#8211; denn was ist ...]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit hatte ich das Vergnügen, mich mit ein paar (vermeintlichen und echten) Bugs auseinanderzusetzen. In diesem Zusammenhang hat das Thema Bug Reporting mein Interesse geweckt. Ich gebe zu, das hört sich ziemlich komisch an &#8211; denn was ist denn an Bug Reports schon so besonders?</p>
<p>Jedoch fiel mir nach kurzem Einlesen in das Thema schnell auf, das man nicht einfach so &#8220;nur einen Bug Report&#8221; erstellen kann, sondern das auch bei Bug Reports ausgefeilte Methoden angewendet werden. Besonders interessant sind dabei die Zusammenhänge zum Anforderungsmanagement und zum Testing.</p>
<p>Meine Erkenntnisse über das Bug Reporting habe ich in dem Artikel <b><a href="/works/index.php?title=Effektives_und_effizientes_Bug_Reporting">Effektives &#038; effizientes Bug Reporting</a></b> zusammengefasst. </p>
<p>Happy debugging!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/effektives-effizientes-bug-reporting/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scrum Erstkontakt &#8211; Was ist Scrum?</title>
		<link>http://www.gmbsg.com/scrum-erstkontakt-was-ist-scrum/</link>
		<comments>http://www.gmbsg.com/scrum-erstkontakt-was-ist-scrum/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 20:30:26 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=547</guid>
		<description><![CDATA[Scrum (engl. das Gedränge) ist eine Sammlung von Arbeitstechniken, Strukturen, Rollen und Methoden für das Projektmanagement im Rahmen agiler Softwareentwicklung. Es ist ein Vorgehensmodell, das wenige Festlegungen trifft. Teams bzw. Entwickler organisieren sich weitgehend selbst und wählen auch die eingesetzten ...]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Scrum</strong> (engl. das Gedränge) ist eine Sammlung von Arbeitstechniken, Strukturen, Rollen und Methoden für das Projektmanagement im Rahmen agiler Softwareentwicklung. Es ist ein Vorgehensmodell, das wenige Festlegungen trifft. Teams bzw. Entwickler organisieren sich weitgehend selbst und wählen auch die eingesetzten Methoden. Das Vorgehen und die Methoden werden fortlaufend aktuellen Erfordernissen angepasst.</p>
<div class="right"><small><a href="http://de.wikipedia.org/wiki/Scrum">http://de.wikipedia.org/wiki/Scrum</a></small></div>
</blockquote>
<p>Die o.g. Beschreibung aus Wikipedia trifft im Großen und Ganzen das, was Scrum ist und wofür es eingesetzt wird. Scrum ist eine relativ junge Verfahrensmethodik in der Software-Entwicklung. Nichtsdestotrotz wird es schon oft und gerne angewendet. Als &#8220;Interpretation&#8221; des <a href="http://agilemanifesto.org">Agilen Manifests</a> gilt Scrum als ein agiles und sehr leichtgewichtiges Rahmenwerk für Management in der Software-Entwicklung.</p>
<p>Ein erster und leicht zu merkender Überblick über Scrum als agiles Framework lässt sich im Kern durch die &#8220;3&#215;3&#8243;-Regel schaffen:</p>
<ul>
<li><strong>Drei Gremien</strong>:
<ul>
<li>Daily Scrum &#8211; Die tägliche Einsatzbesprechung;</li>
<li>Sprint Planung &#8211; Planung eines Arbeitszyklusses;</li>
<li>Sprint Review &#8211; Der Abschluss einer Arbeitsphase und die Abnahme eines Arbeitspaketes.</li>
</ul>
</li>
<li><strong>Drei Artefakte</strong>:
<ul>
<li>Product Backlog &#8211; Eine priorisierte Liste aller Anforderungen;</li>
<li>Sprint Backlog &#8211; Eine Liste von Aufgaben zur Erfüllung eines Arbeitspaketes;</li>
<li>Release Plan &#8211; Eine Prognose und Vorausplanung der Veröffentlichungsdaten des Produktes.</li>
</ul>
</li>
<li><strong>Drei Rollen</strong>:
<ul>
<li>Product Owner &#8211; zuständig für den wirtschaftlichen Erfolg und das Produkt;</li>
<li>Scrum Master &#8211; wacht über die Methodik und die Produktivität des Teams;</li>
<li>Team &#8211; das selbst-organisierte, teilautonome Team.</li>
</ul>
</li>
</ul>
<h3>Gremien</h3>
<p>Die Hauptaufgabe allen Software-Managements ist unbestritten die Organisation, Koordination und Planung der<br />
 Software-Entwicklung. Wie auch bei anderen Management-Frameworks gibt es in Scrum wohldefinierte Ankerpunkte, die die Kommunikation fördern. Wie zuvor schon erwähnt, gibt es dazu in Scum drei wesentliche Gremien (oder Institutionen).</p>
<h4>Daily Scrum</h4>
<p>Das Daily Scrum (auch &#8220;Daily&#8221; oder &#8220;Huddle&#8221;) ist das essentielle Organisations-Element in Scrum. Hier ist die Empfehlung, ein komplettes Team-Meeting (das Daily) jeden Tag zur gleichen Zeit am gleichen Ort durchzuführen. Das Meeting sollte nicht länger als 15 Minuten dauern und dient dem täglichen Status-Austausch und Feedback innerhalb des Teams. Während des Meetings werden die drei sog. &#8220;Scrum-Fragen&#8221; an jeden Teilnehmer mit der bitte um zügige und kurze Antwort gestellt:</p>
<ul>
<li>Was hast Du gestern getan?<br/><i>&#8220;Bist Du gestern mit dem fertig geworden, was Du Dir vorgenommen hast?&#8221;</i></li>
<li>Was wirst Du heute tun?<br/><i>&#8220;Welche Aufgaben wirst Du bis zum nächsten Meeting bearbeiten?&#8221;</i></li>
<li>Alles ok?<br/><i>&#8220;Gibt es ein Problem, das Dich bei Deiner Aufgabe blockiert / hindert?&#8221;</i></li>
</ul>
<h4>Sprint Planung</h4>
<p>Zu Beginn eines Sprints wird ein Planungsmeeting abgehalten, bei dem die Ziele und Aufgaben der gesamten Sprintdauer besprochen und geplant werden. Zunächst werden aus dem Product Backlog (der groben Anforderungsliste) die nächsten anstehenden Anforderungen besprochen und geklärt. </p>
<p>Daraufhin wird das sog. &#8220;Commitment&#8221; durchgeführt; es wird also eine Zusage über die zu erledigenden Dinge innerhalb des nächsten Sprints herbeigeführt. Anschließend wird das Commitment detailliert geplant und die einzelnen Aufgaben zur Erfüllung der Anforderungen abgeleitet. Diese Liste wiederum bildet das Sprint Backlog.</p>
<h4>Review &#038; Retro</h4>
<p>Nach einem Sprint wird ein sog. Review (meist auch nur &#8220;Demo&#8221; genannt) durchgeführt. Das Sprint-Review dient vornehmlich zum Vorzeigen und Diskutieren der Ergebnisse des Sprints. Im Review-Meeting wird zumeist die neu geschaffene Funktionalität der Software dem Kunden und dem Team vorgeführt (Demo). Des Weiteren wird ein allgemeines Feedback abgefragt bzw. eine offene Diskussionsrunde abgehalten. </p>
<p>Ähnlich zum Review wird zum Ende eines Sprints auch eine &#8220;Retrospektive&#8221; abgehalten, in der explizit die Meinungen, Hürden und Verbesserungsmöglichkeiten im Team diskutiert werden. Diese werden festgehalten und für die nächste Sprint-Planung in Betracht gezogen. So können z.B. methodische oder arbeitstechnische Verbesserungen während der Entwicklung erkannt und durchgeführt werden. </p>
<p>Der Unterschied zwischen Review und Retro liegt in der Betrachtungsweise des Sprints: Während beim Review auf das &#8220;Was&#8221; geachtet wird, liegt der Schwerpunkt der Retro auf dem &#8220;Wie&#8221;. Nichtsdestotrotz werden Review und Retro öfters in ein Meeting zusammengefasst.</p>
<p>Es fällt deutlich auf, das Scrum wenige Vorgaben enthält und sich gegen definierte Prozesse und Arbeitsabläufe stellt. Der Kern dieser &#8220;Scrum-Ethik&#8221; bedründet sich durch das Argument, das Software-Entwicklung ein derart komplexer und variabler Prozess ist, dass es niemals in ein definiertes, prozessuales Korsett eingefasst werden kann. Vielmehr wird davon ausgegangen und akzeptiert, das der Prozess der Software-Entwicklung ein semi-chaotischer ist, dem man nur durch empirische Management- und Kontroll-Mechanismen Herr werden kann.</p>
<h3>Artefakte</h3>
<p>Dementsprechend ist auch das Planungs- und Aufgabenmanagement minimal. Scrum definiert nur drei essentielle Listen.</p>
<h4>Product Backlog</h4>
<p>Das Product Backlog ist eine Liste mit allen Anforderungen, Aufgaben, Features, Bugs und Problemstellungen für das Produkt. Die einzelnen Einträge in der Product Backlog-Liste werden nach kundenorientierter Priorität (z.B. Geschäftszweck, Benefit) und Komplexität sortiert. Dabei muss es für diese keine Kennzahlen geben, alleine die Sortierung des Product Backlogs ist entscheidend. Die Product Backlog-Liste ist öffentlich für alle Teammitglieder verfügbar und kann jederzeit geändert und erweitert werden. Jeder Eintrag bedarf auch einer ersten Schätzung des Aufwandes.</p>
<h4>Sprint Backlog</h4>
<p>Der Sprint Backlog ist eine Liste von Aufgaben, die innerhalb eines Sprints (i.d.R. eine 2-4 wöchige Iteration) durchgeführt werden soll. Der Sprint Backlog wird zu Beginn eines Sprints erstellt und innerhalb dessen abgearbeitet. Im Gegensatz zum Product Backlog ist hier die Sortierung nicht entscheidend, kann aber weitergeführt werden. </p>
<p>Viel wichtiger ist hier die Vorgabe, dass eine einzelne Aufgabe des Sprint Backlogs nicht länger als 3 Tage dauern sollte (je kürzer, desto besser). Ist dies dennoch der Fall, sollte die Aufgabe in Teilaufgaben zerlegt werden. Des Weiteren werden beim erstellen des Sprint Backlogs alle Aufgaben nochmals in der Schätzung verfeinert.</p>
<h4>Release Plan</h4>
<p>Der Release Plan ist eine Liste der definierten &#8220;Meilensteine&#8221; eines Software-Produkts, bei dem eine Veröffentlichung fachlich, strategisch oder unternehmerisch angebracht ist. Der Release Plan richtet sich nach der &#8220;Velocity&#8221; des Teams (also nach dem Produktivitätsgrad). Der Release Plan ist zumeist ein Prognose-Barometer und ein Kernelement der Integration des Scrum-Teams in die Organisation eines Unternehmens bzw. anderer Abteilungen. </p>
<h3>Rollen</h3>
<p>Scrum definiert drei unterschiedliche und klar getrennte Rollen: Den &#8220;Product Owner&#8221;, den &#8220;Scrum Master&#8221;, sowie das &#8220;Team&#8221;. Alle drei verfolgen während des Entwicklungsprozesses das gleiche Ziel, nämlich die &#8220;Vision&#8221; der zu entwickelnden Software.</p>
<h4>Product Owner</h4>
<p>Der Product Owner (oder auch nur &#8220;Owner&#8221;) ist derjenige, der die &#8220;geschäftliche&#8221; oder &#8220;fachliche&#8221; Seite der zu entwickelnden Software vertritt. Er ist also letztendlich der Kunde bzw. Kundenvertreter, der die fertige Software entgegennimmt und den Wert der Software ausschöpft. Innerhalb des Scrum ist der Product Owner eine einzelne Person (darauf legt sich das Scrum-Verfahren fest).</p>
<p>Er ist derjenige, der die Anforderungen an die Funktionalität der Software stellt und arbeitet dementsprechend die Anforderungen und Aufgaben mit den anderen Team-Mitgliedern in das Product Backlog ein. Er ist für die Priorisierung der Aufgaben zuständig und damit auch für das Zustandekommen des Sprint Backlogs.</p>
<h4>Scrum Master</h4>
<p>Der Scrum Master (im Alltag meist nur &#8220;SM&#8221; genannt) ist eine einzelne Person (auch hier eine Vorgabe von Scrum), die sich um die Einhaltung der Scrum-Regeln und Verfahrensweisen kümmert. Überdies hinaus ist der Scrum Master für &#8220;das Wohlergehen&#8221; des Teams zuständig &#8211; und zwar im Sinne von Problembehebung, Unterstützung, Motivation und Coaching.</p>
<p>Er ist quasi ein &#8220;Projekt-Manager-Ersatz&#8221;, allerdings ohne Weisungsbefugnis, disziplinarische oder fachliche Führung. Des Weiteren ist der Scrum Master faktisch weder ein Teil des Teams noch aus den Reihen des Product Owners &#8211; er hat also eine quasi &#8220;unparteiische&#8221; Rolle. Obwohl in Scrum oft empfohlen wird, dass der Scrum Master eine Person aus dem Team ist (z.B. ein Entwickler), ist in der Praxis der Scrum Master zumeist ein &#8220;klassischer&#8221; Projekt-Manager, der maßgebliche Verantwortungen an das Team und den Product Owner übergibt.</p>
<p>Trotz dieser &#8220;Verantwortungslosigkeit&#8221; ist der Scrum Master Dreh- und Angelpunkt des Scrum-Verfahrens. Er ist explizit dafür verantwortlich, das alles so gut wie nur möglich ablaufen kann.</p>
<h4>Team</h4>
<p>Das Team ist die einzige Rolle in Scrum, die mehrere Personen umfassen darf. Hier wird explizit auf Hierarchien und Verantwortlichkeiten verzichtet, jeder einzelne des Teams ist einfach &#8220;nur&#8221; ein Team-Mitglied. Das Team besteht meist aus Personen verschiedener Expertise oder Abteilungen, wie z.B. Entwickler, Architekten, Administratoren, Analysten und Testern. </p>
<p>Als Rolle ist das Team dasjenige mit der meisten Verantwortung und Wirkungskraft, denn es entscheidet eigenständig über Aufgabenverteilung und -organisation, regelt und steuert die Arbeitsweise und &#8220;kontrolliert&#8221; sich idealerweise selbst.</p>
<p>Scrum liefert zum Team eine Reihe von Empfehlungen, zu denen eine Teamgröße von ca. 7 (+/- 2) Mitgliedern zählt. In der Praxis ist dies bei größeren Projekten kaum machbar, dementsprechend baut man in diesem Fall N Teams mit N Scrum Mastern und N Product Ownern auf.</p>
<h3>Metriken</h3>
<p>Scrum als agiles Framework richtet sich nach den Maßgaben eines empirischen Managements. Es geht von vornherein davon aus, dass Schätzgrößen und Entwicklungsgeschwindigkeit im Laufe eines Software-Projektes immer tendenziell auf Basis von Erfahrungswerten ermittelt werden können. Dies wird in Scrum ermittelt, visualisiert und kontrolliert durch ein sog. &#8220;Burndown-Chart&#8221;.</p>
<h4>Sprint Burndown Chart</h4>
<p>Der Sprint Burndown Chart ist ein täglich aktualisiertes Diagramm, welches die Abarbeitung der einzelnen Aufgaben innerhalb eines Sprints messt und visualisiert. Er ist ein einfaches und zugleich zuverlässiges Mittel, die Entwicklungsgeschwindigkeit messbar zu machen und Problemstellungen während der Entwicklung oder der Anwendung von Scrum zu identifizieren. Der Sprint Burndown ist ein essentielles Werkzeug von Scrum.</p>
<h4>Product Burndown Chart</h4>
<p>Ergänzend zum Sprint Burndown erstellt man des öfteren ein Release/Product Burndown Chart, der aus der Sicht der Product Backlog Einträge und deren Abarbeitung ein Diagramm darstellt. Er ist besonders für die Sprint-Übersicht und die Voraussage von Sprintanzahl bzw. übergreifenden Terminen hilfreich.</p>
<h3>Kickstart: Einsatz &#038; Durchführung</h3>
<p>Bevor ein Software-Projekt mit Scrum überhaupt durchgeführt werden kann, muss &#8211; wie bei jedem Projekt &#8211; ein Projektziel und eine &#8220;Vision&#8221; des Projektes greifbar sein.</p>
<p>Es gibt viele klassische und agile Methoden, die bei dieser ersten Phase des Projektes helfen, eine Projektziel zu erfassen. Generell aber gilt: Es sollte von Anfang an eine klare Fokussierung eines Ziels möglich sein. Dies umfasst nicht nur die &#8220;visionäre&#8221; Zielsetzung, sondern auch geschäftliche Faktoren (Nutzen, Markt, Einsatz) sowie einen grundlegenden Umfang der zu erstellenden Software. </p>
<h4>Fundament: Team &#038; Rollen</h4>
<p>Sind diese grundlegenden Bausteine des Projektes geklärt, kann man zur Bildung des Scrum-Teams übergehen. Grundsätzlich sollten in dieser Phase schnellstmöglich alle Scrum-Rollen besetzt werden. Hierbei hilft oft das sog. &#8220;Best-Match&#8221;-Prinzip, deren Kernaussage es ist, eine bestmögliche Besetzung der Rollen anzustreben.</p>
<h4>Product Backlog: Die Anforderungsliste</h4>
<p>Sind Product Owner, Scrum Master sowie das Team formiert, kann quasi sofort &#8220;losgelegt&#8221; werden. Doch bevor es so &#8220;richtig losgeht&#8221;, muss der Product Owner initial das Product Backlog mit dem für Ihn wichtigsten Anforderungen befüllen. Die Einträge im Product Backlog sind nach geschäftlicher (kundenorientierter) Priorität aufgelistet, so dass immer gewährleistet ist, dass das Team an den &#8220;richtig wichtigen&#8221; Aufgaben arbeitet. Die wichtigsten Anforderungen im Product Backlog werden auch genauer und ausführlicher beschrieben und definiert. Das Team hilft dem Product Owner bei dieser Aufgabe und schätzt gleichzeitig grob die Aufwände jedes Product Backlog Eintrages.</p>
<h4>Sprint-Planung: Das Versprechen des Teams</h4>
<p>Nach erfolgreicher Befüllung des Product Backlogs kann &#8220;gesprintet&#8221; werden. Das Team wird also sofort produktiv. Doch bevor es an die Abarbeitung der Aufgaben geht, wird der bevorstehende Sprint im Sprint Planungs-Meeting geplant. Dabei wird die wichtige Entscheidung getroffen, wieviele Product Backlog Einträge das Team im Sprint abarbeiten kann. Die Entscheidung des Sprint-Volumens obliegt einzig und allein dem Team. </p>
<h4>Sprint Backlog: Die Aufgabenliste</h4>
<p>Um diese Entscheidung qualifiziert herbeiführen zu können, wird ein Product Backlog Eintrag (Anforderung) analysiert und in einzelne, kleine Aufgabenpakete granularisiert. Diese Aufgabenstellungen werden möglichst genau geschätzt und in das Sprint Backlog eingetragen. Hier wird auch die Grundregel angewendet, dass eine Sprint Backlog-Aufgabe nicht länger als 3 Tage andauern darf.</p>
<p>Als Ergebnis der Sprint-Planung liegt ein befülltes Sprint Backlog vor, welches zugleich das sog. &#8220;Commitment&#8221; (feste Absichtserklärung) an den Product Owner ist, dass alle diese Aufgaben zum Ende des Sprints erledigt sein werden.</p>
<h4>Sprint: Daily Scrum &#038; Work</h4>
<p>Von nun an werden alle Sprint Backlog-Einträge vom Team abgearbeitet. Dabei organisiert sich das Team selbst &#8211; legt also eigenständig fest, wer an welcher Aufgabe arbeitet. Auch hier wird eine besondere Faustregel angewendet, nämlich dass jedes Teammitglied nur eine einzige Aufgabe im Sprint Backlog übernehmen darf.</p>
<p>Diese Selbstorganisation während des Sprintverlaufs wird durch das &#8220;Daily Scrum&#8221;, also die tägliche kurze Einsatzbesprechung des Teams gestützt und gefördert. Im Daily Scrum werden Aufgaben aktualisiert und verteilt sowie grundlegende Status-Informationen an alle Teammitglieder mitgeteilt.</p>
<h4>Sprint-Review: Das Ergebnis</h4>
<p>Neigt sich der Sprint dem Ende zu, werden zum Abschluß zwei Meetings durchgeführt. Das erste Meeting ist das sog. &#8220;Sprint-Review&#8221;, in dem die Ergebnisse des Sprints dem Product Owner präsentiert werden und zur Abnahme vorliegen. Im Review entscheidet der Product Owner, ob das zu Beginn des Sprints gegebene &#8220;Versprechen&#8221; des Teams eingehalten wurde und ob er mit den Arbeitsergebnissen zufrieden ist. Sollten (Teil-)Ergebnisse unzufriedenstellend sein, werden diese vom Product Owner abgelehnt und werden automatisch zur &#8220;Nachbesserung&#8221; in den nächsten Sprint mit eingeplant.</p>
<h4>Sprint-Retrospektive: Immer besser &#038; besser</h4>
<p>Nach dem Review des Sprints folgt sofort die sog. &#8220;Sprint-Retrospektive&#8221;. In diesem Meeting setzt sich das Team und der Product Owner zusammen um festzustellen, welche grundlegenden Probleme es beim Sprint gab bzw. um herauszufinden, wie man in den Sprints besser arbeiten kann. Die Retrosüektive kümmert sich also um die Verbesserung des Teams, der Methoden und Prozesse. Als Ergebnis werden Verbesserungsvorschläge und Maßnahmen in das Product Backlog eingearbeitet.</p>
<h4>Nochmal, nochmal</h4>
<p>Nach erfolgreichem Abschluß des Sprints geht &#8220;das Spiel wieder von vorne los&#8221;, d.h. es wird sofort wieder der nächste Sprint geplant und umgesetzt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/scrum-erstkontakt-was-ist-scrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
