<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>www.hans-eric.com</title>
	
	<link>http://www.hans-eric.com</link>
	<description>Hans-Eric Grönlund on software development</description>
	<lastBuildDate>Thu, 29 Jul 2010 17:32:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/hans-eric" /><feedburner:info uri="hans-eric" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>60.666667</geo:lat><geo:long>17.132975</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><image><link>http://www.hans-eric.com</link><url>http://www.hans-eric.com/hans-eric.png</url><title>Hans-Eric Grönlund</title></image><feedburner:emailServiceId>hans-eric</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Generics are Litter</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/1IMmRlPYoTI/</link>
		<comments>http://www.hans-eric.com/2010/07/28/generics-are-litter/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 17:52:20 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[constructed types]]></category>
		<category><![CDATA[generics]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=411</guid>
		<description><![CDATA[The short version of this post:
Do not spread generic types around. They are ugly and primitive.
Allow me to elaborate.
Generics are great
Before we got Generics (2004 in Java, 2005 in C#, and 2009 in Delphi) the way to enforce type safety on a collection type was to encapsulate it and use delegation.

class OrderList
{
  private ArrayList items = new [...]]]></description>
			<content:encoded><![CDATA[<p>The short version of this post:</p>
<p><em>Do not spread generic types around. They are ugly and primitive.</em></p>
<p>Allow me to elaborate.</p>
<h3>Generics are great</h3>
<p>Before we got <a title="Wikipedia: Generic Programming" href="http://en.wikipedia.org/wiki/Generic_programming">Generics</a> (2004 in Java, 2005 in C#, and 2009 in Delphi) the way to enforce type safety on a collection type was to encapsulate it and use delegation.</p>
<pre class="brush: csharp;">
class OrderList
{
  private ArrayList items = new ArrayList();

  public void Add(OrderItem item)
  {
    items.Add(item);
  }

  // Plus lots of more delegation code
  // to implement Remove, foreach, etc.
}
</pre>
<p>Nowadays, we can construct our own type safe collection types with a single line of code.</p>
<pre class="brush: csharp;">
List&lt;OrderItem&gt; orders = new List&lt;OrderItem&gt;();
</pre>
<p>That alone is good reason to love generics, and there lies the problem; many developers have come to love their generics a little too much.</p>
<h3>Generics are ugly</h3>
<p>The expressiveness of generics comes at a price, the price of syntactic noise. That&#8217;s natural. We must specify the parameterized types somehow, and the current syntax for doing so is probably as good as anything else.</p>
<p>Still, my feeling when I look at code with generics is that the constructed types don’t harmonize with the rest of the language. They kind of stand out, and are slightly negative for code readability.</p>
<pre class="brush: csharp;">
OrderList orders = new OrderList();
// as compared to
List&lt;OrderItem&gt; orders = new List&lt;OrderItem&gt;();
</pre>
<p>This might not be so bad, but when we start to pass the constructed types around they become more and more like litter.</p>
<pre class="brush: csharp;">
List&lt;OrderItem&gt; FetchOrders()
{
  //…
}

double CalculateTotalSum(List&lt;OrderItem&gt; orders)
{
  //…
}

void PrintOrders(List&lt;OrderItem&gt; orders)
{
  //…
}
</pre>
<p>Besides being noisy, the constructed types expose implementation decisions. In our case the list of orders is implemented as a straight list. What if we found out that using a hash table implementation for performance reasons <a href="http://softscenario.blogspot.com/2009/05/performance-testing-of-dictionary-list.html">would be better?</a> Then we’d have to change the declaration in all those places.</p>
<pre class="brush: csharp;">
Dictionary&lt;OrderItem, OrderItem&gt; FetchOrders()
{
  //…
}

double CalculateTotalSum(Dictionary&lt;OrderItem, OrderItem&gt; orders)
{
  //…
}

void PrintOrders(Dictionary&lt;OrderItem, OrderItem&gt; orders)
{
  //…
}
</pre>
<p>Comments redundant.</p>
<h3>Generics are primitive</h3>
<p>A related problem is that the constructed generic types encourage design that is more procedural than object-oriented. As an example, consider the CalculateTotalSum method again.</p>
<pre class="brush: csharp;">
double CalculateTotalSum(List&lt;OrderItem&gt; orders)
{
  //…
}
</pre>
<p>Clearly, this method belongs in the <em>List&lt;OrderItem&gt;</em> type. Ideally, we should be able to invoke it using the dot operator.</p>
<pre class="brush: csharp;">
orders.TotalSum();
// instead of
CalculateTotalSum(orders);
</pre>
<p>But we cannot make that refactoring. We cannot add a TotalSum method to the <em>List&lt;OrderItem&gt;</em> type. (Well maybe we can if we make it an <a href="http://en.wikipedia.org/wiki/Extension_method">extension method</a>, but I wouldn’t go there.) In that sense, constructed generic types are primitive types, closed and out of our control.</p>
<h3>So we should hide them</h3>
<p>Don’t get me wrong. I use generics a lot. But for the previously given reasons I do my best to hide them. I do that using the same encapsulation technique as before, or – at the very least – by inheriting the constructed types.</p>
<pre class="brush: csharp;">
class OrderList : List&lt;OrderItem&gt;
{
  double TotalSum()
  {
    //…
  }
}
</pre>
<p>So, the rule I go by to mitigate the downsides of generics, is this:</p>
<p><strong>Constructed types should always stay encapsulated. Never let them leak through any abstraction layers, be it methods, interfaces or classes.</strong></p>
<p>That is my view on Generics. What is yours?</p>
<p>Cheers!</p>
<p>P.S.</p>
<p>Just to be clear, the beef I have with Generics is with <a href="http://en.csharp-online.net/ECMA-334:_25.5_Constructed_types">constructed types</a> alone. I have nothing against using open generic types in public interfaces, although that is more likely to be a tool of library and framework developers.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/gadz1-WfrtLR1bYv6jTI0uz8cnk/0/da"><img src="http://feedads.g.doubleclick.net/~a/gadz1-WfrtLR1bYv6jTI0uz8cnk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/gadz1-WfrtLR1bYv6jTI0uz8cnk/1/da"><img src="http://feedads.g.doubleclick.net/~a/gadz1-WfrtLR1bYv6jTI0uz8cnk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1IMmRlPYoTI:D9sgwoCaal0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1IMmRlPYoTI:D9sgwoCaal0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1IMmRlPYoTI:D9sgwoCaal0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1IMmRlPYoTI:D9sgwoCaal0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1IMmRlPYoTI:D9sgwoCaal0:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/1IMmRlPYoTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/07/28/generics-are-litter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/07/28/generics-are-litter/</feedburner:origLink></item>
		<item>
		<title>The Boy Scout Rule</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/BVzpSAoyz9o/</link>
		<comments>http://www.hans-eric.com/2010/07/26/the-boy-scout-rule/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 15:27:57 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[opinion]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=405</guid>
		<description><![CDATA[You may have heard of The Boy Scout Rule. (I hadn’t until I watched a recorded presentation by “Uncle Bob”.)
You should always leave the camp ground cleaner than you found it.
Applied to programming, it means we should have the ambition of always leaving the code cleaner than we found it. Sounds great, but before we [...]]]></description>
			<content:encoded><![CDATA[<p>You may have heard of The Boy Scout Rule. (I hadn’t until I watched <a title="InfoQ: Robert C. Martin on Bad Code" href="http://www.infoq.com/presentations/Robert-C.-Martin-Bad-Code">a recorded presentation by “Uncle Bob”</a>.)</p>
<blockquote><p>You should always leave the camp ground cleaner than you found it.</p></blockquote>
<p>Applied to programming, it means we should have the ambition of always leaving the code cleaner than we found it. Sounds great, but before we set ourselves to the mission we might benefit from asking a couple of questions.</p>
<p>1. What is clean code?<br />
2. When and what should we clean?</p>
<h3>Clean Code</h3>
<p>What is clean code? <a title="Definition: Clean Code" href="http://en.wiktionary.org/wiki/clean_code">Wictionary defines it</a> like so:</p>
<blockquote><p>software code that is formatted correctly and in an organized manner so that another coder can easily read or modify it</p></blockquote>
<p>That, by necessity, is a rather vague definition. The goal of being readable and modifiable to another programmer, although highly subjective, is pretty clear. But what is a correct format? What does an organised manner look like in code? Let’s see if we can make it a little more explicit.</p>
<h3>Code Readability</h3>
<p>The easiest way to mess up otherwise good code is to make it inconsistent. For me, it really doesn’t matter where we put brackets, if we use camelCase or PascalCase for variable names, spaces or tabs as indentations, etc. It’s when we mix the different styles that we end up with sloppy code.</p>
<p>Another way to make code difficult to take in is to make it compact. Just like any other type of text, code gets more readable if it contains some space.</p>
<p>Although the previous definition mentions nothing about it, good naming of methods, classes, variables, etc, is at the essence of readable code. Code with poorly named abstractions is not clean code.</p>
<h3>Organized for Reusability</h3>
<p>Formatting code is easy. Designing for readability, on the other hand, is harder. How do we organize the code so that it is easily read and modifiable?</p>
<p>One thing we know, is that long chunks of code is more difficult to read and harder to reuse. So, one goal should be to have small methods. But to what cost? For instance, should we refactor code like this?</p>
<pre class="brush: csharp;">
SomeInterface si = (SomeInterface)someObject;
doSomething(si);
</pre>
<p>Into this?</p>
<pre class="brush: csharp;">
doSomething((SomeInterface)someObject);
</pre>
<p>What about code like this?</p>
<pre class="brush: csharp;">
string someString;
if (a &gt;= b)
  someString = “a is bigger or equal to b”;
else
  someString = “b is bigger”;
</pre>
<p>Into this?</p>
<pre class="brush: csharp;">
string someString = a &gt;= b ? “a is bigger or equal to b” : “b is bigger”;
</pre>
<p>In my opinion, the readability gains of the above refactorings are questionable. Better than reducing the number of rows in more or less clever ways, is to focus on improving abstractions.</p>
<h3>Extract &#8217;til you drop</h3>
<p>Abstractions are things with names, like methods or classes. You use them to separate the whats from the hows. They are your best weapons in the fight for readability, reusability and flexibility.</p>
<p>A good way to improve abstractions in existing code is to extract methods from big methods, and classes from bulky classes. You can do this until there is nothing more to extract. As Robert C. Martin puts it, extract until you drop.</p>
<p>That leads me to my own definition of clean code.</p>
<p>• It is readable.<br />
• It is consistent.<br />
• It consists of fine grained, reusable abstractions with helpful names.</p>
<h3>When to clean</h3>
<p>Changing code is always associated with risk and “cleaning” is no exception. You could:</p>
<p>• Introduce bugs<br />
• Cause build breaks<br />
• Create merge conflicts</p>
<p>So, there are good reasons not to be carried away. A great enabling factor is how well your code is covered by automatic tests. Higher code coverage enables more brutal cleaning. A team with no automatic testing should be more careful, though, about what kind of cleaning they should do.</p>
<p>Also, to avoid annoying your fellow programmers it’s best to avoid sweeping changes that may result in check-in conflicts for others. Restrict your cleaning to the camp ground, the part of the code that you’re currently working on. Don’t venture out on forest-wide cleaning missions.</p>
<p>If the team does not share common coding rules, there&#8217;s a risk that you end up in &#8220;Curly Brace Wars&#8221;, or other <a title="On Religious Wars in Software" href="http://haacked.com/archive/2006/02/08/OnReligiousWarsinSoftware.aspx">religious software wars</a> driven by team members&#8217; individual preferences. This leads to inconsistency, annoyance and loss of energy. The only way to avoid it is to agree upon a common set of code rules.</p>
<p>With all that said, I have never imposed “cleaning” restrictions on my teams. They are allowed to do whatever refactorings they find necessary. If they are actively “cleaning” the code it means they care about quality, and that’s the way I like it. In the rare cases excessive cleaning cause problems, most teams will handle it and change their processes accordingly.</p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/MCkuKklPxAv183n99qlwh-P2F6I/0/da"><img src="http://feedads.g.doubleclick.net/~a/MCkuKklPxAv183n99qlwh-P2F6I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/MCkuKklPxAv183n99qlwh-P2F6I/1/da"><img src="http://feedads.g.doubleclick.net/~a/MCkuKklPxAv183n99qlwh-P2F6I/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=BVzpSAoyz9o:FaSKs7YaZio:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=BVzpSAoyz9o:FaSKs7YaZio:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=BVzpSAoyz9o:FaSKs7YaZio:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=BVzpSAoyz9o:FaSKs7YaZio:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=BVzpSAoyz9o:FaSKs7YaZio:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/BVzpSAoyz9o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/07/26/the-boy-scout-rule/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/07/26/the-boy-scout-rule/</feedburner:origLink></item>
		<item>
		<title>D Brush For SyntaxHighlighter</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/vnJseOg9y3I/</link>
		<comments>http://www.hans-eric.com/2010/07/22/d-brush-for-syntaxhighlighter/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 17:36:56 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[blogging]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[SyntaxHighlighter]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=400</guid>
		<description><![CDATA[I&#8217;ve been looking for a way to display prettier code snippets on this blog. The SyntaxHighlighter by Alex Gorbatchev, nicely packaged into a Wordpress plugin by Viper007Bond, had what I was looking for.
I&#8217;ve been using the plugin for a couple of months now and I&#8217;m quite happy with it. The only problem, for me, has been that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been looking for a way to display prettier code snippets on this blog. The SyntaxHighlighter by Alex Gorbatchev, <a title="SyntaxHighlighter Evolved" href="http://wordpress.org/extend/plugins/syntaxhighlighter/">nicely packaged into a Wordpress plugin</a> by Viper007Bond, had what I was looking for.</p>
<p>I&#8217;ve been using the plugin for a couple of months now and I&#8217;m quite happy with it. The only problem, for me, has been that it doesn&#8217;t support The D Programming Language. Since I couldn&#8217;t find any on the internet, I decided to implement a D brush myself. (It&#8217;s quite simple.)</p>
<p><a title="Adding a New Brush Language" href="http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/adding-a-new-brush-language/">Following Viper&#8217;s advice</a> I implemented the support as a tiny Wordpress plugin. If you&#8217;re using SyntaxHighligher Evolved and want to be able to display syntax highlighted D code, feel free to <a title="SyntaxHighlighter Evolved: D Brush Support" href="http://www.hans-eric.com/share/shbrushd/">download shBrushD</a> from my new Shared Stuff page.</p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/7Mp2gxQyKPZY9vK1c4vFwLfQUDE/0/da"><img src="http://feedads.g.doubleclick.net/~a/7Mp2gxQyKPZY9vK1c4vFwLfQUDE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7Mp2gxQyKPZY9vK1c4vFwLfQUDE/1/da"><img src="http://feedads.g.doubleclick.net/~a/7Mp2gxQyKPZY9vK1c4vFwLfQUDE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vnJseOg9y3I:UEEWQojVong:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vnJseOg9y3I:UEEWQojVong:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vnJseOg9y3I:UEEWQojVong:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vnJseOg9y3I:UEEWQojVong:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vnJseOg9y3I:UEEWQojVong:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/vnJseOg9y3I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/07/22/d-brush-for-syntaxhighlighter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/07/22/d-brush-for-syntaxhighlighter/</feedburner:origLink></item>
		<item>
		<title>The Essence of Project Management</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/vuPvFpC2BJI/</link>
		<comments>http://www.hans-eric.com/2010/07/20/the-essence-of-project-management/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 13:57:33 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[project management]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=345</guid>
		<description><![CDATA[I have a very simple philosophy when managing software development projects. It keeps me from derailing in this ever changing environment that is our craft. Regardless of whatever methodology and practices we currently use, I turn to these three questions for guidance.

Is the team as productive as it can be?
Is it doing the right things?
Is [...]]]></description>
			<content:encoded><![CDATA[<p>I have a very simple philosophy when managing software development projects. It keeps me from derailing in this ever changing environment that is our craft. Regardless of whatever methodology and practices we currently use, I turn to these three questions for guidance.</p>
<ol>
<li>Is the team as productive as it can be?</li>
<li>Is it doing the right things?</li>
<li>Is it delivering on expectations?</li>
</ol>
<p>To me those questions represent the essence of project management. Finding the answers, identifying the impediments and removing them are what I consider my most important tasks as a project manager; not to impose <a title="Agile Project Management Delivers Nothing" href="http://www.hans-eric.com/2010/01/22/apm-delivers-nothing/">a particular methodology</a>.</p>
<h3>Productive teams</h3>
<p>Good questions to ask while analyzing the productivity of a team might be:</p>
<ul>
<li>Does the team contain the right people?</li>
<li>Is it getting rapid answers?</li>
<li>Is it getting quick feedback?</li>
<li>Is it optimized for long term or short term productivity?</li>
</ul>
<p>In software development, the only measure of team productivity is its ability to produce working software. So if you want to maximize your team’s productivity you should focus on <a title="Programmer or Developer" href="http://www.hans-eric.com/2007/09/04/programmer-or-developer/">those capable of creating software</a>. Make sure they can spend as much time as possible producing customer value.</p>
<p>For that reason, I think twice before I ask my developers to perform some compliance activity, like writing a report. It’s almost always better to have someone else do stuff like that. If I need information I can always ask, and if writing a report is necessary, I can collect the information and write the report myself. That way I contribute to keeping the team focused and productive, which is more important than to ease my own work load.</p>
<p>Monitoring the team’s productivity is an important task of the project manager. I do this mainly by being around the team a lot. Taking an interest in each individual’s working situation and task at hand is the best way to pick up problems and impediments.<br />
Other important sources of information (although not as efficient as <a title="Management By Walking Around" href="http://www.businessdictionary.com/definition/management-by-walking-around-MBWA.html">MBWA</a>) are the <a title="Daily Scrum" href="http://www.mountaingoatsoftware.com/scrum/daily-scrum">daily meetings</a> and <a title="Sprint Retrospective Meeting" href="http://abrachan.wordpress.com/scrum/scrum/sprint-retrospective-meeting/">iteration retrospective</a>.</p>
<p>If you’re really lucky; with the right material and inspiring goals, <a title="Is Your Team Jelled?" href="http://www.hans-eric.com/2007/08/13/is-your-team-jelled/">the team jells</a> and becomes hyper productive. That is every project manager’s dream, but few get to experience it.</p>
<h3>Efficient teams</h3>
<p>But being productive is not enough. What we really want is efficiency, and to be efficient you need to be both productive and produce the right things. Right in this sense means the right features, with the right quality, in the right order.</p>
<p>To eliminate the risk of producing wrong features you need to work closely with the customer. Make the feedback loop as short as possible, preferably by utilizing an onboard customer, or at least by holding regular <a title="Sprint Review Meeting" href="http://www.mountaingoatsoftware.com/scrum/sprint-review-meeting">review meetings</a>.</p>
<p>Another thing you’d really want to do is to have the planned features prioritized. For some reason many customers (here in Sweden at least) are generally unwilling to do this for you.<br />
“I decided what I want to include in the release, didn’t I? All those features are equally important.”</p>
<p>The problem with leaving priorities to the team is that the system will be developed in an arbitrary order, most likely with the easiest features first. While that may have a value in some situations, the downside is that it decreases the project’s chance of success. The reason is, that without customer value as the leading beacon, chances are that you’ll end up with a lot more bells and whistles than you can afford. And when you find that out it’ll be too late to rectify.</p>
<h3>Dealing with expectations</h3>
<p>How do you define project success? Here is one definition:</p>
<p><strong>If the output is in line with what the customer expects, the project is successful.</strong></p>
<p>The good thing with this definition is that it implies another variable to work with besides output, namely customer expectations. If the answer is yes to both questions 1 and 2 above, we know we are maximizing the output. But if that still isn’t good enough, we have only one option left. We must change the customer’s expectations, or fail.</p>
<p>Again, the best way to tune the customer expectations is a tight feedback loop. If the customer sees the progress regularely, she will adjust her expectations accordingly, or have a chance to react to reality. Either way, the chance for success increases.</p>
<p>Never lose focus on the end goal.</p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/YfzWgMoP9pKOYBF-0T7kDMwLN5c/0/da"><img src="http://feedads.g.doubleclick.net/~a/YfzWgMoP9pKOYBF-0T7kDMwLN5c/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/YfzWgMoP9pKOYBF-0T7kDMwLN5c/1/da"><img src="http://feedads.g.doubleclick.net/~a/YfzWgMoP9pKOYBF-0T7kDMwLN5c/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vuPvFpC2BJI:6UYRsJCsZh8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vuPvFpC2BJI:6UYRsJCsZh8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vuPvFpC2BJI:6UYRsJCsZh8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=vuPvFpC2BJI:6UYRsJCsZh8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=vuPvFpC2BJI:6UYRsJCsZh8:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/vuPvFpC2BJI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/07/20/the-essence-of-project-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/07/20/the-essence-of-project-management/</feedburner:origLink></item>
		<item>
		<title>Two Halves Make One Whole</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/MpRxcRd-lAQ/</link>
		<comments>http://www.hans-eric.com/2010/07/17/two-halves-make-one-whole/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 18:00:21 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[pair programming]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=349</guid>
		<description><![CDATA[I invested an hour watching a recorded speak by Martin Fowler and Neal Ford at some Paris convention. It was a well spent hour &#8212; as always with Martin Fowler &#8212; with some interesting angles on communication and feedback, and on why agile works. Especially the part regarding pair programming caught my attention.
According to Martin Fowler [...]]]></description>
			<content:encoded><![CDATA[<p>I invested an hour watching <a title="Martin Fowler and Neal Ford at USI 2010" href="http://universite-du-si.com/fr/conferences/6/sessions/909">a recorded speak by Martin Fowler and Neal Ford</a> at some Paris convention. It was a well spent hour &#8212; as always with Martin Fowler &#8212; with some interesting angles on communication and feedback, and on why agile works. Especially the part regarding pair programming caught my attention.</p>
<p>According to Martin Fowler and his companion pair programming is an effective development practice because:</p>
<ol>
<li>We can only use one part of our brain at one time, and</li>
<li>&#8220;The driver&#8221; and &#8220;the navigator&#8221; of a pair programming unit are using different parts of their brain and are thus complementing each other.</li>
</ol>
<p>I have no idea if this is a proven truth, but it certainly conforms to my own experience with pair programming. The driver (the one with the keyboard) usually ends up in a state of completing-the-task-at-hand focus, while the navigator, a little more detached, makes bigger sweeps and thinks more on the big picture. For me pair programming has always resulted in better design, less bugs and a lot more fun.</p>
<p>If you want to watch for yourself, but don&#8217;t want to spend the full one hour, you&#8217;ll find the pair programming part 36:20 into the presentation.</p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/CHEC6PuV_PRldMeMUbdCk0KZGow/0/da"><img src="http://feedads.g.doubleclick.net/~a/CHEC6PuV_PRldMeMUbdCk0KZGow/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/CHEC6PuV_PRldMeMUbdCk0KZGow/1/da"><img src="http://feedads.g.doubleclick.net/~a/CHEC6PuV_PRldMeMUbdCk0KZGow/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=MpRxcRd-lAQ:L3RayLxJUEE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=MpRxcRd-lAQ:L3RayLxJUEE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=MpRxcRd-lAQ:L3RayLxJUEE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=MpRxcRd-lAQ:L3RayLxJUEE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=MpRxcRd-lAQ:L3RayLxJUEE:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/MpRxcRd-lAQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/07/17/two-halves-make-one-whole/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/07/17/two-halves-make-one-whole/</feedburner:origLink></item>
		<item>
		<title>Great Bug Reports</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/Dy_tA9Qump0/</link>
		<comments>http://www.hans-eric.com/2010/05/25/great-bug-reports/#comments</comments>
		<pubDate>Tue, 25 May 2010 21:15:46 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[Bug Mining]]></category>
		<category><![CDATA[Shallow Testing]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=333</guid>
		<description><![CDATA[Is your team maintaining a bug report dump? When new issues get reported at a pace the team cannot keep up with it’s in trouble. At some point the team must yield and bug reports will start to pile up. The unattended bug reports lose their value over time and become a terrible waste.
Shallow Testing
There [...]]]></description>
			<content:encoded><![CDATA[<p>Is your team maintaining a bug report dump? When new issues get reported at a pace the team cannot keep up with it’s in trouble. At some point the team must yield and bug reports will start to pile up. The unattended bug reports lose their value over time and become a terrible waste.</p>
<h3>Shallow Testing</h3>
<p>There are many possible reasons for a bug tracking system to turn into a dump of wasted effort. One reason is when the testing team is practicing shallow testing. That is when the testers file bug reports right after discovering bugs, leaving any further investigation to the developing team. This is convenient for the testers but bad for the overall process of finding and fixing bugs.</p>
<p>The shallow testing technique results in many bug reports, most of them with poor quality. But the measure of effective testing is not how many bug reports it produces. What counts is the amount of bug reports <em>that lead to bug fixes</em>. To be effective we need great bug reports.</p>
<h3>Great Bug Reports</h3>
<p>So, what does a great bug report look like? We need to ask another question to answer that. What does the developer need to fix a bug? The first step of a successful bug elimination is to reproduce it in a controlled development environment.<br />
In order to do that he needs to:</p>
<ol>
<li>Put the system in a state from which the error can be produced.</li>
<li>Perform the actions that produce the error.</li>
<li>Know how to identify the error.</li>
</ol>
<p>Most bug reports contain enough information to make step 2 and 3 clear. Clues toward step 1, on the other hand, are usually missing. As a result the developers end up doing additional testing to pin down the problems.</p>
<p>If we do a better job with our bug reports we can get two really important effects. We help developers spend less time on each bug and instead fix more of them, and we increase the chance that the report will be acted upon. This is why thorough testing on behalf of the testing team is so important.</p>
<h3>Focus On the Right Things</h3>
<p>The basic formula to produce great bug reports is as follows.</p>
<ol>
<li><strong>A descriptive name</strong>.<br />
The most important details of the bug presented in a sentence.</li>
<li><strong>Steps to reproduce</strong>.<br />
This is the part that distinguishes great bug reports from lesser ones. A well-described sequence of action steps that describes how to reproduce the bug removes uncertainties and signals thorough research. Developers are therefore more inclined to act upon such a bug report than a fuzzy one.<br />
It’s also important that the reproduction steps start at a known state, preferably at a clean program start.</li>
<li><strong>Expected results</strong>.</li>
<li><strong>Actual results</strong>.</li>
<li><strong>Any possibly relevant attachments</strong>, for example screen-shots and data.</li>
</ol>
<p>Depending on the system you’re using, a multitude of additional parameters may be set to categorize the bug further. Provide the extra information if applicable, but it&#8217;s not essential so don’t let it steal focus from the basic formula.</p>
<h3>Bug Mining</h3>
<p>The foundation of a great bug report is built with great testing. Great testing is hard work and requires a special mindset: the love of bugs and the willingness to spend a lot of time examining each new specimen.</p>
<p>When a great tester discovers a bug the first thing she does is not to fire up the error reporting tool and start describing it. She leaves that for later. Instead she goes about to find the answers to these two questions:</p>
<ol>
<li>Can I reproduce this bug?</li>
<li>If so, what is the smallest number of steps I need to do so?</li>
</ol>
<p>This usually requires several program resets, attacking the bug from different angles. I like to call this process Bug Mining and <em>it’s the tester’s most important task</em>.</p>
<h3>Why all the hard work?</h3>
<p>Why should the tester have to do all this work, you might ask. After all, the developers introduced the bugs in the first place so they should clean up their own mess, right? Besides, isn’t it better if the testers spend their time testing and finding more bugs?</p>
<p>The problem is this: If the testers prioritize quantity over quality we’ll end up with a very ineffective test-correction-test cycle, and an ever growing mountain of unresolved bugs.</p>
<p>The more time developers spend on each bug the fewer bugs get corrected. And if fewer bugs get fixed, more time will pass between bug discovery and bug correction, making it even more expensive to fix.<br />
Since the developers are the only ones that can make the bugs go away you really need to think twice before making them do work someone else can do just as well. This is especially true for Bug mining.</p>
<h3>Guiding Principles</h3>
<p>As a summary, here are some guiding principles to produce great bug reports:</p>
<ul>
<li>Focus your effort on the steps to reproduce the bug. They should be clear, complete and as short as possible.</li>
<li>Only one bug per report.<br />
Handling several bugs as one is problematic for several reasons. For example, what should you do if the bug report contains bugs with different severity? Also, it’s difficult to describe several bugs in the name sentence so some might be overlooked. A third reason is the communication problem that happens when only some of the reported bugs get corrected.</li>
<li>A few really good bug reports is better than plenty of not so good ones. Quality is better than quantity when it comes to testing.</li>
</ul>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/_1N9H6gOh3DitMN3ULxE7aWdf3I/0/da"><img src="http://feedads.g.doubleclick.net/~a/_1N9H6gOh3DitMN3ULxE7aWdf3I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_1N9H6gOh3DitMN3ULxE7aWdf3I/1/da"><img src="http://feedads.g.doubleclick.net/~a/_1N9H6gOh3DitMN3ULxE7aWdf3I/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Dy_tA9Qump0:XamWkdQi5wI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Dy_tA9Qump0:XamWkdQi5wI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Dy_tA9Qump0:XamWkdQi5wI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Dy_tA9Qump0:XamWkdQi5wI:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Dy_tA9Qump0:XamWkdQi5wI:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/Dy_tA9Qump0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/05/25/great-bug-reports/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/05/25/great-bug-reports/</feedburner:origLink></item>
		<item>
		<title>Tools of the Effective Developer: Regular Expressions</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/hsJsrH4niTM/</link>
		<comments>http://www.hans-eric.com/2010/05/12/tools-of-the-effective-developer-regular-expressions/#comments</comments>
		<pubDate>Wed, 12 May 2010 15:29:11 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[Regex]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=308</guid>
		<description><![CDATA[Whenever I suggest using regular expressions to solve a string parsing problem, more often than not I’m met with skepticism and frowning faces. Regular expressions have a bad reputation among many of my fellow developers.
(Yes, they are mostly Windows developers, Xnix users don&#8217;t seem to have this problem.)
But can you blame them? I mean, have [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever I suggest using regular expressions to solve a string parsing problem, more often than not I’m met with skepticism and frowning faces. Regular expressions have a bad reputation among many of my fellow developers.</p>
<p>(Yes, they are mostly Windows developers, Xnix users don&#8217;t seem to have this problem.)</p>
<p>But can you blame them? I mean, have a look at this <a title="How to Find or Validate an Email Address" href="http://www.regular-expressions.info/email.html">regular expression for validating email addresses</a>.</p>
<p><code>[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?</code></p>
<p>That’s enough to send any normally functioning individual out the door screaming. Fortunately, regular expressions aren’t always this messy. In fact, the simpler the problem, the more effective and beautiful they get.</p>
<p>Let’s look at an example that shows the power and density of regular expressions.<br />
Suppose we have a chunk of text. We know that somewhere in it there’s a <a href="http://en.wikipedia.org/wiki/Social_security_number">social security number</a>. Our job is to extract it.</p>
<p>This is one of those tasks that involve a decent amount of code unless your language of choice has support for regular expressions. In Ruby, on the other hand, it’s a single line of code.</p>
<pre><code>
text = “Test data that 123-45-6789 contains a  social security number.”

if <strong>text =~ /\d\d\d-\d\d-\d\d\d\d/</strong>
  puts $~
else
  puts “No match”
end
</code></pre>
<p>If  the match operator (=~) and the magical match result variable ($1) puts you off, here’s how it’s done in C# that doesn’t have a special notation for regular expressions, but support them through the .Net framework.</p>
<pre><code>
String text = “Test data that 123-45-6789 contains a  social security number.”;

Regex ssnReg = new Regex(@"\d\d\d-\d\d-\d\d\d\d");
Match match = ssnReg.Match(text);

if ( match.Success ) {
  Console.WriteLine(match);
} else {
  Console.WriteLine("No match");
}
</code></pre>
<p>A beautiful thing with regular expressions is that it’s really simple to extract the parts of a match. For instance, if we need to extract the area code all we need to do is to put parenthesis around the part we’re interested in. Then we can easily extract that information, in C# by using the match.Groups property.</p>
<pre><code>
String text = “Test data that 123-45-6789 contains a  social security number.”;

Regex ssnReg = new Regex(@"<strong>(\d\d\d)</strong>-\d\d-\d\d\d\d");
Match match = ssnReg.Match(text);

if ( match.Success ) {
  Console.WriteLine(match);
  Console.WriteLine(“Area Number: “ + <strong>match.Groups[1]</strong>);
} else {
  Console.WriteLine("No match");
}
</code></pre>
<p>As intimidating as they may seem, the payoff using regular expressions is huge. And, since efficiency is what we strive for, they have a natural place in our bag of tools. So, learn the basics of regular expressions. You’ll be happy you did.</p>
<p>Finally some advice sprung from my own experience with regular expressions.</p>
<p>•   <strong> Get your regular expressions right first</strong>. Use <a href="http://rubular.com/">Rubular</a>, or an equivalent tool, for pain free experimentation before you implement them in your code.<br />
•    <strong>Document your regular expressions</strong>. They are notoriously difficult to read so a short description with example match data is almost always a good idea.</p>
<p>Cheers!</p>
<p><em>Previous posts in the Tools of The Effective Developer series:</em></p>
<ol>
<li><a href="http://www.hans-eric.com/2007/08/31/tools-of-the-effective-developer-personal-logs/">Tools of The Effective Developer: Personal Logs</a></li>
<li><a href="http://www.hans-eric.com/2007/09/05/tools-of-the-effective-developer-personal-planning/">Tools of The Effective Developer: Personal Planning</a></li>
<li><a href="http://www.hans-eric.com/2007/09/25/tools-of-the-effective-developer-programming-by-intention/">Tools of The Effective Developer: Programming By Intention</a></li>
<li><a href="http://www.hans-eric.com/2007/09/27/tools-of-the-effective-developer-customer-view/">Tools of The Effective Developer: Customer View</a></li>
<li><a href="http://www.hans-eric.com/2007/10/02/tools-of-the-effective-developer-fail-fast/">Tools of The Effective Developer: Fail Fast!</a></li>
<li><a href="http://www.hans-eric.com/2007/10/29/tools-of-the-effective-developer-make-it-work-first/">Tools of The Effective Developer: Make It Work &#8211; First!</a></li>
<li><a href="http://www.hans-eric.com/2007/11/16/tools-of-the-effective-developer-whetstones/">Tools of The Effective Developer: Whetstones</a></li>
<li><a href="http://www.hans-eric.com/2007/12/03/tools-of-the-effective-developer-rule-of-three/">Tools of The Effective Developer: Rule of Three</a></li>
<li><a href="http://www.hans-eric.com/2007/12/06/tools-of-the-effective-developer-touch-typing/">Tools of The Effective Developer: Touch Typing</a></li>
<li><a href="http://www.hans-eric.com/2009/09/03/tools-of-the-effective-developer-error-handling-infrastructure/">Tools of The Effective Developer: Error Handling Infrastructure</a></li>
</ol>

<p><a href="http://feedads.g.doubleclick.net/~a/GjvmF8oopbBBYWUU1NB0diFTTbo/0/da"><img src="http://feedads.g.doubleclick.net/~a/GjvmF8oopbBBYWUU1NB0diFTTbo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/GjvmF8oopbBBYWUU1NB0diFTTbo/1/da"><img src="http://feedads.g.doubleclick.net/~a/GjvmF8oopbBBYWUU1NB0diFTTbo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=hsJsrH4niTM:JWjtt1fKtxU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=hsJsrH4niTM:JWjtt1fKtxU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=hsJsrH4niTM:JWjtt1fKtxU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=hsJsrH4niTM:JWjtt1fKtxU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=hsJsrH4niTM:JWjtt1fKtxU:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/hsJsrH4niTM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/05/12/tools-of-the-effective-developer-regular-expressions/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/05/12/tools-of-the-effective-developer-regular-expressions/</feedburner:origLink></item>
		<item>
		<title>The King is Challenged – By the Uncle</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/bstJtp50vVU/</link>
		<comments>http://www.hans-eric.com/2010/04/09/the-king-is-challenged-by-the-uncle/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 12:51:44 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opinion]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=298</guid>
		<description><![CDATA[According to Tiobe Programming Community Index as of April 2010, Java is no longer the most popular programming language. C is; Not due to a sudden increase in popularity of C, but rather a cause of Java&#8217;s ongoing decline.
After more than 4 years C is back at position number 1 in the TIOBE index. The [...]]]></description>
			<content:encoded><![CDATA[<p>According to <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Tiobe Programming Community Index</a> as of April 2010, Java is no longer the most popular programming language. C is; Not due to a sudden increase in popularity of C, but rather a cause of Java&#8217;s ongoing decline.</p>
<blockquote><p>After more than 4 years C is back at position number 1 in the TIOBE index. The scores for C have been pretty constant through the years, varying between the 15% and 20% market share for almost 10 years. So the main reason for C&#8217;s number 1 position is not C&#8217;s uprise, but the decline of its competitor Java. Java has a long-term downward trend. It is losing ground to other languages running on the JVM. An example of such a language is JavaFX script that is now approaching the top 20.</p></blockquote>
<p>It&#8217;s important to point out, thought, that only the language part of Java is losing ground. As Tiobe Software indicates in their comment, the JVM is as hot as ever with all kinds of <a title="The Scala Programming Language" href="http://www.scala-lang.org/">cool</a> <a title="Clojure" href="http://clojure.org/">language</a> <a title="JRuby" href="http://jruby.org/">evolution</a> <a title="JavaFX" href="http://javafx.com/">occurring</a>.</p>
<p>Another interesting note to make about the april index is that Delphi is once again among the top ten. I&#8217;m really happy about that, although it means <a href="http://www.hans-eric.com/2007/09/02/rest-in-peace-delphi/">my old prophecy of a hasty decline</a> kind of puts me in the corner (although <a title="Welcome Back Delphi" href="http://www.hans-eric.com/2009/02/09/welcome-back-delphi/">I&#8217;ve already taken it back</a>).</p>
<p>A third point is the giant leap of Objective-C, from 42:nd to 11:th most popular language. This is a combination of iPhone&#8217;s popularity and the fact that Objective-C is <a title="iPhone PL lockdown" href="http://lambda-the-ultimate.org/node/3905">the only OO alternative allowed on that platform</a>, besides C++.</p>
<p><a href="http://www.hans-eric.com/wp-content/uploads/2010/04/tiobe-1004.png"><img class="alignnone size-medium wp-image-301" title="Tiobe Programming Language Community Index - april 2010" src="http://www.hans-eric.com/wp-content/uploads/2010/04/tiobe-1004-300x300.png" alt="The Tiobe Programming Language Community Index chart of april 2010" width="300" height="300" /></a></p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/kdQpnOFkpBpXWEKcYbwaF17anSs/0/da"><img src="http://feedads.g.doubleclick.net/~a/kdQpnOFkpBpXWEKcYbwaF17anSs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/kdQpnOFkpBpXWEKcYbwaF17anSs/1/da"><img src="http://feedads.g.doubleclick.net/~a/kdQpnOFkpBpXWEKcYbwaF17anSs/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=bstJtp50vVU:RuVyuC3fyKE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=bstJtp50vVU:RuVyuC3fyKE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=bstJtp50vVU:RuVyuC3fyKE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=bstJtp50vVU:RuVyuC3fyKE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=bstJtp50vVU:RuVyuC3fyKE:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/bstJtp50vVU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/04/09/the-king-is-challenged-by-the-uncle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/04/09/the-king-is-challenged-by-the-uncle/</feedburner:origLink></item>
		<item>
		<title>Analog or Digital Task Board? That’s the Question.</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/Ck3gr0dirG8/</link>
		<comments>http://www.hans-eric.com/2010/04/08/analog-or-digital-task-board/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 15:02:19 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=284</guid>
		<description><![CDATA[As a project manager, the best tool I&#8217;ve come across to help me monitor and control an iteration is The Sprint Task Board. It strikes a perfect balance between expressiveness and visual feedback. One quick look is all you need to make a diagnose of the ongoing iteration. Yet, it contains most of the information [...]]]></description>
			<content:encoded><![CDATA[<p>As a project manager, the best tool I&#8217;ve come across to help me monitor and control an iteration is The Sprint Task Board. It strikes a perfect balance between expressiveness and visual feedback. One quick look is all you need to make a diagnose of the ongoing iteration. Yet, it contains most of the information needed to make informed decisions.</p>
<p><a href="http://www.hans-eric.com/wp-content/uploads/2010/04/taskboard.png"><img class="size-medium wp-image-286 alignnone" style="border: 1px solid black;" title="Task Board Example" src="http://www.hans-eric.com/wp-content/uploads/2010/04/taskboard-300x239.png" alt="A drawn example of a task board, containing for instance a burndown-chart, sprint goal, and tasks." width="300" height="239" /></a></p>
<p>The task board is absolutely invaluable and I&#8217;ll probably never do team related work without it again. The question, though, is whether to use a computerized or a real world one.</p>
<p>Henrik Kniberg recommends the latter. The following quote is from Henrik&#8217;s excellent book <a href="http://reviews.hans-eric.com/2009/06/08/scrum-and-xp-from-the-trenches/">Scrum and XP from the Trenches</a>.</p>
<blockquote><p>We’ve experimented with different formats for the sprint backlog,<br />
including Jira, Excel, and a physical taskboard on the wall. In the<br />
beginning we used Excel mostly, there are many publicly available Excel<br />
templates for sprint backlogs, including auto generated burn-down charts<br />
and stuff like that. [...]</p>
<p>Instead [...] what we have found to be the most<br />
effective format for the sprint backlog [is] a wall-based taskboard!</p></blockquote>
<p>And there are good reasons for picking an analog task board. Maybe the most significant being:</p>
<ul>
<li><strong>Visibility</strong>. A wall-based dashboard is always up, always visible. If positioned near the team it&#8217;ll work as a constant reminder of the shape of the iteration.</li>
<li><strong>Simplicity</strong>. Planning and re-planning is simply a matter of moving physical cards around, tearing them up or writing new ones.</li>
</ul>
<p>In my current project we&#8217;re using an application (<a href="http://scrumdashboard.codeplex.com/">Scrum Dashboard</a> on top of <a title="Team Foundation Server" href="http://en.wikipedia.org/wiki/Team_Foundation_Server">TFS</a>). The reasons are:</p>
<ul>
<li><strong>Availability</strong>. Actually, this is the only reason for us to use a digitalized task board. We&#8217;re having dislocated team members from time to time (did I say we&#8217;re <a title="I am a ScrumBut" href="http://www.hans-eric.com/2010/03/26/i-am-a-scrumbut/">ScrumButs</a>?) but since our dashboard is a web application they are able to access it remotely. It would be a lot more painful to relay the information otherwise.</li>
<li><strong>Automatic burndown update</strong>. No need for me (or any one else) to do a work remaining summary and update the burndown chart each and every day.</li>
</ul>
<p>What are your reasons? I&#8217;d be most interested in hearing your point of view on this subject.</p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/AYpHOTObx2r1T-r4dSTBGXGCmVg/0/da"><img src="http://feedads.g.doubleclick.net/~a/AYpHOTObx2r1T-r4dSTBGXGCmVg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/AYpHOTObx2r1T-r4dSTBGXGCmVg/1/da"><img src="http://feedads.g.doubleclick.net/~a/AYpHOTObx2r1T-r4dSTBGXGCmVg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Ck3gr0dirG8:OhQDwm6k1a0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Ck3gr0dirG8:OhQDwm6k1a0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Ck3gr0dirG8:OhQDwm6k1a0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=Ck3gr0dirG8:OhQDwm6k1a0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=Ck3gr0dirG8:OhQDwm6k1a0:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/Ck3gr0dirG8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/04/08/analog-or-digital-task-board/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/04/08/analog-or-digital-task-board/</feedburner:origLink></item>
		<item>
		<title>I am a ScrumBut</title>
		<link>http://feedproxy.google.com/~r/hans-eric/~3/1jLC8iRwTk8/</link>
		<comments>http://www.hans-eric.com/2010/03/26/i-am-a-scrumbut/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 11:41:32 +0000</pubDate>
		<dc:creator>Hans-Eric</dc:creator>
				<category><![CDATA[project management]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.hans-eric.com/?p=279</guid>
		<description><![CDATA[Many organizations that are going agile are experiencing difficulties in applying the whole concept. Most of them yield and make some kind of adaption to better suit their current situation. Ken Schwaber, the father of Scrum, thinks this is just a way to avoid dealing with the true problems in the organization. He calls them [...]]]></description>
			<content:encoded><![CDATA[<p>Many organizations that are going agile are experiencing difficulties in applying the whole concept. Most of them yield and make some kind of adaption to better suit their current situation. Ken Schwaber, the father of Scrum, thinks this is just a way to avoid dealing with the true problems in the organization. He calls them &#8220;ScrumButs&#8221;.</p>
<p><object id="mbox_player_0a99deb71f13e2ca87" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="416" height="234" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowScriptAccess" value="always" /><param name="allowFullscreen" value="true" /><param name="src" value="http://www.motionbox.com/external/hd_player/type%253Dsd%252Cvideo_uid%253D0a99deb71f13e2ca87" /><param name="name" value="mbox_player_0a99deb71f13e2ca87" /><param name="allowfullscreen" value="true" /><embed id="mbox_player_0a99deb71f13e2ca87" type="application/x-shockwave-flash" width="416" height="234" src="http://www.motionbox.com/external/hd_player/type%253Dsd%252Cvideo_uid%253D0a99deb71f13e2ca87" name="mbox_player_0a99deb71f13e2ca87" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
<p>In my organization we only fulfill two thirds of <a href="http://www.crisp.se/scrum/checklist">the Scrum Checklist</a>, so I guess that makes us ScrumButs. I&#8217;m not going to feel bad about it though; Change takes time and we&#8217;re pretty happy we&#8217;ve gotten as far as we have. But Ken&#8217;s right, we really should do something about our most difficult problems and go the full ten yards. Maybe later. <img src='http://www.hans-eric.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Cheers!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/i_ZUfFM5g-80Uy-_Uxdxcxubh7E/0/da"><img src="http://feedads.g.doubleclick.net/~a/i_ZUfFM5g-80Uy-_Uxdxcxubh7E/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/i_ZUfFM5g-80Uy-_Uxdxcxubh7E/1/da"><img src="http://feedads.g.doubleclick.net/~a/i_ZUfFM5g-80Uy-_Uxdxcxubh7E/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1jLC8iRwTk8:xP7-qXiNJXc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1jLC8iRwTk8:xP7-qXiNJXc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1jLC8iRwTk8:xP7-qXiNJXc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hans-eric?i=1jLC8iRwTk8:xP7-qXiNJXc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hans-eric?a=1jLC8iRwTk8:xP7-qXiNJXc:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/hans-eric?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hans-eric/~4/1jLC8iRwTk8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.hans-eric.com/2010/03/26/i-am-a-scrumbut/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.hans-eric.com/2010/03/26/i-am-a-scrumbut/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.594 seconds -->
