<?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; consulting</title>
	<atom:link href="http://www.digitaldimsum.co.uk/category/consulting/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>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>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>Show don&#8217;t tell: Consulting with GraphViz</title>
		<link>http://www.digitaldimsum.co.uk/2007/05/06/show-dont-tell-consulting-with-graphviz/</link>
		<comments>http://www.digitaldimsum.co.uk/2007/05/06/show-dont-tell-consulting-with-graphviz/#comments</comments>
		<pubDate>Sun, 06 May 2007 18:12:18 +0000</pubDate>
		<dc:creator>jonny</dc:creator>
				<category><![CDATA[build]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[visualisation]]></category>

		<guid isPermaLink="false">http://www.digitaldimsum.co.uk/2007/05/06/show-dont-tell-visual-consulting-with-graphviz/</guid>
		<description><![CDATA[<p>I&#8217;ve often found that it&#8217;s much more effective to <em>show </em>clients what their problems are, rather than just <em>telling </em>them. Recently I&#8217;ve ended up using <a href="http://www.graphviz.org/" title="GraphViz" target="_blank">GraphViz </a>as a great tool for high-lighting complexity that needs to be addressed.</p>
<p>At the client I&#8217;m currently working for the complexity of the build scripts was getting out of hand. I wanted to goad the customer into prioritising some simplification work. So I turned to GraphViz to depict how complex the build was. The build we&#8217;re using is a large, centralised, Ant script that builds about 10 different applications. It manages everything through the process of compile, test, package and deploy.</p>
<p>I found the <a href="http://ant2dot.sourceforge.net/" title="ant2dot.xsl" target="_blank">handy ant2dot.xsl tool</a> that uses XSL  to transform an Ant build file into a DOT format graph representing the flow and dependencies between the various build targets.</p>
<p><!--more--></p>
<h3>Before</h3>
<p>The picture that emerged was pretty shocking:</p>
<p style="text-align: center"><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2007/05/build-scripts-before.png" alt="Before: build script target dependencies" /></p>
<p>Even printed out on the largest paper the client&#8217;s printer could handle you still couldn&#8217;t even read the target names. Images of the <a href="http://www.venganza.org/" title="Flying Spaghetti Monster" target="_blank">Flying Spaghetti Monster</a> kept jumping into my mind. But the tactic worked and when I showed the client the picture in our Iteration Planning Meeting they were quick to prioritise some work to simplify the build process.</p>
<h3>After</h3>
<p>After a month or so of gradual re-structuring and simplification I repeated the visualisation exercise to see how we were doing. The results were pretty striking:</p>
<p style="text-align: center"><img src="http://www.digitaldimsum.co.uk/wp-content/uploads/2007/05/build-scripts-after.png" alt="After: build script target dependencies" /></p>
<p>Needless to say the pictures told more than a thousand words could: the client was happy, we had a neater picture to help developers understand how the build scripts worked AND the builds were simpler.</p>
]]></description>
		<wfw:commentRss>http://www.digitaldimsum.co.uk/2007/05/06/show-dont-tell-consulting-with-graphviz/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

