<?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>Gojko Adzic &#187; project management</title>
	<atom:link href="http://gojko.net/tag/project-management/feed/" rel="self" type="application/rss+xml" />
	<link>http://gojko.net</link>
	<description>Building software that matters</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:07:39 +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>How to divide and conquer software projects effectively</title>
		<link>http://gojko.net/2009/10/19/how-to-divide-and-conquer-software-projects-effectively/</link>
		<comments>http://gojko.net/2009/10/19/how-to-divide-and-conquer-software-projects-effectively/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 10:39:29 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[agiletd]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=1321</guid>
		<description><![CDATA[During &#8216;The one thing you need to know&#8217; talk at the Agile Testing Days 09 in Berlin, Mary Poppendieck presented a summary of how software development tried to deal with complexity historically. Poppendieck started by quoting Fred Brooks, who wrote that &#8220;Complexity is the enemy in software, inherent complexity software...]]></description>
			<content:encoded><![CDATA[<p>During &#8216;The one thing you need to know&#8217; talk at the <a href="/tag/agiletd">Agile Testing Days 09</a> in Berlin, Mary Poppendieck presented a summary of how software development tried to deal with complexity historically. Poppendieck started by quoting Fred Brooks, who wrote that &#8220;Complexity is the enemy in software, inherent complexity software rises exponentially&#8221;. Divide and conquer is the traditional solution to this problem, used from the first software projects and still in use today. However, the lines along which the complexity is divided changed and there is still a debate on which way is the best.<span id="more-1321"></span></p>
<p>Poppendieck said that structured programming and top-down programming tried to divide software in layers around hierarchy and execution in late sixties (see Edsger Dijkstra&#8217;s work on structured programming). In the early seventies, David Parnas promoted decomposition along the lines of responsibility and likeliness of future change. In mid-seventies, Vinton Cerf and Robert Kahn designed TCP/IP by introducing a clear separation of concerns and commonality/variability analysis. In the second half of seventies software projects were being divided by process (Barry Boehm), leading to watefall development. Early eighties brought evolutionary development (Tom Gilb), building up value incrementally. (I was a bit surprised by the nineties completely missing from the story.)</p>
<p>Taking the best ideas from all these divisions, she said that <i>divisions by responsibility and business value</i> are the best.</p>
<p>Poppendieck compared waterfall to a &#8220;defect injection process&#8221;, saying that if specifications written first, then test and code based on those specifications by different people, the chance of them matching is very small, and there is nobody really to blame for that. She proposed that specifications should be written in the form of tests straight away, and then the code written according to these tests, to eliminate one potential cause of mismatch (specifications-tests) and ensure that the other (specifications-code) is easy to verify. This effectively is the idea behing <a href="http://acceptancetesting.info">agile acceptance testing</a>.</p>
<p><i>see <a href="/tag/agiletd">other articles</a> from Agile Testing Days</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2009/10/19/how-to-divide-and-conquer-software-projects-effectively/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Delivering useful software</title>
		<link>http://gojko.net/2008/04/28/delivering-useful-software/</link>
		<comments>http://gojko.net/2008/04/28/delivering-useful-software/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 16:53:25 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[iterative]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[user stories]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=121</guid>
		<description><![CDATA[One of central agile programming ideas is to deliver frequently and get feedback early. To get the full benefits of this approach, it is not enough just to make sure that we deliver often and seek feedback &#8212; it is extremely important to plan our deliveries correctly as well. If...]]></description>
			<content:encoded><![CDATA[<p><img src='/images/940460_puzzle_pieces_3.jpg' style="border:1px solid black; margin:5px 5px 5px 5px" align="left"/>One of central agile programming ideas is to deliver frequently and get feedback early.  To get the full benefits of this approach, it is not enough just to make sure that we deliver often and seek feedback &mdash; it is extremely important to plan our deliveries correctly as well. If the deliverables are not complete in the sense that they can really be used in production, then the feedback is not as relevant as we would like it to be. </p>
<p>Here is a situation I have seen a few times more than I would have wanted: the team and the clients split the whole project into several phases that will be shipped every few weeks; early deliverables mostly provide the plumbing for the later ones, and have only enough user-interfacing functions for the plumbing to be tested functionally. The clients set up and play with each new release. They dutifully give their feedback and participate in testing each time. When the whole thing comes together on the end, it turns out that the system still requires a lot of changes to solve the problem that it was intended for &mdash; the iterations and customer feedback failed to provide the directions. <span id="more-121"></span></p>
<p>The problem hides in way that the project was split: <i>early deliverables mostly provide the plumbing for the later ones</i> and <i> the whole thing comes together on the end</i>. So, until very close to the end of the project, the deliverables could not really be used in production. Unless the software is really being used, we cannot expect authoritative feedback. The customers may be able to give us their general gut-feel and comment on functional correctness, but usability and feasibility can only be measured once the software is really actually used by people in the course of their daily business. Technical integration issues as well as usability (human-integration) issues are expected and typically not problematic to solve, but we must not let them pile up. Early feedback should allow us to solve some of those problems during the whole project, instead of finding them out on the end. </p>
<p>One more reason why deliverables should be used in production is that the customer&#8217;s business will rarely stand still during the course of the project, making the end result effectively a moving target. If the deliveries are not really used until the end of the project, then we have no idea whether they are in touch with the present business requirements. On the other hand, if the deliverables are used every day, we will know that straight away – and most likely the clients will ask for adjustments early.</p>
<h2>So how do we avoid this problem?</h2>
<p>Here are three ideas to avoid the problem:</p>
<ul>
<li>Focus on user stories, not on technical use cases</li>
<li>Plan deliveries so that they are complete in the sense that they can really be used in production</li>
<li>Divide and conquer: Split a big project into several mini-projects, and then focus on delivering those in a sequence</li>
</ul>
<h2>Focus on user stories</h2>
<p>User stories have emerged over the last several years as the preferred way of planning scope for agile projects. Focusing on user stories is a great way to split the project into parts that actually bring value to the customer, since every user story should have a clearly defined customer benefit. So planning deliverables in terms of user stories instead of technical use cases is a great first step. </p>
<p>A pitfall that we must avoid is to then batch stories based purely on technical dependencies. Although it makes perfect sense to have early deliverables provide the technical infrastructure for latter ones, and that type of dependency must be taken into consideration when planning deliverables, ordering purely based on that leads to the exact problem that we are trying to avoid. This is effectively <a href='http://gojko.net/2007/12/04/waterfall-trap/'>incremental, not iterative</a> development. </p>
<h2>Have production-worthy deliveries</h2>
<p>Instead of focusing on technical order, it is better to try plan deliveries so that every shipped version of the software can really be used in production. Although it is not always possible to adhere perfectly to this idea, it is a good general rule and we should try to keep the deliveries complete in that sense. While working on the delivery plan, just ask the clients this simple question: “pretend it&#8217;s magic and in a few months we give you these stories &mdash; would that piece of software be complete in the sense that it can actually be used in production?”. If the answer is no, go back to the drawing board.</p>
<p>Doing production-worthy deliveries several times during the project might require writing some throw-away code, but that is a small price to pay for early feedback (to programmers) and getting business benefits early (to customers). For example, several years ago I worked on a trading system that was supposed to replace excel-based trading and distribution management. One of the major problems that we were supposed to solve was optimising transport routes and providing transport plans to local centres. So our first delivery was a piece of software that allowed traders to input their trading plans (from the excel sheets), produced an optimised transport plan, and allowed them to export it back to excel. The first and third part of that delivery were thrown away later, but we got good feedback on a fairly complex part of the system and solved tons of edge cases that were not identified during initial planning. Traders were happy because this saved them a few hours of work every day, and they got that several months before the whole system was in place. </p>
<h2>Break a big project into mini-projects</h2>
<p><img src='/images/845334_russian_dolls.jpg' style="border:1px solid black; margin:5px 5px 5px 5px;" align="right" />Reg Braithwaite wrote that his <a href=”http://weblog.raganwald.com/2007/12/linus-torvalds-on-big-design-up-front.html”>Golden Hammer</a> for building software iteratively is to divide it into <a href='http://weblog.raganwald.com/2007/08/how-many-products-make-up-project.html'>separate products</a>. This makes excellent sense for building larger systems where the software will perform a lot of functions for a lot of people on the end. By dividing one single large product into smaller products we force ourselves to have cleaner interfaces and looser coupling between software components. This can allow us to develop them independently, and will also reduce the risk of the whole thing missing the target on the end. Each of those mini-products would be a deliverable, and it should be usable on its own. </p>
<p>I recently worked on a highly scalable e-commerce web site. We split the project into three separate products: an e-commerce integration platform, high-performance caching system and the actual of web site. The integration platform was delivered first, with a low-fi card processing web that was used for some 3rd party integration. It went live a year before the rest of the system, helping us flush out any problems with transaction processing. We had new requirements about this part of the system every few months, driven by the fact that people were actually using it. So when the project was close to the end, this integration platform was in touch with reality. The caching system went live next, and it was used to support a mobile content distribution application. Both the low-fi card processing site and the mobile app were not part of the initial plan, but we were able to slot them in nicely. The web site front end then built upon the foundations of those two systems that were in production for months. Thinking about the whole project in terms of separate products both helped us deliver it quicker (because we had real production feedback for parts of the system early on) and also increased the value of what we were doing (since the same components were used to support different applications and smaller projects that started after that big one). <i>Divide and conquer</i> approach paid off big.</p>
<h2>Deliveries and iterations</h2>
<p>I know that some of you, reading this, will now start to complain how iterations should be two to four weeks long and that the business problems are often larger than what can be solved in such a short period of time. I intentionally avoided using the word “iteration” in this discussion, because I do not think that every iteration needs to be delivered. </p>
<p>If an iteration result is not complete in the sense that it can really be used every day, then the iteration delivery will just sleep on the UAT servers after testers play with it for a while. To get quick feedback on such iterations, I propose giving clients access to the local integration environment and letting them play with the software there. You can avoid packaging and polishing and they do not have to update their local installations. </p>
<p>If an iteration produces software that can really be used every day, then ship it and make the clients use it. It is definitely useful to get feedback early, but having something go live, even if it causes rework or throwing away parts of software later, is much much more valuable than software that is only tested. It has more value for the customer, since they are getting a part of their problem solved earlier. It also has more value for the development of the whole project, since it brings real, authoritative feedback from everyday use.</p>
<p>Image credits: <a href="http://www.sxc.hu/profile/surely" target="_blank">Emin Ozkan</a> and <a href="http://www.sxc.hu/profile/sachyn" target="_blank">Sachin Ghodke</a>/SXC</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2008/04/28/delivering-useful-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The waterfall trap for “agile” projects</title>
		<link>http://gojko.net/2007/12/04/waterfall-trap/</link>
		<comments>http://gojko.net/2007/12/04/waterfall-trap/#comments</comments>
		<pubDate>Tue, 04 Dec 2007 17:56:46 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[incremental]]></category>
		<category><![CDATA[iterative]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[xpday]]></category>

		<guid isPermaLink="false">http://gojko.net/2007/12/04/waterfall-trap/</guid>
		<description><![CDATA[Jeff Patton from Thoughtworks held a very interesting session at XpDay last month in London, focusing on a common misconception that causes “agile” projects to fall into the same trap that the waterfall ones typically do. Incremental is not iterative Using a very interesting combination of pop music and rock...]]></description>
			<content:encoded><![CDATA[<p><img src='/images/886145_iguassu_falls.jpg' align='left' style='border:1px solid black; margin:5px 5px 5px 5px'/>Jeff Patton from Thoughtworks held a very interesting session at XpDay last month in London, focusing on a common misconception that causes “agile” projects to fall into the same trap that the waterfall ones typically do.</p>
<h2>Incremental is not iterative</h2>
<p>Using a very interesting combination of pop music and rock star images, Jeff Patton told a story of a failed agile project in his  <a href="http://www.xpday.org/keynotes" target="_blank">XpDay keynote “Embrace Uncertainty”</a>. The project started off nicely, almost by the book, with customer involvement and stories split into iterations, based on what functionality is to be delivered in what release. After they got something delivered to play with, customers changed their minds  (as they so often do) and new stories and features were introduced into the plan. After a few deliveries, the scope kept growing and growing instead of reducing. From the developer perspective everything worked as planned – customer was expanding the scope and developers are there to oblige, because that is the essence of agile practices. Spice Girl Mel B was used for the role of a developer writing user stories and losing all sight of the big picture (while &#8220;So tell me what you want, what you really really want&#8221; was playing in the background). For the customer, the thing simply did not work &#8211; iteration after iteration, they were not any closer to having the project done. <span id="more-74"></span></p>
<p>The problem was that the concept of iterating had been lost and iterations were replaced by increments – making the project fall into the same trap as waterfall projects do. Iterations were aimed to deliver blocks of functionality. Jeff demonstrated that visually using the Mona Lisa painting (powerpoint slides from the keynote have still not been released, so the pictures below are not the same ones as Jeff used, but they show the point):</p>
<table style="border:0px" align="center">
<tr>
<td></td>
<td>Delivery 1</td>
<td>Delivery 2</td>
<td>Delivery 3</td>
</tr>
<tr>
<td>Incremental plan</td>
<td valign="top"><img src='/images/ml/ml-inc1.jpg' /></td>
<td valign="top"><img src='/images/ml/ml-inc2.jpg' /></td>
<td valign="top"><img src='/images/ml/ml-full.jpg' /></td>
</tr>
<tr>
<td>Iterative plan</td>
<td><img src='/images/ml/ml-it1.jpg' /></td>
<td><img src='/images/ml/ml-it2.jpg' /></td>
<td><img src='/images/ml/ml-full.jpg' /></td>
</tr>
</table>
<p>Although both these plans aim for the same thing, the incremental plan does not really reduce the risk of delivering something unsuitable to the client. The big picture appears only at the very end. Because increments are done in detail, a lot of effort is wasted when a piece needs rework (and the initial releases are almost certain to fall into this category). Iterative development offers a chance to see the picture from the start, and guide the development towards the full picture in steps. Not carving stuff in stone from the start allows us to change them easier later on, and we know that we&#8217;ll need to do that. Jeff gave the following rule of thumb to check quickly if your plan is iterative or incremental: &#8220;it&#8217;s not iterating if you do it only once&#8221;.</p>
<h2>Dealing with uncertainty</h2>
<p>However, iterative planning is harder to sell. Stakeholders want the project delivered by a fixed date on a fixed budget, and an uncertain iterative plan does not help with that. The XpDay keynote also offered three strategies for dealing with that:</p>
<ul>
<li><i>Follow the money</i>: focus the project on business goals, not on features nor user stories. Prioritise goals before prioritising stories &#8211; that will make it easier to decide what features need to be implemented completely by when. I wrote about this subject last year (see <a href='/2006/10/22/magic-of-goals/'>The magic of goals</a>), discussing how focusing on goals makes everybody happier.</li>
<li><i>Don&#8217;t choose your solution too early</i>: defer writing user stories till last possible moment. Focus on what users need to accomplish at that moment. This is intended to allow easier rework and reduce wasted effort. Lean software development has a similar principle  &#8220;Defer Commitment&#8221;, which calls to <i>Maintain Options</i> (Think of code as an experiment – make it change-tolerant) and <i>Schedule Irreversible Decisions at the Last Responsible Moment</i> (Learn as much as possible before making irreversible decisions). See <a onClick="javascript:urchinTracker('/books/leansd');" href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&#038;tag=swingwiki-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321150783">Lean Software Development: An Agile Toolkit</a><img src="http://www.assoc-amazon.com/e/ir?t=swingwiki-20&#038;l=as2&#038;o=1&#038;a=0321150783" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> and <a onClick="javascript:urchinTracker('/books/impllean');" href="http://www.amazon.com/gp/product/0321437381?ie=UTF8&#038;tag=swingwiki-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321437381">Implementing Lean Software Development: From Concept to Cash</a><img src="http://www.assoc-amazon.com/e/ir?t=swingwiki-20&#038;l=as2&#038;o=1&#038;a=0321437381" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</li>
<li><i>Build up feature quality iteration by iteration</i>: this helps to stay within budget, deliver all features in each iteration but not necessarily all on the same level of quality. This technique is especially effective with customers that cannot prioritise features and insist on having everything delivered. Jeff discussed an example of a bus &#8211; it&#8217;s pointless to ask the client whether brakes or transmission are more important. But the good thing with software is that you don&#8217;t have to deliver everything at top quality from the start. We can first build a bus with low quality transmission and high quality brakes, then improve transmission in the next iteration.
</li>
</ul>
<p><b>Image credits</b>: <a href="http://www.sxc.hu/profile/malene_m" target="_blank">Malene M.</a>/SXC</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2007/12/04/waterfall-trap/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>The Zero-Testing Time Bomb</title>
		<link>http://gojko.net/2007/10/23/the-zero-testing-time-bomb/</link>
		<comments>http://gojko.net/2007/10/23/the-zero-testing-time-bomb/#comments</comments>
		<pubDate>Tue, 23 Oct 2007 16:13:49 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://gojko.net/2007/10/23/the-zero-testing-time-bomb/</guid>
		<description><![CDATA[Every now and then some ingenious project manager thinks of a way to deliver faster by negotiating to skip testing. At first glance, this looks like a win-win deal: customers get software faster or cheaper, as long as they “understand” that there will be problems. Developers, on the other hand,...]]></description>
			<content:encoded><![CDATA[<p><img src="/images/825748_grenade_1.jpg" style="margin:5px 5px 5px 5px; border:1px solid black;" align="left"/>Every now and then some ingenious project manager thinks of a way to deliver faster by negotiating to skip testing. At first glance, this looks like a win-win deal: customers get software faster or cheaper, as long as they “understand” that there will be problems. Developers, on the other hand, get more time to focus on new features. In reality, that is just one big lie, and a very dangerous one.<span id="more-64"></span></p>
<h2>No testing = not working</h2>
<p>The problem, like a lot of similar issues, comes from basic misunderstandings. “No testing” simply means a completely different thing to customers than it does to developers. Customers accept that there will be some bugs to be flushed out later. But they expect the system to generally work. For developers, “no testing” has a literal meaning as in zero testing &#8211; a <i>get out of jail free</i> card, which allows us to ship something as soon as it compiles.  </p>
<p>Without a doubt, this approach guarantees major problems in delivered software. Even with good unit test coverage, skipping final integration testing is a big gamble on whether the components will work together correctly. And the odds say that something will fail. I lost count of times when a system delivered without testing was not able to perform key business functions. In the eyes of developers, the problem might have been a misplaced bracket or five lines of untested code – easily fixed when spotted. Most of the code is there, so  programmers think that the <i>work was done</i>.  In the eyes of customers, such a system is completely useless. It does not matter that hundreds of thousands of lines of code were written if the damned thing breaks during a login.</p>
<div style="border:1px solid black; background-color:#eeeeee; padding:5px 5px 5px 5px; text-align:left; margin:5px 5px 5px 5px; float:right; width:300px">
<h2>Three quotes to remember</h2>
<p>
<i>Programming and testing together is faster than just programming</i> &#8212; Kent Beck, <a target="_blank" href="http://www.amazon.com/gp/product/0321278658?ie=UTF8&#038;tag=swingwiki-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321278658">Extreme Programming Explained</a><img src="http://www.assoc-amazon.com/e/ir?t=swingwiki-20&#038;l=as2&#038;o=1&#038;a=0321278658" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><i>Nobody ever remembers a late delivery, just a bad one</i> &#8212; Bruce Robinson, <a href="http://www.imdb.com/title/tt0097531/" target="_blank">How to get ahead in advertising</a></p>
<p><i>Build half a product, not a half-ass product </i> &#8212; 37 Signals, <a href="http://gettingreal.37signals.com/ch05_Half_Not_Half_Assed.php" target="_blank">Getting Real</a>
</div>
<p>“No testing” deliveries are completely pointless and should be avoided at all cost. They do no good. No buts, no exceptions. Customers will find the software unusable. Because of all the complaints that are sure to come, developers will have to jump into a panic-mode bugfixing race straight after the delivery. And, technically, that is the testing part of the project that had to be done. There will have to be a bugfix release later, so the software was not even delivered earlier. The first deployment is just a waste of time, and there are no benefits from it. Skipping testing does not speed up deliveries, it makes them even later. Kent Beck put this nicely in XP Explained: &#8220;<i>Programming and testing together is faster than just programming</i>&#8220;. </p>
<h2>Better late then crap</h2>
<p>When pressed to complete his task faster, Richard E. Grant&#8217;s character in <a href="http://www.imdb.com/title/tt0097531/" target="_blank">How to get ahead in advertising</a> has a great reply: “<i>Nobody ever remembers a late delivery, just a bad one</i>”. Being late is bad, and causes a lot of stress &#8211; especially among project managers who start looking for loopholes. But when compared to delivering crap, delivering late is definitely the lesser of two evils.  Agreeing to skip testing in order to speed up development is no better than closing our eyes and sitting on a time-bomb, waiting for it to explode.</p>
<p>When things go bad, and there is no chance to meet the deadline, the best thing to do is to split the delivery. So one part will be delivered on time, with less features. That gives customers something to play with, or even start working. The rest of the features can get delivered a bit later. In my experience, cutting the scope is  much tougher to agree on than &#8220;No testing&#8221;, but a much better way forward. As the opening paragraph of <a href="http://gettingreal.37signals.com/ch05_Half_Not_Half_Assed.php" target="_blank">chapter 5 of Getting Real</a> by 37 Signals advises: &#8220;<i>Build half a product, not a half-ass product</i>&#8220;. </p>
<p>If you find yourself in a situation to have to speed up the delivery, my advice is to sit down with customers, explain the situation, and ask them to choose top priorities from the list of unfinished tasks. Then deliver what you can, but do it properly. </p>
<p>Image credits: <a href="http://www.sxc.hu/profile/DarkSide" target="_blank">Peter Huys/SXC</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2007/10/23/the-zero-testing-time-bomb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Developers are from Magrathea, Customers are from Ursa Minor Beta</title>
		<link>http://gojko.net/2006/12/25/developers-are-from-magrathea-customers-are-from-ursa-minor-beta/</link>
		<comments>http://gojko.net/2006/12/25/developers-are-from-magrathea-customers-are-from-ursa-minor-beta/#comments</comments>
		<pubDate>Mon, 25 Dec 2006 19:37:02 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://gojko.net/2006/12/25/developers-are-from-magrathea-customers-are-from-ursa-minor-beta/</guid>
		<description><![CDATA[From the naïve view of an average enterprise software developer, the situation today is a bit insane - most customers will always choose more functionality and faster delivery over testing and documentation - not to mention GUI polishing. They will look you in the eye, tell you that they sincerely understand the software will have problems once it is live, and then come back furious when the software does not work. As if we were not all speaking the same language,  somewhere the meaning of 'it will have problems' gets lost in translation. Or maybe it's not the definition of 'problems', but the definition of 'done', or maybe developers and customers really come from different planets...<!--more-->]]></description>
			<content:encoded><![CDATA[<p><img src="/images/nasa-10063702.jpg" align="left" style="border:1px solid black; margin:5px 5px 5px 5px" />From the naïve view of an average enterprise software developer, the situation today is a bit insane. Most customers will always choose more functionality and faster delivery over testing and documentation &#8211; not to mention GUI polishing. They will look you in the eye, tell you that they sincerely understand the software will have problems once it is live, and then come back furious when the software does not work. As if we were not all speaking the same language,  somewhere the meaning of &#8216;<i>it will have problems</i>&#8216; gets lost in translation. Or maybe it&#8217;s not the definition of &#8216;<i>problems</i>&#8216;, but the definition of &#8216;<i>done</i>&#8216;<a href="#foot1"><sup>1</sup></a>, or maybe developers and customers really come from different planets. <span id="more-22"></span></p>
<p>Whatever the reason, from my experience the developers (and the development managers) are the ones who have to stop the vicious cycle &#8211; and start delivering better. We have to acknowledge that &#8216;<i>just get it done as soon as possible, and we&#8217;ll test it on production</i>&#8216; does not mean the same thing for us and for the customers. For most customers, that means that they can live with a few minor problems, but for developers this is typically a green light to shoot fireworks all around. Someone has to take the responsibility for closing this gap, and I am afraid it is not going to be the customers. </p>
<p>And &#8216;<i>I told you so</i>&#8216;, when the customer comes back unsatisfied with the delivery is not really an option &#8211; not if you want to keep them. Even if they are reasonable more than the average, and you win that argument, you will be losing much more &#8211; as your reputation will suffer. Somewhere in the back of their minds, customers will feel cheated, even if they do not say that out loud, and you just lost a credit point. </p>
<h3>Sprinting is futile if you crash</h3>
<p><img src="/images/570770_metal.jpg" align="right" style="border:1px solid black; margin:5px 5px 5px 5px"/>Sprinting to add raw, unpolished functionality almost never pays of, and it can blow up in your face. I learned this the hard way three years ago, while working on an on-line casino project<sup><a href="#foot2">2</a></sup>. We developed much faster than we initially estimated, and the software was ready for delivery before the layout design was finished.  We decided to deliver the software early, hoping to make a good impression on the clients, but the exact opposite happened &#8211; clients hated the mock-up layouts so much that they wanted to cancel the entire project. It took a lot of effort, mostly painful politics, to convince them that the project should continue. </p>
<p>As a different example, when I worked on an ERP system, we underestimated the effort required for the first iteration. There were two options: we could either deliver all the planned functions, but the software would probably be unstable and quite buggy; or, we could deliver about half of  the planned functions but polish them. The clients wanted the system up and running as soon as possible (as always), and they pressed for functionality, asking for earlier delivery even if it throws fireworks. However, knowing that it was really important to make a good first impression on a new client, we decided not to pursue the functionality, but to cut it in half and do it properly. The result was quite good &#8211; they were happy with the first cut, not so happy about the prolonged schedule, but the way the system worked and looked like gave them confidence that we knew what we were doing. Had we delivered more functionality, like they asked, I&#8217;m pretty sure that we would have lost the contract soon after the first delivery, or at least have to go through a political hell of explaining who requested what, who was warned and who acknowledged warnings. On the end, there is only one first impression &#8211; if you miss that one, it&#8217;s a lot harder to establish trust and confidence afterwards. </p>
<h3>Why bother, after all?</h3>
<p>Hmm&#8230; How to start explaining the benefits of happier customers? More work, better relationships, more money&#8230; And sometimes you might really get away with murder. Mistakes do happen, and in a long term engagement some big problem is bound to come up. That is the moment when you really need the customer to think &#8216;<i>well, these guys were pretty darn good so far, and what they suggest seems reasonable, so let&#8217;s give it a chance</i>&#8216; and not &#8216;<i>those stinking %^$&#* have gone too far, and now they want to shut down the production for 10 hours. memo to self &#8211; call the others and let&#8217;s start planning a migration on Monday</i>&#8216;. To have a lucky break, and customers&#8217; support, you need to have credibility &#8211; yet delivering unpolished software again and again slowly slices pieces of credibility from the reputation of development organisations.  Once lost, the credibility is hard to recover. Save it for the rainy days, when you will really need that &#8216;<i>get out of jail free</i>&#8216; card &#8211; don&#8217;t throw it away with unpolished releases. </p>
<h3>It&#8217;s all in prioritisation</h3>
<p>If you deliver regularly, and often, most customers will not mind too much if the project actually takes longer then initially estimated. Even if they do mind, it&#8217;s the lesser of two evils. If there is not enough time (or from a different, less fatalistic, perspective &#8211; there is too much work) it&#8217;s mostly better to deliver less, but better polished, than more, no matter what the customer will tell you in his Ursa Minor Beta language. (&#8216;Mostly&#8217; means that there are exceptions, of course &#8211; and again developers and development managers are the ones that have to recognise them). Pressing for non-realistic schedules does no good, and it can actually turn the project into a death march<a href="#foot3"><sup>3</sup></a>. Agile development techniques can help in this situation, as the client should be involved in planning. Even if you are not using agile methods for development, talk to the customers and get their priorities &#8211; most of the time they will be happy to get high-priority features now and get the rest a bit later, if it all works good and their goals are met<a href="#foot4"><sup>4</sup></a>. I&#8217;ll borrow a quote from Getting Real<a href="#foot5"><sup>5</sup></a>: <i>It&#8217;s better to make half a product than a half-assed product</i>.</p>
<h3>Finishing touches</h3>
<p><img src="/images/468681_finishing.jpg" align="left" style="border: 1px solid black; margin:5px 5px 5px 5px"/><i>No fireworks on production</i>:<br />
The software must not scare users by crashing, or printing stack traces and raw SQL errors &#8211; it&#8217;s much better to deliver less functionality but properly polished than more functionality that blows up. From my experience, the first option tells the customer that the project might be more complex than initially expected, but the second gives them the impression that developers are incompetent since the software crashes.</p>
<p><i>No mock-up layouts</i>:<br />
Avoid showing mock-up layouts, especially if the layout is an important part of the customer experience. On the end, users only see the user interface, so it better be good.</p>
<p><i>Check positive branch manually</i>:<br />
Automated testing is great, but sometimes it can blind you. Make sure that the basic functionality of the system (at least the positive branch) works and looks OK from the GUI &#8211; check it by hand and with your own eyes.</p>
<p><i>No surprises</i>:<br />
User interface should behave, as much as possible, like standard applications. There are, of course, exceptions when an innovative user interface is the main selling point of the product &#8211; but most of the time a standard interface will do much better.</p>
<p><i>Automate installation and upgrades</i>:<br />
Build an automated installer, which will make sure that everything is done properly, and not require clients to manually copy and edit files. My favourite bad example is the web upgrade where the developer just sent some files along with a note &#8216;<i>Please remember to configure all the parameters like we talked about over the last few weeks</i>&#8216;. The automated installer will make the client happier, and reduce support problems. It does not matter if your clients are technical enough to install everything by hand &#8211; they will be happier to just run a script. Creating a simple installation script will take you 30 minutes, and your clients will surely appreciate that. Nullsoft Installer<a href="#foot6"><sup>6</sup></a> is a great free tool for building automated installers, if you do not have the budget for commercial tools.</p>
<p><i>Provide documentation</i>:<br />
Release notes, a simple HTML-based help system and supporting documentation add a more serious note to the software, and should be prepared for anything except the most trivial projects. Even if everything is plainly clear and the system is intuitive (which it should be), these documents will make your team look more professional. It&#8217;s the same difference as the one between sending a letter printed on a plain paper or on a letter-headed one.</p>
<h3>Footnotes</h3>
<ol>
<li><a name="foot1">Ken</a> Schwaber explains various meanings of a &#8216;<i>project being done</i>&#8216; in the presentation <a href="http://www.infoq.com/presentations/agile-quality-canary-coalmine" target="blank">A Canary in a Coal Mine</a></li>
<li><a name="foot2">My</a> post-project conclusions about the on-line casino are described in the post  <a href="http://gojko.net/2006/09/29/joys-and-perils-of-mass-market-java-games/">Joys and Perils of Mass-Market Java Games</a></li>
<li><a name="foot3">see</a>  Edward Yourdon&#8217;s excellent book on  <a href="http://gojko.net/2006/12/04/death-march/">Death March</a> projects</li>
<li><a name="foot4">see</a> <a href="http://gojko.net/2006/10/22/magic-of-goals/">The magic of Goals, Focused Projects and Better Requirements</a></li>
<li><a name="foot5">see</a>  <a href="http://gettingreal.37signals.com/ch02_Fix_Time_and_Budget_Flex_Scope.php" target="_blank">Fix Time and Budget, Flex Scope</a> from Getting Real</li>
<li><a name="foot6">see</a>  <a href="http://nsis.sourceforge.net/Main_Page" target="_blank">NSIS</a> Project on Sourceforge</li>
</ol>
<p>Image credits: <a href="http://www.sxc.hu/profile/wax115" target="_blank">Wax115/SXC</a>, <a href="http://www.sxc.hu/profile/kavitha" target="_blank">Kavitha/SXC</a>, <a href="http://gimp-savvy.com/cgi-bin/img.cgi?nasajeK9gnW6V1U1507" target="_blank">Nasa/GIMP Savvy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2006/12/25/developers-are-from-magrathea-customers-are-from-ursa-minor-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

