<?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>Flexible Diamond &#187; process</title>
	<atom:link href="http://blog.flexiblediamond.com/tag/process/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.flexiblediamond.com</link>
	<description></description>
	<lastBuildDate>Wed, 02 Sep 2009 12:31:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mockito-Flex meets ASUnit</title>
		<link>http://blog.flexiblediamond.com/2009/07/mockito-flex-meets-asunit/</link>
		<comments>http://blog.flexiblediamond.com/2009/07/mockito-flex-meets-asunit/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 17:50:20 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=163</guid>
		<description><![CDATA[Well, that&#8217;s not a catchy headline, but it does pretty much sum it up. I&#8217;ve been playing with Mockito-Flex, a mock object framework for Actionscript 3. It&#8217;s great, and made vastly easier to pick up by a Mockito-FlexUnit bridge in the form of a MockitoTestCase that does the hard work of reporting the mocking results [...]]]></description>
			<content:encoded><![CDATA[<p>Well, that&#8217;s not a catchy headline, but it does pretty much sum it up. I&#8217;ve been playing with <a href="http://bitbucket.org/loomis/mockito-flex/wiki/Home">Mockito-Flex</a>, a <a href="http://en.wikipedia.org/wiki/Mock_object">mock object</a> framework for Actionscript 3. It&#8217;s great, and made vastly easier to pick up by a Mockito-FlexUnit bridge in the form of a MockitoTestCase that does the hard work of reporting the mocking results and validations in a way that FlexUnit can display.</p>
<p>Of course, <a href="http://opensource.adobe.com/wiki/display/flexunit/FlexUnit;">FlexUnit</a> does require the Flex framework, which bulks up the whole thing. Oh, and I&#8217;m used to using <a href="http://asunit.org">ASUnit</a>. So I&#8217;ve written the following class that does the same job as MockitoTestCase, but for ASUnit:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* The MIT License</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Copyright (c) 2009 Mockito contributors</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Permission is hereby granted, free of charge, to any person obtaining a copy of this software</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* and associated documentation files (the &quot;Software&quot;), to deal in the Software without restriction,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* subject to the following conditions:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">package org.<span class="me1">mockito</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> asunit.<span class="me1">framework</span>.<span class="me1">TestCase</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">Matcher</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">MethodSelector</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">MockCreator</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">Stubber</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">Verifier</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> ASUnitMockitoTestCase <span class="kw3">extends</span> TestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _mockClasses:<span class="kw3">Array</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">var</span> mockito:Mockito;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> ASUnitMockitoTestCase<span class="br0">&#40;</span>mockClasses:<span class="kw3">Array</span>, testMethod:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _mockClasses = mockClasses;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span>testMethod<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Due to the asynchronous nature of the class generation</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* a test needs to execute from a callback function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> override <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mockito == <span class="kw2">null</span> <span class="sy0">&amp;&amp;</span> _mockClasses<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mockito = <span class="kw2">new</span> Mockito<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> superRun:<span class="kw2">Function</span> = <span class="kw3">super</span>.<span class="me1">run</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mockito.<span class="me1">prepareClasses</span><span class="br0">&#40;</span>_mockClasses, repositoryPreparedHandler<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> repositoryPreparedHandler<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; superRun<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span>.<span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Constructs mock object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param clazz a class of the mock object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param constructorArgs constructor arguments required to create mock instance</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param name a name used in various output</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return a mocked object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> mock<span class="br0">&#40;</span>classToMock:<span class="kw2">Class</span>, <span class="kw3">name</span>:<span class="kw3">String</span> = <span class="kw2">null</span>, constructorArgs:<span class="kw3">Array</span> = <span class="kw2">null</span><span class="br0">&#41;</span>:<span class="kw3">Object</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">mock</span><span class="br0">&#40;</span>classToMock, <span class="kw3">name</span>, constructorArgs<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A starter function for verification of executions</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* If you dont specify the verifier, an equivalent of times(1) is used.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param verifier object responsible for verification of the following execution</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> verify<span class="br0">&#40;</span>verifier:Verifier = <span class="kw2">null</span><span class="br0">&#41;</span>:MethodSelector</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">verify</span><span class="br0">&#40;</span>verifier<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A starter function for stubbing</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param methodCallToStub call a method to stub as an argument</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return an object providing stubbing options</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> given<span class="br0">&#40;</span>methodCallToStub:<span class="sy0">*</span><span class="br0">&#41;</span>:Stubber</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">given</span><span class="br0">&#40;</span>methodCallToStub<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @private</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> <span class="kw3">get</span> mockCreator<span class="br0">&#40;</span><span class="br0">&#41;</span>:MockCreator</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Matches any argument including &lt;code&gt;null&lt;/code&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> any<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">any</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Equality matcher</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify(never()).that(system.login(eq(&quot;root&quot;)));</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">eq</span><span class="br0">&#40;</span>expected:<span class="sy0">*</span><span class="br0">&#41;</span>:<span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="kw3">eq</span><span class="br0">&#40;</span>expected<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A fluent interface for making sure call hasn&#39;t happened</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify(never()).that(operator.execute());</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> never<span class="br0">&#40;</span><span class="br0">&#41;</span>:Verifier</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">never</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A fluent interface for counting calls</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify(times(2)).that(operator.execute());</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> times<span class="br0">&#40;</span>expectedCallsCount:<span class="kw3">int</span><span class="br0">&#41;</span>:Verifier</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">times</span><span class="br0">&#40;</span>expectedCallsCount<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A fluent interface for custom matcher</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify().that(system.login(argThat(new HashOnlyCapitalLettersMatcher())));</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A good practice is to create a matcher recording function somewhere and name it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* after the matcher. It&#39;s important to return a wildcard from the function to let it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* work with any arugment of the function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* function hasOnlyCapitalLetters():*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* {</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; argThat(new HashOnlyCapitalLettersMatcher());</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* }</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> argThat<span class="br0">&#40;</span>matcher:Matcher<span class="br0">&#41;</span>:<span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">argThat</span><span class="br0">&#40;</span>matcher<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I&#8217;ve built this against ASUnit3, and it appears to be running fine. As you can see, it&#8217;s release under the MIT license, as is Mockito-Flex. I&#8217;d appreciate any feedback that&#8217;s going, so have a play and let me know &#8230;</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2009%2F07%2Fmockito-flex-meets-asunit%2F';
  addthis_title  = 'Mockito-Flex+meets+ASUnit';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div id="wherego_related"><h3>Readers who viewed this page also viewed:</h3><ul><li><a href="http://blog.flexiblediamond.com/2008/06/testing-proxies-in-puremvc/">Testing Proxies in PureMVC</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2009/07/mockito-flex-meets-asunit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rocks into Gold</title>
		<link>http://blog.flexiblediamond.com/2008/12/rocks-into-gold/</link>
		<comments>http://blog.flexiblediamond.com/2008/12/rocks-into-gold/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 23:25:23 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[pipeline]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=81</guid>
		<description><![CDATA[Clarke Ching &#8211; whose work I&#8217;ve been reading for a while, is preparing to publish a short parable for these troubled times. Get in touch with him via this post, and grab a copy, after all the more weapons in our armoury, the better chance we have of winning the inevitable battles.

  addthis_url  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://clarkeching.blogs.com/">Clarke Ching</a> &#8211; whose work I&#8217;ve been reading for a while, is preparing to publish a short parable for these troubled times. <a href="http://www.clarkeching.com/2008/12/rocks-into-gold-a-credit-crunch-parable-for-people-who-build-software-for-a-living.html">Get in touch with him via this post</a>, and grab a copy, after all the more weapons in our armoury, the better chance we have of winning the inevitable battles.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F12%2Frocks-into-gold%2F';
  addthis_title  = 'Rocks+into+Gold';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/12/rocks-into-gold/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I want problems, not solutions!</title>
		<link>http://blog.flexiblediamond.com/2008/08/i-want-problems-not-solutions/</link>
		<comments>http://blog.flexiblediamond.com/2008/08/i-want-problems-not-solutions/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 10:39:11 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[pipeline]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=60</guid>
		<description><![CDATA[So, there I was, quietly listening into a conference call between a couple of clients on one side, and the account manager, project manager and me on the other.
We were going through a small project that we&#8217;d just completed for the purposes of getting sign-off. We had built in the functionality they wanted, using the [...]]]></description>
			<content:encoded><![CDATA[<p>So, there I was, quietly listening into a conference call between a couple of clients on one side, and the account manager, project manager and me on the other.</p>
<p>We were going through a small project that we&#8217;d just completed for the purposes of getting sign-off. We had built in the functionality they wanted, using the designs that they&#8217;d agreed to, so it was plain sailing.</p>
<p>And then the spanner.</p>
<p><span id="more-60"></span></p>
<p>Part of the project is a news article page with a sidebar listing other news articles. The client decided that he wanted to be able to filter these. &#8220;Could we add a couple of dropdowns listing the article categories?&#8221;.</p>
<p>That was the point when my anticipated reality and real reality diverged:<br />
- anticipated reality: AM says &#8220;Sure, we&#8217;ll have a think about the best way to implement filtering, and present a couple of options back to you&#8221;.<br />
- real reality: PM says &#8220;Right, we&#8217;re going to add a couple of dropdowns below the list, one for &#8216;projects&#8217; and one for &#8216;countries&#8217; and they&#8217;ll alter the article list you see&#8221;.</p>
<p>After the phone call, the PM asked me to go ahead with it. Eh? Shouldn&#8217;t we get a designer on the job &#8211; someone who knows about usability and interface design, perhaps?</p>
<p>I thought I&#8217;d won that little spat when the PM sloped off, but she got a tester who wants to be a designer to photoshop exactly what the AM had suggested on the phone. Bang went any hope of getting an expert in human computer interaction on the job.</p>
<p>The Account Manager&#8217;s defense is that we&#8217;re doing what the client wants. Well, I counter, that&#8217;s not good enough &#8211; despite <a href="http://blog.flexiblediamond.com/index.php/2008/05/a-grown-up-conversation/">my previous post</a> saying that we &#8220;pretend the client knows what they want&#8221;, we shouldn&#8217;t allow them to define the solution. Yes, sure that&#8217;s what the client thinks they want, but we are being paid to know better.</p>
<p>I may know what I want to eat when I go to a restaurant, but I still like to hear what the specials are, just in case there&#8217;s something even more exciting. I may even know how to cook the dish, but that doesn&#8217;t mean they&#8217;re going to allow me to roll my sleeves up and get to work in the kitchen. I am paying for the chef&#8217;s expertise, and for the satisfaction of delegating a whole bunch of thinking and labour so that I can enjoy the fruits.</p>
<p>Yes, the client should be right in there defining the problem. Then we should check it and redefine it, and again and again, until we&#8217;re absolutely clear about it. Then we should get an expert  (maybe a few, even, bringing different viewpoints together) to draw up a solution or two, and present those back to the client. &#8220;But it&#8217;s just a simple change&#8221; the AM cries, except that it isn&#8217;t, because it hasn&#8217;t been fully defined.</p>
<p>The wannabe-designer did a great mock-up, but couldn&#8217;t tell me how the functionality should work &#8211; there were different colours of text indicating selected states, but she didn&#8217;t know how that would work between the two dropdowns. In short, the solution wasn&#8217;t a solution. Meanwhile, the developers aren&#8217;t clear what they should be building, the project manager&#8217;s frustrated because she thinks that the project is now in development (well, she got us the designs, didn&#8217;t she?), and the account manager&#8217;s having to deal with an increasingly impatient client who thought the solution was defined over the phone.</p>
<p>If the client&#8217;s paying good money for our services, we should provide those services. That&#8217;s the clearest thing, isn&#8217;t it? We are digital experts: strategy, user experience, design, technical development. The client is an expert in marketing and sourcing quality work (I hope). One side should be bringing a problem, the other a set of solutions. Now, which is which?</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F08%2Fi-want-problems-not-solutions%2F';
  addthis_title  = 'I+want+problems%2C+not+solutions%21';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div id="wherego_related"><h3>Readers who viewed this page also viewed:</h3><ul><li><a href="http://blog.flexiblediamond.com/about/">About Us</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/08/i-want-problems-not-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finding out what&#8217;s best &#8230;</title>
		<link>http://blog.flexiblediamond.com/2008/05/finding-out-whats-best/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/finding-out-whats-best/#comments</comments>
		<pubDate>Wed, 14 May 2008 21:20:14 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[pipeline]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=37</guid>
		<description><![CDATA[Just doing our best ain&#8217;t good enough &#8211; we need to be more savvy than that and work out precisely what&#8217;s the best thing to do first. So far, we&#8217;ve identified the conflict, and we now need to assess possible solutions.

If you haven&#8217;t read It&#8217;s not rocket science yet, please do first, as this article [...]]]></description>
			<content:encoded><![CDATA[<p>Just doing our best ain&#8217;t good enough &#8211; we need to be more savvy than that and work out precisely what&#8217;s the best thing to do first. So far, <a href="http://blog.hoardinghopes.com/index.php/2008/05/an-evaporating-conflict-cloud/">we&#8217;ve identified the conflict</a>, and we now need to assess possible solutions.</p>
<p><span id="more-37"></span></p>
<p>If you haven&#8217;t read <a href="http://blog.hoardinghopes.com/index.php/2008/05/its-not-rocket-science/"><em>It&#8217;s not rocket science</em></a> yet, please do first, as this article is a continuation of that theme.</p>
<p>I&#8217;ve said that key to a successful project is not just having everyone involved do their best, but having them work out what is the best thing to do, and then do their best at that. Anything else is at best a waste of effort, and at worst will doom a project.</p>
<p>I&#8217;ve also said that a sucessful project, just as any other system, needs a systemic view, rather than a bunch of local team views (new business, project management, creatives, developers, etc.).</p>
<p>So, how on earth do we go about finding out what&#8217;s best from a systemic perspective? A good place to start may be looking at some of the gripes that sit uncomfortably between teams involved in a project.</p>
<p>For example: </p>
<p><em>Project Manager </em>(PM): developers&#8217; estimates are always wrong.<br />
<em>Developer</em>: PMs treat our estimates as promises, and thus can&#8217;t handle it when they turn out to be inaccurate.</p>
<p>Let&#8217;s think about lines on a graph: x axis denotes time; y axis denotes understanding. At the very start of the project, my understanding of what&#8217;s involved is minimal. At the end of the project, I know all there is to know about it (ah, the beauty of hindsight!). Between those two points, the line rises in a sloping curve, with most altitude gained in the first half of the project.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/time_vs_understanding.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/time_vs_understanding.png" alt="" title="Understanding increasing over time" class="alignnone size-full wp-image-46" /></a></p>
<p>Where does estimation take place? Early on in the project, where understanding is incomplete (often requirements are incomplete too). </p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/time_vs_understanding_vs_estimate.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/time_vs_understanding_vs_estimate.png" alt="We estimate before we fully understand the project" title="Understanding over time" class="alignnone size-full wp-image-47" /></a></p>
<p>And that&#8217;s only the first problem. Here&#8217;s a second: when we estimate towards the start of a project for the length of a project, we&#8217;re looking far ahead into the future. The further we peer, the poorer our seeing, and the harder it is to a provide realistic estimate.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/effect_of_change_on_estimates.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/effect_of_change_on_estimates.png" alt="" title="How change breaks estimates" class="alignnone size-full wp-image-49" /></a></p>
<p>Estimating a project from the start requires long-distance lenses, so we may pad with a buffer because that protects us slightly. But, as the project progresses, problems arise, change requests come through, and the specification that we&#8217;ve been working from changes (or it doesn&#8217;t, even though the functionality does, but that&#8217;s another problem). This is how reality departs from our estimates. Towards the end of the project, we&#8217;re dealing with bugs that we couldn&#8217;t foresee and test results have come in, which frequently mean lots of change requests now that the client&#8217;s seen the proposed release version.</p>
<p>Two problems: estimating when our knowledge about the project is less than complete; changes arising that throw the project off schedule. Now what could solve them?</p>
<p>We want our estimates to be more accurate, so they can be considered commitments; and we want to be able to handle changes and problems that arise.</p>
<p>Imagine that, as a developer, you were asked each morning how long it would take to perform the single task you were about to tackle. Your response would be in hours, and probably more or less accurate. Imagine now, that you were given the whole list of tasks up front and asked to estimate on them &#8211; the answer would be in days, and a lot less accurate.</p>
<p>Firstly, say it takes 10 hours to complete a task, and you&#8217;re 10% out: it takes 11 hours. We&#8217;ve lost an hour. Say it takes 10 days, with the same margin of error, and it&#8217;s taken 11 days. Say it takes 100 days, and it&#8217;s taken 110 days. Thus the same margin of error, when affecting differing timescales, has very different ramifications. And just in case you think I&#8217;m being unfair by swapping from hours to days: if you think something will take one hour and I think it&#8217;ll take two, we have room for a discussion &#8211; the difference is clear; if you think something will take 30 hours and I think it&#8217;ll take 31, it&#8217;s a lot harder to explain the difference and decide which is a better estimate.</p>
<p>If we can make our estimates more often and more short-sighted, rather than a single one tackling the whole project, we stand a much better chance of getting the estimates right, we can adjust them based on recent learnings, and we can incorporate changes/problems as they arise.</p>
<p>That may resolve the conflict of PMs wanting commitments and developers not having concrete specs to work from (with no changes, ever ever). Whaddya think?</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Ffinding-out-whats-best%2F';
  addthis_title  = 'Finding+out+what%26%238217%3Bs+best+%26%238230%3B';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/finding-out-whats-best/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>An evaporating conflict cloud</title>
		<link>http://blog.flexiblediamond.com/2008/05/an-evaporating-conflict-cloud/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/an-evaporating-conflict-cloud/#comments</comments>
		<pubDate>Mon, 12 May 2008 21:40:06 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=30</guid>
		<description><![CDATA[Doing our best doesn&#8217;t guarantee success, despite best intentions. How do we identify the behaviours that we want and don&#8217;t want, and find the inherent conflicts within the system?
Let&#8217;s take one of the problems in the previous article (It&#8217;s not rocket science), and see what&#8217;s driving it, which may give us a better perspective towards [...]]]></description>
			<content:encoded><![CDATA[<p>Doing our best doesn&#8217;t guarantee success, despite best intentions. How do we identify the behaviours that we want and don&#8217;t want, and find the inherent conflicts within the system?</p>
<p>Let&#8217;s take one of the problems in the <a href="http://blog.hoardinghopes.com/index.php/2008/05/its-not-rocket-science/">previous article (<em>It&#8217;s not rocket science</em>)</a>, and see what&#8217;s driving it, which may give us a better perspective towards possible fixes.</p>
<p><span id="more-30"></span></p>
<p>I&#8217;m going to use a tool that I first saw (read, actually) used by <a href="http://clarkeching.blogs.com/">Clarke Ching</a> in <em><a href="http://www.rollingrocksdownhill.com/">Rolling Rocks Downhill</a></em>, which uses a diagram to define the conflicting behaviour, and thence to uncover the assumptions behind it.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/structure.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/structure.png" title="Conflict cloud diagram structure" width="500" height="269" class="alignnone size-full wp-image-39" /></a></p>
<p></p>
<p><strong>1. state the behaviour that you want to get rid of</strong><br />
I said that developers were so pushed for time that they didn&#8217;t test their code as they wrote it, nor before committing it to Subversion, our code control system. They were clear that they were working as hard as they could &#8211; doing the best they could &#8211; in the circumstances. Their repeated complaint was that the requirements kept changing so nothing could be finalised. That statement goes into the box marked D.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/undesirable_d.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/undesirable_d.png" alt="The behaviour that we want to get rid of " title="Undesirable behaviour" class="alignnone size-full wp-image-39" /></a></p>
<p><strong>2. State the need that is being met by the undesirable behaviour, or which drives us putting up with it</strong><br />
On this project, at least, it was crystal clear &#8211; we had no time: we just had to meet the deadlines. Speed was driving slapdash development methods. So that&#8217;s what goes into the box marked B.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_b.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_b.png" alt="" title="Need B, which is achieved by the undesirable behaviour" class="alignnone size-full wp-image-40" /></a></p>
<p></p>
<p><strong>3. State the behaviour you desire, which is the opposite of D</strong><br />
Again, straightforward:  I want developers to test their code before they commit/release it. This goes in the box labelled D&#8217; (&#8221;d prime&#8221;).</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/desirable_d.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/desirable_d.png" alt="" title="The behaviour we desire" class="alignnone size-full wp-image-41" /></a></p>
<p></p>
<p><strong>4. The need that the desirable behaviour fulfills</strong><br />
Well, if we&#8217;re testing, we&#8217;re catching bugs during the development phase when it is cheaper/easier to fix them, rather than the later testing phase. That goes in box C.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_c.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_c.png" alt="" title="The need met by the desired-for behaviour" class="alignnone size-full wp-image-42" /></a></p>
<p></p>
<p><strong>5. The objective that the needs fulfill by both being present</strong><br />
Need B is meeting the schedule/delivering the project on time; Need C is delivering a high-quality product. Thus the objective we have to put in box A is: delivering a high-quality project on time and budget.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/objective_a.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/objective_a.png" alt="" title="The objective that we\&#039;re trying to achieve" class="alignnone size-full wp-image-43" /></a></p>
<p></p>
<p>So, put it all together, and you get the conflicting behaviours and the reasons behind them, and a reminder that both reasons are aiming at the same target. Note also that for the objective to be reached, both needs have to be met, i.e. desirable and undesirable behaviour both have the same ultimate goal.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/completed_conflict.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/completed_conflict.png" alt="" title="The completed conflict" class="alignnone size-full wp-image-44" /></a></p>
<p>I&#8217;ll look at what comes assumptions are revealed from this exercise shortly.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fan-evaporating-conflict-cloud%2F';
  addthis_title  = 'An+evaporating+conflict+cloud';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/an-evaporating-conflict-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s not rocket science</title>
		<link>http://blog.flexiblediamond.com/2008/05/its-not-rocket-science/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/its-not-rocket-science/#comments</comments>
		<pubDate>Fri, 09 May 2008 12:21:42 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[pipeline]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=32</guid>
		<description><![CDATA[How is it that people work hard for long hours, and yet projects fail? Why do project debriefs become bitter tales of one team thwarting another? How can we be doing our best, and yet see it fall apart so spectacularly?


We now know how some of the mismeasure, frustration, and sometimes despair arises as we [...]]]></description>
			<content:encoded><![CDATA[<p>How is it that people work hard for long hours, and yet projects fail? Why do project debriefs become bitter tales of one team thwarting another? How can we be doing our best, and yet see it fall apart so spectacularly?</p>
<p><span id="more-32"></span></p>
<blockquote><p>
We now know how some of the mismeasure, frustration, and sometimes despair arises as we try to manage that relatively recent invention; the serial process â€“ the manufacturing process.  We recognize, often intuitively, that we are trying to optimize according to some reductionist/local optima approach but that we are actually bound by the process dependency and variation of our system.  But what does it mean to optimize?  Surely this means to do our very best.  In fact, for everyone to do their very best. (From <a href="http://www.dbrmfg.co.nz/Bottom%20Line%20People.htm">Dr K. J. Youngman&#8217;s website</a>.)
</p></blockquote>
<p>In software development, we have a virtual shopfloor &#8211; a cyber pipeline &#8211; through which all work flows. If we all &#8220;do our best&#8221;, the pipe soon gets blocked with incoming work (if the account management/new business teams are any good) and the production teams don&#8217;t have the room they need to give each project the time it deserves; the creative team never fully hands off designs to the developers, as they always have one final tweak to make (after all, as they see their ideas realised, so they gain more ideas about them).</p>
<p><strong>Organising the pipeline</strong><br />
Given that a chain is only as strong as its weakest link &#8211; that a group of boy scouts can only walk in single-file as fast as its slowest scout &#8211; any production process can only move as quickly as its slowest part.</p>
<p>If the new business team is fantastic, and concentrate on doing their job to the best of their ability, but define &#8220;best&#8221; purely in terms local to them (i.e. &#8220;I&#8217;m doing my best when I bring in most new business&#8221;), they will soon swamp the next team in the pipeline. If creatives never fully hand off their work, the next team can never really get started on it. </p>
<p><strong>A brief detour to look at production problems</strong><br />
I&#8217;ve recently witnessed a massive project screw up, based on obstacles arising that surely were avoidable. A quick list of the major problems:</p>
<ul>
<li>Lack of clarity over what was to be delivered from the outset</li>
<li>Changing requirements throughout the project</li>
<li>Deadlines imposed from above</li>
<li>Frequent personnel changes</li>
<li>Deceit between different parts of the team over progress</li>
<li>Command/control behaviour</li>
</ul>
<p><strong>Wow, where did all those problems come from?</strong></p>
<p>Well &#8211; first among equals &#8211; the role of the new business and account management teams in bringing new projects into the company is where the rot starts (there are plenty of other places too, but this is the most common, possibly only because it&#8217;s first in the line). Their job was to bring this new client on board, and make them so happy with us that they would line up lots of projects as quickly as possible. And they did this job extremely well. </p>
<p>The team did their best, <em>within the limited perspective of their role</em>. But if we judge their work from the point of view of the production system as a whole, we see a markedly different story. One in which their contribution to the project&#8217;s failure is clear. Their priority was to ensure that the project delivered was exactly what the client wanted, so they changed requirements and delivery dates throughout the schedule. Nothing signed off was sacrosanct, and work had to be re-done on a regular basis, without changing delivery deadlines.</p>
<p>Although I know this sounds like finger-pointing, it&#8217;s not, I promise. I can do this same exercise with every team that played a part in the project, and each and every time doing &#8220;their best&#8221; will end up contributing to failure.</p>
<p>To prove that point: the development team also did their best, by demanding water-tight specifications. When they finally got them, the deadline was so tight that they worked extremely long hours (like 16 hour days for more than 7 weeks); they coded until they could no longer speak. They were demons!</p>
<p>But they failed to deliver. They blamed uncontrolled change and lack of specs, and late sign-off of designs. They tried to cover up basic mistakes in the bespoke framework (like <em>writing</em> a bespoke framework &#8211; anyone heard of <a href="http://www.puremvc.org">PureMVC</a>?), and didn&#8217;t test their code as they went.</p>
<p>And again: the project manager tried his best, within the definition of doing his job according to those who employed him. <em>However, nothing was delivered on time; less than a quarter of the project was actually delivered; it was buggy and immensely expensive. It had failed on time, cost, and quality counts</em>. And yet, I&#8217;m sure he would say that he did his best.</p>
<p><strong>So, what&#8217;s going on?</strong><br />
Consider how we work: we are social animals that collaborate for a common good. Our social network, however, is fluid in terms of strong and weak links and thus we have many strategies for dealing with changes within the network &#8211; we can help each other, we can withhold support from each other, we can circumvent weaker members, we can break links and make new ones. Thus, although there is huge dependency in a social network, it is loosely-coupled and dynamic &#8211; everyone cooperates, with a few subordinating themselves to others at any one time*.</p>
<p>* by &#8220;subordinate&#8221;, I mean work to the betterment of others rather than oneself, put others&#8217; needs and desires above one&#8217;s own. </p>
<p>Another form of experience also exists, though &#8211; our personal experience as individuals: here, we don&#8217;t need to subordinate or coordinate; we are free to improve and work to the best of our ability independently of those around us**.</p>
<p>** putting our own needs/desires first, I&#8217;ll be calling &#8220;maximising&#8221; later, and in regard to process, I mean promoting that particular piece of the process.</p>
<p>Now, the industrial mode: well, you might think that it&#8217;s a network, especially as workplaces have personal networks, but actually it&#8217;s far more linear: there are few if any alternative routes through the process (get new business -> specify the work to be done -> design -> architect -> implement -> test -> deploy -> review, for my industry). There is far greater dependency between the parts of the process &#8211; we can&#8217;t just ignore or cut out design because the designer&#8217;s on holiday. Finally, there is always one part of the process that is weaker or slower than the others. Improving the workflow of the other parts won&#8217;t speed up the total throughput because of that bottleneck.</p>
<p>In an industrialised line the only place that maximising adds value is in the bottleneck, and everything else has to subordinate to that bottleneck, which experience is almost the exact opposite of the social and individual experience, where the bottleneck can be avoided. Does that spell doom for our chances of success? Thankfully not, but we do need to change the way we work. </p>
<p>There is much within an organisation that contributes to a silo effect: there&#8217;s me, my team, my division, managers, department managers, division managers &#8211; all of which put an individual or group focus on working practices. But this can mask the strong serial dependency of the process pipeline. We need to view the system as a system, not as a set of silo&#8217;d groups. However, many of our measurements revolve around localised views of parts of the system, including our individual definitions of &#8220;doing our best&#8221; .</p>
<p>If each team involved in a project does its best, the project still runs the risk of failing (sometimes monumentally), so what should we do? <em>Find out what is the best thing to do, and then do that to the best of our ability</em>.</p>
<p>More anon.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fits-not-rocket-science%2F';
  addthis_title  = 'It%26%238217%3Bs+not+rocket+science';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/its-not-rocket-science/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Will someone please charge for our creativity?</title>
		<link>http://blog.flexiblediamond.com/2008/05/will-someone-please-charge-for-our-creativity/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/will-someone-please-charge-for-our-creativity/#comments</comments>
		<pubDate>Thu, 08 May 2008 16:06:59 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[change]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=35</guid>
		<description><![CDATA[Why is it that digital creative agencies often only get paid for their implementation, and provide their creativity free? Unpaid-for work creates financial risk, resulting in rushed work when it&#8217;s most important.

I&#8217;ve worked for several companies where the money comes in only when production is complete. All speculative brain-storming and project-definition is paid for by [...]]]></description>
			<content:encoded><![CDATA[<p>Why is it that digital creative agencies often only get paid for their implementation, and provide their creativity free? Unpaid-for work creates financial risk, resulting in rushed work when it&#8217;s most important.</p>
<p><span id="more-35"></span></p>
<p>I&#8217;ve worked for several companies where the money comes in only when production is complete. All speculative brain-storming and project-definition is paid for by the cost of the implementation stage.</p>
<p>Problem #1: brain-storming/project specification isn&#8217;t an expense; it&#8217;s vital, hard work, required to think up the best product we can. As such, it requires time and skill. If it&#8217;s not paid for in its own right, then it is always under pressure to cut costs &#8211; by lessening the time spent on it, and/or by putting cheaper resources on the job (when this is precisely the point at which more experienced people are most effective).</p>
<p>Problem #2: if we&#8217;ve thought and spec&#8217;d up the most wonderful product in the history of the web, but the client changes their minds, all that work hits our profitability. If we only charge for implementation, the time spent thinking up fabulous ideas is money lost unless the project goes all the way through production.</p>
<p>Problem #3: development frequently takes longer than estimated &#8211; whether it overruns the schedule or stays within the buffers put into the estimate. If all the up-front creativity is to be paid for by the profit from development, then guess what &#8211; we&#8217;re making less than we planned to.</p>
<p>Problem #4: because it&#8217;s not paid for, the cost of it is frequently covered by the account, which means that the account managers do the work, rather than pulling IAs, art directors, senior developers off paid-for implementation work (after all, they&#8217;re expensive). The result is those with least experience define the project.</p>
<p>The most important part of the project is in the definition of the work to be done. That, then, is where we should spend a sizeable part of our time, discovering/brain-storming, defining/specifying, and planning. Given that we are creative agencies, then we should charge for our creativity. It&#8217;s bleeding obvious when you read it, isn&#8217;t it?</p>
<p>The solution: charge for our creativity. Agree with the client that they will pay a certain amount for us to think up and define a project. Getting paid for the work means we no longer need to skimp or cut corners on it (problem #1). Getting paid means we&#8217;ve not lost anything if the client decides not to go ahead with the implementation (#2), or if they choose to take the work elsewhere. Getting paid means that we don&#8217;t need to fund that part of the work from somewhere else(#3). Getting paid means that the right people can be on the job(#4).</p>
<p>Bleedin&#8217; obvious, innit?</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fwill-someone-please-charge-for-our-creativity%2F';
  addthis_title  = 'Will+someone+please+charge+for+our+creativity%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/will-someone-please-charge-for-our-creativity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software development processes</title>
		<link>http://blog.flexiblediamond.com/2008/04/software-development-processes/</link>
		<comments>http://blog.flexiblediamond.com/2008/04/software-development-processes/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 14:35:47 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=31</guid>
		<description><![CDATA[One of the most concise and accurate summaries of available processes that I&#8217;ve come across. If only more devs and Project Managers printed this out, we would have a much more successful industry record.

  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Fsoftware-development-processes%2F';
  addthis_title  = 'Software+development+processes';
  addthis_pub    = '';

]]></description>
			<content:encoded><![CDATA[<p><a href="http://weblogs.java.net/blog/chet/archive/2008/01/crystal_methodo.html">One of the most concise and accurate summaries of available processes that I&#8217;ve come across</a>. If only more devs and Project Managers printed this out, we would have a much more successful industry record.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Fsoftware-development-processes%2F';
  addthis_title  = 'Software+development+processes';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/04/software-development-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Urgency is poisonous&#8221;</title>
		<link>http://blog.flexiblediamond.com/2008/04/urgency-is-poisonous/</link>
		<comments>http://blog.flexiblediamond.com/2008/04/urgency-is-poisonous/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 08:02:43 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[process]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[business]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=21</guid>
		<description><![CDATA[37 Signals are experimenting with a 4-day week, and finding it works.
They reckon that &#8220;urgency is acidic&#8221; &#8211; it burns out morale, especially when working towards an emergency deadline lasts more than a day or two (like, say 7 weeks plus &#8211; you know who you are!).

If your deliveries are that critical to the hour [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.37signals.com/svn/posts/966-urgency-is-poisonous">37 Signals</a> are experimenting with a 4-day week, and finding it works.</p>
<p>They reckon that &#8220;urgency is acidic&#8221; &#8211; it burns out morale, especially when working towards an emergency deadline lasts more than a day or two (like, say 7 weeks plus &#8211; you know who you are!).</p>
<blockquote><p>
If your deliveries are that critical to the hour or day, maybe you&#8217;re setting up false priorities and dangerous expectations.
</p></blockquote>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Furgency-is-poisonous%2F';
  addthis_title  = '%26%238220%3BUrgency+is+poisonous%26%238221%3B';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/04/urgency-is-poisonous/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Perishable Requirements&#8221;</title>
		<link>http://blog.flexiblediamond.com/2008/04/perishable-requirements/</link>
		<comments>http://blog.flexiblediamond.com/2008/04/perishable-requirements/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 12:30:53 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[process]]></category>
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=18</guid>
		<description><![CDATA[Re-reading Agile Management for Software Engineering*, I got stuck on the phrase &#8220;perishable requirements&#8221;.
I re-read it several times, and each time it sunk in deeper just how important this concept is: this alone proves the worth of an agile approach to project development. Requirements go stale.
Most obviously, they run the risk of becoming obselete as [...]]]></description>
			<content:encoded><![CDATA[<p>Re-reading <em><a href="http://www.amazon.co.uk/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.co.uk%2FAgile-Management-Software-Engineering-Constraints%2Fdp%2F0131424602%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1208780691%26sr%3D8-1&#038;tag=hoarhope-21&#038;linkCode=ur2&#038;camp=1634&#038;creative=6738">Agile Management for Software Engineering</a></em><img src="http://www.assoc-amazon.co.uk/e/ir?t=hoarhope-21&amp;l=ur2&amp;o=2" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />*, I got stuck on the phrase &#8220;perishable requirements&#8221;.</p>
<p>I re-read it several times, and each time it sunk in deeper just how important this concept is: this alone proves the worth of an agile approach to project development. <em>Requirements go stale</em>.</p>
<p>Most obviously, they run the risk of becoming obselete as the team and client&#8217;s understanding of the project evolves; but, equally importantly, they suffer atrophy simply through lack of use.</p>
<p>Once captured and defined, a requirement has a half-life &#8211; the longer it gets left in the requirements document without being actively worked on, the poorer the knowledge of that requirement. Clearly, if the developer leaves, the team suffers massive impact in its understanding of the requirement. But, even if the developer stays, their understanding and knowledge of the requirement withers as they work on other things.</p>
<p>The reality is that a requirement can rarely be so fully captured that it doesn&#8217;t depend on an individual&#8217;s understanding and definition of it. </p>
<p>The solution to this problem?</p>
<p>Define a sub-set of requirements that can be worked on within a specific timeframe. Move from requirements capture and definition to solution implementation within the same timeframe. Work agilely.</p>
<p><a href="http://www.amazon.co.uk/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.co.uk%2FAgile-Management-Software-Engineering-Constraints%2Fdp%2F0131424602%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1208780691%26sr%3D8-1&#038;tag=hoarhope-21&#038;linkCode=ur2&#038;camp=1634&#038;creative=6738">* Eli Schragenheim &#038; David J. Anderson, Prentice Hall, 2003 (ISBN: 0-13-142460-2)</a><img src="http://www.assoc-amazon.co.uk/e/ir?t=hoarhope-21&amp;l=ur2&amp;o=2" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Fperishable-requirements%2F';
  addthis_title  = '%26%238220%3BPerishable+Requirements%26%238221%3B';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/04/perishable-requirements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
