<?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>henko.net &#187; Process</title>
	<atom:link href="http://henko.net/category/imperfection/process/feed/" rel="self" type="application/rss+xml" />
	<link>http://henko.net</link>
	<description>Home of a human being and software developer</description>
	<lastBuildDate>Wed, 16 Jun 2010 20:32:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Local rules give global results</title>
		<link>http://henko.net/imperfection/local-rules-give-global-results/</link>
		<comments>http://henko.net/imperfection/local-rules-give-global-results/#comments</comments>
		<pubDate>Thu, 06 May 2010 13:53:47 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Principles]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=856</guid>
		<description><![CDATA[Reading Richard Dawkins&#8217; book The Greatest Show on Earth, I got inspired by his description about genes. He talks about how genes are not the blueprints of the body, but rather a recipe for the body. In other words, the genes do not contain a complete (or even partial) description of the final result, but [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://henko.net/wp-content/uploads/2010/05/2576765496_18e063d8411.jpg"><img src="http://henko.net/wp-content/uploads/2010/05/2576765496_18e063d8411-204x300.jpg" alt="DNA and twisty green things" title="DNA and twisty green things, by Ethan Hein" width="204" height="300" class="alignright size-medium wp-image-860" /></a>Reading Richard Dawkins&#8217; book <a href="http://www.amazon.com/gp/product/1416594787?ie=UTF8&amp;tag=henkonet-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1416594787" title="The Greatest Show on Earth">The Greatest Show on Earth</a>, I got inspired by his description about genes. He talks about how genes are not the blueprints of the body, but rather a recipe for the body. In other words, the genes do not contain a complete (or even partial) description of the final result, but rather contain various instructions for how to create the body. Each gene contributes only with extremely low level instructions, but these instructions combine in almost incomprehensible ways to form our enormously complex bodies.</p>

<p>I very much liked the idea, that a set of very low level instructions, carefully chosen and carefully followed, could create something so complex and beautiful. Jurgen Appelo has expressed similar ideas regarding <a href="http://www.noop.nl/complexity/" title="complexity theory">complexity theory</a>, and how ant hills or bee hives are complex structures created without a master plan through individual bees&#8217; actions. Yet another connection would be local search algorithms, which find maxima in a landscape through looking only at their immediate surroundings.</p>

<p>Next, my brain started linking these ideas to software development. For example, Test-Driven Development. It is in its essence, a set of very simple rules. Write a test, write needed implementation, refactor. These three simple (at least in theory) steps is all that there is to it, when properly adhered to, it can give great results. Designs tend to be much more easy to use, contain less bloat, be more testable (duh!), and so on. Refactorings are another great example. A set of rules or recipes for how to transform a code base into a better code base.</p>

<p>Obviously, choosing the right set of rules to follow is the important part, as a bad set of rules will lead to crappy code just as an unwanted mutation in a human body may lead to e.g. cancer. But I guess the point I was trying to make is that there is immense power in follow simple rules.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/local-rules-give-global-results/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Constraints are good</title>
		<link>http://henko.net/imperfection/constraints-are-good/</link>
		<comments>http://henko.net/imperfection/constraints-are-good/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 20:05:48 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Principles]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=814</guid>
		<description><![CDATA[In a conversation with Michael Feathers at SDC2010, he mentioned something which I found very interesting. It was a very simple statement.


  Constraints are good.


To me, that statement sounded rather odd. Constraints is a negative word to me, so intuitively I want to remove constraints. Thus, I asked him to clarify. And here&#8217;s what [...]]]></description>
			<content:encoded><![CDATA[<p>In a conversation with <a href="http://www.michaelfeathers.com/" title="Michael Feathers">Michael Feathers</a> at <a href="http://www.scandevconf.se/" title="SDC2010">SDC2010</a>, he mentioned something which I found very interesting. It was a very simple statement.</p>

<blockquote>
  <p>Constraints are good.</p>
</blockquote>

<p>To me, that statement sounded rather odd. Constraints is a negative word to me, so intuitively I want to remove constraints. Thus, I asked him to clarify. And here&#8217;s what he said (or rather, my interpretation of it).</p>

<p><a href="http://henko.net/wp-content/uploads/2010/04/3135942946_6013353f46_b1.jpg"><img src="http://henko.net/wp-content/uploads/2010/04/3135942946_6013353f46_b1-200x300.jpg" alt="A night shot of a high way." title="The first trail and star, by jonmartin" width="200" height="300" class="alignright size-medium wp-image-820" /></a>A big advantage of software development is that we can build virtually anything. However, that same fact also represents one of the biggest problems. &#8220;Anything&#8221; includes all the great things that we envision, but also all the crappy things which we typically produce. <img src='http://henko.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>

<p>Since the possibilities are endless, in theory nothing prevents us from creating something truly great. But &#8212; and here&#8217;s the thing &#8212; by adding wisely chosen constraints, we can eliminate some of the undesirable outcomes. That means, that even if we screw up a bit, we&#8217;re more likely to create something which is at least not half-bad because we&#8217;ve eliminated the really bad outcomes. If we stay within the constraints, that is&#8230;</p>

<p>Another way to see it is that just as any society needs some laws and rules in order to function smoothly, a software development team does too. Whereas an example in the first case may be &#8220;do not kill&#8221;, an example in the second could be &#8220;do not commit code which breaks the build&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/constraints-are-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Estimation Rule of Thumb</title>
		<link>http://henko.net/imperfection/estimation-rule-of-thumb/</link>
		<comments>http://henko.net/imperfection/estimation-rule-of-thumb/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 07:00:57 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Planning]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=652</guid>
		<description><![CDATA[An time estimation rule of thumb for software development in startups. (Somewhat tongue-in-cheek.)

The rule


Make a good estimate of the work (in any time unit).
Multiply that number by itself in months plus one.
What you get is a reasonable estimate for release date (in the original time unit).


Examples

Some examples:


Work estimated to one week will take one week.
Work [...]]]></description>
			<content:encoded><![CDATA[<p>An time estimation rule of thumb for software development in startups. (Somewhat tongue-in-cheek.)</p>

<h3>The rule</h3>

<ul>
<li>Make a good estimate of the work (in any time unit).</li>
<li>Multiply that number by itself in months plus one.</li>
<li>What you get is a reasonable estimate for release date (in the original time unit).</li>
</ul>

<h3>Examples</h3>

<p>Some examples:</p>

<ul>
<li>Work estimated to one week will take one week.</li>
<li>Work estimated to two weeks you can expect to be ready in close to a month.</li>
<li>Work expected to take two months weeks will take about six months.</li>
<li>Anything estimated to half a year or more won&#8217;t be finished. The scope will be changed too much before the project is finished.</li>
</ul>

<p>While not perfectly scientific, it is actually more or less empirically derived from my own company&#8217;s history.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/estimation-rule-of-thumb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Bus Factor</title>
		<link>http://henko.net/imperfection/the-bus-factor/</link>
		<comments>http://henko.net/imperfection/the-bus-factor/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 07:00:54 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=731</guid>
		<description><![CDATA[The Bus Factor, as defined by Wikipedia:


  A software project&#8217;s bus factor is a measurement of concentration of information in a single person, or very few people. The bus factor is the total number of key developers who would if incapacitated, as by getting hit by a bus, send the project into such disarray [...]]]></description>
			<content:encoded><![CDATA[<p>The <em>Bus Factor</em>, as defined by Wikipedia:</p>

<blockquote>
  <p>A software project&#8217;s bus factor is a measurement of concentration of information in a single person, or very few people. The bus factor is the total number of key developers who would if incapacitated, as by getting hit by a bus, send the project into such disarray that it would not be able to proceed.</p>
</blockquote>

<p>How would your company do without you if you became sick for a month? Six months? Quit completely?
Or put the other way, if you want to quit, can you get out without leaving a complete mess behind you?</p>

<p>If you&#8217;re an entrepreneur, this is even more important. Especially if you&#8217;re looking into one day selling your company. Nobody wants to buy a company which is worthless without the seller.</p>

<p>What is the bus factor on your project or company?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/the-bus-factor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Conception Of Agile Missing The Point?</title>
		<link>http://henko.net/imperfection/common-conception-of-agile-missing-the-point/</link>
		<comments>http://henko.net/imperfection/common-conception-of-agile-missing-the-point/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 07:00:53 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=607</guid>
		<description><![CDATA[This is a bit of a rant, but I just gotta get it out of my system.

I&#8217;m getting frustrated by people I talk to who seem to misunderstand the whole point of agile software development (IMHO).

Different ways of reducing risk

The point with agile, as far as I understand, is to reduce risk and thereby costs [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/gibbons/2171091952/"><img alt="Missing the mark" src="http://farm3.static.flickr.com/2193/2171091952_b281d3ec41_m.jpg" title="Missing the mark (Copyright 2008 by Bah Humbug)" class="alignright" width="240" height="161" /></a>This is a bit of a rant, but I just gotta get it out of my system.</p>

<p>I&#8217;m getting frustrated by people I talk to who seem to misunderstand the whole point of agile software development (IMHO).</p>

<h3>Different ways of reducing risk</h3>

<p>The point with agile, as far as I understand, is to reduce risk and thereby costs by <a href="http://henko.net/imperfection/minimizing-irreversible-actions/" title="Minimizing Irreversible Actions">postponing decisions</a> until we have as much information as possible. In older waterfall processes, pretty much everything was decided upfront. That wasn&#8217;t because people thought it was so much fun to decide everything up front, but because they believed it to be the best way to reduce risk and cost. Because a bug found just before delivery <em>is</em> <a href="http://www.agilemodeling.com/essays/costOfChange.htm" title="much more costly">much more costly</a> than one found earlier.</p>

<p>Agile, on the other hand, tries to use development practices which enable us to postpone decisions, practices which makes the system easy to change even later in the development process. Thus, the code you write should have two qualities:</p>

<ul>
<li>doesn&#8217;t force you into making unnecessary decisions, and</li>
<li>be easy to change.</li>
</ul>

<h3>How to reduce risk the agile way</h3>

<p>Quotes such as &#8220;<a href="http://c2.com/xp/YouArentGonnaNeedIt.html" title="You Ain't Gonna Need It">You Ain't Gonna Need It</a>&#8221; (YAGNI) and &#8220;<a href="http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html" title="Do The Simplest Thing That Could Possibly Work">Do The Simplest Thing That Could Possibly Work</a>&#8221; (DTST) emphasize the first part &#8212; not making premature decisions. But while you can typically find people talking about the second part too, it doesn&#8217;t nearly get as much attention in people minds as the first one. Most likely simply because it&#8217;s not included in the name, in the mantra. I guess &#8220;You Aren&#8217;t Gonna Need It, But Do Not Forget To Make Sure Your Code Is Flexible&#8221; just doesn&#8217;t stick as easily.</p>

<p>Actually ensuring that your code is easy to change requires some work &#8212; especially while trying to avoid making premature decisions! It means using things like table driven code and putting abstractions in code an meta-data in configuration. It means thinking about what things are likely to change, and what things are not. It means not assuming too much, since you never know how things are going to be used in the future.</p>

<h3>Where many people misunderstand agile</h3>

<p>Rules and practices are good, but they are just the means to an end. I find that too many people interpret the agile mantras of YAGNI and DTST too literally. They create solutions which are &#8220;simple&#8221; and &#8220;works&#8221; and only includes &#8220;what&#8217;s needed&#8221;.</p>

<p>However, the next day, or next month, when requirements and expectations have changed (as they no doubt will) these solutions prove to be hard to adapt to the new situation. That&#8217;s because their developers forgot about the second part, making the system easy to change! And I believe forgetting that is forgetting the very core of what agile is about!</p>

<p>You agree? Got another opinion? How do you ensure you&#8217;re code is easy to change?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/common-conception-of-agile-missing-the-point/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-Functional Teams</title>
		<link>http://henko.net/imperfection/cross-functional-teams/</link>
		<comments>http://henko.net/imperfection/cross-functional-teams/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 07:00:43 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=381</guid>
		<description><![CDATA[A buzz word within the Agile camp is &#8221;cross-functional teams&#8221;. For some reason though, there seems to be quite some confusion about what it really means. More precisely, it seems that some people argue for that members of a cross-functional teams should be generalists rather than specialists, that everyone should be able to do every [...]]]></description>
			<content:encoded><![CDATA[<p>A buzz word within the Agile camp is &#8221;cross-functional teams&#8221;. For some reason though, there seems to be quite some confusion about what it really means. More precisely, it seems that some people argue for that members of a cross-functional teams should be generalists rather than specialists, that everyone should be able to do every job. Other argue the opposite.</p>

<h3>Definitions</h3>

<p><a href="http://en.wikipedia.org/wiki/Cross-functional_team" title="According to Wikipedia">According to Wikipedia</a>, a cross-functional team is:</p>

<blockquote>
  <p>A group of people with different functional expertise working toward a common goal. It may include people from finance, marketing, operations, and human resources departments. Typically, it includes employees from all levels of an organization.</p>
</blockquote>

<p>If we instead look at the definition of a cross-functional team in Wikipedia&#8217;s <a href="http://en.wikipedia.org/wiki/Agile_software_development" title="Agile Software Development">Agile Software Development</a> article, we learn that such a team &#8220;is usually cross-functional and self-organizing without consideration for any existing corporate hierarchy or the corporate roles of team members.&#8221; This seems to suggest that the meaning of cross-functional in agile is often interpreted a bit differently.</p>

<h3>Why confusion arises</h3>

<p>Part of the problem might be that leaders in the field are sometimes a bit unclear. For example, reading Henrik Kniberg&#8217;s otherwise excellent piece on <a href="http://blog.crisp.se/henrikkniberg/2007/05/07/1178493480000.html" title="agile testing">agile testing</a> quickly, you can easily get the perception that he is arguing for the generalist approach. Quotes such as the following certainly helps one reaching such a conclusion.</p>

<blockquote>
  <p>In agile projects, testing is considered to be far too important to be confined to a single role, a single team, or a single project phase. Having a role called Tester implies that others don&#8217;t need to test. In an agile project almost everyone tests.</p>
</blockquote>

<p>On the other hand, if you read it more carefully, he is actually arguing for a specialist approach. (Although he plays safe &#8212; and increases confusion &#8212; by calling them generalizing specialists.) Anyhow, this quote gives a rather other feeling than the previous.</p>

<blockquote>
  <p>Since the programmers have automated all the boring, repetetive tests, you are free to focus on the hard stuff. The stuff that is difficult to automate. Exploratory testing. Usability testing. Performance test scripts. Figuring out those tricky test cases that only a veteran like you could come up with.</p>
</blockquote>

<p>Finally, in his own words:</p>

<blockquote>
  <p>Agile teams are cross functional, they are made up of generalizing specialists. People who are experts at certain areas, but have basic knowledge of a whole bunch of other areas as well. A team of generalizing specialists is extremely fast at learning and adapting.</p>
</blockquote>

<h3>Why specialists?</h3>

<p>For me, I&#8217;m in the specialists camp. As some form of evidence, I&#8217;d like to quote Marcus Buckingham and Curt Coffman from the great book <a href="http://www.amazon.com/gp/product/0684852861?ie=UTF8&#038;tag=henkonet-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0684852861">First, Break All the Rules</a><img src="http://www.assoc-amazon.com/e/ir?t=henkonet-20&#038;l=as2&#038;o=1&#038;a=0684852861" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>

<blockquote>
  <p>Great managers do not believe that a productive team has camaraderie as its cornerstone and team members who can play all roles equally well. On the contrary, they define a productive team as one where each person knows which role he plays best and where he is cast in that role most of the time. &#8230; The founding principle here is that excellent teams are built around individual excellence.</p>
</blockquote>

<p>The nice part about this last quote is that it is not simply anecdotal &#8220;evidence&#8221;, but actually conclusions drawn by the Gallup organization after interviewing over 80 000 managers!</p>

<h3>Your experience?</h3>

<p>What&#8217;s your experience in the matter? Is specialist or generalist the way to go?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/cross-functional-teams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metaphors of Software Development</title>
		<link>http://henko.net/imperfection/metaphors-of-development/</link>
		<comments>http://henko.net/imperfection/metaphors-of-development/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 06:00:30 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=155</guid>
		<description><![CDATA[I&#8217;m really starting to get annoyed by people who insist on comparing creating software to building a car, and software development to an assembly line. That might have worked more or less fine with old, long forgotten(?), waterfall processes. But wake up, we don&#8217;t do software that way any more &#8212; most of us anyway.

The [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://henko.net/wp-content/uploads/2008/10/no-car1.png" alt="" title="No cars please" width="150" height="150" class="alignright" />I&#8217;m really starting to get annoyed by people who insist on comparing creating software to building a car, and software development to an assembly line. That might have worked more or less fine with old, long forgotten(?), <a href="http://henko.net/imperfection/agile-soon-considered-harmful/" title="Agile (Soon) Considered Harmful?">waterfall processes</a>. But wake up, we don&#8217;t do software that way any more &#8212; most of us anyway.</p>

<p>The problem with this comparison is that it&#8217;s simply wrong. I&#8217;m fine with comparing creating software with creating a car. But the closest thing to an assembly line in software development is the work done by build and deployment scripts, turning source code into executable software. The actual analysis, design, and coding corresponds to developing a brand new car model. It is a creative process without a single given &#8220;right answer&#8221; and of which experimentation and iteration are natural ingredients.</p>

<p>To use another metaphor, and at the same time cite <a href="http://www.poppendieck.com/" title="Mary and Tom Poppendieck">Mary and Tom Poppendieck</a> from their book <a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783" title="Lean Software Development">Lean Software Development</a>:</p>

<blockquote>
  <p>Development is like creating a recipe, while production is like making the dish. Recipes are designed by experienced chefs who have developed an instinct for what works and the capability to adapt available ingredients to suit the occasion. Yet even great chefs produce several variations of a new dish as they iterate toward a recipe that will taste great and be easy to reproduce.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/metaphors-of-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commit message too long</title>
		<link>http://henko.net/imperfection/commit-message-too-long/</link>
		<comments>http://henko.net/imperfection/commit-message-too-long/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 06:00:30 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=133</guid>
		<description><![CDATA[This time, I&#8217;ll just provide a short note of insight regarding checking code into version control.

If a commit message feels very long, or you feel a resistance against writing it because you don&#8217;t know what to write, it has probably been too long since you last committed! If you commit after each task is done, [...]]]></description>
			<content:encoded><![CDATA[<p>This time, I&#8217;ll just provide a short note of insight regarding checking code into version control.</p>

<p>If a commit message feels very long, or you feel a resistance against writing it because you don&#8217;t know what to write, it has probably been too long since you last committed! If you commit after each task is done, writing a good one-sentence message is a no-brainer.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/commit-message-too-long/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile (Soon) Considered Harmful?</title>
		<link>http://henko.net/imperfection/agile-soon-considered-harmful/</link>
		<comments>http://henko.net/imperfection/agile-soon-considered-harmful/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 19:47:47 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=125</guid>
		<description><![CDATA[In the nineties, software development was conceptually simple and straight-forward; you gathered requirements for the system, designed it, built it, tested it and deployed it. This was the era of waterfall, RUP, UML, and lots of up-front design. The more details decided in advance, the less costs from changing later, and thus, the better.

Then, somewhere [...]]]></description>
			<content:encoded><![CDATA[<p>In the nineties, software development was conceptually simple and straight-forward; you gathered requirements for the system, designed it, built it, tested it and deployed it. This was the era of waterfall, <acronym title='Rational Unified Process'>RUP</acronym>, <acronym title='Unified Modelling Language'>UML</acronym>, and lots of up-front design. The more details decided in advance, the less costs from changing later, and thus, the better.</p>

<p>Then, somewhere about the turn of the century, agile development became the preferred way of creating software in the more trendy corners of the development community. Today, mainstream developers have started to follow and software shops all over the place are introducing Scrum, doing test-driven development or using other agile techniques.</p>

<p>In the second edition of his popular book Code Complete, author Steve McConell describes this by saying that while he was writing the first edition, design zealots argued for “big design up-front” (BDUF), and as he was writing the second, software swamis instead argued for “emergent design”, which basically means no initial design at all. As he put it:</p>

<blockquote>In ten years the pendulum has swung from “design everything” to “design nothing”.</blockquote>

<p>Now it seems to me that the pendulum is on its way back.</p>

<p>In an article in IEEE Software, the July/August 2008 issue, Rebecca J. Wirfs-Brock argues in favor of up-front design.</p>

<blockquote>These days, some developers shy away from even suggesting that a project might need up-front design and experimentation. They equate any up-front work with “big design up front” (BDUF) and totally wasted effort. Up-front design needn’t be wasteful if you develop a design rhythm that balances thinking, learning, and doing. You’ll build confidence and sleep better at night.</blockquote>

<p>On a similar note, <a href="http://www.codethinked.com/post/2008/09/13/It-is-BDUF-not-DUF.aspx" title="Justin Etheredge argues">Justin Etheredge argues</a> that some agile developers might be a little bit naïve.</p>

<blockquote>A lot of developers think that agile development represents doing no design up front. That we will figure out what we want to do and then just jump right into coding it without any concern for what we are going to build. Then we will just come back later, refactor the whole thing, and voila, instant working application. Well, it just doesn&#8217;t work that way.</blockquote>

<p>Frans Bouma <a href="http://weblogs.asp.net/fbouma/archive/2008/09/14/is-bduf-really-bduf.aspx" title="adds to the theme">adds to the theme</a>, possibly suggesting that even laziness might be a part of it.</p>

<blockquote>Yes, Software Engineering is hard, deal with it. Don&#8217;t use the excuse that because goals are unknown, because the client changes his mind every day the design therefore has to be done in the code editor. If those are your problems, solve them, deal with them.</blockquote>

<p>My own earlier posts deal with similar issues, such as developers who do <a href="http://henko.net/imperfection/thoughtless-development/" title="Thoughtless Development">TDD without thinking</a>, and that you <a href="http://henko.net/imperfection/do-design/" title="Do design, just not Big and Up Front">can't skip design</a>.</p>

<p>To be fair to gurus arguing for the principles of agile development (which to a large degree I myself believe in), these comments apply more to average developer Joe than the gurus themselves. But then, the gurus are probably smart enough to succeed in building their software no matter what process they use. There are however way more average Joes than gurus, so the points above are still very valid.</p>

<p>Given this shift of thinking, where will we head now? Will the pendulum actually swing right back to BDUF? Will we find the sweet spot between emergent design and up-front design? Or will we rush off once again in a new chase for design nirvana? If so, where will we end up this time? I sure hope for the sweet spot option, but given human nature I’m not convinced. What are your thoughts?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/agile-soon-considered-harmful/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Increasing sustainable pace</title>
		<link>http://henko.net/imperfection/increasing-sustainable-pace/</link>
		<comments>http://henko.net/imperfection/increasing-sustainable-pace/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 08:50:31 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/?p=119</guid>
		<description><![CDATA[In the last few years, especially in the agile corners of the web, there's been quite a lot written about the 40 hour workweek, sustainable pace, no overtime, and so on. I agree with most of this stuff and think exhausted developers in the long run do more harm than good. I can't help to wonder, however, what's so magical about 40 the hour workweek? Why not 35, 45, or even 55? Just playing safe on 40 seems a waste, if my team can do better.]]></description>
			<content:encoded><![CDATA[<p><img src="http://henko.net/wp-content/uploads/2008/04/sustainable-pace.png" alt="" title="" align="right" style="margin: 0.5em 0 0.5em 1em;" />In the last few years, especially in the agile corners of the web, there&#8217;s been quite a lot written about the 40 hour workweek, <a href="http://c2.com/cgi/wiki?SustainablePace" title="sustainable pace">sustainable pace</a>, <a href="http://www.extremeprogramming.org/rules/overtime.html" title="no overtime">no overtime</a>, and <a href="http://www.infoq.com/news/2008/02/crunch_mode_allstar_paradox" title="so on">so on</a>. I agree with most of this stuff and think exhausted developers in the long run do more harm than good.</p>

<p>I can&#8217;t help to wonder, however, what&#8217;s so magical about 40 the hour workweek? Why not 35, 45, or even 55? Also, it will naturally vary among different people. So I want to know where to draw the line. Just playing safe on 40 seems a waste, if my team can do better.</p>

<h3>The capacity model</h3>

<p>In the figure above, I&#8217;ve created a simple model for how I imagine things work. It&#8217;s pretty safe to assume that everyone has a <em>maximum</em> productivity level, over which it is simply not possible to get. I&#8217;d say this maximum is defined by the programmers talent. No matter how much experience, practice or training one gets, there&#8217;s still some basic inherent talent level which defines one&#8217;s maximum. (If nothing else, let it be the number of words per minute the developer can type.)</p>

<p>More interestingly, we&#8217;ve got a current <em>capacity</em> which is the highest amount we can currently produce without lowering quality. A sustainable pace is any pace which is below this current capacity. That is, we can keep going at this rate forever, without accumulating any technical debt. We can go above it once in a while too, in a coding crunch, but then we start accumulating technical debt. This forces us to work at a lower rate later to pay back.</p>

<h3>How do you go faster?</h3>

<p>There are at least two interesting questions in this model. First, how do you find your current capacity? I believe that question can be answered empirically by increasing development speed until developers start getting (too) tired and bugs start to slip in. The second, and more interesting, question is: how do you raise your current capacity? To answer this, we must first answer another question which is: what defines your capacity? (In the figure, this unknown entity is called <em>x</em>.) My best bet is <a href="http://stevemcconnell.com/articles/art05.htm" title="motivation">motivation</a> with a tad of discipline thrown in for good measure.</p>

<p>To sum up, my point is that while we want to achieve a sustainable pace in development, we shouldn&#8217;t have to limit ourselves to 40 hours per week. If we can hold a sustainable pace of say 45 hours per week, as opposed to 40, we gain <em>more than one month</em> of extra development time during a year! Especially in start-ups, such as where I work, 40 hours a week is a luxury one cannot afford. Large companies such as Microsoft and Google also very much rely on peoples desire for and ability to work (much) more than 40 hours per week. So the question is, how do we increase our development pace while keeping it sustainable? Is it possible? (I sure hope so.) If so, how do you do?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/increasing-sustainable-pace/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Thoughtless Development</title>
		<link>http://henko.net/imperfection/thoughtless-development/</link>
		<comments>http://henko.net/imperfection/thoughtless-development/#comments</comments>
		<pubDate>Fri, 23 Nov 2007 10:25:54 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/imperfection/thoughtless-development/</guid>
		<description><![CDATA[Test-Driven Development has gone from being a new idea, considered slightly crazy, to a serious development style used by many professional developers in their everyday life. However, it is a style of development which requires much discipline, or you will not realize it’s potential. In fact, you might end up doing more harm than good.]]></description>
			<content:encoded><![CDATA[<p>Test-Driven Development has gone from being a new idea, considered slightly crazy, to a serious development style used by many professional developers in their everyday life. However, it is a style of development which requires much discipline, or you will not realize it&#8217;s potential. In fact, you might end up doing more harm than good.</p>

<h3>Traditional vs Test-Driven</h3>

<p>The traditional way of developing (if there is such a thing) typically follows this pattern.</p>

<ol>
<li>Implement a feature.</li>
<li>Test follows from implementation.</li>
</ol>

<p>Whereas Test-Driven Development reverses that order.</p>

<ol>
<li>Test a (missing) feature.</li>
<li>Implementation follows from test.</li>
</ol>

<p>The idea here is that if we design and write the test before concerning ourselves with a particular implementation, we are more open-minded and the resulting feature will be designed <em>as we want to use it</em> rather than <em>how it&#8217;s easiest to implement</em>.</p>

<h3>Thoughtless Development</h3>

<p>Some people (myself included, in an earlier life), tend to get this idea slightly wrong. They end up with, what I call, <em>Thoughtless Development</em>. When converting from traditional development to TDD, they know the implementation is supposed to go last and follow from the tests.</p>

<p>For some reason though, they keep the &#8220;test follows from implementation&#8221; part. But as the test is supposed to be written first, there is no longer anything it can follow from. To make it even better, it is also supposed to be as simple as possible, which is easily interpreted as <em>easy to do</em> as possible. The flow typically ends up something like this.</p>

<ol>
<li>Test follows from (vague expectations of) implementation.</li>
<li>Implementation follows from test.</li>
</ol>

<p>Do I need to add that they typically end up with a heap of junk? That&#8217;s because there is no room for thought in this process. All the thinking and care that should go into designing tests is forgotten.</p>

<p>As I&#8217;ve written about earlier, some people tend to use TDD as an excuse for <a href="http://henko.net/imperfection/do-design/" title="Do design, just not Big and Up Front">doing no design at all</a>. Either purposefully or by accident. This is ironic, as TDD is really all about design! So let us all make sure that we are doing Test-Driven Development, and not Thoughtless Development.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/thoughtless-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take a deep breath</title>
		<link>http://henko.net/imperfection/take-a-deep-breath/</link>
		<comments>http://henko.net/imperfection/take-a-deep-breath/#comments</comments>
		<pubDate>Wed, 30 Aug 2006 08:52:45 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://henko.net/imperfection/take-a-deep-breath/</guid>
		<description><![CDATA[Sometimes when I'm trying to get my head around something complex, I suddenly feel overwhelmed and my head starts to feel like its about to explode. I realize that there are at least a dozen cases which I've failed to consider so far. All the thoughts I was trying to keep track of just runs off in every possible direction and I can't chase them all. Dispair overwhelmes me. Then I have to close my eyes, take a deep breath, hold it for a second, and let it go slowly. Then start over, think it through one more time.]]></description>
			<content:encoded><![CDATA[<p>Sometimes when I&#8217;m trying to get my head around something complex, I suddenly feel overwhelmed and my head starts to feel like it&#8217;s about to explode. I realize that there are at least a dozen cases which I&#8217;ve failed to consider so far. All the thoughts I was trying to keep track of just runs off in every possible direction and I can&#8217;t chase them all. Despair overwhelms me. Then I have to close my eyes, take a deep breath, hold it for a second, and let it go slowly. Then start over, think it through one more time.</p>

<p>This procedure is typically repeated a whole bunch of times. Thus, my thought process is a very iterative one. Unfortunately, I&#8217;m not in charge of the iterations. They usually end not because I&#8217;ve reached a new milestone, but because I&#8217;ve realized I&#8217;m hopelessly lost and need to go back to the beginning. Somehow still, (on good days) each iteration seems to make things at least a little bit clearer. Or at least every other iteration or so. Some of them just end in a big hopeless sigh.</p>

<div class="images"><img src="http://henko.net/wp-content/uploads/2006/09/dandelion.jpg" alt=" (Copyright 2006 Göran Axelsson.)" title=" (Copyright 2006 Göran Axelsson.)" /></div>

<p>Anyway, I finally either realize that I just can&#8217;t get it right, or I find a solution. If the latter, the solution typically has very little resemblance to my starting ideas. My thoughts have been distilled and refined over and over, and my initial assumptions have been overturned more or less completely. Actually, the solution typically is far more elegant and simple(!) than what I started with.</p>

<p>So why am I telling you this? Well, I&#8217;m not sure (still trying to get my head around that one <img src='http://henko.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ). But somewhere in the back of my head I wonder if this is not how I ought to develop software as well. Not that all iterations end in catastrophy, but that whenever I&#8217;m not quite sure of what I&#8217;m doing, I should throw whatever code I&#8217;ve been writing away and start over. Then, finally, the code I end up with will be simple enough for me to grasp in one go and only contains what I&#8217;m sure is absolutely necessary. Then of course, it is very hard to actually throw away code you&#8217;ve written. But maybe it&#8217;s worth it?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/take-a-deep-breath/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.642 seconds -->
