<?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</title>
	<atom:link href="http://henko.net/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>Real world refactoring</title>
		<link>http://henko.net/imperfection/real-world-refactoring/</link>
		<comments>http://henko.net/imperfection/real-world-refactoring/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 20:32:13 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Principles]]></category>

		<guid isPermaLink="false">http://henko.net/?p=897</guid>
		<description><![CDATA[The tram stop next to my apartment has been completely rebuilt during the last few weeks. They removed every part of the old one, including the actual little shelter, the fence, the curb, the pavement &#8212; everything. A pretty major change as far as tram stop remakes go. It could be seen as a clear [...]]]></description>
			<content:encoded><![CDATA[<p>The tram stop next to my apartment has been completely rebuilt during the last few weeks. They removed every part of the old one, including the actual little shelter, the fence, the curb, the pavement &#8212; everything. A pretty major change as far as tram stop remakes go. It could be seen as a clear improvement. Tram Stop 2.0, if you wish.</p>

<p><img src="http://henko.net/wp-content/uploads/2010/06/crossing-300x225.jpg" alt="Rebuilding a crossing" title="Rebuilding a crossing" width="300" height="225" class="alignright size-medium wp-image-899" /></p>

<p>They also created a new pedestrian crossing next to the tram stop. And there was one thing about it that I noticed. One side of the crossing was connected to the tram stop and the curb there was just rebuilt. The other side of the street had a perfectly fine curb, and it would have been no problems to just paint lines on the street and be done with the crossing. But they didn&#8217;t.</p>

<p>Instead, they ripped up the street, curb and part of the sidewalk on that side too. Why? The reason is that they wanted to improve that side of the crossing too. They&#8217;re making the sidewalk about half a meter wider and thereby narrowing the street. That makes it a little bit clearer that it is a crossing and therefore makes the crossing safer. They&#8217;ll lower the curb for a meter or so which makes crossing by bike or wheel-chair easier. That&#8217;s about it, as far as I know.</p>

<p>While arguably better, it didn&#8217;t really enable anything that wasn&#8217;t possible before. And it did cost money. Money that could have been spent elsewhere. And they had already spent a lot of money on rebuilding the tram stop. So why did they do it? I&#8217;m not sure, but I think whatever the reasons were, the same reasons could be used to motivate refactoring of software.</p>

<p>(Alright, that was possibly a crappy metaphor&#8230; but it&#8217;s my blog, and I&#8217;ll post what I want. <img src='http://henko.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/real-world-refactoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freakoversion</title>
		<link>http://henko.net/imperfection/freakoversion/</link>
		<comments>http://henko.net/imperfection/freakoversion/#comments</comments>
		<pubDate>Sun, 23 May 2010 20:42:26 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Learning]]></category>

		<guid isPermaLink="false">http://henko.net/?p=885</guid>
		<description><![CDATA[In order to become better at selling &#8220;doing the right thing&#8221; to management, I think we need hard evidence. Therefore, I&#8217;m very curious what would happen if you put a really good researcher on digging through the version control system for your product. Combined with bug trackers, continuous integration systems, and other related systems, I [...]]]></description>
			<content:encoded><![CDATA[<p>In order to become <a href="http://henko.net/imperfection/to-become-better-salesmen/" title="To become better salesmen">better at selling</a> &#8220;doing the right thing&#8221; to management, I think we need hard evidence. Therefore, I&#8217;m very curious what would happen if you put a really good researcher on digging through the version control system for your product. Combined with bug trackers, continuous integration systems, and other related systems, I think it is a virtual goldmine.</p>

<p>You can finally get number of how much that &#8220;technical debt&#8221; really is. How much an average bug cost? How long does it on average take until a bug is discovered? Until it is fixed? How much did that quick and dirty patch a year ago really cost? Add to that all the technical value you could get out of such an analysis. What modules/classes have had the most bugs, historically? What classes are unstable and has to be changed all the time?</p>

<p>Think of it as a <a href="http://www.amazon.com/gp/product/0061234001?ie=UTF8&amp;tag=henkonet-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0061234001" title="Freakonomics">Freakonomics</a> of version control.</p>

<div style="text-align: center"><img src="http://henko.net/wp-content/uploads/2010/05/freakoversion.jpg" alt="Freakonomics + Subversion  = ?" title="Freakoversion" width="409" height="100" class="aligncenter size-full wp-image-886" /></div>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/freakoversion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Multitasking doesn&#8217;t work, but&#8230;</title>
		<link>http://henko.net/imperfection/multitasking-doesnt-work-but/</link>
		<comments>http://henko.net/imperfection/multitasking-doesnt-work-but/#comments</comments>
		<pubDate>Thu, 13 May 2010 08:15:51 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Principles]]></category>

		<guid isPermaLink="false">http://henko.net/?p=866</guid>
		<description><![CDATA[Great quote from Kent Beck at SDC2010.


  Multitasking doesn&#8217;t work,
  but it would be so nice if it did
  that we try anyway.


That&#8217;s about the best summary of (human) multitasking I&#8217;ve heard.

This picture is pretty good too, though.


]]></description>
			<content:encoded><![CDATA[<p>Great quote from Kent Beck at <a href="http://www.scandevconf.se/2010/" title="SDC2010">SDC2010</a>.</p>

<blockquote>
  <p>Multitasking doesn&#8217;t work,<br />
  but it would be so nice if it did<br />
  that we try anyway.</p>
</blockquote>

<p>That&#8217;s about the best summary of (human) multitasking I&#8217;ve heard.</p>

<p>This picture is pretty good too, though.</p>

<div style="text-align: center"><a href="http://henko.net/wp-content/uploads/2010/05/62139938_94b4e251cd1.jpg"><img src="http://henko.net/wp-content/uploads/2010/05/62139938_94b4e251cd1-300x225.jpg" alt="The Myth of Multitasking, by Tim Morgan" title="The Myth of Multitasking, by Tim Morgan" width="300" height="225" /></a></div>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/multitasking-doesnt-work-but/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delegate or fire</title>
		<link>http://henko.net/imperfection/delegate-or-fire/</link>
		<comments>http://henko.net/imperfection/delegate-or-fire/#comments</comments>
		<pubDate>Mon, 10 May 2010 17:35:59 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://henko.net/?p=863</guid>
		<description><![CDATA[You can&#8217;t lead a big company at a detailed level. You simply don&#8217;t have enough time to grasp all details. You are just human, and your brain cannot handle the complex lives of all people in your organization. But if you&#8217;re the CEO, you still have the responsibility for all of these people.


&#8220;With great power [...]]]></description>
			<content:encoded><![CDATA[<p>You can&#8217;t lead a big company at a detailed level. You simply don&#8217;t have enough time to grasp all details. You are just human, and your brain cannot handle the complex lives of all people in your organization. But if you&#8217;re the CEO, you still have the responsibility for all of these people.</p>

<div style="text-align: center"><img src="http://henko.net/wp-content/uploads/2010/05/spiderman1.jpg" alt="Spider-Man" title="Spider-Man" width="300" height="411" class="size-full wp-image-870" /><br/>
<em>&#8220;With great power comes great responsibility&#8221;</em></div>

<p>So, if you can&#8217;t do it all yourself, you&#8217;re forced to either:</p>

<ol>
<li>generalize and set broad rules, or</li>
<li>delegate control and responsibility.</li>
</ol>

<p>The first one is tempting, as you can control people and ensure that they don&#8217;t do anything which they should not. The problem is, if you do this, you lower the &#8220;consciousness&#8221; of yourself and your organization. According to the Dreyfus model of skill acquisition, not taking context into consideration is one of the traits of the novice. And that is just what&#8217;s happening here.</p>

<p>On the other hand, if you delegate control to the people who actually deal with the everyday problems, each person can adjust their decisions to the situation at hand. If you don&#8217;t trust the people to handle that situation, either learn to trust them or don&#8217;t hire them in the first place!</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/delegate-or-fire/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>To become better salesmen</title>
		<link>http://henko.net/imperfection/to-become-better-salesmen/</link>
		<comments>http://henko.net/imperfection/to-become-better-salesmen/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 16:59:57 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://henko.net/?p=836</guid>
		<description><![CDATA[At a lunch recently, I talked with some architects/developers who were a bit concerned about a decision made by the managers and (powerpoint-)architects at their company. The company had decided to go with a middle-ware/database solution from a vendor which I will allow to remain anonymous (let&#8217;s just say it&#8217;s a very large company who [...]]]></description>
			<content:encoded><![CDATA[<p>At a lunch recently, I talked with some architects/developers who were a bit concerned about a decision made by the managers and (powerpoint-)architects at their company. The company had decided to go with a middle-ware/database solution from a vendor which I will allow to remain anonymous (let&#8217;s just say it&#8217;s a very large company who recently acquired another company which develops a very common programming language).</p>

<p><a href="http://www.flickr.com/photos/amagill/3367543296/"><img src="http://henko.net/wp-content/uploads/2010/04/3367543296_1470ef5247_b1-e1272473369540.jpg" alt="A roll of bills." title="Money, by AMagill" width="249" height="242" class="alignright size-full wp-image-838" /></a>My lunch mates felt that the decision to go with this vendor was not necessarily in the best interest of their company and the technical platform they were developing. Instead, they felt that there were other ways forward which would be better. Some of these ideas included common-sense things such as choosing quality over quantity, working on getting the current code into decent shape, and so on. They also felt that they had been trying to get this message across to management.</p>

<p>Why then did these suggestions not catch on with management, and why did the vendor&#8217;s salesmen manage to convince company management to choose them? I don&#8217;t have the answers, but I will not let that stop me from sharing my thoughts. <img src='http://henko.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  I also don&#8217;t have all the details on this specific case, so I&#8217;ll be a bit more general.</p>

<p>I think that developers and architects have many good ideas on how to build systems, but that we don&#8217;t always do a great job of describing these ideas to business people. I think we also sometimes adopt ideas on the basis of liking them, rather than because the idea has been proven over and over again.</p>

<div style="margin-left: 2em;">

<p>All in all, I think we need to become better salesmen &#8212; to find better ways to sell our ideas to management. We need to start using the arguments that appeal to them, getting case studies which &#8220;prove&#8221; our ideas, and creating relevant numbers and charts. We need to tell the business people how much money they can actually save by doing whatever-it-is-we-want-them-to-do. Make it the &#8220;safe alternative&#8221; to choose our idea. I can only imagine that is what the vendor&#8217;s salesmen in the example above did.</p>

</div>

<p>Failing that, we need to get a very well-paid management consultant to tell them the same thing. Because in the world of business, the greatness of an idea is proportional to the hourly rate of the person presenting it. <img src='http://henko.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/to-become-better-salesmen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t peak</title>
		<link>http://henko.net/imperfection/dont-peak/</link>
		<comments>http://henko.net/imperfection/dont-peak/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 06:00:29 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Imperfection]]></category>

		<guid isPermaLink="false">http://henko.net/?p=815</guid>
		<description><![CDATA[When I talked to Michael Feathers about why constraints are good, he also mentioned an example of where he thought things were going wrong.

Some people who use test-driven development, also use tools that allow the to peek into classes and read private variables. That is an efficient way to ensure that some method altered the [...]]]></description>
			<content:encoded><![CDATA[<p>When I talked to Michael Feathers about why <a href="http://henko.net/imperfection/constraints-are-good/" title="Constraints are good">constraints are good</a>, he also mentioned an example of where he thought things were going wrong.</p>

<p>Some people who use test-driven development, also use tools that allow the to peek into classes and read private variables. That is an efficient way to ensure that some method altered the state of the object in the expected way.</p>

<p>However, as Michael pointed out, by doing so they miss the point of test-driven development. Test-driven development adds constraints. It does that in order to force developers to design their code better. (TDD is about design, not testing &#8212; remember?) By peeking into classes, one effectively removes one constraint added by TDD, and thereby removing much of the benefit of TDD.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/dont-peak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consider yourself warned, bloggers</title>
		<link>http://henko.net/imperfection/consider-yourself-warned-bloggers/</link>
		<comments>http://henko.net/imperfection/consider-yourself-warned-bloggers/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 06:04:54 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>

		<guid isPermaLink="false">http://henko.net/?p=828</guid>
		<description><![CDATA[This started out as a comment on a Michael Hyatt blog post on the use of social media for marketing vs relationship building. Michael responded to my comment saying,


  Wow. That a blog post in itself—and a great warning to all us who are tempted to “go pro.”


So, consider yourselves warned, everyone. (Now, that [...]]]></description>
			<content:encoded><![CDATA[<p>This started out as a comment on a Michael Hyatt blog post on the use of <a href="http://michaelhyatt.com/2010/04/the-20-to-1-rule.html" title="social media for marketing vs relationship building">social media for marketing vs relationship building</a>. Michael responded to my comment saying,</p>

<blockquote>
  <p>Wow. That a blog post in itself—and a great warning to all us who are tempted to “go pro.”</p>
</blockquote>

<p>So, consider yourselves warned, everyone. (Now, that would have worked way better if I actually had a lot of subscribers&#8230;)</p>

<p>His post made me think of how many bloggers that become popular behave. At first, they write good high-quality material, the kind of material that people want to read, and they get a lot of subscribers. As they become famous, they start doing talking engagements, they write books, they quit their jobs and starts making a livings as bloggers. And before you know it, most of what they post are “spam” such as info about their upcoming talk, book or business deal. And the posts which made me interested in the first place become rarer.</p>

<p>Now, that is only logical. They wrote about the subject in the first place because they were interested and worked with it everyday. When their life situation changes, and they become pro-bloggers, naturally their interests and day-to-day activities change as well (to some degree, at least). So they still write about what they are interested in and work with everyday. Same, same, but different.</p>

<p>Another commenter mentioned that he only followed people on Twitter with a moderate amount of followers and not the ones with millions, because the latter typically just sent broadcast-style marketing messages. Maybe that’s an expression of the same thing?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/consider-yourself-warned-bloggers/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>Exception Handling Policy &#8211; Logging Exceptions</title>
		<link>http://henko.net/imperfection/exception-handling-policy-logging-exceptions/</link>
		<comments>http://henko.net/imperfection/exception-handling-policy-logging-exceptions/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 06:00:32 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Implementation]]></category>

		<guid isPermaLink="false">http://henko.net/?p=667</guid>
		<description><![CDATA[This is the last part of my series on exception handling which will deal with logging exceptions and other noteworthy events.

A summary of the series:


Throwing Exceptions
Using Assertions
Catching Exceptions
Logging Exceptions (this one)


General guidelines

We&#8217;ll start off with a few general guidelines for logging.

Always include the exception message in the log



Make sure you know what actually went wrong, [...]]]></description>
			<content:encoded><![CDATA[<p>This is the last part of my series on exception handling which will deal with logging exceptions and other noteworthy events.</p>

<p>A summary of the series:</p>

<ol>
<li><a href="http://henko.net/imperfection/exception-handling-policy-throwing-exception/" title="Exception Handling Policy - Throwing Exceptions">Throwing Exceptions</a></li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-using-assertions/" title="Exception Handling Policy - Using Assertions">Using Assertions</a></li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-catching-exceptions/" title="Exception Handling Policy - Catching Exceptions">Catching Exceptions</a></li>
<li><strong>Logging Exceptions</strong> (this one)</li>
</ol>

<h3>General guidelines</h3>

<p>We&#8217;ll start off with a few general guidelines for logging.</p>

<h4>Always include the exception message in the log</h4>

<div style="margin-left: 2em;">

<p>Make sure you know what actually went wrong, not just that something went wrong.</p>

</div>

<h4>Never lose a stack trace!</h4>

<div style="margin-left: 2em;">

<p>And not only do you want to know what went wrong, you want to know where! An exception without a stack trace is like a person with no memory.</p>

</div>

<h3>Debug levels</h3>

<p>A summary of the typical severity levels used when logging and guidelines on when to use them.</p>

<h4>Info, Debug, or Trace</h4>

<div style="margin-left: 2em;">

<p>Informational messages that highlight the progress of the application at various levels of granularity.</p>

<p>Use logging levels <code>INFO</code>, <code>DEBUG</code>, <code>TRACE</code>.</p>

</div>

<h4>Warnings</h4>

<div style="margin-left: 2em;">

<p>Potentially harmful situations, such as invalid requests which could be some form of attack. It could also be a client (developer) in need of help.</p>

<p>Use logging level <code>WARN</code>.</p>

</div>

<h4>Errors</h4>

<div style="margin-left: 2em;">

<p>Error events that might still allow the application to continue running. For example, uncaught exceptions in your &#8220;catch all&#8221; exception handler.</p>

<p>Use logging level <code>ERROR</code>.</p>

</div>

<h4>Fatal errors</h4>

<div style="margin-left: 2em;">

<p>Very severe error events that will presumably lead the application to abort. Examples include <a href="http://henko.net/imperfection/exception-handling-policy-using-assertions/" title="Exception Handling Policy - Using Assertions">all fired assertions</a>. They should not happen &#8212; they are bugs! Also, all &#8220;errors&#8221; in the Java sense (out of memory etc).</p>

<p>Use logging level <code>FATAL</code>.</p>

</div>

<p>I hope this quick four part series on sensible exception handling has been interesting. Be sure to read the previous installments (see summary at top) and please feel free to add your comments below! Any and all comments are very welcome!</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/exception-handling-policy-logging-exceptions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exception Handling Policy &#8211; Catching Exceptions</title>
		<link>http://henko.net/imperfection/exception-handling-policy-catching-exceptions/</link>
		<comments>http://henko.net/imperfection/exception-handling-policy-catching-exceptions/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 20:17:06 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Implementation]]></category>

		<guid isPermaLink="false">http://henko.net/?p=666</guid>
		<description><![CDATA[This is the third installment in my series on sensible exception handling and will cover when and how to catch exceptions.

To quickly summarize, the series looks as follows:


Throwing Exceptions
Using Assertions
Catching Exceptions (this one)
Logging Exceptions


The information in this post is divided into two parts: when to catch, and how to catch.

When to catch

Here are some guidelines [...]]]></description>
			<content:encoded><![CDATA[<p>This is the third installment in my series on sensible exception handling and will cover when and how to catch exceptions.</p>

<p>To quickly summarize, the series looks as follows:</p>

<ol>
<li><a href="http://henko.net/imperfection/exception-handling-policy-throwing-exception/" title="Exception Handling Policy - Throwing Exceptions">Throwing Exceptions</a></li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-using-assertions/" title="Exception Handling Policy - Using Assertions">Using Assertions</a></li>
<li><strong>Catching Exceptions</strong> (this one)</li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-logging-exceptions/" title="Exception Handling Policy - Logging Exceptions">Logging Exceptions</a></li>
</ol>

<p>The information in this post is divided into two parts: when to catch, and how to catch.</p>

<h3>When to catch</h3>

<p>Here are some guidelines on when to catch exceptions and when to let them propagate up through the call stack.</p>

<h4>Catch only exceptions you know how to handle, and be specific</h4>

<div style="margin-left: 2em;">

<p>If you don&#8217;t know ahead of time what the exception is going to be, you don&#8217;t know how to handle it, and you should send it up the stack.</p>

<p>Catching top-level exception means trying to deal with the really exceptional case, which by definition you can&#8217;t plan for.</p>

</div>

<h4>Provide a general catch-all</h4>

<div style="margin-left: 2em;">

<p>Ensure that all exceptions are caught and reported at some point
This is especially important in a multi-threaded environment, where a thread&#8217;s death may otherwise go unnoticed.</p>

<p>In languages which also have other error mechanisms, such as PHP, make sure that warnings, errors, fatals etc don&#8217;t go unnoticed.</p>

</div>

<h3>How to catch</h3>

<p>When you catch an exception, make sure to do it the right way.</p>

<h4>Do not suppress or ignore exceptions</h4>

<div style="margin-left: 2em;">

<p>NEVER! EVER! Don&#8217;t even while testing. It is not only undisciplined, but you <em>will</em> forget to &#8220;deal with it later&#8221;.</p>

</div>

<h4>Always clean up after yourself</h4>

<div style="margin-left: 2em;">

<p>Finally is usually recommended to guarantee resource cleanup, however you should yourself guarantee that finally never fails. In general, ensure finally never eats up your original exception.</p>

</div>

<h4>Declarative exception handling</h4>

<div style="margin-left: 2em;">

<p>Handling exceptions is an dynamic concern, the right way to handle an exception can easily change. Therefore, use a flexible framework to manage this.</p>

<p>For example Struts allows user defined <code>ExceptionHandlers</code> to be associated on a local or global scope using configuration instead of code. In other words, responses to exceptions should not only based on type but also on context in where they are called.</p>

</div>

<p>Next week, the final episode of the series will be published, so be sure to check back. If you have any comments, please provide them below!</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/exception-handling-policy-catching-exceptions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exception Handling Policy &#8211; Using Assertions</title>
		<link>http://henko.net/imperfection/exception-handling-policy-using-assertions/</link>
		<comments>http://henko.net/imperfection/exception-handling-policy-using-assertions/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 06:00:18 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Implementation]]></category>

		<guid isPermaLink="false">http://henko.net/?p=700</guid>
		<description><![CDATA[This is the second part in a series of four on exception handling and it focuses on an area related to exceptions &#8212; assertions.

A quick summary of posts in this series:


Throwing Exceptions
Using Assertions (this one)
Catching Exceptions
Logging Exceptions


Guidelines for assertions

An assertion is code that&#8217;s used during development that allows a program to check itself as it [...]]]></description>
			<content:encoded><![CDATA[<p>This is the second part in a series of four on exception handling and it focuses on an area related to exceptions &#8212; assertions.</p>

<p>A quick summary of posts in this series:</p>

<ol>
<li><a href="http://henko.net/imperfection/exception-handling-policy-throwing-exception/" title="Exception Handling Policy - Throwing Exceptions">Throwing Exceptions</a></li>
<li><strong>Using Assertions</strong> (this one)</li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-catching-exceptions/" title="Exception Handling Policy - Catching Exceptions">Catching Exceptions</a></li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-logging-exceptions/" title="Exception Handling Policy - Logging Exceptions">Logging Exceptions</a></li>
</ol>

<h3>Guidelines for assertions</h3>

<p>An <a href="http://en.wikipedia.org/wiki/Assertion_(computing)" title="assertion">assertion</a> is code that&#8217;s used during development that allows a program to check itself as it runs. They are used much in the same spirit as unit tests, but spread out in the actual program code. It is a statement placed to indicate that the developer thinks that some predicate is always true at that place.</p>

<h4>Use assertions for conditions that should never occur</h4>

<div style="margin-left: 2em;">

<p>If an assertion is fired for an anomalous condition, the corrective action is not merely to handle an error gracefully — the corrective action is to change the program&#8217;s source code, recompile, and release a new version of the software.</p>

<p>Use assertions to document and verify preconditions and postconditions.</p>

</div>

<h4>Use a barricades to distinguish between assertions and exceptions</h4>

<div style="margin-left: 2em;">

<p>Routines that are outside the barricade should use error handling because it isn&#8217;t safe to make any assumptions about the data. Routines inside the barricade should use assertions, because the data passed to them is supposed to be sanitized before it&#8217;s passed across the barricade. If one of the routines inside the barricade detects bad data, that&#8217;s an error in the program rather than an error in the data.</p>

</div>

<h4>Don&#8217;t put executable code into assertions.</h4>

<div style="margin-left: 2em;">

<p>Doing so raises the possibility that the compiler will eliminate the code when you turn off the assertions. Instead, only put boolean conditions with no side effects in your assertions.</p>

</div>

<h4>For highly robust code, assert and then handle the error any way</h4>

<div style="margin-left: 2em;">

<p>Better safe than sorry, they say.</p>

</div>

<h3>Assertions in Java</h3>

<p>For those unfamiliar with assertions, I&#8217;ll give a quick summary. Java provides the keyword <code><a href="http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html" title="assert">assert</a></code> since version 1.4. It throws a <code>java.lang.AssertionError</code> when it fails, and has the following syntax:</p>

<pre><code>assert expression : "error message shown if expression is false";
</code></pre>

<p>Where <code>expression</code> is any boolean expression which should always be true at the point of the assertion. For example, this variable should always be greater than 0, or that collection should always be empty.</p>

<p>To enable assertions when running a program, use the Java VM <code>-ea</code> (or <code>-enableassertions</code>) switch. Assertions are always compiled in, but without this switch, the assertions are ignored by the virtual machine.</p>

<p>Tune in next week for guidelines for catching exceptions! And please do write any comments or questions you might have below.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/exception-handling-policy-using-assertions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exception Handling Policy &#8211; Throwing Exceptions</title>
		<link>http://henko.net/imperfection/exception-handling-policy-throwing-exception/</link>
		<comments>http://henko.net/imperfection/exception-handling-policy-throwing-exception/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 12:06:23 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Implementation]]></category>

		<guid isPermaLink="false">http://henko.net/?p=662</guid>
		<description><![CDATA[This is the first post in a series of four on exception handling. The series will cover what I think is a good and sound strategy for handling exceptions and errors in your application. It is written with Java in mind, but is applicable to most languages which feature exceptions. This first issue will go through the art of throwing exceptions.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/mbiskoping/510673513/"><img src="http://henko.net/wp-content/uploads/2009/06/exception.jpg" alt="An exception" title="An exception (Copyright by [martin])" width="240" height="234" class="alignright size-full wp-image-695" /></a>This is the first post in a series of four on exception handling.</p>

<p>The series will cover what I think is a good and sound strategy for handling exceptions and errors in your application.</p>

<p>It is written with Java in mind, but is applicable to most languages which feature exceptions.</p>

<p>A quick summary of the coming posts:</p>

<ol>
<li><strong>Throwing Exceptions</strong> (this one)</li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-using-assertions/" title="Exception Handling Policy - Using Assertions">Using Assertions</a></li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-catching-exceptions/" title="Exception Handling Policy - Catching Exceptions">Catching Exceptions</a></li>
<li><a href="http://henko.net/imperfection/exception-handling-policy-logging-exceptions/" title="Exception Handling Policy - Logging Exceptions">Logging Exceptions</a></li>
</ol>

<p>Let&#8217;s get started!</p>

<h3>General</h3>

<p>First, we&#8217;ll go through some things which apply to all types of exceptions.</p>

<h4>Always preserve the stack trace</h4>

<div style="margin-left: 2em;">

<p>Make sure that the stack trace of a wrapped exception is captured and preserved. The single worse thing one can do after eating your exceptions is to to capture it but throw away all the essential details.</p>

<p>Be careful with distributed systems, as simplistic use of Java serialization requires the Exception classes be available in all tiers.</p>

<p>Also, pre JDK 1.4 Exceptions do not preserve the stacktrace.</p>

</div>

<h4>Never use exceptions for flow control</h4>

<div style="margin-left: 2em;">

<p>Exceptions are meant for exceptional events &#8211; when things go wrong. Don&#8217;t build your system based on that something goes wrong.</p>

<p>Also, exceptions are slow, so heavy use of them might lead to performance problems.</p>

</div>

<h4>Provide enough context</h4>

<div style="margin-left: 2em;">

<p>Include information and methods in the exception which help the client deal with the exception.</p>

<p>When defining a new exception don&#8217;t just add a new error message, provide enough context for a catcher to gracefully handle the exception. If an existing exception class doesn&#8217;t have essential context, create a custom one.</p>

</div>

<p>Next, we&#8217;ll discuss checked and unchecked exceptions, and when to use them.</p>

<h3>Checked exceptions</h3>

<p>A checked exception is a Java concept which means an exception which is specified in a method&#8217;s signature. It is a way for the designer to tell the client of a method what might go wrong, so that the client can prepare accordingly.</p>

<h4>Throw a checked exception if a method can&#8217;t fulfill it&#8217;s contract</h4>

<div style="margin-left: 2em;">

<p>Either that, or don&#8217;t promise things you cannot keep.</p>

</div>

<h4>Make your exceptions part of your contract</h4>

<div style="margin-left: 2em;">

<p>Throw an exception which is meaningful in terms of the method&#8217;s contract.</p>

<p>Declare unchecked exceptions in the throws clause &#8211; make it easy for programmers and the IDE to discover the RuntimeExceptions that may be thrown by your method.</p>

<p>Document exceptions in Javadoc.</p>

</div>

<h4>Never let implementation-specific exceptions escalate to the higher layers</h4>

<div style="margin-left: 2em;">

<p>If the client code cannot do anything about a implementation-specific checked exception, convert it to a unchecked exception.</p>

<p>If you are confident that the business layer can take some recovery action when the implementation-specific exception occurs, convert it into a more meaningful checked exception.</p>

</div>

<h3>Unchecked exceptions</h3>

<p>Unchecked exceptions are all other exceptions, which are &#8220;unforeseen&#8221;.</p>

<h4>Prefer unchecked exceptions for all programming errors</h4>

<div style="margin-left: 2em;">

<p>If method parameters are invalid or preconditions not met, throw a unchecked exception. A client shouldn&#8217;t add exception handling code for providing invalid parameters, it should provide valid parameters!</p>

<p>Unchecked exceptions have the benefit of not forcing the client API to explicitly deal with them. They propagate to where you want to catch them, or they go all the way out and get reported.</p>

</div>

<h4>If the client cannot do anything useful, then make the exception unchecked</h4>

<div style="margin-left: 2em;">

<p>No sense in forcing the client to handle an exception it does not know how to deal with.</p>

</div>

<p>Feel free to provide any comments or thoughts below, and check back in a week for the next episode!</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/exception-handling-policy-throwing-exception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yes, Programmers Should Be &#8220;Mathematically Inclined&#8221;</title>
		<link>http://henko.net/imperfection/yes-programmers-should-be-mathematically-inclined/</link>
		<comments>http://henko.net/imperfection/yes-programmers-should-be-mathematically-inclined/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 16:41:48 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Learning]]></category>

		<guid isPermaLink="false">http://henko.net/?p=646</guid>
		<description><![CDATA[This post is a response to Jeff Atwood&#8217;s post/question on Should Competent Programmers be "Mathematically Inclined"?.

I originally intended to just comment that piece, but the sheer amount of comments made me realize that no-one would actually read it anyway. So I might as well write a response in my own blog which about as many [...]]]></description>
			<content:encoded><![CDATA[<p>This post is a response to Jeff Atwood&#8217;s post/question on <a href="http://www.codinghorror.com/blog/archives/001249.html" title="Should Competent Programmers be "Mathematically Inclined"?">Should Competent Programmers be "Mathematically Inclined"?</a>.</p>

<p>I originally intended to just comment that piece, but the sheer amount of comments made me realize that no-one would actually read it anyway. So I might as well write a response in my own blog which about as many will read but which makes me feel better. <img src='http://henko.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<p><a href="http://www.flickr.com/photos/origomi/58198837/"><img alt="" src="http://farm1.static.flickr.com/25/58198837_a18b8c23e7_m.jpg" title="Mathematically Inclined (Copyright 2005 by EricGjerde.)" class="alignright" width="240" height="230" /></a>I believe the answer is &#8220;yes&#8221;. I think that a competent programmer needs to be &#8220;mathematically inclined&#8221;. Not because the average programmer&#8217;s typical work includes much math such as applications in 3D, compression, and image manipulation. In those cases it is fairly obvious that a firm grasp of math is required. I believe the answer is &#8220;yes&#8221; because in my mind &#8220;mathematically inclined&#8221; also means &#8220;good at seeing patterns&#8221;, &#8220;good at identifying duplication&#8221;, &#8220;understands basic complexity theory&#8221;, or simply &#8220;good at groking thinks&#8221;. And while a good understanding of math in general is valuable, I think a solid understanding of discrete math and logic is invaluable.</p>

<p>Finally, I liked what the unnamed author mentioned in Jeff&#8217;s post wrote enough to reprint it here.</p>

<blockquote>
  <p>I run a small (4 people) web dev shop and I&#8217;m finding that younger coders haven&#8217;t had the pleasure of writing assembler or managing without library functions. I&#8217;ve always found strong math skills to be one of the most useful skills for coding, and when one has Google and a massive library of functions, one doesn&#8217;t have to be good at math to get things working, until it either breaks, has edge cases, or brings out OS or library bugs.</p>
  
  <p>Some quick examples: simplifying tricky equations to determine array indicies or memory offsets; trigonometry to help with physical calculations; mental hex/bin/dec conversion; logic equalities such as DeMorgan&#8217;s theorem.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/yes-programmers-should-be-mathematically-inclined/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>Den laglydige taxichauffören</title>
		<link>http://henko.net/imperfection/den-laglydige-taxichaufforen/</link>
		<comments>http://henko.net/imperfection/den-laglydige-taxichaufforen/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 12:05:29 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Solution]]></category>

		<guid isPermaLink="false">http://henko.net/?p=522</guid>
		<description><![CDATA[&#8212; en berättelse som inte har något med rättegången kring the Pirate Bay att göra

Låt oss föreställa oss en helt vanlig taxichaufför.

Taxichauffören har taxilicens och en taxibil som är registrerad enligt konstens alla regler. Det enda som utmärker vår taxichaufför är att han har en lite egen twist &#8212; han tar alla körningar och ställer [...]]]></description>
			<content:encoded><![CDATA[<h3>&mdash; en berättelse som inte har något med rättegången kring the Pirate Bay att göra</h3>

<p><strong>Låt oss föreställa oss en helt vanlig taxichaufför.</strong></p>

<p><img src="http://henko.net/wp-content/uploads/2009/02/pirate-taxi-150x150.png" alt="Taxi with crossbones" title="Taxi with crossbones" align="right" width="150" height="150" class="size-thumbnail wp-image-544" />Taxichauffören har taxilicens och en taxibil som är registrerad enligt konstens alla regler. <strong>Det enda som utmärker vår taxichaufför är att han har en lite egen twist &mdash; han tar alla körningar och ställer inga frågor.</strong></p>

<p>En dag får vår taxichaufför ett uppdrag: Kör till en given adress, vänta med motorn igång och kör därefter till en annan adress. Taxichauffören accepterar. Väl vid den första adressen ser han att det är en bank. Han ser också klart och tydligt hur hans passagerare är inne i banken, hotar personalen och tvingar dem att ge honom pengar. Men vår taxichaufför ställer ju inga frågor så han väntar tills passageraren är klar på banken och kör sedan passageraren till den andra adressen. Körningen är klar och taxichauffören åker hem. <strong>Han inser att han just kört en bankrånare till och från ett rån men är okay med det &mdash; <em>han själv</em> gör ju inget olagligt. Han kör ju bara taxi.</strong></p>

<p>Efter denna incident återkommer både denna passagerare och andra personer som använder taxichauffören för att köra dem till och från rån, inbrott, stölder och andra brott. Taxichauffören fortsätter köra utan att ställa några frågor. Han får inte någon del av bytet utan tar endast ordinarie taxa. <strong>Han är medveten om att hans passagerare begår brott, men sover ändå gott om natten &mdash; <em>han själv</em> gör ju inget olagligt. Han kör ju bara taxi.</strong></p>

<p>Vad tycker du om taxichauffören? Gör han något olagligt? Beter han sig omoraliskt? Kommentera och ge din åsikt!</p>

<hr/>

<p><strong>PS.</strong> Angående något <em>helt</em> annat, Pirate Bay-rättegången pågår. Vad handlar den om egentligen? <strong>Pirate Bay-killarna gör ju inget olagligt. De driver ju bara en webbsajt.</strong> (Eller?)</p>

<p><a href="http://spotify.com"><img src="http://www.spotify.com/wp-content/themes/spotify/images/logo.png" align="right" width="54" alt="Spotify logo" style="border: 0" /></a>
<strong>PPS.</strong> Skivbolagen behöver tänka om! Stöd <a href="http://spotify.com" title="Spotify">Spotify</a> och andra lagliga alternativ och tala om för skivbolagen vad ni vill ha!</p>

<p><strong>PPPS.</strong> Detta inlägg är ej avsett för barn, då de <a href="http://www.tryggabarn.nu/barn/Page13083.html" title="ej förstår ironi">ej förstår ironi</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/den-laglydige-taxichaufforen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Säkerhetshål på GP.se</title>
		<link>http://henko.net/imperfection/sakerhetshal-pa-gpse/</link>
		<comments>http://henko.net/imperfection/sakerhetshal-pa-gpse/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 09:52:02 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>

		<guid isPermaLink="false">http://henko.net/?p=504</guid>
		<description><![CDATA[

En kollega till mig surfade runt på gp.se och lekte med deras TV-spelare. I adressfältet fick han fick syn på en parameter vid namn insertUrl vilket genast fick honom att fundera.

Phishing

Misstanken var logiskt nog att man då kanske kunde visa inte bara GP-TV genom gp.se utan vilken sida som helst. Denna misstanke visade sig vara [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://henko.net/wp-content/uploads/2009/02/gptv.jpg"><img src="http://henko.net/wp-content/uploads/2009/02/gptv2.jpg" alt="GP.se är sårbar för XSS-attacker!" title="GP.se är sårbar för XSS-attacker!" width="422" height="169" class="size-full wp-image-511" style="border: 0" /></a></p>

<p>En kollega till mig surfade runt på gp.se och lekte med deras TV-spelare. I adressfältet fick han fick syn på en parameter vid namn <code>insertUrl</code> vilket genast fick honom att fundera.</p>

<h3>Phishing</h3>

<p>Misstanken var logiskt nog att man då kanske kunde visa inte bara GP-TV genom gp.se utan vilken sida som helst. Denna misstanke visade sig vara helt berättigad. Man kunde alltså få gp.se att visa vilken annan sida som helst inuti en iframe. Och att från en annan sida bryta sig ur en iframe:n är en barnlek. <a href="http://en.wikipedia.org/wiki/Phishing" title="Phishing">Phishing</a>-attack, ja tack!</p>

<h3>Cross-site scripting</h3>

<p>Alright, inte snyggt, men det tar inte slut där. Utöver att de blint litar på den URL som användaren skickar in och glatt visar den i sin iframe, så hade GP gjort ett ännu grövre fel. De hade över huvud taget inte validerat sin indata. Detta är ett av de mest grundläggande säkerhetsfel man över huvud taget kan göra på en webbsida. Det ger en elak person möjligheten att köra valfri kod (html/css/javascript/activex etc) när en användare besöker sidan.</p>

<p>Allt anfallaren behöver göra är att få besökarna att klicka på en specialkonstruerad länk till gp.se. Denna typ av attack kallas <a href="http://en.wikipedia.org/wiki/Cross-site_scripting" title="Cross-site Scripting">Cross-site Scripting</a> (XSS) och kan leda till exempelvis stöld av de konton som finns på gp.se, exempelvis administratörer eller annonsörer. Inte bra! Inte det minsta bra!</p>

<h3>Kontakt med webmaster</h3>

<p><a href="http://www.bloggjakt.se/goteborgs-posten-sarbara-for-cross-site-scripting/" title="Min kollega">Min kollega</a> valde att kontakta GP:s webmaster och påpeka säkerhetsbristen, så att de skulle kunna åtgärda den. Detta gjorde han igår kväll och idag under förmiddagen fick han ett svar att de nu hade åtgärdat problemet. Dock fanns i svaret inte en tillstymmelse till tack. Det kan man ju tycka att de kunde kostat på sig.</p>

<h3>Problemet finns kvar!</h3>

<p>Efter en snabb titt på samma sida kunde vi konstatera att förvisso har de nu en kontroll på <code>insertUrl</code>-argumentet för att försäkra sig om att det är en giltig GP-TV-url, men att säkerhetshålet trots detta kvarstod. Det finns nämligen fler parametrar vars värde också sätts rakt in i HTML-koden som skickas ut till användaren. Så de är fortfarande precis lika sårbara för XSS-attacker!</p>

<h3>Sammanfattning</h3>

<p>Så summa summarum, GP lyckas skapa en sida som inte bara lider av ett stort säkerhetsproblem, utan två! Två problem som är fullständigt grundläggande när det gäller säkerhet på webben. När vi påpekar det för dem svarar de kallt att det är fixat&#8230; men problemet kvarstår!</p>

<p>Jag är egentligen inte ett fan av &#8220;<a href="http://en.wikipedia.org/wiki/Full_disclosure" title="full disclosure">full disclosure</a>&#8221; gällande säkerhetsbrister, men det finns en gräns! När de helt lyckas missa grundläggande säkerhetshål inte bara en gång utan även en andra gång efter att fått information om att hålet existerar, då har de gått över den gränsen!</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/sakerhetshal-pa-gpse/feed/</wfw:commentRss>
		<slash:comments>6</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>Join a Proud Minority, Read Books</title>
		<link>http://henko.net/imperfection/join-a-proud-minority-read-books/</link>
		<comments>http://henko.net/imperfection/join-a-proud-minority-read-books/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 07:00:30 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Learning]]></category>

		<guid isPermaLink="false">http://henko.net/?p=312</guid>
		<description><![CDATA[A few days ago, I a girl caught my attention on the tram. Now, a lot of girls catch my attention, but this time it wasn&#8217;t actually the girl herself but her shoulder bag which caught my attention. It happened to have a print which I thought was pretty funny.


  Join a proud minority [...]]]></description>
			<content:encoded><![CDATA[<script type='text/javascript' language='javascript' charset='utf-8' src='http://s3.polldaddy.com/p/1049315.js'></script><noscript> <a href='http://answers.polldaddy.com/poll/1049315/'>View Poll</a></noscript>

<p>A few days ago, I a girl caught my attention on the tram. Now, a lot of girls catch my attention, but this time it wasn&#8217;t actually the girl herself but her shoulder bag which caught my attention. It happened to have a print which I thought was pretty funny.</p>

<blockquote>
  <p>Join a proud minority &#8212; read books.</p>
</blockquote>

<p>First I thought that was rather witty, but then it actually made me sad. Are people who read books (by free will) actually a minority? If I restrict myself to the software development world, then apparently they are. According to DeMarco and Lister in <a href="http://www.amazon.com/gp/product/0932633439?ie=UTF8&#038;tag=henkonet-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0932633439">Peopleware</a>:<img src="http://www.assoc-amazon.com/e/ir?t=henkonet-20&#038;l=as2&#038;o=1&#038;a=0932633439" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>

<blockquote>
  <p>The statistics about reading are particularly discouraging: The average software developer, for example, doesn&#8217;t own a single book on the subject of his or her work, and hasn&#8217;t ever read one. That fact is horrifying for anyone concerned about the quality of work in the field.</p>
</blockquote>

<p>Consider if this would have been some other field, say medicine. Would you have liked to hear your surgeon say, &#8220;nah, I don&#8217;t really read books, I base most of what I do on reading blogs&#8221;. I sure wouldn&#8217;t!</p>

<h3>Why you should read books</h3>

<p>Alright, why should you read books? Why not just read blogs? Good question! And here&#8217;s why:</p>

<p><strong>Books are better than blogs!</strong></p>

<p>Now, that&#8217;s a pretty tough argument. Of course, I&#8217;m not saying that blogs are bad, but what I am saying is that so much more work has been put into the really great books than into any blog out there. Don&#8217;t waste all that work! By reading books, you will learn stuff you otherwise wouldn&#8217;t have and you&#8217;ll get a deeper understanding of it.</p>

<p>Now, don&#8217;t get me wrong. Blogs are truly essential and a great part of the internet. All programmers should consider themselves very lucky for having access to all that material. However, their content is typically only good after a couple of loops in the echo chamber (aka blogosphere). When you buy a (good) book, the material you get is already refined, it has already gone through all that necessary editing.</p>

<h3>When not to buy books</h3>

<p>You might ask yourself, why should I buy books which will be outdated in a year anyway? Also, there are no hyperlinks in books. Books suck! Well, in this regard, I completely agree. The answer is:</p>

<p><strong>Don&#8217;t buy reference books.</strong></p>

<p>Here I&#8217;m going to quote Jeff Atwood, because he <a href="http://www.codinghorror.com/blog/archives/001108.html" title="explained it">explained it</a> very nicely.</p>

<blockquote>
  <p>The best programming books are timeless. They transcend choice of language, IDE, or platform. They do not explain how, but why. If you feel compelled to clean house on your bookshelf every five years, trust me on this, you&#8217;re buying the wrong programming books.</p>
</blockquote>

<h3>How about you?</h3>

<p>So, that&#8217;s my thoughts on the subject. What do you think? Do you read books? What is the best book you&#8217;ve read? The worst? Why? Answer with a comment!</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/join-a-proud-minority-read-books/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>People Who Are Smarter Than I Am</title>
		<link>http://henko.net/imperfection/people-who-are-smarter-than-i-am/</link>
		<comments>http://henko.net/imperfection/people-who-are-smarter-than-i-am/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 07:00:54 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Learning]]></category>

		<guid isPermaLink="false">http://henko.net/?p=330</guid>
		<description><![CDATA[I have realized that some people are smarter than I am. It is a painful realization but I just can&#8217;t ignore the evidence any longer. Allow me to explain.



I often get inspiration to write posts from reading books or blogs by really smart people. Thus, I often refer to people who are smarter than me. [...]]]></description>
			<content:encoded><![CDATA[<p>I have realized that some people are smarter than I am. It is a painful realization but I just can&#8217;t ignore the evidence any longer. Allow me to explain.</p>

<p><a href="http://flickr.com/photos/nelsonlai/1258727102/"><img src="http://henko.net/wp-content/uploads/2008/11/1258727102_3a89581878_m1.jpg" alt="Sign: No understanding at any time." title="No understanding (Image copyright by Nelson Lai)" class="alignright size-medium wp-image-362" /></a></p>

<p>I often get inspiration to write posts from reading books or blogs by really smart people. Thus, I often refer to people who are smarter than me. Sometimes I&#8217;m lucky enough to get comments from these people on my posts. While I&#8217;m typically rather convinced by my own reasoning when I write the post in question, every time I get such a comment I am struck by how much smarter they are than me.</p>

<p>Recent cases where this has happened:</p>

<ul>
<li><a href="http://henko.net/imperfection/not-converging-on-an-estimate/#comment-10420" title="Mike Cohns comment">Mike Cohns comment</a> on <a href="http://henko.net/imperfection/not-converging-on-an-estimate/" title="Not Converging on an Estimate">Not Converging on an Estimate</a>:  I discussed an adaption of some advice he gave in a book. However, my adaption forced me to ignore other parts of the same advice. He pointed out that there was no problem in actually doing both parts.</li>
<li><a href="http://henko.net/imperfection/full-statement-coverage/" title="Full statement coverage">Full Statement Coverage</a>: I wondered why Ron Jeffries was writing such sloppy unit tests in <a href="http://search.atomz.com/search/?sp-q=sudoku&amp;sp-a=sp01062000&amp;sp-advanced=1&amp;sp-p=any&amp;sp-w-control=1&amp;sp-d=custom&amp;sp-date-range=-1&amp;sp-start-month=0&amp;sp-start-day=0&amp;sp-start-year=&amp;sp-end-month=0&amp;sp-end-day=0&amp;sp-end-year=&amp;sp-x=title&amp;sp-c=10&amp;sp-m=1&amp;sp-s=0" title="some of his articles">some of his articles</a>. He didn&#8217;t seem to test even half of the code he wrote. A short email conversation later I had realized that he of course wasn&#8217;t sloppy, but rather just much more clever than I was.</li>
</ul>

<p>So, I simply hadn&#8217;t understood what they meant the first time? I don&#8217;t believe it&#8217;s as simple as that. I think I did understand. Most of the time anyway. But my level of understanding just wasn&#8217;t as deep as theirs.</p>

<p>The upside is that every such moment makes me a little bit smarter! <img src='http://henko.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Have you experienced a similar situation? What was your latest &#8220;revelation&#8221;?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/people-who-are-smarter-than-i-am/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not Converging on an Estimate</title>
		<link>http://henko.net/imperfection/not-converging-on-an-estimate/</link>
		<comments>http://henko.net/imperfection/not-converging-on-an-estimate/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 06:00:06 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Planning]]></category>

		<guid isPermaLink="false">http://henko.net/?p=234</guid>
		<description><![CDATA[In his great book User Stories Applied, Mike Cohn suggests that &#8220;the goal is for the estimators to converge on a single estimate.&#8221; While discussing this with a senior product owner at a major Swedish telco (guess which one!), I came to realize that there might be a point in not converging on a single [...]]]></description>
			<content:encoded><![CDATA[<p>In his great book <a href="http://www.amazon.com/gp/product/0321205685?ie=UTF8&#038;tag=henkonet-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321205685">User Stories Applied</a><img src="http://www.assoc-amazon.com/e/ir?t=henkonet-20&#038;l=as2&#038;o=1&#038;a=0321205685" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, Mike Cohn suggests that &#8220;the goal is for the estimators to converge on a single estimate.&#8221; While discussing this with a senior product owner at a major Swedish telco (guess which one!), I came to realize that there might be a point in <em>not</em> converging on a single estimate when doing time estimation.</p>

<div class="alignmiddle">
<a href="http://flickr.com/photos/dcassaa/520211405/"><img src="http://henko.net/wp-content/uploads/2008/10/converge-300x76.jpg" alt="" title="Converge. (Image copyright by Davide Cassanello)" width="300" height="76" class="size-medium wp-image-285" /></a>
</div>

<h3>The steps</h3>

<p>I tried to perform the following steps.</p>

<ol>
<li>Define the scope of what you&#8217;re estimating.</li>
<li>As Mike Cohn suggests, ask each developer to make an estimate and write it down.</li>
<li>After everybody has made up their own mind, take note of all estimates.</li>
<li>Discuss the estimates if wanted, but do <em>not</em> revise them! (Unless someone completely misunderstood the scope.)</li>
</ol>

<p>By writing the scores down and not revising them, developers do not get a chance to influence each other. If all of these original, uninfluenced, estimates are close to each other, you can probably be more secure with that estimate. On the other hand, if they are spread out you get an indication that risk is rather high. Estimating this way actually gives you more information, as you not only get a mean value from the estimates, but also a precision or confidence interval.</p>

<h3>Related thoughts</h3>

<p>Max Pool has been arguing for <a href="http://www.codesqueeze.com/quit-sweeping-known-uncertainity-under-the-rug/" title="a similar approach">a similar approach</a>, where you estimate in ranges. However, using the approach suggested above, you don&#8217;t have to set a percentage probability yourself (which might be a hard number to come up with) &#8212; you get it for free.</p>

<p>Furthermore, if you think about it, estimating with just a single value is almost meaningless anyway &#8212; you&#8217;ve always got a precision, that is, an interval. When you say that something will take &#8220;2 days&#8221;, what is the precision? Two days within a second? Minute? Hour? Day? Week? Also, is it an upper bound? Lower bound? Mean value? Using an interval gives you a good way of making these assumptions much more explicit.</p>

<p>What are your thoughts? Have you estimated using something else than a point value? Do you disagree? Let me know!</p>

<h3>Update</h3>

<p>In his comment below, Mike Cohn pointed out that I in fact can have my cake and eat it too. I can use the highest estimate as a &#8220;upper bound&#8221; and also continue discussing and re-estimating until everybody agrees on a single estimate. That way we get a range but do not lose the valuable discussion during the convergence.</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/not-converging-on-an-estimate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Minimizing Irreversible Actions</title>
		<link>http://henko.net/imperfection/minimizing-irreversible-actions/</link>
		<comments>http://henko.net/imperfection/minimizing-irreversible-actions/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 06:00:11 +0000</pubDate>
		<dc:creator>Henrik Jernevad</dc:creator>
				<category><![CDATA[Imperfection]]></category>
		<category><![CDATA[Principles]]></category>

		<guid isPermaLink="false">http://henko.net/?p=173</guid>
		<description><![CDATA[Reading Lean Software Development, I stumbled upon the following quote.


  As a keynote speaker at a software conference, Enrico Zaninotto, an Italian economist, pointed out that the underlying economic mechanism for controlling complexity in just-in-time systems is minimizing irreversible actions.


The notion of &#8220;minimizing irreversible actions&#8221; strikes me as a better way of capturing that [...]]]></description>
			<content:encoded><![CDATA[<p>Reading <a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&#038;tag=henkonet-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321150783">Lean Software Development</a><img src="http://www.assoc-amazon.com/e/ir?t=henkonet-20&#038;l=as2&#038;o=1&#038;a=0321150783" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, I stumbled upon the following quote.</p>

<blockquote>
  <p>As a keynote speaker at a software conference, Enrico Zaninotto, an Italian economist, pointed out that the underlying economic mechanism for controlling complexity in just-in-time systems is minimizing irreversible actions.</p>
</blockquote>

<p><a href="http://flickr.com/photos/lucias_clay/2699584043/"><img src="http://henko.net/wp-content/uploads/2008/10/2699584043_a50b5056a4_m.jpg" alt="" title="Irreversible decision. (Image copyright by Lucias Clay)" width="118" height="240" class="alignright size-full wp-image-178" /></a>The notion of &#8220;minimizing irreversible actions&#8221; strikes me as a better way of capturing that whole idea than the more established &#8220;<a href="http://www.codinghorror.com/blog/archives/000705.html" title="last responsible moment">last responsible moment</a>&#8220;. The latter suggests that you should delay making decisions for as long as you can. I feel that sends the wrong signal. You can make decisions. You <em>must</em> make decisions. Not making a decision is a decision in itself. Just don&#8217;t make decisions that you cannot change &#8212; keep your options open. By thinking that you must not make decisions until the &#8220;last responsible moment&#8221;, it is easy to delay the decision longer than is actually responsible.</p>

<p>I believe this is especially true for software architecture. In the name of &#8220;last responsible moment&#8221;, many developers <a href="http://henko.net/imperfection/do-design/" title="Do design, just not Big and Up Front">avoid making architectural decisions</a>, thinking the architecture will emerge by itself. But to quote Grady Booch in a response to a letter &#8220;The Relevance of Architecture&#8221; in IEEE Software (Volume 24 Number 5).</p>

<blockquote>
  <p>Every system has an architecture; some are accidental, others intentional.</p>
</blockquote>

<p>Which is yours?</p>
]]></content:encoded>
			<wfw:commentRss>http://henko.net/imperfection/minimizing-irreversible-actions/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>
	</channel>
</rss>

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