<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>
        ilker.de/articles    </title>
        <link href="/feed.xml" rel="self" />
    
        <link href="/"/>
    
        
    <updated>2013-04-06T18:59:23Z</updated>

    <id>/feed.xml/</id>

                  <entry>
            <title type="html">TDD Pro Tools</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tdd-pro-tools.html"/>
            <updated>2013-04-06T19:00:00Z</updated>
            <published>2013-04-06T19:00:00Z</published>
            <id>/tdd-pro-tools.html</id>
            
            <content type="html"><![CDATA[
                <p>Im letzten Coding Dojo ging es um ein wohl eher "normales" Thema zu TDD: Tools.  Die Toolfrage ist ja eine ganz beliebte und oft diskutierte Frage. Im Coding Dojo bei <a href="http://www.it-agile.de/">IT-Agile</a> ging es allerdings etwas spezifischer um "Pro Tools". Also die Werkzeuge, die man als professioneller Entwickler für tägliches und effektives TDD benötigt.</p>

<p>Entgegen der nun vielleicht offensichtlich erscheinenden Frage um Frameworks, Testrunner und co. haben wir uns im Dojo auf die "wesentlichen" Dinge konzentriert. Zwar haben wir auch über <a href="http://www.jetbrains.com/resharper/">ReSharper</a>, <a href="https://github.com/machine/machine.specifications">MSpec</a>, <a href="https://github.com/FakeItEasy/FakeItEasy">FakeItEasy</a>, <a href="http://www.ncrunch.net/">NCrunch</a> und <a href="http://nsubstitute.github.io/">NSub</a> geredet, aber wir sind schnell von diesem üblichen Diskussionstrampelpfad wieder runter. Statt dessen wollten wir per Code Kata drei weitere "Werkzeuge" probieren, die uns als essentielles Rüstzeug für TDD erschienen.</p>

<p>Nach kurzer Diskussion standen Kata, Modus, und die 3 Rundenversuche fest: Wir würden die beliebte <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">KataFizzBuzz</a> im Randori mit 4 Teams über 3 Runden a 30 Minuten angehen. Pro Runde galt dabei die Fokussierung an eines der "Pro Tools". Die Runden-Themen waren:</p>

<ul>
<li>Merciless Refactoring</li>
<li>Pen and Paper</li>
<li>No Runner</li>
</ul>

<h3 id="merciless-refactoring">Merciless Refactoring</h3>

<p>In der ersten Runde ging es um <em>das Werkzeug</em> schlechthin: gnadenloses Refactoring. Im TDD-Alltag wird zwar oft Refactoring betrieben - aber meist nicht gnadenlos. Ich persönlich schaffe es im Alltag sehr selten, wirklich <em>gnadenloses</em> Refactoring umzusetzen. Umso mehr ist das ein Grund, die Gnadenlosigkeit in jedem TDD-Cycle zu üben.</p>

<p>Das frappierende an diesem so "offensichtlichen" und eigentlich eher als methodisches Konzept auszulegenden Tools ist: Es ist unfassbar einfach und schwer zur gleichen Zeit. Das rigorose, bis zur "Sinnlosigkeit" betriebene Refactoring zwingt einen, die Konzentration zum Lesen des Codes sehr hoch zu halten. Ich schaffe es derzeit kaum, wirklich ernsthaft mehr als eine Stunde <em>Vollgas-Refactoring</em> während des TDD zu betreiben.</p>

<p>Interessanter Weise liegt das nur zu einem geringen Teil am eingesetzten elektronischen Helfer. Während ich für ein Rename z.B. in VIM stark mit Regular Expressions arbeite, habe ich für Visual Studio die <code>F2</code>-Taste oder eben den schnellen Resharper-Rename. Natürlich macht mich die eine oder andere Vorgehensweise in der Umsetzung schneller - aber das eigentlich schwere ist für mich nicht die <em>Geschwindigkeit</em> der Umsetzung, sondern die <em>Konsequenz</em> der Umsetzung.</p>

<h3 id="pen-and-paper">Pen and Paper</h3>

<p>Der zweite Versuch zur Erkundung von hilfreichen Tools ist nicht minder ungewöhnlich und interessant als der erste. Nun ging es darum, während des <a href="http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung">TDD-Zyklusses</a> (Red-Green-Blue) nach jedem Zyklus <em>absichtlich</em> den Zyklus zu "pausieren" und sich kurz dem klassischen Werkzeug <a href="http://www.elmastudio.de/webdesign/wieso-stift-und-papier-noch-keine-fremdworter-fur-webdesigner-sind/">Stift und Papier</a> zuzuwenden.</p>

<p>Nach jedem Zyklus wird die Aufmerksamkeit also kurz wieder auf die nebenliegenden Notizen gelenkt. Man kann dort z.B. eine Design-Visualisierung skizzieren, ein paar Optionen oder To-Do's vermerken, sich die Liste alle Domänen-Begriffe nochmals vor Augen halten, oder aber auch ganz lapidar Spezifikations-Texte für Tests ausprobieren.</p>

<p>Das interessante an diesem "Tool" ist, dass es die Stringenz des TDD fördern kann. Obgleich es auf den ersten Blick eher als Ablenkung wahrgenommen wird, kann ein gut ausgenutzter Notizzettel viele hilfreiche Hinweise geben.  Besonders, wenn man sich mit einer komplexen Domäne beschäftigt, oder aber per Pair Programming längere Zeit an einem Feature arbeitet, können Papier und Bleistift nicht nur zu Freunden, sondern auch zu echten Helfern werden.</p>

<h3 id="no-runner">No Runner</h3>

<p>In der letzten Versuchsrunde - an der ich persönlich leider nicht teilnehmen konnte - war endlich auch ein technisches Tool im Fokus. Der beliebte und oft heiss diskutierte <em>Test Runner</em> rückte in den Vordergrund unserer Testreihe.  Sinn dieser Übung war es, durch den Verzicht herauszufinden, wie "schwerwiegend" denn das Tool <em>Test-Runner</em> sich auf das TDD auswirkt.</p>

<p>Es galt also, FizzBuzz komplett ohne einen Test-Runner in TDD zu entwickeln.  Statt also einen Test-Runner und damit auch ein Test-Framework zu verwenden, musste man kreativ und mit minimalem Aufwand sich aus den Bordmitteln der Programmiersprache selbst Tests zusammenschustern. Die müssen dann natürlich ausgeführt werden und die wichtigsten Signale wie "Rot" (Test fehlgeschlagen) und "Grün" (Test erfolgreich) zurückliefern können.</p>

<p>Wenn man das - auch ruhig mal in C# oder Java - ausprobiert hat, stellt man schnell fest, das so ein Test-Runner für eine "kleine Session" gar nicht so entscheidend ist. Natürlich ist es aufwendiger - gerade wenn man dann auch noch Mocks selber zusammenschreibt - aber bedeutend "schlechter" wird die TDD-Erfahrung dadurch nicht. Ganz im Gegenteil: man wird oft kreativer und baut sich schnell sehr treffende <code>Should()</code>-Extensions oder <code>Given()</code>-Factories zusammen.</p>

<h3 id="fazit">Fazit</h3>

<p>Alles in Allem kann man sagen: Wenn man im Alltag professionell TDD umsetzt, spielt das klassische, technische "Tooling" eine nicht so prominente Rolle wie man es vielleicht vermuten mag. Vielmehr sind es die methodischen Werkzeuge, die die Professionalität in Puncto Qualität und Geschwindigkeit potenziell steigern können. </p>

<p>Gerade vor diesem Hintergrund ist es richtig und wichtig, immer weiter an den methodischen Elementen des TDD zu arbeiten und zu üben.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">The Cosmopolitan Chalta Hai</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/the-cosmopolitan-chalta-hai.html"/>
            <updated>2013-03-14T14:00:00Z</updated>
            <published>2013-03-14T14:00:00Z</published>
            <id>/the-cosmopolitan-chalta-hai.html</id>
            
            <content type="html"><![CDATA[
                <p>Well, this is the kind of articles I find to be one of the most challenging. It's about culture. And, to even furthermore raise the bar, it's about a foreign culture. At least a culture foreign to most of us Europeans.</p>

<p>Today, I want to reflect my perception and opinion about an attitude from the indian culture called <em>Chalta Hai</em>. Before I get into what "Chalta Hai" is and how I see Chalta Hai to be, I want to tell you my story on how I came in contact with this attitude. Naturally, my first contact with Chalta Hai was in an international project with great collegues from India. By that time - around 2010 - I didn't knew anything about this attitude and naturally couldn't name it. However, I somehow "felt" that in certain situations my indian collegues were behaving different than what I was used to.</p>

<p>Three years later I had the chance to be part of an international project with a global, distributed team again. And again I got great teammates from India. And again I found myself wondering about the "coolness" of some of our indian collegues. Luckily, I got the chance to have a chat about this coolness with a nice and smart indian guy on my project.</p>

<p>While we were relaxing from the mental marathon of the meeting with a cup of tea, we came to discuss exactly this thing I was perceiving as "coolness" of my indian teammates. As I was asking how on earth they can stay calm and cool in critical situations where <em>pressure</em> and even <em>insults</em> are being throwed on their faces, my smart indian friend just smiled back to me and answered: "It's <em>chalta hai</em>, my friend".</p>

<h4 id="what-is-chalta-hai">What Is Chalta Hai?</h4>

<p>He continued to explain to me that <a href="http://samosapedia.com/entries/3862/Chalta%20Hai!">Chalta Hai</a> is an internal, deeply rooted attribute of the indian culture of living. It stems from Buddhism in a certain sense, as he started to detail it out. If one were to translate "chalta hai" from hindi language, it would more or less translate to <em>"it moves"</em>.</p>

<blockquote>
<p><em>Chalta Hai</em> means <em>it moves</em>.</p>
</blockquote>

<p>It moves? Yes, it moves. In such a sense, that the world keeps moving around. That whatever happens, it will be over and let another thing happen. In a sense that the past is past and the present is the thing we refer to as the "flow of time". Well, you know, it moves.</p>

<p>The interesting thing is, that Chalta Hai is being perceived and referred to as a <a href="http://agrawalsanjeev.blogspot.de/2011/07/intolerable-chalta-hai-attitude.html">negative</a>, more or less <a href="http://snehal-tripathi.blogspot.de/2012/11/chalta-hai-aur-chalta-rahega.html">counter-productive</a> attidute in contemporary indian living. As for the business perspective, Chalta Hai is being criticised as a "<a href="http://www.indianexpress.com/news/-chalta-hai--is-a-nono-in-business/951416">No-No</a>". </p>

<p>Most Indians claim that it substantially hinders the indian economy to deliver innovation and leading-edge performance. Just because of the fact, that Chalta Hai raises a sort of agnostic view to the outcome of any activity. Indians refer to this as a kind of "whatever comes, whatever goes" feeling. Something like we in Europe more or less get a notion of when we are listening to <a href="http://en.wikipedia.org/wiki/Reggae">Reggae</a> music while looking to a colourful Bob Marley poster.</p>

<p>But as it turns out with so many things in life, it's not as simple as that. Chalta Hai seems not to be only this one-dimensional thinking of "whatever happens will happen". It seems not only to favor the inability to seriously commit to any goal or target. Chalta Hai seems to be different. At least as I have been told to from my indian collegues. </p>

<p>In its root, ancient sense, Chalta Hai takes care about the soul and inner balance. It does not foster agnostic behaviour, but sharpens the mental sensory for self-destructive thinking. This further explanation reveals an important aspect of Chalta Hai to me:</p>

<blockquote>
<p><em>Chalta Hai</em> does not want to limit the future, but wants to limit the past.</p>
</blockquote>

<p>In plain words: Chalta Hai is a relaxing attitude towards what already has happened, not towards what happens or is about to happen. However, one might then think of this attitude to embrace irresponsibility. Interestingly, even most indians think that way. They argue that constantly referring to "Chalta Hai" results in irresponsibility. While this certainly is true to some extent, that again does not seem to be the whole story.</p>

<h4 id="dont-relax-do-refocus">Don't Relax, Do Refocus</h4>

<p>As I onderstood from my indian collegues, Chalta Hai - in the core buddhistic sense - is to protect you from psychological distress. It reminds you to take care of your emotional landscape and strive not to expand your emotions too far for all the things that already have happened. </p>

<p>As I listened to this detail of the explanation, I immediately thought of the "Don't take care about the past, take care about today" kind of feeling. I felt like Chalta Hai is like a personal mental note: The only thing connecting the past to the future is what we are doing, not what we did or what we plan to do.</p>

<p>"You're quite close to chalta hai" my teammate responded as I rephrased my thoughts and opinions about what I have been told so far about it. "It has certainly a negative impact as well", he continued, "in such a way, as it is a very easy hide-out to not reflect upon what has happened." That made sense to me.</p>

<p>"However, it merely wants to guide your attention to the future and the power you have. It wants to amplify your forward-thinking. It's more like <em>keep it moving</em> than <em>remain in feelings</em>".</p>

<p>"Ok", I thought to myself. While Chalta Hai wants to empower activity and a progessive way of life, it often causes the opposite. People more often seem to refer to Chalta Hai when they want to say "relax, no stress whatsoever" instead of using it for "let's refocus on what we can do".</p>

<h4 id="one-to-many-problem">One-To-Many Problem</h4>

<p>Nonetheless, this seems to be a critical problem in social life of India. I totally understand that indians want to ban "Chalta Hai" from society when it is used to "relax the past" only. Like if someone does harm to others or some other cruelty like natural hazards become true. This is serious and needs to be reflected upon seriously. It doesn't help anyone if happenings are "relaxed" without any other notion of consequence. However, as I have been told Chalta Hai to be, it's Chalta Hai that tells us not only to reflect upon what has happened, but take action as well.</p>

<p>To be frank, most of the time Chalta Hai is perceived to have a negative impact to the society. That's quite reasonable, since Chalta Hai only addresses the "mental well-being" of yourself, not the overall society you're living in. What that means is that while Chalta Hai might resolve your inner distress, it may not be able to resolve the distress of a group. Even if everyone in that group is responding to Chalta Hai for themselves, the overall distress may remain or even might be amplified.</p>

<p>This is a very common problem to what I personally like to refer to as "One-To-Many-Problem". It's not limited to Chalta Hai, but obviously is present in this type of thinking as well. Interestingly, this problematic effect is ready to be observed in a number of examples in indian social life. Your Chalta Hai is not mine, my Chalta Hai is not yours. This space of individuality is inherent to Chalta Hai, but limits its power as well.</p>

<h4 id="the-cosmopolitan-way">The Cosmopolitan Way</h4>

<p>Well, although I never lived in indian society nor have had the chance to have a stay in India for a substantially long period, I think I can have my own opinion about Chalta Hai. It's certainly very different from what it's supposed to be. Even more, it's surely very different to the Chalta Hai being lived in India right now. Hence, I want to differentiate my perspective by calling it "the cosmopolitan chalta hai".</p>

<p>My cosmopolitan Chalta Hai has an emphasis on the aspect of <em>movement</em>. I see Chalta Hai to be more a driver for activity, while it certainly keeps to send me a little message of <em>the discontinuation of the past</em> in the background. Even more, I don't want to be reminded too often to Chalta Hai. </p>

<p>My Chalta Hai wants to be in place in case of great or unexpected emotional distress. My Chalta Hai wants to be there whenever critical or shocking situations are going to be faced. Hence, my Chalta Hai is not an everyday attitude. No, it's something I don't want to be reminded to in my everyday life. However, I feel safe and sound to have <em>my personal attitude</em> of Chalta Hai in my back. It will remind me to <em>keep on moving</em>, no matter what happens.</p>

<p>Apart of that, I wish that this deeply rooted <em>Chalta Hai</em>-attitude in India will not be taken as an excuse for inactivity, imperfertedness, or inequality. I hope that the indian culture can take their own roots to reflect upon and act towards the positive and progressive kind of living.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Marker Mixins in C#</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/marker-mixins.html"/>
            <updated>2013-03-12T22:00:00Z</updated>
            <published>2013-03-12T22:00:00Z</published>
            <id>/marker-mixins.html</id>
            
            <content type="html"><![CDATA[
                <p>It's been a while since I wrote my last C# code. Frankly, I don't have much time to get into the pleasure of writing code in C#. In last couple of months my main area was Java and Python. I even had the chance to take a glimpse to <a href="http://www.scala-lang.org/">Scala</a>. Despite of that, I currently deal with <a href="http://www.java.com/en/">Java</a> (JavaEE and <a href="http://glassfish.java.net/">Glassfish</a>) and <a href="http://www.python.org/">Python</a> (and <a href="http://www.pygtk.org/">pyGTK</a>) in my main projects.</p>

<p>Enough of that. Let's talk about programming languages. In C#, there's no out of the box support for multiple inheritance. Let's not dig into the details on why that is. With C# 3.0 and the landing of <a href="http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx">extension methods</a>, the disadvantages of not having multiple inheritance have been cirumvented in a certain sense.</p>

<p>With extension methods, one can easily add or overload functionality to existing types. This brings a couple of great advantages, as it equally brings a few challenges as well.</p>

<p>I've been thinking about <a href="mehrfachvererbung-in-c.html">multiple inheritance in C#</a> and possible <a href="poor-mans-test-context-composition.html">everyday usage of mixins</a> already. I've been using it quite often within last 2 years. </p>

<p>Most of the time, I was very lucky to have mixins at hand when I was testing legacy code or dealing with legacy code. In the end, mixins (and extension methods) in C# are about enriching existing code. Sometimes, I found mixins useful for transitions as well.</p>

<h4 id="lets-change-static-things">Let's change static things</h4>

<p>When it comes to legacy code, I like to use a pattern I refer to as <em>marker mixin</em>. It doesn't have much in common with <a href="http://en.wikipedia.org/wiki/Marker_interface_pattern">marker interfaces</a>, although I must admit that I thought about them while using <em>marker mixins</em>.</p>

<p>A <em>marker mixin</em> typically is a (static) field of a class, decorating the original field type signature, and potentially altering behavior.</p>

<p>I personally use marker mixins very often when it comes to legacy code where a lot of static fields, static class methods or singletons are being used. It's a sensible strategy for me to safe-guard the code back with tests, while not changing too much of its structure beforehand.</p>

<p>Enough babbling. Let's walk the talk with a simple example. Imagine the following existing code:</p>

<div class="codehilite"><pre><span class="k">class</span> <span class="nc">MainClass</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Hello!&quot;</span><span class="p">);</span>

    <span class="n">var</span> <span class="n">d</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="p">();</span>
    <span class="n">d</span><span class="p">.</span><span class="n">Bark</span><span class="p">();</span>

    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Bye!&quot;</span><span class="p">);</span>
    <span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">Dog</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Bark</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Bark!&quot;</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Looks quite straight forward. Now imagine following scenario: You need to change the behavior of this code. The <code>MainClass</code> spits out messages the user does no longer want to see. How can you accomplish this task with a minimum impact on the existing code?</p>

<p>The answer obviously is: marker mixins. With a marker mixin, we can change the behavior of the entire <code>MainClass</code> with just one single line of code:</p>

<div class="codehilite"><pre><span class="k">class</span> <span class="nc">MainClass</span> <span class="p">{</span>
  <span class="k">static</span> <span class="n">ConsoleBehavior</span> <span class="n">Console</span><span class="p">;</span>

  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Hello!&quot;</span><span class="p">);</span>

    <span class="n">var</span> <span class="n">d</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dog</span><span class="p">();</span>
    <span class="n">d</span><span class="p">.</span><span class="n">Bark</span><span class="p">();</span>

    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Bye!&quot;</span><span class="p">);</span>
    <span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Spot the difference? Yes, it's the <code>ConsoleBehavior</code> field. This field basically is what I am talking about the whole time: the <em>marker mixin</em>. Only by adding the field, the behavior of the <code>Console</code> methods changed. Ok, now this is not really a game changer. Let's look at the implementation of <code>ConsoleBehavior</code>:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">interface</span> <span class="n">ConsoleBehavior</span> <span class="p">{}</span>

<span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">ConsoleAction</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">WriteLine</span><span class="p">(</span>
    <span class="k">this</span> <span class="n">ConsoleBehavior</span> <span class="n">consoler</span><span class="p">,</span> 
    <span class="kt">string</span> <span class="n">output</span><span class="p">)</span> <span class="p">{</span>
    <span class="cm">/* don&#39;t do anything */</span>
  <span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ReadKey</span><span class="p">(</span>
  <span class="k">this</span> <span class="n">ConsoleBehavior</span> <span class="n">consoler</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Hopefully now the <em>mixin</em> part of the pattern is a little more obvious. The <code>ConsoleBehavior</code> itself is really a <em>marker interface</em> to the extension methods from <code>ConsoleAction</code>. In this case, they selectively change the behavior of <code>WriteLine</code>, while keeping <code>ReadKey</code> intact. </p>

<p>To me, the benefit actually is twofold: first, the extension methods layer the usage (and the usage <em>change</em>) transparently. They can be tested (even TDD'ed) quite easily. Most of the time, I TDD those extension methods to document the behavioral change I'm going to introduce to the legacy component.</p>

<p>Second, I'm now able to selectively change the behavior of <code>MainClass</code> easily. I could revert it back to its initial behavior with other extension methods to <code>ConsoleBehavior</code> and linking them from another assembly, for instance. Surprisingly, I use this possibility more often than I ever thought I would use. It's a very powerful thing to change parts of the cross-cutting infrastructure just with a single assembly reference.</p>

<p>Now, in the end, this <em>marker mixin</em> thing is nothing really special. However, it shows how powerful mixin strategies and extension methods can be in everyday C# programming. I for one solved a couple of challenges with this type of thinking and design. Especially when it comes to legacy code, mixin strategies are a great way to gradually enhance the code using small and approachable steps.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Die Verbesserung an und für sich</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/die-verbesserung-an-und-fuer-sich.html"/>
            <updated>2013-03-04T21:00:00Z</updated>
            <published>2013-03-04T21:00:00Z</published>
            <id>/die-verbesserung-an-und-fuer-sich.html</id>
            
            <content type="html"><![CDATA[
                <p>Ich habe mich unlängst - auch im Zuge meiner derzeitigen Coaching-Projekte - näher mit der <em>Definition</em> der Verbesserung beschäftigt. Verbesserung wird im Duden recht lapidar abgehandelt: <em>"positiv verändern und besseres etablieren"</em>. Naja, um es kurz zu machen: viel mehr ist dort auch nicht herauszulesen.</p>

<p>Ich will jetzt nicht eine tiefgründige philosophische Abhandlung vom Zaun brechen, aber es ist meiner Meinung nach sicher lohnenswert, sich ein paar Gedanken über <em>die Verbesserung an und für sich</em> zu machen.</p>

<p>So lässt sich zunächst einmal festhalten, daß die Verbesserung ja ein Ergebnis einer Aktivität darstellen möchte. Sie ist quasi das Resultat dessen, welches wir im Allgemeinen als "verbessern" bezeichnen. Eine solche Handlung wiederum verlangt von uns einen Ausgangs- und Zielpunkt. Natürlich unterstelle ich damit ein gerichtetes und bewußtes Handeln. Das soll uns aber im Weiteren nicht stören.</p>

<p>Nun, wenn wir also <em>verbessern</em>, dann meinen wir damit eine Aktvität, deren Ergebnis wir als positiv einschätzen. Besser gesagt: wir bewerten das Ziel des Handelns als positiver als die gegenwärtige Ausgangslage.</p>

<p>Damit ist auch schon das grundlegende Wesen der Verbesserung umschrieben:</p>

<blockquote>
<p>Verbesserung ist eine positive Bewertung einer Veränderung.</p>
</blockquote>

<p>Obwohl diese lapidare Definition etwas schmalbrüstig daherzukommen scheint, steckt doch einiges an Aussagekraft dahinter. Ich möchte nur kurz auf drei wesentliche Aspekte eingehen.</p>

<h5 id="veranderung">Veränderung</h5>

<p>Jede Verbesserung ist per se eine Veränderung. Es muss für eine Verbesserung der Lage also etwas modifiziert werden. Im Sinne der Methodik wäre dies eine Aufforderung zur aktiven Gestaltung der Methode selbst. Wenn wir nicht unser <em>"wie"</em> ändern, dann kann es auch kein besseres <em>"was"</em> geben.</p>

<p>Veränderung bedingt an sich auch schon einen operativen Ausgangszustand. Es muss demnach ein wertgebenden, zweckgebundenen und anwendungsfähigen Zustand geben, bevor es zu einer Veränderung kommen kann. In einfacheren Worten: Das Ziel muss schon erreicht sein, um es daraufhin verbessern zu können. Im Sinne der Software-Entwicklungs-Methodik lässt dies sich gut mit der <em>iterativen Lösungskonzeption</em> vereinbaren.</p>

<p>Damit einher geht natürlich auch die Wahrnehmungsfähigkeit der Handlung selbst. Veränderung muss wahrnehmbar sein, sonst wäre es als Veränderung nicht erkennbar. Diese Aussage fordert uns also indirekt dazu auf, den vor uns liegenden Handlungsrahmen messbar zu gestalten.</p>

<h5 id="bewertung">Bewertung</h5>

<p>Der zweite wichtige Aspekt einer Verbesserung ist die <em>Bewertung</em>. Die Bewertung ist die eigentliche Brücke von der Veränderung hin zur Verbesserung. Wenn wir also verbessern möchten, müssen wir auch bewerten möchten - und können.</p>

<p>Ein besonders interessanter Aspekt der positven Bewertung ist die sog. Bewertungsgrundlage. Sie ist quasi der operative Kontext, in dem die Bewertung stattfindet. Ich möchte nicht zu tief in dieses Gebiet eindringen, will aber dennoch erwähnen, dass es zwei wesentliche Perspektiven der Bewertungsgrundlage gibt.</p>

<p>Die zwei "Verdächtigen" sind natürlich unsere zwei großen Bewußtseinsaspekte, nämlich die sog. <em>Ratio</em> und <em>Emotio</em>. Während die Ratio eine nüchterne, logische Faktengrundlage schafft, ist die Emotio für das ebenso berüchtigte wie ominöse "Bauchgefühl" zuständig.</p>

<h5 id="subjektivitat">Subjektivität</h5>

<p>Der letzte wichtige Aspekt der Verbesserung auf den ich in diesem Artikel eingehen möchte ist die <em>Subjektivität</em>. Sie ist - etwas flapsig ausgedrückt - eine kostenlose Beigabe der Bewertung. Denn: jede Bewertung ist subjektiv. Es ist schlußfolgernd auch die Verbesserung subjektiv.</p>

<p>Subjektivität ist für die Verbesserung ein ganz wesentliches, wenn nicht sogar entscheidendes Merkmal. Insbesondere für eine gemeinschaftliche Verbesserung, wie sie oft bei agilen Methoden propagiert und gelebt wird, ist die Beachtung der Subjektivität geradezu ein Erfolgsfaktor.</p>

<h5 id="besser">Besser?</h5>

<p>Obwohl ich durchaus noch viele Einzelheiten zu dem Wesen der Verbesserung und ihren tragenden Säulen erläutern könnte, möchte ich mich an dieser Stelle nicht zu intensiv damit befassen. Mir geht es primär darum, die Sensibilität zur Verbesserung im Kontext der Software-Entwicklung zu schärfen. Nicht nur aus der Team-Perspektive, sondern auch für die technische und fachliche Ebene.</p>

<p>Es ist für mein Defürhalten wichtig, sich der Verbesserung fokussiert zu widmen. Zumeist wird der Fokus auf die Handlung selbst gelegt, welche man als - vermeintliche - Verbesserung umzusetzen versucht. Jedoch sind die vor- und nachrangigen Aktivitäten zur Verbesserung auch einer gezielten Fokussierung würdig. Besonders Überlegungen a priori sind oftmals effektiver als man es vermuten mag.</p>

<p>Darüber hinaus möchte ich diese kurze Abhandlung mit ein paar Anmerkungen schließen. Wer nun glaubt, mit der Betrachtung von Veränderung, Bewertung und Subjektivität ließe sich Verbesserung gezielt erkennen und umsetzen, den muss ich leider enttäuschen.</p>

<p>Es ergeben sich noch eine Reihe weiterer Faktoren und Rückschlüsse, die es zu beachten bedarf. Es gibt sogar eine direkte Konsequenz aus der hier vereinfacht dargestellten Betrachtung von Verbesserung. Doch statt sie zu nennen, möchte ich den Interessierten dazu ermutigen, sich selbst gedanklich auf die Suche nach dieser wichtigen Erkenntnis zu machen.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Keep The System Going</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/keep-the-system-going.html"/>
            <updated>2013-02-21T22:00:00Z</updated>
            <published>2013-02-21T22:00:00Z</published>
            <id>/keep-the-system-going.html</id>
            
            <content type="html"><![CDATA[
                <p>I sometimes wonder why in Germany there's frequent usage of an otherwise rarely used english idiom:</p>

<blockquote>
<p>Never change a running system.</p>
</blockquote>

<p>Now, this is clearly <strong>nonsense</strong>. Despite the fact, that most native speakers would rather prefer to say <em>"if it ain't broke, don't fix it"</em>, the message of above statement is simply wrong.</p>

<p>In Germany, this phrase is often used in response to a change or improvement that failed, or otherwise caused trouble. Often, the person saying it wants to express that the <em>change</em> being made did not improve the overall situation, but caused <em>trouble</em> or even <em>damage</em>.</p>

<p>However, it's noteworthy that in most cases this person would've wanted to express a different perspective than what is being stated by this pseudo-phrase. Although many people say <em>"Never change a running system"</em>, they most often wanted to say:</p>

<blockquote>
<p>Never <em>break</em> a <em>utilized</em> system.</p>
</blockquote>

<p>More precisely, <em>"avoid regression of a utilized system in operation"</em>. Now, this in fact is quite a different meaning and perspective from the phrase most people are used to say, even when they initially wanted to express that a negative change on an operational system should not happen.</p>

<p>Even more, the described <em>intent</em> actually implies that <em>changing</em> a system is encouraged. Thoughtful, innovative or demanded changes should be applied to the system in order to i.e. keep its utilization rate, improve the functionality, or align to environmental changes. In addition, those changes need not only to be thoughtfully crafted, but actually being <em>specified</em> and <em>tested</em> in a professional manner. Hence, the intent even prompts for agile specification and testing practices.</p>

<p>That's why you - especially my german readers - should get used to say:</p>

<blockquote>
<p>Keep the system going.</p>
</blockquote>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Netzwerk - Autonomie - Emergenz</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/netzwerk-autonomie-emergenz.html"/>
            <updated>2013-02-14T08:15:57Z</updated>
            <published>2013-02-14T08:15:57Z</published>
            <id>/netzwerk-autonomie-emergenz.html</id>
            
            <content type="html"><![CDATA[
                <p>Seit mittlerweile 4 Jahren beschäftige ich mich intensiv mit Organisationen und Organisationsentwicklung. Das theoretische und praktische Handlungsumfeld ist dabei wie ich finde oft anspruchsvoller als man gemeinhin darüber denken mag. Ich betrachte mich und meine Kenntnisse darüber durchaus als "sattelfest", sehe aber noch einiges an spannenden und noch stärker zu durchdringenden Themen vor mir.</p>

<p>Nun, zu Beginn meines Interesses an Organisations- und Gruppengestaltung - so ca. Ende 2006 - hatte ich noch einen ganz anderen Zugang zu dem Thema als Heute. Das ist insofern interessant, als das seither die Theorie dazu mein stetiger Begleiter ist. Damals dachte ich nicht, dass ich jemals in die Gelegenheit kommen würde, dieses Wissen eigenständig anzuwenden. Heute, knapp 7 Jahre später, mache ich oft von diesem Wissensrepertoire gebrauch.</p>

<h4 id="netzwerk-autonomie-emergenz">Netzwerk, Autonomie, Emergenz</h4>

<p>Während dieser Zeit haben mich drei Themenblöcke immer wieder eingefangen. Da wäre zunächst einmal das <em>Netzwerk</em> als Organisationsform. Es gibt viele Ausprägungen von Netzen, angefangen von Stern- und Ringnetzen, bis hin zu All-Channel-Netzen und der geliebten Graphentheorie.</p>

<p>Dem schließt sich nahtlos das Thema der <em>Autonomie</em> an. Autonomie ist ein faszinierendes, jedoch umso schwerer greifbares Themengebiet. Ich musste gerade bei der Autonomie viel lernen und verstehen, bevor es sich in das Gesamtbild in der Organisationsentwicklung einbetten ließ.</p>

<p>Die Krönung ist allerdings das Phänomen der <em>Emergenz</em>. Obwohl ich mich gerade mit der Emergenz als erstes von diesen drei Themen auseinandergesetzt habe, ist die <em>Emergenz</em> für mich immer noch nicht vollends überschaubar. Zwar habe ich mittlerweile einiges an Wissen und Erfahrung angesammelt. Doch gerade hier liegt die Schwierigkeit verborgen: Mit dem zusätzlichen Wissen kommen oft noch mehr Fragen auf.</p>

<p>Wie dem auch sei. Der Zufall will es nun, dass ich einen Vortrag darüber nun drei Mal in nahezu exaktem 3-Jahres-Rhytmus gehalten habe. Unlängst bei der bekannten <a href="http://www.sigs-datacom.de/oop2013/oop2013.html">OOP 2013</a> als Pecha Kucha in München. Drei Jahre davor als Kurzvortrag bei der O'Reilly <a href="http://igniteshow.de">Ignite</a>, wieder in München. Die Premiere des Vortrages war ganz ohne Bilder - nur als Motivationsrede - 2007 bei dem "Tag der Ideen", einer Fachtagung für alternative Ideen, wieder in München.</p>

<p>Grund genug, dass ich die Folien zu dem "Vortrag" nun auch <a href="talks/netzwerk-autonomie-emergenz/index.html">Online zur Verfügung</a> stelle. Doch damit nicht genug, denn es gibt noch eine weitere Besonderheit: Sowohl der Pecha Kucha bei der OOP, als auch der O'Reilly Ignite-Talk wurden per Video aufgezeichnet:</p>

<ul>
<li><a href="http://www.techcast.com/events/oop/pecha03">Video des Pecha Kucha bei der OOP 2013</a></li>
<li><a href="http://vimeo.com/59532802">Video des Ignite Talks bei der Ignite MUC 2010</a></li>
</ul>

<p>In diesem Sinne: Netzwerk - Autonomie - Emergenz.<br />
Das braucht das Unternehmen von Heute.*</p>

<p>*<em>seit über 6 Jahren sage ich das. :-)</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Scrum: Die bessere Sprintplanung</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/scrum-die-bessere-sprintplanung.html"/>
            <updated>2013-02-11T22:15:57Z</updated>
            <published>2013-02-11T22:15:57Z</published>
            <id>/scrum-die-bessere-sprintplanung.html</id>
            
            <content type="html"><![CDATA[
                <p>Scrum ist nicht einfach. Verstehen lässt es sich sehr leicht. Bei der Umsetzung wird es jedoch oftmals um ein vielfaches schwerer. Besonders schwer erscheint hierbei das Konzept der Planung des Sprints.</p>

<p>Es ist zwar schon eine Weile her, als ich über meine Sicht der <a href="funf-schwachpunkte-von-scrum.html">5 Schwachpunkte von Scrum</a> erzählt habe. Einer dieser Schwachpunkte ist eben die Planung und das Design der Stories in einem Sprint.</p>

<h3 id="planen-und-designen-jetzt">Planen und Designen: Jetzt!</h3>

<p>In Scrum ist die Planung und das Design der User Stories genau deshalb ein Schwachpunkt, weil es formal - als Bestandteil des Frameworks - nur im Sprint-Planning-Meeting manifestiert ist. Sogar eingespielte Scrum-Teams schaffen es kaum, in 4 bis 8 Stunden alle User Stories eines Sprints mit einer gangbaren Lösungskonzeption zu bereichern. Das Problem ist offensichtlich: die unnötige Fokussierung auf das Sprint-Planning-Meeting.</p>

<p>Jetzt gibt es sicherlich Scrum-Freunde, die einem solchen Argument mit “Scrum verbietet ja nicht, dass man mehr als nur eine Sprint-Planung macht”. So einen Satz muss man erst einmal sacken lassen. Fadenscheinig, Lachhaft, Unpräzise. Das sind die Eigenschaften eines solchen Arguments.</p>

<p>Darüber hinaus beschweren sich Entwickler und Architekten mit ausgeprägtem Sinn für Software-Design über mangelnde konzeptionelle Integrität, wenn man “agil lossprintet”. Sie empfinden die Sprint-Plannings als “aktionistisch” und “affektiert”. Manche sagen sogar, dass Sprint-Planning sei ein Paradebeispiel für das berüchtigte <a href="http://en.wikipedia.org/wiki/Design_by_committee">Design by Comittee</a>.</p>

<p>Doch nun genug der Kritik. Wie auch in meinen Verbesserungsvorschlägen zu der <a href="scrum-die-bessere-sprintdauer.html">besseren Sprintdauer</a> als auch zum <a href="scrum-der-bessere-scrum-master.html">besseren Scrum Master</a> möchte ich in diesem Artikel ein paar Anregungen zu einer besseren Planung und einem besseren Software Design geben.</p>

<h3 id="zeitlose-kunst">Zeitlose Kunst</h3>

<p>Aus meiner Sicht gibt es eine besonders wichtige Erkenntis, wenn es um agiles Software-Design im Allgemeinen geht: Software-Design ist zeitlos. Zeitlos im Sinne des Zeitpunktes und nicht unbedingt im Sinne der Dauer. Die gemeinschaftliche geistige Leistung des Designs von Softwarelösungen ist rein konzeptionell in der Agilität nicht mit einem festen Zeitpunkt vereinbar.</p>

<p>Das heißt: Die Sprint-Planung als Meeting (sowohl der erste, als auch der zweite Teil) sind in ihrem Schwerpunkt <em>organisatorisch</em>. Das Sprint-Planning sollte nicht als “Planungs-und-Design-Workshop” wahrgenommen werden, sondern als eine “Ermittlung des Status-Quo”. </p>

<p>Das Ziel des Sprint-Plannings ist es eben nicht, konzeptionelle Produktivität abzurufen. Die “Wie machen wir das?”-Frage im zweiten Sprint-Planning zielt nicht darauf ab, Problemstellungen zu Software-Design mit Lösungskonzepten aufzulösen. Die Frage regt vielmehr dazu an, das gesamte verfügbare Arsenal an Wissen und Informationen bzgl. der Herangehensweise zu einer User Story abzurufen. Das ist ein kleiner, aber entscheidender Unterschied.</p>

<p>Besonders unerfahrene (oder unwissende) Scrum Master machen oft den Fehler, in den Sprint-Plannings das Team mit wiederholten “Wie können wir das lösen?”-Fragen auf eine schnelle und unüberlegte Konzeption zu drängen. Natürlich ist es gut, nochmals sich selbst zu fragen, ob alle Fakten auf dem Tisch sind. Aber das war’s dann auch. Wenn Ungewißheiten oder Fragen offen bleiben, dann ist das eben so.</p>

<h3 id="storyboards">Storyboards</h3>

<p>Hat man es als Team mal gedanklich geschafft, die Aktivität des Software-Designs und damit auch der kurzfristigen Planung von einer zeitlichen Schranke zu entkoppeln, werden viele Dinge offensichtlicher und leichter. </p>

<p>So stellt man dann auf einmal fest, wie irreführend eigentlich die Bezeichnung “Estimation Meeting” für die Veranstaltungen sind, in denen unter Anderem erstmals über Stories gepokert wird. Eigentlich sollten die Meetings eher “Story Gathering” genannt werden. Denn neben der eigentlichen Erhebung von “Story Points” geht es gerade dabei um den Austausch von unterschiedlichen Problem- und Lösungsmodellen zu einer User Story.</p>

<p>Mehr noch, man stellt weiter fest, dass es völlig normal und legitim ist, während den Daily Scrums weitere Tasks auf das Board zu schreiben. Oft sind es gerade die teaminternen Gespräche über die neuen Tasks nach dem Daily, die konzeptionell wertvoll sind.</p>

<p>Mit der Zeit werden Teams, die die Konzeption von Software-Komponenten als stetigen Begleiter der Entwicklung selbst verinnerlicht haben, verschiedene weitere Maßnahmen eigenständig herausarbeiten. So ist es überaus hilfreich, wenn sich Teams sog. “Storyboards” zulegen. </p>

<p>In XP sind das meistens physische Boards oder Wände, an denen ein konzeptioneller und technischer Überblick über die User Story gegeben wird. Storyboards werden nicht erst im Sprint aufgestellt, sondern werden meist 1-2 Sprints im voraus schon im Flur oder am Graffiti gesichtet.</p>

<h3 id="die-reise-des-konzeptes">Die Reise des Konzeptes</h3>

<p>Eine weitere Maßnahme zur Verbesserung der “suboptimalen” Design- und Planungsgrundlagen von Scrum ist wiederum eine aus XP entlehnte Methode der gemeinsamen Erarbeitung von Lösungen. Gemeint ist hier das altbewährte “Task Travelling”-Prinzip. Es war eines der ersten XP-Planungstechniken, die ich lernen durfte und hat sich bis heute als ein sehr wirksames Mittel erwiesen.</p>

<p>Im Kontext des Software-Designs und der User-Story-Planung werden dabei eine oder wenige User Stories - z.B. diejenigen, die in dem Estimation Meeting vorgestellt wurden - als Paket im Team “herumgereicht”. Jeden Tag bewegt sich das Paket von Team-Mitglied zu Team-Mitglied, bis es schlußendlich wieder beim ersten Mitglied landet.</p>

<p>Hat der Einzelne nun einmal so ein “Paket”, sollte schon im Daily erwähnt werden, dass man sich mit dem Paket beschäftigen wird. Das Paket wird in einer kurzen Session vom Vorgänger übergeben. Meist mit Informationen über den aktuellen Stand und die Herausforderungen, die zu erwarten sind. Danach entwickelt man in ein oder mehreren Stunden <em>alleine</em> die Konzepte weiter. Die Erkenntnisse bzw. Ergebnisse werden im Paket festgehalten und mitgegeben. Am Folgetag wird das Paket - unabhängig von den Ergebnissen - weitergereicht.</p>

<p>Das Resultat dieser “Reise des Konzeptes” ist oft verblüffend gut. Alle Beteiligten kennen die User Story und mögliche Lösungspfade, es liegt im Allgemeinen ein dokumentiertes Konzeptpapier vor und alle Teammitglieder konnten gemeinsam am Konzept wirken. Ich habe sehr positive Erfahrungen mit Task Travelling und der “Reise des Konzeptes” gehabt.</p>

<h3 id="tdd-und-bdd">TDD und BDD</h3>

<p>Zu guter Letzt sollte man TDD, BDD und ATDD als agile Designverfahren unbedingt in Betracht ziehen. Ich persönlich lehne mich da auch gerne weit aus dem Fenster. Ein Team, welches kein TDD, BDD oder ähnliche Verfahren einsetzt ist in meinen Augen einem Team mit TDD / BDD haushoch unterlegen. Agiles Design ist ohne TDD und BDD de Facto sehr schwer durchführbar.</p>

<p>Interessanterweise fängt gerade BDD auch schon beim Storyboard und den Akzeptanzkriterien an. Erfahrene Team-Mitglieder schreiben z.B. schon während des Sprint-Plannings ihre Specs zusammen und checken sie auch sofort ein.</p>

<p>Darüber hinaus werden in der aus dem TDD bekannten Keyword-Analyse sofort Kandidaten für Klassen und Methoden herausgearbeitet. Obwohl ich das selbst leider nie gemacht habe, empfand ich es schon smart und hilfreich, als ein sehr erfahrener Entwickler während des Meetings ab und zu in seine Konsole kurze Klassendefinitionen eintippte:</p>

<div class="codehilite"><pre><span class="n">echo</span> <span class="err">“</span><span class="n">class</span> <span class="n">Recommendation:</span>
  <span class="n">pass</span><span class="err">”</span> <span class="o">&gt;</span> <span class="n">recommendation</span><span class="o">.</span><span class="n">py</span>
</pre></div>

<p>Es ist sicherlich auch eine Frage des Geschmacks, wie man die Konzeption schlußendlich festhält. Hervorzuheben ist allerdings, dass es besonders hilfreich ist, früh in die Codebasis einzutauchen und sog. “executable specs” zu formulieren.</p>

<h3 id="kontinuierliche-konzepte">Kontinuierliche Konzepte</h3>

<p>Summa summarum lässt sich folgendes schließen: Scrum hat den Schwachpunkt, dass es wenig greifbare Mittel für ein agiles Software-Design - und damit auch eine agile Iterationsplanung vorgibt. Dieser Umstand macht es notwendig, verschiedene Design- und Planungsmethoden in den Alltag agiler Teams einzubeziehen. Ganz besonders Praktiken aus XP können bei agiler Software-Entwicklung einen großen Mehrwert liefern. </p>

<p>Schlüssel für eine bessere Planung und ein besseres Design ist die gemeinschaftliche Erkenntnis, dass sowohl agile Planung als auch agiles Software-Design eine kontinuierliche Aufgabe ist, die stetig als kollaborative Teamaufgabe umgesetzt werden will.</p>

<div id="see">
  <h6>
Weiterführende Artikel</h6>
                  <ul class="">
  <li><a href="/funf-schwachpunkte-von-scrum.html">Fünf Schwachpunkte von Scrum
    <span class="order">08 February 2010</span>
  </a></li>
  <li><a href="/scrum-die-bessere-sprintdauer.html">Scrum: Die bessere Sprintdauer
    <span class="order">04 March 2010</span>
  </a></li>
  <li><a href="/scrum-der-bessere-scrum-master.html">Scrum: Der bessere Scrum Master
    <span class="order">16 June 2010</span>
  </a></li>
</ul>
</div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Pair Stairs</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/pair-stairs.html"/>
            <updated>2013-01-28T20:30:30Z</updated>
            <published>2013-01-28T20:30:30Z</published>
            <id>/pair-stairs.html</id>
            
            <content type="html"><![CDATA[
                <p>It’s been quite a few years with me in the agile software engineering area. More precisely, my journey with agile methods started over with XP around 2003. That’s a decade of agile engineering practice and experience.</p>

<p>The good thing about this fact is: It does not tell you anything about the “completeness” of my experience. This is good for me as well, since it does mean that I’m not a “complete” agile practitioner. Nobody is. And that’s why I like to be an agile practitioner. Learning and improving for the better. Day by day.</p>

<p>And this actually is exactly the reason why I was so excited lately to be able to learn things about XP being new to me. Although I consider my knowledge and experience pretty well within this agile methodology, I’m still learning very useful new things.</p>

<p>One of those very useful things I learned a few months ago is the <em>Pair Stairs</em> chart. This chart typically is placed somewhere on the team or sprint board. It’s purpose and effectiveness is very simple: help the team do pair programming.</p>

<p>The chart itself is no more than a simple matrix of all team members (including testers, business analysts, sysops). Whenever two team members pair up, they mark their “pairing” with a dot, check or simple line. The team always strives to get the complete chart filled, which effectively means that the team has undergone all pairing combinations.</p>

<p><img alt="Pair Stairs" src="/media/images/pair_stairs.jpg" /></p>

<p>This chart often is called “pair stairs” because it looks like a “stairway” to knowledge sharing and team performance. If all stairs have been advanced at the end of the sprint, the team (and completely filled out chart as well) is called “pairmuted” (I think the reference to the mathematical concept of permutation is obvious here). Hence, a “pairmutating team” is a team where all team members paired with each other at least once within a sprint.</p>

<p>A very smart and useful extension to the “pair stairs” chart are task markers. Instead of marking the pair with a single checkbox on the stair, the topic or task is being placed on the stair using a post-it. It turns out that this variation is very powerful, since it enables everyone on the team to see how the topics are being tackled by the team.</p>

<p>Although I learned about this chart just a few months ago, the chart itself is quite known and <a href="http://itnaut.com/pairing_staircase">established as an XP practice</a>. It’s been in use for over a decade now in XP community and has proven to be <a href="http://alaverdyan.com/readme/2010/12/pair-programming-matrix-board/">very effective</a>. </p>

<p>I personally remember that a few participants at <a href="qcon-london-2009-a-brief-summary.html">QCON 2009</a> mentioned to work with “pair stairs” in their teams. I honestly have to admit that by that time I didn’t knew what they were takling about and that I haven’t felt any urge to ask them what these “stairs” are all about. </p>

<p>Now, four years later, I know better.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Notizen eines Nerds 2012</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/notizen-eines-nerds-2012.html"/>
            <updated>2012-12-31T01:30:38Z</updated>
            <published>2012-12-31T01:30:38Z</published>
            <id>/notizen-eines-nerds-2012.html</id>
            
            <content type="html"><![CDATA[
                <p>Hier sind meine <em>Notizen eines Nerds</em> für 2012. Viel Spaß! </p>

<h3 id="notizen-eines-nerds">Notizen eines Nerds</h3>

<ul>
<li><a href="change-vector.html">Culture Change Vector</a></li>
<li><a href="ci-secrets-notes.html">CI Secrets - Die Notizen</a></li>
<li><a href="amigo-agilo-topics.html">Amigo Agilo - Die Bedeutung</a></li>
<li><a href="wesen-von-verhandlungen.html">Das Wesen von Verhandlungen</a></li>
<li><a href="agile-verhandlung.html">Agile Verhandlung</a></li>
<li><a href="der-berater.html">Der Berater</a></li>
<li><a href="lines-of-code-kata-notes.html">Lines Of Code Kata - Notizen</a></li>
<li><a href="parnas-on-documentation.html">David Parnas über die Dokumentation</a></li>
<li><a href="story-1-product-owner.html">Die erste Story des Product Owners</a></li>
<li><a href="agile-re-for-re.html">Agiles RE für RE</a></li>
<li><a href="feature-circle.html">The Feature Circle</a></li>
<li><a href="one-piece-flow-session.html">Das 'One Piece Flow'-Modell</a></li>
</ul>

<h4 id="more-nerd-notes">More Nerd Notes</h4>

<p>Der aufmerksame Leser meines Blogs kennt sicherlich auch die letzten beiden Ausgaben meiner Nerd-Notizen, nämlich die <a href="notizen-eines-nerds-2011.html">Notizen eines Nerds 2011</a> als auch die <a href="notizen-eines-nerds-2010.html">Notizen eines Nerds 2010</a>.</p>

<p><strong>Ich wünsche uns allen gemeinsam ein gesundes, frohes, glückliches und erfolgreiches Jahr 2013!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">The Feature Circle</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/feature-circle.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/feature-circle.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1211">Notizen eines Nerds 12'11</h4>

<p><img alt="The Feature Circle" src="/media/images/feature_circle.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">David Parnas über die Dokumentation</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/parnas-on-documentation.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/parnas-on-documentation.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-128">Notizen eines Nerds 12'8</h4>

<p><img alt="Parnas über Dokumentation" src="/media/images/parnas_on_documentation.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Agiles RE für RE</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/agile-re-for-re.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/agile-re-for-re.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1210">Notizen eines Nerds 12'10</h4>

<p><img alt="Agiles RE für RE" src="/media/images/agile_re_for_re.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Das Wesen von Verhandlungen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/wesen-von-verhandlungen.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/wesen-von-verhandlungen.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-124">Notizen eines Nerds 12'4</h4>

<p><img alt="Verhandlungen" src="/media/images/wesen_verhandlung.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Agile Verhandlung</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/agile-verhandlung.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/agile-verhandlung.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-125">Notizen eines Nerds 12'5</h4>

<p><img alt="Agile Verhandlung" src="/media/images/agile_verhandlung.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Culture Change Vector</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/change-vector.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/change-vector.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-121">Notizen eines Nerds 12'1</h4>

<p><img alt="The Culture Change Vector" src="/media/images/change_vector_culture.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Das &#39;One Piece Flow&#39;-Modell</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/one-piece-flow-session.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/one-piece-flow-session.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1212">Notizen eines Nerds 12'12</h4>

<p><img alt="One Piece Flow" src="/media/images/one_piece_flow.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Berater</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-berater.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/der-berater.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-126">Notizen eines Nerds 12'6</h4>

<p><img alt="Der Berater" src="/media/images/der_berater.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Die erste Story des Product Owners</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/story-1-product-owner.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/story-1-product-owner.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-129">Notizen eines Nerds 12'9</h4>

<p><img alt="Story Nr.1 of a Product Owner" src="/media/images/story_nr_1_product_owner.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Amigo Agilo - Die Bedeutung</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/amigo-agilo-topics.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/amigo-agilo-topics.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-123">Notizen eines Nerds 12'3</h4>

<p><img alt="Amigo Agilo - Die Bedeutung" src="/media/images/amigo_agilo_topics.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Lines Of Code Kata - Notizen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/lines-of-code-kata-notes.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/lines-of-code-kata-notes.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-127">Notizen eines Nerds 12'7</h4>

<p><img alt="LOC Kata Notes" src="/media/images/lines_of_code_kata_notes.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">CI Secrets - Die Notizen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ci-secrets-notes.html"/>
            <updated>2012-12-30T15:37:24Z</updated>
            <published>2012-12-30T15:37:24Z</published>
            <id>/ci-secrets-notes.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-122">Notizen eines Nerds 12'2</h4>

<p><img alt="CI Secrets" src="/media/images/ci-secrets-notes.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Semantische Regression</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/semantische-regression.html"/>
            <updated>2012-10-23T16:00:00Z</updated>
            <published>2012-10-23T16:00:00Z</published>
            <id>/semantische-regression.html</id>
            
            <content type="html"><![CDATA[
                <p>Es gibt einen berühmten Begriff von <a href="http://martinfowler.com/">Martin Fowler</a>, den er während seiner <a href="http://www.youtube.com/watch?v=p5Qj75nJPEs">Keynote auf der Agile Connect 2011</a> im Zusammenhang mit Agilität erwähnt hat. Es ist der Begriff der <a href="http://martinfowler.com/bliki/SemanticDiffusion.html">semantischen Diffusion</a>. Damit möchte Fowler seine Beobachtung von der breiten Interpretation interpretationsbedürftiger Begriffe beschreiben. </p>

<p>Ein sehr gutes und auch oft von ihm selbst zitiertes Beispiel ist der Begriff der <em>"Agilität"</em>. Durch den Erfolg und den Zuspruch der agilen Bewegung bekommt dieser natürlicher Weise auch mehr Interesse (von außen) als auch eine größere Basis als Anhängerschaft. Das führt zur Interpretation und Anwendung der agilen Werte in verschiedensten Kulturen und Kontexten, welches wiederum sich auf den interpretationsbedürftigen Begriff "Agilität" reflektiert.</p>

<p>Der Begriff und dessen Semantik verbreitert sich also automatisch mit der steigenden Popularität eben der Konzepte, welches durch diesen Begriff repräsentiert wird. Ich persönlich finde diese Argumentation schlüssig und konnte sie selbst auch für verschiedene Begriffe wiedererkennen.</p>

<h4 id="regression-wzxhzdk0-diffusion">Regression &gt; Diffusion</h4>

<p>Aber es geht meiner Meinung nach bei manchen Begriffen noch einen Stück weiter. Gerade für den Begriff der "Agilität" lässt sich in manchen Situationen meiner Meinung nach eine weitere Stufe feststellen. Dabei wird der Begriff nicht nur "gedehnt", wie es Fowler so schön <a href="http://www.youtube.com/watch?v=60WLlID124Y">herrschaftssprachlich</a> umschreibt, sondern auch noch von seiner originären Bedeutung distanziert.</p>

<p>Um mich nun an das für meinen Geschmack subtil prahlerische Vokabular von Fowler anzufügen, möchte ich diesen eben beschriebenen Bedeutungsverlust als <em>semantische Regression</em> bezeichnen.</p>

<p><em>(Anmerkung: Ich werde im Übrigen über den gesamten Beitrag hinweg diesen Unterton der fingierten "Herrschaftlichkeit" mit meiner Wortwahl weiter versuchen aufrecht zu erhalten, um so auf dessen Wirkweise und Wirksamkeit aufmerksam zu machen.)</em></p>

<p>Die semantische Regression ist also ein Prozess, bei der die Bedeutung des ursprünglichen Begriffs schrittweise von seiner selbst abgetragen wird. Dabei entsteht nebenläufig auch ein Rekonstruktionsprozess, der getarnt als Interpretationskraft die Begrifflichkeit in eine neue Deutungsrichtung zu schieben versucht. Bei erfolgreicher semantischer Regression ist das Resultat also ein Begriff, der schlußendlich mit der originären Bedeutung kaum bis gar nichts gemein hat.</p>

<p>Nun mag man annehmen, das ein Bedeutungswandel - ähnlich wie der Diffusion - einen negativen Character hat. Das ist zu weiten Teilen auch der Fall. Dennoch kann es durchaus auch vorkommen, dass ein ursprünglich "schwieriger Begriff" degeneriert um sich daraufhin wieder zu einem "akzeptableren Begriff" zu regenerieren. Ich werde nochmals auf die Bewertung des Bedeutungswandels zurückkommen. Für den Moment ist es ausreichend zu erkennen, dass der Prozess des <em>Wandels zum Schlechten</em> hier als <em>Regression</em> bezeichnet wird.</p>

<p>Nähert man sich nun den Begriffen der Diffusion und Regression im Kontekt der Semantik, so ist eine Abgrenzung der Begrifflichkeiten unerlässlich. In ihrer eigenständigen Darstellung kann man feststellen, dass eine <em>Diffusion</em> einer Bedeutung auf eine <em>Erweiterung</em> (im verständnisreduzierten Sinne) hinweisen möchte, während die <em>Regression</em> einer Bedeutung eher als eine <em>Verschlechterung</em> (ebenfalls im verständnisreduzierten Sinn) zu verstehen ist.</p>

<p>In unserem konkreten Arbeitsumfeld der Software-Entwicklung lassen sich interessante Beispiele finden, die man in beide Kategorien einzuordnen versuchen kann. Eine Einordnung ist natürlich der Subjektivität des Ordnenden unterlegen. Dennoch möchte ich ein paar Beispiele als Anregung zum Nachdenken geben.</p>

<p>Beispiele für mögliche semantische <em>Diffusion</em>:</p>

<ul>
<li>Tool</li>
<li>Schätzung</li>
<li>Unit Test</li>
<li>Refactoring</li>
</ul>

<p>Beisiele für mögliche semantische <em>Regression</em>:</p>

<ul>
<li>Framework</li>
<li>Planung</li>
<li>Agil</li>
<li>Requirement</li>
</ul>

<p>Für die relativ naive Definition und Betrachtung der <em>semantischen Regression</em> sind diese Beispiele sicherlich genügend Anreiz zum Differenzieren.</p>

<h4 id="regression-der-agilitat">Regression der Agilität?</h4>

<p>Ich möchte doch nun wieder zum Ausgangspunkt zurückkehren und wieder die <em>"Agilität"</em> als Begriff in den Fokus der Betrachtung stellen. Ich behaupte, dass sich nach den nun mehr als dutzend Jahren der "agilen Bewegung" der Begriff der Agilität hinsichtlich seiner ursprünglichen Bedeutung verschlechtert hat. Ich werde hier nicht das naheliegende tun, welches natürlich die Analyse der ursprünglichen als auch der jetzigen Bedeutung der "Agilität" wäre.</p>

<p>Was ich statt dessen tun möchte ist auf ein paar "Hinweise" deuten, die bei solch einer Betrachtung hilfreich sein können. So kann man zum Beispiel feststellen, dass sich das <a href="http://agilemanifesto.org/">Agile Manifest</a> seit dessen Formulierung <em>nicht geändert hat</em>. Weiterhin ist offensichtlich, dass <a href="http://de.wikipedia.org/wiki/Scrum">Scrum</a> der bekannteste und am meisten eingesetzte Vertreter eines agilen Verfahrens ist. In letzter Zeit hat sich auch in der agilen Community das <a href="http://de.wikipedia.org/wiki/Kanban_in_der_IT">Kanban</a>-Verfahren stärker präsentiert. Die Zahl der "agilen Werkzeuge" - angefangen von angeblich super-produktiven <a href="http://urbanturtle.com/">digitalen Boards</a> bis hin zu kompletten <a href="http://www.oracle.com/us/products/applications/064697.html">Produkt-Portfolio-Management-Systemen</a> - ist in den letzten Jahren förmlich explodiert. Etablierte Konsortien und sog. Fachexperten interessieren sich seit Längerem auch für eine <a href="http://www.sei.cmu.edu/cmmi/compatibility/agile.cfm">Formalisierung</a> bzw. <a href="http://en.wikipedia.org/wiki/Agile_Unified_Process">Standardisierung</a> von Agilität.</p>

<p>Mit all diesen Hinweisen lassen sich sicherlich weitere Gedanken entwickeln, die zu einer Beurteilung führen können, ob nun die Agilität als Begriff einer semantischen Diffusion unterliegt, oder ob - wie von mir in dem Raum gestellt - auch eine semantische Regression möglich ist bzw. stattfindet.</p>

<p>Ich persönlich denke, das gerade der Begriff der "Agilität" oft breit und platt verwendet - ja sogar "entwendet" wird. Es gibt mittlerweile nicht nur agile Tools oder agile Standards, sondern auch "agile Workflows" <em>(klingelt's?)</em> bzw. "agile Frameworks" <em>(läutet's?)</em>. Es ist quasi schon ein Zeichen der Etikette in der Software-Entwicklungs-Branche, allen wichtigen und neuartigen Produkten oder Verfahren das Verb <em>agile</em> voranzustellen, um sich sogleich als fortschrittlich, offengeistig und flexibel darzustellen.</p>

<h4 id="diffuse-interpretationsraume">Diffuse Interpretationsräume</h4>

<p>An dieser Stelle denke ich habe ich genug Denkanstöße für eine eigene Meinungsbildung gegeben und möchte mich von der Ebene der Hypothese wieder zurück auf den der Empirie begeben. Unzweifelhaft ist demnach nicht nur die Stichhaltigkeit der Feststellung der <a href="http://martinfowler.com/bliki/SemanticDiffusion.html">semantischen Diffusion</a> von Fowler vor über 6 Jahren. Vielmehr ist auch kaum anzuzweifeln, dass die breite Anwendung verschiedener agiler Verfahren (wie z.B. Pair Programming) kombiniert mit dem durchaus erwünschten äußeren Einfluss neuer Erkenntnisse und Verfahren (wie z.B. Kanban) einen großen Interpretationsraum abbilden.</p>

<p>Entscheidend ist es hier meiner Auffassung nach, dass sich Impulsgeber, Trendsetter und Vordenker - wie eben auch ein Martin Fowler - sich klar zu Veränderungen äußern und die allgemeine Meinungsbildung vorantreiben. Es wäre meines Erachtens nicht förderlich, sich der sachlichen Auseinandersetzung mit Alternativen oder Neuerungen zu entziehen oder sie sogar abzulehnen. Neuerungen müssen in diesem Fall nicht nur dinglicher Natur sein, sondern können eben auch verschiedene andere Aspekte einschließen, wie z.B. "Agile Enterprise" oder "Agile Design".</p>

<p>Wie auch Fowler komme ich dabei zum vorläufigen Schluß, dass es nichts hilft zu lamentieren. Es ist vielmehr wichtig zu erkennen, dass ernsthafte und skeptische Auseinandersetzung mit dem Fortschritt ein aufwendiger, manchmal kräftezehrender Prozess ist. Der jedoch ist nicht nur notwendig, sondern eben auch einflussnehmend auf den Fortschritt selbst.</p>

<p>Die ständige Beschäftigung und Rekapitulation des Verständnisses von Agilität sind es, die uns allen dabei helfen, sowohl die semantische Diffusion als auch eine mögliche Regression zu verhindern - oder zumindest zu mildern. Ich kann es deswegen kaum verstehen, warum ich manchmal intelligente, progressive Entwickler treffe, die das Wort "agile" eher meiden, als es aus ihrer Perspektive klar darzulegen. </p>

<p>Ja, es kommt sogar vor, das vereinzelt ein Raunen und Seufzen zu hören ist, wenn man "schon wieder" über "agile Werte" oder "agile Entwicklung" redet. An genau diese Meinungsfraktion wende ich mich zu und entgegne sehr gerne: Fällt euch eigentlich nicht auf, dass gerade die stetige Iteration und Verbesserung Merkmale eures eigenen Wirkens und Erfolges sind?</p>

<h4 id="raus-mit-der-sprache">Raus mit der Sprache</h4>

<p>Der Verbreiterung oder Verschlechterung einer Bedeutung kann man entgegentreten, in dem man eine gemeinschaftliche Sicht auf den Begriff und dessen Bedeutung entwickelt und aufrecht erhält. Dazu gehört nicht nur das Schärfen der Begrifflichkeit an sich, sondern eben auch die aktive Gestaltung der Entwicklung des Begriffes. Konsequenter Weise ist die Teilnahme an der Diskussion und die Äußerung der eigenen Wahrnehmung über den Begriff sowohl für das eigene als auch für das allgemeine Verständnis förderlich.</p>

<p>Damit möchte ich auch schon meine Vermutung zur semantischen Regression abschließen und zu guter Letzt noch den Blick hin zur Sprachwissenschaft werfen. Für die ist nämlich der Prozess des Bedeutungswandels ein durchaus natürlicher Prozess, der zugleich auch ein Zeugnis der Anwendung und Anwendbarkeit des Begriffes ist. Auch dort gibt es eine Art <em>Diffusion</em> und <em>Regression</em> der Semantik, welche dort aber <a href="http://de.wikipedia.org/wiki/Bedeutungserweiterung">Amplifikation</a> <em>(Bedeutungserweiterung)</em> bzw. <a href="http://de.wikipedia.org/wiki/Pejoration">Pejoration</a> <em>(Bedeutungsverschlechterung)</em> bezeichnet werden.</p>

<p>Letzteres - die <em>Verschlechterung</em> einer Bedeutung - ist ein durchaus streitbarer Begriff. Besonders, wenn man sich die Frage stellt, welche Kriterien denn nun für eine Beurteilung der <em>Verbesserung</em> oder <em>Verschlechterung</em> einer Begrifflichkeit und dessen Verständnisses herangezogen werden sollen. Es wandert bei der Kategorisierung in "Besser" und "Schlechter" immer der Schatten der Subjektivität mit dem Wesen der Beurteilung mit.</p>

<p>Nichtsdestotrotz gibt es Möglichkeiten sich einer solchen Beurteilung relativ objektiv zu nähern. So kann man z.B. die Bewertung der semantischen Schärfe auf den <em>Wirkungsgrad</em> der Verständlichkeit reduzieren. Konkret gesprochen: wenn man längere Zeit braucht, um die Bedeutung hinter einem Wort zu verstehen, so könnte man die Bindung des Begriffes zu dessen Bedeutung verglichen zum schnell Verständlichen als "schlechter" bezeichnen.</p>

<p>Das auch diese Ansätze nicht frei von jeglicher Individualität sind, ist wohl offensichtlich. Aber: es liefert mögliche Dimensionen, um sich hin zu einer allgemein tragfähigen Beurteilung zur semantischen Schärfe bzw. Unschärfe zu nähern.</p>

<h4 id="mit-kommunikation-zur-konvention">Mit Kommunikation zur Konvention</h4>

<p>Die Erkenntnis, die sich mir durch die Betrachtung der Beziehung zwischen Begriff und Bedeutung aus Sicht der Verständlichkeit erschließt, ist relativ einfach zu formulieren. Es Bedarf einer stetigen Kommunikation mit und über den Begriff und dessen Bedeutung, um zum Wohle des allgemeinen Verständnisses sowohl den Begriff als auch die Bedeutung zu konventionalisieren.</p>

<p>In diesem Sinne kann ich nur jeden ermutigen, sich mit anderen über Agilität auszutauschen, darüber zu reden und zu schreiben. Die konstruktive Grundhaltung vorausgesetzt, kann solch ein Austausch nur von Vorteil für den Einzelnen wie auch für die Gemeinschaft sein. Ein Ausweichen oder Ignorieren alleine nur vom Begriff selbst ist schon eine Art der Kapitulation gegenüber des eigenen Klärungsbedürfnisses über die Bedeutung des Begriffes.</p>

<p>Es bleibt also festzuhalten:</p>

<blockquote>
<p>Die Bedeutung eines Wortes ist das, was die Erklärung der Bedeutung erklärt.* </p>
</blockquote>

<p><em>*(<a href="http://de.wikipedia.org/wiki/Ludwig_Wittgenstein">Ludwig Wittgenstein</a>)</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Definition Of Delivery</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/definition-of-delivery.html"/>
            <updated>2012-10-15T12:00:00Z</updated>
            <published>2012-10-15T12:00:00Z</published>
            <id>/definition-of-delivery.html</id>
            
            <content type="html"><![CDATA[
                <p>No, this blog post is not about what some of you might expect after reading its title. I'm not going to talk about any release criteria or "yet another derivate of Definition of Done". Granted, my topic is about Definition of Done, but in a very different sense. So let me just wrap up things now a little.</p>

<p>A few weeks ago I read a very interesting <a href="http://stefanroock.wordpress.com/2012/08/04/definition-of-ready-a-double-edged-sword/">article by Stefan Roock</a> about the correlation between <em>Definition of Done</em> and <em>Definition of Ready</em>. For those who don't know any of those terms, I'll just summarize it briefly. The "<a href="http://www.scrumalliance.org/articles/105-what-is-definition-of-done-dod">Definition of Done</a>" (DoD) is a team agreement about the quality criteria a given task should meet before it actually can be considered done. Likewise, the "<a href="http://www.romanpichler.com/blog/product-backlog/the-definition-of-ready/">Definition of Ready</a>" (DoR) is a set of quality criteria a user story should fulfill in order to be "ready" for the development team.</p>

<p>Now the interesting part of abovementioned article actually is the correlation he is drawing between both of them. His argument seems reasonable: While the "Definition of Done" should grow over time, the "Definition of Ready" should shrink over the same time.</p>

<p class="figure">
<img alt="A wrong assumption on how DoD and DoR should develop over time." src="/media/images/bad_dod_dor.png" /><br />
Figure 1: A <strong>wrong assumption</strong> on how DoD and DoR should develop over time.</p>

<p>And that's what made me scratch my head. To be honest, I not only was wondering why this should be as laid out in the article, but was equally wondering about the weak reasoning behind that statement. My perspective is the absolute contrary: I firmly believe that both DoD and DoR should grow and be extended over time. That's why I was very irritated when I read this - well, to my perception sort of naive statement.</p>

<p>So, let's just get into it: Why should both DoR and DoD tend towards growth? The reason behind this is quite easy. Both DoR and DoD share the same purpose and characteristics. They are a transparent means to agree upon the quality criteria for a certain deliverable (or type of deliverable). One might generalize this shared purpose to the term <em>"Definition of Delivery"</em>. (And voila, here's this articles title).</p>

<p>For me, there are two very important aspects of such a "Definition of Delivery", which I'll abbreviate as "DeDe" further on. First of all, a DeDe targets a transparent definition of quality characteristics for the deliverable in question. It's important to realize that it's not adding up to the core value of the deliverable itself, but rather view the deliverable from the supportive and qualitative perspective.</p>

<p>Second, there's an even more important thing to know about a DeDe. A DeDe is self-directed. This basically means that any "Definition of X" is defined and directed towards its author. This property of self-directedness is a <em>key property</em>. It means that only the producer(s) of the deliverable are eligible to define the DeDe for themselves.</p>

<p class="figure">
<img alt="A desirable growth of self-expected quality through DoD and DoR over time." src="/media/images/good_dod_dor.png" /><br />
Figure 2: A <strong>desirable growth</strong> of self-expected quality through DoD and DoR over time.</p>

<p>And this is mainly why I disagree with Stefan's statement. The very same as DoD is defined by the team, the DoR is defined by the Product Owner. All just with the purpose to deliver better results. Hence, both DoR and DoD should be improved over time (mainly by extension). No third party should be able to alter or define the DeDe. However, that's actually my impression of what happens in Stefan's article.</p>

<p>I recognize that Stefan looks at the DoR from the <em>team perspective</em>. From this perspective he concludes that the DoR should be kept reasonably small in order to enable the team to work on the user story as early as possible. And as time goes by, the team does know more and more about the product itself. The DoR can be lowered even more now, since the team has gained a solid knowledge of the domain in order to reasonably handle even the bare minimum user story written on a post-it.</p>

<p>As fair as this might sound in first place, it's a critical thing to look at in the long run. The ultimate "sense for quality work" might get lost on PO side. User stories might then not have essential acceptance criteria to ensure the proper realization of the business value. Even more, the "what" part of the development might be influenced too much by the team itself. That's surely something not desirable.</p>

<p>Instead, I think it's important to let the PO decide how the qualitative characteristics of a user story should look like. If he thinks that it's an important quality improvement that every user story should have personas and two business case studies, then he should be able to independently define that in the DoR.</p>

<p>Of course, there's this risk of "over-engineering" a user story. We all are afraid of such a scenario: what if the PO starts to write extensive 200 page documentation about every user story because he thinks that it's needed for a "high quality user story"? Well, that's why Scrum has Scrum Masters to ensure a well-balanced and reasonable usage of all practices and tools. Oh, and by the way, the risk of over-engineering is surely not only limited to the DoR. It might just equally well happen at the team level with a DoD.</p>

<p>To put it simple and straight, my point is that a "Definition of Delivery" of any kind should be a self-directed agreement about the quality criteria of a deliverable. As such, it strives to be improved and extended until a point is reached where the efforts for the properties of quality outweigh the benefits of them. This decision is normally being made by the consumer of the deliverable in question (i.e. the team if we were talking about a DoR on user stories).</p>

<p>In consequence, I strongly favour the <em>will to extend and improve</em> both the Definition of Done and the Definition of Ready. This is very much the opposite of the 'raise DoD, lower DoR' statement of Stefan. I personally think that such a one-dimensional view of DoD and DoR might cause very negative effects in practice. Hence, I'd like you to be very thoughtful and attentive when it comes to dealing with either Definition of Ready or Definition of Done.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Gestaltung pur bei der NRWConf</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/gestaltung-pur-bei-der-nrwconf.html"/>
            <updated>2012-10-13T14:00:00Z</updated>
            <published>2012-10-13T14:00:00Z</published>
            <id>/gestaltung-pur-bei-der-nrwconf.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist eine besonders erfreuliche Entwicklung, dass sich vieles in der .NET und Windows-Community bewegt und ändert. Zumindest habe ich den Eindruck, dass ich einiges bewegt. Erst gestern konnte ich dies auf der <a href="http://www.nrwconf.de">NRWConf Konferenz</a> wieder einmal eindrucksvoll erfahren.</p>

<p>Obgleich ich erst zu den Nachmittags-Veranstaltungen hinzugestossen bin, habe ich dennoch 3 sehr inspirierende Vorträge gehört. Zwischendurch hatte ich auch das Vergnügen meine Präsentation über "Agiles Software-Design" vortragen zu dürfen. Doch nun erst einmal alles der Reihe nach.</p>

<h4 id="gestaltung-von-vorgehen">Gestaltung von Vorgehen</h4>

<p>Die erste Session die ich besuchte war der Vortrag "Scrum vs. Kanban" von <a href="http://www.xing.com/profile/Thomas_Schissler">Thomas Schissler</a>. Im Großen und Ganzen empfand ich den Vortrag als einen guten Rundflug über das angeschriebene Themenfeld, wobei ich deutlich eine schwerere Gewichtung zu Kanban wahrgenommen habe.</p>

<p>Die Ausführungen von Thomas zu Kanban waren im Rahmen der Kürze der Vortragszeit angemessen und sachlich. Ich empfand auch die unparteiische Herangehensweise zu beiden methodischen Feldern als positiv. Thomas wurde überdies nicht müde zu betonen, dass eine Gegenüberstellung von Scrum und Kanban keine "Entscheidungssituation" hervorrufen sollte, sondern vielmehr die "wenigen Gemeinsamkeiten und deutlichen Unterschiede" hervorheben soll. Eine wie ich finde gelungene Einführung, ohne zu sehr in belastende Details zu flüchten.</p>

<h4 id="gestaltung-von-spezifikation">Gestaltung von Spezifikation</h4>

<p>Der zweite Beitrag den ich bestaunen durfte war der Vortag "Testing war gestern, Spezifikation ist heute." von <a href="http://bjoernrochel.de">Björn Rochel</a> und <a href="http://therightstuff.de">Alexander Groß</a>. Der Vortrag thematisierte den geistigen und methodischen Übergang von validierungsorientiertem Testen hin zur gestaltungsorientierten Spezifikation. Da sowohl Björn als auch Alexander in dem Themenfeld ausgewiesene Experten sind, waren meine Erwartungen entsprechend hoch.</p>

<p>Um es kurz zu fassen - meine Erwartungen haben sich bestätigt. In einer Stunde wurde mir eine gleichsam informative und anspruchsvolle Abhandlung dargelegt, die sich zunächst mit grundlegenden Themen wie Motivation und Kontext zur "programmatischen Spezifikationsgestaltung" befasste und darauf aufbauend einen guten Überblick zu Werkzeugen und praktischem Einsatz lieferte.</p>

<h4 id="gestaltung-vom-modellen">Gestaltung vom Modellen</h4>

<p>Eine ganz besondere Freude war es für mich, dass ich bei dem "Functional Design Dojo" von <a href="http://shishkin.org">Sergey Shishkin</a> teilnehmen durfte. In diesem "Design Dojo" hob er die Metapher des aus den Coding Dojos bekannten <em>Übungsraumes</em> aus dem praktischen Kontext der konkreten Gestaltung heraus, um sie sogleich in den praktischen Kontext des abstrakten Gestaltens wieder einzubetten.</p>

<p>Das Design Dojo hatte eine sog. "<a href="http://www.architecturalkatas.com">Architecture Kata</a>" zum Thema, welche wir in kleinen Gruppen (à 3 Teilnehmer) auf einem A2 Blatt mit den Hilfsmitteln von Stift und Papier lösen sollten. Lösungsziel war das Skizzieren eines Zielsystems, welches insbesondere den Ansprüchen der Änderbarkeit und Erweiterbarkeit genügen sollte.</p>

<p>Die Erfahrung des Dojos als auch der Interaktion mit den Teilnehmern möchte ich nicht mehr missen. Das Format, die Gestaltung des Dojos, die Kata als auch unsere Bemühungen hin zu einem Zielsystem waren für mich sehr lehrreich. </p>

<p>Es tut gut zu wissen, dass stetige Übung als ein wichtiges Mittel des Lernens und Verbesserns von Fähigkeiten von vielen professionellen Entwicklern angenommen wird. Sergey hat mit diesem Dojo unzweifelhaft einen weiteren wichtigen Beitrag dazu geleistet.</p>

<h4 id="gestaltung-der-community">Gestaltung der Community</h4>

<p>Abschließend bleibt mir ein äußerst wertvoller Eindruck der <a href="http://www.nrwconf.de">NRWConf Konferenz</a> 2012, die wieder einmal einen großen Beitrag zur konstruktiven Gestaltung der .NET- und Windows-Entwickler-Community geleistet hat. </p>

<p>Besonders erfreulich finde ich, dass die innere Haltung der Community auch zu neuen Technologien wie WinRT, anderen Sprachen wie JavaScript bzw. Ruby, oder besonderen Architekturen wie CQRS, sich als offen und annahmefreundlich erweist. </p>

<p>Wie schon in meinem Artikel "<a href="/leaving-net.html">Leaving .NET</a>" über meine persönliche Orientierung zu anderen Technologien, Plattformen und Methoden komme ich auch hier zu der Schlußfolgerung, das Alternativen per se eine Bereicherung darstellen. Mit einer vernünftigen Mischung aus innovativer Offenheit, fachgetriebener Skepsis und konstruktivem Gestaltungswillen lassen sich Alternativen auch nutzenbringend und vorteilhaft einsetzen. Das Ziel: <em>"Turn alternatives into advantages."</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">The Elegant Guard</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/the-elegant-guard.html"/>
            <updated>2012-10-11T12:00:00Z</updated>
            <published>2012-10-11T12:00:00Z</published>
            <id>/the-elegant-guard.html</id>
            
            <content type="html"><![CDATA[
                <p>I'm a firm believer and proponent of <a href="/polyglotism.html">Polyglotism</a>. Within the last 2 years, I travelled through various languages like F#, Python and Ruby, to name a few. Nonetheless, I'm still around the C# landscape and happen to find the language as well as parts of the .NET framework yet quite elegant from time to time.</p>

<p>Recently, I stumbled upon a code fragment from a smart developer who wrote a class to check preconditions a la <a href="http://research.microsoft.com/en-us/projects/contracts/">Code Contracts</a>. I personally like to guard methods to have them express explicitly the context they operate in. As I saw the code and its usage, I thought to myself: "A quite nice piece of C#". Well, be the judge for yourself:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">Guard</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ArgumentNotNull</span><span class="p">(</span><span class="n">Expression</span><span class="p">&lt;</span><span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;&gt;</span> <span class="n">argumentAccessor</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">ArgumentNotNull</span><span class="p">(</span><span class="n">argumentAccessor</span><span class="p">,</span> <span class="k">null</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ArgumentNotNull</span><span class="p">(</span><span class="n">Expression</span><span class="p">&lt;</span><span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;&gt;</span> <span class="n">argumentAccessor</span><span class="p">,</span> <span class="kt">string</span> <span class="n">message</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">compiledAccessor</span> <span class="p">=</span> <span class="n">argumentAccessor</span><span class="p">.</span><span class="n">Compile</span><span class="p">();</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">compiledAccessor</span><span class="p">()</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
      <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentNullException</span><span class="p">(</span>
        <span class="n">GetMemberName</span><span class="p">(</span><span class="n">argumentAccessor</span><span class="p">.</span><span class="n">Body</span><span class="p">),</span> 
        <span class="n">message</span> <span class="p">??</span> <span class="kt">string</span><span class="p">.</span><span class="n">Emtpy</span>
      <span class="p">);</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ArgumentsNotNull</span><span class="p">(</span><span class="k">params</span> <span class="n">Expression</span><span class="p">&lt;</span><span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;&gt;</span> <span class="n">argumentAccessors</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">foreach</span> <span class="p">(</span><span class="n">var</span> <span class="n">argumentAccessor</span> <span class="n">argumentAccessors</span><span class="p">)</span>
      <span class="n">ArgumentNotNull</span><span class="p">(</span><span class="n">argumentAccessor</span><span class="p">,</span> <span class="k">null</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">GetMemberName</span><span class="p">(</span><span class="n">Expression</span> <span class="n">expression</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">switch</span> <span class="p">(</span><span class="n">expression</span><span class="p">.</span><span class="n">NodeType</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">case</span> <span class="n">ExpressionType</span><span class="p">.</span><span class="n">MemberAccess</span><span class="p">:</span>
        <span class="n">var</span> <span class="n">memberExpression</span> <span class="p">=</span> <span class="p">(</span><span class="n">MemberExpression</span><span class="p">)</span><span class="n">expression</span><span class="p">;</span>
        <span class="n">var</span> <span class="n">supername</span> <span class="p">=</span> <span class="n">GetMemberName</span><span class="p">(</span><span class="n">memberExpression</span><span class="p">.</span><span class="n">Expression</span><span class="p">);</span>

        <span class="k">return</span> <span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrEmpty</span><span class="p">(</span><span class="n">supername</span><span class="p">)</span> <span class="p">?</span>
          <span class="n">memberExpression</span><span class="p">.</span><span class="n">Member</span><span class="p">.</span><span class="n">Name</span> <span class="p">:</span>
          <span class="n">supername</span> <span class="p">+</span> <span class="sc">&#39;.&#39;</span> <span class="p">+</span> <span class="n">memberExpression</span><span class="p">.</span><span class="n">Member</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span>

      <span class="k">case</span> <span class="n">ExpressionType</span><span class="p">.</span><span class="n">Constant</span><span class="p">:</span>
      <span class="k">case</span> <span class="n">ExpressionType</span><span class="p">.</span><span class="n">Parameter</span><span class="p">:</span>
        <span class="k">return</span> <span class="kt">string</span><span class="p">.</span><span class="n">Empty</span><span class="p">;</span>

      <span class="k">case</span> <span class="n">ExpressionType</span><span class="p">.</span><span class="n">Convert</span><span class="p">:</span>
        <span class="n">var</span> <span class="n">unaryExpression</span> <span class="p">=</span> <span class="p">(</span><span class="n">UnaryExpression</span><span class="p">)</span><span class="n">expression</span><span class="p">;</span>
        <span class="k">return</span> <span class="nf">GetMemberName</span><span class="p">(</span><span class="n">unaryExpression</span><span class="p">.</span><span class="n">Operand</span><span class="p">);</span>

      <span class="k">default</span><span class="p">:</span>
        <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">&quot;The expression is not a member access or method call expression&quot;</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>The usage actually reveals the elegance of this little expression tango dance:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="n">DateTime</span><span class="p">[]</span> <span class="nf">GetReferenceDates</span><span class="p">(</span>
  <span class="kt">string</span> <span class="n">section</span><span class="p">,</span> 
  <span class="n">DateTime</span><span class="p">?</span> <span class="n">inception</span><span class="p">,</span> 
  <span class="n">DateTime</span><span class="p">?</span> <span class="n">expiry</span><span class="p">,</span> 
  <span class="kt">bool</span> <span class="n">requireQuarterlyAlignment</span><span class="p">)</span> <span class="p">{</span>

  <span class="n">Guard</span><span class="p">.</span><span class="n">ArgumentsNotNull</span><span class="p">(</span>
    <span class="p">()</span> <span class="p">=&gt;</span> <span class="n">section</span><span class="p">,</span>
    <span class="p">()</span> <span class="p">=&gt;</span> <span class="n">inception</span><span class="p">,</span>
    <span class="p">()</span> <span class="p">=&gt;</span> <span class="n">expiry</span>
    <span class="p">);</span>

    <span class="cm">/* ... */</span>
<span class="p">}</span>
</pre></div>

<p>This isn't that bad, is it? I find this type of guarding quite readable and fluent. Plus, it just finds the parameter name in question all by itself for proper a <code>ArgumentNullException</code> message.</p>

<p><em>Note</em>: I am <em>well aware</em> of the fact that such an approach can cause (serious) performance issues. Especially when you're using the guarded method in loops or recursion. I'm not telling you that this is <em>the way</em> to do guarding, I'm just telling you that I find it to be an elegant approach.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Transition</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-transition.html"/>
            <updated>2012-10-08T18:00:00Z</updated>
            <published>2012-10-08T18:00:00Z</published>
            <id>/der-agilist-agile-transition.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist wieder einmal an der Zeit, eine weitere Perspektive der Agilität in meiner Artikel-Serie der <a href="der-agilist.html">Agilisten</a> zu durchleuchten. Diesmal geht es um ein relativ komplexes, gerade zu schwer greifbares Thema, nämlich um die <em>Agile Transition</em>. Alleine der Begriff fordert geradezu eine nähere Beschreibung. Bei der sog. "Agile Transition" handelt es sich um die Aufgaben, Methoden und Strategien zur Änderung einer Organisation hin zu einer agilen Arbeits- und Lebensweise.</p>

<h3 id="im-interview-kai-beck">Im Interview: Kai Beck</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_kb.jpg" /></p>

<p>Mein Glück ist, dass ich als Interviewpartner einen erfahrenen Agilisten gewinnen konnte, der Unternehmen von verschiedensten Ausgangssituationen aus hin zur Agilität bewegt hat: es ist der von mir hoch geschätzte <a href="http://www.gettingagile.de">Kai Beck</a>. Seine langjährige Erfahrung an Erfolgen und auch Mißerfolgen zeichnen ihn als absoluten Kenner und Experten in diesem Gebiet aus. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Kai. Was machst Du beruflich?</p>
</blockquote>

<p>Ich berate und begleite IT-Unternehmen, zumeist vor dem Hintergrund der Prozess-, Projekt- oder Methodengestaltung. Ich bin ein großer Freund der agilen Arbeitsweise, verschließe mich aber nicht vor anderen Arbeitswegen. Für mich ist der Weg auch ein Teil des Zielbildes.</p>

<blockquote>
<p>Welches sind Deine Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p>Ich glaube ich habe nicht gänzlich unterschiedliche Ziele wie andere auch: Ich will Projekte erfolgreich umsetzen. Wenn ich es darüber hinaus auch schaffe, die Umsetzung an sich positiv für alle Beteiligten mitzugestalten, dann ist meiner Meinung nach viel erreicht. Ich gllaube das man dafür eine gute Portion stetiger Lern- und Veränderungsbereitschaft aufbringen muss. Das möchte ich bei meinen Projekten auch vermitteln.</p>

<blockquote>
<p>Agile Transition wird im Allgemeinen als organisatorischer Änderungsprozess hin zur Agilität verstanden. Die allgemeine Organisationsveränderung ist in Unternehmen ein gängiges Thema. Was macht eine 'Agile Transition' im Vergleich zu anderen Organisationsveränderungen so besonders?</p>
</blockquote>

<p>An sich eine spannende Frage. "Transition" ist ja eher ein technisch belastetes Wort. Es beschreibt den - meist technischen - Übergang von System A nach System B. Bei der organisatorischen, agilen Transition geht es um die psychosoziale Veränderung des "Systems". Das System kann dabei ein Individuum, ein Team, eine Abteilung oder ein ganzes Unternehmen sein. </p>

<p>Wie bei jeder anderen organisatorischen Änderung wird auch die agile Transition von äußeren Zwängen (z.B. Markt, Kosten, Innovation) getrieben. Das besondere bei der agilen Transition ist allerdings deren Änderungsmechanik. Idealerweise "strahlt" die agile Veränderung förmlich vom inneren des Systems nach außen.</p>

<blockquote>
<p>Welches ist die erste Frage, die man sich in der Organisationsveränderung hin zu agilen Arbeitsweisen stellt?</p>
</blockquote>

<p>Die Frage nach dem <em>warum</em> muss gestellt und geklärt sein. Das ist die fundamentale Basis jeder weiteren Wirkung. Darauf aufbauend stellt man sich die Fragen des <em>wo</em> Agilität überhaupt sinnvoll sein kann. Agilität ist nicht immer das Mittel der Wahl. Ich empfinde das als etwas sehr natürliches, denn schließlich ist das Agile Manifest und die Agile Bewegung aus der Software-Entwicklung im Team entstanden. </p>

<p>Die Kraft der Agilität ist jedoch auch, dass es Kreativität ermöglicht und sich nicht scheut, Neuland zu betreten. So sind agile Verfahren auch für Organisationsteile abseits der IT durchaus realisierbar.</p>

<blockquote>
<p>Reicht es nicht, das ein Team oder eine Organisation einfach mit einer agilen Software-Entwicklungs-Methode loslegt?</p>
</blockquote>

<p>Nun, ganz so einfach ist es nicht. Jede Organisation muss sich und ihre Arbeitsweisen bzw. -abläufe auch <em>verstehen</em>, um genau diese auch <em>gerichtet</em> und <em>maßvoll</em> einsetzen zu können. Dieses Prnzip des Verstehens ist für Teams und Organisationen nicht einfach zu erschließen, obwohl es sich absolut natürlich anhört. Man kann nicht einfach eine Organisation anhalten und sie erst einmal "ausbilden", um ihr das Verständnis zu ermöglichen. Gerade hier spielt die agile Perspektive der empirischen Erkenntnisgewinnung und adaptiven Handlungsräume eine große Rolle.</p>

<blockquote>
<p>Viele Teams kümmern sich nur beiäufig um die Einbettung der agilen Verfahren in die bestehende Organisaton. Was glaubst Du, warum gerade dieser Aspekt nur wenig Beachtung findet?</p>
</blockquote>

<p>Bei aller Romantik, die manch ein Agilist auch hat: Nüchtern betrachtet stösst der "innere Antrieb" von Software-Entwicklern hin zur Agilität meist schnell an seine Grenzen. Das gilt im Übrigen auch für Teams innerhalb von Organisationen. Eine "Revolution von Unten" ist nicht nur eine Prozessänderung. Vielmehr werden auch fundamentale Dinge wie das eigene Kultur- nd Werteverständnis wieder in Frage gestellt.</p>

<p>Diese meist komplexen Umstände und Beziehungen innerhalb der Organisation werden oft gar nicht oder zu gering wahrgenommen. Organisationsänderung ist kein starrer Maßnahmenkatalog mit fester Zielvorgabe. Organisationänderung ist vielmehr eine Änderung der Gewohnheiten - sowohl als Gruppe als auch als Individuum.</p>

<blockquote>
<p>Wann ist eine Agile Transition beendet?</p>
</blockquote>

<p><em>"Wer angefangen hat etwas zu sein, hat aufgehört etwas zu werden"</em>. Insofern ist ein "Ende von agiler Transition" de facto nicht möglich und auch nicht wünschenswert.</p>

<p>Als Coach habe ich natürlich Ziele und Ziellinien. So kann ich für mich festlegen, dass meine Arbeit mit Erreichung solcher Ziellinien beendet ist - aber die Veränderung an sich natürlich weiter geht. Die Eiführung von Prozessen und Veränderungen ist ja nur der sprichwörtliche Anfang. Für nachhaltige, stetige und gezielte Veränderungsbereitschaft ist meiner Meinung nach auch die "Attraktivität" des Vorgangs an sich ein Faktor. Das kann ich im Rahmen meines Wirkens beeinflussen und mitgeben.</p>

<blockquote>
<p>Welche Veränderung oder Änderungsphase ist Deiner Meinung nach die wichtigste in der agilen Organisationsentwicklung?</p>
</blockquote>

<p>Ich hatte es eigentlich schon erwähnt - der Anfang ist entscheidend. Gerade diese erste Klärung des <em>wieso</em> und <em>warum</em> ist eine schwierige Hürde, die man allerdings deutlich und klar nemhen muss, bevor es weitergehen kann. In der Anfangsphase ist auch das Wirken der Pilotgruppe ein wichtiges Fundament. Alle Aktivität strahlt nach außen und wird auch mit Interesse oder Neugier aufgenommen. Wer es hier schafft, diese Neugier in Faszination umzumünzen, der hat in späteren Phasen deutlich mehr Handlungsräume.</p>

<blockquote>
<p>Oft wird bei der Agilen Transition die 'Kultur' in den Mittelpunkt gestellt. Wie kann man Kulturveränderung messen?</p>
</blockquote>

<p>Gar nicht. Offen gesagt ist das auch gut so. Software-Entwicklung zum Beispiel dient faktisch zur Erfüllung wirtschaftlicher Zwecke. In diesem, ökonomischen Sinn ist Kultur etwas nachrangiges. Insofern ist es auch kaum verwunderlich, dass es keine Metriken dazu gibt. <em>"Only what gets measured can get measured"</em> - so einfach ist das.</p>

<p>Kultur ist nicht etwas festgeschriebenes, sondern lebendig und manchmal auch außerhalb der Norm. So eine lebendige Veränderung wie die einer Kultur kann nicht bemessen werden. Dennoch: Vertrauen und Akzeptanz sind Werte, die man leben und umsetzen kann. Alleine wenn die Umsetzung des Vertrauens in einander schon erfolgt, dann ist eine Kulturveränderung schon greifbar nah.</p>

<blockquote>
<p>Wenn man in den Veränderungsprozessen stagniert - oder feststellt, dass die Organisation die agilen Verfahren nicht annimmt - was sollte man dann Deiner Meinung nach tun?</p>
</blockquote>

<p>Stagnationsphasen sind nicht per se ein Warnsignal. Eine Stagnation kann auch ganz natürlich eintreten und andere Beweggründe haben. Ich denke dass es in solchen Phasen wichtig ist, ein gewisses Maß an Ruhe und Geduld an den Tag zu legen. Gleichzeitig ist es wichtig, sich weiterhin mit der Veränderung auseinanderzusetzen. So kann man z.B. die kleinen oder auch nebensächlichen Dinge anpacken.</p>

<blockquote>
<p>Gibt es überhaupt so etwas wie eine 'agile Organisation'? Wenn ja, was ist Deiner Meinung nach eine agile Organisation?</p>
</blockquote>

<p>Nein, es gibt natürlich keine "agile Organisation". Die "agile Organisation" ist ein Zielbild, ein optimales Modell. Und wir wissen: Ein optimales Modell existiert nicht. Eine agile Organisation ist für mich per Definition nicht existent. Organisationen können sich daran orientieren, ja sich auch danach ausrichten. Das liegt im Wesen der Agilität. Schlussfolgernd kann man Agilität per se nicht quantifizieren. Friede, Freude, Eierkuchen.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p>Der Respekt und Wertschätzung vor den existierenden Systemen, Ansichten und Methoden kommt aus meiner Sicht oftmals zu kurz. Die agilen Verfahren sind bei Leibe kein Wunder- oder Allheilmittel. Auch alternative Methoden haben ihre Berechtigung und zuweilen auch ihre Vorteile.</p>

<blockquote>
<p>Wenn Du Dir für die agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Ha! Das ist leicht: Ich wünsche mir die Agilität auf einer Augenhöhe mit anderen Verfahren in der allgemeinen Wahrnehmung. Wenn es sich in Organisationen etabliert, sollte nicht nur die "Agile Ausführung" verstanden sein, sondern im Besonderen auch das "Agile Mindset".</p>

<p><strong>Vielen Dank, Kai!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Agile Design At Scrum Gathering</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/agile-design-scrum-gathering-2012.html"/>
            <updated>2012-10-04T12:00:00Z</updated>
            <published>2012-10-04T12:00:00Z</published>
            <id>/agile-design-scrum-gathering-2012.html</id>
            
            <content type="html"><![CDATA[
                <p>It’s only a day now since the <a href="http://www.scrumalliance.org/events/464-barcelona--global-event">Global Scrum Gathering 2012</a> conference in Barcelona. Yet, I’m still very much impressed. Throughout the whole conference there was activity and productivity.</p>

<p>Plus, this year I had the honor to hold a session about Agile Software Design at the first day of the conference. To be honest, I really was excited about it since this talk was my first I held completely in English. To even add more of a burden to myself, I decided to have two interactive exercises with the audience as well.
I’m really glad and happy that everything went well. The interactive parts were exercised lively and with a good sense of fun. I also got the impression that I achieved to transport my statements and the concepts I presented for the very large part of it.</p>

<p>I’ll hold the same talk twice more in near future and hope I can improve a little more on a few minor things until then. Once I’m through with all presentations I’ll put the slides online.</p>

<p>When it comes to all the other talks and the open space sessions, it’s really a very hard task to highlight some out. Nearly all talks I attended were on a very professional and profound level. The speakers were engaged and so was the audience. I especially liked the coaching clinic and the open space.</p>

<p>I personally think that an open space is a must for a good conference schedule. It not only leaves room for spontaneous or audience-driven content but more often is a handy format to continue and extend conversations about topics being presented earlier on the conference.</p>

<p>For that matter, I pretty much liked the idea from the improuv guys who were organizing this year’s <a href="http://www.agileworld.de/">Agile World 2012</a> in Munich. For all slots, which by the way were themed nicely, they left over an hour of time space at the end of the day for an interactive fishbowl discussion about the topics presented. This idea turned out to be very productive and in fact was often the most valuable hour of the day.</p>

<p>Having this in mind, I found the open spaces at this year’s Scrum Gathering very valuable. There was literally a rainbow of topics to explore and discuss. Scrum Research, Hiring Criteria For Scrum Masters, Agile Fundamentalists, Scrum In Other Industries, Story Organization, Selling Scrum – and that’s just a tiny taste of it.</p>

<p>Although I couldn’t attend all sessions I wanted to – which is a regular constraint I’m hitting at such conferences – I’m all in all quite satisfied with the insights I’m taking with me after these intense days of collaborative thought, self-organized movement and global innovation. </p>

<p>Conclusion: Scrum Gathering 2012 in Barcelona was great!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Die Unvollständigkeit der Unvollständigkeit</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/die-unvollstaendigkeit-der-unvollstaendigkeit.html"/>
            <updated>2012-09-24T09:00:00Z</updated>
            <published>2012-09-24T09:00:00Z</published>
            <id>/die-unvollstaendigkeit-der-unvollstaendigkeit.html</id>
            
            <content type="html"><![CDATA[
                <p>Vor ca. einem halben Jahr las ich einen kurzweiligen Kommentar eines guten Freundes. Damals bewunderte er diejenigen Entwickler, die nur <em>fehlerfreie Software als gültige Software</em> akzeptieren. Er selbst sähe die absolute Fehlerfreiheit von Software als eine Notwendigkeit. Ich entgegnete ihm, dass es aus meiner Sicht sicher erstrebenswert wäre, fehlerfreie Software zu entwickeln, jedoch dass es gleichsam noch mehr angezeigt sei, <em>Software fehlertolerant zu gestalten</em>. </p>

<p>Daraus hat sich eine handfeste Diskussion über zwei faszinierende und weite Wissenschaftsfelder ergeben: Philosophie und Mathematik. Ich werde mich hüten, jetzt viele Worte über die Verbindung zwischen Philosophie und Mathematik zu verlieren. Denn wäre es so, sähe ich mich bei weitem nicht in der Lage, meinem scheinbaren Selbstanspruch der inhaltlichen Reife in dem Maße mit fachlicher Substanz entgegenzutreten, als das sich das Ergebnis mittels der Wahrnehmung Dritter sich eben diesem Schein anzunähern vermag.</p>

<p>Statt dessen will ich nur eine kleine Geschichte erzählen. Meine Erzählung dieser Geschichte ist gleichzeitig auch eine <em>mögliche Antwort</em> auf eine Aufgabe, die ich im Anschluß an die Eingangs angedeutete Diskussion meinem Freund gestellt hatte. Bis heute habe ich eine Antwort auf diese Aufgabe vermisst. Also ist es meiner Meinung nach nur legitim, wenn ich nun selbst eine exemplarische Antwort an den Tag bringe. </p>

<p>Es sei noch erwähnt, dass auch mein von mir hoch geschätzer Freund mir damals eine Aufgabe gestellt hatte, die ich für mein Empfinden auch beantwortet hatte. Allerdings im starken Zweifel über die Richtigkeit des Ergebnisses - welchen ich bis Heute noch hege.</p>

<p>Es ist hier nicht besonders wichtig, welche Aufgabe mein Freund mir damals gestellt hatte. Gegenstand dieses kurzen Artikels ist nämlich die Aufgabe, die ich ihm damals stellte. Es ist meines Erachtens nach eine interessante Aufgabe, die es auch zu leisten vermag, einige Aspekte des Zusammenhangs von Philosophie und Mathematik hervorzubringen. </p>

<p>Als mein Gesprächspartner sich ganz im <a href="http://de.wikipedia.org/wiki/David_Hilbert">Hilbertschen Stil</a> auf die Vollständigkeit mathematischer Modelle und Beweisführungen berief, um damit zum Ausdruck zu bringen, dass der Indeterminismus, den die realistisch-rationale Perspektive mit sich bringt, für Mathematiker in keinster Weise beachtens- oder nennenswert sein darf, keimte in mir schon der Gedanke zu eben jener Aufgabe, die ich ihm später stellte. Ich forderte ihn auf:</p>

<blockquote>
<p>Gebe mir einen mathematisch belegten Grund, dass es sich lohnt, an Gott zu glauben.</p>
</blockquote>

<p>Die Aufgabe hört sich im ersten Schritt etwas parteiisch zu Gunsten des philosophisch interessierten Zeitgenossen an. Doch auf den zweiten Blick ist meines Erachtens klar erkennbar, dass ich mit dieser Aufgabenstellung zu den Freunden der Mathematik sehr wohlwollend herangetreten bin. </p>

<p>Dem Conoisseur unter meiner Leserschaft wird schon aufgefallen sein, dass diese Aufgabe natürlich nicht mein eigenes geistiges Werk ist, sondern eine schon seit Jahrhunderten bekannte Aufgabenstellung, die nicht selten nach Meinung von Mathematikern als auch Philosophen als dialektischer Kunstgriff bewertet wird.</p>

<p class="figure">
<img alt="Blaise Pascal" src="/media/images/pascal-blaise.jpg" /><br />
Fig 1: Blaise Pascal (1623-1662)</p>

<p>Doch nun zur Aufgabe an sich. Es geht also offensichtlich darum, einen mathematischen Weg zu beschreiten, der substanziell dazu beiträgt, dass der Aufgabensteller (oder ein Dritter) zu der Überzeugung gelangt, dass es lohnenswert sei, einen Glauben zu Gott zu haben. Der Urheber der Aufgabe ist zugleich derjenige, der eine besondere Antwort darauf gab. Der bemerkenswerte Logiker und Mathematiker <a href="http://de.wikipedia.org/wiki/Blaise_Pascal">Blaise Pascal</a> mit seiner <a href="http://de.wikipedia.org/wiki/Pascalsche_Wette">Pascalschen Wette</a> lieferte einen Ansatz, der landläufig auch als <em>"Pascalscher Glaubensbeweis"</em> bekannt wurde.</p>

<p>Pascal wendet dabei relativ einfache logische Mittel an. Er stellt sowohl die Existenz von Gott als auch den Glauben an Gott zur Disposition und korreliert dies mit den dadurch (hypothetisch aufgestellten) Erwartungen der Konsequenzen der möglichen (a)theistischen Haltungen. Das Ergebnis ist eine einfache Entscheidungsmatrix, die sich  einfach zusammenfassen lässt. Angenommen,</p>

<ul>
<li>Gott existiert und man glaubt an Gott,<br />
  dann eröffnet der Glaube die Pforte zum Paradies im Himmel,</li>
<li>Gott existiert nicht und man glaubt an Gott,<br />
  dann wäre der Glaube umsonst und nichts wäre errungen,</li>
<li>Gott existiert nicht und man glaubt nicht an Gott,<br />
  dann wäre der Unglaube umsonst und nichts wäre errungen,</li>
<li>Gott existiert und man glaubt nicht an Gott,<br />
  dann entfacht der Unglaube das Feuer in der Hölle.</li>
</ul>

<p>Es ist sehr deutlich erkennbar, dass sich Pascal der Statistik bedient, um argumentativ seine Überzeugungskraft zu stärken. Sein angeblicher <em>"Glaubensbeweis"</em> ist natürlich rein logisch betrachtet ein Zirkelschluss - und missachtet überdies auch das Problem der Unvollständigkeit der Optionen. Dennoch: Pascals Wette ist ein schillernd plakatives Exemplar der engen Beziehung zwischen Philosophie und Mathematik.</p>

<p>Gerade die - <em>weder belegbare noch widerlegbare</em> - Unvollständigkeit des Modelles, auf dem Pascal kombinatorisch korrekt die Schlußfolgerung des Vorteils an den Glauben an Gott herbeizuführen versucht, ist ein Beispiel des scheinbaren Widerspruchs von Realität und Idealität, welches sich unbeugsam mit jeder mathematischen Handlung aus dem schweigsamen Schatten jeder noch so kleinen mathematischen Operation hervorhebt.</p>

<p>Das Wesen der <a href="http://de.wikipedia.org/wiki/Erkenntnistheorie">Erkenntnisgewinnung</a> in der Mathematik - als auch die Mathematik selbst - ist damit ein Argument für den dialektischen sowie rationalen Geist, die Annahme über die Existenz Gottes im Zuge der währenden Unergründlichkeit der Dinge zumindest aufrecht zu erhalten, welches im Allgemeinen als Glaube an einen Gott in die individuelle Wahrnehmung der Wirklichkeit einen idealistischen Platz einnimmt. </p>

<p>Diese Souveränität des unendlich Ungewissen ist zugleich der Antrieb des Mathematikers und Wissenschaftlers. Im Sinne von <a href="http://de.wikipedia.org/wiki/Murphys_Gesetz">Murphys Gesetz</a> löst er ein Problem und entdeckt dabei unweigerlich weitere Probleme. Mit einem leichten Hang zum <a href="http://de.wikipedia.org/wiki/Best%C3%A4tigungsfehler">Bestätigungsfehler</a> unterdrückt er mit dem schweren Stein des mathematisch vollständigen Beweises sein eigenes Wissen darüber, dass mithin der Weg zur Lösung des Problems ein weiteres Problem darzustellen vermag.</p>

<p>Doch bevor ich nun doch etwas näher an die Fachbereiche der Philosophie und Mathematik herantrete, bleibt an dieser Stelle festzuhalten: Die Fehlerfreiheit ist eine - sehr nützliche - Illusion. Gerade in der Projektion von Modellen auf die Realität tritt der kleine Spalt der Deduktion in Erscheinung und bricht das sonst so klare Licht der Logik eines Modelles in ein weites, manchmal sogar ungreifbares Spektrum von (Un-)Möglichkeiten.</p>

<p>Gerade diese Erkenntnis hilft meiner Meinung nach im Besonderen dem Software-Entwickler, der engagiert und professionell seine Arbeit umsetzt. Denn er wird stets versuchen, das Ideal der fehlerfreien Software zu verfolgen. Sei es formell oder informell. Jedoch sollte es für Ihn mindestens in gleichem Maße ein Wunsch sein, Software auch fehlertolerant zu gestalten. Mehr noch, für mich stellt sich in der Anwendung die Fehlertoleranz als deutlich mehrwertigeres Ziel dar. </p>

<p>Durch die so groß wirkende Zahl von Modellen, die in einer Software ihre Anwendung finden, ergeben sich scheinbar intuitiv eine <em>Unmenge von potentiellen Ablaufmustern</em>, die in Ihrer Ganzheit als ein mosaikartiges Bild der vollkommenen Logik vorstellbar sein kann. Doch statt der Anmut und Ausdruckskraft eines solchen eindeutigen und klaren Abbilds entgegnet dem Betrachter ein schemenhaftes, brüchiges Gebilde, in dem sich eine Aussage oder Intention nur vage erkennen lässt - wenn überhaupt.</p>

<p>Im Ergebnis lebt alle Theorie von dessen Praxis, so wie alle Theorie sich aus der Praxis erhebt. Meine Auffassung ist es, die Wirkung von Modellen zu stärken, in dem man nicht nur auf die Vollständigkeit, sondern auch auf die Unvollständikeit der Modelle eingeht.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Die Zukunft des Architekten in der Software-Entwicklung</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/die-zukunft-des-architekten-in-der-software-entwicklung.html"/>
            <updated>2012-08-02T18:00:00Z</updated>
            <published>2012-08-02T18:00:00Z</published>
            <id>/die-zukunft-des-architekten-in-der-software-entwicklung.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist wieder einmal an der Zeit, das ich mich mit dem Thema der <em>Spezialisierung und Positionierung</em> auseinandersetze. In diesem Artikel möchte ich zunächst einmal meine grundlegende Sicht auf die Rolle des <em>Software-Architekten</em> niederschreiben. Dabei geht es mir sowohl um die Rolle des Architekten an sich, als auch um die Umsetzung der Rollen in der modernen Software-Entwicklung; so wie ich sie auch aus meinen Erfahrungen heraus kenne.</p>

<p>Doch nun Schluß mit dem Geplänkel und direkt zur Sache: die Zukunft des Software-Architekten in der Software-Entwicklung. Die Zukunft des Software-Architekten ist aus meiner Sicht genau so düster wie die <a href="die-zukunft-des-projektmanagers-in-der-software-entwicklung.html">Zukunft des Projektmanagers</a> vor 4 Jahren war. Der Software-Architekt hat meiner Meinung nach sowohl als Rolle als auch als Position längst ausgedient. </p>

<p>Für mich gibt es keine Zukunft für einen <em>Software-Architekten</em>.</p>

<h3 id="erfahrungswerte">Erfahrungswerte</h3>

<p>Man mag mich ruhig wieder in die Schublade des Provokateurs schieben, aber ich habe meines Erachtens gute Gründe für meine Behauptung, dass der Software-Architekt als Rolle wie auch als Position <a href="http://de.wikipedia.org/wiki/Ad_acta">ad acta</a> gelegt werden muss.</p>

<p>Ich durfte in meiner Laufbahn nun drei Mal offiziell als Software-Architekt in Entwicklungs-Projekten mitwirken. In allen drei Projekten habe ich als "Architekt" völlig verschiedene Aufgaben wahrgenommen. In allen drei Projekten habe ich mich als "Architekt" auch mit anderen Erwartungen und Wahrnehmungen auseinandergesetzt. Folglich gibt es nur sehr wenige Gemeinsamkeiten der "Architekten-Rollen", die ich glücklicherweise umsetzen durfte.</p>

<p>In zwei Projekten hatte ich nicht nur die Rolle des Architekten inne, sondern sogar die Position. Soll heißen: ich war als Person fest für das Themengebiet der Software-Architektur eingeteilt und dafür zuständig. Ich habe mich demnach stark - ja fast ausschließlich - mit Themen wie Komponenten-Orientierung, Systemgrenzen, System-Abhängigkeiten, nicht-funktionalen Anforderungen und strategischer Entwicklung auseinandergesetzt.</p>

<p>Während in einem Projekt "nur" innerhalb eines Teams die Architektur-Aufgaben in meine Hände gelegt wurden, durfte ich in den anderen zwei Projekten die Architektur der gesamten Anwendung über mehrere Teams hinweg als mein Aufgabenfeld betrachten. Insgesamt habe ich einen bescheidenen Erfahrungsschatz von ca. 4 Jahren als "Architekt" in Projekten sammeln dürfen.</p>

<p>Mit all diesen - zugegebenermaßen relativ kurzen - Erfahrungen maße ich es mir trotzdem an, die Zukunft des Software-Architekten in Frage zu stellen.</p>

<h3 id="architektur-fur-alle">Architektur für Alle</h3>

<p>Ich bin der Meinung, dass ich bei all meinen Einsätzen als Architekt sehr wichtige Themen bearbeitet habe. Sowohl aus der Perspektive des Teams als auch aus der Perspektive des Unternehmens. Gerade vor diesem Hintergrund empfinde ich es als absolut notwendig, die Aufgaben der Architektur nicht auf Positionen oder Personen zu restriktieren, sondern sie als allgemeines Aufgabenfeld in der Software-Entwicklung zu betrachten.</p>

<p>Es ist geradezu paradox, dass man innerhalb der modernen Software-Entwicklung sich stark mit der Breite des Know-Hows auseinandersetzt, aber im Gegenzug die Architektur-Aspekte als "Elite-Aufgabe" auf einzelne Personen fokussiert. Oft reden neunmal-kluge Entwicklungsleiter von "Mitigation des <a href="http://de.wikipedia.org/wiki/Truck_Number">Bus Factors</a>", Pair Programming zum Know-How-Transfer und der Stärkung der Selbstorganisation des Teams durch <a href="http://www.extremeprogramming.org/rules/collective.html">Collective Code Ownership</a>. Wenn es jedoch um den gefühlten "heiligen Gral" der Software-Architektur geht, will man plötzlich lieber "feste Ansprechpartner" und "dedizierte Fachkräfte" haben, um so dieser "verantwortungsvollen Aufgabe" gerecht zu werden.</p>

<p>Das ist in meinen Augen nicht nur paradox, sondern auch unüberlegter, geradezu eklatant herausragender <a href="http://de.wikipedia.org/wiki/Humbug">Humbug</a>. Über die näheren Gründe für solche Aussagen möchte ich hier nicht näher eingehen, sondern lediglich die diametrale Natur der eben geschilderten Situation deutlich hervorheben.</p>

<p>Schlußendlich sollte es in einem agilen Team meiner Auffassung nach das Ziel sein, auch die Aufgaben der Architektur gemeinschaftlich im Team umzusetzen. Das schafft eine breitere Kompetenz-Basis für die zweifelsohne wichtigen Architektur-Aspekte bei der Software-Entwicklung. Darüber hinaus ergibt sich ein gemeinschaftliches Verantwortungsbewußtsein gegenüber den Treibern und Entscheidungen zu Architektur-Aufgaben. </p>

<p>Eine moderne und agile Software-Entwicklung verlangt nicht nur eine <em>Collective Code Ownership</em>, sondern eben auch eine <em>Collective Concepts Ownership</em>.</p>

<h3 id="problem-losungs-kompetenz">Problem-Lösungs-Kompetenz</h3>

<p>Nun, obgleich sich das eben genannte für Agilisten durchaus plausibel anhören mag, gibt es gerade bei Organisationen die sich der Agilität verschrieben haben immer wieder Probleme im Umfeld der Architektur. </p>

<p>Mal gibt es die Architekten innerhalb des Teams, mal gibt es sie teamübergreifend. Es kommt äußerst selten vor, dass es gar keinen Architekten gibt. Doch in allen Konstellationen kommt es zu "Schwierigkeiten", wenn es um die Architektur geht. Warum? - Die Antwort liegt in einem Wortgebilde aus drei Wörtern: <em>Problem-Lösungs-Kompetenz</em>.</p>

<p>In meinen bescheidenen Einsätzen als Architekt stand bei allen meinen Aufgaben eines im Mittelpunkt: der kompetente und professionelle <em>Übergang</em> eines geschäftlichen oder technischen <em>Problems</em> hin zu einer kompetenten und professionellen <em>Lösung</em>. Das bezieht sich sowohl auf die Mikro-Ebene (z.B. bedarfsgerechtes Klassen-Design) als auch auf die Makro-Ebene (z.B. Verfügbarkeit des Gesamtsystems).</p>

<p>Genau hier liegt auch meiner Meinung nach ein Stückweit eine Ursache für die oftmals so schmerzhafte und suboptimale Architektur-Umsetzung. Als erläuterndes Beispiel möchte ich die mittlere Makro-Ebene (z.B. Produkteigenschaften bzw. Feature-Umsetzung) mit Hilfe des agilen Management-Modells <a href="http://de.wikipedia.org/wiki/Scrum">Scrum</a> heranziehen. Scrum birgt in sich eine wunderbare Teilung: während der <em>Produkt Owner</em> sich um die geschäftliche Seite zu kümmern hat, obliegt es dem <em>Team</em> die technische Umsetzung zu verantworten.</p>

<p>Exakt die Trennung des <em>"Was?"</em> vom <em>"Wie?"</em> ist es, die in Scrum viele weitere Vorteile und Konsequenzen nach sich zieht. Betrachtet man allerdings diese Trennung  aus Sicht der Architektur bzw. des <em>Problem-Lösungs-Kompetenz-Gefüges</em>, dann wird das System doch deutlich diffiziler. Während sich der PO mit der Frage des <em>"Was?"</em> in weiten Teilen mit dem Problemraum auseinandersetzt, ist das Team mit der Beantwortung des <em>"Wie?"</em> mehrheitlich agierend im Lösungsraum. Ein klassischer Software-Architekt operiert allerdings oft in beiden Feldern - also sowohl im Problemraum als auch im Lösungsraum.</p>

<p>Gerade deshalb versuchen viele Scrum-Teams und agile Organisationen die Software-Architekten als "Experten" ausserhalb der Scrum-Teams zu positionieren. Meistens kümmert sich dann der Architekt um ein Themenfeld und betreut im Rahmen dessen ein oder mehrere Teams. Das Team als auch der PO können den Architekten dann als technologisch orientierten Experten einbinden und von ihm sowohl beratende als auch beisteuernde Leistung anfordern.</p>

<p>Auf den ersten Blick sieht das nach einer gangbaren Lösung aus. Doch dabei bleibt es in aller Regel auch. Das Ergebnis der gerade geschilderten Vorgehensweise ist oftmals Konfusion, konzeptionelle Lückenhaftigkeit und ganz besonders operative Umsetzungsschwäche von strategischen Grundlagen. Das liegt meist weder am Architekten, noch an den anderen Beteiligten, sondern einfach an der Aufstellung.</p>

<p>Außerhalb des Teams hat der Architekt keine "Haftung zur konkreten Umsetzung", bekommt also kaum Feedback über die konzeptionelle Validität der Architektur. Darüber hinaus entzieht er sich der architektonischen Gestaltung aus der Code-Basis, die gerade bei agilen Verfahren wie TDD, BDD oder Pair Programming einen erheblichen Mehrwert liefern. Dieser Feedback-Verlust gepaart mit der <em>punktuellen</em> Auseinandersetzung des Übergangs von Problemraum in den Lösungsraum führt zu Inkonsistenzen im Konzept als auch zu mangelnder Stringenz in der Umsetzung.</p>

<h3 id="architektur-ist-ein-allgemeines-anliegen">Architektur ist ein allgemeines Anliegen</h3>

<p>Die Lösung dieses Dilemmas ist schlichtweg die Auflösung des Software-Architekten als Rolle oder Position. Anstatt Architektur als eine "Disziplin" oder "Phase" innerhalb der Software-Entwicklung zu betrachten, gilt es Architektur als ein <em>allgemeines Anliegen</em> zu akzeptieren <em>(engl: "common concern")</em>. Schlußendlich ist es sowohl der Product Owner als auch das Team, welche sich um die Belange einer tragfähigen Architektur zur Software kümmern sollten.</p>

<p>Scrum bietet in dieser Hinsicht auch klare Hilfestellungen. So wird das Sprint-Planning z.B. in zwei Teile geteilt, um sowohl dem <em>"Was?"</em> als auch dem <em>"Wie?"</em> zu gleichen Teilen in der Planung gerecht zu werden. Erfahrene Scrum-Praktizierer werden wissen, das gerade das Sprint-Planning, die Estimation und das Backlog Grooming "Hotspots" für Architektur-Aspekte sind.</p>

<p>Es liegt auch in der Natur vieler agiler Verfahren, dass die Architektur nicht nur emergent gestaltet wird, sondern auch "quasi parallel" zu den anderen Aufgaben ins Gesamtbild eingefügt wird. Neben dem allzu prominenten TDD seien hier noch die <a href="http://de.wikipedia.org/wiki/User_Story">User Stories</a>, das <a href="http://en.wikipedia.org/wiki/Planning_poker">Planning Poker</a> und das <a href="http://de.wikipedia.org/wiki/Class-Responsibility-Collaboration-Karten">CRC-Game</a> erwähnt. Gerade erfahrene Agilisten wissen die Macht von gut durchgearbeiteten User Stories oder einem harten CRC-Game sehr zu schätzen.</p>

<h3 id="strategisches-und-operatives">Strategisches und Operatives</h3>

<p>Einen Punkt darf man bei all den von uns sehr geschätzten kurzen Feedback-Zyklen natürlich nicht unerwähnt lassen. Viele Bereiche der klassischen Software-Architektur lassen sich in zwei Haupt-Kategorien einteilen: Die <em>Strategie</em> und die <em>Operation</em>. </p>

<p>Es gibt - wie auch bei allen anderen Tätigkeiten - in der Software-Entwicklung eine strategische und eine operative Ebene. Nun hat es sich mit den Jahrzehnten so manifestiert, dass die Software-Architekten auf Grund ihrer "Seniorität" und des "ganzheitlichen Blickwinkels" sich auch stark der strategischen Ebene von Software-Entwicklung zuwenden mussten, während sich der gemeine Entwickler sich mehrheitlich in einem operativen Gestaltungsrahmen wiederfand.</p>

<p>Wie in anderen Berufsfeldern auch, sind strategische Entscheidungen meist knifflig und besonders herausfordernd. Es liegt in der Natur der Strategie, vorausschauend, abwägend und wohldurchdacht ausgearbeitet zu werden. Es verlangt vom strategischen Gestalter meist viel Erfahrung, einen exzellenten Scharfsinn für das gegenwärtige, besonders viele Daten für das vergangene, und eine ausgewogene Antizipation für das bevorstehende.</p>

<p>Insofern ist das strategische Handlungsfeld der Software-Entwicklung nur unzufriedenstellend mit dem klassischen agilen Handwerkszeug greifbar. Im Gegenteil, viele Quellen zur Agilität verlieren herzlich wenig über diesen Aspekt. Das höchste der Gefühle ist da noch die Aussage, dass man eine gemeinsame Vision und die richtigen Leute für den richtigen Job zu brauchen habe.</p>

<p>Doch offen gesagt ist das auch gar nicht weiter schlimm. Denn: in weiten Teilen ist der strategische Handlungsbereich geschäftlicher Natur. Es gibt im Vergleich zu anderen Berufen ein gut überschaubares technisches Strategiefeld. Die üblichen Verdächtigen sind da natürlich die bekannten <em>3P</em>: Platform, Programmiersprache und Produktlebenszyklus.</p>

<p>Aus meiner Sicht ist auch in diesem Punkt klar: der dedizierte "Stratege" Software-Architekt ist nicht notwendig, um effektive und profitable Software entwicklen zu können. Aus meiner Sicht ist hier eine ganz andere Rolle gefragt.</p>

<p>Es bedarf richtiger <em>Product Owner</em>, die sich nicht nur um die geschäftlichen Belange zu kümmern haben, sondern auch technisch-strategische Entscheidungen herbeizuführen wissen. Damit verlange ich von Produkt-Managern nicht zu viel, sondern genau das, wofür sie stehen: die strategische und operative Gestaltung des Produktes. Ein guter PM/PO lässt sich frühzeitig beraten und zieht in diesem Punkt auch die Team-Expertise mit in seine Entscheidungen ein.</p>

<h3 id="der-antimodernist">Der Antimodernist</h3>

<p>Es bleibt mir als Schlußfolgerung, dass für mich sowohl die Rolle als auch die Position des Software-Architekten in der modernen, agilen Software-Entwicklung nichts mehr zu suchen hat. Er liefert keinen Mehrwert mehr, sondern blockiert eher die gemeinschaftliche und selbstorganisatorische Arbeit in einer agilen Organisation. Der Software-Architekt ist darüber hinaus für mich eine wohl gemeinte, doch schlecht gewählte Metapher für den senioren, waisen und erfahrungsträchtigen Software-Entwickler, der sich sowohl in breiter als auch tiefer Hinsicht ausgiebig mit seiner Profession auseinandersetzt.</p>

<p>Die Fokussierung der architektur-relevanten Aufgaben auf eine Rolle bzw. Person innerhalb eines Teams ist ein verstaubtes Relikt einer nostalgischen Wasserfall-Ära. Für mich ist <em>jede Organisation</em>, welche im Team oder Projekt noch den <em>Software-Architekten als Rolle oder Position aufstellt</em>, schlicht und einfach im besten Falle eine <em>"möchte-gern-agile" Organisation</em>. </p>

<p>Der Software-Architekt als Funktion ist der Anti-Modernist, der Anti-Agilist, der Anti-Avantgardist in Reinkultur. Demzufolge gehört diese Rolle und Position aus meiner Sicht rigoros abgeschafft. Für mich gilt ganz klar: </p>

<p><em>Kein Software-Architekt ist besser als ein Software-Architekt</em>.</p>

<p>Die Abkehr vom Software-Architekten ist für mich ein wichtiger Schritt zur Stärkung der agilen Produkt-Entwicklung. Für mich steht dabei im Vordergrund der große geschäftsrelevante Vorteil, der sich durch die Stärkung des Product Owners bzw. Product Managers ergibt. </p>

<p>Natürlich spielt auch die Selbstorganisations-Kompetenz des Teams eine wichtige Rolle. Im Großen und Ganzen geht es für mein Dafürhalten aber nicht <em>nur</em> um das Team, sondern um das Gesamt-Gefüge der agilen Software-Entwicklung als netzorientiertes Modell, welches sich von phasenorientierte Konstruktionen abgegrenzt wissen möchte.</p>

<h3 id="quo-vadis-herr-architekt">Quo Vadis, Herr Architekt?</h3>

<p>Es stellt sich nun unweigerlich die Frage: Was nun mit den Software-Architekten? Sind alle Architekten in agilen Projekten unbrauchbar?</p>

<p>Nun, eine pauschale Antwort dazu gibt es sicher nicht. Aber: es gibt Entwicklungs-Pfade für den Software-Architekt von heute hin zur agilen Kraft von morgen. In meinen Augen ergeben sich für einen Software-Architekten mehrere Alternativen, sich in der agilen Organisation einzufügen, vornehmlich als</p>

<ul>
<li>Software-Entwickler im Team,</li>
<li>Leiter der Software-Entwicklung, oder</li>
<li>Product Owner</li>
</ul>

<p>in der Reihenfolge der "Eignung". Der wohl offensichtlichste Weg ist es, den jetzigen Architekten ins Team vollständig zu integrieren. Als erfahrener, seniorer Entwickler kann er sowohl als Mentor als auch als Lead sich in das Team einbringen und positionieren. Gerade ein "ehemaliger" Architekt kann in einem Team unglaubliche Ergebnisse erzielen, weil er durch seine gewohnten "Perspektivwechsel" und "architektonischen Überlegungen" automatisch nicht nur das Aufgabengebiet der Architektur im Team etabliert, sondern darüber hinaus die Kultur der "Interdisziplinarität" des Teams fördert.</p>

<p>Eine weitere Entwicklungsmöglichkeit für den heutigen Architekten ist der Übergang in das operative, teil-strategische mittlere Management als Team-Leiter, Abteilungs-Leiter oder Entwicklungs-Leiter. Gerade in produktorientierten Organisationen ist dieser Weg durchaus reizvoll, obgleich man natürlich sich als technologisch orientierter Mensch sich selbst offen die Frage stellen muss, ob man sich auch intensiver mit Management-Aufgaben auseinandersetzen möchte und/oder kann.</p>

<p>Ein aus meiner Sicht oft übersehener Entwicklungs-Pfad ist der hin zum Product Owner bzw. Product Manager. Im Falle desjenigen Architekten, der sich neben der technischen Expertise auch schon intensiv - vielleicht über Jahre hinweg - mit der Geschäftsdomäne auseinandergesetzt hat, macht es durchaus Sinn diesen Alternativ-Pfad ernsthaft in Betracht zu ziehen. Oft sind es gerade die fachlich und technisch starken Product Owner, die ein Produkt, ein Team, ja manchmal sogar ein ganzes Unternehmen stark positiv beeinflussen können.</p>

<h3 id="von-architekten-meistern-und-amateuren">Von Architekten, Meistern und Amateuren</h3>

<p>Abschließend möchte ich noch eine persönliche Note zu der "Person" des Software-Architekten einbringen. Ich kenne mittlerweile so ca. 40-50 Personen, die explizit die Rolle, Position oder den Beruf des Software-Architekten inne halten. Sowohl aufstrebende Talente als auch jahrzehnte lang Erfahrene. Ich habe mich nie selbst als "Architekt" verstanden, hatte aber das Glück, auch als Software-Architekt viele interessante und intelligente Personen bzw. Kollegen kennen zu lernen.</p>

<p>Von all den Architekten die ich (mehr oder minder gut) kenne, habe ich natürlich eine individuelle Meinung. Ich kann jedoch auch offen gestehen, dass ich nahezu jeden dieser Personen als "Software-Architekten" für ungeeignet empfinde. Das liegt größtenteils an meiner persönlichen "Wahrnehmung" des Software-Architekten. Mein Bild eines Software-Architekten ist keinesfalls technisch. Nein.</p>

<p>Mein Bild eines personifizierten Software-Architekten ist ganz anders. Es ist derjenige Experte der Software-Entwicklung, der sich sowohl technisch als auch fachlich auf einem sehr hohen Niveau bewegt. Derjenige, der Kommunikation, Menschenführung und Prozessverständnis meisterhaft als Wirkhebel der Produktivität einzusetzen weiss. Derjenige, der ökonomische Ziele mit fachlicher Kenntnis, ethischen Werten und menschlichem Pragmatismus verfolgt. Derjenige, der lernwillig und lehrfähig als Mentor und Schüler in den Zeitgeist der Technologie und die Köpfe der Kollegen eintaucht. </p>

<p>Kurzum: Ein <em>Meister der Software-Entwicklung</em>.</p>

<p>Ich kenne nur eine einzige Person als Software-Architekten, der in dieses Bild des <em>Meisters der Software-Entwicklung</em> passt. Er ist für mich eigentlich eher ein <em>Großmeister der Software-Entwicklung</em>. In gleichem Maße, wie ich stolz darauf bin, mit Ihm zusammengearbeitet zu haben, bedauere ich es auch, nun nicht mehr mit ihm arbeiten zu können.</p>

<p>Darüber hinaus kenne ich vielleicht eine handvoll Software-Architekten, die ich als herausragende, interdisziplinäre Software-Entwickler wahrnehme. Sie bewegen sich mit geradezu unglaublicher Sicherheit in jedem Feld der Software-Entwicklung. Für mich sind diese Personen <em>Experten der Software-Entwicklung</em>. </p>

<p>Sie dürfen sich durch ihre außergewöhnliche, interdiszipliäre, ganzheitliche und tiefe Kompetenz in der Software-Entwicklung das Recht herausnehmen, sich als <em>Experten</em> zu bezeichnen und anderen ein professionelles Vorbild zu sein.</p>

<p>Der verbleibende Großteil der mir bekannten Software-Architekten sind aus meiner Sicht Software-Entwickler unterschiedlichster Kompetenzgrade. Ich kenne manche Software-Architekten, die mit den Konzepten der Polymorphie schon überfordert sind. Ich kenne einige Software-Architekten, die mysthischen Hypothesen (und "Hypes") einen höheren Wert beimessen als harten Fakten und Argumenten. Ich kenne auch Software-Architekten, die in ihrer gesamten Laufbahn nicht einen einzigen Unit Test geschrieben haben. </p>

<p>Natürlich kenne ich auch ein paar Software-Architekten, die Kommunikation, Teamgeist und Lernwillen zeigen, aktiv mit anderen Kollegen arbeiten und sich bzw. ihre Kompetenzen stetig einbringen. Alles in Allem also ein "breiter Durchschnitt der Software-Entwicklers".</p>

<h3 id="fazit">Fazit</h3>

<p>In der mordernen, agilen Software-Entwicklung hat die Rolle bzw. Position des Software-Architekten nichts zu suchen. Agile Organisationen haben keine guten Software-Architekten, sondern allenfalls eine gute Software-Architektur. </p>

<p>Die moderne Software-Entwicklung ist schnelllebig und vielseitig. Die gelebte und bewegte Interdisziplinarität von agilen Teams ist es, die ihre wahre Kraft und Produktivität entfalten lässt. Aus persönlicher Entwicklungssicht ist ein Software-Architekt kein Kompetenzbeleg mehr. </p>

<p>Der Software-Architekt ist die Vergangenheit, der Software-Experte ist die Zukunft.</p>
            ]]></content>
        </entry>
                                  <entry>
            <title type="html">Feel Good Psychology</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/feel-good-psychology.html"/>
            <updated>2012-07-26T08:30:00Z</updated>
            <published>2012-07-26T08:30:00Z</published>
            <id>/feel-good-psychology.html</id>
            
            <content type="html"><![CDATA[
                <p>Seit geraumer Zeit verfolge ich in einem Blog mehrere Artikel zum Thema <a href="http://de.wikipedia.org/wiki/Positive_Psychologie">Feel Good Psychology</a>, welches in Fachkreisen auch als "Positive Psychologie" bezeichnet wird. Nun bin ich weder ein Psychologe, noch beschäftige ich mich näher mit dem Themenfeld der "positiven Psychologie". Dennoch haben mich die Ausführungen über positive Psychologie in der Software-Entwicklung (<a href="http://crjaensch.blogspot.de/2012/06/software-development-and-feel-good.html">Teil 1</a>, <a href="http://crjaensch.blogspot.de/2012/06/software-development-and-feel-good_09.html">Teil 2</a> und <a href="http://crjaensch.blogspot.de/2012/07/software-development-and-feel-good.html">Teil 3</a>) nachdenklich gestimmt. </p>

<p>Gerade vor diesem Hintergrund möchte ich meine z.T. noch frischen und ungeordneten Gedanken zu den gerade erwähnten Artikeln hier in einem kurzen Kommentar schildern. Vorab sei erwähnt, dass ich es für wichtig und richtig empfinde, auch Themen dieser Art offen in die allgemeine Diskussion über moderne Software-Entwicklung anzubringen.</p>

<h3 id="gutes-gefuhl-bei-schlechter-nachricht">Gutes Gefühl bei schlechter Nachricht</h3>

<p>Im <a href="http://crjaensch.blogspot.de/2012/06/software-development-and-feel-good_09.html">zweiten Teil</a> über Einflüsse der positiven Psychologie in der Software-Entwicklung wird ein wie ich finde gutes und oftmals bekanntes Beispiel herangezogen. Der <em>Projekt Sponsor</em> wird in diesem Fall mit beschönigenden Worten und Zahlen "beruhigt", um ein gutes Gefühl über den Status des Projektfortschrittes zu haben. Gerade in phasenorientierten Unternehmen mit einem starken Linienstrang ist dieses Beispiel sicher nicht weit hergeholt.</p>

<p>Besonders interessant ist hier der Rückschluss, dass diese Form der Beschönigung - meist durch Projektmanager - nicht durch Absicht oder strategische Motivation umgesetzt wird, sondern instinktiv als selbstreflektierende Beruhigungsmaßnahme verfolgt wird. Im <em>Zweifel</em> über den eigenen Überblick, das Vertrauen zu anderen Mitarbeiten oder die Souveränität der Situation ergreift der sich in einer <em>Drucksituation</em> befindliche Manager zu instinktiver Herbeiführung des <em>Gut-Gefühls</em>, um sich wieder in eine druckmindernde und rationale Situation zu begeben.</p>

<p>Das dieser psychologische Wirkmechanismus zu schwierigen, wenn nicht sogar katastrophalen Projektsituationen führen kann, brauche ich hier an dieser Stelle kaum näher auszuführen. Denn ist einmal eine "Beschönigungs-Tendenz" eingeleitet, so kommt man aus dieser Verzerrung der Tatsachen kaum wieder heraus.</p>

<p>Der Artikel schließt mit den Worten, das es wichtig sei, das jeder im Projekt sich "gut fühlen" solle bei der Kommunikation des Projektfortschrittes - im Großen wie auch im Kleinen. Es sei wichtig, den <em>wahrhaftigen</em> Status des Projektes zu jeder Zeit verfügbar zu machen. Nun, dem kann ich mich natürlich nur anschließen. Doch was hier in meinen Augen fehlt sind Gedanken darüber, <em>wie</em> man so eine Situation des "feel good to report bad news" etablieren kann. Ich möchte hier meinen bescheidenen Beitrag mit ein paar Anregungen wagen.</p>

<h3 id="die-kultur-des-scheiterns">Die Kultur des Scheiterns</h3>

<p>Aus den vorangegangen Zeilen ist es schon ersichtlich, das <em>"gut fühlen"</em> etwas sehr subjektives ist. Dennoch lohnt es sich, gerade über die Subjektivität des guten Gefühls ein paar Worte zu verlieren. Meines Erachtens nach ist die Subjektivität ein wesentlicher Faktor - denn sie erlaubt es uns, das "gute Gefühl" zu beeinflussen. Ja, sogar ein Stückweit zu lenken.</p>

<p>Der erste Schritt für eine Umgebung, in der man guten Gefühls auch schlechte Nachrichten verbreiten kann, ist sicherlich die Einstellung zu Fehlern, zum Scheitern, als auch zum Konflikt. Auf all diese Punkte einzugehen würde wohl ganze Bücher füllen können. Deswegen vereinfache ich es, in dem ich es als <em>"Kultur des Scheiterns"</em> bezeichne. Richtiger wäre natürlich die "Kultur im Umgang mit dem Scheitern." Dennoch lasse ich es mal so flapsig formuliert stehen.</p>

<p>Ich denke man kann den Interessensparteien und Verantwortlichen in einem Projekt sehr gut eine positive Kultur zu negativen Nachrichten vermitteln, in dem man Ihnen die Vorzüge näher bringt. Die üblichen Verdächtigen sind hier natürlich solche Dinge wie <em>Warnsignal</em>, <em>Reaktionsfähigkeit</em>, <em>Lerneffekt</em>, <em>Optimierungspotenzial</em> und <em>Kompetenzreflektion</em>. Aus meiner Erfahrung lassen sich mit genügend argumentativen Beispielen dazu ökonomisch orientierte Manager überzeugen, Fehlstellungen im Projektgefüge genauer und zeitnah zu reflektieren.</p>

<p>Ist eine grundlegende kulturelle Basis für das Annehmen und Verarbeiten von "Unbequemlichkeiten" vorhanden, kann man den nächsten wichtigen Schritt hin zu einem progressiv-konstruktiven Projektumfeld wagen: <em>Transparenz</em>. Transparenz durch Visualisierung - z.B. mit einem Task-Board - ist ein ungemein mächtiges Werkzeug. Es deckt nicht nur den Status Quo auf, sondern entkoppelt die Problemstellung des Arbeitsflusses von Positionen innerhalb der Organisation. Diese "Depersonalisierung" ist wichtig, um alle Beteiligten in einen quasi "wertfreien Grundzustand" zu heben.</p>

<p>Aufbauend darauf lassen sich Stück um Stück viele weitere Maßnahmen ergreifen, um so eine positive "Kultur des Scheiterns" zu ermöglichen. Ist diese Kultur bei den Projektteilnehmern verankert, wird ein negativer Projektfortschritt zu etwas völlig anderem, als es im Beispiel des <a href="http://crjaensch.blogspot.de/2012/06/software-development-and-feel-good_09.html">Artikels</a> beschrieben wird. </p>

<p>Es wandelt sich von einer demotivierenden und beängstigenden Situation zu einem Signal des bevorstehenden Fortschritts. Es entsteht im Team quasi ein "Zündfunke der Verbesserung", bei dem neue Kräfte geweckt und alte Stärken herangezogen werden.</p>

<h3 id="der-gluckliche-entwickler">Der "glückliche" Entwickler</h3>

<p>Doch damit sei auch an dieser Stelle genug des guten Reporting-Gefühls. Der Eingangs erwähnte <a href="http://crjaensch.blogspot.de/2012/07/software-development-and-feel-good.html">dritte Teil</a> der 'Feel Good Software Development'-Serie beschäftigt sich mit der Position des Entwicklers; primär aus Sicht eines Team-Leiters. Ich möchte jetzt nicht den gesamten Inhalt nochmals rezitieren, sondern nur anmerken, dass es sich inhaltlich auf bestimmte Themen konzentriert.</p>

<p>Zum Einen wäre da die grundlegende Frage der <em>"Motivation eines Entwicklers"</em>, die im Artikel stark an das "Gut-Gefühl" des Entwicklers gekoppelt wird. Darüber hinaus wird eine Korrelation zu der Kreativleistung des Entwicklers gezogen und seine "Identifikation mit dem eigenhändig geschriebenen Code" hervorgehoben. Zum Anderen wird eine wie ich finde sehr gewagte These aufgestellt, in dem die Art und Frequenz der "Kritik am Code" das Gut-Gefühl und die Motivation des Entwicklers stark beeinträchtigt.</p>

<p>Wenn ich jetzt ausholen müsste, um zu beschreiben, wie aus meiner Sicht der <em>"glückliche Entwickler"</em> zu definieren ist, dann würde ich wohl tief durchatmen - und schweigen. </p>

<p>Aber ich tue es nicht. Denn auch hier zählt die Subjektivität des "Guten" und "Glücklichen". Insofern kann man wohl mit Recht behaupten, dass es <em>den</em> glücklichen Entwickler gar nicht gibt. Abgesehen davon empfinde ich die Aussage, dass ein Entwickler sich nur durch die o.g. Punkte gut fühle, gelinde gesagt ein Stückweit lückenhaft.</p>

<p>Wie dem auch sei. Ich möchte im Besonderen auf den Punkt der <em>Art und Weise</em> der Kritik gegenüber der Leistung von Entwicklern eingehen. Der im Artikel beschriebene Fall lässt sich nicht nur auf Entwickler, sondern auf jede Art von Leistungsbeurteilung adaptieren. Menschen, die stolz auf Ihre Arbeit sind, sind wertvolle und enthusiastische Menschen. Da ist es nur verständlich, das der Stolz "angekratzt" wird, wenn man die Arbeit kritisiert. Das ist nicht nur bei Entwicklern so, sondern auch bei Hotelfachangestellten, Universitätsprofessoren oder Gartenbaulehrlingen so.</p>

<p>Doch ganz im Gegensatz zum im Artikel beschriebenen "verhindern" von harscher Kritik sehe ich noch weitere Faktoren, die einer Demotivation des enthusiastischen Entwicklers entgegenwirken können. Zunächst einmal möchte ich jedoch klar und deutlich erwähnen, dass Kritik (wie auch Lob) immer wertschätzend und respektvoll herangetragen werden sollte. Das ist eine Selbstverständlichkeit, wenn man mit Menschen auf einer Augenhöhe kommunizieren möchte.</p>

<p>Meiner Meinung nach geht es bei der Kritikäußerung wieder um die <em>Wahrnehmung</em>. Man kann Kritik als destruktiv und wertmindernd auffassen, wenn nicht eine offene Kultur des Kritisierens herrscht. Wie man sich an diese "offene Kultur" herantasten kann, wird im Artikel kaum erwähnt. Das einzig angeführte Mittel hin zu einem "Feel Good Developer" ist demnach die Vermeidung von harscher Kritik. Das ist für mein Empfinden deutlich zu wenig.</p>

<h3 id="die-kultur-der-kritik">Die Kultur der Kritik</h3>

<p>Kritik lässt sich formen. Kritik lässt sich etablieren. Ja, Kritik kann und sollte man auch trainieren. Das ist auch der erste Zusatz von meiner Seite, den ich anbringen möchte. Zum Etablieren einer Basis für gestaltende Kritik ist es absolut empfehlenswert, jeden Projektteilnehmer regelmäßig in die Rolle des Kritisierenden zu stellen und ihm beim ausüben der Kritik zu begleiten. Der klassische Rollentausch-Effekt entsteht meist sehr schnell und man lernt, Kritik deutlich zu äußern, ohne jedoch ausschweifend oder sogar abgleitend zu werden.</p>

<p>Darüber hinaus lässt sich auch die Umgebung für Kritik schärfen. Kritik in Drucksituationen - egal ob terminlich, inhaltlich oder anderweitig - wird selten konstruktiv angenommen. Fast schon selbstverständlich sollte es sein, dass jede kritische Äußerung argumentativ gestützt werden will, um konstruktiv angenommen zu werden. Eine gute gedankliche Stütze ist dabei das <em>"Grund vor Gegenstand"-Prinzip</em>. Er sagt aus, das man den <em>Grund</em> für die Kritik möglichst dem <em>Gegenstand</em> der Kritik voranstellen sollte.</p>

<p>Übt man z.B. Kritik an einem aus der eigenen Sicht mangelhaften Code, so stellt man die Gründe für die Bemängelung vor den Mangel an sich. Statt "dieser Code ist nicht S.O.L.I.D", heisst es also eher: "Die S.O.L.I.D.-Prinzipien sind eine wichtige Komponente für qualitativen Code. Das könnten wir hier im Code noch deutlicher darstellen.".</p>

<p>Ein aus meiner Sicht weiterer, wichtiger Aspekt ist die Korrelation der Kritik zur Sache. Meistens wird das schon durch eine <em>zeitnahe</em> Kritikäußerung erreicht. Man kann aber auch andere Mittel ergreifen, z.B. eine vorangehende "Simulation des Ereignisses". Besonders hilfreich ist dies in Verbindung mit einer bewußten Verschiebung des Kontextes, um so der Personifizierung von sachlicher Kritik vorzubeugen.</p>

<h3 id="gutes-gefuhl">Gutes Gefühl</h3>

<p>Ich kann aus der 'Feel Good Psychology' zwar viele Anregungen mitnehmen, bleibe aber nach wie vor skeptisch. Ich empfinde die Arbeit an dem "Guten Gemeinsamen" wichtig, möchte sie aber in der täglichen Software-Entwicklung nicht zu sehr in den Vordergrund stellen. </p>

<p>Arbeit darf genau so wenig zu einer "Demotivations-Maschine" verkommen wie auch nicht zu einer "Feel Good-Society" ausarten. Es ist meiner Meinung nach in Ordnung, ein natürliches Spannungsverhältnis zwischen Anstrengung und Wohlgefühl anzustreben.</p>

<p>Menschlichkeit, Respekt und eine erwachsene Art und Weise im Umgang miteinander ist dabei die Basis. Ich empfinde eine zu starke Auseinandersetzung mit den oben genannten Punkten dabei eher als künstlich und langfristig produktivitätsmindernd. Ja, man sollte sich Geanken machen. Ja, man sollte auch das Eine oder Andere in Betracht ziehen. </p>

<p>Als Berater und Coach arbeite ich auch an Themen wie Kommunikation, Konflikt, Motivation und Autorität. Jedoch nicht stetig, sondern bei Bedarf. Mit konkretem Fokus und einer Portion gesundem Menschenverstand. Man muss nicht alles immer so kompliziert sehen. Es geht auch einfach.</p>

<p>Das so oft gesuchte "gute Gefühl" kann auch von selbst kommen, wenn man gut miteinander umgeht, sich gut versteht und gemeinsam für eine Sache arbeiten kann.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Über das Ziel von Coding Dojos IV</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/uber-das-ziel-von-coding-dojos-iv.html"/>
            <updated>2012-07-24T00:30:00Z</updated>
            <published>2012-07-24T00:30:00Z</published>
            <id>/uber-das-ziel-von-coding-dojos-iv.html</id>
            
            <content type="html"><![CDATA[
                <p>Dieser kurze Artikel ist mein Beitrag zu den in letzter Zeit wieder stärker gewordenen Coding Dojo-Diskussionen innerhalb der .NET Community. Es ist schon schön zu sehen, wie auf dem <a href="http://karlsruhe.netopenspace.de/2012/">.NET Open Space Süd</a> eine Session zu "Coding Dojo's in Unternehmen" veranstaltet wird, wie sich nun auch <a href="http://dotnet-leipzig.de/veranstaltungen/dnug-event-2012-coding-dojo-1/">Leipzig</a> in die Städte der regelmäßigen Coding Dojo Veranstaltungen einreiht und vor Allem wie die Veranstalter der Coding Dojo's in <a href="https://www.xing.com/net/netdojo">München</a>, <a href="http://codingdojo.net/">Karlsruhe</a>, <a href="http://www.altnetberlin.de/Neues/0805netcodingdojokatapacmanv">Berlin</a> und <a href="http://dotnet-usergroup-hamburg.de">Hamburg</a> weiterhin mit Spass und Freude an der Sache Coding Dojos umsetzen.</p>

<p>Seit meinen Artikeln zu den Zielen von Coding Dojos - als Referenz zum Nachlesen sei hier nochmals auf <a href="uber-das-ziel-von-coding-dojos.html">Teil I</a>, <a href="uber-das-ziel-von-coding-dojos-ii.html">Teil II</a> und <a href="uber-das-ziel-von-coding-dojos-iii.html">Teil III</a> verwiesen - hat sich eben auch einiges getan. Coding Dojos haben sich inhaltlich wie auch veranstalterisch in der .NET Community etabliert. Ich empfinde das als ein sehr gutes Zeichen. Gerade vor diesem Hintergrund freue ich mich auch über <a href="http://devtyr.norberteder.com/post/Was-ein-Team-Leader-fur-sein-Entwicklungsteam-tun-kann.aspx">Blog-Artikel</a>, bei denen Coding Dojos als hilfreiches Mittel für Team-Weiterentwicklung angeführt werden.</p>

<h3 id="coding-dojo-fur-teams-und-unternehmen">Coding Dojo für Teams und Unternehmen</h3>

<p>An genau dieser Stelle möchte ich auch anknüpfen und meine Erfahrungen und Perspektiven dazu wiedergeben. Zunächst einmal kann ich natürlich die Coding Dojos auch uneingeschränkt für Teams und Unternehmen weiterempfehlen. Ich persönlich kenne mittlerweile mehrere Unternehmen, in denen regelmäßig Coding Dojos intern umgesetzt werden. Ein Unternehmen setzt das sogar konsequent <em>in jedem Entwicklungs-Team</em> ein - mit beachtlichem Erfolg für Unternehmen und Entwickler gleichermaßen. <em>(Kleine Randnotiz: Das Unternehmen betreibt Websites auf Java- und PHP-Basis!)</em></p>

<p>Das besondere an der Zielsetzung von Coding Dojos brauche ich hier eigentlich nicht mehr groß ausbreiten. Es reicht, wenn man sich vor Augen hält, dass ein Coding Dojo eine Übungsveranstaltung in lockerer Atmosphäre ist, in der jeder der Teilnehmer gleichwertig sowohl lernt als auch lehrt. Man ist als Teilnehmer also sowohl Lehrer als auch Schüler. Gerade diese <a href="dotnet-coding-dojo-ethics.html">Form des Erfahrungsaustausches</a> ist eine Besonderheit, welche nicht oft genug als Vorteil (und notwendige Schlüsseleigenschaft) von Coding Dojos hervorgehoben werden kann.</p>

<p>Statt dessen möchte ich mich nun mehr mit den Lerneffekten eines Coding Dojo auseinandersetzen. Sie sind hilfreich, um unerfahrenen Teilnehmern eine etwas <em>längerfristige Sicht</em> auf Coding Dojo's zu geben. Sie können auch bei der Argumentation für Coding Dojos im eigenen Team behilflich sein.</p>

<h3 id="spass-und-kommunikation">Spass und Kommunikation</h3>

<p>Entgegen des Eingangs erwähnten <a href="http://devtyr.norberteder.com/post/Was-ein-Team-Leader-fur-sein-Entwicklungsteam-tun-kann.aspx">Artikels</a> ist für mich <em>Spass</em> und <em>Kommunikation</em> kein primäres Ziel für ein Coding Dojo. Das sind <em>Nebeneffekte</em>, aber keine Ziele. Ein Coding Dojo hat ganz klar den <em>gemeinsamen Weg zu besserem Code</em> im Fokus. Also übt man, um dort hin zu kommen. Gemeinsam. Gemeinsam heisst eben auch Kommunikation. Je mehr man gemeinsam macht und löst, umso besser kann man sich gegenseitig einschätzen und verstehen. Das ist gut und wichtig. Ein Coding Dojo kann dabei auch sehr hilfreich sein.</p>

<p>Der Faktor <em>Spass</em> wird bei einem Coding Dojo meiner Meinung nach überbewertet. Das liegt z.T. an der Art und Weise, wie die Dojos umgesetzt werden - aber zu einem anderen Teil auch an der Wahrnehmung der Teilnehmer. Ich sehe mich da selbst zumindest in einer Teilschuld, denn schließlich habe ich in Dojos bei Konferenzen dazu beigetragen, dass Teilnehmer auch "Spass" mit Coding Dojos verbinden. Das ist auf den ersten Blick auch gar nicht weiter schlimm. Auf den zweiten Blick jedoch entpuppt es sich als gefährlich, weil man es als "seichte Unterhaltung" auf die leichte Schulter nehmen und den Fokus von "lernen" auf "unterhalten" verlagern könnte.</p>

<p>Aber: die <em>lockere Atmosphäre</em> und der <em>Spass</em> sollten auch nicht vernachlässigt werden. Sie sind eine Art von Katalysator für das Lernen. Gibt es keine lockere und offene Atmosphäre, so ist der Erfahrungsaustausch auch kaum vorhanden. Gibt es irgendwelche "Schlaumeier" oder "Emporkömmlinge", die alles besser wissen (wollen), mutiert das Dojo auch nur zu einem 0815-Workshop, statt einer Lernplattform gleichberechtigter Gleichgesinnter zu sein. Ergo: Zwischen "locker" und "zu locker" ist ein schmaler Grat. Doch "nicht locker" geht auf keinen Fall. Spass und Freude sind wichtig - aber nicht im Fokus.</p>

<h3 id="gemeinsam-besser-entwickeln">Gemeinsam Besser Entwickeln</h3>

<p>Wie schon erwähnt, kann man den Zielfokus eines Coding Dojo als "gemeinsam besser entwickeln" subsummieren. Das ist zwar weder vollständig noch präzise, aber es reicht aus, um sich ein gutes erstes Bild zu machen.</p>

<p>Im folgenden möchte ich meine Sicht auf die Lerneffekte von Coding Dojos wiedergeben. Sowohl das <a href="dotnet-coding-dojo-basics.html">Format</a> als auch die <a href="dotnet-coding-dojo-ethics.html">Werte</a> von Coding Dojos sind es, die diese Lerneffekte ermöglichen und fördern.</p>

<h5 id="collective-code-ownership">Collective Code Ownership</h5>

<p>Bei einem Coding Dojo arbeitet man gemeinsam an einer Lösung - also auch an einem Code. Dieses gemeinsame <em>"Coding"</em> führt unweigerlich zu einer Auseinandersetzung mit unterschiedlichen Code-Stilen. Angefangen von der Formatierung, über Namensgebung bis hin zu Design Patterns. </p>

<p>Diese gemeinsame Erarbeitung stärkt auch implizit das Bewusstsein der <em>gemeinsamen Verantwortung</em> gegenüber des Codes. Collective Code Ownership ist eines der unauffälligeren, mittelfristigeren Lerneffekte von regelmäßigen Coding Dojos.</p>

<h5 id="common-coding-guidelines">Common Coding Guidelines</h5>

<p>Dieser Punkt ist eng mit dem vorangegangenen verknüpft. Durch das gemeinsame Arbeiten an einem Code ergeben sich unterschiedliche "Handschriften" innerhalb des Codes, die dann in offener Runde diskutiert und begutachtet werden können. </p>

<p>Es entsteht ein Austausch über die Vor- und Nachteile und man kann daraufhin einen Konsens über den "gemeinsamen Stil" herbeiführen. Ein eingespieltes Dojo-Team schreibt Code wie aus "einer Feder".</p>

<h5 id="pair-programming">Pair Programming</h5>

<p>Viele Dojo's werden als <a href="dotnet-coding-dojo-basics.html">Randori</a> umgesetzt. Gerade dieser Modus ist ein sehr nützlicher Impulsgeber für verbessertes <em>Pair Programming</em>. Man lernt, wie man als Driver seinen Partner effektiv einbinden kann. Gleichzeitig erkennt man als Co-Pilot, wie man Argumente vorbereitet und darlegt, das der Partner sie auch im "Tippfluss" annimmt und abwägt. </p>

<p>Es gibt noch viele weitere Besonderheiten des Pair Programming, welche man bei Coding Dojos lernen kann. Gerade die öffentlichen Coding Dojos mit unterschiedlichen und neuen Teilnehmern sind in meinen Augen besonders lehrreich.</p>

<h5 id="test-driven-design">Test-Driven-Design</h5>

<p>Eines der wohl wichtigsten Lerneffekte im Coding Dojo ist das Test-Driven-Design. Durch die direkte Auseinandersetzung mit Code werden sequentialisierte Denkmuster aufgebrochen und das System der Feedback-Schleifen antrainiert. Es werden besonders die Fähigkeiten in Anforderungsformulierung und -verifikation gestärkt, welches sich quasi sofort auf den "normalen Entwicklungsalltag" einzahlt. </p>

<p>Fortgeschrittene Dojo-Teilnehmer können sich auf hohem Niveau mit TDD auseinandersetzen und lernen dynamische Ordnungs- und Design-Techniken. TDD ist eines der Kern-Lerneffekte von Coding Dojos. Jedes Coding Dojo arbeitet mindestens mit TDD.</p>

<h5 id="refactoring">Refactoring</h5>

<p>Stark verbunden mit TDD ist auch der Lerneffekt des Refactoring. Dabei geht es sowohl um die konzeptionelle, als auch um technische Ebene. Soll heißen: Man lernt vieles über Refactoring-Möglichkeiten und den <em>richtigen Refactoring-Zeitpunkt</em>. </p>

<p>Aber man lernt auch vieles über Refactoring-Tools und Umsetzungsstabilitäten. Erfahrene Dojo-Gänger erkennen Refactorings blitzschnell und haben ein gnadenlos gutes "Timing" für Refactorings.</p>

<h5 id="yagni">YAGNI</h5>

<p>Die Konzentration auf das Wesentliche ist bei einem Coding Dojo wichtig. Durch TDD und Babysteps lernt man vieles über Clean-Code und die SOLID-Prinzipien. Ganz besonders wird allerdings das Prinzip des <a href="http://de.wikipedia.org/wiki/YAGNI">YAGNI</a> <em>("You ain't gonna need it")</em> vermittelt. </p>

<p>Mir ist gerade bei den internen Team-Dojos aufgefallen, das dieses Prinzip sich durch die Coding Dojos regelrecht im Team "manifestiert". Das Motto des "jede Zeile muss Wert schaffen" wird deutlich gelebt und gestärkt.</p>

<h5 id="done-is-better-than-perfect">Done is better than Perfect</h5>

<p>Sowohl bei den öffentlichen als auch bei den internen Coding Dojos gibt es Zeitlimits, üblicherweise zwischen 2 und 4 Stunden. Gerade bei den internen Dojo's, die im Schnitt 2-3 Stunden dauern, kann man nach einer gewissen Zeit - sagen wir mal 20-30 Dojos später - feststellen, dass sich das Team als Ganzes fokussierter zum Ziel bewegt. Ausschweifende Grundsatzdiskussionen werden aufgeschrieben und ans Ende geschoben, manches <code>foreach</code> wird nicht mehr in ein eleganteres <code>map</code> umgewandelt.</p>

<h5 id="try-before-buy">Try before Buy</h5>

<p>In vielen Coding Dojos wird dieser Lerneffekt kaum sichtbar gemacht und ist dennoch oftmals vertreten. Gerade bei den internen Team-Dojos werden Code Katas und Coding Dojos mit unterschiedlichen "Setups" umgesetzt. </p>

<p>Da wird ein neues Test-Framework ausprobiert oder aber eine andere Design-Technik. Es werden Editoren und Refactoring-Tools getestet. Ja, sogar Tastaturen und Shortcuts werden im Coding Dojo mal 'angetestet'. Als <em>Resharper-User</em> kennt man ja das Dilemma: "IDEA oder VS?" ist oftmals die Frage. </p>

<p>Wichtig ist: Im Coding Dojo ist Platz für probieren. Hier kann man sich mal aus dem Fenster lehnen und neue Dinge erforschen und gegutachten.</p>

<h5 id="team-tactics">Team-Tactics</h5>

<p>Zu guter letzt möchte ich noch einen weiteren Lerneffekt bei Coding-Dojos mit festen Teams erwähnen, der oftmals übersehen wird: Das Team lernt selbstständig sich taktisch zu verhalten und auch Taktiken zu verbessern. Gerade bei Teams, die schon längere Zeit Dojos umsetzen, stellt sich eine Kenntnis über die Stärken und Schwächen der Teammitglieder ein, die das Team auch entsprechend beachtet. </p>

<p>So werden z.B. diejenigen, die starke kommunikative Fähigkeiten haben, eher in der Anforderungsverifikation und Testformulierung eingesetzt. Mitglieder mit starken logischen oder mathematischen Skills werden eher für Lösungsraumbildung und Refactoring eingesetzt. Der "Team-Gedanke" ist ein weiterer Kern-Lerneffekt von Coding Dojos.</p>

<h3 id="do-it">Do It</h3>

<p>Als Fazit kann ich wirklich nur jedem empfehlen: lest nicht nur darüber und macht auch nicht irgendwelche "1-Mann-Dojos", in Dojos getarnte Workshops oder ähnlich komische Dinge. Besucht ein Coding Dojo in eurer Nähe! Auch wenn es kein .NET Coding Dojo ist. </p>

<p>So hat z.B. auch die Java-, Ruby-, Python- und JavaScript-Community viele Dojo-Freunde. Ihr könnt auch selbst ein Coding Dojo veranstalten. Intern, mit den Teamkollegen, oder aber auch mit Freunden oder Gleichgesinnten. Gerade die Teams in Unternehmen profitieren von regelmäßigen Coding Dojos ungemein. Ich kann es auf jeden Fall weiterempfehlen. </p>

<p>Gut ist: machen. Besser ist: regelmäßig machen. Go to Coding Dojo!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Selenium on Fedora 17</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/selenium-on-fedora-17.html"/>
            <updated>2012-07-23T12:00:00Z</updated>
            <published>2012-07-23T12:00:00Z</published>
            <id>/selenium-on-fedora-17.html</id>
            
            <content type="html"><![CDATA[
                <p>I use <a href="http://seleniumhq.org">Selenium</a> since many years. It's a great project and turned out to be very useful for me on various small and large projects. Currently, I'm creating a few tests for a project of mine using <a href="http://python.org">Python</a>. This works reasonably well. However, it turned out to be a little tricky to get things up and running.</p>

<h3 id="installing-the-bits">Installing the Bits</h3>

<p>Installing Selenium looks pretty straight-forward at first sight. A quick check on the fedora repolist reveals that all we need is provided:</p>

<div class="codehilite"><pre><span class="n">sudo</span> <span class="n">yum</span> <span class="n">info</span> <span class="n">selenium</span><span class="o">-</span><span class="n">core</span>

<span class="n">Loaded</span> <span class="n">plugins:</span> <span class="n">fastestmirror</span><span class="p">,</span> <span class="n">langpacks</span><span class="p">,</span> <span class="n">presto</span><span class="p">,</span> <span class="n">refresh</span><span class="o">-</span><span class="n">packagekit</span>
<span class="n">Installed</span> <span class="n">Packages</span>
<span class="n">Name</span>        <span class="p">:</span> <span class="n">selenium</span><span class="o">-</span><span class="n">core</span>
<span class="n">Arch</span>        <span class="p">:</span> <span class="n">noarch</span>
<span class="n">Version</span>     <span class="p">:</span> <span class="mf">1.0.2</span>
<span class="n">Release</span>     <span class="p">:</span> <span class="mf">0.5.20100324</span><span class="n">svn</span><span class="o">.</span><span class="n">fc15</span>
<span class="n">Size</span>        <span class="p">:</span> <span class="mf">1.0</span> <span class="n">M</span>
<span class="n">Repo</span>        <span class="p">:</span> <span class="n">installed</span>
<span class="n">From</span> <span class="n">repo</span>   <span class="p">:</span> <span class="n">fedora</span>
<span class="n">Summary</span>     <span class="p">:</span> <span class="n">A</span> <span class="n">DHTML</span> <span class="n">test</span> <span class="n">execution</span> <span class="n">framework</span>
<span class="n">URL</span>         <span class="p">:</span> <span class="n">http:</span><span class="sr">//s</span><span class="n">eleniumhq</span><span class="o">.</span><span class="n">org</span><span class="sr">/projects/co</span><span class="n">re</span><span class="o">/</span>
<span class="n">License</span>     <span class="p">:</span> <span class="n">LGPLv2</span> <span class="ow">and</span> <span class="n">MIT</span> <span class="ow">and</span> <span class="n">ASL</span> <span class="mf">2.0</span> <span class="ow">and</span> <span class="n">GPLv2</span><span class="o">+</span> <span class="ow">and</span> <span class="p">(</span><span class="n">MPLv1</span><span class="mf">.1</span> <span class="ow">or</span> <span class="n">GPLv2</span><span class="o">+</span> <span class="ow">or</span> <span class="n">LGPLv2</span><span class="o">+</span><span class="p">)</span>
<span class="n">Description</span> <span class="p">:</span> <span class="n">Selenium</span> <span class="n">Core</span> <span class="n">is</span> <span class="n">the</span> <span class="n">engine</span> <span class="n">of</span> <span class="n">both</span><span class="p">,</span> <span class="n">Selenium</span> <span class="n">IDE</span> <span class="ow">and</span> <span class="n">Selenium</span> <span class="n">RC</span> <span class="p">(</span><span class="n">driven</span>
            <span class="p">:</span> <span class="n">mode</span><span class="p">),</span> <span class="n">but</span> <span class="n">it</span> <span class="n">also</span> <span class="n">can</span> <span class="n">be</span> <span class="n">deployed</span> <span class="n">on</span> <span class="n">the</span> <span class="n">desired</span> <span class="n">application</span> <span class="n">server</span><span class="o">.</span>
</pre></div>

<p>Same goes for <code>selenium-server</code>, btw. Well, not really. Surprisingly, the selenium packages for fedora are quite outdated. They provide selenium version 1.02, while the current standalone server version happens to be on version 2.24.x. This is quite exceptional since fedora packages are quite on track with latest stables in general.</p>

<p>That's not a big stopper anyway, since downloading and using selenium is a kids task. Grab the <a href="_">standalone server</a>, put in on a reasonable place like <code>/usr/local/lib/java</code> and create a simple start-script called <code>selenium-server</code>:</p>

<div class="codehilite"><pre>#!/bin/bash
java -jar /usr/local/lib/java/selenium-standalone-server.jar
</pre></div>

<p>plus a quick <code>chmod a+x</code>, and we're basically done. Starting your server with <code>selenium-server</code> on the command line should be fine now.</p>

<p>As for the python side, the python bindings for selenium are not in fedora repos. Hence we're going to PyPI and get them there with a quick</p>

<div class="codehilite"><pre><span class="n">sudo</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">selenium</span>
</pre></div>

<p>Voila, we're done with the installation part.</p>

<h3 id="webdriving-firefox-64bit">Webdriving Firefox 64bit</h3>

<p>A subsequent check with python to verify correct operation revealed another caveat. I checked the firefox webdriver with</p>

<div class="codehilite"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">from</span> <span class="n">selenium</span> <span class="nb">import</span> <span class="n">webdriver</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">browser</span> <span class="o">=</span> <span class="n">webdriver</span><span class="o">.</span><span class="n">Firefox</span><span class="p">()</span>
</pre></div>

<p>and got a nice message that the webdriver wasn't able to fire up firefox due to a <em>"wrong ELF class: ELFCLASS32"</em> error for <code>libX11.so.6</code>. A short research uncovered the issue being a known problem of selenium as described in <a href="http://code.google.com/p/selenium/issues/detail?id=2852">Issue 2852</a>. The selenium driver looks up libX11 on a wrong location.</p>

<p>The somewhat ugly workaround for this is to redirect to the lib64 dll with a symlink:</p>

<div class="codehilite"><pre><span class="n">mv</span> <span class="sr">/usr/</span><span class="n">lib</span><span class="o">/</span><span class="n">libX11</span><span class="o">.</span><span class="n">so</span><span class="mf">.6</span><span class="p">{,</span><span class="o">.</span><span class="n">x86</span><span class="p">}</span>
<span class="n">ln</span> <span class="o">-</span><span class="n">s</span> <span class="sr">/usr/</span><span class="n">lib64</span><span class="sr">/libX11.so.6.3.0 /</span><span class="n">usr</span><span class="sr">/lib/</span><span class="n">libX11</span><span class="o">.</span><span class="n">so</span><span class="mf">.6</span>
</pre></div>

<p>After this little hack, the firefox webdriver works as expected and the selenium testing fun finally was about to begin!</p>

<h3 id="going-headless">Going headless</h3>

<p>I had written a couple of tests, I wanted to integrate them to the overall testing scripts. This actually requires to enable the tests to be <em>headless</em>. The're basically two options to choose from for headless testing.</p>

<p>The first option is to go for the (above created) server and use the <code>RemoteDriver</code> in the tests. This is quite straight-forward and did work very well in a few other projects I made. So I decided to check this path from within Python as well. Well, basically, it's just as easy as:</p>

<div class="codehilite"><pre><span class="n">from</span> <span class="n">selenium</span> <span class="nb">import</span> <span class="n">webdriver</span>
<span class="n">from</span> <span class="n">selenium</span><span class="o">.</span><span class="n">webdriver</span><span class="o">.</span><span class="n">common</span><span class="o">.</span><span class="n">desired_capabilities</span> <span class="nb">import</span> <span class="n">DesiredCapabilities</span>

<span class="n">browser</span> <span class="o">=</span> <span class="n">webdriver</span><span class="o">.</span><span class="n">Remote</span><span class="p">(</span>
    <span class="n">desired_capabilities</span> <span class="o">=</span> <span class="n">DesiredCapabilities</span><span class="o">.</span><span class="n">HTMLUNIT</span>
<span class="p">)</span>
</pre></div>

<p>Naturally, the selenium server must be running as well. In our case it's running on localhost.</p>

<p>It's worth mentioning that the python bindings are fairly <a href="http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html">well documented</a>.</p>

<p>While this server-based approach works very well and in my experience plays well in mid-sized projects / teams, there's a second neat alternative to go headless using a virtual display like <a href="http://en.wikipedia.org/wiki/Xvfb">Xvfb</a>. This is especially useful if you want to use specific functionality like capturing network traffic of taking screenshots. I came across a nice <a href="http://coreygoldberg.blogspot.de/2011/06/python-headless-selenium-webdriver.html">blog post</a> describing the basic usage and want to reiterate it for my case.</p>

<p>In order to use Xvfb with python, <code>Xvfb</code> itself and <code>pyvirtualdisplay</code> need to be grabbed:</p>

<div class="codehilite"><pre><span class="n">sudo</span> <span class="n">yum</span> <span class="n">install</span> <span class="n">xorg</span><span class="o">-</span><span class="n">x11</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="n">Xvfb</span>
<span class="n">sudo</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">pyvirtualdisplay</span>
</pre></div>

<p>The xvfb package name may vary on other distributions. After installing pyvirtualdisplay, running a headless test with Xvfb is as easy as:</p>

<div class="codehilite"><pre><span class="n">from</span> <span class="n">pyvirtualdisplay</span> <span class="nb">import</span> <span class="n">Display</span>
<span class="n">from</span> <span class="n">selenium</span> <span class="nb">import</span> <span class="n">webdriver</span>

<span class="n">display</span> <span class="o">=</span> <span class="n">Display</span><span class="p">(</span><span class="n">visible</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="p">(</span><span class="mi">1024</span><span class="p">,</span><span class="mi">768</span><span class="p">))</span>
<span class="n">display</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>

<span class="n">browser</span> <span class="o">=</span> <span class="n">webdriver</span><span class="o">.</span><span class="n">Firefox</span><span class="p">()</span>
<span class="n">browser</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;http://google.com&#39;</span><span class="p">)</span>

<span class="k">print</span> <span class="n">browser</span><span class="o">.</span><span class="n">title</span>

<span class="n">browser</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
<span class="n">display</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
</pre></div>

<p>And: it works beautifully! The nice thing about it is that switching from headless to visual mode is just changing a few lines, which can be easily parameterized. As for my simple tests on my little project, I'm using the virtual display version. It's fast enough and enables me to do some advanced checking as well.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Kurzbericht von der Agile World 2012</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/kurzbericht-von-der-agile-world.html"/>
            <updated>2012-07-15T10:00:00Z</updated>
            <published>2012-07-15T10:00:00Z</published>
            <id>/kurzbericht-von-der-agile-world.html</id>
            
            <content type="html"><![CDATA[
                <p>Letzte Woche hatte ich die Ehre, auf der <a href="http://agileworld.de">Agile World</a> 2012 sein zu dürfen. Die Agile World ist für mich eine agile Konferenz wie sie im Buche steht. In der Agenda finden sich nicht nur Vorträge wieder, sondern auch interaktive Austauschformate wie Open Space oder Fishbowl. Darüber hinaus war es für mich ein äußerst positiver Eindruck, dass die Teilnehmerschaft gleichermaßen interessiert und fundiert agiert hat.</p>

<p>Mein Besuch der Agile World hat mich nicht nur durch meine bescheidenen Beiträge bereichert, sondern im Besonderen durch die Beiträge der Referenten und die sehr ergiebigen Anschlußdiskussionen. Ich möchte da exemplarisch den Beitrag von <a href="http://bovacon.com">Bogo Vatovec</a> über <em>"Skalierung von Agilität"</em> und die Beiträge <em>"Die Kunst der Arbeit"</em> als auch <em>"Konzeptionelle Integrität in Scrum"</em> von <a href="http://datenlabor.info">Ulf Schneider</a> hervorheben.</p>

<h3 id="skalierung-von-agilitat">Skalierung von Agilität</h3>

<p>In dem sehr erfrischenden und professionellen Beitrag von <a href="http://bovacon.com">Bogo Vatovec</a> konnte ich viele bestätigende und neue Impulse mitnehmen. Ich habe mich besonders bestätigt gefühlt bei den Berichten aus agilen Ansätzen innerhalb von Großunternehmen. Die Thematik der organisatorischen Granularität als auch die Schnittstellen unter den einzelnen Organisationseinheiten ist bei der Umsetzung agiler Methoden ein sehr diffiziles Aktionsfeld. Bogo hat durch Erfahrungsberichte die Komplexität großer Organisationsmechanismen gut dargestellt.</p>

<p>Äußerst erfreut war ich, als sowohl Kommunikation als auch die Kommunikationsform als große Erfolgsfaktoren für methodische Änderung hervorgehoben wurden. Als Agilist ist auch klar, das mit dem Begriff "Änderung" auch nur die <em>kleinste mögliche Änderung</em> innerhalb des bestehenden Prozessgefüges gemeint sein kann. </p>

<p>Denn gerade in diesem Punkt waren Bogo's Ausführungen deutlich und fundiert artikuliert: Große Unternehmen bewegen sich nicht schnell mit großen Laufschritten, sondern erreichen Änderungseffektivität durch kleine, zügige Tippelschritte.</p>

<h3 id="die-kunst-der-arbeit">Die Kunst der Arbeit</h3>

<p>Obgleich mich der äußerst gelungene Vortrag <em>"Konzeptionelle Integrität in Scrum"</em> von <a href="http://datenlabor.info">Ulf Schneider</a> sehr inspiriert und bewegt hat, möchte ich an dieser Stelle nicht näher auf den eben erwähnten, sondern auf den weiteren Beitrag <em>"Die Kunst der Arbeit"</em> von Ulf eingehen.</p>

<p>In diesem sehr anspruchsvollen Beitrag beleuchtet Ulf die Haltung zu Arbeit, deren Eigenschaften und Implikationen. Zunächst galt es die Grundhaltung zur eigenen Arbeit in drei kategorische Wahrnehmungen zu gliedern. Da wäre zunächst die Wahrnehmung der Arbeit als <em>"Schinderei"</em>, gefolgt von der Wahrnehmung des <em>"Handwerks"</em> und zu guter letzt gekrönt von der Wahrnehmung der "Kunst".</p>

<p>Doch nicht nur die Ausführungen über die einzelnen Kategorien der Wahrnehmung waren für mich geradezu faszinierend, sondern viel mehr die Korrelation der Arbeitshaltung zu den agilen Werten. Die daraus gewonnene Schlußfolgerung war auch motivierendes Schlußwort: Ein Agilist kann, soll und wird seine Arbeit als <em>"Kunst"</em> wahrnehmen.</p>

<h3 id="improuv-telefonica-ntt-data">Improuv, Telefonica, NTT Data</h3>

<p>Abschließend möchte ich noch ein paar Worte zu der Konferenz selbst verlieren. Zunächst einmal gilt für mich festzuhalten, dass das Konferenz-Format in Kombination mit den hochqualitativen Beiträgen schon als innovativ bezeichnet werden kann. Die Fishbowl-Sessions, die lange Mittagspause und der Open Space sind wahre Katalysatoren für rege Kommunikation.</p>

<p>Die großartige Leistung des Veranstalters <a href="http://improuv.de">improuv</a> kann ich hier gar nicht in Worte fassen. Eine kostenlose zweitätige Konferenz dieser Güte und Qualität zu bewerkstelligen ist wahrlich schon meisterhaft. Nicht minder ist in diesem Zusammenhang der Beitrag von <a href="http://telefonica.de">Telefonica</a> einzuschätzen. Als quasi Hauptsponsor stellte Telefonica die Räumlichkeiten und das ganze "drum herum" zur Verfügung. Ich scheue mich nicht offen zuzugeben, dass Telefonica mit diesem Engagement einen sehr positiven Eindruck hinterlassen hat. Da war es für mich geradezu eine Ehre, das ich als Repräsentant der <a href="http://nttdata.com/emea">NTT Data</a> meinen Beitrag zur Konferenz mit zwei Vorträgen und einer Motivationsrede leisten durfte. Die "Folien" zu dem Vortag <a href="/talks/agile-in-disguise/index.html">Agile In Disguise</a> sind <a href="/talks/agile-in-disguise/index.html">online verfügbar</a>.</p>

<p>Ich nehme von dieser Konferenz viele neue Anregungen mit. Ich habe gelernt, das man Motivation und Demotivation schon im Gesicht eines Menschen ablesen kann. Ich konnte erfahren, das ein Unbekannter mit einem Lächeln zum Bekannten werden kann. Und ich habe zu jeder Zeit gespürt, das ich noch viel lernen kann und will.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">State Of Affairs In Software Testing</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/state-of-affairs-in-software-testing.html"/>
            <updated>2012-06-30T12:00:00Z</updated>
            <published>2012-06-30T12:00:00Z</published>
            <id>/state-of-affairs-in-software-testing.html</id>
            
            <content type="html"><![CDATA[
                <p>This is a report and personal comment about the current state of testing in the software engineering industry. A few months ago, I attended a symposium about quality in software engineering. During this event, the results of a <a href="http://softwaretest-umfrage.de">study on software quality and testing</a> were presented. The study was conducted by <a href="http://www.german-testing-board.de">GTB</a> of Germany and <a href="http://www.software-tester.ch/stb.html">STB</a> of Switzerland. As far as I can judge, the study can be considered representative.</p>

<p>I want to catch up and comment some study results here. I'll do that in <em>english by intent</em>, so that my international readers have a chance to compare this with their own findings they might have in their country, region or industry.</p>

<h3 id="methodologies">Methodologies</h3>

<p>First of all, let's look into what's the state of the industry on methodologies (or process frameworks). Just as a reminder, the survey was conducted in 2011.</p>

<p>It's interesting to point out that more than 50% of all participants use a process model based on <em>phases</em>. This practically means: sequential thinking - sequential doing. That's very disappointing to me, especially when you read further on and realize that <em>not even one third</em> is using a model which <em>claims to be oriented</em> on agile principles.</p>

<p><img alt="Methodologies in industry" src="/media/images/test_methods.jpg" /></p>

<h3 id="agile-is-fragile">Agile is Fragile</h3>

<p>Now, if we zoom in and analyze from those who claimed to follow agile principles what agile methodology they actually practice, a terrific picture is being revealed.</p>

<p><img alt="Agile methodologies applied in industry" src="/media/images/test_agile.jpg" /></p>

<p>This figure is evidence enough that todays software industry is approaching towards a dangerous thinking that not only Scrum is Agile, but Agile is Scrum. However, what actually is shocking me is the fact that almost 30% (yes, it's really <em>one out of three</em>) are doing "something very agile on their own". That said, they claim to have an agile working environment and mindset without referring to existing agile methodologies. To me, this sounds like there's a large dark figure of organizations thinking that they're agile while their reality is much likely very different.</p>

<p>A second, very interesting figure from that study actually is the answer to following question:</p>

<blockquote>
<p>What are the most valuable agile practices with regard to software quality?</p>
</blockquote>

<p>The answers to this question are partly surprising:</p>

<p><img alt="Important agile practices" src="/media/images/test_agile_practices.jpg" /></p>

<p>First, the <em>good news</em>: 50% of all participants believe that <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> is essential for good software quality. Retrospectives are being valued high (46%), followed by (Continuous) Refactoring (40%). Despite these positive signs, there's room for improvement as well. Namely on the most important aspect of cultural effects like Collective Code Ownership (22%) and <a href="http://en.wikipedia.org/wiki/Pair_programming">Pair Programming</a> (30%). Those should be at least as high as TDD is right now.</p>

<p>Surprisingly, the most important agile practice from software quality point of view seems to be shared effort estimation (60%), most notably using <a href="http://en.wikipedia.org/wiki/Planning_poker">Planning Poker</a> and the like. Clean and concise user stories are of great importance, very much like daily standups are (both 50%). <em>(Note: If you're missing Code Reviews here, don't be surprised. There's a separate survey result  regarding reviews which I'll discuss later on).</em></p>

<h3 id="goals-in-testing">Goals in Testing</h3>

<p>Before I'll have a closer look at the interesting questions (like how is testing done in organizations nowadays), it's worth to have a short strategic perspective on testing and software quality. The topmost target in software quality testing is gain of productivity (66%), followed by the all-time favorite economical chuck-norris-sidekick-answer of cost reduction (37%). Interestingly, automation (34%) and standardization (32%) are almost as equally high valued strategic goals as cost efficiency.</p>

<p><img alt="Strategic goals of software quality testing" src="/media/images/test_goals.jpg" /></p>

<p>Apart from these goals, another interesting fact surely is the organization of responsibility in testing. While keeping in mind that almost one out of three organizations claim to be "agile", the question of who actually is responsible for software quality testing in their organization is pretty disillusioning.</p>

<p><img alt="Responsibles for software quality and testing" src="/media/images/test_responsibility.jpg" /></p>

<p>Here we are, back again in our waterfall dreams, where the project manager (57%) and test manager (51%) are being kept responsible for software quality  and hence surely will have "adequate measures" to "assure" that the almighty "quality KPIs" are going to be fulfilled.</p>

<p>Although many testing communities love to communicate that "testing is a general concern" and needs to be adopted using a "holistic approach", the survey result speaks a very different language. Even the testers seem to favor positional (or role) responsibilities instead of just saying "the team is responsible for quality and testing". I'm not saying that no QA should be established. I'm just saying that a widespread responsibility nowadays is crucial for interdisciplinary awareness.</p>

<h3 id="testing-practices">Testing Practices</h3>

<p>Now let's have a closer look at the current state of affairs for testing practices. It's very interesting to me that the industry standard for estimating testing efforts is leaning more towards a <em>complete efforts estimation</em> model. This is a contrast to the previously mentioned responsibility perspective. From all participants, 59% stated that the testing and quality efforts are being estimated with the complete development efforts. In plain english: quality efforts are being included in all estimations.</p>

<p><img alt="Efforts estimation for software quality and testing" src="/media/images/test_estimation.jpg" /></p>

<p>At first sight, this seems to be a very positive thing. However, if you read the figures between the lines, it's not that much a positive sign, me thinks. Especially taking into consideration that there's quite a large number who say that <em>quality efforts are not estimated at all</em> (7%) or "somewhat differently" (4%). That makes me scratch my head a little. My interpretation of the large number of "quality efforts are all inclusive" statement is that most organizations don't have a deliberate process towards quality assurance activities and efforts. It's just a guess, though.</p>

<p>Another interesting aspect is the test systems question. Let's look at the survey results for this question:</p>

<blockquote>
<p>What is the primary test system you are using for quality assurance?</p>
</blockquote>

<p><img alt="Primary test systems" src="/media/images/test_systems.jpg" /></p>

<p>I have a twofolded opinion regarding this chart. While it's very positive for me to see that 84% have a separate UAT/QA environment to have their tests running on, there's a flipside. Now imagine that almost 1 out of 4 organizations are testing their releases on live systems (24%). I don't want to imagine that, but I guess I have too. Crazy stuff.</p>

<h3 id="the-art-of-testing">The Art Of Testing</h3>

<p>Let's deep dive into testing and look what core activities are being performed nowadays before the actual testing happens. Please bear in mind that more than 50% of all organizations are using a development process based on phases. This effectively means that those companies test <em>after</em> the development has finished. </p>

<p>A very weird fact, isn't it? Everybody is talking how agile they are, but nearly everybody is putting test activities at the end of the process. What a shame.</p>

<p>Back to the initial question at hand:</p>

<blockquote>
<p>What are the primary activities prior testing?</p>
</blockquote>

<p><img alt="Test preparation activities" src="/media/images/test_prep.jpg" /></p>

<p>Obviously, before testing something, 83% of all survey participants are creating test cases. Good thing. A little surprise: 60% are taking care about defining test data as well. Now, <em>re-read</em> this. While 83% do test cases, only 60% are performing test data definitions. This basically implies to me that 23% seem to define test cases without test data. Ok, I know this is a naive miscalculation. Still, it smells strangely to me.</p>

<p>One of the most interesting facts to me was <em>test case definition</em>. In particular, the type of test case documentation / definition. Let's take a deep breath and look at the following question:</p>

<blockquote>
<p>How do you define your test cases?</p>
</blockquote>

<p>The answer - honestly - made me a little sad.</p>

<p><img alt="Test case definition" src="/media/images/test_case_definition.jpg" /></p>

<p>The majority in the software industry <em>just writes the test cases down in free text</em> (54%). Got that? Need to repeat? No keyword/action based testing, no DSL's, no formalization whatsoever. </p>

<p>This sounds to me as if these organizations are in a testing maze. The door to verification: locked. The door to reuse: locked. The door to automation: locked! I wonder if those 54% ever heard of FIT or FITNESSE. What a horrible number. </p>

<p>On the other hand, 16% like to have their test cases defined the other way round: in a formal language or DSL. There's even a minority of 5% who generate test cases which were previously defined by a particular domain model. There's hope in testing land.</p>

<h3 id="done-completion-criteria">Done: Completion Criteria</h3>

<p>Given we have completed all our preparations and did a nice acceptance test run. From the QA perspective, there must be some indication of what is "enough quality" to accept a given system and have it passed over to production. In order to be able to give a sensible statement for such a question, a number of quality perspectives need to be taken into account. These are widely known as <em>Quality KPIs (KPI = <a href="http://en.wikipedia.org/wiki/Performance_indicator">Key Performance Indicator</a>)</em>.</p>

<p><img alt="Test KPI" src="/media/images/test_kpi.jpg" /></p>

<p>It's common sense here that all specified / implemented features should have a complete test case coverage to run through (75%). From code perspective, the percentage of code covered through testing (25%) seems to be important as well. Another interesting fact: 59% of all participants look at the test execution rate (number of tests performed for a particular feature) in order to quantify the quality of their software.</p>

<p>Once the QA testing is underway, there must be a finishing line. This is one of those things every software professional has seen at least once in his career: the deadline beads of sweat. Again, since more than half of todays software industry is testing <em>after</em> software development has completed, the following question (sadly) still remains important:</p>

<blockquote>
<p>What are the main criteria to complete testing?</p>
</blockquote>

<p><img alt="Test completion criteria" src="/media/images/test_complete.jpg" /></p>

<p>Again, I'm observing an ambivalency of quality ethics here. Shiny side: 85% of all companies prefer to have <em>all test cases</em> being performed. Even more, 80% think that <em>all features</em> have to be tested in order to complete a QA test run.</p>

<p>Nonetheless, there's the dark side as well: 59% (yes, it's the majority) state that their QA test is completed when the deadline is reached - <em>regardless</em> of the progress of their testing. Moreover, 37% of all participants just do the bare minimum, which is just to reach a given KPI or otherwise defined metric. Plus, 28% of the software industry have strict budgeting boundaries to software quality and testing.</p>

<h3 id="quality-assurance-tactics">Quality Assurance Tactics</h3>

<p>The one and only most used strategy to quality assurance hasn't changed since ages. It's simple and effective at the same time: <em>Reviews</em>. Yes, just Reviews. Espacially professional testers know that a solid review culture is key to stable and sustained quality assurance. Hence, it's good to see that "only" 25% of all seem to ignore this fact.</p>

<p><img alt="Reviews" src="/media/images/test_review.jpg" /></p>

<p>From all of those who actually perform reviews in their projects, the subsequent question raises a few interesting aspects:</p>

<blockquote>
<p>Which artifacts are regularly being reviewed in your project?</p>
</blockquote>

<p><img alt="Review Artifacts" src="/media/images/test_review_stuff.jpg" /></p>

<p>The interesting notion here in my opinion is: Albeit the most actively reviewed artifacts are the requirements, the least actively reviewed stuff is the <em>source code</em> itself. Second, one can observe that the more it gets 'concrete' in terms of classical phase-oriented engineering, the less it gets 'reviewed'.</p>

<p>From my point of view, this is quite a sad fact, since it shows that the gap between requirements and implementation both in terms of testing and in terms of domain knowledge seems to be quite large. The ultimate goal from my agile perspective would be that both requirements and code are being treated equal and subject to be reviewed at the same time.</p>

<p>Another interesting aspect is to focus conscious testing for different component abstraction levels:</p>

<blockquote>
<p>On which component level do you regularly perform your tests?</p>
</blockquote>

<p><img alt="Test levels" src="/media/images/test_levels.jpg" /></p>

<p>Obviously the good news here is: All levels are recognized to be tested rigorously. At all levels, the acceptance of <em>required testing</em> is above 60%. Overall, I'm quite happy with the status quo of test level application. Sure, we need more unit testing. But it's a rather unspoken truth that very few developers actually <em>really</em> do TDD and test first. </p>

<p>Most of the "TDD'ers" I happen to get busy with follow the "kids slide ride" behavior pattern: At start they aim very high and mentally climb up the slide, being enthusiastic and willingly, then their motivation slides down alongside with the duration and progress of the project. In consequence, they learn that both features and thousands of tests need attention, subsequently they happen to do TDD just sparingly when they "feel it's required".</p>

<p>Now don't get me wrong here. I'm not saying that everything should be TDD'ed. All I want to express is that most people aim too high at start when it comes to TDD. Instead of extensively praticing TDD at start and rarely doing it at end of a project, it's better to just do a fair and well-balanced TDD activity at all time. In consequence, you get more refactorings done, feel better troughout the whole project and even achieve a better test maintenance. That's all what I wanted to say.</p>

<p>The next relevant set of data to extract information and insights from surely is the degree of test automation for all levels mentioned above. Data has been gathered with the following question:</p>

<blockquote>
<p>How much is the percentage of automation on each test level compared to manual testing?</p>
</blockquote>

<p><img alt="Test level automation" src="/media/images/test_level_automation.jpg" /></p>

<p>No big surprises here. Unit Testing is the most automated component (or unit) level, followed by the wider component boundaries. It's not even a surprise to me that the degree of automation is quite low. Only one out of four unit tests (!) are automated. I don't even want to think about all the integration and system tests being performed manually over and over again. </p>

<p>Automation is both from economical as well as from efficiency perspective a key technology. I think that software companies or teams denying this fact have no bright future nowadays with aspiring competitors using a fast-paced development style.</p>

<p>Now let's focus on a widely unspectacular perspective of testing: Error reporting. The question asked to all participants of the survey was:</p>

<blockquote>
<p>If any failures are discovered during testing, how are they documented?</p>
</blockquote>

<p><img alt="Error reporting" src="/media/images/test_error_reporting.jpg" /></p>

<p>Undoubtedly, mostly errors are being filed in a bug or issue tracking system. What irritates me a little is that it seems that there's no momentum to further analyse or fix the failure. Surely, such activities depend on the severity and priority of the misbehavior observed. Yet, it seems to me that the focus on post-failure-discovery activities is solely on error reporting.</p>

<h3 id="quality-assurance-methods">Quality Assurance Methods</h3>

<p>It's a tradition in the testing field to categorize test methods into two main branches. The first, most often polished side of the methods medal is the <em>static checking</em>. Obviously, the flipside of the medal is the <em>runtime checking</em>. The survey covers both areas with a couple of interesting  findings. Let's start with the static part first.</p>

<blockquote>
<p>What are the mostly used static test methods in your company / project?</p>
</blockquote>

<p><img alt="Static testing methods" src="/media/images/test_static_methods.jpg" /></p>

<p>The number one method is the most foggy method as well: the infamous "informal" review at the desk (69%). This review can be one of the best and one of the worst methods at the same time. It highly depends on the focus, motivation, skill and professionality of the people involved. </p>

<p>Actually, the latter holds true for the following methods like Peer Reviews (41%) or "Walkthrough Reading" (45%). It's a little ashaming that formal reviews are not being valued that much. However, I'm personally quite happy that one out of three participants do value formal reviews (35%). I expected a much lower value.</p>

<p>Additionally, it's interesting to see which methods are actually performed using tools and automation techniques such as source code scanners and continuous integration services:</p>

<blockquote>
<p>What methods are being supported by software tools within your project?</p>
</blockquote>

<p><img alt="Static toolbased testing" src="/media/images/test_static_with_tools.jpg" /></p>

<p>Ok, the figures show very clearly that there's close to no innovation and insight within this specific field of testing. While 38% percent don't use any technology at all, 54% of all participants have a coding guideline and/or style checking tool running. At least 25% do collect some code metrics using static analysis tools. That's not completely what static checking is all about for me. It's not only code style and cyclomatic complexity. </p>

<p>Static analysis is hierarchy and artifact analysis, cohesive components, occurance of domain-related terms and of course <em>data structure analysis</em>. While most of the "usual" applications drive internal or external databases, they really seldomly get reviewed and are being statically checked against. Nonetheless, the results of this particular section are quite ok, me thinks.</p>

<p>Let's leave the static world and concentrate on the dynamic part of test methods. This part is in particular interesting for developers and testers with a focus on automation. The first question in this section of the survey adresses the strategies of runtime test development.</p>

<blockquote>
<p>What categories of dynamic tests are being developed in your company / project?</p>
</blockquote>

<p><img alt="Dynamic test categories" src="/media/images/test_dynamic_categories.jpg" /></p>

<p>Now this is a chart! The vast majority of testing is driven by specifications (88%) and experience (79%). The combination of good specification and long experience on the domain seems to be the foundation of nowadays testing. I'm quite surprised actually that experience-driven runtime testing is that much appreciated. Undoubtedly, domain experience is a factor to be taken into account as well. Nonetheless, it's not that <em>utterly indispensible</em> as the figures might suppose to alarm us.</p>

<p>I merely expected the structure-driven tests (48%) to be on a more or less on a same level of importance as the spec-driven tests. While specifications drive the <a href="http://en.wikipedia.org/wiki/Black-box_testing">blackbox</a> tests, the structure mostly drives the <a href="http://en.wikipedia.org/wiki/White-box_testing">whitebox</a> category of tests.</p>

<blockquote>
<p>What specification-driven test types do you perform regularly?</p>
</blockquote>

<p><img alt="Blackbox test types" src="/media/images/test_blackbox.jpg" /></p>

<p>Again, I'm feeling quite fine with the response to this question. We have functional tests with 82%, use case tests with 77% and boundary checks with 67% on the top, immediately followed by <a href="http://en.wikipedia.org/wiki/Equivalence_partitioning">equivalence partitioning</a> with 60%. To me, this is one of the best charts of the whole survey. The single notion of bitterness actually is that <a href="http://en.wikipedia.org/wiki/All-pairs_testing">pairwise testing</a> is not being used much (15%), although it actually can be a very efficient approach, especially when it comes to large combined sets or other combinatorial challenges.</p>

<p>That's from the blackbox side, now on to the whitebox side:</p>

<blockquote>
<p>What structure-driven test types do you perfom regularly?</p>
</blockquote>

<p><img alt="Whitebox test types" src="/media/images/test_whitebox.jpg" /></p>

<p>Well, most of the mentioned whitebox test types are most probably very familiar to those practicing <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a> or do some intensive unit testing in whatsoever manner. I just want to comment on two things here. Let's start with the scary thing first this time. Almost 40% of all participants <em>don't do any whitebox testing at all</em>. </p>

<p>Now let this sink for a minute. Got it? Yes, 40%! Almost <em>every second</em> of the professional software engineering companies don't care how their software works. They do care about the fact that the software works as intended, but don't seem to have a lot of interest in how this actually is being accomplished. This freaking scares me.</p>

<p>The second notable thing here is that if there's whitebox testing, call and branch checking are well established approaches. For TDD'ers this is as usual as breathing air, but for those <em>majority of non TDD'ers</em> it's sort of a speciality. Hence, it's a very positive thing that whitebox tests are being performed with well-known practices. </p>

<p>The key to successful whitebox testing is isolation and interchange of components. That's what makes structural testing sometimes hard. However, if I were to be asked, I'd surely would emphasize the importance of structural testing as a means to establish <em>flexible design</em> and <em>extensibility</em> of a program.</p>

<h3 id="conclusion">Conclusion</h3>

<p>Well, I don't want to dive into an in-depth analysis of the figures provided by the survey. Yet, let me just wrap up some facts and share some of my thoughts I had while reading the study.</p>

<p>First of all, it's noteworthy that <em>testing</em> nowadays is an overstressed word. <em>Testing</em> has so many meanings in software engineering - dependent on context and know-how. I think it's both necessary and useful to split the meaning of testing into two separate intentional areas.</p>

<p>The first area obviously is testing by means of <em>quality assurance</em>. This activity mainly focusses on <em>verification</em> of functionality. On the other hand, there's the wide area of testing by means of <em>requirements engineering</em>. This activity mainly focusses on the <em>specification</em> of functionality.</p>

<p>With regard to the <em>verification</em> activities, I perceive the current state of testing to be quite mature - both from a strategic and operational point of view. Although one can find areas of improvement, the entire view looks good to me. If I were to tell the most important areas of development, I'd bring the <em>insufficient degree of automation</em> as well as <em>rarely structured test cases</em> onto the table.</p>

<p>Sadly, the testing picture gets a lot darker when it comes to the <em>specification</em> side. My conclusion from the figures above is that testing as an equal partner of <em>requirements engineering</em> is not being widely recognized. That's not much of a surprise to me, since I even know a lot of self-proclaimed agilists who don't even know how testing fits into the requirements gathering view. The agile movement surely helps the whole industry to further develop this important aspect of testing. Yet, as of today very few professionals seem to follow that path.</p>

<p>This actually brings me to my next observation. Throughout the whole study, it seems to me as if <em>agility</em> finally got a serious recognition in software industry. However, I also get the impression that a lot of <em>agile methods</em> and <em>agility as a holistic approach</em> are not settled down to a level of well-known best practice. Instead a few methods seem to be practiced rather half-hearted. Even more, <em>agility</em> as a <em>methodology</em> influencing all testing activities seems to be close to non-existent. Keep in mind: the survey is from <em>last year</em> (2011), and we're talking about countries being on the top of the <em>information technology society</em>.</p>

<p>I want close my brief conclusion with my perception that testing seems to be still undervalued in nowadays projects. Undervalued in terms of importance to the overall project success, for sure. Plus, undervalued with respect to the activities from all project members. Regardless wether it's a testing professional, the product manager, the user interface designer or the software engineer. Testing should be recognized, valued and performed as a <em>cross-functional concern</em>. The sad truth is: it isn't.</p>

<p>Finally, I want to thank the <a href="http://www.german-testing-board.de">german</a> and <a href="http://www.software-tester.ch/stb.html">swiss</a> testing boards as well as <a href="http://www.hs-bremerhaven.de/Karin_Vosseberg.html">involved</a> <a href="http://www.informatik.hs-bremen.de/spillner/">university</a> <a href="http://www.gm.fh-koeln.de/~winter/">forces</a> for their valuable and very insightful work. Please continue your amazing work! The complete study results can be found at <a href="http://softwaretest-umfrage.de">http://softwaretest-umfrage.de</a> - it's surely worth diving into the detailed results of the study if you want to know more about the current state of affairs in software testing.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Code Kata Scoreboard</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/code-kata-scoreboard.html"/>
            <updated>2012-06-28T00:30:00Z</updated>
            <published>2012-06-28T00:30:00Z</published>
            <id>/code-kata-scoreboard.html</id>
            
            <content type="html"><![CDATA[
                <p>This week we had a <a href="dotnet-coding-dojo.html">Coding Dojo in Munich</a> and let me just start by saying that it was real funny and challenging at the same time. That by itself is a nearly regular thing for Coding Dojo's. Yet, this time we had some extra fun and extra challenge thanks to a special Code Kata developed for the Dojo. The kata I'm talking about is <em>Scoreboard</em>.</p>

<p>Before I continue on describing the kata, let me give credits to the original inventor of the kata. Just the very same as it was with the incredible <a href="code-kata-pickakin.html">PickAkin</a> kata, this kata was not my idea but the idea of smart people around me. The kata was invented specifically for this Coding Dojo by <a href="http://dwcg-consulting.de/">Dennis Wagner</a>, who is a regular Dojo participant in Munich for over a year. Since the <a href="http://www.uefa.com/uefaeuro/index.html">UEFA Euro 2012</a> Football Championship is being played this summer, he thought if it was possible to integrate this topical theme into our Dojo activities. The very successful result of this attempt is in fact the <em>Scoreboard</em> kata.</p>

<p>At our Coding Dojo, we had three teams tackling the kata and to all our surprise the kata turned to be a very good source for interesting questions and approaches within the field of OO Design, type layout and test structuring. I wholeheartedly can recommend this Code Kata to anyone. Enjoy!</p>

<h3 id="scoreboard">Scoreboard</h3>

<p>You are an aspiring mobile developer who just got a little product description from a very big organization to develop an App for. The name of the organization is no less than the great <a href="http://www.uefa.com/">UEFA</a> himself, asking you to develop an App which is able to display <em>Scoreboards</em> of groups for the Euro 2012 Championship. As an added feature, the App should be able to display Scoreboards for not only the actual match results, but any "custom" match results the user may enter.</p>

<p>As one of the first and most important things, you need to develop the scoring rules. It's crucial that the scoreboards actually display positions of teams <em>without any error</em>. Therefore, the official scoring system of the UEFA needs to be implemented. The scoring rules are described in detail in the official <a href="http://www.uefa.com/multimediafiles/download/competitions/euro/91/87/57/918757_download.pdf">Regulations of the Euro 2012</a> Football Championship, Section 8.</p>

<p>As a nice to have suggestion, the sponsor of the UEFA would be very pleased if your implementation of the scoreboard rule system would be flexible and interchangable, so that regularatory changes or even different rules from other tournaments such as the FIFA World Championship could be applied.</p>

<p>To verify the core functionality of the scoreboard, you may now use the results of Group A from Euro 2012:</p>

<h4 id="matchresults">Matchresults</h4>

<table>
<thead>
<tr>
<th>Team I</th>
<th>P</th>
<th>P</th>
<th>Team II</th>
</tr>
</thead>
<tbody>
<tr>
<td>Poland</td>
<td>1</td>
<td>1</td>
<td>Greece</td>
</tr>
<tr>
<td>Russia</td>
<td>4</td>
<td>1</td>
<td>Czech</td>
</tr>
<tr>
<td>Greece</td>
<td>1</td>
<td>2</td>
<td>Czech</td>
</tr>
<tr>
<td>Poland</td>
<td>1</td>
<td>1</td>
<td>Russia</td>
</tr>
<tr>
<td>Greece</td>
<td>1</td>
<td>0</td>
<td>Russia</td>
</tr>
<tr>
<td>Czech</td>
<td>1</td>
<td>0</td>
<td>Poland</td>
</tr>
</tbody>
</table>

<p>The matches listed have been played in order from top to bottom.</p>

<h4 id="scoreboard_1">Scoreboard</h4>

<table>
<thead>
<tr>
<th>Team</th>
<th>Played</th>
<th>Won</th>
<th>Drawn</th>
<th>Lost</th>
<th>For</th>
<th>Against</th>
<th>Diff</th>
<th>Points</th>
</tr>
</thead>
<tbody>
<tr>
<td>Czech</td>
<td>3</td>
<td>2</td>
<td>0</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>-1</td>
<td>6</td>
</tr>
<tr>
<td>Greece</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>4</td>
</tr>
<tr>
<td>Russia</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>5</td>
<td>3</td>
<td>2</td>
<td>4</td>
</tr>
<tr>
<td>Poland</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>-1</td>
<td>2</td>
</tr>
</tbody>
</table>

<p><em>Enjoy!</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Rosa-Rote Positive Formulierung</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/rosa-rote-positive-formulierung.html"/>
            <updated>2012-06-27T10:00:00Z</updated>
            <published>2012-06-27T10:00:00Z</published>
            <id>/rosa-rote-positive-formulierung.html</id>
            
            <content type="html"><![CDATA[
                <p>Zu meiner eigenen Überraschung hat mein letzter Artikel zum Thema <a href="burnout-und-anerkennung.html">Burn-Out und Anerkennung</a> viele Reaktionen und Feedback nach sich gezogen. Ich habe mehrere Emails erhalten und Tweets zu meinem Post gelesen. Das Thema scheint wirklich viele Gemüter zu bewegen.</p>

<p>Unter den öffentlichen und persönlichen Reaktionen gab es auch ein Statement eines von mir geschätzten Coaching-Kollegen. Nach dem Lesen des Artikel schrieb er mir:</p>

<blockquote>
<p>Schöne, wichtige Worte. Ich würde es aber umkehren: "Lob kann Burn-Out verhindern"</p>
</blockquote>

<p>So sehr ich mich über diese warmen Worte gefreut habe, habe ich mich auch über die Umkehrung der Aussage gewundert. Das liegt an mehreren Gründen, die ich nun versuchen möchte verständlich darzulegen.</p>

<p>Doch vorab sei noch vorangestellt, das ich persönlich schon sehr durch "positive Umkehr-Formulierungen" geprägt bin. Das liegt einerseits daran, dass ich dieses Mittel selbst als Berater ab und an anwende, andererseits aber auch daran, dass ich selbst oft von anderen Kollegen und Beratern mit diesem Tipp konfrontiert wurde. Es ist wirklich erstaunlich, dass ich in den letzten Monaten mindestens ein Dutzend Mal darauf hingewiesen wurde, meine Aussagen doch "positiv umzuformulieren". Viel weniger erstaunlich ist allerdings, dass diese netten Hinweise fast ausschließlich von Coaches oder Beratern kamen.</p>

<h3 id="schon-sprechen">Schön Sprechen</h3>

<p>Ich finde es wichtig, das man seinem Gegenüber beim Gespräch eine kultivierte und respektvolle Wortwahl entgegnet. Das Wort <em>Wortwahl</em> sagt auch schon, worum es hier eigentlich geht: Die richtigen Worte finden, um die richtigen Dinge zu sagen. Oft ist es leider noch notwendig, Gesprächspartner bei Konferenzen oder anderen Unterredungen darauf hinzuweisen, das die eigenen Standpunkte mit einer achtungsvollen Gesprächskultur an Gewicht gewinnen. Insofern empfinde ich auch Hinweise zu einer bewußten Wortwahl gleichermaßen richtig und wichtig.</p>

<p>Bei aller Liebe zu kultiviertem Austausch kann man es aber meiner Meinung nach auch übertreiben. Mehr noch, ich empfinde eine übermäßig auf Wertschätzung orientierte Kommunikation oft als künstlich, gestelzt und wenig authentisch. Darüber hinaus kommt es viel zu oft vor, dass die angewendete "Wortakrobatik" für mich den Sinn der eigentlichen Aussage verschleiert - ja sogar verfälscht.</p>

<p>So ein ähnliches Gefühl beschlich mich auch, als ich den obigen Kommentar meines geschätzten Coaching-Kollegen las. In meinem Artikel zu <a href="burnout-und-anerkennung.html">Burn-Out und Anerkennung</a> zitierte ich einen von mir sehr geachteten Zeitgenossen. Er sagte:</p>

<blockquote>
<p>Die Leute bekommen Burn-Out, weil sie keine Anerkennung bekommen.</p>
</blockquote>

<p>Eine für mich klare und direkte Aussage, die ich schnell erfassen kann. So. Und hier nun der "Verbesserungsvorschlag" meines Bekannten im direkten Vergleich:</p>

<blockquote>
<p>Lob kann Born-Out verhindern.</p>
</blockquote>

<p>Hört sich mindestens genau so klar und direkt an. Doch in Wirklichkeit ist es das aus meiner Sicht keinesfalls. Ich fasse diese Umformulierung der Original-Aussage eher als künstlich, verharmlosend und irreführend auf.</p>

<h3 id="abstrakte-authentizitat">Abstrakte Authentizität</h3>

<p>Meiner Meinung nach steckt in der Umformulierung ein gut gemeinter Wille, welcher sich im abstrakten Mantel der Wortakrobatik wie ein Clown zu fühlen scheint. Betrachtet man die Umformulierung mal genauer, fällt auf, das durch die Umformulierung die Aussage mindestens logisch verfälscht wurde. Während die erste Aussage klar ausdrückt, dass <em>fehlende Anerkennung</em> zu einem Burn-Out führen kann, verliert es kein Wort darüber, ob eine nicht fehlende Anerkennung einen Burn-Out verhindern kann.</p>

<p>Darüber hinaus zweifle ich persönlich auch an der Aussage. Ich glaube nicht, dass Lob als eine Präventiv-Maßnahme gegen Burn-Out darstellen kann und soll. Vielmehr ist es so, dass fehlende Anerkennung alleinig keinen Burn-Out verursachen kann und somit Anerkennung auch keinen Burn-Out verhindern kann. Die Logiker unter uns werden spätestens jetzt im Kopf den Begriff <em>"hinreichend"</em> in Leuchtbuchstaben grellend blinken sehen.</p>

<p>Oft werden ja gerade solche Argumentationen als nickelig und pingelig abgetan. Doch es ist nicht nur die Logik, die hier meiner Meinung nach ein wenig quer steht. Eine positive Umformulierung ist für mich wie eine verbale Gratwanderung, bei deren Anwendung und Umsetzung Vorsicht geboten ist. Schnell kann der konstruierte Positivismus nicht nur Akzeptanzgrenzen senken, sondern die Gesamtaussage all zu stark verharmlosen.</p>

<p>Auch im obigen Beispiel wurde meines Erachtens durch die positive Formulierung die Kernaussage verharmlost. Der Knackpunkt ist hier das klare darstellen des <em>Mangels</em> als Faktor für einen möglichen Burn-Out. Die positive Umkehrung rückt diesen Umstand so sehr in den Hintergrund, das er kaum bis gar nicht mehr erkannt werden kann. In Konsequenz steht die Verharmlosung der Aussage in positivem Wortgewand.</p>

<h3 id="exemplarische-eklatanz">Exemplarische Eklatanz</h3>

<p>Gerade diese Effekte der Verharmlosung und Verfälschung können sich in ungewollte kognitive Bahnen verlieren. So kann es in Folge des überspitzten Positivsmus zu einer Umkehrung der ursprünglich anvisierten Akzeptanzgrenzensenkung kommen. Es kann beim Empfänder nicht nur die Wahrnehmung der mangelnden Ernsthaftigkeit der Aussage entstehen, sondern sogar eine herablassende und wertmindernde Partnerprojektion verursachen.</p>

<p>Den Inhalt dieser komplizierten Sätze kann man natürlich auch einfacher darstellen - und das sollte man auch. Zum Beispiel so:</p>

<p>Eine positive Umformulierung kann dazu führen, das der Empfänger denkt, er werde vom Sender nicht Ernst genommen. Mehr noch, er könnte daraus schließen, das er nicht wichtig genug ist, um auch mit ernsten und klaren Worten wichtige Themen zu besprechen.</p>

<p>Das klingt doch schon deutlich besser, oder nicht? Ich denke schon. Und das ist es auch, was ich anmahnen möchte - mehr Klarheit und eine Kommunikation auf Augenhöhe, anstatt verschnörkelter und künstlicher Positivstützen, die Aussage und Authentizität verschleiern. Wir als Kommunikationspartner möchten wenn möglich vom Gegenüber als "voll" und "erwachsen" angenommen werden - nicht als ein zartes Rehlein, welches sich durch negative Sprachfetzen wie "fehlend" oder "nicht geeignet" sich verschreckt in die Mär der glänzenden Wortwolken des hellblauen Optimismushimmels zurückzuziehen wünscht.</p>

<p>Überspitzte verbale Positivwendung ist mir offen gesagt öfters ein Dorn im Auge. Nicht nur, weil ich selbst immer wieder angemahnt werde, "mich doch positiver" auszudrücken, sondern weil ich es immer öfters in Meetings und Gesprächen zu hören bekomme. Diese Unnatürlichkeit und gestelzte - ja oftmals schlecht gekonnte - Psychokrücke ist mir zuweilen viel zu viel des "Guten". So weichgespült, wie viele mittlerweile in unserem Job reden, reden nicht einmal Erzieher mit Jugendlichen, Eltern mit Kindern, oder sogar Großeltern mit Enkeln.</p>

<p>Man stelle sich nur mal vor, es stünde auf dem Schild zu einem Militärgelände nicht mehr <em>"Nicht Betreten! Lebensgefahr!"</em>, sondern <em>"Für ein sichereres Leben wird empfohlen dieses Gelände zu meiden."</em>.</p>

<h3 id="optimist-und-realist">Optimist und Realist</h3>

<p>Für mich ist es wichtig, sowohl optimistisch als auch realistisch an Aufgaben und Menschen heranzutreten. Obgleich ich selbst - wie schon Eingangs erwähnt - auch ab und an eine bewußt positive Formulierung einer Aussage bevorzuge, stelle ich mich mindestens genau so oft einer eben solchen Umformulierung kritisch entgegen. Im Zweifel zählt für mich die Natürlichkeit und Authentizität der Aussage. </p>

<p>Eine kultivierte, wertschätzende Kommunikation ist ein hohes Gut. Eine unmissverständliche und klare Kommunikation jedoch mindestens von ebenbürtigem Wert. Künstlicher Positivismus stellt sich in meiner Erfahrung öfters als ein Indiz von mangelnden Handlungs- und Argumentationsoptionen dar als ein unterstützendes Mittel für verständnisvollere Aussagen.</p>

<p>Lieber natürlich optimistische und offen realistische Worte, als künstlich positive und schwammig weichgespülte Worthülsen. Auf gleichermaßen respektvolle und ernsthafte Weise.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Burn-Out und Anerkennung</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/burnout-und-anerkennung.html"/>
            <updated>2012-06-19T19:00:00Z</updated>
            <published>2012-06-19T19:00:00Z</published>
            <id>/burnout-und-anerkennung.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist wieder einmal Zeit für ein Thema, welches viel zu selten angesprochen und bedacht wird. Darüber hinaus auch noch eines, welches mit Mythen, Verharmlosungen und falschen Wahrnehmungen umnebelt wird wie kaum ein anderes: <a href="http://de.wikipedia.org/wiki/Burnout-Syndrom">Burn-Out</a>.</p>

<p>Ich werde jetzt nicht auf alle möglichen Gründe, Ursachen oder irgendwelchen Umstände eingehen, die zu einem Burn-Out führen. Das könnte ich mir auch gar nicht anmaßen, denn ein <em>Burn-Out</em> ist eine ernsthafte und individuell sehr stark variierende Angelegenheit. Auch der Umgang und die Behandlung eines Burn-Outs sind nicht im Vordergrund dieses Artikels. Es geht "nur" um eine ganz bestimmte Perspektive: die Korrelation zwischen Anerkennung und Burn-Out.</p>

<h3 id="anmerkung-zum-anlass">Anmerkung zum Anlass</h3>

<p>Ich habe vor genau einer Woche die wahrhaftige Ehre gehabt, mit einem von mir sehr geschätzten und bewunderten Zeitgenosssen ein kurzes Gespräch zu führen. Ich kannte ihn vorher kaum - sozusagen nur vom 'Hörensagen'. Wir unterhielten uns über sein Geschäft, seine Dienstleistungen und über manche außergewöhnlichen Rahmenbedingungen seiner Aufgabe. Nichts besonderes - weder für ihn, noch für mich. Nach einer Weile redeten wir über unsere Erfahrungen und Bekanntschaften im Beruf. So kam auch das Thema Burn-Out auf den Tisch. Ohne zu zögern sagte er fest entschlossen zu mir:</p>

<blockquote>
<p>Die Leute bekommen Burn-Out, weil sie keine Anerkennung bekommen.</p>
</blockquote>

<p>Dieser Satz hat mich von Anfang an nachdenklich gestimmt. Ich versuchte es mir nicht anmerken zu lassen und habe ein paar Worte und meine Auffassung zu dem Thema verloren. Danach wechselte er zügig zu einem anderen Thema - womöglich, um sich selbst und mir eine tiefere Behandlung des Themas zu ersparen.</p>

<p>Seit diesem Gespräch habe ich öfter über diese Aussage gegrübelt und mir einige Fragen gestellt:</p>

<ul>
<li>Inwieweit hat mangelnde Anerkennung einen Bezug zu Burn-Out?</li>
<li>Welche Konsequenzen kann fehlende Anerkennung haben?</li>
<li>Warum kommt es zu mangelnder Anerkennung?</li>
</ul>

<p>und noch einige weitere. Als ich darüber nachdachte stellte ich schnell fest, dass das Thema der <em>fehlenden Anerkennung</em> viel zu sehr unterbelichtet wird. Ja, irgendwie habe ich sogar das Gefühl, das es oftmals unter den Teppich gekehrt wird.</p>

<h3 id="analyse-der-anerkennung">Analyse der Anerkennung</h3>

<p>Ich möchte mich dem Thema der <em>Anerkennung</em> mit meinen eigenen Erfahrungen nähern. Ich habe in meinem bisherigen Berufsleben viel Anerkennung für meine Leistungen bekommen. Gerade zu Beginn meines Berufslebens hatte ich das Glück, viele Kollegen und Kunden um mich herum zu haben, die mich durch Zuspruch und Lob gestärkt haben. Manche Worte und Situationen sind heute noch sehr präsent, wenn ich mich an sie zurück erinnere.</p>

<p>Doch es gab auch die Kehrseite. Es gab Situationen, in denen ich hart gearbeitet und gekämpft habe - und keine Anerkennung bekommen habe. Mehr noch, ich wurde manchmal sogar für meine Leistungen und Erfolge getadelt. Ich konnte ackern, reden, kämpfen, überzeugen und leiden wie ich will, doch gerade die mir wichtigen Bezugspersonen, wie mein damaliger Vorgesetzter oder einige meiner Teammitglieder, hatten kein gutes Wort für mich übrig. </p>

<p>Ich räumte die Datenzugriffsschicht auf, ich verbesserte den Continuous Build, ich motivierte Mitarbeiter, ich bat Fortbildungen an und ich schrieb ein 80-seitiges Konzept über verbessertes Konfigurationsmanagement mit dem Ziel, dass sich die damalige Entwicklungs- und Systembetriebs-Abteilung einfach beser verstehen können. Ich bekam von einigen Zuspuch - doch von anderen genau das Gegenteil: Hähme, Neid und haltlose Kritik. Ich weiß durch Erzählungen Bekannter und Kollegen, dass ich mit Sicherheit nicht der einzige bin, dem so etwas - oder etwas ähnliches - in seinem Berufsleben wiederfährt. </p>

<p>Damals wurde mir gesagt, ich solle meine Ansprüche an mich und das Team nicht so hoch stellen. Ich sei "zu professionell" und ich solle meine Leidenschaft und Emotionen in den Hintergrund stellen. All das wertete ich nicht als Anerkennung, sondern eher als Tadel.</p>

<p>Mit der <em>Bewertung</em> möchte ich auch meine Analyse zur Anerkennung beginnen. Denn Anerkennung ist keine statische, feste Aussage. Es ist auch kein Gütesiegel, welches man verbal oder anderweitig seinem Gegenüber ausstellt. Anerkennung ist die <em>Wahrnehmung</em> des Gegenüber über die <em>Bewertung</em> seiner Leistung durch Dritte. In diesem Sinne habe ich die Bewertungen der Anderen in meinem obigen Beispiel als <em>Tadel</em> wahrgenommen. In wie weit das auch so gewollt wahr, möchte ich an dieser Stelle gar nicht weiter ausleuchten.</p>

<p>Diese Wahrnehmung des <em>Tadels</em>, der <em>Gleichgültigkeit</em> bzw. <em>Wertlosigkeit</em> meiner Leistungen, die ich wiederum als als hart erkämpft, schweißtreibend und angemessen betrachtete, führte zu vielschichtigen Emotionen. Ich war enttäuscht, ich war natürlich auch verärgert und gekränkt. Eine emotionale Mischung aus <em>"euch (Kritikern) zeige ich es noch!"</em>, <em>"war das (meine Leistung) wirklich so schlecht?"</em> und <em>"wieso (und für wen) mache ich das eigentlich?"</em> machte sich in mir breit.</p>

<h3 id="wirkung-der-anerkennung">Wirkung der Anerkennung</h3>

<p>Womit ich auch schon zur Wirkungsanalyse gekommen bin. Die Konsequenzen der fehlenden Anerkennung können sehr vielschichtig und vehement sein. Eine fehlende Anerkennung kann mindestens genau so prägend sein wie Lob und Zuspruch. Während oftmals nur die ernstgemeinte Anerkennung die Persönlichkeit stärkt, kann schnell ungewollte fehlende Anerkennung die Persönlichkeit schwächen.</p>

<p>Bei meinem oben genannten persönlichen Fall habe ich den Mangel der Anerkennung durch verschiedene Maßnahmen verarbeitet. Ich habe z.B. meine Leistungen anderen Bezugspersonen dargelegt und sie um Ihre Bewertung gebeten. Ich habe (nach langem Zögern) bestimmte Maßnahmen in anderen Teams <em>einfach nochmal durchgeführt</em>. Ich habe mich auch bei anderen Tätigkeitsfeldern engagiert und habe dort die Anerkennung gesucht, die ich vormals nicht bekam. Ich habe auch einigen, die mir Ihre Anerkennung aus meiner Sicht verwehrten, mit meinen Gefühlen, meiner Verärgergung und Enttäuschung konfrontiert und Ihnen gesagt, wieso ich so fühlte.</p>

<p>Ich kann mir noch heute kein Urteil darüber machen, ob ich nun die richtigen Mittel zur Verarbeitung gewählt habe oder nicht. Offen gesagt habe ich auch keinen Drang danach. Ich habe es nun mal so verarbeitet. Ich richte meinen Blick dort hin, wo meine Aufmerksamkeit gebraucht wird und ich diese für mich auch als richtig empfinde. Dennoch kann ich mit gutem Gewissen sagen, dass ich es für mich aufgearbeitet habe und nun in einer etwas seltsamen Art und Weise sogar Kraft aus dieser Erfahrung schöpfe.</p>

<p>Doch die Frage der Vehemenz und Verarbeitung der Auswirkungen fehlender Anerkennung bleibt im Raum. Es lohnt sich, hier die Brücke zu der Ausgangsaussage zu schlagen: Kann es wirklich sein, dass fehlende Anerkennung eine Ursache für Burn-Out ist? Ich persönlich denke schon, das ein starker Mangel an Anerkennung - also eine destruktive, die Seele geradezu quälende Gleichgültigkeit des Gegenüber zu der eigenen Arbeit oder Meinung - ein signifikanter Faktor für Burn-Out sein kann.</p>

<p>Die <em>emotionale Erschöpfung</em> und die sich daraus ergebende <em>Depersonalisierung</em> sowie der <em>Selbstzweifel</em> können für manche Persönlichkeiten zu einem gravierenden Problem werden. Die "Vorhut" einer solchen emotionalen Talfahrt kann sich durch starke Kritik, vehementen Druck oder fehlende Bestätigung ankündigen. Gerade eine mangelnde Anerkennung kann der Zündfunke für einen größeren emotionalen Brand werden, der sich unter bestimmten Umständen sogar zu einem Flächenbrand - dem Burn-Out - ausweiten kann.</p>

<h3 id="erkenne-und-anerkenne">Erkenne und Anerkenne</h3>

<p>Nach einer ersten gedanklichen Aufarbeitung kann ich meinem Gesprächspartner von letzter Woche nur beipflichten. Ich denke, seine kurz und fast schon beiläufig gesagten Worte haben viel Wahrheit und Tiefe in sich:</p>

<blockquote>
<p>Die Leute bekommen Burn-Out weil sie keine Anerkennung bekommen.</p>
</blockquote>

<p>Als Fazit bleibt für mich, das ich den Wert des Erkennens und Anerkennens nun noch bewußter wahrnehme als ich es schon vorher tat. Ich bin vor einigen Monaten von einem alten Kollegen als 'Motivationsmaschine' bezeichnet worden. Dieses absolut übertriebene, so gar nicht im mein Selbstbild passende Kompliment, verstehe ich als Anerkennung gegenüber meiner eigenen Umsetzung der Anerkennung der Leistung Anderer. Ich gebe auch gerne zu: diese Anerkennung war für mich Bestätigung, Balsam und Bereicherung. Genau das ist es, was uns als Menschen hilft, motiviert und stärkt. </p>

<p>Es stärkt uns, Kritik anzunehmen und zu verarbeiten. Es motiviert uns, weiter wichtige und neue Wege zu gehen. Es hilft uns, anderen eine Hilfe und Stütze zu sein.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile und Scrum</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-und-scrum.html"/>
            <updated>2012-06-18T09:00:00Z</updated>
            <published>2012-06-18T09:00:00Z</published>
            <id>/der-agilist-agile-und-scrum.html</id>
            
            <content type="html"><![CDATA[
                <p>In diesem Interview der Serie der <a href="der-agilist.html">Agilisten</a> geht es um <em>Scrum</em>. Während sich mein letztes Interview mit der Rolle des Scrum Masters auseinandergesetzt hat, ist dieses weiter gefasst und beschäftigt sich mit Scrum im Allgemeinen. Es ist meines Erarchtens besonders wichtig, dieses Management-Modell für sich zu durchleuchten. Es ist zweifelsohne das beliebteste und am meisten angewendete agile Vorgehen. Ja, mancherorts wird Scrum leider sogar als das einzig agile Vorgehen wahrgenommen. Grund genug, um sich ganz besonders dem Thema Scrum zu widmen.</p>

<h3 id="im-interview-christoph-mathis">Im Interview: Christoph Mathis</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_krishan.jpg" />
Ich kann es in Worte kaum formulieren, wie sehr es mich freut, zum Thema Scrum eine der erfahrensten Persönlichkeiten Deutschlands im Interview zu haben. Er verkörpert schlechthin <em>die Definition</em> eines agilen Experten für Scrum als Software-Entwicklungs-Methodik. Ich bin besonders froh, dass ich mich mit keinem geringeren als <a href="http://improuv.com/de/blogs/christoph-mathis">Christoph Mathis</a> von <a href="http://www.improuv.de">improuv</a> über Scrum austauschen darf. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Christoph. Was machst Du beruflich?</p>
</blockquote>

<p>Ich bin Scrum Coach und Scrum Trainer bei der improuv GmbH.</p>

<blockquote>
<p>Welches sind Deine Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p>Ich helfe Teams, sich kontinuierlich zu verbessern und effektiv und zuverlässig zu liefern. Ich helfe darüber hinaus Firmen bei der agilen Transformation, um sich im Wettbewerb zu verbessern und ihren Mitarbeitern einen produktiven und angenehmen Arbeitsplatz zu bieten.</p>

<blockquote>
<p>Welches sind Deiner Meinung nach die stärksten Argumente für Scrum als Entwicklungs-Methode?</p>
</blockquote>

<p>Scrum schafft es meiner Meinung nach, den Spagat zwischen zwei Zielen herzustellen: Auf der einen Seite haben wir die Produkt-Entwicklung, also die Eigenschaften und Anforderungen eines Produktes, welches umgesetzt werden soll. Auf der anderesn Seite haben wir die Software-Entwicklung, also die Umsetzung von Fachlichkeiten in Software durch vielschichtige Kompetenzen, wie z.B. Design, Programmierung, Test und weiterem.</p>

<p>In Scrum werden diese Positionen durch den Product Owner und das Team vertreten und damit in einem Verfahren vereint. Das hat wiederum auf der einen Seite einen 'technischen' Aspekt, und andererseits einen organisatorischen Aspekt. Die technische Perspektive spiegelt sich in den Sprints als geschützten Entwicklungsraum für das Team und in dem PO als verlässliche fachliche Instanz wider. Der organisatorische Aspekt ist komplexer und kann in erster Linie in den klaren Rollen und den ausgewogenen Machtverhältnissen innerhalb des Modells erkannt werden.</p>

<blockquote>
<p>Manche Teams implementieren Scrum zügig, andere wiederum scheitern daran. Woran liegt das?</p>
</blockquote>

<p>Hmm, nun, das interessante an Scrum ist unter Anderem, dass es mehrere 'Ebenen' des Verfahrens gibt. Die erste, sehr sichtbare Ebene ist die Regel-Ebene. Sie ist einfach zu vermitteln und zu verstehen. Scrum hat relativ wenige und ziemlich deutliche Regeln. Dieses Regelwerk lässt sich innerhalb von 10 Minuten darlegen.</p>

<p>Doch dabei kann es nicht bleiben, denn Scrum hat eine weitere, tiefere Ebene, nämlich die der Prinzipien und Werte. Diese Ebene ist deutlich schwerer zu vermitteln und auch zu begreifen. Die Umsetzung dieser Ebene ist ein starker Erfolgsfaktor für Scrum und das Projekt, in dem es eingesetzt wird. Diese Prinzipien- und Wertevermittlung erfolgt meist individuell, breitet sich jedoch selbstverständlich auf das Team und die Organisation aus.</p>

<p>Ein schönes Beispiel ist die des "Hero-Entwicklers". In vielen Teams gibt es den senioren und außerordentlich kompetenten Entwickler, der anscheinend alles kann und schafft. Setzt dieser seine Fähigkeit für die Entwicklung des Teams ein, ist es für die Agilität des gesamten Projektes vorteilhaft. Setzt er es jedoch durch "Heldentaten" für die eigene Profilierung ein, hat das Projekt nachhaltig daduch keinen Mehrwert erhalten.</p>

<p>Ein weiterer, wichtiger Punkt, warum oft Scrum-Teams scheitern, ist schlicht und einfach die schlechte Technik der Software-Entwicklung.  Scrum ist ein Rahmenwerk, welches keine Aussage zu Software-Entwicklungs-Techniken macht. Gerade deswegen ist es möglich, Scrum mit schlechten Entwicklungs-Methoden zu betreiben. Erfolgreich ist das allerdings nicht. Scrum kann schlechte Entwicklungs-Methoden nicht besser machen. Diese Erkenntnis setzt voraus, das man sich bei der Anwendung von Scrum auch intensiv mit agilen Software-Entwicklungs-Methoden auseinandersetzen muss.</p>

<p>Scrum gibt einer produktorientierten Organisation die Mittel in die Hand, einen validen Fortschrittsbericht über die Entwicklung zu erhalten und zu nutzen. Dieses sehr wichtige Element wird in Ihrer Aussagekraft allerdings stark geschmälert, wenn im Inneren des Verfahrens qualitativ ungenügend oder unprofessionell gearbeitet wird. Gerade hier ist es notwendig, dass sich Organisationen auch mit valider Bewertung und einer konstruktiven Bewertungskultur auseinandersetzen.</p>

<blockquote>
<p>Ist Scrum sowie deren Rollen eine echte Alternative für die Unternehmensorganisation?</p>
</blockquote>

<p>Ich bezweifle, dass Scrum sich auf einer reinen organisatorischen Ebene noch effektiv umsetzen lässt. Ich befürchte, das sich dadurch die Wirkmechanismen von Scrum als auch das Verfahren selbst verfremden können.</p>

<p>In gleichem Maße kenne ich allerdings Organisationsentwicklungen, die via Scrum umgesetzt werden. Ein gutes Beispiel sind sicherlich die Transition-Teams, die sowohl auf einer organisatorischen als auch auf einer technischen Ebene an der Einführung von Scrum in die Organisation arbeiten. Naturgegeben sieht man bei solchen Anwendungen schon adaptive Veränderungen des Scrum-Verfahrens.</p>

<p>Z.B. wird manchmal die Rythmik im Transition-Team justiert (Stichwort: Daily), in anderen Fällen werden auch traditionelle Change-Management-Elemente mit eingebracht. Das ist sehr individuell von der Organisation und Kultur des Unternehmens abhängig. Ein weiterer, schwieriger Umsetzungspunkt für Scrum innerhalb der Organisationsentwicklung ist z.B. die <em>Definition of Done</em>. Bei einem technischen Projekt ist die DoD meist sehr klar greifbar. In der Organisationsentwicklung ist eine <em>Definition of Done</em> jedoch wesentlich schwieriger zu erfassen.</p>

<blockquote>
<p>Gibt es klare Indizien, wann und wo Scrum nicht angewendet werden sollte?</p>
</blockquote>

<p>Nun, es gibt natürlich auch viele Bereiche, in denen Scrum als Mittel gar nicht gebraucht wird. Ein schönes Beispiel ist die Schadenssachbearbeitung bei einer Versicherung. Dort gibt es wenig Variations-Spielräume in der Sache und wenig Entwicklungsbedarf. Solche Prozesse funktionieren mit SixSigma sicherlich ganz gut.</p>

<p>Es gibt darüber hinaus auch Bereiche, die eine starke Ereignisorientierung aufweisen. Man kann sich dabei z.B. ein Wartungs- oder Support-Team vorstellen, welches stark unvorhergesehene Ereignisse wie Geräteausfall oder ähnliches abwickelt. Solche Arbeitsbereiche werden meiner Meinung nach auch wenig von Scrum profitieren können.</p>

<p>Scrum ist viel eher für Situationen und Projekte geeignet, in denen komplexe Systeme erstellt werden müssen, in denen kreative Leistung und Lösung gefordert wird, in denen man Stück für Stück Produkte neue erschaffen oder weiter gestalten möchte.</p>

<blockquote>
<p>Unlängst erfreut sich neben Scrum auch Software-Kanban steigender Beliebtheit. Wo liegen Deiner Meinung nach die größten Unterschiede beider Verfahrensmodelle?</p>
</blockquote>

<p>Scrum beruht auf einem zweigeteilten Planungsmodell. Der Produkt Owner treibt und definiert das Produkt; das Team ist in der Verantwortung der Umsetzung mit allen Facetten. Obgleich die Planung hier zweigeteilt ist, ist sie sehr klar und dediziert im Verfahren verankert. Es ist meines Erachtens wichtig zu erkennen, das diese Verteilung der Planungsverantwortung gegenseitige Autonomie im jeweiligen Bereich nach sich zieht. Während der Product Owner die Autonomie der Produktgestaltung inne hält, hat das Team die Autonomie über die Produktumsetzung.</p>

<p>Kanban lässt sich jedoch auch völlig ohne die Autonomie des Teams umsetzen. Das ist nicht zwingend der Fall, kann aber durchaus so umgesetzt werden. Diese Möglichkeit eröffnet den Anwendern von Kanban, den vertrampelten und morschigen Pfad des Command and Control zu gehen. Neben den Agilisten unter den Kanban-Anwendern gibt es zu meinem Bedauern viele Kanban-Anwender, die keineswegs agil arbeiten oder arbeiten wollen. Das ist gerade für die Agilisten eine schwierige Gratwanderung. </p>

<blockquote>
<p>Scrum-Expertise und agiles Know-How werden heute oftmals mit Trainings erlangt und mit Zertifizierungen belegt. Gibt es Deiner Meinung nach auch andere oder sogar bessere Vermittlungs- bzw. Bildungswege?</p>
</blockquote>

<p>Scrum im speziellen sowie die agilen Verfahren sind in diesem Punkt schon speziell zu betrachten. Ein pures Training alleine ist oftmals ziemlich ineffizient. Es kann ein Anfang sein, aber nicht viel mehr.</p>

<p>Das Wort <em>Know-How</em> verrät es schon, das es um zwei Aspekte geht. Zum einen gibt es den Aspekt des <em>Wissens</em>, zum Anderen natürlich den Aspekt des <em>Könnens</em>. Das Volumen und die Tragweite des Wissens ist bei Scrum relativ klein. Der Rahmen des Könnens ist bei Scrum verglichen zum Wissensanteil deutlich größer.</p>

<p>Gerade vor diesem Hintergrund ist ein "begleitender Ansatz" wie das Coaching meiner Meinung nach deutlich effektiver. Coaching und Beratung als begleitende Maßnahme ist für mich eine nachhaltige und greifbare Methode zur Vermittlung der agilen Verfahren und Werte.</p>

<p>Das ganze Themenfeld der Zertifizierung ist meiner Meinung nach nur ein Nebeneffekt, der sich mit dem steigenden Anwendungsgrad von Scrum etabliert hat. Ich sehe hier im Besonderen die Personalabteilungen und deren Bewertungsstrategien als Treiber für Zertifizierungen. Das mag durchaus für manche Organisationen als Bewertungsindiz dienen. Ich bin jedoch der Meinung, das für die Organisation die effektive Umsetzungsfähigkeit und Erfahrung deutlich wichtiger ist und daran richte ich auch meine Trainings aus.</p>

<blockquote>
<p>Was ist für Dich das wichtigste an einem agilen Team?</p>
</blockquote>

<p>Für mich ist das gemeinsame Ziel als Team sowie das Vertrauen in die Personen und Fähigkeiten innerhalb des Teams ein sehr wichtiger Faktor. Natürlich gibt es noch weitere Dinge, wie z.B. Kompromissfähigkeit, gute Qualität bei der Software-Technik und kontinuierlicher Verbesserungswillen.</p>

<p>Aus der Perspektive der Etablierung bzw. Gestaltung eines Scrum-Teams würde ich die "Ermächtigung des Teams" stark in den Vordergrund stellen. Das Fundament für eine erfolgreiche Gestaltung eines Scrum-Teams sind zwei wesentliche Dinge: Erstens, <em>Empower the Team</em>, und zweitens, <em>Continuous Improvement</em>. Das ist meiner Meinung nach unabdingbar.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p>Wir als Agilisten sind der Inspektion und Adaption verpflichtet. Dementsprechend können und sollten wir immer nach Lücken und Fehlern Ausschau halten. Das ist individuell und ändert sich auch mit dem Reifegrad und dem Zug der Zeit.</p>

<p>Als konkrekte Aufgabe für die Agilität betrachte ich die deutlichere Herausarbeitung und Kommunikation, dass agile Verfahren und Software-Entwicklung nicht mit Massenfertigung und Produktion in Verbindung zu bringen sind, sondern vielmehr an eine menschenorientierte, kreative Entwicklung und Leistungserbringung gekoppelt sind. Gerade die Orientierung am Menschen - die postindustrielle, humanistische Haltung - ist für mein Empfinden als essentiell zu werten und von uns noch stärker in dem Vordergrund zu stellen. </p>

<blockquote>
<p>Wenn Du Dir für die agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Respekt und Vertrauen. Ich wünsche mir, das Erwachsene sich als Erwachsene behandeln.</p>

<p><strong>Vielen Dank, Christoph!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
<li><a href="der-agilist-agile-devops.html">Agile DevOps</a> mit Andreas Mandi-Beke</li>
<li><a href="der-agilist-agile-und-kanban.html">Agile und Kanban</a> mit Markus Andrezak</li>
<li><a href="der-agilist-agile-management.html">Agile Management</a> mit Kai Simons</li>
<li><a href="der-agilist-agile-engineering.html">Agile Engineering</a> mit Björn Rochel</li>
<li><a href="der-agilist-agile-education.html">Agile Education</a> mit Ole Pophal</li>
<li><a href="der-agilist-agile-scrummaster.html">Agile Scrum Master</a> mit Bettina Ruggeri</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Gnome-Shell slow after Fedora 17 upgrade</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/gnome-shell-slow-after-fedora-17-upgrade.html"/>
            <updated>2012-06-15T08:00:00Z</updated>
            <published>2012-06-15T08:00:00Z</published>
            <id>/gnome-shell-slow-after-fedora-17-upgrade.html</id>
            
            <content type="html"><![CDATA[
                <p>It's been a while now that <a href="http://fedoraproject.org/wiki/Releases/17">Fedora 17</a>, the <em>Beefy Miracle</em> has been released to public. This Fedora version comes with a myriad of updates and some very nice and innovative features. However, this post is not about all the gimmicks of F17 rather than a short log about an issue I had after I upgraded my Tablet from Fedora 16 to 17.</p>

<p>I use my Tablet (which is an <em>ExoPC</em>) more like a <em>netbook</em>. I take a wireless keyboard with me and most often use it for research, writing and mails. I'm using Fedora 16 on this device for almost a year now and have had a great experience so far. Plus, I was happy to experience that Gnome 3 fits very well for my scenario.</p>

<h4 id="pre-upgrade">Pre-Upgrade</h4>

<p>Upgrading Fedora is very easy. If you look at the <a href="https://fedoraproject.org/wiki/Upgrade">upgrade guide</a>, it's essentially as easy as <code>sudo yum install preupgrade</code> and subsequently executing <code>preupgrade</code>. Really, there's no big deal about it. However, if you happen to plan an upgrade as well, be sure to <em>backup</em> your system and <em>read the docs</em>.</p>

<p>My upgrade procedure went very smooth. The initial boot to F17 was fast and appeared to be without any issues. F17 welcomed me with the usual login screen, I logged in and everything seemed to just work fine. Except one thing: it was slow. And by <em>slow</em>, I mean <em>really slow</em>. Even typing in terminal lagged a few seconds behind the actual keystroke. It seemed to me as if UI performance went back to early 90's.</p>

<h4 id="gnome3-software-rendering">Gnome3 Software Rendering</h4>

<p>After a few minutes of investigation using the usual</p>

<div class="codehilite"><pre>lspci | grep VGA
glxinfo | grep renderer
</pre></div>

<p>I found out that the new <a href="https://fedoraproject.org/wiki/Features/Gnome_shell_software_rendering">Gnome-Shell software rendering</a> has caught me. The <a href="http://fedoraproject.org/wiki/Test_Day:2012-03-29_Gnome_Shell_Software_Rendering">Fedora Test Page</a> for this feature unveiled very useful information for my further analysis. It seemed as if the Intel drivers which happily worked with F16 no longer worked with F17. Obviously, such a theory sounded strange to me, so I further went down to analyze <code>Xorg.0.log</code>.</p>

<p>The analysis uncovered the real issue: The log clearly stated that the intel driver couldn't be loaded:</p>

<div class="codehilite"><pre>(EE) Failed to load module &quot;intel&quot; (module requirement mismatch, 0)
</pre></div>

<p>While digging deeper into the logs and simultanuously researching the web for similar cases, I found that the X-Servers version (1.12) was not the version for which the failing intel driver was compiled (1.6). It obviously was the case that the driver was not suitable for the new X version. I checked the currently installed driver package with </p>

<div class="codehilite"><pre>sudo yum list installed xorg-x11-drv-intel
</pre></div>

<p>and to my own surprise I saw that the package was still from F16's repositories! The interesting thing was, that an update check with </p>

<div class="codehilite"><pre>sudo yum check-update
</pre></div>

<p>didn't reveil that I'm on an old (non-working) driver. From my naive perspective I assume that it might be a little leak in the overall upgrade process. The solution however was quite simple:</p>

<div class="codehilite"><pre>sudo yum remove xorg-x11-drv-intel
sudo yum install xorg-x11-drv-intel
sudo shutdown -r now
</pre></div>

<p>After the reboot I got full hardware accelleration back and the UI responded quick and smooth again.</p>

<p>Despite this little glitch, I've had a very pleasant upgrade experience and almost everything was still where I expected it to be. In my opinion Fedora is a great distro with a very clean organization of the overall system. I'll upgrade my other systems soon as well and keep being a happy user of Fedora.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">No More Blog Comments</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/no-more-blog-comments.html"/>
            <updated>2012-05-16T14:00:00Z</updated>
            <published>2012-05-16T14:00:00Z</published>
            <id>/no-more-blog-comments.html</id>
            
            <content type="html"><![CDATA[
                <p>A few months ago I started to completely rethink my website. During this time, I also took the time to think about the comment functionality which is included in my current blog software <a href="http://www.wordpress.org">WordPress</a>. One of the outcomes of my thoughts on my websites was to change my blogging. <em>Completely</em>. Both from mental as well as from a technical perspective.</p>

<p>From 'mental' (or practical) perpective, I'll change my blog gradually from a non-directed, spontaneuous blabbing, ranting and random thought disposal instrument towards a more topic-oriented and directed writing. I won't start to write technical or theoretical articles or books. I want to keep my blogging small since I like the concept of small, chewable chunks of information for a specific topic.</p>

<p>Second, from technical perspective, I'm going to completely change the platform and infrastructure of my website (again). I'll move off from <a href="http://www.wordpress.org">WordPress</a> and use a static website generator instead. I don't have much interactive content or even applications. Hence, static webpages serve my purposes quite well. However, there's one little dynamic thing I have until now. You guessed it already, it's my blog comment functionality.</p>

<h4 id="what-is-a-comment">What Is A Comment?</h4>

<p>Ok. From technical perspective, comments aren't much of an issue, since there's a number of external providers for commenting, i.e. the popular <a href="http://disqus.com">Disqus</a>. Nonetheless, I wanted to rethink <em>everything</em> on my website. Hence, I chewed on the comment thing as well. After a couple of days, I came to a conclusion I hadn't thought I'd come to before: <em>Just don't do it.</em></p>

<p>Yes, that's right. No more blog comments on my website. Even more, I'll remove the blog comments from my old entries as well. The reason is quite simple. On-site comments are simply wrong. From almost any perspective it makes no real sense to me to enable commenting on an article/blog right just where the article is. And to be honest, this conclusion is quite new for me as well. I didn't care much about it until recently.</p>

<p>The fundamental question for me to be answered was: <em>What is a blog comment?</em> To me, a blog comment is a published opinion or statement regarding the content/topic layed out in the original article. Such a statement must have an author - be it disclosed or undisclosed. As a side note, I never allowed anonymous commenting. But surely, impersonated or fake name commenting is/was possible as well.</p>

<p>As for the activity of commenting, the author writes and publishes her thoughts in the internet. Now hold on for a second and re-read that last sentence again. The important thing to notice is <em>the internet</em>. That's actually what makes me believe that the entire concept of on-site commenting is wrong. The culture and nature of the internet is distributed and free information. Now, if information is useful or related to some other information, it's simply interlinked. I'm a firm believer that the concept of linking is crucial for the internet.</p>

<p>I think that instead of posting a comment on the same site where the article resides, the comment actually needs to be published <em>somewhere else</em> on the internet and then interlinked with the original article. This <em>is the natural way</em> of information sharing on the internet. Yes, it's the culture of the internet. The author can simply post her comment on her own website or blog. Nowadays, it's just a few clicks to get a free personal blog.</p>

<p>Thinking a little more about the topic, one might inevitably notice that actually there's a <em>trend</em> towards off-site commenting in recent years. With the rise of the social networks (you know, this <a href="http://facebook.com">Facebook</a>, <a href="http://twitter.com">Twitter</a> and <a href="http://plus.google.com">G+</a> things), sharing links and quick commenting has become both popular and <em>usable</em>. Just post the link of the article or page in question, write your statement and fire off a new conversation.</p>

<p>Moreover, sharing on social networks is beneficiary for all parties involved. Be it the author of the original article, the commenting author, the social network platform, or the readers of the comment embodied as "social network status message". Perhaps the best thing about it is that the comment (and a potential conversation) about the topic in question is being made <em>intentionally</em> and <em>directed</em>. The author of the comment makes many useful and helpful decisions before sharing her comments.</p>

<p>After it was clear for me that off-site commenting is far better than on-site commenting, I thought about a second, related decision. I asked myself: "Why should I limit my readers?". And of course, that's a very valid question. Why should I, as author of an article, limit the feedback and conversation possibilities for my readers?</p>

<p>At first sight, I thought that it's not a good idea to limit feedback channels. Even more, just <em>switching off</em> the comment feature on a blog is - well - quite unnatural, since most of the blogs out there have (excellent) on-site commenting. Additionally, from a open communication perspective, it's counterintuitive to simply block a communication channel. Especially for someone like me, who really is very dedicated and passionate to <em>develop and foster communication and feedback all the time</em>. However, I finally decided to disable this communication/feedback channel and go for the hard way. The key argument here is based on a very simple idea: Providing a <em>wrong</em> option doesn't improve anything.</p>

<p>That's why I'll no longer provide on-site comments on my website. You can share your feedback with me and others at any time. Write your thoughts on your own website, post your comment on a social network, link to original or related sources and let me know about your comment if you like. You can surely just send me an email as well.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Scrum-Master</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-scrummaster.html"/>
            <updated>2012-05-14T08:00:00Z</updated>
            <published>2012-05-14T08:00:00Z</published>
            <id>/der-agilist-agile-scrummaster.html</id>
            
            <content type="html"><![CDATA[
                <p>Nach einer kurzen Verschnaufpause möchte ich heute meine Interview-Serie der <a href="der-agilist.html">Agilisten</a> fortführen und gleich mit einem interessanten Thema einsteigen: Der Stand der heutigen agilen Software-Entwicklung aus der Perspektive des <em>Scrum-Masters</em>. Der Scrum-Master ist eine besondere Rolle im Rahmenwerk Scrum. Wenn auch nicht die wichtigste, ist es dennoch eine intensive und spannende Rolle.</p>

<h3 id="im-interview-bettina-ruggeri">Im Interview: Bettina Ruggeri</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_bettina.jpg" />
Gerade wegen des intensiven Wirkungsspektrums der Rolle ist es mir eine Freude, mit <a href="https://www.xing.com/profile/Bettina_Ruggeri">Bettina Ruggeri</a> eine erfahrene und kompetente Scrum-Masterin für ein Interview gewinnen zu können. Bettina blickt nicht nur auf vielschichtige Erfahrungen als Scrum-Master zurück, sondern ist darüber hinaus eine engagierte Scrum-Masterin, die gerne den Austausch mit Kollegen sucht und das stetige Lernen befürwortet - ja sogar vorlebt. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Bettina. Was machst Du beruflich?</p>
</blockquote>

<p>Aktuell verbreite &amp; lebe ich agile Werte und Methoden als Scrum Master und Kanban Coach. Dazu betreue ich die Ausbildung in unserem Unternehmen und werde vielfach als Moderator eingesetzt.</p>

<p>Darüber hinaus arbeite ich im beruflichen und privaten Umfeld als Konfliktmoderatorin/Mediatorin und begleite Menschen als systemischer Coach.</p>

<blockquote>
<p>Welches sind Deine Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p>Mein Ziel ist eine verbesserte Zusammenarbeit, um gemeinsam Ziele zu erreichen. Deshalb möchte ich eine Firmenkultur fördern, in der die Interessen aller Mitarbeiter gesehen werden, Freude an Weiterentwicklung und ein wertschätzendes Fehler- und Konfliktverhalten gelebt wird.</p>

<p>Und so konzentriere ich mich immer mehr auf die Menschen, die mir im Leben begegnen - sei es jeder Einzelne, Teams und auch das Management.</p>

<p>Aus meiner Sicht sind Akzeptanz und ein vertrauensvolles Umfeld der notwendige Raum, um Kreativität und Begeisterung für erfolgreiche Produkte zu entwickeln.</p>

<blockquote>
<p>Scrum ist mittlerweile das bekannteste und beliebteste agile methodische Vorgehen. Warum?</p>
</blockquote>

<p>Nun, es ist in erster Linie natürlich ein vielerorts erfolgreiches agiles Methodenwerk. Darüber hinaus <em>erscheint</em> es dem Neuling bzw. Interessierten auch als ein einfaches Methodenmodell, weil es nur wenige "Regeln" mit sich bringt.</p>

<p>Betrachtet man die Zuneigung zu Scrum etwas genauer, fällt einem schnell auf, das ein Großteil der Vorliebe dem agilen Wert der "Menschenorientierung" zu schulden ist. Scrum stellt den Menschen in den Vordergrund, wie jede andere agile Vorgehensweise auch. Das ist ein Schlüsselfaktor denke ich.</p>

<blockquote>
<p>Ist Scrum wirklich so einfach, wie es immer gesagt und vermittelt wird?</p>
</blockquote>

<p>Nein, Scrum ist nicht wirklich einfach. Ich denke, Scrum will das auch gar nicht sein. Der "Schein" des einfachen mit den wenigen Rollen, Regeln und Gremien ist zwar da, aber das war's auch schon. Themen wie Selbstorganisation und Eigeninteresse an Weiterentwicklung sind äußerst schwierig. Sowohl für den Einzelnen, wie auch für die Gemeinschaft.</p>

<p>Ein kurzes Beispiel hilft vielleicht zur Veranschaulichung. In agilen Methoden - so auch in Scrum - gibt es vielschichtige Feedback- und Reflektionsmechanismen. Menschen werden daduch quasi <em>gezwungen</em>, eine Überprüfung der Lage und Ihres Handelns durchzuführen. Das ist schwerer als man denken mag, denn wir Menschen tun uns meist leichter zu sagen, was wir <em>nicht</em> wollen. Doch das zu sagen, was wir <em>stattdessen</em> wollen, ist ungleich schwieriger.</p>

<blockquote>
<p>Wieso ist der Scrum-Master für ein Scrum-Team so wichtig? Alle im Team 'können' ja Scrum, oder nicht?</p>
</blockquote>

<p>Nun, es liegt in der Natur des Menschen, das man in seinem Aufgabenfeld von Zeit zu Zeit in eine gewisse Routine kommt. Dinge, Methoden und Auffassungen schleifen sich ein und der Blick über den Tellerrand fällt dann dem einen oder anderen schwerer.</p>

<p>Ein "frischer Wind" von außen, eine Kraft, die manche steife Blicke wieder aufweitet tut in diesem Moment meines Erachtens gut. Als Scrum-Master erlebe ich mich als die Kraft, die hilft, die gemeinsame Komfort-Zone zu hinterfragen. Insofern kann man sagen, dass es auch eine meiner Aufgaben ist, "unbequem" zu sein. Das Ziel dabei ist die Weiterentwicklung der Arbeitsweisen.</p>

<blockquote>
<p>Warum wird oft bei agilen Einführungen der Scrum-Master als neuer 'Projekt-Manager' gesehen?</p>
</blockquote>

<p>Diese Wahrnehmung hat viele Gründe. Meistens hat es mit der Ab- und Übergabe von Vertrauen und Verantwortung zu tun. Ein klassisches Management ist es gewohnt, Verantwortung explizit an Personen zu übertragen. Es braucht eine Bezugsperson, der sie die Verantwortung buchstäblich 'in die Hände' legt.</p>

<p>Manchmal ist es auch etwas banaleres, wie z.B. die nackte Tatsache, dass die völlige Transparenz zwischen Team und Produktverantwortlichen nicht erwünscht ist. Das mag aus vielerlei Motivationsfaktoren entstehen. Entscheidend ist aber meiner Meinung nach, dass man solche Faktoren erkennt. Nur dadurch lässt sich auch ein überlegter Umgang mit der Situation ermöglichen.</p>

<blockquote>
<p>Welches sind Deiner Meinung nach die Kern-Eigenschaften eines guten Scrum-Masters?</p>
</blockquote>

<p>Die wichtigste Eigenschaft ist sicherlich die <em>"Liebe zu den Menschen"</em>. Als Scrum-Master arbeitet man viel mit und an den Menschen. Da ist es quasi fundamental, den Umgang mit vielerlei Charakteren und Meinungen zu mögen.</p>

<p>Darüber hinaus zeichnet sich ein Scrum-Master für mich durch das leben und vermitteln von Werten wie Akzeptanz, Wertschätzung und Vertrauen aus. Das sind elementare Werte, um den Raum für Kreativität zu schaffen und zu schützen.</p>

<blockquote>
<p>In wie weit lässt sich Scrum-Master als Rolle mit disziplinarischer Führung vereinbaren?</p>
</blockquote>

<p>Meiner Meinung nach ist das eine Frage der Integration in die Unternehmensorganisation. Natürlich wird auch in die Scrum-Master-Rolle viel Verantwortung "hineininterpretiert". Das man auch ein ausschlaggebender Faktor sein, muss es aber nicht. Ich denke das mangelnde Vertrauen in das Team ist eher kontraproduktiv. Ich persönlich möchte als Scrum-Master lieber keine disziplinarische Verantwortung übernehmen. Ich denke es wäre für mich und meine Arbeit mit den Menschen eher ein Hindernis als ein Vorteil.</p>

<blockquote>
<p>Welches sind die Nachteile der Scrum-Master-Rolle in der Praxis?</p>
</blockquote>

<p>Ich glaube das ein Scrum-Master schon vor der Herausforderung steht, sich, seine Aufgaben und seine Rolle jederzeit klar nach außen zu kommunizieren und darzulegen. Der Scrum-Master wird im Alltag meist aus dem Hintergrund agieren und das Team in den Vordergrund stellen. Das ist mit eine der Hauptaufgaben. Schließlich ist die Förderung der Selbst-Organisation des Teams ein wichtiger Eckpfeiler in Scrum. </p>

<p>Daraus kann sich aber auch eine Wahrnehmung Dritter ergeben, die den Scrum-Master als passiv oder so ähnlich empfinden. Eine klare Kommunikation und das ständige Feedback der Mitarbeiter können diesen Wahrnehmungen entgegenwirken.</p>

<blockquote>
<p>Was ist für Dich das wichtigste an einem agilen Team?</p>
</blockquote>

<p>Die Freude an der Arbeit und an der gemeinsamen Leistung ist sicherlich ein sehr hohes Gut. Das ist natürlich auch eine individuelle Frage der Motivation. Gerade diese Individualität fordert von einem agilen Team eine gesunde Kompromiss- und Konfliktfähigkeit. Besonders die gemeinschaftliche Findung und Beschreitung eines Konsens ist für ein agiles Team von großem Wert.</p>

<p>In diesem Zusammenhang ist es auch wichtig zu erkennen, dass diese Werte nicht einfach "erlangt werden", sondern von allen stetige Aufmerksamkeit abverlangen. Konsens- und Kompromissfähigkeit ist keine Eigenschaft, sondern ein Ziel, welches jedes Mal angegangen und erarbeitet werden will.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p>Ich bin der Überzeugung, dass mangelndes Vertrauen eine große Hürde darstellt. Meine Erfahrung hat mir gezeigt, das gerade diese Öffnung des Einzelnen dem Anderen gegenüber ein großer und schwieriger Schritt ist. Gerade in unserer heutigen Zeit, in der die Professionalisierung mit Klarheit, Sachlichkeit und Nüchternheit assoziiert wird. Vertrauen passt zwar nicht in dieses Bild, aber das liegt nicht am Vertrauen, sondern eben an diesem verzerrten Bild der Professionalität.</p>

<p>Akzeptanz und Wertschätzung sind weitere wichtige Werte, die oftmals - ja sogar in agilen Projekten und Unternehmen - vernachlässigt werden. Hier können und müssen wir dran bleiben.</p>

<blockquote>
<p>Wenn Du Dir für die agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Eine vertrauensvolle und optimistische Firmenkultur, die sich auf die Erreichung der gemeinsamen Ziele konzentriert. Es mag sich etwas abgehoben oder esoterisch anhören, aber es ist durchaus aller Ehren wert, wenn man sich vornimmt, einfach "Licht in die Welt zu tragen". Manchmal geht uns Menschen der Blick für das große Ganze auch verloren, dann hilft es, sich wieder auf die grundlegenden Dinge zu stützen. </p>

<p>Oft wird z.B. vergessen, dass wir nicht arbeiten, um zu Leben, sondern das die Arbeit Teil unseres Lebens ist. Man kann und sollte nicht einfach 8 oder mehr Stunden seines täglichen Lebens einfach so ausblenden. Das Ziel sollte sein, dass wir als Menschen unsere Arbeit mit Freude erledigen und dass alle Interessen umgesetzt und gelebt werden können. Vertrauen, Akzeptanz, Wertschätzung sind die Kräfte, die uns dabei helfen können.</p>

<p><strong>Vielen Dank, Bettina!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
<li><a href="der-agilist-agile-devops.html">Agile DevOps</a> mit Andreas Mandi-Beke</li>
<li><a href="der-agilist-agile-und-kanban.html">Agile und Kanban</a> mit Markus Andrezak</li>
<li><a href="der-agilist-agile-management.html">Agile Management</a> mit Kai Simons</li>
<li><a href="der-agilist-agile-engineering.html">Agile Engineering</a> mit Björn Rochel</li>
<li><a href="der-agilist-agile-education.html">Agile Education</a> mit Ole Pophal</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">.NET Cologne 2012: CI Secrets</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/dotnet-cologne-2012-ci-secrets.html"/>
            <updated>2012-05-07T17:00:30Z</updated>
            <published>2012-05-07T17:00:30Z</published>
            <id>/dotnet-cologne-2012-ci-secrets.html</id>
            
            <content type="html"><![CDATA[
                <p>Die diesjährige <a href="http://www.dotnet-cologne.de">.NET Cologne</a> war für mich ein einzigartiges Erlebnis. Ich habe die ganze Intensität der Community und der Teilnehmer erleben dürfen. Obgleich ich zum Konferenztag später ankam als ursprünglich geplant, war ich dennoch froh darüber, dann bei Ankunft viele alte und neue Gesichter sehen zu können.</p>

<p>Das spannende an der Konferenz ist sicherlich die Größe und Qualität. Es gibt de facto keine größere (und für mein Empfinden auch beeinflussendere) Community-Konferenz für das Microsoft &amp; .NET-Umfeld als die .NET Cologne. Schaut man sich die Agenda der Konferenz an, weiß man auch, warum.</p>

<p>Ich habe bei der diesjährigen Konferenz einen kleinen Beitrag leisten dürfen, in dem ich meinen Vortrag über die Geheimnisse der Continuous Integration <em>"CI-Secrets"</em> gehalten habe. In diesem Vortrag bin ich in klaren Worten auf die offensichtlichen und etwas versteckteren Kniffe eingegangen, die man methodisch und technisch anwenden kann, um eine Continuous Integration erfolgreich im Team zu manifestieren. Meine drei Haupt-Themen-Gebiete waren dabei <em>Kultur</em>, <em>Automatisierung</em> und <em>Qualität</em>.</p>

<p>Ich möchte jetzt nicht weiter auf die einzelnen Talks oder Eindrücke eingehen, die ich bei der Konferenz sammeln konnte. Viel mehr liegt es mir am Herzen, dem Veranstalter, Sponsoren, Vortragenden und Teilnehmern für eine absolute Spitzen-Konferenz zu danken. Ganz Besonders die Veranstalter und Sponsoren haben es ermöglicht, nun mittlerweile über mehrere Jahre der .NET Community eine Konferenz im Stile einer Top-Wissenstransfer-Plattform bereitzustellen.</p>

<p>Die .NET Cologne ist unverzichtbar - für ausnahmslos jeden, der im .NET Software-Development tätig ist. Ich kann es jedem .NET Enthusiasten oder Interessierten uneingeschränkt empfehlen.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Kurzbericht: Dotnet Day Franken 2012</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/kurzbericht-dotnet-day-franken-2012.html"/>
            <updated>2012-05-02T17:00:00Z</updated>
            <published>2012-05-02T17:00:00Z</published>
            <id>/kurzbericht-dotnet-day-franken-2012.html</id>
            
            <content type="html"><![CDATA[
                <p>Letzten Samstag war ich in Nürnberg. Aus gutem Grund. Der <a href="http://www.dotnet-day-franken.de/">.NET Day Franken</a> hatte wieder einmal die .NET-Gemeinde zusammengerufen, um an einem schönen sonnigen Tag nicht nur die Sonne zu geniessen, sondern auch aktuelles Wissen und Know-How in der .NET-Software-Entwicklung abzurufen. Wie auch schon im letzten Jahr (und auch die Jahre davor?), war die Veranstaltung ausverkauft. Aus gutem Grund. Wer sich die <a href="http://www.dotnet-day-franken.de/program/">Agenda</a> der Community-Konferenz anschaut, wird nicht lange andere Gründe suchen.</p>

<p>Ich hatte schon letztes Jahr einmal über <a href="you-got-an-f.html">meine Eindrücke zum .NET Day Franken</a> geschildert. Der Artikel hat nicht einen Hauch von Aktualität verloren. Aus gutem Grund. Es waren alle "F" des letzten Jahres wie gewohnt vertreten. Mehr noch, in diesem Jahr legte der Veranstalter sogar noch eine Schippe drauf. Ich sag' nur: Film, Fantasie, Freunde und Fit.</p>

<p>Ich kann zu den einzelnen Talks leider nicht sehr viel sagen. Aus gutem Grund. Ich konnte nur an einer einzigen Session teilnehmen - und das noch nicht mal vollständig. Dafür schäme ich mich auch. Aus gutem Grund. Denn die Session - es war die "Wie ruiniere ich ein Scrum-Team"-Session von <a href="http://www.conplement.de/udowiegaertner.html">Udo Wiegärtner</a> - war qualitativ und quantitativ sehr anspruchsvoll.</p>

<p>Ich bin mir sicher, dass auch die anderen Sessions in der gleichen Liga gespielt haben. Ich durfte mich glücklich schätzen, meinen "Amigo Agilo"-Beitrag zu der Veranstaltung beizusteuern. Der Mut und das Vertrauen des Veranstalters kann an dieser Stelle gar nicht hoch genug gelobt werden. Diese Jungs sind einfach eine Klasse für sich. </p>

<p>Mein eigener Eindruck war jedoch, dass sich das Vertrauen des Veranstalters in mich nicht ausgezahlt hat. Aus gutem Grund. Ich war mit meinem Talk ziemlich unzufrieden. Ich hatte das Gefühl, dass ich mein Thema nicht vollends und klar jedem Teilnehmer vermitteln konnte. Insofern bin ich doppelt dankbar, dass sich meine Zuhörer mir erbarmt haben und trotz meiner Schwierigkeiten Interesse an meinem Thema gezeigt haben. Danke vielmals, ich weiß es sehr zu schätzen.</p>

<h3 id="fazit-hingehen-aus-gutem-grund">Fazit: Hingehen. Aus gutem Grund.</h3>

<p>Mir bleibt nach einem wunderbaren und sehr gelungenen Community-Konferenz-Tag in Nürnberg wieder einmal nur die eine, einzig mögliche Schlußfolgerung: Der .NET Day Franken ist eine Pflichtveranstaltung für die .NET-Software-Entwicklungswelt Süddeutschlands. Das Format, die Verpflegung, die Sprecher, die Themen, die Geselligkeit, die Offenheit, die Location, die Frische. Das alles und vieles mehr spricht für den .NET Day Franken.</p>

<p>Fazit: Hingehen. Aus gutem Grund.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Education</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-education.html"/>
            <updated>2012-04-16T08:00:00Z</updated>
            <published>2012-04-16T08:00:00Z</published>
            <id>/der-agilist-agile-education.html</id>
            
            <content type="html"><![CDATA[
                <p>Nun ist die Agilität schon mehr als eine Dekade alt. Für einige mag das schon als lange erscheinen, andere wiederum empfinden die Agilität als noch sehr junge Disziplin. Doch wie bei nahezu allen Disziplinen der Neuzeit kämpft die Agilität mit der Vernachlässigung einer besonders wichtigen Perspektive: der Ausbildung und Lehre.</p>

<p>In diesem siebten Interview der Interviewserie der <a href="der-agilist.html">Agilisten</a> widme ich mich dem Punkt der <em>Agile Education</em>. Das hört sich Anfangs etwas komisch an, in einer Zeit, in der Wissen und Informationsmanagement als "Kulturbestandteil" wahrgenommen werden. Doch Bildung &amp; Lehre werden im Software-Entwicklungs-Arbeitsleben leider zu oft auf Konferenzen und Zertifikate reduziert. Eine sehr eindimensionale Sicht wie ich finde.</p>

<h3 id="im-interview-ole-pophal">Im Interview: Ole Pophal</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_ole.jpg" />
In diesem Interview freue ich mich sehr, mit <a href="https://www.xing.com/profile/Ole_Pophal">Ole Pophal</a> einen ambitionierten Zeitgenossen gefunden zu haben, der sich den Weg in die Agilität mit Stringenz und Freude gebahnt hat. Im Gespräch mit Ole galt es, die Perspektive sowie den Status Quo der Lehre &amp; Ausbildung von agiler Software-Entwicklung abzuklopfen. Ole ist durch seine jüngsten Erfahrungen im Studium dafür der ideale Gesprächspartner. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Ole. Was machst Du beruflich?</p>
</blockquote>

<p>Ich bin Offizier bei der Bundeswehr und dort derzeit als IT-Koordinator im Bereich IT-Service-Management eingesetzt. Zu meinem Aufgaben gehört dort die Kommunikation von Anforderungen bzw. Problemen zwischen der Bundeswehr und dem (externen) IT-Dienstleister, wie auch die Erarbeitung von Konzepten zum Einsatz der IT in dem mir zugeordneten Teilbereich der Bundeswehr (Organisationsbereich).</p>

<blockquote>
<p>Welches sind Deine Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p>Ich möchte nach meiner Zeit bei der Bundeswehr (2013) weiterhin im Bereich IT arbeiten. Vermutlich nicht in direkt in der Softwareentwicklung sondern eher an der Schnittstelle "Kunde zu Entwicklung". Wichtig sind mir hierbei zukünftig Aufgaben, die mir und meinem Team Kreativität und Freiraum bei der Problemlösung ermöglichen.</p>

<blockquote>
<p>Wann bist Du mit agiler Software-Entwicklung in Kontakt gekommen und wie?</p>
</blockquote>

<p>Mein "Erstkontakt" war im Rahmen meines Studiums, Ende 2010. Es war zugleich das Thema des ersten Vorlesungsmoduls wie auch das angedachte Vorgehen für unser studentisches Entwicklungsprojekt. </p>

<p>Das war Pflichtlektüre für alle Teilnehmer des Studiengangs. Der Studiengang ist vollständig berufsbegleitend für alle Teilnehmer gewesen. In meinem Erststudium (2002-2006) war von agiler Entwicklung noch keine Rede, sondern es wurden eher die klassischen Vorgehensmodelle (Wasserfall, V-Modell) gelehrt.</p>

<p>Das war schon etwas Besonderes für mich, denn offen gesagt habe ich von agilen Methoden vorher nur "so nebenher" etwas gehört. Es mag auch daran liegen, dass ich mich davor berufsbedingt nicht besonders stark mit der Software-Entwicklung auseinandergesetzt habe.</p>

<blockquote>
<p>Was ist für Dich das Besondere an der agilen Software-Entwicklung?</p>
</blockquote>

<p>Meiner Meinung nach stellt Sie das Individuum wieder mehr in den Mittelpunkt der Entwicklung. Dies betrifft sowohl die starke Orientierung am Kunden, wie auch den einzelnen Entwickler, der in seiner Freiheit und Kreativität - aber auch seiner Verantwortung gestärkt wird. </p>

<p>Das ist z.B. im Vergleich zu klassischen Methoden schon etwas anderes. Ich denke, dass gerade die Orientierung am Wunsch des Kunden durch den klassischen Wasserfallansatz vielleicht nicht immer im Zentrum der Entwicklung stand. Besonders der ständige Abgleich der Entwicklung mit den Wünschen bzw. der Vision des Kunden ist bspw. beim V-Modell in der Art meiner Meinung nach nicht gegeben.</p>

<blockquote>
<p>Wie ausgeprägt ist die Ausbildung und Information über Agilität im Studium?</p>
</blockquote>

<p>In meinem Erststudium war es de facto nicht vorhanden. Also kann ich eigentlich nur aus der Qualität und Intensität meines zweiten Studiums berichten. Die vermittelten Kenntnisse hängen natürlich stark von der Qualität des Dozenten und dessen Erfahrung mit der Agilität ab. </p>

<p>In meinem Fall wurde ein Scrum-Master als Dozent eingesetzt, der nach Scrum auch in seinem derzeitigen Berufsumfeld entwickelt. Die restlichen Module des Studiums (z.B. Softwarequalität und -test etc.) waren nicht unbedingt auf agile Methoden und Vorgehensweisen ausgerichtet.</p>

<p>Es gehört meiner Meinung nach schon "ein Quentchen Glück" dazu, auch einen kompetenten und erfahrenen Dozenten zu haben. Das wird sicherlich auch von Studiengang zu Studiengang ganz unterschiedlich im Bezug auf Umfang und Qualität sein.</p>

<blockquote>
<p>Zu welcher 'Disziplin' würdest Du Agilität eher einordnen: Software-Entwicklung oder Organisations-Management?</p>
</blockquote>

<p>Ich denke, dass es in beide Bereiche gehört. Wenn ich mich jedoch entscheiden müsste, dann würde ich es persönlich eher dem Organisations-Management zuordnen.</p>

<p>Es gibt in Unternehmen ja bereits den Bereich des "Change und Innovation Management". Ich denke dort würde es vermutlich am besten hinpassen. Als eigene Disziplin oder Methode ist es mir aus diesem Bereich jedoch nicht bekannt.</p>

<blockquote>
<p>Kann man Deiner Meinung nach Agilität überhaupt klassisch didaktisch aufbereiten und lehren?</p>
</blockquote>

<p>Ich denke Agilität (im Sinne der mir bekannten Methode zur Softwareentwicklung) setzt neben den passenden Methoden und Werkzeugen vielmehr noch eine entsprechende geistige Haltung voraus. </p>

<p>Damit meine ich eine Bereitschäft für Veränderung und flexibles Reagieren. Ich denke schon, dass es grundsätzlich entsprechend aufbereitet und auch gelehrt werden kann. Ich bin mir jedoch nicht ganz sicher, inwiefern man diese Lehre in bestehende Lehrkonzepte integrieren kann.</p>

<p>Meiner Erfahrung nach Bedarf es dabei aber nicht nur theoretischer Module. Ich hatte z.B. das begleitende Studienprojekt, welches über 1 Jahr parallel zum Studium durchgeführt wurde. Erst im praktischen Vorgehen des Projektes konnte man die theoretischen Inhalte umsetzen und Erfahrungen sammeln, vor allem auch mit den Problemen, die im Zuge dieser Methode natürlich auch entstehen können.</p>

<blockquote>
<p>Welche Bestandteile der agilen Software-Entwicklung sind Deiner Meinung nach am schwersten zu vermitteln?</p>
</blockquote>

<p>Gerade die "agilen Werte" sind meiner Meinung nach schwer theoretisch zu vermitteln. Hierunter verstehe ich:</p>

<ul>
<li>Vertrauen (zwischen <em>Kunde</em> und <em>Entwicklung</em>)</li>
<li>hohe Kommunikationsbereitschaft</li>
<li>hohe intrinsische Motivation und Spaß an der Aufgabe</li>
<li>bestmögliche Lösungen für den Kunden schaffen</li>
</ul>

<p>Es ist meiner Meinung nach schwer, dieses Wertegerüst der Agilität klar und deutlich zu transportieren.</p>

<blockquote>
<p>Was war Dein bisher schönstes Erlebnis in Verbindung mit Agilität?</p>
</blockquote>

<p>Das schönste Erlebnis war für mich das gemeinsame Arbeiten mit dem Ergebnis, den Kunden mit seiner eigenen Arbeit komplett zufrieden zu stellen - sogar noch über seine Erwartungen hinaus. Ich denke, dass so eine "Übererfüllung der Aufgabe" nur mit agilen Verfahren möglich ist.</p>

<blockquote>
<p>Was ist für Dich das wichtigste an einem agilen Team?</p>
</blockquote>

<p>Da gibt es meiner Meinung nach mehrere Punkte. Ich denke dass die richtige Teamgröße und Teamzusammenstellung ein entscheidender Faktor ist. Das Team darf nicht zu groß sein und die Teammitglieder sollten schon mit einer positiven Grundhaltung aufeinander zugehen können.</p>

<p>Besonders wichtig ist für mich die Interdisziplinarität und Besetzung des Teams; also das Prinzip, dass jeder im Team jede Aufgabe durchführen kann. Andernfalls hätte man wieder das Potenzial zur fachlichen Silo-Bildung. Natürlich kann nicht jeder alles gleich gut. Aber dass zumindest jeder im Team jede Aufgabe umsetzen kann ist schon ein wichtiger Bestandteil des Teams für mich.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p>Das ist eine schwierige Frage. Ich habe ja nun nicht einen sehr großen Erfahrungsschatz in Punkto Agilität. Ich sehe derzeit keine Mängel in der Methodik oder den Praktiken.</p>

<p>Vielmehr denke ich, dass es im Umfeld der Agilität noch einiges an Nachholbedarf gibt. Damit meine ich größtenteils die Stärkung der Akzeptanz der agilen Software-Entwicklung - sowohl unternehmerisch, als auch gesellschaftlich.</p>

<blockquote>
<p>Wenn Du Dir für die agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Da möchte ich nahtlos an meine vorherige Antwort anknüpfen. Ich denke, dass die Wahrnehmung der agilen Methoden als <em>ernsthaftes Management- und Organisationsmodell</em> noch weiter ausgebaut werden kann und sollte.</p>

<p>Ich würde mir wünschen, dass man diese Anerkennung weiter vorantreibt. Auch durch anpacken von eventuell halbherzigen "pro Forma"-Umsetzungen oder weiteren Entwicklungsbereichen. Ich denke, dass die agile Methodik schon längst aus den Kinderschuhen heraus ist und auch die notwendige fundierte Basis hat, um breite Anerkennung in der IT-Arbeitswelt zu erlangen. Ich wünsche mir sowohl breite als auch tiefe Akzeptanz der Agilität in der IT-Branche.</p>

<p><strong>Vielen Dank, Ole!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
<li><a href="der-agilist-agile-devops.html">Agile DevOps</a> mit Andreas Mandi-Beke</li>
<li><a href="der-agilist-agile-und-kanban.html">Agile und Kanban</a> mit Markus Andrezak</li>
<li><a href="der-agilist-agile-management.html">Agile Management</a> mit Kai Simons</li>
<li><a href="der-agilist-agile-engineering.html">Agile Engineering</a> mit Björn Rochel</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Engineering</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-engineering.html"/>
            <updated>2012-04-09T08:00:00Z</updated>
            <published>2012-04-09T08:00:00Z</published>
            <id>/der-agilist-agile-engineering.html</id>
            
            <content type="html"><![CDATA[
                <p>In dem folgenden Interview der Serie der <a href="der-agilist.html">Agilisten</a> geht es um die impulsgebende Perspektive der Agilen Bewegung: dem <em>Agile Engineering</em>. Gerade diese besondere Perspektive in der agilen Software-Entwicklung ist durch die Vielzahl der neuen und wichtigen Fortschritte in der agilen Gemeinde in letzter Zeit eher hinter den Kulissen anzutreffen. Doch das ist keineswegs ein Indiz für Ruhe oder Müßiggang. Nein, das Gegenteil ist der Fall. Agile Entwicklung ist innovativer und anspruchsvoller geworden und macht auch mit leisen Sohlen große Fortschritte.</p>

<h3 id="im-interview-bjorn-rochel">Im Interview: Björn Rochel</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_bjoern.jpg" />
Es ist mir eine Ehre, den erfahrenen Software-Entwickler und Agilisten <a href="http://bjro.de">Björn Rochel</a> Fragen über das spannende Feld der agilen Software-Ingenieurs-Kunst stellen zu dürfen. Wie kaum ein anderer versteht es Björn technologie- und fachübergreifend im Konzert der professionellen Software-Entwicklung die richtigen Töne mit Gefühl und besonnener Intensität zu treffen. Die komplexe Partitur der Agilität spielt er souverän in unerkannt akribischer Ingenieurs-Manier und hinterlässt dabei einen leichtes, harmonisches Klangbild. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Björn. Was machst Du beruflich?</p>
</blockquote>

<p>Derzeit arbeite ich als Software Engineer für das soziale Netzwerk <a href="www.xing.com">XING</a>. Mein Team ist verantwortlich für die <a href="https://dev.xing.com/">XING Developer API</a>, die im März als Closed Beta gestartet ist. Davor war ich lange Jahre in unterschiedlichen Rollen (Entwickler, Berater, Architekt) im Microsoft .NET Umfeld tätig.</p>

<blockquote>
<p>Welches sind Deine Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p>Kurz und knapp: Zufriedene Kunden, erfolgreiche Projekte, technische Exzellenz - und ein harmonisches, zufriedenes Entwicklungsteam. Alles unter einem Hut. :-)</p>

<blockquote>
<p>Was zeichnet Deiner Meinung nach einen agilen Entwickler aus?</p>
</blockquote>

<p>An erster Stelle steht hier die Eigenschaft des 'Teamplayers'. Die Kooperationsbereitschaft und -umsetzung ist ein wichtiges Erfolgsrezept für einen agilen Entwickler.</p>

<p>Gleichermaßen zeichnet sich der agile Entwickler durch seine Ansicht aus, dass Software-Entwicklung mehr ist, als einfach nur Code zu schreiben. Es braucht heutzutage eine Vielzahl von weiteren Kenntnissen und Rollen, um eine Software erfolgreich zu gestalten.</p>

<p>Doch das ist nicht alles, denn für mich hat ein agiler Entwickler noch eine weitere Schlüsseleigenschaft. Der agile Entwickler ist sich darüber im Klaren, das Software ständig im Wandel ist und sein wird. Stetige Veränderungsbereitschaft und Lernbereitschaft ist 'Agilität' im wahrsten Sinne des Wortes. Ein Design, welches heute gut aussieht und allen Ansprüchen genügt, kann übermorgen schon nicht mehr tragfähig oder adequat werden. Veränderung und Lernen setzt Erkenntnisgewinn voraus. Idealerweise gemeinsam in einem agilen Team.</p>

<blockquote>
<p>Kann jeder Entwickler auch ein agiler Entwickler werden?</p>
</blockquote>

<p>Natürlich! Ich wüsste nicht, welche Eigenschaften dagegen sprechen würden. Es ist klar, dass sich der eine oder andere leichter oder schwerer tut bei der Entwicklung hin zu einem agilen Entwickler. Wenn die Veränderungsbereitschaft da ist, kann jeder Entwickler ein agiler Entwickler werden. Das sich dabei manche leichter tun - und andere etwas mehr Unterstützung benötigen - das ist ganz normal.</p>

<blockquote>
<p>Welche Methoden bzw. Praktiken sind für einen agilen Entwickler unverzichtbar?</p>
</blockquote>

<p>Das Thema <em>Testing</em> ist für mich das A und O. Ich persönlich bin ein Freund des TDD (Test-Driven-Design), aber es gibt keinen Anlass für mich, in dieser Sache dogmatisch zu sein. Jeder hat in diesem Punkt seine Vorlieben und persönliche Effizienz. Was hier zählt, ist die Schärfung des Bewußtseins für das Testing. Ergo: wenn es Tests gibt, gibt es einen Ankerpunkt, an dem die agile Entwicklungsweise sich festhalten und orientieren kann. In einfacheren Worten: Ohne Tests kein Sicherheitsnetz. Ohne Sicherheitsnetz ist Software nur schwer evolvierbar.</p>

<blockquote>
<p>Guter Punkt. Gibt es denn dann auch so etwas wie agiles Software-Design oder agile Software-Architekturen?</p>
</blockquote>

<p>Also ich glaube schon, das ein gewisses Set an Techniken für einen agilen Software-Entwickler hilfreich sein können. Dennoch würde ich aber nicht per se Architekturen oder einzelne Design-Techniken als "agile Architekturen" bezeichnen. Software sollte sich auch an der agilen Prämisse der "Veränderungsbereitschaft" messen lassen können. Dazu gibt es hilfreiche technische Methoden bzw. Prinzipien, wie z.B. lose Kopplung, hohe Kohäsion, <a href="http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29">S.O.L.I.D.</a> oder <a href="http://de.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a> (Behavior-Driven-Design).</p>

<p>Agiles Software-Design ist für mich demnach ein Design, welches die Flexibilität und Veränderbarkeit in sich verankert, aber gleichzeitig durch Tests und klare fachliche Umsetzung eine stabile Anwendung ermöglicht.</p>

<blockquote>
<p>Viele Entwickler tun sich auf dem Weg zur Agilität schwer. Welchen Rat würdest Du einem Entwickler geben, der sich mit der Adaption der Methode oder Techniken schwer tut?</p>
</blockquote>

<p>Puh, das ist eine wirklich schwierige Frage. Ich fange mal mit der methodischen Perspektive an.</p>

<p>Sich stetig einer möglichen Veränderung zu stellen, neue Herangehensweisen zu lernen und dann auch noch auf Anhieb richtig anzuwenden gelingt den wenigsten Software-Entwicklern. Es ist absolut normal, wenn Dinge nicht auf Anhieb klappen. Ergo: <em>Ruhe bewahren.</em> Gute Reflektion und ein stabiler Lernwille helfen. Es gilt: nicht gleich aufgeben, denn schließlich macht erst Übung den Meister.</p>

<p>Aus technischer Perspektive kann ich jedem nur den Rat geben, sich mit Testing als wichtigen Bestandteil intensiv zu beschäftigen. Als konkrete Hilfestellung für die immer wiederkehrende Frage, wie man existierende Software unter Tests bekommt, kann ich hier wärmsten das Buch <a href="http://www.amazon.de/Working-Effectively-Legacy-Code-ebook/dp/B005OYHF0A">Working effectively with Legacy Code</a> von Michael Feathers empfehlen. Das war eines der ersten Bücher, die ich zu diesem Thema gelesen habe. Ich profitiere noch heute davon.</p>

<blockquote>
<p>Welche Nachteile hat Deiner Meinung nach die agile Vorgehensweise für Entwickler?</p>
</blockquote>

<p>Das ist eine persönliche, subjektive Sache. Agile Software-Entwicklung hat eine starke kollaborative und kommunikative Komponente. Insofern ist es für manch einen Entwickler ein Stückweit schwierig - gerade wenn man sich doch eher zurückziehen möchte und eigenständig am Rechner arbeiten möchte. Das kann als Nachteil ausgelegt werden. Ich persönlich habe schon des öfteren Entwickler kennen gelernt, die diesen kommunikativen Entwicklungsstil für sich als Nachteil empfunden haben. Das liegt aber weder daran, dass es objektiv ein Nachteil ist, noch daran, dass der Entwickler dafür generell ungeeignet gewesen wäre. Zumeist sind Unsicherheiten und halbherzige Umsetzungen an solchen Empfindungen mit beteiligt.</p>

<blockquote>
<p>Wieso sollte Software agil entwickelt werden und nicht anders?</p>
</blockquote>

<p>Agile Software-Entwicklung ist für mich das Prinzip der Veränderungsbereitschaft - ja sogar Veränderungsförderung. In unserer heutigen Gesellschaft verändert sich vieles rasant. Gerade im technologischen Bereich und Leben unserer Gesellschaft ist Bewegung und Veränderung normal. Die agile Software-Entwicklung ist schlichtweg notwendig, um sich mit dieser gesellschaftlichen und technologischen Veränderung bewegen zu können.</p>

<p>Agilität ist darüber hinaus noch mehr. Es ist eine Wertevorstellung, sich der Veränderung effektiv und nachhaltig zuzuwenden. Es geht also nicht nur um Veränderung, sondern auch um Werte, die unsere Informations- und Kreativarbeit mit Nachhaltigkeit und Menschlichkeit ermöglicht.</p>

<blockquote>
<p>Was ist für Dich das wichtigste an einem agilen Team?</p>
</blockquote>

<p>Das hört sich einfach an, ist es doch meist nicht: ein agiles Team sollte ausgewogen sein. Die Interdisziplinarität ist wichtig, denn es geht um die gemeinsame Umsetzung aller notwendigen Kenntnisse in die Entwicklung. Darüber hinaus zeichnet sich ein agiles Team durch die Motivationskraft des Teams wie auch der einzelnen Mitglieder aus. Die Eigenmotivation des Einzelnen spiegelt sich dann im Team wieder.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p>Gute Frage. Die Agilität ist heute an einem Punkt, in dem es sich in unsere Software-Entwicklungs-Branche etabliert. Das ist sehr erfreulich, führt aber auch zu Reibungen und Schwierigkeiten. Dadurch reiben sich nicht nur Unternehmen oder Persönlichkeiten auf, sondern meiner Meinung nach auch die Agilität selbst. Begriffe wie Scrum, Kanban oder XP werden leider zu oft verwässert und verschwommen kommuniziert, aufgefasst oder interpretiert. Das ist für die Agilität leider nicht sehr förderlich.</p>

<p>Ich denke es würde uns gut tun, wenn wir Agilität als Grundlage für Werte und Methoden einer modernen Software-Entwicklung - oder Arbeitsweise - auffassen und nicht zu stark mit Implementierungen wie Scrum oder Kanban koppeln. Damit meine ich keine Entkopplung im Sinne unterschiedlicher Auffassungen, sondern eher eine Entkopplung im Sinne des Agilitätsbegriffes. Einfacher gesagt: Scrum und Kanban sind agile Methoden, aber Agilität definiert sich nicht im Gänze über Scrum oder Kanban.</p>

<blockquote>
<p>Wenn Du Dir für die agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Ich würde mir wünschen, dass die Agile Bewegung nicht nur reduziert wird auf Software-Entwicklungs-Methoden oder Praktiken. Ich empfinde es als besonders wertvoll, dass sich eine Wertekultur um die Agilität entwickelt und auch stark transportiert wird, damit sich diese Werte in verschiedenen Bereichen über verschiedene Wege wiederfinden.</p>

<p><strong>Vielen Dank, Björn!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
<li><a href="der-agilist-agile-devops.html">Agile DevOps</a> mit Andreas Mandi-Beke</li>
<li><a href="der-agilist-agile-und-kanban.html">Agile und Kanban</a> mit Markus Andrezak</li>
<li><a href="der-agilist-agile-management.html">Agile Management</a> mit Kai Simons</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Management</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-management.html"/>
            <updated>2012-04-02T08:00:00Z</updated>
            <published>2012-04-02T08:00:00Z</published>
            <id>/der-agilist-agile-management.html</id>
            
            <content type="html"><![CDATA[
                <p>Ein äußerst interessantes Thema im Umfeld der Agilität ist das sog. "agile Management". In den letzten Jahren hat die agile Bewegung in Software-Entwicklungs-Unternehmen großflächig Einzug erhalten. Das gilt nicht nur für Software-Entwicklungs-Teams, sondern auch für andere Rollen in der Organisation. Insofern ist das Thema des agilen Managements und der agilen Führungsprinzipien gleichermaßen aktuell und wichtig.</p>

<h3 id="im-interview-kai-simons">Im Interview: Kai Simons</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_kaisimons.jpg" />
Ich freue mich sehr über das Thema des <em>agilen Managements</em> mit einem erfahrenen Agilisten, Coach und Trainer sprechen zu dürfen, der sich schon seit Jahren mit dem Wirkungswechsel von Teamführung und agilem Management intensiv beschäftigt. Kein geringerer als <a href="http://ksimons.de">Kai Simons</a>, einer der wenigen deutschsprachigen <a href="http://www.management30.com">Management 3.0</a>-Trainer, wird mir in diesem weiteren Interview der Reihe der <a href="der-agilist.html">Agilisten</a> Rede und Antwort stehen. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Kai! Was machst Du beruflich?</p>
</blockquote>

<p><em>Kai:</em> Ich unterstütze Führungskräfte und Teams auf Ihrem Weg zur Agilität als Coach und Trainer. Meine Kunden sind Unternehmen unterschiedlicher Größe und diverser Branchen - vom Mittelstand bis zum Konzern. Darüber hinaus macht mir <em>Facilitation</em> viel Freude, weswegen ich auch als Moderator gebucht werde. </p>

<p>Mein Motto: "Es ist genug agil für alle da!" :-)</p>

<blockquote>
<p>Was sind Deine Ziele, wenn es um Agile Software Entwicklung geht?</p>
</blockquote>

<p><em>Kai:</em> Wenn ein Kunde agil arbeiten will, möchte ich, dass er ein klares Verständnis erlangt, was dies bedeutet. Am liebsten vermittle ich es durch die Anwendung von agilen Methoden und Praktiken selbst, damit erfahrbar und begreifbar wird, wie sich die Arbeit in einem agilen Team anfühlt. Auch wenn ich von meinem Hintergrund in der Softwareentwicklung zu Hause bin, macht mir auch der Transfer in andere Szenarien Spaß. Führungskräfte auf diesem Weg mitzunehmen ist mir wichtig.</p>

<blockquote>
<p>Warum ist Deiner Meinung nach agiles Management ein wichtiges Thema?</p>
</blockquote>

<p><em>Kai:</em> Das agile Management - noch genauer das mittlere Management - ist ein entscheidender Faktor in der agilen Organisation. Das mittlere Management stellt die Verbindung zwischen dem Top-Management und Team dar und ist somit ein wichtiges Bindeglied für die strategische und operative Zielorientierung. Für mich geht diese Schlüsselrolle sogar noch ein Stück weiter. Gerade Manager im Team- und Abteilungsbereich übernehmen den Löwenanteil der Verantwortlichkeit für ein agiles Unternehmen. Deren Führungststil beeinflusst direkt die Teams und Mitarbeiter - und damit auch die Wertschöpfung und Produktivitätsleistung.</p>

<p>Ein weiterer wichtiger Aspekt ist die Einführung und Etablierung agiler Verfahren. Die Hauptblocker für agile Einführungen gehören in den Verantwortungsbereich des mittleren Managements. Das ist nicht weiter verwunderlich, zumal sich die 'klassische' agile Literatur leider kaum mit dieser Organisationsperspektive auseinandersetzt. Dem können wir entgegenwirken, in dem wir das agile Management als wichtigen und gleichwertigen Grundbaustein der agilen Bewegung etablieren.</p>

<blockquote>
<p>Warum hat Management denn so viel mit Agilität zu tun?</p>
</blockquote>

<p><em>Kai:</em> Ganz klar: Agilität braucht <em>Empowerment</em>. Selbstorganisation und Verantwortungsübernahme agiler Teams sind kein Selbstläufer. Gerade diese "neue Freiheit" und das bewußte "loslassen" von Kontroll- und Verbindlichkeitsmechanismen muss durch das Management gefördert werden. Gerade deshalb ist die Rolle und Verantwortung des mittleren Management im Gesamtgefüge sehr wichtig. Das ist kein einfaches Unterfangen und Bedarf großer Zuwendung und Leistung. Hier kommt auch die agile Führung im Sinne der Wertevermittlung ins Spiel.</p>

<blockquote>
<p>Guter Stichpunkt. Was ist denn dann das "agile Management"?</p>
</blockquote>

<p><em>Kai:</em> Das agile Management leitet sich durch die Übernahme der Werte und Prinzipen des agilen Manifests ab und bringt diese Werte in den Wirkungsraum der Mitarbeiter- und Organisationsführung. Das mag sich am Anfang etwas abstrakt anhören, ist aber in der Umsetzung durchaus sehr konkret. Als gutes Beispiel kann ich die drei Kernpraktiken der agilen Führung <em>(engl: "Agile Leadership Practices")</em> anbringen.</p>

<ol>
<li><em>Aktive Unterstützung</em> der Mitarbeiter in der Organisation</li>
<li><em>Verbesserung</em> des Arbeitsumfeldes der Mitarbeiter</li>
<li>Ermöglichen einer <em>stetigen Wertschöpfung</em> für die Sponsoren</li>
</ol>

<p>Wie hier bei der Führung gibt es konkrete Übersetzungen des agilen Wertesystems in das gesamte Wirkungsfeld des Managements. Doch in <em>letzter Konsequenz</em> ist ein Management ein <em>agiles Management</em>, wenn die Werte und Kultur intuitiv und ganzheitlich adaptiert werden.</p>

<blockquote>
<p>Wo liegt der Schwerpunkt des agilen Managers?</p>
</blockquote>

<p><em>Kai:</em> Der agile Manager legt den Schwerpunkt darauf, für die Mitarbeiter und das gemeinsame Ziel "die Bahn frei zu machen". Das ist eine entscheidende Aufgabenstellung, besonders im Hinblick auf die gesamte agile Organisationsausrichtung. Für den einen oder anderen hört sich das zunächst einmal an wie eine Scrum Master-Aufgabe, der durch <em>Servant Leadership</em> dient und Hindernisse aus dem weg räumt. </p>

<p>Doch diese Sicht wäre hier viel zu einfach, denn während ein Scrum Master sich eher <em>reaktiv</em> zur Problemstellungen verhält, ist der agile Manager <em>proaktiv</em> und betrachtet eine <em>breitere Perspektive</em>. Der agile Manager hat demnach stetig und aktiv die Schaffung und Stabilisierung eines agilen Organisationsrahmens im Blick.</p>

<p>Für den agilen Manager gilt das Motto: <em>"Gutes mehren, Schlechtes wehren!"</em></p>

<blockquote>
<p>Was unterscheidet einen agilen Manager von einem klassischen Manager?</p>
</blockquote>

<p><em>Kai:</em> Das ist eine gute Frage - denn es gibt auch genug "klassische" gute Manager. Man sollte nicht den Fehler begehen, und agile Managementmethoden höher bewerten als die klassischen Vorgehensweisen. Es ist vielmehr eine perspektivische Erweiterung. Die agile "Perspektive" richtet sich deutlich aus an Systemmodellen und Selbstorganisationsprinzipien.</p>

<p>Das agile Management ist stark darauf ausgerichtet, das Team und die gesamte Organisation auf Selbstorganisation auszurichten. Dabei spielen gezielte Delegierung und Verantwortungsdistribution eine wichtige Rolle. Gleichermaßen ist gerade durch diese selbstorganisatorische Ausrichtung eine viel stärkere systemische Betrachtung bei Wertschöpfungs- und Organisationsentscheidungen wichtig. </p>

<p>Wir betrachten Unternehmen im agilen Management als Netzwerke von Individuen, die Wert erschaffen. Dabei hilft uns das Wissen der komplexen adaptiven Systeme.</p>

<blockquote>
<p>Guter Punkt. Das bringt mich zum Thema "Management 3.0". Management 3.0 ist ein Set von konkreten Management-Methodiken. Worum geht es dabei im Allgemeinen?</p>
</blockquote>

<p><em>Kai:</em> Zunächst einmal würde ich Management 3.0 nicht nur auf Methoden reduzieren, obwohl diese sicherlich wichtige Komponenten darstellen. <em>Management 3.0</em> sind Werte und Methoden für ein Management von agilen Teams und Organisationen. Es geht also um die <em>Theorie</em>, das <em>Mindset</em> - wie auch um die <em>Praktiken</em>. Vereinfacht kann man sagen, <em>Management 3.0</em> ist die vorhin schon erwähnte agile Perspektive des Managements. Klar aufbereitet und umsetzbar.</p>

<p>Das ist meiner Meinung nach auch eine der Stärken von Management 3.0. Es wird nicht einfach auf die agilen Werte verwiesen oder eine abstrakte Wertevermittlung angestrebt. Vielmehr geht man den Weg der Wertvermittlung durch Anwendung der konkreten Methoden und Praktiken. An Hand von Fallbeispielen werden zunächst die methodischen Werkzeuge für die Praxis angewendet, um auf diesem in einer Metabetrachtung auch die agilen Werte herauszuarbeiten.</p>

<blockquote>
<p>Ok. Was ist denn dein "Lieblingswerkzeug" bei Management 3.0?</p>
</blockquote>

<p><em>Kai:</em> Mir gefällt <em>Delegation Poker</em> am meisten, weil es um Erlangung von Vertrauen geht und weil die Reflektionsarbeit dabei sehr ausgeprägt ist. Fragen wie: <em>"Wie weit gebe ich dem Team die Freiheit zur Selbstentscheidung?"</em> und <em>"Wie weit möchte ich bei der Entscheidung beeinflussen?"</em> sind meist Brennpunkte, die ausführlich behandelt werden wollen. Die Diskussionen und Erkenntnisse daraus sind sehr spannend.</p>

<blockquote>
<p>Management ist eine wichtige Perspektive im agilen Umfeld. Aber warum ist das Thema "Managment" beim agilen Coaching dann eher im Hintergrund?</p>
</blockquote>

<p><em>Kai:</em> Meiner Meinung nach liegt das an den Wurzeln der Agilität. Die Wurzeln sind nun mal in der Technik - also in der Software-Entwicklung. Die agile Bewegung hat Ihren Ursprung in XP, Crystal, Scrum und ähnlichem. Heute jedoch geht es um mehr als "nur" Technologie. Es geht um agile Organisationen. Gerade deswegen rückt die Management-Perspektive in jüngster Zeit weiter in den Vordergrund.</p>

<p>Das ist ein richtiger und wichtiger Schritt.</p>

<p>Denn: Bis vor einigen Jahren sah das leider etwas düsterer aus. Rund um das Thema "Management" gab es wenig agiles Wissen und Werkzeuge. Mehr noch, es wurde vieles zu unkonstruktiv und stiefmütterlich betrachtet. Ein schönes Beispiel ist hier die mancherorts gehörte, unsägliche Aussage, dass Agilität "kein Management mehr brauche". Das führte zu Irritationen und auch ein Stückweit zu Fehlentwicklungen.</p>

<p>Doch gerade in letzter Zeit konnten wir konstruktive Lösungen zum Thema Managment und Agilität herausarbeiten. Vielmehr noch, durch den generellen Geist der empirischen Erkenntnis wissen wir, dass diese Lösungen auch funktionieren. Insofern sehe ich einer stärkeren Thematisierung von agilem Management auch sehr positiv entgegen. Das ist für mich eine normale, evolutionäre Entwicklung.</p>

<blockquote>
<p>Aus der Praxis: Was ist das erste, was ein agiler Manager Deiner Meinung nach begreifen und umsetzen sollte?</p>
</blockquote>

<p><em>Kai:</em> Ich denke dass es da erstmal keinen großen Unterschied zu agilen Teams gibt. Zunächst geht es um die Schaffung des Grundverständnisses durch die Wissensvermittlung der Methoden. Eine klare Auseinandersetzung mit Zielen, Erwartungen und einer eigenen unternehmerischen Strategie ist für die Adaption agiler Werte auch sehr hilfreich. Damit lässt sich ein klares Bild über Prozessadaption und -Transformation ableiten, denn meistens ist die Wandlung hin zu einer Selbstorganisation ein Weg mit Hindernissen und Unwegbarkeiten.</p>

<blockquote>
<p>Hört sich sehr spannend an. Was sollte man bei agilem Management dann unbedingt vermeiden?</p>
</blockquote>

<p><em>Kai:</em> Das mag sich jetzt etwas platt anhören, ist aber wirklich so: Jedes Handeln, welches gegen die agilen Werte verstösst, sollte vermieden werden. Gerade deswegen ist eine Wertevermittlung für uns als agile Coaches so wichtig. Werte sind der innere Kompass bei Situationen, in denen man sich für oder wider eine Maßnahme
entscheided.</p>

<p>Es gibt auch durchaus konkrete Gefahren, die man im agilen Management lieber umschiffen sollte. Dazu zählen zum Beispiel indirekte Kommunikation, die Konzentration auf extrinsische Motivationsfaktoren oder aber das Festhalten an Macht und Kontrolle.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p><em>Kai:</em> Sehr gute Frage. Es fehlen meiner Meinung nach ein Stückweit Führungskräfte mit stabiler Vertrauensbasis zu ihren Teams. Gerade wenn Fehler passieren, sollte das Vertrauen weiter aufrecht erhalten werden.  Wir stehen hier als agile Bewegung bei manchen, komplexen Umgebungen noch am Anfang. Insofern sind wir als Agilisten auch gefragt, einer Erweiterung der Agilität im Sinne von Leadership und den dazugehörigen Praktiken positiv entgegenzublicken - ja sogar zu fördern.</p>

<p>Weiterhin ist für mich offensichtlich, dass uns derzeit konkrete Antworten für eine fundierte, grundsätzliche Ausbildung fehlen. Damit möchte ich ganz bewußt den Blick in Richtung Hochschulen und Studierende richten. Heutzutage werden - wenn überhaupt - wenig agile Methoden im universitären Umfeld <em>fundiert</em> vermittelt und umgesetzt. Vor allem nicht an Management-Studiengängen. </p>

<p>Ohne Umschweife steht fest: Da sind wir als agile Bewegung defitizär aufgestellt.</p>

<blockquote>
<p>Wenn Du Dir für agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Ich wünsche mir den weiteren Transfer der Konzepte der Agilität in viele verschiedenen Arbeitsbereiche - nicht nur in der Software-Entwicklung oder im IT-Umfeld. Ich bin fest davon überzeugt das auch die agile Bewegung von solch einer Erweiterung profitieren kann. Ein sehr gutes Beispiel ist der Austausch der agilen Bewegung mit <em>SeriousPlay</em>, <em>Service Design Thinking</em> oder <em>Innovation Games</em>. Ich wünsche mir mehr Austausch mit anderen Denk- und Arbeitsmodellen, damit wir als agile Bewegung uns weiter entwickeln und im Ganzen zu einer besseren Arbeitswelt beitragen können.</p>

<p><strong>Vielen Dank, Kai!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
<li><a href="der-agilist-agile-devops.html">Agile DevOps</a> mit Andreas Mandi-Beke</li>
<li><a href="der-agilist-agile-und-kanban.html">Agile und Kanban</a> mit Markus Andrezak</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile und Kanban</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-und-kanban.html"/>
            <updated>2012-03-26T09:00:00Z</updated>
            <published>2012-03-26T09:00:00Z</published>
            <id>/der-agilist-agile-und-kanban.html</id>
            
            <content type="html"><![CDATA[
                <p>Es steht ein besonderes Interview mit einem besonderen Interviewpartner zu einem besonderen Thema an. Zunächst zum Thema: <em>Agilität und Kanban</em>. Seit einigen Jahren weht der frische Wind des "Software-Kanban" durch die Hallen von agilen Software-Schmieden. Während einige nur ein laues Lüftchen beim Durchlüften verspüren, bekommen manche starken Rückenwind und freuen sich über die frische Brise.</p>

<h3 id="im-interview-markus-andrezak">Im Interview: Markus Andrezak</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_andrezak.jpg" />
Ich bin sehr stolz, den <em>erfahrenen</em> Kanban-Kenner <a href="http://www.portagile.com">Markus Andrezak</a> für ein Interview über Agilität und Kanban gewinnen zu können. Als weltweit anerkannter Agilist und Kanban-Experte ist er genau der Richtige, um das Zusammenspiel zwischen Kanban und agiler Software-Entwicklung näher zu durchleuchten. Dieses Interview ist das vierte in der Interviewserie der <a href="der-agilist.html">Agilisten</a>. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Markus. Meine klassische Eingangsfrage: was machst Du beruflich?</p>
</blockquote>

<p>Ich war lange im Management des Product Development bei <a href="http://mobile.de">mobile.de</a> für Prozesse und Architektur zuständig, wurde dann Produktchef für die mobilen Produkte (iOS, Android, mobile Portal), werde aber im Mai Produktchef einer anderen Berliner Firma im Web, die ich noch nicht nennen darf.</p>

<blockquote>
<p>Ok. Was sind Deine persönlichen Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p>Ich will <em>tolle Produkte</em> bauen, die nicht nur in einer Nische 'funktionieren' sondern wirklich Breitenbedarf decken und wirklich in der Breite Wert schaffen. </p>

<p>Produkte sind aber nur so toll wie die Leute, die sie bauen. Deshalb ist mir immer wichtig, eine Firmenkultur mit aufzubauen, in denen alle Mitarbeiter sich verwirklichen und stetig weiterentwickeln können. Ich hoffe das klappt dann auch bei mir selbst! :)</p>

<blockquote>
<p>Wie würdest einem Interessierten Kanban in einem Fahrstuhl erklären?</p>
</blockquote>

<p>Ich würde sagen, dass man bei Kanban versucht auf sehr natürliche Weise in dem, was man tut, immer besser zu werden. Man versucht das, indem man sein Tun immer künstlich um einen kleinen Tick schwerer macht. Dabei stösst man automatisch immer wieder auf neue Probleme und Herausforderungen - ohne nach ihnen suchen zu müssen. Um einen Nordpol zu haben zu dem man läuft, sagt man: "man will Flow erreichen".</p>

<p>Den Flow visiert man an, in dem man immer weniger Dinge auf einmal erledigt... was in letzter Konsequenz immer schwerer wird. Am Ende, wo man natürlich nie ankommt, ist dann alles um einen herum viel entspannter, weil das Umfeld bewußt gut beherrscht wird.</p>

<blockquote>
<p>Warum ist Software-Kanban denn so anders als das "Original" aus der Automobil-Industrie?</p>
</blockquote>

<p>In der Automobil-Branche ist das Ziel grundsätzlich ein Anderes. Dort ist es wichtig, die selben Dinge immer wieder zu produzieren - so gut und effizient wie möglich. Deshalb versucht man hier, die <em>Variabilität</em> aus dem Produktionsprozess herauszutreiben.</p>

<p>Bei uns in der Software-Entwicklung werden neue Dinge geschaffen. Hier besteht gerade der Wert in der Variabilität. Deshalb muss unser Kanban so sein, dass es Variabilität zulässt. Ansonsten würden wir ja immer nur "Copy &amp; Paste" machen - und somit keinen echten Wert generieren. Vorsichtig ausgedrückt: Das wäre ganz schlecht.</p>

<blockquote>
<p>Ist Kanban eigentlich agil? Und wenn ja: Wieso?</p>
</blockquote>

<p>Tja, wenn ich das so genau wüsste. Offen gesagt, ich weiss nicht einmal genau ob es mich wirklich interessiert. ;) </p>

<p>Ich bin mir ziemlich sicher, dass die Werte des agilen Manifests durchaus von Kanban vertreten werden. Ich würde sogar so weit gehen, dass gerade die Werte von <em>Kanban</em> und <em>Lean</em> es erst zu dem machen, was sie sind. Es geht vor allem um Ganzheitlichkeit, Menschlichkeit, Autonomie und die Veränderung von unten. Das macht es dann auch mit den agilen Werten ein bisschen schwer, weil sie - glaube ich - nur ein Ausschnitt der Kanban und Lean-Werte sind.</p>

<p>Kurzum: Ja, Kanban ist für mich persönlich sehr agil. Sogar noch einen Tick mehr als andere Methoden.</p>

<blockquote>
<p>Viele "Kanbanista" preisen Kanban als methodisches Allheilmittel an. Ist es das wirklich?</p>
</blockquote>

<p>Das ist zuerst einmal gar nicht meine Wahrnehmung. Für mich ist es so, dass Kanban mir eher "passiert" ist als das ich es "angewendet" hätte. So nehme ich das auch bei anderen Kanban-Teams wahr.</p>

<p>Es gibt ja die alte Diskusssion "Scrum vs. Kanban", die ein wenig banal und sinnfrei ist. Meine Vermutung für diese z.T. hitzige Diskussion ist, dass in den "Siegeszug von Scrum" nun einmal Kanban als alternative Methodik auftrat und einige, die gerade Scrum adaptieren, sich auf Kanban einlassen und soz. 'konvertieren'. Doch das nur am Rande.</p>

<p>Tatsächlich haben viele so wie ich mit Kanban die Erfahrung gemacht, Fortschritte machen zu können, die sie vorher nicht realisieren konnten, weil tatsächlich Kanban sich relativ viral über die Erfolge, die man hat, verbreitet.</p>

<p>Ich habe mit einem 3-Mann-Team ganz schüchtern angefangen, um ein ganz konkretes Problem mit Kanban zu lösen. Das haben andere in der Organisation gesehen und den Erfolg natürlich "Schick" gefunden... dann waren es 12... usw. Am Ende hat die ganze Abteilung von 40 Mann mit Kanban gearbeitet, ohne dass ich das großartig gesteuert hätte. Das war einfach eine tolle Erfahrung. Derart viral passiert das auch bei anderen Kanban-Teams. </p>

<p>Also: Erfolgsversprechend? <em>Ja</em>. Allheilmittel? - <em>Nein</em>. Selbstläufer? - <em>Nein</em>.</p>

<blockquote>
<p>Was hälst Du von "Personal-Kanban"? Ist das eine Art "Solo-Kanban" für Einzelgänger?</p>
</blockquote>

<p>Ich finde Personal-Kanban eine gute Sache, verfolge es aber nicht aktiv oder intensiv. Mir leuchtet es vollkommen ein, dass in dem selbstreflektierten Bereich die Visualisierung mindestens die selbe Kraft hat wie bei uns in der Software-Entwicklung. </p>

<p>Die Visualiserung alleine sind meiner Meinung nach 80% des Geheimnisses, Erfolges und der Kraft von Kanban. <em>WiP</em> limitieren und <em>Pull</em>  sind dann noch einmal 10%. </p>

<p>Das genau diese Mittel im kleinen, persönlichen Bereich funktonieren bezweifele ich nicht eine Sekunde. Ich selbst wende es nicht an, weil ich mich gar nicht so sehr meinem Time-Management widmen muss.</p>

<blockquote>
<p>Kann jeder Kanban? Anders gefragt: Braucht man Trainer und Coaches, um Kanban anwenden zu können?</p>
</blockquote>

<p>Oha! <em>- (kurze Pause) -</em> Ich glaube die Umsetzung von Kanban ohne eine echte, professionelle Einführung ist sehr schwer. Nun, wie man diese Einführung bekommt steht auf einem anderen Blatt. Da kann es besonders unterschiedliche Wege geben. </p>

<p>Nehmen wir mal mein Lieblingsteam in einer Schwesterfirma als Beispiel. Da hat niemand jemals ein Kanbantraining bekommen. Wir haben uns im Sommer auf einer Terasse getroffen, ich habe etwas über Kanban erzählt und Schwupps - wollten sie alle mitmachen. </p>

<p>Sie waren so motiviert, ich musste nur ein paar Mal zu Beginn "dabei sein" und der Rest geschah in kompletter Eigenregie. Das Schöne: Es lief quasi Lehrbuchmäßig! Das ging so weit, dass alle Vorhersagen bzgl. Leadtime und Verringerung der Standardabweichung von Leadtime eintrafen. Auch die Qualität des Codes ist dabei unglaublich gestiegen.</p>

<p>Für mich steht fest: Man kann sich Kanban-Wissen auf ganz viele Arten aneignen. Aber: ohne eine gewisse Grundausbildung ist es schon schwer, den Geist und die Werte leben zu können - und das <em>nachhaltig</em>. Ansonsten wäre die Gefahr des "Slide-Back"-Effektes doch ziemlich hoch.</p>

<blockquote>
<p>Kanban wird oft sehr mechanisch beschrieben. Welche essentiellen Werte hat die Kanbankultur?</p>
</blockquote>

<p>Ooh. Ja. Das Gerücht der "mechanischen Beschreibung" ist mir auch schon zu Ohren gekommen. Bis heute ist mir nicht klar, wie es dazu kommen kann. Gehen wir mal vom Schlimmsten aus. Stellen wir uns vor, wir <em>wären</em> gar nicht bei uns, in der relativ netten Software-Industrie. ;) Nehmen wir an, wir sind bei <em>Toyota</em>. Dann würden wir erst mal irgendeines der Bücher von <a href="http://de.wikipedia.org/wiki/Taiichi_%C5%8Cno">Ohno</a> nehmen, um zu verstehen, was die Werte sind. </p>

<p>Und dann - die Überraschung. Da strotzt es nur so von Menschlichkeit, Autonomie, Selbstverwirklichung, ständiger Veränderung, stetiger Verbesseung - und zwar <em>von unten getrieben</em>. Man begegnet dem Manager, der auf dem Gemba lernt und seinen Mitarbeitern mit Respekt begegnen muss, um von ihnen ihre Probleme zu lernen. </p>

<p>Man kann auch <a href="http://www.amazon.de/Toyota-Kata-Managing-Improvement-Adaptiveness/dp/0071635238">Toyota Kata</a> lesen um zu sehen, wie geschickt Toyota einen kleinen Trick einsetzt um eben auf jeder Ebene - von der <em>Strategie</em>, über die <em>Produktentwicklung</em>, bis zur <em>Produktion</em> - immer besser zu werden. Immer getrieben davon, als Firma agil und beweglich zu bleiben. Einen guten, sicheren, angenehmen Arbeitsplatz und tolle Produkte zu bieten. Das ist genau <em>die Ebene</em>, auf der wir die Werte übernehmen.</p>

<blockquote>
<p>Welches ist der größte unternehmerische bzw. organisatorische Mehrwert von Kanban?</p>
</blockquote>

<p>Der Wohl größte Benefit ist dieser unscheinbare, kleine Schalter im Kopf eines jeden im Unternehmen, der mit Kanban umgelegt wird. Es ist der Schalter, der uns als einzelne an die gemeinsame Arbeit und das gemeinsame Ziel blicken lässt. Es ist der Schalter, der den Fokus auf den eigentlichen produktiven Mehrwert legt. </p>

<p>Das ist das Besondere an Kanban: die ganzheitliche Fokussierung auf den <em>Value Stream</em> von allen Beteiligten. </p>

<blockquote>
<p>Woran kann Deiner Meinung nach Kanban in einer Organisation scheitern?</p>
</blockquote>

<p>Es ist ja in den vorangegangenen Antworten schon durchgeklungen, dass ein großer Erfolgsfaktor von Kanban die Kultur und die damit verknüpften Werte sind. Fehlt das Werteverständnis, so fehlt auch die Fähigkeit der Entfaltung der Autonomie oder das effektive Delegieren. Ein weiterer Risikofaktor ist sicherlich auch eine mangelnde Objektivität im Umgang mit der Arbeit und den Aufgaben. Es ist besonders wichtig, in Sachfragen die Sachlichkeit im Auge zu behalten.</p>

<p>Das führt mich gleich zur Minderung dieses Risikofaktors: Es ist absolut essentiell, durch eine stringente Umsetzung und objektive, belegte Fakten ein Grundvertrauen in die gemeinschaftliche Aufgabenstellung bzw. Arbeitsweise zu etablieren. </p>

<p><em>Fakten schaffen Vertrauen</em>. </p>

<p>Ein Rückfall zu den altgedienten und spekulativen "Versprechungen" über Leistung oder Lieferung kann an einem einzigen Augenblick monatelang aufgebautes Vertrauen vernichten. </p>

<p><em>Versprechungen schaffen Mißtrauen</em>.</p>

<blockquote>
<p>Was wäre Dein Wunsch für die zukünftige, moderne Software-Entwicklung?</p>
</blockquote>

<p>Ich denke uns allen wäre schon ein großes Stück geholfen, wenn es weniger von diesen unnötigen Territorial-Kämpfen geben würde. Agil oder nicht agil, Scrum oder Kanban, Java oder Scala, Emacs oder Vim - das alles muss nicht sein. Es ist schon verblüffend, wie irrational so ein ganz und gar "rationaler Berufsstand" wie der der Software-Entwickler sein kann. Gut - wir sind alle nur Menschen. Aber - wir sind auch Ingenieure.</p>

<p>Mein wichtigster Punkt dabei: Ich wünsche mir <em>weniger Anekdoten</em> und <em>mehr Analytik</em>. Es ist frappierend, wie heute z.T. Software entwickelt wird. Da werden Mutmaßungen über Vorgehensweisen und Konsequenzen gemacht und zu viel zu vielen Fragestellungen einfach nur vage Aussagen in den Raum geworfen.</p>

<p>Mehr Analytik und mehr Fakten - das bringt uns weiter.</p>

<p><strong>Vielen Dank, Markus!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">JS Trickshot: E4X</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/javascript-trickshot-e4x.html"/>
            <updated>2012-03-22T15:00:00Z</updated>
            <published>2012-03-22T15:00:00Z</published>
            <id>/javascript-trickshot-e4x.html</id>
            
            <content type="html"><![CDATA[
                <p>Yesterday I wrote about a very specific and widely unknown JavaScript language innovation called <a href="javascript-trickshot-generator-expressions.html">generator expressions</a>. Today I'm going to quickly introduce you to another JavaScript language feature called <a href="http://en.wikipedia.org/wiki/ECMAScript_for_XML">E4X</a>. It's not any longer an 'innovation' actually, since it's more than 5 years old. However, it's not a very familiar feature either.</p>

<h4 id="e4x-embedded-xml-language">E4X: Embedded XML Language</h4>

<p><em>E4X</em> is short for <em>ECMAScript for XML</em> and is a very nice JS embedded XML processing language. I used it for my data processing and visualization project a few years ago with XULRunner and it turned out to be an indispensible tool for XML/XHTML processing.</p>

<p>Let's see how E4X looks like:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">customers</span><span class="o">&gt;</span>
  <span class="o">&lt;</span><span class="nx">customer</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;ACME Corp.&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;3&quot;</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;Supplier&quot;</span><span class="o">&gt;</span>
    <span class="o">&lt;</span><span class="nx">contact</span><span class="o">&gt;</span><span class="nx">Mr</span><span class="p">.</span> <span class="nx">Doe</span><span class="o">&lt;</span><span class="err">/contact&gt;</span>
    <span class="o">&lt;</span><span class="nx">offer</span> <span class="nx">count</span><span class="o">=</span><span class="s2">&quot;5&quot;</span> <span class="nx">amount</span><span class="o">=</span><span class="s2">&quot;60000&quot;</span> <span class="o">/&gt;</span>
  <span class="o">&lt;</span><span class="err">/customer&gt;</span>
  <span class="o">&lt;</span><span class="nx">customer</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;YooRoo Ltd.&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;7&quot;</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;Engineer&quot;</span><span class="o">&gt;</span>
    <span class="o">&lt;</span><span class="nx">contact</span><span class="o">&gt;</span><span class="nx">Senor</span> <span class="nx">DeLa</span> <span class="nx">Soul</span><span class="o">&lt;</span><span class="err">/contact&gt;</span>
    <span class="o">&lt;</span><span class="nx">offer</span> <span class="nx">count</span><span class="o">=</span><span class="s2">&quot;6&quot;</span> <span class="nx">amount</span><span class="o">=</span><span class="s2">&quot;120000&quot;</span> <span class="o">/&gt;</span>
  <span class="o">&lt;</span><span class="err">/customer&gt;</span>
  <span class="o">&lt;</span><span class="nx">customer</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;Rock-A-Fella&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;21&quot;</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;Supplier&quot;</span><span class="o">&gt;</span>
    <span class="o">&lt;</span><span class="nx">contact</span><span class="o">&gt;</span><span class="nx">Mr</span><span class="p">.</span> <span class="nx">DeLa</span> <span class="nx">Rocka</span><span class="o">&lt;</span><span class="err">/contact&gt;</span>
    <span class="o">&lt;</span><span class="nx">offer</span> <span class="nx">count</span><span class="o">=</span><span class="s2">&quot;7&quot;</span> <span class="nx">amount</span><span class="o">=</span><span class="s2">&quot;110000&quot;</span> <span class="o">/&gt;</span>
  <span class="o">&lt;</span><span class="err">/customer&gt;</span>
<span class="o">&lt;</span><span class="err">/customers&gt;;</span>
</pre></div>

<p>Yes, it's <em>that easy</em>. <code>customers</code> now is a full XML object. No big string play is involved, just start typing your XML and you're fine. But wait, there's a lot more to come. Let's see how we can access all <code>&lt;contact&gt;</code> nodes of our <code>&lt;customer&gt;</code>s:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">contacts</span> <span class="o">=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">customer</span><span class="p">.</span><span class="nx">contact</span><span class="p">;</span>
</pre></div>

<p>And if you were to select the names of our customers instead we can use the attribute accessor syntax:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">names</span> <span class="o">=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">customer</span><span class="p">.</span><span class="err">@</span><span class="nx">name</span><span class="p">;</span>
</pre></div>

<p>Isn't this incredibly simple? It is. Now let's get to the interesting features. One of the features I used most is the great and easy to apply <em>filters</em> feature. A filter is an expression enclosed in braces <code>()</code>. Say you only want the <code>&lt;contact&gt;</code>s of customers of type <em>Supplier</em>:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">supps</span> <span class="o">=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">customer</span><span class="p">.(</span><span class="err">@</span><span class="nx">type</span><span class="o">==</span><span class="s2">&quot;Supplier&quot;</span><span class="p">).</span><span class="nx">contact</span><span class="p">;</span>
</pre></div>

<p>We could even dive into a subtree, filter on any data and return some attribute on the higher tree nodes. You want to know the name of the customers whose offer amount is below 100000? Nothing easier than that:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">loperfs</span> <span class="o">=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">customer</span><span class="p">.(</span><span class="nx">offer</span><span class="p">.</span><span class="err">@</span><span class="nx">amount</span><span class="o">&lt;</span><span class="mi">100000</span><span class="p">).</span><span class="err">@</span><span class="nx">name</span><span class="p">;</span>
</pre></div>

<p>But wait! The filter feature <em>I used at most</em> is yet to come. The great thing about E4X filters actually is that you can effectively use <em>any JS function</em> to perform your filtering:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">onlyvip</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">){</span>
  <span class="k">return</span> <span class="nx">x</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="sr">/dela/i</span><span class="p">)</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">};</span>

<span class="kd">var</span> <span class="nx">vips</span> <span class="o">=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">customer</span><span class="p">.(</span><span class="nx">onlyvip</span><span class="p">(</span><span class="nx">contact</span><span class="p">)).</span><span class="err">@</span><span class="nx">name</span><span class="p">;</span>
</pre></div>

<p>Voilà. For me, the ability to filter with arbitrary JS expressions and embed them right into my XML node selection turned out to be a <em>very powerful and useful</em> feature.</p>

<p>There's a lot more useful things on <a href="http://en.wikipedia.org/wiki/ECMAScript_for_XML">E4X</a> to explore, but I finally want to introduce you to another cool feature I (sadly) discovered very late. If you quickly want to build up an XML from data, you can use the powerful <em>interpolation</em> feature. Just enclose your variable or expression into curly braces <code>{}</code> within the XML literal. Sounds nice? Just judge for yourself:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">watches</span> <span class="o">=</span> <span class="p">[{</span>
  <span class="nx">name</span><span class="o">:</span><span class="s2">&quot;longines&quot;</span><span class="p">,</span> 
  <span class="nx">price</span><span class="o">:</span><span class="mi">15000</span>
<span class="p">},{</span>
  <span class="nx">name</span><span class="o">:</span><span class="s2">&quot;icw&quot;</span><span class="p">,</span>
  <span class="nx">price</span><span class="o">:</span><span class="mi">20000</span>
<span class="p">},{</span>
  <span class="nx">name</span><span class="o">:</span><span class="s2">&quot;rolex&quot;</span><span class="p">,</span>
  <span class="nx">price</span><span class="o">:</span><span class="mi">25000</span>
<span class="p">}];</span>

<span class="kd">var</span> <span class="nx">to_euro</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">){</span>
  <span class="k">return</span> <span class="nx">x</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
<span class="p">};</span>

<span class="kd">var</span> <span class="nx">xml</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">watches</span><span class="o">/&gt;</span><span class="p">;</span>

<span class="k">for</span> <span class="nx">each</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">w</span> <span class="k">in</span> <span class="nx">watches</span><span class="p">){</span>
  <span class="nx">xml</span><span class="p">.</span><span class="nx">watch</span> <span class="o">+=</span> <span class="o">&lt;</span><span class="nx">watch</span> 
    <span class="nx">name</span><span class="o">=</span><span class="p">{</span><span class="nx">w</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span> 
    <span class="nx">price</span><span class="o">=</span><span class="p">{</span><span class="nx">to_euro</span><span class="p">(</span><span class="nx">w</span><span class="p">.</span><span class="nx">price</span><span class="p">)}</span>
  <span class="o">/&gt;</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">xml</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
<span class="cm">/* Output:</span>

<span class="cm">  &lt;watches&gt;</span>
<span class="cm">    &lt;watch name=&quot;longines&quot; price=&quot;7500&quot;/&gt;</span>
<span class="cm">    &lt;watch name=&quot;icw&quot; price=&quot;10000&quot;/&gt;</span>
<span class="cm">    &lt;watch name=&quot;rolex&quot; price=&quot;12500&quot;/&gt;</span>
<span class="cm">  &lt;/watches&gt;</span>

<span class="cm">  E4X FTW! </span>
<span class="cm">*/</span>
</pre></div>

<p><em>PS: You might already guessed from my official <a href="javascript-trickshot-generator-expressions.html">dislike of Googles V8 JS engine</a> that E4X is not implemented in V8 (and thus doesn't exist for node.js). Apart from SpiderMonkey (of course), <a href="http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29">Rhino</a> and <a href="http://en.wikipedia.org/wiki/ActionScript">AS3</a> have E4X suppport. Oh, E4X is an official <a href="http://www.ecma-international.org/publications/standards/Ecma-357.htm">ECMA Standard</a>, by the way.</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">JS Trickshot: Generator Expressions</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/javascript-trickshot-generator-expressions.html"/>
            <updated>2012-03-21T15:00:00Z</updated>
            <published>2012-03-21T15:00:00Z</published>
            <id>/javascript-trickshot-generator-expressions.html</id>
            
            <content type="html"><![CDATA[
                <p>It's time for another short article in my 'trickshot' series. Today, I'll dip into JavaScript code. But beware, this is not only a blog post about a language trick. It's a little rant about <a href="http://nodejs.org">node.js</a> and <a href="http://code.google.com/p/v8">v8</a> as well.</p>

<p><em>&lt;rant&gt;</em></p>

<p>I'm no JavaScript guru. However, I wrote quite a few applications in JS, ranging from "the good old web-apps" up to device-specific apps. Even a small data visualization app using <a href="http://en.wikipedia.org/wiki/XULRunner">XULRunner</a>. I used <a href="http://nodejs.org">node.js</a> in the past (for file/image processing purposes) and I use it today as well. Now, the thing is: With this (little) experience of a year with Node, I'm starting to <em>really</em> dislike the whole concept of Node.</p>

<p>I'm not going to dive in further about my reasons for not liking it. I just want to lay out that in my opinion the fact that Node is based on <a href="http://code.google.com/p/v8">v8</a> <em>and</em> is forcing me to stick to inappropiate server-side single-threaded event-loop is a big step back to stampcard engineering.</p>

<p>It shouldn't be that way. JavaScript has a vibrant community and with the rise of HTML5 JavaScript really can become a serious (albeit <em>sick</em>) option for frontend engineering. Even more, recent developments on JS really show that we <em>generally</em> head to the right direction.</p>

<p><em>&lt;/rant&gt;</em></p>

<h4 id="generator-expressions">Generator Expressions</h4>

<p><em>One</em> of those little known innovations surely is the development of the JavaScript language itself. Since I had to dive in a little deeper into JS last summer for a small project, I discovered some neat features I wasn't aware of. One of those features is called <em>generator expressions</em>.</p>

<p>The python people now surely know what this trickshot is going to be. <em>Generator expressions</em> are a nice way of creating sequences and even do some mapping and filtering on them. Before we look at generator expressions, let's first build up a small range generator with the <em>yield</em> feature:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">range</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span><span class="nx">e</span><span class="p">){</span>
  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="nx">s</span><span class="p">;</span><span class="nx">i</span><span class="o">&lt;=</span><span class="nx">e</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="nx">yield</span> <span class="nx">i</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>

<p>Now that we have a simple range sequence generator using <code>yield</code>, we could just iterate over it and display the sequence:</p>

<div class="codehilite"><pre><span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">15</span><span class="p">))</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
</pre></div>

<p>Good thing. Now, if we'd like to materialize the sequence of <code>range(1,15)</code>, we could preinitialize an array and just push the values into the array instead of logging. Something similar to this:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">15</span><span class="p">))</span>
  <span class="nx">a</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
</pre></div>

<p>Looks fairly straight-forward. However, we could materialize our range much easier by using array comprehensions:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">[</span><span class="nx">i</span> <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">15</span><span class="p">))];</span>
</pre></div>

<p>This is <em>much better</em>. Simple, terse, readable. <em>Array comprehensions</em> even allow us to modify and filter the materialization on the fly easily. Say you want the square of all evens from our list. Piece of cake with array comprehension syntax:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">[</span><span class="nx">i</span><span class="o">*</span><span class="nx">i</span> <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">15</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span><span class="o">%</span><span class="mi">2</span><span class="o">==</span><span class="mi">0</span><span class="p">)];</span>
</pre></div>

<p>Nice. Now let's finally get to the feature we were looking at from the beginning: <em>generator expressions</em>. Generator expressions are very similar to array comprehensions. The important difference between both is that generator expressions don't materialize to arrays. This is a very powerful feature since it allows us to write space and time-saving code.</p>

<p>Let's make another little example for illustration. We want to compute the square and the factorial for the evens of a specific range. We can define this easily with generator expressions:</p>

<div class="codehilite"><pre><span class="kd">var</span> <span class="nx">fac</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="nx">x</span><span class="o">&gt;</span><span class="mi">1</span> <span class="o">?</span> <span class="nx">x</span><span class="o">*</span><span class="nx">fac</span><span class="p">(</span><span class="nx">x</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">:</span> <span class="nx">x</span><span class="p">;</span>

<span class="kd">var</span> <span class="nx">squares</span> <span class="o">=</span> <span class="p">(</span><span class="nx">i</span><span class="o">*</span><span class="nx">i</span> <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">50</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span><span class="o">%</span><span class="mi">2</span><span class="o">==</span><span class="mi">0</span><span class="p">));</span>
<span class="kd">var</span> <span class="nx">facs</span> <span class="o">=</span> <span class="p">(</span><span class="nx">fac</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span> <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">50</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span><span class="o">%</span><span class="mi">2</span><span class="o">==</span><span class="mi">0</span><span class="p">));</span>
</pre></div>

<p>The <code>squares</code> and <code>facs</code> definitions look much like array comprehensions, except we used <em>braces</em> instead of <em>square brackets</em>. The real difference however is that both <code>squares</code> and <code>facs</code> are no arrays but real generators. </p>

<p>This means that effectively no square or factorial is being calculated in the above example. The first calculation occurs when the first value of <code>square</code> or <code>facs</code> is being requested. Again, this is no news for people from python land and the C# lovers out there can easily think of generator expressions as a simplified LINQ <code>.Where()</code> and <code>.Select()</code> syntax.</p>

<h4 id="javascript-innovation-land">JavaScript Innovation Land</h4>

<p>I think the above examples show how new language features can help to write better - that's more powerful <em>and</em> readable - code in JavaScript. Actually, these language innovations are only one perspective on how many wonderful things happen in JS land. I for one have a solid impression that it's at least very unfortunate that node.js bigots and unreasonable hysteria on the 'server-side JS revolution' obliterate many thoughtful innovations.</p>

<p>I'm well aware that above "trickshot" could surely reraise the old <em>ECMAScript</em> is no <em>JavaScript</em> discussion for a few JS devs outs there. Yes, the above language actually <em>is</em> JavaScript. And yes, I'm aware it only runs on Mozilla, although some of the above features are in <a href="http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts">ES.Next</a>. My intention surely is not to fire up such a discussion but instead show <em>this specific field of innovation</em> in JavaScript ecospace as an example to the many cool things happening nowadays regarding JavaScript.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile DevOps</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-devops.html"/>
            <updated>2012-03-19T08:00:00Z</updated>
            <published>2012-03-19T08:00:00Z</published>
            <id>/der-agilist-agile-devops.html</id>
            
            <content type="html"><![CDATA[
                <p>Als nächstes Thema in meiner Artikelserie über den Stand der modernen und agilen Software-Entwicklung habe ich mir die <em>DevOps</em> herausgegriffen. <a href="http://en.wikipedia.org/wiki/DevOps">DevOps</a> stellen das "Bindeglied" zwischen dem IT-Systembetrieb und dem restlichen Entwicklungsteam und sind in den letzten Jahren zu einer unverzichtbaren Rolle in agilen Projekten geworden.</p>

<h3 id="im-interview-andreas-mandi-beke">Im Interview: Andreas Mandi-Beke</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_andy.jpg" />
Es ist mir eine besondere Freude, dass ich für diese besondere Perspektive der agilen Software-Entwicklung mit <a href="https://www.xing.com/profile/Andreas_MandiBeke">Andreas Mandi-Beke</a> einen Agilisten und erfahrenen agilen DevOp gewinnen konnte. Andreas ist als waschechter DevOp bekannt für agile Umsetzung von IT-Produktion und Administration. Dieses Interview mit Andreas ist das dritte in meiner Forschungsreise durch die Welt der <a href="der-agilist.html">Agilisten</a>. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hi Andreas! Was machst Du beruflich?</p>
</blockquote>

<p><em>Andreas:</em> Ich administriere seit einigen Jahren schon vielerlei Systemumgebungen für einen großes Webportal - AutoScout24 - und habe auch besonderen Spaß daran. Ich finde es einfach spannend, effektive Lösungswege für administrative Herausforderungen in kurzer Zeit umzusetzen. Im Web musst Du am Ball bleiben.</p>

<blockquote>
<p>Was sind Deine Ziele, wenn es um Agile Software Entwicklung geht?</p>
</blockquote>

<p><em>Andreas:</em> Puh... ich würde aus meiner DevOp-Sicht zwei wichtige Ziel-Aspekte anbringen: die Continuous Integration und das Continuous Deployment. Das ist meiner Meinung nach ein wichtiger Punkt, denn genau diese Methoden ermöglichen es, Verantwortung über die Software wieder mehr dorthin zu tragen, wo sie entsteht: beim Software-Entwickler. Ich als DevOp kann das durch eine gute CI/CD unterstützen und es konsequenterweise als eines meiner Ziele ins Auge fassen.</p>

<blockquote>
<p>Welchen Herausforderungen muss sich ein agiler DevOp im agilen Umfeld stellen?</p>
</blockquote>

<p><em>Andreas:</em> Ein DevOp ist ein Chamäleon. Er muss flexibel und anpassungsfähig sein. Ein DevOp vereint zwei ganz entscheidende Perspektiven: Einerseits ist es wichtig, im Systembetrieb Zuverlässigkeit und Stabilität zu gewährleisten. Andererseits ist es wichtig, offen für Veränderungen zu sein und sie sogar zu fördern. Das ist Elementar für einen agilen DevOp: er fördert die Veränderung, in dem er es in seiner Person und Position ermöglicht, Stabilität und Veränderung im Einklang zu halten.</p>

<blockquote>
<p>Was ist für einen DevOp wichtig im Zusammenspiel zwischen Software-Entwicklung und Operations?</p>
</blockquote>

<p><em>Andreas:</em> Das wichtigste ist und bleibt die Kommunikation. Wir sind alle Menschen und können ein gemeinsames Verständnis nur durch enge und intensive Kommunikation erreichen. Ich als DevOp habe andere Perspektiven auf die Software als ein Software-Entwickler - und das ist auch gut so. Das entscheidende ist die Abstimmung hin zu einem gemeinsamen Zielbild. Für mich ist Kommunikation ein fundamentales Erfolgskriterium.</p>

<blockquote>
<p>Wie integriert sich ein DevOp denn in ein agiles Team?</p>
</blockquote>

<p><em>Andreas:</em> Meine Vorstellung von einer guten Teamintegration fängt nicht bei anderen Teammitgliedern an, sondern beim DevOp selbst. Er soll in der Lage sein, aktiv auf alle Beteiligten zugehen zu können und sich über den Stand der Dinge zu informieren. Hier ist wieder der Punkt der Kommunikation. Es ist immens wichtig, das ein DevOp einen Teil seiner Zeit für diese "Informationsbeschaffung" und den "Austausch" investiert, um dann im Ergebnis Klarheit über die Software aus Betriebssicht zu erlangen.</p>

<blockquote>
<p>Wie stellt sich ein agiler DevOp den "idealen" agilen Software-Entwickler vor?</p>
</blockquote>

<p><em>Andreas:</em> Na ganz klar: er ist <em>agil</em>. Das entscheidende Kriterium ist für mich das "Leben" von Agilität. Es geht um die aktive Gestaltung des Fortschritts. Meiner Meinung nach ist es nicht nur damit getan, dass sich ein Entwickler mit neuen Technologien auseinandersetzt, sondern es in den richtigen Kontext für seine Aufgabe rückt. Die Fähigkeit, sich für Veränderung und Fortschritt einzusetzen ist für mich auch wichtig.</p>

<p>Ja, und ein weiterer, <em>sehr wichtiger</em> Punkt ist für mich die Kompromissfähigkeit. Ob es nun ein agiler DevOp, agiler Entwickler oder agiler Tester ist. Kompromisse sind das Mittel des Einzelnen, einen gemeinsamen Weg zu gehen.</p>

<blockquote>
<p>Was ist in einem agilen Team Deiner Meinung nach entscheidend?</p>
</blockquote>

<p><em>Andreas:</em> Neben der Kommunikation ist für ein agiles Team meiner Meinung nach die Ausgewogenheit und Interdisziplinarität wichtig. Ich kann Software nicht ohne Tester, DevOp, Product Owner, Designer oder Entwickler umsetzen. Gleichzeitig sollte das Team in der Lage sein, "sich selbst zu fordern". Also: die Selbstorganisation sollte meiner Meinung nach auch eine stetige gemeinsame Zielsetzung und Zielumsetzung enthalten.</p>

<blockquote>
<p>Man sagt oft, Scrum und Systembetrieb - das passt nicht so zusammen. Stimmt das?</p>
</blockquote>

<p><em>Andreas:</em> Wer sagt das? Ich sage: es ist durchaus möglich. Kommunikation und Kompromissfähigkeit vorausgesetzt. Scrum hat natürlich die "Erstellung von Software" im Fokus, während der Systembetrieb sich eher um den "Betrieb von Software" beschäftigt. Insofern ist die Systembetriebssicht etwas breiter. Aber: Ich finde es als DevOp besonders wichtig, gerade in dem Erstellungsprozess einer Software schon involviert zu sein und mitzuwirken. Das Ergebnis aus Betriebssicht ist eine wesentlich bessere Wartungssicht auf die Software. </p>

<blockquote>
<p>Welches sind die größten Herausforderungen für einen Administrator, der sich zu einem agilen Operator oder sogar DevOp entwickeln möchte?</p>
</blockquote>

<p>Er muss sich von der klassischen Administration verabschieden - definitiv. Das denken innerhalb des "Systems" und innerhalb einer "Systemlandschaft" ist da nicht mehr ausreichend. Er muss sich und seine Sichtweise erweitern auf die Dinge, die vor und neben seiner Systemlandschaft passieren. Er sollte aufgeschlossen gegenüber der Software-Entwicklung, gegenüber der Produkt-Entwicklung und den vielen anderen Facetten von Software sein.</p>

<p>Die Rolle des DevOp ist hier auch klar: Er ist der <em>Enabler</em> im Sinne der "Verwirklichung" - also dem eigentlichen Einsatz - von Software. Es muss dem DevOp klar sein, dass diese Schnittstelle ein heißer Punkt in der gesamten Software-Produktions-Kette ist. Je cooler er ist, umso besser kann er auch seine Aufgabe wahrnehmen.</p>

<p>Die entscheidenden Merkmale für einen DevOp sind für mich <em>Aufgeschlossenheit</em>, <em>Kommunikationsfreude</em> und <em>Professionalität</em>.</p>

<blockquote>
<p>Was sollte ein agiler DevOp nicht tun - oder können? Wo sind die Grenzen eines DevOp?</p>
</blockquote>

<p>Das Rollenverständnis sollte schon ausgeprägt sein. Was ich damit meine ist, dass er schon seine Kernkompetenz im Fokus halten sollte. Ein DevOp kann sicherlich gute Skripte für die Automatisierung schreiben. Das versetzt ihn aber noch lange nicht in die Lage, sich auf die Kompetenzen eines Software-Entwickler einzulassen. Das gleiche könnte ich jetzt auch für die anderen Rollen - also Tester, Usability-Experte o.ä. - anbringen. Die Konzentration auf das Hauptaufgabengebiet ist wichtig.</p>

<p>Auch denke ich, dass er nicht damit aufhören sollte, sich und seine Arbeit zu reflektieren. Ein stetiger - manchmal durchaus kritischer - Blick auf die eigene Arbeit und Arbeitsweise ist wichtig. Also: nicht mehr reflektieren sollte er definitiv nicht tun.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p>Das ist eine gute Frage. Ich glaube, das der Gemeinschaftsgedanke nach wie vor schwierig und lückenhaft ist. Es kann immer wieder vorkommen, das man in das alte "Schubladen-Denken" der "Verantwortlichkeiten" und "Zuständigkeiten" zurückfällt. Gerade, wenn Dinge mal nicht so rund laufen. Aber genau dann ist es wichtig, die gemeinschaftliche Verantwortung zu stärken und im Team zu agieren.</p>

<p>Es fehlt meiner Meinung nach auch ein konkreteres auf einander zugehen. Zum Beispiel können wir DevOps uns auch mit dem Produkt-Management austauschen. Im Gegenzug finde ich, kann auch der aktive Austausch von anderen Abteilungen oder Perspektiven zum Systembetrieb gefördert werden. Ich fände es schön, wenn sich z.B. auch ein Produkt-Manager für die Software- und Systemwartung mehr begeistern könnte.</p>

<blockquote>
<p>Wenn Du Dir für agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p>Puh. Ich würde mir wünschen, das es nicht mehr möglich wäre, Unternehmen "ausbluten" zu lassen. Die uneingeschränkte und geradezu unantastbare Macht des puren Kapitalismus lässt sich für mich nicht mit dem agilen Gedanken vereinbaren. Kooperation und Kapitalismus müssen in einem ausgewogenen Verhältnis zueinander stehen. Es kann für eine zukünftige agile Arbeitswelt nicht richtig sein, dass eine einzige Kraft oder Meinung alleinig Bestand haben kann. Vielmehr wünsche ich mir für jedes Unternehmen und jeden Mitarbeiter ein gemeinsames Wirken für ein gemeinsames Ziel - auf einer ausgewogenen und partnerschaftlichen Basis.</p>

<p><strong>Vielen Dank, Andreas!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">PHP Trickshot: Lambda Functions</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/php-trickshot-lambda-functions.html"/>
            <updated>2012-03-14T22:00:00Z</updated>
            <published>2012-03-14T22:00:00Z</published>
            <id>/php-trickshot-lambda-functions.html</id>
            
            <content type="html"><![CDATA[
                <p>It's time for another short instalment of my <em>"trickshot"</em> blog post series. The "trick" I'm going to show today with PHP literally is no trick at all. It's just a language feature which sadly isn't used that frequently. That might be reasoned by the fact that the feature is only available since 2009, when PHP version 5.3 was released along with the first implementation of it. The feature I'm talking about <em>obviously</em> is <strong>anonymous functions</strong> aka <strong>lambda functions</strong>.</p>

<p>The syntax of the PHP lambda will be very familiar to JavaScript developers, actually:</p>

<div class="codehilite"><pre><span class="nv">$plus</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span> <span class="nv">$y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$x</span> <span class="o">+</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span>
</pre></div>

<p>That's pretty straight forward. However, PHP's syntax is still unique. This mainly is reasoned by the fact how <em>closures</em> are implemented in PHP. Let's look at a function with a closure:</p>

<div class="codehilite"><pre><span class="nv">$canprint</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="nv">$x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$x</span> <span class="nv">%</span> <span class="nv">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span> <span class="p">};</span>
<span class="nv">$printseq</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span> <span class="nv">$z</span><span class="p">)</span> <span class="k">use</span> <span class="p">(</span><span class="nv">$canprint</span><span class="p">)</span> <span class="p">{</span> 
  <span class="k">for</span> <span class="p">(</span><span class="nv">$i</span> <span class="o">=</span> <span class="nv">$a</span><span class="p">;</span> <span class="nv">$i</span> <span class="o">&lt;</span> <span class="nv">$z</span><span class="p">;</span> <span class="nv">$i</span><span class="o">++</span><span class="p">)</span>
    <span class="n">echo</span> <span class="nv">$canprint</span><span class="p">(</span><span class="nv">$i</span><span class="p">)</span> <span class="p">?</span> <span class="nv">$i</span> <span class="p">:</span> <span class="s">&#39;-&#39;</span><span class="p">;</span>
<span class="p">};</span>

<span class="nv">$printseq</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</pre></div>

<p>Developers coming from other languages (such as JavaScript) may scratch their had a little on the explicit <code>function($x) use ($y) {}</code> syntax. However, it's quite interesting that you pretty easily can get used to it.</p>

<p>The reason why I post this (nearly 3 years old) language feature of PHP is not only that I find it to be used rarely. I for one think that anonymous functions are very important to any language and enable the developer to build a whole new class of elegant solutions. Let me illustrate this with a classic example showing you that anonymous functions can be called recursively as well:</p>

<div class="codehilite"><pre><span class="nv">$fib</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="nv">$x</span><span class="p">)</span> <span class="k">use</span> <span class="p">(</span><span class="o">&amp;</span><span class="nv">$fib</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$x</span><span class="o">&gt;</span><span class="mi">1</span> <span class="p">?</span> <span class="nv">$fib</span><span class="p">(</span><span class="nv">$x</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="nv">$fib</span><span class="p">(</span><span class="nv">$x</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="p">:</span> <span class="nv">$x</span><span class="p">;</span> <span class="p">};</span>
</pre></div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">PHP Trickshot: Meta Variables</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/php-trickshot-meta-variables.html"/>
            <updated>2012-03-13T14:00:00Z</updated>
            <published>2012-03-13T14:00:00Z</published>
            <id>/php-trickshot-meta-variables.html</id>
            
            <content type="html"><![CDATA[
                <p>Last week I blogged about two little <em>"tricks"</em> in everyday C# coding. This week I want to switch language and show you a little gimmick in PHP which - to my own surprise - seems to be rarely used. The feature I'm talking about is <em>meta-variables</em>, also known as <em>variable-variables</em>. It's a feature which has been around in PHP for quite a long time and it's main purpose is to support meta-programming scenarios.</p>

<p>Suppose you have a file with some configuration settings:</p>

<div class="codehilite"><pre><span class="nv">$admin_active</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
<span class="nv">$admin_startpage</span> <span class="o">=</span> <span class="s">&quot;dashboard&quot;</span><span class="p">;</span>
<span class="nv">$admin_usemru</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
<span class="nv">$admin_persist_flag</span> <span class="o">=</span> <span class="n">F_ACTIVE</span> <span class="o">|</span> <span class="n">F_CHANGED</span><span class="p">;</span>

<span class="nv">$user_active</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
<span class="nv">$user_startpage</span> <span class="o">=</span> <span class="s">&quot;listissues&quot;</span><span class="p">;</span>
<span class="nv">$user_usemru</span> <span class="o">=</span> <span class="n">false</span><span class="p">;</span>
<span class="nv">$user_persist_flag</span> <span class="o">=</span> <span class="n">F_ACTIVE</span><span class="p">;</span>

<span class="nv">$dashboard_layout</span> <span class="o">=</span> <span class="s">&quot;simple&quot;</span><span class="p">;</span>
<span class="nv">$listissues_layout</span> <span class="o">=</span> <span class="s">&quot;self&quot;</span><span class="p">;</span>
<span class="nv">$markissue_layout</span> <span class="o">=</span> <span class="s">&quot;detail&quot;</span><span class="p">;</span>
</pre></div>

<p>Let's further on suppose that you should write a small snippet to administer and configure these settings from above. It's pretty obvious that settings are grouped by role in the settings file (see <code>$admin_startpage</code> and <code>$user_startpage</code>). If you were to build up a configuration panel where the current role would be able to change his own dashboard layout, how would you solve that? Assume that you have variable with the current role in action, something like </p>

<div class="codehilite"><pre><span class="nv">$active_role</span> <span class="o">=</span> <span class="s">&quot;admin&quot;</span><span class="p">;</span>
</pre></div>

<p>How to read and change the page layout of the startpage of the currently logged on role?</p>

<p>With meta-variables, the solution is almost a one-liner:</p>

<div class="codehilite"><pre><span class="nv">$active_startpage</span> = &quot;<span class="cp">${</span><span class="n">active_role</span><span class="cp">}</span>_startpage&quot;;
<span class="nv">$page</span> = <span class="cp">${</span><span class="err">$</span><span class="n">active_startpage</span><span class="cp">}</span>; # &quot;dashboard&quot; if role is &quot;admin&quot;
<span class="nv">$active_layout</span> = &quot;<span class="cp">${</span><span class="n">page</span><span class="cp">}</span>_layout&quot;;
<span class="nv">$layout</span> = $$active_layout
</pre></div>

<p>The second line is the "trick" called meta-variable. The line actually reads: "Take the value of <code>$active_startpage</code> as the name (or symbol) of the variable I want to access the value of". The same applies to the 4th line, but this time with the more lightweight <code>$$</code>-syntax. Let's look at an even simpler example to get meta-variables illustrated:</p>

<div class="codehilite"><pre><span class="nv">$mode</span> <span class="o">=</span> <span class="s">&quot;effect&quot;</span><span class="p">;</span>
<span class="nv">$menu</span> <span class="o">=</span> <span class="s">&quot;mode&quot;</span><span class="p">;</span>

<span class="n">echo</span> <span class="nv">$$menu</span><span class="p">;</span>  <span class="c1"># prints &quot;effect&quot;</span>
<span class="n">echo</span> <span class="nv">$$mode</span><span class="p">;</span>  <span class="c1"># prints &quot;shade&quot;</span>
<span class="n">echo</span> <span class="vg">$$</span><span class="nv">$menu</span><span class="p">;</span> <span class="c1"># prints &quot;shade&quot;</span>
</pre></div>

<p>The above example shows the power of meta-variables quite nicely. Despite the lightweight <code>$$</code>-syntax (which is more commonly used than the complex curly syntax), the example shows that the level of nesting is not limited to a simple meta-lookup. In fact, meta-variables (in theory) can be nested arbitrarily. I for one haven't ever used a deeper nesting than 3, though.</p>

<p>Meta-variables can be very useful for code/variable introspection and simple metaprogramming tasks. However, it should be kept in mind as well that the power of meta-variables can be very dangerous as well, especially when it is combined with user input. That being said, meta-variables should be used with great caution.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Games</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-games.html"/>
            <updated>2012-03-12T08:00:00Z</updated>
            <published>2012-03-12T08:00:00Z</published>
            <id>/der-agilist-agile-games.html</id>
            
            <content type="html"><![CDATA[
                <p>Es freut mich ganz besonders, gerade bei dem so interessanten und spannenden Thema der <strong>Agile Games</strong> ein Gespräch mit einem wahren Experten zu führen. Der Experte, um den es hier geht, ist kein geringerer als der geschätzte Agilist <a href="http://vinylbaustein.net">Thorsten O. Kalnin</a>, in Fachkreisen auch bekannt unter dem Namen <a href="http://twitter.com/vinylbaustein">@vinylbaustein</a>.</p>

<h3 id="im-interview-thorsten-o-kalnin">Im Interview: Thorsten O. Kalnin</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_thorsten_xp_days_ger.jpg" />
Mein Interview mit Thorsten ist das zweite bei meiner Erkundungstour durch die Welt der professionellen <a href="der-agilist.html">Agilisten</a>. Nachdem es im ersten Interview um <a href="der-agilist-agile-coaching.html">Agile Coaching</a> allgemein ging, möchte ich mit Thorsten in den speziellen Bereich der sog. "Agile Games" eintauchen. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!</p>

<blockquote>
<p>Hallo Thorsten! Meine überraschende Einstiegsfrage: Was machst Du beruflich?</p>
</blockquote>

<p><em>Thorsten:</em> Ok. Mein Name ist Thorsten Oliver Kalnin, ich lebe mit meiner Hündin in Köln und bin freiberuflicher Coach und Trainer. Neben Life &amp; Business Coaching bin ich auch als Lean &amp; Agile Coach, <em>Empirical Experience Facilitator</em> und StrategicPlay Facilitator tätig. Darüberhinaus gebe ich auch Scrum Trainings und Teambuilding Workshops.</p>

<blockquote>
<p>Was sind Deine Ziele bei der agilen Software-Entwicklung?</p>
</blockquote>

<p><em>Thorsten:</em> Ich habe zwar meine Wurzeln in der Softwareentwicklung, konzentriere mich jedoch bereits seit einigen Jahren speziell auf das Thema Agiles Mindset, Coaching und Trainings. Mein Ziel ist es, Individuen, Teams und Unternehmen mit kreativen Techniken und Verfahren zu unterstützen, damit diese ihr Potenzial erweitern und ausschöpfen können. Ob es sich dabei um Softwareentwickler, Autobauer oder Manager handelt ist mir ehrlich gesagt zweitrangig. </p>

<p>Für mich steht der <em>Mensch als Individuum im Mittelpunkt</em> meines Handelns. Nur ein ausgeglichener, glücklicher und kreativer Mensch macht als Person ein Team stark. Stichwort: systemisches Denken und Handeln.</p>

<blockquote>
<p>Du bist als agiler Coach besonders bekannt und engagiert im Bereich Agile Games. Worum geht es bei "Agile Games"?</p>
</blockquote>

<p><em>Thorsten:</em> Dafür möchte ich etwas ausholen. Zunächst bevorzuge ich den Namen <strong>Empirical Experience</strong>. Dahinter verbergen sich <em>Agile Games</em>, <em>Serious Play</em> sowie <em>Training from the back of the room</em>. </p>

<p>Bei <em>Empirical Experience</em> geht es um das Lernen. Egal, ob es sich um Werte, Wissen, Techniken oder ähnliches handelt. Das Prinzip besteht darin, ein sicheres Umfeld für den Teilnehmer zu schaffen in welchem die natürlichen Gesetze vorübergehend außer Kraft gesetzt werden. Dies gibt Menschen die Möglichkeit auszuprobieren, Fehler zu machen und dadurch effektive Lerninhalte sich zu eigen zu machen in dem man sie erfährt.</p>

<p>Denke z.B. an einen Piloten der in einem Flugsimulator kritische Situationen wieder und wieder übt um mit ihnen zu recht zu kommen und in der realen Welt dann anwenden kann. Das ist <em>Empirical Experience</em>.</p>

<blockquote>
<p>Wofür bzw. an welchen Punkten kann man Empirical Experience konkret im Arbeitsalltag einsetzen?</p>
</blockquote>

<p><em>Thorsten:</em> Das ist nichts für jeden Tag. Schließlich geht es im Alltag ja darum, seine Arbeit zu machen. Vielmehr geht es darum, sich kontinuierlich weiter zu entwickeln - und dafür ist Empirical Experience gedacht. Man kann es z.B. sehr gut in Retrospektiven anwenden; Stichwort: Kaizen &amp; Teambuilding.</p>

<blockquote>
<p>Für wen sind SeriousPlay-Strategien geeignet, für wen eher nicht?</p>
</blockquote>

<p><em>Thorsten:</em> Ich denke SeriousPlay ist für jeden geeignet! Ob es sich dabei um Entwickler, Marketing-Fachleute oder Autobauer handelt ist zweitrangig. Es geht darum, die Arbeitsumwelt interessanter zu machen, zu lernen und ganz im Besonderen dabei viel Spaß zu haben. Ich gebe z.B. auch SeriousPlay Workshops für Innovatoren im medizinischen Bereich.</p>

<p>Eine Anmerkung noch zu <em>"SeriousPlay":</em></p>

<p>Ich verwende den Begriff <em>Empirical Experience</em>, da bei der Verwendung des Namens SeriousPlay oder Agile Games viele Menschen leider "dicht" machen. Manche denken dabei es geht um "Zeitvertreib" und "Zeitverschwendung", wenn sie die Begriffe "Games" oder "Play" hören. Das war für mich der Grund, vor gut einem Jahr diese Begriffe mit Empirical Experience zu substituieren. Hörten manche z.B. <em>"Games"</em> oder <em>"Play"</em>, kam oft: "ich habe keine Zeit zu spielen, ich muss arbeiten" - ohne dass ihnen dabei bewusst war, dass dadurch <strong>wichtige, strategische Lerninhalte vermittelt</strong> oder <strong>Strategien entwickelt</strong> werden können.</p>

<blockquote>
<p>Welche (potentiellen) Nachteile siehst Du beim Einsatz von Empirical Expirience bzw. SeriousPlay?</p>
</blockquote>

<p><em>Thorsten:</em> Nachteile sehe ich im Prinzip keine. Im Gegenteil. Menschen entgeht eine wichtige Entwicklung und ich bin der Meinung dass dies noch weiter wachsen wird. Ich sehe den Nachteil eher darin, Empirical Experience zu vermeiden!</p>

<blockquote>
<p>Welches ist das für Dich das wichtigste Charaktermerkmal für Agilität?</p>
</blockquote>

<p><em>Thorsten:</em> Das ist eine gute Frage. Ich bin gar nicht sicher, ob ich das mit einem Charaktermerkmal beschreiben kann. Wichtig ist, <em>open-minded</em> zu sein, keine Angst vor Veränderungen zu haben und sich selbst immer wieder in Frage zu stellen. Agilität ist für mich ein <em>Mindset</em>, eine Art Lebensweisheit, eine Philosophie.</p>

<p>Die Offenheit für Fehler und als Konsequenz aus Fehlern zu lernen möchte ich noch anfügen.</p>

<blockquote>
<p>Wie motivierst Du Dich für Deine Arbeit mit Menschen und Unternehmen?</p>
</blockquote>

<p><em>Thorsten:</em> Durch die Arbeit selbst. Wenn ich einen Workshop, ein Training oder ein Coaching gebe, mache ich mir vorher sehr viele Gedanken. Wenn ich merke, dass meine Arbeit Menschen nicht nur beruflich sondern auch privat weiterbringt, sie Spass daran haben - dann ist das schon eine gehörig große Motivation.</p>

<p>Darüber hinaus gehört aber auch ein privater Ausgleich. Selbst Spaß zu haben, in die Natur zu gehen, in die Sauna, Laufen und Musik machen, einfach seinen Leidenschaften zu fröhnen.</p>

<blockquote>
<p>Wie wichtig ist es eigentlich, "aus Fehlern zu lernen" - und - wie kann man das lernen?</p>
</blockquote>

<p><em>Thorsten:</em> Es ist enorm wichtig aus Fehlern zu lernen und das muss man sich auch eingestehen können. Viele Menschen versuchen perfekt zu sein - und genau da liegt das Problem. Perfektion ist der Killer von Weiterentwicklung. Ich möchte dazu Seth Godin zitieren: <em>"Deliver early, fail early, inspect and adapt, deliver again."</em> und wenn möglich in kleinen Zyklen. Stichwort: LeanStartup.</p>

<p>Wie man das "Fehler machen" lernen kann ist eine gute Frage. Ich denke man kann es nicht wirklich lernen. Es ist mehr eine Frage der Einstellung. Z.B: Wie kann ich Fehler anfangen zu feiern? Denn schließlich lerne ich aus ihnen.</p>

<p>Man muss verstehen dass Fehler das Prinzip der Natur sind. Der Mensch ist aus vielen Fehlern entstanden. Das Prinzip der Evolution. Wie Edison einst so schön gesagt hat als er die Glühbirne erfand: <em>"Ich habe nicht 2000 mal versagt, ich habe lediglich 2000 Wege erkundet die nicht funktionieren für das was ich vorhabe"</em>. </p>

<p>Beispiel Brainstorming oder Blue Sky Thinking: In dem ich sehr viele Ideen kreiere - ohne diese bei der Erstellung zu bewerten - setze ich Potenzial frei. Am Ende sind vielleicht 50 Ideen durchgespielt. Davon sind 40 vermutlich unsinning, 7-8 durchschnittlich aber eben auch 1-2 sehr gute und außergewöhnliche. Nur wenn ich es <strong>zulasse, Fehler zu machen</strong> kann ich <strong>innovativ und kreativ</strong> sein.</p>

<blockquote>
<p>Wie siehst Du die Zukunft der modernen Software-Entwicklung?</p>
</blockquote>

<p><em>Thorsten:</em> Die Software-Entwicklung hat heute einen starken Einfluß auf die gesamte Arbeitswelt. Wir befinden uns mitten in einem Wandel, der noch viele Veränderungen mit sich bringen wird. Die Zukunft liegt in der nachhaltigen Wandelung der Industriegesellschft hin zu einer Arbeitsgemeinschaft, in der Individualität und Bedarfsdeckung im Einklang stehen.</p>

<p>Die Software-Entwicklung - und damit auch die Agilität - ist dabei schon ein Vorreiter. Man kann sicherlich sich auf das agile Manifest beziehen. Aber auch hier geht es weiter. Agilität entwickelt sich auch. Stichwort: Wikispeed. </p>

<p>Der zukunftsweisende Weg ist dabei, dass wir unsere Arbeitswelt auf Individualität ausrichten <em>können</em>. Es ist sehr gut machbar, ökonomisch, kooperativ und individuell zu agieren.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p><em>Thorsten:</em> Es fehlt leider noch vielerorts das Verständnis darüber, was Agilität bedeutet. Ein aktuelles Beispiel ist sicherlich die z.T. sichtbare Reduktion der Agilität auf Scrum. Das ist Schade. Man darf sich da auch nichts vormachen. Gerade im Management-Bereich gibt es dort eine schwierige Ausgangssituation. Das mittlere Management hat oftmals Probleme, mit den neuen Freiräumen und Gestaltungsoptionen umzugehen. Sei es für sich selbst oder für Ihre Abteilung.</p>

<p>Insofern kann man sagen, dass gerade dieses Verständnis erreicht werden muss, in dem man Offenheit fördert und die Kommunikation stärkt. Das ist und bleibt ein Prozess, dem wir uns widmen müssen.</p>

<blockquote>
<p>Wenn Du Dir für die heutige Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p><em>Thorsten:</em> Mein Wunsch ist einfach: Ich wünsche mir, dass <em>jeder, egal wer</em> einen Coach zu rate ziehen kann. Es geht da gar nicht um den Coach selbst, sondern vielmehr um die Erkenntnis, dass ein Partner, der von außen eine Sicht und ein Feedback beitragen kann, ein entscheidender Faktor für die Erarbeitung eines Lösungsweges sein kann. Es ist egal, ob jetzt ein Entwickler, ein Postbote, ein Manager oder ein Coach einen Coach bekommt. Entscheidend ist das Feedback und die professionelle Begleitung.</p>

<p><strong>Vielen Dank, Thorsten!</strong></p>

<p><hr />
<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>
<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
</ul></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">C# Trickshot: Inferred Generic Construction</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/csharp-trickshot-inferred-generic-construction.html"/>
            <updated>2012-03-07T19:00:00Z</updated>
            <published>2012-03-07T19:00:00Z</published>
            <id>/csharp-trickshot-inferred-generic-construction.html</id>
            
            <content type="html"><![CDATA[
                <p>Ok, yesterday I showed a little trick <em>(I don't know if I should name these bits "trick", actually)</em> on how you can perform <a href="csharp-trickshot-nullsafe-linq-query.html">Nullsafe LINQ Queries</a> with C#. Today, it's time to showcase another (very) little trickshot in C#. This time I'm going to show you how you can improve readability of your code when working with generics.</p>

<p>In C#, generics are a powerful thing. Most C# developers use them day by day, especially with collection types like <code>List&lt;T&gt;</code> or <code>Dictionary&lt;K,V&gt;</code>. From Time to time, even custom generic types can be very useful. I've seen quite a lot of custom generic types recently on a project where a generalized request/response communication system is being implemented for component interaction.</p>

<p>Consider you want to create a pair of values for a simple configuration file model, something like a setting with a name and a value. One might easily implement this with the (quite) new <code>Tuple&lt;F,S&gt;</code> type:</p>

<div class="codehilite"><pre><span class="n">var</span> <span class="n">foreground</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="kt">string</span><span class="p">&gt;(</span><span class="s">&quot;foreground&quot;</span><span class="p">,</span> <span class="s">&quot;blue&quot;</span><span class="p">);</span>
<span class="n">var</span> <span class="n">background</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="n">ConsoleColor</span><span class="p">&gt;(</span><span class="s">&quot;background&quot;</span><span class="p">,</span> <span class="n">ConsoleColor</span><span class="p">.</span><span class="n">Yellow</span><span class="p">);</span>
<span class="n">var</span> <span class="n">errorlines</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="kt">int</span><span class="p">&gt;(</span><span class="s">&quot;errorlines&quot;</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
</pre></div>

<p>Quite straightforward, isn't it? I'm even glad we have <em>type inference</em> since C# 3 and can use <code>var</code> here, otherwise we would've got the type repetition like this:</p>

<div class="codehilite"><pre><span class="n">Tuple</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="kt">bool</span><span class="p">&gt;</span> <span class="n">supressErrors</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="kt">bool</span><span class="p">&gt;(</span><span class="s">&quot;suppressErrors&quot;</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span>
</pre></div>

<p>I think you agree with me that this is quite a lot of code to write just to create a pair of values. Not that nice. But there's one already mentioned feature to the rescue: the almighty <em>type inference</em> can help out again.</p>

<p>C# not only supports type inference for variable initialization but as well generic method invocation. I'm sure that the enthusiatic C# developers already know that this feature actually exists. Yet, it's being used quite rarely. To benefit from this feature, we could write a static construction method for the above <code>Tuple&lt;K,V&gt;</code> example:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">New</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="n">K</span><span class="p">,</span><span class="n">V</span><span class="p">&gt;</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="n">K</span><span class="p">,</span><span class="n">V</span><span class="p">&gt;(</span><span class="n">K</span> <span class="n">k</span><span class="p">,</span> <span class="n">V</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="k">new</span> <span class="n">Tuple</span><span class="p">&lt;</span><span class="n">K</span><span class="p">,</span><span class="n">V</span><span class="p">&gt;(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>And then - immediately - a reworked version of the above settings example looks much more readable - and intuitive:</p>

<div class="codehilite"><pre><span class="n">var</span> <span class="n">foreground</span> <span class="p">=</span> <span class="n">New</span><span class="p">.</span><span class="n">Tuple</span><span class="p">(</span><span class="s">&quot;foreground&quot;</span><span class="p">,</span> <span class="s">&quot;blue&quot;</span><span class="p">);</span>
<span class="n">var</span> <span class="n">background</span> <span class="p">=</span> <span class="n">New</span><span class="p">.</span><span class="n">Tuple</span><span class="p">(</span><span class="s">&quot;background&quot;</span><span class="p">,</span> <span class="n">ConsoleColor</span><span class="p">.</span><span class="n">Yellow</span><span class="p">);</span>
<span class="n">var</span> <span class="n">errorlines</span> <span class="p">=</span> <span class="n">New</span><span class="p">.</span><span class="n">Tuple</span><span class="p">(</span><span class="s">&quot;errorlines&quot;</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
</pre></div>

<p>Far better me thinks! Notice that the generic types for the tuple are being <em>inferred from the parameters</em> of the <code>Tuple&lt;K,V&gt;</code> static method. Yet another tiny gimmick with quite a big value delivered in terms of readable and concise code. All thanks to type inference.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">C# Trickshot: Nullsafe LINQ Query</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/csharp-trickshot-nullsafe-linq-query.html"/>
            <updated>2012-03-06T19:00:00Z</updated>
            <published>2012-03-06T19:00:00Z</published>
            <id>/csharp-trickshot-nullsafe-linq-query.html</id>
            
            <content type="html"><![CDATA[
                <p>From time to time I write code in C#. Even more, I read a lot of C# code, too. While reading code, I happen to see nice concepts and - not so nice concepts. I often see code and think to myself "this could've been done more elegant". I'm sure you've had a similar situation as well when you're a developer, tester, architect or hacker.</p>

<p>Most recently, I see code similar like the following quite often:</p>

<div class="codehilite"><pre><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;</span> <span class="n">GetCustomersOfSection</span><span class="p">(</span><span class="n">Filter</span> <span class="n">regionAndNameFilter</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;</span> <span class="n">customersOfSection</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;();</span>
  <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;</span> <span class="n">customers</span> <span class="p">=</span> <span class="n">GetCustomersBy</span><span class="p">(</span><span class="n">regionAndNameFilter</span><span class="p">);</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">customers</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">customersOfSection</span> <span class="p">=</span> 
      <span class="n">from</span> <span class="n">customer</span> <span class="k">in</span> <span class="n">customers</span>
      <span class="n">where</span> <span class="n">customer</span><span class="p">.</span><span class="n">Section</span> <span class="p">==</span> <span class="n">SectionCode</span><span class="p">.</span><span class="n">InnerCirle</span>
      <span class="n">select</span> <span class="n">customer</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="n">customersOfSection</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>Now, what's wrong with that code? - <em>Nothing.</em> However, it could've been written a little smarter. The obvious non-nicety here is the check on <code>customer</code> as well as setting the default on <code>customersOfSection</code>. How can we improve this? The answer is two little question marks plus a little gimmick. Yes, I'm talking about the <a href="http://msdn.microsoft.com/en-us/library/ms173224.aspx"><em>null-coalescing</em></a> operator <code>??</code>.</p>

<p>Let's see how this micht look like in action:</p>

<div class="codehilite"><pre><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;</span> <span class="n">GetCustomersOfSection</span><span class="p">(</span><span class="n">Filter</span> <span class="n">regionAndNameFilter</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span>
    <span class="n">from</span> <span class="n">customer</span> <span class="k">in</span> <span class="nf">GetCustomersBy</span><span class="p">(</span><span class="n">regionAndNameFilter</span><span class="p">)</span> <span class="p">??</span> <span class="n">Enumerable</span><span class="p">.</span><span class="n">Empty</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;()</span>
    <span class="n">where</span> <span class="n">customer</span><span class="p">.</span><span class="n">Section</span> <span class="p">==</span> <span class="n">SectionCode</span><span class="p">.</span><span class="n">InnerCircle</span>
    <span class="n">select</span> <span class="n">customer</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>Now this looks a lot more concise, isn't it? The trick obviously is the usage of the inline null check <code>?? Enumerable.Empty&lt;Customer&gt;()</code>. It makes the <code>if</code> clause fall apart into two little question marks. Plus, the overhead of variable declaration is gone. If we now extract this construct to a little extension method, suddenly the code starts to tell us the whole story:</p>

<div class="codehilite"><pre><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Customer</span><span class="p">&gt;</span> <span class="n">GetCustomersOfSection</span><span class="p">(</span><span class="n">Filter</span> <span class="n">regionAndNameFilter</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span>
    <span class="n">from</span> <span class="n">customer</span> <span class="k">in</span> <span class="nf">GetCustomersBy</span><span class="p">(</span><span class="n">regionAndNameFilter</span><span class="p">).</span><span class="n">OrEmpty</span><span class="p">()</span>
    <span class="n">where</span> <span class="n">customer</span><span class="p">.</span><span class="n">Section</span> <span class="p">==</span> <span class="n">SectionCode</span><span class="p">.</span><span class="n">InnerCircle</span>
    <span class="n">select</span> <span class="n">customer</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">Extensions</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">OrEmpty</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="k">this</span> <span class="n">T</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">t</span> <span class="p">??</span> <span class="n">Enumerable</span><span class="p">.</span><span class="n">Empty</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;();</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Well, looks better, isn't it? I for one think that the code is now much more readable and even has gained preciseness in telling me what it's actually doing. Call it a little improvement. Nonetheless, it's an improvement worth doing it. Catch that low hanging fruit when you happen to stop by to similar situations.</p>

<p><em>PS: No, I'm not going to tell you now what this little nicety has to do with monads ;-)</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist: Agile Coaching</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist-agile-coaching.html"/>
            <updated>2012-03-05T08:00:00Z</updated>
            <published>2012-03-05T08:00:00Z</published>
            <id>/der-agilist-agile-coaching.html</id>
            
            <content type="html"><![CDATA[
                <p>Agiles Coaching ist für viele eine schwer zu erfassende Thematik. Sei es als agiler Neuling, agiler Software-Entwickler oder erfahrener Manager. Ich selbst habe die Erfahrung schon öfters machen dürfen, dass manche mit dem Begriff 'Agiles Coaching' nicht viel anfangen können. Gerade deswegen ist es für mich eine besondere Freude, mit einem Agilisten und Coach mit Leib und Seele - dem geschätzten <a href="http://www.it-agile.de/282.html#c3094">Christian Dähn</a> von <a href="http://www.it-agile.de/">IT-Agile</a> - ein Gespräch über dieses Thema zu führen!</p>

<h3 id="im-interview-christian-dahn">Im Interview: Christian Dähn</h3>

<p><img alt="" class="portrait" src="/media/images/der_agilist_christian_daehn.jpg" />
Das folgende Gespräch mit Christian ist das erste von mehreren während meiner kleinen Rundreise durch die Welt der professionellen <a href="der-agilist.html">Agilisten</a>. Gerade bei dem heißen Thema des <strong>Agile Coaching</strong> bin ich froh, mit Christian einen kompetenten Innovationstreiber als Gesprächspartner gewonnen zu haben. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spass!</p>

<blockquote>
<p>Hi Christian! Also, was machst Du eigentlich beruflich?</p>
</blockquote>

<p><em>Christian:</em> Tja, also: ich bin ein Agiler Coach und Trainer. Ich beschäftige mich mit agiler Einführung in Unternehmen und helfe Teams, die agile Methoden anwenden wollen. Besonders Neulingen helfe ich gut und gerne. Viele neue Dinge kann man einfach besser verstehen und umsetzen, wenn man eine hilfreiche Begleitung beiseite hat.</p>

<blockquote>
<p>Was sind Deine Ziele, wenn es um Agile Software Entwicklung geht?</p>
</blockquote>

<p><em>Christian:</em> Ohh, das ist ein weites Feld. Vor nicht allzu langer Zeit war mein Verständnis der agilen Software Entwicklung, dass das primäre Ziel die Verbesserung der Produktivität im Sinne der Verbesserung des Arbeitsergebnisses ist. </p>

<p>Mittlerweile bin ich der festen Überzeugung, dass die primäre Zielsetzung eine verbesserte Zusammenarbeit ist. Es geht bei der agilen Software-Entwicklung um eine partizipative Unternehmung, um kooperative Teamstrukturen und eine gemeinsame, kooperative Arbeit.</p>

<blockquote>
<p>Was ist Deiner Meinung nach das schönste daran, ein Agiler Coach zu sein?</p>
</blockquote>

<p><em>Christian:</em> Es gibt viel schönes! Eins der schönsten Dinge ist die Community und Professionalität der Gleichgesinnten. Der Austausch, der offene Umgang mit dem Lernen, das gemeinsame Mindset - all das ist entscheidend für mich und auch schön. Natürlich ist es auch die Begeisterung an den vielen Ideen und Menschen, mit denen ich tagtächlich arbeiten darf.</p>

<blockquote>
<p>Wieso muss man Agilität und Agile Methoden "coachen"? Reicht es nicht, ein Buch zu lesen oder ein Zertifikat zu erwerben?</p>
</blockquote>

<p><em>Christian:</em> Da gibt es ziemlich viele Aspekte. Ich greife mal einen wichtigen heraus: Ein Coach ist eine <em>unparteiische Kompetenz</em>. Er ist gleichzeitig Experte und Unbeteiligter. Damit kann der Coach einer Situation oder Problematik einen großen Mehrwert liefern. Die äußere Sicht ist neutral, objektiv und fundiert - und das hilft bei der Reflektion sowie bei der Erkenntnis von Schwierigkeiten oder Lösungswegen. </p>

<p>Mit Büchern ist zwar eine theoretische Basis da - was auch gut ist - aber der Mehrwert der neutralen Perspektive kann dadurch nicht erreicht werden.</p>

<blockquote>
<p>Welches ist Deiner Meinung nach eine wichtige Aufgabe des Agilen Coaches?</p>
</blockquote>

<p><em>Christian:</em> Hmm. Ich denke ein Spruch ist für meine Begriffe sehr treffend: <em>"We have the answer, when we help you to phrase the question."</em> Die richtigen Fragen zu stellen ist ein unglaublich wichtiger Faktor und Treiber. </p>

<p>"Richtige Fragen" zu stellen ist gar nicht so einfach. Es Bedarf einer guten Auffassungsgabe. Zuhören, beobachten, Wechselwirkungen und Kräfte erkennen, Interessen und Werte abgreifen - und dann die <em>richtigen Fragen</em> stellen. Die Quintessenz ist hier die wirksame Begleitung bei der eigentlichen Lösungsfindung durch den gecoachten Partner.</p>

<blockquote>
<p>Wenn Du selbst einen agilen Coach beauftragen könntest, nach welchen Kriterien würdest Du denn einen agilen Coach auswählen?</p>
</blockquote>

<p><em>Christian:</em> Ich würde das nicht auf besondere "Eigenschaften" oder "Skills" reduzieren wollen. Vordergründig ist hier der <em>Coach als Mensch</em> und dessen Umgang mit anderen Menschen. Z.B: Wie beeinflusst er das Team? Steuert er mehr oder lässt er steuern? </p>

<p>Ich finde, die Frage ist schwer mit einem festen "Skillset" zu beantworten. Wichtig ist - wie gesagt - der Umgang und die richtige Fragestellung. Es geht sicherlich auch um weitere Faktoren wie Gruppendynamik. Genauso wie die Fragestellung, mit welchen Mitteln er Wissen rüberbringt, z.B. mit Spielen oder Workshops.</p>

<p>Ich denke weiterhin, dass es <em>den Coach</em> schlechthin nicht gibt. Es ist eine situative, individuelle Sache. Als <em>"Tandem"</em> muss das partnerschaftliche <em>"Zusammenspiel"</em> zwischen dem Coach und dem Team oder der Organisation passen. Das kann am Coach liegen, am Team, an beiden oder einfach an der Situation.</p>

<blockquote>
<p>Ok, und wann gibt denn dann ein agiler Coach auf? Oder besser: Was ist selbst für den Coach "zu viel"?</p>
</blockquote>

<p><em>Christian:</em> Das ist sehr individuell. Sicherlich gibt es Situationen, die einen vor große, z.T. unüberbrückbare Hürden stellen. </p>

<p>Ein gutes Beispiel ist eine Teamsituation, bei der absolut keine Freiräume zur Entwicklung und Entfaltung gegeben werden. Gleichermaßen ist es schwer, Menschen mitzunehmen, wenn sie nicht mit einem Grundinteresse an der Sache "zuhören". </p>

<p>Unmöglich ist nichts. Aber: es gibt auch unpassende Momente oder Rahmenbedingungen.</p>

<p>Auch denke ich ist es wichtig für den Coach selbst, auch offen zu sich selbst mit den eigenen Schwierigkeiten im Coaching umzugehen. Manchmal ist es besser, einen Schritt zurückzutreten - und unter Umständen den <em>"Stab des Coachings"</em> weiter zu geben.</p>

<blockquote>
<p>Agilität ist "In" und avanciert geradezu zum guten Ton - ja man kann sogar sagen: zum "Standard" - in der Software-Entwicklung. Welche Hürden oder Chancen siehst Du in dieser Entwicklung?</p>
</blockquote>

<p><em>Christian:</em> Oooh, <em>"Standard"!</em> Da muss ich erst mal etwas zusammenzucken. </p>

<p>Agilität ist für mein Verständnis kein <em>"Standard"</em> - und sollte es auch gar nicht sein. Der Begriff <em>"Standard"</em> ist für mich mit Normierung und Fixierung verbunden. <strong>Agilität hingegen lebt von der Bewegung</strong>. Gerade deswegen ist "Standard" ein schweres Wort dafür. </p>

<p>Es geht um das agile Manifest und die agilen Werte, die etabliert und gefestigt werden müssen. Heutzutage muss sich jedes Unternehmen, welches nicht kooperativ und vernetzt arbeitet, sich selbst die Frage der Effektivität und Zukunftssicherheit stellen.</p>

<blockquote>
<p>Wie siehst Du die Zukunft der modernen Software-Entwicklung?</p>
</blockquote>

<p><em>Christian:</em> Ich möchte das ausweiten. Es geht meiner Meinung nach nicht nur um die Software-Entwicklung, sondern auch um die Arbeitswelt an sich. Es geht um die eigenverantwortliche, selbstorganisatorische Arbeitsgestaltung. </p>

<p>Das hört sich für den einen oder anderen hart und ungewöhnlich an. Und - ja - es ist ein "sich loslösen" von jetzigen Arbeitsorganisationen und Arbeitsstrukturen. Ich denke auch, dass es Teamstrukturen geben kann, die im Zuge der Globalisierung auch mit individuelleren - loseren Bindungen - existieren können.</p>

<blockquote>
<p>Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?</p>
</blockquote>

<p><em>Christian:</em> Hah! <em>Das</em> ist und bleibt eine Entdeckungsreise. Es geht um eine genaue Betrachtung und Beobachtung der jetzigen Lage. Das Ziel ist ja nicht, Fehler zu suchen, sondern entdeckte Fehler in Vorteile umzusetzen. </p>

<p>Ein Stückweit liefert das agile Manifest auch diffuse Antworten. Z.B. fehlt eine klare Behandlung des Einklangs von persönlichen und kooperativen Zielen. Die wichtige Teamverwirklichung im Sinne des gemeinsamen Zieles sollte im Einklang mit der individuellen Selbstverwirklichung stehen. Da werden wir als Agilisten weiter daran arbeiten müssen.</p>

<blockquote>
<p>Wenn Du Dir für die heutige Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?</p>
</blockquote>

<p><em>Christian:</em> Menschen, die Ihr Wirken auf Ihr eigenes Denken und Ihre eigenen Werte stützen. In gleichem Atemzug auch eine gemeinschaftliche Erkenntnis, dass ein Produkt immer aus einem Bedarf heraus entsteht - und dieser Bedarf mit Kreativität und Enthusiasmus gedeckt werden kann. Das ist sowohl eine persönliche als auch unternehmerische Komponente, die ich mir wünsche.</p>

<p><strong>Vielen Dank, Christian!</strong></p>

<h5 id="weitere-interviews-der-serie-der-agilist">Weitere Interviews der Serie "Der Agilist"</h5>

<ul>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Der Agilist</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/der-agilist.html"/>
            <updated>2012-03-04T08:00:00Z</updated>
            <published>2012-03-04T08:00:00Z</published>
            <id>/der-agilist.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist schon eine schwere Zeit für Agilisten heutzutage. Denke ich zumindest. Die agile Software-Entwicklung scheint nach mehr als einer Dekade Überzeugungs- und Übersetzungsarbeit etabliert und angenommen. Doch wie es oft so ist: Der Schein trügt.</p>

<p>Mein Empfinden ist vielmehr, dass es mehr denn je für die Agilität zu arbeiten und kämpfen gibt. Das mag natürlich daran liegen, dass nun viele Unternehmen sich ernsthaft mit der agilen Software-Entwicklung auseinandersetzen. Es ist mit Sicherheit auch der Fall, dass einige Software-Unternehmen wahrhaftig die Umsetzung der Agilität in Ihrer Software-Herstellung konsequent verfolgen.</p>

<p>Doch es gibt da noch die andere, dunkle Seite. Diese Schattenseite ist geprägt von Halbwissen und Halbwahrheiten über die Agilität. Neben der qualitativ hochwertigen Arbeit vieler Agilisten gibt es inzwischen leider viel mehr Trittbrettfahrer, die mit einem angelesenen Wissen von 2-3 Büchern gleich den Berater raushängen lassen. Mittlerweile scheint es mehr agile Berater zu geben als agile Software-Entwickler.</p>

<p>Darüber hinaus entwickelt sich mancherorts 'Agile', 'Scrum' und 'Kanban' zu einem halbherzig umgesetzten Methodenwerkzeug, welches nur dazu dient, an der "Mode der agilen Methodik" zu partizipieren. Da werden oftmals schlechte Berater mit schlechte Missionen beauftragt. Das Ergebnis ist - kaum verwunderlich - katastrophal. Von: <em>"Etablieren Sie eine agile Toolchain"</em> bis zu <em>"Stringente Messung und Bewertung agiler Prozesse"</em> sind alle möglichen Schandtaten für das "Unternehmen von heute" vorhanden.</p>

<h4 id="agile-sells-why-bother">Agile Sells, Why Bother?</h4>

<p>Jetzt mögen sich vielleicht einige Leser denken: "Na und?" - Na nichts, und. </p>

<p>Das Agilität längst zu einer wirtschaftlichen Größe geworden ist, ist ja auch per se kein Problem. Im Übrigen bin ich weit davon entfernt, mich darüber zu beschweren. Nicht nur, weil ich selbst in der Unternehmensberatung aktiv bin, sondern vielmehr weil ich einfach der Überzeugung bin, dass die ökonomische Wertbetrachtung der agilen Methoden ganz entscheidend für deren Adaption in unsere Arbeitswelt ist.</p>

<p>Gleichwohl liegt es mir fern, mich hier weinerlich über die mancherorts vorzufindende ambivalente Moral- und Wertvorstellung zur Agilität zu beschweren. Nein, ich möchte mich mit der allgemeinen Situation auf eine andere, konstruktivere Art und Weise auseinandersetzen.</p>

<p>Besonders interessant wäre es für mich, den aktuellen Stand der 'Agilität' und dem Empfinden gegenüber den agilen Methoden abzufragen. Wenn möglich sogar aus verschiedenen Perspektiven. Eine Team- oder Unternehmensorganisation kann aus vielerlei Perspektiven betrachtet und bewertet werden. Ich denke, dass es mit dem Status der Umsetzung agiler Methoden und Werte nicht anders ist.</p>

<h4 id="quo-vadis-agilista">Quo Vadis, Agilista?</h4>

<p>"Was also tun?" fragte ich mich. Die Antwort ist denkbar einfach: Rausgehen, in die weite Welt der Agilisten und sie befragen! Es gibt so viele Fragen zu stellen zu diesem Thema.</p>

<p>Fragen wie z.B. <em>"Wie weit ist die Umsetzung der agilen Werte in den heutigen Unternehmensorganisationen?"</em> oder <em>"Was sind die Gefahren bei der Umsetzung agiler Methoden in der Software-Entwicklung?"</em> oder sogar <em>"Wohin führt uns die agile Zukunft?"</em> Ja, all das sind Fragen, die ich mir selbst stelle - und beantworte. Doch natürlich gibt es nicht <em>die eine einzige Antwort</em> auf eine Frage, sondern viele verschiedene Facetten und Aspekte.</p>

<p>Diese Aspekte und Ansichten möchte ich durchleuchten, in dem ich bekannte, anerkannte, engagierte und erfahrene Agilisten befrage. Aus verschiedenen Blickwinkeln und unterschiedlichen Expertengebieten. Ich möchte Sie befragen zu Ihrer Meinung, Ihrer Wahrnehmung und Ihrer Position zu all den Themen, die mich als langjährigen Agilisten beschäftigen. </p>

<p>Der erste und wichtigste Schritt in der gemeinsamen Erkenntnisgewinnung ist die aufrichtige und offene Kommunikation. Diesem Prinzip folgend, werde ich in Interviews Agilisten befragen und das Interview dann hier auf meiner Website veröffentlichen. </p>

<p>Mein Ziel dabei: Neue Perspektiven und Möglichkeiten entdecken, die Agilität in der Software-Entwicklung und in unserer modernen Arbeitswelt weiter voranzutreiben. Und das wenn möglich offen, transparent und nachvollziehbar für Interessierte. Hier in meinem Blog.</p>

<h5 id="bisherige-interviews">Bisherige Interviews</h5>

<ul>
<li><a href="der-agilist-agile-coaching.html">Agile Coaching</a> mit Christian Dähn</li>
<li><a href="der-agilist-agile-games.html">Agile Games</a> mit Thorsten O. Kalnin</li>
</ul>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Bericht vom Besuch der DNUG Hamburg</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/bericht-vom-besuch-der-dnug-hamburg.html"/>
            <updated>2012-02-21T22:51:23Z</updated>
            <published>2012-02-21T22:51:23Z</published>
            <id>/bericht-vom-besuch-der-dnug-hamburg.html</id>
            
            <content type="html"><![CDATA[
                <p>Ich möchte in diesem kurzen Bericht meinen gestrigen Besuch bei der DNUG Hamburg rekapitulieren. Ich war dort zu Gast als Sprecher und durfte einige (wenige) Geheimisse über die Software-Entwicklungs-Methodik <a href="http://de.wikipedia.org/wiki/Extreme_Programming">XP</a> enthüllen.</p>

<p>Nach einer mehrstündigen Reise hätte die Ankunft in Hamburg nicht schöner sein können. Ich habe mich sofort in Hamburg zurechtgefunden, obwohl es - man mag es kaum glauben - mein erster Besuch war. Besonders angesprochen hat mich die Gegend rund um den Hauptbahnhof. Ich konnte mich des Eindruckes nicht erwehren, dass sich die Städte München und Hamburg in der urbanen Gestaltung ihrer gleisbehafteten Reisezentren doch frappierend ähneln.</p>

<p>Nach der grundlegenden Orientierung und Umsetzung notwendiger Administrativa habe ich mich sehr gefreut, einen mehrstündigen Spaziergang mit <a href="http://www.navision-blog.de/blog-mitglieder/steffen-forkmann-ueber-mich/">Steffen</a> durch das Stadtzentrum Hamburgs gemacht zu haben. Es ist mir immer wieder eine wahrhafte Freude mich selbst dabei zu beobachten, wie ich bei solchen Gesprächen sowohl einer fachlichen Faszination als auch einer gefühlten Minderbemitteltheit ausgesetzt werde. Ich durfte mich dabei auch glücklich schätzen, die örtlichen Spezifika über Wohn- und Bekleidungspräferenzen zu erkunden.</p>

<h3 id="ecomode-und-vollgas">Ecomode und Vollgas</h3>

<p>Es ist wohl mittlerweile kein Geheimnis mehr, dass ich ein bekennender Befürworter der hochmodernen Automobilbaukunst der <a href="http://www.bmw.de">Bayerischen Motoren Werke</a> bin. Insofern greife ich hier gerne das während meines Vortrages mehrfach gewählte Bild des "Vollgas gebens" auf.</p>

<p>Ich habe mich auf Grund der hervorragenden Navigations- und Begleitfähigkeiten meiner Freunde <a href="http://www.navision-blog.de/blog-mitglieder/steffen-forkmann-ueber-mich/">Steffen</a> und <a href="http://www.bjoernrochel.de/">Björn</a> zügig und pünklich am Veranstaltungsort wiedergefunden. Ein vortrefflich angemessener Gesprächsraum war für mich und die Teilnehmer ein geeigneter Rahmen, uns schnell dem Vortragsthema widmen zu können. Ein besonderes "Bonbon": Für Kaffee wurde im Vorfeld im Geiste des <code>coffee++;</code> gesorgt, welches als ein exemplarisches Beispiel für die bemerkenswerte Eigenschaft der Hamburgeraner dient, geistige Wachsamkeit mit kultiviertem Gesellschaftsverständnis gekonnt zu paaren.</p>

<p>Zu dem Vortragsinhalt möchte ich an dieser Stelle nicht viele Worte verlieren. Einzig erwähnenswert ist ein kleines Detail, welches ich sowohl während als auch nach dem Vortrag beobachten durfte. Während die gesammelte Teilnehmerschaft gebannt und interessiert meinen Ausführungen über <a href="http://de.wikipedia.org/wiki/Extreme_Programming">XP</a> zuhörte, konnte ich eine in Teilen <em>"quite british"</em> anmutende äußere Enthusiasmusentfaltung wahrnehmen. In gleichem Atemzug jedoch war ich sehr davon angetan, wie viele Teilnehmer meine Vortragsgestaltung mit <em>"Ilker gibt Vollgas"</em> kommentierten. Wieder ein deutliches Indiz für die außergewöhnliche nordische Emotionskultur, die mich bis in die fortgeschrittenen Abendstunden sehr fasziniert hat.</p>

<p>Ich möchte deutlich betonen, dass mein persönliches Verständnis meines Vortrages doch von dem schmeichelhaften Kompliment des "Vollgas gebens" stark abweicht. Ich habe mich selbst eher in einem "Eco-Mode" wahrgenommen. Als bewußt okönomische und okölogische Werte unterstützender Zeitgenosse ist für mich die Perspektive der <em>Nachhaltigkeit</em> ein besonderes Anliegen. Das gilt sowohl für meine eigene Arbeitsgestaltung wie auch für die Inhalte, die ich bei derartigen Vorträgen zu vermitteln versuche. "Auf Volltouren" war ich an diesem Abend mit Sicherheit nicht und offen gesagt möchte ich das auch gar nicht sein. </p>

<p>Es mag wohl auf die "bayerische Mundart" und die damit eng verbundene geradlinige, offene Kommunikationskultur zurückzuführen sein, dass sich dennoch einige Teilnehmer zu diesem für mich sehr schmeichelhaften Kommentar hinreißen liessen. Vielen Dank für die warmen und aufmunternden Worte!</p>

<h3 id="die-hamburger-hirschgesprache">Die "Hamburger Hirschgespräche"</h3>

<p>Gleich im Anschluß an die Veranstaltung durfte ich Zeuge der außergewöhnlichen kulturellen Ausprägung meiner Gastgeber <a href="http://sven-s.de/">Sven</a> und <a href="http://www.navision-blog.de/blog-mitglieder/steffen-forkmann-ueber-mich/">Steffen</a> sein. In einer mir selten zuteil gewordenen Aufmerksamkeit wurde ich in ein äußerst geschmackvolles Restaurant namens "<a href="http://www.restaurant-hirsch.com/">Hirsch</a>" geführt. </p>

<p>Eine wahre Quelle der anspruchsvollen Gesellschaftspflege offenbarte sich mir am Tisch mit einigen Teilnehmern und meinen geschätzten Gastgebern. Das Lokal, die Karte, der Wein - doch in aller erster Linie die wertvollen Gespräche mit interessanten Persönlichkeiten verleiten mich dazu, die "Hamburger Hirschgespräche" mit der gesellschaftlichen Güte des "Karlsruher Jean-Closure" in Verbindung zu bringen.</p>

<p>Als einziges Makel kann hier wohl nur der (naturgegebene) mangelnde zeitliche Rahmen erwähnt werden, der es mir leider nicht zuließ, die vielen fazinierenden fachlichen und persönlichen Themen weiter zu vertiefen.</p>

<h3 id="ein-bayer-im-norden">Ein Bayer im Norden</h3>

<p>Mit einem kleinen persönlichen Fazit möchte ich diesen Bericht schließen. Ich habe während der Abreisevorbereitungen in Hamburg noch wertvolle und authentische Eindrücke von der Stadt und deren Menschen gewonnen, die ich mit Sicherheit nicht missen möchte. Der gesamte Aufenthalt in den für mich als Bayer doch gefühlt extrem nördlichen Gefilden war äußerst angenehm. Obgleich ich mit Sicherheit einige ungewohnte Situationen erleben durfte, bleibt mir der makellose positive Eindruck meines Besuches in Hamburg und der DNUG. Ich hoffe sehr, dass ich mit meinen Inhalten den einen oder anderen Teilnehmer zur weiterem nachdenken und recherchieren animieren konnte.</p>

<p>Den besonderen Dank der Teilnehmer sowie der Veranstalter <a href="http://sven-s.de/">Sven</a> und <a href="http://www.navision-blog.de/blog-mitglieder/steffen-forkmann-ueber-mich/">Steffen</a> für meinen Besuch und den kleinen Beitrag zu modernen und professionellen Software-Entwicklungs-Methoden möchte ich an dieser Stelle herzlich und innig erwidern: <strong>Sehr gerne! Nicht dafür!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Code Retreat Munich</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/code-retreat-munich.html"/>
            <updated>2012-02-15T21:11:33Z</updated>
            <published>2012-02-15T21:11:33Z</published>
            <id>/code-retreat-munich.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist schon eine ganze Weile her, als das erste <a href="http://coderetreat-munich.de/">Code Retreat Münchens</a> stattfand. Um genau zu sein sind es jetzt schon 2 Monate; der Code Retreat fand im Dezember letzten Jahres statt. Nichtsdestotrotz ist es mir wichtig, kurz in einem Blog-Post darüber zu berichten.</p>

<h3 id="coding-all-day-long">Coding All Day Long</h3>

<p>Für diejenigen, die mich schon etwas länger kennen, mag es wohl kaum eine Überraschung sein, dass ich an einem <a href="http://coderetreat.com/">Code Retreat</a> teilgenommen habe. Schließlich gehe ich ja auch schon seit Jahren zu <a href="http://codingdojo.org/">Coding Dojo</a>s, allen voran natürlich das <a href="dotnet-coding-dojo.html">Münchener Coding Dojo</a>.</p>

<p>Doch ein Code Retreat ist trotzdem etwas besonderes für mich. Einen ganzen Tag lang eine Aufgabe mehrmals mit verschieenen Programmiersprachen, verschiedenen Pairing-Partnern und verschiedenen "Rahmenbedingungen" anzugehen - das ist schon was besonderes.</p>

<p><img alt="Code Retreat Munich" src="/media/images/coderetreat_muc1.jpg" /></p>

<p>Gerade der organisatorische Aufwand eines solchen "Coding Days" ist immens. Insofern bin ich sehr dankbar, dass <a href="https://twitter.com/sebabenz">Sebastian Benz</a> von <a href="http://www.bmw-carit.de/de/">BMW Car IT</a> sich der Aufgabe angenommen hat und ein wirklich hervorragendes Event ermöglicht hat. Ich habe mich den ganzen Tag über sehr wohl gefühlt und konnt mich voll und ganz auf das 'eigentliche Coding' konzentrieren. Ein gutes Catering sowie die gute Moderation rundeten das Bild ab.</p>

<h3 id="variations">Variations</h3>

<p>Was mich beim Code Retreat besonders fasziniert hat war die Tatsache, dass eine einzige Aufgabe in mehreren "Variationen" durchgeführt wird. So war es in der ersten Session erst einmal wichtig, sich der Aufgabe selbst, nämlich <a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Conways Game Of Life</a> zuzuwenden. Diese erste Java-Session war ein guter Einstieg in das Format als auch in die Aufgabe.</p>

<p>Die zweite Session, die ich in Ruby umsetzen durfte, war ein Einstieg in TDD als Design-Werkzeug für klare objekt-orientierte Lösungen. Es war für mich insofern erfreulich, als dass ich einen sehr aufgeschlossenen und interessierten Partner hatte, der meine Vorschläge förmlich 'aufsog'.</p>

<p>Die dritte Session knüpfte nahtlos an die zweite an, in dem es die OO-Prinzipien genauer in den Vordergrund rückte. Man solle sich bei der Lösung besonders um SOLIDness und ein klares Objektmodell kümmern - natürlich alles per TDD. Diese dritte Session war für mich besonders interessant, weil ich das Problem in Python angehen durfte. Und das mit einem Pythonista ar Excellence. Besonders 'nerdy': Wir waren ausschliesslich auf der Konsole eines <a href="http://de.wikipedia.org/wiki/Apple_iBook">iBook G4</a>.</p>

<p>Nach einer sehr ausgelassenen Mittagspause mit äußerst schmackhaften Speisen ging es frisch gestärkt an die vierte Runde, der sog. "Muted Session". Der Kniff dabei: es wird die Aufgabe in Pair Programming gelöst - ohne ein einziges Wort. Mit dem Pair Partner darf nichts geredet werden, aber natürlich weiterhin per TDD entwickelt und gelöst werden. Ein Novum für mich.</p>

<p>Nicht minder interessant war die Ping-Pong kombinierte TDA-Session Nummer 5, in der man die Lösung stringent nach dem "<a href="http://c2.com/cgi/wiki?TellDontAsk">Tell Don't Ask</a>"-Prinzip entwickeln sollte dabei und gleichzeitig das Pairing mit Ping-Pong-Testing gestaltet. Es war für mich eine sehr erfreuliche Session, denn ich konnte mit einem ehemaligen, geschätzten Kollegen in C# die Lösung vorantreiben.</p>

<p>Die finale Session war ein "Let it flow"-Session, in der man sich einfach in der Programmiersprache seiner Wahl ohne irgendwelche Einschränkungen oder Bedingungen der Aufgabe widmen konnte. Auch hier konnte ich wieder viel lernen, in dem ich gemeinsam mit Christine (aus der Stamm-Mannschaft des Münchener Coding Dojo) die Code Kata in Javascript angehen durfte. </p>

<h3 id="delete-your-code">Delete your Code!</h3>

<p>Alles in Allem war die gesamte Veranstaltung für mich sehr hilf- und lehrreich. Auch wenn ich über TDD nicht viel lernen konnte, war es für mich besonders schön, mich mit so vielen Sprachen und Entwicklern intensiv einem Problem zu widmen. In gleichem Maße, wie ich jedem Entwickler und Manager ein Besuch bei einem <a href="http://codingdojo.org/">Coding Dojo</a> warm ans Herz lege, kann ich auch eine Teilnahme an einem Code Retreat empfehlen.</p>

<p>Abschließend möchte ich mich nochmals ganz herzlich bei <a href="http://www.bmw-carit.de/de/">BMW Car IT</a> und <a href="https://twitter.com/sebabenz">Sebastian Benz</a> für die Organisation, den Support, das Catering, die Moderation und die super Erfahrung bedanken.</p>

<p>Ich hoffe, dass es bald wieder ein Code Retreat in München geben wird, bei dem wir wieder den ganzen Tag gemeinsam neue Erkenntnisse über Programmiersprachen, Herangehensweisen, Zusammenarbeit und Testgetriebene Entwicklung sammeln können.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">I am disappointed.</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/i-am-disappointed.html"/>
            <updated>2012-02-08T08:59:05Z</updated>
            <published>2012-02-08T08:59:05Z</published>
            <id>/i-am-disappointed.html</id>
            
            <content type="html"><![CDATA[
                <p>I am disappointed. And I'm sad. Just recently, I failed to reach a professional goal. I gave the best I can, but it was not enough. Honestly, I'm <em>very disappointed</em> that I failed for this professional goal of mine. It's not important here what that goal actually was. What's worth to mention is that I was convinced of my capabilities and I did invest all what I was able to invest to reach that goal.</p>

<p>You might think now: Is this worth a blog-post? Even more: Is it appropriate to blog about such "news"?</p>

<p>There's a clear <strong>yes</strong> for me. I think it's <em>very appropriate and important</em> to write about it. Within the next lines, I'll lay out why I think it's so important.</p>

<h3 id="being-disappointed-is-not-a-bad-thing">Being Disappointed is not a Bad Thing</h3>

<p>Both in my professional and personal life many people perceive the act of being disappointed as something negative. Most often, disappointment is perceived to be harmful. Just let me be very clear: It surely is not harmful. Being disappointed is a very normal, ordinary thing. The act of disappointment can be a good thing, actually.</p>

<p>Disappointment as an emotion is a driver to many aspects of personal and professional maturity. Nonetheless, it often is being left out in professional life. Interestingly and completely incomprehensible, it's the leaders and executives who don't seem to care about it.</p>

<p>A few years ago I was a lead developer / architect on a project. Some of the managers in there advised me to be cautious about my "emotions". They enjoined me to silence and "temper my emotions". Those managers surely had good intentions, yet chose inappropriate actions for their intent.</p>

<p>They obviously wanted to me to refocus on facts. It's absolutely understandable to strive towards a constructive and fact-oriented work. Yet, in my opinion it's not very helpful to check one's passions in order to reach objectification. It's quite the other way around.</p>

<p>An employee being passionate and expressing his emotions on the job is actually desirable. Most often, he's wholeheartedly committed to his tasks and objectives. He brings in his complete know-how and personality to the table. That's nothing negative. In fact, it's a very positive thing. What's important here actually is the <em>right contact</em> with such a passion and consequently a <em>directed, constructive channelling</em> of emotions.</p>

<h3 id="the-art-of-disappointment">The Art of Disappointment</h3>

<p>I want to focus a little more on disappointment as an <em>emotional state</em>. Most of my friends and fellows tried to cheer me up after knowing that I'm disappointed and sad about my failure. I'm very thankful for them and I'm glad to have people around me who do care. However, I do believe that it's not only important to cheer the disenchanted up again but <em>to go along with him through his sadness</em>.</p>

<p>See, in my job I do a variety of things. Among those, I coach managers, head of's, team-leads, scrum masters, developers, testers and more. Most of those responsible and creative personalities need to deal with disappointments in daily life. Regardless being their own disappointment or those of others.</p>

<p>Almost all of the leadership persons I have coached so far concentrated on motivation and cheer up of the disenchanted. Even experienced managers hardly knew more than just 'bringing the comrade back to road' by motivation.</p>

<p>Well, that's cool, but it's only half the battle. I think that one needs to <em>live through</em> this stage of discourage. One needs to undergo the negative emotion of disappointment in order to negate it and leave it behind.</p>

<p>As for the affected person - which in this case is me - this effectively means that the emotion of disappointment <em>needs to be faced</em>. Ideally, one reflects all the efforts, wishes and expectations made so far. Of course, the disappointment is being lived as well with various consequences like sadness, being annoyed of all or even shedding a few tears. In this very moment, it's important to allow the emotions to happen instead of blocking or ignoring them. Yes, it's crucial to <em>experience</em> the emotion.</p>

<p>In contrast, the caretaker / minder - which in this case is ... - has a very different perspective. He first of all needs to <em>accept</em> that the peer has a negative emotion to carry and furthermore should prepare himself to <em>get involved</em> to this situation. </p>

<p>In the very best case, he's able to create an environment of safety and trustworthiness, so that the affected person is able to live through his emotion in a safe and intimate manner. While enabling this emotional environment, the caretaker <em>participates in that emotion</em> in order to be able to guide and channel the emotion towards a positive and constructive view.</p>

<p>Now that the emotion of disappointment is being lived and experienced consciously, a chain of concurrent activities happen: all the efforts, thoughts, actions leading to the current disappointment are being checked in mind again. This reflection is an essential catalyst to gain <em>insights</em>. At the same time, this recap of events are a very first step towards objectification.</p>

<p>Once this phase of "experienced disappointment" is being put into practice, the second step of motivation and cheer up can be seeded. I'm not going to dive into the motivation topic right now since I could write a book about it. Let's just stick with the fact that motivation and cheer up is needed as well.</p>

<p>It's noteworthy that the duration of disappointment depends on many parameters and is quite an individual thing. It's essential to realize that this duration is no direct indicator for the intensity or "severity" of disappointment. It just varies from person to person. Some individuals may live through disappointment very intensively and fast, others may undergo their disappointment in stages and relatively slow. It's just an individual, most often even situational dimension of the whole process of disappointment.</p>

<h3 id="speech-is-silver-silence-is-scrap">Speech is Silver, Silence is Scrap</h3>

<p>Another very important aspect to disappointment is communication. Let's take myself again as an example for a disenchanted person carrying disappointment. I didn't keep my emotions for myself but told my friends about it. I told them that I've been smacked back to grounds and that I missed my goal. I told them that I'm <em>disappointed</em>, <em>disenchanted</em> and <em>disordered</em>. I even <a href="https://twitter.com/#!/ilkerde/status/166610321300140032">tweeted</a> <a href="https://twitter.com/#!/ilkerde/status/166915369460707330">about it</a> and now I'm blogging it.</p>

<p>The reason why I do this is essential from various perspectives. First and foremost, talking, communicating about disappointment and failure is yet another vital component to translate those negative emotions into a fact-driven objectified view. Second, it serves as an important signal for the environment. It signals 'I am having a pressing and present emotion to deal with.'</p>

<p>This communication is especially important in our professional life. In software engineering, you have to deal with a broad variety of personalities. Most often, different and varying emotional states come face to face. Even for team members who have been working together for years it's difficult to immediately recognize the emotional situation of the peer. Sometimes it's even close to impossible. Think of phone calls and chats.</p>

<p>A very professional and and constructive approach to improve such a situation is just as easy as communicating one selves emotional state concisely. Just as simple as:</p>

<blockquote>
<p>"Right now I'm disappointed. I tried to achieve a professional goal, but I failed. I just wanted to let you know."</p>
</blockquote>

<p>It often works miracles.</p>

<p>Just as a side note, you surely have noticed that the strategy of "stating your emotion" is being used in agile meetings as well. In retrospectives, the "emotional state" is being used as check-in. It's very sad that both developers and managers undervalue this very helpful approach.</p>

<h3 id="living-transparency">Living Transparency</h3>

<p>I want to focus on another aspect of active communication: <em>transparency</em>. Transparency is a great value, especially in agile working environments. Naturally, transparency does not come for free. Investing in transparency starts with your very own invest in communication. A very simple, yet powerful insight.</p>

<p>The sad thing is, the striking simplicity of this rule doesn't seem to help many managers and team leaders to remind and apply the rule. At least most managers I know are somewhat 'agnostic' to this fundamental law of transparency. Instead of permitting and communicating emotions, disappointment, grief, anger or anxiety, most managers dissemble their feelings. In consequence, transparency and insightful experience are being hindered.</p>

<p>In defense of the management guild: it's very understandable that they most often cover emotions behind curtains. The everyday business life of many managers is characterized by contracting, strategic thinking and action and very specific communication. Managers not only take responsibility but obligations as well.They are in charge of both company and employee interests, which may require them to dissimulate weakness and emotion for certain situations.</p>

<p>Nonetheless, it's quite sad to say that most of the managers I had the pleasure to work and go along with were trained to only do that rather than adjusting their level of communication depending on the scope of action.</p>

<p>Let's repeat: Transparency starts with one's very own invest in communication. Further more, it's crucial to gain and strengthen the level of trust between all team members - managers included. There's one rule of thumb, which I always give managers and team leads as food for thought:</p>

<blockquote>
<p>The one who is strong enough to display weakness is equally strong to convey strength.</p>
</blockquote>

<p>Despite of the fact that I mostly mentioned the manager as an example, I surely don't exclude any other role or position to care about transparency and communication. The only reason I'm overly talking about the manager in this case is that the manager has a special, added responsibility and interest to establish and foster transparency.</p>

<h3 id="my-personal-disappointment">My Personal Disappointment</h3>

<p>Finally, I want to get back where I started and loose a few words about my own disappointment. As already mentioned, I'm disappointed because I failed to reach a goal in my professional life. That's surely disappointing, but naturally even annoying and demotivating. It's disillusioning that something I've been fighting for truly is not happening like I wanted and wished it to be.</p>

<p>As most probably every professionally experienced person has been disappointed from time to time, I surely experienced a few disappointing things as well. I remember back in 2004 where I started to learn and apply agile principles &amp; XP practices. I wasn't aware of how important a conscious experience of emotion is for me professional life. Now, being a coach for years, an experienced management consultant and agile engineer I pretty much know that the <em>soft skill</em> of living emotions consciously is a <em>hard criteria</em> for agile working environments.</p>

<p>My intention with this - a little lengthy - article was to encourage those who have to deal with disappointments in their professional life and somehow are stuck or don't really know how to deal with it in a positive and constructive way. It's not easy to judge yourself and face yourself consciously with the negative emotion of disappointment. Rest assured it's both desirable and helpful as long as you keep in mind your own capabilities, values and dignity.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Ich bin enttäuscht.</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ich-bin-enttauscht.html"/>
            <updated>2012-02-08T08:58:47Z</updated>
            <published>2012-02-08T08:58:47Z</published>
            <id>/ich-bin-enttauscht.html</id>
            
            <content type="html"><![CDATA[
                <p>Ich bin enttäuscht. Und traurig. Ich habe erst kürzlich mein Bestes gegeben um ein berufliches Ziel zu erreichen, habe es aber leider nicht erreicht. Ich bin sogar <em>sehr enttäuscht</em>, dass ich dieses Ziel nicht erreicht habe. Es ist an dieser Stelle nicht wichtig, welches Ziel ich hatte. Wichtig ist, dass ich dieses Ziel mit aller Kraft und vollem Einsatz erreichen wollte, aber daran gescheitert bin.</p>

<p>Manch einer mag sich jetzt fragen: Ist das einen Blog-Post wert? Und vor allem, ist ein Blog-Post für so eine "Nachricht" denn angebracht?</p>

<p>Ich finde: <strong>Ja</strong>. Es ist meiner Meinung nach sogar <em>sehr angebracht und wichtig</em>, darüber zu schreiben. Warum das so ist, möchte ich im Folgenden darlegen.</p>

<h3 id="enttauschung-ist-nichts-schlimmes">Enttäuschung ist nichts Schlimmes</h3>

<p>Sowohl in meinem persönlichen als auch in meinem beruflichen Umfeld wird Enttäuschung oft als etwas negatives, ja sogar als etwas störendes empfunden. Das ist natürlich völliger Humbug. Enttäuschung ist etwas völlig normales, alltägliches. Ja, Enttäuschung kann sogar etwas Gutes sein.</p>

<p>Enttäuschung als Emotion trägt zu vielen Perspektiven der persönlichen und professionellen Entwicklung bei. Nichtsdestotrotz wird es oft im Berufsleben verdrängt. Interessanter Weise oft von Führungspositionen - was völlig unverständlich ist.</p>

<p>So habe ich z.B. vor ein paar Jahren als Lead Developer / Architekt von manchen Führungskräften die "Mahnung" erhalten, mich emotional zu zügeln und mich "nicht hineinzusteigern". Ja, einige Führungskräfte haben damals sogar meine Arbeitsweise getadelt. Sie hatten dabei sicherlich gute Intentionen, haben aber meines Erachtens ein etwas unglückliches Mittel eingesetzt.</p>

<p>Denn das Argument der Faktenorientierung und die Steuerung hin zu einer sachlich-konstruktiven Arbeitsweise ist absolut nachvollziehbar. Doch Emotionen zu zügeln ist kein hilfreiches Mittel zur nachhaltigen Versachlichung. Ganz im Gegenteil.</p>

<p>Ein Mitarbeiter, der Emotionen zeigt und sich im Beruf auch emotional "ausdrückt", ist meist jemand, der voll und ganz bei der Sache ist. Meistens bringt er sein Know-How und seine gesamte Persönlichkeit in die Aufgabe mit ein. Das ist nichts negatives, sondern eine sehr positive Eigenschaft. Wichtig ist nur der <em>richtige Umgang</em> und damit die <em>gerichtete, konstruktive Kanalisierung</em> der Emotionen.</p>

<h3 id="enttauscht-sein-will-gelernt-sein">Enttäuscht sein will gelernt sein</h3>

<p>Als nächstes möchte ich auf die Enttäuschung als <em>Emotion und Zustand</em> eingehen. Viele Freunde und Bekannte haben, als sie von meiner Trauer und Enttäuschung erfuhren, mich versucht aufzumuntern. Dafür bin ich sehr dankbar und froh. Dennoch ist es meiner Meinung nach nicht nur wichtig, den Enttäuschten wieder aufzubauen, sondern ihn in seiner Enttäuschung zu <em>begleiten</em>.</p>

<p>In meinem Beruf mache ich viele Dinge. Denken, umsetzen, entwickeln, leiten, fragen und beraten. Darunter fällt auch die Beratung von Managern, Abteilungsleitern, Scrum Mastern und Entwicklern. Viele dieser verantwortungsvollen und kreativen Persönlichkeiten müssen auch mit Enttäuschungen fertig werden. Sei es die eigene Enttäuschung oder die Enttäuschung von anderen.</p>

<p>Nahezu alle Führungsrollen, die ich bis dato beraten durfte, haben sich auf das "aufmuntern" und "motivieren" nach einer Enttäuschung konzentriert. Sogar erfahrenen Führungskräften im mittleren Management ist oft nichts besseres eingefallen, als die Mitarbeiter "wieder zu motivieren". </p>

<p>Das ist meiner Meinung nach aber nur die halbe Miete, denn Enttäuschung muss meiner Meinung nach <em>durchlebt</em> werden, damit man daraus Kraft schöpfen kann, um dieses negative Erlebnis zu negieren.</p>

<p>Für den Betroffenen - in diesem Falle also mich - heisst das, dass er sich seiner Enttäuschung <em>stellen muss</em>. Im Idealfall hält er all seine Anstrengungen, Wünsche und Erwartungen vor Augen und erkennt, dass es nicht gereicht hat. Er oder Sie trauert, ärgert sich, hadert oder weint sogar. In diesem Moment ist es wichtig, diese Emotion nicht zu blockieren, sondern zuzulassen - ja sie sogar regelrecht zu <em>erleben</em>.</p>

<p>Für den Betreuenden - in diesem Falle also ... - heisst das, dass er den Enttäuschten in seiner emotionalen Verfassung <em>akzeptiert</em> und gleichzeitig auf die negative Emotion <em>eingeht</em>. </p>

<p>Bestenfalls schafft der Betreuer durch Begleitung und Abschirmung eine Umgebung der Sicherheit, in der der Betroffene seine Emotion umsetzen kann. Dabei behält der Betreuer das <em>durchleben</em> der Enttäuschung im Auge und steuert durch <em>Teilnahme an der Emotion</em> die Kanalisierung sowie den Abbau der Emotion.</p>

<p>In dem die Enttäuschung durchlebt wird, werden Aufwendungen, Handlungen, Gedanken und vieles mehr innerlich auf den Prüfstand gestellt. Diese Reflektion ist für die so hochgelobte <em>Erkenntnisgewinnung</em> ein essentieller Katalysator. Gleichzeitig stellt es durch die Rekapitulation der Ereignisse den ersten Schritt zur <em>Versachlichung</em> dar, welches für die weitere persönliche und professionelle Entwicklung entscheidend ist.</p>

<p>Ist diese Phase der erlebten Enttäuschung erst einmal umgesetzt, kann man mit der Aufmunterung und Motivation beginnen. Ich werde auf diesen Punkt nicht näher eingehen, denn alleine der Punkt der Motivation ist schon ein dickes Buch wert. </p>

<p>Wie lange das "durchleben" der Enttäuschung dauert, hängt von vielen Faktoren ab und ist ziemlich individuell. Wichtig ist dabei auch die Erkenntnis, dass die Dauer einer Enttäuschung quasi keine Relation zur Intensität hat. Es gibt Menschen, die sehr schnell sehr Intensiv die Emotion durchleben - andere wiederum brauchen länger, manchmal sogar in "Schüben". Die Länge gibt keinen direkten Aufschluß über "Schweregrad" oder "Verarbeitungsfähigkeit", vielmehr ist sie ein individuelle, sogar situativ getriebene Dimension der Verarbeitung von Enttäuschung.</p>

<h3 id="reden-ist-silber-schweigen-ist-schrott">Reden ist Silber, Schweigen ist Schrott</h3>

<p>Ein weiterer, aus meiner Sicht sehr wichtiger Punkt ist die Kommunikation. Ich nehme wieder mich als den Enttäuschten als exemplarisches Beispiel. Ich habe meine Enttäuschung über meine verfehlte Zielerreichung nicht für mich behalten, sondern habe es meinen Freunden gesagt, dass ich <em>'hart auf den Boden aufgeschlagen bin'</em>, mein Ziel nicht erreicht habe und deswegen <em>erschüttert</em>, <em>irritiert</em> und <em>sehr enttäuscht bin</em>. Ich habe sogar <a href="https://twitter.com/#!/ilkerde/status/166610321300140032">darüber</a> <a href="https://twitter.com/#!/ilkerde/status/166915369460707330">getwittert</a> und ich schreibe es jetzt in meinem Blog.</p>

<p>Der Grund ist wesentlich in vielerlei Hinsicht. Zum Einen ist das Reden über die Enttäuschung und die Verfehlung ein weiterer Vektor in der Verarbeitungsgeometrie, der von der reinen Emotionsdarstellung zur faktenbasierten Sachdarstellung führt. Andererseits ist es auch ein wichtiges Signal an die Umgebung und alle Beteiligten, dass dieser Zustand akut und präsent vorhanden ist.</p>

<p>Gerade im Arbeitsleben ist das ein essentieller Faktor. Man trifft unvermittelt auf viele verschiedene Persönlichkeiten, die oftmals unterschiedlich emotional angeregt sind. Obgleich man z.T. jahrelang zusammen arbeitet, kann man meistens nicht auf den ersten Blick den Gemütszustand des Gegenübers einordnen. Manchmal ist das sogar unmöglich - man denke an die berühmte Telefonkonferenz oder den Chat mit Offshore-Kollegen.</p>

<p>Eine persönlich und professionell gute Herangehensweise zur Verbesserung solcher Situationen ist ganz einfach das kurze und präzise mitteilen des eigenen Zustandes. Ein klares und deutliches </p>

<blockquote>
<p>"Ich will Dir kurz vorab sagen: Ich bin momentan sehr enttäuscht. Ich habe ein Ziel nicht erreicht, welches ich mir gesetzt hatte."</p>
</blockquote>

<p>wirkt geradezu Wunder.</p>

<p>Im Übrigen ist die Mitteilung des Gemütszustandes bei agilen Meetings wie z.B. der Retrospektive ein gängiges und sehr wirksames Mittel und wird oft beim sog. "Check-In" in die Diskussion angewendet. Leider wird es meist von Entwicklern und Managern oft zu sehr auf die leichte Schulter genommen - oder sogar belächelt.</p>

<h3 id="transparent-leben-und-arbeiten">Transparent leben und arbeiten</h3>

<p>Eine weitere nicht zu vernachlässigende Eigenschaft der aktiven Kommunikation ist die <em>Transparenz</em>. Transparenz ist ganz besonders im agilen Umfeld ein hohes Gut, welches gehegt und gepflegt werden will. Eine einfache, aber wichtige Erkenntnis dabei ist, dass Transparenz immer bei einem selbst beginnt. Anders gesagt: nur wer sich selbst den anderen öffnet, ermutigt auch andere, sich zu einem zu öffnen.</p>

<p>Diese geradezu frappierend einfache Regel wird meiner Erfahrung nach sehr oft von Führungskräften wie z.B. Teamleitern oder Abteilungsleitern vernachlässigt. Anstatt sich zu öffnen und z.B. Emotionen wie Enttäuschung, Niederlage oder Aufregung zu kommunizieren, verstellen sich viele und verhindern damit Transparenz und Erkenntnisgewinnung gleichermaßen. </p>

<p>Einerseits ist das natürlich sehr gut nachvollziehbar. Das Alltagsleben von Managern ist oft geprägt von Verhandlungen, von strategischem Handeln und von gezielter Kommunikation. Darüber hinaus sind Manager nicht nur einer Verantwortung, sondern implizit auch einer Verpflichtung gegenüber dem Unternehmen und Ihrem Wirkungsbereich ausgesetzt. Es ist in einem solchen Umfeld oft nachvollziehbar und manchmal sogar notwendig, keine Schwächen oder Angriffspunkte zuzulassen.</p>

<p>Schade ist jedoch, dass ein Großteil der Manager, die ich bis heute beraten durfte, eben nur diese eine Perspektive umgesetzt haben, anstatt Ihre Kommunikation auch an den gegebenen Handlungsrahmen zu justieren. </p>

<p>Nochmal: Transparenz fängt mit der eigenen Kommunikation an. Darüber hinaus ist es für eine agile Führungskraft essentiell, das Vertrauensverhältnis zum eigenen Team zu stärken. Ein Faktor ist dabei die Transparenz und Kommunikation. Eine einfache Merkregel, die ich faktisch jedem Manager als Denkanstoß mitgebe:</p>

<blockquote>
<p>Wer stark genug ist, Schwäche zu zeigen, ist auch stark genug, Stärke zu vermitteln.</p>
</blockquote>

<p>Obwohl ich gerade sehr oft den Manager als Beispiel zitiert habe, schließe ich damit Entwickler, Tester und andere Teammitglieder nicht aus. Die 'Konzentration' auf den Manager ist nur der Tatsache geschuldet, dass gerade diese Position sich mit dem Thema der Förderung von Transparenz stark auseinandersetzen sollte.</p>

<h3 id="meine-enttauschung">Meine Enttäuschung</h3>

<p>Zum Abschluß möchte ich noch ein wenig auf meine Wenigkeit und meine derzeitige Enttäuschung eingehen. Wie Eingangs schon erwähnt bin ich enttäuscht, weil ich unlängst ein berufliches Ziel nicht erreichen konnte. Das ist nicht nur enttäuschend, sondern natürlich auch ärgerlich und demotivierend. Die Tatsache des Scheiterns an einer Sache, die man mit allem Willen und Kraft erreichen wollte ist ernüchternd.</p>

<p>Ich habe - wie jeder andere berufserfahrene Mensch auch - schon einige berufliche Enttäuschungen hinter mir. Manche weniger schlimm, manche mehr. Als ich 2004 mit XP-Praktiken begann und mich mit Agilität auseinandersetzte wußte ich noch nicht, wie wichtig die bewußte Verarbeitung von Enttäuschungen mir noch werden würde. Erst als ich mich mit den Aufgaben des agilen Coaches und der professionellen Management-Beratung auseinandergesetzt habe, wurde mir selbst klar, dass dieser <em>weiche Faktor</em> ein <em>hartes Kriterium</em> für Agilität ist.</p>

<p>Ich möchte durch diesen Blog-Artikel und die Transparenz alle diejenigen ermutigen, die sich vor den Kopf gestoßen fühlen, wenn sie berufliche Enttäuschungen durchleben oder sogar begleiten müssen. Es ist kein leichter Schritt, sich selbst einzuschätzen und sich selbst <em>bewusst</em> einer negativen Emotion wie der Enttäuschung zu stellen. Aber es ist ein lohnenswerter Schritt, wenn man seine eigene Würde, seine eigenen Fähigkeiten und seine eigenen Werte im Auge behält.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Polyglotism</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/polyglotism.html"/>
            <updated>2012-02-03T13:56:57Z</updated>
            <published>2012-02-03T13:56:57Z</published>
            <id>/polyglotism.html</id>
            
            <content type="html"><![CDATA[
                <p>There's a lot of discussion going on around me these days about programming languages. Especially when it comes to learning new languages, I sense a sort of divide between two camps of thought. I'll just name those groups "progressive" and "excessive" language thinkers. <em>Progressive</em> is for the polyglot guys who are almost steadily learning new languages. <em>Excessive</em> is the contrary thought of learning one language to its ultimate extent up to a "zen" level, respectively.</p>

<h3 id="multimate-maniac">Multimate Maniac</h3>

<p>You surely already have realized that there's no mutual exclusiveness for <em>progressive</em> and <em>excessive</em> schools. However, in practice I often find myself in a debate between both. That's primary reasoned in the fact that practitioners of both strategies tend to go overboard with it.</p>

<p>The progressive language learners mostly pick a language or two and learn them for a given timebox, most often a year or so. They try to dive into the language concepts very fasts and practice their newly gained knowledge with pet projects, such as writing blog applications or other relatively small scaled software.</p>

<p>The excessive language learners usually do some up-front evaluation of languages and paradigms for a certain time, ranging from a couple of weeks up to years. After having made up their mind, they explicitly choose one language and stick with that language for years. Their goal clearly is to fully utilize the language as well as the ecosystem surrounding it.</p>

<h3 id="being-progcessive">Being Progcessive</h3>

<p>I'm personally able to relate to both approaches. Nonetheless, I feel myself more comfortable with the progressive approach. I'm a firm believer of diversity and short feedback cycles. Hence, I like to pick a language and dive into it for a while (usually a couple of months). If I'm interested and find myself learning new perspectives - or if the language enables me to raise my productivity in some cases - I usually opt to stick with that language for a year or more.</p>

<p>The great benefit I was experiencing in learning new languages certainly was to find new perspectives. Like different approaches to common solutions because the language supports different features. Like different program design because different idioms of modularity, objects and data structure design exist. </p>

<p>In past years, I delved into <a href="http://en.wikipedia.org/wiki/Actionscript">ActionScript</a>, <a href="http://en.wikipedia.org/wiki/PLSQL">PL/SQL</a>, <a href="http://en.wikipedia.org/wiki/Javascript">JavaScript</a>, <a href="http://en.wikipedia.org/wiki/PHP">PHP</a>, <a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29">C#</a>, <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29">C</a>, <a href="http://en.wikipedia.org/wiki/Perl">Perl</a>, <a href="http://en.wikipedia.org/wiki/BASIC">BASIC</a>, <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>, <a href="http://en.wikipedia.org/wiki/Processing_%28programming_language%29">Processing</a> and <a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29">Ruby</a>. This year I'll dig into <a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29">Python</a> and <a href="http://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29">F#</a>. However, there's only a few where I safely would categorize my knowledge as <em>profound</em>, namely JavaScript and C#. That's mainly because I was very excited about both languages in the beginning and the middle of the last decade (C# ~2003, Javascript ~2006). This mixed approach might well be entitled <em>progcessive</em>. </p>

<p><em>(BTW: I know, I'm not good at creating new words, but I wanted to give myself a try. That's why I'm rather a computing linguist than a natural linguist ;-)).</em></p>

<h3 id="one-language-rules-all">One Language Rules All</h3>

<p>Apart from all those programming languages in the field and the rise of language-orientation, I finally want to make a (personal) point on being a "polyglot programmer". I believe that it's a good thing for both your "resident" language skills and the languages you might explore and visit to be curious. Being a polyglot programmer not only broadens your "programming speech", but enables you to reason better about your engineering tasks. </p>

<p>Even for non-developers like testers, business analysts, scrum masters, product owners and managers, I <em>strongly</em> recommend them to learn a new programming language from time to time. Not necessarily the language they might be in contact with through development colleagues. Just the language they happen to find interesting or useful for their particular needs.</p>

<p>However, from the past years of professional experience I had as developer, team lead, architect, scrum master and manager, I came to the conclusion a few years ago that there's <em>one single language</em> (plus dialects) every professional in modern software engineering must learn.</p>

<p>Yes, right. <em>Every Pro</em> in Software Development has to learn this essential language, which effectively is the language to rule them all: the <strong>customer language</strong>.</p>

<h3 id="wysiwyt-what-you-say-is-what-you-think">WYSIWYT: What You Say Is What You Think</h3>

<p>If you want to succeed in creating software, the customer language is indispensible. This perspective has been in software development since the very first beginning. It started out with <em>requirements</em> encompassed with a <em>glossary</em>, it continued on with <em>use cases</em> and <em>scenarios</em>, up to <em>user stories</em> and <em>feature fares</em>.</p>

<p>Even in a very technical sense, the customer language was always in focus. It started with <em>business routines</em> and <em>business modules</em>, was superceded then with the object-oriented <em>domain model</em> and there even has been improved with various principles such as the <em>ubiquituous language</em> from DDD.</p>

<p>The goal of all those principles and methods is simple: <strong>understand your customer</strong>. or user. or both. <em>(Yes, there's a difference between customer and user, but I won't dig into that now).</em> The thing is: if you want to <em>understand</em> your customer, you need to <em>listen</em> to your customer. But listening ist not all. You need to <em>comprehend</em> what you're <em>listening to</em>, you need to <em>ask questions</em> to what you're listening to, you even need to <em>refine and improve</em> to what you're listening to.</p>

<h3 id="language-and-translation">Language and Translation</h3>

<p>Admittedly, it's not easy, often impossible, to learn the complete customer language and the underlying concepts and semantics of the domain in question. However, you don't need to be a domain expert or customer whisperer to understand your customer. The key thing here is to <em>constantly care about the communication between you and your customer.</em></p>

<p>That being said, the're so many techniques and methods who can help you to understand your customer and let him understand you. As a longterm XP practitioner, the customer test specifications always were in customer language stripped down to keywords and actions. This has evolved to a number of key practices to learn the language of your customer:</p>

<ul>
<li><a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">Behavior-Driven-Development</a></li>
<li><a href="http://en.wikipedia.org/wiki/Test-driven_development">Test-Driven-Development</a></li>
<li><a href="http://en.wikipedia.org/wiki/Specification_by_example">Specification By Example</a></li>
</ul>

<p>Honestly, learn at least one of the practices mentioned above and I guarantee you: you will understand your customer better than before. Even better, learn all of them and you will understand your customer as never ever before. Now, if there's really only one single thing you absolutely need to know in the field, then you'd better choose learn and practice the <a href="https://github.com/cucumber/cucumber/wiki/Gherkin">Gherkin</a> language.</p>

<p>Be a polyglot. Learn new languages, new perspectives and new paradigms. Yet, first and foremost, learn the language of your customer and be sure to regularly practice it.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Agile Manifesto and Skills Matter</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/agile-manifesto-and-skills-matter.html"/>
            <updated>2012-01-30T09:13:20Z</updated>
            <published>2012-01-30T09:13:20Z</published>
            <id>/agile-manifesto-and-skills-matter.html</id>
            
            <content type="html"><![CDATA[
                <p>It's a very common thing these days to refer to the <a href="http://agilemanifesto.org">Agile Manifesto</a> on various occasions. Let it be a speech, a discussion about modern software engineering methods or just an ordinary chat between developers.</p>

<p>Ok, the manifesto is well-known. But how about the <a href="http://agilemanifesto.org/principles.html">Agile Principles</a>? Are they known as broad as the manifesto is? I personally doubt that. Hence, it's worth to have a few words about the principles, their role and how they relate to the manifesto at all.</p>

<h3 id="values-need-actions">Values Need Actions</h3>

<p>First of all, the principles are very tightly bound to the manifesto itself. While the manifesto communicates agile <em>values</em>, the principles communicates the means of <em>actions</em> (practices) to embrace the values of the manifesto.</p>

<p>Surprisingly, most people I've met in my career think that the principles were some "added sugar" to the manifesto, probably even have been added at a later stage. As far as I know, this was not the case. I've always had the principles present with the manifesto itself. Albeit the manifesto surely is being referenced a lot more.</p>

<h3 id="all-batteries-included">All batteries included</h3>

<p>The last few days I had a couple of discussions with colleagues, friends and other "agilists" around me. The topic was about engineering (programming) niveau. More precisely, it was about the culture of caring about your work and skills.</p>

<p>In almost all of those conversations, I was referring to the <a href="http://agilemanifesto.org/principles.html">Agile Principles</a>, especially one particular:</p>

<blockquote>
<p>Continuous attention to technical excellence and good design enhances agility.</p>
</blockquote>

<p>This principle puts a clear message: <strong>Skills Matter</strong>.</p>

<h3 id="excellent">Excellent!</h3>

<p>For me this principle is a clear indication that a skilled, continuously learning and passionate working person is <em>required</em> to make agility a success in a project or product engineering context. It clearly alerts us to maintain and extend our very core asset of skill, which in effect is the manifestation of capability through knowledge and experience.</p>

<p>The great <a href="http://martinfowler.com/">Martin Fowler</a> wrote about this principles a decade ago in an <a href="http://andrey.hristov.com/fht-stuttgart/The_Agile_Manifesto_SDMagazine.pdf">Article on SE Magazine</a>:</p>

<blockquote>
<p>When many people look at agile development, they see reminders of the "quick and dirty" RAD (Rapid Application Development) efforts of the last decade. 
But, while agile development is similar to RAD in terms of speed and flexibility, 
there's a big difference when it comes to technical cleanliness. 
Agile approaches emphasize quality of design, because design quality is essential to maintaining agility.</p>
</blockquote>

<p>Obviously, quality in design is easier achieved through technical cleanliness. Technical cleanliness is easier achieved with a steady motion to improve your technical capabilities and excellence.</p>

<h3 id="is-skilfulness-agile">Is "Skilfulness" Agile?</h3>

<p>There's one very important question being around in agile practitioners mind for years now: Does skill relate to the <a href="http://agilemanifesto.org">Agile Manifesto</a>? Or rephrased: Is skilfulness agile?</p>

<p>Even the creators of the manifesto where rethinking this aspect over and over within the last years. I remember very well the thought-provoking article on <a href="http://www.exampler.com/blog/2007/05/16/six-years-later-what-the-agile-manifesto-left-out/">dark spots of the manifesto</a> form the great <a href="http://www.exampler.com/about.html">Brian Marick</a>. Among other values he explicitly mentioned that <strong>Skill as a Value</strong> has been left out in Agile Manifesto.</p>

<p>I do agree with Brian in a sense that the requirement of skilfulness is being far undervalued in the whole agile universe. I'm a firm believer in continuous learning and improvement, especially when it comes to my very own capabilities and know-how.</p>

<h3 id="craftsmen-capability-care">Craftsmen Capability Care</h3>

<p>You may recall now that this is essentially the same song played by the wonderful <a href="http://www.objectmentor.com/omTeam/martin_r.html">Uncle Bob</a> as well for years now. A few years ago he was that much fed up with the underestimation of engineering skills in everyday agile projects that he draw a line and crafted the <a href="http://manifesto.softwarecraftsmanship.org/">Software Craftsmanship Manifesto</a>.</p>

<p>It basically alerts us to take care and responsibility for what we do. It reminds us to craft software with honor and pride. It pushes us to strive for the best possible result. <em>It just raises the bar</em>.</p>

<p>That's what I'm doing in my job and life as well. Naturally, <a href="/die-kunst-der-software-entwicklung">I signed the manifesto</a> and I'm living and promoting these values whenever I can.</p>

<h3 id="uninterested-unwilling-underachievers">Uninterested Unwilling Underachievers</h3>

<p>Consequently, it's obvious to me, that <strong>skill is essential in agile engineering</strong>. Agreed, it's essential anyway, not only limited to agile software development. Yet, for agile engineering, it's even more a crucial factor to success. Being on an agile project requires you to constantly choose the path of improvement for your own skills.</p>

<p>That being said, it's <em>literally unacceptable</em> for me to tolerate individuals or opinions in agile projects, who are uninspired and uninterested in what they do and what the team does. In my whole professional life, I always tried to help people to get over that. However, if they're not interested in <em>being professional</em> and <em>caring like a professional</em> and <em>acting like a professional</em> - then they should better get out of the way and let the professionals do their job.</p>

<p>Being uninterested in ones own skills, in ones own work and in ones own perspective to creation is surely a sad thing. Whenever you happen to meet such individuals, please treat them like <em>adults</em> and take them <em>for serious</em> first. Talk with them, try to help them, try to engage them.</p>

<p>If all that doesn't help, there's nothing more left than concentrating your efforts for other things or individuals and leave the underachievers behind you. This is a very important thing to help yourself in being constantly motivated for your continuous effort to improvement in a sustainable, well-balanced pace.</p>

<h3 id="theres-no-pill-for-skill">There's no Pill for Skill</h3>

<p>Finally, I want you to remind that nobody says that your job is going to be easy. Nobody says you'll earn money by fooling around. Nobody says that you'll spend your life in kinder garden only. Keep in mind: your value is your values.</p>

<p>There's no Pill for Skill. Stand up, get up. Fight for your values, learn for your skills, accept your challenges.
<strong><a href="http://www.youtube.com/watch?v=cK8YSsjIaDs">STFU! Get Up!</a></strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Tool Me Under!</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tool-me-under.html"/>
            <updated>2012-01-25T08:49:53Z</updated>
            <published>2012-01-25T08:49:53Z</published>
            <id>/tool-me-under.html</id>
            
            <content type="html"><![CDATA[
                <p>Yes, it's time for another blog about some misfits I happen to recognize in our software development world. This time it's about tools and their glorification by those who actually should know better: the developers themselves.</p>

<h4 id="a-tool-is-just-a-tool">A tool is just a tool</h4>

<p>Everybody probably knows it already, but I wanted to re-iterate that: A Tool is just a tool. Tools are very important these days for software development. Literally every developer needs his own set of tools. Plus, in professional software development, tools are an indispensable means to get things done.</p>

<p>As for the developer perspective, it's the IDE, the editor, the shell, the issuetracker, the CI-engine, the VCS and many more software making up the "tool chain". However, even hardware can be counted a tool: It seems to be a big difference these days to use a MBP, a <em><insert brand name here></em> notebook, a desktop or even an IPad as primary development system.</p>

<h4 id="give-me-the-tool-you-fool">Give me the tool, you fool</h4>

<p>Lately, I got the impression that tools not only are important to us, but have become more important than they actually should be. Whenever a developer sets up a new box around me, he's asking questions like</p>

<ul>
<li>what editor are you using?</li>
<li>what shell is coolest?</li>
<li>what plugins are shiny?</li>
<li>what is hip, my hipster hippies?</li>
</ul>

<p>On one hand, I understand that it's important to look out for improvements and make some research on it. On the other hand, I don't get it why those questions are being asked.</p>

<p>Even more, I don't get that tool X and tool Y is being used "just because it gives you good geeky karma." What's that for an argument? Are you serious? Are you a developer cranking out some code or just a barbie doll looking out for fashion shoes? I don't get it.</p>

<h4 id="tools-to-the-rescue">Tools to the rescue</h4>

<p>I think it's a very good thing to look around what's happening and evaluate new methods and tools. Nonetheless, I personally prefer to actually <em>use a tool</em> only if I obviously <em>need a tool</em> and then <em>value that tool</em> and eventually <em>compare that tool</em> with others in the field. For a few developers around me, I have the impression that the tool chain is just being chosen because it's kind of hip and geeky.</p>

<p>Take  Resharper, VS Power Tools, Zsh, VIM, ST2, MBP, WebSharper, c9.io and whatever freaky tools might exist in this universe as an example. I personally use VIM for around 2 years now. I'm not even at 10% of what is possible with VIM. And this was and is a great lesson for me. Both positive and negative.</p>

<p>On the other hand, I can't (and don't want) to miss Visual Studio and Resharper when it comes to serious .NET development. That's cool and fine for me. I love those tools (for specific tasks). However, I wouldn't ever touch a CSS or HTML file with VS. YMMV.</p>

<h3 id="tool-me-under">Tool me under!</h3>

<p>I'd like to encourage developers to <em>first use what they have</em> and <em>look around if existing tools can help</em> to improve, automate or simplify the task they're actually need to get done. Once you see that your tool-chain limits you or leads you to inefficiency, the motivation for new tool evaluation is very well satisfied, Imho.</p>

<p>Don't just follow the white rabbit and cry out to be equipped like a <a href="http://en.wikipedia.org/wiki/Transformers">transformer</a> just to edit a simple README file.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Leaving(NET)</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/leaving-net.html"/>
            <updated>2012-01-24T17:19:34Z</updated>
            <published>2012-01-24T17:19:34Z</published>
            <id>/leaving-net.html</id>
            
            <content type="html"><![CDATA[
                <p>Yesterday I blogged about my <a href="not-leaving-net.html">top 5 reasons why I like to stick with .NET technologies</a>. Today I'm going to look at the flipside. I already mentioned that I'm quite technology-agnostic when it comes to software development. However, after many years in the .NET ecosystem in different projects, I gained a lot of insights on how .NET projects are done. </p>

<p>Every working environment, literally every project has a different culture. Yet, there are similarities throughout projects. A few reasons for those similarities are similar technologies, similar tools and similar mindsets. That's true for the .NET-related projects as well.</p>

<p>I want you to notice once more that I'm neither <em>leaving nor staying</em> with the .NET technologies. I have perfectly valid reasons to use .NET, Mono, and FSharp, and <em>I surely will use these <strong>cool .NET technologies</strong></em>. However, I have good reasons to criticize some other aspects of the .NET ecosystems as well.</p>

<p>Although I mentioned it in yesterdays <a href="not-leaving-net.html">Top 5 reasons for using .NET</a> post, I want to emphasize once more, that the key to successful software engineering and successful software products is not the technology being used but the people being involved. Enough introduction.</p>

<h3 id="top-5-reasons-to-leave-net">Top 5 reasons to leave .NET</h3>

<p>Here's my top 5 reasons why I look forward to look for alternative technologies.</p>

<h4 id="nr-5-microsoft">Nr. 5: Microsoft</h4>

<p>Yes, you read correctly. <a href="http://www.microsoft.com">Microsoft</a> has made it into my top five why I not like using .NET. The reason is dead simple. For many years, Microsoft left me as .NET developer think that .NET is the "new VB", the new shiny 4GL platform where everything works with click &amp; run. Moreover, instead of advocating serious engineering, Microsoft just wanted to sell .NET and the new VS versions as <a href="http://en.wikipedia.org/wiki/Rapid_application_development">RAD</a> engineering tools. They actively made me as the seriously engaged .NET developer think that I'm at one level with VBA Macros and SQLWindows.</p>

<p>Second, the way Microsoft is supporting the .NET community is not focused on engineering, but focused on sales and marketing. That's the impression I got from many years of active .NET community participation. I'm still a <a href="http://www.microsoft.com/germany/community/programme/clip.mspx">CLIP</a> Member, by the way. To me, Microsoft prefers shows their appreciation to people that <em>promote and sell their products</em> instead of showing appreciation people that <em>utilize and improve their products</em>. </p>

<p>This makes many .NET communities needlessly to be a sublte product and people marketing platform rather than a community of users and innovators. </p>

<p><em>I like to meet with developers, not with self-proclaimed heros or sales masters</em>.</p>

<h4 id="nr-4-homogenous-harmony">Nr. 4: Homogenous Harmony</h4>

<p>This topic is related to Micrsoft, but is not limited to Microsoft in .NET ecospace. It's about what I call the fallacy of "homogenous harmony". In professional .NET world, vendors try to lock you in with their products. You want a widget library? Take X. It plays very well with search library of vendor X, but not of vendor Y or vendor Z. This "Lock In, Feel Free"-Game is played over and over again, no matter what developer tool or library it is. Nearly all .NET vendors invest more in not supporting other vendor's tools than in investing to coexist with them.</p>

<p>This not only is depressing for the developer or a risk from strategic software product management point of view. No, the biggest negative impact is the active and effective lowering of innovation. This "unique partnership" strategy for developer tools leads to laziness and blindness for options. </p>

<p>Developers just stick with that lock-in because they know that they have no other option. That's the point where the developer as individual as well as the company is loosing innovation. </p>

<p><em>I prefer diversity over monotony</em>.</p>

<h4 id="nr-3-developer-productivity-tools">Nr. 3: Developer Productivity Tools</h4>

<p>Guess what, it goes on with the tool chain. I'll start with TFS. Just to get it out of my way. TFS is the perfect example for a contradicting product. While it claims to be a "Developer Productivity Tool", it's straight forward just the opposite of that. It merely embraces process guidances, guidelines and protectivism, that's it. Period.</p>

<p>The same is true for other products in .NET Devland. I'll pick the beloved Visual Studio as an example. The concept of all the fancy XML-, Resource-, Database-, Publish-, Webform-, HTML- and XYZ-Designers Visual Studio has is just to do one single thing: Hide complexity. Yes, you read correctly, complexity. You know what that means?</p>

<p>That means that you as Visual Studio "Developer" don't even get to know what you are doing. In the end, a developer doesn't need to be a developer anymore. It's just doing it because there's the menu option to do it. It's doing it because Intellisense says it's possible. It's doing it because there's a wizard guiding to "Finish Unit Tests".</p>

<p>This effectively means that your gained productivity is sold for being treated like a dumb user who is trying to get a paragraph formatting fixed in <a href="http://en.wikipedia.org/wiki/Microsoft_Word">Word</a>, instead of being treated as an engineer who is responsible of actually knowing what the hell he is doing with all those bits and files he's juggling with. </p>

<p><em>I want to be taken for serious and not as dumb click-dummy</em>.</p>

<h4 id="nr-2-optimization-over-innovation">Nr. 2: Optimization Over Innovation</h4>

<p>First I thought this would be my number one, since the preceding arguments touch the fact (or lack, respectively) of innovation as well. In more than half of all my .NET projects, I perceived to live and deal with a culture where optimization is favored over innovation. </p>

<p>To me, this is one of the biggest Anti-Patterns of agile and modern software engineering. Hence, It's quite sad for me to realize that I happened to experience such a culture often. Interestingly, very often with .NET projects (of different sizes!).</p>

<p>I think that most .NET-related projects are profit-oriented with the notion that everything what is related to software engineering is valued as a cost rather than an investment. In consequence, budget plans are being made, resources are planned upon tasks and money is correlated with time instead of feature.</p>

<p>You might argue that this is just a characterization of enterprise projects and has very little to do with the technology being used. Very plausibe argument, indeed. Nonetheless it doesn't reflect my experiences. </p>

<p>For instance, I've had (very) large, enterprise-scale projects in PHP and C. For both of the projects, I've had plans and goals to achieve. However, in both projects I always had the chance to innovate prior to optimize. All my innovation efforts have been taken for serious, then evaluated and mostly adapted. </p>

<p>On quite a number of my .NET projects, the contrary was the case. People were awarded when they could reduce cost and they were punished when they could expand market and turnover. </p>

<p><em>I prefer innovation over optimization (while I do optimize as well)</em>.</p>

<h4 id="nr-1-no-invest-to-interest">Nr. 1: No Invest To Interest</h4>

<p>Yes, my number one reason for preferring other technologies over .NET is the lack of "invest to interest". As much as I am technology-agnostic, I haven't seen so many developers not being interested in their job as I did in a large number of .NET projects I made. What a sad sentence this is. Yet, it perfectly describes my experiences so far.</p>

<p>I've had one - <em>yes, one single</em> - .NET project so far where I had the genuine impression that every developer involved in that project was interested in what they actually are doing. <em>(Note: For the curious mind: parts of this project were codenamed after cuban cities.)</em></p>

<p>Even more, some of the uninspired developers were even advocated by project managers and Scrum Masters as "experienced, low-key and thoughtful" people. Just because they didn't do anything.</p>

<p>I'm well aware that this problem is not limited to .NET projects. There's tons of projects in other languages where the same is true. Yet, I happen to had the experience that especially within .NET projects the number of uninteresed, unwilling, unimpressed and unimproved "software developers" is exceptionally large compared to those few developers who actually take their job and assignment for serious. I'm quite glad to say that in my current projects the majority of developers actually do care.</p>

<p>The latter mentioned mostly are brave and very strong minded people. They mostly continue in a restless manner to improve whatever they can. It's a very sad fact that mostly those few are being looked at as "disruptive elements" and troublemakers. </p>

<p>This lack of "invest to interest", again, is one of the biggest Anti-Patterns of modern software engineering. It inherently leads to a protective, non-progressive and disrespective working environment in which it is very hard to achieve any valuable result. </p>

<p><em>I prefer to work the best I possibly can instead of working just as much as is necessary</em>.</p>

<h3 id="criticism-and-correlation">Criticism and Correlation</h3>

<p>As I already mentioned before, I'm well aware that most of the above arguments are not specific to .NET itself. It's a valid criticism of mine to argue that there's no concrete correlation between .NET as technology and the very "non-technology-related" statements I made. I do as well recognize .NET usage in indie game studios, movie and animation agencies and whatever 'cool' and 'hipster' startups and working environments there might be.</p>

<p>Nonetheless, this list reflects my experiences I had so far on the majority of my .NET projects. I mostly gained the impression that the delusive culture of "professional engineering" in .NET ecospace is being aided and supported by the technology and the companies around that technology. This especially was the case where .NET and other .NET related products like TFS, various OR/M or Win/Webform-Libraries are being used to follow the "spirit of RAD".</p>

<p>On the other side, I had the chance to work on PHP, C, Java and JavaScript projects as well. For the vast majority of those non-.NET projects, I had a very different experience regarding the abovementioned perspectives. Especially my Nr. 1, 2 and 3 arguments were not as apparent and present as on almost all .NET projects I had so far.</p>

<p>That all being said, I still have great respect for all .NET enthusiasts and community members. In fact, I even do admire a few of them for their professionalism, for their passion and for their brave and powerful way of promoting the positive things of .NET as a technology as well as of the .NET community itself.</p>

<p>Moreover, I not only had a "perfect" .NET Project but also had a few .NET Projects where I met <em>very smart people</em>, learned <em>a lot of things</em> and had <em>a great time</em> building cool products with cool .NET technologies. I enjoyed .NET development very much and keep enjoying it.</p>

<h3 id="alternatives-and-advantages">Alternatives and Advantages</h3>

<p>I'm not sure whether any other comparably large and affecting technology would have significant advantages over .NET in the abovementioned points. Lately, I've been around the Java and Ruby communities and both are very different from eachother as well as different to the .NET community. </p>

<p>Last year I learned Ruby. Not inside out, but fairly well. It was a great experience. Both from technical as well as from personal perspective. This year, I'll most likely dig into Python, their related technologies and their communities. I'll learn FSharp, a .NET-related language, as well. </p>

<p>The message I want give to you, my dear reader, can be summarized quite easily: Take the chance and look beyond your known area. It surely will be of advantage for you. If you are a rubyist, look how the .NET way of events and UI binding works. If you are a .NET guy, look what advantages you can take away by experiencing how Rubyists deal with database migrations and testing. Either way, you can turn alternatives to advantages. And that's what I'll look after as well.</p>

<p><strong>Turn alternatives to advantages.</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">!Leaving.NET();</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/not-leaving-net.html"/>
            <updated>2012-01-23T16:05:29Z</updated>
            <published>2012-01-23T16:05:29Z</published>
            <id>/not-leaving-net.html</id>
            
            <content type="html"><![CDATA[
                <p>The last couple of months I read a couple of blog posts from <a href="http://7enn.com/2011/07/04/appreciating-the-power-of-a-true-community/">notable .NET engineers</a> that they're <a href="http://whatupdave.com/post/1170718843/leaving-net">leaving the .NET ecospace</a> for <a href="http://hkarthik.me/blog/2011/11/11/my-reasons-for-leaving-net/">various reasons</a>. Even people I know and respect very much are <a href="http://bjro.de/2011/11/15/at-the-crossroads/">heading out for new technologies</a>.</p>

<p>While I perfectly understand some arguments of the abovementioned, I do have a slightly different view on this whole topic of technology switching. I personally believe that success is not a matter of technology but a matter of people. Whatever shiny Ruby, Node.js, Scala, C, Linux, OSX, iOS, Python, Android, PHP, WinRT, NaCl technology you're using. <strong>It doesn't matter</strong>. You can do crap and bullshit as well as shiny cheesy nifty things with <em>any Technology</em>.</p>

<p>Having this in mind, I want you to know that I'm pretty much a technology-agnostic person. I get my stuff done. With Linux, with Windows, with .NET, with Ruby - and even with things like paper and pencil.</p>

<p>I think many people leaving the .NET ecospace made very valid points. I respect them for their decision and I'm pretty sure they will do great stuff with other new technologies as well as they did with technologies they were using before. Yet, I lately got the impression that the topic was burdened a little with a "negative karma". There might well have been destructive arguments or at least a notion of disrespectful, angry, harsh way of saying things.</p>

<p>This blog post is to add another, yet surely incomplete perspective on the .NET technology and the community surrounding it. It's just about to signal a simple message: "Let's think positive and look at eachother with respect". That's it.</p>

<p>Having said so much in front of a simple listing, I think it's time to finally introduce you the list I'm talking about all the time. I made my mind about what I personally think is cool about the .NET technology. Surprisingly, I got many things I pretty much like about the .NET ecospace. I sorted them by "level of importance" (to me), picked the top five and just wrote a couple of words for my reasoning. So, here it is.</p>

<h3 id="top-5-reasons-to-stick-with-net">Top 5 reasons to stick with .NET</h3>

<p>Here are my top 5 reasons why using and working with .NET is fairly cool.</p>

<h4 id="nr-5-microsoft">Nr. 5: Microsoft</h4>

<p>Yes, you read correctly. <a href="http://www.microsoft.com">Microsoft</a> has made it into my top five why I like using .NET. The reason is dead simple. Microsoft "invented" it. Apart from Microsoft being bad at many other things, Microsoft did plenty of things right as well. One thing, obviously, is the .NET Framework itsef. The complete CLI, CLR, CTS and CIL make up an awesome managed execution environment with great capabilities.</p>

<p>However, it's not only the simple credit to creator here. Microsoft continued to develop and support the ecosystem with the DLR, with research, new languages and supplementary products. In the last years, Microsoft even opened itself a little more towards the OSS community and got more <a href="open-source-and-open-minds.html">open minded</a>.</p>

<p>Yes, there's a lot of things what Microsoft may have done far better. Yes, there's some things what Microsoft should not have done at all. But, there's as well a few things Microsoft did get right. And there's a couple of things where Microsoft did an awesome job.</p>

<h4 id="nr-4-diversity-variety">Nr. 4: Diversity &amp; Variety</h4>

<p>Again, this might not be a very obvious argument at first place. Nonetheless, I find the .NET ecosystem to be surprisingly diverse. You meet a lot of different people with different mindsets, different skills and different areas of interest. From enterprise developers doing BI-SQL-Server stuff, web developers going crazy with ASP.NET MVC, desktop application developers up to game devs using XNA. A broad set of usages makes .NET attractive to me as well.</p>

<p>Second, it's not only the variety of usage, but the variety of people and cultures working with the technology. The fact, that in .NET Community a web nerd regularly meets up with the enterprise guy alongside with the powershell sysop is quite nice actually. Especially when you consider that the community sticks together and manages to handle and leverage this diversity.</p>

<h4 id="nr-3-c-csharp">Nr. 3: C# (CSharp)</h4>

<p>This one is obvious. From my top three ranking, the <a href="en.wikipedia.org/wiki/C_Sharp_(programming_language)">CSharp</a> language is on bronze. C# is big step. As a language itself, as well as when it comes to .NET development. C# makes OO-design and OO-development much more comforatable than with many other languages. C# is a leading edge multi-paradigm programming language.</p>

<p>One honorable, very high value of C# is the progress and development of the language itself. From version to version, C# got features which most of the time not only made sense, but were evolutionary as well. Generics, Linq, Lambda, Extension Methods, Dynamic and soon Async/Await. Comparing with other languages in the field, the C# lifeline reads pretty cool. And guess what: It's even pretty cool to use all those features.</p>

<h4 id="nr-2-f-fsharp">Nr. 2: F# (FSharp)</h4>

<p>Ranking on second is FSharp. Yes, <a href="http://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29">FSharp</a>. <strong>FSharp is an awesome language</strong>. I'm very thankful that Microsoft Research did such a cool job and managed to develop a language favoring the functional programming paradigm. Combined with the big and diverse .NET Framework, FSharp not only is the new kid of the block here. FSharp is a shift in how functional languages will be used in everyday computing.</p>

<p>I'm quite new to the FSharp game. Yet, I'm fascinated and thrilled of it. It makes me rethink on how to solve problems as well as see, how cool it can be to embed a functional language into the .NET ecosystem. FSharp will most likely change every aspect of the framework for the better. Although I haven't learned the language to its full extent yet, I'm quite sure that C# and F# will be equal partners when it comes to develop great software.</p>

<p>It might well be, that once I learned F#, I'll want to learn other functional languages or styles as well. I might well be, that I might stick with C# or other imperative languages as well. It might well be, that I use both and enjoy both. Let's see.</p>

<h4 id="nr-1-mono">Nr. 1: Mono</h4>

<p>The winner and the number one reason why working with .NET is cool, is: <strong><a href="http://www.mono-project.com">Mono</a></strong>.</p>

<p>I can't express in a few sentences what great gift Mono is for the .NET community, the .NET development and the .NET future. Mono made many things possible we all wouldn't thought could be possible. Mono contributed solutions and products we all are using on a daily basis. Even more, Mono is even ahead of Microsoft in particular areas, such as CAAS or device targeting. Mono made Cecil, MonoTouch, MonoDroid and many other cool things like <a href="http://unity3d.com/">Unity</a> possible.</p>

<p>I'm working with Mono since around two years now. At the beginning of the last year, I decided to completely switch my personal .NET development to Mono. I even had a commercial project with Mono. During this time, I learned a lot about the .NET Framework, the class libraries, the Mono compiler and the "Monoid" way of software development. I'm very thankful for all what I have learned so far and I'm looking forward to learn more and contribute to the Mono and OSS comunity.</p>

<p>Please, .NET developers, contribute to Mono. Please, .NET community, use and enhance Mono. <strong>Please, Mono, continue to be so awesome.</strong> </p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">The Quest Of The Test</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/the-quest-of-the-test.html"/>
            <updated>2012-01-21T15:18:22Z</updated>
            <published>2012-01-21T15:18:22Z</published>
            <id>/the-quest-of-the-test.html</id>
            
            <content type="html"><![CDATA[
                <p>Today, I'm going to tell you something about <em>"Test Implants"</em>. Sounds a bit scary, but in fact it isn't at all. I recently wrote about a <a href="poor-mans-test-context-composition.html">technique on how you can improve brownfield code with tests</a>. In fact, I showed that it's surely possible to do some TDD on an existing codebase with the help of simple "Mixin Contexts".</p>

<p>This time I'm going to share another technique which I found to be very helpful in brownfield engineering scenarios. Obviously, I named this technique "Test Implants". Test Implants are no solution to "untestable" code, but help you to find out the parts which need to be addressed. </p>

<p>Effectively, every test implant I wrote made me rethink on how the code might be restructured to fit all requirements. For me, test implants are a simple, feasible way to get interaction tested without essentially restructuring the organization of the code. I personally use test implants for over a year now and found it very useful most of the time.</p>

<p>I'm going to show you test implants using a little fictional story. No intentions behind that, the story is just a cake with topping alongside the coffee. The title of the story, obviously, is <em>"The Quest Of The Test"</em>. Enough introduction, let's just start.</p>

<p>I'm going to tell a little story about legacy code, bugs and testability. You, my dear reader, will be put right into the fabulous adventure of finding out what a test implant is. Enjoy.</p>

<h3 id="a-typical-brownie">A typical Brownie</h3>

<p>It's a regular, rainy Thursday morning, five past nine. As always, you're a little late to work. You quickly pull of your coat while switching on your monitor and logging in with your left hand. It's not that your password isn't complex. It is fairly complex. It's the virtuosity of your memorized typing of course that makes it possible to login single-handed.</p>

<p>Once you're seated, you see bad news in your inbox. "Bug in Chronograph!" says the title of the mail. What? <em>The</em> chronograph? The legacy code you just have become the official maintainer for? </p>

<p>Justice has left this town. That's for sure.</p>

<p>Ok. Ok, ok. While you concentrate to breathe in regular intervals again, your brain starts to send plausible signals: "Get me a coffee. Then we'll fix this bitcrap, buddy". Aight! You put in a Nespresso "<a href="http://www.nespresso.com/ch/en/product/volluto">Volluto</a>" for starters and hit the button. While the coffee machine is at your command, you open the Chronograph files. You happen to recall that it's using <code>TimeServer</code>, an almighty third-party DLL. It contains classes and methods to fetch a global standard time from internet and translate it to local time.</p>

<p>Bing! Coffee done! <em>"A morning with bugs and coffee. The usual suspects in my ordinary life."</em> is the most original thing what you are able to tweet right now about your adventure. Ok. Social shit done as well. Start working. Now.</p>

<p>Sources refreshed, project opened in Visual Studio, table light dimmed. You're just rereading the code of Chronograph, which has been written in "ancient times". Obviously without any unit tests at all:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">class</span> <span class="nc">Chronograph</span> <span class="p">{</span>
  <span class="k">private</span> <span class="n">CultureInfo</span> <span class="n">_culture</span> <span class="p">=</span> <span class="n">CultureInfo</span><span class="p">.</span><span class="n">InvariantCulture</span><span class="p">;</span>

  <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsDirty</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>

  <span class="k">public</span> <span class="n">LocalTime</span> <span class="nf">SyncWith</span><span class="p">(</span><span class="n">TimeServer</span> <span class="n">ts</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">localTime</span> <span class="p">=</span> <span class="k">new</span> <span class="n">LocalTime</span><span class="p">();</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">IsDirty</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">TimeEntry</span> <span class="n">te</span> <span class="p">=</span> <span class="n">ts</span><span class="p">.</span><span class="n">GetTime</span><span class="p">();</span>
      <span class="n">te</span><span class="p">.</span><span class="n">Apply</span><span class="p">(</span><span class="n">_culture</span><span class="p">);</span>
      <span class="n">localTime</span> <span class="p">=</span> <span class="n">te</span><span class="p">.</span><span class="n">ToLocalTime</span><span class="p">();</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
      <span class="n">TimeEntry</span> <span class="n">te</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TimeEntry</span><span class="p">(</span><span class="n">localTime</span><span class="p">);</span>
      <span class="n">te</span><span class="p">.</span><span class="n">Apply</span><span class="p">(</span><span class="n">_culture</span><span class="p">);</span>
      <span class="n">localTime</span> <span class="p">=</span> <span class="n">te</span><span class="p">.</span><span class="n">ToLocalTime</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">localTime</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Hmm. This code smells to have bugs. You're staring at it and think <em>"Oh my. Look at the dupes. Rookies."</em> If you wouldn't just slurp your coffee while browsing code, your left hand would be ready to serve a generous face-palm. Your excellent nose didn't mislead you, as you soon realize while reading the bug report in Bugzilla:</p>

<div class="codehilite"><pre><span class="n">Bug</span> <span class="n">Nr</span>      <span class="p">:</span> <span class="mi">0815</span>
<span class="n">Title</span>       <span class="p">:</span> <span class="n">culture</span> <span class="n">is</span> <span class="ow">not</span> <span class="n">updated</span> <span class="n">when</span> <span class="n">clock</span> <span class="n">is</span> <span class="n">in</span> <span class="n">sync</span> <span class="n">with</span> <span class="n">server</span>
<span class="n">Component</span>   <span class="p">:</span> <span class="n">Time</span> <span class="n">Sychronizer</span> <span class="p">(</span><span class="n">Chronograph</span><span class="p">)</span>
<span class="n">Description</span> <span class="p">:</span> <span class="n">While</span> <span class="n">the</span> <span class="nb">local</span> <span class="nb">time</span> <span class="n">is</span> <span class="n">in</span> <span class="n">sync</span> <span class="n">with</span> <span class="n">server</span><span class="p">,</span> <span class="n">the</span> <span class="n">culture</span> <span class="n">needs</span> <span class="n">to</span> <span class="n">be</span> <span class="s">&quot;updated&quot;</span> <span class="n">regularly</span><span class="o">.</span> <span class="n">It</span> <span class="n">happens</span> <span class="ow">not</span> <span class="n">to</span> <span class="n">be</span> <span class="n">the</span> <span class="k">case</span><span class="o">.</span> <span class="n">The</span> <span class="nb">time</span> <span class="n">server</span> <span class="n">API</span> <span class="n">has</span> <span class="n">a</span> <span class="n">specific</span> <span class="n">function</span> <span class="n">to</span> <span class="n">update</span> <span class="n">a</span> <span class="nb">time</span> <span class="n">entry</span> <span class="n">with</span> <span class="n">culture:</span> <span class="n">TimeEntry</span><span class="o">.</span><span class="n">Ensure</span><span class="p">(</span><span class="n">CultureInfo</span><span class="p">)</span><span class="o">.</span> <span class="n">Use</span> <span class="n">this</span> <span class="n">function</span> <span class="n">to</span> <span class="n">keep</span> <span class="n">culture</span> <span class="n">up</span> <span class="n">to</span> <span class="n">date</span><span class="o">.</span>
</pre></div>

<p>Good to know that a professional like you is taking care of this nifty bug. While browsing through TimeServer API, you realize that <code>TimeServer</code>, <code>TimeEntry</code> and <code>LocalTime</code> classes are all sealed. Without interfaces. </p>

<p>Your mouse pointer moves the scrollbar slow. Very slow. You try to cheer up yourself: "An API style I've seen a hundred times at least. Nothing shocking so far." You know the truth is different. You wished to stay at home today. Now you're here. Right in front of this artfully crafted code. Not.</p>

<p><em>Riiing!</em> 10 AM! Stand-up time! "Come on, <a href="http://en.wikipedia.org/wiki/Marty_McFly">McFly</a>, wake up!" is the flash of thought right after the alarm window popped up on your screen. Lock the box, put off the mug, off to 3rd floor! Since your department has moved last year from 3rd to 1st floor, these dailies happen to have the notion of helping the staff to burn calories. You hurry up to entrance. "Yeah. Right." - all elevators blocked. Stairs, as always.</p>

<h3 id="tdd-is-en-vogue">TDD is En Vogue</h3>

<p>Arrived at 3rd floor you see all devs listening to the lead developer. You don't like him, yeah. Nonetheless, this time it's as if an important announcement is about to happen. "Will he retire?" is all what you can imagine to be a positive thing right now. However, surprise is ahead.</p>

<blockquote>
<p>From now on, the management and the entire organization will support and encourage to develop literally everything with TDD. No code will be put in production which is not TDD'd, no bug will be resolved without proper tests using test-first method. Period.</p>
</blockquote>

<p>It's Christmas and Eastern altogether. Did he really say TDD? Yes, he did! Life is a roller-coaster. After having reached the grounds this morning, you're now back on track. Finally TDD. All those arguments you had in kitchen, all those emails you wrote to colleagues with links to <a href="http://www.objectmentor.com/omTeam/martin_r.html">Uncle Bob</a> and <a href="http://en.wikipedia.org/wiki/Kent_Beck">Kent Beck</a>, all those code reviews and little wars about test frameworks and CI integration have come to an end. Whoohoo!</p>

<p>Ok, great stuff! Finally your company is on the right path. Right after daily you hurry down to your desk again. Now let's do some bug hunting! You start to examine the class signatures involved in that nasty bug again:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">sealed</span> <span class="k">class</span> <span class="nc">TimeServer</span> <span class="p">{</span>
  <span class="k">public</span> <span class="n">TimeEntry</span> <span class="nf">GetTime</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">sealed</span> <span class="k">class</span> <span class="nc">TimeEntry</span> <span class="p">{</span>
  <span class="k">public</span> <span class="nf">TimeEntry</span><span class="p">(</span><span class="n">LocalTime</span> <span class="n">lt</span><span class="p">);</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Apply</span><span class="p">(</span><span class="n">CultureInfo</span> <span class="n">ci</span><span class="p">);</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Ensure</span><span class="p">(</span><span class="n">CultureInfo</span> <span class="n">ci</span><span class="p">);</span>
  <span class="k">public</span> <span class="n">LocalTime</span> <span class="nf">ToLocalTime</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">sealed</span> <span class="k">class</span> <span class="nc">LocalTime</span> <span class="p">{}</span>
</pre></div>

<p>Wow. Sealed. The Dev who wrote this must have got a <a href="http://www.youtube.com/watch?v=AMD2TwRvuoU">Kiss from a Rose</a>. Looking back at the original <code>Chronograph</code> class, it's crystal-clear that the <code>else</code> branch needs to call <code>Ensure</code> instead of <code>Apply</code>. Pretty easy. But wait! How to write a test for this tiny typo? You look back into your digital toolbox: Only <a href="http://nunit.org/">NUnit</a> and <a href="http://code.google.com/p/moq/">Moq</a> available. Hmm. You stop for a minute and rephrase the question in your mind: <em>"How to write a sensible unit test beforehand to ensure that the bug is fixed right after you have just replaced a single word?"</em></p>

<h3 id="the-quest-of-the-test">The Quest Of The Test</h3>

<p>You wouldn't be a geek if you wouldn't consider it as a duty to find an answer to this question. With years being in this business, you very surely know: There's coders, there's hero coders, and - there's you. The metaphorical ant of all coders. You'll sit here, with your coffee mug on your left, and take the quest. <a href="http://www.callofduty.com/">Duty is calling</a>, comrade.</p>

<p>First, you just do the regular easy stuff. That is, get NUnit referenced, build up a skeleton of the test class and write up your environment to be "ready to assert". No minute later, you're staring at this code fragment:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">When_chrono_is_in_sync</span> <span class="p">{</span>
<span class="na">  [Test]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Then_culture_is_ensured_with_time_entry</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">ensureWasCalled</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>

    <span class="n">var</span> <span class="n">ts</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TimeServer</span><span class="p">();</span>
    <span class="n">var</span> <span class="n">chrono</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Chronograph</span><span class="p">();</span>

    <span class="n">chrono</span><span class="p">.</span><span class="n">IsDirty</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
    <span class="n">chrono</span><span class="p">.</span><span class="n">SyncWith</span><span class="p">(</span><span class="n">ts</span><span class="p">);</span>

    <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">ensureWasCalled</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>So far, so good. Now the kindergarten is over. Right now is the time to separate real men from boys. You need to find a <em>plausible</em> and <em>sensible</em> way to express the expectation, that <code>te.Ensure()</code> is being called instead of <code>te.Apply()</code>.</p>

<p>It's time for another coffee. Volluto doesn't do any more. This exceptional situation cries for exceptional coffee. You put in the "<a href="http://www.nespresso.com/ch/en/product/roma">Roma</a>" tab into the machine and let the mug do its job: awesome coffee storage. No milk. No sugar. Outlook off, Browser off, Tweetdeck off. You literally feel the scientific aura now.</p>

<p>"Wait a minute..." you think. "... scientific? Science. Yes, science is a good catch right now. I need to express a function in order to put it under assertion.". Express. A. Function.</p>

<p><strong>Eureka!</strong></p>

<p>That's the key! You'll go for a lambda expression. You need to define the function which actually calls the <code>Ensure</code> method and then assert its proper usage simply by checking whether this function has been called. That's like implanting a lambda into the existing code. You quickly smash in some prototypical code to verify your solution path:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">TimeEntryImplant</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">delegate</span> <span class="k">void</span> <span class="nf">Ensure</span><span class="p">(</span><span class="n">CultureInfo</span> <span class="n">culture</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<p>That's the delegate. Let's weave that into <code>Chronograph</code> in order to be able to utilize it:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">class</span> <span class="nc">Chronograph</span> <span class="p">{</span>
  <span class="k">private</span> <span class="n">CultureInfo</span> <span class="n">_culture</span> <span class="p">=</span> <span class="n">CultureInfo</span><span class="p">.</span><span class="n">InvariantCulture</span><span class="p">;</span>
  <span class="k">private</span> <span class="n">TimeEntryImplant</span><span class="p">.</span><span class="n">Ensure</span> <span class="n">_implant</span><span class="p">;</span>

  <span class="k">internal</span> <span class="nf">Chronograph</span><span class="p">(</span><span class="n">TimeEntryImplant</span><span class="p">.</span><span class="n">Ensure</span> <span class="n">implant</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">_implant</span> <span class="p">=</span> <span class="n">implant</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// ...</span>
<span class="p">}</span>
</pre></div>

<p>And finally heading on to extend the test:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">When_chrono_is_in_sync</span> <span class="p">{</span>
<span class="na">  [Test]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Then_culture_is_ensured_with_time_entry</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">ensureWasCalled</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>

    <span class="n">TimeEntryImplant</span><span class="p">.</span><span class="n">Ensure</span> <span class="n">implant</span> <span class="p">=</span>
      <span class="n">culture</span>
        <span class="p">=&gt;</span> <span class="n">ensureWasCalled</span> <span class="p">=</span> <span class="k">true</span><span class="p">;</span>

    <span class="n">var</span> <span class="n">ts</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TimeServer</span><span class="p">();</span>
    <span class="n">var</span> <span class="n">chrono</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Chronograph</span><span class="p">(</span><span class="n">implant</span><span class="p">);</span>

    <span class="n">chrono</span><span class="p">.</span><span class="n">IsDirty</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
    <span class="n">chrono</span><span class="p">.</span><span class="n">SyncWith</span><span class="p">(</span><span class="n">ts</span><span class="p">);</span>

    <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">ensureWasCalled</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>"Yeah, right." Looks good so far. The strategy now is hacked in. You feel good, you feel confident. Nonetheless, you still feel the need to reiterate your solution path again. The pro is working here. Swiftly, almost gracefully, you stand up from your seat, followed by two elegant sidesteps towards the whiteboard. On a small space on the upper left corner you rewrite the essentials steps again:</p>

<ol>
<li>Declare &amp; define expression containing the new functionality.</li>
<li>Use the expression within assertion to get the test red.</li>
<li>Implant the expression within class under test to get the test green.</li>
</ol>

<h3 id="freddy-fredpecker">Freddy Fredpecker</h3>

<p>"Hey, hey, heeeeeeey!" you hear a dark, arrogant and unemotional voice on your back saying with low voice. It's Fred, your "colleague". No. Collegue is not the right word. Fred is an arrogant Egomaniac, who coincidentally happen to work at the same company as you do. To make it even worse, Fred is the self-proclaimed "Testing Expert" in your department. He actually hasn't heard anything about <a href="https://github.com/machine/machine.specifications">MSpec</a>, he writes "Unit Tests" with database usage and he is very keen to rigorously punish every developer with irony and sarcasm who is not obeying the almighty AAA-rule. Testing Expert, you know.</p>

<p>You turn your back slowly and see him sitting on your desk. "What an ignorant, low-life piece of crap he is" you think as you see him tipping with his dirty fingers on your beloved <a href="http://shop.github.com/products/octocat-mug">Octocat Mug</a> while swinging around in lay-back mode on your swivel-chair.</p>

<p>"You seem to have a faible for testing, aren't you? Buddy, realize testing is not about colors or expressions. I see..." Fred continues while having a glimpse at your test code, "... you're trying to test something with lambda. Man, I knew you're crazy. Like '<a href="http://en.wikipedia.org/wiki/I_Now_Pronounce_You_Chuck_and_Larry">Adam Sandler-Crazy</a>'. But I didn't knew you're dumb as well. Like '<a href="http://en.wikipedia.org/wiki/Dumb_and_Dumber">Jim Carrey-Dumb</a>', y'know?" He harshly puts your mug back on your desk while moving his butt off your chair.</p>

<p>"Fred," you reply, "ehh... eh... well... em, you're right. I'm just trying out something, y'know? It's wrong shit anyway, so don't care about it. Well, y'know it's hard for me as an 'average' coder to get into this testing stuff. I'm experimenting a bit, that's all.". </p>

<p>You know you need to get rid of him. Now. You put that ordinary, demotivated Looser-Look on your face and stare at Fred. Deranged. - "You better get a life, kid." mouns Fred and slowly moves out of the door. You follow him, with a little, respectful distance, grab the knob of the door and close it silently.</p>

<h3 id="two-strikes-to-green">Two Strikes To Green</h3>

<p>"Phew... at least I got rid of this low life looser". You quickly move back to your desk and grab the keyboard. You're so close to the solution, only a few keystrokes away. The test is red. You know you could go green by just invoking <code>_ensure</code> function you injected through <code>Chronograph</code>s constructor. </p>

<p>However, that's not the idea of this game. The Idea is to ensure that the <em>real</em> <code>Ensure</code> method of <code>TimeEntry</code> has been called. You lean back for a minute, then decide to slowly hack in an extension method to <code>TimeEntryImplant</code>:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">TimeEntryImplant</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">EnsureImplant</span><span class="p">(</span><span class="k">this</span> <span class="n">TimeEntry</span> <span class="n">entry</span><span class="p">,</span> <span class="n">CultureInfo</span> <span class="n">culture</span><span class="p">,</span> <span class="n">Ensure</span> <span class="n">implant</span><span class="p">)</span> <span class="p">{</span>
    <span class="p">(</span><span class="n">implant</span> <span class="p">??</span> <span class="n">entry</span><span class="p">.</span><span class="n">Ensure</span><span class="p">)(</span><span class="n">culture</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Yep. You pause. Just staring at your code. It's these little moments, these little seconds in your poor hacker life you're loving to have. You made it. And it looks beautiful. You just got your very first <strong>test implant</strong>.</p>

<h3 id="grande-finale">Grande Finale</h3>

<p>Now let's head on to the finishing move! It somehow amazes you that you're able to switch back into rapid fire mode so easily after being in the 'code monkey stares at code'-position. Rolling back with yout chair to your desk, you almost spilled your coffee on your beloved keyboard. Almost.</p>

<p>Ok. Concentration. You already know it. Victory is only one single line away. With the heart of a winner, a generous and confident smile in your face, you open the <code>Chronograph</code> class and change the line you knew you needed to change from the beginning. You locate your enemy:</p>

<div class="codehilite"><pre><span class="n">te</span><span class="p">.</span><span class="n">Apply</span><span class="p">(</span><span class="n">_culture</span><span class="p">);</span>
</pre></div>

<p>Squash this buggy line away and place in your implant:</p>

<div class="codehilite"><pre><span class="n">te</span><span class="p">.</span><span class="n">EnsureImplant</span><span class="p">(</span><span class="n">_culture</span><span class="p">,</span> <span class="n">_implant</span><span class="p">);</span>
</pre></div>

<p>Save. Run test. <em>This is the moment.</em> You stare with eager into test results window while your stuff compiles. You're sweating, altough you haven't moved your ass even an inch away from your computer.</p>

<p>Ok, runner starting... testing... green!</p>

<p><strong>Victory!</strong></p>

<p>You lean back, grab your mug, sip a little bit, switch back to code to see the beauty of the complete <code>Chronograph</code> class:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">class</span> <span class="nc">Chronograph</span> <span class="p">{</span>
  <span class="k">private</span> <span class="n">CultureInfo</span> <span class="n">_culture</span> <span class="p">=</span> <span class="n">CultureInfo</span><span class="p">.</span><span class="n">InvariantCulture</span><span class="p">;</span>
  <span class="k">private</span> <span class="n">TimeEntryImplant</span><span class="p">.</span><span class="n">Ensure</span> <span class="n">_implant</span><span class="p">;</span>

  <span class="k">internal</span> <span class="nf">Chronograph</span><span class="p">(</span><span class="n">TimeEntryImplant</span><span class="p">.</span><span class="n">Ensure</span> <span class="n">implant</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">_implant</span> <span class="p">=</span> <span class="n">implant</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsDirty</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>

  <span class="k">public</span> <span class="n">LocalTime</span> <span class="nf">SyncWith</span><span class="p">(</span><span class="n">TimeServer</span> <span class="n">ts</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">localTime</span> <span class="p">=</span> <span class="k">new</span> <span class="n">LocalTime</span><span class="p">();</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">IsDirty</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">TimeEntry</span> <span class="n">te</span> <span class="p">=</span> <span class="n">ts</span><span class="p">.</span><span class="n">GetTime</span><span class="p">();</span>
      <span class="n">te</span><span class="p">.</span><span class="n">Apply</span><span class="p">(</span><span class="n">_culture</span><span class="p">);</span>
      <span class="n">localTime</span> <span class="p">=</span> <span class="n">te</span><span class="p">.</span><span class="n">ToLocalTime</span><span class="p">();</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
      <span class="n">TimeEntry</span> <span class="n">te</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TimeEntry</span><span class="p">(</span><span class="n">localTime</span><span class="p">);</span>
      <span class="n">te</span><span class="p">.</span><span class="n">EnsureImplant</span><span class="p">(</span><span class="n">_culture</span><span class="p">,</span> <span class="n">_implant</span><span class="p">);</span>
      <span class="n">localTime</span> <span class="p">=</span> <span class="n">te</span><span class="p">.</span><span class="n">ToLocalTime</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">localTime</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>You did it. You squashed the bug. TDD. Test-First. Brownfield. What a victory.</p>

<p>After this tremendous win, you surely got excited enough from your <em>test implant</em> to tell all your mates about it. In your office, though IM, Facebook, Twitter and whatever medium you have ready. For hours and hours, you reiterate your journey.</p>

<p>Through all this excitement, you even get your hands on other, similar pieces of code and try using the implant technique. It's easy, it's expressive, it just works.</p>

<p>After all these exciting hours, you literally didn't notice how fast time flew away. It's 9 P.M and you're still in office. "Oh shit, I'm supposed to meet with my honey at 10!". You grab your jacket, lock your box, switch off lights and slowly move stairs down to basement. Time to leave with pride. With the 'test implant' feather in your cap you walk out of the office and step into the bus.</p>

<p>An hour later you're finally at the bar to meet your sweetheart. She steps in, beautiful as ever, smiles and quickly skirrs into your arms. This day can't get better. She gives you a long, affectionate kiss - willing to stop at nothing.</p>

<p>All of a sudden you stop the kiss, smile at her at your best and whisper: "I love you, hon..." while thinking... <strong>"OMG, I forgot to check-in!"</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">C# Global &amp; Generic Type Alias</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/c-global-generic-type-alias.html"/>
            <updated>2012-01-03T15:21:27Z</updated>
            <published>2012-01-03T15:21:27Z</published>
            <id>/c-global-generic-type-alias.html</id>
            
            <content type="html"><![CDATA[
                <p>I want better aliases in C#. To be honest I miss this feature since .NET 2.0. I mean, it's not a problem of .NET, but merely a problem of the C# language itself. To me, aliasing is a very important language feature. In my opinion, it's one of the three most undervalued language features: macros, aliases and comments.</p>

<h3 id="global-type-alias">Global Type Alias</h3>

<p>First off, let me define what a global alias is for me. A global type alias is best described with the current aliasing feature in C#:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Dump</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</span><span class="p">.</span><span class="n">Debug</span><span class="p">;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">Writer</span> <span class="p">{</span>
  <span class="k">public</span> <span class="nf">Writer</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Dump</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Writer!&quot;</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>The second line is a <a href="http://msdn.microsoft.com/en-us/library/sf0df423.aspx">using alias</a>. It's quite handy to avoid name clashes in your source file. And that's the downside (for me) as well. In C#, it's only possible to define type <a href="http://stackoverflow.com/questions/2590643/namespace-scoped-aliases-for-generic-types-in-c-sharp">aliases on source code file level</a>. While it's perfectly ok for resolving name clashes, it's yet not enough for me in terms of sensible alias usage.</p>

<p>From my perspective, a broader - even declarable - scope of a type alias would be very helpful. As a starting point, I'll define a "global" type alias as an alias valid on assembly level.</p>

<p>Global type aliasing can be very helpful. I miss it most for generic types, since they're not only tend to be verbose but can be misleading as well. I mean, how often did you ask your inner self the famous three letters (WTF?) when seeing something like <code>ServiceResponse&lt;Dictionary&lt;long, List&lt;string&gt;&gt;&gt;</code>? Yes, sure you can alias it with <code>using RoadServiceResponse = ServiceResponse&lt;Dictionary&lt;long, List&lt;string&gt;&gt;&gt;</code>. </p>

<p>Now would you want to define this alias in <em>every single file</em> where you process this mighty response object? Surely not. Redundancy is boring. However, if you're using C#, you just have to. A widely scoped type alias is surely possible if you were using <a href="http://stackoverflow.com/questions/2480290/global-import-using-aliasing-in-net">VB.NET with its Imports feature</a>.</p>

<h3 id="alias-open-types">Alias Open Types</h3>

<p>Lengthy and complicated naming is one reason. A second, even more demanding reason for global type aliases are the use of generic implementations or generic interface definitions. It may sound weird in first instance, so let's see an example here:</p>

<div class="codehilite"><pre><span class="cm">/* Assembly A: My &#39;cool&#39; API :-) */</span>
<span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>

<span class="k">public</span> <span class="k">interface</span> <span class="n">IMetaData</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="p">{</span>
  <span class="kt">string</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
  <span class="n">T</span> <span class="n">Data</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">interface</span> <span class="n">IRelationMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">TKey</span><span class="p">,</span> <span class="n">TValue</span><span class="p">&gt;</span> 
  <span class="p">:</span> <span class="n">IDictionary</span><span class="p">&lt;</span><span class="n">TKey</span><span class="p">,</span> <span class="n">TValue</span><span class="p">&gt;</span> <span class="p">{</span>
  <span class="n">TValue</span> <span class="nf">GetRelated</span><span class="p">(</span><span class="n">T</span> <span class="n">obj</span><span class="p">,</span> <span class="n">TKey</span> <span class="n">key</span><span class="p">);</span>
  <span class="n">T</span> <span class="n">RelateTo</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">TKey</span> <span class="n">key</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">interface</span> <span class="n">IMetaInfo</span><span class="p">&lt;</span><span class="n">TSource</span><span class="p">,</span> <span class="n">TData</span><span class="p">&gt;</span> <span class="p">{</span>
  <span class="n">IRelationMap</span><span class="p">&lt;</span><span class="n">TSource</span><span class="p">,</span> <span class="kt">string</span><span class="p">,</span> <span class="n">IMetaData</span><span class="p">&lt;</span><span class="n">TData</span><span class="p">&gt;&gt;</span> <span class="n">Properties</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
  <span class="n">TSource</span> <span class="n">Object</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
  <span class="kt">int</span> <span class="n">ChannelId</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>A little unreadable for the generic types, but quite straight forward so far. Let's implement <code>IMetaInfo</code>:</p>

<div class="codehilite"><pre><span class="cm">/* Assembly B: My &#39;cool&#39; Service :-) */</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">TextMetaInfo</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> 
  <span class="p">:</span> <span class="n">IMetaInfo</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span>
  <span class="k">public</span> <span class="n">IRelationMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="kt">string</span><span class="p">,</span> <span class="n">IMetaData</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;&gt;</span> <span class="n">Properties</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="k">public</span> <span class="n">T</span> <span class="n">Object</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">ChannelId</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Doesn't this look weird? Wouldn't this one be a little more readable:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>

<span class="k">using</span> <span class="nn">IMetaMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="p">=</span> <span class="n">IRelationMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="n">IMetaData</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;&gt;;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">TextMetaInfo</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> 
  <span class="p">:</span> <span class="n">IMetaInfo</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span>
  <span class="k">public</span> <span class="n">IMetaMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">Properties</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="k">public</span> <span class="n">T</span> <span class="n">Object</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">ChannelId</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Sad enough that above code won't compile. C# only accepts <a href="http://stackoverflow.com/questions/4936941/using-a-using-alias-class-with-generic-types">aliases for closed types</a>.</p>

<p>Yeah, you might think now that this is just nitpicking, since you surely might just derive to have naming done right:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">interface</span> <span class="n">IMetaMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="p">:</span> <span class="n">IRelationMap</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="n">IMetaData</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;&gt;</span> <span class="p">{}</span>
</pre></div>

<p>Sorry to disappoint you here. "Fixing naming" by subclassing is just wrong. Despite of the bad smell you simply made it even worse since you now made it a lot harder to implement <code>IMetaInfo&lt;T, string&gt;</code>. If you were the consumer of <em>Assembly A</em> without any source code access, you lost anyway. If you actually have access to the sources of <em>Assembly A</em>, you end up in deciding whether to change the type signature of <code>IMetaInfo&lt;TSource, TData&gt;</code> just for naming. In consequence, other implementors need to change their implementations. Even callers need to recompile. For the sake of readability?</p>

<p>Sorry, C#. You are doing a good job being a multi-paradigm (yet OO-colored) language. However, when it comes to aliasing, you could do better.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Alles agil, nichts stabil</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/alles-agil-nichts-stabil.html"/>
            <updated>2012-01-01T17:00:35Z</updated>
            <published>2012-01-01T17:00:35Z</published>
            <id>/alles-agil-nichts-stabil.html</id>
            
            <content type="html"><![CDATA[
                <p>Dieser Artikel ist etwas besonderes. Normalerweise mache ich kein großes Aufsehen um meine Vorträge und Lesungen. Doch bei diesem mache ich eine Ausnahme, denn dieser Beitrag ist etwas besonderes. Mein Beitrag:</p>

<h4 id="titel-amigo-agilo-alles-agil-nichts-stabil">Titel: Amigo Agilo: Alles Agil, Nichts Stabil</h4>

<p><strong>Beschreibung:</strong> Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Stabil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Stabil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Stabil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Agil. Stabil. Agil. Agil. Agil. Agil. Agil. Agil.</p>

<h4 id="interesse-interesse">Interesse? Interesse!</h4>

<p>Ich möchte hiermit jeden, der Interesse an meinem Beitrag <strong>"Amigo Agilo: Alles Agil, Nichts Stabil"</strong> hat, um einen Gefallen bitten:</p>

<p>Bitte schreibt mir hier einen Kommentar, twittert an <a href="http://www.twitter.com/ilkerde">@ilkerde</a>, schlagt meinen Vortrag auf Konferenzen, Barcamps und User-Groups im Software-Entwicklungs- und Software-Management-Umfeld vor. Ich würde mich sehr freuen, diesen Beitrag einem breiten und interessierten Publikum vorzustellen. </p>

<p>Jede aufrichtige und realistische Möglichkeit nehme ich dankend an. Ganz besonders würde es mich freuen, diesen Vortrag im Rahmen einer Konferenz oder eines UG-Treffens für Agile Methoden halten zu können. Das ist ja bei dem Thema ja recht naheliegend, oder?</p>

<p>Bevor es zu irgendwelchen Mißverständnissen oder Rückfragen kommt: Der o.g. Titel sowie die ungewöhnliche Beschreibung dazu sind alles, was ich zum Beitrag schriftlich mitgeben kann und will. Die Beschreibung trifft den Vortragsinhalt ziemlich genau, denn es geht um das Wort "Agil" und dessen Bedeutung im Software-Entwicklungs- bzw. -Management-Umfeld.</p>

<p>Die Dauer des Vortrages ist ca. 60 Minuten, es sind keine Voraussetzungen notwendig, außer ein gesundes Interesse zum Thema. In diesem Sinne:</p>

<p><strong>Alles Agil, Nichts Stabil.</strong></p>

<p>Ich freue mich auf Feedback, Meinungen und Anregungen. Danke.</p>
            ]]></content>
        </entry>
                                  <entry>
            <title type="html">Notizen eines Nerds 2011</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/notizen-eines-nerds-2011.html"/>
            <updated>2011-12-31T01:30:38Z</updated>
            <published>2011-12-31T01:30:38Z</published>
            <id>/notizen-eines-nerds-2011.html</id>
            
            <content type="html"><![CDATA[
                <p>Hier sind meine <em>Notizen eines Nerds</em> für 2011. Viel Spaß! </p>

<h3 id="notizen-eines-nerds">Notizen eines Nerds</h3>

<ul>
<li><a href="ux-progressbar-vs-waitcursor.html">UX: Progressbar vs. Waitcursor</a></li>
<li><a href="code-analysis-notes.html">Code Analysis Notes</a></li>
<li><a href="hardcore-software.html">Hardcore Software</a></li>
<li><a href="ale-muc-brainstorming.html">ALE MUC Brainstorming</a></li>
<li><a href="xp-secrets-notes.html">XP Secrets Notes</a></li>
<li><a href="tdd-talk-notes.html">TDD Talk Notes</a></li>
<li><a href="die-modellverantwortung-des-architekten.html">Die Modellverantwortung des Architekten</a></li>
<li><a href="castle-of-variability-estimation.html">Castle Of Variability &amp; Estimation</a></li>
<li><a href="branching-patterns.html">Branching Patterns</a></li>
<li><a href="context-in-model-is-evil.html">Context In Model Is Evil</a></li>
<li><a href="menu-state-analysis.html">Menu State Analysis</a></li>
<li><a href="posh-4-devs-notes.html">Posh 4 Devs Notes</a></li>
</ul>

<h4 id="more-nerd-notes">More Nerd Notes</h4>

<p>Der aufmerksame Leser meines Blogs kennt sicherlich auch die "Vorjahres-Ausgabe" meiner Nerd-Notizen, nämlich die <a href="notizen-eines-nerds-2010.html">Notizen eines Nerds 2010</a>.</p>

<p>Meine Notizen fertige ich in meinem kleinen <a href="http://www.moleskine.com">Moleskine</a> an. Es passt in jede Hosentasche und ist bei mir (fast immer) griffbereit. Dann brauche ich nur noch einen Bleistift, interessante Themen und Ideen. Ab und zu klappt das auch.</p>

<p>Mir hat mein kleines Notizbuch immens geholfen. Beim arbeiten, planen, begreifen, designen, reflektieren, lernen, denken und entspannen.</p>

<p><strong>Ich wünsche uns allen gemeinsam ein gesundes, frohes, glückliches und erfolgreiches Jahr 2012!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Posh 4 Devs Notes</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/posh-4-devs-notes.html"/>
            <updated>2011-12-31T01:23:14Z</updated>
            <published>2011-12-31T01:23:14Z</published>
            <id>/posh-4-devs-notes.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1112">Notizen eines Nerds 11'12</h4>

<p>Eines der jüngeren Vorträge in meiner Vortragsliste ist der Beitrag <strong>Posh 4 Devs</strong>, auf gut Deutsch: Powershell für Entwickler. Ich habe den Vortrag schon halten dürfen und war froh über das positive Feedback. </p>

<p>Gerade auch, weil ich die Powershell selbst nicht mehr <em>so intensiv</em> nutze, sondern eigentlich nur noch für Automatisierungen in meiner Arbeitsumgebung. Die Notiz zur Vortragsgestaltung sieht bei mir so aus:</p>

<p><img alt="Posh 4 Devs Notes" src="/media/images/posh_4_devs_board.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Menu State Analysis</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/menu-state-analysis.html"/>
            <updated>2011-12-31T01:22:22Z</updated>
            <published>2011-12-31T01:22:22Z</published>
            <id>/menu-state-analysis.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1111">Notizen eines Nerds 11'11</h4>

<p>Ich habe während der Umgestaltung meiner Website mehrere Menü-Navigationen entworfen und umgesetzt. Die Navigationsmodelle habe ich mit Status- und Pfad-Diagrammen analysiert und bewertet. Naja, auch so etwas muss mal sein.</p>

<p><img alt="Menu State Analysis" src="/media/images/ilkerde_menu.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Context In Model Is Evil</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/context-in-model-is-evil.html"/>
            <updated>2011-12-31T01:22:01Z</updated>
            <published>2011-12-31T01:22:01Z</published>
            <id>/context-in-model-is-evil.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1110">Notizen eines Nerds 11'10</h4>

<p>Ich kann es eigentlich nicht oft genug betonen. Das Wörtchen <em>Kontext</em> hat in einem objekt-orientierten Domänenmodell nichts verloren. Nicht einmal in einem technischen Framework. Wenn jemand objekt-orientiert modelliert und designed, dann bitte ohne "Kontext-Objekte". Danke.</p>

<p><img alt="Context In Model Is Evil" src="/media/images/viewcontext.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Branching Patterns</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/branching-patterns.html"/>
            <updated>2011-12-31T01:21:35Z</updated>
            <published>2011-12-31T01:21:35Z</published>
            <id>/branching-patterns.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-119">Notizen eines Nerds 11'9</h4>

<p>Branching. Dieses Thema geht an keinem Entwickler vorbei. In den letzten Jahren habe ich so oft (und immer wieder) über Branching, Branching-Strategien und Patterns gelesen, studiert, probiert und umgesetzt. Mit großen Code-Ständen, sehr großen Code-Quellen und auch kleineren Repositories. Auch in diesem Jahr gab es wieder etwas "zum Branch":</p>

<p><img alt="Branching Patterns: Bodyguard and Patchwork" src="/media/images/branching_notes.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Castle Of Variability &amp; Estimation</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/castle-of-variability-estimation.html"/>
            <updated>2011-12-31T01:21:09Z</updated>
            <published>2011-12-31T01:21:09Z</published>
            <id>/castle-of-variability-estimation.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-118">Notizen eines Nerds 11'8</h4>

<p>Es war einmal ein Schloß. Dieses Schloß war das sogenannte "Schloß des Kaisers von Digitalia", dem unendlich großen Reich der Software-Entwicklung und des Managements. Der Kaiser hatte zu seiner Belustigung bei Software-Projekten immer zwei Junker zu seiner Seite.</p>

<p>Der erste Schelm hörte auf den Namen "Variability" <em>(Variabilität)</em>. Er war ein freudiger kleiner Narr, der besonders stetig und zuverlässig eine maßvolle Bespaßung der kaiserlichen Umwelt umsetzen wollte.</p>

<p>Der zweite Schalk war der überall bekannte "Estimation" <em>(Schätzung)</em>. Ein juchzend-froher Kasperle, der sich um die kaiserliche Freude durch verblüffendes und deutsames Lustspiel rührend kümmerte.</p>

<p>Beide waren sich Ihrer Aufgabe und Verantwortung gegenüber dem Kaiser und dessen Reich bewußt. Beide wollten der bessere Harlekin sein. Der Kaiser jedoch, der Kaiser... der lachte über beide Narren.</p>

<p><img alt="Castle Of Variability and Estimation" src="/media/images/variability_estimation_castle.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Die Modellverantwortung des Architekten</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/die-modellverantwortung-des-architekten.html"/>
            <updated>2011-12-31T01:15:36Z</updated>
            <published>2011-12-31T01:15:36Z</published>
            <id>/die-modellverantwortung-des-architekten.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-117">Notizen eines Nerds 11'7</h4>

<p>Diese Nerd-Notiz ist noch ein kleines Stück persönlicher als die anderen. Es geht um Software-Architektur. Besser gesagt, es geht um den Architekten - und dessen Verantwortung der Software und dem Team gegenüber.</p>

<p><img alt="Die Modellverantwortung des Architekten" src="/media/images/drm_architects_responsibility.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">TDD Talk Notes</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tdd-talk-notes.html"/>
            <updated>2011-12-31T01:13:05Z</updated>
            <published>2011-12-31T01:13:05Z</published>
            <id>/tdd-talk-notes.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-116">Notizen eines Nerds 11'6</h4>

<p>Ein weiterer Beitrag von mir ist <strong>TDD - Teilen, Denken, Designen</strong>, welches ich mit Freude auf der <a href="http://www.dotnet-developer-conference.de/">.NET DevCon</a> vortragen durfte. Regelmäßige Leser meines Blogs werden wohl meine <a href="unit-tests-tdd-und-testbarkeit-ja.html">Affinität</a> zum Thema <a href="tdd-ist-keine-wissenschaft.html">TDD</a> mittlerweile kennen.</p>

<p>Umso mehr war es für mich eine Freude und eine Aufgabe gleichermaßen, in dem Vortrag die Vorzüge von TDD dem Publikum näher zu bringen. Ich hoffe, es ist mir gelungen. Auch hierzu habe ich viele Seiten in meinem Notizblock vollgekritzelt. Stellvertretend hier eine Ablichtung der ersten Seite:</p>

<p><img alt="TDD Talk Notes" src="/media/images/tdd_talk_board.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">XP Secrets Notes</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/xp-secrets-notes.html"/>
            <updated>2011-12-31T01:06:07Z</updated>
            <published>2011-12-31T01:06:07Z</published>
            <id>/xp-secrets-notes.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-115">Notizen eines Nerds 11'5</h4>

<p>Im Mai hatte ich mindestens ein <strong><a href="you-got-an-f.html">F wie Fun</a></strong>. Der Grund: ich war als Sprecher bei dem <a href="http://www.dotnet-day-franken.de/">.NET Day Franken</a> mit dabei und hatte die Freude, meinen <strong>XP-Secrets</strong> Vortrag zu halten. Ich habe gutes und positives Feedback bekommen, was mich besonders gefreut hat. Hier die erste Seite (von vielen) meiner Notizen zu dem Vortrag.</p>

<p><img alt="XP Secrets Notes" src="/media/images/xp_secrets_board.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">ALE MUC Brainstorming</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ale-muc-brainstorming.html"/>
            <updated>2011-12-31T01:04:51Z</updated>
            <published>2011-12-31T01:04:51Z</published>
            <id>/ale-muc-brainstorming.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-114">Notizen eines Nerds 11'4</h4>

<p>Im Frühjahr hatte ich das Vergnügen, mich mit <a href="http://www.twitter.com/wwiedenroth">@wwiedenroth</a> und <a href="http://www.twitter.com/da_chrisch">@da_chrisch</a> gemeinsam zum Brainstorming der Interessensgemeinschaft <a href="/ale-network-munich.html">ALE Network Munich</a> zu treffen. Es war ein sehr konstruktives und inspirierendes Gespräch.</p>

<p>Uns Drei hat die Idee der autonomen, nicht-regulativen Interessensgemeinschaft für Agile, Lean und das Drum-Herum so gut gefallen, dass wir uns dafür engagiert haben, die Münchener Gemeinde rund um <a href="http://agiletuesday.org/">AgileTuesday</a>, <a href="http://www.scrumtisch.org/">Scrumtisch</a> und <a href="http://limitedwipsocietymuc.mixxt.de/">Limited WIP Society</a> zu einem Ideen- und Meinungsaustausch einzuladen.</p>

<p>Während der Brainstorming-Session mit <a href="http://www.agilemanic.com/">Wolfgang</a> und <a href="http://da_chrisch.posterous.com/">Christian</a> habe ich mir (wie üblich) Notizen gemacht. Es war ein sehr lehrreicher Abend. Obendrein habe ich auch noch zwei agile Freunde kennen - und schätzen - gelernt.</p>

<p><img alt="ALE MUC Brainstorming" src="/media/images/ale_muc_network.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">UX: Progressbar vs. Waitcursor</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ux-progressbar-vs-waitcursor.html"/>
            <updated>2011-12-31T01:00:09Z</updated>
            <published>2011-12-31T01:00:09Z</published>
            <id>/ux-progressbar-vs-waitcursor.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-111">Notizen eines Nerds 11'1</h4>

<p>Ein Thema, welches sowohl Entwickler als auch UI-Designer mit Sicherheit begegnet sind oder werden: Wartezeit. Warten ist ein heikles Thema. Ganz besonders, wenn es um Computerprogramme geht.</p>

<p>Das klassische Thema heißt dabei: Progressbar vs. Waitcursor. Fortschritt oder Warteschleife.</p>

<p><img alt="Progressbar vs. Waitcursor" src="/media/images/ux_progress_vs_waitcursor.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Code Analysis Notes</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/code-analysis-notes.html"/>
            <updated>2011-12-30T15:38:11Z</updated>
            <published>2011-12-30T15:38:11Z</published>
            <id>/code-analysis-notes.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-112">Notizen eines Nerds 11'2</h4>

<p>Ich bereite meine Vorträge mit verschiedenen Werkzeugen und Techniken vor. Ein Mittel, welches ich quasi immer einsetze ist ein "Transscript", welches in kurzen Stichpunkten den Ablauf des Vortrages widerspiegelt. So auch bei meinem Vortrag über (statische) Code-Analyse, auch "Code Reading" genannt.</p>

<p><img alt="Code Analysis Script" src="/media/images/code_analysis_board.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Hardcore Software</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/hardcore-software.html"/>
            <updated>2011-12-30T15:37:24Z</updated>
            <published>2011-12-30T15:37:24Z</published>
            <id>/hardcore-software.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-113">Notizen eines Nerds 11'3</h4>

<p><img alt="Hardcore Software" src="/media/images/hardcore_software.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Code Quality KPI Grundlagen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/code-quality-kpi-grundlagen.html"/>
            <updated>2011-12-19T08:17:22Z</updated>
            <published>2011-12-19T08:17:22Z</published>
            <id>/code-quality-kpi-grundlagen.html</id>
            
            <content type="html"><![CDATA[
                <p>Code-Qualität. Metriken. Messung. Bewertung. Ein immer wieder kehrendes Thema bei der IT- und Software-Entwicklungs-Beratung. Als mittlerweile langjähriger Berater für agile Software-Entwicklungs-Methodik ist es schon manchmal mühsam, immer wieder die gleichen grundlegenden Weichenstellungen zum Thema "Messung von Code Qualität" zu geben. </p>

<p><img alt="" src="/media/images/a_measure_meter.jpg" /></p>

<p>Alleine in den letzten 2 Jahren habe ich locker ein halbes dutzend Mal Kunden und Teams zu diesem Thema beraten.</p>

<p>Das frappierende dabei: fast jedes mal mussten die <em>absoluten Grundlagen</em> vermittelt und durchgearbeitet werden. Ich erwarte ja nicht, dass alles schon picobello umgesetzt ist. Aber es ist heutzutage gar nicht mehr so schwer, die fundamentalen Grundlagen in die richtige Richtung zu lenken. Es scheint wohl doch nicht immer zu gelingen, wie mehrfach meine Erfahrung mich belehrte.</p>

<h3 id="prolog">Prolog</h3>

<p>So. Um nun nicht immer wieder von Null anfangen zu müssen, veröffentliche ich hier ein original Statement-Papier zum Thema "Code Quality KPI's". Es wurde von mir für einen Kunden als erste Antwort auf seine bisherige "KPI-Strategie" verfasst. Der folgende Text ist O-Ton aus einer Antwort-Mail. </p>

<h4 id="nomenklatur">Nomenklatur</h4>

<p>Die "Strategie-Aussagen" des Kunden habe ich als Zitate angeführt. </p>

<p><strong>Beispiel:</strong></p>

<blockquote>
<p>Aussage: Code-Qualität ist wichtig für den Projekterfolg.</p>
</blockquote>

<p>Die eben zitierte Aussage stellt ein "Strategie-Aspekt" dar, den ich hier - im Freitext - behandle bzw. erwidere.</p>

<h4 id="motivation">Motivation</h4>

<p>Das ganze mache ich in der - wohl eher idealistischeren - Hoffnung, dass sich einige Software-Projekt-Manager oder Entwicklungsleiter hierher verirren und sich mit den Grundlagen der Messung von Codequalität zumindest auseinandersetzen. </p>

<p>Denn wenn die Grundlagen schon mal sitzen, dann kann man auch wesentlich entspannter und effektiver an der eigentlichen Qualitätserhebung arbeiten.</p>

<h4 id="abgrenzung">Abgrenzung</h4>

<p>Der gleich folgende Abzug meiner Antwort auf ein KPI-Strategie-Papier ist mit nichten als eine vollständige "Code Quality Metrics"-Strategie zu bewerten. Im Gegenteil. Meiner Meinung nach fehlen gerade im folgend gezeigten Diskurs wesentliche Elemente einer Qualitätserhaltung, -messung und -bewertung im agilen Sinne.</p>

<p>Nichtsdestotrotz belasse ich es bei meiner Antwort auf die u.g. KPI-Ideen. Der Blog-Artikel ist so schon lang genug. Darüber hinaus ist mein Ziel ja auch nicht das Aufzeigen aller Grundlagen zur Qualitätsmessung, sondern eben nur derjenigen, die sich immer wieder als "die üblichen Verdächtigen" hervortun.  </p>

<p>In diesem Sinne, jetzt und hier: </p>

<p><em>"What you as a Developer, Tester, Manager or Leader should absolutely know about code quality measurement, indicators and their impact."</em></p>

<p>Viel Spaß.</p>

<p><hr />
<h3 id="quality-values">Quality Values</h3>
<h4 id="1-code-base-maturity">1. Code Base Maturity</h4>
<blockquote>
<p>Ein stetig grüner CI-Build ist Indikator für die Stabilität der Software.
Wir werden alle Buildergebnisse des CI nach Erfolg und Mißerfolg bewerten, um einen
stabilen CI-Build als Grundlage zu gewährleisten.</p>
</blockquote>
<p><em>Zu 1)</em> Ich gehe davon aus, dass hier jeder rote Build mit einer Qualitätsminderung assoziiert wird.
Im Gegenzug soll wohl hier ein stetiger Build-Erfolg ein Qualitätsmerkmal abbilden.</p>
<p>Es ist für das Ziel einer "Mature Code Base" für mich nicht direkt erschließbar, warum
gerade ein stetig grüner Build von einer "erwachsenen Codebasis" Zeugnis tragen soll.</p>
<p>Vielmehr ist ein grüner CI ein Abbild der Sorgfaltskultur des Teams. Das allerdings auch nur,
wenn eine rege Check-In-Kultur herrscht (in Kombination mit anderen Faktoren, selbstverständlich).</p>
<p>Eine strikte "Stay-Green"-Politik des Builds kann Gefahren mit sich bringen. Einerseits kann
das Team zur Erhaltung der KPI auf Branches oder Shelves ausweichen. Andererseits ist auch
eine "Check-In-Angst" in Folge des KPI-Drucks denkbar. </p>
<p>Das würde dem Qualitätsbestreben entgegenstehen, zumal eine lange "Vorhaltezeit" von Code-Änderungen zu größeren Commits, schwierigeren Merges und schlechterer Integration führen. </p>
<p>Es kann durchaus zur Folge haben, dass Commits auf die lange Bank geschoben werden, welches dann typischerweise am Ende der Iteration zu potenziellem "Commit-Stau" und Irritationen beim Merge führen kann.</p>
<p>Ich sehe diesem KPI mit äußerst kritischem Blick entgegen.</p>
<h4 id="2-architecture-conformance">2. Architecture Conformance</h4>
<blockquote>
<p>Eine automatisierte Prüfung der Abhängigkeitsbeziehungen der System- und Softwarekomponenten
wird stetig mit den architektonischen Vorgaben korreliert. Somit lassen sich Abweichungen gegenüber
der Systemarchitektur feststellen und beheben.</p>
</blockquote>
<p><em>Zu 2)</em> Die Annahme hier ist: geringere "Abhängigkeitsverletzungen" der Zielarchitektur können einen
höheren Qualitätsspiegel darstellen.</p>
<p>Meines Erachtens ist das durchaus ein guter Indikator für Stringenz und Konventionstreue gegenüber der
Zielarchitektur. Besonders beachtenswert ist es hier meiner Meinung nach, dass Architekturen durchaus
einer "stetigen Bewegung" ausgesetzt sind - sich ergo im Laufe der Zeit verändern.</p>
<p>Unter dem Vorbehalt der individuellen Betrachtung der einzelnen Architekturbestandteile
kann hier ein Messwert ein Indiz für ganzheitliche Systemkonzeption
und -umsetzung sein. </p>
<p>Ich kann aus meiner Perspektive noch die Messung der Änderungs- bzw. Ergänzungsfrequenz der Architekturrichtlinien zweifelsfrei empfehlen. Es gibt Aufschluss über den "Architektur-Puls" - also der Beschäftigung mit der Gesamtkomplexität des Systems.</p>
<h4 id="3-standards-and-best-practices">3. Standards and Best Practices</h4>
<blockquote>
<p>Der gesamte Quellcode wird nach den üblichen Standards und Best-Practices wie Methodenlänge, Dateilänge sowie Code-Duplikate bemessen und bewertet werden.</p>
</blockquote>
<p><em>Zu 3)</em> Der Überbegriff ist hier für meine Begriffe mit zu viel Interpretationspotenzial behaftet.
Mein Verständnis ist hier, dass die Pflege von Source Code nach "etablierten" Qualitätsmerkmalen
wie z.B. Dateigröße oder Methoden-Länge eine allgemeine Verbesserung der Produkt-Qualität
nach sich zieht.</p>
<p>Ich finde, eine Messung solcher "Best Practices" kann durchaus hilfreich sein und auch
ableitbare Informationen über die Entwicklungs-Qualität geben. </p>
<p>Wichtig ist für mein Dafürhalten hier, dass die Werte für sich alleine zumeist kaum Aussagekraft mitbringen.</p>
<p>Vielmehr ist es so, dass zumindest Volumen-Indikatoren wie z.B. Anzahl der Code-Zeilen (LoC)
oder Anzahl der Typdefinitionen (Class Count) in Korrelation gestellt werden müssen, um
aus den einzelnen Metriken ein grobes Bild über das Pflegepflichtbedürfnis des Teams zu
zeichnen.</p>
<h4 id="4-unit-testing">4. Unit Testing</h4>
<blockquote>
<p>Die Anzahl und Abdeckungsdichte von Unit-Tests ist ein weiteres, wesentliches Merkmal für die Messung der Software-Qualität.</p>
</blockquote>
<p><em>Zu 4</em>) Zweifelsohne sind lauffähige, positive Testprogramme für das Produkt ein Qualitätsmerkmal.
Ich kann das Bestreben nach "Unit Testing" nur vollends unterstützen. Dennoch gibt es schon
einige Punkte, die meiner Meinung nach einer genaueren Betrachtung bedürfen.</p>
<p>"Unit Test" ist ein weitläufiger, technisch geprägter Begriff, der auch einem breiten
Spektrum von Test-Konzepten genügen kann. </p>
<p>Das ist meiner Meinung nach als Schwachpunkt zu deuten - ganz besonders, wenn es um die Erhebung von Metriken geht, bei der von Natur aus präzisere Messmöglichkeiten wünschenswert sind.</p>
<p>Ich rege zumindest eine weitere technische Unterscheidung zwischen Integrationstest und
komponenten-orientiertem Funktionstest an. Während der Integrationstest (auf verschiedenen
Ebenen) das reibungslose Zusammenspiel der Komponenten adressiert, ist der Funktionstest
auf das korrekte funktionale Verhalten einer einzelnen Komponente - sprich: Klasse - konzentriert.</p>
<p>Im englischsprachigen Raum wird im Übrigen genau der Funktionstest oftmals als "Unit Test"
bezeichnet, was sicherlich nicht zu einer klaren Abgrenzung der Test-Ansätze beiträgt.</p>
<p>Abgesehen von diesem - sehr weiten - Themenbereich kann ich den KPI mit einem freudigen, als
auch einem kritischen Auge betrachten. Einerseits ist es wichtig und richtig, die Stabilität
des Unit Tests im CI-Build zu beobachten. Andererseits ist eine ausschließliche Betrachtung
der "Green-Rate" von Tests aus meiner Sicht mit schweren Deutungsvarianzen und einer
latenten Abbildungsschwäche behaftet.</p>
<p>Es hilft aus meiner Sicht vielmehr, die Anzahl der Tests in Relation zum Code-Volumen zu
beobachten. Daraus lässt sich tendenziell die Aktivität des Teams hin zu Testbarkeit und "Test-Awareness" beobachten.</p>
<p>Darüber hinaus ist vor Allem bei der "Stabilität" von Tests nicht nur deren Erfolgsrate wichtig, 
sondern auch deren "Anschlagsrate". Ein Unit Test, der in Folge
einer Regression fehl schlägt, ist für das Team als auch für das Produkt als Erfolg zu
werten, weil er seinen Dienst der Überprüfung und Warnung verrichtet hat.</p>
<p>Ein weiterhin erwägenswertes Merkmal ist sicherlich die Dauer der roten Warnphase, in der
ein Test fehlgeschlagen ist. Sie ist ein Zeichen für das verantwortungsbewusste 
Qualitätsempfinden des Teams. Eine kurze "Red-Response" ist ein hohes Gut für eine qualitätsorientierte,
stetige Software-Entwicklungsmethodik.</p>
<p>Die zweite vorgeschlagene Metrik der "Code Coverage" ist - wie auch das Unit Testing selbst -
eine Medaille mit zwei Seiten. Die Theorie der Testabdeckung besagt nämlich lediglich, dass
der betroffene Code unter eine Testbedingung gestellt wurde. Das kann für eine strengere
Qualitätsbetrachtung zuweilen schon nicht mehr hinreichend sein. Ich persönlich schätze
die Aussagekraft einer Testabdeckung in Relation zum gesamten Code-Volumen als schwach und unpräzise ein.</p>
<p>Nichtsdestotrotz kann mit einigen Ergänzungen eine Testabdeckungsmessung nicht nur eine
(begrenzte) Aussage über die Test- und Produkt-Qualität geben, sondern auch als anregender
Katalysator hin zu einer manifestierten Testkultur betrachtet werden.</p>
<p>Eine hilfreiche Ergänzung ist die Definition und das Festhalten der Testabdeckungs-Ratio
in Relation zu technischen und fachlichen Komponenten. Auf Grund einer technischen Architekturbetrachtung ließe sich eine technische Risiko- und Lebenszyklusbewertung vornehmen, die
man in die Abdeckungsgewichtung einfliessen lassen kann. </p>
<p>Viel wichtiger ist aus meiner Sicht jedoch die Wertbetrachtung der fachlichen bzw. 
funktionalen Komponenten und deren Einbeziehung in die Testabdeckungszielsetzungen. </p>
<p>Eine tragende fachliche Kernkomponente kann durchaus mit intensiven Testbemühungen begleitet 
werden, um das Risiko einer Fehlfunktion sowie eines fachlichen Fehlverhaltens zu mitigieren. </p>
<p>Hier kann eine Testabdeckungs-Ratio von 98% oder mehr eine realistische als auch notwendige 
Zielbindung darstellen. Bei einer fachlichen Funktionalität geringerer Tragweite sowie 
technisch minder komplexen Szenarien wie zum Beispiel der Darstellung von Ergebniswerten 
kann eine (deutlich) mindere Testabdeckung vertetbar, ja sogar zweckgemäß sein.</p>
<p>Alles in Allem ist meine Perspektive zu diesem "KPI-Paket" eher positiv. Nicht zuletzt,
weil es eine (kurzfristige) Anregung hin zu einer soliden, eigeninitiatorischen Testkultur
darstellen kann. </p>
<p>Ich will dabei jedoch auf keinen Fall meine Bedenken in den Hintergrund rücken,
sondern eher zur Erweiterung und stetigen Verbesserung im Bereich "Unit Testing KPI" ermutigen.</p>
<h3 id="quality-metrics-and-impact">Quality Metrics And Impact</h3>
<h4 id="1-impact-of-architecture-dependency-analysis">1. Impact Of Architecture Dependency Analysis</h4>
<blockquote>
<p>Eine Einhaltung der Architektur-Vorgaben wirkt sich positiv auf die Erweiterbarkeit, Testbarkeit und Skalierbarkeit des Systems aus.</p>
</blockquote>
<p><em>Zu 1)</em> Alle drei nicht-fachlichen Werte können durch eine stringente Umsetzung von Architektur
im komponenten-orientierten Sinne gestärkt werden. Bei der Testbarkeit kommt es sicherlich
auch auf die Granularität der Verantwortungsteilung im OO-Design an. </p>
<p>Die Wirksamkeit zu verbesserter Skalierbarkeit hängt hierbei jedoch aus meiner Sicht in
großem Masse von der Zielarchitektur ab, als ausschließlich von der Umsetzungstreue von
Architekturvorgaben.</p>
<p>Eine meiner Meinung nach wichtige, jedoch unerwähnte Auswirkung ist die Bewältigung 
von fachlicher Komplexität sowie der daraus sich ergebenden verbesserten Wartbarkeit. </p>
<p>Bekannte und konventionalisierte Architekturmuster helfen, sich in komplexeren Interaktionen 
und Konstruktionen schnell wiederzufinden und zu orientieren.</p>
<h4 id="2-impact-of-unit-test-coverage">2. Impact Of Unit Test Coverage</h4>
<blockquote>
<p>Eine höhere Testabdeckung des produktiven Quellcodes gewährleistet Erweiterbarkeit und Testbarkeit des Systems.</p>
</blockquote>
<p><em>Zu 2)</em> Die Metrik der Testabdeckung stellt streng genommen wohl kaum eine Auswirkung auf
Erweiterbarkeit dar. Auch Testbarkeit kann nur in geringem Maße ein direkter Wirkungsmechanismus
von Testabdeckung sein. </p>
<p>Oft können mit wenigen Integrationstests viele Codebereiche abgedeckt
werden, die keiner effektiven Erweiterbarkeits- oder Testbarkeitsbetrachtung genügen würden.</p>
<p>Im Sinne der nicht-fachlichen Qualitätsmerkmale ist meiner Meinung nach eine Testabdeckungs-Metrik ein äußerst schwacher Wirkhebel für Testbarkeit, Sicherheit und Stabilität.</p>
<h4 id="3-impact-of-compiler-warnings">3. Impact Of Compiler Warnings</h4>
<blockquote>
<p>Durch eine konsequente Vermeidung von Compiler-Warnungen wird eine deutliche Senkung der allgemeinen Fehlerrate gewährleistet.</p>
</blockquote>
<p><em>Zu 3)</em> Unter der Berücksichtigung der vorgegebenen Einstellung <em>"Treat Warnings as Errors"</em> in C#-Projekten
kann ich die Wirksamkeit auf verminderte Fehlerrate kaum einschätzen. </p>
<p>Da sie allerdings nur in besonderen Konstellationen (wie dem bekannten <code>[Obsolete]</code>-Warning) als hinderlich betrachtet werden kann, ist aus meiner Sicht eine besondere Beachtung der "Compiler Warnings" zumindest nicht
von Schaden.</p>
<p>Indirekt kann man sogar durch einen strikteren Umgang mit Compile- und Buildergebnissen die
Wachsamkeit und Wartungsverantwortung des Entwickler-Teams unterstützen. Insofern ließe sich zwar
eine verbesserte Wartbarkeit ableiten, die jedoch weder direkt noch mit entscheidender Wirkungskraft
einzustufen wäre.</p>
<h4 id="4-impact-of-duplicates">4. Impact Of Duplicates</h4>
<blockquote>
<p>Durch gezielte Vermeidung von Code-Duplikaten wird die allgemeine Fehlerrate gesenkt und die Wartbarkeit des Systems deutlich gesteigert.</p>
</blockquote>
<p><em>Zu 4)</em> Das Thema der Code-Duplikate ist im Entwicklungsumfeld sehr weit verbreitet und bekannt.
Der gemeine Konsens ist hier, nach einer Vermeidung von Duplikaten zu streben, zumal sich
dadurch Funktionalität dupliziert. Als Konsequenz steigt die Wartbarkeit, Stabilität und Sicherheit.</p>
<p>Ich kann im Allgemeinen eine Beobachtung der Code-Duplikate empfehlen. Die Metrik sollte in
Relation zum Gesamtvolumen betrachtet werden. </p>
<p>Darüber hinaus ist es besonders empfehlenswert, eine "Abstandsmessung" von Duplikaten vorzunehmen. Hieraus kann in vielen Fällen auch der tendenzielle Verminderungswiderstand erkannt werden.</p>
<h4 id="5-impact-of-file-size">5. Impact Of File Size</h4>
<blockquote>
<p>Durch die konsequente Begrenzung der Dateigröße einer Quelldatei kann die Komplexität des Systems begrenzt werden und die Wartbarkeit gesteigert werden.</p>
</blockquote>
<p><em>Zu 5)</em> Der direkte Bezug von Dateigröße zu fachlicher oder technischer Komplexität - wie sie
hier erwähnt wird - erschließt sich mir auf den ersten Blick nicht verständniswirksam.</p>
<p>Vielmehr ist mein Eindruck, dass die Dateigröße als Volumen-Merkmal von Organisationseinheiten
im Besonderen zur Wartbarkeit des Systems beitragen. Die Folge einer "überschaubaren"
Organisationseinheit ist sicherlich der erleichterte Umgang mit dieser.</p>
<p>Eine Verringerung der Komplexität dieser Einheit - also der Klasse - ist bei distanzierter
Betrachtung auch in vielen Fällen ersichtlich - jedoch nicht kausal auf einen restriktiven
Umgang mit Dateigröße zurückzuführen.</p>
<p>Dennoch können kürzere Dateilängen sich indirekt auf die Komplexität vorteilhaft auswirken,
zumal durch den "Organisationszwang" auch bedingt ein Aufbruch der Komplexität in einzelne
Teilprobleme gefördert wird. </p>
<p>Insofern kann ich die Dateilänge als Qualitätsmerkmal schon nachvollziehen. Bezüglich der Aussagekraft der Metrik ist allerdings meiner Meinung nach Vorsicht und Augenmaß geboten.</p>
<h4 id="6-impact-of-length-of-method">6. Impact Of Length Of Method</h4>
<blockquote>
<p>Eine strikte Begrenzung der Methodenlänge wirkt sich komplexitätsmindernd und damit qualitätssteigernd aus. </p>
</blockquote>
<p><em>Zu 6)</em> Die Länge einer Methode hat aus meiner Sicht eher einen indirekten - ja sogar schwachen - Bezug
zur Komplexität. Im Allgemeinen sind "längere" bzw. "ausführlichere" Methoden weniger
Komplex, sofern sie sich um eine Verantwortlichkeit kümmern. </p>
<p>Es ist schlußfolgernd eher das Single Responsibility Principle und die Separation of Concerns für die Minderung von
Komplexität im Methodenbereich hilfreich.</p>
<p>Einen direkten Bezug bei der Methodenlänge sehe ich persönlich in der Wartbarkeit.
Durch knappe und aussagekräftige Methoden lassen sich Aktivitäten schnell in fachliche
Einzelkomponenten einteilen. Das wiederum fördert das Verständnis gegenüber der Fachlichkeit.</p>
<p>Eine Beobachtung der Methodenlänge als Qualitätsmerkmal ist sicher sinnvoll, wenn auch nicht
so stark in der Aussagekraft wie z.B. die Verschachtelungstiefe.</p>
<h4 id="7-impact-of-nesting-depth">7. Impact Of Nesting Depth</h4>
<blockquote>
<p>Durch konsequente Eingrenzung der erlaubten Verschachtelungstiefe (Nesting Depth) wird eine deutliche Komplexitätsminderung erreicht.</p>
</blockquote>
<p><em>Zu 7)</em> Die Verschachtelungstiefe ist in meinen Augen ein starker Indikator für Komplexität struktureller, imperativer Programme.</p>
<p>Die sog. "Branches" und "Loops" sind essentielle Programmsteuerungs- und -verarbeitungselemente,
die ein Indiz fuer gesteigerte Komplexität des gesamten Aktivitätsablaufes darstellen.</p>
<p>Je eher und treffender es dem Programmierer gelingt, fachlich aussagekräftige Abstraktionen
anzuwenden, um so geringer fällt im Allgemeinen auch die Verschachtelungstiefe innerhalb
einzelner Aktivitäten aus.</p>
<p>Die Metrik ist für mein Dafürhalten ein starker und relativ zuverlässiger Indikator für
fachliche und methodische Komplexität.</p>
<h3 id="code-review">Code Review</h3>
<blockquote>
<p>Jede Code-Erstellung oder -Änderung soll durch ein Code-Review von einem weiteren Entwickler beurteilt und für gut befunden werden.</p>
</blockquote>
<p>Dieser letzte Punkt der Strategie-Eckpfeiler ist aus meiner Perspektive eines der effektivsten
Qualitätssicherungsmaßnahmen. Mit Sicherheit sind auch die o.g. KPI-Metriken
für eine Qualitätsaussage relevant. </p>
<p>Jedoch ist in vielen Fällen eine individuelle und eingehende Betrachtung der Quellen für die allgemeine Qualitätsverantwortung deutlich förderlicher.</p>
<p>Alleine durch die Aktivität des "Reviews" wird so meiner Meinung nach der
Qualitätsanspruch als allgegenwärtige Zielsetzung in die Teamkultur integriert.</p>
<p>Dadurch wird das gemeinsame Qualitätsbild (und die daraus abzuleitenden Ziele)
geschärft. Ein weiterer positiver Effekt ist die implizite Verantwortungsverteilung
zu Code-Quellen. Sowohl der Verfasser als auch der Rezensent tragen Verantwortung
für die Qualität und Konventionstreue des Codes.</p>
<p>Ein etwas schwächerer, aber dennoch zuweilen merkbarer Effekt ist in diesem Zuge
auch der fachliche und technische Wissenstransfer, der mit der Rezension des Codes
einhergeht.</p>
<p>In Summe ist meiner Meinung nach die Etablierung von Code Reviews ein sehr nützliches
Mittel für den Erhalt von Qualitätsstandards.</p>
<h3 id="epilog">Epilog</h3>
<p>So. Hoch lebe die "Messbarkeit" von Code-Qualität. Wer es in diesem Blog-Artikel bis hierher geschafft hat, hat es auch verdient, eine kleine grundlegende Abschlußbemerkung zu lesen. Ich erlaube mir ein wenig "aus dem Nähkästchen" zu plaudern.</p>
<p>Es ist meiner Meinung nach besonders wichtig zu erkennen, dass die Code-Qualität nicht beim Code, sondern bei den Entwicklern des Codes beginnt. Gerade deswegen ist es bei einer Strategie zur Erhebung eines Qualitätsniveaus wichtig, auch individuelle Betrachtung der Fähigkeiten und Prinzipien der Entwicklungsmannschaft mit einzubeziehen.</p>
<p>Die hier gezeigte Diskussion über automatisierte Code-Metriken können allemals als Hilfswerkzeug oder Indiz für eine Qualitätsaussage dienen. Einem Anspruch der effektiven Qualitätsmessung werden automatisierte Code-Metriken mit Sicherheit ungenügend gerecht.</p>
<p><strong>If you care about quality, care about your people.</strong></p></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Enjoyable Engineering</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/enjoyable-engineering.html"/>
            <updated>2011-10-07T16:34:28Z</updated>
            <published>2011-10-07T16:34:28Z</published>
            <id>/enjoyable-engineering.html</id>
            
            <content type="html"><![CDATA[
                <p>One of the most annoying things in life is to do things without joy. For me at least. From time to time, when I'm chatting with project managers and developers I think that some of them have completely lost the feeling of joy while working. It's even worse: a few of them just reply that there's not many enjoyable things left in their daily work. Let this sink for a minute.</p>

<p>Granted, business life is neither a kindergarten nor a great party. However, that's not the point. Nobody wants to go for any extreme, me thinks. At the end of the day, it's the sustainable, solid productivity of yours what really counts for both you and your company. Hence, joy is a fundamental, yet far undervalued aspect of our daily work.</p>

<p>I want to share with you two little examples how you as a software engineer can improve your daily work by bringing back a little bit of joy to your desk.</p>

<h3 id="arabesque-coding">Arabesque Coding</h3>

<p>The first technique is what I call <strong>arabesque coding</strong>. "Arabesque" is an oriental artful painting style which uses ornaments to beautify the main theme of the painting. Consequently, arabesque coding is the activity of styling, formatting, documenting or in some other form enhancing the code you are currently working on.</p>

<p>It's important to notice at this point that arabesque coding mode is not intended to be applied all the time or on all your working items. The real beauty and joy of arabesque code is that it's embedded in an environment - a frame - of "normal, everyday" code. It's like a little gimmick in your code-base.</p>

<p>Performing arabesque coding is fun and can add some joy to tasks you normally do by routine. Interestingly, arabesque coding fits quite well on even more complex coding or design scenarios because it stimulates your creativity. I prefer arabesque coding in pair programming sessions but equally do it on my own as well. Most often I start to pick a little theme I'm interested in.</p>

<p>Here's a little example of arabesque coding. A few months ago @lennybacon came over to Munich to visit me. We had quite a lot of things we wanted to achieve within just a weekend. Discussing architecture, designing solutions and of course coding them into what makes all this effort worth: executable software solving the domain problem.</p>

<p>One of our tasks was to develop a prototypical tagging solution for communityblendr, a project @lennybacon is very enthusiastic in. The "tagger" should be able to tag "any" object with keywords. So we did a quick design session (using <em>just</em> code) and went over to implement it after verifying that our approach is doable. </p>

<p>It was a sunny afternoon and we just returned back from a short lunch. At lunch, we were talking about the "bavarian" style of living. While we were coding some tests for tagger, we decided to switch the syntax of our testing class to "boarisch" (which means bavarian, by the way). </p>

<p>Holy cow, that was fun! We laughed and joked all the way while we were developing the <a href="https://bitbucket.org/ilkerde/devtagger/src/ad3b9ace2c93/Tagger/TagTargetReferenceTests.cs">tagging library</a>. </p>

<p><img alt="" src="/media/images/BavarianJunidProbiererZeigs_m.png" /></p>

<p>The morale here is not to make fun of engineering, but keep engineering enjoyable. Apart of the fact that every piece of software which actually solves a problem is enjoyable to us passionate developers, we can bring joy on the path towards the solution as well.</p>

<h3 id="easter-egg">Easter Egg</h3>

<p>Another recreational, enjoyable and very productive recipe is to build an <strong>easter egg</strong> into software. I'm quite sure that (almost) every developer knows what an easter egg is and might have seen an easter egg as well. The more I'm quite surprised how rarely easter eggs are being developed in our professional life.</p>

<p>Let me get one thing very straight: I'm not talking about spending valuable time and money to create useless, yet funny but hidden functionality. I'm talking about easter eggs. Easter eggs are little programs inside programs - at least in enterprise / consumer software. Very few developers actually know that the primary intent of an easter egg is to make development a little more enjoyable.</p>

<p>I frequently write easter eggs. I'm not writing them with every project I'm working on, yet I'm quite used to write them, to be honest. My easter eggs range from "very tiny" things up to "considerable work": ascii art banner, puzzle, calculator, wheel of fortune, clock and "weird translations".</p>

<p>Interestingly, I often find people having a very wrong sense of what easter eggs are. Mostly, they're undervalued as "just for fun" or plain "waste of time". That's simply wrong. Writing an easter egg is a recreational and relaxing task for developers. Just to recharge batteries. To shortly swift away from the big project to a very small and easy task. </p>

<p>Especially senior developers recognize the great power of easter eggs. Easter eggs help developers to gain a little distance from the daily challenges. Not as a door to escape from trouble or stress, but rather as a tool in order to refocus for the big project and big challenges. It's like having a break and a little walk in the park. Hence, it's not very important to have an easter egg done or published. The important thing with easter eggs is that you just have an easter egg to chew on.</p>

<p>That's why I certainly won't tell you in what (partly even publicly available) software you can find my easter eggs :-). Nonetheless, I want to conclude my post with a little "real life example".</p>

<p>Not very long ago, I worked on a web project with heavy javascript usage. We had to implement quite complex UI logic in order to create a compelling user experience. While I was coding the javascript bits with another (senior) engineer, we fiddled around with Firebug and did some JS-debugging.</p>

<p>At that time, we both were talking about the "good ol' times" where we both used to hang around on Quake Servers and performing some DMs in Q3DM17 and Q3DM6 maps. It was funny to see that we both had the "same habits": Using rocket launcher for the tricky moves and the famous rail for precise frags. We literally heard the dark dry-witted comments in out heads again: "Excellent!".</p>

<p>An easter egg was born. We decided to write a little "shell" into our javascript UI code which actually looks like the famous Q3 shell. Alongside, we agreed to enrich our logging with some bold comments by Hunter, Major and co. You can have a look at the <a href="https://gist.github.com/2057075">very first code bits of "q3sh"</a> (Quake 3 Shell), which we later got completed and integrated into the project (and never took out up until today).</p>

<p>We had a great time working together on the shell. Mostly, we worked on the shell at evening hours to cool down after a day working on heavy issues or features. The shell literally was a little "hideout" for both of us to relax and "reboot our minds". Apart of that, it helped us equally good on improving our "production" javascript codebase.</p>

<h3 id="enjoy-engineering">Enjoy Engineering</h3>

<p>I love to develop software. I love to design it, I love to code it, I love to document it. I even love to use it. However, as a professional, I'm developing software all the time. Whether it is planning, estimating, designing, testing, coding, documenting, administering or using it. A professional job is not always love, peace and harmony. There's tough times as well. That's very normal, by the way.</p>

<p>As a professional developer, you need to face this fact. It's up to you to keep your job enjoyable. It's your responsibility to take care of this. The good news is: yes, you actually can take care of it. I'm not saying that you can mitigate every sort of evilness which might come along your professional life. I'm just saying that you can contribute to experience <strong>enjoyable engineering</strong>.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Specific VIM Settings Per Project</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/specific-vim-settings-per-project.html"/>
            <updated>2011-07-21T12:15:18Z</updated>
            <published>2011-07-21T12:15:18Z</published>
            <id>/specific-vim-settings-per-project.html</id>
            
            <content type="html"><![CDATA[
                <p>From time to time, I contribute to several different projects and work with diverse teams. Naturally, every project and every team is different. This applies to code formatting as well - such as braces, tabs and tabstops. It can be a little clumsy to switch different coding styles, especially when working on several projects simultaneously. <a href="http://www.vim.org/">VIM</a> can help you, anyway.</p>

<h3 id="override-vim-settings-per-folder">Override VIM Settings Per Folder</h3>

<p>One nice little feature of good old VI is to allow configuration per folder. Everything you need to do is just place <code>.exrc</code> file in the current folder and kick off VI. This feature still exists with VIM, but is disabled by default. To enable it, just <a href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27exrc%27"><code>set exrc</code></a> and VIM will respect custom configurations in current directory as well. VIM recognizes <code>.vimrc</code> files as well, so you're good to go with <code>.vimrc</code> as configuration file name.</p>

<p><strong>Attention</strong>: Enabling <code>exrc</code> is dangerous. It is disabled by default for good reason. Since you can do pretty much everything within a VIM configuration file - including shell execution - it's <em>highly recommended</em> to use the <code>exrc</code> option only in pair with a second option which disables shell execution and write operations, called <code>secure</code>. Always append <a href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27secure%27"><code>set secure</code></a> when <code>exrc</code> option is enabled!</p>

<p>Put simply, just append the following lines at the end of your <code>~/.vimrc</code>:</p>

<div class="codehilite"><pre><span class="go">set exrc</span>
<span class="go">set secure</span>
</pre></div>

<p>and you're good to go. Now VIM will recognize and apply your custom project/folder settings. Enjoy.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Enabling Apache UserDir On Fedora 15</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/enabling-apache-userdir-on-fedora-15.html"/>
            <updated>2011-07-18T22:51:23Z</updated>
            <published>2011-07-18T22:51:23Z</published>
            <id>/enabling-apache-userdir-on-fedora-15.html</id>
            
            <content type="html"><![CDATA[
                <p>This is just a quick minidump for myself, but may be interesting for other Linux or Fedora newbies as well. Today I wanted to enable the <a href="http://httpd.apache.org/docs/2.0/mod/mod_userdir.html">UserDir</a> feature of my local web server for a quick demo of a small webapp. I already knew the UserDir feature and hence was thinking that it's just a 5 minute "quick sudo" task. Poor me it wasn't the case.</p>

<h3 id="userdirs-the-fedora-way">UserDirs The Fedora Way</h3>

<p>First of all, on Fedora 15, you don't edit <code>/etc/httpd/conf/httpd.conf</code>, although you could go for it. Instead, you extend your initial (base) configuration with little configuration snippets located in <code>/etc/httpd/conf.d/</code>. To follow this convention, a simple <code>userdir.conf</code> file in previously mentioned directory should be created with the following content:</p>

<div class="codehilite"><pre><span class="nt">&lt;IfModule</span> <span class="err">mod_userdir.c</span><span class="nt">&gt;</span>
    UserDir enabled [user]
    UserDir public_html
<span class="nt">&lt;/IfModule&gt;</span>

<span class="nt">&lt;Directory</span> <span class="err">/home/*/public_html</span><span class="nt">&gt;</span>
    Options Indexes Includes FollowSymLinks

    AllowOverride All
    Allow from all

    Order deny,allow
<span class="nt">&lt;/Directory&gt;</span>
</pre></div>

<p>Note that in above file <code>[user]</code> is a placeholder for the actual user (you might as well extend/change this for your purposes as well). Assuming that <code>/home/[user]/public_html/</code> exists, one might think that a quick <code>sudo service httpd restart</code> should do it then. No it won't. Navigating to the userdir URI just responds with a cold 403 permission denial. </p>

<p>"Alright", me thinks. It's time to pay attention to <a href="http://en.wikipedia.org/wiki/Security-Enhanced_Linux">SELinux</a>.</p>

<h3 id="tweaking-selinux-settings">Tweaking SELinux Settings</h3>

<p>The security configuration of SELinux on Fedora 15 is enabled by default (set to Enforcing). You might go for the easy way and disable SELinux completely. However, instead of breaking a fly on a wheel, I decided to go for the needle-haystack game and adjust SELinux settings.</p>

<p>First of all, ensure that the directories have proper permissions:</p>

<div class="codehilite"><pre><span class="c1">## home directory ##</span>
<span class="n">sudo</span> <span class="nb">chmod</span> <span class="mi">711</span> <span class="sr">/home/</span><span class="p">[</span><span class="n">user</span><span class="p">]</span>

<span class="c1">## public_html directory ##</span>
<span class="n">sudo</span> <span class="nb">chown</span> <span class="p">[</span><span class="n">user</span><span class="p">]:[</span><span class="n">user</span><span class="p">]</span> <span class="sr">/home/</span><span class="p">[</span><span class="n">user</span><span class="p">]</span><span class="o">/</span><span class="n">public_html</span>
<span class="n">sudo</span> <span class="nb">chmod</span> <span class="mi">755</span> <span class="sr">/home/</span><span class="p">[</span><span class="n">user</span><span class="p">]</span><span class="o">/</span><span class="n">public_html</span>
</pre></div>

<p>Then, tweak SELinux settings for user directories and user content:</p>

<div class="codehilite"><pre><span class="n">sudo</span> <span class="n">setsebool</span> <span class="o">-</span><span class="n">P</span> <span class="n">httpd_enable_homedirs</span> <span class="n">true</span>
<span class="n">sudo</span> <span class="n">setsebool</span> <span class="o">-</span><span class="n">P</span> <span class="n">httpd_read_user_content</span> <span class="mi">1</span>
</pre></div>

<p>Finally restart httpd. Voilà, c'est ça!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Cleanup: Code Retreat</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/cleanup-code-retreat.html"/>
            <updated>2011-07-04T08:19:59Z</updated>
            <published>2011-07-04T08:19:59Z</published>
            <id>/cleanup-code-retreat.html</id>
            
            <content type="html"><![CDATA[
                <p>In meinem letzten Beitrag über das <a href="uber-das-ziel-von-coding-dojos-iii.html">Ziel von Coding Dojos</a> habe ich angedeutet, dass ich kein sogennantes <a href="http://coderetreat.com/">Code Retreat</a> organisieren werde, obwohl ich es knapp einen Monat zuvor schon angekündigt hatte. Dafür gibt es eine Reihe von Gründen. Darunter ist aber ein ganz besonderer Grund, den ich hier darlegen möchte. Doch zunächst zur Idee des Code Retreat.</p>

<p>Ein Code Retreat scheint eine <a href="http://shishkin.wordpress.com/2011/06/19/code-retreat-dsseldorf/">super Sache</a> zu sein. Ich würde wirklich sehr gerne an einem Code Retreat teilnehmen, da sich bis jetzt noch nicht die Gelegenheit ergeben hat und ich die Idee des tagesumfänglichen "Retreats" sehr spannend finde. Der Wille ging bei mir sogar soweit, dass ich bereit wäre, den organisatorischen Aufwand auf mich zu nehmen. Aber gerade in den letzten Monaten hat sich dieses Blatt bei mir gewendet.</p>

<p>Dabei habe ich nach wie vor große Lust, ein Code Retreat einmal umzusetzen. Es liegt auch nicht daran, dass ich keine organisatorischen Mittel an der Hand gehabt habe oder ähnliches. Nein, es ist etwas auf den ersten Blick viel profaneres: die Übersättigung.</p>

<p>Ich bin in der letzten Zeit auf einigen Veranstanstaltungen und Events gewesen, größtenteils auf Barcamps oder anderen, community-getriebenen Events. Das ist super, denn eine so große und reichliche Auswahl an gutem (und günstigen) Content gab es meiner Meinung nach noch nie.</p>

<p>Aber ich fühle mich trotzdem übersättigt. Übersättigt von der Anzahl als auch von der Auswahl der Veranstaltungen und Möglichkeiten. Vor Allem in der .NET Community tut sich einiges. Da weiss man durch die Fülle des Angebots schon garnicht mehr, wo man jetzt wann hingehen soll. Gerade dieses Gefühl bringt mich dazu, nun wesentlich selektiver Vorzugehen, wenn es um meinen eigenen Beitrag zur Community geht. Ich bin der Meinung, dass man immer zunächst in seinem eigenen Zimmer aufräumen sollte, um sich dann ein sauberes Haus wünschen zu dürfen. </p>

<p>Den Anfang mache ich für mich selbst durch den Verzicht auf die Organisation eines Code Retreat hier in München.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Über das Ziel von Coding Dojos III</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/uber-das-ziel-von-coding-dojos-iii.html"/>
            <updated>2011-06-22T17:17:21Z</updated>
            <published>2011-06-22T17:17:21Z</published>
            <id>/uber-das-ziel-von-coding-dojos-iii.html</id>
            
            <content type="html"><![CDATA[
                <p>Die Interpretationskraft des Menschen ist mächtig. Bei manchen mehr, bei manchen weniger. Es scheint jedoch, dass es bei "willensbasierten Systemen" wesentlich mehr Interpretationsmotivation gibt. Coding Dojo's sind ein gutes Beispiel dafür.</p>

<h3 id="vorwort">Vorwort</h3>

<p>Ich habe nachgedacht und gezögert, bevor ich jetzt nun wieder einmal über Coding Dojo's schreibe. Für den interessierten Leser sei nochmals kurz auf die Referenzen zu <a href="uber-das-ziel-von-coding-dojos.html">Teil I</a> und <a href="uber-das-ziel-von-coding-dojos-ii.html">Teil II</a> meiner eigenen Meinungsbildung zu Coding Dojo's verwiesen. Nun mag man sich fragen, "muss es ein Teil III geben"? Aber für mich ist es ein wichtiges Thema, über das ich lange gegrübelt habe. Die bisherigen Erkenntnisse daraus halte ich hier einmal fest.</p>

<h3 id="metapher-coding-dojo">Metapher Coding Dojo</h3>

<p>Der ausschlaggebende Grund für meine Gedanken über die Art, Form und Interpretation von Coding Dojo's ist zweifelsohne die Metapher "Dojo". Das <a href="http://de.wikipedia.org/wiki/D%C5%8Dj%C5%8D">Dojo</a>, der Übungsraum, die <a href="http://de.wikipedia.org/wiki/Kata_(Karate)">Kata</a>, die Übung. Ist doch alles einleuchtend, oder?</p>

<p><em>Nein!</em> Alles Lüge! Das Coding Dojo ist ein <em>Coding Dojo</em>, die Code Kata eine <em>Code Kata</em>. Wenn das Coding Dojo nicht Coding Dojo heissen würde, sondern Coding Disco und die Code Kata nicht Code Kata, sondern Code Foxtrott, was wäre dann eine "Coding Disco"? Wären wir, die Coding Dojo-Gänger und Code Kata-Praktizierer dann alle verrückte Discotänzer?</p>

<p>Für mich steht fest: Das Coding Dojo wie auch die Code Kata haben eine Identität. Es existiert aus einer Intention, aus einer motivierenden Kraft heraus. Die "Metapher" des "Dojo" soll diese Identität unterstreichen und idealerweise auch stärken. Manchmal habe ich das Gefühl, dass die Metapher zum Dojo und Kata ein treffender Vergleich ist. Manchmal ist es aber auch anders. Schade, wie ich finde.</p>

<h3 id="coding-dojos-ohne-tdd">Coding Dojo's ohne TDD ?!?</h3>

<p>So passiert es ab und an, dass Coding Dojo's mit "Variationen" umgesetzt werden. Letztes Jahr gab es z.B. Coding Dojo's ohne Coding, es wurden Coding Dojo's ohne TDD abgehalten, Coding Dojo's mit Präsentationsfolien umgesetzt, "Architektur Dojo's" vorgeschlagen. Sogar Coding Dojo Meisterschaften waren einmal im Gespräch. Dieser Einfallsreichtum ist bemerkenswert.</p>

<p>Ich finde das toll. Diversität ist etwas schönes. Doch ich frage mich dabei schon des öfteren, was eine solche Veranstaltung mit einem Coding Dojo zu tun hat. In meinen Augen hat ein Coding Dojo nämlich schon eine gefestigte Identität. Da bedarf es meiner Meinung nach keiner weiteren "Übungsraum-Metapher-Interpretation" oder einer "Weiterentwicklung des Trainingsgedankens".</p>

<h3 id="coding-dojo-community">Coding Dojo Community</h3>

<p>Darüber hinaus finde ich es besonders gut, dass sich in letzter Zeit die Community intensiver mit Coding Dojo's auseinandersetzt. Die Coding Dojo's im Raum Düsseldorf werden immer regelmäßiger, in Karlsruhe gibt es endlich auch eine feste Coding Dojo Truppe und viele Unternehmen veranstalten (mehr oder minder regelmäßig) interne Coding Dojo's. Obgleich wir in München schon seit langer Zeit ein etabliertes Coding Dojo haben, sind sogar bei uns neue Community-Projekte wie ein <a href="http://improuv.com/de/blog/java-coding-dojo-m-nchen">Java Coding Dojo</a> am Start.</p>

<p>Aber auch Coding Dojo's sind vor problematischen Herausforderungen nicht gefeit. So kommt es durchaus vor, dass Entwickler ein Coding Dojo eher als "Spassveranstaltung" betrachten, anstatt es als lockeres Mittel zum Training und Erfahrungsaustausch zu sehen. Dieser Effekt ist vor Allem bei Konferenzen gut zu beobachten.</p>

<p>Darüber hinaus gibt es natürlich auch diejenigen Dojo-Veranstaltungen, die die Popularität eines "Coding-Dojo" nicht <em>ausschliesslich</em> für die Sache, sondern auch für andere Dinge nutzen möchten. Da ist dann von Zeitschriften-Abo's über Freelancer-Anfragen bis hin zu Recruiting-Maßnahmen alles dabei. Das ist ja auch alles schön und gut, so lange es nicht den eigentlichen Sinn des Coding-Dojo's überdeckt und ein gezügeltes Mass an "Sponsoring" nicht überschreitet. Schließlich ist so eine Veranstaltung auch mit einigem an Aufwand (Zeit, Vorbereitung, Räume usw. usf.) verbunden.</p>

<h3 id="community-consumity-commercity">Community, Consumity, Commercity</h3>

<p>Ich weiss, das man mich mit den vorherigen Sätzen auch missverstehen kann, wenn man mich missverstehen will. Aber es ist nunmal wie bei jeder Community-Veranstaltung: das Gleichgewicht zwischen <em>Community</em>, <em>Consumity</em> und <em>Commercity</em> sollte gewahrt werden. Zur Erläuterung der o.g. Begriffe in diesem Kontext:</p>

<ul>
<li>Community = freiwilliges, ehrenamtliches Engagement</li>
<li>Consumity = passiver, begleitender Konsum</li>
<li>Commercity = aktiver, profitorientierter Beitrag</li>
</ul>

<p>Wie schon erwähnt, ist diese "Balance" ein allgemeines Problem und nicht spezifisch für Coding Dojo's. Dennoch: auch allgemeine Schwierigkeiten können Schwierigkeiten bei Coding Dojo's sein.</p>

<h3 id="eigenkritik">Eigenkritik</h3>

<p>Nun ist es ja so, dass ich selbst an der Entstehung und Bildung der Coding Dojo Community einen kleinen Beitrag geleistet habe. Gerade deswegen kann und will ich mich selbst nicht von der Kritik befreien. Ich habe mit Sicherheit immer nur gutes gemeint, aber eben nicht immer alles gut umgesetzt.</p>

<p>Ich denke, dass da viele Faktoren eine Rolle spielen. Dennoch kann man schon ein paar Kritikpunkte finden. Ein schwieriges Thema ist sicherlich die "Abendveranstaltung Coding Dojo" und die viel zu sehr vernachlässigte Arbeit zu den Hintergründen und Motivationen des Coding Dojo. </p>

<p>Ein weiterer Kritikpunkt kann auch mir persönlich angeheftet werden: Durch meine Art des "Entertaining Engineers" und meiner immer wiederkehrenden Hervorhebung des "lockeren Erfahrungsaustausches" haben viele den Eindruck gewonnen, dass ein Coding Dojo viel mehr mit Entertainment zu tun hat als mit Training. Das ist natürlich komplett falsch.</p>

<h3 id="coding-dojo-werte-ziele">Coding Dojo Werte &amp; Ziele</h3>

<p>Ich glaube, dass die subjektiven, persönlichen Ziele des Einzelnen beim Coding Dojo für die Gemeinschaft auf einen Nenner gebracht werden: <em>Lerne &amp; Lehre</em>. Ich wollte seit dem <a href="lerne-lehre-ilker-net-coding-dojo-latifa-stil.html">problematischen Coding Dojo bei den dotnetpro.powerdays</a> diesen Begriff des "Lernen &amp; Lehrens" nicht mehr anwenden, aber es trifft es immer noch ziemlich gut.</p>

<p>Ein Coding Dojo hat zum Ziel, die gemeinschaftliche, respektvolle und praxisorientierte Auseindandersetzung mit modernen Design- &amp; Programmiertechniken wie TDD, Domain-Driven-Design, Pair Programming, Design Patterns und Refactoring durch lockeren Erfahrungsaustausch zu ermöglichen.</p>

<p>Das ist genau das Gegenteil zu dem für mich traurigen Feedback, was ich in den letzten Wochen oft bekommen habe. Ich habe von Neulingen und auch erfahreneren Dojo-Gängern in letzter Zeit immer wieder gehört, dass ein Coding Dojo doch nur ein "nettes Rahmenprogramm" sei oder aber eine etwas bessere "Recruiting-Veranstaltung". Das ist <em>nicht</em> richtig.</p>

<h3 id="coding-dojo-resources">Coding Dojo Resources</h3>

<p>Ich habe schon vor einiger Zeit zu dem Coding Dojo ein paar <a href="dotnet-coding-dojo-basics.html">Grundlagen</a> und <a href="dotnet-coding-dojo-ethics.html">Werte</a> zusammengefasst. Es gibt aber im Netz noch viele weitere informative und hilfreiche Quellen zum Coding Dojo:</p>

<ul>
<li><a href="http://web.cs.wpi.edu/~gpollice/Dojo.html">Coding Dojo General Information</a> (english):<br />
   Generelle Informationen zum Coding Dojo, mit Werten und Grundregeln.</li>
<li><a href="http://www.mikebild.com/training">Beschreibung vom Coding Dojo Berlin</a>:<br />
   Eine gute und motivierende Beschreibung des Coding Dojo's</li>
<li><a href="http://www.cs.helsinki.fi/u/luontola/tdd-2009/kalvot/08-Coding-Dojo-1.pdf">Single Slide Coding Dojo Description</a> (english):<br />
   Die Fakten eines Coding Dojo auf einem Slide (mit 2 Slides Code-Kata "Data Mungler" Beschreibung)</li>
<li><a href="http://orlandodojo.org/what-is-coding-dojo/">What is Coding Dojo?</a>: 
   Eine kurze Beschreibung der Dojo Grundregeln vom Orlando-Dojo</li>
<li><a href="http://www.slideshare.net/jcfischer/ruby-coding-dojo">Ruby Coding Dojo</a>:<br />
   Eine Präsentation über Coding Dojo's von der Ruby Community (DACH), inkl. dem 100-Doors-Problem als Kata</li>
<li><a href="http://www.gilzilberfeld.com/2011/02/magical-experience-at-munich-coding.html">Coding Dojo Experience</a> (english):<br />
   Ein Bericht über die Lerneffekte des Coding Dojo von Gil Zilberfeld</li>
<li><a href="http://emilybache.blogspot.com/2010/09/coding-dojo-survey-results.html">Coding Dojo Survey Results</a> (english):<br />
   Ein sehr informativer Artikel über die Lernziele und Lernergebnisse im Coding Dojo vom Emily Bache</li>
<li><a href="http://www.dtsato.com/blog/wp-content/uploads/2008/06/sato-codingdojo.pdf">Coding Dojo Learning Environment</a> (english):<br />
   Ein Artikel über die Lernumgebung und -Methoden im Coding Dojo von Danilo Sato</li>
</ul>

<p>Es gibt im Netz natürlich noch viele weitere Quellen, aber die obige Liste ist meines Erachtens für den Interessierten ein guter Anfang.</p>

<h3 id="konsequenzen-konsequenzen">Konsequenzen? Konsequenzen.</h3>

<p>Aus den oben genannten Überlegungen heraus ergeben sich für mich ein paar persönliche Schlußfolgerungen. So gibt es in der letzten Zeit immer mehr Aktivität von der Community, eigene Coding Dojo's zu machen. Als Beispiele seien hier nur das <a href="https://www.xing.com/events/4-karlsruher-coding-dojo-766754">Coding Dojo in Karlsruhe</a> und das <a href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2011/06/15/neues-von-der-see-party-2011.aspx">Coding Dojo auf der Seesharp-Party</a> genannt.</p>

<p>Diese Dynamik in der Community ist super und ich kann jeden unterstützen und aufmuntern, selbst ein Coding Dojo zu organisieren oder zu veranstalten. Egal ob in der Firma, in der lokalen Community, oder aber auf einer Veranstaltung. Wenn es eine offene, aufrichtige und ernstgemeinte Auseinandersetzung mit dem <em>Coding Dojo</em> ist, dann ist es gleichermaßen unterhaltsam und wertvoll.</p>

<p>Wenn jedoch dabei das Gleichgewicht von Community, Consumity und Commercity wankt, oder aber das "Dojo" zur HR-Kontaktbörse wird, oder ein Dojo zu einem "Party-Programmpunkt" mutiert, dann finde ich persönlich das nicht besonders wertvoll, sondern eher schade.</p>

<p>Ich glaube weiterhin, dass ich als Person ein Faktor für die Missinterpretation des Coding Dojo's bin. Obgleich bin der Meinung bin, dass fast alle meine Coding Dojo's auf Veranstaltungen gute Coding Dojo's waren, werde ich in der nächsten Zeit keine Coding Dojo's mehr als Operator auf Konferenzen leiten.</p>

<p>Darüber hinaus möchte ich alle Coding Dojo-Gänger - ganz besonders aber die Münchener Dojo-Community - nochmals aufmuntern, weiter das .NET Coding Dojo zu besuchen. Wir in München - besonders <a href="http://www.petabyte.de/">Pete</a>, <a href="http://fuip.de/">Fuip</a> und <a href="http://twitter.com/cdeger">Christian</a> - investieren viel Zeit, Aufwand und Stress, um ein gutes Coding Dojo zu veranstalten. </p>

<p>Wenn einem dabei manche Recruiting-Hinweise vom Veranstalter missfallen, dann kann er ja kurz weghören. In keinem Fall sollten "We are hiring"-Rufe dazu verleiten, das Coding Dojo nicht mehr zu besuchen. Pete, Fuip und Christian machen Dojo's des Lernen &amp; Lehrens willen, da könnt ihr euch sicher sein. Und: Ich werde natürlich weiter mit Pete und den anderen das Ziel des Lernens &amp; Lehrens mit dem Coding Dojo verfolgen und stärken.</p>

<p>Abschließend möchte ich noch einen kleinen Hinweis gepaart mit einem Ausblick geben. Wer <a href="http://twitter.com/ilkerde">mir auf Twitter folgt</a>, der wird eventuell schon mitbekommen haben, dass ich gerne einmal ein Code-Retreat mitmachen würde. Ich mag die Idee des Code-Retreats und habe auch schon mal getweetet, dass ich gerne bereit wäre, ein <a href="http://twitter.com/#!/ilkerde/status/68588551838773248">Code-Retreat zu organisieren</a>. Ich habe mich dazu entschlossen, diese Idee nicht weiter zu verfolgen. Ich werde kein Code-Retreat organisieren. Die Gründe werde ich eventuell in einem separaten Blog-Post darlegen.</p>

<p>Statt dessen möchte ich andere Dinge gerne ausprobieren. Wer offen, aufrichtig und ernsthaft daran interessiert ist, der kann sich bei mir gerne via <a href="/imprint.html">Email</a> oder <a href="https://www.xing.com/profile/Ilker_Cetinkaya">Xing</a> melden.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Fedora 15 &#34;Lovelock&#34; on Sony Vaio S Series</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/fedora-15-lovelock-on-sony-vaio-s-series.html"/>
            <updated>2011-06-14T22:24:43Z</updated>
            <published>2011-06-14T22:24:43Z</published>
            <id>/fedora-15-lovelock-on-sony-vaio-s-series.html</id>
            
            <content type="html"><![CDATA[
                <p>This is a quick dump of my <em>Fedora</em> installation session.
Installing Fedora is easy. I won't cover everything in detail but quickly want to point out the essentials. First and foremost, look and see what Fedora is and can do at the official <a href="http://fedoraproject.org">Fedora website</a>. Linux and Fedora are great pieces of software. Maybe they're a good fit for you as well.</p>

<p>Second, if you're willing to give Fedora a spin (or even install it), then I'd strongly recommend you to create a <a href="http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo">Fedora Live-USB</a>. In my opinion it's so much easier to boot and install from USB compared to CD. Naturally, your system needs to support booting from USB.</p>

<h3 id="gain-sudo-powers">Gain Sudo Powers</h3>

<p>I'm a fan of <code>sudo</code>. I like it because it explicitly reminds me that I'm crossing the barrier from user to sysop, with all the implications it has. I've been using <code>sudo</code> since SuSE 4/5. Needless to say that obtaining sudo powers is the first thing I do on a fresh system.</p>

<p>In order to gain sudo powers, you simply need to add yourself to <code>wheel</code> group (as root, of course): <code>usermod -G wheel -a [user]</code>, whereas [user] is your user name. To immediately apply group membership just fire off <code>grpconv</code> and voilà. Remember: With great power comes great responsibility.</p>

<h3 id="disable-ipv6">Disable IPv6</h3>

<p><a href="http://en.wikipedia.org/wiki/IPv6">IPv6 is cool</a>. However, it's a sad fact that using IPv6 is often a pain. On some networks, it's just fine, on others it terrificly slows down NS lookups and connection speed. Causes range from dual stack issues up to poorly configured routers. In case of a "slow internet connection" you might consider to disable IPv6 support. In order to disable IPv6 on Fedora, perform a few easy steps:</p>

<ul>
<li>Add the ipv6 module to the list of blacklisted modules, so that it won't be loaded on system boot. Open the file <code>/etc/modprobe.d/blacklist.conf</code> and append the following line:<br />
<code>blacklist ipv6</code></li>
<li>Make sure the network settings exclude IPv6 support by adding the following line to <code>/etc/sysconfig/network</code>:<br />
<code>NETWORKING_IPV6=no</code></li>
<li>Disable the (now useless) IPv6 firewall by typing<br />
<code>sudo chkconfig ip6tables off</code></li>
<li>If you already have network connections established (either wired or wireless), you disable IPv6 network initialization for those as well. You might do this via Network Manager UI or just change the following line:<br />
<code>IPV6INIT=yes</code> to <code>IPV6INIT=no</code> in any of your desired connection configuration file, which typically follows the naming convention <code>ifcfg-[ConnectionName]</code> whereas [ConnectionName] is the name of your (wired or wireless) connection configuration. The connection configuration files are located in <code>/etc/sysconfig/network-scripts</code>.</li>
</ul>

<p>Reboot the machine (just enter <code>reboot</code>) and ensure that everything went fine by typing <code>lsmod | grep ipv6</code> which should just return nothing.</p>

<h3 id="stay-up-2-date">Stay Up-2-Date</h3>

<p>Once internet connection is fast and seamless, the next important thing is to update the system. There's too many reasons why updating the fresh F15 install is a good idea, so just do it.</p>

<p>With <code>yum</code> there's nothing easier than a system update. You can check and review all pending updates with <code>sudo yum check-update</code>. Naturally, installing updates is as easy as <code>sudo yum update</code>.</p>

<p>To finish the essential package housekeeping, adding the <a href="http://rpmfusion.org/">RPM Fusion</a> repositories is highly recommended. It'll make life much easier with some crucial installs, like enabling MP3 support.</p>

<p>Adding RPM Fusion package repositories is a one-liner:</p>

<div class="codehilite"><pre><span class="n">sudo</span> <span class="n">yum</span> <span class="n">localinstall</span> <span class="o">--</span><span class="n">nogpgcheck</span> <span class="n">http:</span><span class="sr">//</span><span class="n">download1</span><span class="o">.</span><span class="n">rpmfusion</span><span class="o">.</span><span class="n">org</span><span class="sr">/free/</span><span class="n">fedora</span><span class="sr">/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/</span><span class="n">nonfree</span><span class="sr">/fedora/</span><span class="n">rpmfusion</span><span class="o">-</span><span class="n">nonfree</span><span class="o">-</span><span class="n">release</span><span class="o">-</span><span class="n">stable</span><span class="o">.</span><span class="n">noarch</span><span class="o">.</span><span class="n">rpm</span>
</pre></div>

<p>For me at least, above three steps are the foundation for a stable and frictionless installation and user experience. Next, I'll cover a few Vaio specific topics. It's not very much to talk about, since out-of-the-box support for Vaio S-Series on Fedora 15 is very good. Nearby, my Vaio is a VPCS12V9E.</p>

<h3 id="gcc-ftw">GCC FTW</h3>

<p>What's at least equally important as an up-to-date system? It's <a href="http://gcc.gnu.org/">GCC, the Gnu C Compiler</a>. You don't need to be a C/C++ coder in order to need and use it. There's software out there which might not be bundled with Fedora yet. I personally use it quite often to compile software from bleeding edge sources. Hence <code>sudo yum install gcc</code> is indeed a good idea.</p>

<h3 id="qualcomm-gobi-2000-wwan-support">Qualcomm Gobi 2000 WWAN Support</h3>

<p>Fedora has very good networking support. With qcserial, it <em>basically</em> supports connecting through Qualcomm WWAN devices by default. On other distros, I had to compile qcserial and use gobi_loader to load the Sony Qualcomm firmware files. With Fedora 15, it just got a major step simpler, at least for my special case with Sony Qualcomm Gobi 2000 WWAN module.</p>

<p>As far as I have figured out, Network-Manager on Fedora 15 proactively looks for firmware files on <code>/lib/firmware</code>. The device recognition is triggered by udev rules, residing in <code>/lib/udev/rules.d</code>. After hours on fiddling around how the device recognition and initialization process works, the solution was quite simple at the end.</p>

<p>All I needed to do was to copy the firmware files (<code>UQCN.mbn</code>, <code>amss.mbn</code> and <code>apps.mbn</code>) to <code>/lib/firmware</code>, reboot the system and enjoy wireless mobile networking.</p>

<p>In case you wonder: The 3 abovementioned files are propietary firmware files. You can't download them. Even Sony / Qualcomm as vendors don't provide a download of firmware files. The easiest way to obtain the files is to install the <a href="http://support.vaio.sony.eu/computing/vaio/downloads/info/info.aspx?l=en_GB&amp;url;=VAIO/Original/Gobi2000_WWAN_Driver_2.0.7.0.zip&amp;m;=VPCS12V9E_B&amp;ip;=Gobi2000_WWAN_Driver_2.0.7.0.htm">WWAN driver for Windows provided by Sony</a> and pick the necessary files from Windows installation.</p>

<p>Typically, firmware files are located at <code>%ProgramFiles%\QUALCOMM\Sony</code>. You'll find a bunch of numbered folders there alongside with an <code>UMTS</code> folder. You can find <code>amss.mbn</code> and <code>apps.mbn</code> files there. The numbered folders contain mobile tepephony provider specific versions of <code>UQCN.mbn</code>. The version in folder <code>6</code> seems to be a generic firmware driver info and works quite well with my provider.</p>

<h3 id="avi-mp3-mpeg4-and-more">AVI, MP3, MPEG4 and more</h3>

<p>Let's face it. You need codecs. Easiest way to support most of the propietary codecs is to install gstreamer ugliness using </p>

<div class="codehilite"><pre><span class="n">sudo</span> <span class="n">yum</span> <span class="n">install</span> <span class="n">gstreamer</span><span class="o">-</span><span class="n">plugins</span><span class="o">-</span><span class="n">ugly</span> <span class="n">gstreamer</span><span class="o">-</span><span class="n">ffmpeg</span> <span class="n">xvidcore</span>
</pre></div>

<p>Note that previous line only works if RPM Fusion repositories are available.</p>

<h3 id="fedora-on-a-vaio">Fedora on a Vaio</h3>

<p>After all, installing and using Fedora on a Vaio Notebook is a great experience. Almost everything is working out of the box. The nouveau driver for NVIDIA works seamless, all internal devices are being recognized and taken care of by Fedora. Touchpad, camera, fingerprint sensor, and even the sony-specific FN-Keys.</p>

<p><strong>Fedora on a Vaio is great.</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Open Source And Open Minds</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/open-source-and-open-minds.html"/>
            <updated>2011-05-26T21:47:29Z</updated>
            <published>2011-05-26T21:47:29Z</published>
            <id>/open-source-and-open-minds.html</id>
            
            <content type="html"><![CDATA[
                <p>Last week I attended a very interesting event called "<a href="http://www.youtube.com/watch?v=BX6XPjs2HlY">Open Art Event Munich</a>". I was invited to see Mr. James Utzschneider, General Manager Open Source Strategy at Microsoft as well as Mr. Andreas Urban who takes care of Microsofts activities related to Open Source in Germany. I was pretty skeptic about the event in general. Microsoft and Open Source? Do both fit in a sentence at all?</p>

<h3 id="were-in-the-game-called-open-source">We're In The Game Called Open Source</h3>

<p>Granted, there's <a href="http://www.outercurve.org/">Outercurve</a> with <a href="http://www.codeplex.com/">Codeplex</a>. And most recently, we happily observe alot of open source projects in .NET Ecosystem, even from Microsofts "inner circle", like <a href="http://weblogs.asp.net/scottgu/archive/2008/03/21/asp-net-mvc-source-code-now-available.aspx">ASP.NET MVC</a> and <a href="http://nuget.codeplex.com/">Nuget</a>. Plus there's plenty of momentum in the .NET Community towards open source projects, especially when it comes to tools and frameworks.</p>

<p>However, for me there's still a strange feeling of discrepancy between "Microsoft" and "Open Source". Now, with the Open Art event in Munich, I had the chance to talk with the chief strategist of Microsoft in person to find answers for this surreal picture of Microsoft's Open Source Initiative.</p>

<h3 id="open-source-is-important-for-all-of-us">Open Source Is Important For All Of Us</h3>

<p>One of the first (and most obvious) questions I was lucky to ask Mr. Utzschneider was: "Why do you care about open source anyway?". His answer was quite simple: "Why shouldn't we care anyway?"</p>

<p>It's worth to have a look behind the curtains of his short &amp; snappy answer. The open source idea as well as the community has matured and is a vital part of our life. Linux as operating system runs on a gazillion of devices, from coffee-machines up to parking-lot-systems. PHP drives millions of websites, ranging from blogs up to world-changing websites like Wikipedia. That's why Open Source is important for all of us.</p>

<h3 id="integration">Integration</h3>

<p>I personally believe that Microsoft realizes the importance of Open Source for our society (and therefore our economy, as well). Apparently, Microsoft is not trying to make significant changes to business models or its identity just for the sake of the Open Source movement. Instead, Microsoft aims to <em>integrate</em> with Open Source. </p>

<p>It's like two families from different cultures now living next to eachother in the same street called "IT Road". At first sight, it seems impossible to be neighbors. Different cultures, different traditions, different languages. </p>

<p>However, as time forces both to live and see each other, a common understanding of "live and let live" is established. The next step is being a respectful, polite, friendly and aiding neighbor for each other. That's the stage Microsoft is aiming with Open Source right now.</p>

<h3 id="intellectual-things">Intellectual Things</h3>

<p>However, it's not all shiny weather at "IT Road". One of the biggest topics we're facing with the open source debate these days is intellectual property (in short, IP). IP is a key factor for success in software development economy. </p>

<p>For propietary software, the situation is quite clear. The message is really simple: "I invented it, I made it, I sell it. It's mine." No idealism, just capitalism. Straight forward.</p>

<p>For Open Source, it's by far more complicated. Just have a look at what <a href="http://www.opensource.org/licenses/alphabetical">licensing possibilities you have</a> if you're willing to publish and share your sources. </p>

<p>Once you're through the jungle of licenses, you're ready to share your source. Let's say your software is a blast and is being used day by day by thousands of users. Thousands of users have thousands of different tasks, thousands of different ideas and wishes. The level of support &amp; maintenance for a successful Open Source project is not to be underestimated, IMHO.</p>

<h3 id="mixed-feelings-freemium">Mixed Feelings: Freemium</h3>

<p>Ok, support and maintenance of a large user base and/or project actually is considerable effort. That's one of the main reasons why there's a business model called <a href="http://en.wikipedia.org/wiki/Freemium">Freemium</a>. Freemium is sort of an <a href="http://en.wikipedia.org/wiki/Hybrid_vehicle">hybrid vehicle</a> in software landscape. It delivers value to both the free and premium user base. While basic, limited functionality is available for free, advanced or high volume features need to be payed for.</p>

<p>In Open Source world, Freemium can both vitalize and poison. I think it's the dose making Freemium a win/loose model. </p>

<p>You need money to continue delivering value for free, that's a fact. However, once the part of "money making" becomes more and more important, Open Source is kind of lost at sea. Take the recent developments around <a href="http://www.mono-project.com/Main_Page">Mono</a> as a living example.</p>

<h3 id="the-definition-of-open-source">The Definition Of Open Source</h3>

<p>What's Open Source then? Is <a href="http://www.mono-project.com/Main_Page">Mono</a>, <a href="http://www.asp.net/mvc">ASP.NET MVC</a> or <a href="http://nuget.codeplex.com/">Nuget</a> really Open Source? From an idealistic perspective, a clear definition of Open Source is needed. <a href="http://www.opensource.org/docs/osd">According to OSI</a>, Open Source needs to be:</p>

<ul>
<li>freely distributable,</li>
<li>source code included,</li>
<li>derivable,</li>
<li>attributed to author,</li>
<li>non-discriminating,</li>
<li>license-keeping,</li>
<li>neutralized to product or platform.</li>
</ul>

<p><strong>You decide.</strong></p>

<p>Nonetheless, I personally think that the "definition" of Open Source is not only restricted to materials or intellectual property. To me, Open Source has a bold cultural aspect as well. I won't dig into details here because I know this topic is epic. Maybe I'll have the chance to blog about my own perspective of the culture of Open Source in future. Nonetheless, Microsoft, IBM, Mozilla, Apple, Google and whatever great software vendors you know - I think all are aware of the fact that there's more to Open Source than just "Open Source".</p>

<h3 id="the-next-level">The Next Level</h3>

<p>I want to get back to my impressions of the Open Art Event and Mr. Utzschneider. In his speech, Mr. Utzschneider mentioned that he's glad to see that we as software developers and digital enthusiasts have the chance to create great things. Everybody should be free to create, share and use the things he's interested in.</p>

<p>Mr. Utzschneider continued by telling us that it's a good thing to see Microsoft employees using <a href="http://www.apple.com/ipad/">IPads</a> and MacBook users to see using <a href="http://windows.microsoft.com/en-US/windows7/products/home">Windows 7</a>. He continued to describe that software is about enabling possibilies and opening minds:</p>

<blockquote>
<p>"Software is not only Function, it's Art as well. Creating great things is a creative, artful task. I'm from Seattle, and as many of you might know, Seattle is popular for great Music. Seattle is the Home of great artists like Jimi Hendrix, Nirvana and many more. Especially the Jazz culture is vital and bright.</p>
<p>I really love music. In my precious spare moments, I support a local Seattle project called <a href="http://kexp.org/Default.aspx">KEXP</a>. It once was a radio station, now it's a project supporting various local artists and newcomers. The platform broadcasts hundreds of concerts a year with all those great artists. At KEXP, it's the artist and his art being in focus. For example, some artists may choose to provide their songs for free while others may want to have a small amount of monetary compensation for all the hard work and efforts. And that's ok.</p>
<p>The key point here is that everything is possible. You're not forced to give away everything for free. And of course you don't need to go commercial to gain audience and respect. The major benefit and joy is, in fact, being open-minded in an open-minded society."</p>
</blockquote>

<h3 id="open-source-and-open-minds">Open Source And Open Minds</h3>

<p>I honestly need to admit it: Mr. Utzschneiders speech left me impressed and inspired me to think over this whole Open Source and Open Minds topic. I truly believe that we as software developers as well as software consumers need to realize and accept that all colors are beautiful. </p>

<p>It's not Microsoft producing the best software products in the world. It's not Linux being the best operating system in the world. It's not Google providing the best mobile experience in the world. It's not Apple changing everything, again and again.</p>

<p><strong>It's you to do and use what is best for you.</strong></p>

<p>What I have learnt from this Open Art Event and Mr. Utzschneider is that being Open Minded is not easy. However, being Open Minded is the key for us to open others minds, hearts, creativity and emotions. </p>

<p>That's what we should do with software. That's what I do with software. </p>

<p><strong>Be Open Minded.</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">You got an F!</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/you-got-an-f.html"/>
            <updated>2011-05-23T16:00:30Z</updated>
            <published>2011-05-23T16:00:30Z</published>
            <id>/you-got-an-f.html</id>
            
            <content type="html"><![CDATA[
                <blockquote>
<p>Famstag, fer 21. Fai 2011, fein fanz formaler Famstag, fin Fürnberg, fim fönen
Franken. Fis fauf feine Fausnahme: Füberall fein F!</p>
</blockquote>

<h3 id="der-net-day-franken-2011">Der .NET Day Franken 2011</h3>

<p>Samstag morgens habe ich mich nach ein paar Tagen (notwendiger) Erholung aufgerafft, mich mit Sebastian zum <a href="http://www.dotnet-day-franken.de/">.NET Day Franken 2011</a> zu begeben. Meine Erwartungshaltung war groß, denn ich hatte im Vorfeld schon viel positives über die Fränkische Community Konferenz gehört.</p>

<h3 id="f-wie-freundlich">F wie Freundlich</h3>

<p>Trotz eines kleinen Malheurs konnten wir den Veranstaltungsort in Nürnberg gut erreichen. Raus aus dem Auto und rein in die Konferenz war unsere erste Devise. Kaum in den Räumen angekommen, bekamen wir von überall ein Lächeln geschenkt. </p>

<p>Am Empfang lächelten die Damen und gaben uns zügig die notwendigen Materialien und Info's. Im Sprecherzimmer lächelten ein gelassener <a href="http://www.tom-mue-vs.blogspot.com/">Tom</a> und <a href="http://berndhengelein.de/">Bernd</a>, trotz des Konferenz-Trubels. Die Teilnehmer freuten sich auf regen Austausch und die Vorträge. Fazit: You got an F! (like <em>"Freundlich"</em>).</p>

<h3 id="f-wie-frei">F wie Frei</h3>

<p>Erstaunlich fand ich persönlich, wie frei und locker die Konferenz-Atmosphäre war. Diese (wohl sehr fränkische) Gelassenheit wurde aber vor allem durch die Kombination von guter Location, guter Raumorganisation und guter Konferenzgröße (ca. 150 Teilnehmer) ermöglicht. Es wurde niemals zu eng, zu heiß oder zu unpersönlich. Man konnte sich zu Einzelgesprächen zurückziehen (z.B. auf der Terasse) oder aber sich in Gruppen unterhalten können. Fazit: You got an F! (like <em>"Frei"</em>).</p>

<h3 id="f-wie-feinschmecker">F wie Feinschmecker</h3>

<p>Die Verpflegung auf der Konferenz war einsame Spitze. Das Catering war auf den Punkt immer da, das Buffet und die Getränke reichhaltig vorhanden. Die kleinen Snacks zwischendurch waren super, der Kaffee hat richtig gut geschmeckt und das Mittagessen war in nicht nur sehr schmackhaft, sondern auch sehr geschmackvoll. </p>

<p>Ein besonderer Pluspunkt war meines Erachtens die angenehme Umgebung. Jeder konnte angenehm am Tisch nicht nur speisen sondern auch wertvolle Tischgespräche führen. Fazit: You got an F! (like <em>"Feinschmecker"</em>).</p>

<h3 id="f-wie-fachwissen">F wie Fachwissen</h3>

<p>Neben meiner Session zu einigen, wenigen XP Secrets hatte ich auch das Vergnügen, bei zwei weiteren Sessions dabei zu sein. Meine erste Session: "Gelebtes Scrum" von <a href="http://www.strattner.net/">Christine Strattner</a>. Ein solider Überblick über die Methode, gepaart mit ein paar kleinen Anekdoten aus der Praxis. Für den Newcomer sicherlich ein wertvoller Vortrag.</p>

<p>Nach meinem eigenen Vortrag verschlug es mich zu "Find your Flow with TPL" von <a href="http://www.codefromground.com/">Sebastian Achatz</a>. Er hat es verstanden, innerhalb von 70 Minuten die Konzepte und Wirkungsweisen der <a href="http://msdn.microsoft.com/en-us/library/dd460717.aspx">Task Parallel Library</a> so zu vermitteln, dass man danach schon mit juckenden Fingern wieder an der Tastatur kleben wollte, um selbst die bemerkenswerte TPL auszuprobieren und einzusetzen. </p>

<p>Schade, dass ich für die anderen hervorragenden Sprecher und Vorträge keine Zeit aufbringen konnte. Nichtsdestotrotz- oder besser gerade eben deswegen - ein klares Fazit: You got an F! (like <em>"Fachwissen"</em>).</p>

<h3 id="f-wie-fantastisch">F wie Fantastisch</h3>

<p>Abschliessend möchte ich meinen persönlichen Eindruck widergeben. Ich hatte schon eine "gesteigerte" Erwartung an die Konferenz - auch wegen der vielen Stimmen, die mir die Konferenz empfohlen haben. Trotzdem hat mich dieser .NET Day Franken doch ziemlich überrascht.</p>

<p>Für mich ist die Konferenz ".NET Day Franken" eine hochwertige und anspruchsvolle Veranstaltung in jeder Hinsicht: Themen, Vorträge, Ort, Verpflegung, Organisation, Rahmen. Das Preis-Leistungs-Verhältnis ist nicht nur fair, sondern auch ein absoluter Knaller für diese ganzheitliche Premium-Qualität, die der .NET Day Franken bietet. Fazit: You got an F! (like <em>"Fantastisch"</em>).</p>

<h3 id="f-wie-fakt">F wie Fakt</h3>

<p>Meine Meinung in einem Satz: Der .NET Day Franken ist das <a href="http://de.wikipedia.org/wiki/Non_plus_ultra">non plus ultra</a>, wenn es um eine .NET-Konferenz in Süddeutschland geht. </p>

<p>Es gibt keine vergleichbare mir bekannte Konferenz, die in allen Punkten ein derartiges Erste-Bundesliga-Niveau bietet. Das ist kein Honig-ums-Maul-Geschmiere, sondern ein ganz klares und deutliches "F". Fazit: You got an F! (like <em>"Fakt"</em>).</p>

<h3 id="f-wie-franken">F wie Franken</h3>

<p>Mit einem siebten "F wie Franken" möchte ich meine Eindrücke abschließen. Dieses siebte F steht für Franken als Region sowie als Gesellschaft. Ich habe Franken als gelassene Profis erlebt, die auch gerne über sich und andere scherzen, dabei aber nie den Respekt und den angenehmen Umgang aus den Augen lassen. Der .NET Day Franken hat vergleichbare (kommerzielle) Konferenzformate nicht nur in den Schatten gestellt, sondern mit einem "You got an F!"-Gruß regelrecht "platt gemacht".</p>

<p><strong>Fazit: <a href="http://www.youtube.com/watch?v=iNNC0OLJxWo">You got an F!</a></strong></p>

<p><em>("... representing Deutschland, yea!")</em> ;-)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">DotNet Cologne 2011</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/dotnet-cologne-2011.html"/>
            <updated>2011-05-09T16:14:41Z</updated>
            <published>2011-05-09T16:14:41Z</published>
            <id>/dotnet-cologne-2011.html</id>
            
            <content type="html"><![CDATA[
                <p>Letzten Freitag war ich auf der <a href="http://dotnet-cologne.de">DotNet Cologne</a>, einer Community-Konferenz im "Großraum Köln". Ein herrlicher Mai-Freitag, eine coole Location am Mediapark in Köln und eine großartige Organisation. Die Grundvoraussetzungen für einen guten Community-Event waren also gegeben.</p>

<p>Es kam jedoch anders. Meine Erwartungen wurden nicht erfüllt. Nein, sie wurden sogar getoppt. Die diesjährige DotNet Cologne war für mich eine professionell organisierte Veranstaltung, bei der es viele interessante Themen und Gespräche zu erleben gab.</p>

<p>Besonders gefallen hat mir die lockere Konferenzatmosphäre. Ich hatte das Glück, gleich zu Beginn meine Session über Agile Architekturen halten zu dürfen. Dadurch konnte ich mich "entspannt" den weiteren Sessions von <a href="http://www.devcoach.com">Daniel Fisher</a>, <a href="http://community.bartdesmet.net/blogs/">Bart de Smet</a> und <a href="http://blogs.msdn.com/b/timfis/">Tim Fischer</a> widmen. </p>

<p>Ohne den Inhalt und den Wert der Sessions schmälern zu wollen möchte ich allerdings die wertvolle Zeit zwischen den Sessions hervorheben. Die Veranstalter haben mit der 30 Min. Session-Pause eine sehr gute Entscheidung für rege Community-Gespräche und Entwickler-Austausch getroffen. Dadurch war ich in der Lage, mich mit vielen interessanten Entwicklern und Meinungen austauschen zu können.</p>

<p>Offen gesagt: Die Zeit hat trotzdem nicht gereicht. Gerne hätte ich mich noch intensiver über verschiedene Themen ausgetauscht <em>(Codename: "Pinocchio")</em> und noch näher neue Bekanntschaften kennengelernt <em>(Codename: "Twitterlabel")</em>. Alles in Allem kann ich nur sagen: die DotNet Cologne ist eine Konferenz, die nicht nur neue Aspekte und Denkanstöße für aktuelle Entwicklungs-Themen liefert, sondern im wahrsten Sinne eine Plattform zum Austausch für die .NET Gemeinde in Deutschland bietet. Das alles von der Community, für die Community. </p>

<p>Eine bewundernswerte <strong>Glanzleistung der Organisatoren</strong> <a href="http://der-albert.com/">Albert</a>, <a href="http://www.roland-weigelt.de/">Roland</a> und <a href="http://www.st-lange.net/">Stefan</a>. Bei der Größe, der Professionalität, dem Preis und der Leistung dieser Community-Konferenz ist es förmlich das Mindeste, auch mein deutliches und dickes <strong>Danke den <a href="http://dotnet-cologne.de/Sponsoren.ashx">Sponsoren</a></strong> der Konferenz zu sagen. Es ist gerade die gute Mischung aus engagierten Unternehmen und engagierten Entwicklern, die Geld, Zeit und Arbeit investieren, um solche Veranstaltungen für mich und die gesamte .NET Community zu ermöglichen. </p>

<p>Mein Fazit: Teilnehmen bei der DotNet-Cologne 2012!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">ALE Network Munich</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ale-network-munich.html"/>
            <updated>2011-04-27T20:06:32Z</updated>
            <published>2011-04-27T20:06:32Z</published>
            <id>/ale-network-munich.html</id>
            
            <content type="html"><![CDATA[
                <p><em>(Note: You may find a brief english summary at the end of this post.)</em></p>

<p>Es gibt in München sehenswürdiges. Manchmal gibt es in München auch merkwürdiges. Ab und an gibt es in München auch denkwürdiges. Seit kurzem gibt es für den Agile lebenden und Lean denkenden Münchener eine weitere denkwürdige Sache: Das ALE Network Munich.</p>

<h3 id="was-ist-ale">Was ist ALE?</h3>

<p>In kurzen Worten: <strong>ALE</strong> steht für <a href="http://alenetwork.eu"><em>Agile Lean Europe</em></a> und ist eine von <a href="http://www.noop.nl/2011/03/ale-gathering-at-xp2011.html">Jurgen Appelo ins Leben gerufene Initiative</a> für den offenen Austausch und konstruktive Zusammenführung agiler Köpfe in Europa. Diesem Aufruf von Jurgen sind in <a href="http://alenetwork.eu/xp2011-status">ganz Europa viele Agilisten gefolgt</a>, darunter auch einige Agile &amp; Lean Enthusiasten in Deutschland. </p>

<p>Mit der Koordinations- und Organisationsunterstützung von <a href="http://hhgttg.de/blog/?p=315">Olaf Lewitz</a> haben wir für Deutschland auch einen "Repräsentanten", der uns im internationalen Austausch von Ideen, Erfahrungen und Konzepten innerhalb des ALE Networks vertritt. Das <em>ALE Network</em> sieht sich in erster Linie als eine <em>nicht-kommerzielle, offen kultivierte, fortschrittsgewandte</em> Interessensgemeinschaft von Agilisten und Lean Denkern in ganz Europa. Wir in München sind ein Teil dieser Gemeinschaft und freuen uns, mit optimistischer und offener Partizipation im ALE Network dabei zu sein.</p>

<h3 id="wieso-ale">Wieso ALE?</h3>

<p>Aber wieso gibt es das <em>ALE</em>? "Nicht schon wieder eine weitere Agile Community..." wird sich manch Einer denken. Doch weit gefehlt, ein genauerer Blick auf ALE enthüllt Motivation und Antrieb. ALE ist aus der Idee entstanden, dem globalen Austausch von agilen Themen eine lokale - ja, eine europäische - Dimension zu geben. ALE hat das Selbstverständnis des unabhängigen, unkontrollierten, unverbindlichen Erfahrungsaustausches unter Agilisten. ALE strebt nicht nach Organisation, Hierarchie oder Kommerzialisierung. Insofern sollte ALE nicht als Institution, Organisation oder "Yet another agile community" betrachtet werden. </p>

<p>ALE bezieht ihren Antrieb als ein offenes, kulturelles und informelles Netz von vielschichtigen, fortschrittsgewandten, veränderungstreibenden Menschen - den Agilisten &amp; Lean Denkern.</p>

<h3 id="munchen-und-ale">München und ALE</h3>

<p>Mit dem Aufruf von Jurgen und Olaf, hier in Deutschland, das kommende ALE Gathering bei den <a href="http://xp2011.org/">XP Days in Madrid</a> mit Werten und Ideen aus ganz Europa zu bereichern, haben Christian, Wolfgang und ich uns angesprochen gefühlt, nicht nur unseren Beitrag durch Wertevermittlung und aktiver Teilnahme zu leisten, sondern darüber hinaus das Münchener Fenster für die europaweite, "Agile &amp; Lean-Frischluft" zu öffnen.</p>

<p>Nach einem langen gestrigen Abend haben wir uns entschlossen, der grossen Münchener Gemeinschaft der Agilisten und Lean-Befürworter einen offenen und ungezwungenen Zugang zur europaweiten ALE Community zu verschaffen. Wir glauben fest daran, dass die Symbiose von europaweiter Verknüpfung und lokaler Kultivierung ein tragfähiges Fundament für die Weiterentwicklung der agilen Werte und Prinzipien als auch der schlanken Methoden und Verfahrensweisen ist. Für uns heisst das: das ALE Network hat in München mit all seinen professionellen Agilisten und Lean-Vordenkern ein lebhaften, offenen, aktiven und wertschätzenden Knoten im europaweiten Netz.</p>

<h3 id="du-und-3-worte-agile-lean-europe">Du und 3 Worte: Agile, Lean, Europe</h3>

<p>Wir - also Christian, Wolfgang und ich - möchten Dich und Deine agile Expertise, Deine schlanken Verfahren, Deine neuen Ideen mit Gleichgesinnten in Europa näher bringen. Lokal, Verbal, Viral. Deshalb rufen wir auf zum ersten ALE Network Treffen in München, am Di, den 03. Mai 2011 um 20:00 Uhr, in der <a href="http://niederlassung.org/">Niederlassung</a> in München. Sei dabei und lass uns gemeinsam über unsere individuellen Ideen und Wege zum ALE diskutieren! Für die Anmeldung reicht ein Kommentar auf diesem Blog-Post oder eine Anmeldung beim <a href="https://www.xing.com/events/input-munchener-agile-community-ale-759504/description">Xing-Event</a>.</p>

<p>Wir freuen uns auf Dich und einen erkenntnisreichen Abend!</p>

<p><hr />
<p><em>A brief english summary:</em></p>
<p>We, that is Christian, Wolfgang and me, have received a call for participation in ALE Network by <a href="http://www.noop.nl/2011/03/ale-gathering-at-xp2011.html">Jurgen Appelo</a>. Amplified and initiated by <a href="http://hhgttg.de/blog/?p=315">Olaf Lewitz</a>, we had a long brainstorming session yesterday on what ideas, thoughts and values we can contribute to the overall ALE initiative. With the ALE Gathering session at <a href="http://xp2011.org/">XPdays in Madrid</a> right in front of our door, we want to engage our local community of agile practitioners and lean thinkers here in Munich to bring in an individual, diverse perspective to the european Agile &amp; Lean network.</p>
<p>We strongly believe that the synergy of global connection and local cultivation is a solid ground for a thoughtful progress to an improved adoption of agile values and lean methodologies. </p>
<p>This belief is our motivation to call agile &amp; lean practitioners in Munich to a first meetup for the "ALE Network Munich", an event for open discussion and exchange of thoughts for the ALE network initiative. Join us on Tue, 3rd May at <a href="http://niederlassung.org/">Niederlassung</a> in Munich! Let's get in touch with Agile &amp; Lean minds all over Europe!</p></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Code Kata PickAkin</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/code-kata-pickakin.html"/>
            <updated>2011-04-18T22:38:34Z</updated>
            <published>2011-04-18T22:38:34Z</published>
            <id>/code-kata-pickakin.html</id>
            
            <content type="html"><![CDATA[
                <p>You have to manage product codes for a specific inhouse portfolio. All product codes in your company follow a certain convention. A product code is separated into two parts - a single character department source qualifier and a unique product number.</p>

<h4 id="an-enigma-for-products">An Enigma for products</h4>

<p>Example Product Codes: <code>A1, B52, D2, X404</code></p>

<div class="codehilite"><pre>The &quot;department source qualifier&quot; (aka DSQ)
|
v
B52
 ^^
  |
  The product number (aka PN)
</pre></div>

<p>Moreover, you have two separate lists of product codes at hand. The first list is from your CEO, while the second list origins from internal controlling department. Obviously, both lists are different. It's not only that one list contains product codes the other does not have, but as well that both lists seem to have different product numbering schemes.</p>

<h4 id="make-your-ceo-happy">Make your CEO happy</h4>

<p>You have been assigned by your CEO to complete the following task:
Pick all "akin" products by examining their DSQ. If both lists contain product codes of same DSQ, remove them from original list and copy them over to a new "Akin"-List. Leave the remaining product codes as is.</p>

<p>The following two lists:</p>

<div class="codehilite"><pre>ceoList = [A1,B1,A2,A3,C1,D1,E1,E2]
controlList = [F1,D2,B2,B3,A4]
</pre></div>

<p>Results in following "Akin List" with modified CEO and control lists:</p>

<div class="codehilite"><pre>akinList = [A1,B2,A2,A3,B3,A4,D1,D2,B1]
ceoList = [C1,E1,E2]
controlList = [F1]
</pre></div>

<p><em>(Note: The order is not relevant)</em></p>

<h4 id="be-smart">Be smart</h4>

<p>Let's put it straight: Write a program that takes two lists (<code>ceoList</code> and <code>controlList</code>) containing an arbitrary set of product codes in the above described format. The program produces three lists. The first list is the <code>akinList</code>, that is, the list of all akin products taken from the input lists. The remaining two lists are the reduced <code>ceoList</code> and <code>controlList</code>, respectively.</p>

<p><hr />
<h3 id="about">About</h3>
<p>The kata stems from a real life scenario. Actually, I did not invent the kata, all credits go to its original inventor, <a href="http://swemusings.blogspot.com/" title="SWE Musings, the blog of Dr.M">Dr.M</a>. What I did is just to take the essence of the problem and rephrase it a little bit with a story. That's it.</p>
<p>The objective of this kata is to sharpen design skills for trivial algorithms. <a href="http://swemusings.blogspot.com/" title="SWE Musings, the blog of Dr.M">Dr.M</a> originally posted the problem alongside with a requirement of maximum time complexity O(n^2). A secondary requirement for the solution algorithm is terseness and expressiveness. The more elegant your algorithm is (with respect to the time complexity), the "better". Although it should be paid attention to both non-functional requirements, they're just a "nice to have".</p></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Die Zwei Gesichter der Kata FizzBuzz </title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/die-zwei-gesichter-der-kata-fizzbuzz.html"/>
            <updated>2011-04-01T20:23:44Z</updated>
            <published>2011-04-01T20:23:44Z</published>
            <id>/die-zwei-gesichter-der-kata-fizzbuzz.html</id>
            
            <content type="html"><![CDATA[
                <p>Die Woche war wieder einmal eine dieser Dojo-Wochen. Am Montag gab es in München das übliche .NET Coding Dojo bei JetBrains. Es war ein sehr interessantes Dojo, zumal wir uns diesmal zum Ziel gesetzt haben, ReSharper als Tool näher kennenzulernen. Die Code Kata war da eher "nebensächlich". Nebenbei: Es war die Kata <a href="http://osherove.com/tdd-kata-1/">StringCalculator von Roy Osherove</a>. Ich konnte aus dem Coding Dojo einige Erkenntnisse mitnehmen, wovon eine davon das lernen von ein-zwei Shortcuts von ReSharper gewesen ist (<code>ALT-R-U-N</code> für das ausführen aller Tests in einer Solution und <code>CTRL-W</code> für "Expand Selection").</p>

<p>Dann gab es noch das tolle Coding Dojo in Nürnberg bei der <a href="http://sites.google.com/site/dodned">DNUG Franken</a>. Ich empfand dabei von Anfang an eine besonders lockere und angenehme Atmosphäre, die meines Erachtens dem Coding Dojo einen sehr konstruktiven Schub gab. Als weitere Besonderheit sollte nicht unerwähnt bleiben, dass viele Teilnehmer den "Erstkontakt" mit einem Coding Dojo hatten und neben einigen Erfahrenen auch ein paar Einsteiger sich dem Thema TDD/BDD widmeten. Es wurden zwei Gruppen gebildet, die sich dann der Kata <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">FizzBuzz</a> angenommen haben. Meiner Meinung nach ist FizzBuzz eine gute Einsteiger-Kata, bei der drei grundlegende Prinzipien des TDD relativ deutlich werden.</p>

<p>An dieser Stelle möchte ich garnicht weiter auf die beachtenswerten Lösungen der "Dodnedder" aus Franken eingehen, sondern eine <a href="https://github.com/ilkerde/CodeKatas/commits/master/KataFizzBuzz">meiner eigenen Implementierungen</a> von FizzBuzz vorstellen. Wer FizzBuzz schon ein paar mal implementiert hat, der wird vielleicht auch wissen, dass es mehrere (leicht unterschiedliche) Lösungsvarianten gibt. Die Lösung, die ich hier vorstelle ist einer meiner persönlichen Favoriten, weil es vielen Einsteigern (und manchen Fortgeschrittenen) ein Stirnrunzeln entlockt.</p>

<p><strong>FizzBuzz.cs</strong>:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">KataFizzBuzz</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">FizzBuzz</span> <span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="nf">Translate</span><span class="p">(</span><span class="kt">int</span> <span class="n">number</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">if</span> <span class="p">(</span><span class="n">number</span> <span class="p">%</span> <span class="m">15</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
        <span class="k">return</span> <span class="s">&quot;FizzBuzz&quot;</span><span class="p">;</span>

      <span class="k">if</span> <span class="p">(</span><span class="n">number</span> <span class="p">%</span> <span class="m">5</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
        <span class="k">return</span> <span class="s">&quot;Buzz&quot;</span><span class="p">;</span>

      <span class="k">if</span> <span class="p">(</span><span class="n">number</span> <span class="p">%</span> <span class="m">3</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
        <span class="k">return</span> <span class="s">&quot;Fizz&quot;</span><span class="p">;</span>

      <span class="k">return</span> <span class="n">number</span><span class="p">.</span><span class="n">ToString</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">TranslateRange</span><span class="p">(</span><span class="kt">int</span> <span class="n">from</span><span class="p">,</span> <span class="kt">int</span> <span class="n">to</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">translations</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;();</span>

      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="n">from</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;=</span> <span class="n">to</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
        <span class="n">translations</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="n">i</span><span class="p">));</span>

      <span class="k">return</span> <span class="n">translations</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p><strong>FizzBuzzTranslateTests.cs</strong>:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">KataFizzBuzz</span> <span class="p">{</span>
<span class="na">  [TestFixture]</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">FizzBuzzTranslateTests</span> <span class="p">{</span>
<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Three_Returns_Fizz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">fizzbuzz</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">fizzbuzz</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">6</span><span class="p">);</span>

      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">translation</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;Fizz&quot;</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Five_Returns_Buzz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">fizzbuzz</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">fizzbuzz</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">10</span><span class="p">);</span>

      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">translation</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;Buzz&quot;</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Three_And_Five_Returns_FizzBuzz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">fizzbuzz</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">fizzbuzz</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">15</span><span class="p">);</span>

      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">translation</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;FizzBuzz&quot;</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">No_Multiples_Of_Three_Or_Five_Returns_Number</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">fizzbuzz</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">fizzbuzz</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">7</span><span class="p">);</span>

      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">translation</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;7&quot;</span><span class="p">));</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p><strong>FizzBuzzTranslateRangeTests.cs</strong>:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">KataFizzBuzz</span> <span class="p">{</span>
<span class="na">  [TestFixture]</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">FizzBuzzTranslateRangeTests</span> <span class="p">{</span>
<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Range_From_1_To_100_Returns_100_Elements</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">fizzbuzz</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">translations</span> <span class="p">=</span> <span class="n">fizzbuzz</span><span class="p">.</span><span class="n">TranslateRange</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">100</span><span class="p">);</span>

      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">translations</span><span class="p">,</span> <span class="n">Has</span><span class="p">.</span><span class="n">Count</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="m">100</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Returns_Elements_Whose_Values_Match_The_Translation_Of_Their_Corresponding_Keys</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">fizzbuzz</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">translations</span> <span class="p">=</span> <span class="n">fizzbuzz</span><span class="p">.</span><span class="n">TranslateRange</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">15</span><span class="p">);</span>

      <span class="k">foreach</span> <span class="p">(</span><span class="n">var</span> <span class="n">translation</span> <span class="k">in</span> <span class="n">translations</span><span class="p">)</span>
          <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">translation</span><span class="p">.</span><span class="n">Value</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="n">fizzbuzz</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="n">translation</span><span class="p">.</span><span class="n">Key</span><span class="p">)));</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Das interessante an dieser Lösungsvariante ist die Zwiespältigkeit. Meiner Meinung nach ist die Lösung</p>

<ul>
<li>zwar ausreichend, aber nicht vollständig,</li>
<li>sie ist stark genug, aber mit Schwachpunkten,</li>
<li>sie beginnt schnell, aber endet langsamer,</li>
<li>sie ist offensichtlich, aber dennoch diskutabel.</li>
</ul>

<p>Genau das ist es, was ich <em>gerade an dieser</em> Lösungsvariante von FizzBuzz mag.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">TFS 2010 Team Build und MSpec</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tfs-2010-team-build-und-mspec.html"/>
            <updated>2011-03-24T20:44:21Z</updated>
            <published>2011-03-24T20:44:21Z</published>
            <id>/tfs-2010-team-build-und-mspec.html</id>
            
            <content type="html"><![CDATA[
                <p>Er war in den letzten Tagen immer wieder ein Gesprächsthema in der Community: der TFS 2010. Vorweg möchte ich eine Sache klarstellen. Ich bin selbst, wie einige andere in der Community auch, ein Anwender von TFS. Der Erstkontakt ist schon einige Jahre her (damals noch TFS 2005) und ich verwende auch aktiv den TFS 2010. Der TFS ist mir also geläufig.</p>

<p>Genau dieser Erfahrungsschatz ist es auch, der mich zur nächsten Aussage förmlich zwingt: <strong>Der TFS ist eine Klasse für sich</strong>. Man könnte auch sagen, der TFS ist konkurrenzlos. Denn für mich ist TFS eine behäbige, alte Dampflokomotive, die nur mit viel Kohle, starken Heizern und einem idealistischen Lokführer in Gang zu bringen ist. Von der Geschwindigkeit und Zuglast der TFS-Dampflok möchte ich garnicht erst reden.</p>

<h3 id="tfs-ist-eine-feste-marktgroe">TFS ist eine feste Marktgröße</h3>

<p>Dennoch ist es Fakt, dass der TFS eine feste Position im Markt einnimmt. Man mag jetzt alle möglichen Gründe für diesen Umstand anführen. Ich persönlich denke dass einer der Hauptgründe für den (relativ) breiten Markteinsatz von TFS schlicht und einfach die Bequemlichkeit des Unternehmens (also TFS-Kunden) ist. Wie dem auch sei, der TFS ist da. Ich finde das auch gut so. Jedem das seine.</p>

<p>Sowie vor dem Hintergrund der Präsenz von TFS als auch aus Eigeninteresse ist es für mich dennoch interessant zu wissen, ob und wie sich TFS 2010 mit meinem Toolset anwenden lässt. Jürgen hatte ja schon über die <a href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2011/03/23/team-build-erster-eindruck.aspx">Nachteile von TFS TeamBuild</a> gebloggt. Dem kann ich mich widerspruchsfrei und vollends anschließen. Er merkte z.B. an, dass Team Build sehr schwer mit alternativen Test-Frameworks in Gang zu bringen ist. Richtig - aber es geht. Ich möchte das einmal für <a href="https://github.com/machine/machine.specifications">MSpec</a> (die Machine.Specifications) vorstellen.</p>

<h3 id="mspec-tfs-die-schone-und-das-biest">MSpec &amp; TFS: Die Schöne und das Biest</h3>

<p>Es gibt einen exzellenten <a href="http://scrumdod.blogspot.com/2011/03/integrate-mspec-with-tfs-2010-team.html">Blog-Post von DoD</a> über den Einsatz von MSpec mit dem TFS 2010 Team Build. Auf Basis dieses Blog-Posts habe ich es auch geschafft, den MSpec-Runner in den Team Build zu integrieren. </p>

<p>Zunächst einmal ist es notwendig, sich die einzelnen Komponenten, also das MSpecBuildTemplate-XAML und den angepassten NUnitTFS-Code zu besorgen (am Ende des Blog-Posts von DoD). Der nächste Schritt ist es, den NUnitTFS-Code zu kompilieren und gleichzeitig die MSpecToMSTest.xslt Datei auf den Build-Server zu verfrachten. Achtung: MSpecToMSTest.xslt ist im Source-Code vom gepatchten NUnitTFS begraben (im "NUnitTFS\Tfs2010" Ordner).</p>

<p>Ich persönlich finde weder den Code noch die Patch-Praxis von DoD schön. Dazu kommt auch noch die zweifelhafte Idee, die XSLT-Templates für die Test-Results-Konvertierung als eingebettete Ressource einzukompilieren. Nun, da ich persönlich diese Lösung sowieso nicht einsetzen werde, überlasse ich das Feld der Optimierungs-Potenziale dem interessierten Leser.</p>

<p>Der nächste Schritt ist es, MSpec mit auf den Buildserver für die Ausführung der Tests zu packen. Für die Testzwecke habe ich beides (also MSpec und NUnitTFS) separat auf den Buildserver gelegt. Bei einem echten Projekt würde ich beide Tools mit in die Versionsverwaltung einbringen.</p>

<p>Sind die Tools erst einmal vorbereitet, kann man endlich zur Tat schreiten und das BuildTemplate im TFS installieren. Bequem in Visual Studio, so wie es sich gehört. Nach dem man das Template zu den BuildProcessTemplates hinzugefügt hat, kann man es auch über die Build Config auswählen. Die Einstellungen sind relativ schnell und einfach gepflegt. Wichtig ist dabei nicht nur da korrekte setzen der Tool-Pfade, sondern auch die Angabe der Buildkonfiguration (z.B. Any CPU|Debug).</p>

<h3 id="ok-team-build-kann-auch-anders">Ok. Team Build kann auch anders.</h3>

<p>Was kann man nun aus diesem kleinen Experiment mitnehmen? Ja ganz einfach: Team Build kann auch ohne MSTest. Man muss eventuell ein wenig Überzeugungsarbeit hineininvestieren, aber es geht. Im Übrigen ist es auch interessant zu wissen, dass es nicht nur ein angepasstes XAML-BuildTemplate für MSpec gibt, sondern auch für <a href="http://www.heikura.info/blog/publishing-xunit-test-results-as-part-of-your-team-build-2010">XUnit</a> und natürlich <a href="http://www.heikura.info/blog/publish-nunit-test-results-as-part-of-team-build-in-team-foundation-server-2010">NUnit</a>, denn schließlich ist der Name des auf <a href="http://nunit4teambuild.codeplex.com/">Codeplex gehosteten Tools nicht umsonst NUnitTFS</a>.</p>

<p>Fazit: Team Build kann auch anders. 
Aha. Gut - interessant zu wissen. Schönen Dank auch.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Poor Man&#39;s Test Context Composition</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/poor-mans-test-context-composition.html"/>
            <updated>2011-03-14T08:59:07Z</updated>
            <published>2011-03-14T08:59:07Z</published>
            <id>/poor-mans-test-context-composition.html</id>
            
            <content type="html"><![CDATA[
                <h3 id="or-mixin-strategies-in-the-fields">Or: Mixin strategies in the fields</h3>

<p>Before I continue on my little post about Unit Tests and their test context, let me just be one thing very clear: A handful of unit test frameworks out there have dozens of other approaches for complex context setup. The one I'm going to blog about right now is just one out of those. The following context composition method is rare to be found, because it has some obvious downsides. More about the pros and cons later, let's just start.</p>

<p>With TDD, BDD and Unit Testing in general you always need to set the stage of your test. That is, you need to <em>establish a test context</em>, where you prepare your environment and all involved parties for your system under test. Basically it's the first A (= Arrange) of the <a href="http://c2.com/cgi/wiki?ArrangeActAssert">AAA-Rule</a>. Now that's nothing new.</p>

<p>In everyday testing, contexts can get fairly complex. Although I personally consider a complex (or large) context to be a smell, it's sometimes unavoidable. One practical application of large and complex contexts is the dissection of a brownfield. Once you're faced with a large context, your test/spec will be bloated by contextual setup. </p>

<p>As mentioned before, some frameworks have very smart tooling and concepts to help you minimize the context clutter. I'll post a separate blog about one of my favorites, the <a href="https://github.com/machine/machine.specifications">MSpec</a> and <a href="https://github.com/BjRo/Machine.Fakes">MFakes</a> bundle. But this is a story of its own, so we just disregard them for a minute. By the way: in some organizations you might not be even able to just change the testing framework of your choice and need to get along with what you have been provided.</p>

<h3 id="context-is-super">Context is super !?!</h3>

<p>As for "traditional" frameworks like <a href="http://www.nunit.org/">NUnit</a> or <a href="http://xunit.codeplex.com/">XUnit</a> (me likes <em>both of them</em>), the Setup method, constructor or whatever initialization method contains the context complexity to its full extent. Hence, your test fixtures will grow in size and complexity. Undesirable. </p>

<p>A very common solution to this is to refactor out context code to an abstract base "context" class. Although most developers do this primarily for readability purposes, the base class is created to favor reuse as well. Which is an illusion, actually. Once following that path, you quickly find your self back in bewildered inheritance hierarchies of "BaseContextClasses". The tests themselves get more and more obfuscated.</p>

<p>Let's examine. A typical base context class might look like this:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">With_CashMachine_Having_100Dollars</span> <span class="p">{</span>

<span class="na">  [TestFixtureSetUp]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Setup</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">CashMachine</span> <span class="p">=</span> <span class="n">MockRepository</span><span class="p">.</span><span class="n">DynamicMock</span><span class="p">();</span>
    <span class="n">CashMachine</span>
      <span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">CheckBalance</span><span class="p">())</span>
      <span class="p">.</span><span class="n">Return</span><span class="p">(</span><span class="m">100.D</span><span class="n">ollar</span><span class="p">());</span>
  <span class="p">}</span>

  <span class="k">protected</span> <span class="n">ICashMashine</span> <span class="n">CashMachine</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>With the above "context base class", a BDD-style test reads quite expressive:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">When_ATM_Checkout_Request_With_200Dollar_Is_Performed</span>
  <span class="p">:</span> <span class="n">With_CashMachine_Having_100Dollar</span> <span class="p">{</span>

<span class="na">  [Test]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Then_Checkout_Should_Fail_With_CashMashine_Failure</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">atm</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ATM</span><span class="p">(</span><span class="n">CashMashine</span><span class="p">);</span>
    <span class="n">var</span> <span class="n">checkoutResult</span> <span class="p">=</span> <span class="n">atm</span><span class="p">.</span><span class="n">Checkout</span><span class="p">(</span><span class="m">200.D</span><span class="n">ollar</span><span class="p">());</span>
    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">checkoutResult</span><span class="p">.</span><span class="n">Failure</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="n">FailureCode</span><span class="p">.</span><span class="n">CashMashine</span><span class="p">));</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<h3 id="bold-backgrounds">Bold Backgrounds</h3>

<p>Now, the above ATM example is good to serve as fictional example. Nonetheless, reality is complex. Sometimes, it is by far more complex than the above glorified ATM. In every-day use-case-scenarios, a broad set of dependecies play a note in the overall context orchestra. That is, why test context bases start to become a difficult task.</p>

<p>What if the ATM does not only respect the CashMachine, but as well User, Location, Configuration and Time for this particular scenario? How can we construct this broad set of contextual dependencies while keeping up a high readability and maintainability for the tests/specs? A typical approach is to create "the super-context":</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">With_CashMashine_In_Europe_By_Night_Using_Strict_Policies_Having_100Dollar</span> <span class="p">{</span>

<span class="na">  [TestFixtureSetUp]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Setup</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">CashMachine</span> <span class="p">=</span> <span class="n">MockRepository</span><span class="p">.</span><span class="n">DynamicMock</span><span class="p">();</span>
    <span class="n">CashMachine</span>
      <span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">CheckBalance</span><span class="p">())</span>
      <span class="p">.</span><span class="n">Return</span><span class="p">(</span><span class="m">100.D</span><span class="n">ollar</span><span class="p">());</span>

    <span class="n">Location</span> <span class="p">=</span> <span class="n">MockRepository</span><span class="p">.</span><span class="n">DynamicMock</span><span class="p">();</span>
    <span class="n">Location</span>
      <span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">Area</span><span class="p">)</span>
      <span class="p">.</span><span class="n">Return</span><span class="p">(</span><span class="n">ATMDistributionArea</span><span class="p">.</span><span class="n">Europe</span><span class="p">);</span>

    <span class="cm">/* aso. aso. ... </span>
<span class="cm">     * you get the picture, huh? </span>
<span class="cm">     **/</span>    
  <span class="p">}</span>

  <span class="k">protected</span> <span class="n">ICashMashine</span> <span class="n">CashMachine</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="k">protected</span> <span class="n">IATMLocation</span> <span class="n">Location</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="cm">/* ... */</span>
<span class="p">}</span>
</pre></div>

<p>A fair thing, isn't it? Well, apparently the context name (class name) is long. And it's <em>too specific</em>. Whenever one of my contextual members change, the context changes as well. Consequently, a new super-base-context and redundant code for context establishment is required.</p>

<p>Ok. Naturally, there's room for improvement. Obviously, parameterization of values would be a plus. So, let's refactor the values out of the context class:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">With_CashMashine_And_Location_And_DayTime_And_Config</span> <span class="p">{</span>

<span class="na">  [TestFixtureSetUp]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Setup</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">CashMachine</span> <span class="p">=</span> <span class="n">MockRepository</span><span class="p">.</span><span class="n">DynamicMock</span><span class="p">();</span>

    <span class="n">Location</span> <span class="p">=</span> <span class="n">MockRepository</span><span class="p">.</span><span class="n">DynamicMock</span><span class="p">();</span>
    <span class="n">Location</span>
      <span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">Area</span><span class="p">)</span>
      <span class="p">.</span><span class="n">Return</span><span class="p">(</span><span class="n">ATMDistributionArea</span><span class="p">.</span><span class="n">Europe</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">protected</span> <span class="n">ICashMashine</span> <span class="nf">GetCashMachine</span><span class="p">(</span><span class="kt">int</span> <span class="n">balance</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">CashMashine</span><span class="p">.</span><span class="n">BackToRecord</span><span class="p">();</span>
    <span class="n">CashMachine</span>
      <span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">CheckBalance</span><span class="p">())</span>
      <span class="p">.</span><span class="n">Return</span><span class="p">(</span><span class="n">balance</span><span class="p">.</span><span class="n">Dollar</span><span class="p">());</span>
    <span class="n">CashMashine</span><span class="p">.</span><span class="n">Replay</span><span class="p">();</span>
  <span class="p">}</span>

  <span class="k">protected</span> <span class="n">IATMLocation</span> <span class="nf">GetLocation</span><span class="p">(</span><span class="n">ATMDistributionArea</span> <span class="n">area</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">Location</span><span class="p">.</span><span class="n">BackToRecord</span><span class="p">();</span>
    <span class="n">Location</span>
      <span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">Area</span><span class="p">)</span>
      <span class="p">.</span><span class="n">Return</span><span class="p">(</span><span class="n">area</span><span class="p">);</span>
    <span class="n">Location</span><span class="p">.</span><span class="n">Replay</span><span class="p">();</span>
  <span class="p">}</span>

  <span class="cm">/* etc. ... etc. ... */</span>
<span class="p">}</span>
</pre></div>

<p>Parameterization relaxes contextual strictness while giving back flexibility (and responsibility) to the fixture class. Granted, it might sound a bit picky. It is however a big difference when your test suite is large. With the parametrized context base class from above, a fixture might look like this one:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">When_ATM_Checkout_Request_With_200Dollar_Is_Performed</span>
  <span class="p">:</span> <span class="n">With_CashMashine_And_Location_And_DayTime_And_Config</span> <span class="p">{</span>

  <span class="k">private</span> <span class="k">static</span> <span class="k">readonly</span> <span class="n">ICashMashine</span> 
    <span class="n">cashMachine</span> <span class="p">=</span> <span class="n">GetCashMashine</span><span class="p">(</span><span class="m">100.D</span><span class="n">ollar</span><span class="p">());</span>

  <span class="k">private</span> <span class="k">static</span> <span class="k">readonly</span> <span class="n">IATMLocation</span>
    <span class="n">location</span> <span class="p">=</span> <span class="n">GetLocation</span><span class="p">(</span><span class="n">ATMDistributionArea</span><span class="p">.</span><span class="n">Europe</span><span class="p">);</span>

  <span class="cm">/* ... aso... aso... </span>
<span class="cm">   * side note: i could have done this</span>
<span class="cm">   * in a method/constructor as well.</span>
<span class="cm">   **/</span>

<span class="na">  [Test]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Then_Checkout_Should_Fail_With_CashMashine_Failure</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">atm</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ATM</span><span class="p">(</span><span class="n">cashMashine</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">daytime</span><span class="p">,</span> <span class="n">config</span><span class="p">);</span>
    <span class="n">var</span> <span class="n">checkoutResult</span> <span class="p">=</span> <span class="n">atm</span><span class="p">.</span><span class="n">Checkout</span><span class="p">(</span><span class="m">200.D</span><span class="n">ollars</span><span class="p">();</span>
    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">checkoutResult</span><span class="p">.</span><span class="n">Failure</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="n">FailureCode</span><span class="p">.</span><span class="n">CashMashine</span><span class="p">));</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Obviously, this approach is a bit better in terms of flexibility and reduced redundancy. But it's not all shine, there's shadow as well. Now what if the context being composed is dynamic? That is, when a valid context can be made of a variety components and combinations, you end up building base context classes for all combinations. In our trivial ATM example, quite a few context classes for CashMashine, Location and Config may be required.</p>

<h3 id="composing-contexts-with-mixins">Composing Contexts With Mixins</h3>

<p>As mentioned before, this should not be a big issue when you're in a TDD field. With TDD and adequate regard to SOLID principles, you rarely end up with overly complex contexts. In contrast, when tackling a brown-field and trying to get is covered, you often have complex component interdependencies to tackle.</p>

<p>A (not so common) pattern for composition is to use <a href="http://en.wikipedia.org/wiki/Mixin">Mixins</a>. Mixins have a notion to me of being somewhat like a poor mans <a href="http://en.wikipedia.org/wiki/Multiple_inheritance">multiple inheritance</a>. I won't to open pandora's box here and discuss the multiple inheritance religions. So let's just stick with the fact that C# does not support multiple inheritance. </p>

<p>One of the simple - if not the easiest - mixin implementations in <a href="mehrfachvererbung-in-c.html">C# is to use extension methods over interfaces</a>. It's easy and yet quite manageable. I've been using this type of mixins for quite a long time now in different scenarios and it feels quite intuitive. Let's see how a mixin composed test might actually look like:</p>

<div class="codehilite"><pre><span class="na">[TestFixture]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">When_Requesting_Checkout_Of_200Dollar</span> <span class="p">:</span> <span class="n">Using_ATM</span>
  <span class="p">,</span> <span class="n">With_CashMashine</span><span class="p">.</span><span class="n">In_Context</span>
  <span class="p">,</span> <span class="n">With_Location_Europe</span><span class="p">.</span><span class="n">In_Context</span> <span class="p">{</span>

<span class="na">  [Test]</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Then_Checkout_Request_Is_Denied</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Having</span><span class="p">.</span><span class="n">A_CashMashine_With_Balance_Of</span><span class="p">(</span><span class="m">100.D</span><span class="n">ollar</span><span class="p">());</span>
    <span class="n">Having</span><span class="p">.</span><span class="n">A_European_Location</span><span class="p">();</span>

    <span class="n">Assert</span><span class="p">.</span><span class="n">False</span><span class="p">(</span><span class="n">The</span><span class="p">().</span><span class="n">CanCheckout</span><span class="p">(</span><span class="m">200.D</span><span class="n">ollar</span><span class="p">()));</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>This actually reads pretty straight-forward, at least. I'm sure you already spotted the trick in the first lines of class declaration. And you're right: <code>With_CashMashine</code> is a class containing the interface <code>In_Context</code>. This is the binding for our little mixin fun. The rest of the game is just sugar. A glimpse on how the context is being defined reveals the mixin trick:</p>

<div class="codehilite"><pre><span class="cm">/* traditional base context class with sut */</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">Using_ATM</span> <span class="p">:</span> <span class="n">In_Tests</span><span class="p">.</span><span class="n">As_Subject</span> <span class="p">{}</span>

<span class="cm">/* context component */</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">With_CashMashine</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">interface</span> <span class="n">In_Context</span> <span class="p">:</span> <span class="n">In_Tests</span><span class="p">.</span><span class="n">As_Context</span> <span class="p">{</span> <span class="p">}</span>

  <span class="k">public</span> <span class="k">static</span> <span class="n">In_Tests</span><span class="p">.</span><span class="n">As_Subject</span> <span class="n">A_CashMashine_With_Balance_Of</span><span class="p">(</span><span class="k">this</span> <span class="n">In_Tests</span><span class="p">.</span><span class="n">As_Subject</span> <span class="n">subject</span><span class="p">,</span> <span class="n">Amount</span> <span class="n">amount</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">ICashMashine</span> <span class="n">cashmashine</span> <span class="p">=</span> <span class="n">MockRepository</span><span class="p">.</span><span class="n">DynamicMock</span><span class="p">();</span>
    <span class="n">cashmashine</span><span class="p">.</span><span class="n">Stub</span><span class="p">(</span><span class="n">m</span> <span class="p">=&gt;</span> <span class="n">m</span><span class="p">.</span><span class="n">Balance</span><span class="p">).</span><span class="n">Return</span><span class="p">(</span><span class="n">amount</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">subject</span><span class="p">.</span><span class="n">WithContext</span><span class="p">(</span><span class="n">cashmashine</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="cm">/* poor man&#39;s context composition &quot;framework&quot; */</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">In_Tests</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">interface</span> <span class="n">As_Context</span> <span class="p">{</span> <span class="p">}</span>

  <span class="k">public</span> <span class="k">interface</span> <span class="n">As_Subject</span> <span class="p">{</span>
    <span class="n">As_Subject</span> <span class="nf">WithContext</span><span class="p">(</span><span class="n">T</span> <span class="n">context</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">class</span> <span class="nc">As_Subject</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="p">:</span> <span class="n">As_Subject</span> <span class="p">{</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">IKernel</span> <span class="n">_kernel</span> <span class="p">=</span> <span class="k">new</span> <span class="n">StandardKernel</span><span class="p">();</span>

    <span class="k">public</span> <span class="n">T</span> <span class="nf">The</span><span class="p">()</span> <span class="p">{</span>
      <span class="k">return</span> <span class="n">_kernel</span><span class="p">.</span><span class="n">Get</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;();</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="n">As_Subject</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">WithContext</span><span class="p">(</span><span class="n">T</span> <span class="n">context</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">_kernel</span><span class="p">.</span><span class="n">Bind</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;().</span><span class="n">ToConstant</span><span class="p">(</span><span class="n">context</span><span class="p">);</span>
      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">protected</span> <span class="n">As_Subject</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">Having</span> <span class="p">{</span> <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Most of the neaty mixin weaving is done through the extension method, which in turn uses the context base class for context establishment (the <code>WithContext</code> call). There's no great magic in the context base class <code>As_Subject</code> itself. It uses an IoC-Container to collect all puzzle items and finally lay them out using the <code>The</code> syntactical sugar method. C'est ca.</p>

<h3 id="mix-it-baby">Mix it, baby ?!?</h3>

<p>Fine, so we mixed our context, tests are looking good and can be read (and understood) easily. Does this mean that this is the way to do test context composition?</p>

<p>Straight Answer: <em>No</em>.</p>

<p>Sometimes, <em>it might be helpful</em>, yes. However, in TDD development it most likely won't be of a great benefit. I always felt a good pay-off when I used this pattern in brown-field safari. For plain development, this slightly sophisticated kind of context establishment felt too heavy for me. Obviously, there's a maintenance and controllability issue with this approach. That said, I haven't seen the usage of mixins in context establishment anywhere else, which in turn is the primary reason I wanted to share this pattern with you. </p>

<p>Conclusion: Mixins as test context composition strategy can be beneficial, if used wisely and rarely. It can be a good interim stage method to get existing systems under test.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Get-Help for Custom Scripts in Powershell </title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/get-help-for-custom-scripts-in-powershell.html"/>
            <updated>2011-01-24T09:21:52Z</updated>
            <published>2011-01-24T09:21:52Z</published>
            <id>/get-help-for-custom-scripts-in-powershell.html</id>
            
            <content type="html"><![CDATA[
                <p>Recently, I coded some Powershell scripts for common tasks. No sophisticated stuff, just the typical automation you do when repetition starts to hurt you. I'm just a lazy <code>Consolero</code>, by the way.</p>

<p>After having finished my most needed commands within a brand new Posh2-style custom module, I decided to donate my commands support for the built-in <a href="http://technet.microsoft.com/en-us/library/ee176848.aspx"><code>Get-Help</code></a> command. It turned out to be extremely easy. The key success factor here is a nice little feature called <a href="http://technet.microsoft.com/en-us/library/dd819489.aspx">Comment-Based-Help</a> (aka. "AutoHelp").</p>

<p>With this feature, you can document your commands inline within your script files. The syntax is easy and it helps you to always have an up-to-date documentation of your custom scripts. You may consult built-in documentation by invoking</p>

<div class="codehilite"><pre><span class="go">PS&gt; get-help about_comment_based_help</span>
</pre></div>

<p>Besides, <a href="http://tfl09.blogspot.com/2008/12/powershell-ctp3-autohelp.html">this blog</a> describes the autohelp feature quite well, too.</p>

<div class="codehilite"><pre><span class="go">&lt;#</span>
<span class="go">One side note: while researching about autohelp, </span>
<span class="go">I just learned that the syntax for Powershell 2.0 </span>
<span class="go">[block (or multiline) comments][ps_blockcomments].</span>

<span class="go">Nice, isn&#39;t it?</span>
<span class="gp">#</span>&gt;
</pre></div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Build Pipelines and CI Feedback</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/build-pipelines-and-ci-feedback.html"/>
            <updated>2011-01-13T21:51:28Z</updated>
            <published>2011-01-13T21:51:28Z</published>
            <id>/build-pipelines-and-ci-feedback.html</id>
            
            <content type="html"><![CDATA[
                <p>Yeah well, sometimes, a developer's life is not that easy. Especially when your CI-Build is slow. If it's as slow as a coffee-break, most of us think of it as "acceptable" speed. If it's as half an hour, most developers feel "a pain" somewhere - wherever that might be - when they commit. However, if your build frequency is trying to catch up the hourly ringing bells of Big Ben, then you're pretty cautious about what to check-in or not.</p>

<h3 id="theres-nothing-wrong-here">There's nothing wrong here</h3>

<p>First off, when a CI-Build gets remarkably slower over time, some people think that something is wrong. As a fact, the contrary is the case. You should really revisit your CI-Build, Tests and Installations when the build does not "grow" over time! A growing - and slowing - build is basically a good thing. It means that your software is growing. Your features, specs, tests and regressions should be growing then, too.</p>

<p>Nonetheless, slow processes (and builds) hinder productivity. This is especially the case for a CI Build. The centralized character of a CI Build makes it a potential bottleneck as well. A CI Build is like the center of a shopping mall where all consumers go by and meet. Literally everybody is there at least once per visit. Just to enter the mall, find directions, meet relatives or wait for appointments. However, whenever you are at the meeting point, you want to leave it (in general). The purpose of the shopping mall visit is most often to buy something in a shop, isn't it?</p>

<h3 id="snailistic-scenery">Snailistic Scenery</h3>

<p>The same applies for a CI Build. You need it. It's the meeting point of your code where the software "gets done". However, you (as a developer of a feature) don't want to spend much time with "meetings". You just want to do "your thing". That is, getting the feature done with serious coding. Just as simple as that.</p>

<p>Now, suppose you did everything right. First, your build was freaking fast. Then you hacked the keys out of the board and delivered tons of features. Of course, you're a pro and hence you don't miss to have executable specs, unit tests and automated installers. Now, your build is that slow that an extensive lunch is not enough to get a green bulb on a build. Darn! What's next?</p>

<h3 id="works-verifies-runs">Works, Verifies, Runs!</h3>

<p>The answer is simple, yet effective: Partitioning! In order to keep the CI-Build fast, you split the work being done in your Build into distinct parts. "Hey, cheating!" I hear you yellin' at me. No, it's not cheating. It's just focussing on the most important things for your individual project.</p>

<p>A CI Build is there for a reason. One of the most important reasons is to give you feedback. Feedback that you work actually is ok. Feedback that your stuff works with all the other neaty things of your software. Feedback that in the end your customer will be happy because everything just simply runs. For you - the software engineer - a smart and fast feedback cycle is crucial, since you want to safely progress in your development. This is why we all want a fast CI Build at the end of the day.</p>

<p>Recently, I thought about a common pattern on how a build can be staged effectively, yet providing good feedback value. The feed-backing mechanisms came to my mind and I decided in trying to partition a CI Build by aligning them to the feedback responsibilities a CI Build has. My take: 3 easy steps. It Works! It Verifies! It Runs!</p>

<p><img alt="Staged Build: Works, Verifies, Runs" src="/media/images/Staged-Build.jpg" /></p>

<p><strong>It's Working!</strong>
The first stage is (almost) immediate response to the question: Does it actually work? Common tasks in such a "Commit Build" are: Compile, Unit Tests (focused on business/problem domain).</p>

<p><strong>It's Verified!</strong>
The second stage deals with the almighty completeness and correctness aspects. It's basically what the "Integration" of CI and tries to give a detailed answer for the question: Is it verified to be correct &amp; complete? Tasks in here are typically more sophisticated Unit Tests, Integration Tests, Database Tests, Code Coverage, Code Analysis, Dependency Analysis.</p>

<p><strong>It's Running!</strong>
The final stage is the polishing side of your software product. In the end, your product should not only be fine. It should be ready to use and ready to amaze your customer. Yes, it needs to run, isn't it? Therefore, this final step will most probably contain lengthy and finishing tasks: Automated Regression Tests, Documentation Generation and Assembly, Localization, Data Integrity and Sanity Checks, Setup &amp; Install.</p>

<p>For me, this quite looks like a simple, yet effective guideline strategy for a build pipeline. <em>Works, Verifies, Runs!</em></p>

<p>Feedback &amp; comments appreciated!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Distanz ist Widerstand</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/distanz-ist-widerstand.html"/>
            <updated>2011-01-10T23:22:31Z</updated>
            <published>2011-01-10T23:22:31Z</published>
            <id>/distanz-ist-widerstand.html</id>
            
            <content type="html"><![CDATA[
                <p>Distanz ist Widerstand. Widerstand gegen Veränderung. Im richtigen Leben wie auch in der Software-Entwicklung. Und das mit dem Widerstand meine ich durchaus im wörtlich-physikalischen Sinne. Ich möchte jetzt keine Formeln ableiten, denn dazu wäre ich bei Weitem nicht im Stande. Aber so aus dem Gefühl heraus ist die Korrelation von Distanz zu Widerstand mindestens linear. In einfachen Worten: Je länger die Distanz, umso höher der Widerstand gegen Veränderung.</p>

<h3 id="veranderung-ist-ein-katalysator">Veränderung ist ein Katalysator</h3>

<p>Die Agilisten wissen was ich meine. Ohne Veränderung geht garnichts. Keine Verschlechterung, keine Verbesserung, keine Erkenntnis. Gerade deswegen hört man ja auch in immer mehr Software-Unternehmen im Flur die Selbstmotivationsformel der Agilisten: <strong>"Embrace Change!"</strong></p>

<p>Toll gesagt. Aber wie soll man denn etwas ändern, wenn man seine Kollegen, den Chef, oder den Kunden nicht in Reichweite hat? Natürlich lässt sich etwas ändern. Emails schreiben, Konzepte entwerfen, den Tischnachbarn mit "neuen Ideen" indoktrinieren.</p>

<p>Ja, ein enthusiastischer Software-Entwickler würde das alles wohl tun. Doch der Wirkungsgrad seines Tuns ist eben abhängig von Distanz. Ein Beispiel: der <a href="http://manifesto.softwarecraftsmanship.org">Software-Craftsman</a> von eben hat eine Idee: <a href="http://de.wikipedia.org/wiki/Paarprogrammierung">Pair Programming</a>. Er probiert es mit seinem Kollegen und Kumpel aus, den er nach 2-3 Sessions schon durch den Know-How-Austausch überzeugen konnte. Wäre z.B. sein Team-Lead oder Produkt-Manager <em>(Anmerkung: ich sag' jetzt mal absichtlich nicht Product Owner)</em> im gleichen Raum, dann wäre der Wirkungsgrad ein anderer als wenn der Vorschlag dem Team-Lead über die wöchentlichen Email-Reports oder Telefon-Schaltung unterbreitet wird. <a href="/raumliche-nahe-wird-unterschatzt.html">Räumliche Nähe wird leider oft unterschätzt</a>.</p>

<h3 id="lange-rede-kurze-wege">Lange Rede, Kurze Wege</h3>

<p>Bevor es jetzt für den einen oder anderen zu philosophisch oder theoriegetrieben wird: Diese methodisch-prozessgetriebene Sichtweise ist nicht alles. Widerstand gegen Veränderung gibt es auch im täglichen, ganz und gar praktischen Sinn. Ein wunderbares Beispiel ist da das Programmieren selbst.</p>

<p>Bei der Software-Entwicklung geht es ja nicht nur um Code in "Programmiersprache" produzieren. Man kodiert auch andere Dinge. Man entwickelt und designed Modelle, man dokumentiert Anforderungen, Szenarien, Ausnahmefälle und Entscheidungen. Man entwickelt Tests für Anforderung, Verifikation und Design. Das und noch einiges mehr macht man "eben so nebenbei". Doch wo und wie?</p>

<p>Was ich damit meine ist schlichtweg das Medium, die Mittel und Methoden, mit denen man Artefakte schafft. So z.B. bei Tests. Ich bin (wohl einer der wenigen) Freunde von sog. "Near-Specs", also <a href="/unit-tests-sind-immer-dabei.html">Unit-Tests, die so nah wie möglich am SUT</a> sind. Sei es aus physikalischer, logischer oder virtueller Sicht. Der Grund ist für mich einleuchtend: Je weniger Distanz ich zwischen Test &amp; Implementierung zu überbrücken habe, umso frequentiver ändere ich auch.</p>

<p>Das ist sowohl beim TDD als auch in der Wartung der Fall. Beim TDD ist meine Erfahrung, dass man "einfach mehr refaktorisiert" - insbesondere die Tests selbst. Beim Revisit ist es oft so, dass man strukturelle Änderungen (z.B. Klasse aufteilen, Vererbung einführen) wesentlich zügiger und "schmerzfreier" durchführen kann. Aus dieser Erfahrung heraus ist für mich die Nähe der Tests ein großer Vorteil.</p>

<h3 id="aus-den-augen-aus-dem-sinn">Aus den Augen, aus dem Sinn ?!?</h3>

<p>Schlußendlich dreht sich für mich als Entwickler bei Fragen Rund um den "Ort" von Artefakten um das Thema der "allgemeinen Erwartung" und Erreichbarkeit. Ein schönes Beispiel ist die Design- und Konzeptdokumentation. Ich frage mich dann meist selbst: </p>

<p>Wo (im Gesamtprojekt) würde ich die Dokumentation zu dem Konzept erwarten? Wo (und unter welchen Szenarien) würde die Dokumentation am meisten angewendet werden (also geändert und gelesen werden)? Wo wäre für mich ein plausibler, einfach zu erkennender Einstiegspunkt für die Dokumentation?</p>

<p>Oft kommen bei unterschiedlichen Projekten ähnliche Antworten heraus. Eine allgemeingültige Antwort habe ich für mich jedoch nicht gefunden. Doch bei allen Antworten spielt die Minimierung der Distanz von Artefakten eine bedeutende Rolle. </p>

<p>Grund: <em>Distanz ist Widerstand gegen Veränderung.</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Mehrfachvererbung in C#</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/mehrfachvererbung-in-c.html"/>
            <updated>2010-12-31T14:18:34Z</updated>
            <published>2010-12-31T14:18:34Z</published>
            <id>/mehrfachvererbung-in-c.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1210">Notizen eines Nerds 12'10</h4>

<p>Ein zweischneidiges Schwert, diese Mehrfachvererbung. Sie ist selten, aber dennoch allgegenwärtig. In der objektorientierten Modellierung wird sie in der Praxis eher gemieden - berechtigt, wie ich meine. Dennoch gibt es Situationen, in denen eine Mehrfachvererbung sinnvoll sein kann. Abgesehen davon ist es für mich interessant und hilfreich gleichermaßen, mich mal wieder mit den grundlegenden Konzepten der Mehrfachvererbung auseinanderzusetzen. </p>

<p>Angeregt durch eine Session, Unterhaltungen und Erklärungen von Kollegen, habe ich mich in jüngster Zeit mit folgender Frage beschäftigt: Wie kann ich "am einfachsten" Mehrfachvererbung in C# erreichen? </p>

<p>Meine derzeitige Antwort: <em>Mixins als Extension-Methods auf Interfaces</em>.</p>

<p><img alt="Session-Notizen zur Mehrfachvererbung" src="/media/images/multiple_inheritance.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Sketching &amp; Prototyping</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/sketching-prototyping.html"/>
            <updated>2010-12-31T14:17:54Z</updated>
            <published>2010-12-31T14:17:54Z</published>
            <id>/sketching-prototyping.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1011">Notizen eines Nerds 10'11</h4>

<p>Vielleicht ist es dem einen oder anderen in diesem Jahr aufgefallen, dass ich nicht ganz zufrieden mit dem Design meiner Website war. Mittlerweile habe ich ja meine Website etwas umgestaltet. </p>

<p>Der erste Schritt ist sozusagen getan, aber es werden wohl noch einige weitere folgen. Doch vor dem eigentlichen Umbau zum Redesign habe ich einige Aufgaben vorangestellt. Schließlich ist es meine erste "vollständig eigene" Gestaltung meiner Website. Kein 4711-Wordpress-Theme oder HTML-Template-Kram, sondern etwas vollkommen eigenes. </p>

<p>Mir war es besonders wichtig, beim Design eine klare Kommunikationsstrategie zu verfolgen. Dazu habe ich einige Seiten geschrieben und etliche (nunja, mehr als ein Dutzend) Prototypen herausgearbeitet. Die Kernaussage und das gestalterische Fundament habe ich in ein paar ruhigeren Abendstunden notiert und skizziert. Fazit: Es gibt noch viel zu tun.</p>

<p><img alt="Sketching A Website" src="/media/images/web_prototype.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Large Scale Build &amp; Deploy Management</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/large-scale-build-deploy-management.html"/>
            <updated>2010-12-31T14:17:17Z</updated>
            <published>2010-12-31T14:17:17Z</published>
            <id>/large-scale-build-deploy-management.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-1010">Notizen eines Nerds 10'10</h4>

<p>Mitten im Sommer gab es dieses Jahr bei mir nicht nur heiße Tage, sondern auch heiße Themen. Eines dieser Themen war ein Klassiker des "Application Lifecycle Managements": Der Build- &amp; Deploy-Prozess. Wer mich kennt weiß dass mir das Thema nicht gänzlich unbekannt ist.</p>

<p>Interessant bei der diesjährigen Herausforderung war nicht nur die Skalierung im Enterprise-Umfeld (und alle damit einhergehenden Methoden &amp; Prozesse), sondern die Stärkung des gesamten Build- &amp; Deploy-Managements. Zur Vorbereitung einer Session mit Entwicklern und Verantwortlichen habe ich die 4 grundlegenden Schritte des Build &amp; Deploy skizziert. </p>

<p>Natürlich mit den gängigen Konzepten des <em>Stagings</em> aus der Verifikation, der <em>Phasen</em> aus dem Softwarebau, der <em>Konfiguration</em> aus dem Konfigurationsmanagement und zu guter Letzt den 4 dazugehörigen agilen <em>Methoden</em>.</p>

<p><img alt="Agile Build Management" src="/media/images/agile_build_scm.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Some fresh stuff to learn</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/some-fresh-stuff-to-learn.html"/>
            <updated>2010-12-31T14:16:35Z</updated>
            <published>2010-12-31T14:16:35Z</published>
            <id>/some-fresh-stuff-to-learn.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-109">Notizen eines Nerds 10'9</h4>

<p>Lernen ist eines der wichtigsten Dinge in meinem Leben. Ich lerne gerne, allerdings leider viel zu wenig. Das ist wohl auch die einzig plausible Begründung, warum ich nicht allzu viele Dinge beherrsche. Doch das ist für mich nur noch ein Grund mehr, mich mit neuen Dingen auseinanderzusetzen, die mich interessieren oder aber mir weiterhelfen können. </p>

<p>Ab und zu - meistens in ein paar ruhigen Minuten - reflektiere ich für mich und schreibe mir ein paar Notizen zusammen, was ich als nächstes lernen oder ausprobieren möchte. Man braucht halt immer wieder "some fresh stuff to learn".</p>

<p><img alt="Some fresh stuff to learn" src="/media/images/fresh_learning.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Quizfrage</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/quizfrage.html"/>
            <updated>2010-12-31T14:15:52Z</updated>
            <published>2010-12-31T14:15:52Z</published>
            <id>/quizfrage.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-108">Notizen eines Nerds 10'8</h4>

<p>Im Entwicklungs-Alltag findet man sich immer wieder einmal in ungewöhnlichen Situationen wieder. Das ist ja auch ein wenig das spannende an dem Job, oder nicht? Als ich mich mit einer (von vielen) SQL-Server 2008-Datenbank auseinandersetzen durfte, begegnete mir bei der Analyse ein kurioses (automatisch generiertes) ER-Diagramm. </p>

<p>Alle Tabellen (ca. 200) waren einfach in Reihe aufgestellt, es gab nicht eine einzige Relation! Daraus konnte ich natürlich sofort einiges ableiten. Kurios war es dennoch. Grund genug für mich, aus dieser Situation eine kleine Geeky-Quizfrage herauszuarbeiten.</p>

<p><img alt="Quizfrage ;-)" src="/media/images/quiz_dbm.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Interview mit einem Product Owner</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/interview-mit-einem-product-owner.html"/>
            <updated>2010-12-31T14:14:42Z</updated>
            <published>2010-12-31T14:14:42Z</published>
            <id>/interview-mit-einem-product-owner.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-107">Notizen eines Nerds 10'7</h4>

<p>Als Agilist hat man es manchmal nicht einfach. Man wird von Zeit zu Zeit auch mit anderen Strukturen, Prozessen und Organisationen konfrontiert. </p>

<p>Ich kenne einige "agile Manager", die in solchen Situationen den "agilen Weg" propagieren und die ihnen entgegneten Methoden mißachten. </p>

<p>Meiner Meinung nach ist das kein guter Umgang. Weder auf der methodischen noch auf der menschlichen Ebene. Jede aufrichtige, enthusiastische, zielgerichtete und wertbringende Arbeit zu einem Projekt hat Respekt verdient. Von wem oder wie auch immer sie entsteht. Nichtsdestotrotz gibt es Möglichkeiten, agile Methoden und Vorgehensweisen in bestehende Prozesse "einzuweben". </p>

<p>Bei einem "Kick-Off-Meeting" mit offizieller "Übergabe der Projektaufgaben" (vgl. Scrum: Initial Product Backlog) habe ich mit dem "fachlichen Projektleiter" (vgl. Scrum: Product Owner) die Vision, Ziele und Prioritäten des Projektes aufgearbeitet. </p>

<p>Während des gesamten Tages fielen nicht ein einziges Mal die Worte "Scrum", "agil", "RUP", "CMMI", "Prozess" oder ähnliches. Und das war auch gut so. Wir haben gearbeitet. Gemeinsam.</p>

<p><img alt="Interview mit einem Product Owner" src="/media/images/po_interview.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">TDD Boundary Curve</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tdd-boundary-curve.html"/>
            <updated>2010-12-31T14:12:56Z</updated>
            <published>2010-12-31T14:12:56Z</published>
            <id>/tdd-boundary-curve.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-106">Notizen eines Nerds 10'6</h4>

<p>Die Grenzen des Nutzens und der Anwendung von TDD. Ein unter "TDD-Enthusiasten" heiß diskutiertes Thema. Doch auch Kritiker springen gerne auf diesen thematischen Zug auf, um TDD als "schwach" und "konzeptarm" darzustellen. </p>

<p>Das ist mir einerlei. Ich mache mir meine eigenen Gedanken. Ich reflektiere gegen meine eigenen Erfahrungen als auch gegen die Meinung anderer. </p>

<p>An einem ruhigen Abend habe ich mir (nach einer Code Kata) noch einmal Gedanken darüber gemacht und mir selbst die Frage gestellt: Wann machst Du TDD, wann nicht? Wie kannst Du den Profit und den Nutzen von TDD darstellen? Herausgekommen ist dabei die "TDD Boundary Curve"-Skizze.</p>

<p><img alt="TDD Boundary Curve" src="/media/images/tdd_boundary.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Anwendungsarchitektur am Reißbrett</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/anwendungsarchitektur-am-reisbrett.html"/>
            <updated>2010-12-31T14:11:32Z</updated>
            <published>2010-12-31T14:11:32Z</published>
            <id>/anwendungsarchitektur-am-reisbrett.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-105">Notizen eines Nerds 10'5</h4>

<p>Architekten sind als Theoretiker verschrien. Leider. Es gibt ja leider auch genug "Architekten", die nichts anderes machen, außer sich verbal in Ihren eigenen Gedankenergüssen zu wälzen, während sie schaustellerisch Ihre Kompetenz in Phrasen und Diagrammen der niederen Entwicklergemeinde vortragen. </p>

<p>Schade. Denn im Grunde genommen ist ein Architekt (als Rolle als auch als Position) etwas sehr praktisches, pragmatisches und versatiles. Es gibt den Architekt, der nachdenkt, der erklärt, der programmiert, der gestaltet, der testet, der spezifiziert, der dokumentiert, der lehrt - und vor allem - der lernt.</p>

<p><img alt="Skizzen einer Anwendungsarchitektur" src="/media/images/sketch_architecture.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Fokus &amp; Ziele</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/fokus-ziele.html"/>
            <updated>2010-12-31T14:05:22Z</updated>
            <published>2010-12-31T14:05:22Z</published>
            <id>/fokus-ziele.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-104">Notizen eines Nerds 10'4</h4>

<p>Ich hatte es schon vor ein paar Jahren einmal gebloggt: Ziele sollten <a href="/smarte-ziele.html">SMART</a> sein. Wann immer man sich neu orientiert, neuen Aufgaben widmet oder sich Gedanken über seine Ziele macht, hilft einem die "smarte" Vorgehensweise weiter. So auch bei mir.</p>

<p><img alt="SMARTE Ziele" src="/media/images/smart.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Lambda Kalkül und Funktionszeremonie</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/lambda-kalkul-und-funktionszeremonie.html"/>
            <updated>2010-12-31T14:01:17Z</updated>
            <published>2010-12-31T14:01:17Z</published>
            <id>/lambda-kalkul-und-funktionszeremonie.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-103">Notizen eines Nerds 10'3</h4>

<p>Natürlich haben wir in dem schon <a href="tdd-vs-bdd.html">vormals erwähnten F#-Buchklub</a> nicht nur esoterische Diskussionen über Methoden in der Software-Entwicklung gehabt, sondern es ging natürlich auch um F# und funktionale Programmierung an sich. </p>

<p>Ich gestehe gerne, dass ich wohl der schlechteste in unserer Gruppe war. Leider konnte ich nur die ersten Male wirklich bei dem Buchklub mit dabei sein. </p>

<p>Dennoch war es für mich eine Freude mich mit den "Three Funkies" auszutauschen. In der Vorbereitung zu einer Session über die allgemeine funktionale Programmierung habe ich mir Notizen zum Lambda-Kalkül gemacht, welche ich aus dem besagten Buch "<a href="http://www.amazon.de/Real-World-Functional-Programming-Examples/dp/1933988924">Real World Functional Programming</a>" entnommen habe.</p>

<p><img alt="Lamda Notes" src="/media/images/lambda_book_notes.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">BDD Erfahrung &amp; Meinungen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/bdd-erfahrung-meinungen.html"/>
            <updated>2010-12-31T13:56:45Z</updated>
            <published>2010-12-31T13:56:45Z</published>
            <id>/bdd-erfahrung-meinungen.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-102">Notizen eines Nerds 10'2</h4>

<p>Einen Versuch zur Beantwortung der Frage "Ist BDD das bessere TDD?" haben wir noch am selben Abend unternommen. Auch hier habe ich die Antworten von Simon, Björn und Christian festgehalten. 
Den Eindruck, den wir alle gemeinsam über Korrelationen mit anderen Prinzipien gesehen haben, habe ich in einer Skizze aufgezeichnet.</p>

<p><img alt="BDD Opinions" src="/media/images/bdd_opinions.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">TDD vs. BDD</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tdd-vs-bdd.html"/>
            <updated>2010-12-31T13:52:39Z</updated>
            <published>2010-12-31T13:52:39Z</published>
            <id>/tdd-vs-bdd.html</id>
            
            <content type="html"><![CDATA[
                <h4 id="notizen-eines-nerds-101">Notizen eines Nerds 10'1</h4>

<p>Am Rande der ersten Session des F#-Buch-Clubs von <a href="http://twitter.com/simonhoh">@SimonHoh</a>, <a href="http://www.twitter.com/bjoernrochel">@BjoernRochel</a> und <a href="http://twitter.com/cdeger">@cdeger</a> (aka #sbcandabook) gab es eine wunderbare Diskussion über das "leidige Thema" TDD vs. BDD. Ich habe mehrheitlich die Argumente für TDD beigesteuert, während Björn die BDD-Sicht näher schilderte. </p>

<p>Während der Diskussion habe ich einige Stichpunkte zu beiden Vorgehensweisen gemacht und gleichzeitig meinen ersten Eindruck aus dem Gespräch skizziert. Nach einer knappen halben Stunde wurde die mächtige Frage "Ist BDD das bessere TDD?" in den Raum geworfen.</p>

<p><img alt="TDD vs. BDD" src="/media/images/tdd_vs_bdd.jpg" /></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Notizen eines Nerds 2010</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/notizen-eines-nerds-2010.html"/>
            <updated>2010-12-31T13:51:09Z</updated>
            <published>2010-12-31T13:51:09Z</published>
            <id>/notizen-eines-nerds-2010.html</id>
            
            <content type="html"><![CDATA[
                <p>Meine <em>Notizen eines Nerds</em> für 2010. Ein virtuelles Blättern im Notizbuch. Viel Spaß!</p>

<h3 id="notizen-eines-nerds">Notizen eines Nerds</h3>

<ul>
<li><a href="tdd-vs-bdd.html">TDD vs. BDD</a></li>
<li><a href="bdd-erfahrung-meinungen.html">BDD Erfahrungen &amp; Meinungen</a></li>
<li><a href="lambda-kalkul-und-funktionszeremonie.html">Lambda Kalkül und Funktionszeremonie</a></li>
<li><a href="fokus-ziele.html">Fokus &amp; Ziele</a></li>
<li><a href="anwendungsarchitektur-am-reisbrett.html">Anwendungsarchitektur am Reißbrett</a></li>
<li><a href="tdd-boundary-curve.html">TDD Boundary Curve</a></li>
<li><a href="interview-mit-einem-product-owner.html">Interview mit einem Product Owner</a></li>
<li><a href="quizfrage.html">Quizfrage</a></li>
<li><a href="some-fresh-stuff-to-learn.html">Some fresh stuff to learn</a></li>
<li><a href="large-scale-build-deploy-management.html">Large Scale Build &amp; Deploy Management</a></li>
<li><a href="sketching-prototyping.html">Sketching &amp; Prototyping</a></li>
<li><a href="mehrfachvererbung-in-c.html">Mehrfachvererbung in C#</a></li>
</ul>

<h3 id="was-soll-das">Was soll das?</h3>

<p>Ich habe gestern mein kleines Notizblock nochmal durchgeblättert. Eigentlich wollte ich nur kurz etwas nachschauen. Währenddessen ist mir aufgefallen, was ich im Laufe des Jahres alles dort notiert hatte. Da kommt schon einiges an Projektinformationen, Themen und Stichpunkten zusammen. Obwohl das meiste auf Grund der Projektrelevanz eher vertraulich ist, habe ich dennoch ein paar allgemeine Auszüge aus meinem <a href="http://www.moleskine.com">Moleskine</a> abfotografiert.</p>

<p>Ich habe 12 Seiten, die eine etwas andere Art und Weise des Rückblicks auf das Jahr 2010 gewähren. Ich lade euch herzlich ein, in den folgenden Posts mit meinen "Notizen eines Nerds" (oder "Nerd-Notes") Einblicke in Augenblicke und Themen des Jahres zu gewinnen. </p>

<p>Ich verwende Bleistift und Notizblock konsequent erst seit Beginn des Jahres. Es ist eine andere Art des "notierens". Wie ich über Bekannte und Freunde feststellen durfte, verwendet es jeder auf seine eigene Art und Weise. Mir hat mein Block besonders beim reflektieren und nachdenken assistiert. Im Großen und Ganzen bin ich mit meinem Notizblock (und den Notizen darin) ganz zufrieden und werde es weiter verwenden.</p>

<p><strong>Ich wünsche uns allen gemeinsam ein gesundes, frohes, glückliches und erfolgreiches Jahr 2011!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Ubuntu 10.10 on Vaio VPC S12 V9E</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ubuntu-10-10-on-vaio-vpc-s12-v9e.html"/>
            <updated>2010-12-26T16:04:35Z</updated>
            <published>2010-12-26T16:04:35Z</published>
            <id>/ubuntu-10-10-on-vaio-vpc-s12-v9e.html</id>
            
            <content type="html"><![CDATA[
                <p>A few weeks ago I decided to completely opt for Linux and no longer have a dual boot system. </p>

<p>I'm no longer using Windows 7 on native chips for quite some time now. Instead, I'm booting into VM to get my coding tasks done. Second, I need (and want) to have my beloved Visual Studio 2010 when it comes to .NET development. However, despite .NET 3.5/4.0 development, I don't use Windows 7 much at home. Consequently, I moved completely to Ubuntu 10.10 Maverick Merkaat. This post summarizes my installation experience and serves as an installation log.</p>

<h3 id="installation">Installation</h3>

<p>Installation of "Perfect 10" is a no-brainer. <a href="http://www.ubuntu.com/desktop/get-ubuntu/download">Download</a> the ISO image, burn it to disc (or install to <a href="http://www.pendrivelinux.com/">USB</a>), boot. Follow the installation guidelines. Basically it is as easy as NYNF ("Next -&gt; Yes -&gt; Next -&gt; Finish"). Reboot. That's it. </p>

<p>Wait. Really that easy? No, not really. Here the adventure begins...</p>

<p>First of all, after rebooting I have been greeted by a pleasant and polite black screen. It says nothing, it does nothing. A gentle boot. I don't even had the chance to switch to TTY. From that time on, I knew I'll have fun with my video settings. To at least get some visual feedback on what Linux is doing, you need to temporarily modify the boot options in GRUB boot loader.</p>

<h3 id="update-grub-boot-options">Update GRUB boot options</h3>

<p>To get GRUB menu displayed, you may need to hold the <code>[SHIFT]</code> key pressed while booting. Once you're in menu, you need to edit boot settings for the Ubuntu entry by pressing <code>[e]</code>. For kernel options, append <code>nomodeset</code> and <code>i8042.nopnp</code> to the existing ones (most often prior to "quiet splash" or "no-splash" options). </p>

<p><code>nomodeset</code> enables your graphics card, <code>i8042.nopnp</code> brings back touchpad. Once done, press <code>[CTRL-x]</code> to boot. Wait a few seconds and... tadaa! Here it is, the shiny new Maverick Merkaat.</p>

<h3 id="sony-is-linux-friendly-somehow">Sony is Linux-friendly... somehow...</h3>

<p>Positivity: Once booting with <code>nomodeset</code>, one can experience that all major devices are being detected automatically and fully supported. Indeed, Sony is Linux-friendly. Well, at least to the extent that WiFi, Ethernet and Display is working.</p>

<p>After setting up WLAN connection, the first thing is to get package updates and install <a href="http://www.vim.org/">Vim</a>. I wonder why it's not included by default. Anyway. Vim is just a tool in order to get my primary purpose done: persist GRUB boot loader changes. Since Merkaat is based on new GRUB2, changing <code>/etc/default/grub</code> (and a quick <code>sudo update-grub</code>) does the job.</p>

<p>However, after success comes failure. I quickly realized that Ubuntu seems to run with VESA drivers only (sluggish and slow UI updates, smeary display). A quick check revealed it: NVidia drivers are missing. My S12V9E has 310M model built-in, the Sony display is 1366x786 (aka. "Sort-Of-HD-Cineastic-16-9-Size"). The first thing to do is surely to look up on the internet for fellow sufferers. So let's just fire up Firefox. And, open another door to the room of hurdles.</p>

<h3 id="firefox-is-so-slow-on-linux-x64">Firefox is so slow on Linux x64</h3>

<p>It took Firefox about a minute to display <a href="http://google.com">google.com</a>! All subsequent requests were awfully slow! What's happening here? I decided to have a comparison with other browsers and chose <a href="http://projects.gnome.org/epiphany/">Epiphany</a> (<code>sudo apt-get install epiphany-browser</code>). What a surprise! It's lightning-fast! This was evidence enough: Firefox was the culprit.</p>

<p>Getting Firefox to run at reasonable speed took just a few minutes of analysis and research. The cause: <a href="http://www.techairlines.com/2010/10/03/disable-ipv6-on-ubuntu-to-speed-up-browsing/">DNS resolving and IPv6 settings</a>. I personally decided to go for the "quick fix" since only Firefox was affected (at least I only experienced Firefox as being affected only). The fix is rather simple:</p>

<p>Type <code>about:config</code> in Firefox' address bar, confirm to be cautious. Then, just switch <code>network.dns.disableIPv6</code> to <code>true</code> ("toggle value"). Fasten seatbelt and restart Firefox. After getting my internet browsing experience back to normal, I could refocus on my original issue: The graphics driver and video display.</p>

<h3 id="the-restricted-drivers-game-with-nvidia">The restricted drivers game with NVIDIA</h3>

<p>After some halfbaked internet education on Linux and nVidia 310M / Sony pair, I decided <em>to not install</em> the latest driver but the version reported to be working safe: <a href="http://www.nvidia.com/object/linux-display-amd64-256.53-driver.htm">nVidia Linux display driver 256.53</a>. Installation procedure: <code>[CTRL+ALT+F1]</code> for TTY1, <code>sudo service gdm stop</code> to shutdown Xserver, run the driver installation package, answer a few questions and <code>sudo service gdm start</code>.</p>

<p><strong>Attention:</strong> The last question of nVidia driver installation is something like: "Would you like to run nvidia-xconfig and write a new xorg.conf?". Please, make sure that you answer this question with <em>No!</em>.</p>

<p>If you let the installation generate the new <code>xorg.conf</code> and start gdm, you'll most likely enjoy a blank black screen again. The reason for this is a little bug in nVidia's display drivers which needs to be <a href="http://ubuntuforums.org/archive/index.php/t-1578004.html">worked around by explicitly setting the EDID file</a> (through <code>CustomEDID</code> option).</p>

<p>Lucky me that I previously stumbled upon the <a href="http://code.google.com/p/vaio-f11-linux/">Vaio-F11-Linux-Project</a>. The smart guys over there made a nice <a href="http://code.google.com/p/vaio-f11-linux/wiki/NVIDIASetup">nVidia setup wiki page</a> explaining the custom configuration as well as where to find the EDID file. Basically, the same applies for the VPCS12V9E, except that my EDID file was located at <code>/proc/acpi/video/IGPU/LCD0/</code>. As a result, the important parts of my <code>xorg.conf</code> (located at <code>/etc/X11/</code>) looks like this:</p>

<div class="codehilite"><pre>Section &quot;Device&quot;
    Identifier     &quot;Configured Video Device&quot;
    Driver         &quot;nvidia&quot;
    Option         &quot;ConnectedMonitor&quot; &quot;DFP-0&quot;
    Option         &quot;CustomEDID&quot; &quot;DFP-0:/proc/acpi/video/IGPU/LCD0/EDID&quot;
EndSection
</pre></div>

<p>Reboot and finally enjoy a nice and crisp display!</p>

<h3 id="enjoyable-yet-improvable">Enjoyable, yet improvable.</h3>

<p>At this stage, I decided for myself to continue with my setup on application level rather than continuing with hardware support on system level. Although some obvious things like brightness control (and all the other <code>[FN]</code> keys), fingerprint reader and most likely some other things (like external monitors / HDMI) won't work. However, since I'm not really using the devices (yet), it's more of a secondary priority to get them working. Conclusion: Enjoyable, yet improvable.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">LESS Organization</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/less-organization.html"/>
            <updated>2010-12-01T22:59:39Z</updated>
            <published>2010-12-01T22:59:39Z</published>
            <id>/less-organization.html</id>
            
            <content type="html"><![CDATA[
                <p>My blog is based on <a href="http://wordpress.org">Wordpress</a>. Since years now. However, since years, I wasn't really satisfied with even one of the tons of themes you can find for Wordpress. Maybe I'm too picky. Maybe I just wanted to get an opportunity to write a theme by myself. You just look at the (very first alpha) results of my first attempt in writing a Wordpress theme.</p>

<p>But this is just the side-note. Today I just want you to quickly take a glimpse on my <a href="http://lesscss.org/">LESS</a> (Leaner CSS) organization. I've been using LESS now for quite a while and have come to a certain structured organization of my stylesheet. In my opinion, the organization pattern I'd like to share with you is well suited for tiny / small blog or company sites.</p>

<h3 id="uses-standards-units">Uses, Standards, Units</h3>

<p>In almost any recent stylesheet I've done you can find the <code>USU</code> include header, which in turn is my core modularization pattern. I'll usually start off with a few "uses". That is, a LESS file where I define resources of any kind. Usually colors, fonts, a resetter and the like.</p>

<p>This is followed by a couple of "standards". Standards in terms of a visual style are global, site-wide definitions, mostly scoped on tag name specificity only. Good examples for such standards are fonts for headings and anchor link colors.</p>

<p>The third and main part are "units". Units are distinct parts (or elements) on the visual layout of a page. Units might be global scoped (such as header, footer, navigation) or more specific (such as "article", "comments"). For units, I always try to avoid discriminators based on visuals or layout. Instead, I try to follow the functional categorization path.</p>

<p>Within units, everything is defined to get the "unit" (or element) to be displayed as desired. I only omit one single aspect, always: position (and size). The position (or placement) of one or more units is organized in the master style file (the one containing the USU include header), That's it.</p>

<p>The result more or less looks like this:</p>

<div class="codehilite"><pre><span class="k">@import</span> <span class="s2">&quot;use.reset&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;use.960_16&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;use.colors&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;use.types&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;use.images&quot;</span><span class="p">;</span>

<span class="k">@import</span> <span class="s2">&quot;standard.colors&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;standard.types&quot;</span><span class="p">;</span>

<span class="k">@import</span> <span class="s2">&quot;unit.menu&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.logo&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.statistics&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.infopanel&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.article&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.discussion&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.comments&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.notes&quot;</span><span class="p">;</span>
<span class="k">@import</span> <span class="s2">&quot;unit.footer&quot;</span><span class="p">;</span>

<span class="nf">#logo</span> <span class="p">{</span>
  <span class="o">.</span><span class="n">grid</span><span class="err">_</span><span class="m">16</span><span class="p">;</span>
  <span class="k">background-position</span><span class="o">:</span><span class="m">715px</span><span class="p">;</span>
<span class="p">}</span>

<span class="c">/* aso. aso. ... */</span>
</pre></div>

<p>My experience so far with this little organization pattern was quite good. I quickly find what I'm looking for and I'm able to change / reuse significant visual styles easily. The redundancy level, which is a certain concern of LESS productions, is kept reasonably low.</p>

<p>What do you think? And, if you are using LESS as well: How do you organize your LESS styles? Looking forward for your thoughts and comments!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">New York Cheesecake Recipe</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/new-york-cheesecake-recipe.html"/>
            <updated>2010-11-06T12:37:19Z</updated>
            <published>2010-11-06T12:37:19Z</published>
            <id>/new-york-cheesecake-recipe.html</id>
            
            <content type="html"><![CDATA[
                <p>Time for a sweet cheesecake! <em>(But this is a muffin!<sup id="fnref:1"><a class="footnote-ref" href="#fn:1" rel="footnote">1</a></sup>)</em></p>

<p><img alt="" class="alignleft" src="/media/images/chohomuffin-187130-o-150x150.jpg" />
I got inspired to write this post from yesterday's late eve <a href="http://twittonary.com/word.php?word=Twonversation">twonversation</a> with <a href="http://twitter.com/agross/status/710189053382656">@agross</a> and the ever more undogmatic <a href="http://twitter.com/BjoernRochel/status/720272864845824">@BjoernRochel</a>. We talked about a nice <a href="http://blog.aheil.de/2010/11/05/test-driven-development-cheatsheet/">cheat sheet from Andreas Heil</a> while I was enjoying my honeyed citrus tea. While reading &amp; drinking, the desire of having a nice cheesecake came into my mind. </p>

<p>This is why I want to share this great cheesecake recipe with you.</p>

<p>Baking a cake is more or less easy. Baking a good cake however isn't easy at all. The below mentioned recipe is by no means "fool-proof". However, it's a good starting point for beginners. Whenever you feel suspicious about the "when's" &amp; "how's" of stirring flour and salt together, a glimpse to this recipe is a handy helper.</p>

<h3 id="ingredients">Ingredients</h3>

<p><em>for 12 servings</em></p>

<ul>
<li>160 g semisweet chocolate</li>
<li>75 g unsalted butter</li>
<li>180 ml buttermilk</li>
<li>100 g white sugar</li>
<li>1 egg</li>
<li>8 ml vanilla extract</li>
<li>210 g all-purpose flour</li>
<li>5 g baking soda</li>
<li>3 g salt</li>
<li>160 g semisweet (white) chocolate chips</li>
</ul>

<h3 id="directions">Directions</h3>

<ol>
<li>Preheat the oven to ~200 degrees C. Line all muffin cups with papers.</li>
<li>In a small saucepan over low heat, melt the semisweet chocolate together with the butter. Let stand until cooled, about 10 minutes.</li>
<li>Lightly beat the egg. In a small bowl, stir together the chocolate-butter mixture with the buttermilk, sugar, egg, and vanilla, until blended well.</li>
<li>In a large bowl, stir together flour, soda, and salt. Make a hole in the center of the dry ingredients, pour in the chocolate mixture, and stir until just combined. Stir in the mini chocolate chips. Spoon the batter into the lined muffin cups.</li>
<li>Bake at ~200 degrees C for 20-25 minutes or until a toothpick inserted in the center of a muffin comes out clean. Remove muffin tin from oven and let stand at least 5 minutes, before removing the muffins and letting them cool on a wire rack. Serve warm or cooled; can be frozen as well.</li>
</ol>

<p><strong>Bon App!</strong> ;-)</p>

<p><strong>Edit:</strong> This blog is especially directed to Alexander &amp; Björn. I got the impression that both don’t see a big issue mixing up the terms “TDD” and “Unit Testing”. The attentive reader already might have recognized this parody on the post of Andreas.</p>

<p>Let me be very clear and precise about one thing: With this post I don’t want to lower the value and efforts of Andreas in any way. The contrary is the case. I do believe that the <a href="http://blog.aheil.de/2010/11/05/test-driven-development-cheatsheet/">Unit Testing Cheat Sheet</a> is very beneficiary in everyday work. As a fact, I downloaded it as well and most probably will use it from time to time.</p>

<p>Nevertheless, my point here is a different one. I somehow don’t want to mix up the terms “TDD” and “Unit Testing”. From my perspective, both TDD and UT share similarities (i.e. in mechanics), but serve different purposes anyway.</p>

<p>I know that there people outside being quite relaxed (or undogmatic ? :-) ) about this. This is ok. I also know people who don’t care about the bits aside of their coffee, as long as it is something tasteful and sweet. This is ok.</p>

<p>But for me, this makes a difference. A big difference, to be precise. Similar to people outside being quite picky about their ingredients when cooking nice dinners, I’m a little petty-minded when it comes to agile &amp; xp coding methods. I very much apologize for this, but for my belief, this is an important thing worth to be noted.</p>

<p>I want to thank Andreas for his great work of compiling the cheat sheet, since I will surely use it from time to time for verification and hardening.</p>

<div class="footnote">
<hr />
<ol>
<li id="fn:1">
<p>Yes, I know, the picture is not a cheesecake. This is by intent.&#160;<a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text">&#8617;</a></p>
</li>
</ol>
</div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Kegeln um des Kegelns Willen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/kegeln-um-des-kegelns-willen.html"/>
            <updated>2010-10-30T13:10:47Z</updated>
            <published>2010-10-30T13:10:47Z</published>
            <id>/kegeln-um-des-kegelns-willen.html</id>
            
            <content type="html"><![CDATA[
                <p>Es sind nun zwei Wochen verstrichen, und ich ertappe mich ab und an immer noch bei dem Gedanken an einen einzigartigen Satz: "Kegeln um des Kegelns Willen". Der Satz fiel nebenläufig bei der Eröffnung des zweiten Session-Tages einer grandiosen <a href="http://netopenspace.de/2010/">.NET Open Space 2010 in Leipzig</a>. Seit dem ist dieser Satz ist für mich ein Manifest des .NET Open Space. Doch alles der Reihe nach.</p>

<h3 id="zwei-bayern-ein-ziel">Zwei Bayern, Ein Ziel</h3>

<p>Der selbstbekennende "Entity-Framework-Ans-Limit-Bringer" <a href="http://www.codefromground.com/">Sebastian</a> und ich haben es wieder einmal getan. Wir erinnerten uns an die "<a href="http://www.bmw.de/">Freude an der Fahrt</a>" zur <a href="nrwconf-achievement-unlocked.html">großartigen NRWConf</a> und dachten uns: "Raise the bar!". Also auf geht's, am Samstag früh morgens aufgestanden, frisch, fröhlich und frei nach Leipzig zum .NET Open Space 2010! Ich gebe offen zu, schon zu diesem Zeitpunkt waren meine Erwartungen ziemlich hoch. Denn: Mitte des Jahres durfte ich schon bei dem sehr guten <a href="verschworung-beim-net-open-space-sud-in-karlsruhe.html">.NET Open Space Süd in Karlsruhe</a> dabei sein.</p>

<p>Nach einer ereignisreichen Anreise kamen wir gerade rechtzeitig zur Eröffnung des .NET Open Space an. Eine wirklich gelungene <a href="http://www.commundo-tagungshotels.de/">Location</a>, ein super Empfang und eine Menge bekannter Gesichter! Einfach toll - und aufregend gleichzeitig. Schon zu diesem Zeitpunkt dachte ich mir: "jep, hier ist Deutschlands .NET-Entwicklungs-Know-How" - undzwar bunt und facettenreich, so wie das Leben eben ist.</p>

<p>Nach einer kurzen Aklimatisierungs-Phase ging es auch schon mit einer kurzen Eröffnungsansprache von <a href="http://blogs.compactframework.de/Torsten.Weber/">Torsten</a>, <a href="http://pixelplastic.de/">Marcel</a> &amp; <a href="http://therightstuff.de/">Alexander</a> los. Im Raum kursierten schon eine Menge Ideen &amp; Themen, die besprochen werden wollten. Durch zahlreiche Vorschläge entstand auf der Sessiontafel ein bunter Mix aus Technologie und Methodik, während <a href="http://der-albert.com/">der Albert</a> in seinem morgendlichen Elan die Funktionalität der <a href="http://github.com/agross/netopenspace/tree/master/source/app/NOS.Wall">NOS-Twitterwall</a>-Anwendung mit <a href="http://twitter.com/DerAlbert/status/27523286465">Tweets</a> &amp; <a href="http://twitpic.com/2y1cmg">Twitpics</a> erfolgreich verifizierte.</p>

<h3 id="as-much-know-how-as-know-how-can-be">As much Know-How as Know-How can be</h3>

<p>Know-How gefällig? Visit .NET Open Space: TDD Kickstart, Entity Framework 4 (from Scholarship to Mastery), DDD (Yeah, it's D as in Domain), Rhino.ServiceBus + NServiceBus, CQRS, Cool-Tools 4 Devs, EBC (Revolution oder Quatsch?), TDD in JS, MongoDB NoSQL, und das 3-Team .NET-Coding-Dojo.</p>

<p>Es mag nun vielleicht die Vermutung bei einigen Lesern aufkeimen, das eben erwähnte höre sich nach plakativem Marketing-Geschrei, <a href="http://de.wikipedia.org/wiki/Buzzword-Bingo">Buzzword-Spielereien</a> oder "dem Hype hinterherlaufen" an. Doch weit gefehlt! Die Sessions auf der .NET Open Space waren alle höchst spannend, praxisnah und lehrreich. Hinter all den Abkürzungen und Anglizismen verbarg sich eine Flut an konkretem, erfahrungsbasiertem Know-How.</p>

<p>Dieses geballte Wissen wurde mit einem Eifer und Begeisterung unter den Teilnehmern ausgetauscht, die meines Erachtens noch einige Zeit seines Gleichen suchen wird. Meine persönlichen Highlights waren die TDD Kickstarters Session von <a href="http://kostjaklein.wordpress.com/">Kostja</a>, die Bussi-Bussi-RhinoServiceBus+NServiceBus Präsentation von <a href="http://bjro.de/">Björn</a> &amp; <a href="http://therightstuff.de/">Alex</a>, der DDD-Roter-Frosch-Jamba-Abo-Kündigungs-Domänen-Disput mit <a href="http://startbigthinksmall.wordpress.com/">Lars</a> und das 3-Team .NET Coding Dojo mit einer Auswahl an Dojo-Operatoren aus Berlin (<a href="http://www.mikebild.com/">Mike</a>), Hamburg (<a href="http://www.navision-blog.de/blog-mitglieder/steffen-forkmann-ueber-mich/">Steffen</a>) und München (meine Wenigkeit). Grandios!</p>

<h3 id="community-computing">Community &amp; Computing</h3>

<p>Neben diesen technischen &amp; methodischen Highlights gab es natürlich auch weitere erwähnenswerte Momente. Das Rahmenprogramm war äußerst unterhaltsam. So wurde die Jagd nach "Jean-Joseph Closure" am Samstag Abend mit äußerster Vehemenz von der Teilnehmerschaft vorangetrieben. Ich durfte als Teil einer bunten Truppe diese Herausforderung mit annehmen. Nach einer ereignisreichen kulinarischen Achterbahnfahrt konnten wir gestärkt als Team uns auf die Spuren des geheimnisvollen Mythos "Jean-Joseph Closure" begeben. Eine gelungene "Joinade" der Community! :-)</p>

<p>Doch das meiner Meinung nach einzigartige an dem .NET Open Space sind für mich nicht nur die Sessions oder das allgemeine Beisammensein bei Bier und Wein. Das besondere ist der Wille. Ja, richtig. Der freie Wille.</p>

<p>Jeder der Teilnehmer (und ganz besonders die Veranstalter) haben den .NET Open Space gestaltet und zu einem der wertvollsten .NET-Veranstaltungen des Jahres gemacht. Doch das entscheidende dabei: jeder hat es gewollt, aus freien Stücken. Mit Faszination, Hingabe und Enthusiasmus. Jeder war bereit neue Dinge zu erfahren. Jeder war bereit sein Wissen mit anderen zu teilen. Das ist der Geist des .NET Open Space, der wie Eingangs erwähnt zu Beginn des zweiten Session-Tages auf .NET Open Space vortrefflich in Worte gebannt wurde:</p>

<blockquote>
<p>"Kegeln um des Kegelns Willen."</p>
</blockquote>

<p><em><a href="http://therightstuff.de/About.aspx">Alexander Groß</a> auf der .NET Open Space Leipzig im Oktober 2010</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">NRWConf: Achievement Unlocked!</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/nrwconf-achievement-unlocked.html"/>
            <updated>2010-09-20T11:46:18Z</updated>
            <published>2010-09-20T11:46:18Z</published>
            <id>/nrwconf-achievement-unlocked.html</id>
            
            <content type="html"><![CDATA[
                <p>Yeah! Auftrag ausgeführt: <a href="http://www.nrwconf.de/2010/">NRWConf 2010</a>!</p>

<p>Zugegeben, die ist jetzt schon wieder eine Weile her. Nichtsdestotrotz ist die Veranstaltung in der ersten Liga unter den Community-Events. Gerade deswegen ist sie einen Review - wenn auch späten Review - wert. Ich fange einfach mal an.</p>

<h3 id="neue-maps-neue-herausforderungen">Neue Maps, Neue Herausforderungen</h3>

<p>Ich war froh, unterwegs zu sein mit dem C#-Erstligisten <a href="http://twitter.com/SebastianAchatz">@SebastianAchatz</a>, der im Übrigen seine <a href="http://www.codefromground.com/?p=75">Eindrücke von der NRWConf</a> schon geschildert hat. Also Team-Up und ab in den nigelnagelneuen Info-Shooter "NRWConf-2010" im <em>Coop-Kampagnen-Modus</em>.</p>

<p>Nach der erfolgreichen (aber über 600km langen) Boot-Phase ging es erstmal ins Multi-Coder-Foyer. Die <a href="http://de.wikipedia.org/wiki/Ping_(Daten%C3%BCbertragung)">Ping-Zeiten</a> vom Konferenz-Server waren anfangs noch etwas zäh, aber es hat immerhin nicht "gelagged". Schon im Foyer gab es eine <a href="http://dieboerse-wtal.de/cms/index.php?id=6">Übersicht über die Maps</a>. Groß und geil, sag' ich nur. In der Mitte ein kleiner Korridor, dann der "Blaue Saal": eine große, übersichtliche Map. Darüber im ersten Stock zwei kleine "Studio-Maps", und eine etwas größere "Rote Saal"-Map mit einem Hide-Out in die "Campino-Bar" - der perfekte Hinterhalt für <a href="http://de.wikipedia.org/wiki/Camper_(Computerspiel)">Camper</a>.</p>

<p>Die Maps waren ziemlich groß und der Server stark genug, um wirklich viele Coder zuzulassen. Eigentlich bin ich kein Freund von riesigen Maps, aber sie sahen anspruchsvoll aus und es hatten sich schon einige coole Coder im Foyer eingefunden.</p>

<p>Los ging es dann mit <a href="https://www.xing.com/profile/Ingo_Dahm">Ingo Dahm</a> als Host. Super kann ich nur sagen. Ingo erklärte die Grundlagen über die NRWConf, Multi-Coder-Community-Info-Shooter und wir verschafften uns im Spectator-Mode noch einen Überblick über die Möglichkeiten. Am Ende der wirklich gelungenen Intro-Session konnte ich mir mit Basti auch schon eine kleine Strategie für die Map zurechtlegen.</p>

<h3 id="bring-it-on">Bring it on!</h3>

<p>Den Anfang machte eine Runde im blauen Saal mit <a href="http://www.lennybacon.com/default.aspx">Daniel Fisher</a> und <a href="http://philipproplesch.de/">Philip Proplesch</a> über ASP.NET Controls und ASP.NET MVC. Ein gelungener Einstieg zum Aufwärmen. Man konnte geistig schon viel Action durchziehen, ohne pausenlos <a href="http://de.wikipedia.org/wiki/Frag">gefragged</a> zu werden. Das machte Lust &amp; Laune auf mehr. Also gleich nach der ersten Runde im Blueroom wieder zurück zum Foyer und für die nächste Runde angemeldet: "Architecture for the Cloud". Vielversprechend.</p>

<p>Auf geht's, der Server-Load-Screen ist schon zu sehen... 3... 2... 1... und Boooom! Von wegen Bring-It-On und "Architecture for the Cloud" - Pustekuchen. Der NRW-Conf-Server hatte uns doch gleich noch einmal in die Blueroom-Map mit <a href="http://dotnet-forum.de/blogs/thorstenhans/default.aspx">Thorsten Hans</a> gespawned! Überraschend! Doch für mich kein Thema, denn Spontanität hebt die Spannung.</p>

<p>Gleich mal vorweg: Der "MSBuild Deep Dive"-Level hatte es in sich. Das war kein "Bring-It-On" mehr, sondern doch mindestens schon Hurt-Me-Plenty! Wir waren erstaunlich wenige in der Map, doch für mich war das schon ok. Mit zunehmender Dauer des Levels wurde es immer schwerer, geistig gut durchzulaufen und dabei nicht gefragged zu werden. Mir hat's richtig getaugt, denn mittendrin gab's auch noch geile Items wie "IronRuby" (mit der <a href="http://www.youtube.com/watch?v=4hqcHU55H34">schnellen "Rails"</a>, hehe) oder das Combo-Pack "RubyScriptTask" (vom <a href="http://dotnet-forum.de/blogs/thorstenhans/archive/2010/09/10/ironmsbuild-ein-sample.aspx">IronMSBuild-Package</a>). Fazit: Hält, was es verspricht!</p>

<p>Danach gab's erstmal ein wenig Pause. Gerade bei anspruchsvollen Maps und Sessions sind Pausen wichtig, um bei den Levels wirklich konzentrierte Leistung liefern zu können. Ich habe mich mit Basti also kurz vom Server abgemeldet, ein wenig Pause gemacht und nochmal alle Gadgets frisch betankt, damit es bei den Afternoon-Levels genauso gut weitergehen kann.</p>

<h3 id="cqrs-d-doomen-patched">CQRS D-Doomen-Patched!</h3>

<p>Gesagt, getan! Also wieder auf den NRW-Server und Anmeldung zum nächsten Level: "CQRS &amp; Event-Sourcing" - <em>Checked</em>! Das geile daran: Das Level war in der grössten Map ("Blauer Saal") im Hardcore-Mode mit dem <a href="http://www.dennisdoomen.net/">@DDoomen Patch</a>! Vorfreude groß! Und als es losging, erst mal eine Überraschung. Große Map, wenige Coder! Ich hatte eigentlich eine Crowd in der Map erwartet. Doch ganz im Gegenteil. Wir wenige konnten das Level in vollen Zügen "geistig durchzocken". Der <a href="http://twitter.com/ddoomen">@DDoomen</a> Patch hatte es echt in sich. Einfach nur Klasse!</p>

<p>Nach dem ich so oft in großen Maps war, musste ich im nächsten Level mal eine kleinere ausprobieren. Ich entschied mich für eine Studio-Map "StreamInsight" mit <a href="http://sqlpractice.wordpress.com/">Robert Meyer</a> als Host. Ui ui ui, sag ich! Geballte Energie im Level und viele interessante Info's. Eine mehr als solide Leistung von Robert Meyer - nach der Session war ich geistig vollgetankt mit StreamInsight-Strategien.</p>

<p>Puh, erst einmal durchschnaufen. Doch: Bei Community-Info-Shootern bin ich eigentlich mehr der aktive Durchläufer statt rumhängende Camper. Meistens lege ich mir meine Strecken immer vorher zurecht. Aber diesmal dachte ich mir: "diese Camper-Ecke musst du auch einmal ausprobiern". Also auf in's kleine Campino-Eck! Fazit: angenehm, relaxing und trotzdem immer noch in der Map. Mittendrin statt nur dabei.</p>

<h3 id="camper-sind-langweilig">Camper sind langweilig</h3>

<p>Nichtsdestotrotz, auf die Dauer ist campern einfach langweilig. Also auf geht's, Action! Da kam der Abend genau zur richtigen Zeit, bei dem ich mich auf dem NRW-Conf-Server eingeklinkt habe und selber einen Raum aufgemacht habe. Ich habe mich natürlich für ein <a href="dotnet-coding-dojo.html">.NET Coding Dojo</a> entschieden (ich meine <em>coding</em>, also nicht <em>"schwalling"</em> oder <em>"grübeling"</em>). In der mittelgroßen Map "Roter Saal" habe ich im Bring-It-On Modus die Session gehostet. Anfangs waren es noch ziemlich viele Coder, doch mit der Zeit hatten einige wohl mehr Lust auf Drink+Chill statt Action+Thrill.</p>

<p>In der Map haben sich zwei aktive Lager gebildet: Zum einen die Randori-Gruppe und auf der anderen Seite die Prepari-Gruppe. Am Rande der Map gab es leider auch ein paar passive Camper und Spectators. Ich hab' sie in Ruhe gelassen; Camper zu fraggen is' langweilig. Ich hatte mit den zwei Lagern viel geistige Action und fand's auch richtig gut. Besonders getaugt hat mir auch, dass Basti die mit ein paar TDD-Rookies bespickte Prepari-Gruppe gut durch die Map geführt hat.</p>

<h3 id="bonus">Bonus!</h3>

<p>Doch wer dachte, dass damit die NRW-Conf schon in den Abspann geht, der hatte sich getäuscht. Denn danach gab's eine richtig gute <a href="http://en.wikipedia.org/wiki/Bonus_stage">Bonus-Stage</a> als Outdoor-Map obendrauf! Kein Zeitlimit, kein Fraglimit, (fast) unlimited Ammo &amp; Items und ein super Host-Team mit Kostja, Stephan, Daniel, Philip waren das Sahnehäubchen, welches viele Community-Info-Zocker noch dazu veranlasste, lange und gut auf der Bonus-Map zu bleiben. </p>

<p>Fazit: NRWConf Mission Accomplished - Achievement Unlocked!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Cassini beruhigen bei mehreren Web-Projekten</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/cassini-beruhigen-bei-mehreren-web-projekten.html"/>
            <updated>2010-09-14T12:41:59Z</updated>
            <published>2010-09-14T12:41:59Z</published>
            <id>/cassini-beruhigen-bei-mehreren-web-projekten.html</id>
            
            <content type="html"><![CDATA[
                <p><img alt="Disable Cassini Tipp!" src="/media/images/disable_cassini_tip_for_simonhoh.png" />
Als kleiner, doch oftmals noch unbekannter Tipp für .NET-Web-Entwickler: die einfache Möglichkeit, den Cassini für Web-Projekte per Eigenschaften auszuschalten.</p>

<p>Das ist insbesondere dann hilfreich, wenn man in einer Solution mehrere Web-Projekte vereint und beim Run oder Debug/Run den Start mehrerer Cassini-Instanzen verhindern möchte. Der Screenshot sagt alles.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Me Likes Community Events</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/me-likes-community-events.html"/>
            <updated>2010-08-31T23:19:19Z</updated>
            <published>2010-08-31T23:19:19Z</published>
            <id>/me-likes-community-events.html</id>
            
            <content type="html"><![CDATA[
                <p>Die Zeiten sind auf Community Events geeicht. Oder soll ich besser sagen "Community-Konferenz"? Ich bleibe vorerst einmal bei Community-Konferenz. Eines dieser Community-Konferenzen war letztes Wochenende: die <a href="http://www.seesharpparty.de/de/Start/page38393.htm">See#</a>.</p>

<h3 id="seesharp">SeeSharp</h3>

<p>Das von der .NET Usergroup Konstanz-Kreuzlingen organisierte Event hatte eine eine sehr ansprechende Agenda und hochkarätige Speaker zu bieten. Meine Sessionliste:</p>

<ul>
<li>Windows Phone 7 Applications mit Silverlight, <a href="http://geekswithblogs.net/lbugnion/Default.aspx">Laurent Bugnion</a></li>
<li>IronRuby für .NET Developer, <a href="http://dotnet-forum.de/blogs/thorstenhans/">Thorsten Hans</a></li>
<li>ADO.NET Entity Framework in N-Tier Applikationen integrieren, <a href="http://sqlpractice.wordpress.com/">Robert Meyer</a></li>
<li>Code-Generierung mit dem Text Template Transformation Toolkit (T4), <a href="http://www.dnug-bern.ch/">René Leupold</a></li>
</ul>

<p>Besonders schade fand ich, dass ich in Ermangelung meiner Parallelisierungsfähigkeiten bei folgenden Sessions nicht dabei sein konnte, denn sie hätten mich brennend interessiert:</p>

<ul>
<li>Powershell für Entwickler, <a href="http://www.thomas-krause.de/">Thomas Krause</a></li>
<li>UI/UX - Grundlagen für Entwickler, <a href="http://www.roland-weigelt.de/">Roland Weigelt</a></li>
<li>Framework Design Guidelines - Wiederverwendbare Frameworks in C#, <a href="http://www.software-architects.com/Blogs/tabid/72/BlogID/5/Default.aspx">Rainer Stropek</a></li>
</ul>

<h3 id="sl4wp7">SL4@WP7</h3>

<p>Naja, nicht so schlimm, denn ich wurde von meiner Sessionwahl keineswegs enttäuscht. Den Anfang machte Laurent mit Windows Phone 7-Entwicklung. Angenehm: er spricht deutsch! Er gab einen guten Überblick über die Funktionen des neuen WP7 und die Programmiermöglichkeiten, darunter Silverlight. Highlight hierbei ist sicherlich, dass Laurent live in der Session gegen ein echtes Device die Programmierbeispiele ausgeführt hat und sogar mit der Webcam dem Publikum gezeigt hat. Nice!</p>

<h3 id="ir">IR</h3>

<p>Im Anschluss zeigte Thorsten Hans in seiner IronRuby-Session wirklich beeindruckend, dass das .NET Framework mit der CLR und DLR eine revolutionäre Programmierplattform ist. Er ging zunächst auf die DLR und deren Komponenten ein und steigerte während seiner Session stetig den Geekfaktor. Zunächst zeigte er, wie man mit IronRuby umgeht - das Handwerkszeug sozusagen. Danach wurde es schon ein Tick "cooler". .NET-Assemblies und IronRuby im Zusammenspiel: IronRuby-Skripte (mit Scope &amp; Context) aus .NET-Anwendungen aufrufen und vice versa. Als Beispiel zeigte Thorsten eine in Ruby geschriebene Validierung einer Kunden-Registrierung. Ich war beeindruckt! Doch Thorsten ließ nicht locker und haute zum Schluß noch einen richtigen Knaller raus: Unit Testing einer .NET-Komponente mit IronRuby &amp; RSpec!</p>

<p>Gut, dass danach die Mittagspause anstand, dass musste ich erst einmal verarbeiten :) In der Pause hatte ich dank Basti auch die Gelegenheit, den von <a href="http://blog.thomasbandt.de/39/2361/de/blog/sony-vaio-vpcs12v9eb-review.html">Thomas getesteten Sony Vaio VPCS12V9E/B</a> selbst einmal "anzutesten". Ich muss sagen, dass Thomas die Messlatte ganz schön hoch legt, denn für meinen Geschmack ist die Verarbeitung des Sony wirklich gut. Das Gehäuse ist kein Shiny-Alu-Guß, aber auch kein Plastik. Die Chiclet-Tastatur ist ok, der Druck relativ sensibel. Performance gut, Display in Ordnung.</p>

<h3 id="ef4">EF4</h3>

<p>Nach der Mittagspause ging es zu Robert's Entity Framework Session. Er ging zunächst auf die "Schwierigkeiten" der ersten Version des Entity Frameworks ein, um danach gleich mit den Neuerungen von EF4 nachzulegen. An seinem Vortrag besonders gefallen haben mir die vielen kleinen Beispiele aus der Praxis, mit denen Robert seine Expertise in diesem Bereich einmal mehr zu unterstreichen wusste. In der zweiten Hälfte der Session widmete er sich den neuen Features wie (echten) POCO-Support, Domain-First-Design und natürlich dem IObjectSet<T>. Robert ging auch auf Testbarkeitskriterien von EF4-Lösungen ein und nennte einige Leitfäden zum Testing. Fazit: eine guter EF4 Überblick mit wertwollen Praxisbeispielen vom Experten.</p>

<h3 id="t4">T4</h3>

<p>Die letzte Session hatte es in sich: T4. René zeigte zunächst die Grundlagen. Was ist T4, Wieso T4. Aufbau, Architektur, Anwendung. So einfach kann eine Einführung sein. Doch dann ließ es sich auch Rene nicht nehmen, in die Tasten zu greifen. Exemplarisch an Anwendungsbeispielen wie z.B. EF-Templates oder Templates für Unit Testing ging er auf die Features der T4-Engine ein. Bemerkenswert: René lässt sich auch durch kleinere technische Probleme nicht aus dem Konzept bringen. Er hatte wirklich eine Fülle von Beispielen parat, mit denen er reichhaltigen Funktionalitäten von T4 erläuterte. Ein Text- und Code-Jongleur, kann ich da nur sagen.</p>

<p>Trotz dieser guten Sessions war mein Eindruck von See# nicht ganz perfekt - doch daran war ich selbst schuld. Durch die lange Anreise habe ich die Keynote von <a href="http://www.des-eisbaeren-blog.de/">Golo</a> verpasst. Die lange Reisezeit war schlußendlich auch der ausschlaggebende Faktor, warum ich leider nicht mehr bei der Grillparty und dem .NET Coding Dojo mit <a href="http://www.lieser-online.de/blog/">Stefan</a> dabei sein konnte. Sehr schade. Nichtsdestotrotz konnte ich wieder auf dem Event wirklich tolle neue Entwickler-Kollegen kennenlernen, darunter <a href="http://www.aspnetzone.de/blogs/peterbucher/">Peter Bucher</a>, <a href="http://www.aspnetzone.de/blogs/robertobez/">Roberto Bez</a>, <a href="http://www.aspnetzone.de/blogs/juergengutsch/">Jürgen Gutsch</a> und <a href="http://dotnet-forum.de/blogs/thorstenhans/">Thorsten Hans</a>. Für mich hat sich dadurch die Teilnahme an See# doppelt gelohnt.</p>

<h3 id="lets-go-to-nrwconf">Let's go to NRWConf!</h3>

<p>Kaum ist die eine Community Conference zu Ende, steht die nächste schon vor der Tür - die <a href="http://www.nrwconf.de/2010/">NRWConf 2010</a> am 9./10. September steht an. Wenn man sich die <a href="http://www.nrwconf.de/2010/Event/Agenda">Agenda der NRWConf</a> ansieht, dann klingt das überaus vielversprechend. Also ich werde mir definitiv wieder eine Menge Sessions so zu Gemüte führen und vieles dazu lernen. Am Abend gibt es - wie auch bei der See# - ein .NET Coding Dojo. Diesmal jedoch mit meiner Wenigkeit als Operator. Ich denke es wird nicht nur eine Menge Spaß machen, sondern wieder einmal erkenntnisreich sein ;-)</p>

<p>Ich freue mich!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Das Agile Team in Nahaufnahme</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/das-agile-team-in-nahaufnahme.html"/>
            <updated>2010-08-26T11:21:08Z</updated>
            <published>2010-08-26T11:21:08Z</published>
            <id>/das-agile-team-in-nahaufnahme.html</id>
            
            <content type="html"><![CDATA[
                <h3 id="oder-nahe-ist-besser-als-distanz">Oder: Nähe ist besser als Distanz</h3>

<p>Es ist schon eine wundersame Welt. Also, in meinen Augen natürlich. Ich schreibe diesen Artikel ja auch, also kann es nur eine persönliche und subjektive Meinung sein. Aber immerhin, es ist eine Meinung, und das sogar ziemlich deutlich. Denn, ich habe den Artikel, die Kommentare und den Folge-Artikel von Golo zu seiner These "Räumliche Nähe wird überbewertet" gelesen. Das ich da anderer Meinung bin, habe ich ja schon gebloggt. Was also noch darauf rumreiten? Die Antwort ist einfach: Es ist wichtig, deswegen.</p>

<h3 id="kommunikation-mitteilung-wahrnehmung">Kommunikation = Mitteilung + Wahrnehmung</h3>

<p>Doch zunächst möchte ich in aller (nur notwendig langen) Kürze auf ein verwandtes Thema eingehen: Die Kommunikation. Besser gesagt, die <a href="http://de.wikipedia.org/wiki/Zwischenmenschliche_Kommunikation">zwischenmenschliche Kommunikation</a>. Kommunikation ist eine schwierige und herausfordernde Kunst. Der eine sagt etwas, der andere versteht etwas. Ob es dann das ist, was der eine sagen wollte und der andere verstehen wollte, hängt von unheimlich vielen Faktoren und komplexen Sachverhalten ab. Doch zunächst gilt es festzuhalten: <a href="http://twitter.com/ilkerde/status/21942161099">Kommunikation ist nicht nur Mitteilung, sondern auch Wahrnehmung</a>. So geschehen auch bei der "Blog-Kommunikation" zwischen mir, Golo und dem "Publikum" (also auch Dir, lieber Leser).</p>

<p>Mit Golo's Aussage fing es an: "<a href="http://www.des-eisbaeren-blog.de/post/2010/08/19/Raumliche-Nahe-wird-uberbewertet.aspx">Räumliche Nähe wird überbewertet</a>". Gut. Man könnte jetzt vieles wahrnehmen. Zum Beispiel könnte man wahrnehmen, dass Golo damit meint, dass ihm räumliche Nähe ein Graus ist. Oder man könnte wahrnehmen, dass Golo ein introvertierter, soziophober Alleingänger ist. Keines von dem ist der Fall. In meinen Augen ist derjenige, der so eine Wahrnehmung hat, einfach nicht aufgeschlossen und wohlwollend zu Golo's Meinung. Dennoch - man könnte es sicherlich wahrnehmen.</p>

<p>Ich antwortete auf seine Aussage mit dem Artikel "<a href="/raumliche-nahe-wird-unterschatzt.html">Räumliche Nähe wird unterschätzt</a>". Gut. Man könnte jetzt vieles wahrnehmen. Zum Beispiel könnte man wahrnehmen, das ich damit "Verteilte Teams sind nicht erfolgreich" postuliere. Oder man könnte wahrnehmen, das ich ein opportunitisch-dogmatischer Agile-Fetischist bin. Keines von dem ist der Fall. In meinen Augen ist derjenige, der so eine Wahrnehmung hat, einfach nicht aufgeschlossen und wohlwollend zu meiner Meinung. Dennoch - man könnte es sicherlich wahrnehmen.</p>

<p>Aber jetzt mal Tacheles kommuniziert: Wer sollte denn so etwas annehmen? Ich finde so eine Wahrnehmung absurd. Ja, geradezu lächerlich. Demjenigen, der wirklich allen ernstes Golo nachsagen möchte, dass er Colocation als "schädlich" einstuft, oder aber mir den Vorwurf macht, ich würde "Colocation über Alles!" predigen, dem traue ich auch zu, dass er in "<a href="http://www.youtube.com/watch?v=8QSgNM9yNjo">Satellite</a>" keine Liebeshymne sieht, sondern es als öffentliche Drohgebärde einer <a href="http://de.wikipedia.org/wiki/Stalking">Stalkerin</a> zu ihrem Opfer interpretiert. Soviel dazu.</p>

<h3 id="die-mathematik-der-meinung">Die Mathematik der Meinung</h3>

<p>Zurück zum Thema, der räumlichen Nähe. Ich bin nach wie vor der Meinung, dass räumliche Nähe unterschätzt wird. Unterschätzt in vielerlei Hinsicht. Ich gehe zunächst auf eine Perspektive ein, die auch schon angesprochen wurde: Effizienz und Produktivität. Golo schreibt in einem Kommentar treffend seine Motivation:</p>

<blockquote>
<p>Golo: "...Es ging mir um die immer postulierte Allgemeingültig der Aussage "Colocation ist besser". Zu zeigen, dass dem nicht so ist, genügt ein einziges Gegenbeispiel..."</p>
</blockquote>

<p>Meine Meinung dazu: Ja, Richtig und Nein, Falsch. Das ist nicht logisch? Macht nichts. Ist trotzdem so.</p>

<p>Denn: Ja, es ist richtig, dass Golo nur ein Gegenbeispiel zeigen muss, um die Allgemeingültigkeit ad acta zu legen. Und: Nein, es ist falsch, denn meiner Meinung nach ist das gewählte methodische Werkzeug - nämlich die Anwendung der Aussagenlogik und deren Beweismethoden - völlig unangebracht. Bei allem Respekt gegenüber der Professionalität und Kompetenz von Golo bin ich etwas irritiert, das gerade der Berater für agile Methoden die Colocation nicht zu favorisieren scheint.</p>

<p>Doch die Motivation verstehe ich nur allzu gut - es wird öfters die "Colocation" als Heilsbringer dargestellt. Dem ist nicht immer so. Aber muss man deswegen so eine trockene, wissenschaftliche Herangehensweise wählen? Ich denke, dass es nicht unbedingt notwendig gewesen wäre, denn schließlich führt die Bool'sche Algebra hin zu einer totalitären "Schwarz-Weiss"-Wahrnehmung (wie oben geschildert). Dabei ist in Wahrheit nicht schwarz oder weiss schön, sondern <a href="http://acab.muc.ccc.de/">alle Farben</a>.</p>

<p>Leider wird für meinen Geschmack bei diesem Thema zu tief in die mathematisch-naturwissenschaftliche Logik-Kiste gegriffen. Logik &amp; Mathematik sind mächtige Werkzeuge, die man oft und versatil einsetzen kann. Aber sie sind nicht die Weisheit für alle möglichen Systeme oder Lebenslagen. Ich meine, hier ist Logik alleine nicht das adequate Werkzeug. Vielmehr hilft meines Erarchtens hier der gesunde Menschenverstand mit dem unvergleichlichen Etwas, was uns Menschen auszeichnet: Emotion. Doch dazu komme ich gleich noch.</p>

<h3 id="handlungsfahigkeit-produktivitat-und-effizienz">Handlungsfähigkeit, Produktivität und Effizienz</h3>

<p>Fakt ist, dass Menschen, die an einem Ort, in einem Raum zusammenarbeiten, Ihre Arbeit in den meisten Fällen effizienter, effektiver und produktiver gestalten und erledigen. Abseits von Agilität und <a href="http://www.academypublisher.com/jsw/vol03/no04/jsw03043136.pdf">unabhängig von der eingesetzten agilen Managementmethode</a> stellt man fest: In sehr vielen Fällen ist ein "Warroom" oder "Teamroom" für eine erfolgreichere Gestaltung des Vorhabens <a href="http://possibility.com/Misc/p339-teasley.pdf">nicht nur hilfreich, sondern mit ausschlaggebend</a>. Darüber hinaus entwickelt sich ein deutlich zügigerer Durchlauf des Teams durch die Tuckman-Phasen. Mit der Zeit entwicklelt man auch ein viel besseres Verständnis zu den Aufgaben anderer und vermag auch, den anderen in brenzlichen Situationen zu helfen. Und manchmal ist man auch ganz glücklich, wenn einem selbst ein wenig unter die Arme gegriffen wird.</p>

<p>Es gibt dabei meiner Meinung nach aber noch einen weiteren wichtigen Aspekt. Es ist die Teamaufstellung. Es ist eines der Dinge, die bei der Diskussion für mein Empfinden viel zu wenig herausgearbeitet wurde. Oder besser auf Deutsch gesagt: es wurde einfach ignoriert. Schade. Denn ein agiles Team ist nur dann ein agiles Team, wenn es <a href="http://theagileproductmanager.blogspot.com/2008/07/whats-cross-functional-team-and-why.html">interdisziplinär (bzw. "cross-functional") ist</a>. Warum das so ist, habe ich ja schon <a href="/raumliche-nahe-wird-unterschatzt.html">geschildert</a>. Der Effekt, der dabei entsteht, ist eine wesentlich effizientere Kommunikation zwischen den einzelnen Domänen- und Fach-Experten. Darüber hinaus werden intuitiv und äußerst effizient gemeinsame Schnittstellen und eine <a href="http://domaindrivendesign.org/node/132">Ubiquitous Language</a> entwickelt.</p>

<p>Es gibt noch eine <a href="http://www.smartagile.com/2007/08/team-co-location.html">Menge anderer Dinge</a>, die ein interdisziplinäre und lokale Teamaufstellung zu einer Präferenz zu anderen Teamstrategien macht. Doch der kausale Kern eines agilen Teams ist und bleibt geschäftsgetrieben. Ein agiles Team ist "im Kern" nur interdisziplinär, weil es der einzige Weg ist, ein Feature als Ganzes, also integer und abgeschlossen, umzusetzen. Das es nebenbei diese Aufgabe auch noch effektiver löst, als andere Teamaufstellungen, ist die "Sahne" auf dem Kuchen.</p>

<h3 id="mi-kasa-es-su-kasa">Mi Kasa Es Su Kasa</h3>

<p>Ein weiterhin von Golo und anderen Kommentatoren kritisch beäugtes Merkmal von "Colocation" ist die "Minderung der Produktivität durch Störungen". Diese Argumentation ist für <a href="http://www.agilegamedevelopment.com/2008/11/agile-principles-emphasize-face-to-face.html">Agilisten nichts Neues</a>. In meinen Augen ein Indiz für Ängste. Man befürchtet, dass man durch "den Lärm" und "die Unterhaltungen" im Raum nicht mehr konzentriert arbeiten kann, sich jeder die Kopfhörer aufsetzt und in seine Welt entschwindet. Man befürchtet, dass man sich nicht mehr in seinem eigenen kreativen Mikrokosmos nicht mehr wohlfühlen kann. Man befürchtet, beobachtet zu werden. Man befürchtet, sich einfach nicht mehr in die Arbeit "gehen lassen" oder "eintauchen" zu können. Das sind verständliche Ängste. Besonders dann, wenn man noch nie oder erst selten mit agilen Teams - oder als Teil eines agilen Teams gearbeitet hat. Ich kann das nachvollziehen.</p>

<p>Doch ich kann es nicht nachvollziehen, dass manche - wohl genährt durch diese Befürchtungen - behaupten, dass es "sowieso nicht besser wäre", oder für die einzelne Persönlichkeit und den einzelnen Charakter ungeeignet sei. Noch dazu ohne es einmal ausprobiert zu haben. In meinen Augen ist das eine lapidare und profane Argumentation. Viel zu oft gewinne ich dadurch den Eindruck, das dieser  Schlag von Entwicklern ein wenig zu oft an sich selbst denkt als an andere Teammitgleider und die gemeinsame Sache.</p>

<p>So sind z.B. <a href="http://www.uxmatters.com/mt/archives/2009/07/a-practical-guide-to-capturing-creativity-for-ux.php">Designer und UX-Experten wesentlich intensiver mit kreativer Schaffung konfrontiert</a> und damit auch deutlicher abhängig von ein Umfeld, in dem die "Kreativität keimen und reifen" kann. Auch Produkt Manager sind oft mit hochkonzentrierten und komplexen Denkprozessen beschäftigt, wenn es z.B. um die Entwicklung von neuen Features eines Produktes geht. Was ich damit sagen will: Jeder ist ein Mensch, nicht nur die "Coder". Wer wünscht sich nicht gerne sein eigenes "Arbeitsreich"? Doch auch wenn man es hätte, in den meisten Fällen wäre es für die gemeinsame Sache eben nicht zielführend, das jeder sein Reich hat und sein eigenes Ding auf seine eigene Art und Weise macht.</p>

<p>Interessanterweise sind es aus meiner Erfahrung gerade diejenigen, die mehrheitlich Konzentrations- oder Kreativitäts-Aufgaben erledigen, am wenigsten Probleme mit der Zusammenstellung interdisziplinärer Teams in einen Raum haben. Im Gegenteil. Sie fühlen sich inspiriert und freuen sich, dass ihre Arbeit auch gesehen und bewertet werden kann. Ein guter &amp; <a href="http://emilychang.com/2006/02/the-agile-web-design-manifesto-an-introduction/">agiler Web-Designer</a> z.B. freut sich über jedes frühe Feedback - von jedem. Natürlich braucht man auch seine Ruhe- und Schaffungsphasen. Jeder braucht das.</p>

<p>Das ist im Übrigen eines der ersten Dinge, die ein agiles Team auch lernt und gestaltet: Ruhephasen - Bibliotheksmodus - Silentio. Ein weiteres, hilfreiches Merkmal solcher "hyperproduktiven Arbeitsumgebungen" sind Fluchtpunkte. Also Ruheinseln, in denen man sich zurückziehen kann. Für Persönliches oder Privates. Oder einfach nur so, zum ausruhen. Powernap. Etwas lesen. Am Flipper eine Runde zocken und den Kopf etwas frei kriegen. Auftanken.</p>

<p>Ich sage nicht, das all das, was ich gerade erwähnt habe, nicht auch mit verteilten Teammitgliedern möglich wäre. Es ist auch machbar. Die Profi's Golo &amp; Peter sind ein <a href="http://www.des-eisbaeren-blog.de/post/2010/08/19/Raumliche-Nahe-wird-uberbewertet.aspx">gutes Beispiel</a> dafür. Aber es ist meiner Meinung in sehr vielen Fällen ungleich schwieriger, deutlich fragiler und auch minder effizient. Mit Colocation funktioniert es natürlich auch nicht immer - aber dafür deutlich öfter, einfacher und produktiver.</p>

<h3 id="emotion-hautnah">Emotion. Hautnah.</h3>

<p>Zurück zu dieser einen "ungreifbaren" Sache, die mit agilen Teams an einem gemeinsamen Ort besonders hervorstechend ist. Die Emotion. Emotion ist etwas so wichtiges und schönes. Auch für Entwickler und Nerds. Man regt sich über den langsamen SATA-Treiber auf. Man installiert gespannt die neuesten Plugin's für Visual Studio während man sich mit dem Käsebrötchen vollkrümelt. Man lacht sich über den 3. roten Build des Tages kaputt, weil es wieder einmal ein Leichtsinnsfehler war.</p>

<p>Doch Emotion ist nicht nur für einen selbst wichtig. Emotion ist auch für andere wichtig. Die Sprache ist nur ein Teil der Kommunikation. Manche Streiten sich darüber, ob nur <a href="http://blog.my-skills.com/2007/10/18/mythos-93-der-kommunikation-ist-nonverbal.html">7% unserer gesamten Kommunikation</a> verbal ist. Fakt ist, Sprache ist nicht alles. Den Satz "Ich verstehe." von einer langjährigen, erfahrenen Web-Designerin zu hören - flüsternd, mit glasigen Augen und zittrigen, schweißgebadeten Händen, die sie vergebens versucht hinter ihrer großen Pop-Art-Teetasse zu verstecken - oder aber "Ich verstehe." mit resoluter Stimme wahrzunehmen - gefolgt von einer gekonnten Seitwärtsdrehung, die ihre zum Pferdeschwanz gebundenen Haare durch die rapide Rotationskraft zu einem Duftkatalysator ihres Luxusparfums entarten lässt und mit der Registrierung ihrer kalten Schulter abrupt endet. Ein und das selbe Wort - doch zwei Nachrichten, die gegensätzlicher kaum sein könnten. Natürlich gibt es noch tausende von andere Bedeutungen des Satzes "<a href="http://www.youtube.com/watch?v=VgesUCTCoBs">Ich verstehe</a>", aber ich denke Du verstehst, was ich meine. ;)</p>

<p>Für einige mag das jetzt zu weich, unlogisch, konstruiert oder unwissenschaftlich sein. Aber das ist mir egal. Denn das ist es, was ich am Anfang dieses Artikels mit "es ist wichtig" gemeint habe und was ich zum Ausdruck bringen will: Agile Teams, die gemeinsam an einem Ort arbeiten sind sicherlich nicht perfekt. Aber sie sind in der deutlichen Vielzahl der Fälle produktiver, effektiver, handlungsfähiger, änderungswilliger, offener, respektvoller und: emotionaler.</p>

<p>Das Ergebnis ist eine gewisse Energie, eine gewisse Magie, die bei agilen Teams mit Colocation öfter und schneller entsteht. In dem letzten Slide meines <a href="http://www.youtube.com/watch?v=xDOURH0O16w">Enthusiasmus-Vortrags</a> über Scrum beim Webmontag in München sieht man <a href="http://www.youtube.com/watch?v=YWkSnKd-5Tc">eine Band im Sonnenuntergang zusammenspielen</a>. Das spiegelt die Energie &amp; Magie ein wenig wider: die Emergenz des Teams. Das Ganze ist mehr als die Summer der einzelnen Teile.</p>

<p>Und damit dieses ach so kindische "aber du sagt das ist toll und alles andere ist blöd"-Fingerpointing nach diesem Artikel hoffentlich keinen Nährboden findet, nochmal ein klarer Disclaimer: Ich habe die Weisheit nicht gepachtet. Aber ich habe eine Meinung. </p>

<p>Für mich ist klar: wer wirklich agile Software-Entwicklung betreiben möchte, der wird versuchen, ein Team an einem gemeinsamen Ort arbeiten zu lassen. Wenn es nicht möglich ist, dann eben mit Hilfsmitteln verteilt. Alles andere ist in meinen Augen weder agil, noch fortschrittlich, noch wirklich produktiv. </p>

<p>Ich bevorzuge es, wenn ich meinem Kollegen auf die Schulter klopfen kann, wenn er einen genialen Integrationstest geschrieben hat. Oder dem Web-Designer in sein kritisches Gesicht zu blicken, wenn er wieder einmal den Usability-Prototyp der UX-Designerin begutachtet und währenddessen sich die Komplementärfarben im Pantone-Fächer zurechtsucht. Es ist für mich eine Ehrensache, dem gestressten Produktmanager beim sortieren und formulieren der neuen User Stories zu helfen, weil er in einer Stunde ein wichtiges Meeting mit dem Marketing hat. Und: es baut mich auf, wenn meine Teammitglieder mich anlächeln, weil ich ein Feature mit einem Kollegen fertiggestellt habe und wir uns nach dem grünen Build in den Armen liegen, als wäre der FC Bayern gerade Championsleague-Sieger geworden.</p>

<p>Ich bevorzuge agile Teams an einem Fleck, an einem Ort, in einem Raum. Gemeinsam für die gemeinsame Sache. <em>Räumliche Nähe wird unterschätzt.</em></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Räumliche Nähe wird unterschätzt</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/raumliche-nahe-wird-unterschatzt.html"/>
            <updated>2010-08-20T14:54:23Z</updated>
            <published>2010-08-20T14:54:23Z</published>
            <id>/raumliche-nahe-wird-unterschatzt.html</id>
            
            <content type="html"><![CDATA[
                <p>Mit Interesse habe ich den Artikel von Golo über Scrum-Teams und seine Meinung zu räumlicher Nähe in agilen Teams gelesen. Der Titel seines Artikels ist durchaus provokant: "<a href="http://www.des-eisbaeren-blog.de/post/2010/08/19/Raumliche-Nahe-wird-uberbewertet.aspx">Räumliche Nähe wird überbewertet</a>".</p>

<p>Nun, dem muss ich deutlich widersprechen. Genau das Gegenteil ist der Fall - und sowohl sein Artikel als auch die Kommentare dazu sind in meinen Augen eine Bestätigung: Räumliche Nähe wird einfach noch viel zu oft unterschätzt!</p>

<h3 id="professional-engineering">Professional Engineering</h3>

<p>Ich möchte das Beispiel von Golo aufgreifen, in dem er die gute Zusammenarbeit zwischen ihm und Peter schildert:</p>

<blockquote>
<p>"... Peter Bucher und ich sind ein solches Team. David Tielke und ich sind ein solches Team. Beide habe ich in meinem Leben noch nicht all zu oft getroffen – jeden von beiden höchstens fünf Mal. Und dennoch harmoniert die Zusammenarbeit in einem Ausmaß, das für Außenstehende nicht nachvollziehbar ist.</p>
<p>Auch wenn uns hunderte von Kilometern trennen, führen wir regelmäßig Programmieren in Paaren durch – per Skype und Teamviewer. Und die Zusammenarbeit funktioniert einwandfrei. Keiner von uns käme auf die Idee, zu sagen, dass wir effektiver oder effizienter sein könnten, wenn wir gemeinsam vor einem PC arbeiten würden.</p>
<p>Vermutlich wären wir dies noch nicht einmal, weil dann nicht jeder seine vertraute Arbeitsumgebung hätte, in der er sich rundum wohlfühlt.... "</p>
</blockquote>

<p>Das Beispiel ist ein Zeugnis von professioneller Software-Entwicklung. Da arbeiten offensichtlich zwei Profis zusammen. Sehr gut. Golo leitet daraus ab, dass es nicht zwingend notwendig sei, Teammitglieder an einem Ort, in einem Gebäude, in einem Raum zu haben, um effektiv ein "Team" zu sein. Nun, das mag ja schön und gut sein. Aber Golo: Hast Du denn Vergleiche? Und wenn ja, hast Du gemessen, wie "effektiv" denn beides ist? Ich befürchte nein. Wäre dem so, dann wäre mit großer Wahrscheinlichkeit Dein Fazit anders ausgefallen.</p>

<p>Was ich damit zum Ausdruck bringen will, ist, daß Golo und Peter wohl nie in einem Raum über längere Zeit zusammen gearbeitet haben. Ich unterstelle das jetzt einfach einmal Golo &amp; Peter; bitte korrigiert mich und verzeiht mir, wenn dem nicht so ist. Es dient mir zur Illustration meiner Perspektive zum Thema.</p>

<p>Also, wäre dem so, so hätte Golo gar keinen Vergleich der Effektivität &amp; Effizienz des Teamgefüges zwischen ihm und Peter. Beide sind ausgewiesene Profis in der Software-Entwicklung und schaffen aus der Distanz gemeinsam gute und effiziente Teamarbeit. Der Artikel von Golo beweist es. Man stelle sich nur vor, welche Produktivität und Ingenieursleistung möglich wäre, wenn zwei solche Profis an einem Tisch arbeiten würden. Wow.</p>

<p>Damit sind wir auch schon an einem wichtigen Punkt. Agile Software-Entwicklung und deren Verfahrensweisen behaupten nicht, dass es notwendig sei, ein Team an einem Fleck zu haben, um (gut) Software zu entwickeln. Aber sie behaupten, dass sich spätestens mittelfristig die Produktivität &amp; Effizienz eines Teams steigert, wenn sie an einem Fleck miteinander zusammenarbeiten. Diese Behauptung ist kein Wunschtraum, sondern messbar &amp; belegbar.</p>

<p>Doch es gibt noch einen weiteren, ganz entscheidenden Aspekt der Forderung nach Teamnähe in der Agilität. Golo überspringt in seiner Betrachtung meines Erachtens die Interdisziplinarität agiler Teams. Das ist für mich besonders verwunderlich, zumal er in seinem gelungenen Artikel über die <a href="http://www.des-eisbaeren-blog.de/post/2010/08/18/Featurebezogene-Entwicklung.aspx">Feature-Orientierung in agilen Methoden</a> sich selbst genug Indizien gibt, die interdisziplinäre Aufstellung von Teams zu fordern &amp; zu fördern.</p>

<h3 id="agile-teams-sind-interdisziplinar">Agile Teams sind Interdisziplinär</h3>

<p>Was heisst das? Das heisst, erst einmal, das Entwickler alleine kein Team sind. Zumindest mal in der agilen Software-Entwicklung nicht. Ein agiles Team ist ein Team, welches eigenständig dazu in der Lage ist, das geforderte Produkt bzw. deren Features ausliefern zu können. Manchmal - besser gesagt: eher selten - reichen dazu Entwickler. Doch meist braucht es mehr, viel mehr. Es braucht Produktmanager, Systemingenieure, Usability-Experten, Designer, Tester und manchmal sogar noch mehr, um ein Feature eines Produktes wirklich fertigstellen zu können.</p>

<p>Ein agiles Team ist ein Team, welches all diese Rollen und Aufgabenbereiche berücksichtigt und mit den Teammitgliedern umsetzen kann. Dass heisst nicht unbedingt, dass Designer ein "fester Bestandteil" des Teams sein muss, wenn er nur zwei Websites designen soll, das Produkt aber weitaus mehr darstellt (z.B. im Backend oder durch Dienste). Doch wichtig ist hier die Erkenntnis, dass ein agiles Team interdisziplinär ist; idealerweise sogar mit dem Kunden (oder Kundenvertreter) an seiner Seite.</p>

<p>Vor diesem Hintergrund macht die Forderung nach räumlicher Nähe von Teammitgliedern in einem Team noch viel mehr Sinn. Leider gibt es noch viel zu oft die Situation, dass Entwickler von der Marketing-Abteilung die Anforderungen über ein Feature (<Ironie>als "Story" natürlich, haha</Ironie>) in einem "agilen" Ticketsystem vorgesetzt bekommen. Die Entwickler "sprinten" dann und liefern das Ergebnis an die Testabteilung, um danach ein Paket der Infraktruktur bzw. Installation-Engineers "über den Zaun" zu werfen. In meinen Augen haben es solche Teams echt schwer, denn sie sind nicht agil, sondern fragil.</p>

<h3 id="keine-scheu-vor-transparenz">Keine Scheu vor Transparenz</h3>

<p>Die Emergenz, die durch interdisziplinare Teams entsteht, ist nämlich erst dann wirklich mess- und spürbar, wenn die Kommunikationsmittel als auch die Kommunikationsbarrieren untereinander so gering wie möglich ist. Doch nicht nur gute Kommunikation ist ein Ziel der Co-location. Ein aus meiner Sicht wesentlich wichtigerer Faktor ist der Faktor der Transparenz.</p>

<p>Durch die Nähe zueinander sieht man auch, was der andere so macht. Soll heissen, man lernt seinen Tagesablauf, seine Aufgaben, seine Tools, seine Herausforderungen - na eben das ganze Arbeitsumfeld. Umgekehrt sehen andere, mit welchen Dingen man selbst tagtäglich konfrontiert ist und was es tatsächlich bedeutet, Software zu entwickeln. Durch die Transparenz entsteht mehr Verständnis zu der Aufgabe und der Leistung des anderen Teammitglieds. Man versucht sich gegenseitig zu helfen und aufzubauen. Das wiederum hilft der Kommunikation und der Produktivität im Team.</p>

<p>Abschließend kann ich nur sagen, dass ich nicht nur ein Befürworter von räumlicher Nähe bin, sondern als Agilist versuche, so nah wie möglich an meinen Teammitgliedern und dem Kunden dran zu sein. Manchmal macht man es sich meiner Meinung nach zu einfach, wenn man Distanzen unter gemeinsam arbeitenden Kollegen als gegeben hinnimmt.</p>

<h3 id="be-agile">Be Agile!</h3>

<p>Ich möchte in diesem Zusammenhang gerne nochmal an zwei Punkte des <a href="http://agilemanifesto.org/">agilen Manifests</a> erinnern: People over Process (and Tools), sowie Collaboration over Contracting. Für mich steht fest: wer von sich behaupten möchte, agile Software-Entwicklung zu betreiben, der wird früher oder später die Vorteile von räumlicher Nähe von Teams erkennen und versuchen, diese Nähe von Teams so gut wie möglich herzustellen. Alles andere sind in meinen Augen nur Lippenbekenntnisse und Halbwahrheiten über Agilität.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">.NET Coding Dojo @ Avanade</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/dotnet-coding-dojo-avanade.html"/>
            <updated>2010-08-08T23:50:11Z</updated>
            <published>2010-08-08T23:50:11Z</published>
            <id>/dotnet-coding-dojo-avanade.html</id>
            
            <content type="html"><![CDATA[
                <p>Es war ein grandioses .NET Coding Dojo in München am letzten Mittwoch. Wir waren zu Gast bei <a href="http://www.avanade.com/de">Avanade</a> und haben uns von der ersten bis zur letzten Minute sehr wohl gefühlt. Dank der tollen Organisation gab es nichts zu bemängeln und vieles zu bestaunen. Den Anfang machte da das reichhaltige Empfangsbuffet, welches einen geschmackvollen Beitrag für eine angenehme und gelassene Atmosphäre leistete.</p>

<p>Wohl nicht zuletzt durch diese "Stärkung" zu Beginn war die Teilnehmerschaft bei diesem Dojo besonders motiviert. Nach der obligatorischen Begrüßung ging es auch schon an die Wahl des Modus und des Kata's. Wir haben uns nach Abstimmung für den <a href="dotnet-coding-dojo.html">Prepari-Modus</a> entschieden und uns wieder einmal an das sagenumwobene <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataBankOCR">Kata BankOCR</a> ausgesucht. Auf Grund der Teilnehmerzahl haben wir auch die Gruppe in zwei Teams und separate Räumlichkeiten aufgeteilt.</p>

<p>Dabei gab es diesmal einige Besonderheiten. Bei Avanade haben die Meetingräume Namen von berühmten Münchener Persönlichkeiten - so kam es auch, dass wir den Teams auch diese Namen gaben. Darüber hinaus haben beide Teams eigene "Operator" und "Coder" gehabt. Für das Team "<a href="http://de.wikipedia.org/wiki/Leo_von_Klenze">Von Klenze</a>" war der Operator diesmal Christian; die Macht über die Tasten hatte Tom. Das Team "<a href="http://de.wikipedia.org/wiki/Oskar_von_Miller">Von Miller</a>" wurde durch den Operator Andreas unterstützt, während Dimi über die Kontrolle über den Rechner hatte.</p>

<p>Nach der Teamaufteilung ging es schon los. 45 Minuten lang wurde kräftig designed, diskutiert und programmiert. Bei beiden Teams war das TDD schon in Fleisch und Blut übergegangen, denn schließlich hatten beide zur 5 minütigen Pause schon Tests und Code aufzuweisen. Zuversichtlich ging es dann auch schon in die zweiten 45 Minuten. Mein persönlicher Eindruck war, dass gerade diese zweite Runde viele Aha-Effekte auslöste damit den Erfahrungsaustausch besonders förderte.</p>

<p>Den Abschluß des Dojo's machte eine (diesmal etwas längere) Retrospektive. Die Teilnehmer gaben Feedback zum Code, zur Teamleistung und zur eigenen Perspektive. Wiederum bemerkenswert war die allgemeine Zufriedenheit über den Ablauf des Dojo und die geleisteten Resultate. Nach ein paar Schlußworten meinerseits ging es dann noch (mit nahezu gleicher Teilnehmerzahl) in ein Bistro in der Nähe auf eine ausgedehntere Nachbesprechung eines der besten .NET Coding Dojo's, die ich jemals erlebt habe. Vielen Dank an alle Teilnehmer und an Avanade!</p>

<p>Zum Abschluss noch paar Impressionen von dem wunderbaren <a href="http://vimeo.com/13984765">Coding Dojo bei Avanade</a>.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Ratatouille Estimation Scale</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ratatouille-estimation-scale.html"/>
            <updated>2010-07-12T19:19:56Z</updated>
            <published>2010-07-12T19:19:56Z</published>
            <id>/ratatouille-estimation-scale.html</id>
            
            <content type="html"><![CDATA[
                <p>Manchmal ist es nicht einfach, umzudenken. Manchmal will man verstehen, tut sich aber schwer. Mir ist das schon einige Male passiert. Ich denke, jedem passiert das ab und an einmal.</p>

<p>So oder ähnlich erging es auch dem ein oder anderen beim jüngsten Estimation Meeting, welches wir in einem Projekt durchgeführt haben. Für einige war es das erste Schätzmeeting, bei dem nicht einfach so Manntage herausposaunt wurden, sondern das von agilen Methoden wie XP oder Scrum bekannte schätzen in <a href="http://de.wikipedia.org/wiki/Extreme_Programming#Aufwandsabsch.C3.A4tzung">Relationsgrößen (z.B. Story Points)</a> umgesetzt wurde.</p>

<p>Für den Anfänger ist der Zeitbezug im Schätzungsverfahren meist so manifestiert, dass er sich schwer tut, überhaupt anders denken und schätzen zu können. Die erste, wichtige Hürde hin zum relativen schätzen ist eine klare Vorstellung davon, was nun der Unterschied zwischen größenorientiertem Umfang und zeitorientiertem Aufwand ist. Um den Teilnehmern und Neulingen im agilen Schätzzirkus den Einstieg zu erleichtern, habe ich mich einer kleinen Metapher bedient:</p>

<p><img alt="Ratatouille Estimation Scale" src="/media/images/ratatouille_scale.jpg" /></p>

<p>Da ist er, der „<em>Ratatouille Estimation Scale</em>“. Klassisch, einfach. Fibonacci und am Ende Hightower-Zahlen. Das war’s. Doch es ist mehr dahinter als nur die blanken Zahlen. Es ist die Metapher, die beim Schätzen besonders geholfen hat.</p>

<p>Denn der Film „<a href="http://disney.go.com/disneyvideos/animatedfilms/ratatouille/">Ratatouille</a>“ und die Liebe zu Gaumenschmaus ist ein schönes Beispiel, an dem sich größenorientiertes Schätzen erklären lässt. Bei der Menge der Köstlichkeiten geht es nämlich nicht darum, wie „schnell“ man diese Leckereien herunterwürgen kann. Es geht auch nicht darum, einfach wahllos seinen Hunger zu befriedigen. Nein, es geht darum, den <a href="http://www.youtube.com/watch?v=wlCAq45TcxU">Umfang und Wert der Köstlichkeiten zu erfassen</a> ;-)</p>

<p>Nur ein Häppchen? Wohl eher eine 1 oder 2. Ein echtes Stück Käse? Eher die 5. Viel Käse und Trauben dazu? Lecker. An die 20. Kistenweise Käse, Gemüse, Obst und Wein? Wow. 50 oder mehr!</p>

<p>Die Besonderheit dabei: Es wird schnell deutlich, dass es nicht um die Zeit geht. Schließlich kann man ein Stück Käse sicherlich in ein paar Stunden „abfrühstücken“ – oder aber scheibchenweise über eine Woche lang genießen. Mit steigendem Umfang wird es allerdings schwerer. Denn jetzt kommen andere Lebensmittel hinzu, die vielleicht andere Haltbarkeitsmerkmale aufweisen oder aber besondere Behandlung bzw. Lagerung benötigen. Das ist ein relativ schönes Bild für den Begriff der “Komplexität im Umfang“.</p>

<p>Den Neulingen im Estimation Meeting hat diese Metapher sehr geholfen, denn schon nach den ersten paar Schätzrunden war die "Zeit" in der Besprechung der Features „wie verschwunden“ :-)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Unit Tests sind immer dabei</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/unit-tests-sind-immer-dabei.html"/>
            <updated>2010-07-12T00:20:17Z</updated>
            <published>2010-07-12T00:20:17Z</published>
            <id>/unit-tests-sind-immer-dabei.html</id>
            
            <content type="html"><![CDATA[
                <p>Vor knapp einer Woche stellte Stefan die Frage „<a href="http://www.lieser-online.de/blog/?p=235">Wohin mit den Tests</a>?“ gestellt. Er selbst schreibt, er trenne die Implementierung und deren Tests strikt, ließ sich allerdings zu einem Experiment hinreißen, in dem er Implementierung und Tests in einem einzigen Projekt ließ. Alles in einer Assembly also. Motiviert wurde er wohl durch meine Aussage, dass es <a href="auf-dem-eisberg.html">schlichtweg einfach nicht mehr zeitgemäß</a> ist, Tests vom SUT zu trennen.</p>

<p>Und genau so ist es auch. Zumindest für mich. Ich habe lange Zeit Tests und Implementierung in separaten Projekten entwickelt. Bis ich bemerkt habe, dass es mir nicht hilft, sondern mich eher bei meiner Entwicklung stört. Seitdem halte ich Tests und Implementierung immer ganz nah beieinander, sozusagen „Seite an Seite“. Ich möchte in diesem Post meine Beweggründe &amp; Konsequenzen für Side-by-Side-Specs (oder Near-Specs, wie ich es gerne nenne) schildern, und somit meine Antwort auf Stefan’s Frage geben.</p>

<p>Nun zunächst einmal beschränke ich mit bei den Near-Specs auf Unit Tests. Ganz klassisch im Sinne des TDD. Integrationstests sind bei mir nach wie vor Far-Specs, also separate Projekte. Doch es soll ja um die Unit Tests gehen, besser gesagt um Tests, die aus dem Test-First-Ansatz heraus entstehen. Das können Tests bei TDD oder aber auch Specs bei BDD sein. Ergo: Tests, mit denen ich meinen Code designe &amp; entwickle, halte ich sehr nah am Code.</p>

<h3 id="verhalten-greifbar-formen">Verhalten greifbar formen</h3>

<p>Doch wieso sind bei mir die Tests nun an der Implementierung dran? Es gibt einen ganz einfachen und für mich auch unschlagbar effektiven Grund: Die Tests sind greifbar. Sie sind dort, wo ich sie brauche, nämlich an dem Verhalten, für das ich sie zur Spezifikation gebraucht habe. Seit dem ich die Tests an der Implementierung habe, „forme“ ich auch mehr und öfter. Soll heissen: Ich führe öfter und effizienter Refactorings durch. Nicht nur vom SUT, sondern natürlich auch von den Tests selbst.</p>

<p>Überhaupt ist es mit den Tests im Implementierungsprojekt ein ganz anderes, viel effizienteres arbeiten. Wenn ich nach einiger Zeit wieder einmal in einem Projekt etwas zu tun habe, schaue ich mir die Tests an. Das Schöne bei den Near-Specs ist jetzt, dass ich sehr schnell zwischen Spezifikations- und Implementierungssicht wechsle und deutlich zügiger navigieren kann. Das fällt mir besonders bei Tests mit mehreren Abhängigkeiten / Mocks auf. Ich komme mit dieser Art von „Code lesen“ viel besser zurecht als vorher mit dem hin- und herspringen zwischen mehreren Projekten.</p>

<p>Zugegeben, anfangs tat ich mir noch ein wenig schwer, denn schließlich ist die Anzahl der Testklassen - genereller: die Menge an Testcode - für ein SUT meist deutlich mehr. Neben der Umgewöhnung des „nicht mehr über Assembly-Boundaries“ hinweg arbeitens hatte ich das Gefühl, dass mich der Testcode „stört“ oder mir „im Weg steht“. Doch dieses Gefühl war schnell wieder weg, als ich das Prinzip auf größere Projekte angewendet habe und immer wieder die Tests für die Spezifikation und das Codeverständnis gebraucht habe. Spätestens dann war bei mir die Erkenntnis da: Side-By-Side-Specifications Rule!</p>

<p>Doch mit dieser „Colocation“ der Tests an die Implementierung tauchen neue Fragen auf. Eine ganz besonders oft gestellte Frage ist die der Auslieferung der Tests in Release-Assemblies. Es ist schließlich erstrebenswert, nur das in ein Release einfliessen zu lassen, was auch wirklich vom Benutzer gebraucht wird: die Funktionalität. So stand ich auch vor dieser Aufgabe, welches sich aber sehr schnell und vor allem einfach bewältigen ließ.</p>

<h3 id="reduce-to-the-max">Reduce to the Max</h3>

<p>Die Idee ist denkbar einfach: Wenn ich Tests und Implementierung zur Entwicklungszeit nicht trenne, dann trenne ich sie eben später, undzwar zur Auslieferungszeit. In einfachen Worten: der Build muss diese Aufgabe erledigen. Da ich sowieso meinen Code über Build-Skripte bauen lasse, lag es sehr nah, diese Skripte einfach anzupassen. Für meine eigenen Projekte habe ich oft ein kleines Powershell-Skript. Bei größeren Projekten oder CI-Umgebungen ist der Aufruf eines eigenen Post-Clean-Events vor dem Build ein guter Extension-Point.</p>

<p>Als ich die Menge und den Inhalt der Kommentare bei Stefan’s Post gesehen habe, dachte ich mir nur: warum schreiben so viele darüber und finden es „schwierig“ oder „unsauber“, ohne es offensichtlich einmal probiert zu haben? Ich habe es probiert und ich fand es überhaupt nicht schwierig – ganz im Gegenteil. Jetzt ist das für mich eine viel angenehmere, effizientere und vor allem intuitivere Arbeitsweise. Das Build-Skript zum filtern der Testartefakte ist denkbar einfach, bei mir sind das meistens nur so 10 bis 20 Zeilen. Schließlich ist es ja auch „nur“ ein Release-Build. Ich rufe es nicht die ganze Zeit auf wie ein CI-Build, und CD mache bzw. brauche ich derzeit auch nicht.</p>

<p>„Soooo lange, wie ich brauche, diese Kommentare überhaupt zu lesen, brauche ich nicht einmal, wenn ich sogar das Build-Skript per TDD erstelle“ war mein Gedanke, als ich mit dem Lesen der Kommentare fertig war. Und da ich ein Freund von <a href="http://twitter.com/ilkerde/status/18264412106">empirischen Erkenntnissen</a> bin, dachte ich mir: „Auf geht’s, das machst Du jetzt!“. Gesagt getan. Das <a href="https://github.com/ilkerde/CodeKatas/tree/master/KataFizzBuzz.SideBySide">Ergebnis</a> kann man sich auf github ansehen. Erkenntnis: Die Entwicklung des Build-Skripts (ohne TDD Framework und mit meinen „bescheidenen“ Powershell-Kenntnissen) hat etwas mehr als eine Stunde gedauert. So lange habe ich in etwa auch zum Lesen der Kommentare gebraucht ;-)</p>

<h3 id="separation-of-concerns">Separation of Concerns</h3>

<p>Doch zurück zum Thema. Beim Lesen der Kommentare ist mir auch aufgefallen, dass man öfter das Argument der „Separation of Concerns“ (SoC) gegen die Zusammenführung von Tests und Implementierung anbringt. Es sei im Sinne der SoC, Tests von der Implementierung zu trennen. Auch gute Freunde von mir, wie z.B. <a href="http://twitter.com/tehlike">Tehlike</a> – für den ich im Übrigen diesen Post <a href="to-whom-it-may-concern.html">auch auf Englisch verfasst habe</a> - entgegneten mir das gleiche Argument. Dazu mein Statement:</p>

<p><strong>Tehlike, yanılıyorsun! ;-)</strong>
<em>(Auf deutsch: Tehlike, Du irrst Dich!)</em></p>

<p>Ja, ich denke diejenigen irren sich, die SoC als Argument für eine Trennung von Tests &amp; Implementierung anbringen. Sie irren sich meiner Meinung nach sogar gewaltig. Denn SoC ist in meinen Augen bei genauerer Betrachtung sogar ein Argument für die Zusammenlegung von Tests und Implementierung.</p>

<p><a href="http://en.wikipedia.org/wiki/Separation_of_concerns">Separation of Concerns</a> besagt nämlich, dass unterschiedliche Zuständigkeiten eines Objekts voneinander getrennt werden sollten. Zuständigkeiten sind im Sinne der Domänenmodellierung und Systemanalyse Aspekte von Verhalten und Funktionalität. Ergo: Unterschiedliche Zuständigkeiten eines Verhaltens sollten voneinander getrennt werden. Ein schönes Beispiel ist der Taschenrechner. Die Funktionalität des Addierens des Taschenrechners gestaltet sich aus dem Tastenfeld, der Recheneinheit, und der Anzeige. All das sind Aspekte der Funktionalität, die in eigenständige Zuständigkeiten münden. Im Sinne der „Separation of Concerns“ sind diese Aspekte zu trennen und damit die Komponentenorientierung und Wiederverwendbarkeit zu stärken.</p>

<h3 id="completeness-of-concern">Completeness of Concern</h3>

<p>So weit, so gut. Doch Separation of Concerns bedeutet für mich im Umkehrschluß auch, dass man eine Zuständigkeit einer Funktionalität auch zusammenhalten sollte. Ein einziger „Concern“ sollte in sich geschlossen sein. „Das ist er doch automatisch“ denkt man sich. Naja, ganz so einfach ist es meiner Meinung nach nicht. Denn eine Zuständigkeit einer Funktionalität findet man in der Software-Entwicklung oftmals nicht als „ganze Einheit“ an einem Fleck, sondern überall verteilt.</p>

<p>So wird z.B. in der klassischen Softwareentwicklung die Zuständigkeit in den Requirements erfasst. Man findet sie in der Use-Case-Dokumentation und in UML-Diagrammen wieder, diesmal mit ein oder zwei Szenarien. Natürlich wird das Verhalten und dessen Aspekt auch in den Tests manifestiert – dazu sind sie ja da. Und – wer hätte das gedacht – die Funktionalität findet man auch im Code wieder. Resultat: Ein einziger Concern, der im Entwicklungsprozess an allen möglichen Stellen auftaucht. In einem solchen Szenario ist es für den Entwickler meistens wie ein Puzzle, bei dem die Puzzlestücke überall sind – nur nicht auf dem Tisch.</p>

<p>Es ist also für die „Vollständigkeit einer Zuständigkeit“ nicht hilfreich, Tests und Implementierung voneinander zu trennen. Weiterhin hat das Trennen von Tests und Implementierung nichts mit Separation of Concerns zu tun, denn schließlich geht es sowohl bei den Tests als auch bei der Implementierung um einen einzigen Concern – dem Aspekt der Funktionalität, die das SUT eben abbilden soll.</p>

<p>Es ist gerade die Fraktion der BDD-Anhänger, die genau diesem Umstand mit all Ihren Argumentationen und Prinzipien hervorheben möchten. Sie reden nicht von Tests, sondern von Spezifikationen, sie reden nicht über Verifikation, sondern über Verhalten. Ja, sie gehen sogar soweit und reden im Sinne der Context-Specifications von „Concerns“, also „Zuständigkeiten“. Das alles sind klare Hinweise, das die Spezifikation eines Verhaltens und deren Umsetzung als unzertrennliches Paar zu betrachten sind. Übrigens ist diese „Expressivität“ auch ein Grund, warum „BDD“ so gut geeignet ist für Einsteiger in TDD bzw. Test-First.</p>

<h3 id="feels-just-like-it-should">Feels just like it should</h3>

<p>Wenn man mal eine gewisse Zeit per TDD/BDD entwickelt, dann fällt einem oft auf, dass man bei jeder Änderung mindestens zwei Dinge ändert. Man ändert oder erweitert die Tests und man ändert oder erweitert die Implementierung. Ein Verhalten, eine Zuständigkeit, doch zwei Perspektiven, zwei Änderungspunkte.</p>

<p>Das ist bei Far-Specs, (also getrennten Tests und Implementierung über Assembly-Boundaries) genauso wie auch bei Near-Specs (Tests &amp; Implementierung Seite-An-Seite). Doch bei Near-Specs ist es einfacher, schneller und intuitiver, Änderungen am System durchzuführen. Darüber hinaus wird das Streben nach „Vollständigkeit eines Verhaltens und deren Zuständigkeit“ gestärkt. Das wiederum zahlt auf Lesbarkeit, Wartbarkeit und Flexibilität ein.</p>

<p>Seit nun seit knapp 3 Monaten entwickle ich Unit Tests, TDD &amp; BDD ausschließlich per „Side-By-Side-Specifications. Diese „andere“ Art der Codeorganisation ist für mich äußerst angenehm und effektiv gleichermaßen. Für mich ist es ein stückweit näher dran am „TDD-Spirit“, dem test- bzw. spezifikationsgetriebenen designen und entwickeln von Software. Mit Tests &amp; Implementierung nebeneinander fühlt es sich so an, wie es eigentlich sein sollte.</p>

<p>Also: <a href="http://www.youtube.com/watch?v=9LCEsRno1cg">Feels just like it should</a> ;-)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">To Whom It May Concern ?!?</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/to-whom-it-may-concern.html"/>
            <updated>2010-07-12T00:16:33Z</updated>
            <published>2010-07-12T00:16:33Z</published>
            <id>/to-whom-it-may-concern.html</id>
            
            <content type="html"><![CDATA[
                <p>Note: <em>Diesen Artikel gibt es auch auf <a href="unit-tests-sind-immer-dabei.html">Deutsch</a></em></p>

<p>It’s been something like a week since Stefan asked a provoking question in his blog (german): „<a href="http://www.lieser-online.de/blog/?p=235">Where to put the Tests?</a>” He wrote that he’s strictly separating tests from their implementation in separate projects. However, motivated by a statement of me, he gave the idea of having tests &amp; implementation in the same project a try. Wow, all code in one assembly. He as well as a punch of commentators on his blog came to the conclusion, that separating tests from implementation using separate projects is better. I argue the converse.</p>

<p>It’s simply <a href="auf-dem-eisberg.html">old-fashioned style to separate tests &amp; implementation with separate projects</a>. I did separate my tests from implementation code for years. However, about half a year ago, I realized that this separation doesn’t help me much. Instead, it hinders my development process. Since then I keep tests &amp; implementation together in one project. They are located as near to each other as possible. Let’s name this “side-by-side” residency. In this post I want to show and explain the main reasons, consequences and experiences in favor of “side-by-side specifications” or “near specs”.</p>

<p>Well, first of all, I reduce the practice of „near specs” to unit tests only. Just as in classical sense of TDD. Integration tests and verification-driven tests are located in separate projects (thus being “far specs”), as usual. For me, putting tests and implementation altogether in one project makes sense in test-first approaches. That is, TDD testing or BDD specifications. Ergo: It’s about tests I use to drive my implementation. Tests, which I’m using to design and develop the desired functionality.</p>

<h3 id="the-grip-of-behavior">The grip of behavior</h3>

<p>So, what’s the point then to put tests and implementation side-by-side? In my opinion there’s a quite naive, yet effective reason: You get grip of your tests. The tests are simply there. They’re where I need them; they’re there where I expect them. They are right there where the behavior is. Since I keep tests next to my implementation, I’m just better able to “put them in shape”. Means: I do refactorings a lot more effective and frequent. Naturally not only on SUT, but tests as well.</p>

<p>Generally speaking, it’s a kind of different, more efficient style of development to work with implementation &amp; tests right at hand. Coming back to projects after some time makes it a breeze. I just look and read the tests. Then, I navigate frequently between tests and implementation to understand the details. “Near specs” make it less painful and more pleasant to read the code. This is especially the case for tests where several dependencies / mocks exist. No jumps through projects, no loading of solutions here and there. Just reading, that’s it.</p>

<p>To put it candidly, it was hard at start. The number of test classes – or the amount of test code in general – is quite a lot compared to implementation code only. I had to get used to it somehow. From time to time, I had a strange feeling that my tests are distracting me. It was so unusual for me that I felt that my tests “messed up” my organization in my “production” project. It didn’t last long though. As I continued to keep my tests right where my implementation is, I more and more realized how cool and beneficiary it is to do so. Especially as I utilized this approach on a larger codebase. Since then, it’s clear for me: putting specifications/tests side-by-side rules!</p>

<p>Wait, the world’s not shining always. New questions arise with this new “colocation” of tests right where the implementation is. Probably the most often asked is how the release assemblies of such applications look like. Needless to say, it’s desirable to let release assemblies contain only what the customer actually needs: the functionality. However, with tests in same assembly, how would you achieve this?</p>

<h3 id="reduce-to-the-max">Reduce to the Max</h3>

<p>The solution is quite simple: If tests and implementation are no longer divided in design- or development-time, then the split-up needs to take place later on, at delivery-time! Simply put, the build needs to take care of this task. Since I’m used to use build scripts for my projects, it’s quite a common thing for me to adjust end enhance my scripts to filter out the test classes and test-related references. For my own tiny projects, I most often use powershell scripts. At larger contexts with CI and Buildsystems, a call to a cleanup extension is an obvious, handy task.</p>

<p>Back to Stefan’s post. As I read through comments, I thought to myself: Why do so many people write so much about it and judge this approach as “tricky” or “dirty” without obviously not having tried it once? I did give it a try and I’m feeling very fine with it. It’s neither difficult, not dirty at all. The contrary is the case. Now that I use „near specs“, my daily TDD and development life is more pleasant and effective than before. Building a filter for test-related artifacts is an easy task. In my scripts, I usually need about 10 lines for this. Moreover, it’s worth to keep in mind that filtering is “only” needed for release builds. No CI build whatsoever affected.</p>

<p>Once read through the whole thread, I just said to myself: „I even would build my build script test-first faster than reading all this”. As some of you know me as a <a href="http://twitter.com/ilkerde/status/18264412106">friend of empiric results and measurement</a>, it’s obvious that I needed to check if my statement really would turn out true. Just do it and see if it’s really that fast and easy. No sooner said than done! I pushed the <a href="https://github.com/ilkerde/CodeKatas/tree/master/KataFizzBuzz.SideBySide">results to my github repository</a>. Brief summary: Even without test-framework and with my „limited“ powershell knowledge, I was able to build my test-artifact filtering in about the same amount of time I spent to read the blog. ;-)</p>

<h3 id="separation-of-concerns">Separation of Concerns</h3>

<p>Another argument quite often rose against putting tests and implementation together is “Separation of Concerns” (SoC). “Partitioning tests and implementation in separate projects is following this principle”, it’s being said. Even good friends of mine, like <a href="http://twitter.com/tehlike">Tehlike</a> bring SoC onto the table against “near specs”. By the way, I specially write this article in <a href="http://twitter.com/tehlike/status/18223527988">English for Tehlike</a>, and therefore:</p>

<p><strong>Tehlike, yanılıyorsun! ;-)</strong>
<em>(In english: Tehlike, you are mistaken!)</em></p>

<p>Yes, I think that those are mistaken who think that SoC is a reason to split tests and implementation. From my perspective, the opposite is the case. SoC is – once considered to look at it carefully - even a reason to put tests and implementation side-by-side.</p>

<p>The essence of <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">Separation of Concerns</a> is quite easy: diverse perspectives, say „concerns“, of a behavior of an object should be separated. „Concerns“, in context of domain modeling and system analysis, are aspects of behavior and functionality. Take the calculator example. The functionality of „addition“ of a calculator has different aspects. You need to enter the numbers through keys, the calculation unit needs to add the numbers, and the sum needs to be displayed. All concerns – better: different concerns – of one functionality. With respect to „Separation of Concerns“, those aspects need to be separated. In consequence, a component-oriented and reusable solution is fostered.</p>

<h3 id="completeness-of-concern">Completeness of Concern</h3>

<p>So far, so good. But wait. For my understanding, Separation of Concerns means by implication, that a single concern should strive towards entirety. That is, one single concern ideally should aim completeness. „Isn’t this automatically the case?“ you might think. Mhh, not really, in my opinion. Most often, one concern is located on very diverse and unusual locations within a software development process.</p>

<p>Take the „classical“ software engineering scenario as an example. A behavior and its concern is described in requirements documentation. You can find different, mostly edgy details of the same concern in UML diagrams and Use Case documents. Of course, tests reflect the concern again. Well crafted, tests most likely specify the concern at its best. Naturally, the concern is in production code, implanted as final functionality of the system. And what’s the result now? Straight answer: The result is a mess. Most often, a developer finding himself in such a situation is faced with puzzle pieces everywhere – but not on the table.</p>

<p>Hence, for me it’s obvious that partitioning tests and implementation in separate projects is not helping me to strive towards „Completeness of Concern“. Moreover, splitting up tests an implementation is not related to Separation of Concerns. Both tests and implementation care about the same concern, that’s the simple truth.</p>

<p>BDD lovers in the wild will clap their hands. The abovementioned is more or less the same they proclaim over and over. They don’t talk about tests; they care about “specs”. They don’t talk about verification; they care about “behavior”. Yes, they even care about concerns, drivers and observations. Altogether, this is even for beginners quite a good hint towards a mindset, where tests and implementation build a chained, inseparable pair.</p>

<h3 id="feels-just-like-it-should">Feels just like it should</h3>

<p>Let’s face it. Once developing a reasonable time in TDD/BDD style, you clearly realize one thing: Whenever you need to change or extend the system, you have at least two „changepoints“. First, you change tests. Right afterwards, you change your implementation. One single behavior, one single concern. But two perspectives, two edits. That’s the case for „far specs“ (that is, tests located in a separate project) as well as for “near specs” (that is, tests residing in the same project along with the implementation “side-by-side”).</p>

<p>The difference: With near specs, you change and develop the system faster, &amp; easier. It’s simply more efficient and intuitive. Near specs foster „Completeness of Concern“. This essentially contributes to better readability, maintainability and flexibility of the overall system.</p>

<p>It’s been more than 3 months now since I started to structure my unit tests strictly side-by-side along to my implementation. For me, this “different” style of code organization is absolutely pleasant and effective. Right now, I can’t think of switching back. In my opinion, putting tests and implementation as near as possible is in favor of the “TDD spirit”. With tests and implementation being at the same place, for me TDD now more and more “<a href="http://www.youtube.com/watch?v=9LCEsRno1cg">feels just like it should</a>” ;-)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Auf dem Eisberg</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/auf-dem-eisberg.html"/>
            <updated>2010-07-01T15:47:20Z</updated>
            <published>2010-07-01T15:47:20Z</published>
            <id>/auf-dem-eisberg.html</id>
            
            <content type="html"><![CDATA[
                <p>Ich bin auf dem Eisberg. Ich bin alleine. Doch zunächst geht es hier nicht um mich, sondern um die „Community“.</p>

<p>In vielen Kommentaren und Blog-Posts wurde die jüngste Bewegung über .NET Coding Dojo’s als „für die Community nicht hilfreich“ tituliert. Jetzt, wo es zwei verschiedene „Stile“ von .NET Coding Dojo’s gäbe, sei auch noch ein entscheiden und ein „was ist nun besser“ hinzugekommen. Den Meinungen kann ich mich größtenteils anschließen. Doch ich möchte noch etwas hinzufügen: Das philosophische, frenetische, ja fast religiöse Reden und Ausarbeiten dieser „Stilunterscheidung“ zwischen Schwarm und Latifa ist mir doch deutlich zu krass und hat mich über die letzten Tage mehrheitlich nur dazu gebracht, beim Lesen der Meinungen immer wieder zu denken: „<a href="http://www.youtube.com/watch?v=xvk2eLbnh0c">Hääh, oder wie oder wat?</a>“</p>

<h3 id="eine-bereicherung">Eine Bereicherung</h3>

<p>Insofern finde ich es ein schlechtes Signal und eine besorgniserregend überspannte Kommunikation, von „<a href="http://ralfw.blogspot.com/2010/06/zeig-mir-deinen-code-und-ich-nenn-dir.html">der Teilung der Dojo-Welt</a>“ oder der „Trennung der Community in zwei Lager“ zu sprechen. Das Gegenteil ist der Fall, die „Community“ wird bereichert. Sie wird bereichert um andere Sichtweisen, um andere Vorgehensweisen und andere Menschen – ganz unabhängig davon, ob die Bereicherung nun als gut oder schlecht zu bewerten ist.</p>

<p>Darüber hinaus ist es schlichtweg überzeichnet, wenn man sich so massiv mit der „Gestaltung von Coding Dojo’s“ auseinandersetzt und die „Stilrichtungen“ oder “Schulen“ miteinander in fast religiös ausufernder Manier differenziert. Coding Dojo’s sind bei weitem nicht das einzig wichtige für einen Software-Entwickler, zumindest für mich. Ich mache Coding Dojo’s aus Spaß - in meiner Freizeit. Andere machen es vielleicht aus einer anderen Motivation heraus. Aber das in letzter Zeit ist mir deutlich zu viel des Guten, wenn es überhaupt dem Attribut gutwillig genüge träge. Es gibt auch noch andere Dinge, also sollte man das ganze <a href="http://de.wikipedia.org/wiki/Tohuwabohu">Tohuwabohu</a> um die .NET Coding Dojo’s relativieren.</p>

<p>Ich bin mir durchaus bewußt, das die <a href="lerne-lehre-ilker-net-coding-dojo-latifa-stil.html">Erhebung meines „Latifa“-Stils</a> ein Treiber in dieser Entwicklung war, wenn auch nicht der einzige. Jedoch war es nicht meine Motivation, irgendwelche „Lagerschaften“ zu erarbeiten. Nein, vielmehr ist diese Formalisierung der Regeln aus der Erfahrung des Coding Dojo’s bei den dotnetpro.powerdays entstanden. Meine Wahrnehmungen waren nämlich deutliche Divergenzen zwischen dem Verhalten einzelner Teilnehmer und den als „Latifa“ titulierten Werten.</p>

<h3 id="latifa-ist-tot-es-lebe-latifa">Latifa ist tot, es lebe Latifa</h3>

<p>Ich denke auch, dass die Werte-Prinzipien sowie auch andere Prinzipien, auf die ich hier nicht näher eingehen werde, nicht als spezifisch für ein Coding Dojo reduziert werden können. Ich denke, die „Latifa-Werte“ sind über ein Coding Dojo hinaus auch im täglichen Miteinander und Arbeiten beachtenswert. Deswegen – und wegen der für mich zu konterkarierenden Darstellung der Stilisierung von Dojos – werde ich die Latifa-Werte nicht mehr ausschließlich im Kontext von Coding Dojo’s anwenden. Es gibt kein „Latifa-Coding-Dojo“ mehr. Weil für mich diese Werte &amp; Prinzipien nicht nur für Coding Dojo’s gelten, sondern in meiner Welt Anspruch auf Allgemeingültigkeit erheben.</p>

<h3 id="schwarm-druber">Schwarm drüber?</h3>

<p>Also, alles wieder gut, alles wieder lustig und soz. „<a href="http://ralfw.blogspot.com/2010/06/kollektiv-intelligent-codieren.html">Schwarm</a> drüber“? Nein, ist meine klare Antwort. Jedenfalls nein für mich. Es ist ja auch meine Perspektive, die ich hier schildere. Ich habe für mich erkennen und lernen dürfen, dass ich offensichtlich eine eingeschränktere Menge an Gemeinsamkeiten mit Meinungen, Verfahrensweisen, und Prinzipien anderer habe. Besonders ist mir aufgefallen, dass ich - für mein eigenes Bedauern - mit <a href="http://ralfw.blogspot.com/">Ralf</a> und <a href="http://www.lieser-online.de/blog/">Stefan</a> weniger Gemeinsamkeiten habe als ich zunächst vermutete.</p>

<p>Ich habe den Eindruck, dass meine Ansichten &amp; Werte sich von den Werten &amp; Prinzipien von Ralf &amp; Stefan auf fachlicher Ebene deutlich unterscheiden. Meine Wahrnehmung ist weiterhin, dass die Unterschiede zwischen mir und Ralf/Stefan auf persönlicher Ebene noch deutlicher sind. Für mein Empfinden ist für diese Relation der Begriff des „<a href="http://de.wikipedia.org/wiki/Diametral">diametralen entgegen stehens</a>“ durchaus treffend.</p>

<h3 id="das-net-coding-dojo-fur-profis-ist-schwarm">Das .NET Coding Dojo für „Profi’s“ ist Schwarm ?!?</h3>

<p>Ein Beispiel dafür ist für mein Empfinden die Zielsetzung bei Coding Dojo’s. Ich mache Coding Dojo’s in meiner Freizeit und ich möchte in meiner Freizeit Spaß haben. Das ist für mich soetwas wie ein Primärziel. Diesen Eindruck habe ich von der Zielsetzung von Ralf nicht. Für mich stellt sich die Zielsetzung von Ralf als zielorientiert und leistungsorientiert dar. Bei Ralf geht aus meiner Sicht deutlich mehr um „professionelles Lernen“.</p>

<p>Ein weiteres Indiz ist sicherlich die unterschiedliche Betrachtungsweise von „professioneller &amp; moderner Softwareentwicklung“. Für mein Empfinden genügen doch eine ganze Menge an Ansichten und „Lehren“ von Ralf &amp; Stefan nicht mehr meinem Anspruch der professionellen &amp; modernen Softwareentwicklung.</p>

<p>Das fängt für mich schon bei unnötigem <a href="http://ralfw.blogspot.com/2010/06/zeig-mir-deinen-code-und-ich-nenn-dir.html">Sauberkeitsfetisch wie dem Trennen von Tests und Produktionscode in verschiedene Projekte</a> an. Das ist für mich ja schon fast wie jeden Tag das Auto durch die Waschanlage zu fahren. Zum Einen, weil der Code ein kleines Code Kata im Coding Dojo ist und keine Mission-Critical-Anwendung. Zum Anderen, weil es schlichtweg nicht mehr zeitgemäß ist, Tests vom SUT zu trennen. Je näher sie zueinander stehen, um so besser.</p>

<h3 id="frankreich-wird-fuballweltmeister">Frankreich wird Fußballweltmeister</h3>

<p>Ich könnte jetzt weitermachen und „weiterwettern“, z.B. das für mein Dafürhalten das von Ralf &amp; Stefan transportierte „TDD“ mit der Anleitung des „vorher die Lösung auf Papier erfassen“ und dann „gestärkt und mit klarem Kopf Tests programmieren“ so viel mit TDD zu tun hat wie Frankreich mit der Fussballweltmeisterschaft <em>(Anmerkung des Autors für den "ernsthaften" Leser: Das war ein kleiner übertriebener Witz am Rand. Bitte schmunzeln, Danke.)</em></p>

<p>Doch ich werde dieser Versuchung widerstehen, denn ich habe für mich erkannt, dass es eben verschiedene Ebenen und subjektive Wahrnehmungen von professioneller &amp; moderner Software-Entwicklung gibt. Ich hatte schon im meinem Artikel über „<a href="lerne-lehre-ilker-net-coding-dojo-latifa-stil.html">mein .NET Coding Dojo</a>“ (ergo: meine Perspektive eines Coding Dojo’s) schon angedeutet, dass ich mich gerade mit dem Thema <a href="tdd-ist-keine-wissenschaft.html">TDD</a> &amp; Planung noch deutlich sowie ausführlich äußern möchte und werde. Zurück zur Professionalität &amp; Modernität.</p>

<p>Meine Wahrnehmung der unterschiedlichen Grade und Auffassungen von fachlicher sowie persönlicher Professionalität &amp; Modernität zwischen dem nun nicht mehr vorhandenen „Latifa-Dojo“ und dem „Schwarm-Dojo“ ist es auch, die mich dazu veranlasst, ab heute auch bestimmte Begriffe bei meiner Kommunikation mit .NET Coding Dojo’s explizit auszuschließen. Dazu zählen „Lerne &amp; Lehre“, „Professionell“ &amp; „Modern“.</p>

<p>Das heisst nun keineswegs, dass es keine Coding Dojo’s gibt, die moderne &amp; professionelle Software-Entwicklung fokussieren. Das heisst vielmehr, dass ich mir moderne &amp; professionelle Methoden bei einem Coding Dojo wünsche, aber sie eben nicht bei allen erfüllt werden.</p>

<h3 id="fun-as-fun-in-fun">Fun as fun in fun</h3>

<p>Abschließend kann ich für mich als folgendes Fazit ziehen: Ich werde weiter .NET Coding Dojo’s besuchen. Vor allem, weil sie mir Spass machen. Wenn sie mir keinen Spass mehr machen, dann werde ich sie auch nicht mehr besuchen. Der Spass steht bei mir im Vordergrund, denn es ist für mich eine Freizeitaktivität. Diese Freizeitaktivität hat mir viele Erkenntnisse beschert. Und das ist gut so.</p>

<p>Aber ich werde mich auch von Coding Dojo’s distanzieren, die dieses Primärziel für mein Dafürhalten nicht erfüllen. Dazu zählt für mich das „Schwarm-Dojo“. Es mag andere Meinungen dazu geben und auch andere Entwickler, die eben mehr Wert auf andere Komponenten legen. Für diese mag viellecht auch ein „Stil“ wie der Schwarm-Dojo schön, gut, frisch und fröhlich sein. Gut. Für mich ist es eben nicht so.</p>

<p>Selbst wenn die inhaltliche Substanz eines Schwarm-Dojo’s für mich attraktiv wäre (was sie für mich nicht ist), ja selbst dann würde ich mich auf Grund der momentan für mein Empfinden zu großen persönlichen Diskrepanz zu Ralf &amp; Stefan mit großer Wahrscheinlichkeit nicht dazu motivieren können, ein Dojo mit Ralf &amp; Stefan zu besuchen.</p>

<h3 id="auf-dem-eisberg">Auf dem Eisberg</h3>

<p>Ich werde weiter auf dem Eisberg sein. Wenn meine Werte, meine Prinzipien und meine Arbeitsweise mein Eisberg sind, dann bleibt mein Name zwar Ilker, aber <a href="http://www.youtube.com/watch?v=qU4I00s25ho">auf dem Eisberg bin ich so ähnlich wie Kalle.</a> :-) Na juuud juuuud juuud juuud juuud...</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Lerne &amp; Lehre: Ilker&#39;s .NET Coding Dojo</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/lerne-lehre-ilker-net-coding-dojo-latifa-stil.html"/>
            <updated>2010-06-25T17:15:50Z</updated>
            <published>2010-06-25T17:15:50Z</published>
            <id>/lerne-lehre-ilker-net-coding-dojo-latifa-stil.html</id>
            
            <content type="html"><![CDATA[
                <p>Das letzte Münchener Coding-Dojo war schon ein ganz besonderes. Wir, die Münchener Dojo-Crew waren zu Gast beim dotnetpro.powerday und waren überrascht, dass uns der Veranstalter vor dem Coding Dojo sogar noch Snacks &amp; Getränke gestellt hat. Einfach nur Toll! Meinen herzlichen Dank an <a href="https://www.xing.com/profile/Florian_Bender2">Florian Bender</a> und den <a href="http://www.dotnetpro-powerday.de/">dotnetpro.powerday</a>!</p>

<p>Doch nicht nur die Location war ganz besonders, sondern auch <a href="http://twitter.com/sforkmann/status/16759769373">das "Line-up" der Teilnehmer</a>. Es hatten sich mehr als <a href="https://www.xing.com/events/net-coding-dojo-empowered-508914">20 Teilnehmer für das Dojo auf der Xing-Gruppe angemeldet</a> – und es gab „on top“ noch ein gutes Dutzend Interessierter, die nach einem ganzen Tag geballter C#-Wissensvermittlung noch „Power“ genug hatten, beim Dojo dabei zu sein.</p>

<p>19:00 Uhr – es geht los, das Dojo wurde von mir mit einleitenden Worten eröffnet. Ich habe für die Neulinge in der Runde noch kurz die „Rahmenbedingungen“ abgesteckt: Lösen eines Code Kata per TDD, aktiv und gemeinsam. Alle coden, einer tippt (wir waren wieder im <a href="http://en.wiktionary.org/wiki/prepari">Prepari</a>-Modus). Es gibt kein Falsch und kein Richtig, es gibt keine dummen Fragen und keine dummen Antworten. So einfach ist das.</p>

<p>Ich habe dann auf Grund der großen Teilnehmerzahl den Vorschlag der Gruppenbildung unterbreitet und zur Abstimmung vorgelegt. Wir haben uns gemeinsam für eine große Gruppe statt zwei kleiner Gruppen entschieden.</p>

<p>Danach ging es auch schon zur Vorstellung der Kata’s: Ich hatte mit Pete gemeinsam eine Vorschlagsliste erarbeitet: KataTennis, KataRomanCalculator und KataBankOCR. Ein seltenes, aber schönes Erlebnis waren diesmal die Alternativ-Vorschläge der Teilnehmer, darunter Sudoku oder FizzBuzz. Nach einer kurzen Abstimmungsrunde war es soweit: <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataBankOCR">KataBankOCR</a> wurde gewählt.</p>

<h3 id="wie-wird-morgen-das-wetter">Wie wird morgen das Wetter?</h3>

<p>Die übliche „Anforderungsrunde“ wurde damit eingeleutet. Ich habe das Kata näher vorgestellt und nach offenen Fragen abgefragt. In dieser Phase haben wir uns auf besondere Dinge wie z.B. Zeilenhöhe und Ziffernabstand geeinigt und die Anforderungen klarer umrissen. Nach ca. 15 Minuten war es dann soweit, auf meine Frage „Noch offene Fragen?“ gab es nur noch die Gegenfrage „Wie wird morgen das Wetter?“. Damit war die Anforderungsrunde abgeschlossen.</p>

<p>Es konnte also losgehen. Aber wie legt man jetzt denn los? Das war die nächste Frage. Pete hatte Visual Studio schon offen, das Projekt war angelegt, das Test-Framework eingebunden. Die Tools waren bereit. Doch waren es die Teilnehmer auch? Eine geteilte Stimmung machte sich breit. Während die einen am Grübeln über den ersten Test waren, waren die anderen mit der Vorgehensweise nicht einverstanden und wollten erst mal „generell eine Architektur herausarbeiten“. Auch hier half die Abstimmung weiter. Mit äußerst knapper Mehrheit ließ man sich auf die Erarbeitung des ersten Tests ein, ohne eine „Lösungsanalyse“ im klassischen Sinne gemacht zu haben.</p>

<h3 id="test-schreiben-heisst-nachdenken">Test schreiben heisst nachdenken</h3>

<p>Das herausarbeiten des ersten Tests war garnicht so einfach wie es viele vielleicht vermutet hatten. Es gab Diskussionen über die Datenstruktur (<code>string</code> vs. <code>List&lt;string&gt;</code> vs. <code>IEnumerable&lt;string&gt;</code>) und wir taten uns schwer, einen richtigen Namen für unseren Test zu finden. Doch nach knapp 10 Min. hatten wir endlich den ersten Test, der das „Digit 0“ testet, rot. Und schon ging es an die Implementierung: „return 0;“! Ach, wie schön, das erste Erfolgserlebnis ist da!</p>

<p>Das motiviert schon gleich zum nächsten Test, der Erkennung von „Digit 1“. Schnell wurde der Test geschrieben und dann ging es wieder an die Implementierung. Diesmal war es natürlich schon schwerer, denn schließlich musste jetzt erkannt werden. Aber jetzt fingen auch die Neulinge an, aktiv an der Lösung zu arbeiten und brachten Vorschläge und Kommandos in die Runde ein. Es dauerte nicht lange, und man hatte mit einem einfachen String-Vergleich die Implementierung fertig.</p>

<h3 id="red-green-maybewzxhzdk0">Red-Green-Maybe<Refactor> ?</h3>

<p>Doch irgendwie war man nicht ganz mit dem Ergebnis zufrieden, denn der Ruf nach Refactoring wurde lauter. <a href="http://www.des-eisbaeren-blog.de/">Golo</a> mahnte an: „Es heisst Red-Green-Refactor und nicht Red-Green-Vielleicht-Refactor“. Sein Standpunkt: wenn man Refactoring nicht „im Kleinen“ und von Anfang an betreiben würde, dann würde der Aufschub noch mehr Probleme schaffen.</p>

<p>Andere wiederum sahen das nicht „so steif“, sondern beriefen sich auf den berühmten „Smell“. D.h. wenn eine Implementierung offensichtlich „Bereinigung verlangt“ um die Funktionalität weiter vorantreiben zu können, dann werde refaktorisiert. Auch hier die Abstimmung. Auch hier ein ganz knappes Ergebnis für den Aufschub des Refactorings.</p>

<h3 id="gibt-es-ein-abs-beim-tdd">Gibt es ein ABS beim TDD ?</h3>

<p>Also ging es weiter zum nächsten Test, der im Übrigen wieder von einem Neuling angeregt wurde. Was tun mit „Leerstellen“? Also wie kann man überprüfen, dass <em>keine</em> Ziffer an einer Stelle des „virtuellen Displays“ dargestellt wird. Raunen machte sich breit beim erarbeiten des Tests. Einige Stimmen waren für „einfach 0 zurückliefern“ („Vollgas“ weiter machen), andere wiederum wollten den Test nicht machen stellten den derzeitigen Lösungsansatz in Frage („Vollbremsung“).</p>

<p>Eine kleine Randgruppe wollte den Test durchführen, aber den Target (also die zu testende Methode) wechseln ( „Ausweichen“). An dieser Stelle gingen die Meinungen und Ansichten wieder auseinander. Eine etwas heftigere Diskussion wurde entfacht, doch leider konnte Sie nicht weitergeführt werden, denn unsere „Dojo-Zeit“, die wir uns als Timebox festgelegt hatten, war abgelaufen. Doch die Frage war im Raum und verlangt natürlich auch nach einer Antwort: Gibt es ein "ABS" (Anti-Blockier-System) beim TDD?</p>

<h3 id="die-moral-von-der-geschichte">Die Moral von der Geschichte...</h3>

<p>Die abschließende Retrospektive war wie immer sehr aufschlußreich und gab einen bunten Mix an Feedback zurück. Unter anderem wurde die TDD Vorgehensweise gelobt und kritisiert, die Gruppengröße bemängelt, das Ergebnis sowohl als „sehr gut“ und „sehr schlecht“ attributisiert, die „Planlosigkeit“ kritisch betrachtet, das vernachlässigte Refactoring angemahnt. Alles in allem jedoch, war es für jeden erkenntnisreich, denke ich.</p>

<p>Doch ganz besonders war dieses Dojo eine Lehre für mich. Ich konnte in diesem Dojo wieder vieles Lernen. Ich lernte z.B. dass „Neulinge“ sehr wertvoll für eine Gemeinschaft sein können, weil sie unvoreingenommen, ja man mag fast sogar sagen „positiv naiv“ auf Dinge blicken. Das ist nicht nur frisch, sondern auch konstruktiv. Dazu gab es noch eine Reihe weiterer Erkenntnisse, die mich zum Nachdenken gebracht haben. Ich will hier auch auf diese Erkenntnisse und die Konsequenzen daraus eingehen.</p>

<h3 id="die-einfachste-losung-gewinnt">Die einfachste Lösung gewinnt</h3>

<p>Da wäre zum Beispiel die immer wieder aufkeimende Diskussion in Coding Dojo’s, ob man nun nach der Anforderungsanalyse über einen generellen Lösungsweg nachdenken sollte (Knobler) oder „einfach“ sich auf den Code stürzen sollte (Coder). Ich habe zu diesem Thema einen besonderen persönlichen Standpunkt, den ich noch in einem gesonderten Artikel im Detail niederschreiben werde – hier würde solch ein Exkurs den Rahmen deutlich sprengen.</p>

<p>Fakt ist, dass wenn eine <a href="http://twitter.com/sforkmann/status/16834230537">solche Diskussion im Dojo auftaucht</a>, diese Diskussion auch geführt werden muss. Hier zählt der Erfahrungsaustausch, hier zählt der Lernwille, der das führen der Diskussion bedingend macht. Generell ist es natürlich so, dass beim Coding Dojo „Test-First“ entwickelt wird. Ob das per TDD, BDD oder ATDD geschieht, sei erstmal dahingestellt. „Test-First“ ist im Sinne der agilen Methoden, besonders aber im engeren Sinne XP wörtlich zu verstehen. Um den TDD-Neulingen oder TDD-Zweiflern das etwas näher zu bringen, zitiere ich <a href="http://www.amazon.de/Software-Development-Principles-Patterns-Practices/dp/0135974445">Uncle Bob</a>:</p>

<blockquote>
<p>"The act of writing a unit test is more an act of design than of verification. It is also more an act of documentation than of verification. The act of writing a unit test closes a remarkable number of feedback loops, the least of which is the one pertaining to verification of function."</p>
</blockquote>

<p>Also ganz klar: Nein, es soll beim Coding Dojo keine „gesamte Lösung“ erarbeitet werden, bevor man das programmieren anfängt. Sondern: Ja, beim Coding Dojo wird nach klarer Anforderungsanalyse sofort der erste Test in Angriff genommen. Dazu muss man natürlich auch nachdenken. Keiner wird daran gehindert, sich für diesen Test (und manchmal sogar den nächsten) eine Strategie zu überlegen. Es ist eher so, dass man sich gegenseitig zu einer klaren Testdefinition motiviert.</p>

<h3 id="chief-operating-development-engineer-lead-executive-senior-sensei">Chief Operating Development Engineer Lead Executive Senior Sensei</h3>

<p>Darüber hinaus gab es in diesem (sowie auch in den vorangegangenen) Dojo vermehrt Stimmen, die eine “Führungsrolle”, eine “bewertende und entscheidende Instanz“, einen „Chefentwickler“ oder ähnliches eingefordert haben. Auch hierzu gibt es für das Coding Dojo eine klare Vorgabe. So gibt es beim Coding Dojo z.B. verschiedene Formate, wie das Prepari oder Randori oder andere. Ich möchte hier nur kurz anmerken, dass ich in einem separaten Artikel auch auf diese <a href="http://www.altnetberlin.de/Termine/coding-dojo">verschiedenen Verfahren und Modi</a> in Dojo’s eingehen werde. Für's erste soll es reichen, dass es verschiedene Arten gibt.</p>

<p>Je nach Format gibt es auch verschiedene Rollen. In den Münchener Dojo’s haben wir oft – wie auch dieses Mal - das einfachste Format gewählt: Prepari. In diesem Format gibt es 3 Rollen: den „Hacker“ (von mir öfter flapsig als „CodeMonkey“ bezeichnet), den „Operator“ (der Organisator und Moderator, manchmal etwas irreführend auch „Leiter“ des Dojo’s) und natürlich die „Contributor“, die aktiven Teilnehmer des Dojo’s.</p>

<p>Im Prepari-Format (sowie auch in allen anderen) gibt es keine CODELESS-Rolle. Es gibt also beim Coding-Dojo niemanden, der die Rolle des „CODELESS“ einnimmt. Das Gegenteil ist der Fall: es wird explizit beim Coding Dojo eine CODELESS-Rolle vermieden. Und für diejenigen, die die Rolle nicht kennen:</p>

<blockquote>
<p>Definition: <strong>CODELESS</strong> = “<strong>C</strong>hief <strong>O</strong>perating <strong>D</strong>evelopment <strong>E</strong>ngineer <strong>L</strong>ead <strong>E</strong>xecutive <strong>S</strong>enior <strong>S</strong>ensei”</p>
</blockquote>

<p>Im Coding-Dojo die “Anti-Rolle” der führenden, leitenden, entscheidenen Person(en). Kann von einer oder mehreren Personen erfüllt werden. Sobald die Gefahr für so eine Rolleneinnahme besteht (ein „Smell“ sozusagen), darf (und soll) jeder zur Vermeidung der Rolle folgenden Satz sagen:</p>

<p>„We don’t want (to) CODELESS, we want (to) code more !“</p>

<p>Sobald also die Rolle eingenommen wird, sind alle anderen dazu verpflichtet, die Rolle der oder den Personen wieder zu entziehen. Im Coding Dojo gilt das Prinzip der Gleichstellung. Alle Meinungen haben per se den gleichen Wert. Die Auswertung der Meinungen geschieht gemeinsam. Entscheidungen werden gemeinsam getroffen. Diskussionen werden gemeinsam gestartet und gemeinsam beendet. Keiner darf sich besser stellen, keiner soll sich schlechter stellen.</p>

<h3 id="rei">Rei</h3>

<p>Jeder ist in dieser „Coding Dojo“-Gemeinschaft nun gleichgestellt – ein schönes Recht. Doch gibt es auch Pflichten für die Teilnehmer? Oft werde ich nach „Voraussetzungen“ für die Teilnahme des Dojo’s gefragt. Ich antwortete auf diese Frage meist mit folgenden Sätzen:</p>

<p>„Nicht viel. Interesse, Wissbegierde, Neugier für .NET und moderne, professionelle Software-Entwicklungs-Methoden. Aktive Teilnahme &amp; Beitrag zur Lösung der gestellten Programmieraufgabe.“</p>

<p>Das hat den meisten Fragestellern ausgereicht, um sich ein Bild machen zu können. Aber dennoch haben wir immer wieder Probleme mit dem Selbstverständnis der Teilnahme am Dojo. Ich denke, dass es dafür mehrere Gründe gibt. Manche denken, ein Dojo sei so „informell“, dass es keine Regeln gäbe. Andere wiederum vergleichen es mit anderen Formaten, wie z.B. einem Workshop, Vortrag oder Fishbowl. Um diesen „Interpretationen“ etwas mehr Linie und Substanz zu geben, stelle ich die Teilnahme-Voraussetzungen auf eine etwas formalere Ebene. Die folgenden Regeln sind Grundregeln (<a href="http://de.wikipedia.org/wiki/Rei">Rei</a> bzw. <a href="http://de.wikipedia.org/wiki/Reishiki">Reishiki</a>), die für die Teilnahme an einem Coding Dojo bedingend sind:</p>

<blockquote>
<p><strong>§1 - Aktivität</strong> 
Der ehrliche Wille, einen aktiven, fokussierten Beitrag zum „Lernen &amp; Lehren“ zu leisten.</p>
</blockquote>

<p>Es gibt beim Coding Dojo niemanden, der sich nicht einbringen darf. Das hört sich ein wenig nach „zur Aktivität gezwungen sein“ an. Und ganz offen: Ja, so ist es auch. Mitdenken, Mitwirken, Mitreden – das ist eine Pflicht für den Teilnehmer im Coding Dojo. Dennoch gibt es natürlich „Interessierte“, die sich „das Mal anschauen“ möchten. Das war bisher immer möglich und das wird es auch weiterhin. Aber: es darf nicht zur Gewohnheit werden. Deswegen folgende Regelzusätze:</p>

<ul>
<li>Falls jemand „Spectator“ sein möchte, muss er es bei Dojo-Beginn allen mitteilen. Zuschauer haben keine Pflichten, aber auch keine Rechte. Im Gegensatz zu den Teilnehmern dürfen sie keinen Beitrag leisten, sondern nur „beobachten“. Sie werden auch vom Abstimmungs- und Feedback-Recht befreit.</li>
<li>Eine Person darf nur einige Male – sagen wir mal bis zu dreimal – „Spectator“ sein. Spätestens beim 4. Dojo-Besuch muss er aktiv werden. Sollte er es weiterhin nicht wollen, muss er alle Teilnehmer um Beobachtungserlaubnis bitten. Bei Erlaubnis bleibt er „Spectator“, bei Verweigerung muss er das Dojo verlassen.</li>
</ul>

<blockquote>
<p><strong>§2 - Respekt</strong> 
Der ehrliche Wille, sein Gegenüber anzunehmen wie er ist.</p>
</blockquote>

<p>Sie oder ihn, seine Haltung, seine Meinung und sein Wissen zu würdigen um damit das „Lernen &amp; Lehren“ zu stärken. Einher geht dabei auch Höflichkeit bei Kommunikation und Kollaboration. Adequate Wortwahl, konstruktive Beiträge und kultivierte Gemeinsamkeit sind die Pflicht jedes Dojo-Teilnehmers. Um dies zu Gewährleisten, gelten folgende Regelzusätze:</p>

<ul>
<li>Jeder einzelne Teilnehmer ist verpflichtet, andere auf mögliche Respektsverletzungen hinzuweisen. Er kann sich jederzeit dem „Operator“ zuwenden. Es obliegt dann der gesamten Dojo-Gruppe, sich gemeinsam zu besinnen. Das kann durch auflockernde Übungen, eine kurze Pause oder andere Besinnungstechniken geschehen.</li>
<li>Bei einer offensichtlichen Respektsverletzung, ob willentlich oder nicht, wird das Dojo sofort abgebrochen. Es gibt keine Retrospektive, keine Diskussion. Die Beteiligten an der Respektsverletzung werden durch die anderen Teilnehmer oder den Operator auf Ihr Fehlverhalten höflich und respektvoll hingewiesen und dazu aufgefordert, Ihr Verhalten zu reflektieren und eine Lösung zu erarbeiten. Das Dojo wird nach Abbruch nicht wieder begonnen. Alle Teilnehmer verlassen das Dojo.</li>
</ul>

<blockquote>
<p><strong>§3 - Optimismus</strong>
Der ehrliche Wille, mit Freude und positiver Einstellung zum „Lernen &amp; Lehren“ beizutragen.</p>
</blockquote>

<p>Die positive, offene Grundhaltung eines jeden Teilnehmers ist bedingend für eine gute Unterstützung des „Lernen &amp; Lehren“. So ist es für jeden Dojo-Teilnehmer eine Freude, dabei zu sein und die anderen bei sich zu haben. Sollte „mal einer einen schlechten Tag haben“ ist es nicht so schlimm. Aber man sollte auch im Sinne des Dojo’s offen zu sich selbst sein. Ist die Laune im Keller, so macht es für einen selbst nicht viel Sinn – und damit für die Gemeinschaft auch nicht. Niemand im Dojo nimmt es Übel, wenn man mal „keine Lust“ hat, dabei zu sein. Um die positive Einstellung im Dojo zu unterstützen, gelten folgende Regelzusätze:</p>

<ul>
<li>Ein Lächeln ist der Botschafter der Optimismus. Jeder Teilnehmer ist dazu aufgefordert, seine positive Grundhaltung auszudrücken. Manche Lächeln, manche machen kleine Witze, manche suchen Nähe und das Zwischengespräch. Trotz aller Aktivität und Fokus, die man beim Dojo hat (siehe „Regel 1“), ist Optimismus eine Voraussetzung, der man auch als Teilnehmer nachkommen soll.</li>
<li>Stellt ein Teilnehmer für sich fest, nicht mehr positiv Beitragen zu können, sollte er aus freien Zügen – auch ohne Angaben jedweglicher Gründe, wenn nötig – das Dojo verlassen dürfen. Denken andere Teilnehmer, dass jemand in der Gemeinschaft keine positive Grundhaltung mitbringt, sind sie dazu aufgefordert, demjenigen mit ermutigenden und positiven Worten ihre Wahrnehmung mitzuteilen. Das kann persönlich in der Pause geschehen, oder aber indirekt durch Beteiligung des Operators.</li>
</ul>

<blockquote>
<p><strong>§4 - Zwanglos</strong>
Der ehrliche Wille, freiwillig, ohne Druck, Wettbewerb oder Leistungsziel das „Lernen &amp; Lehren“ zu verfolgen.</p>
</blockquote>

<p>Diese Regel ist besonders wichtig, denn sie nimmt jeglichen Druck von allen. Keiner ist dazu verpflichtet, eine Sache „richtig“ oder „fertig“ zu machen. Niemand zwingt die Teilnehmer, sich an eine bestimmte Technologie, Meinung oder Vorgehensweise zu richten. Wenn überhaupt, dann sind es die Teilnehmer, die selbstbestimmt, freiwillig und gemeinsam sich selbst Verbindlichkeiten zusprechen. Um dies im adequaten Rahmen zu gewährleisten, gelten folgende Regelzusätze:</p>

<ul>
<li>Es gibt keine Leistungsziele und keine Leistungsmessung. Weder von Einzelnen, noch von der Gemeinschaft. Ausschließlich Bewertung im Sinne des Feedbacks und des Meinungsaustausches sind für die Teilnehmer möglich. Teilnehmer mit Leistungsanspruch sind von den anderen Teilnehmern von diesem Anspruch freizustellen.</li>
<li>Selbstbestimmt heisst nicht selbstautoritär. Trotz der Zwanglosigkeit gelten für jeden Teilnehmer die Grundsatzregeln, die Grundsatzvorgehensweise sowie die Regel des kollektiven Entscheids. So ist es verpflichtend und selbstverständlich, wenn ein Teilnehmer einer anderen Auffasung ist die Mehrheit der Teilnehmer, dass dieser sich der kollektiven Meinung beugt bzw. nach dem gemeinsamen Entschluß zu richten hat. Ist die eigenee Meinung mit der gemeinschaftlichen Meinung fundamental nicht vereinbar, so bleibt es jedem frei, das Dojo zu verlassen.</li>
</ul>

<p>Diese oben genannten vier Grundregeln sind für mich essentielle Voraussetzungen für die Teilnahme an einem Dojo. Oftmals ist es garnicht so schwer, diesen Bedingungen gerecht zu werden, doch wir durften in der Vergangenheit auch erleben, wie sich der eine oder andere Teilnehmer mit diesen Werten schwer tat.</p>

<h3 id="make-it-simple">Make it simple</h3>

<p>Es gibt noch vieles mehr, das ich über das Coding Dojo, die Regeln und Werte des Coding Dojo und auch die Dynamik und Magie des Coding Dojo schreiben könnte, und ich werde es wohl nach und nach auch tun. Doch bei all diesen Hintergrundinformationen und den eben etwas formaler beschriebenen Regeln gilt es den Grundsatz der Einfachheit zu wahren. Solange es nicht wirklich notwendig ist, wird es keinen weiteren „Ballast“ oder „Verkomplizierung“ der Sache geben. Weder mit weiteren Formalismen oder irgendwelchen Hierarchien, unnötigen Gedankenwindungen oder theoretischen Methodenspielchen. Das gilt für Software, das gilt für TDD, das gilt für gemeinschaftliches Arbeiten, also gilt es auch für das Coding Dojo. Frei nach Albert Einstein:</p>

<blockquote>
<p>„<strong>Make it simple, but not simpler</strong>“.</p>
</blockquote>

<p>Für die Interessierten sei noch das <a href="http://en.wikiquote.org/wiki/Albert_Einstein">Original-Zitat</a> erwähnt:
"It can scarcely be denied that the supreme goal of all theory is to make the irreducible basic elements as simple and as few as possible without having to surrender the adequate representation of a single datum of experience."</p>

<h3 id="ich-der-ilker">Ich, der Ilker</h3>

<p>Nach diesem regelrechten Aufsatz an Regeln und Bestimmungen gibt es einen weiteren wichtigen Punkt, der unbedingt erwähnt werden muss. Alle die o.g. Regeln beziehen sich auf meinen Eindruck, meine Meinung und meine Anschauung. Es ist also „Ilker’s Coding Dojo“, welches sich diesen Rechten und Pflichten unterwirft.</p>

<p>Warum erwähne ich das? Ganz einfach, weil jeder auf dieser Welt das gute Recht hat, Coding Dojo’s zu machen. Jeder hat so gar das gute Recht, Coding Dojo’s so zu machen, wie er sich das vorstellt. Das ist auch gut so, denn Diversität ist ein wichtiger Faktor für Fortschritt. Aber es birgt auch Potenzial für Missverständnis und Verkennung. Der eine macht Coding Dojo’s mit dem Streben nach Kampf und Perfektion. Ein weiterer macht Coding Dojo’s um neue Sprachen zu erleben und zu erforschen. Ein anderer macht Coding Dojo’s, um anderen zu zeigen, wie man was macht und die Richtung vorzugeben. Aber ich mache Coding Dojo’s nicht (nur) deswegen. Meine Motivation ist das Motto, welches ich immer wieder versuche zu transportieren: „<strong>Lerne &amp; Lehre</strong>“.</p>

<p>Bei „meinem“ Coding Dojo steht der lockere Erfahrungsaustausch im Vordergrund, gebunden durch eine konkrete, kleine, realisierbare Aufgabe. Doch es geht nicht um einen netten Plausch oder Brainstorming, sondern um <a href="http://de.wikipedia.org/wiki/Lernen">Lernen</a> und <a href="http://de.wikipedia.org/wiki/Lehren">Lehren</a>. Wer nicht genau weiß, wie herausfordernd und anspruchsvoll diese beiden Disziplinen sind, dem rate ich, sich damit ein wenig auseinanderzusetzen.</p>

<p>Weiterhin mache ich Coding Dojo’s aus freien Stücken, weil es mir Spaß macht und ich weiter Spaß damit haben möchte. Ich mache es, weil ich eine tiefe, feste Überzeugung habe, dass jeder von anderen lernen kann und jeder den anderen lehren kann.</p>

<p>Ich respektiere diejenigen, die Coding Dojo’s „anders“ sehen, die etwas anderes darunter verstehen oder es anders kennen. Wie gesagt, jedem steht es frei, selbst Coding Dojo’s zu machen und sie so zu machen, wie er es für richtig hält. Ich habe die „Coding Dojo’s“ nicht erfunden, ich bin nicht der Coding-Dojo-Oberlehrer, ich bin kein Kata-Mönch und auch kein Dojo-Messias. Ich bin der Ilker, der Coding Dojo’s macht. Punkt.</p>

<h3 id="latifa-dojo">Latifa-Dojo</h3>

<p>So, und als genau dieser Ilker, der diese <a href="mucnetdojo-bericht-vom-ersten-net-coding-dojo.html">Coding Dojo-Bewegung in die .NET-Welt getragen hat</a>, als der Ilker, der Erfahrung mit Coding Dojo’s verschiedener Formate hat, als der Ilker, der das <a href="uber-das-ziel-von-coding-dojos.html">„Lernen &amp; Lehren“ mit Code Kata’s</a> und TDD/BDD &amp; Design Patterns sowie Best Practices in den Vordergrund stellt, als genau dieser Ilker stelle ich die oben genannten Regeln für die Art der Coding Dojo’s auf, die ich mir vorstelle.</p>

<p>Diejenigen, die sich für Coding Dojo’s interessieren, schon mal bei dem einen oder anderen dabei waren, sogar den Weg mit mir „mitgegangen“ sind oder einfach mal gerne dabei sein möchten – ja euch alle – bitte ich um Vertrauen. <strong>Bitte, vertraut mir</strong> und geht den Weg, den ich hier beschreibe, wenn ihr Coding Dojo’s macht und mitmacht. Verlangt Aktivität, Respekt, Optimismus und Zwanglosigkeit. Verfolgt das Ziel des Lernen &amp; Lehrens. Fordert genau diese Art von Coding Dojo’s, denn diese Coding Dojo’s sind es, die uns alle weiter bringen. Fordert von Coding Dojo’s diese Werte und diese Ziele – von Veranstaltern, von Operatoren, von Teilnehmern, von euch selbst. Ich werde es tun.</p>

<p>Im Sinnbild der asiatischen Kampfkünste, welches unschwer erkennbar auch mit dem Coding Dojo transportiert wird, möchte ich hiermit das oben geschilderte „Format“ als einen „Dojo-Stil“ etablieren. Es widerspricht natürlich dem gemeinschaftlichen Denken, nun von „Ilker’s Dojo-Stil“ zu sprechen oder es so zu kommunizieren. Personifizierung ist nicht zielführend. Wie gesagt, keiner ist besser gestellt als die anderen, keiner ist schlechter gestellt als die anderen.</p>

<p>Dennoch ist es ein stückweit meine Handschrift und meine Vorstellung eines Coding Dojo’s. Deswegen möchte ich bei der Schaffung dieses „Dojo-Stils“ noch eine kleine persönliche Note einbringen. Ich mache das jetzt mal einfach und gebe „meinem“ Dojo-Stil einen Namen: <strong>Latifa</strong>.</p>

<p>Latifa kommt vom arabischen latif, welches frei übersetzt "höflich, freundlich, sanft" bedeutet. Ich habe es gewählt, weil es im türkischen (latife) für „zuvorkommend, manierlich“ und manchmal sogar „gentlemen-like“ angewendet wird. Es spiegelt für mich die Grundvoraussetzung für gemeinsames Tun &amp; Wirken wider, die auch für ein erfolgreiches Lernen &amp; Lehren notwendig ist.</p>

<p>Es gibt so vieles, welches wir von anderen, unseren Ahnen und anderen Kulturen lernen können. Doch eine Sache ist allen gemeinsam, der Respekt und die Höflichkeit. Wer sich intensiver mit dieser Werte-Einstellung auseinandersetzen möchte, dem Rate ich das Studium (das meine ich wörtlich, also „<a href="http://de.wikipedia.org/wiki/Studium">studere</a>“) des <a href="http://de.wikipedia.org/wiki/Funakoshi_Gichin#Shoto-Niju-Kun">Shoto-Niju-Kun</a>, der 20 Verhaltensregeln von Funakoshi für das Karate-Do.</p>

<h3 id="feedback-im-mittelpunkt">Feedback im Mittelpunkt</h3>

<p>Ein zentrales Element des fortschreitens und verbesserns ist das Feedback. Nach geleisteter Arbeit ist Feedback wichtig, um daraus Erkenntnisse zu gewinnen und damit sein Handeln zu adaptieren. Das ist eigentlich ein Naturgesetz.</p>

<p>Ich möchte diesem Naturgesetz auch hier folgen und möchte abschließend um euer Feedback bitten. Bringt euch ein, macht mit und gestaltet mit. Schreibt mir, was ihr denkt und was ihr machen würdet. Ich freue mich über jedes Feedback.</p>

<p>Doch bei all dem Wirken &amp; Tun rund um das Coding Dojo stelle ich klar und und kommuniziere es mit deutlichen Worten: Ich werde weiter Coding Dojo’s machen, genauer gesagt Coding-Dojo’s im Latifa-Stil. Ich werde das Lernen &amp; Lehren verfolgen und stärken. Das werde ich mit Freude und Spass machen, denn nur so ist es wertbringend und nachhaltig. Für den Latifa-Stil gelten die Voraussetzungen der Gleichheit, der Aktivität, des Respekts, des Optimismus und der Zwanglosigkeit. Die Modi im Latifa-Stil sind frei wählbar, solange sie keinen Kampfcharakter haben. Im Dojo wird gemeinsam an dem Kata gearbeitet und geübt. Es steht die Übung mit dem Code im Vordergrund, deswegen heisst es Coding Dojo.</p>

<h3 id="wege-sind-zum-gehen-da">Wege sind zum gehen da</h3>

<p>Es soll klar sein: Für alle, die sich mit diesem, dem Latifa-Stil des Coding Dojo auseinandersetzen möchten und diesen Stil in den Coding Dojo’s erleben möchten, gibt es die wunderbare Möglichkeit sich in der <a href="https://www.xing.com/net/netdojo/">Xing-Gruppe zu melden</a> oder auf die <a href="http://www.facebook.com/pages/NET-Coding-Dojo/10150113747745398">Facebook-Seite</a> zu schauen, um so auch die nächsten Event-Termine mitzubekommen. Ihr seid herzlich eingeladen, mit uns gemeinsam zu lernen &amp; zu lehren.</p>

<p>Weiterhin soll klar sein: Für alle, die sich mit dem Latifa-Stil nicht anfreunden können oder unter Coding Dojo’s etwas anderes verstehen, kann ich folgendes entgegenbringen: Ich werde euch nicht in einem Latifa-Dojo akzeptieren. Ich werde euch nicht für die Werte des Latifa-Dojo ermutigen. Ich werde euch nicht vom Latifa-Dojo überzeugen. Ihr müsst das alles selbst tun. Ihr könnt jederzeit zu Coding Dojo’s im Latifa-Stil kommen, solange Ihr euch an die Regeln und Werte des Dojo’s richtet.</p>

<p>Und wenn sich im Ergebnis keiner für den Latifa-Stil interessiert, dann ist das gut, denn dann habe ich immer noch meine Überzeugung. Und wenn sich im Ergebnis einige für den Latifa-Stil interessieren, dann ist das gut, denn dann habe ich immer noch meine Überzeugung. Und wenn sich im Ergebnis alle für den Latifa-Stil interessieren, dann ist das gut, denn dann habe ich immer noch meine Überzeugung.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Verschwörung beim .NET Open Space Süd</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/verschworung-beim-net-open-space-sud-in-karlsruhe.html"/>
            <updated>2010-06-22T13:16:37Z</updated>
            <published>2010-06-22T13:16:37Z</published>
            <id>/verschworung-beim-net-open-space-sud-in-karlsruhe.html</id>
            
            <content type="html"><![CDATA[
                <p>Dieses Wochenende war ich zum ersten Mal bei einem .NET Open Space, dem <a href="http://karlsruhe.netopenspace.de/2010/">.NET Open Space Süd in Karlsruhe</a>.</p>

<p>Gleich vorneweg: Es war super! Nein, noch mehr, es war richtig super! Eine mehr als gelungene Veranstaltung. In diesem Wochenende habe ich vieles gelernt und mitgenommen. Die Eindrücke dieser wahnsinnigen .NET-Veranstaltung wirken bei mir noch so immens, dass ich sie hier in einem Blog einfach niederschreiben muss.</p>

<h3 id="mittendrin-statt-nur-dabei">Mittendrin statt nur dabei!</h3>

<p>Samstag, 9:45 Uhr, ich gehe durch eine unscheinbare Tür, es gibt nur ein kleines Schild „.NET Openspace Süd 2010, 4. OG“. Ich laufe die Treppen hoch und werde von einem lächelnden Gesicht überrascht: „Na, ganz schön sportlich!“ rief die freundliche Check-In-Lady (neudeutsch für Empfangsdame ?!? ;)) mir entgegen. Wohl eher aus Höflichkeit, schließlich tat ich mir nach geleisteter Stufenarbeit merklich schwerer als sonst, das mir entgegengebrachte Lächeln mit einem Zurücklächeln zu erwidern.</p>

<p>Nach dem obligatorischen Check-In mit Teilnehmerkarte und Event-Infos finde ich mich mittendrin in der Sessionplanung für den ersten Tag wieder. „Wahnsinn“ dachte ich mir, endlich sehe ich viele, die ich nur per Twitter, Blog oder anderweitig online kenne. Gleichzeitig freute ich mich, wieder in Gesichter zu blicken, die ich schon kannte. Und ich war gespannt, welche neuen Bekanntschaften ich mit dieser „Erfahrungsaustauschplattform“ Open Space machen würde. Doch zunächst galt es, die Sessionplanung konzentriert umzusetzen. Auf geht’s!</p>

<h3 id="wtf-is-a-monad">WTF is a Monad?</h3>

<p>Die Antwort auf diese Frage hat mir auf anschauliche Art und Weise <a href="http://www.navision-blog.de/">Steffen</a> gegeben. Er folgte der Aufforderung von <a href="http://www.bjoernrochel.de/">Björn</a>, uns allen mal dieses komische „Monad-Ding“ in verständlicher Form widerzugeben. Ich ertappte mich selbst dabei mich nicht daran erinnern zu können, wie lange es her ist, so gespannt und magnetisiert einem Thema und seinem Vortragenden zuzuhören.</p>

<p>r erklärte unter Anderem, dass die Uhr ein <a href="http://de.wikipedia.org/wiki/Monoid">Monoid</a> sei und es nur 3 essentielle Kriterien für das in sich geschlossene System eines <a href="http://de.wikipedia.org/wiki/Monade_%28Typkonstruktion%29">Monaden</a> gibt. Das neutrale Element, die <code>SelectMany</code> und <code>Id</code> Methoden (also Bind &amp; Return).</p>

<p><em>(Anmerkung: Das ist mit großer Wahrscheinlichkeit falsch - Korrektur willkommen.)</em> </p>

<p>Es ging weiter mit der Vorstellung der Population in der Monaden-Welt: Identity, Maybe, Continuation, State.</p>

<p>Ich habe es sicherlich noch nicht richtig begriffen und bin selbst erst am Anfang, die funktionale Programmierung wieder in meine tägliche Programmier-Praxis einzuführen. Doch diese Session war für mich wie ein Paukenschlag zum Auftakt! Super.</p>

<h3 id="3d-in-your-pocket">3D in your Pocket</h3>

<p>„Hmm, das ist schwer zu toppen“, dachte ich mir, noch gedanklich verworren in Monaden, als ich mich plötzlich in der 2. Session über XNA &amp; Windows Phone 7 von <a href="http://blogs.msdn.com/b/twendel/">Tom</a> wieder langsam aus der Monadenwelt lösen konnte. Doch meine Skepsis erwies sich als unberechtigt. Tom zeigte uns, das XNA keine Abkürzung für Spieleentwicklung ist, sondern eine Abkürzung ist für effektive &amp; professionelle Spieleentwicklung - mit einer für mein Empfinden niedrigen Lernkurve.</p>

<p>Tom ist ein Verfechter von Fakten, also waren auch keine trockenen Slides angesagt – statt dessen gab es Visual Studio, Source Code und den Windows Phone 7 Emulator zu sehen. Ich durfte lernen, dass es gar nicht so schwer ist, Windows Phose 7 „anzuprogrammieren“ und sich auch kein Hexenwerk hinter „Worlds“, „Matrices“, „Meshes“ und „Shadern“ verbirgt. Macht Laune auf mehr.</p>

<h3 id="design-drivers">Design Drivers</h3>

<p>Und schon ging es weiter mit den Erkenntnissen in der von <a href="http://sergeyshishkin.spaces.live.com/">Sergey</a> angetriebenen Session über "TDD vs. BDD vs. ATDD". Es war unerwarteterweise keine trockene Gegenüberstellung von „methodischen Religiösitäten“. Ganz im Gegenteil. Die Session war wohl eine der konstruktivsten Diskussionen über „Erwartungsgetriebene Softwareentwicklung“, bei denen ich dabei sein durfte.</p>

<p>Der Erfahrungsaustausch fand auf breiter Ebene statt, fast jeder konnte irgendwie dazu beitragen. Highlights waren sicherlich die Vorstellung von Fitnesse als Werkzeug für ATDD sowie die anschauliche Erklärung der <a href="http://lh3.ggpht.com/_X3kaawac_g4/S3VCgzOuyQI/AAAAAAAAAvw/aww4Ui2N7LU/agile-testing-quadrants.JPG?imgmax=800">Agile Testing-Quadranten</a> von Sergey.</p>

<p>Im Übrigen hatte wohl Sergey noch mehr „feine Info’s“ mitgebracht, denn er war es auch, der die „RX – Reactive Extensions Hands On“-Session kräftig mitgestaltete. Ach, ich könnte womöglich noch stundenlang über die weiteren, hochinteressanten Sessions auf diesem .NET Open Space schreiben.</p>

<h3 id="know-how-rollercoaster">Know How Rollercoaster</h3>

<p>Zum Beispiel über die unglaublich erkenntnisreiche Session über „TDD/BDD Do’s and Dont‘s“  – das war geballtes Know-How über testgetriebene Entwicklung. Oder die Session über „verteilte Architekturen“ sowie die Session über „Skalierung &amp; Caching im Web“, die anschaulich die Best Practices dieser Themen an mich, den Teilnehmer transportieren konnten.</p>

<p>as „Daily Life“ wurde wertwoll angereichert durch die Sessions „Smart Tools for Smart People (Part I + II)“  von <a href="http://www.lennybacon.com/default.aspx">Daniel</a>. Das meistern spielerischer Herausforderungen wurde in der AntMe!-Session von Tom gezeigt, einen Kickstart von 0 auf 100 für ASP.NET MVC2 lieferte <a href="http://www.der-albert.com/Default.aspx">der Albert</a>. Die weise Erkenntnis der vielen Gemeinsamkeiten und wenigen Unterschiede von <a href="http://code.google.com/p/xunitbddextensions">xUnit.BDDExtensions</a> zu <a href="http://github.com/machine/machine.specifications">MSpec</a> zu <a href="http://www.navision-blog.de/2009/02/23/introducing-naturalspec-a-dsl-for-testing-part-i/">NaturalSpec</a> wurde in der „United BDD“-Session deutlich. Unüberhörbar waren auch die Berichte von einer spannenden Session über die Erfahrungen mit und um DDD herum von <a href="http://webenliven-space.de/dotnetblog/">Gregor</a>.</p>

<p>Ach ja, es gab ja auch noch ein Coding Dojo. Ich als „Session-Host“ möchte nicht viele Worte darüber verlieren. Ich möchte viel mehr, dass jeder, der dabei war, seinen Eindruck mitnimmt und seine Meinung dazu bildet. Ich kann nur sagen: mir hat das Dojo mit so vielen interessierten und erfahrenen Entwicklern sehr viel Spass gemacht und ich konnte wieder einiges dazulernen.</p>

<h3 id="environmentcool">Environment.Cool();</h3>

<p>Doch dieses gesamte „Excitement“, der Erfahrungsaustausch, die Bekanntschaften, die wunderbar leichten Unterhaltungen am Mittagstisch, die Diskussionen über Vergangenheit, Gegenwart und Zukunft der Software-Entwicklung am gemütlichen Abend, die Betrachtungen über den eigenen Tellerrand hinaus – all das wäre nicht möglich gewesen, ohne die Motivation &amp; Organisation zum .NET Open Space Süd in Karlsruhe. Vielen Dank an die <a href="http://www.dotnet-ka.de/">DNUG Karlsruhe</a>, Alex, Ralf, Frank, Aydin und alle, die dabei waren! Ich bin beim nächsten Mal sicher wieder dabei!</p>

<p>Doch eine wichtige Frage bleibt nach dem .NET Open Space Süd immer noch offen: Planen <a href="http://twitter.com/ilkerde/status/16535252984">Steffen</a>, <a href="http://twitter.com/BjoernRochel/status/16575784869">Björn</a>, <a href="http://twitter.com/sshishkin/status/16610614472">Sergey</a>, <a href="http://twitter.com/BjoernRochel/status/16557247504">Alexander</a> eine <a href="http://twitter.com/BjoernRochel/status/16580674588">Verschwörung</a>? Bildet sich ein verschworene Monaden-Mafia? Welche Rolle spielt dabei <em>„Jean Closure“</em> – ist er der neue Pate der testgetriebenen Untergrundgeschäfte? Vielleicht hat <a href="http://twitter.com/cdeger/status/16635635336">Christian</a> auch etwas damit zu tun?</p>

<p><code>Maybe.Some&lt;IsTrue&gt;</code>, <code>Maybe.None&lt;IsTrue&gt;</code> ... to be <a href="http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx">Continuation-Monad</a>! ;-)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Scrum: Der bessere Scrum Master</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/scrum-der-bessere-scrum-master.html"/>
            <updated>2010-06-16T17:15:37Z</updated>
            <published>2010-06-16T17:15:37Z</published>
            <id>/scrum-der-bessere-scrum-master.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist zwar schon eine Weile her, als über die <a href="funf-schwachpunkte-von-scrum.html">Fünf Schwachpunkte von Scrum</a> geschrieben habe. Die Resonanz auf diesen provokanten, aber aus meiner Sicht treffenden Artikel war durchaus unterschiedlich. Man hat mich des Plagiats bezichtigt, man hat mich als unkonstruktiven Satzbauartisten bezeichnet, man hat mir Rollen-Personifizierung vorgeworfen und mich als nachhilfebedürftig abgestempelt (inkl. Links zu „guten Coaches“). Ach ja, es gab auch tatsächlich einige ernsthafte Diskussionen, die von nachdenklichen Lesern über die einzelnen Punkte geführt worden sind.</p>

<p>Wie dem auch sei, am Ende des besagten Artikels hatte ich einen Ausblick darauf gegeben, dass ich nicht nur die Punkte nennen werde, die ich als Schwachstelle in Scrum sehe, sondern auch meine Ideen dazu beitragen werde, diese Schwachstellen zu stärken und damit Scrum als agile Managementmethode für mein Verständnis erfolgreicher zu implementieren. Das habe ich für das Thema "<a href="scrum-die-bessere-sprintdauer.html">bessere Sprintdauer</a>" schon getan,  und damit widme ich mich heute einem ganz besonderen „Schwachpunkt“ – dem Scrum Master.</p>

<h3 id="die-innere-handbremse">Die innere Handbremse</h3>

<p>„Oh je, der Scrum Master ist ein Schwachpunkt von Scrum?“ werden sich nun viele stirnrunzelnd denken. Ja, genau so ist es, der Scrum Master ist meiner Meinung nach sogar eine richtig hinterlistige Schwachstelle in Scrum-Projekten. Das liegt viel weniger an dem Scrum Master als Person als am Scrum Master als Rollenimplementierung, wie er in vielen Büchern beschrieben wird und von Scrum-Trainern bei Unternehmen „antrainiert“ wird.</p>

<p>Viele Scrum Master in heutigen Organisationen sind „Vollzeit-Scrum Master“, die dediziert ein Scrum Team betreuen und sich tagtäglich mit den Sorgen, Nöten und Bedürfnissen Ihres Teams auseinandersetzen. Meiner Meinung nach ist hier schon der erste Schwachpunkt erkennbar. Obwohl die Rollendefinition in „Scrum-Bibeln“ nicht oft vom Scrum Master als institutionalisierte Position spricht, wird sie überall diskutiert, <a href="http://borisgloger.com/2009/04/21/4711-is-a-scrummaster-a-full-time-position">implementiert</a> und <a href="http://jobsuche.monster.de/Search.aspx?q=scrum%20master&amp;cy=de&amp;lid=163&amp;re=130">implantiert</a>.</p>

<p>Ein Scrum Master ist dazu da, sich überflüssig zu machen. Eines seiner größten Ziele ist es, sein Team in die <a href="http://de.wikipedia.org/wiki/Selbstorganisation">Selbstorganisation</a> zu führen und dort zu halten. Doch wie geht das bei einem Scrum Master, der eine Planstelle in einer Organisation ist? Mehr noch, hinter der Rolle Scrum Master verbirgt sich dann eine konkrete Person, ein konkreter Arbeitsplatz, ein konkretes Schicksal. Und diese Person soll sich jetzt überflüssig machen? Das wird wohl selbst der barmherzigste Mensch nicht tun. Jetzt könnte man diesen Vorwurf mit „don’t blame the tool“ abwiegeln, aber das wäre zu einfach. Die Schwachstelle liegt viel tiefer begraben als es auf der Oberfläche sichtbar ist.</p>

<h3 id="zwischen-den-stuhlen">Zwischen den Stühlen</h3>

<p>Zumeist befindet man sich als Scrum Master innerhalb einer „agilen“ Organisation sowieso in der Zwickmühle. Einerseits sollte man das Team nicht führen, sondern begleiten. Andererseits bleibt das Management als „Chicken“ selten mehr als die ersten paar Sprints ruhig. Nicht selten trägt es „Erwartungen“ und „Strategische Leitlinien“ an den oder die Scrum Master heran. Schließlich ist der Scrum Master ja überzeugt von Scrum und der Idee, dass der Product Owner nun das Management betreiben soll. Die Kennzahlen über Team- und Projektperformance holt man dennoch beim Scrum Master ein, weil der „einfach näher dran am Geschehen ist“.</p>

<p>Viele Scrum Master fügen sich in diese organisatorische „Kneifzange“, anstatt sie mit Kraft zu durchbrechen. Wie soll man auch, wenn z.B. der eigene Job daran hängt oder die letzte (dicke) Auszahlung des Dienstleistungsvertrages mit dem Kunden noch aussteht?</p>

<h3 id="der-alleskonner">Der Alleskönner</h3>

<p>Viele eingefleischte Scrum-Experten und erfahrene Trainer stellen deshalb die Rolle des Scrum Masters auf ein hohes Podest. Der Scrum Master sei „<a href="http://borisgloger.com/2010/03/22/scrum-wurden-agiles-schwachen-geerbt-eine-antwort/">eine Führungsrolle im Prozess</a>“, es dauere tausende von Stunden, die Charakteristika und schwierigen Aufgaben eines Scrum Masters zu meistern. Ein Change Agent und Facilitator hat es eben nicht leicht.</p>

<p>Der Scrum Master als Rolle wird oft als Alleskönner dargestellt. Schließlich muss er die Grundlagen des Managements beherrschen, ein absoluter Teamplayer sein und obendrein auch noch ein feiner Kerl den jeder mag. Der Scrum Master ist der neue <a href="http://de.wikipedia.org/wiki/MacGyver">MacGyver</a> in der agilen Software-Entwicklungslandschaft und kann selbst aus den schwierigsten und aussichtslosesten Situationen mit Einfallsreichtum, Know-How und Cleverness den Erfolg hin zur effektiven &amp; profitablen Software-Entwicklung gestalten.</p>

<p>Eine schöne Vorstellung. Doch die Realität ist eine andere. In der Realität gibt es nur einen MacGyver, und den sogar nur im Fernsehen. Schade für die vielen Softwarefabriken und Weborganisationen, schade für die vielen Scrum Trainer und Berater, schade für die Tausenden von „Certified Scrum Master“. Doch Karten auf den Tisch: Es wäre auch zu schön gewesen, oder?
Mittlerweile ziehen sogar Alpha-Agilisten und Scrum-Kenner das „Scrum Is Always Better, Scrum Master Is Always Hero“-Gefühl durch den Kakao. Mit wunderbar leichtem und gleichzeitig nachdenklich stimmendem Humor schreitet seit einiger Zeit „<a href="http://blog.shino.de/2010/02/20/scrum-norris/">Scrum Norris</a>“ durch die geistigen Pfade der Agilität.</p>

<h3 id="quo-vadis-scrum-master">Quo Vadis Scrum Master?</h3>

<p>Doch weder Humor noch Lamentiererei helfen einem dabei, diesen Schwachpunkt des „Scrum Master-Daseins“, nämlich die viel zu starke Fokussierung der Rolle und deren Implementierung, zu verbessern. Was tun? Wie kann man in einem Scrum-Team oder in einer Organisation mit Scrum-Teams diesen viel zu starken Fokus auf den Scrum Master mindern? Ich möchte hier einen konkreten Verbesserungsvorschlag und eine konzeptionelle Perspektivänderung als Diskussionsgrundlage vorstellen.</p>

<p>Dazu möchte ich ein Szenario aus der Entwicklung selbst voranstellen, um den Effekt der Maßnahme deutlicher hervorzuheben. Es wäre meines Erachtens sehr hilfreich für Team und Scrum Master, wenn die Abhängigkeiten zum Scrum Master zu allen anderen Rollen sowie zu der umgebenden Organisation so gering wie möglich sind. Um Abhängkeiten voneinander zu entkoppeln, gibt es in der Software-Entwicklung einige bewährte Methoden. Eine davon ist die sog. <a href="http://de.wikipedia.org/wiki/Inversion_of_Control">„Dependency Inversion“ oder „Inversion of Control“</a>. Das hört sich doch genau nach dem an, was gebraucht wird, nämlich eine „Inversion of Control“ im wörtlichen Sinne. Nicht der Scrum Master organisiert das Team, das Team organisiert das Team.</p>

<h3 id="scrum-master-in-bewegung">Scrum Master in Bewegung</h3>

<p>Übertragen auf den Prozess und die Rahmenbedingungen, die die Scrum-Methode vorgibt, ließe sich eine solche Indirektion mit einem einfachen Mittel erreichen: Die Rolle des Scrum-Masters wird im Team rotierend „durchgereicht“. Statt eines Scrum Masters, der sich dediziert um ein (oder noch schlimmer mehrere) Teams kümmert, kümmert sich das Team um die Erfüllung der Rolle des Scrum Masters. In der Praxis kann man den „Scrum Master-Hut“ z.B. sprintweise, monatsweise, oder quartalsweise von Team-Mitglied zu Team-Mitglied weiterreichen.</p>

<p>So ist jeder einmal mit der „Verantwortung“ des Scrum Masters konfrontiert und lernt obendrein eine weitere, wichtige Perspektive des Prozesses kennen. Dadurch erschließt sich sukzessive dem ganzen Team eine tiefere Kenntnis der Vorgehensweise. Es ergibt sich eine induktive Selbstorganisation: Man lernt die Probleme und Aufgaben der Scrum Master Rolle kennen und hilft sich gegenseitig im Team, dass es nicht zu Problemen kommt oder diese schnell ausgeräumt werden.</p>

<p>Aus Sicht des Prozesses mündet das Rotationsprinzip in mehrere Vorteile. Zunächst wird einmal wird nicht nur die Selbstorganisation gefördert, sondern auch das Know-How effektiv verteilt. Der <a href="http://en.wikipedia.org/wiki/Bus_factor">Bus-Faktor</a> wird im Kontext des Prozesses und der Methodensicherheit massiv erhöht.</p>

<h3 id="refokussierung-der-kommunikation">Refokussierung der Kommunikation</h3>

<p>Für den Product Owner ist der wechselnde Scrum Master ein regelrechter Segen: Statt sich die ganze Zeit auf den Scrum Master zu konzentrieren, kann (und muss) er sich nun mit dem ganzen Team auseinandersetzen – so wie es am effektivsten ist und sich auch „gehört“. Darüber hinaus lernt der Product Owner, seine geschäftlichen Anforderungen und Interessen mit der „Masse Team“ zu koordinieren, statt mit dem „Ansprechpartner“ Scrum Master, wenn es mal wieder Abstimmungsprobleme oder Missverständnisse gibt.</p>

<p>Nicht nur der Prozess, sondern auch die umgebende Organisation – also das Unternehmen – profitiert von dieser Maßnahme. Statt wieder neue Stellen oder Stufen in die Organisation zu implementieren, wird durch die Rotation der Scrum Master von „allen“ getragen. Ergebnis: Keine neue „Position“ Scrum Master, keine Kompetenz- und Verantwortlichkeitskonflikte mit Teamleads (Gruppenleiter) oder Head-Of’s (Abteilungsleiter), keine Skalierungsprobleme. Die Führungsmöglichkeiten sind klar und bei einem <a href="http://de.wikipedia.org/wiki/Menschenf%C3%BChrung">partizipativen Führungsstil</a> höchst effektiv.</p>

<p>Die Rückkopplung zum mittleren Management und der strategischen Führung wird greifbarer, denn jetzt kann sich das Management nicht mehr den „Scrum Master“ als Mittelsmann für Mitarbeiterführung herauspicken. Der Fokus für wird stattdessen zum Product Owner gelenkt. Der wiederum wird – wie auch das Management selbst – realisieren und anerkennen müssen, dass sich eine Selbstorganisation nicht kommandieren lässt, sondern sich nach Bedürfnissen orientiert.</p>

<h3 id="scrum-master-kein-platz-fur-projektleiter">Scrum Master: Kein Platz für Projektleiter</h3>

<p>Das Unternehmen wird schlanker, weil der „klassische“ Projektmanager nun nicht mehr in die für ihn äußerst angenehme „Scrum Master“-Schiene flüchten kann, sondern sie entscheiden muss: Entweder Product Owner oder Team!</p>

<p>Ich selbst dachte vor ein paar Jahren noch, dass der <a href="die-zukunft-des-projektmanagers-in-der-software-entwicklung.html">klassische Projektmanager nur die Wahl zwischen Scrum Master und Product Owner hat</a>. Falsch! Heute darf ich die Lehre ziehen, dass ich damals auf den Scrum Master als Rolle viel zu Stark fokussiert gewesen bin. Team und Product Owner sind die "Key Player", der Scrum Master ist nur Mittel zum Zweck, und das - wenn möglich - nur soviel wie unbedingt notwendig.</p>

<p>Mein Fazit: Mit einem rotierenden Scrum Master schafft man viele inherente Hürden aus dem Weg. Das Team, der Product Owner und die umgebende Organisation fokussieren sich deutlicher auf die Aufgabe. Der Prozess Scrum wird dadurch im Software-Entwicklungs-Theater wieder mehr zum Bühnenbild, das Team zu den Schauspielern und der Product Owner zum Regisseur. Damit ist dann auch eine gute agile Vorstellung wesentlich einfacher und schmerzfreier umsetzbar. Vorhang auf!</p>

<div id="see">
  <h6>
Weiterführende Artikel</h6>
                  <ul class="">
  <li><a href="/funf-schwachpunkte-von-scrum.html">Fünf Schwachpunkte von Scrum
    <span class="order">08 February 2010</span>
  </a></li>
  <li><a href="/scrum-die-bessere-sprintdauer.html">Scrum: Die bessere Sprintdauer
    <span class="order">04 March 2010</span>
  </a></li>
  <li><a href="/scrum-die-bessere-sprintplanung.html">Scrum: Die bessere Sprintplanung
    <span class="order">11 February 2013</span>
  </a></li>
</ul>
</div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Über das Ziel von Coding Dojos II</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/uber-das-ziel-von-coding-dojos-ii.html"/>
            <updated>2010-05-31T08:55:47Z</updated>
            <published>2010-05-31T08:55:47Z</published>
            <id>/uber-das-ziel-von-coding-dojos-ii.html</id>
            
            <content type="html"><![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="kein-yin-ohne-yang-kein-null-ohne-pointer.html">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 - 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 id="das-format-coding-dojo">Das „Format“ Coding Dojo</h3>

<p>Ich hatte schon vor über einem halben Jahr einmal über das <a href="uber-das-ziel-von-coding-dojos.html">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 id="aber-warum-ein-coding-dojo-ohne-coding">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 - also wir, die Coding Dojo Community - 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 id="coding-dojo-ist-kein-workshop">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 &amp; 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 id="coding-dojo-und-community">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 id="dojo-lernen">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 &amp; 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?“, "Konntest Du mitmachen?" 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 id="fazit-ausblick">Fazit &amp; 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 &amp; Lehren kann, wie man gemeinsam eine Problemstellung mit Logik &amp; 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>
        </entry>
                        <entry>
            <title type="html">Dojo-Workout-Wochen</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/dojo-workout-wochen.html"/>
            <updated>2010-05-12T19:58:31Z</updated>
            <published>2010-05-12T19:58:31Z</published>
            <id>/dojo-workout-wochen.html</id>
            
            <content type="html"><![CDATA[
                <p>Ich hatte es im „Coding Dojo Considered Helpful“-Artikel schon angekündigt, dass wir diesen Monat im .NET Coding Dojo München einen besonderen Gast mit einem besonderen Thema haben: <a href="http://ralfw.blogspot.com">Ralf Westphal</a> wird im Mai-Dojo eine Kata der besonderen Art mit den Teilnehmern durchführen. Frisch nach dem Münchener Forschungs- und Erfahrungsdrang dringt dabei das .NET Coding Dojo ab und an bis zum Grenzbereich.</p>

<p>Ralf wird im Mai-Dojo mit uns den Schwerpunkt Architektur &amp; Design trainieren. Einerseits ist das untypisch für ein .NET Coding Dojo, denn schließlich ist im Coding Dojo das „Coding“ nicht nur im Titel verankert, sondern auch das A und O eines jeden Dojo’s. Andererseits sind Anwendungs-Architektur und –Design wichtige Themen, denen besonders im Kontext der testgetriebenen Entwicklung Beachtung bemessen werden sollte. Umso besser und spannender ist es bei diesem Dojo, wie wir alle gemeinsam von der Idee, der Anforderung über die Architektur und bis zum Test-Driven-Design und der Implementierung gelangen werden.</p>

<p>Ein besonderes Thema verlangt auch eine besondere Location. Dank der tatkräftigen Unterstützung von Microsoft und dem <a href="http://www.der-evangelist.de">Evangelisten mit dem Hut</a> haben wir einen wirklich exklusiven Standort für dieses Dojo gefunden: Das <a href="http://www.microsoft.com/mtc/locations/munich.mspx">Microsoft-Technology-Center</a> in Unterschleißheim öffnet der .NET-Coding-Dojo-Crew die Pforten für diesen „Extra-Workout“. Danke!</p>

<h3 id="kuhl-sag-ich-kuhl">Kühl sag‘ ich, kühl!</h3>

<p>Wo wir gerade dabei sind: Die Idee und das Konzept des .NET Coding Dojo’s ist erfreulicherweise schon in einige Städte Deutschlands vorgedrungen. Dennoch - oder gerade deswegen - kommt es immer öfter vor, dass ich angesprochen werde und man mich frägt wie das denn im Coding Dojo so abläuft. Die ALT.NET-Crew in Berlin hat auf ihren <a href="http://www.altnetberlin.de/Termine/coding-dojo">Coding-Dojo-Seiten eine ziemlich gute Beschreibung</a>, doch jetzt gibt es eine noch anschaulichere Alternative: <a href="http://www.microsoft.com/germany/msdn/video/show.mspx?id=msdn_de_39788">MSDN TV war bei einem Dojo in München</a> zu Gast und hat ein paar interessante Impressionen mitgenommen!</p>

<p>Eine Überasschung, aber für mich eines der Highlights in dieser Folge ist die Nahaufnahme von zwei „.NET Coding Dojo Core‘s“, sozusagen dem ideelen Fundament der Münchener Coding-Dojo-Crew, Philipp (aka. Fuip) und Olaf (aka. Nurph). Natürlich gibt es mittlerweile viele tragende Stammgäste und immer wieder neue Teilnehmer, die alle dazu beitragen, ihr eigenes Dojo zu dem zu machen was es ist und mit uns gemeinsam weiter zu trainieren, um so immer mehr und deutlicher an die professionelle Softwareentwicklung heranzukommen. Euch allen vielen Dank! Ach ja, Jan hat in der Folge auch mich zum Thema interviewt. Alles in Allem: Kühl... sehr kühl! :-)</p>

<h3 id="net-coding-dojo-chillout">.NET-Coding-Dojo-Chillout</h3>

<p>Und weil in München gerade .NET Coding Dojo-Workout-Wochen sind geht es nach der Denk-Design-Diskussions-Orientierung im Mai im Juni wieder direkt an den Code! Das Münchener .NET Coding Dojo wird im Juni wieder ein Dojo erster Klasse veranstalten: Am 22. Juni sind wir zu Gast beim <a href="http://www.dotnetpro-powerday.de/Programme/dotnetpro.powerday-C-fuer-Profis-am-22.-Juni-2010">dotnetpro.powerday für C# Profis</a>! Tagsüber wird von <a href="http://www.des-eisbaeren-blog.de/">Golo</a> und <a href="http://www.der-albert.com">Albert</a> (dem Online-Dojo-Virtuosen) C# Know-How kompakt und verständlich vermittelt, abends wird im .NET Coding Dojo gechillt eine Code-Kata mit dem neu gewonnenem Wissen gelöst. Chillen, Programmieren und Lernen geht nicht? Dann überzeuge Dich vom Gegenteil im .NET Coding Dojo bei dem C#-Profi-dotnetpro-powerday! <a href="https://www.xing.com/events/net-coding-dojo-empowered-508914">Anmelden und gechillt coden</a>!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Goto Dojo Considered Helpful</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/goto-dojo-considered-helpful.html"/>
            <updated>2010-05-03T20:49:49Z</updated>
            <published>2010-05-03T20:49:49Z</published>
            <id>/goto-dojo-considered-helpful.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist es heute an der Zeit, darüber zu schreiben, daß Pete und ich uns nun darin einig geworden sind, die erste Hürde mit dem <a href="dotnet-coding-dojo.html">.NET Coding Dojo</a> gestemmt zu haben. Was diese erste Hürde ist und wieso wir das so sehen, werde ich später noch erklären.</p>

<p>Doch zunächst möchte ich auf die nächsten .NET Coding Dojo-Termine hinweisen, denn der Mai wird ein regelrechter Coding-Dojo-Workout-Monat werden!</p>

<h3 id="coding-dojo-berlin-round-ii">Coding Dojo Berlin: Round II</h3>

<p>Gong! Die zweite Trainingsrunde für das .NET Coding Dojo in Berlin steht kurz vor der Tür! Morgen schon, am 04.05. werden die Hauptstädtler so richtig die Bude rocken. Ich zitiere: „Strukturiertes Vorgehen, schnelle Finger und messerscharfe Logik sind unsere Waffen!“ So ist es richtig, und die Berliner Crew braucht nicht nur diese Eigenschaften, sondern auch weitere Unterstützung von .NET Entwicklern, TDD-Jüngern und CCD-Freunden. Gemeinsam das Code-Kata lösen, welches Mike schon durch das Sparring gepfercht hat. Sei dabei: <a href="http://www.altnetberlin.de/Termine/coding-dojo/kommender-dojo">Anmelden und Mitmachen!</a></p>

<h3 id="coding-dojo-online-weinerts-2-sinfonie">Coding Dojo Online: Weinert's 2. Sinfonie</h3>

<p>Beim letzten Online Coding Dojo haben <a href="http://www.der-albert.com/">der Albert</a> und die Online-Teilnehmer alles gegeben, um das Code Kata zu lösen. Es hat wieder einmal jede Codezeile gezählt. Die Kata und der Albert als virtuos auf der Tastatur fegender Kunst-Coder waren so fesselnd, dass nach dem Fall des ersten Online-Dojo-Vorhangs schon fest stand: Es muss eine 2. Sinfonie geben! Diese Woche ist es soweit. Am Donnerstag, den <a href="https://www.xing.com/events/2-online-coding-dojo-497522">06.05. findet das zweite .NET Online-Coding-Dojo</a> statt. Es wird wieder eine Herausforderung erster Klasse werden, also nicht zögern und zaudern, sondern gleich <a href="https://www.xing.com/events/2-online-coding-dojo-497522">anmelden</a> und mit Albert und der geballten Know-How-Power der .NET-Online-Community das Code-Kata im Online-Coding-Dojo lösen! Auf geht’s!</p>

<h3 id="coding-dojo-wien-mvc-ftw">Coding Dojo Wien: MVC FTW!*</h3>

<p>Andreas, Adrian und die Wiener Dojo-Fraktion machen weiter an ihrem ASP.NET MVC Fundament und verknüpfen exemplarische Anwendungsentwicklung geschickt mit dem Coding Dojo und den darin gestellten Herausforderungen des Test-First, TDD &amp; CCD. Das und vieles mehr qualifiziert die Wiener Gruppe zur Avangarde und Vorreitern der Coding Dojo-Szene in Österreich. Sei dabei, wenn es am 14.05. wieder heisst: MVC-Training im Coding Dojo - <a href="http://dotnetopenspace.ning.com/events/aspnet-mvc-anwendung-1">Anmelden</a>! <em>(*Update!)</em></p>

<h3 id="coding-dojo-hamburg-die-premiere">Coding Dojo Hamburg: Die Premiere</h3>

<p>Vorhang auf, meine Damen &amp; Herren. Die .NET-Community in Hamburg präsentiert das <a href="http://www.navision-blog.de/2010/05/03/erstes-net-coding-dojo-in-hamburg/">erste .NET Coding Dojo in Hamburg</a>, am 19.05.2010! Es wird eine ganz besondere Premiere, eine würdige Premiere der Coding Dojo Begeisterten in Hamburg werden, denn Hamburger sind bekannt für den hohen Anspruch, den sie an sich selbst stellen. Gleich das erste Coding Dojo wird ein Randori werden. .NET Entwickler im Norden Deutschlands, lasst euch gesagt sein, wer dieses Highlight verpasst, ist selber schuld! Auf geht’s zum .NET Coding Dojo Hamburg: <a href="https://www.xing.com/events/coding-dojo-506845">Anmelden</a>!</p>

<h3 id="coding-dojo-munchen-dojo-deluxe">Coding Dojo München, Dojo Deluxe</h3>

<p>Das Münchener .NET Coding Dojo macht weiter und trainiert weiter hart und unermüdlich. Modernste Software-Entwicklungs-Methoden, TDD im Hochleistungsbereich und CCD Eleganz treffen sich in München zum Coding Dojo der Extraklasse. In München geht es im Mai heiß her! <a href="http://ralfw.blogspot.com/">Ralf Westphal</a> wird mit der .NET Coding Dojo Gemeinde in München ein Dojo der Extraklasse abhalten und das <strong>D in Dojo</strong> dick und fett unterstreichen. <strong>Denken, Designen, Diskutieren!</strong></p>

<p>Als Sahnehäubchen "On-Top" wird es eine besondere Location geben, die wir eine Woche vor dem Dojo bekanntgeben werden! Freut euch, dieses „Dojo Deluxe“ darf man nicht verpassen! Sei dabei, wenn die .NET Community mit modernsten Software-Entwicklungs-Methoden das Code-Kata von Ralf löst! Auf geht's: <a href="https://www.xing.com/events/net-coding-dojo-deluxe-munchen-506973">Anmelden</a>!</p>

<h3 id="coding-dojo-bei-dir">Coding Dojo Bei Dir!</h3>

<p>Nach diesen Dojo-Highlights komme ich wieder zum Anfang meines Posts zurück. Wir, die .NET Coding Dojo Community aus München sind überzeugt von den Vorteilen, die ein .NET Coding Dojo mit sich bringt. Immer wieder freuen wir uns, gemeinsam eine Aufgabe zu lösen, neue und bekannte Gesichter wiederzusehen und uns auszutauschen. Über kleine Dinge, wie z.B. Resharper-Shortcuts. Aber auch über große Dinge, wie z.B. Template Method vs. Higher Order Functions. Das ist es aber nicht, was Pete und mich als Initiatoren der .NET Coding Dojo-Bewegung nun dazu veranlässt, einen Haken hinter unser erstes Etappenziel zu setzen. Es ist etwas anderes.</p>

<p>Mittlerweile gibt es viele Interessierte, die die Idee und das Konzept des .NET Coding Dojo’s gut finden und selbst implementieren. Es gibt .NET Coding Dojo’s nun nicht mehr nur in München, sondern auch in Berlin, Hamburg, Wien, Augsburg, Ingolstadt, Karlsruhe und sogar ortsunabhängig Online! Auch wenn nicht viel darüber geredet wird oder darf, ich kenne mittlerweile eine handvoll Unternehmen, die intern regelmäßig Dojo’s durchführen, und das mit sensationellen Erfolgen. Doch auch diese Verbreitung und das allgemein steigende Interesse für .NET Coding Dojo’s ist es nicht, was unsere erste Etappe als erledigt markiert. Es ist etwas anderes.</p>

<h3 id="goto-dojo-considered-helpful">Goto Dojo Considered Helpful</h3>

<p>Es ist der einfache, ungeschriebene, stille aber dennoch treibende und gedeihende Gedanke, dass die .NET Entwickler-Gemeinde Coding Dojo’s als eine hilfreiche und gleichzeitig unterhaltsame Maßnahme akzeptiert und implementiert. Es ist die Bewegung und Bereitschaft der Community, eigenständig Coding Dojo’s zu organisieren und zu veranstalten. Es ist der schlichte Umstand, dass mittlerweile „.NET Coding Dojo“ nicht mehr nur mit „Pete“ oder „Ilker“ oder diesen Blog hier assoziiert wird, sondern vielmehr mit gemeinsamer Entwicklungsleistung, mit Code-Kata’s, der Clean-Code-Developer-Bewegung und mit den vielen Gesichtern und .NET-Enthusiasten in der Community. Das ist es, was uns dazu veranlässt ein „Check“ zu machen und uns auf schon auf die nächsten Coding Dojo’s zu freuen.</p>

<p>An dieser Stelle möchte ich jeden .NET Entwickler, TDD-Interessierten und CCD-Freund dazu motivieren, selbst an einem .NET Coding Dojo teilzunehmen oder aber ein .NET Coding Dojo zu gründen. Wie man aus der Ankündigungsliste unschwer ableiten kann, ist es garnicht so schwer, ein .NET Coding Dojo zu gründen. Die gesamte Coding-Dojo-Community kann und wird euch dabei unterstützen mitzumachen. Die besten Anlaufstellen sind hier die <a href="https://www.xing.com/net/netdojo/">Xing-Gruppe</a> und die <a href="http://www.facebook.com/pages/NET-Coding-Dojo/10150113747745398">Facebook-Page</a>! Sei dabei, mach mit, es lohnt sich!</p>

<p><strong>Goto Dojo Considered Helpful!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Kein Yin ohne Yang, kein Null ohne Pointer</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/kein-yin-ohne-yang-kein-null-ohne-pointer.html"/>
            <updated>2010-05-02T22:58:57Z</updated>
            <published>2010-05-02T22:58:57Z</published>
            <id>/kein-yin-ohne-yang-kein-null-ohne-pointer.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist eine schwierige Zeit heutzutage. Besonders für Software-Entwickler. Denn heutzutage gibt es für einen Software-Entwickler viele Dinge, die er lernen, können und beachten muss. Da gibt es die Tools, die Programmiersprachen, die Methoden, die Anforderungen, die Domäne, die Kollegen und noch vieles mehr. Da gibt es schon einmal Momente, in denen man sich unsicher ist. „Mache ich das richtig?“, „gibt es bessere Lösungen?“ oder „hoffentlich passt das...“. Zumindest geht es mir manchmal so, z.B. bei neuen Dingen oder besonders komplexen Problemstellungen. Ich bin dann froh, wenn ich um mich herum jemanden habe oder finde, der mich und mein Problem versteht und mir helfen kann. Helfen mit seiner Einschätzung, seiner Meinung und seinen Erfahrungen.</p>

<h3 id="helfen-ist-schon-geholfen-werden-ist-schoner">Helfen ist schön, geholfen werden ist schöner!</h3>

<p>Ich weiß es nicht genau, aber ich vermute es ein wenig, dass <a href="http://blog.thomasbandt.de/39/de/blog.html">Thomas</a> auch froh ist, wenn er durch Meinungsaustausch seine eigenen Herausforderungen besser einzuschätzen vermag. Ich persönlich empfinde diese „Kalibrierung“ als wichtigen Baustein zur Festigung der eigenen Meinung.</p>

<p>Thomas hat mit <a href="http://blog.thomasbandt.de/39/2333/de/blog/null-verstaendnis.html">Null Verständnis</a> gefragt, wie die Handhabung von NULL als Rückgabe von Methoden bei anderen Entwicklern umgesetzt und eingeschätzt wird. Viele haben kommentiert, einige haben auch Blog-Post-Antworten geschrieben. Ich habe das mit Kommentaren und dem <a href="null-toleranz.html">Null Toleranz-Beitrag</a> auch getan, der <a href="http://ralfw.blogspot.com/2010/05/null-oder-nicht-null-das-ist-hier-die.html">unermüdliche Ralf hat auch kräftig in die Tasten gehauen</a>. Überraschenderweise mit mehreren Aussagen.</p>

<p>Ralf geht in seinem „<a href="http://ralfw.blogspot.com/2010/05/es-hilft-nichts-dass-es-darauf-ankommt.html">Plädoyer für Regeln</a>“ auch auf einige Punkte ein, die ich über die Handhabung von NULL in Anwendungsszenarien bemerkt hatte. Ralf hat so vieles geschrieben, dass es mir schwer fällt, wirklich alle Themen in einem oder mehreren Blog-Posts zu erwidern. Einen Überblick über meine Perspektive möchte ich dennoch geben.</p>

<h3 id="mind-the-null">Mind the Null!</h3>

<p>Ralf stellt im Namen der Community die erste Null-Regel auf:</p>

<blockquote>
<p>"Man darf Null benutzen und auch als Wert zurückgeben – aber Vorsicht! Erst prüfen, ob es nicht auch anders geht"</p>
</blockquote>

<p>D’accord! Das hatte ich ja auch schon in Kommentaren und <a href="http://twitter.com/ilkerde/status/13197888337">per Twitter</a> erwähnt. Doch wann kann man Null verwenden, wann nicht? Gibt es dafür eine „kontextarme“ Regel? Kann man pauschal sagen: „<a href="http://twitter.com/DerAlbert/status/13246967481">Verwende es nicht!</a>“. Meiner Meinung nach ist das nicht so einfach. Klar kann ich auch sagen, dass man Null einfach nicht anwenden soll, aber ich mache es mir nicht so einfach.</p>

<p>Wenn ich nämlich obige Regel einem Embedded-Entwickler entgegenbringe, dann lacht der mich mal gepflegt vor seinen Kollegen aus. In der Embedded-Entwicklung, wie auch bei sehr ressourcenintensiven Geschäftsanwendungen ist es nämlich durchaus erstrebenswert, oft NULL zurückzugeben, um damit z.B. eine leere Liste oder leere Suche zu signalisieren. Es mögen sich wenige daran erinnern, aber NIL (als Synonym für NULL) ist die Abkürzung für „<a href="http://www.mirrorservice.org/sites/www.gnu-pascal.de/gpc/nil.html">Not-In-List</a>“.</p>

<h3 id="null-fur-hacker">Null für Hacker</h3>

<p>Ich selbst durfte schon mehrere serverseitige Komponenten von „Exception-Flut“ befreien, in dem ich sie in einigen Stellen durch NULL ersetzt habe. Danach lief der Service doppelt so schnell bei 25% weniger Ressourcenverbrauch. Bin ich jetzt ein Aussetziger, weil ich die Regel nicht befolgt habe?</p>

<p>Ich denke nein. Denn: In einigen Anwendungsszenarien ist es gang und gäbe NULL als Mittel einzusetzen. Mehr noch, es ist „normal“, soz. "die Regel". Deswegen sage ich nach wie vor: Die Regel ist richtig, man sollte vorsichtig mit NULL umgehen und es mit bedacht einsetzen. Doch eine „Faustregel“ ist es für mich noch nicht, denn man kann es (noch) in bestimmten Anwendungsfällen vorteilhaft und stringent einsetzen.</p>

<h3 id="catastrophicfailureexception-null">CatastrophicFailureException ?? Null</h3>

<p>Ralf schreibt:</p>

<blockquote>
<p>„Null-Regel #2 (von Ilker; noch zu diskutieren): In Katastophenfällen darf Null zurückgegeben werden.“</p>
</blockquote>

<p>Das ist keine Regel. Den Regelbedarf und die Kreativität zum Design eines Regelwerks wie Ralf habe ich (noch) nicht. Ich habe dafür aber Programme, die Probleme lösen. Bei einigen, wenigen Programmen habe ich NULL als Rückgabe für „katastrophale Fehler“ zurückgegeben.</p>

<p>Das hat mir bei der <a href="http://de.wikipedia.org/wiki/Defensives_Programmieren">defensiven Programmierung</a> geholfen, denn es ging um eine etwas kritischere Komponente, die an Schnittstellen sog. „Guards“ hatte, die alle möglichen Exceptions abgefangen haben. Im Nachhinein betrachtet hätte ich es wohl auch mit einer „CatastrophicFailureException“ oder mehreren, spezifischeren Exceptions lösen können. C'est ca!</p>

<h3 id="null-nur-bei-gleicher-kategorie">Null nur bei „gleicher Kategorie“</h3>

<p>Die dritte Regel von Ralf: </p>

<blockquote>
<p>"Null darf nur Rückgabewert sein, wenn Null zur selben Kategorie gehört wie ein Nicht-Null Rückgabewert".</p>
</blockquote>

<p>Naja, streng genommen ist NULL ja nichts, und damit kann man es auch nicht kategorisieren. Antizipieren kann ich da nur, dass es um das <a href="http://blog.thomasbandt.de/39/2331/de/blog/kleiner-helper-fuer-linq-to-sql-tolistordefault-update.html">Beispiel von Thomas mit der Liste</a> gehen kann. Dem kann ich nur zustimmen. Hier ist ein Ausnahmefall zwar auch möglich, aber doch eher selten.</p>

<h3 id="dein-pflock-ist-mein-maibaum">Dein Pflock ist mein Maibaum!</h3>

<p>Ralf hatte mir zu viel "Rumgeeiere" in meinen Aussagen über <code>NULL</code> attestiert. Das will ich doch gerne versuchen besser zu machen und Ralf‘s „Pflock in Boden“ in meine triviale niederbayrische Welt übertragen und damit mal den „Maibaum ins Dorf“ stellen. Also, auf geht’s, Maderl &amp; Buam – mein Maibaum im Dorf „Nullinger“!</p>

<p>Ilker's Statement zu Null als Rückgabe von Methoden:</p>

<blockquote>
<p>NULL ist gefährlich, meide NULL, außer es gibt triftige Gründe. Triftige Gründe können Performance, Speicher oder dynamische Datenstrukturen sein. Solltest Du NULL als „Indikator“ für etwas verwenden (z.B. „Nicht gefundener Benutzer“), ziehe eine Vermeidungsstrategie mit Exceptions oder ReturnCodes in Erwägung. Sei auf der Hut, NULL ist überall. Prüfe, ob deine Parameter oder deine Methoden NULL zurückgeben. Prüfe besonders, wenn Du parallelisierst oder wichtige Schnittstellen bedienst. Solltest Du ein NULL finden, versuche zunächst damit umzugehen. Geht das nicht mehr, signalisiere die Ausnahme. Achte darauf, dass ein NULL die Methode nicht verlässt.</p>
</blockquote>

<p>So, ich hoffe das war <a href="http://de.wikipedia.org/wiki/Kanak_Sprak_%E2%80%93_24_Mi%C3%9Ft%C3%B6ne_vom_Rande_der_Gesellschaft">konkret krass korrekt</a> genug!</p>

<h3 id="immer-diese-abhangigkeiten">Immer diese Abhängigkeiten</h3>

<p>Nachdem nun der Maibaum in Django Asül-Manier aufgestellt ist, möchte ich neben dem Ausgangsthema mich noch ein wenig den neuen Themen widmen, die Ralf in seinem <a href="http://ralfw.blogspot.com/2010/05/es-hilft-nichts-dass-es-darauf-ankommt.html">Rules of Null-Post</a> erwähnt hat. Ralf regt sich dabei ganz besonders über die „It depends“-Phrase auf. Ja, „It depends“, die allmächtige und einzige Antwort auf alles, was so im Leben an Fragen auf einen zukommen kann. Die Antwort „It depends“ ist kurz, erfüllt die Aufgabe und ist hochgradig flexibel bei gleichzeitig maximaler Wiederverwendbarkeit. Geradezu traumhafte Eigenschaften aus der „Nerd-Software-Entwickler“-Perspektive, oder nicht? Vielleicht ist es deshalb auch so beliebt in unserer Banche?</p>

<p>Spaß beiseite. „It depends“ ist eine Phrase, die mehr oder minder Inhalt liefern kann. Ich stimme Ralf zu, wenn er sagt, dass dieses „Es kommt drauf an“-Getue mit der Zeit nicht mehr auszuhalten ist. Deswegen kann ich die Reaktion von Ralf auch gut verstehen. Ich selbst finde es teilweise immer wieder erschreckend, wie oft auf diese Floskel zurückgegriffen wird, ohne darüber nachzudenken. Dennoch verwende ich es - ab und an zumindest, wenn ich es für erwähnenswert erachte.</p>

<h3 id="niemals-ist-niemals-niemals">Niemals ist niemals niemals</h3>

<p>Fakt ist auch, dass „It depends“ nicht nur eine Bierdeckelweisheit ist, sondern auch als Abkürzung verwendet wird. Im Stile „ich erspare mir und Dir jetzt nähere Details“. Das kann gut und schlecht interpretiert werden. So oder so, es kommt darauf an :-) Genauer gesagt, auf den, der es interpretiert.</p>

<p>Womit wir bei der <a href="http://de.wikipedia.org/wiki/Quadratur_des_Kreises">Quadratur des Kreises</a> angelangt wären: Es ist nunmal so, dass wir Systeme vereinfachen und Abstraktionen schaffen, um es zu verstehen. Dabei geht auch Genauigkeit und Wahrheit verloren. Manchmal sogar so sehr, dass die aus der Vereinfachung abgeleitete Erkenntnis nicht mehr adequat bzw. erwartungsgerecht ist. Insofern ist „It depends“ nicht nur eine Fassade oder Ausrede, sondern eine zuweilen notwendige Mahnung, den Kontext und die Erkenntnis zu hinterfragen, sich bewußt mit der Lösung und Problemstellung auseinanderzusetzen. Für die Agilisten unter uns: „It depends“ ist ein auch ein Aufruf zum „Inspect &amp; Adapt“.</p>

<p>Ich kann mich guten Gewissens Ralf anschließen, wenn es darum geht, Leitfäden und Empfehlungen über die Anwendung von <code>NULL</code> mit der Community zu erarbeiten. Meinungsaustausch ist Katalysator für Lernen, Entdecken, Erfahren und Bestätigen. Doch ein Regelwerk will ich nicht erstellen. Ich gebe meine Meinung und meinen Standpunkt gerne wieder. So wie ich es erfahren habe und so, wie ich es für gut empfinde.</p>

<p>Regeln habe ich auch. Ich habe meine eigenen Regeln, ich habe Teamregeln und ich habe noch eine Reihe weiterer Regeln, die ich für mich beachte und schätze. Regeln sind für mich wichtig. Ich möchte damit sagen, dass ich durchaus Ralfs Motivation nachvollziehen kann. Doch ich habe meine Beiträge nicht mit dieser Motivation mit der Community geteilt. Mein Ziel ist die Kommunikation und der Erfahrungsaustausch. Das wird auch so bleiben.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Null Toleranz</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/null-toleranz.html"/>
            <updated>2010-05-02T01:09:32Z</updated>
            <published>2010-05-02T01:09:32Z</published>
            <id>/null-toleranz.html</id>
            
            <content type="html"><![CDATA[
                <p>Eine angeregte Diskussion ist gestern "ent-Bandt" :-) mit den Blog-Posts über den kleinen <a href="http://blog.thomasbandt.de/39/2331/de/blog/kleiner-helper-fuer-linq-to-sql-tolistordefault-update.html">ToListOrDefault()-Helper</a> und die dadurch entstandende <a href="http://blog.thomasbandt.de/39/2333/de/blog/null-verstaendnis.html">Null-Verständnis-Thematik</a> sowie <a href="http://ralfw.blogspot.com/2010/05/null-oder-nicht-null-das-ist-hier-die.html">der philosophischen Ausführung über das Null oder nicht Null</a> in Anwendungen. Man kann in den Posts wunderbar nachlesen, worum es geht - deswegen hier nur eine kleine Rekapitulation.</p>

<p>Thomas stellt zur Debatte, ob man aus Repository-Methoden ab und zu auch mal null zurückgeben darf/kann/soll. So z.B. bei so einer Methode:</p>

<div class="codehilite"><pre><span class="n">User</span> <span class="nf">GetUserByName</span><span class="p">(</span><span class="kt">string</span> <span class="n">name</span><span class="p">);</span>
</pre></div>

<h3 id="mache-das-unmogliche-moglich">Mache das Unmögliche möglich?!?</h3>

<p>Einige Leute finden das garnicht besonders gut. Sie bevorzugen lieber soetwas wie einen "nicht-existenten" User zurückzugeben. Also eine Instanz einer Klasse, die eigentlich garnicht möglich wäre (weil sie ja die nicht exsistierende Instanz darstellt). Programmtechnisch ist das sicherlich recht einfach lösbar - oftmals mit einer statischen Property, die sich wiederum eines privaten Konstruktors bedient. In dem obigen Beispiel könnte eine derartige Implementierung ungefähr so aussehen:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="n">User</span> <span class="nf">GetUserByName</span><span class="p">(</span><span class="kt">string</span> <span class="n">name</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(!</span><span class="n">repository</span><span class="p">.</span><span class="n">UserExists</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">User</span><span class="p">.</span><span class="n">NotExistent</span><span class="p">;</span>

  <span class="c1">//user laden und zurückgeben</span>
<span class="p">}</span>
</pre></div>

<p>Eine zweite, nicht minder bevorzugte Alternative zur Rückgabe von NULL ist die beliebte Exception. Falls also kein Benutzer unter dem angefragten Namen existieren sollte, dann soll eine Ausnahme signalisiert werden. Ganz einfach implementiert:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="n">User</span> <span class="nf">GetUserByName</span><span class="p">(</span><span class="kt">string</span> <span class="n">name</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(!</span><span class="n">repository</span><span class="p">.</span><span class="n">UserExists</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
    <span class="k">throw</span> <span class="k">new</span> <span class="nf">UserNotFoundException</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>

  <span class="c1">// user laden und zurückgeben</span>
<span class="p">}</span>
</pre></div>

<p>Beides sind sicherlich mögliche und sogar gute Alternativen zu der Implementierungsvariante, die Thomas zur Diskussion gestellt hat:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="n">User</span> <span class="nf">GetUserByName</span><span class="p">(</span><span class="kt">string</span> <span class="n">name</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(!</span><span class="n">repository</span><span class="p">.</span><span class="n">UserExists</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
    <span class="k">return</span> <span class="k">null</span><span class="p">;</span>

  <span class="c1">// user laden und zurückgeben</span>
<span class="p">}</span>
</pre></div>

<p>Um es kurz zu fassen: Alle drei Varianten sind möglich, alle drei Varianten sind gut, alle drei Varianten sind schlecht. Es kommt auf den Anwendungsfall an. Die beliebte "It-Depends"-Weisheit streckt das Thema mit geballter Kraft nieder. Dennoch ist es eine Untersuchung wert, denn ungewöhnlicherweise wird die NULL-Variante kategorisch als falsch und "böse" bewertet.</p>

<h3 id="nullbivalenz">Nullbivalenz</h3>

<p>NULL ist ein besonderer Wert. Er ist der Wert, der eigentlich nicht zugewiesen werden kann. Genauer genommen ist er kein Wert, sondern nichts anderes als die knapp in vier Buchstaben formulierte Aussage "Ein für eine bestimmte Werteklasse belegter Ort wurde mit keinem Wert belegt". Ergo: Null ist kein Wert. Ja, aber ist das denn nicht genau das, was <code>GetUserByName</code> ausdrücken und zurückgeben muss, wenn es keinen Benutzer für den gegebenen Namen findet?</p>

<p>Schaut man sich die erste Alternative zu NULL an (also das <code>User.NonExistent</code>-Konstrukt), dann kann man sagen: Joa, ok - ist aber das Gleiche. User.NonExistent ist sicherlich expliziter als NULL. NULL ist aber schon da und genau für solche Dinge gedacht. Die Aufgabe von NULL ist ja genau die, keinen Wert darzustellen.</p>

<p>Und wie sieht es mit Alternative Zwei - der <code>UserNotFoundException</code> aus? Die Excpetion ist auch explizit. Mehr noch, die Exception ist flexibel und rigoros gleichermaßen. Flexibel, weil sie jederzeit aus dem Nichts auftauchen kann. Rigoros, weil sie eine Fülle von Informationen über den Kontext sammeln und mitgeben kann. Die Exception sagt hier klar und deutlich: "Es gibt keinen Wert, weil der Benutzer {name} nicht gefunden wurde.". Scheinbar ein Vorteil gegenüber den anderen Varianten. Im Ergebnis ist es jedoch nicht wesentlich von den anderen Herangehensweisen unterscheidbar.</p>

<h3 id="null-sicherheit">Null Sicherheit</h3>

<p>Nun, offensichtlich ist die sprechendere Variante der Exception vorteilhaft und damit dem NULL vorzuziehen. Doch beim zweiten Blick entpuppt sich der Vorteil als nicht so deutlich als zunächst vermutet. Denn in der Praxis kann sich die "unklare" und "unexplizite" Art von NULL wieder als erwünscht erweisen.</p>

<p>So muss man bei Exceptions, um den Mehrwert zu kennen, auch deren Typ genau kennen. Man muss also Wissen, das es sich um eine <code>UserNotFoundException</code> handelt. Erst dann kann man auch erfahren, welcher ominöse Benutzer unauffindbar ist. Das kann durchaus problematisch werden, wenn man also im höheren Callstack wissen muss, um welche Exception es geht, denn schliesslich schafft man sich dadurch eine Abhängigkeit auf den niedrigeren Code.</p>

<p>Null ist also eine unsichere, uninformative, aber immer verfügbare und unabhängige Variante, dem Aufrufer zu sagen: "Es gibt keinen Wert für das, was Du von mir verlangst". Wenn man sich mit der Anwendung von NULL jahrelang auseinandergetzt hat und auch ein wenig die ungeliebten Interna von Speichermanagement &amp; Datenstrukturen hineinblickt, dann wird NULL schnell zu einer praktikablen Lösung für schwierige Situationen.</p>

<p>Doch vor Allem bei NULL stellt man immer wieder fest: praktikabel und elegant sind zwei verschiedene paar Schuhe. Denn NULL ist genauso nichtssagend wie vielseitig. NULL zwingt den Aufrufer zum Abwägen: Soll ich das Ergebnis gleich auswerten oder lieber überprüfen? Ein wunderbares Beispiel dafür ist sicherlich der "if (x != null)"-Check - die Null-Prüfung. Das wird vor Allem dann zum Problem, wenn man mit (gewollt oder ungewollt) unbekannten Komponenten arbeitet. Im Interface oder in der Typsignatur steht es jedenfalls sehr selten erkennbar drin, ob nun in Einzelfällen NULL zurückgeliefert wird oder nicht.</p>

<h3 id="null-ist-nicht-gleich-null">Null ist nicht gleich Null</h3>

<p>Für mich gibt es beim Umgang und bei der Anwendung von Null keine Faustregel. Ich gebe in einigen Methoden NULL zurück. Meistens genau dann, wenn ich wirklich damit ausdrücken möchte, dass etwas katastrophales passiert ist. Ich finde es sehr schwerwiegend, NULL als Zuweisung oder Rückgabe stehen zu lassen - aber ich mache es manchmal ganz bewusst. In einer Anwendung, in der ich z.B. Benutzer über einen Authentifizierungsdienst identifizieren muss, bevor ich überhaupt etwas anderes machen kann, kann die folgende Signatur NULL zurückliefern:</p>

<div class="codehilite"><pre><span class="k">interface</span> <span class="n">IAuthenticationService</span> <span class="p">{</span>
  <span class="n">Account</span> <span class="nf">SignIn</span><span class="p">(</span><span class="kt">string</span> <span class="n">user</span><span class="p">,</span> <span class="kt">string</span> <span class="n">password</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<p>Es kann alles mögliche passiert sein  - keine Verbindung zum Server, falscher Server, Verbindungsfehler, Connection Timouts, Benutzer nicht gefunden, Benutzer gesperrt, Passwort abgelaufen, falsches Passwort - all dies würde ich versuchen über Exceptions oder Return-Codes zu erledigen. Die meisten der Exceptions gibt es ja schon frei Haus vom Framework. Aber für das mich Unbekannte und Unerwartete gibt es immer noch eine Rückgabe, und die heisst NULL.</p>

<h3 id="null-summen-spiel">Null-Summen-Spiel</h3>

<p>Generell kann ich für mich nur sagen, dass ich gelernt habe mit NULL sehr vorsichtig umzugehen. Ich vermeide es so gut wie möglich. Exceptions sind ein gutes Mittel - allerdings setze ich sie auch nicht sehr oft ein. Die Bürde der Abhängigkeit ist schon da - obwohl es natürlich in der Contract-Assembly definiert ist. Bei Repositories habe ich (fast) immer Ergebnisse die nicht NULL liefern. Andererseits setze ich NULL als Rückgabe auch öfter ein, wenn ich nur eine "schwere" Ausnahme in meinem Code feststelle.</p>

<p>Im obigen Beispiel hätte ich wohl NULL als Rückgabe toleriert, vor Allem, wenn ich davon ausgehen kann, dass es oft - oder sehr oft - dazu kommen kann und diese Tatsache ein schwerwiegendes Problem darstellt. Ein schönes Beispiel sind immer wieder die Brute-Force und DOS-Attacken auf Webportale.</p>

<p>Ich hätte wahrscheinlich nicht NULL zurückgegeben, sondern eine Exception ausgelöst, wenn ich das Ganze als wiederverwendbare, allgemeine Kompontente entwickeln würde.</p>

<p>So oder so - beides ist machbar und beides hat seine Berechtigung. Klar und deutlich soll aber abschließend erwähnt sein: NULL zu vermeiden ist eine gute Sache. Es macht den Code expliziter, offensichtlicher und lesbarer.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">23 Nisan – Children&#39;s Day</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/23-nisan-childrens-day.html"/>
            <updated>2010-04-23T00:48:05Z</updated>
            <published>2010-04-23T00:48:05Z</published>
            <id>/23-nisan-childrens-day.html</id>
            
            <content type="html"><![CDATA[
                <p>I've never posted in English on my blog before. Since a few months my stats report that more than 1/3rd of my visitors aren't germans, so I guess it's time to write some stuff in English here as well. International and intercultural thinking suits well today. Today, it's April 23rd - or <strong>23 Nisan</strong>, as Turkish people would say. So what's so special about 23 Nisan? Give me a few lines to lay this out from my personal perspective.</p>

<p>I have roots in Turkey. My parents, my uncles, aunts, nephews and quite a few friends are Turks. Though not born and not living in turkey, I am feeling as a Turk as well. I kind of love my turkish roots. I like turkish traditions like enjoying <a href="http://en.wikipedia.org/wiki/Turkish_tea">Cay</a> or going to <a href="http://en.wikipedia.org/wiki/Turkish_bath">Hamam</a>. I'm a Muslim as well. My strong belief is that religion, tolerance and respect are tightly coupled together. But one of the most important things of my turkish background surely is my relation to <a href="http://en.wikipedia.org/wiki/Kemalist_ideology">Kemalism</a>. To those (probably the most) not being familiar with it: It's not a political kind of thing, more ideological or mental. Don't get me wrong on this. I'm the moderate kind of guy from the next door and I love being such. But what the heck am I starting to paint background with Kemalism here?</p>

<h3 id="thank-you-mr-mustafa-kemal-ataturk">Thank you, Mr. Mustafa Kemal Atatürk</h3>

<p>There's a turkish idiom saying "Ne mutlu türküm diyene" ("Glad who claims being Turk"). It's a quote from <a href="http://en.wikipedia.org/wiki/Mustafa_Kemal_Atat%C3%BCrk">Mustafa Kemal Atatürk</a> - basically the guy who formed the foundation of modern Turkey as you and I know it nowadays. He didn't meant this to be in a patriotic or fundamental way. His perspective was some sort of enlightenment through modernization at that time. His outermost and strong commitment was to <strong>establish the spirit of progress, education and humanity</strong>. And guess what, he succeeded in doing so - at least for me.</p>

<p>He was the one proclaiming this day, April 23rd, as the national and international day of children. "It's the children being our future" he said. In order to keep people being aware about this fact, he just decided to announce Children's Day as official holiday. Boom. It's that easy sometimes.</p>

<h3 id="celebrate-youth-teens-children-kids-babys">Celebrate Youth, Teens, Children, Kids, Babys</h3>

<p>Atatürk's a genius. This "children being our future" statement reminds me of that incredibly admirable <a href="http://www.youtube.com/watch?v=Gj8IA6xOpSk">TED Talk of Clifford Stoll</a> a few years ago - his talk is a must see, not only because of his advice to consult kindergarten teachers when you want to know how the future would be. Well, back to my beloved "23 Nisan". From the day of Atatürk's announcement, this day has always been a day full of celebration and honor towards the younger people around us. The teens, kids and babys, you know. Yes, it's worth. No, not only worth, it's important, it's <strong>fundamental to honor and respect our next generation</strong> as we respect and honor our parents and elder fellows as well.</p>

<h3 id="you-are-important">You are important!</h3>

<p>And hey - what's so bad about respecting our future? Nothing. That's why I now ask you - <strong>yes you</strong> - to take action. It's so easy and yet powerful to celebrate 23 Nisan. Following is a rough guide with a top 10 list you can do today to celebrate Children's day with me, the world and all children:</p>

<ul>
<li><strong>Smile!</strong>
    An honest, respectful, warm smile transports a ton of goodness: appreciation, value, respect!</li>
<li><strong>Play a little game!</strong>
    Something like "Noughts and Crosses" or "Spy with my little Eye"...</li>
<li><strong>Treat kids as humans!</strong>
    They might not know all this cool things you know. But they have power and brain enough to understand it!</li>
<li><strong>Give them small presents!</strong>
    Like a small chocolate, fancy crayons, a colorful book...</li>
<li><strong>Give answers to questions!</strong>
    Kids love asking questions, especially why-who-what's. Learn to love answering them (be creative with your answers :-))</li>
<li><strong>Let kids play together!</strong>
    Give them the chance &amp; time to meet each other. Kids have a rigorous and emotional social life.</li>
<li><strong>Support children-friendliness!</strong>
    Organizations, Kindergartens, Schools - whatever it is, it's good to support people supporting kids!</li>
<li><strong>Take care of them!</strong>
    Kids might be sad at times. Even a child's life can be tough. Take care of them and help them to smile again!</li>
<li><strong>Be a kid!</strong>
    Kids love kids. As "adult", it's good, refreshing and fun to adapt perspectives of children. Try it! Have fun!</li>
<li><strong>Be yourself!</strong>
    The true power of a child is honesty. Be honest to others, be honest to kids, be honest to yourself!</li>
</ul>

<p>Come, join and celebrate <strong>23 Nisan - the Children's Day</strong> with me!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Meta-Test: NSpec – der spezifizierende BDD-Veteran</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/meta-test-nspec-der-spezifizierende-bdd-veteran.html"/>
            <updated>2010-04-22T21:19:47Z</updated>
            <published>2010-04-22T21:19:47Z</published>
            <id>/meta-test-nspec-der-spezifizierende-bdd-veteran.html</id>
            
            <content type="html"><![CDATA[
                <p>Einige meiner Freunde hatten schon Mutmaßungen geäußert, das <a href="http://xunit.codeplex.com/">xUnit</a> wohl das nächste Framework sein wird, welches ich mit "FizzBuzz" bearbeite. Keine Sorge, xUnit ist auch auf meiner Liste, aber heute soll zunächst einmal ein etwas weniger bekanntes Framework beäugelt werden: <a href="http://nspec.tigris.org/">NSpec</a>.</p>

<p><a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/06/27/146872.aspx">NSpec ist einer der ersten - wenn nicht sogar das erste explizite - BDD-Framework für .NET</a>. Mittlerweile wird es auch nicht mehr aktiv betreut. "Schade", denkt man sich auf der einen Seite. Andererseits jedoch nicht sooo schlimm. Schließlich war der Autor mit dieser "finalen" Version offensichtlich zufrieden. Überdies ist die NSpec-Basis auch in andere Test-Frameworks eingeflossen - dazu aber später mehr. Bleibt auch noch anzumerken, dass man NSpec und MSpec nicht miteinander verwechseln sollte. Die Frameworks unterscheiden sich massiv, obwohl die Namensähnlichkeit das nicht vermuten lässt. Auch <a href="http://github.com/machine/machine.specifications">MSpec</a> wird in meiner kleinen Serie sicherlich in der Zukunft noch seinen Platz finden. Doch nun zurück zu NSpec (N wie Nordpol) :-).</p>

<p>Bei NSpec dreht sich, wie nicht anders zu erwarten war, alles um Spezifikationen. Ich werde hier nicht näher auf die <a href="bdd-thebetterwayofunittesting.html">Gemeinsamkeiten oder Unterschiede zwischen TDD und BDD</a> eingehen, werde auch nicht groß ausholen, wie und wieso BDD entstanden ist. Es sei nur kurz angerissen, dass bei BDD nicht das "testen" im Vordergrund steht, sondern die Spezifizierung des Verhaltens - Behavior Driven Design eben. Abgesehen von der Terminologie ergeben sich weitere Unterschiede, die auch am Beispiel von NSpec feststellbar sind. Genug Vorgeplänkel, auf geht's zum Test-Training mit dem <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">FizzBuzz-Kata</a>!</p>

<h3 id="der-ton-macht-die-musik-das-wort-macht-die-geschichte">Der Ton macht die Musik - das Wort macht die Geschichte</h3>

<p>Visual Studio öffnen, Projekt anlegen, Referenz hinzufügen, los geht's! Äähhh... wohl doch nicht... wie schreibt man eigentlich Spezifikationen im Code? Also Finger wieder weg von der Tastatur und überlegen, um was es eigentlich geht. Ok, es geht um FizzBuzz. FizzBuzz ist ein Spiel mit <strong>Spielregeln</strong> - das ist es im Endeffekt, worum es hier geht. So eine Spielregel ist recht einfach, denn es gibt zu einer bestimmten Spielsituation - sagen wir mal zu einem bestimmten <strong>Kontext</strong> - immer eine Regel, die man anwenden muss, damit man weiter im Spiel bleibt. Anders ausgedrückt ist bei einer Spielsituation zu prüfen, ob die Regel richtig angewendet wird - ob also die <strong>Erwartungen</strong> an das Spielverhalten erfüllt werden.</p>

<p>Aha - so ist das also. Hört sich vielleicht etwas abgedreht an, aber dieses kurze <a href="http://de.wikipedia.org/wiki/Repetitorium">Repetitorium</a> hilft beim Schreiben der ersten Spezifikation ungemein. Denn NSpec kennt zwei Attribute, namentlich <code>[Context]</code> und <code>[Specification]</code>. Mit der kleinen o.g. FizzBuzz-Geschichte macht das auch Sinn, wie man dann auch im Code sehen kann:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">NSpec.Framework</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">FizzBuzzNSpec.Specs</span> <span class="p">{</span>
<span class="na">  [Context]</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">when_a_number_is_a_multiple_of_three</span> <span class="p">{</span>
<span class="na">    [Specification]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">then_translation_should_return_fizz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">Specify</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">game</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">6</span><span class="p">)).</span><span class="n">ShouldEqual</span><span class="p">(</span><span class="s">&quot;Fizz&quot;</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="k">readonly</span> <span class="n">FizzBuzz</span> <span class="n">game</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<h3 id="anderes-framework-andere-sitten">Anderes Framework, andere Sitten</h3>

<p>Die Konsequenz dieser Verbalisierung und Strukturierung ist zunächst einmal eine verbesserte Lesbarkeit. Weiterhin fällt auf, dass es nicht mehr eine einzige "Testklasse" gibt, sondern 4 verschiedene Spezifikationsklassen. Für jede Spielregel eine. Das Stukturierungssystem ist zwar mit klassischen Test-Frameworks auch möglich, wird aber nicht so offensichtlich "verlangt" wie es das BDD-Test-Framework NSpec hier tut.</p>

<p><img alt="" class="alignright" src="/media/images/nspec_structure.png" />
Den Code für die anderen Spielregeln spare ich mir - es sieht dem o.g. Beispiel sehr ähnlich :-). Hat man erst einmal das "sprechendere" schreiben der Tests bzw. Spezifikationen verinnerlicht, geht es mit NSpec auch zügig voran. Schade ist hier die fehlende Integration und Unterstützung für Visual Studio und die üblichen Code-Assistenten. Mir blieb also nichts anderes übrig, als in der Konsole meine Tests auszuführen. Das hat mich beim implementieren schon gebremst.</p>

<h3 id="bewertung">Bewertung</h3>

<ul>
<li><strong>Dauer</strong><br />
    Naja, knapp 15 Minuten für FizzBuzz ist doch schon dreimal länger als mit NUnit. Die mangelnde Integration und die 4 Klassen machen schon etwas aus.</li>
<li><strong>Größe</strong><br />
    Statt wie bei den "Klassikern" 4 Methoden sind es nun 4 Klassen. Schon etwas mehr Code - hält sich aber noch "in Grenzen".</li>
<li><strong>Tooling</strong><br />
    Schlecht. Der Runner ist dabei - das war's.</li>
<li><strong>Usability</strong><br />
    Geht so. Die Assertions mit <code>Specify</code> reichen für die gröbsten Fälle aus.</li>
<li><strong>Support</strong><br />
    Die Entwicklung von NSpec ist eingestellt. Support damit auch. Zukunftssicherheit ist etwas anderes.</li>
</ul>

<h3 id="nspec-for-a-taste-of-bdd">NSpec for a taste of BDD</h3>

<p>NSpec - ein Vorreiter im .NET-Bereich was BDD angeht. Man merkt dem Framework deutlich an, dass es ein "erster Wurf" von der Adaption der BDD-Methodik ist. Nichtsdestotrotz ist as Framework schlank, stabil und gut anwendbar. Es zeigt schon in der Anwendung, wie das "System BDD" die Herangehensweise an die Spezifikation und Verifikation von Code ändert. Man beschäftigt sich automatisch mehr mit Kernaussagen und ist "gezwungen", sich deutlicher und expliziter in der Domänensprache zu artikulieren. NSpec kann diesen systematischen Aspekt transportieren, ist aber mittlerweile auf Grund der mangelnden Integration und des fehlenden Supports nicht mehr für "Real-World"-Projekte ernstzunehmen. Trotzdem hat mir der Ausflug mit NSpec Spaß gemacht. Da bekomme ich glatt Lust &amp; Laune mir schon das nächste Framework anzuschauen. Stay tuned!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Meta-Test: NUnit – All-Time-Hall-Of-Fame-Most-Valuable-Tester</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/meta-test-nunit-all-time-hall-of-fame-most-valuable-tester.html"/>
            <updated>2010-04-15T22:27:01Z</updated>
            <published>2010-04-15T22:27:01Z</published>
            <id>/meta-test-nunit-all-time-hall-of-fame-most-valuable-tester.html</id>
            
            <content type="html"><![CDATA[
                <p>Der Titel ist unmißverständlich: <a href="http://nunit.com/">NUnit, der Godfather der Test-Frameworks für .NET</a>, wird heute von mir ein wenig unter die Lupe genommen. Ich hatte schon den <a href="meta-test-ms-test-visual-studio-on-board-test-framework.html">Redmond-Test-Botschafter MS-Test</a> im Visier. Irgendwie ist es komisch. Obwohl Microsoft mit MS-Test ein umfangreiches Framework für Testing der professionellen Entwicklergemeinde zur Verfügung gestellt hat, hört man unter Gleichgesinnten und Kollegen fast immer die gleiche Story: "Tests? Unit Tests? Klar! NUnit!"</p>

<h3 id="der-pate-unter-den-test-frameworks">Der Pate unter den Test-Frameworks</h3>

<p>So ist es auch nicht weiter erstaunlich, dass man nahezu überall, wo das Wörtchen "Test" fällt, auch "NUnit" zu sehen bekommt. Sei es nun bei den Codeassistenten, bei Build- oder CI-Tools, Addins und sogar weiteren Test-Frameworks. Die <a href="http://www.google.de/search?q=nunit">Verbreitung und Unterstützung von NUnit</a> ist hier einfach nicht zu toppen. Aber auch die vielen Kontakte und Beziehungen des "Paten der Test-Frameworks" helfen nicht viel beim Meta-Test mit dem FizzBuzz-Kata! Auf geht's!</p>

<h3 id="der-code">Der Code</h3>

<p>FizzBuzz ist mit NUnit und den "Standard-TDD-Regeln" schnell implementiert. Referenz hinzufügen, Testklasse inklusive Testmethode aufbauen, noch schnell ein <code>using NUnit.Framework;</code> und die beiden Attribute <code>[TestFixture]</code> (für Klassen) sowie <code>[Test]</code> hinzugefügt - und schon kann man fröhlich testen!</p>

<p><img alt="" class="alignright" src="/media/images/nunit_guirunner1-300x152.png" />
Wer jetzt einen Codeassistenten wie <a href="http://www.jetbrains.com/resharper/">Resharper</a> oder <a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/">Coderush</a> hat, ist praktisch nur ein Klick bzw. Tastenschlag von der Testausführung entfernt. Doch auch ohne "Code-Beschleuniger" gehen NUnit-Tests elegant, z.B. mit dem <a href="http://www.testdriven.net/">TestDriven.NET Addin</a>. Mal von diesen "Integrationstüren" abgesehen, bietet NUnit auch eigenständige Runner für die Konsole sowie auch als Windows-Anwendung an. Passt!</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">KataFizzBuzzNUnit</span> <span class="p">{</span>
<span class="na">  [TestFixture]</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">FizzBuzzTest</span> <span class="p">{</span>
    <span class="k">private</span> <span class="n">FizzBuzz</span> <span class="n">target</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Three_Returns_Fizz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">6</span><span class="p">),</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;Fizz&quot;</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Five_Returns_Buzz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">10</span><span class="p">),</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;Buzz&quot;</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Three_And_Five_Returns_FizzBuzz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">15</span><span class="p">),</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;FizzBuzz&quot;</span><span class="p">));</span>
    <span class="p">}</span>

<span class="na">    [Test]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">No_Multiples_Of_Three_Or_Five_Returns_Number</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">7</span><span class="p">),</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="s">&quot;7&quot;</span><span class="p">));</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Bei der Implementierung fühlt man sich schon fast wie bei MS-Test, jedoch mit einem ganz gewaltigen Unterschied: Die Assert-Klasse im Allgemeinen sowie die <code>Assert.That()</code> Syntax von NUnit sind mächtig - und mächtig hilfreich. Das mit <a href="http://www.nunit.org/index.php?p=constraintModel&amp;r=2.4">NUnit 2.4 eingeführte Constraint Model</a> ist nicht nur besser lesbar, sondern auch intuitiver. Kennt man mal die wichtigsten Constraints, vergisst man sie auch nicht mehr so schnell. Alles in Allem ist TDD mit NUnit eine runde Sache. In weniger als 5 Minuten strahlten meine 4 Tests und ich uns gegenseitig an.</p>

<h3 id="bewertung">Bewertung</h3>

<ul>
<li><strong>Dauer</strong><br />
    Zackig, Knackig, ohne Trärä und Tamtam. FizzBuzz-Regeln in 5 Minuten. Mit Codebeschleuniger geht's sogar noch schneller. Passt.</li>
<li><strong>Größe</strong><br />
    Ähnlich wie bei MS-Test. Eine kompakte Testklasse mit 4 Testmethoden.</li>
<li><strong>Tooling</strong><br />
    MS-Test war schon sehr gut - doch NUnit ist sogar noch besser! Die Verbreitung in der OSS-Gemeinde macht sich hier bemerkbar. Top.</li>
<li><strong>Usability</strong><br />
    Sehr gut. Assert's schön mit Constraints. Wenn man möchte sogar noch beschleunigt über das Erben von AssertionHelper. Angenehm.</li>
<li><strong>Support</strong><br />
    Unmengen an Material im Internet. Open-Source, stabil, große Gemeinde, aktive Entwicklung. Zufrieden.</li>
</ul>

<p>Hmm, es fällt mir schon schwer, etwas "negatives" an NUnit zu finden. Es mag den einen oder anderen stören, wie die Test-Projekt-Struktur von NUnit aufgebaut ist. Auch der GUI-Runner ist jetzt nicht der Augenschmaus schlechthin. Doch die Kernkompetenzen werden von NUnit bravourös gemeistert.</p>

<h3 id="nunit-die-referenz">NUnit - Die Referenz</h3>

<p>Als kleines Fazit kann ich für mich schon mal sagen - NUnit hat die Messlatte ganz schön hochgelegt. Effektiv betrachtet ist NUnit als Test-Framework derzeit die Referenz, mit der sich alle anderen messen lassen müssen. Das ist auch gut so, denn NUnit ist durch die jahrelange, stetige Entwicklung viele Schritte gegangen - manchmal auch einige Schritte voraus. Bleibt die Frage offen: Gibt es noch bessere Test-Frameworks für C# und .NET als NUnit? Abwarten, meine Test-Serie geht in Kürze weiter. Stay tuned!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Meta-Test: MS Test – Visual Studio On Board Test-Framework</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/meta-test-ms-test-visual-studio-on-board-test-framework.html"/>
            <updated>2010-04-14T19:50:41Z</updated>
            <published>2010-04-14T19:50:41Z</published>
            <id>/meta-test-ms-test-visual-studio-on-board-test-framework.html</id>
            
            <content type="html"><![CDATA[
                <p>Heute nehme ich mir den "Platzhirsch" für Unit Testing im Microsoft-Umfeld zur Brust, nämlich das On Board Visual Studio Test-Framework MS-Test. Genau zur richtigen Zeit des <a href="http://www.microsoft.com/visualstudio/en-us/products">Launches von Visual Studio 2010</a> wird hier das dazugeörige Test-Framework unter die Lupe genommen. MS-Test ist seit VS2005 integrierter Bestandteil der professionellen Versionen von Visual Studio - womit der erste Nachteil schon zwischen den Zeilen hindurchschimmert. Leider ist MS-Test bis zum heutigen Tag nicht in den <a href="http://www.microsoft.com/express/Downloads/">Visual Studio Express-Versionen</a> verankert - also quasi nicht "frei verfügbar". Wieso das so ist, ist mir immer noch ein Rätsel.</p>

<h3 id="los-gehts-mit-projekten">Los geht's mit Projekten</h3>

<p>Aber zurück zur Sache. Es muss ja schließlich das mittlerweile mehr als bekannte FizzBuzz-Kata als Fingerübung implementiert werden.</p>

<p><img alt="" class="alignright" src="/media/images/mstest_createproject_vs-300x171.png" />
Da tut sich schon interessantes am Anfang auf: Durch die nahtlose Integration in Visual Studio fügt man keine Referenz auf irgendeine Framework-DLL hinzu, sondern startet die Tests mit der Erstellung eines Testprojektes. Für mich persönlich ein wenig gewöhnungsbedürftig - ich schreibe man Tests und Code für gewöhnlich in der selben Assembly und lagere es nur auf ausdrücklichen Wunsch aus.</p>

<p>Nach Abschluß der durch den (eigentlich um die Arbeit zu beschleunigen konzipierten) Projekt-Wizard durchgeführten Vorbereitungen und der manuellen Abschlussvorbereitungen kann es nun endlich losgehen.</p>

<h3 id="straight-forward-mit-attributen-und-asserts">Straight-Forward mit Attributen und Asserts</h3>

<p>Die Test-Methoden gehen schnell von der Hand, man braucht nur das <code>[TestMethod]</code> Attribut hinzufügen. Die <code>Assert</code>-Klasse deckt alle notwendigen Prüfungen ab, bietet aber im Vergleich zu anderen Frameworks wie z.B. NUnit wesentlich weniger "methodische Expressivität". In unserem Fall brauchen wir nur die <code>AreEqual</code>-Methode. Schon nach dem ersten Test fällt allerdings die lange Testdauer des Testrunners ein wenig negativ auf. Das kann auch wesentlich schneller gehen.</p>

<p>Das Test-Ergebnis sieht relativ unspektakulär aus:</p>

<div class="codehilite"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Microsoft.VisualStudio.TestTools.UnitTesting</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">FizzBuzzMSTest</span> <span class="p">{</span>
<span class="na">  [TestClass]</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">FizzBuzzTest</span> <span class="p">{</span>
<span class="na">    [TestMethod]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Three_Returns_Fizz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">target</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">6</span><span class="p">);</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">AreEqual</span><span class="p">(</span><span class="s">&quot;Fizz&quot;</span><span class="p">,</span> <span class="n">translation</span><span class="p">);</span>
    <span class="p">}</span>

<span class="na">    [TestMethod]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Five_Returns_Buzz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">target</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">10</span><span class="p">);</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">AreEqual</span><span class="p">(</span><span class="s">&quot;Buzz&quot;</span><span class="p">,</span> <span class="n">translation</span><span class="p">);</span>
    <span class="p">}</span>

<span class="na">    [TestMethod]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Multiples_Of_Three_And_Five_Returns_FizzBuzz</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">target</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">15</span><span class="p">);</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">AreEqual</span><span class="p">(</span><span class="s">&quot;FizzBuzz&quot;</span><span class="p">,</span> <span class="n">translation</span><span class="p">);</span>
    <span class="p">}</span>

<span class="na">    [TestMethod]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">No_Multiples_Of_Three_Or_Five_Returns_Number</span><span class="p">()</span> <span class="p">{</span>
      <span class="n">FizzBuzz</span> <span class="n">target</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FizzBuzz</span><span class="p">();</span>
      <span class="kt">string</span> <span class="n">translation</span> <span class="p">=</span> <span class="n">target</span><span class="p">.</span><span class="n">Translate</span><span class="p">(</span><span class="m">7</span><span class="p">);</span>
      <span class="n">Assert</span><span class="p">.</span><span class="n">AreEqual</span><span class="p">(</span><span class="s">&quot;7&quot;</span><span class="p">,</span> <span class="n">translation</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<h3 id="bewertung">Bewertung</h3>

<ul>
<li><strong>Dauer</strong><br />
    Die FizzBuzz-Implementierung ging relativ zügig von der Hand. Ich habe ca. 15 Minuten gebraucht. Der "lahme" Testrunner hat mich etwas gestört. Die meiste Zeit ging für das Projekt, die Referenzverweise und das hin und her zwischen den Projekten drauf.</li>
<li><strong>Größe</strong><br />
    Die Testgröße ist überschaubar. Eine kompakte Testklasse mit 4 Testmethoden. Eine klassische Class-Per-Class Struktur. Das Testprojekt ist isoliert vom Code.</li>
<li><strong>Tooling</strong><br />
    Ein regelrechtes Heimspiel mit der VS-Integration. Auch Code-Assistenten wie Resharper oder Coderush kennen den MSTest. Alles in Allem eine sehr gute Unterstützung.</li>
<li><strong>Usability</strong><br />
    Durch den Projekt-Wizard und die entsprechende Dokumentation komfortabel für allgemeines Testing. Speziell für TDD/BDD allerdings etwas hakelig. Immer gleich die Test/Code-Separation. Die Asserts sind sicherlich ausreichend.</li>
<li><strong>Support</strong><br />
    Was soll man hier schreiben, außer MS? Das Framework wird direkt von Microsoft mit Visual Studio ausgeliefert. Die Dokumentation ist gut, Online-Material ist sicherlich vorhanden. MSTest ist in der Community (vor allem für Open Source oder kleinere Projekte) nicht so weit verbreitet wie andere Frameworks.</li>
</ul>

<p>MS-Test ist ein solides Framework, mit dem sich sicherlich auch gut TDD betreiben lässt. Man merkt dem Featureset an, dass es nicht nur für Unit-Testing ausgelegt ist. Der integrierte Runner ist schick, das Reporting ein Highlight. Ich sollte nicht unerwähnt lassen, dass vor Allem die Kombination TFS/MSTest ein sehr gutes Reporting/Monitoring-Werkzeug darstellt.</p>

<p>Zu den Tests selbst gibt das Framework wenig Hilfestellung bzw. Guidance zur Strukturierung und Anwendung der Tests. So wird wohl am meisten die Class-Per-Class Struktur angewendet werden, mit den üblichen TDD Best Practices.</p>

<h3 id="ms-test-leider-nur-fur-profis">MS-Test leider nur für "Profis"</h3>

<p>Ein absolutes Manko ist die nicht-freie Verfügbarkeit des Frameworks und damit auch das Fehlen des Features in der Express-Edition. </p>

<p><img alt="" class="alignleft" src="/media/images/mstest_runner_vs-300x136.png" />
Einfach mal Tests/Code schreiben und veröffentlichen ist somit unmöglich. Für bekennende TDDler ein No-Go. Mit den 15 Minuten Fizzbuzz ist die Geschwindigkeit der Umsetzung in Ordnung - wobei ich zugegebenermaßen Fizzbuzz auch schon wesentlich zügiger implementiert habe. Das bringt mich dann auch zum nächsten Test-Framework unter meiner Meta-Test-Lupe... stay tuned!</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Ministerium für Scrum</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/ministerium-fur-scrum.html"/>
            <updated>2010-03-23T11:43:30Z</updated>
            <published>2010-03-23T11:43:30Z</published>
            <id>/ministerium-fur-scrum.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist unfassbar. In letzter Zeit ertappe ich mich ungewohnt oft dabei, wie ich vor dem Bildschirm die Hände über den Kopf schlage, seufze und mir selbst zuflüstere "Ich verstehe das nicht". So geschehen gestern Abend, als ich den <a href="http://borisgloger.com/2010/03/22/scrum-wurden-agiles-schwachen-geerbt-eine-antwort/">offenen Brief von Boris Gloger zu den 7 Thesen der Scrum/Agile-Schwachpunkte von Uncle Bob</a> gelesen habe. Beim Lesen dieses "offenen Briefes" konnte ich meinen Augen kaum trauen. Die Argumente und Antworten von Boris Gloger sind für mich einfach unglaublich. Nicht nur, <a href="funf-schwachpunkte-von-scrum.html">weil ich die Kritikpunkte von Uncle Bob größtenteils verstehe</a>. Ich möchte meine Auffassung und Wahrnemung zu diesem Artikel hier widergeben.</p>

<h3 id="scrum-kennt-keine-technischen-verfahren">Scrum kennt keine technischen Verfahren</h3>

<p><em>Boris Gloger schreibt:</em> </p>

<blockquote>
<p>Scrums primärer Zweck war und ist, Teams, Abteilungen und Firmen zu unterstützen, mit den Prinzipien von eigenständigen Arbeitsteams ihre Aufgaben zu bewältigen. Es war niemals geplant, Entwicklern beizubringen, wie man entwickelt. Wenn man Scrum implementiert, dann erkennt man schnell, dass die Entwickler nicht mit der Arbeitsweise von Agile vertraut sind.</p>
</blockquote>

<p>Ich habe Scrum als <a href="scrum-ein-agiles-software-management-framework.html">agiles Software-Management-Framework kennengelernt</a>. Spezifisch für die Domäne der Software-Entwicklung. Scrum ist kein Selbstorganisatios-Framework. Nicht umsonst ist Scrum ein Vertreter der agilen Software-Entwicklungs-Verfahren, und nicht ein "Autonomie-Team-Modell". Insofern kann man einem agilen Software-Management-Verfahren schon abverlangen, die Software-Entwicklung als Domäne zu unterstützen und zu fördern.</p>

<h3 id="scrum-hat-zu-lange-sprints">Scrum hat zu lange Sprints</h3>

<p><em>Boris Gloger weiterhin:</em> </p>

<blockquote>
<p>Es wurde NIEMALS ausdrücklich gesagt, dass ein Sprint 30 Tage lang sein muss, sondern es war nur als Vorschlag gemeint. Ken und Jeff machten vor 15 Jahren mit den 30 Tagen große Fortschritte. Nicht mehr und nicht weniger. Sprints sollten so lange sein, wie es das Team und der PO für nötig halten und 2 Wochen werden oftmals vorgeschlagen. Allerdings verkompliziert sich dadurch die Sache für die meisten Entwickler.</p>
</blockquote>

<p>Das schöne an agilen Verfahren ist das <a href="http://c2.com/cgi/wiki?InspectAndAdapt">Inspect &amp; Adapt</a>. Wenn etwas nicht mehr zeitgemäß ist, oder vielleicht nicht in den Kontext hineinpasst, dann wird es eben verändert. So auch mit der Sprintdauer. Für mich ist es offensichtlich, dass <a href="scrum-die-bessere-sprintdauer.html">kürzere Sprints deutliche Vorteile bieten</a> - auch bzw. gerade für Entwickler. Eine "Verkomplizierung" sehe ich da nicht.</p>

<h3 id="scrummaster-aka-projektmanager">ScrumMaster aka Projektmanager</h3>

<p><em>Boris Gloger:</em> </p>

<blockquote>
<p>"Der ScrumMaster ist eine neue Führungsrolle. Ken hat dies vor Jahren geschrieben und für die ersten Scrum Experten, wie mich, war dies klar verständlich. Jedoch wollte dies die gesamte Agile Gemeinschaft nicht anerkennen, da es ihrem Verständnis nach nicht nötig war, dass Teams eine Führungskraft benötigen und Scrum eine neue Führungsrolle einnimmt. Ein ScrumMaster ist weder ein PM, noch ein Master des Teams. Er ist der Master innerhalb des Bezugssystems des Prozesses. Er ist der Leiter des Teams und der PO und es ist seine Aufgabe, die Organisation mittels Scrum zu verändern und Scrum als ein Paket von Tools und Grundwerten einzusetzen.</p>
</blockquote>

<p>Mit Nichten. Ich habe in meinen bescheidenen paar Jahren, in denen ich mich Scrum auseinandergesetzt habe und immer noch intensiv beschäftige den ScrumMaster niemals als Führungsrolle verstanden. Ja, es gibt das Prinzip des <a href="http://en.wikipedia.org/wiki/Servant_leadership">Servant Leaderships</a> für einen ScrumMaster. Ja, der ScrumMaster ist der Hüter des Scrum-Grals. Ja, der ScrumMaster ist ein <a href="http://de.wikipedia.org/wiki/Change_Agent">Change Agent</a>. Aber Nein, der ScrumMaster ist kein Team-Leiter. Nein, es gibt keine Position "ScrumMaster" in einem Organigramm, sondern die Rolle ScrumMaster. Nein, der ScrumMaster ist kein Entwicklungs-Alpha-Tier.</p>

<h3 id="scrummaster-ist-kein-leader">ScrumMaster ist kein Leader</h3>

<p><em>Boris Gloger dazu:</em> </p>

<blockquote>
<p>Ein Entwickler hat nicht die Fähigkeiten ein Team zu leiten, eine Organisation zu ändern und sein Team vor der herkömmlichen Organisationskultur zu beschützen. In dieser Hinsicht wird die Rolle des ScrumMasters großteils missverstanden. Er ist ein Moderator, aber das ist Teil seiner Führungsrolle als ScrumMaster. Ein ScrumMaster zu sein, das bedeutet, sich ein Set and Fähigkeiten anzueignen, die erlernt und geübt werden müssen. Dies kann 10000 Stunden in Anspruch nehmen, bevor man davon ausgehen kann, dass man diese Disziplin auch beherrscht.</p>
</blockquote>

<p>Mit Verlaub, Herr Gloger, das geht zu weit. Es tut mir leid Ihnen entgegnen zu müssen, dass Ihre Auffassung für mich nichts anderes als protektionistischer <a href="http://de.wikipedia.org/wiki/Mumpitz">Mumpitz</a> ist! Sie haben gerade die Entwickler, also mich, meine Kollegen und meine gesamte Berufszunft gekränkt. Was fällt Ihnen ein, sich so herablassend über einen Entwickler und seine Fähigkeiten zu äußern? Zugegeben, nicht jeder Entwickler hat das Zeug zum Teamleiter. Nicht jeder Entwickler kann sich eloquent und zielsicher vor Führungsriege oder Investoren artikulieren.</p>

<p>Doch das heisst noch lange nicht, dass alle Entwickler per se nicht geeignet sind, die Rolle des ScrumMasters zu übernehmen. Sie tun mit Ihrer Aussage den vielen Entwicklern da draussen Unrecht, die tagtäglich lernen, die versuchen ihre Entwicklung und ihre Organisation zu verbessern, die ihre Teams und Kollegen leiten. Ja genau, die Entwickler, die sogar auf Kurse von ScrumCoaches wie Ihnen gehen, um das System Scrum sowie die Rolle ScrumMaster zu verstehen und sich dafür zu zertifizieren.</p>

<p>Ihr Verständnis des ScrumMasters als "allwissende, allmächtige" Instanz kann ich nicht teilen. Sie beschreiben den ScrumMaster ja geradezu als den Robin Hood der Scrum-Gemeinde, der sich für die armen bekehrten Entwickler einsetzt und sich mutig und stark vor die etablierte, elitäre Wasserfall-Adelschaft stellt. Nein, Herr Gloger. Sowohl die klassische als auch moderne Software-Entwicklung ist erfolgreich mit Teamgeist, dem verständnisvollen &amp; respektvollen Umgang miteinander und dem gemeinsamen Verständnis für das Ziel. Allesamt Eigenschaften, die ich in Ihrer Aussage kläglich vermisse.</p>

<h3 id="mangelhafte-struktur-des-backlogs">Mangelhafte Struktur des Backlogs</h3>

<p><em>Boris Gloger schreibt:</em></p>

<blockquote>
<p>Mike Cohn hat uns das beigebracht und ich habe es in meinem Buch beschrieben. Scrum war nicht als ein Set von Tools geplant, das alles beschreiben kann. Der Backlog ist sehr unternehmens-/team-/produktspezifisch und Scrum kann in dieser Hinsicht keine Anleitungen liefern. Nur Best Practises können das.</p>
</blockquote>

<p>Richtig. Zumindest was die Strukturierung des Backlogs angeht, bin ich der Meinung dass dies sehr stark von Projekt zu Projekt variieren kann. Genau hier ist es gut, eine allgemeine, flexible Aussage zu liefern, die da heißt: Es muss ein Backlog geben. Wie das dann aussieht, bleibt im Ermessen der Projektbeteiligten, spezifischer des PO's und des Teams. Es ist etwas ganz anderes, ein Backlog für ein Webportal aufzubauen als ein Backlog für ein kritisches Leitsystem. Best Practices können da einen guten Leitfaden darstellen.</p>

<h3 id="scrum-skaliert-nicht">Scrum skaliert nicht</h3>

<p><em>Boris Gloger:</em></p>

<blockquote>
<p>Ich kann euch versichern, dass Scrum auch auf Ebenen oberhalb eines Teams erwiesenermaßen angewendet werden kann. Ich habe dies hunderte Male erfolgreich durchgeführt. Scrum Anwender wie ich haben Möglichkeiten entwickelt, Scrum in Organisationen einzusetzen, genauso wie auf Unternehmensebene. Gut, es wurde nicht in Ken's erstem Buch beschrieben und viele Scrum Consultants haben keine Ahnung, wie das gemacht werden kann. Wenn ihr euch allerdings an Leute wendet, die Scrum seit 2003 einsetzen und Scrum auf Unternehmensebene angewandt haben, dann könnt ihr erfahren, wie das geht. Zu diesen Leuten gehören: Bas Voode, Mike Cohn, Stacia Broderick, Boris Gloger, Andreas Schliep, und viele mehr. Wie gesagt, man kann dazu nichts in den frühen Büchern finden, sondern in den Köpfen der Leute, die das bereits mehrmals gemacht haben.</p>
</blockquote>

<p>Eine für mein Dafürhalten argumentativ etwas schwachbrüstige Aussage. Mit irgendwelchen Mitteln, ein paar "Scrum Of Scrums", einem Company Backlog und ein paar Chief Product Owners ist die Skalierungsaufgabe "Scrum" noch lange nicht gelöst. Wenn es funktioniert, ist es gut. Doch die Aussage bezieht sich auf Scrum als Rahmen- und Richtwerk. Dort ist von Skalierung nicht die Rede. Man muss auch mal zugeben können das Scrum einfach nicht für größere Konstrukte "designed" wurde.</p>

<h3 id="embrace-change">Embrace Change!</h3>

<p>Alles in Allem interpretiere ich den offenen Brief mit kritischen Augen. Irgendwie kommt es mir so vor, als ob sich in dem Brief das "Ministerium für Scrum" gemeldet hat und ein paar Statements in den Raum wirft, um Scrum als System sowie auch das Ministerium selbst zu schützen. Scrum ist unbestritten ein hilfreiches agiles Management-Werkzeug. Scrum hat in der agilen Bewegung auch zweifelsohne große Beiträge geleistet. Dennoch ist dies kein Grund, konstruktiver Kritik mit derartig pauschalisierten Floskeln zu entgegnen.</p>

<p>Ich glaube an die Vorteile von Scrum, erkenne aber auch Gefahren und Schwachstellen. Alles hat seine Vor- und Nachteile. Wichtig ist für mich der "Agile Spirit", der im agilen Manifest und vielen agilen Best Practices verankert ist. Inspect &amp; Adapt, Embrace Change, People over Processes, Collaborate. All das sind die essentiellen Werte agiler Software-Entwicklung - und auch von Scrum.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">#BDD #TheBetterWayOfUnitTesting</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/bdd-thebetterwayofunittesting.html"/>
            <updated>2010-03-20T17:52:50Z</updated>
            <published>2010-03-20T17:52:50Z</published>
            <id>/bdd-thebetterwayofunittesting.html</id>
            
            <content type="html"><![CDATA[
                <p>Der Titel sagt alles, oder? Ich möchte den <a href="http://twitter.com/SimonHoh/status/10708643753">Tweet von @SimonHoh</a> zum Anlaß nehmen, den <a href="http://de.wiktionary.org/wiki/Publikumsjoker">Publikumsjoker</a> zu Rate zu ziehen. Um den Joker so gut wie möglich auszuschöpfen, werde ich vorab aus strategischen Gründen keine Äusserungen dazu abgeben ;-).</p>

<p>Um beim Bild der <a href="http://de.wikipedia.org/wiki/Wer_wird_Million%C3%A4r%3F">Rateshow</a> zu bleiben, muss es natürlich auch eine Frage und vier Auswahlantworten geben.</p>

<p><strong>Was verstehen Sie unter BDD ?</strong></p>

<ul>
<li><strong>A:</strong> BDD ist TDD, nur besser</li>
<li><strong>B:</strong> BDD ist etwas anderes als TDD</li>
<li><strong>C:</strong> BDD ist TDD, und noch viel mehr</li>
<li><strong>D:</strong> BDD ist der Bundesverband Deutscher Detektive</li>
</ul>

<p>Ich bin gespannt auf die Bewertung des Publikums (gerne auch mit Begründung). <strong>Deine Meinung zählt!</strong> Ach ja, Frei nach <a href="http://www.youtube.com/watch?v=C3vMRQCcdT0">Sigi Schwarz</a> kann natürlich auch jede Antwort genannt werden, die nicht in der Auswahl genannt wurde (also 'was zum Naschen!)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Re: Was hast Du vor 10 Jahren programmiert?</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/re-was-hast-du-vor-10-jahren-programmiert.html"/>
            <updated>2010-03-15T21:41:05Z</updated>
            <published>2010-03-15T21:41:05Z</published>
            <id>/re-was-hast-du-vor-10-jahren-programmiert.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist zwar schon ein wenig her, als <a href="http://blogs.msdn.com/dparys/archive/2010/03/05/was-hast-du-vor-ber-zehn-jahren-programmiert.aspx">Dariusz</a>, <a href="http://blog.alexonasp.net/post/2010/03/05/Was-hast-Du-vor-uber-zehn-Jahren-programmiert.aspx">Alex</a>, <a href="http://blog.thomasbandt.de/39/2324/de/blog/re-was-hast-du-vor-ueber-zehn-jahren-programmiert.html">Thomas</a> und <a href="http://thomas.mentzel.name/2010/03/05/was-hast-du-vor-uber-zehn-jahren-programmiert/">Thomas</a> sich selbst diese Frage gestellt und beantwortet haben. Dennoch ist es für mich Anlaß genug, auch mal in den Archiven nachzukramen und zu schauen, was ich denn so vor 10 Jahren an Software "verbrochen" habe.</p>

<p>Nun, vor genau 10 Jahren (Frühjahr 2000) habe ich erstaunlich vielschichtiges getan. Da bin ich selbst schon überrascht. Ich habe z.B. einen HTML-Editor (versucht) in VB6 zu programmieren. Und habe ich einen PDF-Scanner in C geschrieben (um Bilder bzw. 2D-Polygone aus dem PDF zu "extrahieren"). Doch beides möchte ich hier nicht vorstellen, sondern ein ganz anderes Programm, mit vorerst letztem CVS-Commit am 15.03.2000: <strong>ScanDirNavian</strong>.</p>

<p>ScanDirNavian ist ein kleines Ameisenprogramm in VB6. Es durchforstet einen gesamten Verzeichnisbaum auf bestimmte Dateien (mit bestimmten Patterns im Dateinamen) und listet diese in einer Logdatei auf. Als Zusatzfeature kann es nicht nur die Dateiinformationen loggen, sondern auch einfache Transformationsaufgaben erledigen. Z.B. "Nehme die ersten 3 Zeichen des Dateinamens, falls es eine Zahl ist, stelle Sie an das Ende des Dateinamens."</p>

<p><img alt="scandirnavian" src="/media/images/scandirnavian.png" /></p>

<p>Ich bin mir nicht mehr sicher, welchen Zweck ich damit eigentlich bedient habe. Ich kann mich vage daran erinnern, dass ich tausende von Logdateien (von Linux, Raytracern und diversen anderen Programmen) irgendwie umstrukturieren bzw. in andere Verzeichnisstrukturen überführen wollte. Ein Codeschnipsel gefällig? Bitte gerne:</p>

<div class="codehilite"><pre><span class="n">Private</span> <span class="n">Sub</span> <span class="n">CommandScan_Click</span><span class="p">()</span>
    <span class="n">Dim</span> <span class="n">StartDirectory</span> <span class="n">As</span> <span class="n">String</span>
    <span class="n">Dim</span> <span class="n">ScanTimeString</span> <span class="n">As</span> <span class="n">String</span>
    <span class="n">AllFileCounter</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">AllScanTime</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="n">StartDirectory</span> <span class="o">=</span> <span class="n">DirSource</span><span class="o">.</span><span class="n">Path</span>
    <span class="n">LabelInfo</span><span class="o">.</span><span class="n">Caption</span> <span class="o">=</span> <span class="s">&quot;Scanning Directory&quot;</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">_</span>
        <span class="n">StartDirectory</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">_</span>
        <span class="s">&quot;Please wait until scan is complete.&quot;</span>
    <span class="n">TabLog</span><span class="o">.</span><span class="n">Tabs</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">Selected</span> <span class="o">=</span> <span class="n">True</span>
    <span class="n">FormMain</span><span class="o">.</span><span class="n">MousePointer</span> <span class="o">=</span> <span class="mi">11</span>
    <span class="n">TimerScanDuration</span><span class="o">.</span><span class="n">Enabled</span> <span class="o">=</span> <span class="n">True</span>

    <span class="n">DoEvents</span>

    <span class="n">If</span> <span class="n">InStr</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">LogTypeCommand</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="n">Then</span>
        <span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span> <span class="o">=</span> <span class="n">_</span>
            <span class="n">Left</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">_</span>
            <span class="n">InStr</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">LogTypeCommand</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">_</span>
            <span class="n">DirSource</span><span class="o">.</span><span class="n">Path</span> <span class="o">&amp;</span> <span class="n">_</span>
            <span class="n">Right</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">Len</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">)</span> <span class="o">-</span> <span class="n">_</span>
            <span class="n">InStr</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">LogTypeCommand</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">-</span> <span class="n">_</span>
            <span class="n">Len</span><span class="p">(</span><span class="n">LogTypeCommand</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
    <span class="n">End</span> <span class="n">If</span>
    <span class="n">If</span> <span class="n">InStr</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">LogTypeCommandShortCut</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="n">Then</span>
        <span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span> <span class="o">=</span> <span class="n">_</span>
            <span class="n">Left</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span>
            <span class="n">InStr</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">LogTypeCommandShortCut</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">_</span>
            <span class="n">DirSource</span><span class="o">.</span><span class="n">Path</span> <span class="o">&amp;</span> <span class="n">_</span>
            <span class="n">Right</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">Len</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">)</span> <span class="o">-</span> <span class="n">_</span>
            <span class="n">InStr</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">LogTypeCommandShortCut</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">-</span> <span class="n">_</span>
            <span class="n">Len</span><span class="p">(</span><span class="n">LogTypeCommandShortCut</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
    <span class="n">End</span> <span class="n">If</span>

    <span class="n">If</span> <span class="n">Len</span><span class="p">(</span><span class="n">TextLog</span><span class="o">.</span><span class="n">Text</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">And</span> <span class="n">Len</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="n">Then</span> <span class="n">_</span>
        <span class="n">TextLog</span><span class="o">.</span><span class="n">Text</span> <span class="o">=</span> <span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">_</span>
        <span class="n">String</span><span class="p">(</span><span class="n">Len</span><span class="p">(</span><span class="n">TextHeader</span><span class="o">.</span><span class="n">Text</span><span class="p">),</span> <span class="s">&quot;-&quot;</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span>

    <span class="n">ScanDirectory</span> <span class="n">DirSource</span><span class="o">.</span><span class="n">Path</span><span class="p">,</span> <span class="n">TextOutput</span><span class="o">.</span><span class="n">Text</span>
    <span class="n">DirSource</span><span class="o">.</span><span class="n">Path</span> <span class="o">=</span> <span class="n">StartDirectory</span>
    <span class="n">TimerScanDuration</span><span class="o">.</span><span class="n">Enabled</span> <span class="o">=</span> <span class="n">False</span>

    <span class="n">FormMain</span><span class="o">.</span><span class="n">MousePointer</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">ScanTimeString</span> <span class="o">=</span> <span class="n">Trim</span><span class="p">(</span><span class="n">Str</span><span class="p">(</span><span class="n">AllScanTime</span> <span class="o">/</span> <span class="mi">10</span><span class="p">))</span>
    <span class="n">If</span> <span class="n">Left</span><span class="p">(</span><span class="n">ScanTimeString</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;.&quot;</span> <span class="n">Then</span> <span class="n">ScanTimeString</span> <span class="o">=</span> <span class="s">&quot;0&quot;</span> <span class="o">&amp;</span> <span class="n">ScanTimeString</span>
    <span class="n">LabelInfo</span><span class="o">.</span><span class="n">Caption</span> <span class="o">=</span> <span class="s">&quot;Scan complete !&quot;</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="n">_</span>
        <span class="s">&quot;Successfully passed through &quot;</span> <span class="o">&amp;</span> <span class="n">Trim</span><span class="p">(</span><span class="n">Str</span><span class="p">(</span><span class="n">AllFileCounter</span><span class="p">))</span> <span class="o">&amp;</span> <span class="s">&quot; files.&quot;</span> <span class="o">&amp;</span> <span class="n">_</span>
        <span class="n">vbCrLf</span> <span class="o">&amp;</span> <span class="s">&quot;Elapsed time: &quot;</span> <span class="o">&amp;</span> <span class="n">ScanTimeString</span> <span class="o">&amp;</span> <span class="s">&quot; seconds.&quot;</span>
<span class="n">End</span> <span class="n">Sub</span>
</pre></div>

<p>Oh je, da habe ich mich nicht gerade mit Ruhm bekleckert :-) Funktioniert hat es - Ja. Aber lange zufrieden war ich auch nicht damit. Immerhin hat es seinen Zweck erfüllt.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Scrum: Die bessere Sprintdauer</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/scrum-die-bessere-sprintdauer.html"/>
            <updated>2010-03-04T09:35:57Z</updated>
            <published>2010-03-04T09:35:57Z</published>
            <id>/scrum-die-bessere-sprintdauer.html</id>
            
            <content type="html"><![CDATA[
                <p>Vor einiger Zeit hatte ich über die <a href="funf-schwachpunkte-von-scrum.html">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 "Scrum-Schwachstellenthema" 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 &amp; 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 id="daily-scrum-weekly-sprint">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 &amp; Adapt. Jede Woche gibt es eine Retrospektive, das wichtigste agile Gremium in Scrum. Jede Woche eine Retrospektive zu haben ist ein wenig wie "und wöchentlich grüßt das Scrumeltier" - es kommen Anfangs immer wieder die gleichen Themen ins Gespräch. Das liegt vor Allem daran, dass es viel einfacher ist, wöchentlich "inspect" zu betreiben, als effektiv "adapt" durchzuführen. Doch genau das ist das schöne am schnellen, wöchentlichen Sprint-Puls. Es wird die Agilität förmlich "antrainiert". Das Team lernt wesentlich schneller, wirklich zu adaptieren, anstatt es irgendwie auf die lange Bank zu schieben.</p>

<h3 id="accelerate-fur-eine-gute-velocity">"Accelerate" für eine gute "Velocity"</h3>

<p>Ein nicht ganz auf den ersten Blick erkennbarer Vorteil der Wochensprints ist der schnelle "Ramp-up" 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 "Sprint" verdient. Denn wöchentliche Iterationen "fühlen" 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 "Wochentakt". Viele denken, planen und organisieren in Wochenzyklen. Das kommt auch dem wöchentlichen Scrumsprint zu Gute. Teams mit Wochensprints kommen mit dem Wochentakt "einfach besser zurecht" - 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 id="kurz-und-knackig">Kurz und Knackig</h3>

<p>Bei all den Vorteilen, die eine kurze, nach meinem Ermessen am Besten wöchentliche Sprintdauer hat - es gibt auch hier wieder einige Dinge, die man vor der Einführung oder beim "Sprinten" 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 "Scrum-Meetings" 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's.</p>

<p>Montag ist vormittags "Tabu" - denn genau dann befindet man sich in der "Twilight Zone". Ende des letzten Sprints oder Anfang des nächsten Sprints - schon durch die Planung oder noch im Review - noch Montagsmüde oder schon im Tatendrang - 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 &amp; Knackig - das ist die bessere Sprintdauer in Scrum!</strong>
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 &amp; Knackig ist besser als Lang &amp; Weilig. Was denken Sie? Ihre Meinung ist gefragt!</p>

<div id="see">
  <h6>
Weiterführende Artikel</h6>
                  <ul class="">
  <li><a href="/funf-schwachpunkte-von-scrum.html">Fünf Schwachpunkte von Scrum
    <span class="order">08 February 2010</span>
  </a></li>
  <li><a href="/scrum-der-bessere-scrum-master.html">Scrum: Der bessere Scrum Master
    <span class="order">16 June 2010</span>
  </a></li>
  <li><a href="/scrum-die-bessere-sprintplanung.html">Scrum: Die bessere Sprintplanung
    <span class="order">11 February 2013</span>
  </a></li>
</ul>
</div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">.NET Coding Dojo Massiv</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/net-coding-dojo-massiv.html"/>
            <updated>2010-03-02T14:45:18Z</updated>
            <published>2010-03-02T14:45:18Z</published>
            <id>/net-coding-dojo-massiv.html</id>
            
            <content type="html"><![CDATA[
                <p>Massiv! Das ist das treffende Wort, die neuesten Nachrichten über das .NET Coding Dojo und die Bewegung im Allgemeinen zu beschreiben.</p>

<h3 id="massiv-sportlich">Massiv Sportlich</h3>

<p>Schon das letzte Münchener .NET Coding Dojo im Februar war wieder eine spannende und anregend erkenntnisreiche Veranstaltung. Das Lösen des <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataTennis">KataTennis</a> hat sich als eine wunderbare Übung für den überlegten, soz. "wohl bedachten" einsatz von Test-Driven-Design und -Development herausgestellt.</p>

<p>TDD kann viel im Design und in der Implementierung bewirken. Es fördert lose Kopplung, gestaltet aktiv die Trennung der Verantwortlichkeiten mit und unterstützt das minimalistische "<a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself">DRY</a>"-Denken. Es gibt auch frequentiven Feedback in der Entwicklung. Sei es nun, dass man sich auf dem grünen Pfad bestätigt fühlt - oder aber frühzeitig "riecht", das da etwas nicht ganz ausgereift ist. In jedem Fall war KataTennis im Februar-Dojo eine schöne Aufgabe, die all diese Faktoren präsentierte. Mehr noch, das Dojo zeigte, dass es sich lohnt, die Analyse der Problemdomäne nicht außer Acht zu lassen.</p>

<h3 id="massiv-interessant">Massiv Interessant</h3>

<p>Doch das war noch lange nicht alles, was sich zum Thema .NET Coding Dojo im Februar getan hat! Vorreiter war schon im Januar die <a href="http://www.dotnet-ka.de/2010_01_21/2010_01_21.html">.NET User Group Karlsruhe mit einem .NET Coding Dojo der "Schwarzgurt-Klasse"</a>. Es wurde <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataPotter">KataPotter</a> angegriffen. Die DNUG hat gespürt, dass ein Coding Dojo schweißtreibend ist - aber auch spannend und fesselnd. Denn schon einen Monat später gab es in professionell agiler Manier eine <a href="http://blog.alexonasp.net/post/2010/02/17/NET-Usergroup-Karlsruhe-Coding-Dojo-Retrospektive.aspx">Retrospektive zum Coding Dojo</a>. Die DNUG Karlsruhe bleibt also am Ball!</p>

<p>Auch ich konnte noch einen kleinen Beitrag zur Coding Dojo Idee leisten, in dem ich auf der diesjährigen <a href="http://www.vsone.de/">VSOne</a> das Format und die Ziele des .NET Coding Dojo vorgestellt habe. Doch bei der Vorstellung alleine bleibt es bei Dojojanern natürlich nicht - in der Session wurde demonstrativ ein "Mini-Dojo" mit <a href="http://www.codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">KataFizzBuzz</a> gestartet. Es war eine wunderbare Erfahrung, wie interessiert und motiviert unvoreingenommene Teilnehmer im Coding Dojo mitmachen. Danke für das zahlreiche Interesse!</p>

<p>Im Übrigen möchte ich dabei noch betonen, dass die diesjährige VSOne eine wirklich gelungene und qualitative Veranstaltung gewesen ist.</p>

<p>Last but not least: Die .NET Coding Dojo-Idee ist grenzübergreifend! Angespornt und motiviert durch die Events in Deutschland gab es im Februar auch ein eigenständig von Andreas organisiertes <a href="http://www.andreas-schlapsi.at/2010/02/11/net-coding-dojo-wien/">.NET Coding Dojo in Wien</a>! Es wird also auch schon in Österreich kräftig trainiert. Kurzum: Massiv Interessant!</p>

<h3 id="massiv-im-marz">Massiv Im März</h3>

<p>Natürlich steht auch schon das nächste <a href="https://www.xing.com/events/net-coding-dojo-massiv-marz-475994">Münchener .NET Coding Dojo</a> vor der Tür. Am 10. März erwartet die Teilnehmer ein Coding Dojo der Extra-Klasse. Im März-Dojo werden die gebündelten Kräfte und Kompetenzen von .NET Enthusiasten, Software-Entwicklern &amp; TDD-Interessierten gebraucht. Soviel sei schon vorab verraten: dieser Coding Dojo wird eine Herausforderung!</p>

<p>Im "Massiv-Im-März" Coding Dojo werden wir drei spannende Code Kata's im Angebot haben, die wieder besondere Techniken sowie Praktiken fordern und fördern. Es geht dabei um Analyse, Design und Implementierung gangbarer, nachhaltiger, effektiver Lösungen zu einem kleinen Programmierproblem. Kurzum: Gemeinsam lernen &amp; lehren von profesioneller Software-Entwicklung mit TDD, CCD und Design Patterns.</p>

<p>Was heißt das? Ganz einfach - auf geht's zum Dojo! Anmeldung per <a href="https://www.xing.com/events/net-coding-dojo-massiv-marz-475994">Xing Event</a> oder <a href="http://www.facebook.com/#!/event.php?eid=336479659946">Facebook Event</a>!</p>

<p>Übrigens, ein schöner Zufall will es, dass das Münchener .NET Coding Dojo parallel zu den Tagen des <a href="http://www.dotnetpro-powerday.de/">dotnetpro.powerday</a> stattfindet. Wer es noch nicht weiß, in den dotnetpro.powerday zeigen <a href="http://ralfw.blogspot.com/">Ralf</a> &amp; <a href="http://www.lieser-online.de/blog/">Stefan</a> auf Ihre gewohnt einprägsame Weise, welche Werte, Prinzipien &amp; Praktiken es bedarf, um nachhaltigen, wartbaren und erweiterbaren - also <a href="http://www.cleancodedeveloper.de/">Clean Code zu schreiben</a>. Die frisch gewonnen Erkenntnisse kann man dann natürlich bei uns im Coding Dojo einsetzen! :-)</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Fünf Schwachpunkte von Scrum</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/funf-schwachpunkte-von-scrum.html"/>
            <updated>2010-02-08T00:12:23Z</updated>
            <published>2010-02-08T00:12:23Z</published>
            <id>/funf-schwachpunkte-von-scrum.html</id>
            
            <content type="html"><![CDATA[
                <p>Die fünf Schwachpunkte von Scrum, in klaren Worten.</p>

<ol>
<li>Rahmenwerk, aber kein Werkzeug</li>
<li>Die Sprintdauer</li>
<li>Die Planung &amp; Das Design</li>
<li>Der Scrum Master</li>
<li>Die Skalierung</li>
</ol>

<p>Scrum ist ein wunderbares <a href="scrum-erstkontakt-was-ist-scrum.html">agiles Management-Framework</a>. Ich mag Scrum. Um ehrlich zu sein ist Scrum als "Agile für Einsteiger" ein genauso geeignetes methodisches Rahmenwerk wie für den enthusiastischen Agilisten. Ich habe mittlerweile einige Jahre Scrum-Erfahrung und darf mich ja selbst als "Zertifizierter Scrum Master" bezeichnen. Trotzdem - oder gerade aus dieser Erfahrung heraus - ist Kritik an Scrum meines Erachtens angebracht. Die kritischen Stimmen zu Scrum werden immer deutlicher, allen voran die erst kürzlich von <a href="http://groups.yahoo.com/group/scrumdevelopment/message/44851">UncleBob aufgestellten 7 Thesen der Mängel von agiler Software-Entwicklung mit XP &amp; Scrum</a>. In diesem Artikel möchte ich dazu meine Sicht der Dinge wiedergeben.</p>

<p>Scrum ist nicht Perfekt. Ganz im Gegenteil. Mit steigender Erfahrung kann man z.T. gravierende Schwachpunkte in der Methodik feststellen. Das soll jetzt nicht heißen, daß Scrum für ein agiles Projekt zu schlecht oder ungeeignet wäre - Nein. Vielmehr sollte man bei der Anwendung von Scrum ein besonderes Augenmerk auf die Schwachpunkte der Methode legen - um so im Ergebnis weniger Stolpersteine auf dem Weg zum Projektziel zu haben.</p>

<h3 id="rahmenwerk-aber-kein-werkzeug">Rahmenwerk, aber kein Werkzeug</h3>

<p>Scrum ist ein Framework. Nicht für Software-Entwicklungs-Methoden, sondern für Projekt-Management. Doch als Framework für die Projekt-Management-Methodik ist Scrum in vielen Teilen zu unspezifisch. Natürlich ist Scrum gerade durch die wenigen Regeln &amp; Rollen leicht verständlich und relativ zügig einsetzbar. Auf der anderen Seite jedoch ist die Eigenschaft von Scrum, eine "leichtgewichtige" Methodik des agilen Projektmanagements zu sein eine schwere Bürde - sei es inhaltlich oder praxisbezogen. Beispiele gefällig?</p>

<ul>
<li><em>Scrum verlangt Dailies am Scrum Board</em>  <br />
    Scrum sagt aber nicht wie dieses Board denn verwendet werden soll, welches die primären Ziele des Boards sind und welche Mittel &amp; Wege man hat mit dem Board umzugehen. Wie ist das mit dem Sprint Backlog auf dem Board? Wie werden die Stories abgearbeitet? Wie geht man mit Ausnahmen (z.B. Bugs) um? Scrum schlägt bei diesen Themen sehr leise Töne an.</li>
<li><em>Scrum nennt Product &amp; Sprint Backlogs</em><br />
    Scrum verrät aber nichts über den Aufbau der Einträge der Backlogs. Ein Product-Backlog ist eine "Wunschliste", ein Sprint-Backlog ist eine "Taskliste". Pofessionelle Agilisten belächeln mittlerweile die flachen Scrum-Backlogs und deren mangelhafte Vorgaben.</li>
<li><em>Scrum hat ein Sprint-Planungs-Meeting</em><br />
    "Gut, daß man bei Scrum auch plant" mag es einem in den Sinn kommen. Doch in Scrum konzentriert sich die Planung zumeist auf ein einziges Meeting, in dem der gesamte, meist 4 Wochen lange Sprint und die in dieser Zeit zu erstellenden Features designed &amp; geplant werden. Software-Entwickler mit gesundem Respekt gegenüber der Ingenieurskunst des "Software Engineerings" würden mit großer Wahrscheinlichkeit so eine Vorgehensweise als "unausgereift" bezeichnen.</li>
</ul>

<h3 id="die-sprintdauer">Die Sprintdauer</h3>

<p>Scrum baut auf Mikro-Organisation. Tägliche Einsatzbesprechung, Aufgabenverteilung und Updates. Scrum stützt dadurch Agilität. Anforderungen können sich ändern, unbedachte Situationen können eintreten. Darauf kann Scrum reagieren mit den Sprints, die die Gesamtleistung in viele kleine Schritte zerlegen. Hier, genau bei den Sprints (Iterationen) und deren Dauer ist die Methodik (bzw. die Umsetzung von Scrum) zumeist deutlich mangelhaft.</p>

<p>Wieso? Scrum schlägt eine Sprint-Dauer von 2-4 Wochen vor. Vorzuziehen sei eine kürzere Sprintdauer, maximal sollte sie jedoch 4 Wochen sein. Doch für ein Rahmenwerk, welches sehr stark auf die Mikro-Organisation fokussiert ist, sind 4 Wochen eine lange Zeit. Denn in der Praxis gibt es wenige Scrum-Projekte, die wirklich den 2-Wochen-Takt implementieren. Die Gründe dafür sind vielfältig. Einer der Hauptgründe ist wohl der Schwenk von einer "klassischen" Projektplanung hin zum agilen Management. In so einem Kontext tendiert man lieber zur 4 Wochen Zeitspanne, weil</p>

<ul>
<li>man angeblich mehr Zeit zum implementieren hat;</li>
<li>angeblich alle 2 Wochen ein ganzer Tag Team-Meeting "ineffizient" ist;</li>
<li>die wenigsten Anforderungen eines Produktes in 2 Wochen einsatzfähig fertiggestellt werden können.</li>
</ul>

<p>Im Grunde mehr oder minder schwachbrüstige Argumentationen. Als Randnotiz: meine persönliche Ansicht ist bei diesem Thema ist noch fordernder als die der reinen Scrum-Lehre: 2-wöchige Sprints sind gut, Wochen-Sprints noch viel besser.</p>

<p>Lange Sprintzyklen wirken für agile Verfahrensweisen wie eine angezogene Handbremse. Einen 4-Wochen-Sprint in 4 Stunden Sprint-Planungs-Meeting zu planen ist gelinde gesagt tollkühn. Bei langer Sprintdauer ist die Zahl der Stories und Tasks auf dem Board meist unbeherrschbar. Mehr noch, bei 4 Wochen schleichen sich gerne andere, minder relevante Aufgaben wieder auf's Board.</p>

<p>Die Releasefähigkeit wird stark eingeschränkt und das obere Management durch die langen Sprintzyklen implizit dazu aufgefordert, mehr "Termin-Management" und Koordinationsleistung zu betreiben. Die empirische Messung der Velocity und die Schätzgenauigkeit des Teams ist mit langen Sprints von deutlich geringerem Wert und Aussagekraft als bei (sehr) kurzen Sprints.</p>

<h3 id="die-planung-das-design">Die Planung &amp; Das Design</h3>

<p>In den vorangegangenen Punkten ist dieser Makel schon ein wenig angeklungen; Planung &amp; Design in Scrum sind unfassbar - im wahrsten Sinne des Wortes. Wer schon einmal vor der Aufgabe stand, in einem Sprint-Planungs-Meeting mit den anderen dutzende Stories "implementierungsreif" zu planen &amp; zu designen, der kann sich denken, worauf ich hinaus möchte.</p>

<p>Doch vor der Betrachtung und Kritik am "Planungs-Meeting" möchte ich die generell mangelhafte Planungssituation von Scrum nicht unerwähnt lassen. So sucht man in der Scrum-Methodik vergebens unterstützende Merkmale zu adequater Business-Analyse und der anschließenden Anforderungs-Analyse. "Ohh" - wird sich jetzt manch einer denken - "Ist dass denn dann noch agil?". Antwort dazu: Es wäre für die Vertreter der agilen Software-Entwicklung schlichtweg ein Debakel, wenn eine wichtige Disziplin des Software Engineerings nicht agil betrieben werden könnte.</p>

<p>In der Praxis wird Scrum leichtsinnig und konzeptfrei mit allem möglichen "agilen Zubehör" bepackt. Da gibt es dann User Stories, Planning Poker, Story Points, Estimation Meetings, Business Value Estimations und vieles mehr. Aus Sicht der Prediger der Scrum-Fibel auch durchaus verständlich, schließlich sei "Scrum ja auch nur ein Rahmenwerk" (siehe 1. Schwachpunkt).</p>

<p>Doch zurück zum Thema Planung &amp; Design von Software und Software-Entwicklung. Man mag wieder argumentieren, das habe nichts mit Scrum, dem Management-Rahmenwerk, zu tun. Dies wäre eine fadenscheinige, viel zu oberflächliche Argumentation, denn auch Management-Methoden sollten die Problemstellungen Ihrer Domäne (hier: Software-Entwicklung) stützen, fördern und verwalten können.</p>

<p>Scrum will dies mit dem Sprint-Planungs-Meeting erreichen. Bedauernswerter Weise in vielerlei Hinsicht inadequat. Was in den Lehrbüchern zu Scrum so einfach klingt, ist in der Praxis kaum durchführbar. Zum Einen ist es eine schier berzerrte Wahrnehmung der Realität anzunehmen, dass eine Gruppe von Software-Entwicklern innerhalb von 4-8 Stunden die meist dutzenden Anforderungen für die nächsten paar Wochen "durchdesignen" können. Zum Anderen soll in diesem Meeting so viel wie möglich an offenen Punkten bzgl. der Anforderungen geklärt werden (um der oft gar zu mangelhaften Anforderungsanalyse entgegeni zu wirken).</p>

<p>Bei aller Liebe zu "Embrace Change" - die Sprint-Planung stellt bei vielen Scrum-Teams mit langen Sprintzyklen eine unvollständige "Erstanalyse" der Geschäftsanforderung dar. Aus einer solchen Besprechung eine adequates und professionelles Software-Design zu verlangen, ist schlichtweg naiv. Für viele, angebliche "Agilisten" ist die Sprint-Planung ein Alibi für Design &amp; Planung. "Ja, wir haben doch schon im Planning darüber nachgedacht - das reicht". Andere wiederum kommen mit der hochkomprimierten, verlustbehafteten Planung wenig zurecht und lagern in der Planung noch kräftig Analyse-Tasks, Design-Tasks, Dokumentations-Tasks nach. Sogar  Analyse-Stories bis hin zu ganzen Analyse-Sprints oder Refactoring-Sprints sind schon gesichtet worden. "Willkommen zurück im Wasserfall" kann man da nur sagen.</p>

<h3 id="der-scrum-master">Der Scrum Master</h3>

<p>Mit dem Scrum Master wird ein heikles Kapitel der Schwachpunkte von Scrum geöffnet. Denn der Scrum Master - als Rolle versteht sich - mag auf den ersten Blick alles andere als eine Schwachstelle in der gesamten Methode verstanden werden. Scrum versteht den Scrum Master als "Facilitator", als "Change Agent", als "Servant Leader" - was für lobenswerte Werte. Eine Hymne, die auf den Scrum Master gesungen wird. Er überwacht die (wenigen) Scrum-Regeln, er schafft "Impediments" aus dem Weg, er fördert "die gesunde Veränderung" und moderiert durch die Meetings. Ein smarter Typ, dieser Scrum Master.</p>

<p>Doch der Schein trügt. In der Realität ist der Scrum Master oft keines von all den genannten Dingen. In den meisten Unternehmen ist der <a href="die-zukunft-des-projektmanagers-in-der-software-entwicklung.html">Scrum Master Nachfolger des klassischen Projekt-Managers</a>. Er schmückt sich mit der Feder des "Change Agents", nimmt aber aktiven Einfluß auf Planung, verteilt Tasks &amp; Aufgaben, zweifelt Entwicklungsaufgaben an, mahnt bei Refaktorisierungsaufgaben zur Beachtung des "Business Values" und erklärt sich selbst zum "Manager des Teams".</p>

<p>Andererseits ist der Scrum Master oft V-Mann und Sklave des konservativen Managements. Er wird genötigt, Aussagen über Releasepläne zu geben, Executive Reports zu erstellen, die Zeiterfassung für die Bilanzierung zu erledigen und gleichzeitig (parallel zur "modischen, agilen Methode") noch Projektpläne zu erarbeiten, in denen penibel Zeitabläufe, Ressourcen &amp; Meilensteine durchgeplant werden.</p>

<p>Der Scrum Master kann auch ein Entwickler sein, der sich dann auserkoren fühlt und Review-Pate spielt. Er ändert Tasks, ist bei Estimations der Führende und setzt den anderen "seinen Programmierstil" (unbewußt) vor die Nase. Er ist meist zu unkooperativ gegenüber dem Product Owner und pocht auf die "Einhaltung von Abmachungen" (Contracting), anstatt den Aspekt für das Geschäft im Auge zu behalten.</p>

<p>All diese Dinge sind kontraproduktiv für das eigentliche Ziel - eine koordinierte, produktive, agile Software-Entwicklung. Es gibt ganz wenige, um nicht zu sagen äußerst selten anzutreffende Scrum Master, die Agilität &amp; Professionalität in Einklang bringen und die überspitzten, gar realitätsfremden Scrum-Prädikate "Alles-Könner", "Jeden-Versteher" und "Komplett-Überblicker" erfüllen.</p>

<h3 id="die-skalierung">Die Skalierung</h3>

<p>Ein offensichtlicher Schwachpunkt von Scrum ist die Skalierung. Scrum in seiner ersten und "reinen" Form ist eher für ein einzelnes Team konzipiert - maximal ein paar Teams. Aber Scrum im Großen, "Scrum in the Enterprise" - das ist dann schon eine etwas andere Sache. Klar, es gibt "Scrum of Scrums" und "Company Backlogs". Dennoch ist bei Scrum die Integration von ganzen Abteilungen, die Organisation von dutzenden Teams und Koordination zu einem größeren Produkt ein Punkt, der in den Lehrbüchern nur mit der magischen "unsichtbaren Tinte" zwischen den Zeilen geschrieben zu sein scheint.</p>

<p>Ominös umnebelt sind hierbei besonders die Themen Synchronisation und Team-Aufteilung. Sind die Teams jetzt funktional (z.B. ein B2B und ein B2C-Team) oder horizontal (z.B. UI-Team, DWH-Team) oder vertikal (z.B. CMS-Team, CRM-Team) oder kann doch jeder alles? Sprintet jeder synchron? Gibt es einen Release-Plan oder mehrere? Wie können die Ergebnisse zusammengeführt werden? Muss jedes Team einen eigenen Branch und eigenes Board haben? Kann ein Scrum Master drei Teams "betreuen"? Fragen über Fragen, auf die Scrum - wenn überhaupt - nur unscharfe Antworten gibt.</p>

<h3 id="das-dilemma">Das Dilemma</h3>

<p>Es ist schon ein Dilemma. Scrum ist so verbreitet, weil es einfach ist. Es ist überschaubar und kann auf einem Bierdeckel zusammengefasst werden. Scrum ist so populär, weil es einen einfachen Start in die Agilität bietet. Scrum ist so erfolgreich, weil man damit Geschäfte machen kann. Scrum bringt dem Implementierenden auf mittlere Sicht mehr Produktivität und bietet den Unterbau für eine wesentlich flexiblere professionelle Software-Entwicklung. Nicht zuletzt profitiert auch die Unternehmens- und IT-Consulting-Branche von Scrum.</p>

<p>Doch Scrum ist weit mehr als das. Scrum ist unpräzise. Viele denken, sie praktizieren Scrum, dabei machen Sie kleine Wasserfall-Iterationen. Sie stehen an den Boards und berichten über Status und Aufwände, statt gemeinsam den "Einsatz des Tages" zu besprechen und zu planen. Einige verwalten Bugs am Board und haben eine "Ongoing-Tasks"-Zeile, andere wiederum Pochen auf Tickets, Zeiterfassung und "Live-Burndown-Charts".</p>

<p>Scrum ist transparent. "Hört sich gut an" mag man denken. Das ist auch richtig, ist aber für prokrastinierende Entwickler-Veteranen und altgediente Unternehmens-Manager kein Spaß. Überwachungskultur und Big-Brother-Gefühle eingeschlossen. Politik und der staubige Filz von Konzern-Lobbyisten tragen dann dazu bei, daß "Agil" und "Scrum" mit "Planungslos" und "Chaotisch" substituiert und verunglimpft werden.</p>

<p>Scrum ist leider aber auch oftmals ein Ausreden-Paket für Entwickler. "Nein nein, das Board macht der Scrum Master". Der Review? Macht der Scrum Master - der kann doch Powerpoint. Die Transparenz und die plötzliche Selbstorganisation schleudert so manchen festgefahrenen Entwickler aus seiner Bahn. Committed wird nur das nötigste. Ausserdem bestimmt ja das "Team" was gemacht wird oder nicht? "Bloß kein Stress" ist hier die Devise.</p>

<p>Die Qualitätsansprüche der modernen, agilen Software-Entwicklung werden oftmals mit dem Level-Of-Done wieder relativiert - wer braucht schon Dokumentation, Unit Tests oder Analyse? Im Übrigen, geplant wird mit einem Tag sowieso schon zu viel - ansonsten sei man "nicht agil".</p>

<p>Um es etwas provokant auszudrücken: <a href="scrum-ist-fur-erwachsene-parental-advisory-explicit-engineering.html">Scrum ist für Erwachsene</a>.</p>

<p>Die oben genannten Mängel können gravierende Auswirkungen nach sich ziehen. Sie können Scrum-Projekte behindern. Ja, sie sind manchmal sogar Grund für das Scheitern von Scrum. Doch man kann diesen Schwachpunkten entgegenwirken. Und es sei nochmals daran erinnert: nur weil Scrum Schwachpunkte hat, heißt es nicht, daß es absolut ungeeignet ist, um agile Sotware-Entwicklung zu betreiben.</p>

<p>Konsequenterweise bleibt nach dieser mehr oder minder langen Kritikliste an Scrum eine große Frage offen: Was kann man tun, um diese Schwachpunkte zu eliminieren bzw. zu mitigieren? Die Antwort auf diese Frage ist - wie Scrum selbst - nicht so einfach wie es scheint. Dennoch würde ich eine Blog-Serie über Verbesserungsmöglichkeiten anstreben.</p>

<div id="see">
  <h6>
Weiterführende Artikel</h6>
                  <ul class="">
  <li><a href="/scrum-die-bessere-sprintdauer.html">Scrum: Die bessere Sprintdauer
    <span class="order">04 March 2010</span>
  </a></li>
  <li><a href="/scrum-der-bessere-scrum-master.html">Scrum: Der bessere Scrum Master
    <span class="order">16 June 2010</span>
  </a></li>
  <li><a href="/scrum-die-bessere-sprintplanung.html">Scrum: Die bessere Sprintplanung
    <span class="order">11 February 2013</span>
  </a></li>
</ul>
</div>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Jede Codezeile zählt beim .NET Coding Dojo</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/jede-codezeile-zaehlt-beim-net-coding-dojo.html"/>
            <updated>2010-01-21T22:20:30Z</updated>
            <published>2010-01-21T22:20:30Z</published>
            <id>/jede-codezeile-zaehlt-beim-net-coding-dojo.html</id>
            
            <content type="html"><![CDATA[
                <p>Gestern Abend war es wieder einmal soweit. Das .NET Coding Dojo in München öffnete die Tore für alle .NET Enthusiasten, TDD Interessierte, CCD Jünger und neugierige Software-Entwickler.</p>

<p>Und das erste Münchener .NET Coding Dojo des Jahres startete wahrhaftig mit einem Paukenschlag! Erstmals überstieg die Teilnehmerzahl den Rahmen einer Dojo Session, so dass wir zwei Teams machen mussten (und wollten), die gegeneinander in einem "Dojo-Battle" antreten und ein Code Kata lösen sollten.</p>

<p>Nach einer kurzen Willkommens-Einwärm-Phase ging es auch schon zur Wahl des Code Kata's für den Abend. Zur Auswahl standen <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataBowling">KataBowling</a>, <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataMinesweeper">KataMinesweeper</a> und der <a href="http://codekata.pragprog.com/2007/01/kata_thirteen_c.html">KataLocCounter</a> in der C# Variante. Nach der kurzen Vorstellung der Code Kata's entschied sich die Dojo-Gemeinde für den <a href="http://codekata.pragprog.com/2007/01/kata_thirteen_c.html">KataLocCounter</a>. Eine besonders erfrischende und spaßbringende Wahl, wie sich im Laufe des Abends herausstellen sollte.</p>

<h3 id="starke-teams-denken-testen-zahlen">Starke Teams denken, testen, zählen</h3>

<p>Das Code Kata ist gewählt, die Aufgabe und Rahmenbedingungen erklärt, nun konnte es schon losgehen. Fast. Die Teams mußten noch formiert werden. Die wurden im Zählverfahren (wie denn sonst ;-)) aufgeteilt. Wie es der Zufall will, waren die Teamstärken gut verteilt.</p>

<p><strong>Team 1</strong> war stark besetzt mit der analytischen Expertise von <a href="http://www.cotago.de/">Andre</a>, den CCD- und .NET Guru's <a href="http://ralfw.blogspot.com/">Ralf</a> und <a href="http://www.lieser-online.de/blog/">Stefan</a>. Hinzu kamen erfahrene Dojojaner wie <a href="http://blog.aztec-project.org/">Thomas und Christina</a>, gestärkt mit einem Dutzend weiterer .NET-Entwickler.</p>

<p>Doch wer nun dachte, <strong>Team 2</strong> wäre schwächer aufgestellt, der irrte sich gewaltig. <a href="http://www.deger-it.de/">Christian</a>, ein Dojo-Gänger der ersten Stunde und kraftvoll vorandesignender C# Architekt, der durch zahlreiche Dojo's durchtrainierte <a href="http://www.stefankoelle.de/">Stefan</a>, die geballte TDD/BDD-Erfahrung von <a href="http://www.bjro.de/">Björn</a> und ein starkes Dutzend .NET-Coder waren ein anspruchsvolles Lineup.</p>

<p>Die Teams waren aufgeteilt, das gedankliche Stretching und Warmup getan. Es konnte losgehen!</p>

<h3 id="jede-codezeile-zahlt">Jede Codezeile zählt</h3>

<p>In einer ersten Phase wollten die Teams sich ein wenig detaillierter mit den Anforderungen an den Line-Counter auseinandersetzen, um eine "Design-Strategie" auszuarbeiten.</p>

<div class="codehilite"><pre><span class="kt">string</span> <span class="n">code</span><span class="p">=</span><span class="s">&quot;Diese Zeile zählt!&quot;</span><span class="p">;</span>
<span class="c1">// Einzeilige Kommentare zählen nicht</span>

<span class="c1">// Dieser Kommentar und die leere Zeile davor zählen auch nicht</span>
<span class="kt">int</span> <span class="n">count</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="c1">// Diese Zeile zählt natürlich!</span>
<span class="kt">bool</span> <span class="n">countComments</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> <span class="cm">/* Diese Zeile zählt auch */</span>

<span class="cm">/* So ein Kommentar</span>
<span class="cm">über mehrere Zeilen hinweg</span>
<span class="cm">zählt natürlich nicht als Code! */</span>
</pre></div>

<p><em>Ein paar Kommentarbeispiele :-)</em></p>

<p>Interessante Erkenntnis hierbei: Man hat sich zwar mit den fachlichen Anforderungen und den daraus ergebenden Features bzw. Rahmenbedingungen auseinandergesetzt, dabei aber die Analyse und eine gemeinsame Implementierungsstrategie nicht wirklich erarbeitet. Geklärt war zumindest, dass es galt, Kommentare im Code zu erkennen und nicht mitzuzählen. Das <strong>Wie</strong> und eine gemeinsame Übereinkunft über die Strategie fiel bei beiden Teams "unter den Tisch".</p>

<p>Doch das war offensichtlich zunächst nicht weiter schlimm, denn es schien erstmal wichtiger, das die Teams in den TDD-Rythmus kommen. Die ersten Tests gingen traditionell etwas schwerer vom Kopf in die Tastatur über, doch nachdem man sich auf den Happy-Pfad im Testing und eine inkrementelle Auslieferung des Programmes geeinigt hat ging es dann flotter.</p>

<p>Das Ergebnis innerhalb der Count-Methode des Team 1 war bis dato recht überschaubar:</p>

<div class="codehilite"><pre><span class="n">var</span> <span class="n">lines</span> <span class="p">=</span> <span class="n">source</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="k">new</span> <span class="kt">string</span><span class="p">[]</span> <span class="p">{</span> <span class="n">Environment</span><span class="p">.</span><span class="n">NewLine</span> <span class="p">},</span> <span class="n">StringSplitOptions</span><span class="p">.</span><span class="n">RemoveEmptyEntries</span><span class="p">);</span>

<span class="k">return</span> <span class="n">lines</span>
    <span class="p">.</span><span class="n">Select</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Trim</span><span class="p">())</span>
    <span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="p">!</span><span class="n">String</span><span class="p">.</span><span class="n">IsNullOrEmpty</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
    <span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="p">!</span><span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">&quot;//&quot;</span><span class="p">))</span>
    <span class="p">.</span><span class="n">Count</span><span class="p">();</span>
</pre></div>

<p>Soweit so gut.</p>

<h3 id="stolperstein-block-kommentare">Stolperstein Block-Kommentare</h3>

<p>Nach den einfacheren Fällen trafen beide Teams mit den mehrzeiligen Block-Kommentaren auf eine etwas härtere Nuss, die es zu knacken galt.
Wie sollte man denn die mehrzeiligen Kommentare erkennen? Vor Allem, wie sollte man dann mit besonders "außergewöhlichen" Kommentierungen umgehen?</p>

<div class="codehilite"><pre><span class="kt">int</span> <span class="n">count</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span> <span class="cm">/* mehrzeilige</span>
<span class="cm">kommentare können */</span> <span class="n">count</span><span class="p">++</span> <span class="cm">/* herausfordernd sein */</span> <span class="p">;</span>
</pre></div>

<p><em>Außergewöhnliche Kommentare</em></p>

<p>An dieser Stelle holte die Teilnehmer die "zu kurze Analyse" zu Beginn wieder ein. Welche Strategie sollte man wählen? Die zeilenbasierte Verarbeitung aufgeben und zeichenbasiert arbeiten? Umschwenken auf schweißtreibende, aber mächtige Regular Expressions? Oder sogar eine Kombination von allem?</p>

<p>Das besondere und mich nicht überraschende: beide Teams wählten unterschiedliche Strategien. Während Team 1 die Eleganz des "Flows" der LINQ-Expression nicht aufgeben wollte und es mit Regular Expressions angereichtert hat, entschloss sich Team 2 für eine kleine Status-Maschine und einen Mix aus zeilen- und zeichenbasierter Verarbeitung.</p>

<h3 id="showdown">Showdown</h3>

<p>Nach knapp 3 Stunden war es dann soweit. Die Teams klopften die letzten Tests und Codezeilen ein, um sich dann im Schlußvoting dem gegnerischen Team zu stellen. Gespannt warteten die Teams auf den Code und die Resultate des Gegners.</p>

<p>Team 1 präsentierte zunächst das lauffähige Programm, danach das gute Dutzend Tests und den damit getriebenen Code. Auffällig: Der Code erschien dem Gegner auf den ersten Blick als kompakt und elegant.</p>

<p>Team 2 konterte prompt. Eine äußerst saubere Test-Suite, ein durch die differierende Implementierung etwas längerer Code und die Besonderheit, dass die Implementierung sogar (teilweise) Kommentar-Tokens innerhalb von Strings ignorieren konnte.</p>

<p>Ergebnis: Beide Lösungen waren unvollständig - aber gut vorangetrieben. Während Team 1 stärkeren Wert auf Auslieferbarkeit &amp; Effizienz gelegt hatte, engagierte sich Team 2 mehr in den Bereichen saubere Tests &amp; Funktionalität. Ausnahmsweise gab es beim ersten Dojo-Battle keinen Verlierer - beide Teams waren gleich stark. </p>

<p>Fazit: Ein wirklich gelungener Abend mit engagierten Teams, die trotz der Herausforderungen und Schwierigkeiten eine gute Leistung abgeliefert haben! Danke an alle Teilnehmer! <strong>Chapeau!</strong></p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Let&#39;s go to Dojo</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/lets-go-to-dojo.html"/>
            <updated>2010-01-11T23:58:11Z</updated>
            <published>2010-01-11T23:58:11Z</published>
            <id>/lets-go-to-dojo.html</id>
            
            <content type="html"><![CDATA[
                <p>Es ist wieder soweit, das Münchener .NET Coding Dojo öffnet auch im neuen Jahr die Tore.</p>

<p>Für alle, die nicht nur still und leiste in ihrem Kämmerchen Code Kata's üben möchten. Für alle, die wissen wollen, mit welchen Tricks und Kniffen man mit Design Patterns, Methoden &amp; TDD zu sauberem Design und Code kommt. Für alle, die sich selbst und andere in Punkto professionelle Softwareentwicklung weiterbringen möchten!</p>

<p>Am Mittwoch, den 20.01. werden im <a href="https://www.xing.com/events/net-coding-dojo-munchen-449437">.NET Coding Dojo</a> wieder .NET Enthusiasten, Software-Entwickler und System-Analytiker ein Programmierproblem annehmen, in Einzelteile zerlegen und es nach eigener Architektur und Bauplan kunstvoll wieder zusammenführen. Sei dabei!</p>

<p>Event-Details &amp; Anmeldung über das <a href="https://www.xing.com/events/net-coding-dojo-munchen-449437">Xing-Event</a> bzw. die <a href="https://www.xing.com/net/netdojo">Xing-Gruppe</a>.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Umbau – Öfter mal was Neues</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/umbau-oefter-mal-was-neues.html"/>
            <updated>2010-01-10T13:50:52Z</updated>
            <published>2010-01-10T13:50:52Z</published>
            <id>/umbau-oefter-mal-was-neues.html</id>
            
            <content type="html"><![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's erste gibt es jedoch nur die wichtigsten Infos.</p>

<h4 id="phase-1">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 id="phase-2">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 id="phase-3">Phase 3:</h4>

<p>Die dritte und letzte Phase ist das sog. "Polishing". 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>
        </entry>
                        <entry>
            <title type="html">Code Contracts: To Contract Or Not To Contract...</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/code-contracts-to-contract-or-not-to-contract.html"/>
            <updated>2009-12-15T16:07:21Z</updated>
            <published>2009-12-15T16:07:21Z</published>
            <id>/code-contracts-to-contract-or-not-to-contract.html</id>
            
            <content type="html"><![CDATA[
                <h3 id="oder-wurdet-ihr-auf-geschenke-die-das-leben-vereinfachen-verzichten">Oder: Würdet Ihr auf Geschenke, die das Leben vereinfachen, verzichten?</h3>

<p>Viele werden schon davon gehört haben, und viele werden es auch schon kennen: <a href="http://research.microsoft.com/en-us/projects/contracts/">Code Contracts</a>. Obwohl Code Contracts noch nicht offiziell veröffentlicht wurden, sind Code Contracts mittlerweile keine neue Sache. Im Gegenteil, Durch die massive, jahrelange Forschungsarbeit von Microsoft sind Code Contracts seit über einem Jahr sehr stabil und zuverlässig. Interessanterweise wurden Code Contracts nicht spezifisch erforscht, sondern sind als "Nebenprodukt" der Forschungen zu Boogie/Clousot (der statischen Verifikationskomponente von <a href="http://research.microsoft.com/en-us/projects/specsharp/">Spec#</a>) entstanden.</p>

<p>Man findet mittlerweile sehr viele Beispiele und Casts zu Code Contracts und all den Features, die Code Contracts mit sich bringen. Ein aktuelles Video und eine wirklich sehenswerte, einfache Einführung in die Features ist die <a href="http://microsoftpdc.com/Sessions/VTL01">PDC09 Session über Code Contracts und PEX</a> (dem automatisierten Unit Testing Tool). Es ist konsequenterweise nicht verwunderlich, dass Code Contracts seit über einem halben Jahr in den <a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx">DevLabs zur Verfügung gestellt werden</a> und mit .NET 4.0 in der mscorlib integriert sein werden (also in .NET 4.0 mit enthalten sein werden).</p>

<h3 id="parameterverifikation-mit-stil">Parameterverifikation mit Stil</h3>

<p>Eine besondere und herausstechende Eigenschaft der Code Contracts ist jedoch, dass es sich wunderbar einfach in eine existierende Code-Basis einführen lässt. Dadurch das Code Contracts viele Vorteile mit sich bringen, kann man eine stufenweise Integration anstreben. So ist es eine gangbare Methode, Code Contracts im ersten Schritt für die Dinge einzusetzen, die man sowieso schon jahrelang macht, wie z.B. Parameterprüfungen in Methoden (Vorbedingungen):</p>

<div class="codehilite"><pre><span class="c1">//...</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessOrder</span><span class="p">(</span><span class="n">IOrder</span> <span class="n">order</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">order</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">();</span>
  <span class="c1">//...</span>
<span class="p">}</span>
</pre></div>

<p>Diese "Contracts" werden mittlerweile von Tools wie ReSharper oder CodeRush auf Wunsch automatisch generiert, um dem Entwickler den Tippaufwand zu ersparen. Es gibt in manchenvielen Anwendungen und API's auch nette Hilfsklassen, die diese Prüfungen beschleunigen:</p>

<div class="codehilite"><pre><span class="c1">//...</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessOrder</span><span class="p">(</span><span class="n">IOrder</span> <span class="n">order</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">Argument</span><span class="p">.</span><span class="n">MayNotBeNull</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
  <span class="c1">//...</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">Argument</span> <span class="p">{</span>
  <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">MayNotBeNull</span><span class="p">(</span><span class="kt">object</span> <span class="n">o</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">o</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>Genau dieser, ich möchte schon fast sagen tagtägliche Anwendungsfall kann mit Code Contracts sofort umgesetzt werden:</p>

<div class="codehilite"><pre><span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessOrder</span><span class="p">(</span><span class="n">IOrder</span> <span class="n">order</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">Contract</span><span class="p">.</span><span class="n">Requires</span><span class="p">(</span><span class="n">order</span> <span class="p">!=</span> <span class="k">null</span><span class="p">);</span>
  <span class="c1">//...</span>
<span class="p">}</span>
</pre></div>

<p>Lesbar, einfach und effektiv gesehen exakt das selbe, was man schon seit Jahren "per Hand" programmiert. Das Schöne ist hier allerdings, das es die Tür für die weiteren Tools (z.B. statische Verifikationsanalyse) öffnet. Mit der Zeit kann man auch nicht nur die Preconditions mit den Code Contracts umsetzen, sondern auch die Postconditions und Invariants einsetzen.</p>

<p>In einem späteren Schritt kann man zu den Prüfungen zur Laufzeit auch die statische Verifikation noch mit einführen, um kritische Anwendungsteile in der Stabilität zu stärken. Es gibt noch viele weitere Vorteile, die Code Contracts mit sich bringen (z.B. Verifikationsdefinitionen auf Schnittstellen), auf die ich hier nicht näher eingehen werde. Ich denke jedoch, dass jeder, der sich ein wenig mit den Code Contracts auseinandersetzt, die klaren Vorteile erkennen wird.</p>

<h3 id="weihnachten-ohne-geschenke">Weihnachten ohne Geschenke?</h3>

<p>Die Frage ist nun: würde man Code Contracts in eine bestehende heute schon Codebasis integrieren wollen? Die aktuelle Version der Code Contracts muss man separat referenzieren, denn die Contracts werden erst mit .NET 4.0 ein fester Bestandteil der BCL sein. Man stelle sich nun ein agiles Projekt vor, in dem wöchtenliche Releases keine Seltenheit sind. Würde man in so einer Situation den Einsatz von Code Contracts befürworten oder eher abwarten, bis es .NET 4.0 veröffentlicht wurde. Lizenzteichnisch gäbe es keine Probleme, zumal die Code Contracts in der aktuellen Version schon über eine Going-Live-Lizenz verfügen.</p>

<p>Dafür spricht, dass die Code Contract API schon seit über einem Jahr stabil ist. Die Contract-Assembly wurde sehr sorgfältig über einige Jahre hinweg entwickelt. Ein weiteres Pro-Argument ist sicherlich die definitive Integration mit .NET 4.0. Schon heute steht fest, dass System.Diagnostics.Contracts eine fester Bestandteil der neuen .NET-Version sein wird. Die Vorteile, die die Code Contracts selbst mit sich bringen (also verbesserte Verifikation zur Laufzeit, statische Verifikation, erleichterter Einsatz von weiterführenden Tools wie z.B. PEX) erwähne ich nur nebenbei.</p>

<p>Dagegen würde wohl momentan nur die Tatsache sprechen, dass die Contracts noch nicht Final sind. Die API kann sich in den einigen Monaten bis zur Veröffentlichung von .NET 4.0 noch ändern (obwohl es lt. Aussage der Entwicklungsmannschaft wohl unwahrscheinlich ist). Ein weiteres Gegenargument für den sofortigen Einsatz ist wohl das Deployment. Abhängig vom Anwendungstyp muss man da einige Parameter berücksichtigen. Doch für den jetzigen Anwendungsfall möge man von einem agilen Software-Projekt mit frequentiven Releases ausgehen, z.B. ganz klassisch bei einer Web-Anwendung. Hier muss man abwägen, ob man die Contracts-Assembly auf den Webservern im GAC installiert oder mit den eigenen Assemblies mit ausliefert.</p>

<p>Nach dieser kurzen Pro-Contra-Gegenüberstellung würde mich Eure Meinung interessieren. Was meint Ihr? Wer setzt es heute schon ein? Wer möchte es noch vor dem .NET 4.0 Release einsetzen? Wer möchte lieber abwarten bis .NET 4.0?</p>

<p>Die Frage ist: Das Geschenk "Code Contracts" heute schon annehmen und einsetzen? Ja oder Nein?</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Coding Dojo@DNUG Ingolstadt</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/coding-dojo-dnug-ingolstadt.html"/>
            <updated>2009-12-15T10:54:37Z</updated>
            <published>2009-12-15T10:54:37Z</published>
            <id>/coding-dojo-dnug-ingolstadt.html</id>
            
            <content type="html"><![CDATA[
                <p>Gestern habe ich bei der <a href="http://www.indot.net/">DNUG Ingolstadt</a> eine .NET Coding Dojo Session gehalten. Kurz und knapp: KataFizzBuzz wurde auf Anhieb in knapp einer Stunde gelöst. Noch besser, es wurde daraufhin nochmal eine zweite Variante innerhalb kurzer Zeit entwickelt. Eine tolle Leistung! </p>

<p>Danke nochmals an <a href="http://webenliven-space.de/dotnetblog/">Gregor</a> &amp; die DNUG für die Organisation und das nette Geschenk! Diese Woche scheint sowieso die "Dojo-Woche" zu werden, denn Morgen geht es schon wieder weiter mit einer <a href="https://www.xing.com/events/net-coding-dojo-munchen-experten-431510">neuen Herausforderung im Experten Dojo in München</a>.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">Tic-Tac-Toe</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tic-tac-toe.html"/>
            <updated>2009-11-22T16:04:45Z</updated>
            <published>2009-11-22T16:04:45Z</published>
            <id>/tic-tac-toe.html</id>
            
            <content type="html"><![CDATA[
                <p>Jeder von uns kennt den kleinen Kurzweil-Klassiker <a href="http://de.wikipedia.org/wiki/Tic_Tac_Toe">Tic-Tac-Toe</a>. Das kleine Spiel zu programmieren ist nicht nur ein interessanter Pausenfüller, sondern auch eine besonders schöne Vorlage für ein .NET Coding Dojo mit langjährig erfahrenen .NET Programmierern.</p>

<h3 id="die-anforderungen">Die Anforderungen</h3>

<p><img alt="" class="alignright" src="/media/images/tictactoe-150x150.png" />
Das Spiel ist zu Ende, wenn</p>

<ul>
<li>alle Felder belegt sind</li>
<li>ein Spieler eine gesamte Reihe belegt hat</li>
<li>ein Spieler eine gesamte Spalte belegt hat</li>
<li>ein Spieler eine gesamte Diagonale belegt hat</li>
</ul>

<p>Außerden gilt:</p>

<ul>
<li>Ein Spieler kann ein freies Feld belegen</li>
<li>Die Spieler belegen so lange ein freies Feld, bis das Spiel beendet ist</li>
</ul>

<p>Auch die <a href="https://www.xing.com/net/netdojo">.NET Experten im Coding Dojo</a> München hatten Ihren Spass an dem kleinen Spiel. Es musste natürlich kräftig überlegt und entwickelt werden - ohne Anstrengung geht's eben nicht :-).</p>

<p>Summa summarum ein gelungenes und nettes <a href="http://www.markhneedham.com/blog/2009/08/08/coding-dojo-21-tdd-as-if-you-meant-it-revisited/">KataTicTacToe</a>. Auch zu empfehlen für TDD-Einsteiger. Es gibt jedem die Möglichkeit, eine eigene Lösung zu entwickeln und zeigt dabei die Grundprinzipien des TDD auf. </p>

<p>Achso, wer Lust hat, nicht nur die ganze Zeit über TDD zu lesen und zu reden, sondern auch mal "hautnah" TDD mit C# und professionellen Softwareentwicklungsmethoden live erleben und mitmachen möchte, für den sind schon die nächsten Sessions im Kalender markiert.</p>

<p>Wie immer sind am Anfang des Monats, genauer am <a href="https://www.xing.com/events/net-coding-dojo-munchen-einsteiger-431506">2. Dezember, die Einsteiger im Dojo</a> gefordert. Zwei Wochen später, am <a href="https://www.xing.com/events/net-coding-dojo-munchen-experten-431510">16. Dezember sind die .NET Experten gefordert, im Coding Dojo</a> ihre gesamte Expertise einzubringen, um die sich selbst gestellte Aufgabe zu meistern.</p>
            ]]></content>
        </entry>
                        <entry>
            <title type="html">TDD ist keine Wissenschaft!</title>
            <author><name>Ilker Cetinkaya</name></author>
            <link href="/tdd-ist-keine-wissenschaft.html"/>
            <updated>2009-11-16T08:36:20Z</updated>
            <published>2009-11-16T08:36:20Z</published>
            <id>/tdd-ist-keine-wissenschaft.html</id>
            
            <content type="html"><![CDATA[
                <p>In letzter Zeit wird viel über TDD geredet und diskutiert. Das ist gut, denn offensichtlich gibt es da noch einiges zu besprechen und zu lernen. Ich habe erst kürzlich gelernt, dass es absolut sinnlos ist, bestehende Projekte ohne TDD anzugehen. Auch wenn ich viele Tests im nachhinein schreibe. Ich schreibe sie einfach so wie ich die Anforderungen verstanden habe. Mal nähert sich der Code an die Tests, mal die Tests an den Code. Das schöne daran ist, dass man wesentlich schneller den bestehenden Code versteht und auch deren Schwachstellen identifiziert. Dadurch wird auch die Wartung des Brownfield-Projektes gestärkt. Innerhalb von kurzer Zeit kann ich Aufwände und Problemstellungen gut einschätzen.</p>

<h3 id="tdd-im-rampenlicht">TDD im Rampenlicht</h3>

<p>Naja, das nur nebenbei. Mir geht es eigentlich um ein anderes Thema. Mir geht es um etwas Generelles. Als Pete und ich mit den .NET Coding Dojos angefangen haben, gab es positive Resonanz. Es wurden Dojo's veranstaltet und Code Kata's exerziert. Super! Meiner Ansicht nach kam TDD dadurch ein kleines Stück mehr in's Rampenlicht als es schon durch <a href="http://clean-code-developer.de/">Clean Code Developer</a> bereits war. In zahlreichen Posts gab es Diskussionen um die <a href="http://www.des-eisbaeren-blog.de/post/2009/11/01/Wie-viel-Sinn-machen-Unittests.aspx">Sinnhaftigkeit von Unit Tests</a>, die <a href="http://ralfw.blogspot.com/2009/09/code-kata-statt-thai-chi-vor-dem.html">Kata Berichte</a> und grundlegender <a href="http://ralfw.blogspot.com/2009/10/tdd-wofur-oop-2010-endlich-cleannet.html">Erkenntnisse über TDD</a>. Eine besonders positive Sache, denn Weiterentwicklung und Entdeckung sind schöne Dinge.</p>

<p>Doch eine Sache stört mich. Manchmal stört es mich sogar gewaltig. Dieses Trara und <a href="http://de.wikipedia.org/wiki/Tamtam">Tamtam</a> um TDD und <a href="http://www.des-eisbaeren-blog.de/post/2009/11/07/Auch-Kirchen-haben-Kragsteine.aspx">Beeinflussung des OO-Designs durch Tests</a> und das <a href="http://ralfw.blogspot.com/2009/11/zustand-als-abhangigkeit-ioc-konsequent.html">Entkoppeln von Zustand</a>. Bei dem einen oder anderen Post kann ich mir das Kopfschütteln während des Lesens einfach nicht verkneifen. Die Spitzfindigkeit und unnötige Verkomplizierung einfacher Sachverhalte geht mir zuwider. Für manch einen mag es Anspruch sein, über ein Feuerwerk an <a href="http://de.wikipedia.org/wiki/Sprachfertigkeit">Eloquenz</a> einfachste Dinge mit fesselnden Trapezschwüngen der <a href="http://de.wikipedia.org/wiki/Rhetorik">Rhetorik</a> auf das Hochseil des Softewareentwicklungszirkusses zu katapultieren. Die lufterhitzenden Spots, der nervöse Trommelwirbel, der adrenalisierende Schweiß der Konzentration inklusive. Für manch einen. Für mich jedenfalls nicht.</p>

<p>Im Gegenteil. Es stört mich. Es irritiert mich. Denn mich interessiert das Thema selbst. Ich denke es Bedarf keines jonglierens mit <a href="http://de.wikipedia.org/wiki/Dependency_Inversion_Principle">DIP</a>, <a href="http://de.wikipedia.org/wiki/Single_Responsibility_Principle">SRP</a>, <a href="http://de.wikipedia.org/wiki/YAGNI">YAGNI</a>, <a href="http://de.wikipedia.org/wiki/DRY">DRY</a>, um wirklich im Alltag der Software-Entwicklung gut bestehen zu können. Man darf mich hier nicht falsch interpretieren. Auch ich finde es wichtig, sich mit "Dependency Inversion", "Single Responsibility", "Decisions on Last Responsible Moment" und "Repetition Avoidance" auseinanderzusetzen, damit umzugehen und täglich einzusetzen.</p>

<h3 id="tdd-ist-keine-rocket-science">TDD ist keine "Rocket Science"</h3>

<p><img alt="" class="alignright" src="/media/images/bart-simpson-zustand.png" />
Doch man kann es übertreiben