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

<channel>
	<title>.NET Stories: Digitale Erfahrungen &#187; Software-Entwicklung</title>
	<atom:link href="http://www.gmbsg.com/tag/software-entwicklung/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gmbsg.com</link>
	<description>So einfach wie möglich. Aber nicht einfacher.</description>
	<lastBuildDate>Tue, 31 Aug 2010 22:21:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Das Agile Team in Nahaufnahme</title>
		<link>http://www.gmbsg.com/das-agile-team-in-nahaufnahme/</link>
		<comments>http://www.gmbsg.com/das-agile-team-in-nahaufnahme/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 10:21:08 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Works]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Emergenz]]></category>
		<category><![CDATA[Performance]]></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[XP]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1270</guid>
		<description><![CDATA[Oder: Nähe ist besser als Distanz
Es ist schon eine wundersame Welt. Also, in meinen Augen natürlich. Ich schreibe diesen Artikel ja auch, also kann es nur eine persönliche und subjektive Meinung sein. Aber immerhin, es ist eine Meinung, und das ...]]></description>
			<content:encoded><![CDATA[<h3>Oder: Nähe ist besser als Distanz</h3>
<p>Es ist schon eine wundersame Welt. Also, in meinen Augen natürlich. Ich schreibe diesen Artikel ja auch, also kann es nur eine persönliche und subjektive Meinung sein. Aber immerhin, es ist eine Meinung, und das sogar ziemlich deutlich. Denn, ich habe den Artikel, die Kommentare und den Folge-Artikel von Golo zu seiner These &#8220;Räumliche Nähe wird überbewertet&#8221; gelesen. Das ich da anderer Meinung bin, habe ich ja schon gebloggt. Was also noch darauf rumreiten? Die Antwort ist einfach: Es ist wichtig, deswegen.</p>
<h3>Kommunikation = Mitteilung + Wahrnehmung</h3>
<p>Doch zunächst möchte ich in aller (nur notwendig langen) Kürze auf ein verwandtes Thema eingehen: Die Kommunikation. Besser gesagt, die <a href="http://de.wikipedia.org/wiki/Zwischenmenschliche_Kommunikation">zwischenmenschliche Kommunikation</a>. Kommunikation ist eine schwierige und herausfordernde Kunst. Der eine sagt etwas, der andere versteht etwas. Ob es dann das ist, was der eine sagen wollte und der andere verstehen wollte, hängt von unheimlich vielen Faktoren und komplexen Sachverhalten ab. Doch zunächst gilt es festzuhalten: <a href="http://twitter.com/ilkerde/status/21942161099">Kommunikation ist nicht nur Mitteilung, sondern auch Wahrnehmung</a>. So geschehen auch bei der &#8220;Blog-Kommunikation&#8221; zwischen mir, Golo und dem &#8220;Publikum&#8221; (also auch Dir, lieber Leser).</p>
<p>Mit Golo&#8217;s Aussage fing es an: &#8220;<a href="http://www.des-eisbaeren-blog.de/post/2010/08/19/Raumliche-Nahe-wird-uberbewertet.aspx">Räumliche Nähe wird überbewertet</a>&#8220;. Gut. Man könnte jetzt vieles wahrnehmen. Zum Beispiel könnte man wahrnehmen, dass Golo damit meint, dass ihm räumliche Nähe ein Graus ist. Oder man könnte wahrnehmen, dass Golo ein introvertierter, soziophober Alleingänger ist. Keines von dem ist der Fall. In meinen Augen ist derjenige, der so eine Wahrnehmung hat, einfach nicht aufgeschlossen und wohlwollend zu Golo&#8217;s Meinung. Dennoch &#8211; man könnte es sicherlich wahrnehmen.</p>
<p>Ich antwortete auf seine Aussage mit dem Artikel &#8220;<a href="http://www.gmbsg.com/raumliche-nahe-wird-unterschatzt/">Räumliche Nähe wird unterschätzt</a>&#8220;. Gut. Man könnte jetzt vieles wahrnehmen. Zum Beispiel könnte man wahrnehmen, das ich damit &#8220;Verteilte Teams sind nicht erfolgreich&#8221; postuliere. Oder man könnte wahrnehmen, das ich ein opportunitisch-dogmatischer Agile-Fetischist bin. Keines von dem ist der Fall. In meinen Augen ist derjenige, der so eine Wahrnehmung hat, einfach nicht aufgeschlossen und wohlwollend zu meiner Meinung. Dennoch &#8211; man könnte es sicherlich wahrnehmen.</p>
<p>Aber jetzt mal Tacheles kommuniziert: Wer sollte denn so etwas annehmen? Ich finde so eine Wahrnehmung absurd. Ja, geradezu lächerlich. Demjenigen, der wirklich allen ernstes Golo nachsagen möchte, dass er Colocation als &#8220;schädlich&#8221; einstuft, oder aber mir den Vorwurf macht, ich würde &#8220;Colocation über Alles!&#8221; predigen, dem traue ich auch zu, dass er in &#8220;<a href="http://www.youtube.com/watch?v=8QSgNM9yNjo">Satellite</a>&#8221; keine Liebeshymne sieht, sondern es als öffentliche Drohgebärde einer <a href="http://de.wikipedia.org/wiki/Stalking">Stalkerin</a> zu ihrem Opfer interpretiert. Soviel dazu.</p>
<h3>Die Mathematik der Meinung</h3>
<p>Zurück zum Thema, der räumlichen Nähe. Ich bin nach wie vor der Meinung, dass räumliche Nähe unterschätzt wird. Unterschätzt in vielerlei Hinsicht. Ich gehe zunächst auf eine Perspektive ein, die auch schon angesprochen wurde: Effizienz und Produktivität. Golo schreibt in einem Kommentar treffend seine Motivation:</p>
<blockquote><p>Golo: &#8220;&#8230;Es ging mir um die immer postulierte Allgemeingültig der Aussage &#8220;Colocation ist besser&#8221;. Zu zeigen, dass dem nicht so ist, genügt ein einziges Gegenbeispiel&#8230;&#8221;</p></blockquote>
<p>Meine Meinung dazu: Ja, Richtig und Nein, Falsch. Das ist nicht logisch? Macht nichts. Ist trotzdem so. </p>
<p>Denn: Ja, es ist richtig, dass Golo nur ein Gegenbeispiel zeigen muss, um die Allgemeingültigkeit ad acta zu legen. Und: Nein, es ist falsch, denn meiner Meinung nach ist das gewählte methodische Werkzeug &#8211; nämlich die Anwendung der Aussagenlogik und deren Beweismethoden &#8211; völlig unangebracht. Bei allem Respekt gegenüber der Professionalität und Kompetenz von Golo bin ich etwas irritiert, das gerade der Berater für agile Methoden die Colocation nicht zu favorisieren scheint.</p>
<p>Doch die Motivation verstehe ich nur allzu gut &#8211; es wird öfters die &#8220;Colocation&#8221; als Heilsbringer dargestellt. Dem ist nicht immer so. Aber muss man deswegen so eine trockene, wissenschaftliche Herangehensweise wählen? Ich denke, dass es nicht unbedingt notwendig gewesen wäre, denn schließlich führt die Bool&#8217;sche Algebra hin zu einer totalitären &#8220;Schwarz-Weiss&#8221;-Wahrnehmung (wie oben geschildert). Dabei ist in Wahrheit nicht schwarz oder weiss schön, sondern <a href="http://acab.muc.ccc.de/">alle Farben</a>.</p>
<p>Leider wird für meinen Geschmack bei diesem Thema zu tief in die mathematisch-naturwissenschaftliche Logik-Kiste gegriffen. Logik &#038; Mathematik sind mächtige Werkzeuge, die man oft und versatil einsetzen kann. Aber sie sind nicht die Weisheit für alle möglichen Systeme oder Lebenslagen. Ich meine, hier ist Logik alleine nicht das adequate Werkzeug. Vielmehr hilft meines Erarchtens hier der gesunde Menschenverstand mit dem unvergleichlichen Etwas, was uns Menschen auszeichnet: Emotion. Doch dazu komme ich gleich noch.</p>
<h3>Handlungsfähigkeit, Produktivität und Effizienz</h3>
<p>Fakt ist, dass Menschen, die an einem Ort, in einem Raum zusammenarbeiten, Ihre Arbeit in den meisten Fällen effizienter, effektiver und produktiver gestalten und erledigen. Abseits von Agilität und <a href="http://www.academypublisher.com/jsw/vol03/no04/jsw03043136.pdf">unabhängig von der eingesetzten agilen Managementmethode</a> stellt man fest: In sehr vielen Fällen ist ein &#8220;Warroom&#8221; oder &#8220;Teamroom&#8221; für eine erfolgreichere Gestaltung des Vorhabens <a href="http://possibility.com/Misc/p339-teasley.pdf">nicht nur hilfreich, sondern mit ausschlaggebend</a>. Darüber hinaus entwickelt sich ein deutlich zügigerer Durchlauf des Teams durch die Tuckman-Phasen. Mit der Zeit entwicklelt man auch ein viel besseres Verständnis zu den Aufgaben anderer und vermag auch, den anderen in brenzlichen Situationen zu helfen. Und manchmal ist man auch ganz glücklich, wenn einem selbst ein wenig unter die Arme gegriffen wird.</p>
<p>Es gibt dabei meiner Meinung nach aber noch einen weiteren wichtigen Aspekt. Es ist die Teamaufstellung. Es ist eines der Dinge, die bei der Diskussion für mein Empfinden viel zu wenig herausgearbeitet wurde. Oder besser auf Deutsch gesagt: es wurde einfach ignoriert. Schade. Denn ein agiles Team ist nur dann ein agiles Team, wenn es <a href="http://theagileproductmanager.blogspot.com/2008/07/whats-cross-functional-team-and-why.html">interdisziplinär (bzw. &#8220;cross-functional&#8221;) ist</a>. Warum das so ist, habe ich ja schon <a href="http://www.gmbsg.com/raumliche-nahe-wird-unterschatzt/">geschildert</a>. Der Effekt, der dabei entsteht, ist eine wesentlich effizientere Kommunikation zwischen den einzelnen Domänen- und Fach-Experten. Darüber hinaus werden intuitiv und äußerst effizient gemeinsame Schnittstellen und eine <a href="http://domaindrivendesign.org/node/132">Ubiquitous Language</a> entwickelt. </p>
<p>Es gibt noch eine <a href="http://www.smartagile.com/2007/08/team-co-location.html">Menge anderer Dinge</a>, die ein interdisziplinäre und lokale Teamaufstellung zu einer Präferenz zu anderen Teamstrategien macht. Doch der kausale Kern eines agilen Teams ist und bleibt geschäftsgetrieben. Ein agiles Team ist &#8220;im Kern&#8221; nur interdisziplinär, weil es der einzige Weg ist, ein Feature als Ganzes, also integer und abgeschlossen, umzusetzen. Das es nebenbei diese Aufgabe auch noch effektiver löst, als andere Teamaufstellungen, ist die &#8220;Sahne&#8221; auf dem Kuchen.</p>
<h3>Mi Kasa Es Su Kasa</h3>
<p>Ein weiterhin von Golo und anderen Kommentatoren kritisch beäugtes Merkmal von &#8220;Colocation&#8221; ist die &#8220;Minderung der Produktivität durch Störungen&#8221;. Diese Argumentation ist für <a href="http://www.agilegamedevelopment.com/2008/11/agile-principles-emphasize-face-to-face.html">Agilisten nichts Neues</a>. In meinen Augen ein Indiz für Ängste. Man befürchtet, dass man durch &#8220;den Lärm&#8221; und &#8220;die Unterhaltungen&#8221; im Raum nicht mehr konzentriert arbeiten kann, sich jeder die Kopfhörer aufsetzt und in seine Welt entschwindet. Man befürchtet, dass man sich nicht mehr in seinem eigenen kreativen Mikrokosmos nicht mehr wohlfühlen kann. Man befürchtet, beobachtet zu werden. Man befürchtet, sich einfach nicht mehr in die Arbeit &#8220;gehen lassen&#8221; oder &#8220;eintauchen&#8221; zu können. Das sind verständliche Ängste. Besonders dann, wenn man noch nie oder erst selten mit agilen Teams &#8211; oder als Teil eines agilen Teams gearbeitet hat. Ich kann das nachvollziehen.</p>
<p>Doch ich kann es nicht nachvollziehen, dass manche &#8211; wohl genährt durch diese Befürchtungen &#8211; behaupten, dass es &#8220;sowieso nicht besser wäre&#8221;, oder für die einzelne Persönlichkeit und den einzelnen Charakter ungeeignet sei. Noch dazu ohne es einmal ausprobiert zu haben. In meinen Augen ist das eine lapidare und profane Argumentation. Viel zu oft gewinne ich dadurch den Eindruck, das dieser  Schlag von Entwicklern ein wenig zu oft an sich selbst denkt als an andere Teammitgleider und die gemeinsame Sache. </p>
<p>So sind z.B. <a href="http://www.uxmatters.com/mt/archives/2009/07/a-practical-guide-to-capturing-creativity-for-ux.php">Designer und UX-Experten wesentlich intensiver mit kreativer Schaffung konfrontiert</a> und damit auch deutlicher abhängig von ein Umfeld, in dem die &#8220;Kreativität keimen und reifen&#8221; kann. Auch Produkt Manager sind oft mit hochkonzentrierten und komplexen Denkprozessen beschäftigt, wenn es z.B. um die Entwicklung von neuen Features eines Produktes geht. Was ich damit sagen will: Jeder ist ein Mensch, nicht nur die &#8220;Coder&#8221;. Wer wünscht sich nicht gerne sein eigenes &#8220;Arbeitsreich&#8221;? Doch auch wenn man es hätte, in den meisten Fällen wäre es für die gemeinsame Sache eben nicht zielführend, das jeder sein Reich hat und sein eigenes Ding auf seine eigene Art und Weise macht.</p>
<p>Interessanterweise sind es aus meiner Erfahrung gerade diejenigen, die mehrheitlich Konzentrations- oder Kreativitäts-Aufgaben erledigen, am wenigsten Probleme mit der Zusammenstellung interdisziplinärer Teams in einen Raum haben. Im Gegenteil. Sie fühlen sich inspiriert und freuen sich, dass ihre Arbeit auch gesehen und bewertet werden kann. Ein guter &#038; <a href="http://emilychang.com/2006/02/the-agile-web-design-manifesto-an-introduction/">agiler Web-Designer</a> z.B. freut sich über jedes frühe Feedback &#8211; von jedem. Natürlich braucht man auch seine Ruhe- und Schaffungsphasen. Jeder braucht das. </p>
<p>Das ist im Übrigen eines der ersten Dinge, die ein agiles Team auch lernt und gestaltet: Ruhephasen &#8211; Bibliotheksmodus &#8211; Silentio. Ein weiteres, hilfreiches Merkmal solcher &#8220;hyperproduktiven Arbeitsumgebungen&#8221; sind Fluchtpunkte. Also Ruheinseln, in denen man sich zurückziehen kann. Für Persönliches oder Privates. Oder einfach nur so, zum ausruhen. Powernap. Etwas lesen. Am Flipper eine Runde zocken und den Kopf etwas frei kriegen. Auftanken.</p>
<p>Ich sage nicht, das all das, was ich gerade erwähnt habe, nicht auch mit verteilten Teammitgliedern möglich wäre. Es ist auch machbar. Die Profi&#8217;s Golo &#038; Peter sind ein <a href="http://www.des-eisbaeren-blog.de/post/2010/08/19/Raumliche-Nahe-wird-uberbewertet.aspx">gutes Beispiel</a> dafür. Aber es ist meiner Meinung in sehr vielen Fällen ungleich schwieriger, deutlich fragiler und auch minder effizient. Mit Colocation funktioniert es natürlich auch nicht immer &#8211; aber dafür deutlich öfter, einfacher und produktiver.</p>
<h3>Emotion. Hautnah.</h3>
<p>Zurück zu dieser einen &#8220;ungreifbaren&#8221; Sache, die mit agilen Teams an einem gemeinsamen Ort besonders hervorstechend ist. Die Emotion. Emotion ist etwas so wichtiges und schönes. Auch für Entwickler und Nerds. Man regt sich über den langsamen SATA-Treiber auf. Man installiert gespannt die neuesten Plugin&#8217;s für Visual Studio während man sich mit dem Käsebrötchen vollkrümelt. Man lacht sich über den 3. roten Build des Tages kaputt, weil es wieder einmal ein Leichtsinnsfehler war.</p>
<p>Doch Emotion ist nicht nur für einen selbst wichtig. Emotion ist auch für andere wichtig. Die Sprache ist nur ein Teil der Kommunikation. Manche Streiten sich darüber, ob nur <a href="http://blog.my-skills.com/2007/10/18/mythos-93-der-kommunikation-ist-nonverbal.html">7% unserer gesamten Kommunikation</a> verbal ist. Fakt ist, Sprache ist nicht alles. Den Satz &#8220;Ich verstehe.&#8221; von einer langfährigen, erfahrenen Web-Designerin zu hören &#8211; flüsternd, mit glasigen Augen und zittrigen, schweißgebadeten Händen, die sie vergebens versucht hinter ihrer großen Pop-Art-Teetasse zu verstecken &#8211; oder aber &#8220;Ich verstehe.&#8221; mit resoluter Stimme wahrzunehmen &#8211; gefolgt von einer gekonnten Seitwärtsdrehung, die ihre zum Pferdeschwanz gebundenen Haare durch die rapide Rotationskraft zu einem Duftkatalysator ihres Luxusparfums entarten lässt und mit der Registrierung ihrer kalten Schulter abrupt endet. Ein und das selbe Wort &#8211; doch zwei Nachrichten, die gegensätzlicher kaum sein könnten. Natürlich gibt es noch tausende von andere Bedeutungen des Satzes &#8220;<a href="http://www.youtube.com/watch?v=VgesUCTCoBs">Ich verstehe</a>&#8220;, aber ich denke Du verstehst, was ich meine. ;)</p>
<div style="float:right"><object width="360" height="227"><param name="movie" value="http://www.youtube.com/v/xDOURH0O16w?fs=1&amp;hl=en_US&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/xDOURH0O16w?fs=1&amp;hl=en_US&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="360" height="227"></embed></object></div>
<p>Für einige mag das jetzt zu weich, unlogisch, konstruiert oder unwissenschaftlich sein. Aber das ist mir egal. Denn das ist es, was ich am Anfang dieses Artikels mit &#8220;es ist wichtig&#8221; gemeint habe und was ich zum Ausdruck bringen will: Agile Teams, die gemeinsam an einem Ort arbeiten sind sicherlich nicht perfekt. Aber sie sind in der deutlichen Vielzahl der Fälle produktiver, effektiver, handlungsfähiger, änderungswilliger, offener, respektvoller und: emotionaler. </p>
<p>Das Ergebnis ist eine gewisse Energie, eine gewisse Magie, die bei agilen Teams mit Colocation öfter und schneller entsteht. In dem letzten Slide meines <a href="http://www.youtube.com/watch?v=xDOURH0O16w">Enthusiasmus-Vortrags</a> über Scrum beim Webmontag in München sieht man <a href="http://www.youtube.com/watch?v=YWkSnKd-5Tc">eine Band im Sonnenuntergang zusammenspielen</a>. Das spiegelt die Energie &#038; Magie ein wenig wider: die Emergenz des Teams. Das Ganze ist mehr als die Summer der einzelnen Teile.</p>
<div style="float:right"><object width="360" height="227"><param name="movie" value="http://www.youtube.com/v/YWkSnKd-5Tc?fs=1&amp;hl=en_US&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/YWkSnKd-5Tc?fs=1&amp;hl=en_US&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="360" height="227"></embed></object></div>
<p>Und damit dieses ach so kindische &#8220;aber du sagt das ist toll und alles andere ist blöd&#8221;-Fingerpointing nach diesem Artikel hoffentlich keinen Nährboden findet, nochmal ein klarer Disclaimer: Ich habe die Weisheit nicht gepachtet. Ich bin kein Klugscheißer und Besserwisser, und ich will es auch nicht sein. Aber ich habe eine Meinung. Ob sie Dir gefällt, lieber Leser, musst Du schon selbst wissen. </p>
<p>Für mich ist klar: wer wirklich agile Software-Entwicklung betreiben möchte, der wird versuchen, ein Team an einem gemeinsamen Ort arbeiten zu lassen. Wenn es nicht möglich ist, dann eben mit Hilfsmitteln verteilt. Alles andere ist in meinen Augen weder agil, noch fortschrittlich, noch wirklich produktiv. Ob das für Dich, lieber Leser, auch so ist, musst Du schon selbst wissen.</p>
<p>Ich bevorzuge es, wenn ich meinem Kollegen auf die Schulter klopfen kann, wenn er einen genialen Integrationstest geschrieben hat. Oder dem Web-Designer in sein kritisches Gesicht zu blicken, wenn er wieder einmal den Usability-Prototyp der UX-Designerin begutachtet und währenddessen sich die Komplementärfarben im Pantone-Fächer zurechtsucht. Es ist für mich eine Ehrensache, dem gestressten Produktmanager beim sortieren und formulieren der neuen User Stories zu helfen, weil er in einer Stunde ein wichtiges Meeting mit dem Marketing hat. Und: es baut mich auf, wenn meine Teammitglieder mich anlächeln, weil ich ein Feature mit einem Kollegen fertiggestellt habe und wir uns nach dem grünen Build in den Armen liegen, als wäre der FC Bayern gerade Championsleague-Sieger geworden.</p>
<div style="clear:both"></div>
<p>Ich bevorzuge agile Teams an einem Fleck, an einem Ort, in einem Raum.<br />
Gemeinsam für die gemeinsame Sache.<br />
Räumliche Nähe wird unterschätzt. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/das-agile-team-in-nahaufnahme/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ratatouille Estimation Scale</title>
		<link>http://www.gmbsg.com/ratatouille-estimation-scale/</link>
		<comments>http://www.gmbsg.com/ratatouille-estimation-scale/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 18:19:56 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Team]]></category>

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

		<guid isPermaLink="false">http://www.gmbsg.com/?p=1118</guid>
		<description><![CDATA[Ich bin auf dem Eisberg. Ich bin alleine. Doch zunächst geht es hier nicht um mich, sondern um die „Community“.
In vielen Kommentaren und Blog-Posts wurde die jüngste Bewegung über .NET Coding Dojo’s als „für die Community nicht hilfreich“ tituliert. Jetzt, ...]]></description>
			<content:encoded><![CDATA[<p>Ich bin auf dem Eisberg. Ich bin alleine. Doch zunächst geht es hier nicht um mich, sondern um die „Community“.</p>
<p>In vielen Kommentaren und Blog-Posts wurde die jüngste Bewegung über .NET Coding Dojo’s als „für die Community nicht hilfreich“ tituliert. Jetzt, wo es zwei verschiedene „Stile“ von .NET Coding Dojo’s gäbe, sei auch noch ein entscheiden und ein „was ist nun besser“ hinzugekommen. Den Meinungen kann ich mich größtenteils anschließen. Doch ich möchte noch etwas hinzufügen: Das philosophische, frenetische, ja fast religiöse Reden und Ausarbeiten dieser „Stilunterscheidung“ zwischen Schwarm und Latifa ist mir doch deutlich zu krass und hat mich über die letzten Tage mehrheitlich nur dazu gebracht, beim Lesen der Meinungen immer wieder zu denken: „<a href="http://www.youtube.com/watch?v=xvk2eLbnh0c">Hääh, oder wie oder wat?</a>“</p>
<h3>Eine Bereicherung</h3>
<p>Insofern finde ich es ein schlechtes Signal und eine besorgniserregend überspannte Kommunikation, von „<a href="http://ralfw.blogspot.com/2010/06/zeig-mir-deinen-code-und-ich-nenn-dir.html">der Teilung der Dojo-Welt</a>“ oder der „Trennung der Community in zwei Lager“ zu sprechen. Das Gegenteil ist der Fall, die „Community“ wird bereichert. Sie wird bereichert um andere Sichtweisen, um andere Vorgehensweisen und andere Menschen – ganz unabhängig davon, ob die Bereicherung nun als gut oder schlecht zu bewerten ist.</p>
<p>Darüber hinaus ist es schlichtweg überzeichnet, wenn man sich so massiv mit der „Gestaltung von Coding Dojo’s“ auseinandersetzt und die „Stilrichtungen“ oder “Schulen“ miteinander in fast religiös ausufernder Manier differenziert. Coding Dojo’s sind bei weitem nicht das einzig wichtige für einen Software-Entwickler, zumindest für mich. Ich mache Coding Dojo’s aus Spaß &#8211; in meiner Freizeit. Andere machen es vielleicht aus einer anderen Motivation heraus. Aber das in letzter Zeit ist mir deutlich zu viel des Guten, wenn es überhaupt dem Attribut gutwillig genüge träge. Es gibt auch noch andere Dinge, also sollte man das ganze <a href="http://de.wikipedia.org/wiki/Tohuwabohu">Tohuwabohu</a> um die .NET Coding Dojo’s relativieren.</p>
<p>Ich bin mir durchaus bewußt, das die <a href="http://www.gmbsg.com/lerne-lehre-ilker-net-coding-dojo-latifa-stil/">Erhebung meines „Latifa“-Stils</a> ein Treiber in dieser Entwicklung war, wenn auch nicht der einzige. Jedoch war es nicht meine Motivation, irgendwelche „Lagerschaften“ zu erarbeiten. Nein, vielmehr ist diese Formalisierung der Regeln aus der Erfahrung des Coding Dojo’s bei den dotnetpro.powerdays entstanden. Meine Wahrnehmungen waren nämlich deutliche Divergenzen zwischen dem Verhalten einzelner Teilnehmer und den als „Latifa“ titulierten Werten.</p>
<h3>Latifa ist tot, es lebe Latifa</h3>
<p>Ich denke auch, dass die Werte-Prinzipien sowie auch andere Prinzipien, auf die ich hier nicht näher eingehen werde, nicht als spezifisch für ein Coding Dojo reduziert werden können. Ich denke, die „Latifa-Werte“ sind über ein Coding Dojo hinaus auch im täglichen Miteinander und Arbeiten beachtenswert. Deswegen – und wegen der für mich zu konterkarierenden Darstellung der Stilisierung von Dojos – werde ich die Latifa-Werte nicht mehr ausschließlich im Kontext von Coding Dojo’s anwenden. Es gibt kein „Latifa-Coding-Dojo“ mehr. Weil für mich diese Werte &#038; Prinzipien nicht nur für Coding Dojo’s gelten, sondern in meiner Welt Anspruch auf Allgemeingültigkeit erheben.</p>
<h3>Schwarm drüber?</h3>
<p>Also, alles wieder gut, alles wieder lustig und soz. „<a href="http://ralfw.blogspot.com/2010/06/kollektiv-intelligent-codieren.html">Schwarm</a> drüber“? Nein, ist meine klare Antwort. Jedenfalls nein für mich. Es ist ja auch meine Perspektive, die ich hier schildere. Ich habe für mich erkennen und lernen dürfen, dass ich offensichtlich eine eingeschränktere Menge an Gemeinsamkeiten mit Meinungen, Verfahrensweisen, und Prinzipien anderer habe. Besonders ist mir aufgefallen, dass ich &#8211; für mein eigenes Bedauern &#8211; mit <a href="http://ralfw.blogspot.com/">Ralf</a> und <a href="http://www.lieser-online.de/blog/">Stefan</a> weniger Gemeinsamkeiten habe als ich zunächst vermutete. </p>
<p>Ich habe den Eindruck, dass meine Ansichten &#038; Werte sich von den Werten &#038; Prinzipien von Ralf &#038; Stefan auf fachlicher Ebene deutlich unterscheiden. Meine Wahrnehmung ist weiterhin, dass die Unterschiede zwischen mir und Ralf/Stefan auf persönlicher Ebene noch deutlicher sind. Für mein Empfinden ist für diese Relation der Begriff des „<a href="http://de.wikipedia.org/wiki/Diametral">diametralen entgegen stehens</a>“ durchaus treffend.</p>
<h3>Das .NET Coding Dojo für „Profi’s“ ist Schwarm ?!?</h3>
<p>Ein Beispiel dafür ist für mein Empfinden die Zielsetzung bei Coding Dojo’s. Ich mache Coding Dojo’s in meiner Freizeit und ich möchte in meiner Freizeit Spaß haben. Das ist für mich soetwas wie ein Primärziel. Diesen Eindruck habe ich von der Zielsetzung von Ralf nicht. Für mich stellt sich die Zielsetzung von Ralf als zielorientiert und leistungsorientiert dar. Bei Ralf geht aus meiner Sicht deutlich mehr um „professionelles Lernen“.</p>
<p>Ein weiteres Indiz ist sicherlich die unterschiedliche Betrachtungsweise von „professioneller &#038; moderner Softwareentwicklung“. Für mein Empfinden genügen doch eine ganze Menge an Ansichten und „Lehren“ von Ralf &#038; Stefan nicht mehr meinem Anspruch der professionellen &#038; modernen Softwareentwicklung. </p>
<p>Das fängt für mich schon bei unnötigem <a href="http://ralfw.blogspot.com/2010/06/zeig-mir-deinen-code-und-ich-nenn-dir.html">Sauberkeitsfetisch wie dem Trennen von Tests und Produktionscode in verschiedene Projekte</a> an. Das ist für mich ja schon fast wie jeden Tag das Auto durch die Waschanlage zu fahren. Zum Einen, weil der Code ein kleines Code Kata im Coding Dojo ist und keine Mission-Critical-Anwendung. Zum Anderen, weil es schlichtweg nicht mehr zeitgemäß ist, Tests vom SUT zu trennen. Je näher sie zueinander stehen, um so besser. </p>
<h3>Frankreich wird Fußballweltmeister</h3>
<p>Ich könnte jetzt weitermachen und „weiterwettern“, z.B. das für mein Dafürhalten das von Ralf &#038; Stefan transportierte „TDD“ mit der Anleitung des „vorher die Lösung auf Papier erfassen“ und dann „gestärkt und mit klarem Kopf Tests programmieren“ so viel mit TDD zu tun hat wie Frankreich mit der Fussballweltmeisterschaft <i>(Anmerkung des Autors für den &#8220;ernsthaften&#8221; Leser: Das war ein kleiner übertriebener Witz am Rand. Bitte schmunzeln, Danke.)</i></p>
<p>Doch ich werde dieser Versuchung widerstehen, denn ich habe für mich erkannt, dass es eben verschiedene Ebenen und subjektive Wahrnehmungen von professioneller &#038; moderner Software-Entwicklung gibt. Ich hatte schon im meinem Artikel über „<a href="http://www.gmbsg.com/lerne-lehre-ilker-net-coding-dojo-latifa-stil/">mein .NET Coding Dojo</a>“ (ergo: meine Perspektive eines Coding Dojo’s) schon angedeutet, dass ich mich gerade mit dem Thema <a href="http://www.gmbsg.com/tdd-ist-keine-wissenschaft/">TDD</a> &#038; Planung noch deutlich sowie ausführlich äußern möchte und werde. Zurück zur Professionalität &#038; Modernität.</p>
<p>Meine Wahrnehmung der unterschiedlichen Grade und Auffassungen von fachlicher sowie persönlicher Professionalität &#038; Modernität zwischen dem nun nicht mehr vorhandenen „Latifa-Dojo“ und dem „Schwarm-Dojo“ ist es auch, die mich dazu veranlasst, ab heute auch bestimmte Begriffe bei meiner Kommunikation mit .NET Coding Dojo’s explizit auszuschließen. Dazu zählen „Lerne &#038; Lehre“, „Professionell“ &#038; „Modern“.</p>
<p>Das heisst nun keineswegs, dass es keine Coding Dojo’s gibt, die moderne &#038; professionelle Software-Entwicklung fokussieren. Das heisst vielmehr, dass ich mir moderne &#038; professionelle Methoden bei einem Coding Dojo wünsche, aber sie eben nicht bei allen erfüllt werden.</p>
<h3>Fun as fun in fun</h3>
<p>Abschließend kann ich für mich als folgendes Fazit ziehen: Ich werde weiter .NET Coding Dojo’s besuchen. Vor allem, weil sie mir Spass machen. Wenn sie mir keinen Spass mehr machen, dann werde ich sie auch nicht mehr besuchen. Der Spass steht bei mir im Vordergrund, denn es ist für mich eine Freizeitaktivität. Diese Freizeitaktivität hat mir viele Erkenntnisse beschert. Und das ist gut so.</p>
<p>Aber ich werde mich auch von Coding Dojo’s distanzieren, die dieses Primärziel für mein Dafürhalten nicht erfüllen. Dazu zählt für mich das „Schwarm-Dojo“. Es mag andere Meinungen dazu geben und auch andere Entwickler, die eben mehr Wert auf andere Komponenten legen. Für diese mag viellecht auch ein „Stil“ wie der Schwarm-Dojo schön, gut, frisch und fröhlich sein. Gut. Für mich ist es eben nicht so.</p>
<p>Selbst wenn die inhaltliche Substanz eines Schwarm-Dojo’s für mich attraktiv wäre (was sie für mich nicht ist), ja selbst dann würde ich mich auf Grund der momentan für mein Empfinden zu großen persönlichen Diskrepanz zu Ralf &#038; Stefan mit großer Wahrscheinlichkeit nicht dazu motivieren können, ein Dojo mit Ralf &#038; Stefan zu besuchen.</p>
<h3>Auf dem Eisberg</h3>
<p>Ich werde weiter auf dem Eisberg sein. Wenn meine Werte, meine Prinzipien und meine Arbeitsweise mein Eisberg sind, dann bleibt mein Name ist zwar Ilker, aber <a href="http://www.youtube.com/watch?v=qU4I00s25ho">auf dem Eisberg bin ich so ähnlich wie Kalle.</a> :-) Na juuud juuuud juuud juuud juuud&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/auf-dem-eisberg/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Scrum: Der bessere Scrum Master</title>
		<link>http://www.gmbsg.com/scrum-der-bessere-scrum-master/</link>
		<comments>http://www.gmbsg.com/scrum-der-bessere-scrum-master/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 16:15:37 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Aktuell]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[System]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Lean Management]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Scrum Master]]></category>
		<category><![CDATA[Scrum Norris]]></category>
		<category><![CDATA[Selbstorganisation]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.gmbsg.com/?p=920</guid>
		<description><![CDATA[Der Titel ist unmißverständlich: NUnit, der Godfather der Test-Frameworks für .NET, wird heute von mir in der Reihe &#8220;Meta-Test, Test-Frameworks im Vergleich&#8221; ein wenig unter die Lupe genommen. Gestern hatte ich schon den Redmond-Test-Botschafter MS-Test im Visier. Irgendwie ist es ...]]></description>
			<content:encoded><![CDATA[<p>Der Titel ist unmißverständlich: <a href="http://nunit.com/">NUnit, der Godfather der Test-Frameworks für .NET</a>, wird heute von mir in der Reihe &#8220;<a href="http://www.gmbsg.com/meta-test-tdd-bdd-test-frameworks-im-vergleich/">Meta-Test, Test-Frameworks im Vergleich</a>&#8221; ein wenig unter die Lupe genommen. Gestern hatte ich schon den <a href="http://www.gmbsg.com/meta-test-ms-test-visual-studio-on-board-test-framework/">Redmond-Test-Botschafter MS-Test</a> im Visier. Irgendwie ist es schon komisch. Obwohl Microsoft mit MS-Test ein umfangreiches Framework für Testing der professionellen Entwicklergemeinde zur Verfügung gestellt hat, hört man unter Gleichgesinnten und Kollegen fast immer die gleiche Story: &#8220;Tests? Unit Tests? Klar! NUnit!&#8221;</p>
<h3>Der Pate unter den Test-Frameworks</h3>
<p>So ist es auch nicht weiter erstaunlich, dass man nahezu überall, wo das Wörtchen &#8220;Test&#8221; fällt, auch &#8220;NUnit&#8221; zu sehen bekommt. Sei es nun bei den Codeassistenten, bei Build- oder CI-Tools, Addins und sogar weiteren Test-Frameworks. Die <a href="http://www.google.de/search?q=nunit">Verbreitung und Unterstützung von NUnit</a> ist hier einfach nicht zu toppen. Aber auch die vielen Kontakte und Beziehungen des &#8220;Paten der Test-Frameworks&#8221; helfen nicht viel beim Meta-Test mit dem FizzBuzz-Kata! Auf geht&#8217;s!</p>
<h3>Der Code</h3>
<p>FizzBuzz ist mit NUnit und den &#8220;Standard-TDD-Regeln&#8221; schnell implementiert. Referenz hinzufügen, Testklasse inklusive Testmethode aufbauen, noch schnell ein <code>using NUnit.Framework;</code> und die beiden Attribute <code>[TestFixture]</code> (für Klassen) sowie <code>[Test]</code> hinzugefügt &#8211; und schon kann man fröhlich testen!<br />
<a href="http://www.gmbsg.com/wp-content/uploads/2010/04/nunit_guirunner1.png"><img src="http://www.gmbsg.com/wp-content/uploads/2010/04/nunit_guirunner1-300x152.png" alt="nunit_guirunner" title="nunit_guirunner" width="300" height="152" class="alignright size-medium wp-image-935" /></a><br />
Wer jetzt einen Codeassistenten wie <a href="http://www.jetbrains.com/resharper/">Resharper</a> oder <a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/">Coderush</a> hat, ist praktisch nur ein Klick bzw. Tastenschlag von der Testausführung entfernt. Doch auch ohne &#8220;Code-Beschleuniger&#8221; gehen NUnit-Tests elegant, z.B. mit dem <a href="http://www.testdriven.net/">TestDriven.NET Addin</a>. Mal von diesen &#8220;Integrationstüren&#8221; abgesehen, bietet NUnit auch eigenständige Runner für die Konsole sowie auch als Windows-Anwendung an. Passt!</p>
<pre name="code" class="brush: csharp">
using NUnit.Framework;

namespace KataFizzBuzzNUnit
{
    [TestFixture]
    public class FizzBuzzTest
    {
        private FizzBuzz target = new FizzBuzz();

        [Test]
        public void Multiples_Of_Three_Returns_Fizz()
        {
            Assert.That(target.Translate(6), Is.EqualTo("Fizz"));
        }

        [Test]
        public void Multiples_Of_Five_Returns_Buzz()
        {
            Assert.That(target.Translate(10), Is.EqualTo("Buzz"));
        }

        [Test]
        public void Multiples_Of_Three_And_Five_Returns_FizzBuzz()
        {
            Assert.That(target.Translate(15), Is.EqualTo("FizzBuzz"));
        }

        [Test]
        public void No_Multiples_Of_Three_Or_Five_Returns_Number()
        {
            Assert.That(target.Translate(7), Is.EqualTo("7"));
        }
    }
}
</pre>
<p>Bei der Implementierung fühlt man sich schon fast wie bei MS-Test, jedoch mit einem ganz gewaltigen Unterschied: Die Assert-Klasse im Allgemeinen sowie die <code>Assert.That()</code> Syntax von NUnit sind mächtig &#8211; und mächtig hilfreich. Das mit <a href="http://www.nunit.org/index.php?p=constraintModel&#038;r=2.4">NUnit 2.4 eingeführte Constraint Model</a> ist nicht nur besser lesbar, sondern auch intuitiver. Kennt man mal die wichtigsten Constraints, vergisst man sie auch nicht mehr so schnell. Alles in Allem ist TDD mit NUnit eine runde Sache. In weniger als 5 Minuten strahlten meine 4 Tests und ich uns gegenseitig an.</p>
<h3>Bewertung</h3>
<ul>
<li><b>Dauer</b><br/>Zackig, Knackig, ohne Trärä und Tamtam. FizzBuzz-Regeln in 5 Minuten. Mit Codebeschleuniger geht&#8217;s sogar noch schneller. Passt.</li>
<li><b>Größe</b><br/>Ähnlich wie bei MS-Test. Eine kompakte Testklasse mit 4 Testmethoden.</li>
<li><b>Tooling</b><br/>MS-Test war schon sehr gut &#8211; doch NUnit ist sogar noch besser! Die Verbreitung in der OSS-Gemeinde macht sich hier bemerkbar. Top.</li>
<li><b>Usability</b><br/>Sehr gut. Assert&#8217;s schön mit Constraints. Wenn man möchte sogar noch beschleunigt über das Erben von AssertionHelper. Angenehm.</li>
<li><b>Support</b><br/>Unmengen an Material im Internet. Open-Source, stabil, große Gemeinde, aktive Entwicklung. Zufrieden.</li>
</ul>
<p>Hmm, es fällt mir schon schwer, etwas &#8220;negatives&#8221; an NUnit zu finden. Es mag den einen oder anderen stören, wie die Test-Projekt-Struktur von NUnit aufgebaut ist. Auch der GUI-Runner ist jetzt nicht der Augenschmaus schlechthin. Doch die Kernkompetenzen werden von NUnit bravourös gemeistert.</p>
<h3>NUnit &#8211; Die Referenz</h3>
<p>Als kleines Fazit kann ich für mich schon mal sagen &#8211; NUnit hat die Messlatte ganz schön hochgelegt. Effektiv betrachtet ist NUnit als Test-Framework derzeit die Referenz, mit der sich alle anderen messen lassen müssen. Das ist auch gut so, denn NUnit ist durch die jahrelange, stetige Entwicklung viele Schritte gegangen &#8211; manchmal auch einige Schritte voraus. Bleibt die Frage offen: Gibt es noch bessere Test-Frameworks für C# und .NET als NUnit? Abwarten, meine Test-Serie geht in Kürze weiter. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/meta-test-nunit-all-time-hall-of-fame-most-valuable-tester/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Meta-Test: TDD &amp; BDD Test-Frameworks im Vergleich</title>
		<link>http://www.gmbsg.com/meta-test-tdd-bdd-test-frameworks-im-vergleich/</link>
		<comments>http://www.gmbsg.com/meta-test-tdd-bdd-test-frameworks-im-vergleich/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:45:26 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Topthema]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[MSpec]]></category>
		<category><![CDATA[MSTest]]></category>
		<category><![CDATA[NBehave]]></category>
		<category><![CDATA[NSpec]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[SpecFlow]]></category>
		<category><![CDATA[StoryQ]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[XUnit]]></category>

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

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

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

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

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

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

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

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

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

    FormMain.MousePointer = 0
    ScanTimeString = Trim(Str(AllScanTime / 10))
    If Left(ScanTimeString, 1) = "." Then ScanTimeString = "0" &#038; ScanTimeString
    LabelInfo.Caption = "Scan complete !" &#038; vbCrLf &#038; vbCrLf &#038; _
        "Successfully passed through " &#038; Trim(Str(AllFileCounter)) &#038; " files." &#038; _
        vbCrLf &#038; "Elapsed time: " &#038; ScanTimeString &#038; " seconds."
End Sub
</pre>
<p>Oh je, da habe ich mich nicht gerade mit Ruhm bekleckert :-) Funktioniert hat es &#8211; Ja. Aber lange zufrieden war ich auch nicht damit. Immerhin hat es seinen Zweck erfüllt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/re-was-hast-du-vor-10-jahren-programmiert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET Coding Dojo Massiv</title>
		<link>http://www.gmbsg.com/net-coding-dojo-massiv/</link>
		<comments>http://www.gmbsg.com/net-coding-dojo-massiv/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 13:45:18 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

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

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=270</guid>
		<description><![CDATA[Es ist, als ob ein fehlendes Stück vom Puzzle endlich aufgetaucht ist. Endlich hat sich mal jemand mit der Tatsache auseinandergesetzt, dass in der heutigen Software-Entwicklung eine entscheidende Komponente immer mehr ins Hintertreffen gerät: Die Kunst und Wissenschaft der Software-Entwicklung.
Genauer ...]]></description>
			<content:encoded><![CDATA[<p>Es ist, als ob ein fehlendes Stück vom Puzzle endlich aufgetaucht ist. Endlich hat sich mal jemand mit der Tatsache auseinandergesetzt, dass in der heutigen Software-Entwicklung eine entscheidende Komponente immer mehr ins Hintertreffen gerät: Die Kunst und Wissenschaft der Software-Entwicklung.</p>
<p>Genauer gesagt ist es <a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin">Uncle Bob</a>, der mit seinem provokanten Satz &#8220;Craftsmanship over Crap&#8221; auf der Agile&#8217;08 die Diskussion angestoßen hat. Natürlich spielt da auch sein Buch <a href="http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a> eine besondere Rolle. Im Prinzip regt sich Uncle Bob darüber auf, das heutzutage immer mehr Agile Software-Entwicklung mit &#8220;schnell fertigstellen&#8221;, &#8220;mal ändern&#8221; und &#8220;iterativ ausbauen&#8221; gleichgesetzt wird, ohne wirklich qualitativ wertvolle Ergebnisse abzuliefern.</p>
<p>Er spricht mir aus der Seele. Wie oft habe ich schon einfach runtergerotzten Code gesehen, wo nichts anderes zu erkennen war außer einem Haufen zusammengelegter Klassen und Methoden. Wie oft habe ich diesem bescheuerten Satz &#8220;das wurde mit der heißen Nadel gestrickt&#8221; gehört, wo ich mir selbst die Frage stellte, ob ich nun in einer Arbeitsgemeinschaft für Strickpulli-Anfänger gelandet bin oder ich doch noch in der Software-Branche bin.</p>
<p>Das erschreckende ist ja nicht nur, dass diese &#8220;agilen&#8221; Software-Produkte nicht nur durch den Druck von Geschäftsleuten, Produktmanagern oder sonstigen &#8220;Stakeholder&#8221;n getrieben wird. Mittlerweile ist die niedrige Qualität schon in das Innere von Software-Entwicklern vorgedrungen. Es gibt Kollegen, die kümmern sich einen feuchten um qualitativ hochwertige Ergebnisse, sondern verfolgen stur das, was man Ihnen vor die Nase legt. Erstaunlicherweise ist es meist dieser Typus Entwickler, der sich dann auch noch als &#8220;State-of-the-Art&#8221;-Developer verkauft, weil er &#8220;business-minded&#8221; und &#8220;agile&#8221; ist. Das Fass zum überlaufen bringt dann meistens die Argumentation, dass man heutzutage ja &#8220;iterativ&#8221; und &#8220;test-driven&#8221; entwickelt, und dabei wirklich nur das notwendigste implementiert.</p>
<p>Also nicht, das man mich jetzt falsch versteht: das soll jetzt keine Hommage an den alten Wasserfall werden. Mittlerweile ist es klar, das man Software-Entwicklung iterativ wesentlich besser vorantreiben kann. Auch viele Patterns und Practices beschäftigen sich mit der Verbesserung der Entwicklung und der Qualität. Fakt ist allerdings auch, dass durch die rasante Entwicklung der Methoden, der Branche, des &#8220;Businesses&#8221; durch das Web und nichtzuletzt durch die zahlreichen Tools die eigentliche Schule der Entwicklung von Software immer mehr vernachlässigt wird.</p>
<p>Da kommt meiner Meinung nach die von Uncle Bob initiierte Bewegung genau zur richtigen Zeit. Mit vielen anderen Software-Entwicklern, die noch die Fahne der Kunst hochhalten, hat er das <b>&#8220;<a href="http://manifesto.softwarecraftsmanship.org/">Manifesto for Software Craftsmanship</a>&#8220;</b> ausgearbeitet. Es ist eine Analogie &#8211; oder besser ein Addendum &#8211; zum klassischen <a href="http://agilemanifesto.org/">Agile Manifesto</a>:</p>
<ul>
<li>Es geht nicht nur um funktionierende Software, sondern auch um <i>gut entwickelte Software</i></li>
<li>Es gilt nicht nur Änderungen zu verarbeiten, sondern auch um <i>stetige Wertsteigerung</i></li>
<li>Es verlangt nicht nur Austausch von jedem Einzelnen, sondern auch Zusammengehörigkeit durch <i>Gruppenbildung von Profi&#8217;s</i></li>
<li>Es braucht nicht nur Kundenkommunikation, sondern auch eine <i>produktive Partnerschaft</i></li>
</ul>
<p>Genau diese Werte sind es, die einen Software-Entwickler zu einem guten Software-Entwickler machen. Naja, ganz neu sind diese Wertvorstellungen ja nicht, zumal man ja schon vor Jahren relativ formal mit Hilfe der <a href="http://en.wikipedia.org/wiki/ISO_9126">ISO 9126 Qualitätsrichtlinien</a> einen Ansatz gefunden hat, eine &#8220;Qualitäts- und Professionalitätsethik&#8221; abzuleiten. Noch einen Schritt weiter geht da die (mittlerweile auch schon einige Jahre alte) Definition der <a href="http://www.acm.org/about/se-code">Code Of Ethics in Software Engineering</a> von ACM.</p>
<p>Nichtsdestotrotz ist die neue Craftsmanship-Bewegung notwendig und wichtig. Dem tragen auch Ralf Westphal und Stefan Lieser Rechnung, in dem sie auf ihrer neuen Website <a href="http://www.clean-code-developer.de">clean-code-developer.de</a> ein an Uncle Bob angelehntes Wertesystem beschreiben. Dieses Wertesystem beinhaltet eine Reihe von guten Regeln und Vorschlägen, wie man als Software-Entwickler sein Werk und Tun verbessern kann. Ich persönlich finde das von Westphal &#038; Lieser propagierte &#8220;Grad-System&#8221; (ähnlich wie bei Judoka) nicht zielführend. Es ist vielmehr irreführend und transportiert implizit das &#8220;ich habe den blauen Grad, also bin ich besser als Du&#8221; Gefühl, obwohl dies bestimmt nicht so gemeint ist. Also ich werde sicherlich kein &#8220;Clean Code Developer&#8221;, ich sehe mich eher als ein &#8220;Software Craftsman&#8221;. Nichtsdestotrotz findet man auf der Website gute Ratschläge.</p>
<p>Was für mich zählt, ist die Tatsache, das ich immer versuche, eine bessere Arbeit abzuliefern als je zuvor. Ich bin stolz auf meine Arbeit und meinen Beruf.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/die-kunst-der-software-entwicklung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Technical Summit 08: Teil 1</title>
		<link>http://www.gmbsg.com/technical-summit-08-teil-1/</link>
		<comments>http://www.gmbsg.com/technical-summit-08-teil-1/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 21:02:04 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[3.0]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Claims]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[MDD]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[Oslo]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[WF]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=220</guid>
		<description><![CDATA[Yep, der erste Tag ist geschafft. Anbei mein Log der Sessions:
Session 1: Steve Teixeira über Multi-Core Software-Entwicklung
Steve Teixeira ist Program Manager beim Parallel Developler Tools / Visual Studio Team in Redmond und hatte in seiner Session neben der grundlegenden Einführung ...]]></description>
			<content:encoded><![CDATA[<p>Yep, der erste Tag ist geschafft. Anbei mein Log der Sessions:</p>
<h3>Session 1: Steve Teixeira über Multi-Core Software-Entwicklung</h3>
<p><a href="http://blogs.msdn.com/texblog/">Steve Teixeira</a> ist Program Manager beim Parallel Developler Tools / Visual Studio Team in Redmond und hatte in seiner Session neben der grundlegenden Einführung der neuen API für Multithreading auch einige Neuigkeiten über die nächste Visual Studio Version zu berichten. Doch alles der Reihe nach. Zunächst einmal schilderte Steve, wieso man sich eigentlich Gedanken über Parallele Ausführung von Code machen sollte. Der Grund ist natürlich bei der Hardware-Entwicklung vergraben, denn mittlerweile gelangt man an die Leistungsgrenzen im CPU-Design mit einem Kern. Der Hauptgrund ist die inzwischen fast unkontrollierbare Wärmeleistung, die die Chips von sich geben. Der Trend ist zu Multi-Core-CPU&#8217;s ist eindeutig auch im Alltag angekommen.</p>
<p>Das wiederum macht es erforderlich, die Software auf die neuen Gegebenheiten anzupassen. Steve zeigte ein schönes Beispiel mit Hilfe von <a href="http://en.wikipedia.org/wiki/Linq>LINQ</a> und <a href="http://en.wikipedia.org/wiki/Parallel_FX_Library">PLINQ</a> um die Unterschiede zwischen sequentiellem und parallelisiertem Code deutlich zu machen. Was heißt das für den &#8220;Alltags-Entwickler&#8221;, wie ich es z.B. bin? Nun, zunächst einmal bedeutet es eine Schärfung der Coder-Sinne auf das Thema Performance. Ich fühle mich zwar in diesem Thema schon heute gut aufgehoben, aber es dürfen ruhig noch ein wenig mehr Details sein. </p>
<p>Unterstützt wird dies im Besonderen durch das neue <a href="http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx">Visual Studio 2010</a>. Es kommt mit neuen Tools wie Performance und Concurrency Profilern, die deutlich, graphisch anschaulich zeigen, wieviel Zeit die Software für bestimmte Aktionen verbraucht und mit welchen Ressourcen diese Leistung erreicht wurde. Auffällig dabei sind auch die Optionen, die das neue Performance-Tool bietet: CPU-basiertes Sampling, komplette Instrumentation, also Analyse aller Zeiten und Zyklen von Methodenaufrufen und das schon eben erwähnte Concurrency Profiling, mit dem man in der Lage ist zu erkennen, wie die Threads mit den Aufgaben ausgelastet sind. </p>
<p>Eine &#8220;Performance Debugging Suite&#8221; also, die im neuen Visual Studio verankert sein wird. Voraussetzung ist jedoch die Installation auf Windows Vista oder Windows 2008, da die Monitoring-Tools intern eng mit der seit Vista erweiterten Windows Eventing API (ETW) zusammenarbeiten.</p>
<p>Für so passionierte .NET-Entwickler wie mich ist die Verwendung der neuen API einfacher als erwartet. So lassen sich z.B. LINQ-Abfragen elegant mit dem &#8220;Anhängsel&#8221; <code>.AsParallel()</code> parallelisieren. Mindestens genauso einfach lassen sich auch Codebestandteile für die Parallel-Ausführung trimmen. Eine einfache for-Schleife ist mit <code>Parallel.For()</code> im Nu für die Parallelisierung umgesetzt. Die Nebeneinanderausführung von separaten Codeteilen mit <code>Parallel.Invoke()</code> ist zügig definiert und intuitiv. All diese Dinge sind fest im neuen .NET Framework 4.0 verankert. Interessant in diesem Zusammenhang ist, das Steve explizit auf deutliche Verbesserungen &#8220;unter der Haube&#8221; hingewiesen hat. So ist z.B. die <code>ThreadPool</code>-Klasse intern mit neuen Strategien wie dem Work Stealing ausgestattet worden, um die Verteilung der Aufgaben in Multi-Core Umgebungen zu optimieren.</p>
<p>Ein helles Ohr hatte ich auch bei den vielen kleinen Anekdoten und Anmerkungen von Steve. So ging er flüchtig auf die Entwicklung von Visual Studio ein und verriet, das der Visual Studio Code mehrheitlich in C++ und C# geschrieben ist und derzeit mehr als 45 Millionen Codezeilen umfasst. Interessant ist auch die Tatsache, dass das Visual Studio Team bei der Entwicklung von neuen Komponenten und UI verstärkt WPF im Einsatz hat. Steve begründet das mit der schlichten Tatsache, das WPF schnell genug ist und eine wesentlich effizientere UI-Entwicklung ermögliche als mit der klassischen GDI.</p>
<p>Fazit: Ein absolutes Highlight &#8211; Visual Studio 2010 in Aktion und Insider-Wissen. VS10, Parallels &#038; .NET 4.0, ich warte auf euch&#8230;</p>
<h3>Session 2: Holger Schwichtenberg und AJAX Services</h3>
<p>AJAX ist nicht nur in aller Munde sondern heutzutage schon fast auf jeder Website in irgendeiner Form im Einsatz. Das man AJAX auch in ASP.NET einsetzen kann, ist spätestens nach dem .NET Framework 3.5 keine besondere Neuigkeit mehr. So auch der Inhalt der Session von Holger. Er machte einen knapp einstündigen Rundflug über die Möglichkeiten des AJAX-Einsatzes in ASP.NET, darunter das berüchtigte UpdatePanel (aka. AJAX für Arme), das AJAX Control Toolkit (aka. Atlas) und die kleinen Tools, die mit den ADO.NET Data Services einhergehen.</p>
<p>Auf AJAX-Spezifische News für .NET 4.0, den JQuery-Support mit ASP.NET 4.0 oder Visual Studio 2010 ging Holger garnicht oder nur am Rande mit einem Keyword aus einem Slide ein. Schade, aber aus meiner Sicht eine sehr schwache und fachlich &#8220;äußerst überschaubare&#8221; Session. Besonders die Argumentationen von Holger für so manche Technologie sind in meinen Augen etwas zu oberflächlich. So geschehen bei einer Frage eines Zuhörers:</p>
<blockquote><p><i>Zuhörer</i>: Bei den ADO.NET Data Services verzichten Sie auf eine gewohnte 3 bzw. N-Tier Architektur. Dies wurde lange als &#8220;Best Practice&#8221; vermittelt und nun wird das mißachtet. Was meinen Sie?</p></blockquote>
<blockquote><p><i>Schwichtenberg</i>: Nun, ich sage Ihnen ja nicht, das eine N-Tier Architektur nicht empfehlenswert ist. Aber &#8211; mit ADO.NET Data Services ist der Betrachtungswinkel ein anderer. Während &#8220;klassische&#8221; Web Services nur die Daten und Funktionen herausgeben, die wirklich benötigt werden &#8211; also praktisch die Daten schon serverseitig Filtern &#8211; wird bei den ADO.NET Data Services zunächst der gesamte Datenbestand im Web Service angeboten. Der Client kann nun über die REST-Query entscheiden, was er konkret benötigt. Aus meiner Sicht ist diese Herangehensweise ein Produktivitätsgewinn.</p></blockquote>
<p>Na, das ist ja eine feine Aussage! Sichereitsbedenken scheint Holger nicht zu haben, wenn er alle Daten frei verfügbar macht. Des Weiteren ist die Konstellation AJAX + ADO.NET Data Services + Entity Framework sehr wohl eine &#8220;Tiered Architecture&#8221;, Das Entity Framework löst den klassischen Data Layer ab. Die Data Servies können als &#8220;Business Layer&#8221; durchgehen (man kann ja selbst noch einiges dazu entwickeln und der Zweck eines &#8220;Data Providers&#8221; kann in meinen Augen auch als &#8220;Business&#8221; definiert werden). Zu guter letzt ist AJAX bzw. die Website die UI bzw. das Frontend. Naja, vielleicht habe ich es auch nicht richtig kapiert, was Holger damit gemeint hat.</p>
<p>Fazit: Eine der schwächeren Sessions, die fachliche Tiefe und vor Allem Neuigkeiten bzw. Best Practices vermissen ließ.  </p>
<h3>Session 3: Dariusz quatscht hessisch, und zwar &#8220;Windoos Äschär&#8221;</h3>
<p>Der Name ist Programm: Dariusz wagt sich in die neue blaue Windows-Welt: &#8220;<a href="http://www.microsoft.com/azure/services.mspx">Windoos Äschär</a>&#8221; &#8211; so meint er könnte man es zumindest versuchen, die neue Service-Familie auszusprechen. In wohl bekannter Manier stieg er fröhlich in die Thematik mit einem Überblick ein.</p>
<p>Da wären zunächst die .NET Services &#8220;Access Control&#8221;, &#8220;Service Bus&#8221; und &#8220;Workflow&#8221;. Der Access Control Dienst so etwas vergleichbares wie ein etwas besserer, Claims-basierter Single-Sign-On Service mit Authorisierungsmanagement. Über eine Claims-Challenge können sich Nutzer und Dienste gleichermaßen authentifizieren. Dabei kann man aus der gewohnten Variabilität der Authentifizierungsart wählen &#8211; ob nun UserNamePassword, Zertifikate, Windows Live ID &#8211; Claims bleibt Claims. Der Service Bus ist der aus größeren Unternehmen bekannte ESB portiert auf die &#8220;Cloud&#8221;. Mittelfristig soll mit dem Service Bus eine &#8220;orchestrierte&#8221; Gemeinde von Diensten zur Verfügung gestellt werden. Das Pattern ist jedenfalls nicht neu. Der dritte im Bunde ist der Workflow Dienst. Basierend auf der WF kann er als &#8220;Schaltzentrale&#8221; verwendet werden. Momentan ist dieser Baustein noch sehr rudimentär, soll aber weiter ausgebaut werden.</p>
<p>Eine weitere Service-Gruppe ist die &#8220;SDS&#8221; &#8211; die SQL Data Services. Gleich zu Beginn klärt Dariusz hier den Unterschied zwischen &#8220;Azure Storage&#8221; und den &#8220;echten&#8221; SQL Diensten. Während die Storage eher eine &#8220;einfache, sqlfähige Datenablage&#8221; ist, sollen die SDS mittel- bis langfristig wesentlich mehr Features anbieten wie z.B. Reporting, Data Mining oder ETL Dienste. Gewöhnungsbedürftig bei den SDS ist die Organisation der Daten: Man hat nicht mehr die klassischen, relationalen SCHEMA TABLE ROW Strukturen. Statt dessen befinden sich die Daten in sog. &#8220;Containern&#8221; (vergleichbar mit Datenbanken oder Schemata). Die Daten wiederum sind als &#8220;Entities&#8221; strukturiert. Eine Entity hat mindestens einen Typ (also den Entity-Namen), eine EntityID und den EntityKind, welche Aussage über die Art oder Klasse der Datenstruktur geben soll. Weitere Felder sind frei definierbar. Die Feldtypen beschränken sich derzeit nur auf einfache Datentypen.</p>
<p>Auf weitere Dienst-Gruppen ist Dariusz nicht eingegangen &#8211; wie sollte er auch &#8211; er hatte während der Session mit anderen Problemen zu kämpfen. Jede zweite Demo ging nicht oder brach mit irgendwelchen Exceptions ab. Tja, er musste selbst zugeben, das &#8220;Äschär&#8221; noch nicht ganz fertig ist und an der einen oder anderen Stelle die notwendige Reife für den produktiven Einsatz vermissen ließ.</p>
<p>Der erste Eindruck den Windows Azure und die &#8220;SOA-Diensten&#8221; hinterlassen ist das Interesse an Neuem mit einer großen Portion Skepsis. Auch wenn irgendwann einmal Azure stabil und schnell wird bleibt abzuwarten, ob die Plattform attraktiv und intuitiv genug ist, um echte Anwendungen darauf laufen zu lassen.</p>
<p>Fazit: Mal sehen was daraus wird!</p>
<h3>Session 4: Dirk Primbs schreibt effizienten Code in C# 3.0</h3>
<p>Dirk ist eines der bekanntesten Gesichter auf Konferenzen &#8211; kein Wunder, schließlich ist er seines Zeichens Developer Evangelist bei Microsoft. Die heutige Session hatte die Überschrift &#8220;Effizienter Code in C# 3.0&#8243; &#8211; das hörte sich vielversprechend an. Also dachte ich mir, wenn ich schon nicht in die Session von Berndt gehen kann (er war leider nicht anwesend und wurde durch Dariusz vertreten), dann höre ich mir mal an, was Dirk mir über Effizienz mit C# 3.0 zu erzählen hat.</p>
<p>Leider war nicht ganz in dem Paket drin was draufstand. Dirk verbrachte über die Hälfte der Zeit damit, die Geschichte von .NET und C# zu erzählen. Angefangen bei C# 1.0, über C# 2.0 bis zum aktuellen C# 3.0. Die aktuelle 3.0-Version kam dabei für meine Begriffe viel zu kurz. Dirk vermittelte in seiner Retrospektive über C# 2.0 sehr gut, was Generics, Anonymous Methods und Discrete Property Accessors sind. Doch besonders prickelnd war es nicht gerade, mittlerweile gängige Konstrukte nochmals vorgekaut zu bekommen. Mit C# 3.0 hatte das wenig zu tun, und mit effizientem Code auch nicht.</p>
<p>Wahrscheinlich habe ich mir unter dem Titel &#8220;Effizienz&#8221; etwas anderes vorgestellt als Dirk. Er ging auf Syntax und &#8220;eleganten&#8221; Code ein, wo ich eher Effizienz-Vergleiche zwischen konkrekten und anonymen Typen erwartet hätte. Dennoch war es nicht langweilig &#8211; wer Dirk schon öfter erleben durfte, der weiß warum.</p>
<p>Es blieb am Ende doch noch eine gute Viertelstunde übrig, um auf neue Sprachkonstrukte und Features von C# 3.0 einzugehen. Type Inference und das <code>var</code> Keyword, Object Initializer und Automatic Properties. Wie zu erwarten war, wurde die Verwendung des <code>var</code> Keywords &#8220;angeregt&#8221; diskutiert. Ich hatte mich in einem Post ja schon über den <a href="/stories/?p=187">Sinn und Zweck von var</a> geäußert. Äußerst bedauernswert fand ich allerdings, das kein Sterbenswörtchen über C# 4.0, die DLR, das <code>dynamic</code> keyword oder Duck Typing verloren wurde. Zumindest ein Ausblick und ein kurzer Rundflug wäre schön gewesen.</p>
<p>Fazit: Eine Mischung aus &#8220;Basics Workshop&#8221;, Human FxCop und OpenSpace Talk &#8211; locker, bekömmlich, bekannt.</p>
<p>Soviel zum ersten Tag. Mal sehen, was der zweite bringt&#8230; :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/technical-summit-08-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technical Summit, wa?</title>
		<link>http://www.gmbsg.com/technical-summit-wa/</link>
		<comments>http://www.gmbsg.com/technical-summit-wa/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 08:05:03 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[Parallelisierung]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=215</guid>
		<description><![CDATA[So, nun bin ich Berlin bei der Techincal Summit 08 angekommen. Regnerisch, trüb und kalt. Gerade das richtige Wetter, um sich auf der ICC Berlin ein paar Neuigkeiten über Microsofts Technologie-Zukunft anzuhören. Die aktuellen Themen sind dabei Windows Azure, der ...]]></description>
			<content:encoded><![CDATA[<p>So, nun bin ich Berlin bei der <a href="http://www.technical-summit.de">Techincal Summit 08</a> angekommen. Regnerisch, trüb und kalt. Gerade das richtige Wetter, um sich auf der ICC Berlin ein paar Neuigkeiten über Microsofts Technologie-Zukunft anzuhören. Die aktuellen Themen sind dabei <a href="http://www.microsoft.com/azure/windowsazure.mspx">Windows Azure</a>, der Schritt von Microsoft in Richtung Cloud Computing, <a href="http://www.microsoft.com/soa/products/oslo.aspx">Microsoft Oslo</a>, der neue Mix aus MDA, MDD, SOA sowie weitere Nettigkeiten wie Entwicklung auf Multi-Core-Systemen, die <a href="http://msdn.microsoft.com/en-us/concurrency/default.aspx">Parallel Extensions für .NET</a>, ASP.NET MVC / AJAX und Einblicke in .NET 4.0 &#038; Visual Studio 2010.</p>
<p>Meine Session-Auswahl für den ersten Tag:</p>
<ul>
<li>Bringing out the best in Multicore Systems, <i>Steve Teixeira</i></li>
<li>AJAX-Live im Services Zeitalter, <i>Holger Schwichtenberg</i></li>
<li>Software-Entwicklung mit Windows Azure, <i>Dariusz Parys</i></li>
<li>Parallel Extensions für Microsoft .NET, <i>Bernd Marquardt</i></li>
</ul>
<p>Mal sehen, welche Erkenntnisse bis zum Abend gewonnen werden können.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/technical-summit-wa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Zukunft des Projektmanagers in der Software-Entwicklung</title>
		<link>http://www.gmbsg.com/die-zukunft-des-projektmanagers-in-der-software-entwicklung/</link>
		<comments>http://www.gmbsg.com/die-zukunft-des-projektmanagers-in-der-software-entwicklung/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 06:54:54 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Team]]></category>

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

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=187</guid>
		<description><![CDATA[Tja, ich denke eines der meist umstrittensten Neuerungen von C# 3.0 ist das kleine Wörtchen var. Schon im Vorfeld der Veröffentlichung von C# 3.0 waren im Internet heisse Diskussionen zu lesen. Jetzt, wo viele Entwickler .NET 3.5 und C# 3.0 ...]]></description>
			<content:encoded><![CDATA[<p>Tja, ich denke eines der meist umstrittensten Neuerungen von C# 3.0 ist das kleine Wörtchen <a href="http://msdn.microsoft.com/en-us/library/bb383973.aspx"><code>var</code></a>. Schon im Vorfeld der Veröffentlichung von C# 3.0 waren im Internet heisse Diskussionen zu lesen. Jetzt, wo viele Entwickler .NET 3.5 und C# 3.0 im Einsatz haben, ist der Diskussionsbedarf auch nicht besonders gemindert.</p>
<p>Anfangs war ich vom Einsatz und den Möglichkeiten, die durch <code>var</code> entstehen sehr angetan. Ehrlich gesagt bin ich das heute noch. Aber mein Enthusiasmus ist doch deutlich gedämpft, jetzt wo ich es im Einsatz sehe und selbst einsetze. Mein &#8220;Problem&#8221; (wenn man das so überhaupt sagen kann) mit <code>var</code> ist nicht die <a href="http://en.wikipedia.org/wiki/Type_inference">Typ-Inferenz</a> die es ermöglicht, sondern eher der zuweilen exzessive Einsatz.</p>
<p>Besonders betrübt bin ich, wenn ich z.B. in populären Blogs wie dem von Jeff Adwood lesen muss, das <a href="http://www.codinghorror.com/blog/archives/001136.html">var das Allheilmittel schlechthin ist</a> und so oft wie nur irgendmöglich eingesetzt werden sollte. Bei solchen Aussagen liegt bei mir die Vermutung nahe, das Jeff gerade nicht sehr große Projekte in C# stemmt. Schließlich wurde <code>var</code> nicht erfunden um die Deklarations- bzw. Konstruktionssyntax in C# zu verschönern, sondern dient einem dedizierten Zweck.</p>
<p>Umso erfreulicher ist es, das ich mich mit meiner Meinung in bester Gesellschaft vorfinde. So erklärt z.B. Richard sehr gut, das es beim <code>var</code> Keyword <a href="http://richarddingwall.name/2008/06/21/csharps-var-keyword-jeff-atwood-gets-it-all-wrong/">nicht um die Verkürzung von Codezeilen</a> geht sondern bei exzessivem Einsatz eher in die Kategorie Programmierfaulheit einzustufen ist. Ich persönlich befürworte vollständig seine Meinung,  wonach <code>var</code> dort eingesetzt werden sollte, wo es benötigt wird, und nicht überall wo es möglich ist.</p>
<p>Setzt man <code>var</code> überall ein, wo es möglich wäre, kommt solcher Code zustande:</p>
<pre name="code" class="csharp">
public object GetMatchingCode(object[] codes, string matchPattern, bool ignoreInvalid)
{
&nbsp;&nbsp;var bestMatch = FindBestMatch(matchPattern);
&nbsp;&nbsp;var blackList = codelists.GetBlackList(codes);

&nbsp;&nbsp;foreach(var c = in blackList.GetConfirmedCodes())
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;var matchPoint = bestMatch.CompareCode(c, ignoreInvalid);
&nbsp;&nbsp;&nbsp;&nbsp;matchPoint.Combine(c.ParentCode);
&nbsp;&nbsp;&nbsp;&nbsp;if (matchPoint.IsUnique(bestMatch)) return matchPoint;
&nbsp;&nbsp;}

&nbsp;&nbsp;return null;
}
</pre>
<p>Du als Leser dieser Codezeilen hast kein Visual Studio und keine Intellisense. Weißt Du, worum es bei diesen Codezeilen eigentlich geht? Ich wüßte es jedenfalls nicht.</p>
<p>Zugegeben, das Beispiel mag überspitzt sein. Jedoch übertreibe ich nicht, wenn ich sage, das ich &#8220;echten&#8221; Code schon lesen (und verstehen) musste, der mindestens den gleichen Grad von &#8220;konsequentem var Einsatz&#8221; aufwies wie obiges Beispiel.</p>
<p>Auf der anderen Seite ist <code>var</code> natürlich auch notwendig und äußerst sinnvoll. Die Paradedisziplin dabei ist sicherlich LINQ:</p>
<pre name="code" class="csharp">
var persons =
&nbsp;&nbsp;from customer in db.Customers
&nbsp;&nbsp;where customer.State = 1
&nbsp;&nbsp;select new { Id = customer.Id, Name = customer.Name };
</pre>
<p>Ich für meinen Teil finde <code>var</code> und Typ-Inferenz eine gelungene, sogar notwendige Bereicherung in C# &#8211; aber nur dort, wo es wirklich gebraucht wird. Obwohl Soren in seinem Blog mit &#8220;<a href="http://www.publicvoid.dk/TheCKeywordVarIsEvil.aspx">the C# keyword var is evil</a>&#8221; sicherlich übertreibt, ist es eine besonders empfehlenswert seinem Beispiel zu folgen und die geradezu unsinnige &#8220;Benutze immer var&#8221;-Funktion im ReSharper einfach abzuschalten.</p>
<p>Mein Fazit: <code>var</code> ist nur dann cool, wenn ich es wirklich brauche &#8211; ansonsten bleibe ich bei expliziter Typdeklaration und dem mächtigen Visual Studio Intellisense/Autocomplete.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/var-keyword-in-c-30-segen-oder-fluch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
