<?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>Richard Lawrence &#187; software</title>
	<atom:link href="http://www.richardlawrence.info/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.richardlawrence.info</link>
	<description>On making software teams happier and more productive</description>
	<lastBuildDate>Tue, 20 Jul 2010 21:38:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Growing DONE—How to Make the Definition of Done Work for Your Team</title>
		<link>http://www.richardlawrence.info/2009/12/21/growing-done-how-to-make-the-definition-of-done-work-for-your-team/</link>
		<comments>http://www.richardlawrence.info/2009/12/21/growing-done-how-to-make-the-definition-of-done-work-for-your-team/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 23:34:37 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Definition of Done]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=234</guid>
		<description><![CDATA[Effective agile teams get things done. They build software day after day that&#8217;s not just &#8220;code complete&#8221; but really shippable. And when their product owner says, &#8220;ship it,&#8221; they can get their shippable software into production at the drop of a hat. The Definition of Done can be a powerful tool to make these things [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
<li><a href='http://www.richardlawrence.info/2008/09/08/surviving-rewrites/' rel='bookmark' title='Permanent Link: Surviving Rewrites'>Surviving Rewrites</a></li>
<li><a href='http://www.richardlawrence.info/2008/10/30/free-agile-product-management-seminar-nov-11-denver/' rel='bookmark' title='Permanent Link: Free Agile Product Management Seminar &#8211; Nov 11, Denver'>Free Agile Product Management Seminar &#8211; Nov 11, Denver</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p><img src="http://www.richardlawrence.info/wp-content/uploads/2009/12/finish_banner.jpg" alt="Finish banner" title="Finish banner" width="200" height="133" class="alignright size-full wp-image-241" />Effective agile teams get things done. They build software day after day that&#8217;s not just &#8220;code complete&#8221; but really shippable. And when their product owner says, &#8220;ship it,&#8221; they can get their shippable software into production at the drop of a hat.</p>
<p>The Definition of Done can be a powerful tool to make these things happen&#8230;If it&#8217;s used right.</p>
<p>Most agile teams I see have one of four relationships with a Definition of Done:</p>
<ol>
<li>They don&#8217;t have one</li>
<li>They have one but don&#8217;t really use it</li>
<li>They have one but can never satisfy it</li>
<li>They have one, satisfy it for each story, but still have lots to do at the end of a release</li>
</ol>
<p>I rarely come across teams who use the Definition of Done to good effect day after day, sprint after sprint. <span id="more-234"></span></p>
<p>The reason why, I think, is that if a team uses a Definition of Done at all, they try to use a single one before they&#8217;re ready. I&#8217;ve discovered that most teams really need two definitions of done. For a new agile team, there&#8217;s more to do to get software ready for production than can be accomplished a story at a time. Teams that fall into #3 above probably put everything on the Definition of Done. Teams in #4 probably put just those things they could do a story at a time on the Definition of Done and left everything else for later.</p>
<p><strong>The answer is two Definitions of Done. The Story Definition of Done captures what the team can do today to make each story as shippable as possible in each sprint. The Release Definition of Done captures the gap between the Story Definition of Done and what&#8217;s actually required to ship. Together these tools provide a way to visualize what done means and to make it happen as early as possible.</strong></p>
<p>Here&#8217;s how to build effective Story and Release Definitions of Done&#8230;</p>
<h2>Building The Two Definitions of Done</h2>
<h3>1. Brainstorm the List</h3>
<p>List all the things required to move a set of features in your product to production. Engage release management, operations, help desk, and other stakeholders at this point—it&#8217;s easier to build what they need into the software than to bolt it on at the end. This list typically includes things like:</p>
<ul>
<li>user documentation</li>
<li>operations documentation</li>
<li>monitoring and logging</li>
<li>performance testing</li>
<li>regression tested in a clean QA environment</li>
</ul>
<p>Now, list anything required to deliver software at a consistently fast pace from iteration to iteration. For example:</p>
<ul>
<li>automated unit tests covering 80% of code</li>
<li>automated story tests covering 90% of acceptance criteria</li>
<li>adherence to coding standards</li>
<li>code reviewed by another developer</li>
<li>all production code developed by a pair</li>
</ul>
<p>Finally, list non-functional requirements such as:</p>
<ul>
<li>all pages load in under a second</li>
<li>all pages can support 300 simultaneous user sessions</li>
</ul>
<p>Merge these lists into one, changing the language where necessary so that each bullet reads as a continuation of the sentence beginning: &#8220;In order for a set of features to be released to production&#8230;&#8221;</p>
<h3>2. Challenge the List</h3>
<p>For each item on the list, ask &#8220;why?&#8221; Keep asking &#8220;why?&#8221; until it&#8217;s clear that the item is the simplest, cheapest, most repeatable way to achieve some desired goal in the release. If it&#8217;s not, change it.</p>
<p>This is where you challenge the existing rules around releases. Maybe your release readiness guidelines today require a complete installation guide. Could you replace that with an automated installation script?</p>
<h3>3. Build Release Readiness In</h3>
<p>Now you have a list of the minimal set of things a group of features must have to be released—your Release Definition of Done. Bolting those things onto an otherwise complete set of features could impose a fixed cost of weeks to the end of any release. One of our goals in agile is to allow the product owner to be able to say at any point, &#8220;This is enough, I want to start making money off of this software now—ship it.&#8221; An expensive release gets in the way.</p>
<p>Look at each item on the list and ask, &#8220;Could we satisfy this as we build each story instead of all at once at the end of a release?&#8221; Yes? Then move it to your Story Definition of Done. No? Could you do part of it or do something that would reduce the time at the end? Yes? Then put that on your Story Definition of Done. No? Then leave it on the Release Definition of Done.</p>
<p>Very few items can&#8217;t be satisfied a story at a time. The most common ones I see are performance testing in a production-like environment shared with other products and beta testing with a set of real users. But you can get a head start on even these. Maybe your test environment isn&#8217;t exactly like production, but can you make the performance constraints similar enough to at least profile for likely performance issues? Maybe you can&#8217;t beta test on a large scale, but could you get a small set of users to volunteer to use stories as they&#8217;re built and provide early feedback to make the beta test shorter and more predictable? Think hard about anything you&#8217;re tempted to leave on the Release Definition of Done.</p>
<h3>4. Use Your Definitions of Done</h3>
<p>You now have two definitions of done, one for every story you build and one for a collection of stories you want to release. The Story Definition of Done will inform your acceptance criteria for every story. If page load time matters, a story isn&#8217;t done until all the related pages load fast enough. Test for this. Automate these tests and run them on every build if you can.</p>
<p>You won&#8217;t satisfy the items on your Release Definition of Done until the end of a release. But this doesn&#8217;t mean you can forget about them until then. Keep the Release Definition of Done visible, and look for ways to test early for release readiness.</p>
<h3>5. Grow Your Story Definition of Done</h3>
<p>The Definitions of Done are a starting place, a statement of what your team can accomplish today. Over time, your Release Definition of Done should get smaller and your Story Definition of Done should grow. If you have 3 weeks of manual regression testing at the end of each release, come up with a plan to grow automated regression tests as you build new stories. Maybe you can reduce those 3 weeks of testing to one. If you have a tech writer spend a month writing documentation at the end of a release today, find ways to integrate her into the team to grow the documentation as you grow the software. Maybe you can reduce that month of writing to 3 days of editing and polishing.</p>
<h2>The Bottom Line</h2>
<p>Use two definitions of done. In every retrospective, look for ways to grow your Story Definition of Done so you can consistently build and release software quickly. If you get to a point where you can throw away the Release Definition of Done, congratulations! But don&#8217;t start there.</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
<li><a href='http://www.richardlawrence.info/2008/09/08/surviving-rewrites/' rel='bookmark' title='Permanent Link: Surviving Rewrites'>Surviving Rewrites</a></li>
<li><a href='http://www.richardlawrence.info/2008/10/30/free-agile-product-management-seminar-nov-11-denver/' rel='bookmark' title='Permanent Link: Free Agile Product Management Seminar &#8211; Nov 11, Denver'>Free Agile Product Management Seminar &#8211; Nov 11, Denver</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2009/12/21/growing-done-how-to-make-the-definition-of-done-work-for-your-team/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Continuous Deployment</title>
		<link>http://www.richardlawrence.info/2009/02/13/continuous-deployment/</link>
		<comments>http://www.richardlawrence.info/2009/02/13/continuous-deployment/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 15:05:23 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[release management]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=153</guid>
		<description><![CDATA[I&#8217;ve written before about the amazing financial impact of releasing more often. And I know from personal experience the positive impact that frequent releases have on learning and on product quality and value. So, I enjoyed this post on one company&#8217;s experience with continuous releases. Yes, you read that right; they release, on average, 50 [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2007/04/26/continuous-integration-and-the-bad-head-problem/' rel='bookmark' title='Permanent Link: Continuous Integration and the Bad Head Problem'>Continuous Integration and the Bad Head Problem</a></li>
<li><a href='http://www.richardlawrence.info/2007/03/22/continuous-integration-in-under-an-hour/' rel='bookmark' title='Permanent Link: Continuous Integration in Under an Hour'>Continuous Integration in Under an Hour</a></li>
<li><a href='http://www.richardlawrence.info/2008/07/11/one-word-can-change-your-daily-scrum/' rel='bookmark' title='Permanent Link: One Word Can Change Your Daily Scrum'>One Word Can Change Your Daily Scrum</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>I&#8217;ve <a href="/2008/10/14/how-to-invest-less-and-make-more-from-your-software-projects/">written before</a> about the amazing financial impact of releasing more often. And I know from personal experience the positive impact that frequent releases have on learning and on product quality and value. So, I enjoyed <a href="http://startuplessonslearned.blogspot.com/2009/02/continuous-deployment-and-continuous.html">this post</a> on one company&#8217;s experience with continuous releases. Yes, you read that right; they release, on average, 50 times per day.</p>
<blockquote><p>We call this process continuous deployment because it seemed to us like a natural extension of the continuous integration we were already doing. Our eventual conclusion was that there was no reason to have code that had passed the integration step but was not yet deployed.</p></blockquote>
<p><a href="http://startuplessonslearned.blogspot.com/2009/02/continuous-deployment-and-continuous.html">Read the whole thing</a> and consider what it would take in your organization to get to continuous deployment. How fast could you go? And what impediments would have to be resolved to make it happen?</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2007/04/26/continuous-integration-and-the-bad-head-problem/' rel='bookmark' title='Permanent Link: Continuous Integration and the Bad Head Problem'>Continuous Integration and the Bad Head Problem</a></li>
<li><a href='http://www.richardlawrence.info/2007/03/22/continuous-integration-in-under-an-hour/' rel='bookmark' title='Permanent Link: Continuous Integration in Under an Hour'>Continuous Integration in Under an Hour</a></li>
<li><a href='http://www.richardlawrence.info/2008/07/11/one-word-can-change-your-daily-scrum/' rel='bookmark' title='Permanent Link: One Word Can Change Your Daily Scrum'>One Word Can Change Your Daily Scrum</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2009/02/13/continuous-deployment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to Invest Less and Make More From Your Software Projects</title>
		<link>http://www.richardlawrence.info/2008/10/14/how-to-invest-less-and-make-more-from-your-software-projects/</link>
		<comments>http://www.richardlawrence.info/2008/10/14/how-to-invest-less-and-make-more-from-your-software-projects/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 21:15:38 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[economics]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[product management]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=41</guid>
		<description><![CDATA[As the saying goes, &#8220;Cash is king.&#8221; It doesn&#8217;t matter how good your P&#38;L or balance sheet looks or how good the business case for your project is, if you don&#8217;t have enough cash every month to pay the bills, you won&#8217;t stay in business. With the economy tightening, then, companies are desperately trying to [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/09/08/surviving-rewrites/' rel='bookmark' title='Permanent Link: Surviving Rewrites'>Surviving Rewrites</a></li>
<li><a href='http://www.richardlawrence.info/2008/10/09/the-most-useful-release-burn-up-ive-seen-yet-2/' rel='bookmark' title='Permanent Link: The Most Useful Release Burn-up I&#039;ve Seen Yet'>The Most Useful Release Burn-up I&#039;ve Seen Yet</a></li>
<li><a href='http://www.richardlawrence.info/2008/10/09/the-most-useful-release-burn-up-ive-seen-yet/' rel='bookmark' title='Permanent Link: The Most Useful Release Burn-up I&#8217;ve Seen Yet'>The Most Useful Release Burn-up I&#8217;ve Seen Yet</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>As the saying goes, &#8220;<a href="http://en.wikipedia.org/wiki/Cash_is_king">Cash is king.</a>&#8221; It doesn&#8217;t matter how good your P&amp;L or balance sheet looks or how good the business case for your project is, if you don&#8217;t have enough cash every month to pay the bills, you won&#8217;t stay in business.</p>
<p>With the economy tightening, then, companies are desperately trying to cut costs in order to stay cash flow positive. In IT the major cost is salary, so cutting costs means cutting people. Nobody likes that.</p>
<p>Fortunately, there&#8217;s a simple way to reduce expenses and increase returns on a software project: incremental releases.</p>
<p><span id="more-41"></span></p>
<h2>A Typical Big Bang Release</h2>
<p>Let&#8217;s look at a example. Our project will spend $1m (mostly salaries) for a year of development starting in January 2009, release at the end of that year, and is projected to make $2m over its first year in production. We&#8217;ll simplify this model and assume that expenses and returns will be distributed evenly over their respective years. We&#8217;ll ignore ramp up time and we won&#8217;t discount future cash.</p>
<p>The result is a cumulative cash flow chart that looks like this:</p>
<p><img class="alignnone size-full wp-image-42" title="Cumulative Cash Flow Chart - One Big Release" src="http://www.richardlawrence.info/wp-content/uploads/2008/10/cash_flow1-one_big_release.png" alt="" width="473" height="282" /></p>
<p>We spend money linearly until we&#8217;ve spent our whole million. Then, we release the software and start making money linearly until we make the projected two million. We break even in June of 2010, 18 months in, and we see a 100% ROI.</p>
<h2>Variation 1: Incremental Releases</h2>
<p>Now, let&#8217;s keep all those same assumptions and make one small change. Instead of building the software and releasing it all at once, let&#8217;s break it into four equal size feature sets. Every three months we&#8217;ll build and release one until the whole product is released. To simplify things again, we&#8217;ll assume that each feature set is equally valuable and will account for a quarter of the expected return. Since we can start seeing returns as soon as we release a feature set, our cumulative cash flow now looks like this:</p>
<p><img class="alignnone size-full wp-image-43" title="Cumulative Cash Flow Chart - Incremental Releases" src="http://www.richardlawrence.info/wp-content/uploads/2008/10/cash_flow2-incremental_releases.png" alt="" width="473" height="282" /></p>
<p>With this arrangement, we only need to invest $375k in the project rather than $1m. We break even in February 2010, 14 months in. With an investment of $375k for $1.75m in returns ($2.75m in revenue less the same $1m in expenses as the previous example) we see a 467% ROI over two years.</p>
<h2>Variation 2: Prioritizing Releases by Value</h2>
<p>For most projects, however, value isn&#8217;t distributed evenly across the features. Usually an <a href="http://en.wikipedia.org/wiki/Pareto_principle">80/20 rule</a> applies and some features are much more valuable than others. For our hypothetical project, let&#8217;s assume that we can divide up our features to get a pretty typical distribution where Feature Set A accounts for 50% of the value, Feature Set B for 30%, Feature Set C for 12%, and Feature Set D for 8%. Now, our cumulative cash flow looks like this:</p>
<p><img class="alignnone size-full wp-image-44" title="Cumulative Cash Flow Chart - Prioritized Releases by Value" src="http://www.richardlawrence.info/wp-content/uploads/2008/10/cash_flow3-prioritized_releases.png" alt="" width="473" height="282" /></p>
<p>When we deliver feature increments by value, we have to invest only $250k for a $2.1m return, or 844% ROI. We break even in November 2009, before the original project was even going to release!</p>
<h2>Variation 3: Cutting Out Low-Value Releases</h2>
<p>Once we&#8217;ve prioritized our features by value, we can go one step further. We can decide that some features aren&#8217;t worth the investment. With their long 15 and 19 month waits to break even, feature sets C and D may not be worth it. Over the two years we&#8217;re considering, those features have a negative ROI. Let&#8217;s cut them out of the project and have the team do something else more valuable. Here&#8217;s our cumulative cash flow now:</p>
<p><img class="alignnone size-full wp-image-45" title="Cumulative Cash Flow Chart - Cutting Out Low-Value Releases" src="http://www.richardlawrence.info/wp-content/uploads/2008/10/cash_flow4-cutting_out_low_priority_features.png" alt="" width="473" height="282" /></p>
<p>This variation generates less revenue, but only spends half as much. The return is $2.15m on a $250k investment, or 860% ROI. It breaks even in August 2009, tying up the cash for less time and freeing the team to do something else more valuable. In fact, if we can assign the team to two feature sets on another project as valuable as A and B were on this project, our two year cumulative cash flow looks like this:</p>
<p><img class="alignnone size-full wp-image-46" title="Cumulative Cash Flow Chart - High-Value Releases from Two Projects" src="http://www.richardlawrence.info/wp-content/uploads/2008/10/cash_flow5-two_projects.png" alt="" width="473" height="282" /></p>
<p>Now we see $3.5m returned on our $250k investment, <strong>an ROI of 1400%</strong>. We break even in October 2009, still three months before the original plan would have had us starting to see a return at all. Simply by rearranging our work by value and releasing incrementally, we&#8217;ve dramatically improved our cash flow situation while increasing our revenue. And we didn&#8217;t have to lay anyone off to do it. Going into a tight economy, odds are that this is exactly what your business needs.</p>
<p><em>(In case you&#8217;re interested, here are the details behind the charts: <a href="http://www.richardlawrence.info/wp-content/uploads/2008/10/big-bang-vs-incremental-releases-cash-flow.xls">big-bang-vs-incremental-releases-cash-flow.xls</a>.)</em></p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/09/08/surviving-rewrites/' rel='bookmark' title='Permanent Link: Surviving Rewrites'>Surviving Rewrites</a></li>
<li><a href='http://www.richardlawrence.info/2008/10/09/the-most-useful-release-burn-up-ive-seen-yet-2/' rel='bookmark' title='Permanent Link: The Most Useful Release Burn-up I&#039;ve Seen Yet'>The Most Useful Release Burn-up I&#039;ve Seen Yet</a></li>
<li><a href='http://www.richardlawrence.info/2008/10/09/the-most-useful-release-burn-up-ive-seen-yet/' rel='bookmark' title='Permanent Link: The Most Useful Release Burn-up I&#8217;ve Seen Yet'>The Most Useful Release Burn-up I&#8217;ve Seen Yet</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2008/10/14/how-to-invest-less-and-make-more-from-your-software-projects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Surviving Rewrites</title>
		<link>http://www.richardlawrence.info/2008/09/08/surviving-rewrites/</link>
		<comments>http://www.richardlawrence.info/2008/09/08/surviving-rewrites/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 03:50:31 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[BDUF]]></category>
		<category><![CDATA[Chad Fowler]]></category>
		<category><![CDATA[David Anderson]]></category>
		<category><![CDATA[Martin Fowler]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=37</guid>
		<description><![CDATA[It seems like fully half the projects I come across are rewrites in one form or another. It ought to be common knowledge by now that rewrite projects have a very bad track record, but perhaps the bad results are connected to the inordinate attractiveness of &#8220;doing it right this time.&#8221; The chance to replace [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/07/11/one-word-can-change-your-daily-scrum/' rel='bookmark' title='Permanent Link: One Word Can Change Your Daily Scrum'>One Word Can Change Your Daily Scrum</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>It seems like fully half the projects I come across are rewrites in one form or another. It ought to be common knowledge by now that rewrite projects have a very bad track record, but perhaps the bad results are connected to the inordinate attractiveness of &#8220;doing it right this time.&#8221; The chance to replace the ugly production system with a new, pure, buzzword-compliant ode to software architecture is one of the more compelling <a href="http://en.wikipedia.org/wiki/Siren">siren</a> songs for developers. Too bad about those rocks.</p>
<p>Given that rewrites aren&#8217;t going away, here are the things I recommend software organizations consider to maximize their chances of avoiding the rocks (and maybe even be wildly successful!).</p>
<ol>
<li>The problem isn&#8217;t as well known as you think it is. Run away from specs that say, &#8220;The new system shall do everything the old system does plus new functions X, Y, and Z.&#8221; No one knows exactly what the system does. It got to where it is today through the accretion of features, hacks, and workarounds. You&#8217;re almost guaranteed to break someone&#8217;s unofficial report when you rebuild the system &#8220;right.&#8221;</li>
<li><a href="http://c2.com/xp/BigDesignUpFront.html">BDUF</a> still doesn&#8217;t work, even if the previous version of the system already exists. Sure, you&#8217;ve architected the perfect service-oriented, social-media, domain-specific new system. Unfortunately, it&#8217;s wrong. In the end, the new system is going to look nothing like you envision. You can&#8217;t see the future any more than the previous team could. (In fact, they were probably replacing some other system and &#8220;doing it right this time.&#8221;)</li>
<li>The customer almost always wants the existing system plus something new. By now, the existing system is probably what <a href="http://www.agilemanagement.net/Articles/Weblog/PrioritizingandPlanningfo.html">David Anderson calls table stakes</a>. Since the existing system exists, you&#8217;re already in the game. Don&#8217;t start by building the table stakes again. The new features are probably spoilers or differentiators. Those have real incremental business value. If the existing system works, build the new features first. Figure out a way to integrate them with the existing system as necessary. Then grow the new system to choke out the existing one. (Martin Fowler call this pattern <a href="http://www.martinfowler.com/bliki/StranglerApplication.html">Strangler Application</a>.) Eventually, you&#8217;ll have your whole new system, but it&#8217;ll bring new value from day one instead of spending months or years catching up with the existing system. It&#8217;s harder to architect a system incrementally than from scratch, but architects like challenges, right?</li>
<li>Involve the business. Don&#8217;t let them send you to the existing system as a specification. Starting with the new features makes this a pretty easy sell. Someone&#8217;s excited enough about those new features to work with your team. Keep a blend of new and replacement features through the whole project and they&#8217;ll stay engaged.</li>
<li>Release early and often. Business value can only be realized if people are using the software. Moreover, the quality of the feedback you receive will be better if your software is being used by real users with real data. This is standard agile stuff and shouldn&#8217;t come as a surprise to anyone, but rewrite projects seem to have a logic of their own.</li>
</ol>
<p>For more rewrite project advice, check out Chad Fowler&#8217;s excellent 2006 <a href="http://chadfowler.com/2006/12/27/the-big-rewrite">series on the topic</a>.</p>
<p>What other tips would you give teams considering a rewrite project? Share them in the comments.</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/07/11/one-word-can-change-your-daily-scrum/' rel='bookmark' title='Permanent Link: One Word Can Change Your Daily Scrum'>One Word Can Change Your Daily Scrum</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2008/09/08/surviving-rewrites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
