<?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>Tea-Driven Development</title>
	<atom:link href="http://blog.mattwynne.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mattwynne.net</link>
	<description>Matt Wynne taking it one tea at a time</description>
	<lastBuildDate>Tue, 31 Aug 2010 15:27:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Outside-In vs Inside Out &#8211; Comparing TDD Approaches</title>
		<link>http://blog.mattwynne.net/2010/08/31/outside-in-vs-inside-out-comparing-tdd-approaches/</link>
		<comments>http://blog.mattwynne.net/2010/08/31/outside-in-vs-inside-out-comparing-tdd-approaches/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 11:41:33 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/08/31/outside-in-vs-inside-out-comparing-tdd-approaches/</guid>
		<description><![CDATA[At last month&#8217;s ScotRUG Brian Swan and I attempted to solve the TDD Avatars problem as a live recital in our chosen style. We each had 35 minutes. The videos are here: Brian&#8217;s Inside-Out TDD approach Matt&#8217;s Outside-In approach When Brian had walked us through his approach and solution at the last month&#8217;s meeting, he&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p>At last month&#8217;s <a href="http://scotrug.org/">ScotRUG</a> Brian Swan and I attempted to solve the <a href="http://blogs.agilefaqs.com/wp-content/uploads/2007/12/avatars-of-tdd.pdf">TDD Avatars</a> problem as a live recital in our chosen style. We each had 35 minutes.</p>

<p>The videos are here:</p>

<p><a href="http://vimeo.com/14325277">Brian&#8217;s Inside-Out TDD approach</a></p>

<p><a href="http://vimeo.com/14325350">Matt&#8217;s Outside-In approach</a></p>

<p>When Brian had walked us through his approach and solution at the last month&#8217;s meeting, he&#8217;d built his solution as a Rails application, with web forms for filling out bookings and viewing receipts and so on.</p>

<p>When I came to start practicing and converted the use case from the <a href="http://blogs.agilefaqs.com/wp-content/uploads/2007/12/avatars-of-tdd.pdf">TDD Avatars paper</a> into a Cucumber feature, it quickly became clear that the <em>value</em> of the system I was building, at least as described by the use case, was to provide printed receipts to customers. I then started to think about the simplest way I could build a system to provide that value.</p>

<p>Here&#8217;s the feature I wrote:</p>

<p><div>
<pre class="txt" style="font-family:monospace;">Feature: Pay bill
&nbsp;
  Background: Prices
    Given the following operations are available:
      | operation        | price |
      | routine check up | 10    |
      | shots            | 5     |
&nbsp;
  Scenario: Dave Pays for Fluffy
    Given there is an owner Dave Atkins, let's call him &quot;Dave&quot;
    And Dave brings his pet named Fluffy into the clinic for the following operations:
      | routine check up |
      | shots            |
    When the veterinarian charges him for the visit
    And Dave pays cash
    Then Dave is given a receipt which looks like this:
      &quot;&quot;&quot;
      Operations:
        $10 (routine check up)
        $5 (shots)
&nbsp;
      Total to pay: $15
&nbsp;
      Paid cash, received with thanks
&nbsp;
      &quot;&quot;&quot;</pre>
</div></p>

<p>Notice that the scenario <a href="http://elabs.se/blog/15-you-re-cuking-it-wrong">doesn&#8217;t talk about clicking particular buttons or filling in boxes</a> on a form? I&#8217;ve used a higher-level <em>declarative</em> style to describe the behaviour I want. In my experience this helps in various ways:</p>

<ul>
<li>more human-readable features</li>
<li>features that aren&#8217;t coupled to a particular user interface</li>
</ul>

<p>If you watch the video, you&#8217;ll see that the first thing I did, working my way in from the step definitions, was to create a custom step definition DSL for my problem domain. Instead of using a generic DSL like Capybara&#8217;s <code>fill_in</code>, <code>click_button</code> etc, I created this one:</p>

<p><div>
<pre class="txt" style="font-family:monospace;">module VetsHelper
  def register_operation_price(operation, price)
  end
&nbsp;
  def remember_owner(name, nickname)
  end
&nbsp;
  def create_visit(owner_nickname, pet_name, operations)
  end
&nbsp;
  def charge_for_visit
  end
&nbsp;
  def pay_with(payment_type, nickname)
  end
&nbsp;
  def receipt
    &quot;&quot;
  end
end</pre>
</div></p>

<p>This is arguably unnecessary: my step definitions are already translating from English into Ruby, so why add this extra layer of indirection?</p>

<p>As I worked my way from the outside (the features) into the step definitions, I wasn&#8217;t ready to commit myself to how I was going to couple the tests to my new application. By defining this interface, I&#8217;ve deferred that commitment a little later. I&#8217;ve also given myself a clean view of all the behaviour the new application needs to support.</p>

<p>My first iteration implementation (the one in the video) of <code>VetsHelper</code> drives out a domain model directly from the methods in that module. If that was what we released to our user, they&#8217;d only be able to print receipts if they knew how to use an IRB prompt. That might seem ridiculous, but we&#8217;ve gone a long way to solving the problem, and we could probably spike a simple script that let them do it from the command-line without much risk.</p>

<p>For our second iteration, we can talk to the customer about that command-line interface, then write a new implementation of <code>VetsHelper</code>, perhaps using some of Aruba&#8217;s DSL, which goes through that command-line interface instead of directly to the model. This is the beauty of using a declarative style together with your own domain-specific step definition DSL: it gives you the flexibility to swap in connections to the system that hit it at different levels, using exactly the same acceptance tests.</p>

<h2>Did BDD Save Me Time?</h2>

<p>When Brian and I were planning this month&#8217;s session, I showed him the code I&#8217;d written and he decided to do a comparable solution this time, without any UI, so that they were easy to compare. In fact, <a href="http://github.com/bgswan/tddavatar">Brian&#8217;s solution looked much simpler</a>, and was certainly quicker to write, because he didn&#8217;t have to spend any time writing the acceptance testing layers and he didn&#8217;t write any kind of entry-point <code>Practice</code> class. He just went straight into building the Appointment class.</p>

<p>A big difference between the solution we produced this month and the one that Brian had originally built was that we didn&#8217;t use Rails, and instead went for a much simpler solution that still provided some immediate value. I like to think that the idea for doing this came from the BDD approach I took&#8212;I&#8217;m pretty sure I remember the lightbulb going on as I typed out the feature&#8212;but we&#8217;ll never know now where this idea originated.</p>

<p>I noticed that Brian spent time testing getters on his classes, which I probably wouldn&#8217;t have done. I tend to try to avoid using them, except on value object, and I rarely test the behaviour of value objects. I rely on my acceptance tests to tell me if they&#8217;re not working.</p>

<h2>Focus and Design</h2>

<p>Brian&#8217;s big take-away was that the difference in our approaches when we needed a collaborator object. When I needed a collaborator for a class, I would just mock out the collaborator and carry on finishing off the class I was building, whereas he would leave the current class broken and go and build the other class first.</p>

<p>I find my (mock-based) approach gives me focus, and also means I can sketch out the design of the collaborator without having to commit myself to that design until I understand how it&#8217;s going to be used.</p>

<p>I&#8217;m really happy with <a href="http://github.com/mattwynne/tddavatar/">the design I ended up with</a>. It&#8217;s hard to make much of a judgement in such a simple problem, but I&#8217;d be interested to hear your thoughts on how the two designs compare. Which one would you have preferred to add a new feature to?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/08/31/outside-in-vs-inside-out-comparing-tdd-approaches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Fable of the User-Centred Designer</title>
		<link>http://blog.mattwynne.net/2010/08/30/the-fable-of-the-user-centred-designer/</link>
		<comments>http://blog.mattwynne.net/2010/08/30/the-fable-of-the-user-centred-designer/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 10:50:18 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[UCD]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/08/30/the-fable-of-the-user-centred-designer/</guid>
		<description><![CDATA[Agile software development is not really about burn-down-charts, unit tests, refactoring or code metrics or even pair programming. At it&#8217;s heart, it&#8217;s about building software that really works for the people who are going to use it. All those practices you read about are just tools that help you to develop software iteratively, so that [...]]]></description>
			<content:encoded><![CDATA[<p>Agile software development is not really about burn-down-charts, unit tests, refactoring or code metrics or even pair programming. At it&#8217;s heart, it&#8217;s about building software that really works for the people who are going to use it. All those practices you read about are just tools that help you to develop software iteratively, so that you can keep moving the software closer and closer to becoming what it&#8217;s users actually want.</p>

<p>The goal is not the practices themselves, but the ability they give you to iterate.</p>

<p>If you really want to build software iteratively, you also need to understand about User-Centric Design. I&#8217;m finally getting the opportunity to get involved with a project early enough to put this into practice myself. Here&#8217;s a <a href="http://www.userfocus.co.uk/pdf/fable.pdf">great introduction I just found</a>.</p>

<p>In summary:</p>

<ul>
<li>Early and continual focus on user and their tasks</li>
<li>Empirical measurement of user behaviour</li>
<li>Iterative design</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/08/30/the-fable-of-the-user-centred-designer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fix RubyMine 2.02 Cucumber Integration</title>
		<link>http://blog.mattwynne.net/2010/08/25/fix-rubymine-2-02-cucumber-integration/</link>
		<comments>http://blog.mattwynne.net/2010/08/25/fix-rubymine-2-02-cucumber-integration/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 18:55:07 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Ruby Programming]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[RubyMine]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/08/25/fix-rubymine-2-02-cucumber-integration/</guid>
		<description><![CDATA[If you&#8217;re using the latest version of RubyMine (2.0.2) with the latest version of Cucumber (actually anything above 0.7), you&#8217;ll probably see this ugly warning when you try to run your cukes from within the IDE: The bug has been logged, and there&#8217;s a published workaround, but I wanted something a bit easier to use. [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re using the latest version of <a href="http://www.jetbrains.com/ruby/">RubyMine</a> (2.0.2) with the latest version of <a href="http://cukes.info/">Cucumber</a> (actually anything above 0.7), you&#8217;ll probably see this ugly warning when you try to run your cukes from within the IDE:</p>

<p><img src="http://blog.mattwynne.net/wp-content/uploads/2010/08/screen_shot_of_rubymine_error.png" alt="screen-shot-of-rubymine-error" /></p>

<p>The bug <a href="http://youtrack.jetbrains.net/issue/RUBY-5984?projectKey=RUBY&amp;query=cucumber">has been logged, and there&#8217;s a published workaround</a>, but I wanted something a bit easier to use.</p>

<p>Try this instead. Close RubyMine, open a terminal, and run this command:</p>

<p><div>
<pre class="txt" style="font-family:monospace;">curl http://gist.github.com/raw/550046/240dd98b8b0ed1efa817f26ff2697940ddd0f53d/rubymine-2.02-cucumber.patch | patch -p0</pre>
</div></p>

<p>or even</p>

<p><div>
<pre class="txt" style="font-family:monospace;">curl -L http://bit.ly/bPNmYV | patch -p0</pre>
</div></p>

<p>It won&#8217;t work with Cucumbers older than 0.7, but why would you want to use them?</p>

<p><em>Update:</em> If you like life on the bleeding edge, you can also try the <a href="http://confluence.jetbrains.net/display/RUBYDEV/RubyMine+EAP">EAP release</a> (latest development build) of the forthcoming RubyMine 2.5, which contains this fix.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/08/25/fix-rubymine-2-02-cucumber-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Belly Wants to Eat Your Tests</title>
		<link>http://blog.mattwynne.net/2010/08/23/belly-wants-to-eat-your-tests/</link>
		<comments>http://blog.mattwynne.net/2010/08/23/belly-wants-to-eat-your-tests/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 15:03:37 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/08/23/belly-wants-to-eat-your-tests/</guid>
		<description><![CDATA[Ever since I lead the team at Songkick through an Acceptance-Test-Driven re-write of their gorgeous web-ui, I&#8217;ve been thinking about problem of scaling a large suite of acceptance tests. By the time I left Songkick for the wilds of Scotland, it would take over 3 hours to run all the Cucumber tests on a single [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since I lead the team at Songkick through an Acceptance-Test-Driven re-write of their <a href="http://songkick.com">gorgeous web-ui</a>, I&#8217;ve been <a href="http://blog.mattwynne.net/2009/04/06/the-future-of-automated-acceptance-testing/">thinking about problem</a> of scaling a large suite of acceptance tests. By the time I left Songkick for the wilds of Scotland, it would take over 3 hours to run all the Cucumber tests on a single machine.</p>

<p>When things take that long, TDD stops being fun.</p>

<h2>Intelligent Selection</h2>

<p>In order to make an intelligent selection of which tests to run, you need some knowledge of the past history of each of your tests. Most testing tools are like goldfish: they run the tests and show you what failed, then on the next run they wipe the slate clean and start over. Dumb.</p>

<p><a href="http://www.threeriversinstitute.org/">Sir Kent Beck</a>, always ahead of the game, has been building an <a href="http://www.threeriversinstitute.org/junitmax/subscribe.html">exciting new product</a> to enable precisely this kind of <em>selective testing</em> for Java projects.</p>

<p>But I don&#8217;t work on Java projects.</p>

<h2>Enter the Belly</h2>

<p>I decided to build a web service that would record the history of each scenario in my Cucumber test suite, so that I could start to make decisions about which ones to run. I see no reason why this service can&#8217;t be generic enough to work for any kind of test case, but Cucumber scenarios seem like a good place to get started, since that&#8217;s where I do a lot of my testing, and they&#8217;re often slow.</p>

<p>Belly works by installing a little hook into your Cucumber test suite. When the tests run, Belly sends a message to the central &#8216;hub&#8217; web service (currently hosted at <a href="http://belly.heroku.com">http://belly.heroku.com</a>) reporting the result of the test. Gradually, Belly builds up a picture of your test suite, which you can browse from the website.</p>

<h2>Features</h2>

<p>The current version of Belly is alpha-ware, proof-of-concept. It works, but I&#8217;m sure it won&#8217;t scale well to thousands of users with thousands of tests. I&#8217;m sure you&#8217;ll find bugs. It also looks pretty rough, but don&#8217;t let that put you off; there&#8217;s huge potential here.</p>

<p><img src="http://blog.mattwynne.net/wp-content/uploads/2010/08/works_on_my_machine.png" alt="works-on-my-machine" /></p>

<p>Right now, probably the most useful feature is the <code>belly rerun</code> command, which helps you focus on running just the cukes that you&#8217;ve broken. Rather than having to keep track of them in a rerun.txt file, Belly will remember everything you&#8217;ve broken and give you the output you need to run it again with Cucumber:</p>

<p><div>
<pre class="txt" style="font-family:monospace;">cucumber `belly rerun`</pre>
</div></p>

<p>You can see a demonstration of how to get started using Belly in <a href="http://www.youtube.com/watch?v=1WIfKn-0CeI">this slick and polished screencast</a>.</p>

<h2>How To</h2>

<p>If you can&#8217;t make out the details on the horribly blurry screencast, here&#8217;s the summary:</p>

<p><div>
<pre class="txt" style="font-family:monospace;"># install the gem:
gem install belly
&nbsp;
# write belly's hook and config files into your project:
belly init
&nbsp;
# run your features
cucumber features
&nbsp;
# see your test results live on the internets. tada!
open http://belly.heroku.com
&nbsp;
# see what's left to do
belly rerun
&nbsp;
# tell cucumber to run what's left to do
cucumber `belly rerun`</pre>
</div></p>

<h2>Disclaimer</h2>

<p>I can&#8217;t stress how rough-and-ready this is, but I think it&#8217;s still useful enough to provoke you into giving me some feedback. Use it at your own risk, and <a href="mailto:belly-users@googlegroups.com">let me know</a> your thoughts.</p>

<h2>Coincidences</h2>

<p>Incredibly, it turns out that Joe Wilk, my old team-mate at Songkick and fellow Cucumber-core hacker, has been working on <a href="http://blog.josephwilk.net/ruby/limiting-red-smarter-test-builds-through-metrics.html">another solution</a> to exactly the same problem. Living with a 3-hour build can be quite a motivator! I&#8217;m hoping Joe and I can figure out a way to combine our efforts into something really beautiful.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/08/23/belly-wants-to-eat-your-tests/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Battling Robots at Software Craftsmanship 2010</title>
		<link>http://blog.mattwynne.net/2010/08/18/battling-robots-at-software-craftsmanship-2010/</link>
		<comments>http://blog.mattwynne.net/2010/08/18/battling-robots-at-software-craftsmanship-2010/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 08:15:15 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/08/18/battling-robots-at-software-craftsmanship-2010/</guid>
		<description><![CDATA[I&#8217;ve submitted a session for the Software Craftsmanship 2010 Conference. It&#8217;s a redux of the Robot Tournament I ran at SPA2010. The idea behind the session is to simulate the life of a start-up software company. In the early rounds of the tournament, the priority for each team is to get a robot, any robot, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve <a href="http://sc2010subs.wordpress.com/">submitted a session</a> for the <a href="softwarecraftsmanship.org.uk">Software Craftsmanship 2010 Conference</a>. It&#8217;s a redux of the Robot Tournament I ran at <a href="http://www.spaconference.org/spa2010/index.php">SPA2010</a>.</p>

<p>The idea behind the session is to simulate the life of a start-up software company. In the early rounds of the tournament, the priority for each team is to get a robot, any robot, out there an playing matches. As the tournament progresses, quality becomes more important as you need to adapt your robot to make it a better competitor.</p>

<p>This ability to adapt your approach to the work to the context you&#8217;re doing it in is, I think, really important for the true craftsperson to grasp. If you&#8217;ve been reading Kent Beck&#8217;s <a href="http://www.threeriversinstitute.org/blog/?p=251">posts</a> about <a href="http://www.threeriversinstitute.org/blog/?cat=10">start-ups</a> and <a href="http://www.threeriversinstitute.org/blog/?cat=6">design</a>, you&#8217;ll be familiar with this subject. It&#8217;s wonderful to be able to patiently produce a beautifully-worked piece of furniture, but what if the building is burning down and you just need a ladder to escape, right now? Can you rip up some floorboards and knock something together from the materials to hand and save your family?</p>

<p>There&#8217;s a great skill in understanding and working to the <em>appropriate</em> level of quality for the context you&#8217;re currently in, and I hope this session gives people a little insight into that.</p>

<p>You can watch my screencast audition for the session <a href="http://www.youtube.com/watch?v=7hd77KGk1kU">here</a>. Please leave any feedback or comments <a href="http://sc2010subs.wordpress.com/2010/08/17/robot-tournament-matt-wynne/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/08/18/battling-robots-at-software-craftsmanship-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hi-Fidelity Project Management</title>
		<link>http://blog.mattwynne.net/2010/07/11/hi-fidelity-project-management/</link>
		<comments>http://blog.mattwynne.net/2010/07/11/hi-fidelity-project-management/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 13:19:05 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Kaban]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[Systems Thinking]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/07/11/hi-fidelity-project-management/</guid>
		<description><![CDATA[If the only metric you use for measuring and forecasting your team&#8217;s progress is their iteration velocity, you&#8217;re missing out on a great deal of richer information that, for just a few extra minutes per day, you could easily be collecting. This is information that the team can use during the iteration to help spot [...]]]></description>
			<content:encoded><![CDATA[<p>If the only metric you use for measuring and forecasting your team&#8217;s progress is their iteration velocity, you&#8217;re missing out on a great deal of richer information that, for just a few extra minutes per day, you could easily be collecting. This is information that the team can use <em>during the iteration</em> to help spot and fix problems that are holding them back.</p>

<p>If you&#8217;re using scrum, you&#8217;re probably familiar with using a <em>Release Burndown</em> chart to track the team&#8217;s progress, iteration by iteration, towards a bigger goal:</p>

<p><a href="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-11.11.171.png"><img class="aligncenter size-medium wp-image-219" title="Release burn-down" src="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-11.11.171-300x188.png" alt="Release Burn-Down Chart" width="300" height="188" /></a></p>

<p>Here we can see the team&#8217;s velocity appears to be slowing down. They might still release at the end of Sprint #9, but there&#8217;s a chance, if the flattening trend in their velocity continues to worsen, that they may never finish the project at all.</p>

<p>We have enough information here to know that something may be wrong. We can use this information to warn stakeholders that our release date may be at risk of slipping, and may also start looking though the backlog of stories for things we can drop.</p>

<p>The problem with these responses is that they&#8217;re purely reactive. Assuming there is a systemic cause at the root of this slow-down, we&#8217;re not doing anything to deal with it and get the team back on track. We can go and ask the team what they think might be wrong, and try to help them correct any problems they can identify. This can often work, but sometimes the team may not have the experience or perspective to be able to see what&#8217;s going wrong.</p>

<p>Another problem is that we&#8217;ve had to wait until the end of the iteration to get this information. For an organisation that&#8217;s used to going into the darkness of 9-month waterfall projects, getting iteration velocity figures once a fortnight can see pretty decent. An awful lot can happen inside an iteration though, and having that summed up by a single number loses a lot of important detail. Like the signal on an old short-wave radio, this is low-fidelity data.</p>

<p>One crucial piece of data that&#8217;s hidden within the burn-down chart is what I call the <em>rate of discovery</em>. The whole point of agile development is that it&#8217;s iterative: we build and ship something, get some feedback, learn from that, build and ship some more, and repeat until our stakeholders are happy with it. If we&#8217;re doing iterative (as opposed to repetitive) development, we&#8217;re going to discover new user stories as we go through the project, perhaps even as we go through the iteration. This is a good thing: it means we&#8217;re listening to our customers. We need to make sure our project plans can handle this as a matter of course.</p>

<p>Going back to our release burn-down, we want to separate the rate of discovery from the rate of delivery. A great way to do this is simply to flip the vertical axis of the chart, and use a <em>Release Burn-Up</em> instead. On here we can start tracking two lines instead of one. First we draw the number of completed stories (or story points), and then stacked on top of that, we draw the number of stories still to do. That includes any story not yet done &#8211; whether it&#8217;s in the backlog or being worked on in the next iteration.
<p style="text-align: center;"><a href="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-11.57.462.png"><img class="aligncenter size-medium wp-image-221" title="Screen shot 2010-07-11 at 11.57.46" src="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-11.57.462-300x189.png" alt="" width="300" height="189" /></a></p>
I love these charts &#8211; they seem to easily map to people&#8217;s understanding of the project. When you explain that the area underneath the bottom line represents all the features that have been done, it&#8217;s easy for anyone involved with the project to quickly understand what it means. In the case of the chart above, we can identify that while the team are delivering at a pretty steady rate, they&#8217;re discovering features at a steady rate too. They&#8217;ll probably need to de-scope if they want to meet their release date.</p>

<p>We can add extra fidelity to this chart in two dimensions: We can collect samples more often, and we can collect details about just <em>how done</em> the stories are as they move from &#8216;not done&#8217; into &#8216;done&#8217;. Let&#8217;s start by collecting more detail about how done the stories are. Imagine our task board looks like this at the end of an iteration:</p>

<p><a href="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-12.15.211.png"><img class="aligncenter size-medium wp-image-222" title="Screen shot 2010-07-11 at 12.15.21" src="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-12.15.211-300x159.png" alt="" width="300" height="159" /></a></p>

<p>One story (Story A) is done, and 8 other stories are not done. As we track these counts over time, we can draw one line on our Release Burn Up chart for each category of &#8216;not done&#8217; and stack the lines:</p>

<p><a href="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-14.08.47.png"><img class="aligncenter size-medium wp-image-217" title="Screen shot 2010-07-11 at 14.08.47" src="http://blog.mattwynne.net/wp-content/uploads/2010/07/Screen-shot-2010-07-11-at-14.08.47-300x160.png" alt="" width="300" height="160" /></a></p>

<p>This chart has another name, <em>Cumulative Flow Diagram</em> (CFD). We call it this because as stories flow from &#8216;not done&#8217; to &#8216;done&#8217; across the task board, we&#8217;re drawing the accumulation of that flow on the diagram. There are lots of things we can gleam from this diagram.</p>

<p>If we look at the example above, we can see that work is stacking up in the design stage of our process. Because our CFD chart highlights this, we can put more directed effort into relieving the bottleneck on the designers, perhaps by adding an extra analyst to the team to run ahead and do some more detailed analysis of the upcoming stories in the backlog, or by helping the designers to break the existing stories up into smaller ones that are easier to understand.</p>

<p>You can wait until the end of the iteration to count these numbers, but why stay ignorant? If you collect this data every day, you&#8217;ll get quick feedback about where bottlenecks are appearing in your team, and be able to try small tweaks to correct them.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/07/11/hi-fidelity-project-management/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Installing mysql gem on Mac OSX Snow Leopard</title>
		<link>http://blog.mattwynne.net/2010/05/27/installing-mysql-gem-on-mac-osx-snow-leopard/</link>
		<comments>http://blog.mattwynne.net/2010/05/27/installing-mysql-gem-on-mac-osx-snow-leopard/#comments</comments>
		<pubDate>Thu, 27 May 2010 11:32:43 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Ruby Programming]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/05/27/installing-mysql-gem-on-mac-osx-snow-leopard/</guid>
		<description><![CDATA[This old chore doesn&#8217;t seem to have become any easier lately. Here&#8217;s how to do it: http://blog.simb.net/2009/10/24/gem-mysql-with-mysql-5-1-on-snow-leopard/]]></description>
			<content:encoded><![CDATA[<p>This old chore doesn&#8217;t seem to have become any easier lately. Here&#8217;s how to do it:
<a href="http://blog.simb.net/2009/10/24/gem-mysql-with-mysql-5-1-on-snow-leopard/">http://blog.simb.net/2009/10/24/gem-mysql-with-mysql-5-1-on-snow-leopard/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/05/27/installing-mysql-gem-on-mac-osx-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Random Notes from SPA2010</title>
		<link>http://blog.mattwynne.net/2010/05/20/random-notes-from-spa2010/</link>
		<comments>http://blog.mattwynne.net/2010/05/20/random-notes-from-spa2010/#comments</comments>
		<pubDate>Wed, 19 May 2010 23:31:26 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[SPA]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/05/20/random-notes-from-spa2010/</guid>
		<description><![CDATA[Usage-Centric Design Narrative Journey Maps Duncan Prefers the term Usage-Centred Design to User-Centric Design. There was a book reference here but I missed it. Narrative Journey Maps (NJM) are a way to model and visualise the steps a user has to follow as they try to achieve a goal. Each Step is decorated with: Comments [...]]]></description>
			<content:encoded><![CDATA[<h2>Usage-Centric Design</h2>

<p><a href="http://blog.mattwynne.net/wp-content/uploads/2010/05/spa20101.jpg"><img class="aligncenter size-thumbnail wp-image-204" title="spa2010" src="http://blog.mattwynne.net/wp-content/uploads/2010/05/spa20101-150x150.jpg" alt="" width="150" height="150" /></a></p>

<h3>Narrative Journey Maps</h3>

<ul>
<li>Duncan Prefers the term <em><em>Usage</em>-Centred Design</em> to <em>User-Centric Design</em>. There was a book reference here but I missed it.</li>
<li>Narrative Journey Maps (NJM) are a way to model and visualise the steps a user has to follow as they try to achieve a goal.</li>
<li>Each Step is decorated with:</li>
<li>Comments</li>
<li>Questions</li>
<li>Ideas</li>
<li>An <em>Emotional Barometer</em> is draw across the top which highlights pain-points where the user may be particularly frustrated with the process.</li>
<li>NJMs are usually created from a <em>Contextual Study</em> where users are quietly observed trying to reach the goal.</li>
<li>They are a way to record the current state of play, and a place to start thinking about how things could change.</li>
</ul>

<h3>Personas</h3>

<ul>
<li>Alan Cooper 1985</li>
<li>Based on real data: capture and use direct observations of real experience</li>
<li>Group and merge those observations to form personas</li>
<li>Personas have:</li>
<li>Motivations</li>
<li>Goals</li>
<li>Frustrations</li>
<li>Behaviours</li>
</ul>

<p>It seemed that what had worked for the presenters was to focus on just one persona at a time, when it became obvious who their core user was, and work at satisfying their needs. Once they&#8217;d started to make significant inroads into this, it became clearer and more worthwhile to look for other personas.</p>

<h2>To Read</h2>

<p>Luke Hohman&#8217;s Innovation Games
Mr Squiggle (seed drawings for workshop excercises)
Consensus:</p>

<ul>
<li>Quaker Business Method</li>
<li>Sociocracy</li>
<li>Formal Consensus (CT Butler)</li>
<li>&#8220;Participatory Decision Making&#8221; &#8211; Sam Kaner</li>
</ul>

<p>&#8220;The Logical Thinking Process&#8221; &#8211; H William Dettner. A book on <em>conflict clouds</em>.
&#8220;Round the Bend&#8221; &#8211; Neville Chute. Like Zen and The Art of Motorcycle Maintenance but English</p>

<h2>Other Conferences</h2>

<p>Keith Braithwaite was heading out to &#8216;Next Generation Testing&#8217; and said he was really looking forward to it. He said it was quite easy to stand out from the crowd of big vendors, and that if you have something original to say you&#8217;ll likely be asked back. He also mentioned &#8216;Test Expo&#8217; as being another conference in this vein.</p>

<p>Really interesting it taking the Cucumber message to these conferences.</p>

<h2>Remote Pairing and Wolf-pack programming</h2>

<p>I met several people who are making use of or would like to make use of this more. Many of them were using Ubuntu so don&#8217;t have access to iChat, and were struggling with slow VNC connections. I suggested screen + emacs/vim to a few people (not that I&#8217;ve used it myself, but I&#8217;ve heard good things). People mentioned plug-ins for eclipse, and my old favourite SubEthaEdit came up. It does feel like there&#8217;s product missing here.</p>

<p>Some guys did a BoF trying out a crazy contraption they had using a smalltalk environment that allowed a dozen people all edit the same code at the same time, <em>on their own workstations</em>. It sounded pretty amazing.</p>

<h2>My Session</h2>

<p>I ran a session, <em>Robot Tournament</em> at the conference. Despite what I had considered thorough preparation, I had some rather exciting moments when the tournament engine spluttered and needed some running repairs. Overall though the feedback I got was positive. Some observations:</p>

<ul>
<li>The (accidental) downtime gave people an opportunity to make build scripts and so on. I wonder whether this could be engineered deliberately another time.</li>
<li>More logging and visibility of exactly what&#8217;s going on when a player runs would be useful to help participants with debugging.</li>
<li>The warm-up should include calling a robot with a command-line argument so that any teething problems with reading the input can be resolved at a relaxed pace.</li>
<li>A better explanation (role play?) of how the tournament works would help.</li>
<li>Need to limit the number of players to 1 per team. Although it was worth experimenting with allowing more than one, there were a couple of disadvantages that seemed to outweigh the advantages:</li>
<li>when people realised they could write scripts to add several robots, this really slowed down the time to run a round due to the number of permutations of matches. I guess here you could deal with this by using a league system, but for now the simplest thing seems to be to just limit the number of players.</li>
<li>there is a strategy (which the winning team used) where you use a patsy player which can recognise a game against another player from the same team and throw the game, thus giving that player an advantage. By releasing several patsy players you leverage that advantage.</li>
<li>I was surprised (and a bit disappointed) at how conservative most of the language choices were. I think we had 3 Ruby robots, 2 Java ones and one Haskell robot. Sadly I couldn&#8217;t get smalltalk working for the guy who wanted to use that. It seemed clear that rather than one language being particularly better than another for the problem at hand, teams who used a language they were familiar with did best.</li>
<li>It was hard for people to see what was going on when they were getting their robots running. More visibility how exactly what it looks like when their program is run on the server environment would be helpful.</li>
<li>Also more functionality on the UI to slice the results and look at just how your own robot had performed.</li>
<li>The problem was so small that tests were hardly needed. Pivoting, changing the rules of the game half-way through the tournament might have helped here.</li>
<li>I would also be interested in trying out variable-length iterations &#8211; some long ones, some short ones.</li>
<li>Shipping simple solutions early was definitely a strategy that had worked for everyone.</li>
<li>People enjoyed the fact that the goal &#8211; getting points &#8211; was clear, so that rather than it being about writing clean code or writing tests, it was more realistic to a business context.</li>
<li>Trying a more open game where you could learn more about your opponent might be interesting</li>
<li>Getting teams to swap code might also be interesting</li>
<li>Doing a code show &amp; tell wasn&#8217;t in my plan but worked really well</li>
</ul>

<p>The session format ended up being something like this:</p>

<ul>
<li>10 minutes introduction</li>
<li>25 minutes warm-up</li>
<li>30-45 minutes faffing around fixing the engine while people started to build their real robots
break</li>
<li>7 x 7 = 50 minutes tournament rounds</li>
<li>25 minutes code show &amp; tell</li>
<li>15 retrospective looking at what we&#8217;d learned and any insights</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/05/20/random-notes-from-spa2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fancy a Game of Robots?</title>
		<link>http://blog.mattwynne.net/2010/05/14/fancy-a-game-of-robots/</link>
		<comments>http://blog.mattwynne.net/2010/05/14/fancy-a-game-of-robots/#comments</comments>
		<pubDate>Fri, 14 May 2010 18:01:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/05/14/fancy-a-game-of-robots/</guid>
		<description><![CDATA[I&#8217;m running a session next week at the SPA conference where we&#8217;re going to have a battle between rival teams of programmers. I&#8217;ve been working on the tournament engine for the past few weeks and really picked up pace on it this week. I hadn&#8217;t realised it would be so much work! The thing is, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.mattwynne.net/wp-content/uploads/2010/05/robot.jpeg" alt="robot" /></p>

<p>I&#8217;m running a <a href="http://www.spaconference.org/spa2010/sessions/session275.html">session next week at the SPA conference</a> where we&#8217;re going to have a battle between rival teams of programmers.</p>

<p>I&#8217;ve been working on the tournament engine for the past few weeks and really picked up pace on it this week. I hadn&#8217;t realised it would be so much work!</p>

<p>The thing is, dear reader, I would really like to test the tournament engine out before the session runs for real at the conference. So I&#8217;m proposing to run the tournament via the web some time this weekend. It will take at most 2 hours. I&#8217;ll set up an IRC channel so we can heckle each other.</p>

<p>If this sounds like your idea of fun, please sign up <a href="http://whenisgood.net/99mf9x">here</a> indicating the best time for you, and I&#8217;ll be in touch.</p>

<p><a href="http://whenisgood.net/99mf9x">That&#8217;s right, you can SIGN UP HERE</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/05/14/fancy-a-game-of-robots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile North 2010</title>
		<link>http://blog.mattwynne.net/2010/04/26/agile-north-2010/</link>
		<comments>http://blog.mattwynne.net/2010/04/26/agile-north-2010/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 16:37:18 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[conference]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2010/04/26/agile-north-2010/</guid>
		<description><![CDATA[I&#8217;ll be speaking at Agile North this year. The title of my talk is &#8220;The Lean Startup&#8221;, in which I&#8217;ll describe my experiences with an incredible young company I&#8217;ve been working with for the last couple of years. Here&#8217;s some more details about the conference: Friday 14th May 2010 &#8211; UCLan, Preston Price held at [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be speaking at Agile North this year. The title of my talk is &#8220;The Lean Startup&#8221;, in which I&#8217;ll describe my experiences with an incredible young company I&#8217;ve been working with for the last couple of years. </p>

<p>Here&#8217;s some more details about the conference:</p>

<blockquote>
  <p>Friday 14th May 2010 &#8211; UCLan, Preston</p>
  
  <p>Price held at £95 per person &#8211; be there to learn, share, take part
  and enjoy</p>
  
  <p>Details on <a href="http://www.agilenorth.org/">www.agilenorth.org</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2010/04/26/agile-north-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
