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

<channel>
	<title>Schauderhaft &#187; process</title>
	<atom:link href="http://blog.schauderhaft.de/tag/process/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.schauderhaft.de</link>
	<description>Softwaredevelopment, Projectmanagement, Qualitymanagement and all things &#34;schauderhaft&#34;</description>
	<lastBuildDate>Sun, 05 Feb 2012 20:46:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Sketch and Test</title>
		<link>http://blog.schauderhaft.de/2011/12/18/sketch-and-test/</link>
		<comments>http://blog.schauderhaft.de/2011/12/18/sketch-and-test/#comments</comments>
		<pubDate>Sun, 18 Dec 2011 05:39:26 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=983</guid>
		<description><![CDATA[I try to do TDD as much as I can. But sometimes (for example last Friday) I don&#8217;t know how to get started. This happens when I don&#8217;t have a plan of how the code should look in the end, possibly because don&#8217;t completely understand part of the problem. Especially I didn&#8217;t know how I [...]]]></description>
			<content:encoded><![CDATA[<p>I try to do TDD as much as I can. But sometimes (for example last Friday) I don&#8217;t know how to get started. This happens when I don&#8217;t have a plan of how the code should look in the end, possibly because don&#8217;t completely understand part of the problem. Especially I didn&#8217;t know how I would be able to test it, due to the fact it the code had to interact with a different system and a database.</p>
<p>The <a href="http://www.amazon.de/gp/product/020161622X?ie=UTF8&#038;tag=schauderhafte-21&#038;linkCode=shr&#038;camp=3206&#038;creative=21426&#038;creativeASIN=020161622X&#038;ref_=sr_1_1&#038;qid=1324160771&#038;sr=8-1">pragmatic programmer</a> recommends a tracer bullet or spike in this case. This means you implement some kind of prototype in order to clarify how to implement it properly. </p>
<p>And than you throw that away and implement it properly again, which for me means test driven.</p>
<p>Do you really do that? For me this goes against the principle of baby steps and of refactoring instead of rewriting code. </p>
<p>Also I was fearing it wouldn&#8217;t help much, because the problem wasn&#8217;t so much that I was unclear about the code, but about how to test it.</p>
<p>So last Friday I tried a different approach. I call it &#8216;Sketch and Test&#8217; </p>
<p>I started by implementing the complete thing in one single class. Without tests (scary, I know). But I never actually executed the code. I just wrote it as I thought it should work. </p>
<p>Once this <strong>sketch</strong> was finished I looked at the code and considered the changes I needed to make in order to test it. </p>
<p>I did the changes and finally created the tests, fixing the bugs I found in the progress.</p>
<p>Only when all the tests where in place and green I actually started the application and tested the new feature. </p>
<p>It worked, i.e. the feature did what I expected. The code qualifies as clean and I had complete code coverage with the only exception of some weird exception handling code, that I found hard to trigger in tests.</p>
<p>What do you think? Is this a viable approach? Or is it just a symptom of my limited TDD skills? Or both?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2011/12/18/sketch-and-test/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>People are like Water</title>
		<link>http://blog.schauderhaft.de/2009/10/11/people-like-water/</link>
		<comments>http://blog.schauderhaft.de/2009/10/11/people-like-water/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 08:11:40 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[people]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[water]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=260</guid>
		<description><![CDATA[I found a new (at least for me) metaphor: people are like water. The cool thing about this metaphor is: When you manage people you can use it to learn from the engineers building channels and dams. So here are the things you can learn: If you want to stop a certain behavior, build a [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_261" class="wp-caption alignleft" style="width: 210px"><img class="size-medium wp-image-261" title="1223976_61232850" src="http://blog.schauderhaft.de/wp-content/uploads/2009/10/1223976_61232850-200x300.jpg" alt="1223976_61232850" width="200" height="300" /><p class="wp-caption-text">Glass with water</p></div>
<p>I found a new (at least for me) metaphor: <strong>people are like water</strong>. The cool thing about this metaphor is: When you manage people you can use it to learn from the engineers building channels and dams. So here are the things you can learn:</p>
<p><strong>If you want to stop a certain behavior, build a dam not a wall</strong>. A wall, i.e. a single action won&#8217;t change the behavior very much. A hundred years ago dams where basically thick walls. In case of a flood, waves would crash against the wall and destroy it fairly fast. Nowadays dams have long slopes. Waves run up these slopes, loosing all their energy, without doing damage to the dam.</p>
<p>How does that relate to people? Ever tried to convince the employees of a company to do anything by writing a single e-mail to all@yourcompany.com? Had any success? Probably not. If you wan&#8217;t to change behavior, you have to work on that change everywhere and all the time. With small but constant force. You need trainings, presentations, reviews, e-mails and the communication at the water cooler, until it slowly sinks in that the change is not just the weird idea of a single person, but the new company policy.</p>
<p><strong>If you build a channel water will run fast. Make sure this is really what you want</strong>. Rivers with a bed make a river easy to handle and predictable under normal conditions. But they are also considered cause of many floods, because the water of the river can&#8217;t escape the channel and rushes forward until it finds a weak spot.</p>
<p>Many process systems look very much like such a channel. They are build for everyday work, to make it as smooth and fast as possible. But what happens with your processes, when the environment changes? When you suddenly face twice as many customers? Or only half of the normal load? Or if a real big customer comes with very special wishes? Do all employees, when to look left and right of their daily routine, in order to find creative solutions to new problems? Do they understand why the processes are the way they are? They will need it in order to change their behavior without breaking the system.</p>
<p><strong>If you keep water from going one way, it will find another way</strong>. I see this ignored very often when it comes to prioritizing tasks. Some people seem to have the illusion that the simple fact of attaching a high priority to a task will make it happen fast. This results in task lists, where almost everything is high priority. Obviously this means some things are set on a high priority that really don&#8217;t belong there. So, what would water do? Imagine a flooded area, where you want to protect certain buildings with dams. Of course you could build a high dam around every single building. This will cost a lot of money and effort. And it will also reduce the space where the water can go, thus the water will rise higher, eventually flooding all the high dams. If you instead build only high dams around the really, really important stuff, medium dams around the important stuff and small dams around the not so important stuff, stuff will get wet, but the really important stuff will stay dray for much longer.</p>
<p><strong>A small rupture in a dam will get bigger &#8230; fast</strong>. This is really the old broken window thing. If things change in a way you don&#8217;t like, make this clear immediately. Otherwise after a short time, the new way will be the accepted way.</p>
<p>All the analogy considered the water (people) as an enemy, which is really a stupid thing to do. <strong>Water is tremendously important</strong>, so are people. If your let run water as it wish, it builds beautiful rivers, finding its way to the sea without any help. And if you really want to change its path without constant watching, monitoring and dam building, <strong>make the new path the easy one</strong>. Want your developers to properly use a version control system? Make sure it fits <strong>their</strong> needs. This means: It must be easy to obtain a repository for a new project. It must integrate with the IDE. It must be cool, at least to an extent that other people at a conference don&#8217;t laugh at you or worse pitty you when you mention it.  Do you want every issue to be tracked in a issue tracking system? Make it easier to use for <strong>them</strong> then the alternative (Excel, Notepad &#8230;). Sure all the 100 little details, that some systems can track might be interesting for management, but they won&#8217;t help you if the user only add issues when they absolutely have to.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/10/11/people-like-water/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Do we need an Agile Maturity Model?</title>
		<link>http://blog.schauderhaft.de/2009/09/06/do-we-need-an-agile-maturity-model/</link>
		<comments>http://blog.schauderhaft.de/2009/09/06/do-we-need-an-agile-maturity-model/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 09:20:53 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Quality Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[APMM]]></category>
		<category><![CDATA[cmmi]]></category>
		<category><![CDATA[ISO]]></category>
		<category><![CDATA[Maturity]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[Scott Ambler]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[SPICE]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=167</guid>
		<description><![CDATA[In a post on developer works Scott Ambler proposes a &#8220;Agile Process Maturity Model&#8221; (APMM), if you are asking &#8220;WTF is that supposed to be?&#8221; Scott tries to answer that in his first sentence: The goal of the Agile Process Maturity Model (APMM) is to provide a framework which provides context for the plethora of [...]]]></description>
			<content:encoded><![CDATA[<p>In a post on developer works Scott Ambler proposes a <a href="http://www.ibm.com/developerworks/blogs/page/ambler?entry=apmm_overview">&#8220;Agile Process Maturity Model&#8221; (APMM)</a>, if you are asking &#8220;WTF is that supposed to be?&#8221; Scott tries to answer that in his first sentence:</p>
<blockquote><p>The goal of the Agile Process Maturity Model (APMM) is to provide a framework which provides context for the plethora of agile methodologies and practices out there today.</p></blockquote>
<p>First I was quite impressed by the BWPS ratio (Buzz Word Per Sentence). I count 6 (counting &#8220;Agile Process Maturity Model (APMM)&#8221; as one). But then I realized that this is what I would highly welcome: Context for Agile Methods. If this means we get an overview of all the process that you need if you do software development and then markers in this process landscape to indicate various Agile Methods to help with this process, that for sure would be helpful. But how would this be a &#8216;Maturity Model&#8217;?</p>
<p>So once again I had no choice but to read the complete article, including the comments. I must say, I was disappointed. What follows is basically a ranking of agile process, methodologies or what ever you want to call these. Such a ranking explains the &#8216;Maturity Model&#8217; part, but it completely voids the agile part. What value can a ranking of processes have in a context where the common understanding is that processes aren&#8217;t that important anyway?</p>
<p>So my clear opinion is: No thanks we don&#8217;t need another maturity model, the existing once are causing enough problems. I know some of my coworkers are reading this blog and are by now probably thinking: &#8220;Interesting opinion for the quality manager of our company&#8221;. So let me explain why I think ISO 9001, SPICE, CMMI &amp; Co are often doing more harm then good.</p>
<p>The problem is the same as with <a href="/2009/02/06/how-to-use-key-figures-and-how-not-to-use-key-figures/">any kind of measurement</a>: If you measure people or they work, they start to optimize for the measurement. For example if you start to measure code coverage and declare high coverage to be good, people will create automated tests for code that gets created automatically, although in most cases these kind of tests are of very limited use. With all the quality norms the auditors look for proofs that a certain aspect of a process gets executed as intended. This is really difficult to do, expect for the cases where documentation is created. But documentation created only for some audit is actually the exact kind of thing you don&#8217;t want to have. It costs money, gets outdated fast after the audit and has no benefit for your project, your company or the customer.</p>
<p>How to avoid this pitfall is a topic for a different post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/09/06/do-we-need-an-agile-maturity-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging Software</title>
		<link>http://blog.schauderhaft.de/2009/07/18/debugging-software/</link>
		<comments>http://blog.schauderhaft.de/2009/07/18/debugging-software/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 05:21:43 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[reading]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=172</guid>
		<description><![CDATA[Debugging is said to take about just as much time as coding, possibly even longer. Yet I don&#8217;t see a discussion about how to debug. So lets propose my personal process on this: Gather information. Make sure you have reliable information about Which application has a problem What are the steps to reproduce the problem [...]]]></description>
			<content:encoded><![CDATA[<p>Debugging is said to take about just as much time as coding, possibly even longer. Yet I don&#8217;t see a discussion about how to debug. So lets propose my personal process on this:</p>
<ol>
<li><strong>Gather information</strong>. Make sure you have reliable information about
<ul>
<li>Which application has a problem</li>
<li>What are the steps to reproduce the problem</li>
<li>The version of the application</li>
<li>Does it happen only to specific users, specific machines or to everyone everywhere</li>
<li>When did the problem start to happen</li>
</ul>
<p>The important part is the <strong>reliable</strong> part. Users are known to have a completely different perspective on applications. I had users swearing there was only one message box although there where two (they didn&#8217;t understand the content of the second, but it was the information needed by the developer). The last point is a difficult one. In many cases you will hear things like &#8220;Oh it just started today. Everything was fine the last two months&#8221; Just to find out, nobody had used that feature before. Probably the best source of information is a clean logging trail.</li>
<li><strong>Give a first estimate</strong>. Yes, that early. Most of the reasonable users are pretty happy with something like: I give you an update in half an hour. They might not be just as happy with: &#8220;I think I can look into this next month&#8221;  but if this is the case it is at least fair to let them know. If the problem is urgent and the resolution time is long a workaround might be needed. Check your estimate every now and then. If you realize that you can&#8217;t deliver on your estimate for whatever reason, let the user know.</li>
<li> <strong>Make sure the bug is a bug</strong> and not a butterfly. Although users sometimes have a different oppinion: Software can&#8217;t do what they wish. It can only do what they say. So many times the behavior now classified as a bug was considered a feature when it was specified. If this is the case let the user know, give him a reason why it is specified this way, and inform him about the chances to change it.</li>
<li><strong>Reproduce the problem</strong>. If possible reproduce it on your machine.</li>
<li><strong>Simplify</strong> and <strong>automate</strong>. Often the procedure to reproduce a problem is long, but often some steps aren&#8217;t necessary. By finding these step you&#8217;ll gather information about what influences the problem and what not. If possible you should automate the reproduction of the problem using a test case. With a serious bug you will execute the steps for reproducing the problem a lot. If this takes 2 minutes, spending 2 hours reproducing the problem with a testcase might easily payoff before the bug is fixed. But even if it doesn&#8217;t pay off immediatly you will have another test case in your Test Suite.</li>
<li>Now we finally start working on the buggy code. <strong>Find the place where the state of the application is not the way it is intended to be</strong>. Often this will be just before a NullPointerException is thrown, but it might be a line, where an event should get fired but doesn&#8217;t, or where the variable <tt>Pi</tt> is supposed to be equal to 4 but actually holds the value 2. Add debugging output to show the problem.</li>
<li><strong>Find a place</strong> shortly before the point found in step 6 <strong>where everything is ok</strong>. Add debugging output to show the absence of the problem.</li>
<li><strong>Find a place between</strong> the spots identified in step 6 and 7. Check if the problem is present at that spot. Document it with a debugging statement.</li>
<li><strong>Repeat</strong> from beginning from step 6 until you find the actual faulty line in the application.</li>
<li><strong>Fix it</strong>.</li>
<li><strong>Test it</strong> (should be easy with the automated test from step 5).</li>
<li><strong>Let the user know</strong> when she will receive the new version.</li>
</ol>
<p>Every process should have a tayloring advice to accompany it. So here it comes: You may not short cut the fixing, testing and communication part with the customer. You may use some short cuts in steps 6 through 9. But be prepared to return to the clean process when the shortcut turns out to be a cul de sac.</p>
<p>You may use your debugger instead of debugging output, but in the complex cases debugging output is easier and faster to use, especially if you have an automated test.</p>
<p>There are special cases that need some consideration, but those have to wait for a future post: Finding suitable starting points in step  6 and 7; Debugging in a distributed environment; Debugging with 3rd party software; reading stack traces.</p>
<p>What process do you use when debugging? What is missing? Let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/07/18/debugging-software/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

