<?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; Design</title>
	<atom:link href="http://www.gmbsg.com/tag/design/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>Ü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>Scrum: Die bessere Sprintdauer</title>
		<link>http://www.gmbsg.com/scrum-die-bessere-sprintdauer/</link>
		<comments>http://www.gmbsg.com/scrum-die-bessere-sprintdauer/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 08:35:57 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ALT.NET]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>

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

		<guid isPermaLink="false">http://www.gmbsg.com/?p=501</guid>
		<description><![CDATA[Vielleicht ist es dem einen oder anderen schon aufgefallen: Ich baue gerade die Website ein wenig um. Um es konkreter auszudrücken: Ich habe mich dazu entschlossen, die gesamte Website mit Wordpress zu gestalten. Damit verabschiede ich mich von der Wordpress/Mediawiki ...]]></description>
			<content:encoded><![CDATA[<p>Vielleicht ist es dem einen oder anderen schon aufgefallen: Ich baue gerade die Website ein wenig um. Um es konkreter auszudrücken: Ich habe mich dazu entschlossen, die gesamte Website mit Wordpress zu gestalten. Damit verabschiede ich mich von der Wordpress/Mediawiki Konfiguration, die ich von Anfang an auf dieser Site am Laufen hatte. Über die Gründe werde ich sicherlich noch ein paar Worte verlieren. Für&#8217;s erste gibt es jedoch nur die wichtigsten Infos.</p>
<h4>Phase 1:</h4>
<p>Momentan befindet sich der Umbau in Phase 1. In dieser ersten Phase baue ich Wordpress als Blog/Site-Tool ein wenig aus. Der Works-Bereich wird dabei immer noch mit Mediawiki betrieben. Dieser erste Schritt dient der Umgestalung der Website ansich sowie der Vorbereitung im Hintergrund auf die gesamte Verwaltung der Site mit Wordpress.</p>
<h4>Phase 2:</h4>
<p>In der  zweiten Phase wird der Protierung des Contents von Mediawiki nach Wordpress vorangetrieben, Durch den massiven Content, der im Mediawiki entstanden ist, wird diese Phase wohl etwas länger dauern. Hier möchte ich insbesondere die einzelnen Versionen und die Datumsinformationen beibehalten. Das wird sicher eine kleine Herausforderung.</p>
<h4>Phase 3:</h4>
<p>Die dritte und letzte Phase ist das sog. &#8220;Polishing&#8221;. Hier werde ich Mediawiki abschalten und den alten Content archivieren. Darüber hinaus wird die Website noch mit einigen kleinen Features und Gimmicks angereichert werden. Es wird wohl auch so sein, dass das Layout der Website nochmals überarbeitet werden wird.</p>
<p>Ich werde über den Status der Umbauarbeiten natürlich berichten ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/umbau-oefter-mal-was-neues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>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>Schön juudn Bonjorno wünsch Ick&#8230;</title>
		<link>http://www.gmbsg.com/schon-juudn-bonjorno-wunsch-ick/</link>
		<comments>http://www.gmbsg.com/schon-juudn-bonjorno-wunsch-ick/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 09:19:56 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[MDD]]></category>
		<category><![CDATA[Oslo]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[WF]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=225</guid>
		<description><![CDATA[&#8230;der zweite Tag auf der Technical Summit 08 im ICC Berlin hat begonnen. Anbei gleich mal mein Session-Plan:

Oslo &#8211; Model Driven Development, Dariusz Parys
Visual Studio 2010 (Codename Rosario), Christian Binder
WCF &#038; WF in .NET 4.0, Dariusz Parys
ASP.NET Futures, Oliver Scheer

Die ...]]></description>
			<content:encoded><![CDATA[<p>&#8230;der zweite Tag auf der Technical Summit 08 im ICC Berlin hat begonnen. Anbei gleich mal mein Session-Plan:</p>
<ul>
<li>Oslo &#8211; Model Driven Development, <i>Dariusz Parys</i></li>
<li>Visual Studio 2010 (Codename Rosario), <i>Christian Binder</i></li>
<li>WCF &#038; WF in .NET 4.0, <i>Dariusz Parys</i></li>
<li>ASP.NET Futures, <i>Oliver Scheer</i></li>
</ul>
<p>Die erste Session über Oslo habe ich schon hinter mir. Ein Log dazu gibt&#8217;s nach der Summit, es sei nur kurz erwähnt: interessante Abstraktionen! Mal sehen, wie die restlichen Sessions werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/schon-juudn-bonjorno-wunsch-ick/feed/</wfw:commentRss>
		<slash:comments>0</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>Comments != Code Smell</title>
		<link>http://www.gmbsg.com/comments-code-smell/</link>
		<comments>http://www.gmbsg.com/comments-code-smell/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 18:54:08 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Code Smell]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=202</guid>
		<description><![CDATA[Erst kürzlich machte mich ein Kollege von mir per Email auf einen Post von Neal Ford aufmerksam. Neal bahauptet und begründet das Kommentare angeblich ein Code Smell seien. Dieser Aussage stelle ich mich strikt dagegen und behaupte, das Kommentare im ...]]></description>
			<content:encoded><![CDATA[<p>Erst kürzlich machte mich ein Kollege von mir per Email auf einen Post von Neal Ford aufmerksam. Neal bahauptet und begründet das <a href="http://memeagora.blogspot.com/2008/11/comments-code-smell.html">Kommentare angeblich ein Code Smell</a> seien. Dieser Aussage stelle ich mich strikt dagegen und behaupte, das <strong>Kommentare im Code im Allgemeinen kein Code Smell</strong> sind.</p>
<h3>Sind Inline-Kommentare schlecht ?</h3>
<p>Neal behauptet, Kommentare wären ein Bruch des <a href="http://de.wikipedia.org/wiki/DRY">DRY-Prinzips</a>, denn schließlich hätte man das essentielle ja schon im Code. Diesen nochmals zu kommentieren wäre eine Wiederholung dessen, was man ohnehin schon programmiert hätte.</p>
<p>Ganz so einfach ist das leider nicht. Es gibt viele Situationen, in denen Kommentare in gut geschriebenem Code hilfreich sind. Die pauschale Aussage, Kommentare würden gegen DRY verstoßen, ist schlichtweg naiv. Wichtig bei Inline-Kommentaren ist es, darüber zu schreiben, wieso man den Code in der gegebenen Form aufgebaut hat. Eine &#8220;stupide&#8221; Wiederholung der Statements wie z.B.</p>
<pre name="code" class="csharp">
/* create new account */
IAccount account = new Account();
</pre>
<p>ist sicherlich eine unnötige Wiederholung. Aber ist dadurch der Code (also <code>IAccount account = new Account();</code>) automatisch schlecht? Ich würde sagen: Nein.</p>
<p>Das Inline-Kommentare auch besonders wertwoll sein können, verschweigen die meisten. Zumindest diejenigen, die behaupten Kommentare seien ein Code Smell. Nehmen wir z.B. folgendes Code-Fragment aus einem <code>HttpModule</code>:</p>
<pre name="code" class="csharp">
private void ResetSessionCookieDomain(HttpApplication application)
{
	string host = application.Request.Url.Host;
	if (application.Session.IsNewSession &#038;&#038; !application.Request.Url.IsLoopback)
	{
		HttpCookie appCookie = application.Request.Cookies[this.GetApplicationCookieName()];
		if (appCookie != null)
		{
			appCookie.Domain = this.GetCookieDomain();
		}
	}
}
</pre>
<p>Auf den ersten Blick sieht das ja schon ziemlich aufgeräumt und verständlich aus. Aber der erste Blick trügt. Denn diese Methode wird mindestens drei mal unterschiedlich interpretiert werden.</p>
<p>Derjenige Entwickler, der wenig oder keine Erfahrung mit ASP.NET hat, wird den Code so hinnehmen wie er ist und ihn falsch verstehen. Er wird annehmen, das man in ASP.NET Cookies ausschließlich über das <code>HttpRequest</code>-Objekt zugreift und dort ändern, erstellen oder löschen kann.</p>
<p>Derjenige Entwickler, der sehr große Erfahrung in ASP.NET hat, wird den Code auch so hinnehmen wie er ist und ihn richtig interpretieren (dazu später mehr).</p>
<p>Derjenige Entwickler, der einige Erfahrungen in ASP.NET gesammelt hat, wird sich über den Code wundern und sich selbst die Frage stellen, wieso der Entwickler der den Code geschrieben hat gerade über <code>HttpRequest</code> das Cookie verändert. Schließlich gibt es ja den <code>HttpResponse</code>, der auch eine Cookies-Eigenschaft hat (<code>HttpCookieCollection</code>).</p>
<p>Im Ergebnis hat es die obige &#8220;saubere&#8221;, unkommentierte Methode geschafft, in drei verschiedenen Köpfen verschiedene Ausrufe- und Fragezeichen zu hinterlassen. Dabei wäre es ziemlich einfach, diese Mehrfachinterpretation durch einen kurzen Kommentar zu vermeiden:</p>
<pre name="code" class="csharp">
private void ResetSessionCookieDomain(HttpApplication application)
{
	string host = application.Request.Url.Host;
	if (application.Session.IsNewSession &#038;&#038; !application.Request.Url.IsLoopback)
	{
		/* Careful: when handling cookies using the response object new cookies are set.
		 * The cookie collections in the Request and Response objects are always synchronized in .Net.
		 * The request object is used to reset the domain and avoid generating a new cookie accidentally. */
		HttpCookie appCookie = application.Request.Cookies[this.GetApplicationCookieName()];
		if (appCookie != null)
		{
			appCookie.Domain = this.GetCookieDomain();
		}
	}
}
</pre>
<p>Ist das jetzt ein Code Smell? Neal behauptet ja, denn für Ihn ist die einzige Rechtfertigung für Inline-Kommentare ein komplexer Algorithmus. Ich behaupte: Nein, das ist kein Code Smell, sondern vielmehr eine Bereicherung des Codes. Ich bin mir fast sicher, das auch er den Kommentar schätzen würde, wenn er mit dem Code konfrontiert wird.</p>
<h3>Kommentare: Störfaktor oder Dokumentationsbasis ?</h3>
<p>Ein weiteres Argument von Neal gegen Kommentare &#8211; genauer gesagt gegen kommentierte Methoden im JavaDoc oder NDoc (&lt;summary/&gt;) Stil &#8211; ist der Störfaktor, der von Kommentaren ausgeht, wenn man refaktorisiert. Als ich das gelesen habe, konnte ich mir ein Schmunzeln nicht verkneifen. &#8220;Was ist denn das für eine fadenscheinige Ausrede&#8221; habe ich mir gedacht. Natürlich sind Kommentare, aus denen Dokumentationen generiert werden ein zweischneidiges Schwert. Auf der einen Seite sind sie ein weiteres, zu erstellendes und pflegendes &#8220;Code-Fragment&#8221;, auf der anderen Seite blähen sie den Sourcecode um etliche Zeilen auf und lenken von dem eigentlichen Code ab.</p>
<p>Ich persönlich habe bis Dato keinen Entwickler getroffen, der beim Entwickeln von Code gleichzeitig dokumentationsbasierte Kommentare erstellt hat. Es macht ja auch faktisch keinen Sinn, wenn man als Entwickler davon ausgeht, das man den Code sowieso noch mit großer Wahrscheinlichkeit ändern oder umstrukturieren muss. In einigen Fällen macht es sogar gar keinen Sinn, z.B. wenn man Prototypen entwickelt oder kleine, temporär verwendete Tools.</p>
<p>In einem professionellen Umfeld jedoch, wo Sourcecode ein oder sogar das einzig große Kapital eines Unternehmens ist, sind Dokumentationen allgemein ein hohes Gut. Dazu gehören nun mal auch die dokumentationsbasierten Code-Kommentare. Als Entwickler oder Entwicklungs-Team muss man sich natürlich die Frage stellen, wann und wo solche Kommentare einen effektiven Mehrwert liefern. Zumeist sind es in allererster Instanz hochgradig wiederverwendete Komponenten und Klassen, z.B. in Frameworks oder aber auch Schnittstellen. Ist der Sourcecode auch noch Teil eines Produktes, wie z.B. bei einer API, so muss dieser auf jeden Fall gut und ausreichend ausführlich kommentiert werden.</p>
<p>Hat man nun z.B. ein solches, gut kommentiertes Framework vor sich und muss es erweitern oder verändern, so ist es keinesfalls ein Grund, eine notwendige Refaktorisierung nicht oder nur unvollständig durchzuführen, weil die Kommentare existieren. Jeder, der sich selbst bei so einer Situation ertappt, das er nur den Code refaktorisiert oder garnicht refaktorisiert, weil er die &#8220;lästigen&#8221; Kommentare auch noch überarbeiten muss, sollte sich die Frage stellen, ob er den Ansprüchen in professionellen Umgebungen gerecht werden kann.</p>
<h3>Unit Tests vs. Kommentare</h3>
<p>Eine interessante Argumentation von Neal ist, das Tests den Code wesentlich besser dokumentieren als Kommentare. Dabei stelle mir die Frage, was denn Tests und Kommentare eigentlich gemeinsam haben. Verifizieren Kommentare die Funktionstüchtigkeit einer Methode? Dokumentieren Tests wieso ein Entwickler die Klasse oder Methode implementiert hat? Ich jedenfalls habe keines von beiden in der Art und Form durchführen können.</p>
<p>Neal stützt sich bei der &#8220;Unbrauchbarkeitsrechtfertigung&#8221; von Kommentaren nicht nur auf klassische Unit Tests, sondern auch auf den Einsatz von <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD-Frameworks</a> wie z.B. <a href="http://code.google.com/p/nbehave/">NBehave</a> oder <a href="http://www.codeplex.com/storyq">StoryQ</a>. Diese &#8220;ausführbaren&#8221; und damit auch testbaren Spezifikationen sind eine gute und besonders hilfreiche Bereicherung für die Software-Entwicklung. Ich habe NBehave schon eingesetzt und bin positiv angetan von den neuen Möglichkeiten, die solche Frameworks für die Software-Entwicklung eröffnen.</p>
<h3>Kommentare im Kontext</h3>
<p>Jedoch ist es keinesfalls sinnvoll, Unit Tests oder BDD mit Code-Kommentaren zu vergleichen. Der gemeinsame Nenner, den alle drei Dokumentationsformen haben, ist schlichtweg die Intention, den Code zu dokumentieren. </p>
<p>Dabei konzentrieren sich BDD-Stories auf die funktionale Spezifikation der zu erstellenden Software. Unit-Tests dokumentieren die funktionale und/oder technische Verifikation von Software. Code-Kommentare dienen der Beschreibung und Vermittlung essentieller technischer Implementierungsdetails von Software. Zusammengefasst also drei verschiedene Dokumentationsformen, die alle ein anderes Ziel verfolgen. Aus meiner Sicht sind sie nicht miteinander vergleichbar.</p>
<h3>Aber überall wird behauptet, Kommentare seien &#8220;smelly&#8221;&#8230;</h3>
<p>&#8230;jedoch ist das nicht ganz richtig. Denn &#8220;überall&#8221; wird das sicher nicht behauptet &#8211; ein Gegenbeispiel liest Du gerade. Aber es ist richtig, das es neben Neal noch weitere, z.T. hoch angesehene Quellen gibt, die behaupten, Kommentare seien ein Code Smell. Ein sehr prominentes Beispiel ist Jeff Atwood; in seiner <a href="http://www.codinghorror.com/blog/archives/000589.html">Code Smells Liste</a> sind Kommentare ganz oben.</p>
<p>Es lohnt sich hier jedoch, die Aussage genau zu lesen und auch kritisch zu hinterfragen. Denn in den meisten Fällen werden Kommentare nur als &#8220;Code Smell&#8221; deklariert, weil man entweder schlechte Erfahrungen mit Kommentaren gemacht hat oder selbst keine guten Kommentare schreiben kann. Und schon wird aus einem für mein Dafürhalten wichtiges Artefakt wie den Kommentaren ein Warnsignal für schlechten Code gemacht. Auch hier gibt es wieder einen feinen Unterschied, denn ein Code Smell ist für mich ein echtes Warnsignal, das etwas schief läuft. Die Argumentationen vieler, die Kommentare als Code Smell sehen, berufen sind jedoch kaum auf schlechten Code-Stil als auf allgemeine &#8220;Probleme&#8221; mit Kommentaren.</p>
<p>So wird oft zitiert, das Kommentare falsch geschrieben werden, wenn Sie nicht das &#8220;Warum?&#8221; erklären, sondern einfach nur beschreiben was gerade passiert. Es wird behauptet, Kommentare würden einen in die Irre führen, weil sie falsch oder nicht gepflegt sind. All das sind allerdings generelle Probleme des kommentierens, weniger ein Problem des kommentierten Codes.</p>
<p>Im Übrigen gibt es genügend Entwickler, Artikel und Bücher, die sich mit der Thematik Inline- und Code-Kommentare auseinandersetzen. Zum Beispiel gehen Andrew Hunt und David Thomas in ihrem legendären Buch <a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer">The Pragmatic Programmer</a> auf Kommentare und Dokumentationen in Punkt 44 &#8220;It&#8217;s all Writing&#8221; ein und erklären verständlich, das gutes kommentieren von Source Code unerläßlich für gute Qualität und die weitere Entwicklung ist.</p>
<p>Ich möchte natürlich auch Martin Fowler und sein Buch <a href="http://martinfowler.com/books.html#refactoring">Refactoring</a> nicht unerwähnt lassen. Fowler deklariert dort Kommentare als Code Smell &#8211; liest man jedoch seine Argumentation, warum Kommentare ein Code Smell sein können, landet man schnell wieder bei der Erkenntnis, das es hier um falsche Kommentare geht, und nicht um schlechten Code. Er gibt im Buch dennoch die folgende konrekte Handlungsanweisung:</p>
<blockquote><p>When you feel the need to write a comment, first try to refactor the code so that any comment becomes superfluous.</p></blockquote>
<p>Entscheidend für mich ist der Anfang des Satzes: &#8220;When you feel the need to write a comment&#8230;&#8221;. Es geht ihm also nicht darum, Kommentare zu eliminieren oder aber den Sinn von Kommentaren zu hinterfragen, sondern vielmehr um die Tatsache, das man versuchen sollte, den Code so gut wie möglich selbsterklärend zu schreiben. Das dies nicht immer der Fall sein kann oder in manchen Situationen nicht adequat ist, ist für Fowler selbstverständlich. Aus meiner Sicht ist die obige &#8220;best practice&#8221; eine gute &#8211; aber keine schlüssige Argumentation für einen Code Smell.</p>
<h3>Kommentare sind gut und wichtig</h3>
<p>Aus all den Betrachtungen heraus kann ich für mich nur den Schluß ziehen, das Kommentare gut und wichtig für qualitativ hochwertige und wartbare Software sind. Natürlich sollte &#8211; wie bei so vielen Dingen in der Programmierung &#8211; auf den richtigen Einsatz und die richtige Dosierung von Kommentaren geachtet werden. Wie auch für den Code selbst gilt für Kommentare, das sie erstellt und gepflegt werden müssen. Manchmal muss man sie auch löschen oder verbessern &#8211; genauso wie beim Code selbst. Entscheidend für mich beim Kommentieren ist, das ich es mindestens so durchführe, wie ich es beim ersten Lesen meines eigenen Codes erwarten würde, damit ich den Code schnell und gänzlich verstehe.</p>
<p>Fazit: <strong>Comments are a good thing</strong> (if you know how to use them).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/comments-code-smell/feed/</wfw:commentRss>
		<slash:comments>3</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>
		<item>
		<title>NConsoler &#8211; Mini-Framework für Konsolenanwendungen</title>
		<link>http://www.gmbsg.com/nconsoler-mini-framework-fur-konsolenanwendungen/</link>
		<comments>http://www.gmbsg.com/nconsoler-mini-framework-fur-konsolenanwendungen/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 09:03:09 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Konsole]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=151</guid>
		<description><![CDATA[Ab und an braucht man auch heutzutage noch Konsolenanwendungen, z. B. für kleine Tools. Nun ist an einer Konsolenanwendung nicht sonderlich viel spannendes abzuringen &#8211; bis auf das immer wieder kehrende Leid der Übergabe von Parametern.
Im Netz gibt es einige ...]]></description>
			<content:encoded><![CDATA[<p>Ab und an braucht man auch heutzutage noch Konsolenanwendungen, z. B. für kleine Tools. Nun ist an einer Konsolenanwendung nicht sonderlich viel spannendes abzuringen &#8211; bis auf das immer wieder kehrende Leid der Übergabe von Parametern.</p>
<p>Im Netz gibt es einige Code-Snippets und Parser, die Kommandozeilenparameter aufbereiten und das lästige interpretieren von Werten abnehmen. Bei der Suche nach eben so einem Parser bin ich auf <a href="http://code.google.com/p/nconsoler/">NConsoler</a> gestoßen, einem &#8220;Mini-Framework&#8221; für Konsolenanwendungen.</p>
<p>Das interessante an <a href="http://code.google.com/p/nconsoler/">NConsoler</a> ist der Ansatz der deklarativen Definition von Parametern und Operationen. Anstatt das Standard String-Array von Argumenten zu interpretieren, werden die möglichen Aktionen und Parameter einfach per Attribut definiert. Ein Vorteil dessen ist sicherlich der &#8220;Design by Contract&#8221;-Ansatz. Ein kleines Beispiel veranschaulicht die einfache Verwendung:</p>
<pre name="code" class="csharp">
namespace ConsoleCalculator
{
	class Program
	{
		static void Main(string[] args)
		{
			Consolery.Run(typeof(Program), args);
		}

		[Action]
		public static void Add
			(
			[Required]
			int first, 

			[Required]
			int second, 

			[Optional(0)]
			int third
			)
		{
			Console.WriteLine("Result: {0}", first + second + third);
		}

		[Action]
		public static void Multiply
			(
			[Required]
			int first,

			[Required]
			int second,

			[Optional(1)]
			int third
			)
		{
			Console.WriteLine("Result: {0}", first * second * third);
		}
	}
}
</pre>
<p>Auf der Konsole sieht das Ergebnis dann foldendermaßen aus:<br />
<div id="attachment_152" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.gmbsg.com/stories/wp-content/uploads/2008/11/nconsoler_result.png"><img src="http://www.gmbsg.com/stories/wp-content/uploads/2008/11/nconsoler_result.png" alt="NConsoler-Anwendung in Aktion" title="nconsoler_result" width="500" height="269" class="size-full wp-image-152" /></a><p class="wp-caption-text">NConsoler-Anwendung in Aktion</p></div></p>
<p>Fazit: Ein nettes kleines Tool, mit dem man schnell Konsolenanwendungen mit Parameterübergabe entwickeln kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/nconsoler-mini-framework-fur-konsolenanwendungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fears in OO: Angst vor Asymmetrie</title>
		<link>http://www.gmbsg.com/fears-in-oo-angst-vor-asymmetrie/</link>
		<comments>http://www.gmbsg.com/fears-in-oo-angst-vor-asymmetrie/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 03:32:11 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=70</guid>
		<description><![CDATA[Ich hatte vor einiger Zeit schon von der Angst vor Logik erzählt. Das ist aber bei Weitem nicht das einzige, wovor einige sich in der OO-Programmierung und im objekt-orientierten Design fürchten. Ein weiteres, vor Allem bei größeren Anwendungen auftretendes Phänomen ...]]></description>
			<content:encoded><![CDATA[<p>Ich hatte vor einiger Zeit schon von der <a href="/stories/?p=67">Angst vor Logik</a> erzählt. Das ist aber bei Weitem nicht das einzige, wovor einige sich in der OO-Programmierung und im objekt-orientierten Design fürchten. Ein weiteres, vor Allem bei größeren Anwendungen auftretendes Phänomen ist die Angst vor Asymmetrie &#8211; oder auch anders ausgedrückt das quasi bedingungslose Streben nach Symmetrie.</p>
<p>Symmetrie im Sinne von objekt-orientiertem Design kann in vielfältiger Weise auftreten. Ein prominentes Beispiel ist die Symmetrie über Schichten hinweg. Da beginnt man trivial mit einem UserAccountDTO und einem UserAccountDAO, bewegt sich dann auf den Business-Layer und erstellt eine UserAccount-Klasse um schlußendlich auf der Präsentationsschicht ein UserAccountController und UserAccountView zu erstellen. Diese Verfahrensweise &#8220;fördert&#8221; den &#8220;Symmetrie-Effekt&#8221;, ist aber nicht die einzige Ursache für Design-Symmetrien. Wie dem auch sei, im Ergebnis hat man ein geradezu perfekt symmetrisches Design des UserAccounts über alle Ebenen hinweg geschaffen (Anmerkung: Bei diesem Beispiel der &#8220;Layer-Symmetrie&#8221; spricht man auch öfter von &#8220;linearem Design&#8221;). </p>
<p>Auf den ersten Blick ist an so einer Symmetrie ja auch nicht viel auszusetzen: Alles ist ordenlich strukturiert, man findet sich zurecht und kann, mit Unterstützung der Symmetrie, schnell Abhängigkeiten des Systems oder von einzelnen Klassen finden. Dies ist augenscheinlich bei größeren Anwendungen ein Vorteil, denn ähnliche Strukturen und Verfahrensweisen erleichtern nunmal das Verständnis und die Wartung von großen Codeständen.</p>
<p>Jedoch ist Design-Symmetrie ein zweischneidiges und besonders scharfes Schwert. Es gibt einige Entwickler und sogar Architekten, die solche Symmetrien bedingungslos fordern und auf Teufel komm&#8217; raus einzuhalten versuchen. Manche bewußt, manche sogar unbewußt, weil es &#8220;woanders ja auch so gemacht ist&#8221; oder &#8220;schnell von der Hand&#8221; geht.</p>
<p>Genau dort setzt sie ein, die Angst vor Asymmetrie. Denn es ist durchaus denkbar und überdies sinnvoll, sich für jedes Geschäftsobjekt oder -szenario Gedanken darüber zu machen, wie man es konzipiert. Dieser Entwurf kann und soll auch hinterfragen dürfen, ob vorhandene infrastrukturelle Systeme oder Konventionen dem gegebenen aktuellen Problem genügen oder nicht. Im Klartext: Konzeptionelle Symmetrie ist kein Zwang, sondern eine vorteilhafte Erscheinung, die aber im Allgemeinen bei Weitem nicht das Gewicht einer funktionalen Anforderung hat.</p>
<p>Um beim obigen Beispiel zu bleiben: Wäre ein &#8220;UserAccount&#8221; physisch auf der Datenbank auf mehrere Tabellen verteilt (z.B. Accounts, Users, UserSettings) und wäre demnächst z.B. eine User-Setting-Verwaltung angedacht, so wäre es sicherlich erwägenswert, statt mit einem JOIN über diese Tabellen einen UserAccountDAO zu erzwingen einfach drei DTO&#8217;s und DAO&#8217;s zu erstellen, die dann vom Businessobjekt (dem UserAccount) verwendet werden. Natürlich hängt so eine Entscheidung stark vom Kontext und den Anforderungen ab, aber ich hoffe, ich konnte mit dem Beispiel den Kerngedanken von &#8220;Symmetrie vs. Asymmetrie&#8221; etwas verdeutlichen.</p>
<p>Ich persönlich empfinde asymmetrische Designs (mit einigen Symmetrien oder Analogien) sogar &#8220;schöner&#8221;, zumal sie ein deutliches Indiz für starke Objektorientierung sind. In asymmetrischen Konzepten ist die <a href="http://de.wikipedia.org/wiki/Koh%C3%A4sion_(Informatik)">Kohäsion</a> zumeist deutlich stärker, die abstrakte Klassifikation der Objekte ist klar und die <a href="http://de.wikipedia.org/wiki/Mehrstufige_Vererbung">Vererbungshierarchien</a> sind zuweilen kürzer. Im Endeffekt sind in meinen Augen solche asymmetrischen Muster in Software-Designs ein erster rudimentärer Ansatz hin zur Adaption von <a href="http://de.wikipedia.org/wiki/Permakultur">permakulturellem Denken</a> in die Konzeption von Softwarearchitekturen und -systemen.</p>
<p>Mein Fazit: <strong>Keine Angst vor Asymmetrie!</strong> Auch asymmetrische Strukturen können schön und vor Allem nachhaltig effizient sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/fears-in-oo-angst-vor-asymmetrie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fears in OO: Angst vor Logik</title>
		<link>http://www.gmbsg.com/fears-in-oo-angst-vor-logik/</link>
		<comments>http://www.gmbsg.com/fears-in-oo-angst-vor-logik/#comments</comments>
		<pubDate>Tue, 27 May 2008 18:17:47 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=67</guid>
		<description><![CDATA[Ich möchte mich ein wenig über Dinge unterhalten, über die Entwickler normalerweise nicht unbedingt gerne reden: Über Ängste. Es hört sich vielleicht etwas komisch an, aber auch Entwickler müssen sich in ihrer täglichen Arbeit ihren eigenen Ängsten stellen. Z. B. ...]]></description>
			<content:encoded><![CDATA[<p>Ich möchte mich ein wenig über Dinge unterhalten, über die Entwickler normalerweise nicht unbedingt gerne reden: Über Ängste. Es hört sich vielleicht etwas komisch an, aber auch Entwickler müssen sich in ihrer täglichen Arbeit ihren eigenen Ängsten stellen. Z. B. beim entwickeln und konzipieren von objekt-orientierter Software.</p>
<p>Es gibt viele verschiedene &#8220;Ängste&#8221;, denen man beim programmieren von OO-Software entgegnen kann. Diese Ängste lassen sich im Übrigen relativ gut aus dem Code &#8220;herauslesen&#8221;.</p>
<p>Eine der oftgesehendsten Ängste in der OO-Programmierung ist die Angst vor Logik. Im OO-Design spiegelt sich das relativ deutlich wider, wenn man viele verschiedene Klassen und Objekte hat, die sich um eine zusammenhängende Aufgabe, einen bestimmten Datensatz oder ein bestimmtes Objekt kümmern.</p>
<p>Ein Beispiel soll das Ganze etwas verdeutlichen:</p>
<pre name="code" class="csharp">
public class Credentials
{
  private string username;
  private string password;

  public Credentials()
  {
  }

  public string UserName
  {
    get { return this.username; }
    set { this.username = value; }
  }

  public string Password
  {
    get { return this.password; }
    set { this.password = value; }
  }
}
</pre>
<p>Auf den ersten Blick mag man annehmen, die Klasse sei ein einfacher Datencontainer (DTO). Dem ist jedoch nicht so. In Wahrheit ist die Klasse eine Business Entity ohne Logik. Die Logik ist einfach in anderen Klassen, wie z.B. in solch einer:</p>
<pre name="code" class="csharp">
public static class CredentialsUtility
{
  public static bool Validate(Credentials credentials)
  {
    if (credentials != null)
    {
      return !String.IsNullOrEmpty(credentials.UserName);
    }

    return false;
  }
}
</pre>
<p>An diesen zwei Klassen wird deutlich, das der Entwickler eine höllische Angst gehabt haben muss, das Business Entity mit Logik anzureichern. Denn i.d.R. ist es genau die Aufgabe eines Business Entities, diese Logik (z.B. Validierung) zu kapseln. Meiner Meinung nach ist diese &#8220;Angst&#8221; völlig unberechtigt und für ein kohärentes OO-Design kontraproduktiv. Fakt ist zudem, das es zur fundamentalen Schule der OO-Programmierung gehört, Klassen mit <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">eindeutigen Verantwortlichkeiten</a> zu schaffen. </p>
<p>Natürlich muss im Einzelfall geprüft werden, welcher Grad der Kohäsion für die Anwendung und die Architektur geeignet erscheint. Prinzipiell sollte man jedoch ein gutes Mittelmaß zwischen <a href="http://en.wikipedia.org/wiki/Cohesion_%28computer_science%29">Kohäsion</a> und <a href="http://en.wikipedia.org/wiki/Coupling_%28computer_science%29">Kopplung</a> anstreben. Komponentenorientierung und lose Kopplung ist sicherlich wichtig. Auf der Ebene der Anwendungslogik respektive Business Entities sollte man meines Erachtens tunlichst zusammenhängende Logik in die Klasse zu kapseln.</p>
<p>Mein Fazit: <strong>Keine Angst vor Logik!</strong> Anwendungslogik gehört in die Anwendungsklassen und muss nur dann verteilt werden, wenn es wirklich notwendig ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/fears-in-oo-angst-vor-logik/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Überall &#8220;virtual&#8221; &#8211; Ein Kapitalfehler bei OO-Programmierung und Design</title>
		<link>http://www.gmbsg.com/uberall-virtual-ein-kapitalfehler-bei-oo-programmierung-und-design/</link>
		<comments>http://www.gmbsg.com/uberall-virtual-ein-kapitalfehler-bei-oo-programmierung-und-design/#comments</comments>
		<pubDate>Thu, 22 May 2008 15:14:39 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=66</guid>
		<description><![CDATA[Jetzt wird&#8217;s schwierig. Ich möchte mich heute ein wenig detaillierter mit einem essentiellen Konzept der Objekt-orientierten Programmierung und dessen OO-Design beschäftigen: Dem Einsatz von virtuellen Methoden.
Virtuelle Methoden sind eines der Kernkonzepte in der Objekt-orientierung, um Polymorphie zu ermöglichen. Das interessante ...]]></description>
			<content:encoded><![CDATA[<p>Jetzt wird&#8217;s schwierig. Ich möchte mich heute ein wenig detaillierter mit einem essentiellen Konzept der Objekt-orientierten Programmierung und dessen OO-Design beschäftigen: Dem Einsatz von virtuellen Methoden.</p>
<p><a href="http://en.wikipedia.org/wiki/Virtual_function">Virtuelle Methoden</a> sind eines der Kernkonzepte in der Objekt-orientierung, um <a href="http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29">Polymorphie</a> zu ermöglichen. Das interessante an virtuellen Methoden ist ihre grundlegende Charakter-Eigenschaft, eine gewisse Aufruf- und Kontext-Konvention zu definieren, ohne das der Aufrufer der Methode die konkrete Implementierung oder besser das Verhalten der Methode hervorsehen kann.</p>
<p>Dieses Konzept in der Objekt-orientierung wurde im Laufe der Zeit stetig erweitert und verfeinert. So sind z.B. die abstrakten Methoden/Klassen sowie Interfaces eine Weiterentwicklung des Polymorphie-Gedankens von virtuellen Methoden. In C++ ist z.B. die Definition einer &#8220;puren&#8221; virtuellen Klasse (eine Klasse mit ausschließlich pur virtuellen Methoden) vergleichbar mit einem Interface in neueren Sprachen, wie z.B. C# oder Java.</p>
<p>Es ist folglich völlig nachvollziehbar, das der Einsatz von virtuellen Methoden in der objekt-orientierten Programmierung quasi unerläßlich ist, um bestimmte Konzepte umzusetzen. Nun ist es aber auch öfters der Fall, das die Zweckmäßigkeit des Einsatzes von virtuellen Methoden mißverstanden oder sogar mißbraucht wird. Des Öfteren begegne ich z.B. folgendem (oder ähnlichem) C#-Code:</p>
<pre name="code" class="csharp">
public abstract class AnimalBase
{
  private Position pos;

  public virtual Position GetPosition()
  {
    return this.pos;
  }

  public virtual void Eat() {}

  public virtual void Run(Position newPos)
  {
    this.pos = newPos;
  }
}
</pre>
<p>Solche und ähnliche Klassen bekomme ich ab und an auf meinem Screen zu sehen, wenn ich durch Quellcodes von Software durchgehe. Manchmal sieht man sogar wahre &#8220;Orgien&#8221; von &#8220;protected virtual&#8221;, &#8220;protected internal virtual&#8221; oder sogar &#8220;public virtual&#8221;.</p>
<p>Es ist meiner Meinung nach offensichtlich, das der Programmierer der obigen Klasse die Zweckmäßigkeit einer virtuellen Methode nicht oder nur teilweise verstanden hat. Alle Methoden sind virtuell. Stellt man den Entwicklern solcher Klassen die Frage, warum alle Methoden virtualisiert wurden, bekommt man meistens folgende Antwort: &#8220;Die Klasse soll erweiterbar und spezialisierbar bleiben&#8221;.</p>
<p>Tatsächlich war es vor allem in den Anfangsjahren der Objekt-orientierung gang und gäbe, wirklich alle Methoden zu virtualisieren, um der Idealvorstellung der guten Erweiterbarkeit und Spezialisierung näher zu kommen. Vor allem &#8220;OO-Theoretiker&#8221; hatten in den Gründungsjahren gepredigt, das Konzept der virtuellen Methoden genügend auszuschöpfen. Vor dem Hintergrund dessen ist es z.B. auch nicht mehr so verwunderlich, das im <a href="http://www.25hoursaday.com/CsharpVsJava.html#virtualfinal">Gegensatz zu C# bei Java alle Methoden standardmäßig virtuell sind</a>.</p>
<p>Wenn dem so ist, das viele den massiven Einsatz von virtuellen Methoden bevorzugen, was ist dann daran so verkeht?</p>
<p>Das Problem von übereifrigem Einsatz virtueller Methoden versteckt sich gut, dementsprechend sind sie auch nicht so offensichtlich, jedoch nicht minder schwerwiegend: Das Verhalten &#8211; oder besser die &#8220;Stabilität&#8221; der Implementierung einer Klassenhierarchie ist nicht gewährleistet. D.h. stellt man eine Basisklasse mit sehr vielen virtuellen Methoden zur Verfügung, so kann das eigentlich gewünschte Verhalten der Basisklasse sowie deren Kindklassen nicht mehr vollends und sicher gewährleistet werden. Angewendet auf das obige Beispiel wird die Problemstellung etwas deutlicher:</p>
<pre name="code" class="csharp">
public class Snake : AnimalBase
{
  private Position pos;

  public override void Run(Position newPos)
  {
    this.Creep(newPos);
  }

  public virtual void Creep(Position newPos)
  {
    while (!this.pos.Equals(newPos))
    {
      this.pos.X += Math.Sign(newPos.X);
      this.pos.Y += Math.Sign(newPos.Y);
      this.pos.Z += Math.Sign(newPos.Z);

      this.UpdateCreepState();
    }
  }

  protected virtual void UpdateCreepState()
  {
    /* some code */
  }
}
</pre>
<p>Auf den ersten Blick wirkt die Implementierung der &#8220;Snake&#8221;-Klasse plausibel. Dennoch führt die Implementierung zu einem massiven Fehler. Die &#8220;Standard-Implementierung&#8221; der GetPosition()-Methode von AnimalBase ist bei der Snake-Klasse nicht mehr operabel. </p>
<p>Bei einem so einfachen Beispiel mit wenigen Methoden ist das relativ offensichtlich &#8211; wäre aber die AnimalBase-Klasse eine komplexe Klasse (oder Klassen-Hierarchie) mit vielen virtuellen Methoden, so ist es selbst für geübte OO-Hasen nicht mehr überschaubar, welchen Einfluß man auf die Implementierung der Basisklassen ausübt, wenn man eine oder mehrere virtuelle Methoden überschreibt.</p>
<p>Für <a href="http://blogs.msdn.com/ericgu/">Eric Gunnerson</a>, einer der C#-Gurus und C#-Program Manager (Microsoft), ist das oben gezeigte Problem das Hauptproblem exzessiver Verwendung virtueller Methoden. Für ihn ist <a href="http://blogs.msdn.com/ericgu/archive/2006/07/18/670278.aspx">der massive Einsatz von virtuellen Methoden einer der 7 Todsünden in der OO-Programmierung</a>.</p>
<p>Mittlerweile sind sogar einige &#8220;OO-Theoretiker&#8221; davon überzeugt, dass der massive bzw. ausschließliche Einsatz von virtuellen Methoden wirklich keine gute Idee ist. Das liegt vor allem daran, das sich in der Praxis herausgestellt hat, das vor allem bei großen Software-Projekten durch die &#8220;Freiheit des Überschreibens von virtuellen Methoden&#8221; das <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov-Substitutions-Prinzip</a> stark gefährdet bzw. zum Teil durchbrochen wird.</p>
<p>Zu dieser Problemstellung drückt sich auch <a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg">Anders Hejlsberg</a>, leitender Architekt und Miterfinder der Programmiersprache von C# (Microsoft), besonders deutlich aus. In einem <a href="http://www.artima.com/intv/nonvirtual.html">Interview über die C#-Design-Konzepte</a> geht er indirekt auf die Probleme der Stabilität, der Gefährung des vereinbarten Verhaltens (&#8221;Incoming and outgoing contracts&#8221;) und Versionierungsproblemen durch virtuelle Methoden ein. Seiner Meinung nach ist durch generellen oder exzessiven Einsatz virtueller Methoden (wie z.B. in Java) die Gefahr wesentlich größer, das o.g. Probleme auftreten.</p>
<p>Ein Zitat von Anders Hejlsberg trifft meiner Meinung nach den Nagel auf den Kopf:</p>
<blockquote><p>There are two schools of thought about virtual methods. The academic school of thought says, &#8220;Everything should be virtual, because I might want to override it someday.&#8221; The pragmatic school of thought, which comes from building real applications that run in the real world, says, &#8220;We&#8217;ve got to be real careful about what we make virtual.&#8221;</p></blockquote>
<p>Ich persönlich schließe mich der Schule des &#8220;Lasst uns virtual nur dann verwenden, wenn es wirklich notwendig ist&#8221; an. Es ist vollkommen klar, das eine virtuelle Methode ein wichtiges Werkzeug für gutes OO-Design ist. Das wird alleine schon dadurch deutlich, das sie öfter zum Einsatz kommt, wenn man essentielle Design Patterns wie z.B. <a href="http://en.wikipedia.org/wiki/Template_method_pattern">Template Method</a>, <a href="http://en.wikipedia.org/wiki/Composite_pattern">Composite</a>, <a href="http://en.wikipedia.org/wiki/Decorator_pattern">Decorator</a> oder <a href="http://en.wikipedia.org/wiki/Visitor_pattern">Visitor</a> (um nur einige zu nennen) implementiert.</p>
<p>Jedoch ist es meiner Meinung nach besonders wichtig zu erkennen, dass man virtuelle Methoden wirklich nur dann einsetzt, wenn es notwendig bzw. sinnvoll ist. Eine pauschale Deklaration einer virtuellen Methode mit der Begründung der Erweiterbarkeit ist unüberlegt und in den meisten Fällen nicht sinnvoll. Folgerichtig ist in meinen Augen jeder Entwickler mit Sicherheit gut beraten, die <a href="http://msdn.microsoft.com/en-us/library/ms229044.aspx">Microsoft Guidelines zum Einsatz virtueller Methoden</a> zu beachten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/uberall-virtual-ein-kapitalfehler-bei-oo-programmierung-und-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WCF Custom Behavior Extensions &#8211; Nachtrag zur VSOne</title>
		<link>http://www.gmbsg.com/wcf-custom-behavior-extensions-nachtrag-zur-vsone/</link>
		<comments>http://www.gmbsg.com/wcf-custom-behavior-extensions-nachtrag-zur-vsone/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 10:54:43 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Works]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Objekt-Orientierung]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Web Service]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=56</guid>
		<description><![CDATA[Als Nachtrag zu meinem Vortrag auf der VSOne habe ich kurzerhand ein essentielles Pattern &#8211; nämlich das Service Gateway Pattern &#8211; in einem Artikel näher beschrieben. Hier gehe ich vor Allem auf die Adaption des Patterns in der Windows Communication ...]]></description>
			<content:encoded><![CDATA[<p>Als Nachtrag zu meinem <a href="http://www.vsone.de/sprecher.aspx?experte=Ilker+Cetinkaya">Vortrag auf der VSOne</a> habe ich kurzerhand ein essentielles Pattern &#8211; nämlich das Service Gateway Pattern &#8211; in einem Artikel näher beschrieben. Hier gehe ich vor Allem auf die Adaption des Patterns in der Windows Communication Foundation ein.</p>
<p>Denn die WCF &#8211; und das ist ja nichts neues &#8211; ist extrem flexibel und erweiterbar. Interessant wird es allerdings erst, wenn diese Flexibilität und Erweiterbarkeit in der Praxis effektiv eingesetzt werden kann. </p>
<p>Mit Hilfe von <a href="/works/index.php?title=Service_Gateway_in_WCF_-_WCF_Custom_Behavior_Extensions">WCF Custom Behavior Extensions</a> kann man elegant eigene Behaviors dem WCF Kommunikationsstrom hinzufügen und somit effizient vertikale Funktionalität wie z.B. Validierung oder Restriktion implementieren.</p>
<p><a href="/works/index.php?title=Service_Gateway_Pattern_mit_der_WCF_und_Custom_Behavior_Extensions">Zum Artikel</a> habe ich auch noch ein paar Code Samples zum Download bereitgestellt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/wcf-custom-behavior-extensions-nachtrag-zur-vsone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET User Group Vortrag: Web Services Grundlagen</title>
		<link>http://www.gmbsg.com/net-user-group-vortrag-web-services-grundlagen/</link>
		<comments>http://www.gmbsg.com/net-user-group-vortrag-web-services-grundlagen/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 15:14:40 +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[Works]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Web Service]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=38</guid>
		<description><![CDATA[Gestern durfte ich im Rahmen der .NET User Group München über konzeptionelle Grundlagen von Web Services referieren. Ich war ziemlich überrascht, dass dieses Thema reges Interesse ausgelöst hat; die Teilnehmerzahl war doch ziemlich hoch.
Für mich persönlich kann ich einen sehr ...]]></description>
			<content:encoded><![CDATA[<p>Gestern durfte ich im Rahmen der .NET User Group München über <a href="http://www.munichdot.net/Events/495.aspx">konzeptionelle Grundlagen von Web Services</a> referieren. Ich war ziemlich überrascht, dass dieses Thema reges Interesse ausgelöst hat; die Teilnehmerzahl war doch ziemlich hoch.</p>
<p>Für mich persönlich kann ich einen sehr positiven Eindruck von der Veranstaltung feststellen, zumal ich denke dass doch einige Teilnehmer nach dem Vortrag ein paar neue Erkenntnisse für sich mitnehmen konnten. Die angenehme und wissensdurstige Atmosphäre hat sicherlich seinen Beitrag für dazu geleistet, das ich meine Aufgabe als Referent mit einem gewissen Spaßfaktor erfüllen konnte.</p>
<p>Für all diejenigen, die nicht an der Veranstaltung teilehmen konnten oder die Teilnehmer, die gerne dass ganze nochmal nachlesen möchten habe ich im Works-Bereich einen <a href="http://www.gmbsg.com/works/index.php?title=Grundlagen_der_Erstellung_und_Verwendung_von_Web_Services">Artikel</a> bereitgestellt, in der die Kernthemen des Vortrages festgehalten sind. Dort stehen übrigens auch die <a href="http://www.gmbsg.com/works/index.php?title=Web_Service_Grundlagen_-_Download_Pr%C3%A4sentation">Präsentation</a> selbst sowie die gezeigten <a href="http://www.gmbsg.com/works/index.php?title=Web_Service_Grundlagen_-_Download_Code_Samples">Code-Samples</a> zum Download bereit.</p>
<p>Ich bin wie immer gespannt auf Feedback &#038; Kommentare. Viel Spaß mit den <a href="http://www.gmbsg.com/works/index.php?title=Grundlagen_der_Erstellung_und_Verwendung_von_Web_Services">Web Services Grundlagen</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/net-user-group-vortrag-web-services-grundlagen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pipemania 1.0 Beta Released!</title>
		<link>http://www.gmbsg.com/pipemania-10-beta-released/</link>
		<comments>http://www.gmbsg.com/pipemania-10-beta-released/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 07:07:27 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Design Pattern]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=33</guid>
		<description><![CDATA[Na, ich hätte es ja selbst kaum geglaubt, aber es ist soweit: Heute habe ich die erste Beta-Version von Pipemania veröffentlicht. Ich bin gespannt auf Resonanz und Kommentare.
Viel Spaß bei Spiel und Analyse des Codes!
]]></description>
			<content:encoded><![CDATA[<p>Na, ich hätte es ja selbst kaum geglaubt, aber es ist soweit: Heute habe ich die erste <a href="/projects/pipemania/">Beta-Version von Pipemania</a> veröffentlicht. Ich bin gespannt auf Resonanz und Kommentare.</p>
<p>Viel Spaß bei Spiel und Analyse des Codes!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/pipemania-10-beta-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stateful vs. Stateless Web Services</title>
		<link>http://www.gmbsg.com/stateful-vs-stateless-web-services/</link>
		<comments>http://www.gmbsg.com/stateful-vs-stateless-web-services/#comments</comments>
		<pubDate>Mon, 09 Jul 2007 22:30:01 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[Web Service]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=23</guid>
		<description><![CDATA[Es ist schon ein paar Tage her, als ich Zeuge einer kleinen Debatte unter Entwicklern wurde. Es ging um die Entwicklung eines Web Services, welches eine große Menge an Daten beliefern sollte. Während des Brainstormings über Spezifikationen und Parameter wurde ...]]></description>
			<content:encoded><![CDATA[<p>Es ist schon ein paar Tage her, als ich Zeuge einer kleinen Debatte unter Entwicklern wurde. Es ging um die Entwicklung eines Web Services, welches eine große Menge an Daten beliefern sollte. Während des Brainstormings über Spezifikationen und Parameter wurde auch darüber diskutiert, ob der Web Service stateful &#8211; also mit einer Session &#8211; oder stateless konzipiert werden soll.</p>
<p>Völlig parteilos &#8211; ich kenne beide Entwickler :-) &#8211; möchte ich diese zwei Design-Konzepte ein wenig aus meiner eigenen Betrachtungsweise durchleuchten. Auf gut englisch &#8211; my 2c&#8230;</p>
<p>Zunächst sollte man sich meiner Meinung nach der Natur des Web Services im Klaren sein. Konkret ist ein Web Service eine öffentliche Schnittstelle zum Aufruf einer entfernten Operation. Nun ist soetwas ja nicht das 8. Weltwunder &#8211; will heissen dass es viele weitere, zum Teil deutlich ältere Technologien gibt, die das gleiche bezwecken wollen &#8211; es seien hier nur RPC und CGI als prominente Beispiele erwähnt. Das Problem &#8220;stateful&#8221; vs. &#8220;stateless&#8221; stellt sich also nicht erst seit dem es Web Services gibt. </p>
<p>Einen entfernten Aufruf &#8211; den berüchtigten &#8220;Remote Call&#8221; durchzuführen ist mit der Web Services-Technologie mittlerweile kinderleicht. Remote operations zur Verfügung zu stellen ist mit dem .NET Framework zum Beispiel fast genauso kinderleicht. Umso mehr sind Entwickler dazu geneigt, diese Leichtigkeit der Verwendung mit &#8220;Leichtsinnigkeit&#8221; zu verwechseln. Denn die Tragweite der Entscheidungen über ein Web Service Design kann manchmal ungeahnte Züge annehmen.</p>
<p>Doch zurück zum Thema: Grundsätzlich wurden Web Services für den automatisierten (also maschinellen) Informationsaustausch geschaffen. Per Definition des W3C ist ein Web Service nämlich folgendes:</p>
<blockquote><p>A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the Web service in a manner prescribed by its description using SOAPmessages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards.</p></blockquote>
<p>So. Eine klare Ansage. Aber beim zweiten durchlesen wird auch schon deutlich, wo der eigentliche Knackpunkt liegt. Es geht um das Teilstück &#8220;&#8230;interoperable machine-to-machine interaction&#8230;&#8221;. De facto lässt sich daraus ableiten, dass in der Idealform jeder Rechner innerhalb eines Netzwerkes jeden Dienst und dessen Operationen ansprechen und verarbeiten kann. Das kann auch komplexere Szenarien unterstützen; z.B dass Rechner, die Dienste zur Verfügung stellen, ihrerseits zur Erfüllung ihres eigenen Dienstes einen oder mehrere andere Dienste in Anspruch nehmen. Weiterhin ist per Definition auch die Multiplizität eines Dienstes freigestellt &#8211; d.h. es kann einen oder mehrere gleichartige, oder sogar equivalent operierende Dienste geben, die auf einer oder mehreren Rechnern zur Verfügung gestellt werden.</p>
<p>Bevor es nun zu theoretisch wird, kann man die Gedankenspiele abkürzend auf einen Nenner bringen: Bei Web Services geht es um flexible Kommunikation. Die Operation wird demjenigen zur Verfügung gestellt, der Sie braucht und ist idealerweise jederzeit ersetzbar. Des Weiteren ist die Operation idealerweise kontextunabhängig &#8211; lässt sich also ohne weiteres im Verbund mit anderen Operationen aufrufen, um daraus eine neue, sog. &#8220;orchestrierte&#8221; Operation zu formen.</p>
<p>Ich laufe hier natürlich sehr in Gefahr, in das SOA-Thema auszuschweifen &#8211; also gleich weiter mit der Ableitung der Definition des Web Services zu Entscheidungshilfen beim Design von Web Services.</p>
<p>Jetzt, da man die &#8220;Natur&#8221; eines Web Services sich genauer vor Augen hält, lässt sich eindeutig sagen, dass Web Services per se kontextunabhängig sind &#8211; im Resultat also &#8220;stateless&#8221;. Der Begriff &#8220;stateless&#8221; ist hier sehr leicht mit &#8220;statisch&#8221; ersetzbar &#8211; soll es aber nicht sein. Ein Web Service ist nicht zwingend statisch, weil es keinen Zustand hat. Der Gedanke der Kontextunabhängigkeit manifestiert sich bei Web Services nahezu überall: Die SOAP-Spezifikation enthält z.B. zahlreiche Möglichkeiten, Meta-Daten mit den Daten zu einer Operation zu übertragen. Im .NET Framework wird standardmäßig bei jedem Web-Service-Methoden-Aufruf die Web-Service-Klasse selbst instanziiert &#8211; eindeutige Zeichen dafür, dass Web Services für kontextunabhängige Verwendung ausgelegt worden sind.</p>
<p>Ergo: Web Services sind erst mal von Haus aus &#8220;stateless&#8221;. Aber wieso spielen nun viele Entwickler mit dem Gedanken, einen Web Service &#8220;stateful&#8221; werden zu lassen? Das kann viele Unterschiedliche Gründe haben &#8211; in dem von mir geschilderten Fall war die Datenmenge der Vater des Gedanken. Es sei hier nur kurz in groben Zügen der Werdegang der Idee zum &#8220;stateful&#8221; Web Service beschrieben:</p>
<p>Zur Implementierung einer Suche frägt der Client mit variablen Parametern ein Satz von Daten an &#8211; die resultierende Datenmenge ist unglaublich groß (sagen wir mal mehrere tausend Datensätze mit einer großen Menge an Daten, sagen wir mal 1MB pro Datensatz). Die Abfrage und Beschaffung der Daten auf der Datenbank kostet sehr viel Zeit (sagen wir mal mehrere Minuten) und kostet unglaublich viel Ressourcen (sagen wir mal es ist eine alte, gebrechliche Datenbank mit wenig Skalierbarkeit). <em>(Merkt man, dass ich nicht gut im Erfinden von Anforderungen bin?)</em></p>
<p>Um nun Ressourcen zu schonen und die Geschwindigkeit zu erhöhen, kann man eine Session einführen, die bei der initialen Such-Abfrage erstellt wird. Die Abfrage wird gegen die Datenbank ausgeführt, das Ergebnis in der Session gespeichert und nur ein Teil der Daten (sagen wir mal, die ersten hundert) an den Client zurückgeliefert. Sollte der Client in einem zweiten Aufruf mehr Datensätze verlangen, werden die in der Session gespeicherten Daten zurückgeliefert, anstelle eine neue Abfrage gegen die Datenbank abzusetzen.</p>
<p>Ich möchte an dieser Stelle den aufmerksamen Leser bitten, über die Sinnhaftigkeit dieser Idee &#8211; wie ich es getan habe &#8211; hinwegzusehen und sich nur auf die Thematik der Kontextbezogenheit zu konzentrieren &#8211; Danke.</p>
<p>Nun, in Konsequenz würde die Einführung einer Session folgende Auswirkungen haben:<br />
Die Session müsste erstellt werden, ein Session-State-Service müsste die Sessions verwalten. Wie es mit Sessions so ist, wäre die Session nur begrenzt gültig &#8211; und damit auch der gewünschte Effekt in begrenztem Maße erreicht. Weiterhin müsste die Session-ID in jedem Aufruf mit übergeben werden &#8211; das Interface würde also mit noch mehr Meta-Daten beladen werden. Im Übrigen wäre der Aufruf der zweiten Operation (&#8221;gebe mir noch mehr Datensätze&#8221;) nur möglich, wenn zuvor die erste aufgerufen wurde.</p>
<p>All diese meiner Meinung nach unvorteilhafen Konsequenzen müsste man in Kauf nehmen, um das gewünschte Ziel zu erreichen. Ein ziemlich teurer Preis wie ich finde.</p>
<p>Mit zustandsbehafteten Web Services schafft man sich aus meiner Sicht den Flaschenhals &#8220;Session-Manager&#8221; an, erhöht u.U. die &#8220;Chattiness&#8221; der Kommunikation zwischen Client und Server und schreibt dem Client auch noch Regeln vor, wie er welche Operationen aufzurufen hat, damit er an das gewünschte Ergebnis kommt. Stellt man sich dieses Szenario auch noch in einer Umgebung vor, die für hohe Performance und Verfügbarkeit ausgelegt ist (z.B. im Cluster), kommen noch kleinere Hürden wie Persistierung der Sessions und Web Service Paralellität hinzu.</p>
<p>Alles in allem ist meiner Meinung nach &#8211; zumindest für das oben genannte Szenario &#8211; ein zustandsbehafteter Web Service<br />
1. schwieriger zu implementieren<br />
2. keine signifikante Alternative zur Steigerung des Datendurchsatzes<br />
3. mit vielen Hürden bespickt (Session-Manager, Multi-Threading)<br />
4. wesentlich schwerer skalierbar<br />
5. für Clients um ein vielfaches komplexer in der Verwendung</p>
<p>Sofern es also nicht wirklich sehr gute Gründe für die Kontextbezogenheit bestimmter Web Service-Methoden gibt, gilt beim Design von Web Services für mein Dafürhalten die grundlegende Orientierung nach der eigentlichen technologischen Ausrichtung des Web Services &#8211; <strong>stateless</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/stateful-vs-stateless-web-services/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Design Patterns: Singleton im Einsatz</title>
		<link>http://www.gmbsg.com/design-patterns-singleton-im-einsatz/</link>
		<comments>http://www.gmbsg.com/design-patterns-singleton-im-einsatz/#comments</comments>
		<pubDate>Thu, 15 Mar 2007 14:14:05 +0000</pubDate>
		<dc:creator>Ilker Cetinkaya</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Works]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Design Pattern]]></category>

		<guid isPermaLink="false">http://www.gmbsg.com/stories/?p=8</guid>
		<description><![CDATA[Als ob es schon nicht genug Content im Internet gäbe, gibt&#8217;s hier noch ein Artikel über das &#8220;berühmt berüchtigte&#8221; Singleton Design Pattern.
Die Motivation für diesen Artikel habe ich dennoch relativ schnell gefunden. Nachdem ich vor einiger Zeit das Pattern für ...]]></description>
			<content:encoded><![CDATA[<p>Als ob es schon nicht genug Content im Internet gäbe, gibt&#8217;s <a href="http://www.gmbsg.com/works/?title=Dokumente.Design.Methoden.Singleton">hier noch ein Artikel</a> über das &#8220;berühmt berüchtigte&#8221; Singleton Design Pattern.</p>
<p>Die Motivation für diesen Artikel habe ich dennoch relativ schnell gefunden. Nachdem ich vor einiger Zeit das Pattern für den Einsatz in einer Anwendung propagiert hatte, sah ich mich bestürzten Kommentaren ausgesetzt: &#8220;Wie kannst Du nur? Wer setzt denn heutzutage noch Singleton ein? Das ist doch das Anti-Pattern schlechthin&#8230;&#8221;</p>
<p>Schnell hatte ich begriffen, dass meinem gegenüber wohl der Sinn und Zweck des Singleton nicht ganz geläufig war. Nach einigen Minuten war die Sache schnell geklärt. Trotzdem hatte es mich überrascht, wie viele Entwickler doch einen verzerrten Eindruck des Entwurfsmusters haben.</p>
<p>Lange Rede, kurzer Sinn: <em>Yet another Singleton Pattern Article</em>. In vorest 3 Teilen versuche ich meine Sicht der Vor- und Nachteile des Patterns zu transportieren. Es war mir irgendwie auch ein Bedürfnis, zumindest die Basics des Patterns mal festzuhalten &#8211; es kommt leider noch oft genug vor, dass man bei Code-Reviews sich noch über solche Themen ernsthaft unterhalten muss.</p>
<p>Falls also trotz der Unmengen an Informationen darüber jetzt Dein Interesse geweckt worden ist: Einfach <a href="http://www.gmbsg.com/works/?title=Dokumente.Design.Methoden.Singleton">Singleton-Pattern im Einsatz</a> lesen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gmbsg.com/design-patterns-singleton-im-einsatz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
