<?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</title>
	<atom:link href="http://www.gmbsg.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gmbsg.com</link>
	<description>So einfach wie möglich. Aber nicht einfacher.</description>
	<lastBuildDate>Thu, 04 Mar 2010 08:35:57 +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>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[Aktuell]]></category>
		<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>1</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[Topthema]]></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>ASP.NET MVC is not XHTML compliant</title>
		<link>http://www.gmbsg.com/asp-net-mvc-is-not-xhtml-compliant/</link>
		<comments>http://www.gmbsg.com/asp-net-mvc-is-not-xhtml-compliant/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 21:58:10 +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[Web]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[HtmlHelper]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=639</guid>
		<description><![CDATA[Der Titel hat es in sich. ASP.NET MVC ist nicht XHTML konform! Zugegeben, eine etwas reißerische, provokante Aussage &#8211; aber völlig korrekt. Ich habe mich in letzter Zeit mit dem HtmlHelper und Erweiterungen zu dem Helper etwas näher beschäftigt. Wie ...]]></description>
			<content:encoded><![CDATA[<p>Der Titel hat es in sich. ASP.NET MVC ist nicht XHTML konform! Zugegeben, eine etwas reißerische, provokante Aussage &#8211; aber völlig korrekt. Ich habe mich in letzter Zeit mit dem HtmlHelper und Erweiterungen zu dem Helper etwas näher beschäftigt. Wie es so ist, wenn man Extensions zum HtmlHelper entwickelt, habe ich natürlich den TagBuilder eingesetzt.</p>
<p>Zügiger als es mir selbst lieb gewesen ist stellte ich durch meine Tests fest, daß der TagBuilder beim Element-Namen sowie allen Attribut-Namen Groß- und Kleinschreibung beachtet:</p>
<pre class="brush: csharp">
[Test]
public void Cms_Tag_With_Invalid_Slot_Returns_Div_Only()
{
  CmsTag cmsTag = new CmsTag();
  int invalidSlot = 0;

  string cmsContainer = cmsTag.GetContainer(invalidSlot);
  Assert.AreEqual("&lt;div&gt;&lt;/div&gt;", cmsContainer);
}
</pre>
<p>Der Test sieht ja ganz passabel aus. Aber als ich dann die Methode dazu implementiert habe, ungefähr so:</p>
<pre class="brush: csharp">
public string GetContainer(int slot)
{
  TagBuilder tagBuilder = new TagBuilder("DIV");

  if (slot < 1)
    return tagBuilder.ToString();

  // ab hier geht es mit dem echten slot weiter...
}
</pre>
<p>machte es mich stutzig, dass mein Test immer noch rot war. Wieso? Na klar, ich hatte im Konstruktor des TagBuilders den Element-Namen groß geschrieben ("DIV"), während ich es im Test klein schrieb ("&lt;div&gt;&lt;/div&gt;"). Hmm. Ich musste überlegen. Warum habe ich denn im Test das DIV klein erwartet?</p>
<p>Na Klar! Meine Gewohnheit hatte mich eingefangen. Denn ich bin es gewohnt, alle Tags und Attribute klein zu schreiben. Nicht nur etwa, weil mir es so besser gefällt - sondern aus einem ganz praktischen und gleichermaßen wichtigen Grund: <a href="http://de.wikipedia.org/wiki/Extensible_Hypertext_Markup_Language">XHTML</a>.</p>
<p><a href="http://www.w3.org/TR/xhtml1/#h-4.2">XHTML verlangt alle Element-Namen und Attribut-Namen explizit kleingeschrieben</a>. Also soetwas wie <code>&lt;DIV ID="test"&gt;</code> ist schon mal grundsätzlich nicht XHTML-konform.</p>
<p>Nach dieser lapidaren Feststellung, dass der Tagbuilder Tags und Attribute so annimmt, wie man sie angegeben hat, machte ich mit Gedanken über das "Wieso". Der Fix hin zur XHTML-Konformität ist ja schließlich trivial. Statt des großgeschriebenen "DIV" im Konstruktor des TagBuilders einfach ein kleingeschriebenes "div" - das sollte es gewesen sein. Doch damit wollte ich mich nicht zufrieden geben. Denn mir war klar, die gleiche Konvention gilt schließlich auch für Attribute. So etwas wie:</p>
<pre class="brush: csharp">
TagBuilder builder = new TagBuilder("div");
builder.Attributes.Add("Title", "This is strange.");
</pre>
<p> würde das Problem wieder hervorrufen. Im Übrigen ist das Problem gerade bei dem schönen "Syntactic Sugar" mit der Kombination Anonymer Typ + Objekt-Initialisierer wirklich mehr als unschön - ich würde sogar sagen absolut störend.</p>
<p>Konsequenterweise kann das nicht der Weisheit letzter Schluß sein. Nach ein paar Minuten gründlicher Überlegung und der Durchsicht des Source-Codes des TagBuilders kam ich zur unweigerlichen Einsicht, dass der TagBuilder nicht (oder nur halbherzig) für XHTML-konforme Dokumente entwickelt wurde. Schade, denn deutliche Hinweise gibt es ja (z.B. mit dem TagRenderMode). Das führt dann unweigerlich zur Frage, ob man generell den TagBuilder umschreiben sollte, oder um einen "XHTML-Konformitätsmodus" erweitern sollte. Im Raum stünden dann drei wesentliche Varianten:</p>
<pre class="brush: csharp">
// variante 1 - der existierende tagbuilder wird intern umgeschrieben
TagBuilder builder = new TagBuilder("DIV");
string tag = builder.ToString();

// variante 2 - der tagbuilder wird um einen xhtml-modus erweitert
TagBuilder builder = new TagBuilder("DIV");
string tag = builder.ToString(TagRenderConvention.XHtml);

// variante 3 - es gibt einen speziellen (warscheinlich von tagbuilder geerbten) builder
TagBuilder builder = new XHtmlTagBuilder("DIV");
string tag = builder.ToString();
</pre>
<p>Auf den ersten Blick würde ich mich persönlich wohl für die erste Variante entscheiden. Denn schließlich bedeutet XHTML-Konformität ja nicht, dass man nicht mehr HTML-Konform ist. Eine "abwärts"- bzw. "schlechtwärts"-Kompatibilität ist also gegeben. Überdies muss man auch bedenken, daß die meisten Websites heutzutage sowieso sich in Richtung XHTML bewegen (müssen). Ein weiterer Aspekt ist sicherlich die Zukunft mit HTML5, welche XHTML als Grundlage hat.</p>
<p>So, nach dem ich jetzt so viele Worte über ein Problem geschrieben habe, welches mit einem einfachen <code>ToLower()</code> lösbar ist, möchte ich noch ein wenig zur Lösung dieser kleinen Schwierigkeit mit Code beitragen. Doch wer jetzt denkt, ich würde ASP.NET MVC patchen, der hat sich getäuscht. Statt dessen habe ich ein kleines Set von <a href="/wp-content/uploads/2010/02/MvcTagBuilderIsNotXHTMLCompliant.zip">Tests zur XHTML-Konformität</a> geschrieben. Wenn alle Tests grün sind, dann ist der TagBuilder auch XHTML-Konform :-).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/asp-net-mvc-is-not-xhtml-compliant/feed/</wfw:commentRss>
		<slash:comments>2</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>8</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>Let&#8217;s go to Dojo</title>
		<link>http://www.gmbsg.com/lets-go-to-dojo/</link>
		<comments>http://www.gmbsg.com/lets-go-to-dojo/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 22:58:11 +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[4.0]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></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>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=509</guid>
		<description><![CDATA[Es ist wieder soweit, das Münchener .NET Coding Dojo öffnet auch im neuen Jahr die Tore. 
Für alle, die nicht nur still und leiste in ihrem Kämmerchen Code Kata&#8217;s üben möchten. Für alle, die wissen wollen, mit welchen Tricks und ...]]></description>
			<content:encoded><![CDATA[<p>Es ist wieder soweit, das Münchener .NET Coding Dojo öffnet auch im neuen Jahr die Tore. </p>
<p>Für alle, die nicht nur still und leiste in ihrem Kämmerchen Code Kata&#8217;s üben möchten. Für alle, die wissen wollen, mit welchen Tricks und Kniffen man mit Design Patterns, Methoden &amp; TDD zu sauberem Design und Code kommt. Für alle, die sich selbst und andere in Punkto professionelle Softwareentwicklung weiterbringen möchten!</p>
<p>Am Mittwoch, den 20.01. werden im <a href="https://www.xing.com/events/net-coding-dojo-munchen-449437">.NET Coding Dojo</a> wieder .NET Enthusiasten, Software-Entwickler und System-Analytiker ein Programmierproblem annehmen, in Einzelteile zerlegen und es nach eigener Architektur und Bauplan kunstvoll wieder zusammenführen. Sei dabei! </p>
<p>Event-Details &#038; Anmeldung über das <a href="https://www.xing.com/events/net-coding-dojo-munchen-449437">Xing-Event</a> bzw. die <a href="https://www.xing.com/net/netdojo">Xing-Gruppe</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/lets-go-to-dojo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Umbau &#8211; Öfter mal was Neues</title>
		<link>http://www.gmbsg.com/umbau-oefter-mal-was-neues/</link>
		<comments>http://www.gmbsg.com/umbau-oefter-mal-was-neues/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 12:50:52 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Website]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=501</guid>
		<description><![CDATA[Vielleicht ist es dem einen oder anderen schon aufgefallen: Ich baue gerade die Website ein wenig um. Um es konkreter auszudrücken: Ich habe mich dazu entschlossen, die gesamte Website mit Wordpress zu gestalten. Damit verabschiede ich mich von der Wordpress/Mediawiki ...]]></description>
			<content:encoded><![CDATA[<p>Vielleicht ist es dem einen oder anderen schon aufgefallen: Ich baue gerade die Website ein wenig um. Um es konkreter auszudrücken: Ich habe mich dazu entschlossen, die gesamte Website mit Wordpress zu gestalten. Damit verabschiede ich mich von der Wordpress/Mediawiki Konfiguration, die ich von Anfang an auf dieser Site am Laufen hatte. Über die Gründe werde ich sicherlich noch ein paar Worte verlieren. Für&#8217;s erste gibt es jedoch nur die wichtigsten Infos.</p>
<h4>Phase 1:</h4>
<p>Momentan befindet sich der Umbau in Phase 1. In dieser ersten Phase baue ich Wordpress als Blog/Site-Tool ein wenig aus. Der Works-Bereich wird dabei immer noch mit Mediawiki betrieben. Dieser erste Schritt dient der Umgestalung der Website ansich sowie der Vorbereitung im Hintergrund auf die gesamte Verwaltung der Site mit Wordpress.</p>
<h4>Phase 2:</h4>
<p>In der  zweiten Phase wird der Protierung des Contents von Mediawiki nach Wordpress vorangetrieben, Durch den massiven Content, der im Mediawiki entstanden ist, wird diese Phase wohl etwas länger dauern. Hier möchte ich insbesondere die einzelnen Versionen und die Datumsinformationen beibehalten. Das wird sicher eine kleine Herausforderung.</p>
<h4>Phase 3:</h4>
<p>Die dritte und letzte Phase ist das sog. &#8220;Polishing&#8221;. Hier werde ich Mediawiki abschalten und den alten Content archivieren. Darüber hinaus wird die Website noch mit einigen kleinen Features und Gimmicks angereichert werden. Es wird wohl auch so sein, dass das Layout der Website nochmals überarbeitet werden wird.</p>
<p>Ich werde über den Status der Umbauarbeiten natürlich berichten ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/umbau-oefter-mal-was-neues/feed/</wfw:commentRss>
		<slash:comments>0</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>Coding Dojo@DNUG Ingolstadt</title>
		<link>http://www.gmbsg.com/coding-dojo-dnug-ingolstadt/</link>
		<comments>http://www.gmbsg.com/coding-dojo-dnug-ingolstadt/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 09:54:37 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[ALT.NET]]></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=457</guid>
		<description><![CDATA[Gestern habe ich bei der DNUG Ingolstadt eine .NET Coding Dojo Session gehalten. Kurz und knapp: KataFizzBuzz wurde auf Anhieb in knapp einer Stunde gelöst. Noch besser, es wurde daraufhin nochmal eine zweite Variante innerhalb kurzer Zeit entwickelt. Eine tolle ...]]></description>
			<content:encoded><![CDATA[<p>Gestern habe ich bei der <a href="http://www.indot.net/">DNUG Ingolstadt</a> eine .NET Coding Dojo Session gehalten. Kurz und knapp: KataFizzBuzz wurde auf Anhieb in knapp einer Stunde gelöst. Noch besser, es wurde daraufhin nochmal eine zweite Variante innerhalb kurzer Zeit entwickelt. Eine tolle Leistung! <a href="http://netdojo.codeplex.com/sourcecontrol/changeset/view/44067?projectName=netdojo#566589">Das Ergebnis kann sich sehen lassen</a>.</p>
<p>Danke nochmals an <a href="http://webenliven-space.de/dotnetblog/">Gregor</a> &amp; die DNUG für die Organisation und das nette Geschenk! Diese Woche scheint sowieso die &#8220;Dojo-Woche&#8221; zu werden, denn Morgen geht es schon wieder weiter mit einer <a href="https://www.xing.com/events/net-coding-dojo-munchen-experten-431510">neuen Herausforderung im Experten Dojo in München</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/coding-dojo-dnug-ingolstadt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tic-Tac-Toe</title>
		<link>http://www.gmbsg.com/tic-tac-toe/</link>
		<comments>http://www.gmbsg.com/tic-tac-toe/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 15:04:45 +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[ALT.NET]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=443</guid>
		<description><![CDATA[Jeder von uns kennt den kleinen Kurzweil-Klassiker Tic-Tac-Toe. Das kleine Spiel zu programmieren ist nicht nur ein interessanter Pausenfüller, sondern auch eine besonders schöne Vorlage für ein .NET Coding Dojo mit langjährig erfahrenen .NET Programmierern.
Die Anforderungen

Das Spiel ist zu Ende, ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gmbsg.com/stories/wp-content/uploads/2009/11/tictactoe-150x150.png" alt="tictactoe" title="tictactoe" width="150" height="150" class="alignright size-thumbnail wp-image-446" />Jeder von uns kennt den kleinen Kurzweil-Klassiker <a href="http://de.wikipedia.org/wiki/Tic_Tac_Toe">Tic-Tac-Toe</a>. Das kleine Spiel zu programmieren ist nicht nur ein interessanter Pausenfüller, sondern auch eine besonders schöne Vorlage für ein .NET Coding Dojo mit langjährig erfahrenen .NET Programmierern.</p>
<h3>Die Anforderungen</h3>
<ul>
<li>Das Spiel ist zu Ende, wenn alle Felder belegt sind</li>
<li>Das Spiel ist zu Ende, wenn ein Spieler eine gesamte Reihe belegt hat</li>
<li>Das Spiel ist zu Ende, wenn ein Spieler eine gesamte Spalte belegt hat</li>
<li>Das Spiel ist zu Ende, wenn ein Spieler eine gesamte Diagonale belegt hat</li>
<li>Ein Spieler kann ein freies Feld belegen</li>
<li>Die Spieler belegen so lange ein freies Feld, bis das Spiel beendet ist</li>
</ul>
<p>Auch die <a href="https://www.xing.com/net/netdojo">.NET Experten im Coding Dojo</a> München hatten Ihren Spass an dem kleinen Spiel. Es musste natürlich kräftig überlegt und entwickelt werden &#8211; ohne Anstrengung geht&#8217;s eben nicht :-). </p>
<p>Summa summarum ein gelungenes und nettes <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_TicTacToe">KataTicTacToe</a>. Auch zu empfehlen für TDD-Einsteiger. Es gibt jedem die Möglichkeit, eine eigene Lösung zu entwickeln und zeigt dabei die Grundprinzipien des TDD auf. Das Ergebnis der Profis lässt sich im Übrigen auf dem <a href="http://netdojo.codeplex.com/sourcecontrol/changeset/view/41698?projectName=netdojo#531983">Codeplex-Projekt-SVN</a> begutachten.</p>
<p>Achso, wer Lust hat, nicht nur die ganze Zeit über TDD zu lesen und zu reden, sondern auch mal &#8220;hautnah&#8221; TDD mit C# und professionellen Softwareentwicklungsmethoden live erleben und mitmachen möchte, für den sind schon die nächsten Sessions im Kalender markiert. </p>
<p>Wie immer sind am Anfang des Monats, genauer am <a href="https://www.xing.com/events/net-coding-dojo-munchen-einsteiger-431506">2. Dezember, die Einsteiger im Dojo</a> gefordert. Zwei Wochen später, am <a href="https://www.xing.com/events/net-coding-dojo-munchen-experten-431510">16. Dezember sind die .NET Experten gefordert, im Coding Dojo</a> ihre gesamte Expertise einzubringen, um die sich selbst gestellte Aufgabe zu meistern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/tic-tac-toe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TDD ist keine Wissenschaft!</title>
		<link>http://www.gmbsg.com/tdd-ist-keine-wissenschaft/</link>
		<comments>http://www.gmbsg.com/tdd-ist-keine-wissenschaft/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 07:36:20 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></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/stories/?p=420</guid>
		<description><![CDATA[In letzter Zeit wird viel über TDD geredet und diskutiert. Das ist gut, denn offensichtlich gibt es da noch einiges zu besprechen und zu lernen. Ich habe erst kürzlich gelernt, dass es absolut sinnlos ist, bestehende Projekte ohne TDD anzugehen. ...]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit wird viel über TDD geredet und diskutiert. Das ist gut, denn offensichtlich gibt es da noch einiges zu besprechen und zu lernen. Ich habe erst kürzlich gelernt, dass es absolut sinnlos ist, bestehende Projekte ohne TDD anzugehen. Auch wenn ich viele Tests im nachhinein schreibe. Ich schreibe sie einfach so wie ich die Anforderungen verstanden habe. Mal nähert sich der Code an die Tests, mal die Tests an den Code. Das schöne daran ist, dass man wesentlich schneller den bestehenden Code versteht und auch deren Schwachstellen identifiziert. Dadurch wird auch die Wartung des Brownfield-Projektes gestärkt. Innerhalb von kurzer Zeit kann ich Aufwände und Problemstellungen gut einschätzen.</p>
<h3>TDD im Rampenlicht</h3>
<p>Naja, das nur nebenbei. Mir geht es eigentlich um ein anderes Thema. Mir geht es um etwas Generelles. Als Pete und ich mit den <a>.NET Coding Dojos</a> angefangen haben, gab es positive Resonanz. Es wurden Dojo&#8217;s veranstaltet und Code Kata&#8217;s exerziert. Super! Meiner Ansicht nach kam TDD dadurch ein kleines Stück mehr in&#8217;s Rampenlicht als es schon durch <a href="http://clean-code-developer.de/">Clean Code Developer</a> bereits war. In zahlreichen Posts gab es Diskussionen um die <a href="http://www.des-eisbaeren-blog.de/post/2009/11/01/Wie-viel-Sinn-machen-Unittests.aspx">Sinnhaftigkeit von Unit Tests</a>, die <a href="http://ralfw.blogspot.com/2009/09/code-kata-statt-thai-chi-vor-dem.html">Kata Berichte</a> und grundlegender <a href="http://ralfw.blogspot.com/2009/10/tdd-wofur-oop-2010-endlich-cleannet.html">Erkenntnisse über TDD</a>. Eine besonders positive Sache, denn Weiterentwicklung und Entdeckung sind schöne Dinge.</p>
<p>Doch eine Sache stört mich. Manchmal stört es mich sogar gewaltig. Dieses Trara und <a href="http://de.wikipedia.org/wiki/Tamtam">Tamtam</a> um TDD und <a href="http://www.des-eisbaeren-blog.de/post/2009/11/07/Auch-Kirchen-haben-Kragsteine.aspx">Beeinflussung des OO-Designs durch Tests</a> und das <a href="http://ralfw.blogspot.com/2009/11/zustand-als-abhangigkeit-ioc-konsequent.html">Entkoppeln von Zustand</a>. Bei dem einen oder anderen Post kann ich mir das Kopfschütteln während des Lesens einfach nicht verkneifen. Die Spitzfindigkeit und unnötige Verkomplizierung einfacher Sachverhalte geht mir zuwider. Für manch einen mag es Anspruch sein, über ein Feuerwerk an <a href="http://de.wikipedia.org/wiki/Sprachfertigkeit">Eloquenz</a> einfachste Dinge mit fesselnden Trapezschwüngen der <a href="http://de.wikipedia.org/wiki/Rhetorik">Rhetorik</a> auf das Hochseil des Softewareentwicklungszirkusses zu katapultieren. Die lufterhitzenden Spots, der nervöse Trommelwirbel, der adrenalisierende Schweiß der Konzentration inklusive. Für manch einen. Für mich jedenfalls nicht.</p>
<p>Im Gegenteil. Es stört mich. Es irritiert mich. Denn mich interessiert das Thema selbst. Ich denke es Bedarf keines jonglierens mit <a href="http://de.wikipedia.org/wiki/Dependency_Inversion_Principle">DIP</a>, <a href="http://de.wikipedia.org/wiki/Single_Responsibility_Principle">SRP</a>, <a href="http://de.wikipedia.org/wiki/YAGNI">YAGNI</a>, <a href="http://de.wikipedia.org/wiki/DRY">DRY</a>, um wirklich im Alltag der Software-Entwicklung gut bestehen zu können. Man darf mich hier nicht falsch interpretieren. Auch ich finde es wichtig, sich mit &#8220;Dependency Inversion&#8221;, &#8220;Single Responsibility&#8221;, &#8220;Decisions on Last Responsible Moment&#8221; und &#8220;Repetition Avoidance&#8221; auseinanderzusetzen, damit umzugehen und täglich einzusetzen.</p>
<h3>TDD ist keine &#8220;Rocket Science&#8221;</h3>
<p>Doch man kann es übertreiben. Die ständige, gestelzte und wie ein Ritus sich selbst auferlegte &#8220;<a href="http://clean-code-developer.de/wiki/CcdRoterGrad#T%C3%A4glichreflektieren">Tagesreflexionsprogramm</a>&#8221; ist meines Erachtens nicht förderlich. Überspitzt betrachtet ist es genau dasselbe wie das Bart-Simpson-Einhämmerungs-Ritual &#8220;Ich werde keinen Zustand testen!&#8221; &#8211; <a href="http://de.wiktionary.org/wiki/repetitiv">repetitiv</a>, jedoch nicht <a href="http://de.wiktionary.org/wiki/kognitiv">kognitiv</a>. <img class="alignright size-full wp-image-428" title="bart-simpson-zustand" src="http://www.gmbsg.com/stories/wp-content/uploads/2009/11/bart-simpson-zustand.png" alt="bart-simpson-zustand" width="300" height="162" />Wer&#8217;s mag, kann ruhig jeden Tag nicht nur Selbstreflexion betreiben, sondern auch jeden Tag ein Code Kata lösen, damit die Entwicklerseele rein wird. Ich jedenfalls werde das nicht tun.</p>
<p>Ich arbeite auch nach Prinzipien, löse Probleme auch mit Patterns und programmiere neben dem Tagesgeschäft ab und an auch mal Code Kata&#8217;s. Aber ich bin mir gleichermaßen bewußt, das ich jedes Mittel und Werkzeug richtig einordnen und im richtigen Maß anwenden muss, damit es mich langfristig weiterbringt.</p>
<p>Gleiches gilt für mich auch beim Thema TDD. Ich arbeite nun seit etwas mehr als einem halben Jahr stringent mit TDD. Zuvor habe ich es immer ab und an eingesetzt, aber nie &#8220;ernsthaft&#8221; betrachtet. Ich finde TDD (und auch BDD) sind eine besonders gute Methodik, um das <em>V</em> in <a href="http://de.wikipedia.org/wiki/EVA-Prinzip">EVA</a> groß schreiben zu können. Es stärkt wunderbar die logischen Bestandteile der Anwendung und fördert mit der granularen Testanforderung lose Kopplung und komponentenorientiertes Design. Mittlerweile ist TDD für mich fester Bestandteil jeder Entwicklungsaufgabe.</p>
<p>Während der ersten Phase, in der ich TDD konsequenter eingesetzt habe, habe ich auch <a href="http://www.mockobjects.com/book/index.html">einiges darüber gelesen</a> und durch das &#8220;Doing&#8221; auch vieles gelernt. So ist es z.B. überhaupt nicht schlimm, wenn man statusbehaftete Tests an den Enden der Datenverarbeitung macht. Konkret: Auch <a href="http://benpryor.com/blog/2007/01/16/state-based-vs-interaction-based-unit-testing/">statusbasierte Tests</a> sind ok, vor allem in Richtung DB oder UI. Ein schönes Beispiel dafür ist <a href="http://www.gmbsg.com/stories/?p=352">KataFizzBuzz als WinForms-Anwendung</a> oder <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_Blog">KataBlog</a>. Natürlich ist interaktionsbasiertes Testen &#8220;schöner&#8221;, fördert die lose Kopplung und die isolierte Verifikation. Doch hier gibt es kein Schwarz oder Weiß. Es geht um den Einsatzbereich. Am Rand des Datenstroms ist man mehr statusbasiert, in der mitte eben mehr interaktionsbasiert. Außerdem ist das Thema Statustests vs. Interaktionstests ein relativ &#8220;alter Hut&#8221;. Schon mit <a href="http://martinfowler.com/articles/mocksArentStubs.html">Mocks Aren&#8217;t Stubs</a> hat Fowler klar gemacht, dass beides in Ordnung ist.</p>
<p>Diese Zustands-Geschichte ist jedoch nur ein Beispiel. Es gibt da noch einige andere Klassiker: Kapselung, Verkettung, Referentielle Transparenz. Doch ungeachtet dieser Dinge, ist TDD <a href="http://www.dict.cc/englisch-deutsch/It%27s+not+rocket+science.html">keine Rocket Science</a>. Im Gegenteil, TDD ist in der Kernaussage und Grundregeln so einfach, das sich die anderen &#8220;Problemstellungen&#8221; automatisch ableiten und auflösen. Gerade deswegen ist es meiner Meinung nach so wichtig, die Dinge einfach zu erklären und und diese &#8220;Leichtigkeit&#8221; auch zu transportieren. Die <a href="http://codekata.pragprog.com/">Code Kata&#8217;s von Dave</a> sind ein Beispiel. Sie sagen nicht &#8220;Mach dies! Beachte das!&#8221;. Nein, sie sind eigenständige Probleme, auf deren Lösungsweg man individuell und für sich eine gute Lösung findet. Daraus ergeben sich automatisch mit der Zeit Verbesserungen und Erkenntnisse.</p>
<p>Fazit: Beim Verständnis und der Anwendung von Test-Driven-Development gilt, obgleich TDD ein bis Dato <a href="http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf">empirisch betrachtetes, jedoch theoretisch nicht ausreichend erforschtes</a> Vorgehensmodell ist, das Prinzip von <a href="http://de.wikipedia.org/wiki/Ockhams_Rasiermesser">Ockhams Rasiermesser</a>. Der praxisorientierte, frequentive Einsatz sowie das Erkennen der Grundtheoreme der TDD-Methodik sind das Fundament für den erfolgreichen Einsatz.</p>
<p>Und wenn ich das für alle diejenigen, die wie ich auch in der Kommunikation Wert auf Einfachheit legen, mal übersetzen darf:</p>
<p><strong>TDD ist keine Wissenschaft!</strong></p>
<p>Man kann viel darüber Lesen. Das ist auch gut. Besser ist es jedoch, <a href="http://blog.thomasbandt.de/39/2291/de/blog/unit-tests-sind-gut.html">TDD zu machen</a>! Nicht viel über &#8220;dies und das&#8221; nachdenken. Die Devise lautet: &#8220;<a href="http://www.quotes.net/quote/9349">Mach es einfach, aber nicht einfacher</a>&#8220;. Es wird von alleine gut und mit der Zeit sogar besser werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/tdd-ist-keine-wissenschaft/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Über das Ziel von Coding Dojos</title>
		<link>http://www.gmbsg.com/uber-das-ziel-von-coding-dojos/</link>
		<comments>http://www.gmbsg.com/uber-das-ziel-von-coding-dojos/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 20:42:26 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[ASP.NET]]></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[MVC]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=415</guid>
		<description><![CDATA[Gestern gab es wieder mal ein .NET Coding Dojo für Einsteiger. Pete hat sich ein besonderes Kata ausgesucht, das KataBlog. Es hat mich anfangs nicht sehr überrascht, dass er den Einsteigern auch neue Technologien und &#8220;Fancy Stuff&#8221; wie ]]></description>
			<content:encoded><![CDATA[<p>Gestern gab es wieder mal ein .NET Coding Dojo für Einsteiger. Pete hat sich ein besonderes Kata ausgesucht, das <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_Blog">KataBlog</a>. Es hat mich anfangs nicht sehr überrascht, dass er den Einsteigern auch neue Technologien und &#8220;Fancy Stuff&#8221; wie <a href="http://www.asp.net/mvc/"ASP.NET MVC</a> mitgeben wollte. Ich fand die Idee gut und unterstützte ihn dabei.</p>
<p>Kurz zum KataBlog: Das Kata ist logisch gesehen eine unfassbar einfache Aufgabe. Doch genau das macht das Kata so besonders und zum Teil auch besonders &#8220;herausfordernd&#8221;. Ein Blog mit ASP.NET MVC im vollen TDD zu lösen ist für Einsteiger eine nicht zu unterschätzende Aufgabe. Ebenso würden wahrscheinlich auch TDD Skeptiker sich mit diesem Kata schwer tun und sich auf den ersten Blick in Ihrer Meinung auch bestätigt fühlen. Doch KataBlog ist wohl (nach <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_FizzBuzz">KataFizzBuzz</a>) der nächste große Schritt für Neulinge. Die Erkenntnisse aus dem Blog möchte ich dem passionierten Dojo- und Kata-Freund nicht gleich verraten &#8211; schließlich ist Selbsterkenntnis eine schöne Sache. ;)</p>
<p>Nun, wie dem auch sei: Im gestrigen Dojo waren wieder einmal gut aufgelegte und aktive Teilnehmer dabei. Zu meiner Überraschung interessierten sich die Teilnehmer sehr viel mehr über grundlegende Technologien wie HTTP, ASP.NET und das ASP.NET MVC als über die eigentliche Aufgabenstellung. Pete reagierte gut, indem er alle nochmals darauf hinwies, dass ein Coding Dojo ein einziges Ziel verfolgt: Die erfolgreiche Vermittlung von nutzbaren Lerneffekten &#8211; für jeden Teilnehmer. Er sagte dass ein Dojo keine feste, durchgeplante Veranstaltung mit fixem Programm oder Paradigma sei, sondern dass das Dojo primär die Teilnehmer und den Lerngedanken im Fokus hat. Er stellte die Einsteiger vor die Wahl: Wollen sie mehr über &#8220;das Handwerkszeug&#8221; ASP.NET &#038; ASP.NET MVC erfahren, oder mehr über die Lösung der Aufgabe per TDD und professionellen Entwicklungs-Prinzipien?</p>
<p>Die Teilnehmer überlegten eine Weile, bevor man sich dann einhellig für eine tiefere Behandlung der Technologie entschied. Pete &#038; ich gingen auf diesen Wunsch ein und erklärten die Technik. Anfangs noch ein wenig theoretisch. Es wurden Fragen beantwortet wie z.B. &#8220;Was ist MVC?&#8221; oder &#8220;Was ist der Unterschied zu Web Forms?&#8221;. Nach einem kurzen Theorie-Exkurs am Flipchart ging es dann endlich Hands-On mit ASP.NET MVC auf zum Blog.</p>
<p>Pete zeigte die ASP.NET Templates, die Einbindung der Unit-Test Frameworks NUnit und xUnit in diese und die einzelnen Wizards für den Controller und die Views. Gelöst haben wir dann das Blog indem wir und Stück für Stück mit den Views an die Grundfunktionen &#8220;Anzeigen&#8221;, &#8220;Editieren&#8221;, &#8220;Erstellen&#8221;, &#8220;Löschen&#8221; und &#8220;Auflisten&#8221; herangewagt haben. In Anbetracht der Tatsache, dass es so viele Fragen zu MVC gab (Stichwort: Routes, Convention over Configuration, Partial Views usw usf.) ging es auch relativ flüssig durch. Nach knapp 3 Stunden waren wir soweit und hatten den Blog am laufen.</p>
<p>Ich kann jedem empfehlen, der sich mit TDD ernsthaft auseinandersetzen möchte, sich (nach den Erkenntnissen von KataFizzBuzz), die nächste Stufe Richtung sauberen Code und erweiterbarem Design zu erklimmen und das Kata zu lösen. Die Fortgeschrittenen TDD&#8217;ler werden schnell sehen, worum es bei dem Kata geht. Ich finde es besonders mutig und gut, dass Pete so eine technisch wie auch methodisch herausfordernde Aufgabe im Einsteiger-Dojo vorgestellt hat. Noch bewundernswerter war allerdings das aktive &#8220;erfassen &#038; erkennen&#8221; der Teilnehmer, die sich keineswegs davor gescheut haben, sondern die ganzen 3 Stunden über mit voller Konzentration dabei waren. Ich kann nur sagen: Hut ab &#038; Danke!</p>
<p>Was soll ich sagen, mein Fazit wird langsam eintönig, aber es ist nun mal so: In zwei Wochen ist schon wieder <a href="https://www.xing.com/events/net-coding-dojo-experten-416950">Experten-Dojo (18.11.2009 18:00 Uhr)</a> und ich freue mich jetzt schon wahnsinnig. Es wird sicherlich wieder eine erkenntnisreiche, spannende und spassige Sache!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/uber-das-ziel-von-coding-dojos/feed/</wfw:commentRss>
		<slash:comments>0</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>Bugtracking ist sinnlos!</title>
		<link>http://www.gmbsg.com/bugtracking-ist-sinnlos/</link>
		<comments>http://www.gmbsg.com/bugtracking-ist-sinnlos/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 20:50:51 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[System]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Continuous Integration]]></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[TDD]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=372</guid>
		<description><![CDATA[Es ist nun schon einige Zeit vergangen, seit dem ich das letzte Mal über Bugs gebloggt habe. Damals habe ich mich etwas näher mit dem Thema Bugreporting auseinandergesetzt. Und nach wie vor bin ich der Meinung, dass das Bugreporting ein ...]]></description>
			<content:encoded><![CDATA[<p>Es ist nun schon einige Zeit vergangen, seit dem ich das letzte Mal über Bugs gebloggt habe. Damals habe ich mich etwas näher mit dem Thema <a href="http://www.gmbsg.com/stories/?p=82">Bugreporting</a> auseinandergesetzt. Und nach wie vor bin ich der Meinung, dass das Bugreporting ein wichtiger und wesentlicher Bestandteil des Issue Managements ist. Was das Bugtracking allerdings angeht, so bin ich anderer Meinung.</p>
<p>Ich möchte gleich mal eine provokante Aussage in den Raum werfen: Bugtracking für Software-Projekte ist sinnlos. Jedenfalls in den meisten Fällen. Mehr noch, Bugtracking sollte soweit wie nur irgend möglich vermieden werden!</p>
<p>Was will ich damit sagen? Man betrachte einmal das mittlerweile so &#8220;selbstverständliche&#8221; Tooling bei Software-Projekten: Man nehme ein <a href="http://en.wikipedia.org/wiki/Revision_control">SCM</a> (z.B. SVN oder git), ein <a href="http://en.wikipedia.org/wiki/Continuous_integration">CI-System</a> (z.B. TeamCity oder CruiseControl) und einen <a href="http://en.wikipedia.org/wiki/Bug_tracking_system">IssueTracker</a> (z.B. Bugzilla oder Trac). Man kann das ganze natürlich auch als Gesamtpaket haben, z.B. mit <a href="http://en.wikipedia.org/wiki/Team_Foundation_Server">TFS</a>. So, damit hat man die Eckpfeiler einer Software-Entwicklungsumgebung parat und kann frisch und fröhlich programmieren. Ich denke allerdings das dieses Toolset nicht ganz so glücklich gewählt ist.</p>
<h3>Bugtracking ist Zeitverschwendung</h3>
<p>In einer Zeit, in der viel getan wird, um einen sauberen Code zu produzieren ist meiner Meinung nach die jetzige &#8220;Methodik des Bugtrackings&#8221; nicht mehr adequat. Entwickler versuchen mit agilen Methoden (teilweise krampfhaft) mehr Qualität und Stabilität in ihre Produkte zu bringen. Ein aktuelles Beispiel ist die Beachtung und Anwendung der Prinzipien der <a href="http://www.cleancodedeveloper.de/">Clean Code Developer</a> Bewegung, die Ihre Kernaussage aus der <a href="http://manifesto.softwarecraftsmanship.org/">Craftsmanship-Ideologie</a> von <a href="http://objectmentor.com/omTeam/martin_r.html">UncleBob</a> schöpft. Darüber hinaus beschäftigt sich die gesamte Softwareentwicklungsindustrie seit Jahren mit Themen wie z.B. Continuous Integration oder Test-Driven-Development, die mitunter das Ziel haben, die Qualität des Softwareproduktes schon während der &#8220;Produktionsphase&#8221; stetig hoch zu halten. Flankiert wird das ganze auch noch mit agilen Managementmethoden wie z.B. <a href="http://de.wikipedia.org/wiki/Scrum">Scrum</a> oder <a href="http://de.wikipedia.org/wiki/Kanban">Kanban</a>, die auch einen besonderen Anspruch auf stetige, hohe Qualität legen.</p>
<p>Nichtsdestotrotz findet man in jedem Tool-Setup den altbekannten &#8220;Bugtracker&#8221; wieder. Wieso? Auf der einen Seite strebt man nach dem &#8220;Zero-Defect&#8221;, nach hochqualitativer Software. Aber mit dem gleichen Atemzug gibt man sich dennoch geschlagen, indem man von vornherein mit Bugs rechnet. Denn einen Bugtracker zu betreiben ist in den allermeisten Fällen nichts anderes als ein Geständnis. Undzwar das Geständnis sich selbst gegenüber, doch nicht alles &#8220;hundertprozentig&#8221; zu machen. Es ist ein Widerspruch in sich. Jaaaa, Clean Code, TDD, BDD, DDD und noch eine handvoll anderer bewährter Methoden, von mir aus noch Pair Programming, Continuous Integration / Deployment und Scrum. Aber: Ein Bugtracker muss auf jeden Fall auch her.</p>
<h3>Bugtracker ist nicht gleich Liste und schon garnicht Archiv</h3>
<p>Man mag mir entgegenbringen, dass mit einem &#8220;Issue Tracking&#8221;-System nicht nur Bugs verwaltet werden, sondern auch Feature-Requests und ähnliches. Featurelisten sind eine wunderbare Sache, vor Allem wenn man sie priorisieren kann. Aber dazu braucht man keinen Bugtracker. Im Allgemeinen reichen einfachere Tools aus.</p>
<p>Das am meisten erwähnte Gegen-Argument ist wohl, das man mit dem Bugtracker die Bugs &#8220;verwalte&#8221;, um sie ja nicht zu vergessen und Ihnen angemessene Priorität zu geben. Lächerlich! Eine Farce, denn in der professionellen (wirtschaftlich orientierten) Softwareentwicklung ist solch ein Ansatz absolut kontraproduktiv. Erstens schafft es einen weiteren Verwaltungs- und Organisationsapparat, den es erst mal zu bewältigen gilt. Zweitens mutiert es mit der Zeit zu einer Halde (ich will schon fast sagen Müllhalde) von unwichtigen Bugs und Feature-Requests, die man irgendwann einmal angehen will. Drittens stellt es automatisch und implizit ein Konkurrenzsystem zur Roadmap dar. Warum?</p>
<p>Na ganz einfach: wenn ein Bug wirklich ein wichtiger Bug ist, dann wird er sofort gefixed. Alles andere ist entweder nicht wichtig oder wird dann erst wichtig, wenn die wichtigeren Dinge schon erledigt sind. So einfach ist das.</p>
<p>Außerdem: Gefühlt implementiert nahezu jeder, der was auf sich hält seine Software mit agilen Methoden und Praktiken. Scrum und XP sind schon längst angekommen; und mit TDD und Clean Code wir bewegen uns auf einem hohen Niveau, oder nicht? Unsere Grundmotivation ist es doch, fehlerfreie Software auszuliefern, oder nicht? Ok, 100%ig gibt es nie, aber wir streben doch zumindest die <a href="http://en.wikipedia.org/wiki/High_availability">three nines</a> der &#8220;High Quality&#8221; an, oder nicht? Ich denke schon &#8211; zumindest ist das mein Verständnis. Wenn dem so ist, warum brauchen wir dann ein Bugtracking-Tool?</p>
<h3>Bugreporting ist wichtig, Bugtracking jedoch unwichtig</h3>
<p>Ich möchte mit meiner provokanten Aussage nicht erreichen, das man grundsätzlich das Issue Management anzweifelt. Es ist eher das Gegenteil der Fall. Ich stärke sogar die Wichtigkeit &amp; Effizienz, zumal nach wie vor ein richtiges Bugreporting und eine Bug Triage entscheidend sind, um die richtige Entscheidung treffen zu können. Mein Augenmerk gilt der Bugverwaltung an sich, also der zentralisierten Auflistung, Verwaltung und Archivierung von Fehlerprotokollen. Im Lean Management sind zentrale Prozesspunkte ein &#8220;rotes Tuch&#8221;. Statt dem sternförmigen Kommunikations- und Prozessmodell wird dort das, Netzmodell favorisiert. Dieser Ansatz ist meiner Meinung nach besonders auf das Issue Management anwendbar.</p>
<p>Natürlich kann ich nicht generell sagen, dass ein Bugtracking-Tool sinnlos ist. Es gibt immer wieder Situationen und Rahmenbedingungen, die auch ein Bugtracking-Tool und eine zentrale Fehlerverwaltung rechtfertigen. So ist es z.B. bei einem Produkt, bei dem die User-Gemeinde aktiv die Bugs berichten und einsehen kann sicherlich sinnvoll, ein Bugtracking-System einzusetzen. Allerdings ist es nur in den seltensten Fällen wirklich notwendig.</p>
<p>Man könnte ein Bugreporting auch derart gestalten, dass man sich beim Reporter für den Bericht bedankt und ihm verspricht, das Problem zu analysieren. Dann schaut man sich den Fehler an. Ist er wichtig genug, wird er sofort gefixed &#8211; und der Benutzer ist glücklich. Ist er nicht wichtig genug (also ist entweder ein anderer Bug oder ein anstehendes Feature wichtiger), so wird der Report weggeworfen. Der Benutzer wird benachrichtigt dass der Fehler momentan nicht korrigiert wird. Ehrlich, sachlich, klar. Der Berichterstatter kann nun nochmals (mit Vehemenz) darauf pochen, den Fehler behoben zu wissen. So kann man z.B. bei benutzerorientierten Produkten auch ein Voting einsetzen (wie z.B. bei Codeplex). Erhöht sich das Voting (die Priorität) nicht, wird der Bug nicht gefixed und weggeworfen. That&#8217;s it.</p>
<h3>Es gibt nur ein Go oder Nogo für einen Bugfix</h3>
<p>Ich bin der festen Überzeugung das diese Verfahrensweise vor Allem dann effizient ist, wenn man in der Software-Entwicklung agile Methoden anwendet. Für mich sind Software Craftsmanship, TDD, XP und all die weiteren modernen Methoden einfach nicht mit dem veralteten Zentralverwaltungs-Muff &#8220;Bugtracking&#8221; vereinbar. Statt dessen sollte man ein leichtgewichtiges Bugreporting etablieren und die Entscheidung über den Fix oder No-Fix des Bugs schnell herbeiführen. Nur so kann man sich selbst dazu erziehen, von Anfang an in der Software-Entwicklung das Qualitätsbewusstsein zu schärfen und die Qualität konstant adequat hoch zu halten. Denn nur mit dieser &#8220;KO-Entscheidung&#8221; über den Fix eines Bugs kommt man (leidend, aber relativ schnell) zu der Erkenntnis, dass man wenn man wirklich das Produkt stetig weiterentwickeln möchte auch immer sich zum Ziel setzen muss, ein möglichst fehlerfreies Produkt auszuliefern.</p>
<p>Die Erkenntnis, Bugs nicht zu verwalten und sofort zu entscheiden, ob es gefixed werden soll oder einfach ignoriert werden soll ist meiner Meinung nach ein wichtiger Bestandteil für qualitative, agile Software-Entwicklungs-Methoden.</p>
<p>Ergo: Bugtracking ist sinnlos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/bugtracking-ist-sinnlos/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Test-Driven-Dojo: Das Einmaleins von TDD</title>
		<link>http://www.gmbsg.com/test-driven-dojo-das-einmaleins-von-tdd/</link>
		<comments>http://www.gmbsg.com/test-driven-dojo-das-einmaleins-von-tdd/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 10:35:38 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></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/stories/?p=352</guid>
		<description><![CDATA[Vergangenen Mittwoch Abend war es wieder einmal soweit, das zweite .NET Coding Dojo für Einsteiger in München wurde veranstaltet. Erstaunlich: es waren bekannte Gesichter aus dem ersten Dojo wiederzufinden! Doch auch neue Teilnehmer fanden den Weg zum Dojo.
Dabei hatte das ...]]></description>
			<content:encoded><![CDATA[<p>Vergangenen Mittwoch Abend war es wieder einmal soweit, das zweite .NET Coding Dojo für Einsteiger in München wurde veranstaltet. Erstaunlich: es waren bekannte Gesichter aus dem ersten Dojo wiederzufinden! Doch auch neue Teilnehmer fanden den Weg zum Dojo.</p>
<p>Dabei hatte das Münchner Dojo viel &#8220;Event-Konkurrenz&#8221;: Der <a href="http://www.microsoft.com/germany/jointlaunch09/Events.aspx">Joint-Launch von Microsoft</a>, der <a href="http://www.twittwoch.de/veranstaltungen/3-Twittwoch-Muenchen-7-Oktober-2009">Twittwoch</a> und das unnachahmliche Herbstwetter mit 25 Grad!. Um so erfreulicher, das sich die Teilnehmer nicht davon abhalten liessen mit mir zur Feierabendzeit noch eine geistige Trainingseinheit im Dojo hinter sich zu bringen. Ich bin als Master kurzfristig für den erkrankten Pete eingesprungen &#8211; an dieser Stelle Gute Besserung! Ich hoffe ich konnte einen adequaten Ersatz darstellen.</p>
<p>Zum Dojo: es gab drei Code Kata&#8217;s zur Auswahl: <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_Minesweeper">Minesweeper</a>, der im Experten-Dojo gelöste <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_RPNCalculator">Taschenrechner</a> und das mittlerweile beliebte <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_FizzBuzz">FizzBuzz</a>, jedoch reinkarniert als Windows-Forms-Anwendung.</p>
<p>Die Teilnehmer entschieden sich für FizzBuzz im Windows-Forms-Gewand. Vorlage für diese Übung war die <a href="http://www.iphoneappindex.com/2009/06/01/fizzbuzz-on-iphoneipodtouch/">iPhone-Implementierung</a>. Eine gute und herausfordernde Wahl, wie sich im Nachhinein herausstellen sollte.</p>
<p>Zum &#8220;Warmwerden&#8221; haben wir zunächst das klassische Kata gelöst. Diesmal ging es etwas zügiger von der Hand als beim ersten Mal, was unter Anderem auch an den Wiederkehrern lag. Anschliessend ging es an die UI.</p>
<h3>Test-Driven UI-Entwicklung. Geht das überhaupt?</h3>
<p>Doch Halt! Wie soll denn das jetzt mit purem <a href="http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung">Test-Driven-Development</a> gehen? Die Einsteiger waren ein wenig vor den Kopf gestossen, denn die Frage im Raum war klar: Wie kann ich Test-First eine UI für ein Programm entwickeln? Die Antwort war jedoch alles andere als deutlich.</p>
<p>Tom &#8211; der als einziger Experte im Einsteiger-Dojo mit dabei war, was mich besonders gefreut hat &#8211; half den Einsteigern ein wenig, indem er sagte: &#8220;Eine UI ist nicht ohne Weiteres testbar.&#8221; Die Teilnehmer vertrauten der Aussage des Profis und zuckten mit den Schultern, als es darum ging, eine Testklasse für das Windows-Form zu schreiben. Nach der von Tom im Kern korrekten Anspielung auf UI-Tests habe ich versucht, den Fokus etwas zu verschieben. </p>
<p>Ich stellte folgenden provokanten Satz in den Raum: &#8220;Die Benutzeroberfläche ist nicht testbar. Gut. Aber ist denn wirklich nichts testbar? Ich meine, wie ist es z.B. mit der Interaktion? Ist die Interaktion testbar?&#8221;<br />
<img src="http://www.gmbsg.com/stories/wp-content/uploads/2009/10/fizzbuzziphone-200x300.jpg" alt="FizzBuzz auf dem iPhone / iPod" title="FizzBuzz auf dem iPhone / iPod" width="200" height="300" class="alignright size-medium wp-image-353" style="margin-left:8px" /><br />
Dazu habe ich nochmal die Referenz-Anwendung gestartet und gezeigt, mit der Bitte, sich die Interaktionselemente der Anwendung &#8211; vielmehr die Interaktion mit der Benutzeroberfläche &#8211; nochmals genau anzusehen. </p>
<p>Im Wesentlichen besteht das &#8220;Spiel&#8221; aus drei Eingabefeldern (Buttons). In der Mitte wird die Zahl dargestellt, für die es die &#8220;FizzBuzz-Frage&#8221; zu beantworten gilt. Klickt man auf die Zahl, ist die Zahl die Antwort. Oben drüber und unten drunter werden die Antwortmöglichkeiten &#8220;Fizz&#8221; und &#8220;Buzz&#8221; dargestellt. Klickt man darauf, so ist selbiges die Antwort.</p>
<h3>Abstraktion der Benutzeroberfläche zu Interaktionsanforderungen</h3>
<p>Am Anfang war deutlich zu spüren, dass es schwer ist, eine konrektes User Interface soweit zu abstrahieren, dass man nur noch in &#8220;Interaktionen&#8221; zwischen dem Benutzer und dem Programm denkt. Auf die Frage wie denn die erste Testmethode heissen soll, &#8220;verirrten&#8221; sich einige Male ein paar Teilnehmer wieder in die konrekte UI (z.B. mit Antworten wie &#8220;ClickOnFizzButtonWhenThreeIsDisplayed&#8221;).</p>
<p>Doch mit ein paar kleinen Hilfen und gemeinschaftlicher Denkleistung konnten die Teilnehmer aus o.g. Interaktionsanforderungen heraus tatsächlich Tests formulieren. Genau diese Momente waren es, der dem Dojo die richtige Würze in Sachen Lerneffekt gab. So schreibten wir ohne die UI oder etwas anderes implementiert zu haben z.B. folgende Tests:</p>
<pre name="code" class="csharp">
        [Test]
        public void IncrementsNumberWhenAnswered()
        {
            FizzBuzzGame fizzBuzzGame = new FizzBuzzGame();

            fizzBuzzGame.Start();
            fizzBuzzGame.Answer("1");

            Assert.AreEqual(2, fizzBuzzGame.CurrentNumber);
        }

        [Test]
        public void CorrectAnswerReturnsTrue()
        {
            FizzBuzzGame fizzBuzzGame = new FizzBuzzGame();

            fizzBuzzGame.Start();
            bool isCorrect = fizzBuzzGame.Answer("1");

            Assert.AreEqual(true, isCorrect);
        }
</pre>
<p>Deutlich erkennbar ist natürlich, dass nach wie vor die UI ansich (also das WinForm, die Buttons etc) natürlich nicht testbar sind. Aber das ist ja auch nicht der Sinn der Sache! Denn das Ziel und der Zweck von Test-Driven-Development ist nicht die Verifikation, sondern die eigentliche Entwicklung des Codes! Schnell fand die Gruppe heraus, dass die Implementierung der FizzBuzzGame-Klasse sich um ganz andere Verantwortlichkeiten kümmert, als die FizzBuzz-Klasse (der eigentliche Algorithmus).</p>
<p>Die Abstraktion der Interaktionen führte zur Implementierung einer Klasse mit der Eigenschaft <code>CurrentNumber</code> sowie den Methoden <code>Start</code> und <code>Answer</code>. Schnell waren die wichtigen Tests geschrieben und die Klasse implementiert, so dass man sich der Verknüpfung der &#8220;Interaktionsklasse&#8221; zur eigentlichen UI widmen konnte. Das Verbinden erwies sich als wunderbar einfach:</p>
<pre name="code" class="csharp">
        private void buttonFizz_Click(object sender, EventArgs e)
        {
            bool isCorrect = this.game.Answer("Fizz");

            if (!isCorrect)
            {
                MessageBox.Show("Wrong answer", "Ooops!", MessageBoxButtons.OK);
            }

            this.buttonNumber.Text = this.game.CurrentNumber.ToString();
        }

        private void buttonBuzz_Click(object sender, EventArgs e)
        {
            bool isCorrect = this.game.Answer("Buzz");

            if (!isCorrect)
            {
                MessageBox.Show("Wrong answer", "Ooops!", MessageBoxButtons.OK);
            }

            this.buttonNumber.Text = this.game.CurrentNumber.ToString();
        }
</pre>
<p>Natürlich kann man hier noch wunderbar refaktorisieren und den überschüssigen doppelten Code eliminieren. Aber für&#8217;s erste soll das Mal genügen, denn jeder wollte ja sehen, ob das Spiel denn wirklich auf Anhieb spielbar war. Also schnell kompiliert und gestartet.<br />
<img src="http://www.gmbsg.com/stories/wp-content/uploads/2009/10/fizzbuzzform.png" alt="Fizz Buzz Windows Forms Game" title="Fizz Buzz Windows Forms Game" width="179" height="300" class="alignleft size-full wp-image-365" style="margin-right:8px" /><br />
Tatsächlich! Es funktioniert! Die Begeisterung der Teilnehmer war förmlich aus den Gesichtern zu lesen, als wir fröhlich das FizzBuzz-Spiel Zahl für Zahl spielten&#8230; &#8220;Zwölf ist Fizz&#8221;&#8230; &#8220;Dreizehn ist Dreizehn&#8221;&#8230; &#8220;Vierzehn ist Vierzehn&#8221;&#8230; Oh! Halt. Für die Fünfzehn muss ich ja &#8220;FizzBuzz&#8221; antworten, wie soll denn das gehen?</p>
<p>Schnell wurde wieder die IPhone-Referenz-Anwendung gezückt und durchgespielt&#8230; &#8220;Zwölf ist Fizz&#8221;&#8230; &#8220;Dreizehn ist Dreizehn&#8221;&#8230; &#8220;Vierzehn ist Vierzehn&#8221;&#8230; und &#8220;Fünfzehn ist Fizz und Buzz&#8221;. Aha! Die &#8220;FizzBuzz&#8221; Antwort besteht also aus einem Klick auf &#8220;Fizz&#8221; gefolgt von einem Klick auf &#8220;Buzz&#8221;! Klar. Doch wie lässt sich das in unserer Anwendung lösen?</p>
<p>Verwirrung machte sich breit: &#8220;Wieso ist uns das beim ersten Mal nicht aufgefallen!?!&#8221; fragte man sich. Nun sei&#8217;s drum, die Beantwortung mit Hilfe von zwei aufeinanderfolgenden Klicks ist das derzeitige Problem das es zu lösen gilt. Unter anderem kam der Vorschlag, man müsse einen Timer im Form einführen, der bei dem Klick auf &#8220;Fizz&#8221; gestartet wird und auf den nächsten Klick wartet, so dass man die &#8220;FizzBuzz&#8221;-Antwort abgeben kann. Viele Teilnehmer konzentrierten sich darauf, diese Besonderheit in der UI bzw. im Code-Behind des Forms zu lösen.</p>
<h3>Test-Driven-Development als Wegweiser</h3>
<p>Nach einigen Minuten angeregter Diskussion kam ein Einwand von Kai: &#8220;Wir haben für die ersten Interaktionen doch Tests geschrieben, dann sollten wir das doch für diesen Fall auch können oder?&#8221;. Der Vorschlag fand sofortige Zustimmung. Also auf in die Testklasse und kräftig überlegt, wie man diese Interaktion testen kann. Das Ergebnis waren eine Reihe von Tests, die sich um den &#8220;zweistufigen&#8221; Antwort-Prozess kümmerten. Auszug:</p>
<pre name="code" class="csharp">
        [Test]
        public void FizzBuzzIsAnsweredInTwoSteps()
        {
            FizzBuzz fizzBuzz = new FizzBuzz();
            Dictionary<int, string> values = fizzBuzz.Count();

            FizzBuzzGame fizzBuzzGame = new FizzBuzzGame();
            fizzBuzzGame.Start();

            for (int i = 1; i <= 14; i++)
            {
                fizzBuzzGame.Answer(values[i]);
            }

            fizzBuzzGame.Answer("Fizz");
            fizzBuzzGame.Answer("Buzz");

            Assert.AreEqual(16, fizzBuzzGame.CurrentNumber);
        }
</pre>
<p>Es folgte die Implementierung der Anforderung in der FizzBuzzGame-Klasse - so wie es davor auch der Fall war. Die Lösung der Problemstellung war an und für sich trivial: Es wurde in der Klasse ein Antwort-Status eingeführt, mit dessen Hilfe man erkennen konnte, ob eine zweistufige Antwort notwendig ist und natürlich ob die zweistufige Antwort korrekt gegeben wurde.</p>
<p>Doch das entscheidende an dieser Herausforderung war nicht die Implementierung selbst, sondern wiederum die Erkenntnis, das uns TDD wieder einmal den Weg in die richtige Richtung gezeigt hat. Statt der ad-hoc Vorschläge, einen Timer im Form zu haben oder irgendwie den Status innerhalb des Codebehinds des Forms zu implementieren, half uns TDD, die Anforderung gekapselt in der FizzBuzzForm-Klasse umzusetzen.</p>
<p>Das Resultat: Keine einzige Änderung im Codebehind des Forms! Und trotzdem eine Änderung des Interaktions-Verhaltens des Spiels! Ergo: eine rundum saubere Sache: klare Verantwortlichkeiten, eine jederzeit austauschbare View (das Form), ein vollends getesteter Presenter (die FizzBuzzGame-Klasse) sowie das ebenfalls in TDD entwickelte Model (die FizzBuzz-Algorithmus-Klasse). TDD hat es den Einsteigern (wohlgemerkt keine langjährigen Entwicklungsprofis!) ermöglicht, ein gängiges und äußerst hilfreiches Pattern in der Windows-Forms-Entwicklung anzuwenden, ohne jegliche Kenntnis vom Design Pattern zu haben.</p>
<p>Fazit: <strong>Ein Super Dojo!</strong> Ich war wirklich begeistert, dass es uns im Einsteiger-Dojo gelungen ist, das Fundament von TDD zu vermitteln: Nicht testen um zu verifizieren, sondern testen um zu entwickeln! Gleichzeitig war das Windows-Forms-Kata ein Paradebeispiel für <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">Seperation of Concerns</a> und der "intuitiven" Entwicklung der Grundzüge des <a href="http://de.wikipedia.org/wiki/Model_View_Presenter">MVP-Patterns</a>. Vielen Dank an alle Teilnehmer, es war Klasse!</p>
<p>Ich freue mich schon heute auf das nächste <a href="https://www.xing.com/events/net-coding-dojo-munchen-master-401546">.NET Coding Dojo für Experten am 21. Oktober!</a>. Das wird bestimmt wieder ein besonderer Spass. Seid dabei!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/test-driven-dojo-das-einmaleins-von-tdd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NDC: .NET Coding Dojo mit Rechenschieber&#8230;</title>
		<link>http://www.gmbsg.com/ndc-net-coding-dojo-mit-rechenschieber/</link>
		<comments>http://www.gmbsg.com/ndc-net-coding-dojo-mit-rechenschieber/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 16:08:41 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></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[C#]]></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[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=341</guid>
		<description><![CDATA[Gestern fand das erste .NET Coding Dojo für Experten in München statt. Ich war im Vorfeld schon ziemlich gespannt, zumal ja schon das Dojo für Einsteiger so gut gelaufen war.
Ich hatte mir für das erste Experten-Dojo zwei Dinge auf der ...]]></description>
			<content:encoded><![CDATA[<p>Gestern fand das erste <a href="http://dotnetdojo.ning.com">.NET Coding Dojo für Experten</a> in München statt. Ich war im Vorfeld schon ziemlich gespannt, zumal ja schon das <a href="http://www.gmbsg.com/stories/?p=328">Dojo für Einsteiger</a> so gut gelaufen war.</p>
<p>Ich hatte mir für das erste Experten-Dojo zwei Dinge auf der Agenda. An erster Stelle stand nochmals die Implementierung des <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_FizzBuzz">FizzBuzz-Katas</a> auf dem Programm. Nach dem Dojo hatte ja auch schon <a href="http://ralfw.blogspot.com/2009/09/code-kata-statt-thai-chi-vor-dem.html">Ralf das FizzBuzz Code Kata</a> implementiert. Also dachte ich mir, zum aufwärmen ist das bestimmt eine gute Aufgabe.</p>
<p>Wir haben uns an die Aufgabe im Modus &#8220;<a href="http://codingdojo.org/cgi-bin/wiki.pl?RandoriKata">Randori</a>&#8221; herangewagt. Ich muss sagen, für diesen allerersten Versuch, eine Code Kata per Randori zu lösen lief es erstaunlich gut. Schnell haben alle Teilnehmer festgestellt, dass es eine Übereinstimmung über die Herangehensweise der Implementierung geben muss. Die Tests waren trivial und dementprechend weniger Gegenstand der Diskussion.</p>
<p>Darüber hinaus war es interessant zu beobachten, dass auch bei der geballten Ladung an Kompetenz und Erfahrung die Implementierungsgeschwindigkeit sich nicht daramatisch verkürzt. (Zum Vergleich: Im Einsteiger-Dojo wurde FizzBuzz in ca. 2 Stunden gelöst, die Experten Runde hat knapp 1 Stunde gebraucht). Der Grund dafür sind vorrangig weiche Faktoren wie Teamfindung und -bildung. Aber auch fachliche Bremsspuren waren zu beobachten: Die Teilnehmer haben sich z.T. bei der Implementierung um Designfragen gekümmert &#8211; wohl mit den Gedanken der Wierderverwendbarkeit und Generalisierung im Hinterkopf. Dieser Hauch von &#8220;Design-Upfront&#8221; wurde aber schnell erkannt und ausgeräumt.</p>
<p>Nach einer kurzen Denk- und Verschnaufpause haben wir uns an das zweite <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_RPNCalculator">Code Kata &#8220;RPN Calculator&#8221;</a> herangewagt. Dabei geht es um die Simulation eines Taschenrechners, welches mit umgekehrt polnischer Notation arbeitet.</p>
<p>Nach der Vorstellung des Kata und der dazu gehörigen Akzeptanzkriterien ging es wieder mit Schwung los. Unterschied zum ersten Mal: Es wurde nicht sofort mit den Tests losgelegt, sondern in der Runde eine grundsätzliche Einigung über das Verständnis der Aufgabe und damit &#8220;grobe&#8221; Design der Implementierung herbeigeführt. Erst dann ging es los mit dem klassischen TDD. Test &#8211; Rot &#8211; Implementieren &#8211; Test &#8211; Grün &#8211; Refaktorisieren &#8211; Test &#8211; Grün.</p>
<p>Nach der Implementierung der Grundfunktionalität (die Addition und Subtraktion waren funktional korrekt), ging es ans Refaktorisieren. Hier wurden zur Beseitigung von Code-Redundanz in mehreren Methoden einer Klasse zwei Lösungsansätze verfolgt. <div id="attachment_342" class="wp-caption aligncenter" style="width: 585px"><img src="http://www.gmbsg.com/stories/wp-content/uploads/2009/09/rpn_calc_template_method.png" alt="Template Methode" title="Template Methode" width="575" height="334" class="size-full wp-image-342" /><p class="wp-caption-text">Template Methode</p></div> Der erste Ansatz war ein klassischer OO-Lösungsweg: Die Einführung einer abstrakten Basisklasse, deren Kindklassen und die Implementierung des <a href="http://de.wikipedia.org/wiki/Schablonenmethode">&#8220;Template Method&#8221; Patterns (deutsch: Schablonenmethode)</a> haben zur Lösung des Dilemmas sichtlich beigetragen. Ein wie viele Teilnehmer bestätigten genereller und wartbarer Ansatz, aber mit einem relativ hohen Refaktorisierungsaufwand.</p>
<p>Der zweite Lösungsweg war im Gegensatz zum ersten ein ein äußerst effektiver: Die Übergabe einer Lamda-Funktion auf eine private &#8220;Template Methode&#8221;. Im Endeffekt die selbe Lösung, halt funktional statt orientiert an der &#8220;reinen&#8221; OO-Lehre:</p>
<pre name="code" class="csharp">
...
public void Add()
{
    this.Calculate((x, y) => x + y);
}

private void Calculate(Func&lt;decimal, decimal, decimal&gt; op)
{
   /* get x somewhere */
   /* get y somewhere */

   decimal result = op(x, y);

   /* put result somewhere */
}
...
</pre>
<p>Ich möchte jetzt nicht zu sehr ins Detail eingehen &#8211; jedoch war deutlich erkennbar, dass die Teilnehmer für beide Lösungswege offen waren &#8211; abhängig vom gegebenen &#8220;realen&#8221; Kontext würde man die eine oder andere Verfahrensweise bevorzugen.</p>
<p>Abschliessend kann ich nur sagen, war dieser erste .NET Coding Dojo für Experten ein gelungenes Event &#8211; nicht zuletzt wegen der regen und aktiven Beteiligung der Teilnehmer. Ich finde diese Art des Lernens, Informationsaustausches und &#8220;Networkings&#8221; zunehmend attraktiv und spannend. Das macht Lust auf mehr!</p>
<p>Ich freue mich schon auf das nächste .NET Coding Dojo! Hier nochmal die nächsten Termine für die Dojo&#8217;s in München: am <a href="http://dotnetdojo.ning.com/events/net-coding-dojo-muenchen">7. Oktober das .NET Coding Dojo für Einsteiger</a> und am <a href="http://dotnetdojo.ning.com/events/net-coding-dojo-muenchen-2">21. Oktober das .NET Coding Dojo für Experten</a>! Auf geht&#8217;s: jetzt anmelden via <a href="http://dotnetdojo.ning.com/">Ning</a> oder <a href="https://www.xing.com/net/netdojo/">Xing</a>! Ich bin dabei!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/ndc-net-coding-dojo-mit-rechenschieber/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter: Zwischen Kommunikation &amp; Kommerz</title>
		<link>http://www.gmbsg.com/twitter-zwischen-kommunikation-kommerz/</link>
		<comments>http://www.gmbsg.com/twitter-zwischen-kommunikation-kommerz/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 11:42:31 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=332</guid>
		<description><![CDATA[In diesem Post bewege ich mich ein wenig abseits von .NET, C# und dem Software-Entwicklungs-Alltag. Es geht meht um das digitale Leben. Seit nun einiger Zeit scheint ja der halbe Globus zu twittern. Der Hype um Twitter und das Gezwitschere ...]]></description>
			<content:encoded><![CDATA[<p>In diesem Post bewege ich mich ein wenig abseits von .NET, C# und dem Software-Entwicklungs-Alltag. Es geht meht um das digitale Leben. Seit nun einiger Zeit scheint ja der halbe Globus zu twittern. Der Hype um Twitter und das Gezwitschere hört nicht auf.</p>
<p>Ich (als <a href="http://www.twitter.com/ilkerde">@ilkerde</a>) bin ja mittlerweile auch &#8220;auf den Zug&#8221; aufgesprungen und möchte hier mal meine Eindrücke wiedergeben.</p>
<p>Zunächst einmal denke ich das der Hype um das Gezwitschere nicht berechtigt ist. Abgesehen von der trivialen Idee &#038; Technologie ist Twitter für mich grundsätzlich kein neues Kommunikationsmedium. Es ist eine Symbiose aus Broadcast-SMS, Blog (RSS-Feed) und Chat. &#8220;Microblogging&#8221; als neues digital-soziales Sprachrohr &#8211; &#8220;Nein&#8221;, würde ich sagen. Wohl eher eine weitere Trendform der invertierten Informationsbeschaffung.</p>
<h3>Eine Form der invertierten Informationsbeschaffung</h3>
<p>&#8220;Ich suche nicht mehr die Information, die Information kommt zu mir&#8221; &#8211; sagt <a href="http://heikoditges.de/">Heiko Ditges</a>, wohl mit einer der wichtigsten <a href="http://www.internetworld.de/Menschen-Meinungen/Branchentalk/Five-People-to-Watch-Social-Media-Macher/%28offset%29/1">Social Media Experten Deutschlands</a>. Naja, das mag ja schön und gut sein. Aber Twitter ist längst kein Kommunikationmittel mehr, mit dem soziale Kontakte gepflegt werden. Twitter ist auch ein weiterer Schritt in Richtung Vermarktung der sozialen Lebensbereiche. Das mag für den einen oder anderen erschreckend wirken &#8211; ist aber meiner Meinung nach nicht so schlimm, wie es aussieht.</p>
<p>Der Kommerz hat uns in vielen Lebensbereichen längst eingeholt &#8211; sei es &#8220;klassisch&#8221; im Flimmerkasten, dem Handy, dem Computerspiel oder eben auch bei sozialen Aktivitäten. Es gilt mit den Medien, in die der &#8220;Kommerz&#8221; zu uns dringt, richtig umzugehen. Die oft besagte und mystische &#8220;Medienkompetenz&#8221; ist der entscheidende Schlüssel, um Community-Plattformen wie XING, Facebook oder StudiVZ effektiv und in geordnetem Maß zu nutzen. Meiner Meinung nach gilt das selbe auch für &#8220;neue&#8221; Kommunikationsformen wie Twitter.</p>
<h3>Wir werden Omnimedial, alle gemeinsam</h3>
<p>Meidenkompetenz hin oder her, es schlägt sogar mir als aufgeschlossenen, omnimedial kommunizierenden auf den Magen wenn ich alle paar Tage Spam-Follower blockiere, ausschliesslich Retweets lese oder sehe, wie mittlerweile nahezu jedes Unternehmen tweetet und dies sogar akribisch &#8211; <a href="http://birgithapfelmeier.wordpress.com/2009/09/05/how-can-twitter-be-used-by-companies/">in gewissem Maße auch &#8220;strategisch&#8221;</a> &#8211; für die Vermarktung der eigenen Produkte nutzen möchte. Der Twitterzug ist nun mal am Rollen und jeder möchte mitfahren. Buzzwords wie Enterprise 2.0 und Social Media Awareness sind kaum mehr aus Marketing Jour-Fixe&#8217;s wegzudenken.</p>
<p>Wichtig ist hierbei die Erkenntnis, das &#8220;Medium Microblogging&#8221; nicht für o.g. Kommerzialisierungsbewegungen verantwortlich zu machen. Medien werden immer Zielscheibe der Vermarktung sein und bleiben. Radiowerbung, Fersehwerbung, Onlinewerbung und eben auch &#8220;soziale Werbung&#8221;. Twitter ist trotzdem für mich und andere interessant, genauso wie Millionen von Menschen &#8220;Wer wird Millionär&#8221; gucken, obwohl sie alle 10 Minuten mit Werbung berieselt werden. </p>
<p>In genau diesem Maße macht es auch Sinn, zu zwitschern und aktiv an der digitalen Gesellschaft teilzunehmen Das erst kürzlich stattgefundene <a href="http://munich.twestival.com/">Twestival in München</a> ist ein Paradebeispiel für die effektive Nutzung der Twitterei. Natürlich ist auch hier der unaufdringliche Duft des Kommerz, des viralen Vermarktens und Networkings in der Luft. Aber &#8211; und das ist entscheidend &#8211; es ist eine maßvolle, sowohl für die Sache, für die Gesellschaft und für den einzelnen Teilnehmer verwertbare Aktion.</p>
<p>Darüber hinaus denke ich wird das Microblogging in absehbarer Zeit wieder an Attraktivität verlieren.  Es ist kein Medium der Neuzeit, sondern eine einfache, in meinen Augen zu einfache Drehscheibe für Nachrichten. Keine Semantik, eine unscharfe Selektion der Information und die mehrheitliche Fokussierung auf den &#8220;Anreiz&#8221; zum Klick auf die durch bit.ly und Konsorten gekürzten Links machen Tweets zu einem Trend &#8211; aber nicht zu einer ernst zu nehmenden Kommunikationsplattform. Twitter: Interessante Menschen, Interessante Themen &#8211; aber keine soziale und mediale Revolution.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/twitter-zwischen-kommunikation-kommerz/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MucNetDojo &#8211; Bericht vom ersten .Net Coding Dojo</title>
		<link>http://www.gmbsg.com/mucnetdojo-bericht-vom-ersten-net-coding-dojo/</link>
		<comments>http://www.gmbsg.com/mucnetdojo-bericht-vom-ersten-net-coding-dojo/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 17:49:21 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=328</guid>
		<description><![CDATA[Wow! Das erste .NET Coding Dojo war gestern wirklich Toll! Wie schon in einem vorherigen Post angekündigt, haben wir gestern das erste .NET Coding Dojo Deutschlands abgehalten. Pete war ein super Master und hat mit meiner Wenigkeit und den tollen ...]]></description>
			<content:encoded><![CDATA[<p>Wow! Das erste .NET Coding Dojo war gestern wirklich Toll! Wie schon in einem vorherigen <a href="http://www.gmbsg.com/stories/?p=296">Post</a> angekündigt, haben wir gestern das erste .NET Coding Dojo Deutschlands abgehalten. <a href="http://www.xing.com/profile/Peter_Sacchet">Pete</a> war ein super Master und hat mit <a href="http://www.xing.com/profile/Ilker_Cetinkaya">meiner Wenigkeit</a> und den tollen Teilnehmern das <a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Kata_FizzBuzz">FizzBuzz Kata</a> gelöst. Alle haben super mitgemacht und wir hatten schon nach 2 Stunden ein fertiges Resultat!</p>
<p>Besonders gut fand&#8217; ich persönlich das Pete am Anfang besonderen Wert auf die Unit Tests gelegt hat. Dies hat allen gezeigt, wie gut und produktiv testgetriebene Entwicklung funktionieren kann. Ein weiterer dicker Pluspunkt war die Offenheit der Teilnehmer &#8211; alle waren von Anfang an bei der Lösungsfindung dabei. Es war wirklich interessant festzustellen, wie verschiedene Ansätze zum lösen der Aufgabe gesucht und gefunden wurden.</p>
<p>Nachdem die Grundfunktionalität des &#8220;FizzBuzz&#8221;-Generators implementiert war, hat Pete den 2. Gang eingelegt und uns alle zu ein wenig mehr OO-Design aufgefordert. Die Anforderung, &#8220;schreibe den Generator so, dass beliebig viele Bedinungen hinzugefügt werden können&#8221; hat am Anfang schon ein wenig Kopfschmerzen verursacht. Dennoch war das Team schnell auf der richtigen Fährte und hat die einzelnen Bedingungen in eigene Filter-Klassen refaktorisiert.</p>
<p>Ach was soll ich sagen, es war ein gelungener Coding-Abend, vor allem weil die Atmosphäre gestimmt hat und das Thema immer spannend blieb.</p>
<p><strong>Danke an alle Teilnehmer</strong>, er hat wirklich Spass gemacht! Hoffentlich auf Bald in einem der nächsten Dojo&#8217;s, am <strong><a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Termin_23.09.09">23. September 2009 Meijin für Experten</a></strong> oder am <strong><a href="http://www.gmbsg.com/works/index.php?title=MucNetDojo_-_Termin_07.10.09">07. Oktober 2009 Shinzan für Einsteiger</a></strong>! Ich freue mich schon auf das erste Experten-Dojo.</p>
<p>Let&#8217;s Code In Dojo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/mucnetdojo-bericht-vom-ersten-net-coding-dojo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agile Prozesse vs. Formale Prozesse&#8230;</title>
		<link>http://www.gmbsg.com/agile-prozesse-vs-formale-prozesse/</link>
		<comments>http://www.gmbsg.com/agile-prozesse-vs-formale-prozesse/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 09:26:40 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></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/stories/?p=321</guid>
		<description><![CDATA[In den letzten Jahren hat sich in der Software-Entwicklung die Agile Vorgehensweise als gängiges und erforlgsversprechendes Modell etabliert. Doch wie sieht es mit der Implementierung aus? Ganz besonders &#8220;strikt&#8221; geführte Unternehmen tun sich schwer, die agilen Prozesse einzuführen und profitabel ...]]></description>
			<content:encoded><![CDATA[<p>In den letzten Jahren hat sich in der Software-Entwicklung die Agile Vorgehensweise als gängiges und erforlgsversprechendes Modell etabliert. Doch wie sieht es mit der Implementierung aus? Ganz besonders &#8220;strikt&#8221; geführte Unternehmen tun sich schwer, die agilen Prozesse einzuführen und profitabel einzusetzen. </p>
<p>Dabei sind es meist die Unternehmen, die sich schon bei der formalen Prozessadaption schwer getan haben. Eine kleine Matrix verdeutlicht dieses Dilemma:</p>
<p><img src="http://www.gmbsg.com/stories/wp-content/uploads/2009/09/agile_vs_formal.png" alt="Agil vs. Formal" title="Agil vs. Formal" width="526" height="518" class="aligncenter size-full wp-image-322" style="border:none;"/></p>
<p>Sowohl agile Propzesse als auch geführte Prozesse liefern gute Projektergebnisse, wenn sie verstanden sind und nicht ad-hoc oder bürokratisch umgesetzt werden. Das Problem ist hierbei allerdings, das gerade Unternehmen, die die &#8220;neuen&#8221; agilen Prozesse adaptieren, in der Transitionsphase besonders unter der limitierten Prozessfähigkeit leiden. </p>
<p>Genau in dieser Phase empfindet man beide Vorgehensmodelle als nicht zielführend. die Arbeitsabläufe sind chaotisch &#038; bürokratisch gleichermaßen. Abhilfe schafft da nur die Konzentration auf ein Vorgehensmodell und die konsequente Stärkung der Prozesskenntnisse. Nur dadurch erreicht man die gewünschte Qualität &#038; Effizienz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/agile-prozesse-vs-formale-prozesse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wozu Unit Tests?</title>
		<link>http://www.gmbsg.com/wozu-unit-tests/</link>
		<comments>http://www.gmbsg.com/wozu-unit-tests/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 08:28:06 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=315</guid>
		<description><![CDATA[Die Frage stellen sich einige Entwickler und Manager immer wieder. Nicht nur diejenigen (hoffentlich wenigen), die noch keine Unit Tests schreiben, sondern vielmehr jene, die schon seit längerem Unit Tests einsetzen. Der Hauptgrund dafür ist sicherlich die falsche Anwendung und ...]]></description>
			<content:encoded><![CDATA[<p>Die Frage stellen sich einige Entwickler und Manager immer wieder. Nicht nur diejenigen (hoffentlich wenigen), die noch keine Unit Tests schreiben, sondern vielmehr jene, die schon seit längerem Unit Tests einsetzen. Der Hauptgrund dafür ist sicherlich die falsche Anwendung und falsche Erwartungshaltung beim einsetzen von Unit Tests.</p>
<p>Steve Sanderson beantwortet diese Fragen in seinem <a href="http://blog.codeville.net/2009/08/24/writing-great-unit-tests-best-and-worst-practises/">Unit Test Best &#038; Worst Practices</a> Artikel äußerst anschaulich. Ich möchte hier dennoch einen kurzen Abriss über die Fragestellung und seine Antworten geben.</p>
<p>Zunächst einmal sollte die Eingangsfrage geklärt werden: <strong>Wozu Unit Tests? Ganz einfach: Um konsequent stabile Software entwickeln zu können</strong>. Bei Unit Tests geht&#8217;s also nicht um Fehlerfindung (jeglicher Art), sondern um eine Entwicklungsmethode, von vornherein Komponenten einer Software funktional korrekt und technisch stabil zu entwickeln. Unit Tests helfen auch deutlich bei der Verwaltung und Veränderung von Komponenten (z.B. durch Extensions oder Refactoring), um Instabilitäten während Refactorings zu erkennen und zu beheben.</p>
<h3>Gute und schlechte Unit Tests</h3>
<p>Damit kommt man auch unweigerlich zur nächsten Problemstellung. Wie kann ich Unit Tests anwenden, dass Sie mir dabei helfen, stabile Software zu entwickeln? Einfacher grafragt Was sind &#8220;gute&#8221;, und was sind &#8220;schlechte&#8221; Unit Tests? Steve beantwortet diese Frage aus der TDD-Sicht. Für ihn sind Unit Tests besonders dann gut, wenn sie ausschliesslich eine funktionale Beschreibung der Software-Komponente abbilden. Das kann man natürlich besonders dann gut machen, wenn man nichts über die Art und Weise der Implementierung der Funktionalität kennt, also klassisches TDD Test-First betreibt.</p>
<p>Ein ebenso guter Test (welches man mit Unit Testing Werkzeugen abbilden kann) ist ein echter Integrations-Test. Bei dieser Art von Tests wird nicht die Software in ihren einzelnen Bestandteilen (Klassen, Komponenten) betrachtet, sondern als Ganzes aus der Sicht des Benutzers. Es werden funktionale Bereiche getestet, ohne die Implementierung der Software zu kennen. Diese Integrations-Tests sind besonders hilfreich Regressionen des Systems festzustellen.</p>
<p>Damit ist auch beantwortet, welche Unit Tests nun schlechte sind: alle anderen. Im Alltag spiegelt sich das durch Tests wieder, die zu sehr auf die Implementierung eingehen (z.B. ein *Returns_Not_Null Test), auf die technischen Elemente (z.B. ein *Db_User_Created Test) oder eine komische Mischung aus reinem Unit Test und Integrations-Test sind. </p>
<h3>Unit Tests sind Katalysator für komponenten-orientierte Software</h3>
<p>Die Beurteilung über schlechte und gute Unit Tests ist im täglichen Einsatz von Unit Tests immer wieder in den Vordergrund zu rücken, denn dadurch lässt sich auch einiges über das System-Design und die Software-Architektur sagen. Ein System, welches das schreiben und verwalten von Unit Tests leicht ermöglicht, bei dem die Unit Tests reine Funktionalitäten testen, bei dem Unit Tests nicht von anderen Tests oder sogar der Laufzeitumgebung abhängig sind ist ein deutlich auf den Grundkonzepten der Objekt- und Komponentenorientierung aufgebautes System. Die Kohäsion ist im Mikro-System sehr hoch, um Makro-System sehr niedrig. Ein Austausch einer Komponente ist problemlos, aber funktional immer wirkend. </p>
<p>Sind die Symptome jedoch, dass man für die Erstellung der Unit Tests schon Zielbereiche suchen muss, das Unit Tests nur rudimentäre fachliche Aussagen treffen oder das Verwalten der Test Suite mit zunehmender Test-Anzahl immer aufwendiger und schwieriger wird, dann kann man daraus ableiten, dass das System-Design der Software tendenziell nicht auf Komponentenorientierung ausgelegt ist. Überdies lässt sich weiter schlußfolgern, dass das System mit hoher Wahrscheinlichkeit die Prinzipien &#8220;Single Responsibility&#8221; und des &#8220;Divide &#038; Conquer&#8221; missachtet.</p>
<h3>Schmerztherapie Unit Tests</h3>
<p>Besonders bei existierenden Systemen, bei denen die Weiterentwicklung strategisch wichtig ist und die ökonomische Effizienz gesteigert werden soll, sind echte, gute Unit Tests ein mittelfristig starkes Werkzeug, um das gesamte System effizienter und stabiler zu gestalten. Damit ist nicht nur die Funktionalität (Integrity) oder Defekt-Quote (Defect Rate) gemeint, sondern im Besonderen der Verwaltungsaufwand (Maintenance), die Weiterentwicklungskosten (Features) und die hochgelobte niedrige Reaktionslatenz zum Markt (Time To Market). Manchmal ist es schwer Unit Tests zu schreiben, weil man grundlegende Systemkomponenten anders aufbauen und strukturieren muss, um diese testbar zu machen. </p>
<p>Manchmal ist es schwer, Tests für Dinge zu schreiben, deren Implementierung nicht bekannt ist. Manchmal ist es schwer, die geänderte Grundfunktionalität in dutzenden Tests nochmals zu adaptieren. Doch am Ende wird man belohnt mit schnellerer Feature-Entwicklung und einer besonders vertrauenswürdigen, stabilen Software. </p>
<p><strong>Unit Testing tut gut, auch wenn es weh tut.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/wozu-unit-tests/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MucNetDojo &#8211; .NET Coding Dojo in München</title>
		<link>http://www.gmbsg.com/mucnetdojo-net-coding-dojo-in-munchen/</link>
		<comments>http://www.gmbsg.com/mucnetdojo-net-coding-dojo-in-munchen/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 14:15:56 +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[3.5]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[Ar]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Hands-On]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=296</guid>
		<description><![CDATA[In den letzten Wochen &#038; Tagen haben Pete und ich immer wieder Leute getroffen, die Veranstaltungen mit Hands-On über .NET und C# vermissen. Nun, hier in München gibt&#8217;s ja die aktive .NET Community. Die Events der DNUG-München sind sehr gut, ...]]></description>
			<content:encoded><![CDATA[<p>In den letzten Wochen &#038; Tagen haben <a href="http://www.xing.com/profile/Peter_Sacchet">Pete</a> und ich immer wieder Leute getroffen, die Veranstaltungen mit Hands-On über .NET und C# vermissen. Nun, hier in München gibt&#8217;s ja die <a href="http://www.munichdot.net">aktive .NET Community</a>. Die Events der DNUG-München sind sehr gut, allerdings sehr Info-Lastig. Meist geht es um Technologien, neue Produkte, Features oder Tools die in einer Präsentation oder in Sessions vorgetragen werden. Im Übrigen kann ich jedem .NET Programmierer die Events nur wärmstens empfehlen.</p>
<p>Der Hands-On-Aspekt &#8211; also wenn es um das klassische &#8220;Learning by Doing&#8221; geht &#8211; ist hier leider nicht immer gegeben. Besonders .NET Einsteiger tun sich schwer und probieren Sachen zu Hause so lange aus, bis es für sie zu passen scheint. Aber auch eingefleischte .NET Cracks brauchen den Austausch mit anderen, um ihr Toolset und den Methodenraum zu erweitern.</p>
<p>Nach einigem hin und her, Gesprächen mit Freunden und Kollegen haben wir uns nun entschlossen, die .NET Community mit einem .NET Coding Dojo zu bereichern. Wir werden ab September jeden 1. und 3. Mittwoch von 19-21 Uhr Coding Dojos für .NET &#8211; im speziellen mit C# &#8211; veranstalten. Dabei wird der erste Mittwoch des Monats zugeschnitten sein für &#8220;Learners&#8221;, also Leute mit wenig C# und .NET Erfahrung. Der dritte Mittwoch im Monat ist der &#8220;Masters&#8221; Dojo, in dem komplexere Themen, Patterns und Toolsets behandelt werden. Bei beiden Dojos geht es natürlich um die Entwicklung in .NET und C#, halt nur auf einem anderen Level. </p>
<p>Übrigens, die Dojo&#8217;s wurden von uns absichtlich für extreme Levels ausgelegt. Wir sind der Meinung das gerade Anfänger die praktische Erfahrung brauchen, um sich mit der Sprache und den Tools auseinanderzusetzen und Sicherheit im Umgang mit dem .NET Framework zu haben. Gleichermaßen denken wir, dass besonders hocherfahrene .NET Entwickler den gleichen &#8220;Bedarf&#8221; an praktischem Austausch haben, um sich mit Ihren Tools und Methoden im Exzellenz-Bereich zu verbessern.</p>
<p>Die Dojo-Veranstaltungen werden in den Räumen von AutoScout24, Rosenheimer Strasse 143d, durchgeführt. Vielen Dank an dieser Stelle nochmal an <a href="http://www.xing.com/profile/Matthias_Patzak">Matthias Patzak</a> von AutoScout24, der uns die Räume und organisatorischen Grundlagen zur Verfügung stellt.</p>
<p>Die erste Veranstaltung findet am 9. September statt und ist das erste Beginners Dojo, geleitet von Pete. Für Anmeldung zu den Veranstaltungen, Kontakt, Austausch von Code &#038; Anregungen einfach zur <a href="http://groups.google.com/group/mucnetdojo">MucNetDojo Group</a> oder eine Email an die Gruppe schicken.</p>
<p><strong><em>Auf einen Blick, Fragen &#038; Antworten</em></strong></p>
<p><strong>F: Was ist ein Coding Dojo?</strong><br />
A: Ein coding Dojo ist eine Session, in der alle gemeinsam eine Programmieraufgabe lösen. Siehe: <a href="http://codingdojo.org">http://codingdojo.org</a></p>
<p><strong>F: Wann findet das .NET Coding Dojo in München statt?</strong><br />
A: Jeden 1. und 3. Mittwoch. Der 1. Mittwoch für &#8220;Starter&#8221; (Unerfahrenere), der 3. Mittwoch für &#8220;Master&#8221; (Experten)</p>
<p><strong>F: Wo kann ich mich anmelden?</strong><br />
A: Viele Wege führen zum Ziel</p>
<ul>
<li>Einfach Kommentar auf diesen Artikel schreiben, oder</li>
<li>über die Google Gruppe <a href="http://groups.google.com/group/mucnetdojo">http://groups.google.com/group/mucnetdojo</a> (Gruppenverteiler), oder</li>
<li>über die XING-Event Liste<br/>Starter: <a href="https://www.xing.com/events/net-coding-dojo-munchen-starter-386036">https://www.xing.com/events/net-coding-dojo-munchen-starter-386036</a><br/>Master: <a href="https://www.xing.com/events/net-coding-dojo-munchen-master-386038">https://www.xing.com/events/net-coding-dojo-munchen-master-386038</a></li>
</ul>
<p><strong>F: Wo und wann ist die erste Coding Dojo</strong><br />
A: Mi, 9. September 2009, AutoScout24, Rosenheimer Strasse 143d</p>
<p>Also, Spread the word und auf geht&#8217;s!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/mucnetdojo-net-coding-dojo-in-munchen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Organische Darstellung von Code</title>
		<link>http://www.gmbsg.com/organische-darstellung-von-code/</link>
		<comments>http://www.gmbsg.com/organische-darstellung-von-code/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 22:40:47 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=289</guid>
		<description><![CDATA[&#8230; ist eine nette und durchaus sehenswerte Idee. Hier das prominente Beispiel &#8220;Python&#8221;.


code_swarm &#8211; Python.

Wäre interessant zu wissen wie der eigene Code sich so entwickelt hat? Kein Problem, Code Swarm ist Open Souce.
]]></description>
			<content:encoded><![CDATA[<p>&#8230; ist eine nette und durchaus sehenswerte Idee. Hier das prominente Beispiel &#8220;Python&#8221;.</p>
<div class="flvid">
<object width="400" height="302"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1093745&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ffffff&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1093745&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ffffff&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"></embed></object>
<p><a href="http://vimeo.com/1093745">code_swarm &#8211; Python</a>.</p>
</div>
<p>Wäre interessant zu wissen wie der eigene Code sich so entwickelt hat? Kein Problem, <a href="http://code.google.com/p/codeswarm/">Code Swarm ist Open Souce</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/organische-darstellung-von-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Menschen programmieren&#8230;</title>
		<link>http://www.gmbsg.com/menschen-programmieren/</link>
		<comments>http://www.gmbsg.com/menschen-programmieren/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 10:45:39 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Faszination]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Wissenschaft]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=280</guid>
		<description><![CDATA[&#8230;kann so einfach und cool sein. Da kommt man als Rechner-Hacker schon mal ins schwärmen. So zeigte Bobby McFerrin auf der WorldScience wie &#8220;Brain-Hacking&#8221; (also neuronale Programmierung, auditiv &#038; visuell) richtig gut funktionieren kann. 



World Science Festival 2009: Bobby McFerrin ...]]></description>
			<content:encoded><![CDATA[<p>&#8230;kann so einfach und cool sein. Da kommt man als Rechner-Hacker schon mal ins schwärmen. So zeigte Bobby McFerrin auf der <a href="http://www.worldsciencefestival.com/">WorldScience</a> wie &#8220;Brain-Hacking&#8221; (also neuronale Programmierung, auditiv &#038; visuell) richtig gut funktionieren kann. </p>
<div class="flvid">
<object width="400" height="230"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name=”wmode” value=”transparent”><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5732745&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ffffff&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5732745&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ffffff&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="230" wmode="transparent"></embed></object>
</div>
<p><a href="http://vimeo.com/5732745">World Science Festival 2009: Bobby McFerrin Demonstrates the Power of the Pentatonic Scale</a>.</p>
<p>Einfach nur faszinierend!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/menschen-programmieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code in the dark&#8230;</title>
		<link>http://www.gmbsg.com/code-in-the-dark/</link>
		<comments>http://www.gmbsg.com/code-in-the-dark/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 15:22:10 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=276</guid>
		<description><![CDATA[Im dunklen zu programmieren ist für fast jeden Geek eine Wohltat &#8211; so auch für mich. Einige Stammleser werden das wissen, zumal ich schon seit geraumer Zeit ein dunkles Farbschema für Visual Studio verwende. 
Am Arbeitsplatz verliere ich leider die ...]]></description>
			<content:encoded><![CDATA[<p>Im dunklen zu programmieren ist für fast jeden Geek eine Wohltat &#8211; so auch für mich. Einige Stammleser werden das wissen, zumal ich schon seit geraumer Zeit <a href="http://www.gmbsg.com/stories/?p=61">ein dunkles Farbschema für Visual Studio</a> verwende. </p>
<div id="attachment_278" class="wp-caption alignright" style="width: 310px"><a href="http://www.gmbsg.com/stories/wp-content/uploads/2009/08/dark-g-blue-screen.png"><img src="http://www.gmbsg.com/stories/wp-content/uploads/2009/08/dark-g-blue-screen-300x232.png" alt="Dark-G-Blue" title="dark-g-blue-screen" width="300" height="232" class="size-medium wp-image-278" /></a><p class="wp-caption-text">Dark-G-Blue</p></div>
<p>Am Arbeitsplatz verliere ich leider die Settings immer wieder durch das Hopping von Rechner zu Rechner. Da hilft nur eines &#8211; konsequent nachinstallieren bzw. die Settings immer griffbereit haben.</p>
<p>Letztens war es wieder einmal soweit &#8211; das grell-weisse Visual Studio hat meine Augen zu sehr penetriert. Also Farbschema laden und &#8211; endlich! Ruhe am Screen. Kurzerhand habe ich gleich mal ein paar kleine Optimierungen an den Farben vorgenommen &#8211; so habe ich auch das Highlighting und debugging verbessert.</p>
<p>Das Farbschema zum Download: <a href='http://www.gmbsg.com/stories/wp-content/uploads/2009/08/dark-g-blue.zip'>Dark-G-Blue Visual Studio 2008 Color Scheme</a>.</p>
<p>PS: Jep, nach langen Wochen wieder ein Blog-Eintrag. Ich habe mir eine etwas längere Pause gegönnt &#8211; schliesslich sind Geeks auch Menschen. Die Pause ist vorbei und ich freu&#8217; mich schon wieder auf .NET, Entwicklung, Architektur und die restlichen digitalen Finessen :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/code-in-the-dark/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
