<?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>Digital Dim Sum &#187; computing</title>
	<atom:link href="http://www.digitaldimsum.co.uk/category/computing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.digitaldimsum.co.uk</link>
	<description>Bite sized info snacks for the digital generation</description>
	<lastBuildDate>Thu, 03 Feb 2011 22:16:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Dealing with creaky legacy platforms</title>
		<link>http://www.digitaldimsum.co.uk/2011/02/03/dealing-with-creaky-legacy-platforms/</link>
		<comments>http://www.digitaldimsum.co.uk/2011/02/03/dealing-with-creaky-legacy-platforms/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 20:10:44 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[visualisation]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=79</guid>
		<description><![CDATA[<p>The following article, written by myself and my colleague, Matt Simons, <a href="http://www.cutter.com/offers/legacymod.html">was published</a> in the December 2010 issue of the <a href="http://www.cutter.com/itjournal.html">Cutter IT Journal</a> and is re-produced here with kind permission. It was also the subject of a <a href="http://www.thoughtworks.com/tackling-legacy-technology">talk we delivered in Santa Clara</a> in September.</p>
<h2>The landscape is changing</h2>
<p>Since the dawn of the software era, systems have generally followed a lifecycle of develop/operate/replace. For the type of systems our company, ThoughtWorks, specializes in (typically built over the past 10-15 years), organizations expect as much as 5-10 years between significant investments in modernization. And some of the oldest core systems have now reached 40+ years — far longer than the average life-span of most companies today!</p>
<p>IT assets are relatively long-lived largely because modernization often represents a significant investment that doesn’t deliver new business value in a form that is very visible to managers or customers. Therefore organizations put off that investment until the case for change becomes overwhelming. Instead, they extend and modify their increasingly creaky platforms by adding features and making updates to (more or less) meet business needs.</p>
<p>For decades, this tension between investing in modernization versus making incremental enhancements has played out across technology-enabled businesses. Every year some companies take the plunge and modernize a core system or two, while others opt to put yet another layer of lipstick on the pig.<br />
<!--more--><br />
We see this pattern being disrupted as the demands being placed on legacy systems undergo a fundamental shift. Previously, system changes were driven by business requests for incremental features, and IT had to deal with a major new technology platform or architecture only every five years or so. Today, the viable lifespan of any business model is shrinking, driving demand for wholesale feature changes on a nearly continuous basis. For many of these new features, the benefits of leveraging one of the ever-expanding varieties of new architectures and platforms are significant. For example, your current infrastructure was probably not designed to enable you to connect your supply chain directly to an e-commerce channel or provide customer self-service via mobile devices. Sure, you may be able to force that square peg into your round hole, but the chances of an elegant, extensible solution are slim.</p>
<p>The “lifecycle model” of software systems is becoming irrelevant. The companies that will excel in the future will be the ones that learn to incrementally modernize and then continuously evolve their core technology assets to thrive in an ever-more volatile business and technology environment.</p>
<h2>The first step is admitting you have a problem</h2>
<p>Organizations that are constrained by creaky platforms are often slow to identify this as the root cause of their trouble. Instead, as release cycles grow longer and delivery quality declines, fingers get pointed at IT or<br />
at product/service vendors who are getting bogged down trying to work around the underlying problems caused by mounting technical debt in a toxic systems environment.</p>
<p>Figure 1 illustrates some key indicators of an underlying creaky platform, grouped according to whether they are felt more acutely by business or IT stakeholders and by whether they are intuitive or measurable. As you look through the factors, keep in mind that none of these should be considered “normal” or something that “comes with the territory” in IT. In fact, there are organizations out there operating in complex and volatile enterprise environments that do not experience any of these problems.</p>
<p><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2011/02/signs-of-a-creaky-platform.png" title="Signs of a creaky platform" width="504" height="378" class="alignnone size-full wp-image-98" /><br />
<strong>Figure 1 — Signs of a creaky platform.</strong></p>
<p>We have often found that the intuitive factors manifest themselves in advance of the measurable factors. These can therefore be considered leading indicators that, should they appear, signal you to dig a bit deeper into your underlying technology infrastructure.</p>
<p>When evaluating a complex situation, organizations typically respond well to logical, fact-based arguments supported by quantitative data. So, as you consider whether you need to make a case to modernize, you should apply some measurements to areas of intuitive pain. There are different techniques for quantifying business and IT pain.</p>
<h3>Quantifying business pain</h3>
<p>Many of the business pain items in Figure 1 are straightforward to measure and don’t require special techniques. Simple counts of bugs, feature backlogs, and release frequencies help quantify the business impact<br />
of an underlying creaky platform. These items are especially effective when presented as trends over time versus point-in-time readouts.</p>
<p>However, one common type of business pain — cumbersome business processes — benefits from a more structured quantitative approach. There are many ways to do this, but one of the best is a technique from lean thinking called value stream analysis.1 This approach analyzes customer value–producing processes and identifies areas of waste. Measuring waste provides a powerful quantification of the business impact of cumbersome processes.</p>
<h3>Quantifying IT pain</h3>
<p><a href="http://www.martinfowler.com/bliki/TechnicalDebt.html">Technical debt</a> is the phrase used to summarize the pain caused by the cumulative effect of all the tactical, short-term, “band-aid” solutions we use on IT projects. Just as in life, where it often makes sense to take on debt, at times it makes sense to go into technical debt in order to reach certain delivery milestones. Organizations that take a conscious decision to increase technical debt are usually sophisticated enough to plan to pay it down over time once the short-term objective has been reached. The problem is that technical debt is often built up unconsciously and, like a runaway credit card account, <a href="http://www.alphaitjournal.com/2008/07/cross-technical-balance-sheet-part-i.html">reaches a point where it becomes very difficult to bring the balance down</a>.</p>
<p>Organizations often unwittingly amass technical debt because the major metrics managers have access to and are measured against are scope and budget-based and rarely include intrinsic quality metrics. The challenge is finding ways to balance these velocity-based metrics with quality metrics that can highlight the hidden cost of the continual tradeoffs that are made.</p>
<p>More objective measures of software quality do exist and can be used to track and control technical debt. Individually, none gives the whole picture, but together they begin to tell a cogent story. These metrics fall into three broad categories:</p>
<ul>
<li>Static code analysis (<a href="http://javancss.codehaus.org/">complexity</a>, <a href="http://pmd.sourceforge.net/cpd.html">duplication</a>, <a href="http://www.headwaysoftware.com/">cohesion, tangling</a>, etc.),</li>
<li>Rule violations/programming errors (which can be identified using <a href="http://checkstyle.sourceforge.net/">Checkstyle</a>, <a href="http://findbugs.sourceforge.net/">FindBugs</a>, <a href="http://pmd.sourceforge.net/">PMD</a>, etc</li>
<li>Test quality (<a href="http://emma.sourceforge.net/">coverage</a>)</li>
</ul>
<p>Later in this article, we highlight some techniques for using metrics to drive remediation efforts, but when attempting to quantify technical debt, we have found it helpful to compare metrics against a set of well-known applications. Benchmarking a bundle of metrics against a few open source and internal projects of varying, but known, quality provides a clear comparative view of an application’s quality.</p>
<h2>Sounding the call to action</h2>
<p>Having decided that a system needs to be modernized, you need to get money to do it. With many priorities competing for funding, spending on legacy systems can be a tough sell. In our experience, timing is everything, and specific situations or events can open the door to modernization:</p>
<ul>
<li><strong>New leader</strong>. Often new executives look to make their mark with a major initiative, and businesses give them leeway to do so. New people are also not vested in relationships and decisions made before their time, giving them more freedom to consider alternatives.</li>
<li><strong>New rules</strong>. New regulations or standards create non-negotiable drivers to update legacy systems. Depending on the scale of change, this may present an opportunity to make a case to deliver the change on a modernized platform as opposed to modifying the existing one.</li>
<li><strong>Business crisis</strong>. Most businesses respond assertively to threats and crises. One of our customers enjoyed years of a near monopoly, despite a core creaky platform that caused them to consistently underdeliver against their product roadmap. The impetus for modernizing that platform came when a major customer<br />
left for a competitor because it had lost faith in the roadmap.</li>
<li><strong>Opportunities lost</strong>. Losing prospective new customers because of the application’s defects and apparent age is a powerful motivator for modernizing a creaky platform.</li>
<li><strong>New strategy</strong>. Aligning modernization with a key business strategy is wise. For example, we worked with an organization that ran an ad-driven community Web site. When business leaders decided to sell that Web site as a reskinnable platform to multiple customers, the development team made a successful argument to invest in modernizing the site.</li>
<li><strong>Technology breakthrough</strong>. Sometimes a new development in technology changes the economics of remediation or creates a new source of return on that investment. Thinking through the applications of new technology to your remediation efforts is worth the time.</li>
</ul>
<h2>IT-business collaboration is critical</h2>
<p>Too many organizations make a fundamental error by approaching modernization as an IT-only problem. In so doing, they miss an opportunity to create new business value. They also tend to prioritize the work from a technical perspective, which often results in a quite different approach and solution than one created collaboratively with business stakeholders.</p>
<p>The perils of the IT-only approach were brought home to us during a consulting engagement in which the IT department of an investment bank asked us to validate their modernization roadmap. The roadmap was a plan to replace 29 systems over almost five years, resulting in a cutting-edge IT infrastructure. One of the first things we did was to ask key business stakeholders if the roadmap was aligned with their priorities. We were shocked to discover they weren’t even aware of the initiative. They were very concerned that by proceeding without business input, IT was likely to just rebuild all the redundant and inappropriate systems the business was struggling with, warts and all.</p>
<p>This is an extreme case, but it happens more frequently than you might expect. Fortunately, this story has a happy ending. We were able to broker a conversation between IT and the business that resulted in a major rationalization of the application portfolio and delivered a leaner, better-performing system much more quickly than the initial roadmap. The most successful modernization efforts are jointly planned and executed to deliver against IT and business priorities, incrementally evolving toward a better state for all stakeholders.</p>
<h2>Deciding how to proceed</h2>
<p>Once you’ve got your funding, you are faced with a decision about how to proceed. The two primary dimensions to consider are refactoring versus rewriting and “big bang” versus incremental. A rewrite can recreate exact feature parity with the existing application, just implemented in a new technology, or it can include redesigning the functionality. Despite the added complexity in testing, we strongly recommend taking the opportunity to identify what functionality is still really needed by the business. The keys to success in this scenario are:</p>
<ul>
<li>Working in tight coordination with the business and end users to gain constant verification of fitness for purpose</li>
<li>Working in very small increments that can be fully validated and vetted</li>
<li>Keeping the existing application in place to retain all existing functionality in other areas</li>
</ul>
<h3>Refactoring vs. Rewriting</h3>
<p>Our general advice is, where possible, to look first at incremental refactoring. Good development practices should always include a refactoring phase when each new feature is added to maintain a simple, elegant, and well-factored design.<br />
We find refactoring is best performed incrementally. Executing a large-scale refactoring exercise in isolation from the main code line (i.e., on a separate branch) should be considered dangerous. The key to a successful refactoring effort is doing it hand in hand with your normal project or production support team, integrating as you go.</p>
<p>If an application has deteriorated to such an extent that refactoring efforts are too big or painful to countenance, then you are faced with a total rewrite. Again there is a choice between big bang and incremental approaches.</p>
<h3>Big Bang vs. Incremental</h3>
<p>Replacing an application in a big bang is rarely our recommended strategy. Attempting to create feature parity with the legacy application extends timelines to the point that requirements are likely to have changed significantly between design and final delivery. Without feedback from live usage, it is likely the new version won’t meet all the business needs. The risk of the final cutover is also large, since the new application has yet to be battle-tested in production and a full data migration will be required.</p>
<p>Our preferred approach is a phased, incremental strategy. Though this may seem counterintuitive given the extra effort required to work around the existing application, our experience has shown that this minor cost is heavily outweighed by the reduced risk of the migration, the fitness for purpose of the resulting application, and the decreased disruption posed by the overall process.</p>
<p>Many business justifications for replacing an application include claims that the new application will be more “extensible.” There is a false premise that extensibility comes from up-front design activities that define modules, extension points, XML configuration, and the like. Our firm belief is that the best way to end up with an extensible platform is to extend it as you go. If you build your application incrementally, there is a good chance that you will make it extensible, particularly if you put in place the practices and patterns required<br />
to extend an application continuously, such as automated testing and simple modular design. Incremental approaches tend to increase the likelihood that your application will support ongoing extension.<br />
The real challenge, then, is effectively performing an incremental rewrite of an application. We have some recommended methods and advice on approach and coordination.</p>
<h2>Using metrics and visualization to drive remediation</h2>
<p>Technical debt, <a href="http://www.m3p.co.uk/blog/2010/07/23/bad-code-isnt-technical-debt-its-an-unhedged-call-option/">just like its financial cousin</a>, has the nasty habit of compounding. If you don’t pay it down regularly, then the ultimate recourse is declaring bankruptcy and reaching for the rewrite. The problem with the code metrics tools we mentioned earlier is that they tend to provide too much information to drive actionable remediation decisions. I remember attempting to run Checkstyle across a Fortune 500 client’s code base, and the program core-dumped before completing! In contrast, correlation and visualization are two particularly useful techniques for obtaining a holistic overview of the health of a system and also directing remediation activities.</p>
<h3>Correlation</h3>
<p>When one client was struggling to make an impact on their technical debt, we helped them by correlating multiple metrics to direct their remediation activities on the highest-priority problem areas. Our premise was that if an area was complex but rarely touched, then it was less dangerous than one that was under heavy development. Likewise, a complex area covered with good automated testing is less critical than a similar one with no test coverage. Following this thinking, we created an aggregated risk metric that correlates complexity, test coverage, and volatility. Volatility was defined as a function of source control commit activity on the area of code — frequent activity indicated high volatility. This definition allowed us to pinpoint a small set of high-risk areas to address first; in a haystack of millions of lines of code, it called out a few very specific places to begin refactoring and rationalizing.</p>
<h3>Visualization</h3>
<p><a href="http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/">Toxicity</a>, another aggregated metric, has been playing a prominent role in our “system health checks” at ThoughtWorks. Toxicity charts stack multiple static analysis metrics for classes, methods, or components within an application, providing a combined “toxicity” score for each area of the code base (see Figure 2). This gives our clients guidance on where to start looking to fix problems.</p>
<p><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2011/02/toxicity.png" alt="" title="toxicity chart" width="353" height="224" class="alignnone size-full wp-image-99" /><br />
<strong>Figure 2 &#8211; Toxicity chart</strong></p>
<p>Using visualization in this way allows us to avoid drowning in a sea of data. The human visual cortex is much more efficient at complex pattern recognition than most programs we could write, so it makes sense to leverage that capability.</p>
<p>The basic stacked bar chart used for toxicity is a good start, but if you want to correlate multiple variables, then tree maps are a powerful tool in that their combination of size, location, and color allows you to overlay more complex information onto a single image (see Figure 3). The nested nature of the visualization maps well onto the hierarchical nature of most code bases; color and size are then used to aggregate other metrics such as lines of code, complexity, or coverage. Again, this provides a single-shot overview of health as well as forensic information on where to look for the smoking gun.</p>
<p><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2011/02/treemap.png" alt="" title="treemap" width="353" height="265" class="alignnone size-full wp-image-100" /><br />
<strong>Figure 3 &#8211; Treemap of code complexity</strong></p>
<p><a href="http://www.panopticode.org/gallery/index.html">Tree maps</a> show how the code is organized into packages and classes and visualizes their relative sizes. The size of the various rectangles represents the size of the class files and the encompassing packages. Coloring is then used to layer on an extra metric of interest — in this case, complexity.</p>
<p>Taking this technique one step further, a three-dimensional visualization called a “<a href="http://www.inf.usi.ch/phd/wettel/codecity.html">code city</a>” gives a real feel for the personality of the different neighborhoods in a code base (see Figure 4). This view of an application as a city supports the analogy that you need to pair program when the code base is so dangerous that you’re afraid to go in alone. A code city visualization is similar to a tree map (see above) but uses the third dimension to overlay an extra metric to correlate. An ideal combination is correlating complexity to test coverage. So, if the visualization maps lines of code to area, complexity to height, and test coverage to color, then a neighborhood containing large, tall, red buildings would represent an area of the code base that contains large, highly complex, and untested classes. Clearly this would be an area in which you would want to proceed with extreme caution.</p>
<p><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2011/02/code-city.png" alt="" title="code-city" width="350" height="232" class="alignnone size-full wp-image-101" /><br />
<strong>Figure 4 &#8211; CodeCity visualization</strong></p>
<p>As helpful as they are, automated metrics are only part of the story in avoiding technical debt. Code has to communicate effectively with both computer and human audiences. Automated functional and unit tests can tell you how well the code communicates with computers by verifying the expected behavior. However, automated metrics can only hint at how well the code communicates with humans. Human involvement is ultimately needed in the evaluation of any code base. We prefer doing this in real time through pair programming, though code reviews and other techniques can provide similar benefits. Remember: metrics should be the beginning not the end of the conversation.</p>
<h2>How to replace your legacy application</h2>
<h3>Team Considerations</h3>
<p>Before embarking on replacing an application, it is worth taking stock of your existing organization. <a href="http://en.wikipedia.org/wiki/Conway's_Law">Conway’s Law</a> states that the architecture of an application will come to mirror the communication patterns of the organization that created it. This can be summarized as “Dysfunctional organizations tend to create dysfunctional applications.” To paraphrase Einstein, you can’t fix a problem from within the same mindset that created it, so it is often worth investigating whether restructuring your organization or team would prevent the new application from displaying all the same structural dysfunctions as the original. In what could be termed an “inverse Conway maneuver,” you may want to begin by breaking down silos that constrain the team’s ability to collaborate effectively. Of course there are many situations where this may not be realistic, but remember that Conway’s Law talks of the “communication structures” of an organization rather than reporting structures. There are often opportunities to improve communication pathways in lightweight ways without having to grapple with thornier organizational issues.</p>
<p>A set of recurring themes emerges from teams that have successfully executed incremental application rewrites:</p>
<ul>
<li>Working on the main code line (or trunk) is vital to avoiding painful merges or missing important improvements occurring in the underlying application.</li>
<li>Having the team (at least partially) populated with people who have lived with the pain of the existing application and have a deep understanding of the subtleties of the business and technology domain<br />
is key in shaping the new product to meet the business’s needs.</li>
<li>Creating a small, colocated team is also recommended, as is having a clear and focused charter of the business need that each phase of the project is delivering.</li>
<li>Practicing and executing data migrations is best done from the outset of the project while it is still a tractable problem.</li>
</ul>
<h3>Technical Approach</h3>
<p>A favored approach for incrementally replacing a live application is the so-called “<a href="http://www.martinfowler.com/bliki/StranglerApplication.html">strangler application</a>” named after the family of tropical strangler figs. These plants grow quickly around an existing tree, using its existing structure for support and shape. Over time they thicken and fuse, completely surrounding and replacing the original tree, leaving a new version standing in its place as the old one withers and dies. The <a href="http://skizz.biz/blog/an-agile-approach-to-a-legacy-system/">strangler application</a> uses the same approach of creating a thin wrapper around an existing application, then gradually peeling or slicing off and replacing functionality. Features are gradually migrated from the legacy to the new application until nothing of value remains in the old, enabling a graceful retirement.</p>
<p>Common patterns include:</p>
<ul>
<li><strong>Intercepting requests</strong> at the front of an application, then redirecting certain ones to the legacy application and others to the new application</li>
<li>Sharing a single <strong>integration database</strong> or regularly trawling the old database to populate the new one</li>
<li>Peeling back the application vertically <strong>tier by tier</strong> (maybe replacing the database, presentation layer, or business logic first)</li>
<li><strong>Intercepting events</strong></li>
<li>Some combination of the above</li>
</ul>
<p><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2011/02/strangler-pics.png" alt="" title="Strangler application steps" width="500" height="750" class="alignnone size-full wp-image-115" /><br />
<strong>Figure 5 &#8211; A basic &#8220;strangler application&#8221; sequence</strong></p>
<p>Most of these patterns involve creating an extra piece of infrastructure, such as an indirection layer or a polling system, which may appear to be wasted effort. Interestingly, we regularly find that the strategies required to enable a gradual migration often prove to be valuable long-term architectural buffering devices that both provide resilience during system upgrades or outages and offer the seams needed for future enhancements. An example of this was when we provided a major ISP a mechanism to replace their application stack incrementally by separating the system that captures new client orders from the system that processes them. Later on this separation proved invaluable in enabling them to continue taking orders even while their main order processing system was down for maintenance.</p>
<h2>Breaking the cycle of pain</h2>
<p>The recommendations here provide suggestions for how to modernize, but that is only half the battle. To really elevate your enterprise to the next level, you need to break the modernization-degradation cycle permanently. Fortunately, the tools and approaches that help you incrementally modernize are exactly the same ones that can eliminate the need to ever do it again:</p>
<ul>
<li>By using sophisticated <strong>automated metrics</strong> to continuously identify degrading areas of your system, you can strike a better balance between incremental remediation and adding new features going forward.</li>
<li>By practicing an incremental, <strong>evolutionary approach to architecture</strong> (called a “strangler” in the context of remediation efforts, but just “evolutionary architecture” outside that context), you can avoid the need to embark on big-bang replacements.</li>
<li>By continuing to <strong>add tests</strong> at the same rate as you add new functionality, you can create a hygienic technical environment that gives you the confidence to make significant architecture or technology changes when a new business requirement necessitates them.</li>
</ul>
<p>Organizations that continue to think “system lifecycle” will, in the long run, lose ground to those that think “system evolution.” If you’re about to invest in a modernization effort, why not do so in a way that positions you for a fundamentally different future?</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2011/02/03/dealing-with-creaky-legacy-platforms/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Agile project tracking with burn-up charts</title>
		<link>http://www.digitaldimsum.co.uk/2011/02/01/agile-project-tracking-with-burn-up-charts/</link>
		<comments>http://www.digitaldimsum.co.uk/2011/02/01/agile-project-tracking-with-burn-up-charts/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 04:53:33 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[Project management]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=87</guid>
		<description><![CDATA[<p>I was reminded today of a presentation I&#8217;d put together to help project managers who are new to Agile understand how to use the ubiquitous &#8220;burn-up&#8221; or &#8220;burn-down&#8221; chart. Since some people seemed to like it I thought I&#8217;d share it with a wider audience.</p>
<div style="width:425px" id="__ss_6782513"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/jonnyleroy/agile-project-tracking-burn-up-charts" title="Agile project tracking - burn up charts">Agile project tracking &#8211; burn up charts</a></strong><object id="__sse6782513" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agileprojecttracking-burnupcharts-110201224318-phpapp02&#038;stripped_title=agile-project-tracking-burn-up-charts&#038;userName=jonnyleroy" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6782513" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agileprojecttracking-burnupcharts-110201224318-phpapp02&#038;stripped_title=agile-project-tracking-burn-up-charts&#038;userName=jonnyleroy" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2011/02/01/agile-project-tracking-with-burn-up-charts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Change your attitude and the process will follow</title>
		<link>http://www.digitaldimsum.co.uk/2009/06/23/change-your-attitude-and-the-process-will-follow/</link>
		<comments>http://www.digitaldimsum.co.uk/2009/06/23/change-your-attitude-and-the-process-will-follow/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 15:44:23 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[computing]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=50</guid>
		<description><![CDATA[<p>Adopting a new development methodology is less about process change and more about attitude change. The binder is useful, but the mindset is vital.</p>
<p>Much of my work over the last few years has involved <a title="ThoughtWorks OT" href="http://www.thoughtworks.com/what-we-do/organizational-transformation.html">helping organizations &#8220;adopt&#8221; Agile</a>. It is, after all, a poor, unloved orphan and needs to find a good home. The key to whether the new approach sticks doesn&#8217;t seem to be affected by how many checklists, process maps or charts of roles and responsibilities we provide; what matters is whether an organization can adjust their collective and individual attitudes.</p>
<p>There&#8217;s a great quote from the 14th Dalai Lama that says:</p>
<p><em>&#8220;<span class="short">If you don’t like what’s happening in your life, change your mind.&#8221;</span></em></p>
<p>Beyond the double meaning of &#8220;if you don&#8217;t like it, decide to like it&#8221; is the more important idea that to change your behaviors you need to change your thoughts.</p>
<p><!--more--></p>
<p>So that may just seem like good, Gandhi-esque, &#8220;be the change you want to see in the world&#8221; platitudes. The real question is how can you help an organization shift its attitude from a <a href="http://en.wikipedia.org/wiki/Theory_X_and_theory_Y">Theory X to a Theory Y</a> approach to management? Two things that I&#8217;ve found to help are words and actions &#8230;</p>
<h3>Words</h3>
<p>The language we use is a direct pathway into our minds &#8211; shift your language and your mind will follow. A change in words can facilitate a change in attitude. One clear example of this I noticed was around the use of the word &#8220;requirements&#8221;. I agree with Steve Yegge&#8217;s insight that <a href="http://steve-yegge.blogspot.com/2008/08/business-requirements-are-bullshit.html">gathering requirements is wrong-headed</a> to start with (and I love his take on the elevator pitch), but what I&#8217;m interested with here is how the word itself is used and the connotations attached to it.</p>
<p>&#8220;Requirements&#8221; is a weapon word if ever I&#8217;ve heard one, particularly when used with the phrase &#8220;sign off&#8221;. Requirements are all about ordering people to do things: &#8220;I demand that you do this. Exactly this. Nothing more and nothing less. I require it!&#8221; Requirements brook no discussion and allow no room for invention. More importantly requirements stem from a combative view of relations between development teams and their customers. Signing off on requirements is all about taking a legalistic, defensive approach to covering your behind should things go awry further down the line, which they almost certainly will if you take a combative and legalistic approach to interacting with a development team.</p>
<p>If, however, you shift an organization&#8217;s language to talk, not about signing off on requirements, but rather about agreeing on goals, then you begin to shift from a combative to a collaborative mode of engaging. The change in mindset is two-fold: there&#8217;s a flip from saying &#8220;<em>I</em>&#8221; require this of &#8220;<em>you</em>&#8221; to saying &#8220;<em>we</em>&#8221; share these goals; and there&#8217;s also an expansion from the narrowing, closed, nature of requirements to the broadening and open nature of goals. A simple shift in words helps drive the evolution from defensive and hostile relationships, premised on a lack of trust, to open and collaborative interactions rooted in a sense of common purpose.</p>
<p>Just look at the language in the phrase &#8220;<em>requirements capture</em>&#8220;. What does that tell you about how requirements are handled? Once captured are they covered by the Geneva Convention or are they still considered enemy combatants?  So when it comes to planning a project, decide whether you prefer white-boarding or water-boarding sessions.</p>
<p>You can witness similar shifts by focusing less on &#8220;<em>sign-off</em>&#8221; and more on &#8220;<em>feedback</em>&#8220;. If you get the right feedback in place early on, then final sign-off becomes a mere formality, but if you miss out on the feedback then sign-off becomes a painful and costly hurdle.</p>
<p>So that&#8217;s an example of how words can help shift attitudes, what about actions?</p>
<h3>Actions</h3>
<p>I know of nothing more soul-destroying than sitting in a darkened meeting room while a group of people watch someone update a spreadsheet or a webapp on an overhead projector. You can feel the life and energy vacate the room as people&#8217;s attention shifts from the task at hand to suggesting keyboard-shortcuts to make the process easier or just focusing on ways to keep their eyelids open.</p>
<p>I&#8217;ve found that a different approach can really help foster a sense of team as you&#8217;re making a plan. It&#8217;s all about physically engaging the whole team. Here&#8217;s how it goes:</p>
<ul>
<li> Print or write out your stories / tasks / goals onto index cards, post-its, whatever you have at hand,</li>
<li>Lay them out on a large table,</li>
<li>Get the whole team around the table,</li>
<li>Ask them to move the cards into the order in which they want to tackle them,</li>
<li>Stand back.</li>
</ul>
<p>It takes some teams a little while to get going &#8211; some people might be waiting for the boss to tell them the order, other people might be reticent or sceptical and someone else will be muttering about Gantt charts and resource leveling &#8211; but once someone takes the lead and starts moving cards around, a debate immediately ensues. Hands start leaping in, cards get grouped and moved and the volume rises. Then the table gets crowded, new cards get created, existing cards get rewritten, fierce debates erupt over moving a card a few millimeters to the left or right and a plan starts to take shape.</p>
<p>And it&#8217;s not just any plan, it&#8217;s a plan that the whole team has collaborated over, buys into and understands. It&#8217;s also, crucially, a living plan. Not an untouchable plan that is set in stone and can only be updated by the project manager with multiple sign-off from all stakeholder committees. This is important because we all know that <a title="Helmuth von Moltke" href="http://en.wikipedia.org/wiki/Helmuth_von_Moltke_the_Elder">no plan survives first contact with reality</a>.</p>
<p>There are various subtleties to this style of group interaction for a planning session. The subtle movement and grouping of tasks that you can achieve is much more nuanced and multi-layered than in a gantt chart or spreadsheet. Also since no one is &#8220;driving&#8221; and controlling the mouse the plan that emerges is truly collaborative; the whole team has had an unmediated impact on the outcome. To me, though, the real key is what we&#8217;ve learned from the <a href="http://www.youtube.com/watch?v=dTjuWdy0pgA">Wii</a> and the group-hug: we are physical, social, creatures and we are most engaged and effective when we embrace that physicality and stand up, roll up our sleeves and get stuck in. If we are just using our eyes and our mouse finger we&#8217;re literally not firing on all cylinders.</p>
<p>This is the very reason that approaches like Agile and XP favor stand-ups and huddles, white-board sessions and team walks &#8211; start acting like a team and you might actually become a team.</p>
<p>&#8220;But what about distributed teams?&#8221; I hear you cry. Good question, we&#8217;re all out-sourced and off-shored now, so how can we leverage this full-contact planning style?</p>
<p>Have you ever noticed how much teamwork sucks across distributed teams? I think that&#8217;s largely because it&#8217;s nearly impossible to engender the same sense of team as you can when people sit next to each other, eat together and go out together after work. This will need to be the subject of another post, but the bottom line is that, even though telepresence technologies and collaboration tools can help, your teams will be much more effective if they take into account geographic realities. Enable each group in each location to own their own plan, where possible allow them to form their own teams.</p>
<p>In fact the key is to set goals rather than requirements, focus on early feedback over final sign-off and above all persuade the team to STAND UP!</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2009/06/23/change-your-attitude-and-the-process-will-follow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t push requirements &#8211; pull information</title>
		<link>http://www.digitaldimsum.co.uk/2008/09/20/dont-push-requirements-pull-information/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/09/20/dont-push-requirements-pull-information/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 00:38:34 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[build]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[philosophy]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=47</guid>
		<description><![CDATA[<p>I always struggled to see how what <a href="http://dannorth.net/2008/06/learning-to-lean">Lean teaches us</a> about <a title="Richard Durnall on pull systems" href="http://www.richarddurnall.com/?p=15">pull systems</a> can be applied to software development processes. That was until I had an &#8220;Aha!&#8221; moment a little while ago helping a client apply lean and agile principles to their delivery process.</p>
<h3>The big fat lie</h3>
<p>I understand how queuing theory can help identify and reduce bottlenecks in processes and have used <a href="http://epistemologic.com/2007/10/02/lean-software-development-how-to-find-bottlenecks-metrics-that-matter/">finger-charts </a>and <a href="http://www.infoq.com/articles/hiranabe-lean-agile-kanban">kanban-boards</a> to do this for a while, but I still find calling this a &#8220;pull system&#8221; to be slightly disingenuous. All that&#8217;s happening is that more &#8220;stuff&#8221; is being pushed based on a trigger when certain buckets get too low. This reminds me of my annoyance with early technologies on the web that were touted as being &#8220;push&#8221; but were really just &#8220;repetitive-pull&#8221; (but not in a good way). I&#8217;ve never seen a software organization where the developers have said to the business or product people &#8220;we&#8217;ve got nothing to do, can you think up some new projects or features for us please?&#8221;.</p>
<p><!--more--></p>
<p>My objection was always that even though looking at a software delivery process as a pull system was vaguely useful for debugging some process bottlenecks, it was a fundamentally incorrect way of characterizing what was really going on. It&#8217;s just not true that features or stories are <em>pulled </em>down through the <a href="http://studios.thoughtworks.com/2008/4/30/deployment-pipelines-revolutionizing-release-management">analyze-develop-test-build-deploy-not-necessarily-in-that-order</a> <a href="http://www.juliansimpson.org/2007/07/pipeline-of-doom.html">pipeline</a> by the customer or even by a release manager; they are pushed down that pipe by a product or project manager and the pushing often requires a healthy dose of lubricant.</p>
<h3>Pushing string</h3>
<p>My moment of realization came in a discussion about process over-runs in the definition or analysis phase of a project. The team recognized that requirements weren&#8217;t being communicated clearly to the developers and were planning to spend longer on the analysis and definition phase to make the requirement documents longer and clearer. Their diagnosis was correct but their prescription for how to fix the problem would just exacerbate the pain. If people aren&#8217;t finding a document useful the answer isn&#8217;t to make the document longer!</p>
<p>This situation reminded me of the idea of <a href="http://en.wikipedia.org/wiki/Pushing_on_a_string_(phrase)">pushing string</a>. Attempting to push a single-page document is hard (it bends and wobbles), so adding more pages should increase the weight, or &#8220;<a href="http://www.wordspy.com/words/thudfactor.asp">thud-factor</a>&#8220;, of the document making it easier to push &#8230; surely there&#8217;s nothing wrong with this logic!</p>
<h3>Empowered to pull</h3>
<p>The solution I suggested is to invert the process, empower the developers, and get them to <em>pull</em> the information they need. This fits with the general concept of &#8220;people-centered processes&#8221; that attracts me to lean and agile approaches (remember <a href="http://www.richarddurnall.com/?p=45">a bad process will beat a good person every time</a>). If you allow your development teams to take responsibility for the product and features they&#8217;re building they will then pull the information they need at the times they need.</p>
<p>So it may still be a push system for features, but the flow of information is now driven by a pull system. This flip in direction allows all the benefits of just-in-time production and saves the problems associated with maintaining a large inventory. If you write all the details of a feature too far in advance it is <span style="text-decoration: line-through;">certain</span> highly likely that much of that work will be wasted since the details will change or the context will shift. Documents have a shelf-life just like any other organic product and that shelf-life is much shorter than you&#8217;d like to think.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/09/20/dont-push-requirements-pull-information/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Simple code is music to my ears</title>
		<link>http://www.digitaldimsum.co.uk/2008/08/12/simple-code-is-music-to-my-ears/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/08/12/simple-code-is-music-to-my-ears/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 13:35:00 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[computing]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=45</guid>
		<description><![CDATA[<p>Have you ever opened up a file of source code and flinched at the complexity that comes screaming out at you from the screen? Well I&#8217;m imagining an IDE plugin that could do the screaming for you.</p>
<p>There are many <a href="http://www.panopticode.org/">measures of code</a> that are objective and metrics driven, but there are others that are more subjective and taste based. I can&#8217;t tell you from a quick glance how many afferent couplings there are in a given piece of code, but I do have an almost immediate sense of how elegant the code is. In my mind elegance is all about solving complex problems with simple solutions. That&#8217;s the art rather than the science of computer programming.</p>
<p><!--more--></p>
<p>When I read some code and get that gut feeling that the solution isn&#8217;t elegant, one of the first pointers is often how long each method or function is and how deeply indented they get. If you open a class and it just contains a handful of methods that are short (no more than 2 to 4 lines in each) and reasonably named, I breath a natural sigh of relief and know that the class is going to be pretty easy to understand. If on the other hand, there&#8217;s some crazy-long Dostoevskian beast of a method that I can&#8217;t fully see without scrolling up and down, then I start quaking like an intellectual weakling knowing that I&#8217;m going to endure much pain trying to grok what was in that coding genius&#8217; mind when they wrote it. Then once I&#8217;ve worked out what they were <em>trying</em> to achieve I&#8217;ll have to go and figure out what they <em>actually</em> achieved &#8230; in long complicated methods the implementation often diverges from the intent!</p>
<p>Much of this complexity is immediately evident in how the code is nested and indented. Every indentation is the site of some kind of logical fork in the possible pathways through that method. Put in other terms there is a close correlation between the <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity">cyclomatic complexity (CCN)</a> of a method and the amount of nesting and indentation. Or explaining this classic metric for complexity another way: each indentation is an invitation to extract a method into a beautiful, small, testable, readable and well-encapsulated unit.</p>
<p>When you&#8217;ve spent time living in a codebase where <a href="http://www.thoughtworks.com/">people</a> vigorously accept these invitations to <a href="http://www.extremeprogramming.org/rules/refactor.html">refactor</a> that are offered up by <a href="http://en.wikipedia.org/wiki/Whitespace_(programming_language)">our friend white-space</a> then you tend to have a <a href="http://www-306.ibm.com/software/lotus/">gut response of pain, horror and loathing</a> when you see a heavily indented chunk of code.</p>
<p>The differences between these two styles of coding is clearly visible in the profile of the first non-whitespace characters on each line. If you look at the code and blur your eyes a bit this profile can look rather like the little LEDs on a graphic equalizer. The profile of indentation within a given source file composes a revealing signature that can be interpreted as a sound wave. Imagine hooking up a music player that could read these patterns. The heavily refactored codebase would purr gently at you with soothing sussurations, while those deeply nested and psychotomatically complex methods would scream at you like a shrill and brain-scrambling siren on a police car.</p>
<p>So step up please you gurus of mashing up <a href="http://www.eclipseplugincentral.com/">Eclipse plugins</a> with Garageband and create me a little plugin that will <a href="http://www.youtube.com/watch?v=65I0HNvTDH4">sing a song of source code</a> whenever I open a file. But before you do that, maybe I should <a href="http://www.killerclips.com/clip.php?id=33&amp;qid=122">reach for the earmuffs</a>.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/08/12/simple-code-is-music-to-my-ears/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Design can change the world</title>
		<link>http://www.digitaldimsum.co.uk/2008/06/12/design-can-change-the-world/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/06/12/design-can-change-the-world/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 01:49:44 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[computing]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[environment]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=42</guid>
		<description><![CDATA[<p>My new favorite t-shirt says &#8220;design can change the world&#8221;. I got it from a <a href="http://www.projecthdesign.com/">cool little not-for-profit</a> whose cunning designs have a disproportionate impact in solving problems in developing countries.</p>
<p>Their <a href="http://projecthdesign.com/2008/02/17/h-is-for-hippo/">current flagship project</a>, the <a href="http://www.hipporoller.org/">hippo roller</a>, though not much more than a tough plastic barrel and pulling handle, is beginning to have an immense impact on the role of women in developing societies.</p>
<p><!--more--></p>
<p><a title="Hippo Roller Water Carriers" href="http://projecthdesign.com/2008/02/17/h-is-for-hippo/"><img class="alignleft" style="margin: 4px; float: left;" src="http://projecthdesign.com/wp-content/uploads/2008/04/hippos_thumb.jpg" alt="Hippo Roller" width="208" height="98" /></a>In many small villages a large proportion of a woman&#8217;s day is spent fetching water. This design allows a single person to transport a much larger amount of water much more quickly with much less effort (I might be able to push a car, but I could never carry one on my head). The beauty of this invention isn&#8217;t just in the immediate benefit of more water, but in the benefits that flow downstream (all puns intended) of freeing women and children up from this back-breaking work and giving them time to focus on education and self-improvement. This then has a massive cumulative beneficial impact on the rest of the village. All this just from applying a very old solution (the wheel) to a very old problem. Social change through re-inventing the wheel.</p>
<p><a href="http://www.darfurstoves.org/darfur-stove/"><img class="alignright" style="margin: 4px; float: right;" src="http://www.darfurstoves.org/images/small_darfur_stove.jpg" alt="Darfur Stove" width="98" height="122" /></a>In a similar vein <a href="http://www.ewb-usa.org/">Engineers Without Borders</a> have been applying advanced design to alleviate a growing problem in Dafur refugee camps. The problem is that collecting firewood is becoming an increasingly dangerous activity. The area immediately surrounding the camps has been denuded of tinder so the women have to go further and further to gather the wood required to feed their families. This has the double-whammy impact of both increasing malnutrition as less meals are cooked and increasing the chances of being mugged or raped by the marauding gangs in the outlying areas.</p>
<p>The solution <a title="LBNL" href="http://darfurstoves.lbl.gov/">the clever kids from Berkeley</a> designed to meet this problem is beautifully simple &#8211; make <a href="http://www.darfurstoves.org/">a more efficient stove</a>. The more efficient the stove, the less fuel you need to cook the same amount of food. The less fuel you need, the less time needs to be spent scavenging. The less wood that is removed from around the camps, the less the resources get depleted. The less the resources get depleted, the more people the area can sustain. That&#8217;s what I call a virtuous circle.</p>
<p><a href="http://www.inveneo.org/?q=prodsvcs"><img class="alignleft" style="margin: 4px; float: left;" src="http://www.inveneo.org/img/screenshot-3.jpg" alt="Inveneo Linux" width="150" height="112" /></a>Another not-for-profit I&#8217;ve been lucky enough to be involved with, <a href="http://www.inveneo.com/">Inveneo</a>, have a more high-tech solution, but a similar understanding of how to trigger these positive feedback loops by introducing efficiency gains early on in the process. Even though you may pay more for the hardware, <a href="http://www.inveneo.org/?q=poweradvantage">if you draw down less power the downstream benefits are magnified to dwarf the initial outlay</a>. By improving the power consumption of their hardware and software <a href="http://www.inveneo.com/">Inveneo</a> manage to make computing infrastructure affordable enough for poor societies to sustain the ongoing costs themselves.</p>
<p>What ties these all together is maximizing the efficiency of resource utilization &#8211; getting more results from less input. But what makes it even better is that the beneficial results seem to be exponential. The savings fan out as the compounding effects of the initial efficiencies multiply.</p>
<p>The eureka moment for me was realizing that changing the world needn&#8217;t involve a lot of hard work &#8211; it&#8217;s all about leveraging small efficiencies. Archimedes knew this when he said &#8220;give me a fulcrum on which to rest and I will move the world.&#8221; By increasing efficiency at an early stage in a process the benefits compound along the way, giving us the lever required to shift the direction of our resource depleting way of life.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/06/12/design-can-change-the-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The first bite is with the eye</title>
		<link>http://www.digitaldimsum.co.uk/2008/05/09/the-first-bite-is-with-the-eye/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/05/09/the-first-bite-is-with-the-eye/#comments</comments>
		<pubDate>Fri, 09 May 2008 02:40:30 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[computing]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=29</guid>
		<description><![CDATA[<p>I think I first heard the phrase &#8220;<em>the first bite is with the eye</em>&#8221; from a TV chef, but it applies equally to the software creation process as it does to cookery.</p>
<p>A user&#8217;s interaction with a piece of software or web site is as much emotional as it is functional. Compare the soft, warm, fuzzy feeling you get when first interacting with a product from <a href="http://www.37signals.com/">37 Signals</a>, say, to the <a href="http://noteshater.blogspot.com/">stomach churning reaction you get when booting up Lotus Notes</a>, for example.</p>
<p>This immediate emotional response will pervade the whole of a user&#8217;s long-term impression of a product, imbuing their relationship with whatever feeling was conjured up in those preliminary interactions. They say that in most job interviews the interviewer makes up their mind within the first 5 minutes. The same is equally true for software.</p>
<p><!--more--></p>
<p>That&#8217;s the reason that I&#8217;m often accused of prematurely optimizing the UI. I&#8217;ve been round the block enough times to have been bitten by the following type of interaction:</p>
<p>Me: &#8220;This is just a wire-frame, we&#8217;re only trying to prove out the functional flows of the application. Don&#8217;t worry about the layout or the look and feel &#8211; that will be dealt with later.&#8221;</p>
<p>Client: &#8220;Ooh, I don&#8217;t like that font &#8230; and I think that&#8217;s our old logo. Maybe we should give it a drop-shadow or something. I&#8217;m disappointed, I expected more from you guys &#8230;&#8221;</p>
<p>After a host of similar experiences I now make sure that I give whatever product I&#8217;m working on an appropriate level of design and polish for the current stage, while still trying to evoke positive emotional responses. In my mind it&#8217;s always worth spending an hour or two tweaking a CSS file to tighten the layout, soften the lines and add a little sparkle &#8211; a little :hover goes a long way. Then even if the application isn&#8217;t functionally complete at least it looks professional and imbues the client with a sense of confidence and pleasure. This will put them into a much more positive state of mind, which can only be a good thing for the next stages of the project.</p>
<p>Call me shallow if you want, but when I arrive at a (studiously) un-styled site, like <a href="http://martinfowler.com/">our guru Martin Fowler&#8217;s</a>, I have a negative knee-jerk reaction making me resist reading the wise words he&#8217;s actually written. When, however, I land on a site <a href="http://www.digitaldimsum.co.uk/">where they care about the first bite</a> I feel compelled to carry on reading all day.</p>
<p>If someone in a meeting has a bit of chopped herb stuck in their teeth it&#8217;s really hard to focus on what they&#8217;re saying &#8211; you get distracted and have a negative emotional response. In the same way drizzling some coulis and sprinkling a bit of chopped herb onto a plate before serving can provoke a positive emotional response which fools the diner into enjoying their food more.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/05/09/the-first-bite-is-with-the-eye/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Build Transformation across an Organization</title>
		<link>http://www.digitaldimsum.co.uk/2008/04/17/build-transformation-across-an-organization/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/04/17/build-transformation-across-an-organization/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 06:55:07 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[build]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[visualisation]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/?p=34</guid>
		<description><![CDATA[<p>My most recent project was helping a major online retailer  to mature their build process as part of a wider effort to improve their IT effectiveness through the injection of development best practices.</p>
<p>When we came onboard manual intervention was needed for any of their builds or deployments to work and so it was rare for more than a couple of builds or deployments to be completed successfully in a day. Now we often have up to 1,000 builds running every day &#8211; what’s more the majority of them now pass!</p>
<p>This article looks at a few of the techniques we’ve had to put in place to enable this transformation and what we’ve learnt along the way.</p>
<p><!--more--></p>
<h3>Dividing up builds &#8211; separation of responsibilities</h3>
<p>Initially we had two versions of the build &#8211; one that would run on commit and a second that would only run at night. The two versions did pretty much the same things, except the nightly builds would deploy to a shared testing environment. Deployments only happened at night to avoid disruption to the multiple teams working in this shared environment (another smell to be dealt with later). The on-commit build did compilation, unit testing and packaging &#8211; the nightly build did the same and then handled environment preparation and deployment.<br />
There were a few problems with this:</p>
<ul>
<li>The on-commit builds ran slowly because they were doing a lot of work</li>
<li>The nightly builds were very brittle since responsibility for different parts of the build (compilation, packaging, deployment etc) was split among multiple teams &#8211; a failure at any step would mean QA didn&#8217;t have a new build to test that day</li>
<li>It wasn&#8217;t <a title="Don't Repeat Yourself" href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a></li>
</ul>
<p>Our solution was to divide the monolithic build up into several smaller steps and tie the steps together into a &#8220;build pipeline&#8221;, with each step triggered by a successfully completed &#8220;upstream&#8221; build. Our pipeline was divided into quick, assemble, package, deployment and regression builds. “Downstream” builds would pick up the artifacts prepared at the previous step in the build.</p>
<p>This lead to various beneﬁts:</p>
<ul>
<li>Each build ran more quickly</li>
<li>We didn&#8217;t repeat steps</li>
<li>It was easier to divide up responsibilities for keeping the different builds green:
<ul>
<li>Developers :: <em>quick</em> build (compilation + unit tests)</li>
<li>Build team :: <em>assemble</em> build (jar, war, ear creation etc)</li>
<li>Deployment team :: <em>package + deployment</em> (preparing RPMs / configuration / deploying)</li>
<li>QA team :: <em>regression suites</em></li>
</ul>
</li>
<li>Because we used the &#8220;last known good&#8221; upstream artifact, deployments weren&#8217;t blocked by a last minute problem upstream in the pipeline.</li>
<li>We were now in a position to split the builds up over more boxes to achieve greater throughput through parallelism</li>
</ul>
<p>This concept of dividing the responsibilities (at least for ﬁrst and second line build support) had a major impact on improving success rates and response times to failures through an increased sense of ownership of the process.</p>
<h3>Tying the builds together &#8211; HTTP publishing</h3>
<p>In an ideal world the input for a downstream build should be the output from an upstream build &#8211; the appearance of a new artifact from one build would trigger the next build down the chain. In our situation that wasn’t quite possible (the server topology and optimal dividing lines between builds, from a speed point of view, didn’t favor communicating via artifacts) so we took a different approach.</p>
<p>Our solution was for builds to communicate with each other via small properties ﬁles, published locally and accessed over HTTP. On successful completion each build publishes a properties ﬁle (to the local Cruise web-server) containing the build number and SVN revision of the build. We built a custom Cruise publisher to handle this. We also built a custom Cruise HTTP modiﬁcation-set to watch for upstream builds and an HTTP label-incrementer to keep all the build numbers in the pipeline in sync. The same build number is used through each of the steps of the build, making it easier to check whether changes have ﬂowed through to the QA environment – more on this later.</p>
<h3>Watching the river flow &#8211; visualizing the build pipeline</h3>
<p>Once we had divided up the builds and added further applications, we ended up with close to 100 builds that needed to be managed and monitored. Since they were spread across multiple boxes to increase throughput this wasn&#8217;t as easy as just watching one large cruise page. So we built a centralized page for aggregating together the build results.<br />
<img class="alignnone size-full wp-image-35" title="Dashboard" src="http://www.digitaldimsum.co.uk/wp-content/uploads/2008/04/dashboard.gif" alt="" width="433" height="191" /></p>
<p>The dashboard page was comprised of a few separate components:</p>
<ul>
<li>Current build status grid</li>
<li>Graph of passing v failing builds over time</li>
<li>Graph of build times per type / step in the pipeline</li>
<li>Quick list of which builds are currently broken</li>
<li>Some basic code metrics</li>
</ul>
<p>We also provided similar drill-down pages, filtered just to show data on a single application or step in the pipeline. These then link through to the actual Cruise pages for log files, failure reasons and test results.</p>
<h3>Current build status grid</h3>
<p>The current build status grid  was probably the greatest breakthrough. The basic idea was to show the  current status of all our builds in a simply structured manner. Over  a few iterations we evolved a grid structure (a bit like battleships!).  The columns in the grid represented steps in the build pipeline and  the rows the different applications we were building. The columns were  repeated for each active branch. Cells were then green if the build  was good, red if it was bad and yellow if the last build was good, but  was more than 24 hours old (stale). Mouseovers give more details about  the selected build, such as when it ran and what its build number was.</p>
<p><img class="alignnone size-full wp-image-37" title="status-grid" src="http://www.digitaldimsum.co.uk/wp-content/uploads/2008/04/status-grid.gif" alt="" width="434" height="308" /></p>
<p>From this view informative  patterns were clearly distinguishable with a cursory glance. It became  obvious if problems were localized or spread across a specific application  or step in the pipeline.</p>
<p>Initially we emailed a snapshot  of the grid first thing in the morning and at the end of the day to  management and the teams. This had the wonderful effect of halting all  the annoying questions and sparking the interesting ones. Instead of  people asking whether a build was successful or what build number was  last deployed to QA we got questions like:</p>
<ul>
<li>Why are all the    assembly builds broken?</li>
<li>Why is all of application X broken?</li>
<li>Why hasn’t application Y built for 2 days?</li>
<li>Why is there a build on the prod support branch?</li>
<li>Wow – everything’s green – shall we go to the pub?</li>
</ul>
<p>This definitely shone the spotlight  in a few uncomfortable places, but the visible improvements this lead  to made it worthwhile. It became an invaluable tool for educating people  about how the pipeline works. Once people understood and were reliant  on the data we replaced the emails with a dynamic, self-service, application  hosting the data.</p>
<h3>Graphing build metrics over time</h3>
<p>We also had great success with  some of our time-based visualizations. Simply graphing the times of  each step in the build pipeline over the last month quickly highlighted  problems as they developed. In one case we realized that all the packaging  builds were getting geometrically slower and slower – a quick bit  of research showed that each build was adding new artifacts to SVN and  the ensuing checkouts were suffering. We fixed this problematic practice  and had a massive positive impact on the total throughput of the pipeline.</p>
<p>The historic view of successful  vs. failing builds over time was also a particularly useful tool while  we were focusing on improving the stability of our deployments to QA  / UAT. This gave us a simple report on how we were doing – 50% success  last week, 75% this week – woo hoo!</p>
<h3>Sparklines</h3>
<p>We found a simple yet effective  way of communicating a large amount of information about how a build  has been performing by using “sparklines”.</p>
<p><img class="alignnone size-full wp-image-36" title="sparklines" src="http://www.digitaldimsum.co.uk/wp-content/uploads/2008/04/sparklines.gif" alt="" width="434" height="242" /></p>
<p>For a given build these graphs  communicate the number, duration and success of a large quantity of  builds. You can quickly get an idea of how things are trending. Again  mouseovers provide more details, context and drill down.</p>
<h3>Under the hood</h3>
<p>Initially the grid was generated  and emailed by a scheduled round-robin script hitting all the build  servers. But this was slow, required us to configure all the build server  addresses in one place, wasn’t fault tolerant and stored no build  history. So we moved the build telemetry dashboard to a simple Rails  webapp employing CSS wizardry for the visualizations. The data was populated  via a basic RESTful API. Each build has a custom HTTP publisher (again  we built this) that fired off a simple set of information about the  build in a POST request:</p>
<ul>
<li>Project name</li>
<li>Build label</li>
<li>Date / time</li>
<li>Build duration</li>
<li>Build successful</li>
<li>Hostname of the Cruise server</li>
</ul>
<h3>Build naming conventions</h3>
<p>The one extra key to making  this all work was standardizing the format of the Cruise project name  so we could parse out the application, branch and pipeline step without  adding any extra complicated meta-data. We chose “&lt;branch&gt;-&lt;application&gt;-&lt;step&gt;”  as our format, e.g. “trunk-bigapp-quick” or “3.20-littleapp-assemble”.</p>
<h3>Where’s my build?</h3>
<p>Using our custom label incrementer  meant that each build in the pipeline for a given SVN revision would  have the same build number (e.g. “trunk-bigapp-quick.123”, “trunk-bigapp-assemble.123”,  “trunk-bigapp-deploy.123”). This made it much easier for developers  and QA to work out what builds and features had made it through to the  QA environments. We built on this by providing a customized version  of the currents status grid to answer exactly that question – where’s  my build?</p>
<p><img class="alignnone size-full wp-image-38" title="wheres my build?" src="http://www.digitaldimsum.co.uk/wp-content/uploads/2008/04/wheres-my-build.gif" alt="" width="434" height="157" /></p>
<p>The grid displays the latest  build number at each step – clearly showing how far changes have progressed  and also highlighting how a broken step breaks the pipe. This has become  a vital self-service tool for the dev, QA and deployment teams, and  has saved the build team from a lot of very dull questions.</p>
<p>A growing awareness of the  importance of the pipeline has allowed us to devote efforts towards  optimizing the total throughput. All the good lean principles definitely  apply at this point – looking at optimizing the whole system and working  out where we’re queuing or waiting too much nearly always deliver  the best results.</p>
<h3>And the rest  …</h3>
<p>These tools freed us up to  use the build team as a beach-head for spreading general coding, development  and automation best practices throughout the organization. Some of these  included:</p>
<ul>
<li>Untangling spaghetti dependencies with Ivy</li>
<li>Spawning multiple virtual machines for regression testing</li>
<li>Automating Cruise configuration and version updates</li>
<li>A whole host of black-belt Ant Fu</li>
<li>Correlating multiple code metrics to drive code quality improvements</li>
</ul>
<p>But those are stories for another  occasion …</p>
<p>[This article was originally written for an internal ThoughtWorks innovation newsletter - I've made some minor edits for this blog]</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/04/17/build-transformation-across-an-organization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming considered harmful</title>
		<link>http://www.digitaldimsum.co.uk/2008/02/10/programming-considered-harmful/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/02/10/programming-considered-harmful/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 22:50:57 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/2008/02/10/programming-considered-harmful/</guid>
		<description><![CDATA[<p>Discussions have been flying around the <a href="http://www.thoughtworks.com" title="ThoughtWorks">ThoughtWorks</a> communication channels on balancing the risk of dynamic languages against the pain of static languages. This got me thinking about the similarities between what makes teams work well and what makes for good code and object interactions.</p>
<p><!--more-->The mailing lists at <a href="http://www.thoughtworks.com" title="ThoughtWorks">ThoughtWorks</a> have been running hot since Jay Fields <a href="http://blog.jayfields.com/2008/02/static-typing-considered-harmful.html" title="Jay Fields: Static typing considered harmful">stoked the flames of the dynamic versus static language schism</a>. His basic point is summarized in the opening line:</p>
<blockquote><p><em>&#8220;Given a good test suite the return on investment simply does not justify the use of static typing&#8221;</em></p></blockquote>
<p>Basically he&#8217;s saying that statically typed languages have benefits, but there is an associated cost &#8211; anyone who&#8217;s seen object definitions disappear off the screen with <a href="http://weblogs.java.net/blog/arnold/archive/2005/06/generics_consid_1.html" title="Generics considered harmful">Java 5 generics</a> will understand this. The benefits definitely exist &#8211; modern IDEs (auto-complete, refactoring, etc), compiler optimizations, basic verification and clarity in communicating integration requirements &#8211; but there is also a cost incurred in terms of complexity and inflexibility. <a href="http://memeagora.blogspot.com/" title="Neal Ford">Neal Ford</a> has started calling this the &#8220;static type tax&#8221;. Jay&#8217;s solution is, rather than relying on static typing for partial protection, rely on tests for full protection.</p>
<h3>Work to rule</h3>
<p>This pain or tax associated with static types reminds me of the parody of union rules gone bad &#8211; &#8220;I can&#8217;t plug that in, I&#8217;m a carpenter, you need an electrician&#8221;. These rules start out having important uses (protecting workers against abuse and ensuring quality results), but can end up just causing pain and making the jobs they&#8217;re trying  to protect less secure by making the industry less responsive. There is an obvious correlation with the trade-offs between dynamic and statically typed languages: it&#8217;s nice to know from an integration and tooling perspective <em>exactly what type of object</em> a method requires; it&#8217;s also nice just to be able to give that same method  <em>any object that can respond to the messages</em> it will be sent.</p>
<p>In strong and statically typed languages, like Java, the method signature is a shorthand explicitly stating what type of object is required for the method to work. In a dynamic or weakly typed language, like Ruby or JavaScript, you have more flexibility about what you can pass into the method, but less visibility into whether it will work or not &#8211; you have to check (visually or through tests) that the object you pass in can respond sensibly to the instructions it&#8217;s given.</p>
<p>One of the pains of the statically typed method signature  is that various different requirements tend to get bundled up together. A method may well require a parameter to be of type (implement interface) X, where interface X defines 10 methods, even though the method will only call one of those declared methods. Ideally you would define a new interface for each combination of methods you want to call so you can keep the contract as simple to fulfill as possible, but this in itself would be a burden as the amount of interfaces would explode.</p>
<h3>Risk assessments</h3>
<p>The arrival of complexity and restriction in the name of preventing accidents (passing an object that can&#8217;t react to the messages sent to it) reminds me of how school trips have become harder and harder to organize because of the <a href="http://www.telegraph.co.uk/news/main.jhtml?xml=/news/2008/02/05/ncamping105.xml" title="Risk assessments on school trips">ever more stringent &#8220;risk assessments&#8221; required</a>:</p>
<blockquote><p><em>&#8220;Endless lengthy risk assessments and fears of being blamed if anything goes wrong have put teachers off taking children away on trips and led to youngsters being cooped in classrooms instead.&#8221;</em></p></blockquote>
<p>I remember loving some fairly wild school or youth club trips as a kid. Rock scrambling was one of my favorites, which involved climbing, jumping, swimming, hopping and whooping round sections of coastline like the beautiful <a href="http://news.bbc.co.uk/2/shared/spl/hi/pop_ups/05/sci_nat_britain0s_3d_geology/html/4.stm" title="Lulworth Cove">Lulworth Cove</a>. Sure there were risks involved, but learning to handle yourself in those risky situations lead to really important lessons and personal growth. Risk breeds responsibility.</p>
<p>I have similar feelings about using dynamic languages &#8211; with great power comes great responsibility. Programming itself is inherently risky (when was your last zero-defect release?) so programmers have to make decisions about how to act responsibly. One way is to impose risk assessment forms on every method call through static typing; another option is to force objects to <a href="http://docs.codehaus.org/display/PICO/Good+Citizen" title="Good citizens">act responsibly and be good citizens</a>. This is the route that interests me more. Testing definitely plays an important role in acting responsibly, but it&#8217;s not the end of the story.</p>
<h3>Team collaboration : object collaboration</h3>
<p>Coming back to the analogy of objects as workers on a job, rather than using strict role definitions in an attempt to control quality, I would much prefer to use the example of self-organizing Agile teams. On an Agile development team there is an expectation that people can work in a cross-functional manner with common ownership of the code-base. This means that team members should be interchangeable and comfortable in a variety of areas &#8211; just like in dynamic languages there is no type checking before picking up tasks (&#8220;sorry I only do JavaScript / Java / SQL&#8221;). This leads to highly flexible and productive teams, but there are a few techniques needed to make it work. Some of these techniques are conceptually transferable to working responsibly with dynamic languages:</p>
<ul>
<li>communication</li>
<li>simplicity</li>
<li>responsibility</li>
</ul>
<p>Explicit and clear communication is the biggest of these &#8211; the others can be derived from this principle. The importance of communication in teams is fairly obvious, but it can also be important at the code level in areas like explicit tests, clearly named methods and transparent intentionality.</p>
<p>Simplicity aids communication and also lowers risk. The simpler the routine is, the easier it is to understand, the easier it is to see what is required of collaborating objects and the less likely it is that bugs will creep in.</p>
<p>Responsibility underpins this all. In teams it means talk to people if you&#8217;re not sure, or tell people if you&#8217;re going to do something strange; in objects it means testing your interactions, handling errors appropriately and checking compatibility where necessary.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/02/10/programming-considered-harmful/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Can virtualization save the real world?</title>
		<link>http://www.digitaldimsum.co.uk/2008/02/02/can-virtualization-save-the-real-world/</link>
		<comments>http://www.digitaldimsum.co.uk/2008/02/02/can-virtualization-save-the-real-world/#comments</comments>
		<pubDate>Sat, 02 Feb 2008 21:38:15 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[build]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[environment]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/2008/02/02/can-virtualization-save-the-real-world/</guid>
		<description><![CDATA[<p>With Google measuring the efficiency of their code in the amount of <a href="http://itknowledgeexchange.techtarget.com/overheard/overheard-googles-larry-page-is-modern-day-andrew-carnegie/" title="largest utility bill in the planet">gigawatts</a> required to serve it to millions of people, optimizing applications can actually have a <a href="http://www.climatesaverscomputing.org/" title="climate savers - smart computing">positive impact on the world</a>.</p>
<p>Logicalis have put together some advice on <a href="http://www.uk.logicalis.com/efficient_it/10areas.asp" title="Ten Areas for Efficient IT">how to reduce the impact of IT on the environment</a>. The suggestions range from reducing hardware requirements through virtualization and other consolidation techniques to old favorites like double-sided printing, video-conferencing,  electronic forms and turning off your desktop at night.</p>
<p><!--more-->One idea I hadn&#8217;t really thought of was the impact of data archiving strategies (or <a href="http://www.uk.logicalis.com/efficient_it/area3.asp" title="ILM">Information Life-Cycle Management</a> as they grandly title it) on energy usage. Data needs hard drives need power. Choosing what to compress, archive and delete can have a major impact.</p>
<p>If you don&#8217;t think that powering down your PC at night can make a difference <a href="http://www.globalactionplan.org.uk/news_detail.aspx?nid=e06182e3-8e00-4ec5-be39-516c7030b652" title="An Inefficient Truth">Global Action Plan&#8217;s recent report</a> might open your eyes as it shows that the environmental impact of IT is <a href="http://www.globalactionplan.org.uk/news_detail.aspx?nid=62992fb1-c745-4738-bf96-f4acfd08088a" title="Inefficient ICT Sector's Carbon Emissions set to Surpass Aviation Industry">almost identical to that of the much-maligned aviation industry</a>.</p>
<p><a href="http://www.digitaldimsum.co.uk/wp-content/uploads/2008/02/paying-for-power.png" title="Do ICT departments pay for the energy consumed by ICT equipment?"><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2008/02/paying-for-power.thumbnail.png" alt="Do ICT departments pay for the energy consumed by ICT equipment?" align="right" border="0" hspace="8" vspace="8" /></a>Ultimately, as with so many environmental issues, the best solution is to make sure that the people who make the decisions are the same as (or at least aligned with) the people who are impacted. I&#8217;m not saying sys admins should go and live in the <a href="http://www.commondreams.org/headlines07/0202-09.htm" title="Global warming peril to Bangladesh">semi-submerged Bangladeshi delta</a>. My advice is much simpler &#8211; make sure IT departments are responsible for their electricity bills. The most striking statistic in the <a href="http://www.theitsanctuary.com/assets/0000/0370/Inefficient_Truth_Executive_Summary_Dec_2007.pdf">&#8220;An Inefficient Truth&#8221; report (PDF 1.3MB)</a> was that not only do 68% of IT departments not pay for the energy their systems consume, <strong>56% of them don&#8217;t even see the bills</strong>.</p>
<p>Making environmentally sound decisions isn&#8217;t about warm fuzzy feelings &#8211; it&#8217;s about hard-nosed, joined-up, economic thinking.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2008/02/02/can-virtualization-save-the-real-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

