<?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; software development</title>
	<atom:link href="http://blog.schauderhaft.de/tag/software-development/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>8 Reasons why the Estimates are too low</title>
		<link>http://blog.schauderhaft.de/2010/01/17/reason-estimate-low/</link>
		<comments>http://blog.schauderhaft.de/2010/01/17/reason-estimate-low/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 12:50:51 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[estimate]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=376</guid>
		<description><![CDATA[One of the most difficult tasks in a software development project is estimating the size of the project. Unfortunatly very often  you have to do it at the very beginning of a project, when you have the least information. The result at the end is very often a large difference between the original estimate and [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_378" class="wp-caption alignleft" style="width: 210px"><a href="http://www.sxc.hu/photo/950850"><img class="size-medium wp-image-378" title="950850_27101514" src="http://blog.schauderhaft.de/wp-content/uploads/2010/01/950850_27101514-200x300.jpg" alt="Hourglass" width="200" height="300" /></a><p class="wp-caption-text">Hourglass</p></div>
<p>One of the most difficult tasks in a software development project is estimating the size of the project. Unfortunatly very often  you have to do it at the very beginning of a project, when you have the least information. The result at the end is very often a large difference between the original estimate and the actual time and money needed.</p>
<p>If the difference is positive as often as it is negative this is kind of OK. But in some teams estimates are too low almost all the time! The obvious strategy often employed is to add a certain percentage to the estimate. But of course that is just fixing the symptoms, because most of the  time nobody knows the reason. So in this article I am going to show a couple of possible reasons for bad estimates, how to identify these and also a possible fix.</p>
<p>These are the kinds of reasons I identified so far:</p>
<p><strong>Super Hero Estimates</strong>: Often estimates are done by a very experienced developer (Super Hero). When they estimate a task they imagine themselves doing it. But while the esimate might be correct for the Super Hero in the project more average developers work on the task. And since they aren&#8217;t Super Heros they need longer.</p>
<p>You can identify this kind of situation by letting different people do the estimates. Including average developers. If the estimate of the Super Hero is constantly below that of the others, the fix becomes obvious: Use the estimate of the other developers. Don&#8217;t exclude the Super Hero from estimating though. Experienced developers a good at identifying things others tend to forget.</p>
<p><strong>Wrong Team</strong>: This one is similar to the Super Hero Estimate, in that the estimate is correct for a team of good (possibly excellent) developers. It differs though, because in this scenario, this is the actual team that should do the project. But for one reason or the other the project gets staffed with a different team. Maybe developers that aren&#8217;t that good. Or maybe just a team that doesn&#8217;t no the domain, the framework or the programming language that well.</p>
<p>In order to identify this situation, talk to the people doing the estimates. Let them specifiy the assumption they had in mind when they made the estimate, and compare it to what actually happend in the project.</p>
<p>If this is actually the problem you have two choices: The first is: stop switching teams. This doesn&#8217;t work most of the time, since you don&#8217;t switch them just for fun, right? So you are stuck with the second option: Even when you plan to use your top team, make the estimates on the assumption that an average team will do the job. Be honest to yourself about what an average team is.</p>
<p><strong>Guessing in the dark</strong>: Often the information available about the project at hand is just not sufficient for a reliable estimate. There is only a vague description available.</p>
<p>In order to identify this as the underlying problem, break the project down into tasks, which you estimate. For each task put down the assumptions you are making: what technology are you using, how complex is the logic to implement. During the project check if your assumptions hold or if there are a lot of changes. This is also most of the solution to the problem. Make the description of your assumption part of your estimate. If the assumptions are wrong, the customer may correct those, resulting in a new more reliable estimate. I he changes his mind later on, you have a clean basis for a change management process, which ensures, that changes are possible, but that the one requesting the change is also paying for it.</p>
<p><strong>Forgetting stuff</strong>: This one looks very similiar to the previous. Stuff doesn&#8217;t get included in the estimate. But this time it&#8217;s not because the people doing the estimate don&#8217;t know about it, but because they forget about it.</p>
<p>Using the same strategy as for Guessing in the dark should make this kind of mistake obvious. As a remidy, let multiple people do estimates, and compare the results. You should do this based on the broken down tasks, so missing tasks in the different estimates become obvious.</p>
<p><strong>Ball of Mud Projects</strong>: When projects base on a specific code base take too long each and every time, a reason might be that tasks keep getting more complex then anticipated. A typical reason for that would be an overly complex and convoluted code base, where nobody really can predict the effects a given code change may have.</p>
<p>In such a project I&#8217;d expect a lot 80% syndrome, few test and many swearing developers. Do a code analysis of the code base, with a concentration on architecture and dependency management. If you find a lot of crap, there is just one solution: Clean it up and pay your technical debt. I.e. invest time and money to improve the architecture. I also recommend implementing tests, that prevent the architecture from starting to rot again.</p>
<p><strong>Multitasking</strong>: People are bad at multi tasking. So you can&#8217;t put your top developer for 20% in five different projects and expect her to work just as efficient as normal. Once you start thinking about it, it should be really obvious if you have the problem or not. And the same should be true for the solution.</p>
<p><strong>Mythical Man Month</strong>: Conceptional very similar is the Mythical Man Month effect. Check if your estimates get processed like this: &#8220;Frank says he would need 6 months. We need to get done within 1 month, so let&#8217;s put 6 developers in the project.&#8221; If this is the case you are missing on all the overhead that a bigger team causes. In order to get a handle on that kind of problem read the book <a href="http://www.amazon.com/gp/product/0201835959?ie=UTF8&amp;tag=schauderhaft-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201835959">Mythical Man Month</a>. I do think that book is overrated, but the chapter about the actual mythical man month is right to the point.</p>
<p>This problem is almost guaranteed to hit you when you do a project that is a magnitude larger then your normal project. You will underestimate by a large amount, if you do not factor in the exponential behaviour of communication over head.</p>
<p><strong>Lazy Developer</strong>: Of course there is always the possibility that the developers just aren&#8217;t working hard enough. In my experience, most of the time, this isn&#8217;t a problem. But I guess is it does happen. Symptoms could be lots of open browser tabs, on sites that have no relation to the work at hand, acompanied by hectic wiondow/tab switching, when the boss drops by. If this is a problem with one developer, it might be that the developer has the power to change it. But if many developers spend their time procrastinating it is most probably a management problem. Procrastination is not fun. Getting stuff done is. So if everybody is procrastinating something in the environment is probably highly demotivating. Find out what it is and get it out of the way.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2010/01/17/reason-estimate-low/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Developing for Maintainability</title>
		<link>http://blog.schauderhaft.de/2009/12/20/developing-for-maintainability/</link>
		<comments>http://blog.schauderhaft.de/2009/12/20/developing-for-maintainability/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 10:03:30 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[maintainability]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=354</guid>
		<description><![CDATA[Just as Supportability, Maintainability is one of these Non Functional Requirements, that is or should be required from every software development project. So what does that mean? Wikipedia defines it as the ease with which a software product can be modified in order to: correct defects meet new requirements make future maintenance easier, or cope [...]]]></description>
			<content:encoded><![CDATA[<p>Just as <a href="/2009/12/13/developing-for-supportability/">Supportability</a>, Maintainability is one of these Non Functional Requirements, that is or should be required from every software development project. So what does that mean? Wikipedia defines it as</p>
<blockquote><p>the ease with which a software product can be modified in order to:</p>
<ul>
<li>correct defects</li>
<li>meet new requirements</li>
<li>make future maintenance easier, or</li>
<li>cope with a changed environment;</li>
</ul>
</blockquote>
<p>Wow, that&#8217;s great. Because it lends itself for an &#8216;easy&#8217; test for maintainability. Take the completed product, make up some new requirements and measure how long it takes to implement those. If you do this with different products for same task, you can compare the time needed, thus comparing maintainability. Unfortunately most of the time, the requirement is stated before any software is written. And only one piece of software gets written, so there is nothing to compare to. So what to do?</p>
<p>Since one can&#8217;t realistically measure maintainability we once more should concentrate on characteristics making software easier to maintain, i.e. easier to change. There are plenty of measures around that are thought to be linked to maintainability. Cyclomatic Complexity being possibly the best known. I personally prefer <a href="http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/">toxicity</a>, which is based on Cyclomatic Complexity and a couple of other measures, which contribute to the toxicity with the amount they are above a certain threshold:</p>
<blockquote>
<table border="0" cellpadding="2">
<tbody>
<tr>
<th>Metric</th>
<th>Level</th>
<th>Threshold</th>
</tr>
<tr>
<td>File Length</td>
<td>file</td>
<td>500</td>
</tr>
<tr>
<td>Class Fan-Out Complexity</td>
<td>class</td>
<td>30</td>
</tr>
<tr>
<td>Class Data Abstraction Coupling</td>
<td>class</td>
<td>10</td>
</tr>
<tr>
<td>Anon Inner Length</td>
<td>inner class</td>
<td>35</td>
</tr>
<tr>
<td>Method Length</td>
<td>method</td>
<td>30</td>
</tr>
<tr>
<td>Parameter Number</td>
<td>method</td>
<td>6</td>
</tr>
<tr>
<td>Cyclomatic Complexity</td>
<td>method</td>
<td>10</td>
</tr>
<tr>
<td>Nested If Depth</td>
<td>statement</td>
<td>3</td>
</tr>
<tr>
<td>Nested Try Depth</td>
<td>statement</td>
<td>2</td>
</tr>
<tr>
<td>Boolean Expression Complexity</td>
<td>statement</td>
<td>3</td>
</tr>
<tr>
<td>Missing Switch Default</td>
<td>statement</td>
<td>1</td>
</tr>
</tbody>
</table>
</blockquote>
<p>Compared to a single simple measure, this has the benefit of being less prone to optimization for the measurement, although of course this is still possible.</p>
<p>So does a low, even zero toxicity guarantee maintainable code? Hell no. For starters there are a couple of different things to consider:</p>
<ul>
<li>Is the code well covered with tests?</li>
<li>Are the current requirements specified in a suitable manner (e.g. using tests)?</li>
<li>Is the code written in a consistent style</li>
<li>Is all the code including the documentation under control of a version control system?</li>
<li>Is the structure of the application, its architecture defined and documented?</li>
<li>Is there an automatic process for building new versions of the software (i.e. ant, maven, make scripts or similar)?</li>
<li>Is the code written in a language that is well known and understood and which has a large user community?</li>
</ul>
<p>Everything but the last bullet point is pretty much identical with what I consider <a href="/2009/11/01/are-you-a-software-developer-or-a-dabbler/">base practices for any serious software developer</a>.</p>
<p>So I propose: The next time you encounter the vague requirement of maintainability, replace itybe useful and well testable requirements, based on specific practices and metrics. It still won&#8217;t guarantee maintainability. But it will increase the chance for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/12/20/developing-for-maintainability/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Developing for Supportability</title>
		<link>http://blog.schauderhaft.de/2009/12/13/developing-for-supportability/</link>
		<comments>http://blog.schauderhaft.de/2009/12/13/developing-for-supportability/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 08:42:17 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[supportability]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=347</guid>
		<description><![CDATA[When reading the specification of a piece of software to be written, you are bound to find some non functional requirements. Among these there will be, or at least should be Supportability. But what the heck does that mean? How do you install supportability? Let me present some ideas, what you can do to improve [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_349" class="wp-caption alignleft" style="width: 235px"><a href="http://www.sxc.hu/photo/830816"><img class="size-medium wp-image-349" title="830816_70304776" src="http://blog.schauderhaft.de/wp-content/uploads/2009/12/830816_70304776-225x300.jpg" alt="Support beams and wires of  a bridge" width="225" height="300" /></a><p class="wp-caption-text">Support beams and wires of  a bridge</p></div>
<p>When reading the specification of a piece of software to be written, you are bound to find some non functional requirements. Among these there will be, or at least should be <a href="http://en.wikipedia.org/wiki/Serviceability_%28computer%29">Supportability</a>. But what the heck does that mean? How do you install supportability? Let me present some ideas, what you can do to improve supportability.</p>
<p>Let your application <strong><a href="/2009/09/16/good-logging-practices/">log in a well defined reliable way</a></strong>, to a location that is easily accessible. Flatfiles on a server qualify. If you must log on a client, consider implementing a way to automatically transfer the log file to a support person. If you log into a database, make sure the support person can access it easily.</p>
<p><strong>Make your application easy to shut down and start</strong>. This sounds trivial, but it is easy to break this ability. Considere the following check list:</p>
<ul>
<li>What happens when you start two different versions of your application against the same database? A nicely supportable application should notice this and react accordingly.</li>
<li>What happens when you stop your application while it is processing a request?</li>
<li>If you have batches or batchlike processes, what will happen with those when you try to stop your application while the batch runs? Do you have the 5hours, until the batch finishes? Or will the batch stop and rollback, so you have to wait an hour for the rollback to happen? Or will it stop nicely within a minute, and pick up its work automatically after restart?</li>
<li>Are you stuffing stuff into a database or a queue? What happens when the queue or the database gets started after the application?</li>
<li>Do you receive messages from a queue? What happens when the first message arrives, before your application is available? What does happen when you receive a message that you already processed? What does happen when you receive a message for which you already processed a later message?</li>
<li>How long does it take to shutdown and restart an instance of your application when it is under full load? If this takes more then a few minutes, is it possible to stop and restart only parts of your application?</li>
</ul>
<p><strong>Make the </strong><strong>state of your application </strong>visible for support personnel. Most applications just report arbitrary errors when a component of the system is down. It&#8217;s up to the supporters to guess if it is the database, a queue, a webservice or the application itself which is causing the problem. Identify the resources your application depend on. Write a check which tests all these resources, and make this check available, for example as a special health check webpage.</p>
<p><strong>Put components that are likely to fail behind some kind of buffer.</strong> Your database might be so important for the application that this doesn&#8217;t work for it. But if you are posting stuff to a queue (or webservice or &#8230;), consider using a local queue as a buffer, so your application can work as usual even when the target queue isn&#8217;t available.</p>
<p>Last but not least: <strong>Document your application</strong>. The agile manifest says that working software is more important then documentation. It doesn&#8217;t say you don&#8217;t need documentation. And I&#8217;d say the documentation for servicing your application might be the most important one. The normal user who uses your application everyday will figure out a way to get along. If not he will call you or your boss. But the poor support person has to support dozens of the applications and since your application just works he&#8217;ll encounter it only a few times a year. He will know nothing about it except the stuff documented in the manual. So make sure there are instructions on how to interpret the logs, how to shutdown and restart the application, how to analyze the internal state of the application and what happens when some connected component fails.</p>
<p>Have you noticed something? The vague non functional requirement &#8216;supportability&#8217; turned into a nice set of very functional requirements. You can attach a price to that, decide what pieces of it you&#8217;ll really need and measure if it really works. And I claim this works with all the much hated non functional requirements.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/12/13/developing-for-supportability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Software Development is like the  Evolution of Life</title>
		<link>http://blog.schauderhaft.de/2009/11/22/software-development-like-evolution-life/</link>
		<comments>http://blog.schauderhaft.de/2009/11/22/software-development-like-evolution-life/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 07:36:57 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[evolution]]></category>
		<category><![CDATA[metaphor]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=324</guid>
		<description><![CDATA[Software development has been compared to many things. I&#8217;d like to propose another comparison: Evolution. Why another metaphor? A metaphor enables you to think about a problem in a different way, thus possibly gaining new insight. It is also useful for explaining something to someone who otherwise wouldn&#8217;t understand what you are talking about. Or [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_333" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sxc.hu/photo/348329"><img class="size-medium wp-image-333" title="348329_7573" src="http://blog.schauderhaft.de/wp-content/uploads/2009/11/348329_7573-300x200.jpg" alt="Evolution" width="300" height="200" /></a><p class="wp-caption-text">Evolution</p></div>
<p>Software development has been compared to many things. I&#8217;d like to propose another comparison: Evolution.</p>
<p>Why another metaphor?</p>
<p>A metaphor enables you to think about a problem in a different way, thus possibly gaining new insight. It is also useful for explaining something to someone who otherwise wouldn&#8217;t understand what you are talking about. Or to use software development wording: It is an abstraction.</p>
<p>Why evolution?</p>
<p>The ideas of evolution are well known and considered valid in the <a href="http://en.wikipedia.org/wiki/Science_theory">scientific sense</a>. It is also area of abundant scientific work, which actually might be useful in the context of software development. Compare this to other metaphors like <a href="http://www.codinghorror.com/blog/archives/000987.html">gardening</a> and <a href="http://geekswithblogs.net/twickers/archive/2008/03/31/120888.aspx">crafting</a>.</p>
<p>And of course I think it fits.</p>
<p>Let&#8217;s start in the beginning. A new software development project starts with ideas. Ideas about what the software will be able to do, ideas about all the features it will have and ideas about in which way the software will be implemented. But on their own these ideas are nothing. The moment you stop thinking about them they cease to exist. If you don&#8217;t push the ideas forward, nobody else will.</p>
<p>This is similar to the <a href="http://en.wikipedia.org/wiki/Primordial_sea#.22Primordial_soup.22_theory">primordial soup</a>. In which many pieces, i.e. molecules needed for life existed. But these molecules couldn&#8217;t yet reproduce themselves. And many of these molecules fell apart before finally some where &#8216;lucky&#8217; enough to form droplets which met the requirements of the definition of life, although they where so extremely primitive, they can hardly be compared with our ideas of life. Consider the description <a href="http://en.wikipedia.org/wiki/Primordial_sea#.22Primordial_soup.22_theory">wikipedia gives</a>.</p>
<blockquote><p>These would combine in ever-more complex fashions until they formed coacervate droplets. These droplets would &#8220;grow&#8221; by fusion with other droplets, and &#8220;reproduce&#8221; through fission into daughter droplets, and so have a primitive metabolism</p></blockquote>
<p>This could only happen because they existed in a suitable environment: They had enough energy (from the sun and vulcanism) but not so hot that everything was boiled immediately. All the needed materials where there suspended in water, so they could interact easily often and fast.</p>
<p>Compare that to your ideas of the next software project. Maybe you don&#8217;t have the energy to drive your idea forward. Maybe you don&#8217;t have the right partners to work with, maybe you don&#8217;t have the necessary tools. All these might be reasons a software project dies, before its first steps. But if you manage to bring your ideas into a suitable environment, you&#8217;ll be able to create a first prototype, a sketch, of what your product will be. This sketch is important. If you make it to complicated you won&#8217;t get there within this century, just as the dinosaurs weren&#8217;t created directly from the primordial soup.</p>
<p>Once you have this first prototype, things get really interesting. Again you need the suitable environment. But if you have that, features will get added to your application, and it will grow, both in size and in complexity. This in itself will create new ideas for features. Sometimes these features will be added to your piece of software, but sometimes they will form into an independent software project. While your project moves a long and gathers features and complexity, it will move with different speed. Sometimes features will get added on a daily bases. Sometimes you will be busy cleaning up stuff, doing small tuning for days in a row, with hardly any new features, and sometimes you (hopefully) will decide, that a cluster of features really does not help the application, and throw it from your code base.</p>
<p>Again the similarities to evolution are abundant. Life sure grew in size and complexity. And many kind of life could only appear because other forms of life where already there: Almost all animals need oxygen, which only exists in the atmosphere because of plants. Carnivores would get extinct pretty fast if there weren&#8217;t other animals for food. Similar things are true for parasites. Evolution also <a href="http://en.wikipedia.org/wiki/Cambrian_explosion">doesn&#8217;t proceed with a steady pace</a>. There where times, when new species evolved extremely fast, and of course we all know about the extinction of dinosaurs, which is only one case of many cases where nature decided to drop a couple of features.</p>
<p>I hope you enjoyed my comparison so far. But I claimed, that metaphors like this are actually useful. So let&#8217;s see, what we can get out of this one:</p>
<ol>
<li>The environment is important. There is no life on Venus, because it is to hot. There is most probably no life on Pluto, because it is to cold, and there is hardly any life if at all on mars, because it is to dry (among other things). I&#8217;d say the same is true for software development. You need a good (integrated development) environment, office, coworkers and boss, to develop great software.</li>
<li>If you want to create something really great, a detailed plan is only useful if you are a god who can control everything, and event that is disputed.</li>
<li>You can&#8217;t expect to control a software development project by changing one aspect of the environment. If you have fish, and want evolve them into animals living on land, drying up the oceans will kill the fish, but not create mammals. But making land available for testing, getting plants there for food, and convincing some of the fishes, that they will be safe from sea-born predators on land will eventually convince some of them to develop lungs. This will take time and constant pushing.</li>
<li>Simpler is better. Humans seem to think they own the world. The opposite is true. There are many more species, individuals and kilograms of bacteria then humans. Same is true for ants.</li>
<li>How ever careful you engineer the environment, sometimes accidents like the human species just happen. In these cases starting over might be your only option.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/11/22/software-development-like-evolution-life/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Are You a Software Developer or a Dabbler</title>
		<link>http://blog.schauderhaft.de/2009/11/01/are-you-a-software-developer-or-a-dabbler/</link>
		<comments>http://blog.schauderhaft.de/2009/11/01/are-you-a-software-developer-or-a-dabbler/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 08:38:23 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[dabbler]]></category>
		<category><![CDATA[good practice]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[solid software]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[version control system]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=307</guid>
		<description><![CDATA[When reading blogs you get the impression, that everybody works in high end environments, using the latest greatest distributed version control system. Writing tons of tests, before they even dream about writing actual code and of course the tests a executed by the continuous integration system after every commit, which happens about 30 times per [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_308" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sxc.hu/photo/289526"><img class="size-medium wp-image-308" title="289526_6178" src="http://blog.schauderhaft.de/wp-content/uploads/2009/10/289526_6178-300x225.jpg" alt="Tools" width="300" height="225" /></a><p class="wp-caption-text">Tools</p></div>
<p>When reading blogs you get the impression, that everybody works in high end environments, using the latest greatest distributed version control system. Writing tons of tests, before they even dream about writing actual code and of course the tests a executed by the continuous integration system after every commit, which happens about 30 times per day and developer. But when I look around in the real world, this is not <a href="/2009/09/20/your-perspective-is-biased/">what I see</a>. Instead the way people work on their code like ancient &#8216;doctors&#8217;. Drilling holes in heads in the hope it will reduce the headache of the patient. It probably did. In many cases in a very final way. I urge you: Don&#8217;t let that happen to your code (or your career). Practice solid software development. And in order to help you with that I compiled a simple list of things you really really should do. Those are basic practices. If you don&#8217;t even adhere to those then I have only two possible explanations: You are not involved in software development at all. Go away, this blog isn&#8217;t for you. Or &#8230; you are a dabbler.</p>
<ul>
<li>Use a Version Control System (VCS). I am not even going to comment on this one.</li>
<li>Commit your changes at least once a day. This does not mean you should commit what ever is on your filesystem at 5pm, but you should break your tasks in so small pieces, that you finish one or two of them on a normal day.</li>
<li>Tag or label everything in the VCS you hand out to somebody outside your team (testers, salespersons and of course customers)</li>
<li>Have a complete and working build script. This means you can build everything you hand of to the customer by getting the source code out of the VCS and start the script. Necessary adjustments are made in a tiny file which contains settings for the local machine. A well commented template for such a file is in the VCS. And NO, hitting the compile button in your IDE is not the same as a build script.</li>
<li>You must have the complete environment necessary to run your application under your control. That means if your application needs a database, you have a database available. One per developer that is, or at least one schema per developer. If you need a queue or ten queues, you have those, again once for every developer. If you have systems that you interface to, that can&#8217;t be installed once per developer, you have mocks, stubs or similar available. In the year 2009 a single developer database for 5 developers is no longer acceptable.</li>
<li>You have an extensive set of automatic Unit tests. These test should cover at the minimum the main execution paths.</li>
<li>Let a Continuous Integration system execute your build script, i.e it compiles your code, executes the automatic tests and builds a setup or jar, or what ever you are deploying.</li>
<li>Have a specification of what a piece of software is supposed to do, before you try to write the software. You don&#8217;t need a full specification of the complete application upfront. Maybe you have just the first user story for the first feature, or only a test. But you must have something that tells you where to go. And where not to go. Flying blindfolded is not the same as being agile.</li>
<li>Adhere to a style guide that describes your naming conventions, indenting and so on. Ideally this gets enforced by the IDE and automatic tests. Fighting about the content of such code conventions is useless. Not having one is dumb. Remember that your tests are code too, so the conventions apply to tests as well.</li>
<li>Document how your code is structured. It should at least describe the different layers, and the way two layers may depend on each other, and it should not allow for circular dependencies. These rules as well should be enforced by automatic tests. Even if the language you use doesn&#8217;t support packages you should use a similar concept, possibly through naming conventions.</li>
</ul>
<p>These are my points. What did I miss?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/11/01/are-you-a-software-developer-or-a-dabbler/feed/</wfw:commentRss>
		<slash:comments>9</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>Why Aircraft Carriers are not Agile</title>
		<link>http://blog.schauderhaft.de/2009/08/23/why-aircraft-carriers-are-not-agile/</link>
		<comments>http://blog.schauderhaft.de/2009/08/23/why-aircraft-carriers-are-not-agile/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 19:02:09 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[waterfall]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=192</guid>
		<description><![CDATA[Itay Maman tries to answer the question posed in the title: Why aircraft carriers are not built using an agile methodology? And my answer is this: Because the engineers can know up front that it will float That&#8217;s it. That&#8217;s the answer. That&#8217;s the point I am making. I think the question is a good [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_199" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-199" title="aircraft_carrier" src="http://blog.schauderhaft.de/wp-content/uploads/2009/08/472707_23563677-300x196.jpg" alt="Aircraft Carrier" width="300" height="196" /><p class="wp-caption-text">Aircraft Carrier</p></div>
<p>Itay Maman tries to answer the question posed in the title:</p>
<blockquote>
<div style="font-style: italic;"><a href="http://javadots.blogspot.com/2009/08/why-aircraft-carriers-are-not-agile.html">Why aircraft carriers are not built using an agile methodology</a>?</div>
<p>And my answer is this:<br />
<span style="font-style: italic;">Because the engineers can know up front that it will float</span></p>
<p>That&#8217;s it. That&#8217;s the answer. That&#8217;s the point I am making.</p></blockquote>
<p>I think the question is a good one, yet I do not agree on the answer. The mistake Itay makes is to reduce the task of building an aircraft carrier to the question: &#8220;Does it float?&#8221;</p>
<p>I haven&#8217;t been in any kind of military service. I have never been on an aircraft carrier (with the exception of a real cool flightsimulator with a real fighter cockpit). But I&#8217;d think the requirements for an aircraft carrier are rather complex. It should float. It should be difficult to hit with rockets or similiar, it should withstand hits with any kind of projectile, it should carry aircrafts and enable them to start and land. And of course it should allow the many women and man needed for the operation to live on the ship. You can&#8217;t calculate this from the plans. And I am pretty sure that every single aircraft carrier is full of signs of improvisation where things didn&#8217;t work as planned.</p>
<p>On the other hand: proving algorithms in enterprise software is just as doable as calculating if an aircraft carrier floats. The referenced proof that one can&#8217;t write a program that predicts for every program if it stops after finite time is next to irrelevant. Because for the typical applications this question is answered rather easily (ignoring bugs). For a desktop application it&#8217;s simply: It does stop exactly iff anybody clicks on the close icon.</p>
<p>One of the comments hints in the right direction:</p>
<blockquote><p>Another reason that agile processes are not used in the construction of aircraft carriers is that people who sign the contract to purchase an aircraft carrier do not change the size and speed requirement after the ship has already been halfway completed. Nor do the bring back a ship that has already been delivered and say, &#8220;We need you to make the deck ten feet longer.&#8221;</p></blockquote>
<p>But I&#8217;d expect these questions to be rather typical: &#8220;Oh we have this new fighter, it needs a longer deck. Can you make it?&#8221; And the people building aircraft carriers will try to do it or at least make a proposal on how to fix the problem. Actually this is the same problem Architects have (the real ones with a capital A). Customer request last minute changes all the time in all businesses of the world.</p>
<p>So where is the difference between building Aircraft Carriers and Software?</p>
<p>The first difference is the <strong>cost attached to a change</strong>! The cost of a change consists of the following parts:</p>
<ol>
<li> Cost of removing what is already there.</li>
<li> Cost of adding what is supposed to be there in the new version.</li>
<li> Cost of testing, taking care of side effects.</li>
<li> Cost of not being able to use the subject of change during the change.</li>
</ol>
<p>Number 2 and 3 is more or less the same for aircraft carriers and software. But number 1 and 4 differ a lot. If you replace a piece of an aircraft carrier, you have to remove the original piece, it attached to the ship really well I&#8217;d guess. With software it is just hitting the delete button a couple of times. Also during the replacement work, your software is fully available (assuming you are not doing changes directly to a production database). Only when everything is done you have to deploy the software which might cause an outage for limited time. This is very different for aircraft carriers. You can&#8217;t start on a carrier, when engineers took that catapult out to replace it with a stronger one.</p>
<p>So one real difference between software development and building an aircraft carrier or any other industry producing real physical artifacts is the cost of change.</p>
<p>Once you realize that fact, the next revelation is: The grass is greener on our side! Aircraft Carrier Builder have to plan extremely detailed and carefully, because everybody involved knows: Changes are expensive. They just can&#8217;t make mistakes.</p>
<p>Very different for software developers: If we do something wrong the costs are only those attached for doing it the wrong way, which is rather cheap if you realize it immediately.</p>
<p>Therefore agile methods try to detect errors fast, by getting feedback from the customer as often and early as possible.The waterfall approach tries to prevent changes.</p>
<p>The second difference is in the <strong>process of automation:</strong> The software industry is the only industry that produces it&#8217;s own tools. If a developer finds herself in a need of  a certain kind of tool, she has everything available to write it herself. Especially if she finds herself doing things multiple times, it is very likely this job will get automated soon.</p>
<p>A welder working on an aircraft carrier can&#8217;t build a new version of welding equipment. She would need skills very different from the ones used in her day to day job.</p>
<p>How does this affect the choice between agile and not so agile processes? Simply put: in software development everything which is done twice gets automated. So most things we do we, do for the first time. Which in turn makes it hard to predict how long it will take. In an aircraft carrier, you can calculate how many km of welding you have to do, compare that to the time needed for a meter of welding and get a pretty good estimate for the full time needed. The effect gets even more extreme when you build two aircraft carriers. The time needed for the second one should be extremely close to the time needed for the first one. Very different in software: Ctrl-C Ctrl-V done.</p>
<p>So software projects are harder to predict, therefore an agile approach makes more sense, because you are doing a detailed planning only for a couple of days or weeks ahead.</p>
<p>The third and final reason for going agile with software projects, but not with aircraft carriers is: <strong>We are immature</strong>.  Well not the individuals, at least not each, but the industry as a whole. Depending on what exactly you consider a computer, the first one was build somewhere in the middle of the last century. Aircraft Carriers aren&#8217;t that much older, but ships, rockets, flying devices and all the pieces (except the computers and software) making up an aircraft carrier are way older. Which again makes estimating much more difficult.</p>
<p>So these im my point of view the differences between classical industries and the software industry. But what are the consequences? What should we do about it?</p>
<ol>
<li>Be happy that we are working in highly interesting, fast moving industry, that can fulfill customer wishes they couldn&#8217;t even dream about 20 years ago.</li>
<li>Realize that while change is cheap, it isn&#8217;t free.</li>
<li>While agile is the way to go for many projects it isn&#8217;t for every one. If you are building software medical appliances, space ships, airbags or aircraft carriers you should think twice before going down the agile road.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/08/23/why-aircraft-carriers-are-not-agile/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Where are the High Level Frameworks?</title>
		<link>http://blog.schauderhaft.de/2009/08/16/high-level-frameworks/</link>
		<comments>http://blog.schauderhaft.de/2009/08/16/high-level-frameworks/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 11:46:49 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[aop]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[paradigm]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=169</guid>
		<description><![CDATA[I became a java developer (and not a C developer for example) because java takes a lot of the pain away. I just love the garbage collector. Sure it can give you a hard time, but 99% memory is not an issue in the projects I am working on. The object oriented paradigm also made [...]]]></description>
			<content:encoded><![CDATA[<p>I became a java developer (and not a C developer for example) because java takes a lot of the pain away. I just love the garbage collector. Sure it can give you a hard time, but 99% memory is not an issue in the projects I am working on. The object oriented paradigm also made it way easier to write the big complex systems, enterprise applications seem to be these days. In this layers of abstraction we do loose a little performance, or actually a lot, but again: 99% of the time performance of java code is not an issue at all. Performance is controlled by network and database access.</p>
<p>So I should be pretty happy right? Well in the general sense actually I am, but as a developer, I have the feeling that I am operating on the wrong level of abstraction. A lot of the time I am working directly on the code level. Writing getters, setters, exception handling, logging. There are some areas, where the abstraction level moved considerable upwards in the last years. Persistence comes to the mind. Hibernate is pretty reasonable, although it has it&#8217;s problems, and it&#8217;s enemies. Another one might be rules engines, I haven&#8217;t tried those. But other then that &#8230;? Of course there has been progress. A lot of progress. We have hundreds of languages, many with very interesting features. We have a large choice of databases with innovative concepts to choose from, and of course a pletorea of java libraries for almost every purpose. We have IDEs so smart, I sometimes wonder if they are really just another piece of code. So what am I complaining about?</p>
<p>I think it is about time for the next paradigm shift. Why are we still coding objects? An example: I want to build the ubiquitous shopping system. I take a jar I found somewhere on the web to get started. Of course I have my own little idea, about how this thing should work, so I want to tweak the shopping cart a little. So what do I do?</p>
<pre>public class MyCart extends somebody.elses.Cart {
    public void setRealyCoolFeature() { ...</pre>
<p>But most of the time, this doesn&#8217;t work. Because the new attribute doesn&#8217;t get saved in the database. Or maybe it does, but the repository returns only Cart&#8217;s and not MyCart&#8217;s. The gui doesn&#8217;t show the new attribute, actually the gui of the component is for swing, but I want a web gui. No problem I can write that, but now I have tons of fireProperty noise in the code, that really nobody cares about. Of course it&#8217;s better than the other way round, because it is extremely tricky get fireProperty calls into a class without changing the source files.</p>
<p>Hold on a second I know what you are thinking: You fix that with a little AOP here, and this won&#8217;t be a problem if the component was cleanly designed in the first place. Agreed. But my point is: I want to use the concept of a shopping system. I don&#8217;t want to deal with technical detail like AOP, IoC and similar. Or from the perspective of the component provider: I want to code the concept of a shopping system, and I do not care, how the users want to store it, how they want to show it, and how they want to extend it. That is what I&#8217;d call a new paradigm.</p>
<p>Of course I am not the first calling for the next paradigm since OOP. Actually there are many alternatives out there on various levels: AOP, Functional Programming, Meta Programming on the very technical side. Business Process Modeling, Rule Engine, and Components pretend to operate on a higher level, but sometimes I get the feeling they&#8217;re just a glorified version of Basic. None of those come even close, to what I imagine. And I don&#8217;t even use drugs to get there. Still there might be a solution in sight. Imagine something along these lines:</p>
<p>If you write a component, you use a language that is much more expressive than java, possibly like groovy but two steps further and with a strong type checking (I&#8217;m a fan of strong type checking). In this language you specify the structure (the relationships) of you component. Using the equivalent of annotations on stereoids you specify things like transactional behavior, logging behavior, GUI representation, concurrency options, but on a very high abstraction level. For example for concurrency you don&#8217;t specify locks, latches and stuff like that, instead you specify data that is related and there for needs protection against concurrent access.</p>
<p>All this is not compiled into a single jar (or whatever we will call it), but actually ends up in separate ajars (Aspect Jars). So as a user, I can take the differnt pieces, and create a extension, specifying the various aspects  in the same way, thereby extending all the aspects I need to extend. This is possible, since the aspects are still separated, and not compiled in one big blob. And the original developer separated those, because it was the easiest thing to do.</p>
<p>The guy actually using the component, somebody else created, and extended be  me, uses the components in a high level DSL, that allows him to glue pieces together. For example he could specify which kind of order and invoice component should get created from the cart component. And although the three components come frome completely distinct developers, they would be joined automatically using domain information from the semantic internet. This joining would of course need some tweaking but it should give you a head start. I think this sounds extremely nice, doesn&#8217;t it?</p>
<p>Will it happen? Most certainly not. The description is to specific to fit whatever comes, yet way to vague for anybody to actually implement it. BUT I am pretty optimistic something along these lines will actually happen in the next 10 years. DSLs and AOP and new languages that allow Aspects to be written as easily as a for loop will be key players at it.</p>
<p>So if you are a genius with lots of time and a strong developer team at hand, get into contact with me to exchange ideas. If you just a stupid enterprise application developer as I am that needs a job for the next 30-40 years to come, get used to AOP, watch the new languages and don&#8217;t worry to much about concurrency.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/08/16/high-level-frameworks/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>
		<item>
		<title>Database Version Management &#8230; Again</title>
		<link>http://blog.schauderhaft.de/2009/02/26/database-testing-again/</link>
		<comments>http://blog.schauderhaft.de/2009/02/26/database-testing-again/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 22:38:18 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/2009/02/26/database-testing-again/</guid>
		<description><![CDATA[ Pramod Sadalage author of Refactoring Databases: Evolutionary Database Design forwarded an email to the agiledatabases group announcing a new database migration tool (note: the tool is NOT writen by Pramod): dbmaintain While I am glad that there are others worrying about the lack of basic software development tools in the database realm, I still think [...]]]></description>
			<content:encoded><![CDATA[<p> <a href="http://databaserefactoring.com/PramodSadalage.html">Pramod Sadalage</a> author of <a href="http://www.amazon.de/gp/product/0321293533?ie=UTF8&amp;tag=schauderhafte-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=0321293533">Refactoring Databases: Evolutionary Database Design</a><img src="http://www.assoc-amazon.de/e/ir?t=schauderhafte-21&amp;l=as2&amp;o=3&amp;a=0321293533" style="border: medium none  ! important; margin: 0px ! important" width="1" border="0" height="1" /> forwarded an email to the <a href="http://groups.yahoo.com/group/agileDatabases/">agiledatabases </a>group announcing a new database migration tool (note: the tool is NOT writen by Pramod): <a href="http://www.dbmaintain.org">dbmaintain</a></p>
<p>While I am glad that there are others worrying about the lack of basic software development tools in the database realm, I still think we are really missing to things.</p>
<p>First: all these tools are using small migrations, and manage those. I think this is like directly writing patch files and then using some tools to assemble class files from those. Why not maintain one file for creating the schema or the changes from one release to the next. It is much easier to maintain and the version control system will split it into changes if you need it.</p>
<p>Secondly: We now have <a href="http://code.google.com/p/dbmigrate/">dbmigrate</a>, <a href="http://migratedb.sourceforge.net/">migratedb</a>, <a href="http://www.liquibase.org/">liquibase</a>, <a href="http://www.dbmaintain.org">dbmaintain</a>, <a href="http://dbdeploy.com/">dbdeploy</a> but none seems to get real traction. Liquibase seems to be most active but even that doesn&#8217;t cause enough search traffic to show up on google trends and it is so horribly ridden with XML that I don&#8217;t even want to look at it.</p>
<p>We need a JUnit equivalent for database release management. We need somebody with some traction in the community to pick one of those tools and push it forward real hard. Pramod? Martin? Anybody? Please!<a href="http://dbdeploy.com/"><br />
</a></p>
<pre><a href="http://groups.yahoo.com/group/agileDatabases/" class="moz-txt-link-freetext">

</a></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/02/26/database-testing-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

