<?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>One brike at a time</title>
	<atom:link href="http://digitalbrikes.com/onebrikeatatime/feed/" rel="self" type="application/rss+xml" />
	<link>http://digitalbrikes.com/onebrikeatatime</link>
	<description>Notes on software development</description>
	<lastBuildDate>Sun, 07 Mar 2010 01:01:21 +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>Java BigDecimal equality</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2010/03/06/java-bigdecimal-equality/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2010/03/06/java-bigdecimal-equality/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 01:00:26 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Something for the week end]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=173</guid>
		<description><![CDATA[Here is why you should use compareTo to find out whether two BigDecimals represent the same number or not.
import java.math.BigDecimal;

import junit.framework.TestCase;

public final class TestBigDecimal extends TestCase {
    public void testBigDecimalZeroEqualsBigDecimalValueOfZero() {
        assertTrue(BigDecimal.ZERO.equals(BigDecimal.valueOf(0)));
    }

    public void testBigDecimalZeroNotEqualsBigDecimalValueOfZeroDot() {
   [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Something for the week end' --><p>Here is why you should use compareTo to find out whether two BigDecimals represent the same number or not.</p>
<pre>import java.math.BigDecimal;

import junit.framework.TestCase;

public final class TestBigDecimal extends TestCase {
    public void testBigDecimalZeroEqualsBigDecimalValueOfZero() {
        assertTrue(BigDecimal.ZERO.equals(BigDecimal.valueOf(0)));
    }

    public void testBigDecimalZeroNotEqualsBigDecimalValueOfZeroDot() {
        assertFalse(BigDecimal.ZERO.equals(BigDecimal.valueOf(0.)));
    }

    public void testBigDecimalZeroEqualsBigDecimalValueOfZeroString() {
        assertTrue(BigDecimal.ZERO.equals(new BigDecimal("0")));
    }

    public void testBigDecimalZeroEqualsBigDecimalValueOfZeroDotString() {
        assertTrue(BigDecimal.ZERO.equals(new BigDecimal("0.")));
    }

    public void testBigDecimalZeroNotEqualsBigDecimalValueOfZeroDotZeroString() {
        assertFalse(BigDecimal.ZERO.equals(new BigDecimal("0.0")));
    }

    public void testBigDecimalZeroComparesToBigDecimalValueOfZeroDotAsZero() {
        assertEquals(0, BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.)));
    }

    public void testBigDecimalZeroComparesToBigDecimalValueOfZeroDotZeroStringAsZero() {
        assertEquals(0, BigDecimal.ZERO.compareTo(new BigDecimal("0.0")));
    }
}</pre>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Java+BigDecimal+equality+http://gw97x.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Java+BigDecimal+equality+http://gw97x.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2010/03/06/java-bigdecimal-equality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Something for the week-end</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2010/02/27/something-for-the-week-end/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2010/02/27/something-for-the-week-end/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 15:54:01 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=171</guid>
		<description><![CDATA[I used to like overloading methods to provide a default behaviour for any object and a specialised one for some select types. That&#8217;s possible when the language supports multiple dispatch. It is not possible in Java:

import junit.framework.TestCase;

public class TestOverloading extends TestCase {
    public static final class OverloadedClass {
     [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Design' --><p>I used to like overloading methods to provide a default behaviour for any object and a specialised one for some select types. That&#8217;s possible when the language supports <a href="http://en.wikipedia.org/wiki/Multiple_dispatch">multiple dispatch</a>. It is not possible in Java:</p>
<pre>
import junit.framework.TestCase;

public class TestOverloading extends TestCase {
    public static final class OverloadedClass {
        public String thisIsA(final Object o) {
            return "Object";
        }

        public String thisIsA(final String s) {
            return "String";
        }
    }

    public void testIsCallingObjectFromObject() {
        final OverloadedClass tested = new OverloadedClass();
        final Object value = new Object();

        assertEquals("Object", tested.thisIsA(value));
    }

    public void testIsCallingObjectFromString() {
        final OverloadedClass tested = new OverloadedClass();
        final Object value = new String();

        assertEquals("Object", tested.thisIsA(value));
    }

    public void testIsCallingStringFromString() {
        final OverloadedClass tested = new OverloadedClass();
        final String value = new String();

        assertEquals("String", tested.thisIsA(value));
    }
}
</pre>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Something+for+the+week-end+http://tx3t7.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Something+for+the+week-end+http://tx3t7.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2010/02/27/something-for-the-week-end/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Story cost, uses and limits.</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2010/02/22/story-cost-uses-and-limits/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2010/02/22/story-cost-uses-and-limits/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 04:04:50 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=169</guid>
		<description><![CDATA[Last tuesday&#8217;s meeting at the BayAPLN was a talk by Jim Highsmith entitled &#8216;Beyond Scope&#8217;. The talk itself was very interesting and did trigger some thoughts that I will try to organise in four or five posts. This first one is about cost.
How is cost estimated ?
There are numerous articles, methods and even books that [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><p>Last tuesday&#8217;s meeting at the BayAPLN was a talk by <a href="http://www.jimhighsmith.com/">Jim Highsmith</a> entitled &#8216;Beyond Scope&#8217;. The talk itself was very interesting and did trigger some thoughts that I will try to organise in four or five posts. This first one is about cost.</p>
<h2>How is cost estimated ?</h2>
<p>There are numerous <a href="http://www.agilemanagement.net/Articles/Weblog/FeatureComplexityPoints.html">articles</a>, <a href="http://www.infoq.com/articles/agile-estimation-techniques">methods</a> and even <a href="http://www.amazon.com/gp/product/0131479415?ie=UTF8&amp;tag=digitalbrikes-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0131479415">books</a><img src="http://www.assoc-amazon.com/e/ir?t=digitalbrikes-20&amp;l=as2&amp;o=1&amp;a=0131479415" width="1" height="1" border="0" alt="" style="border:none !important;margin:0px !important" /> that describe how to do cost estimation for agile stories. In my limited world the consensus seem to be that cost estimation should be relative rather than absolute. It can be expressed with numbers or words. It also seems that one of the preferred methods for cost estimation is <a href="http://en.wikipedia.org/wiki/Planning_poker">the planning poker</a>. In that space more <a href="http://en.wikipedia.org/wiki/Function_point">formal methods</a> have been proved to work although they are rather tedious to practice.</p>
<h2>Cost estimation for planning</h2>
<p>Usually it is used to give an estimate of when the project will finish. As it happens, in software intensive systems, most of the operating expense is the payroll and so setting the length of the project is also essentially fixing its cost. And in many cases people will jump from one notion to the next. Now the trick is that to go from relative cost estimation to cost planning, some time equivalence has to be defined.</p>
<p>While we all know that circumstances (such as technical debt, absence of key team members and the colour of the sky) will make these equivalences vary over time, they are usually used in a normative way. In other words the team&#8217;s performance will be evaluated with regard to its ability to match the equivalent time that was initially chosen. In the worst cases it will be used to perform individual evaluation.</p>
<h2>Cost as a proxy for value.</h2>
<p>This however is a minor managerial effect. Use of cost estimation has a few implications of its own. First, while this is rarely expressed it means the scope is set. Otherwise, the planning is meaningless and what use do we have of the cost estimation ? I hear your answer: to give the business an idea of how to prioritise the stories. I was more than once on the losing side of arguing the business should prioritise before cost is known. In other words, cost is used as a proxy to value.</p>
<p>Is cost a good proxy for value ? Is something expensive a worst value than something cheap ? Or the contrary ? Worse, in a software system actual cost is usually dependent on the sequencing of stories. Or on how many stories a structural cost can be amortised.</p>
<h2>To sum up.</h2>
<p>Cost estimation is easy to come up with. It appears to be an easy control variable to measure the performance of the development process. It also appears to be an easy indicator to determine the priority of stories. In reality, is it good at any of that ?</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Story+cost%2C+uses+and+limits.+http://na5hn.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Story+cost%2C+uses+and+limits.+http://na5hn.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2010/02/22/story-cost-uses-and-limits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding &#8216;given a&#8217; to rspec</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2010/02/16/adding-given-a-to-rspec/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2010/02/16/adding-given-a-to-rspec/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 17:41:21 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Driven]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=167</guid>
		<description><![CDATA[Over the past few months I have grown to like the &#8216;given a&#8217; syntax more and more (described here). So when I recently reactivated my Ruby On rails home project (see brikeyard deployed on heroku), I thought I would add that syntax to my rspec examples rather than use before(:each).
I have  not spent too [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Driven' --><p>Over the past few months I have grown to like the &#8216;given a&#8217; syntax more and more (described <a href="http://digitalbrikes.com/onebrikeatatime/2009/03/01/the-state-of-my-testing-art/">here</a>). So when I recently reactivated my Ruby On rails home project (see <a href="http://brikeyard.heroku.com">brikeyard</a> deployed on heroku), I thought I would add that syntax to my rspec examples rather than use before(:each).</p>
<p>I have  not spent too much time thinking about where to put this code. Nor did I spend much time peeling away the nested modules inside rspec. Ideas to make this better are very welcomed. I would also love to collect some feedback on this before I make a fool of myself by proposing its inclusion in rspec proper. Thanks in advance for your help !</p>
<p>Here is how the setup looks like in one of the specs:</p>
<pre>
describe :something do
    given {
      a StatisticalControl
      a WorkItem, {:lead_time =&gt; 1}
      another WorkItem, {:lead_time =&gt; 3}
      a ProcessStage, {:work_in_process =&gt; [a_work_item, another_work_item]}
      a ControlChart
      @project = Project.new
      @project.stub!(:lead_time_control).and_return(a_statistical_control)
      @project.stub!(:closed_stage).and_return(a_process_stage)
    }

    it "should do something useful" do
		(...)
    end
end
</pre>
<p>And here is what I added to my spec_helper.rb file:</p>
<pre>
def a(type, stubs ={})
  stub = mock_model(type, stubs)
  member_name = type.name.gsub(/[A-Z]/) {|match|
    "_#{match.downcase}"
  }
  instance_eval("
        @a#{member_name} = stub
          def a#{member_name}
            return @a#{member_name}
          end
      ")
end

def another(type, stubs ={})
  stub = mock_model(type, stubs)
  member_name = type.name.gsub(/[A-Z]/) {|match|
    "_#{match.downcase}"
  }
  instance_eval("
        @another#{member_name} = stub
          def another#{member_name}
            return @another#{member_name}
          end
      ")
end

class Spec::Rails::Example::FunctionalExampleGroup
  class &lt;&lt; self
    def given &amp;block
      before(:each, &amp;block)
    end
  end
end

class Spec::Rails::Example::ModelExampleGroup
  class &lt;&lt; self
    def given &amp;block
      before(:each, &amp;block)
    end
  end
end
</pre>
<p>Please let me know what you think. I welcome suggestions to improve.</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Adding+%E2%80%98given+a%E2%80%99+to+rspec+http://n7nzn.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Adding+%E2%80%98given+a%E2%80%99+to+rspec+http://n7nzn.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2010/02/16/adding-given-a-to-rspec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Process Metrics</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2010/01/28/process-metrics/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2010/01/28/process-metrics/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 01:24:15 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Driven]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=163</guid>
		<description><![CDATA[In our process we have started using two metrics in addition to the cumulative flow diagram indicator. These metrics are tracked against target values to measure if the process is in statistical control.
The first metric is the lead time. It measures the time in days between the moment a work item enters our process and [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><!-- no icon for 'Driven' --><p>In our process we have started using two metrics in addition to the cumulative flow diagram indicator. These metrics are tracked against target values to measure if the process is in statistical control.</p>
<p>The first metric is the lead time. It measures the time in days between the moment a work item enters our process and the moment it is declared finished and exists the process.</p>
<p>The second metric is the throughput period (the inverse of the throughput rate) which is the time in days between the end dates of successive work items. If we note two cards C1 and C2 with start dates SD1 and SD2 and end dates ED1 and ED2, then the lead time for C1 is (ED1 &#8211; SD1) in days and the cadence for that period is ED2 &#8211; ED1.</p>
<p>Over a period of time these measures can be plotted against a target mean (10 days of lead time and 4 days of throughput period) and a target deviation (5 days for the lead time and 2 days for the throughput period). These targets can be changed independently as our process matures. Improvement to the means benefit the delivery speed. Improvements to the deviation benefits the predictability.</p>
<p>Finally you will find <a href="http://digitalbrikes.com/onebrikeatatime/wp-content/uploads/2010/01/ProjectManagement.nmbtemplate">here</a> the model I use (for Apple&#8217;s Numbers) to visualize these process metrics.</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Process+Metrics+http://bz6oc.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Process+Metrics+http://bz6oc.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2010/01/28/process-metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lesson learned: do not clog your workstream</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2009/11/24/lesson-learned-do-not-clog-your-workstream/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2009/11/24/lesson-learned-do-not-clog-your-workstream/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:49:53 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=161</guid>
		<description><![CDATA[Learning this lesson cost us two weeks of throughput. Here is what happened.
We started work on a feature that was dependent on external resources for completion. In anticipation of a quick completion (based on past experience with other providers), we filled our &#8220;Analysis Compete&#8221; queue with work that depended on the completion of the work [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><p>Learning this lesson cost us two weeks of throughput. Here is what happened.</p>
<p>We started work on a feature that was dependent on external resources for completion. In anticipation of a quick completion (based on past experience with other providers), we filled our &#8220;Analysis Compete&#8221; queue with work that depended on the completion of the work in development.</p>
<p>Of course, completion was delayed and it involved a lot of waiting and very little work. So the bottleneck resource, me, was under utilized. As the delays dragged from day to day we tagged the work with an issue and thought of pushing some other work instead. But all the work in our stream was dependent on the resolution of the issue. I did not want to break WIP limits so we could not simply start a new work item. So I kept myself busy with some refactoring.</p>
<p>There are two bad things that stemmed from this. First we lost throughput. Second I did work that will not be verified as a story would have. The good thing to come out is that we reflected on how to improve.</p>
<p>The first improvement is obviously to limit dependencies between work items that are in process. In particular those for which we do not fully control the completion. The second improvement is to try to avoid saturating our queues, in other words avoid a one hundred percent utilization of them. The third improvement is that we are now comfortable dropping work in process when we find out that either it cannot be completed in a reasonable amount of time or it does not have the value we anticipated.</p>
<p>What do you think ? Are there other lessons that we should learn ? Do you have any advice on how to anticipate these issues ?</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Lesson+learned%3A+do+not+clog+your+workstream+http://o93wh.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Lesson+learned%3A+do+not+clog+your+workstream+http://o93wh.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2009/11/24/lesson-learned-do-not-clog-your-workstream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LIfe without a backlog</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2009/10/13/life-without-a-backlog/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2009/10/13/life-without-a-backlog/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 23:04:33 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=159</guid>
		<description><![CDATA[Backlog is not part of our process anymore. Our process starts with analysis and ends with done. This is a deliberate choice, a choice we always have to remember we made because it is so easy to go back to dumping every single idea into a card and accumulate an enormous backlog that then has [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><p>Backlog is not part of our process anymore. Our process starts with analysis and ends with done. This is a deliberate choice, a choice we always have to remember we made because it is so easy to go back to dumping every single idea into a card and accumulate an enormous backlog that then has to be prioritised, estimated, trimmed. We also operate without a bug list, at least so far. I have already blogged about the <a href="http://digitalbrikes.com/onebrikeatatime/2009/02/26/bug-management-stop-the-line/">advantages of that</a>.</p>
<p><strong>How do we plan then ?</strong></p>
<p>We use a roadmap. The shorter the horizon, the more fine grained. I use a template from enthiosys. We record functional and architectural goals on it. We record events (demos, vacations, code freezes). We also record our target markets. The roadmap has a lot of white space. Not all categories have something at every time horizons. What this means however is that we implicitly estimate when features will be completed from a very high level. This in turn gives us a lot of room to adjust what we actually deliver using dimensional planning. When we need to decide what we do next we use our roadmap and we usually make the decision in a few seconds. That is when the analysis work starts that will cut a workable story. What does not fit in the story is not recorded but will probably resurface on the next round, informed by what we learned while playing the previous story.</p>
<p><strong>What about the product vision ?</strong></p>
<p>We have from the beginning created a set of documents that we keep current. One is a contextual diagram that shows how this kind of product generally fits in our clients&#8217; processes. Another one shows how it fits in the software the company produces (which is a much larger thing). Finally we have a diagram that outlines the end state of our product with a broad view of the functions we want to build. The roadmap takes over from this high level vision with a time horizon of a year or so. In addition we have an architectural context and a domain model established before we start on a functional area.</p>
<p><strong>What&#8217;s the catch ?</strong></p>
<p>There are several things that make this possible. First we are a very small team (one developer, one BA/QA). We both have a significant expertise in the domain and in that specific product. This process can certainly scale beyond that size but I am not sure how much. Second, we were hired to build that product and therefore we have a lot more control over how we manage things. We also do not have existing clients or contractually agreed scope to deal with.</p>
<p><strong>What are the advantages ?</strong></p>
<p>Primarily we removed many of the things that generate pain in a software development process. No estimates means no actuals (<a href="http://digitalbrikes.com/onebrikeatatime/2009/09/16/actuals-considered-evil/">more on this</a>). No backlog makes it very cheap to rearrange our priorities. No detailed long term plan means we do not have the temptation to adhere to it. Instead we reshape the plan constantly to reflect the new information we acquire. Finally all of this provides us with the material to efficiently communicate with our prospects and clients. We show enough structure that they easily understand where we are going and at the same time we have enough flexibility to incorporate their feedback in our plan. And the same thing applies to communication with upper management.</p>
<p>That is a short presentation of how we (so far happily) operate. What is your experience like ? Have you tried similar things ? Or other things ? How did they work out ?</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=LIfe+without+a+backlog+http://d65ao.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=LIfe+without+a+backlog+http://d65ao.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2009/10/13/life-without-a-backlog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two months of Lean</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2009/10/06/two-months-of-lean/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2009/10/06/two-months-of-lean/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 16:54:31 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=157</guid>
		<description><![CDATA[It has been two months since we set on the Kanban journey. It is time to make a few observations.
First it is very hard to fight the urge of piling more work in our queues. We have too many ideas, many of them looking good enough that we would like to record them. It is [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><p>It has been two months since we set on the <a href="http://digitalbrikes.com/onebrikeatatime/2009/09/05/creating-our-kanban-process-stages-and-queues/">Kanban journey</a>. It is time to make a few observations.</p>
<p>First it is very hard to fight the urge of piling more work in our queues. We have too many ideas, many of them looking good enough that we would like to record them. It is a conscious effort to resist this and remind ourselves that, if these ideas are good they will either resurface coming from stake holders or we will remember them. If not, chances are we would not find them in a laundry list anyway.</p>
<p>Second it was enlightening to notice how small stories and short cycle time is energising. Short cycle times give an incredible impression of control over the process. They are also morale boosters as progress is continuous. Now this contrasts significantly with a longer story we played recently, which incidentally could have been broken down. That story gave the feeling of a squid, a temporary loss of control. Your vision becomes a  tunnel, you lose peripheral vision and you hope that this will all end well. In the future we will proactively split stories and we will have to resolve the challenge of possibly breaking our WIP limit.</p>
<p>Third we got to experience how cycle and lead times are impacted when the bottleneck (me sadly) is loaded with additional work. We have this inconvenient position where we should reuse code that is in no shape to be reused and therefore needs to be cautiously refactored. That work cannot progress at the speed we move so we have to somewhat duplicate it while we work towards a good solution. Last month I had a green light to make one of the changes and did it. But this is additional work that has increased the lead time and cycle time without direct value to the project. In effect the project is working pro-bono for the rest of the firm. The positive about this is that the effect is immediately visible. In the future we will track this kind of work as issues.</p>
<p>Third, my coworker and subject matter expert was enlightened by <a href="http://www.limitedwipsociety.org/2009/05/27/feature-injection/">Chris Matts&#8217; cartoons</a>. He did not use to understand how Agile in general and our own process in particular can be so efficient in the financial software industry. The Agile 2009 cartoon was an important stepping stone for his &#8220;conversion&#8221;.</p>
<p>How do you record ideas without piling them ? Do you have advice on how to handle external work ? How do you handle back-flow into limited size queues ? </p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Two+months+of+Lean+http://56hpq.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Two+months+of+Lean+http://56hpq.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2009/10/06/two-months-of-lean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Styles</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2009/09/24/agile-transition-styles/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2009/09/24/agile-transition-styles/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 03:13:39 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=153</guid>
		<description><![CDATA[A very stimulating talk again yesterday at the BayAPLN meeting by Joshua Kerievsky. The talk was about &#8220;The Art of Choosing an Agile Transition Style&#8221; and was based on an analogy between painting and Agile Transitions.
I am not sure I fully buy into the analogy of painting style to agile transition style. I actually feel [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><p>A very stimulating talk again yesterday at the BayAPLN meeting by Joshua Kerievsky. The talk was about &#8220;The Art of Choosing an Agile Transition Style&#8221; and was based on an analogy between painting and Agile Transitions.</p>
<p>I am not sure I fully buy into the analogy of painting style to agile transition style. I actually feel the painting style is more useful as an analogy for the practice style (rather than transition only). And that is what was actually talked about most of the time.</p>
<p>A specific point sticked out during the talk and in the questions for which no good answer was articulated. It stemmed from the remark that the creators and masters of new styles (impressionism, cubism, expressionism) had a classic (baroque) training and were perfectly able to paint in that style. And so the question came of how much knowledge do people need to know about the pre-existing styles before being able to apply more modern style.</p>
<p>I think the question is best answered by making a distinction between technique and style. The impressionists were all trained in the techniques that supported the baroque style. And this knowledge enabled them to create new techniques, experiment with them and then give rise to new styles. In this case the style emerges from the techniques that are applied to the art. Obviously, once the technique is created it can be taught and the student of that technique can then paint in the new styles. The deeper their technical knowledge the more styles they have available to express their art or satisfy their patrons.</p>
<p>And the lesson I take out of this is that to apply agile in various environments one has to be well versed in all the techniques that exist to successfully select the ones that will support the desired style. It seems to indicate also that to successfully transition from one style to another one needs a good understanding of the techniques and aspirations that created the old style in addition to knowing the techniques that will support the new style.</p>
<p>Stimulating is it not ?</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Agile+Styles+http://9pmyx.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Agile+Styles+http://9pmyx.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2009/09/24/agile-transition-styles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actuals considered evil</title>
		<link>http://digitalbrikes.com/onebrikeatatime/2009/09/16/actuals-considered-evil/</link>
		<comments>http://digitalbrikes.com/onebrikeatatime/2009/09/16/actuals-considered-evil/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 02:10:42 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Nag]]></category>

		<guid isPermaLink="false">http://digitalbrikes.com/onebrikeatatime/?p=149</guid>
		<description><![CDATA[I have heard and participated in a lot of conversations recently about tracking the time actually taken to complete a card. This is usually imposed to the team by management. I have never seen a team interested in how much time they actually spent on a work item. What are the reasons to track actuals [...]]]></description>
			<content:encoded><![CDATA[<!-- no icon for 'Agile' --><!-- no icon for 'Nag' --><p>I have heard and participated in a lot of conversations recently about tracking the time actually taken to complete a card. This is usually imposed to the team by management. I have never seen a team interested in how much time they actually spent on a work item. What are the reasons to track actuals ?</p>
<p>The first reason is to track how people spend their time. The idea behind it is usually that you cannot trust people to work hard. And that may be true in some contexts. However, the same people who distrust people&#8217;s work ethics entrust them with gathering the data. And so they essentially get the ideal values randomly adjusted so that they look real. While this is a useful practice at a personal level (see the <a href="http://www.pomodorotechnique.com/">pomodoro technique</a> for instance), at a team level it really comes from the &#8216;look busy&#8217; frame of mind. Throughput should be the thing management cares about.</p>
<p>The second reason is to try to get better at estimating. So managers want to try actuals and compare them to estimates. And then if the actuals do not match the estimates put pressure on the team to get better estimates. So for those of you who believe in that, here is what happens. Developers will start by padding their estimate so that they are pretty sure the actuals won&#8217;t exceed the estimate. Second, remember you hired them because they are smart, so they will never finish early to avoid the suspicion of padding. So you will get perfect detailed estimates and still the project will be late. And if, being clever yourself, you cut the estimates and people do not have time to finish within the estimate, then they will cut corners, drop quality and finish within the estimates anyway. And the project will be late because of those bugs that need to be fixed. By the way did you know that the best estimation is usually at a coarse grain level because then errors tend to offset each other ?</p>
<p>The third less harmful reason for tracking actuals is to improve the time forecast. This is essentially a statistical use by we try to measure the relationship between ideal days (or points, or size) and actual days. Even with this innocuous goal it is a waste of time. First the information is already available in the burn up (or down) chart. Second it tends to be wrong because early in a project there is not enough data to make it statistically relevant and later in a project chances are circumstances have changed (personnel, techniques, technology may have changed, technical debt may becoming a burden etc).</p>
<p>So why waste time and moral on actuals ? Even better, once you abandon actuals, precise estimates become irrelevant and you can get away with relative sizes. And relative sizes are very quick and easy to get consensus on and you therefore save time that too. So please abandon the collection of actual times !</p>
<p align="right"><a class="tt" href="http://twitter.com/home/?status=Actuals+considered+evil+http://3rq8r.th8.us+#digitalbrikes" title=" "><img class="nothumb" src="http://digitalbrikes.com/onebrikeatatime/wp-content/plugins/tweet-this/icons/tt-twitter-big1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Actuals+considered+evil+http://3rq8r.th8.us+#digitalbrikes" title=" "> </a></p>]]></content:encoded>
			<wfw:commentRss>http://digitalbrikes.com/onebrikeatatime/2009/09/16/actuals-considered-evil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
