<?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>George Dinwiddie's blog &#187; Working Software</title>
	<atom:link href="http://blog.gdinwiddie.com/category/working-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gdinwiddie.com</link>
	<description>Effective software development</description>
	<lastBuildDate>Mon, 06 Feb 2012 16:35:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>I feel better, now</title>
		<link>http://blog.gdinwiddie.com/2012/01/05/i-feel-better-now/</link>
		<comments>http://blog.gdinwiddie.com/2012/01/05/i-feel-better-now/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 19:24:43 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Craftmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=866</guid>
		<description><![CDATA[Oops! The whole problem started when I wanted to install a new program on the &#8220;entertainment computer&#8221; that’s connected to the TV. The existing version of Ubuntu was no longer supported, so I started what I thought would be a simple upgrade. Oops, it deleted the entire /var directory, including the contents of the second [...]]]></description>
			<content:encoded><![CDATA[<p>Oops! The whole problem started when I wanted to install a new program on the &#8220;entertainment computer&#8221; that’s connected to the TV. The existing version of Ubuntu was no longer supported, so I started what I thought would be a simple upgrade. Oops, it deleted the entire /var directory, including the contents of the second drive mounted there. That drive contained all of our photos and music. Not a problem, I thought. It’s all backed up nightly onto a USB drive. It’s just a bit of bother to copy all of that over the USB interface.</p>
<p>Oops! There are no photos beyond last March. I felt sick to my stomach. That’s a lot of family memories to evaporated. Whew! The program we’ve been using to download the cameras also makes a backup copy local to the machine used to download. I’ve got all the pictures back on the photo server, and now just have to sort them into directories again.</p>
<p>But first, I need to fix the backup script. Why didn’t it warn me when it started to fail?<span id="more-866"></span></p>
<p>I copied a version on a different fileserver to that machine and edited it for the different source and destinations. It’s a simple shell script that mounts the USB drive, runs <code>rsync</code> to duplicate the data, and then unmounts the USB drive. I’d run into a problem once before where the drive wasn’t getting mounted properly, so I’d added some script to detect that and email me using <code>msmtp</code> if it failed. That only worked for mount errors, though, not for <code>rsync</code> errors.</p>
<p>As I hacked in detection and notification of <code>rsync</code> errors, I felt ill at ease. I was duplicating some of the script to send emails. The script was getting harder to read. The script was increasingly inconvenient to test. And I was nervous about introducing new errors.</p>
<p>I started practicing Test Driven Development a decade ago. It has become second-nature to me to test-drive the code I write. Why was this code just hacked together? Mostly because I hadn’t been thinking of it as code. It was just a script. At first, it just replicated the commands I typed on the command-line. I put those into a script to make it easy to run, and then to automate running it via the <code>&lt;del&gt;chron&lt;/del&gt; cron</code> daemon. When I replicated it to another machine, I extracted the paths to variables to make it easier to change the differences. When it had failed to mount a drive, I’d added a check for that and a line to send me an email. That line surely crossed the border between &#8220;a file of commands&#8221; to &#8220;a program,&#8221; but I didn’t notice it at the time. Or, if I did notice it, I didn’t pay attention to it. After all, I don’t generally program in bash scripts and haven’t developed any rigor for doing so. It’s those &#8220;little&#8221; changes that &#8220;can’t possibly&#8221; hurt that bite you the hardest.</p>
<p>The script now &#8220;seems to be working,&#8221; but I’m not satisfied. Wouldn’t it be nice to get advance notice when the disk is getting close to full, rather than waiting until it is?</p>
<p>I now know I’m programming in <code>sh</code>, not just collecting a bunch of command-lines from my <code>.history</code> file. Adding the email notification of <code>rsync</code> errors was harder than I expected due to tiny errors made in an unfamiliar programming environment. In addition to being hard, it just felt &#8220;dirty.&#8221;</p>
<p>A little googling lead me to <a title="Project page for shunit2 shell unit test framework." href="http://code.google.com/p/shunit2/" target="_blank"><code>shunit2</code></a>. After a little difficulty creating a tiny virtual disk under control of the tests, I quickly had a function that extracted the % full output using the <code>du</code> command and returned it as a number. Great! Now I can use that number to provide an early warning. And working test-driven is teaching me better shell scripting habits.</p>
<p>I’ve still got work to do, pulling the existing script into tested functions, but already I feel better. I’m on my way to a reliable and maintainable script.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=866&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/01/05/i-feel-better-now/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Losing Customer Focus</title>
		<link>http://blog.gdinwiddie.com/2011/07/10/losing-customer-focus/</link>
		<comments>http://blog.gdinwiddie.com/2011/07/10/losing-customer-focus/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 17:37:06 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Customer Collaboration]]></category>
		<category><![CDATA[Working Software]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=735</guid>
		<description><![CDATA[Southwest Airlines has long been known for two things: low prices and attention to customer service. Since they instituted the &#8220;reserved place in line&#8221; so I wouldn&#8217;t have to stand for a long period of time, I have come to check their website first, and only rarely look for alternative flights. Sadly, they&#8217;ve taken their [...]]]></description>
			<content:encoded><![CDATA[<p>Southwest Airlines has long been known for two things: low prices and attention to customer service. Since they instituted the &#8220;reserved place in line&#8221; so I wouldn&#8217;t have to stand for a long period of time, I have come to check their website first, and only rarely look for alternative flights. Sadly, they&#8217;ve taken their eye off the ball. I suspect that the focus on customer service has been replaced by a focus on growth (given their in-progress takeover of Airtran).</p>
<p>Some months back, I noticed that their website had become bandwidth greedy with javascript doodads. This made it painfully slow on many hotel internet connections. They seem to have backed off from that a bit, but have now broken it in a way that prevents me from buying the ticket I want. (In addition, when I call the &#8220;Southwest Airlines Customer Representative for assistance&#8221; as prompted on the website, I find they no longer have enough to handle the call volume. I wonder if they&#8217;ve reduced the support, or if the call volume has increased, or both.)  There&#8217;s a lesson here about considering all of the important user stories when implementing new functionality, so it bears describing.<span id="more-735"></span></p>
<p>I went to the Southwest web site to purchase my ticket to Salt Lake City for the Agile2011 Conference. I took a look at the available flights on the appropriate travel dates. Then I remembered that I have an unused travel award, so I went to check if those dates were available, even at this late date. Hooray, they were! Boo hiss, the flights I want were not. Oh, well, it serves me right for putting this off so long.</p>
<p>So, I went back to buy the tickets with money. But when I search for the flights, instead of showing me the flights for purchase, it shows me the dates available for using my travel awards. I sign out of my account and try again. Now it gives me an error: &#8220;Oops! We are currently unable to complete your request due to an undefined error.&#8221; I try deleting cookies. I try closing the browser and re-opening it. No dice. Still, if I&#8217;m logged into the account it gives me the travel award availability dates, and if I&#8217;m logged out it gives me an &#8220;undefined error.&#8221;</p>
<p>I also notice that <strong>even after deleting cookies and restarting the browser</strong>, when I go to search for a flight it <em>remembers my airport and date selections</em>. This means that they&#8217;re keeping state on the server side, probably associated with my IP address (since I&#8217;ve logged out and deleted client side session data), and there&#8217;s <em>no way I can find to reset this state</em>.</p>
<p>In their attempt to be helpful, they&#8217;ve neglected to consider many common user scenarios. The Southwest website has long maintained enough state that you couldn&#8217;t do multiple searches in parallel to compare them and then select the one you wanted. But you could, in my experience, restart the search once you figured out which you wanted. Now there&#8217;s no mechanism I can find (and I&#8217;ve been struggling with this for over an hour) to take a purchase path that involves changing your mind and backtracking.</p>
<p>Am I the only indecisive customer? Or has Southwest forgotten the variability in the ways that humans approach things, and coded their website for a robotic &#8220;customer unit&#8221; that follows the one expected scenario?</p>
<p>More importantly, what do you and your organization do?</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=735&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/07/10/losing-customer-focus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podcast: Acceptance Test Driven Development and the 3 Amigos</title>
		<link>http://blog.gdinwiddie.com/2011/06/14/podcast-acceptance-test-driven-development-and-the-3-amigos/</link>
		<comments>http://blog.gdinwiddie.com/2011/06/14/podcast-acceptance-test-driven-development-and-the-3-amigos/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 14:53:13 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Customer Collaboration]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[User Stories]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=705</guid>
		<description><![CDATA[Also while in Las Vegas for the ADP/West Conference, Bob Payne and I sat in the Agile Philanthropy booth and recorded a podcast on Acceptance Test Driven Development and the 3 Amigos. This is the latest in a series of Tips and Advice podcasts that Bob and I have done.]]></description>
			<content:encoded><![CDATA[<p>Also while in Las Vegas for the ADP/West Conference, Bob Payne and I sat in the Agile Philanthropy booth and recorded a podcast on <a href="http://agiletoolkit.libsyn.com/tips-and-advice-acceptance-test-driven-development-and-the-3-amigos-process">Acceptance Test Driven Development and the 3 Amigos</a>. This is the latest in a series of <a title="Tips &amp; Advice podcasts" href="http://agiletoolkit.libsyn.com/category/Tips%20and%20Advice" target="_blank">Tips and Advice podcasts</a> that Bob and I have done.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=705&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/06/14/podcast-acceptance-test-driven-development-and-the-3-amigos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avoiding Iteration Zero</title>
		<link>http://blog.gdinwiddie.com/2011/05/25/avoiding-iteration-zero/</link>
		<comments>http://blog.gdinwiddie.com/2011/05/25/avoiding-iteration-zero/#comments</comments>
		<pubDate>Wed, 25 May 2011 16:42:37 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Estimation]]></category>
		<category><![CDATA[Time Boxes]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=668</guid>
		<description><![CDATA[Teams new to Agile often realize that they have a lot to do before they get their new development process at full speed. Looking at this big and unknown hill in front of them, many Agile teams choose to do an Iteration Zero (or Sprint Zero) to prepare before they start delivering regular increments of [...]]]></description>
			<content:encoded><![CDATA[<p>Teams new to Agile often realize that they have a lot to do before they get their new development process at full speed. Looking at this big and unknown hill in front of them, many Agile teams choose to do an Iteration Zero (or Sprint Zero) to prepare before they start delivering regular increments of functionality. During this time, they may try to get their ducks in a row with</p>
<ul>
<li>A list of features to be built</li>
<li>A release plan or timeline for those features</li>
<li>Setting up development infrastructure such as version control or continuous integration servers</li>
<li>Studying or practicing skills in new technologies they expect to use</li>
<li>&#8230; and other management, infrastructure, and technical endeavors.</li>
</ul>
<p>They try to get all the preliminaries out of the way so they can hit the ground running full speed in Iteration One. In my experience, they&#8217;re still not ready to go full speed. These things are rarely as complete as expected after one iteration, and often aren&#8217;t quite in tune with the actual needs of the project.  The list of features will likely not be complete, but the attempt to approach completeness will dump in lots of ideas that have been given little thought. Any attempt to project into the future still has no data about how fast things can be accomplished. The infrastructure may or may not be the best for supporting the project, but it is likely that the project will now conform to the infrastructure rather than the other way around. The choice of technologies will be made speculatively rather than driven by the needs of the project. While we may do OK, we&#8217;ll have made a lot of decisions with the least amount of information we&#8217;ll have in the project lifecycle.</p>
<p>And we&#8217;ll have burned an iteration without producing any working software that tests our decisions.</p>
<p>My advice is to borrow an idea from Lean and look at the situation from the output point of view.  Ask yourself, &#8220;what would it take to  start delivering?&#8221;<span id="more-668"></span></p>
<p>The initial backlog really only needs to be one item in order to start  delivering.  If you&#8217;ve got too many unknowns, then just start with one  item.  Get the business stakeholders, the programmers, the testers, and anyone else who  needs to be in on the discussion (User Experience? Ops?) to talks about it.  (I call  this a meeting of <a title="A Lingua Franca between the Three (or more) Amigos" href="http://blog.gdinwiddie.com/2010/02/25/a-lingua-franca-between-the-three-or-more-amigos/" target="_blank">the Three Amigos</a>.)  What is the <strong>one obvious thing</strong> that  needs to be done?<em> (Hint: it&#8217;s not &#8220;login.&#8221; Start with the main purpose of the system.)</em> I can&#8217;t imagine a situation where a project is  started without any ideas at all.</p>
<p>Take that one thing, and <a title="Splitting User Stories" href="http://blog.gdinwiddie.com/2011/05/01/splitting-user-stories/" target="_blank">slice it into thinner slices</a>.  Decide on the  examples that represent acceptance of those slices.  Some of the slices  will have questions that can&#8217;t be answered.  Put those aside for the  moment.  Choose the most central slice that travels through the entire  concept from end to end, or as close to that as possible.  Estimate that  as one team-iteration.  (Estimates don&#8217;t have to be &#8220;right.&#8221; They&#8217;re just  estimates.)  Start building it.</p>
<p>Learn the necessary skills in the technology while accomplishing real work. Learn the parts that aid building the system, rather than developing the system according to some framework. When you don&#8217;t know how to accomplish something, or you think multiple approaches might work, do minimalistic spikes to give the information needed to make a decision.</p>
<p>Along the way, start slowly building your development infrastructure. Set up a local code repository. You can always migrate the code to an &#8220;official corporate&#8221; repository later.  Right now, there&#8217;s not much code. Set up a simple build-and-test script so that everyone builds in the same fashion. You can always add other build targets later. If you&#8217;ve got time, you can set up a Continuous Integration server. Otherwise, just do it manually. Checkout &amp; build into a clean workspace. Do what&#8217;s needed to run the code so that you can show it working.</p>
<p>If you can&#8217;t accomplish this slice in one iteration, it&#8217;s probably not thin enough. Or, maybe you haven&#8217;t yet solved an essential technical problem. Or the goal isn&#8217;t yet clear enough. Figure out what impediment is most in your way, address that, and try again.</p>
<p>More likely, you&#8217;ll get this slice done in less than a iteration length. If you get this slice done before the end of the iteration, then pull in  another slice.  Estimate this as &#8220;the rest of the iteration.&#8221;  Repeat as  needed.  As long as you&#8217;ve gotten one slice done, you&#8217;ve got a  potentially deliverable product increment.</p>
<p>Yes, there will still be development infrastructure to be developed. There&#8217;s no particular rush to get that done. Just keep improving it, so that it helps you get more done. Yes, there will still be technical skills to be developed. That should always be the case. Just keep experimenting and pushing your limits.</p>
<p>Yes, there will still be features to be added to the backlog, refined, prioritized, split into stories, and prioritized again. This should continue throughout the project. It&#8217;s part of the &#8220;steering&#8221; process. Yes, there will still be a need for <a title="Projecting Into the Future" href="http://blog.gdinwiddie.com/2010/04/22/projecting-into-the-future/" target="_blank">projections</a> to estimate when functionality can be released, or how much functionality can be released by a certain date. When you think you&#8217;ve got  enough information about what needs to be done, then consider the  initial release plan.  By then you&#8217;ll also have accumulated a <em>little</em> information about how fast things get done.</p>
<p>There will still be a lot of holes in your knowledge of what needs  to be done and how fast things get done.  Don&#8217;t trust your initial  release plan to be &#8220;right.&#8221;  It&#8217;s just a stick in the sand to help you  judge how things are going.  Keep planning, and move the stick as needed. And as time passes, you&#8217;ll have a better and better indication of how fast the system gets developed. Even when you think the Release Plan is complete, it needs to be continually  reviewed and adjusted. Since it&#8217;s never done until the release, there&#8217;s  no particular hurry for a certain level of completeness.</p>
<p>This sort of beginning is very like the Hudson Bay Start that Johanna  Rothman describes in her book, <a title="Amazon" href="http://www.amazon.com/gp/product/0978739248/ref=as_li_ss_tl?ie=UTF8&amp;tag=alberg30-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=0978739248" target="_blank">Manage It</a> (pp.  52-53).</p>
<blockquote><p>The Hudson Bay Start approach was originated by the Hudson Bay Company in the 1600-1700s in northeastern Canada. The Hudson Bay Company outfitted fur traders. To make sure the traders hadn’t forgotten anything they needed, they left Hudson Bay and camped just a few miles away. By making camp just a few miles away, the traders ensured they hadn’t forgotten any tools or supplies&#8211;before they abandoned civilization. With just a short start to their journey, they had a better idea about their ability to endure the winter.</p></blockquote>
<p>There&#8217;s really no reason (other than &#8220;that&#8217;s not the way we do  things around here&#8221;) that this can&#8217;t work for the start of any team/project. It&#8217;s a great way of learning the right stuff for the current situation while also making a bit of progress. I use this technique in my <a title="Agile in 6 Months" href="http://blog.gdinwiddie.com/2011/03/14/agile-in-6-months/" target="_blank">Agile in Six Months</a> transition plan.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=668&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/05/25/avoiding-iteration-zero/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>The Carrying Cost of Code</title>
		<link>http://blog.gdinwiddie.com/2011/05/17/the-carrying-cost-of-code/</link>
		<comments>http://blog.gdinwiddie.com/2011/05/17/the-carrying-cost-of-code/#comments</comments>
		<pubDate>Wed, 18 May 2011 01:07:32 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=651</guid>
		<description><![CDATA[Michael Feathers has just written a post on The Carrying-Cost of Code: Taking Lean Seriously.  He says, No, to me, code is inventory.  It is stuff lying around and it has substantial cost of ownership. It might do us good to consider what we can do to minimize it. I&#8217;m not sure I can see [...]]]></description>
			<content:encoded><![CDATA[<p>Michael Feathers has just written a post on <a title="The Carrying-Cost of Code: Taking Lean Seriously" href="http://michaelfeathers.typepad.com/michael_feathers_blog/2011/05/the-carrying-cost-of-code-taking-lean-seriously.html" target="_blank">The Carrying-Cost of Code: Taking Lean Seriously</a>.  He says,</p>
<blockquote><p>No, to me, <strong>code is inventory</strong>.  It is stuff lying around  and it has substantial cost of ownership. It might do us good to  consider what we can do to minimize it.</p></blockquote>
<p>I&#8217;m not sure I can see the analogy of code that&#8217;s in production to inventory.  Code that hasn&#8217;t shipped, yes.</p>
<p>But all code is a liability, I think.  When code is in production, then it&#8217;s offset by the asset that is the functionality.  Whether or not the net is positive is another question.</p>
<p>There&#8217;s no doubt to me that code, whether in production or not, has carrying costs that are larger than generally realized.  Perhaps it&#8217;s a depreciating capital expense?</p>
<blockquote><p>Carrying costs are larger than we think. There&#8217;s competitive advantage for companies that recognize this.</p></blockquote>
<p>It&#8217;s something that takes up space.  It takes maintenance.  It takes attention.  It <strong>does</strong> have a substantial cost of ownership&#8211;larger than we think.</p>
<p>The analogies may be failing me, but I think Michael&#8217;s sentiment is correct.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=651&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/05/17/the-carrying-cost-of-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>When something persists, some reward exists</title>
		<link>http://blog.gdinwiddie.com/2011/02/10/when-something-persists-some-reward-exists/</link>
		<comments>http://blog.gdinwiddie.com/2011/02/10/when-something-persists-some-reward-exists/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 22:22:21 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Craftmanship]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=584</guid>
		<description><![CDATA[Jason Gorman has just written a piece in defense of Software Craftsmanship that highlights how very dependent our world has become on software.  He offers Gorman&#8217;s Law Of Software-Dependent Business Evolution: Software-dependent businesses can only evolve as fast as their ability to write and evolve their software allows them to. I think this is not [...]]]></description>
			<content:encoded><![CDATA[<p>Jason Gorman has just written <a title="Jason Gorman's blog posting" href="http://parlezuml.com/blog/?postid=1002" target="_blank">a piece in defense of Software Craftsmanship</a> that highlights how very dependent our world has become on software.  He offers <strong>Gorman&#8217;s Law Of Software-Dependent Business Evolution</strong>:<em> </em></p>
<blockquote><p><em>Software-dependent businesses can only evolve as fast as their ability to write and evolve their software allows them to.</em></p></blockquote>
<p>I think this is not only true, but an incredible opportunity for businesses that understand that.  Let&#8217;s face it: most businesses spend an awful lot of time for a very meager increase in systems capability.  Companies that do better than average can shoot to the top.  Look at the spectacular successes of some of the relatively young internet companies, for examples.<span id="more-584"></span></p>
<p>As Corey Haines points out, we, as an industry, know how to produce relatively bug-free software in a steady stream, delivering needed functionality early and often to businesses starved for capability. But, for the most part, the IT industry doesn&#8217;t do so.</p>
<p>Jason&#8217;s proposals for addressing this gap fall short, in my opinion. The first, that getting more kids to choose software development as a career, seems odd to me.  I don&#8217;t think we&#8217;ve got a lack of people. I think we&#8217;ve got a lack of people who know and practice the techniques that we, as an industry, have found to work.  The second, getting more practioners to <em>want</em> to do better, addresses this lack.  I&#8217;m all in favor of this, but I don&#8217;t think it, alone, will make much of a dent in the overall situation.</p>
<p>Even if we&#8217;ve got excellent software craftsmen, if the quality isn&#8217;t demonstrably valued by their organization, they&#8217;re most likely to either get demoralized and slack off their efforts, or leave that organization for greener pastures.  So, while I <em>do</em> think that most software developers need to improve their skills (and continue to do so over their entire career), I don&#8217;t think that will drive improvement in those organizations that need it most.</p>
<p>Organizations, like most systems composed of people, tend to develop amazingly stable patterns of operation.  These patterns persist through reorganizations and changes in personnel.  The reason they persist, is that there is an informal network of effects that regulate the system, putting and keeping it in its current state.  This stability doesn&#8217;t happen without forces reinforcing the behavioral patterns and inhibiting other behavioral patterns.</p>
<p>The study of these patterns and the forces that reinforce them is called Systems Thinking.  You can read more about it in Peter Senge&#8217;s <a title="on Amazon.com" href="http://www.amazon.com/gp/product/0385517254?ie=UTF8&amp;tag=alberg30-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0385517254" target="_blank">The Fifth Discipline</a>, Jerry Weinberg&#8217;s <a title="on Amazon.com" href="http://www.amazon.com/gp/product/0932633226?ie=UTF8&amp;tag=alberg30-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0932633226" target="_blank">Quality Software Management: Systems Thinking</a>, or <a title="on Amazon.com" href="http://www.amazon.com/gp/product/0932633498?ie=UTF8&amp;tag=alberg30-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0932633498" target="_blank">An Introduction to General Systems Thinking</a>, among others.</p>
<p>A fundamental lesson I&#8217;ve learned from Systems Thinking is that when some behavior persists over time, there&#8217;s something that&#8217;s rewarding it in some fashion (perhaps unintentionally).  If the behavior doesn&#8217;t make sense to me, or seems counterproductive, then I often find it more productive to look for what that reward might be rather than plead harder for a different behavior.</p>
<p>In this case, I think that large organizations operate in ways that support doing a slapdash job of software development.  I&#8217;ve seen many organizations that primarily reward behavior that&#8217;s irrelevant to helping them evolve more rapidly.  That and simple neglect of the behavior that would aid being more nimble in the marketplace are enough to produce the stability of the systems I see.</p>
<p>Many of these instances of rewarding irrelevant behavior come down to focusing on costs (which are easy to quantify) at the expense of value (which is much harder to quantify).  To promote the development of higher quality, more valuable software, I think we need to make that value more visible to the decision-makers.  They&#8217;re not stupid, after all.  They&#8217;re just working with the information they have.</p>
<p>What other drivers do you see behind the vast sea of mediocre software production?</p>
<p><em><br />
</em></p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=584&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/02/10/when-something-persists-some-reward-exists/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Trades, Crafts, and Certification</title>
		<link>http://blog.gdinwiddie.com/2011/01/17/trades-crafts-and-certification/</link>
		<comments>http://blog.gdinwiddie.com/2011/01/17/trades-crafts-and-certification/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 14:41:32 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Working Software]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[Craftmanship]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=559</guid>
		<description><![CDATA[Dan North says that programming is a trade, and not a craft.  I agree with him that it&#8217;s a trade, like plumbing and wiring.  I&#8217;ve already disagreed with his definition of craft.  I&#8217;d say that programming is a craft only when it&#8217;s done well.  I&#8217;d also say that plumbing and wiring are crafts when done [...]]]></description>
			<content:encoded><![CDATA[<p>Dan North says that <a title="Dan North's blog posting" href="http://dannorth.net/2011/01/11/programming-is-not-a-craft/" target="_blank">programming is a trade, and not a craft</a>.  I agree with him that it&#8217;s a trade, like plumbing and wiring.  I&#8217;ve already <a title="my previous blog posting" href="http://blog.gdinwiddie.com/2011/01/15/software-craftsmanship/">disagreed with his definition of craft</a>.  I&#8217;d say that programming is a craft only when it&#8217;s done well.  I&#8217;d also say that plumbing and wiring are crafts when done well.  Rather than a definition, how about a couple examples to illustrate the point?<span id="more-559"></span></p>
<p>We&#8217;ve got an excellent plumber.  He&#8217;s not producing art, but he does a neat job.  The pipes run straight and are well supported.  When he&#8217;s repairing old work, he may cut out a section that&#8217;s been patched numerous times and replace it with new, more reliable, work.  When he has to cut holes in the wall to reach old plumbing, he repairs those holes so they work isn&#8217;t obvious.</p>
<p>The electrician who wired our new house is a different matter.  <a rel="attachment wp-att-562" href="http://blog.gdinwiddie.com/2011/01/17/trades-crafts-and-certification/20110115_110842-img_0134/"><img class="alignright size-medium wp-image-562" title="20110115_110842-IMG_0134" src="http://blog.gdinwiddie.com/wp-content/uploads/2011/01/20110115_110842-IMG_0134-224x300.jpg" alt="electrical panel installation" width="224" height="300" /></a>He took shortcuts as he saw fit.  Here&#8217;s the <em>brand new</em> electrical installation in our new house.  He sized the box with absolutely no room for expansion, even though he knew that we&#8217;d want to add more outlets in the unfinished basement.  The new box was actually smaller than the one in the preceding house that we demolished.  Our insistence that this was not acceptable was rejected, but his neglecting to allow for one circuit caused him to expand the installation.  So he slapped up a sub-panel.  Notice the care with which he mounted it partially on the wooden support and partially hanging in mid-air.  Notice how some wires go straight up into the ceiling area, some go through the board, and some go around the edge of the board.  It&#8217;s going to be a major chore to do any further work in this area.  That&#8217;s kept me from making the adjacent workshop area easy to use.  Moving forward is going to require major rework.</p>
<p>Dan is right that we&#8217;d rather our systems be built by craftsmen.  This was no day-jobber, though.  This electrician owns his own business (as does our plumber).  He&#8217;s certified as a master electrician.  That means he went through apprenticeship and testing.  The electrical panels are plastered with stickers from the building inspector saying that the installation meets the requirements of the electrical code.  Both the electrician, and his work, are <strong>certified by bodies empowered by law</strong>.</p>
<p>And yet he did crappy work that did not satisfy his customer.  And we, as his customer, will pay the price for his crappy work <em>every time</em> we go to add or modify anything in this area.</p>
<p>We, as customers, cannot rely on certifications to reassure us.  Even referrals can let us down.  The builder (who did an excellent job in most ways) provided good to excellent sub-contractors except for this one.  I think the builder has finally given up on this sub-contractor, but it&#8217;s too late to help us.</p>
<p>In the end, there&#8217;s no way to eliminate shoddy workmanship.  But we can promote craftsmanship and the people who practice it.  We can help those who are willing to learn and practice.  It&#8217;s a messy world and we can&#8217;t fix that.  But we <em>must</em> do what we can, or it only gets worse.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=559&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/01/17/trades-crafts-and-certification/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Software Craftsmanship</title>
		<link>http://blog.gdinwiddie.com/2011/01/15/software-craftsmanship/</link>
		<comments>http://blog.gdinwiddie.com/2011/01/15/software-craftsmanship/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 17:30:55 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Working Software]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[Craftmanship]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=551</guid>
		<description><![CDATA[Dan North has created a bit of a stir with his declaration that programming is not a craft. Liz Keogh has agreed with him.  The funny thing is that most of what they have to say is not about programming, but about the Manifesto for Software Craftsmanship.  Well, writing is a craft, also, and I&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p>Dan North has created a bit of a stir with his declaration that <a title="Dan North's blog posting" href="http://dannorth.net/2011/01/11/programming-is-not-a-craft/" target="_blank">programming is not a craft</a>. Liz Keogh has <a title="Liz Keogh's blog posting" href="http://lizkeogh.com/2011/01/14/why-i-didnt-sign-the-software-craftsmanship-manifesto/" target="_blank">agreed with him</a>.  The funny thing is that most of what they have to say is not about programming, but about the <a title="Manifesto for Software Craftsmanship" href="http://manifesto.softwarecraftsmanship.org/" target="_blank">Manifesto for Software Craftsmanship</a>.  Well, writing is a craft, also, and I&#8217;ll agree with Dan that this manifesto is not &#8220;a call-to-arms, feisty, opinionated, brash and everything that a good manifesto should be.&#8221;  It never grabbed me the way the Agile Manifesto did.  Dave Hoover has taken this challenge as <a title="Dave Hoover's blog posting" href="http://nuts.redsquirrel.com/post/2753486676/the-manifesto-for-software-craftsmanship" target="_blank">a call to improve the software craftsmanship manifesto</a>.</p>
<p>I didn&#8217;t &#8220;sign&#8221; the Manifesto for Software Craftsmanship because I thought it was particularly well written, though.  I signed it because I support the intent (as I perceive it, and which <a title="Ade Oshineye's blog posting" href="http://blog.oshineye.com/2011/01/software-craftsmanship-more-than-just.html" target="_blank">Ade Oshineye defends</a>) behind that manifesto.  Writing software <strong><em>is</em></strong> a craft, and there are far too many people who don&#8217;t treat it that way.<span id="more-551"></span></p>
<p>Some of the people who treat software as something other than a craft go the route that Dan North fears, indulging in adding baroque complexity for their own sense of aesthetics.  That, despite Dan&#8217;s suggestion, is not craft, but art.</p>
<p>Yes, a craft implies imbuing a utilitarian product with a certain beauty, but that beauty is not necessarily either &#8220;fancy decorative stuff&#8221; or separate from the value of the product.  In Dan&#8217;s example of a cathedral, the ornamentation and grace is <em>part of the functional aspect</em> of the product.  A cathedral is not merely a glorified hut to keep the rain off.  It is designed to lift peoples&#8217; spirit and guide them to think of things larger and grander than their everyday life.  This is appropriate design for the purpose, and part of &#8220;amazing your customers.&#8221;</p>
<p>The utilitarian beauty of a craftsman is not all cathedrals, however.  Look at the design of Shaker furniture.  It is elegant in its spareness and utility.  It is designed to delight the user without any ornamentation.  This is another way that craft is expressed.</p>
<p>At the other extreme are the programmers who develop systems which result in &#8220;the clanking of information as it rattles from one poorly-implemented system to another, through ill-conceived interfaces.&#8221;  These are the poorly-skilled (in practice, at least) programmers for whom the Software Craftsmanship movement is intended to help.  In many cases, this is a result of a lack of knowledge, a lack of practice, or both.</p>
<p>In the end of his rambling post, it appears that Dan&#8217;s real concern is providing reassurance that systems &#8220;were being built by master craftsmen rather than day jobbers.&#8221;  It&#8217;s the certification issue, again.  <strong><em>Certification does not work</em></strong>.</p>
<p>Certification does <em>not</em> provide such reassurance.  I think a better approach is to increase the general level and availability of craftsmanship in the software industry.  True craftsmanship is often not immediately visible to the customer, but the lack of it becomes visible when systems take a long time to build or modify, and when they exhibit a lot of quirks in usage.</p>
<p>My expectation is that, while programmers may seek to be craftsmen for their own sense of pride, customers will seek craftsmen programmers for the long-term financial rewards.  <em>That&#8217;s</em> where quality pays.</p>
<p><em>(Note: the use of the word &#8220;craftsman&#8221; is not a reference to any gender.)</em></p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=551&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/01/15/software-craftsmanship/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Testing in depth</title>
		<link>http://blog.gdinwiddie.com/2010/03/05/testing-in-depth/</link>
		<comments>http://blog.gdinwiddie.com/2010/03/05/testing-in-depth/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 03:31:42 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=367</guid>
		<description><![CDATA[In the late 1970s, in the Co-Evolution Quarterly, the magazine successor to The Whole Earth Catalog, Peter Warshall stated that geodesic dome houses always leak.  This was a bold and surprising statement at the time, coming from a man who was considered one of the finest builders of dome houses&#8211;ones that didn&#8217;t leak. Why did [...]]]></description>
			<content:encoded><![CDATA[<p>In the late 1970s, in the <em>Co-Evolution Quarterly</em>, the magazine successor to <em>The Whole Earth Catalog</em>, Peter Warshall stated that geodesic dome houses <span style="text-decoration: underline;">always</span> leak.  This was a bold and surprising statement at the time, coming from a man who was considered one of the finest builders of dome houses&#8211;ones that <em>didn&#8217;t</em> leak.</p>
<p>Why did he make this statement?<span id="more-367"></span></p>
<p>He went on to explain, that the design of a dome house depended on a single skin being perfect waterproofing technology.  Traditional houses, by comparison, have multiple imperfect layers.  There are overlapping shingles, which keep <em>most</em> of the water out.  Below that there&#8217;s a layer of tar paper, which keeps out <em>most</em> of what reaches it.  Then there&#8217;s the plywood sheathing, which blocks or absorbs <em>most</em> of what penetrates the tar paper.  Then the attic insulation&#8230;.</p>
<p>No single layer of this system has to be perfect.</p>
<p>Software testing works the same way.  If you depend on one method of testing, you&#8217;re going to leak bugs into production.</p>
<p>If you do unit testing (or micro-testing, as <a title="GeePawHill's blog" href="http://anarchycreek.com/" target="_blank">Mike &#8220;GeePaw&#8221; Hill</a> calls it) of small chunks of code at a low level, you&#8217;ll catch most of the coding mistakes.  Then, if you do small scale integration tests of the code that talks to other systems (such as the database), you&#8217;ll catch most of the remaining ones.  Then higher level integration or acceptance tests that check that the whole system is wired together right will catch most of those that have escaped so far.  Then exploratory testing&#8230;.</p>
<p>Any competent network security professional will tell you that you can&#8217;t protect your network from malicious people by relying on perimeter security.  You have to bake security into other levels of access, too.</p>
<p>Again, the same is true of testing to protect your application from bugs.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=367&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2010/03/05/testing-in-depth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>More on Automated Acceptance Testing</title>
		<link>http://blog.gdinwiddie.com/2010/03/03/more-on-automated-acceptance-testing/</link>
		<comments>http://blog.gdinwiddie.com/2010/03/03/more-on-automated-acceptance-testing/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 01:54:58 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=360</guid>
		<description><![CDATA[Jim Shore has posted a response to the reactions about his previous post on Acceptance Testing in which he defends the way he and the teams he coaches are working.  About the same time, Lisa Crispin posted her thoughts on the topic. As Lisa says, I can’t tell you the one right way to test [...]]]></description>
			<content:encoded><![CDATA[<p>Jim Shore has posted <a title="Jim Shore's blog" href="http://jamesshore.com/Blog/Alternatives-to-Acceptance-Testing.html" target="_blank">a response</a> to the reactions about his <a title="Jim Shore's blog" href="http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html" target="_blank">previous post</a> on Acceptance Testing in which he defends the way he and the teams he coaches are working.  About the same time, Lisa Crispin posted <a title="Lisa Crispin's blog on StickyMinds" href="http://blogs.stickyminds.com/Blogs/tabid/91/EntryId/172/The-One-Right-Way.aspx" target="_blank">her thoughts on the topic</a>.</p>
<p>As Lisa says,</p>
<blockquote><p>I can’t tell you the one right way to test and develop software….  The one right way for your team to code and test will continually evolve over the years. In fact, I’m sorry to tell you that you’ll never find the one right way; it’s a moving target, but you’ll get closer and closer to it.</p></blockquote>
<p>This is an incredibly important point!  There may be many &#8220;wrong&#8221; ways—wrong in that they fail to achieve your objectives—but there is no &#8220;right way.&#8221;  So I’m happy that Jim and his teams are able to achieve the results they want.  I’m not saying they’re doing it wrong.<span id="more-360"></span></p>
<p>At the same time, I’ve seen teams struggle with the increasing burden of acceptance testing and the divergence of understanding between the Customer, the Developers, and the Testers.  And so I continue to explore ways to alleviate that struggle.</p>
<p>Jim describes how the teams discuss concrete examples with the customer.  They then automate those examples (or not) in their own unit and integration tests.  Jim reports that these tests give the programmers confidence that the system is working as desired.  For the customer’s confidence, Jim reports relying on &#8220;a reliable track record of shipping defect-free software.&#8221;</p>
<p>Jim’s argument is that the customer won’t trust the test results before trusting the team.  This is true.  If the customer thinks the developers will fake the test results, then it doesn’t matter how the tests are expressed; you’ve got a serious problem.</p>
<p>I’ve not experienced this level of distrust.  Instead, I’ve experienced customer’s who trust that the developers are working in good faith, but still don’t trust that the developers will ship defect-free software.  And perhaps the developers won’t ship defect-free software.  They’re fallible, just like the rest of us humans.  Maybe they misunderstood the customer’s example.  Or they made an error converting it to code.  Or they didn’t automate that example because they thought it was the same as another that they did automate. Or…</p>
<p>Mistakes happen.  Miscommunication happens.  It’s great that Jim’s developers have that zero bugs attitude, but the customer has the right and obligation to participate in achieving zero bugs.  It can be condescending to take all the responsibility for correctness.</p>
<p>Yes, the customer gets to review the completed software, but we can detect misunderstandings sooner if the customer can read the acceptance tests.  Yes, the developers may produce defect-free software, but miss a test case such that nobody notices right away when a defect is inserted into this feature later.  I want to enable the customer reading the test and saying &#8220;Yes, that’s what I meant.&#8221;  I want to enable the customer saying, &#8220;I’ve thought about another case we don’t have covered.&#8221;  Or &#8220;We’re changing our business rules and this example is no longer correct.&#8221;  Or anything else that’s appropriate.  I want the customer to share that zero bugs attitude.</p>
<p>But is this practice essential?  Obviously not, as Jim and his teams are successful without it.  For many teams transitioning to agile practices, they’ve probably got too many other, more fundamental, practices to learn that they don’t have the energy to tackle this one yet.</p>
<p>Is this practice too expensive in terms of effort?  Maybe.  A lot of people are working on making it less expensive.  If you don’t make it an integral part of the conversations when you first start discussing the story, then it’s likely to seem too expensive.  Then it’s like writing unit tests after the code rather than doing TDD.  To make it work, I think you need to make the customer examples flow from the initial conversation through signaling &#8220;done&#8221; for the developer.  You’ve got to work at making them maintainable, just like the code in the system you’re delivering.</p>
<p>This is just one small practice in a forest of useful practices.  The forest can survive without any single one.  We can almost always find ways to compensate for things we’re not doing.  That’s a double-edged sword, however.  It can also allow us to fritter away our advantages until we’re working in the same old way we’ve always done.  It can blind us to some of the process improvements we could make.  Jim’s &#8220;fix the process description&#8221; is</p>
<blockquote><p>Every escaped defect, whether found in exploratory testing or found by end-users, is a indication of a flaw in the process. When we find one, we fix our process.</p>
<p>The first thing is to analyze the defect, write a test that reproduces it, and fix it. While we&#8217;re fixing it, we look at the design of the code and see if it needs improvement, too.</p>
<p>Next, we conduct Root-Cause Analysis. We ask ourselves, &#8220;What about our process allowed this defect to escape?&#8221; We continue asking &#8220;why&#8221; until we get to the root cause. Once we find it, we make changes to prevent that entire category of defects from happening again.</p></blockquote>
<p>Note that &#8220;fix the process&#8221; could include adding a process of creating Customer Readable Automated Acceptance Tests.  They’re are a tool that I want to keep in my toolbox.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=360&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2010/03/03/more-on-automated-acceptance-testing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Reality of Automated Acceptance Testing</title>
		<link>http://blog.gdinwiddie.com/2010/03/01/the-reality-of-automated-acceptance-testing/</link>
		<comments>http://blog.gdinwiddie.com/2010/03/01/the-reality-of-automated-acceptance-testing/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 20:14:58 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=353</guid>
		<description><![CDATA[Recently, Jim Shore wrote about The Problems With Acceptance Testing.  I like Jim, and respect him a lot.  Because of my respect for his opinions, I found it quite discouraging that he said, &#8220;I no longer use [automated acceptance testing] or recommend it.&#8221;  Gojko Adzic has posted his response to Jim.  This is mine. Certainly [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, Jim Shore wrote about <a title="Jim Shore's blog" href="http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html" target="_blank">The Problems With Acceptance Testing</a>.  I like Jim, and respect him a lot.  Because of my respect for his opinions, I found it quite discouraging that he said, &#8220;I no longer use [automated acceptance testing] or recommend it.&#8221;  Gojko Adzic has posted his <a title="Gojko Adzic's blog" href="http://gojko.net/2010/03/01/are-tools-necessary-for-acceptance-testing-or-are-they-just-evil/" target="_blank">response to Jim</a>.  This is mine.</p>
<p>Certainly when something&#8217;s not giving you the results you want, it&#8217;s time to make a change.  That change can be to drop the practice that&#8217;s not working for you.  It can also be changing the way you go about the practice, or changing what you want to accomplish.  Or, instead of changing, maybe the word &#8220;refining&#8221; is a better fit.<span id="more-353"></span></p>
<p>In my experience, teams that don&#8217;t do automated acceptance testing quickly get to a point where adding new features goes slower and slower, just because it takes longer and longer to test all of the functionality.  Sometimes they start trying to figure out which functionality they need to retest, and which &#8220;couldn&#8217;t possibly be broken by this change.&#8221;  This starts down a very slippery slope.  As <a title="Elisabeth Hendrickson's AAFTT 2007 lightning talk video" href="http://video.google.com/videoplay?docid=4949576318072329085#" target="_blank">Elisabeth Hendrickson says</a>,</p>
<blockquote><p>If the customer has an expectation, they have expressed that expectation, they have every reason to believe you have already fulfilled that expectation, they don&#8217;t want to have to manually go re-verify that you have actually done the thing that you said you did before.</p></blockquote>
<p>Is that so much to expect?</p>
<p>In one of Jerry Weinberg&#8217;s books [<a title="Amazon" href="http://www.amazon.com/gp/product/0932633242?ie=UTF8&amp;tag=alberg30-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0932633242" target="_blank">Quality Software Management: Vol 2, First-Order Measurement</a>, pp. 156-158], he talks about how a one-line change is <em>more likely</em> to introduce a defect than a larger one.  This seems counter-intuitive, until you consider how people drop their guard when they think they&#8217;re making a trivial change.  They don&#8217;t check everything as completely.  When someone doesn&#8217;t check some aspect because &#8220;it couldn&#8217;t possibly be affected&#8221; by this change, they leave the door wide open for Murphy to demonstrate his law.</p>
<p>Given that I&#8217;m convinced things need to be retested, and that the shorter the iteration the more frequently they need to be retested, I&#8217;m not willing to give up on automated tests.  That leaves me looking at what I want to accomplish and how I want to practice it.</p>
<p>Jim describes two problems with automated acceptance tests.</p>
<blockquote><p>These two problems&#8211;that customers don&#8217;t participate, which eliminates the purpose of acceptance testing, and that they create a significant maintenance burden, means that acceptance testing isn&#8217;t worth the cost.</p></blockquote>
<p>About the first problem, lack of customer participation, he says,</p>
<blockquote><p>The planned benefit of those tools is that the customers are supposed to write the examples themselves, thus improving communication between customers and programmers. In practice, I found that customers (a) weren&#8217;t interested in doing that, and (b) often couldn&#8217;t understand and didn&#8217;t trust tests that were written by others. Typically, responsibility for the tests gets handed off to testers, which defeats the whole point.</p></blockquote>
<p>I also have found that customers are not interested in writing tests, themselves.  I don&#8217;t blame them for that.  Nor do I think they would, in general, do a very good job by themselves.  Sending testers (or developers, for that matter) off by themselves to translate discussions into test examples isn&#8217;t any better.  They have the same problems that face the customer, <em>plus</em> the problem of the customer not trusting tests they don&#8217;t understand.</p>
<p>I don&#8217;t, however, think that&#8217;s the way it has to be.</p>
<p>I&#8217;m still working on demonstrating long term results, but I&#8217;ve had some success using automatable examples as a tool to <a title="my blog posting on my &quot;Lingua Franca&quot; talk" href="http://blog.gdinwiddie.com/2010/02/25/a-lingua-franca-between-the-three-or-more-amigos/">enhance the conversation between the customer, the tester, and the developer</a>.  Not to replace the conversation, or to send one person off to write tests, but to add precision to the agreement about what needs to be accomplished.  The goal is for the customer to look at the test and say &#8220;Yes, that&#8217;s what I want.&#8221;</p>
<p>Once we&#8217;ve got that, there are lots of tools available now, and getting better all the time, to help us turn that automatable example into an automated one.  Yes, maintenance is still hard.  Dale Emery has an <a title="Writing Maintainable Automated Acceptance Tests by Dale Emery" href="http://dhemery.com/pdf/writing_maintainable_automated_acceptance_tests.pdf" target="_blank">excellent article</a> on this topic.  We, as an industry, have far to go getting this difficulty under control.  I say, let&#8217;s work on it.</p>
<p>If we approach the development of the examples <em>with</em> the customer and <em>in the terms</em> of the customer, then we&#8217;ve accomplished the hardest part.  It&#8217;s worth spending the extra effort to put these examples to work <em>preventing defects</em> rather than finding them after the fact.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=353&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2010/03/01/the-reality-of-automated-acceptance-testing/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>3 Legs to Standing Up an Agile Project</title>
		<link>http://blog.gdinwiddie.com/2010/02/18/3-legs-to-standing-up-an-agile-project/</link>
		<comments>http://blog.gdinwiddie.com/2010/02/18/3-legs-to-standing-up-an-agile-project/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 05:07:42 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=338</guid>
		<description><![CDATA[Maybe you’re starting your first Agile project.  You’ve read books and blogs.  You’ve had training.  You think you’re ready, but it’s still a daunting prospect.  There’s just so much to remember—so many details. Here’s a little cheat sheet.  Forget all the details and the various ways you can implement Agile for the moment.  Let’s simplify [...]]]></description>
			<content:encoded><![CDATA[<p>Maybe you’re starting your first Agile project.  You’ve read books and blogs.  You’ve had training.  You think you’re ready, but it’s still a daunting prospect.  There’s just <em>so</em> much to remember—so many details.</p>
<p>Here’s a little cheat sheet.  Forget all the details and the various ways you can implement Agile for the moment.  Let’s simplify the picture.  There are just three essential legs that your Agile project needs to stand.  Get those in place, and you’ll do OK.  Keep improving all three, and you’ll do fantastically!<span id="more-338"></span></p>
<p><strong>Arranging the work.</strong></p>
<p>Know what is the goal.  Everybody should know this.  The <em>&#8220;things to be done&#8221;</em> should be fed smoothly to the development team.  Iteration cycles should respect the capacity of the team.  So should release cycles.  Doing these cycles smoothly will allow the team to maximize their capacity better than pushing for higher productivity.  Delay making decisions until they’re really needed, and make use of what you learn in the mean time.  Get the flow going and measure progress in real terms—working software.</p>
<p><strong>Doing the work.</strong></p>
<p>Working in iterations, alone, won’t get the project done.  The team has to do a competent job at doing the work.  If they had trouble delivering before, then better focus on shorter term goals may help, but you still have to work at it.  In addition, the sharp focus of short iterations and measuring working software makes it harder to sweep problems under the rug.  The team <em>could</em> look worse until they get a handle on things.  Set a high standard with your definition of done and keep to it.  This is the <em>real</em> capacity of the team.  Work to improve skills to increase the capacity.  Work to eliminate unnecessary work.</p>
<p><strong>Working together.</strong></p>
<p>An incredible amount of productivity improvements of an Agile team comes from the synergy of working effectively together.  Build a team, a real gelled team, not just a work group assigned to a project.  Support each other.  Help each other grow.  Leave no team member behind.  Solve problems together.  Respect each other.  Respect the differences, the special abilities, the varying perspectives.  These things give the team strength and resilience.</p>
<p>These three legs are enough to stand up a new Agile project.  Use these three categories to organize all those details we put aside at the start of this post.  Use those details to help you steady these three legs.  Experiment and practice until you feel you can succeed at each of these three aspects of your project.  And then keep improving.  Keep looking for things you can do better.  Keep re-evaluating.</p>
<p>It’s really that simple.  I won’t promise that it’s easy.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=338&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2010/02/18/3-legs-to-standing-up-an-agile-project/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

