<?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>Platformability &#187; xp</title>
	<atom:link href="http://blog.caplin.com/tag/xp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caplin.com</link>
	<description>Single Dealer Platforms, Industry Expertise</description>
	<lastBuildDate>Fri, 03 Feb 2012 15:38:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Agile Software Development – One Size Doesn’t Fit All</title>
		<link>http://blog.caplin.com/2010/04/02/agile-software-development-%e2%80%93-one-size-doesn%e2%80%99t-fit-all/</link>
		<comments>http://blog.caplin.com/2010/04/02/agile-software-development-%e2%80%93-one-size-doesn%e2%80%99t-fit-all/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 23:01:39 +0000</pubDate>
		<dc:creator>Ian Alderson</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caplin.com/?p=1830</guid>
		<description><![CDATA[As I mentioned in part I of this series, Adoption of Agile at Caplin, when we first started following an agile methodology (in our case Scrum) in February 2005 we were desperate to implement it successfully and wanted to adhere to all of the best practices. We persevered with this...]]></description>
			<content:encoded><![CDATA[<p>As I mentioned in part I of this series, <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2Jsb2cuY2FwbGluLmNvbS8yMDEwLzAzLzI2L2FnaWxlLXNvZnR3YXJlLWRldmVsb3BtZW50LWFkb3B0aW9uLW9mLWFnaWxlLWF0LWNhcGxpbi8=">Adoption of Agile at Caplin</a>, when we first started following an agile methodology (in our case <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3J1bV8oZGV2ZWxvcG1lbnQp">Scrum</a>) in February 2005 we were desperate to implement it successfully and wanted to adhere to all of the best practices.</p>
<p>We persevered with this approach for several months, repeatedly referring to the books on Scrum we had purchased and the numerous websites on the subject which were cropping up at the time, to find out ways of improving the process.</p>
<p>With hindsight this looks a little conservative, however back then we were still getting to grips with agile and didn&#8217;t want to make any significant adjustments that hadn&#8217;t been tried and proven elsewhere.</p>
<p><span id="more-1830"></span></p>
<p>Eventually we built up our confidence in deciding on the sort of tweaks that we could make to the process ourselves. Coupled with this many of the new developers that joined our team at this stage also brought with them their own experiences of agile development, which we were able to use to induce change.</p>
<p>Some of these changes were very successful and are still integral parts of our process today, whilst others only lasted for a few sprints before being dropped for alternate solutions.</p>
<p>So, without further ado, welcome to our Hall of Fame. And to prove that progress doesn’t come without its fair share of mistakes, our Hall of Shame follows.</p>
<h2>Hall of Fame</h2>
<p>Here are some of changes that we made to the process which proved successful:</p>
<ul style="padding-left: 16px;">
<li style="padding-top: 2px;">We found the 4 week iteration cycle was too long, and restricted our ability to respond to customer needs promptly. We reduced our iterations to 2 weeks.</li>
<li style="padding-top: 2px;">We stopped calculating the number of ideal hours the team could theoretically take on. This was quite time consuming and <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5leHRyZW1lcHJvZ3JhbW1pbmcub3JnL3J1bGVzL3ZlbG9jaXR5Lmh0bWw=">project velocity</a> seems to do an equally good job.</li>
<li style="padding-top: 2px;">We started to update our story board mid sprint, adding in new tasks (not stories!) as they come up. Initially we were loath to change the tasks on the board since this felt like some kind of scope creep. However those cards reflected what we thought we needed to do during the initial estimation meeting. Contact with the real code often highlighted things that we had forgotten or hadn&#8217;t even realised would need to be done, and the tasks on the board would no longer reflect what was really going on. A big personal thanks to <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2ZhdW5hNQ==">Richard Chamberlain</a> who introduced this practice to me.</li>
<li style="padding-top: 2px;">We now ensure that the tasks are all relatively small. The state of a task card is binary, it&#8217;s either done or not done (including all testing and documentation facets that might be associated with it). Monitoring how much work has been done and how much is left to do is hard if there are only a few task cards that will each take a few days to complete. Breaking those larger tasks down into their constituent parts will help provide visibility on the progress.</li>
<li style="padding-top: 2px;">We adopted the use of <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5leHRyZW1lcHJvZ3JhbW1pbmcub3JnLw==">Extreme Programming (XP)</a> style user stories and story boards instead of using a sprint backlog spreadsheet</li>
<li style="padding-top: 2px;">We split the development team out into separate scrums. The reasons for this were:
<ul>
<li style="padding-top: 2px;">As the development team grew there were simply too many people to manage within a single scrum</li>
<li style="padding-top: 2px;">A single scrum ended up containing stories that were deliverable for different customers or products. It was nearly impossible to decide which story to work on next during the sprint because they didn&#8217;t have comparable priorities. Was it more important to ensure all stories were completed for one customer, but none for another, or to ensure that some stories were completed for both?</li>
<li style="padding-top: 2px;">Estimation was a serial process that took a longer and longer time, typically a whole afternoon, as the team grew and was able to take on more work items. Often only half of the developers would have any idea how long a particular task might take since it was in a product and/or language they didn&#8217;t know. By the end of the meeting everyone was tired, and were desperate to escape from it, which was probably a significant factor in some inaccurate estimates.</li>
</ul>
</li>
<li style="padding-top: 2px;">We learnt how important it was to ensure the relative priorities are correct before determining which stories were taken into the sprint. After our estimation session had been completed we reported to the stakeholders what work had been signed up to. On a few occasions the stakeholders had assumed that a certain number of stories would be signed up to and were surprised to find out that sometimes they weren&#8217;t. When this happened the real priorities became apparent, and the team has to go back and start another estimation phase to address this. I think this is summarised by asking the stakeholders the question, &#8220;if we can only do one story, which must it be?&#8221;, then &#8220;if we can only do two stories, which should the second be?&#8221; and so on.</li>
<li style="padding-top: 2px;">We needed to focus the output of our retrospectives, rather than trying to take on too much change. The retrospectives themselves were very good, however we had a tendency to take many actions out of them, most, if not all, of which didn&#8217;t really get implemented. We now focus on agreeing the one or two most important actions to undertake from retrospective and focus on actually carrying them out.</li>
<li style="padding-top: 2px;">When we are unsure of how much effort might be needed to complete a new piece of work, we scheduled a spike (coined by <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy50aHJlZXJpdmVyc2luc3RpdHV0ZS5vcmcvYmxvZy8=">Kent Beck</a> and <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2MyLmNvbS9+d2FyZC8=">Ward Cunningham</a>, popularised within Caplin by <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3B1dHRpbmd0aGV0ZWFpbnRvdGVhbS5ibG9nc3BvdC5jb20v">Ivan Moore</a>), or tracer bullet (from <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5wcmFncHJvZy5jb20vdGhlLXByYWdtYXRpYy1wcm9ncmFtbWVy">The Pragmatic Programmer</a> by <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2Jsb2cudG9vbHNoZWQuY29tLw==">Andrew Hunt</a> and <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3ByYWdkYXZlLnByYWdwcm9nLmNvbS8=">David Thomas</a>, introduced to Caplin by <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5tb3VudGFpbmdvYXRzb2Z0d2FyZS5jb20v">Mike Cohn</a>), within a sprint to drive out the risk and help come up with a more reasonable estimate on how long the real work will take (thanks to <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2FsaXN0YWlyLmNvY2tidXJuLnVzLw==">Alistair Cockburn</a> for providing the insight into the originators of these terms).</li>
<li style="padding-top: 2px;">We changed the way we wrote our stories to focus on delivering <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WZXJ0aWNhbF9zbGljZQ==">thin vertical slices</a> of functionality. This way we are more likely to deliver demonstrable features at the end of a sprint, even if things prove more difficult than we first expected.</li>
</ul>
<h2>Hall of Shame</h2>
<p>Here are the changes that we made to the process that turned out to be less than successful:</p>
<ul style="padding-left: 20px;">
<li style="padding-top: 2px;">We attempted to improve estimates by tracking the actual time spent completing each task. At the end of the sprint we could look at the actuals compared to the estimates, and analyse the causes for any with large discrepancies. This Turned out to be complete overkill. Those stories that significantly overran were always identified without any analysis within the retrospectives anyway, and there was a small but noticeable overhead of capturing the actuals.</li>
<li style="padding-top: 2px;">We also went through a phase of trying to come up with better release plan level estimates by pre-planning a couple of iterations ahead. Unfortunately this broke the all important <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5hZ2lsZWZvcmFsbC5jb20vMjAwOS8wMi8yMy9uZXctdG8tYWdpbGUtcmVtZW1iZXItb25lLXRoaW5nLWp1c3QtZW5vdWdoLWp1c3QtaW4tdGltZS8=">just in time</a> aspect of agile development. Several times the stories that we had preplanned a few sprints ahead were de-prioritised as new customer requirements came in.  These stories sat in the backlog slowly decaying. The time we spent on the pre-planning was wasted. Even if one of these stories made it into a sprint, and some didn&#8217;t even make it that far, we found that things had changed sufficiently within the code base such that the story needed to be estimated again. Nowadays we rely on higher level estimates combined with velocity to help with our release level planning.</li>
</ul>
<h2>One Size Doesn&#8217;t Fit All</h2>
<p>The evolution of our development process has led me to the conclusion that one size doesn&#8217;t fit all. The ridiculous thing is how long it took me to realise this, since the first line of the <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2FnaWxlbWFuaWZlc3RvLm9yZy8=">agile manifesto</a> pretty much points to this:</p>
<blockquote><p>Individuals and interactions over processes and tools</p></blockquote>
<p>Ultimately any successful agile development process that you read about within a book or a blog, such as this one, is a process that has been tailored to suit the team using it. Sometimes the author has experience of working with many agile teams and the insights that they have can be invaluable since they can provide generalised advice that is proven to have worked in several different environments. However they don&#8217;t have experience working in your team, with your unique blend of skill sets.</p>
<p>Even if your team is working on a similar type of problem and/or with identical technologies to another team, there is no guarantee that adopting its process will lead to success. Instead it can act as a good template to base your process on, one that can be adapted over time to suit your team&#8217;s unique skill sets.</p>
<p><strong>Retrospective Evolution</strong></p>
<p>This doesn&#8217;t mean that you shouldn&#8217;t look around for ideas on how to improve your development process. On the contrary, there is no point reinventing the wheel. An idea from another agile team might work perfectly within your team, or might work after some adjustments. Alternatively it may prove to be the seed that allows you to reach your own solution.</p>
<p>That said, the drive for the improvements to the process should come from the retrospectives and we should continually be striving to improve the it. For example:</p>
<ol style="padding-left: 20px;">
<li>Could any of the problems that were experienced during the last sprint have been avoided if there was a suitable process in place?</li>
<li>Alternatively are there any parts of the process that are no longer necessary or which can be streamlined?</li>
</ol>
<p><strong>The Saga Continues</strong></p>
<p>Here at Caplin our development process continues to evolve. As has been mentioned before we have been trialling Kanban for a few of our internal development projects. It promises many potential improvements to the development process, the question is when will these changes occur, and what will they be.</p>
<p><strong>Afterthoughts</strong></p>
<p>Having written this article I have subsequently become aware that a whole track was dedicated to Agile Evolution at QCon London 2010, held between 8th and 12th of March. Much of what was spoken about in there echoes the experiences that we have had at Caplin and I would thoroughly recommend looking through the slides:</p>
<ul style="padding-left: 20px;">
<li style="padding-top: 2px;"><a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3Fjb25sb25kb24uY29tL2xvbmRvbi0yMDEwL2ZpbGU/cGF0aD0vcWNvbi1sb25kb24tMjAxMC9zbGlkZXMvS2VpdGhCcmFpdGh3YWl0ZV9Ob3RoaW5nTmV3VW5kZXJUaGVTdW5Db250aW51YWxseVJlZGlzY292ZXJpbmdUaGVHb29kV2F5c1RvQnVpbGRTb2Z0d2FyZS5wZGY=">Nothing New Under the Sun: continually rediscovering the good ways to build software</a> by Keith Braithwaite</li>
<li style="padding-top: 2px;"><a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=QnJlYWtpbmcgeW91ciBBZ2lsZSBBZGRpY3Rpb24=">http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/RachelDavies_BreakingYourAgileAddiction.pdf</a> by Rachel Davies</li>
<li style="padding-top: 2px;"><a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3Fjb25sb25kb24uY29tL2xvbmRvbi0yMDEwL2ZpbGU/cGF0aD0vcWNvbi1sb25kb24tMjAxMC9zbGlkZXMvSmVzcGVyQm9lZ19LYW5iYW5Dcm9zc2luZ1RoZUxpbmVQdXNoaW5nVGhlTGltaXRPclJlZGlzY292ZXJpbmdUaGVBZ2lsZVZpc2lvbi5wZGY=">Kanban &#8211; Crossing the line, pushing the limit or rediscovering the agile vision?</a> by Jesper Boeg</li>
<li style="padding-top: 2px;"><a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3Fjb25sb25kb24uY29tL2xvbmRvbi0yMDEwL2ZpbGU/cGF0aD0vcWNvbi1sb25kb24tMjAxMC9zbGlkZXMvR3VzUG93ZXJfYW5kX1NpbW9uQmFrZXJfUHJvZHVjdERldmVsb3BtZW50SW5UaGVMYW5kT2ZUaGVGcmVlLnBkZg==">Product Development in the Land of the Free</a> by Simon Baker &amp; Gus Power</li>
</ul>
 <img src="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1830" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.caplin.com/2010/04/02/agile-software-development-%e2%80%93-one-size-doesn%e2%80%99t-fit-all/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Agile Software Development &#8211; Adoption of Agile at Caplin</title>
		<link>http://blog.caplin.com/2010/03/26/agile-software-development-adoption-of-agile-at-caplin/</link>
		<comments>http://blog.caplin.com/2010/03/26/agile-software-development-adoption-of-agile-at-caplin/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 15:55:52 +0000</pubDate>
		<dc:creator>Ian Alderson</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caplin.com/?p=1210</guid>
		<description><![CDATA[Back in January 2005 I had been married for a month and was looking forward to taking a belated honeymoon in March. As you would expect, these were significant life events, however little did I realise that something of a similar magnitude was also looming on the horizon of my...]]></description>
			<content:encoded><![CDATA[<p>Back in January 2005 I had been married for a month and was looking forward to taking a belated honeymoon in March. As you would expect, these were significant life events, however little did I realise that something of a similar magnitude was also looming on the horizon of my work life here at Caplin. After five and a half years following a waterfall methodology our then development manager (now CTO), <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL3BhdHJpY2tteWxlcw==">Patrick Myles</a>, introduced us to our first agile software development methodology, <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3J1bV8oZGV2ZWxvcG1lbnQp">Scrum</a>.</p>
<p>Over the last five years we have learnt that an <strong>agile process is agile itself</strong>, and the process that we follow now is different in many ways from that which we initially adopted. This doesn&#8217;t mean that the process we first had was wrong, although there were certainly some issues. Over time things that were crucial parts of the process have become defunct and have been removed, whilst new ideas and refinements are added into the process to address fresh issues that have arisen.</p>
<p><span id="more-1210"></span></p>
<h2>Straight from the Book: The First Iteration</h2>
<p>The first iteration started in February 2005. Being new to the process we followed one pretty much straight out of the book. We were desperate to adopt Scrum successfully and wanted to follow all the best practices:</p>
<p><!--more--></p>
<ol style="padding-left: 20px;">
<li>The sprints were exactly 4 weeks long</li>
<li>Our development team of 7 or 8 developers were organised into a single Scrum</li>
<li>The stakeholders provided a prioritised list of the work items they wanted us to undertake</li>
<li>A sprint backlog spreadsheet was created and maintained</li>
<li>Another spreadsheet was created that calculated the theoretical number of ideal hours we had available for the sprint, allowing for developer holidays and other commitments</li>
<li>The highest priority work item was broken down into tasks which were then estimated in ideal hours</li>
<li>If the total number of ideal hours of estimated work was less than the theoretical number of ideal hours we could undertake, then we estimated the next work item, and so on, until we had used up the theoretical hours (we always left ourselves a little slack as previous experience told us that things tended to overrun)</li>
<li>The team then assessed the provisional list of work items for the sprint and decided whether they could commit to delivering them; if not then the lowest priority work item would be removed and the team would decide if they could commit again</li>
<li>Every morning we held a stand up so that each member of the team could report on their progress and the sprint backlog and associated burn down chart could be updated</li>
<li>At the end of the sprint a demo of the new software was held to show the progress that had been made to the stakeholders</li>
<li>A retrospective was also held to identify things that were working well and things that weren&#8217;t, so that we could address them as part of the next sprint</li>
</ol>
<h2>A Need for Evolution</h2>
<p>Five years on and, for me, the analogy of marriage and an agile software development is an apt one. In order to be healthy they need to be dynamic and able to adapt to change in circumstances. Within a marriage there are mundane decisions and changes to routines such as who is responsible for washing up or ironing this week, through to major changes, like after the birth of a child (particularly after a son who refuses to sleep). In software development there are small changes to the process such as a decision to restrict the number of actions to take from a retrospective, through to larger changes like the adpotion of XP practices within your Scrum process.</p>
<p>In the second post of this series <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2Jsb2cuY2FwbGluLmNvbS8yMDEwLzA0LzAyL2FnaWxlLXNvZnR3YXJlLWRldmVsb3BtZW50LSVFMiU4MCU5My1vbmUtc2l6ZS1kb2VzbiVFMiU4MCU5OXQtZml0LWFsbC8=">“Agile Software Development – One Size Doesn’t Fit All”</a> – I’ll give details on exactly how we evolved the process at Caplin and provide examples of our problems and our solutions from both our Halls of Fame and Shame.</p>
 <img src="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1210" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.caplin.com/2010/03/26/agile-software-development-adoption-of-agile-at-caplin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Framework Development</title>
		<link>http://blog.caplin.com/2010/02/02/agile-framework-development/</link>
		<comments>http://blog.caplin.com/2010/02/02/agile-framework-development/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 12:58:53 +0000</pubDate>
		<dc:creator>Ian Alderson</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caplin.com/?p=1134</guid>
		<description><![CDATA[At times it seems that the philosophy of agile software development is at odds with that of framework development. Given the amount of print and web space dedicated to agile methodologies, it&#8217;s incredible how little is dedicated to this topic. It&#8217;s almost as if this conflict needs to be kept...]]></description>
			<content:encoded><![CDATA[<p>At times it seems that the philosophy of agile software development is at odds with that of framework development. Given the amount of print and web space dedicated to agile methodologies, it&#8217;s incredible how little is dedicated to this topic. It&#8217;s almost as if this conflict needs to be kept hidden away from view, not to be discussed in public.</p>
<p>At Caplin we are living proof that framework development can be achieved following agile principles. We have been successfully building frameworks and APIs for the past 5 years using various agile methodologies from <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3J1bV8oZGV2ZWxvcG1lbnQp">Scrum</a>, to a mix of Scrum and <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHRyZW1lX1Byb2dyYW1taW5n">XP</a>, to <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5hZ2lsZXByb2R1Y3RkZXNpZ24uY29tL2Jsb2cvMjAwOS9rYW5iYW5fb3Zlcl9zaW1wbGlmaWVkLmh0bWw=">Kanban</a>.</p>
<p>This article represents the approaches that we have undertaken to successfully build our frameworks.</p>
<p><span id="more-1134"></span></p>
<p><strong>The Problem with Refactoring Framework</strong></p>
<p>The specific issue in question is the idea that code should be kept lean, with the bare minimum implemented to achieve the required functionality within an iteration. If further functionality requires this code be be modified, usually within another iteration, then no problem, just refactor it until it does what needs to do. The unit tests that you wrote previously can help give you confidence that the functionality of any unmodified code will still work as expected, whilst new or updated unit tests will cover the additional functionality.</p>
<p>The decision to refactor, even a large refactoring effort, isn&#8217;t too hard to make when you are in complete control of the code base, for example when you are producing the whole application. However this luxury isn&#8217;t so trivial when you&#8217;re developing a framework. By all means you can refactor your code, however if the code you want to change is part of the public API, then you need to consider what impact this might have on the users of your framework.</p>
<p><strong>Techniques for Building Agile Frameworks</strong></p>
<p>Fortunately there are a number of techniques that can be applied to tackle this problem, which are described below. I would also recommend reading the short, but excellent, Chapter &#8220;Evolving Frameworks&#8221; from <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LZW50X0JlY2s=">Kent Beck&#8217;s</a> book <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY28udWsvSW1wbGVtZW50YXRpb24tUGF0dGVybnMtQWRkaXNvbi1XZXNsZXktU2lnbmF0dXJlLUtlbnQvZHAvMDMyMTQxMzA5MS8=">Implementation Patterns</a>. It provides valuable insights on the subject, based on Beck&#8217;s own experience of making <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5qdW5pdC5vcmcv">JUnit 4</a> backwardly compatible, despite some significant changes to the API.</p>
<p><a name="backwards_compatibility"><strong>Backwards Compatibility</strong></a></p>
<p>One technique is to simply keep everything backwardly compatible, no matter how difficult it is to do this. All of the classes and methods provided previously must still be present and provide the same functionality, even if the underlying implementation has been modified. New functionality is provided in parallel to this.</p>
<p>Any parts of the framework that you would prefer your customers to stop using, even though it is still fully functional, should be flagged as deprecated, and the documentation should link to the classes or methods that should be used instead. This provides your customers a chance to migrate away from the parts of the API that you are unsatisfied with as it suits them. This seems to be the approach that has been taken with Java where parts of the API have been deprecated for a decade but can still be used.</p>
<p>Once parts of the framework have been deprecated for a while, you also have the option of making an intentional <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=I2JyZWFraW5nX2NoYW5nZQ==">breaking change</a> to remove them. This was the approach taken for <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXYvMy4wL3doYXRzbmV3LzMuMC5odG1s">Python 3</a>, which is deliberately backwardly incompatible with earlier versions. In this case a automated migration tool was created to convert from Python 2 to Python 3 code to help soften the blow. A similar approach is a good idea to help your customers identify the areas of their code they will need to update once they take the new version of your framework with the breaking change.</p>
<p><a name="versioned_api"><strong>Versioned APIs</strong></a></p>
<p>A specialisation of keeping everything <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=I2JhY2t3YXJkc19jb21wYXRpYmlsaXR5">backwardly compatible</a> is to introduce a versioned API. A versioned API can be used when you have realised that one of the interfaces that your customer&#8217;s code implements is missing a particular method. Instead of adding the method to the existing interface, which will cause a compilation error for your customer, you can create a new interface that extends the original one. The new method can be added to the new interface, and your code that calls that method can check whether the object instance implements the old interface, in which case the method is not invoked, or the new interface, where it is. As before, it is worthwhile deprecating the old interface.</p>
<p>An example of a versioned API can be seen with the JMX interface <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZheC9tYW5hZ2VtZW50L05vdGlmaWNhdGlvbkVtaXR0ZXIuaHRtbA=="><code>NotificationEmitter</code></a>, which extends <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZheC9tYW5hZ2VtZW50L05vdGlmaWNhdGlvbkJyb2FkY2FzdGVyLmh0bWw="><code>NotificationBroadcaster</code></a>, adding a single method: <code>removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)</code>.</p>
<p>A problem with this approach is if you need to add a versioned API on top of an existing one. These multiple layers are likely to make the calling code turn pretty nasty, and can bloat out your API. At this stage it is worth considering if it is possible to make a <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=I2JyZWFraW5nX2NoYW5nZQ==">breaking change</a>.</p>
<p>Another problem is what to call the versioned API. The JMX example used different names <code>NotificationEmitter</code> and <code>NotificationBroadcaster</code>, although without knowing the API I wouldn&#8217;t be able to say which one superseded the other. It might also be difficult to come up with a different name that is meaningful. An alternate naming convention is to number to interface, for example <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhNzUyNTc0KFZTLjg1KS5hc3B4"><code>IHTMLDocument2</code></a>. My main issue with this approach is that it can complicate matters if you ever decide to remove deprecated parts of the API. If <code>IHTMLDocument</code> was to be removed, it looks odd to have an interface called <code>IHTMLDocument2</code> hanging around &#8211; surely it should be renamed <code>IHTMLDocument</code>, however this enters a compatibility minefield.</p>
<p><a name="breaking_change"><strong>Breaking Change</strong></a></p>
<p>Most of the time, I consider breaking changes to be a last resort. Breaking changes are always going to be frustrating for your customers, and if you keep forcing them to rewrite their code you&#8217;ll soon find that they have ceased to be your customer. However, as I have alluded to earlier, there can be good reasons to make breaking changes.</p>
<p>Maintaining deprecated parts of an API can become an expensive overhead, bloating out what might otherwise be a concise and neat API. Periodically removing these deprecated APIs can be worthwhile, provided that your customers have had adequate time and warning to move onto the new APIs.</p>
<p>Alternatively it might be very difficult to make an API backwardly compatible, or an API may be just too wrong to be kept. In both cases it is vital to explore all the possibilities suggested earlier to see if there is any way to avoid making the breaking change. If it is necessary to make the breaking change, consider how you can lessen the impact for your customers.</p>
<p><strong>Always Consider Your Customer</strong></p>
<p>Regardless of the reasons behind the breaking changes, it is vital that you focus on making your customer&#8217;s experience as pain free as possible. After all they want to focus their efforts on adding their business value on top of your framework, not bug fixing issues introduced due to changes to your framework.</p>
<ul>
<li>Clearly document which parts of the API are deprecated and provide clear information about what should be used instead. Also give your customers ample warning time about when a deprecated API will be removed.</li>
<li>Provide a tool to identify code that will be impacted by the breaking change, and provide hints to what changes need to be made to it, or even automatically correct the code. In some cases a good IDE can help identify and correct breaking changes, however you shouldn&#8217;t assume that it will without testing it first. If a tool or IDE is infeasible, then a clear set of instructions for what to look for might be adequate.</li>
<li>Flag which areas of the API are still young and may be subject to change. At Caplin we document newer parts of the API as beta. Early adopters are able to take advantage of the latest features, however they are warned that the API may still evolve. Although this can still be frustrating for our customers this is partially mitigated by the fact that we are listening to their feedback about the beta API and are feeding that back into the next version of the API, making it something even easier to use.</li>
<li>Try to hold off making breaking changes until a major version release. It is incredibly frustrating if breaking changes are made in minor incremental releases.</li>
<li>Provide consultancy to your customers to help with the upgrade to the version with the breaking changes.</li>
</ul>
<p><strong>Conclusion</strong></p>
<p>There is no reason why you can&#8217;t build a framework whilst employing an agile methodology. Most of the principles of agile are equally valid for both framework and application developers. The main issue is that your ability to refactor the framework code is restricted when it comes to the public API. As a result, the importance of getting an API &#8220;right&#8221; the first time may seem vital when developing a framework compared to an application, however failure to create this &#8220;right&#8221; API is not a disaster. As shown earlier, there are several techniques that can be applied to build up a framework in an iterative and agile way.</p>
<p>At times it is very difficult to maintain backwards compatibility, and sometimes breaking changes are impossible to avoid, but the role of a framework provider should be focused on empowering the users of the framework, its customers, to build their software reliably and efficiently upon it, rather than spending all their time bug fixing issues introduced by new versions of the framework. As a result the processes and practices for agile framework development need to aligned with these goals &#8211; however that is a topic for another day.</p>
<p>In two weeks time I will be following this up with a look at one of the processes that we have put into place to help develop our frameworks, &#8220;Testing APIs for Backwards Compatibility&#8221;.</p>
 <img src="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1134" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.caplin.com/2010/02/02/agile-framework-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s all jump on the Kanban</title>
		<link>http://blog.caplin.com/2009/11/20/lets-all-jump-on-the-kanban/</link>
		<comments>http://blog.caplin.com/2009/11/20/lets-all-jump-on-the-kanban/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 15:36:58 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caplin.com/?p=603</guid>
		<description><![CDATA[We have been using agile methods &#8211; a typical mix of Scrum and XP &#8211; for some years now at Caplin. Though all of us have had some level of formal training and many years of experience in agile techniques, I have observed a couple of drawbacks with the Scrum...]]></description>
			<content:encoded><![CDATA[<p>We have been using agile methods &#8211; a typical mix of <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3J1bV8oZGV2ZWxvcG1lbnQp">Scrum</a> and <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5leHRyZW1lcHJvZ3JhbW1pbmcub3JnLw==" 0="target="_blank"">XP</a> &#8211; for some years now at Caplin. Though all of us have had some level of formal training and many years of experience in agile techniques, I have observed a couple of drawbacks with the Scrum process and the use of it within our organisation:</p>
<ol>
<li>It&#8217;s very difficult to use velocity for Scrum sign-up because team personnel change frequently</li>
<li>Unexpected work can impact the project teams resulting in a demotivated team because they sometimes do not complete what they have signed-up for</li>
</ol>
<p>There must be a better way?</p>
<p><span id="more-603"></span></p>
<p>I have been thinking about this for some time and our vision is continuous releases (apologies to the Marketing Department) whereby development teams pull work from priority boards, with the work moving through the necessary stages, culminating in the final stage being “release into production”.  A blissful continuous work stream where capacity and demand are in harmony and value is pulled through the system and delivered to the business as early as possible. Idealistic?  Maybe, but there seems to be some momentum gathering in the world of “<a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LYW5iYW4=">Kanban</a> Systems”, which appears to deliver our vision, so here at Caplin we are trialling this new way of working with one project team.</p>
<p>If you want to find out more about Kanban Systems and Lean techiques these four websites are a good start:</p>
<ul>
<li><a  0="title="availagility.co.uk" 1=""" href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2F2YWlsYWdpbGl0eS5jby51aw==" 2="target="_blank"">http://availagility.co.uk</a><a title=\"http://www.limitedwipsociety.org\" href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5saW1pdGVkd2lwc29jaWV0eS5vcmc=" target=\"_blank\"> </a></li>
<li><a  0="title="http://www.limitedwipsociety.org"" href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5saW1pdGVkd2lwc29jaWV0eS5vcmc=" 1="target="_blank"">http://www.limitedwipsociety.org</a></li>
<li><a  0="title="http://www.crisp.se"" href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5jcmlzcC5zZQ==" 1="target="_blank"">http://www.crisp.se</a></li>
<li><a  0="title="http://www.agilemanagement.net"" href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5hZ2lsZW1hbmFnZW1lbnQubmV0" 1="target="_blank"">http://www.agilemanagement.net</a></li>
</ul>
<p>We will also have some attendees at the upcoming 1-day <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NraWxsc21hdHRlci5jb20vZXZlbnQvYWdpbGUtc2NydW0vbGVhbi1rYW5iYW4tZXhjaGFuZ2UvbmctMzU5" 0="target="_blank"">Lean and Kanban Exchange</a> on the 1st December, run by the always excellent <a  href="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3NraWxsc21hdHRlci5jb20v" 0="target="_blank"">Skills Matter</a>.</p>
 <img src="http://blog.caplin.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=603" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.caplin.com/2009/11/20/lets-all-jump-on-the-kanban/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

