<?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</title>
	<atom:link href="http://blog.gdinwiddie.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gdinwiddie.com</link>
	<description>Effective software development</description>
	<lastBuildDate>Mon, 30 Jan 2012 11:18:59 +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>Separate Retrospectives</title>
		<link>http://blog.gdinwiddie.com/2012/01/30/separate-retrospectives/</link>
		<comments>http://blog.gdinwiddie.com/2012/01/30/separate-retrospectives/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 11:18:59 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Retrospectives]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=888</guid>
		<description><![CDATA[I was talking recently with a friend about separate retrospectives for sub-groups. They were worried about thing devolving into separate silos, with a retrospective for programmers, a retrospective for testers, a retrospective for analysts, …. I would be worried if that happened, too, but I can see value in separate retrospectives. How can we know [...]]]></description>
			<content:encoded><![CDATA[<p>I was talking recently with a friend about separate retrospectives for sub-groups. They were worried about thing devolving into separate silos, with a retrospective for programmers, a retrospective for testers, a retrospective for analysts, …. I would be worried if that happened, too, but I can see value in separate retrospectives. How can we know when they’re appropriate and when they’re not? <span id="more-888"></span></p>
<p>I’ve led a separate retrospective for developers (programmers and testers) at a client making an Agile transition. In that situation, it seemed to me that the full-team retrospective concentrated on &#8220;acceptable&#8221; improvements—things that were easy to propose in a corporate environment. And I noticed that a number of the developers didn’t say volunteer anything. That was a clue to me that there were things to be said that people didn’t feel comfortable saying. Given the fact that the Scrummaster was a former project manager, this dynamic wasn’t unexpected. Having a separate retrospective, with a safety exercise at the beginning, allowed some issues to be acknowledged, even if they weren’t tackled.</p>
<p>In my friends situation, the majority of the participants are programmers who have, for the most part, worked with each other at other companies. They know each other well and are working together at this company precisely because they get along and respect each other. That’s all well and good, but the side effect is that there’s a bit of a monoculture among these developers. They readily agree with each other within a limited viewpoint.</p>
<p>You would think that a retrospective would bring out other viewpoints and counteract the hegemony of this group. Unfortunately, the group had settled on &#8220;majority vote&#8221; as their standard means of deciding which topics to pursue in the retrospective. How did they choose that? I don’t know, but I’d guess they voted. Ellen Gottesdiener examines a number of group decision-making approaches in her article &#8220;<a title="Decide How To Decide (PDF)" href="http://www.ebgconsulting.com/Pubs/Articles/DecideHowToDecide-Gottesdiener.pdf " target="_blank">Decide How to Decide</a>.&#8221; (Software Development Magazine, January 2001) While majority vote is fast and efficient, it always results in a loser, and sometimes in a persistent loser. For retrospectives, I prefer &#8220;Spontaneous Agreement&#8221; or &#8220;Consensus.&#8221; When the group I’m facilitating can’t converge on a choice that hears all voices, I’ll sometimes fall back on &#8220;Decision Leader Decides After Discussion&#8221; to give those voices a chance.</p>
<p>If you’re stuck in this sort of situation and you’re not the facilitator or otherwise capable of making the decision, then feedback to the retrospective facilitator might be in order. It could be that the facilitator just hasn’t noticed what is happening. It could also be that the facilitator doesn’t yet have the skills to know what to do about the retrospective being consistently owned by a sub-group. Some helpful feedback, stated in terms of observed behavior and personal impact, might be just the thing to break that log-jam. Or, it might not, particularly when there’s a difference in organizational power between the facilitator and the person who wants to help the situation.</p>
<p>Having a separate retrospective of people locked out of the decision-making in the larger retrospective is an escalation of this approach. If one person has been unable to influence the facilitator’s behavior such that all voices are heard, perhaps the group of disadvantaged people can dig deeper into the problem and come up with some more effective solutions. If this group continues to feel the need for a separate retrospective, though, then it indicates a continuing problem.</p>
<p>That’s not a good sign for the organization. Human dynamics of a given group don’t always work out smoothly. And sometimes organizations fail.  Being deaf to voices have different information, values, or preferences is a good way to fail. The universe doesn’t depend on every organization succeeding. As an individual, there’s always Martin Fowler’s advice, &#8220;<a title="from the XP2000 conference" href="http://martinfowler.com/articles/xp2000.html" target="_blank">Change your organization, or change your organization.</a>&#8220;</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=888&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/01/30/separate-retrospectives/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Contemplating Given-When-Then</title>
		<link>http://blog.gdinwiddie.com/2012/01/23/contemplating-given-when-then/</link>
		<comments>http://blog.gdinwiddie.com/2012/01/23/contemplating-given-when-then/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 17:09:32 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[Communication]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[User Stories]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=882</guid>
		<description><![CDATA[This week, Chris Matts tweeted, &#8220;Contemplating whether GIVEN-WHEN-THEN is back to front. The system should do &#60;outcome&#62; WHEN &#60;event&#62; PROVIDED &#60;stimulus context&#62;&#8230; Hmmm.&#8221; Let’s try an example. &#8220;Given I have $500 in my account, when I withdraw $50 then I have $450 in my account&#8221; becomes &#8220;The system should show $450 in my account when [...]]]></description>
			<content:encoded><![CDATA[<p>This week, <a title="the tweet" href="https://twitter.com/#!/PapaChrisMatts/status/160509230833598465" target="_blank">Chris Matts tweeted</a>, &#8220;Contemplating whether GIVEN-WHEN-THEN is back to front. The system should do &lt;outcome&gt; WHEN &lt;event&gt; PROVIDED &lt;<del>stimulus</del> context&gt;&#8230; Hmmm.&#8221; Let’s try an example. &#8220;Given I have $500 in my account, when I withdraw $50 then I have $450 in my account&#8221; becomes &#8220;The system should show $450 in my account when I withdraw $50 provided I had $500 in my account before.&#8221; It doesn’t exactly roll off the tongue, does it? Putting the result first makes the sentence both more complex and more passive. Yet I can understand the impulse that triggered this tweet. <span id="more-882"></span></p>
<p>Given-When-Then describes the scenario in chronological order, which also makes it easier to automate. Often I don’t implement it in that order, though. Instead, I’ll flesh out the Then with code fixtures first, as the results are the primary focus. The When is usually a straightforward single interaction with the system. The Given describes the business pre-requisites, and these get translated into actions that make the When interaction work. Starting with the Given can lead us astray into specifying things that don’t need to be specified for this scenario.</p>
<p>Sometimes we discover that there are other pre-requisites, too. These may be things that are simply taken for granted or implied by the specified context of the test. We take for granted that the system is up and running. Having money in the account implies that the account has been opened. We also assume that there are no special cases in the context that would invalidate this scenario. The account having a hold put on the account by the fraud department is not a reasonable assumption. This is a case that needs checking, but in another scenario where the special context is explicitly mentioned.</p>
<p>If there are other things that need to be initialized for this test that are not mentioned in the Given setup, then it’s time to pause to reflect. Could this indicate a mismatch between the world envisioned by the business and the implementation in the system? That could be something to correct. Or might it be something that is often implicit in business conversation, but needs to be explicit in the test. Maybe the type of account affects whether or not a fee is applied to withdrawals. Sometimes the business gets into the habit of speaking in shorthand that leaves out some important distinctions.</p>
<p>I’m still happy with &#8220;Given &lt;this context&gt;, when &lt;an interaction occurs&gt; then &lt;a result&gt;&#8221; as a formula for acceptance tests or executable requirements. I don’t know that this is the only good formulation. I’m still looking for others that would naturally occur to business people, and would love to hear some examples if you have them. While I don’t think Do-When-Provided is natural business-speak (I could be wrong in some businesses), it’s good to consider alternatives.</p>
<p>Given-When-Then is a formula. While it can help stimulate our thoughts, it shouldn’t limit them.</p>
<p>In the same manner, Mike Cohn’s canonical expression of a User Story, &#8220;As a &lt;type of user&gt;, I want &lt;some goal&gt; so that &lt;some reason&gt;,&#8221; helps us to remember to think about which user and why they’re requesting this. I generally counsel teams not to actually write their stories in this way, as it often results in a wordy and repetitious list that obscures the essence of the story instead of highlighting it. There’s nothing like a long list of &#8220;As a customer, I want &lt;to do something&gt; so that I can make a purchase.&#8221; The formula can lull you to sleep. I’ve seen examples of this were &#8220;making a purchase&#8221; was not really what the customer wanted, it was the way what the customer wanted was implemented. And I’ve seen &#8220;As a user…&#8221; fill in for customer, obscuring the fact that not all users of the system are customers, and not all stakeholders who want something from the system are users.</p>
<p>These formulae are thinking tools. Use them in ways that provoke thinking. If they’re just chores to be done or checkboxes to be checked, they’re not helping.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=882&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/01/23/contemplating-given-when-then/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Agile Planning Tools</title>
		<link>http://blog.gdinwiddie.com/2012/01/16/agile-planning-tools/</link>
		<comments>http://blog.gdinwiddie.com/2012/01/16/agile-planning-tools/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 08:09:37 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Distributed Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Product backlog]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=878</guid>
		<description><![CDATA[One of the most exhilarating moments in my coaching career was when I entered the client team room one Monday morning to find they were pulling the cards and tape off of their backlog corkboard, and arranging it in a different fashion. I knew then that they had taken charge of their own process. That [...]]]></description>
			<content:encoded><![CDATA[<p>One of the most exhilarating moments in my coaching career was when I entered the client team room one Monday morning to find they were pulling the cards and tape off of their backlog corkboard, and arranging it in a different fashion. I knew then that they had taken charge of their own process. That team became one of the best I’ve coached.</p>
<p>One of the low points was when several people, including a business analyst, product owner proxy, and the program manager, individually said that they couldn’t alter the &#8220;user stories&#8221; to cut across multiple components of the system because they were already in the computerized planning tool (and Word documents) and it would be too much work. That team did not appear to be getting much value from their &#8220;Agile approach&#8221; and had significant integration risk that was being studiously ignored.</p>
<p>One of the most frequently asked questions on public mailing lists and forums devoted to Agile development is &#8220;What Agile Planning Tool should we use?&#8221; There is always a chorus of answers touting this or that computerized tool, usually without asking any questions about the context. Is there one best tool?<span id="more-878"></span></p>
<p>Given the number of such tools available, either for purchase or for free, people are still seeking that perfect tool. Like Lord Franklin seeking the Northwest Passage, some pay a heavy price for that search.</p>
<p>What’s the big difference between the two situations described above? The first difference is that one was using a physical planning tool and the other a computer program. Should we take that as evidence that physical tools are always preferred and computer programs should be eschewed? That would be hasty without looking deeper. Our second &#8220;why was one team more successful than the other&#8221; answer is that the first team adapted their process according to the successes and difficulties they were having. The second held to a &#8220;consistent process&#8221; when it was getting in their way.</p>
<p>One of the biggest problems for teams trying to learn how to be successful with Agile techniques is that they often don’t recognize what’s getting in their way. They’re often trying to do things &#8220;by the book&#8221; to learn Agile practices&#8211;which is a good starting point. But they’ve not yet got enough experience to see the early warning signs of Agile impediments, and by the time they do, they often jump to the conclusion that &#8220;Agile doesn’t work.&#8221;</p>
<p>Let’s look at a recent inquiry on the Agile Project Management yahoogroup. The questioner mentioned that his small team was moving to Agile/Scrum and because they were partially distributed, were looking for &#8220;a product management platform at least to enable a virtualized scrum board and some basic reports like the burn down chart, etc.&#8221;</p>
<p>Some people opined that, because they were distributed, only an electronic tool would work. This isn’t necessarily the case. I’ve heard several reports of successfully using physical boards duplicated at each location. I can see some real advantages to this approach. One of the biggest challenges of distributed development is keeping the assumptions and attention of each location in sync with the others. Talking through the changes on the board on a daily (or more frequent) basis is an excellent means to accomplish this. Having silent changes that happen in the background within a computerized tool while you’re not looking, is not.</p>
<p>As it turns out, the team isn’t really distributed. The product owner and another business stakeholder is remote to the development team. The product owner makes an effort to be regularly engaged, but wants to give more visibility to the other business stakeholder. Using a distributed planning tool for this sets off warning bells in my head. It’s making the daily work of those producing the software more difficult for the benefit of someone who is insufficiently engaged in the process. I often hear the counter argument that &#8220;it’s only a few seconds to use the tool.&#8221; That may be, but those few seconds are multiplied many times over during the course of the project. They become a real drag on productivity and lengthen the cycle times. I’ve not measured the effect, but I’ve seen it clearly. Worst of all, it eventually discourages people from making improvements to their process because they’ve got so much invested in the current incarnation.</p>
<p>There are more insidious effects, too, when an electronic tool is being mandated just to observe from afar without engagement. The information that goes into the tool becomes a public record, and people start worrying about how to make it look good to others rather than how to use it to get work done. This is an even greater productivity friction, and it siphons attention away from the original goal.</p>
<p>The product owner of this team would do far better to develop a sprintly summary for the other stakeholder. Business stakeholders don’t really need visibility into the details within a sprint, anyway. If they truly do, then the sprints are too long. Broadcasting all of the minute details of how people are working just invites micromanagement and breeds distrust.</p>
<p>This is just one case study. In other situations, I would call attention to different details and likely offer different advice. Covering all the cases would be far too much for a blog posting. Besides, the real point is that people need to keep their ultimate goals in mind, and not trade thoughtful observation and decisions for the magic of a virtual tool.</p>
<hr />
<p>P.S. Tim Ottinger and Jeff Langr have published <a title="The Only Agile Tools You'll Ever Need" href="http://pragprog.com/magazines/2011-09/the-only-agile-tools-youll-ever-need" target="_blank">some very good advice</a> on this topic.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=878&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/01/16/agile-planning-tools/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What is Design?</title>
		<link>http://blog.gdinwiddie.com/2012/01/09/what-is-design/</link>
		<comments>http://blog.gdinwiddie.com/2012/01/09/what-is-design/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 03:58:16 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Architect]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=874</guid>
		<description><![CDATA[I see many discussions get heated or go in circles when the topic is &#8220;design.&#8221; In the field of software development, what is design? There are those looking at it from the point of view of usability and fitness for use. Some, often closely aligned with these, use the word &#8220;design&#8221; to talk about the [...]]]></description>
			<content:encoded><![CDATA[<p>I see many discussions get heated or go in circles when the topic is &#8220;design.&#8221; In the field of software development, what is design?<span id="more-874"></span></p>
<p>There are those looking at it from the point of view of usability and fitness for use. Some, often closely aligned with these, use the word &#8220;design&#8221; to talk about the visual aspects. Others, the user experience.</p>
<p>Others look at the manner in which the software is constructed. Those who use the title of &#8220;Software Architect&#8221; often look at the big picture aspects&#8211;what frameworks will be used and how the system will be distributed. DBAs look at the schema of the persisted data as design. Those who write the code see design in the modules, classes, methods and functions&#8211;and how they interact.</p>
<p>Some people think that design is something you do before building the system, often drawing diagrams to illustrate their ideas. Some go so far as to assert that if this is not done prior, the system is not designed at all. Others maintain they can do just as well designing on the fly, mostly capturing the design directly in the code, but also describing it in conversation and sketches. Still others say the real design is &#8220;as built,&#8221; and the original intent is not so important.</p>
<p>People use &#8220;design&#8221; to refer to all sorts of small tidbits in the development process. They abstract some of these and call them &#8220;design patterns.&#8221;</p>
<p>Sometimes people use the word &#8220;design&#8221; to mean &#8220;the important stuff I do while I leave the mere implementation to others.&#8221;</p>
<p>All this is just about software, and is surely not exhaustive. When you add physical products to the mix, the definitions multiply. Any discussion about design that doesn’t develop a shared understanding of what is meant by &#8220;design&#8221; is sure to cause difficulties. And public utterances about design will always be interpreted differently by some people.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=874&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/01/09/what-is-design/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<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>Errors in Project Management</title>
		<link>http://blog.gdinwiddie.com/2011/12/13/errors-in-project-management/</link>
		<comments>http://blog.gdinwiddie.com/2011/12/13/errors-in-project-management/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 06:07:02 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Responding to Change]]></category>
		<category><![CDATA[Estimation]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=860</guid>
		<description><![CDATA[An article in USA Today (December 12, 2012) about highway projects in New York has the sub-head, &#8220;Design errors, planning lapses drove up costs more than 14%.&#8221; Among the things listed that &#8220;drove up costs&#8221; are More asphalt than projected due to a math error More temporary concrete dividers than planned, as plans called for [...]]]></description>
			<content:encoded><![CDATA[<p>An article in USA Today (December 12, 2012) about highway projects in New York has the sub-head, &#8220;Design errors, planning lapses drove up costs more than 14%.&#8221; Among the things listed that &#8220;drove up costs&#8221; are</p>
<ul>
<li>More asphalt than projected due to a math error</li>
<li>More temporary concrete dividers than planned, as plans called for only half what was needed</li>
<li>Unanticipated excavation costs.</li>
</ul>
<p>It’s true that no one likes for costs to exceed estimates, <span id="more-860"></span>but exceeding estimates is a very different thing than driving up costs. Those costs were accurate—it was the estimates that did not agree with later reality. Two of these items are mistakes, but the third is apparently a bit of information that was not known when the estimate was made. Had these mistakes not been made, and the excavation needs known in advance, the result would have been the same costs.</p>
<p>The same is true for estimates on your software projects.</p>
<p>On the other hand, the article describes other work where the state engineers &#8220;never did any quality control review that would allow them to stop and correct things instead of letting the contractors run up the cost.&#8221; This is a real problem.</p>
<p>As projects progress, you learn things—or, at least, you should. You learn that some of your estimates were wrong. You learn there were things you didn’t know. And you learn when the project is in the weeds and no longer producing the expected value.</p>
<p>You learn these things by paying attention to what happens. And, to distinguish the estimation problems from the actual problems, you need to pay attention separately to costs and value. Old-fashioned Earned Value Management gives me heartburn because it makes the simplifying assumption that these are the same—that the value you’ve received on an incomplete project is roughly proportional to what it’s cost you. That just doesn’t seem to be true. Not only are there cases like this one where true progress is stalled but the expenses continue, there are well-run projects that deliver the bulk of the value early using shrewd prioritization of the work.</p>
<p>I don’t know much about highway construction, but I would imagine that it would be possible to measure actual progress by completed miles of roadway. I also imagine the work is not usually done that way. I suspect that it’s common to grade the entire project, then lay down the roadbed, then pave it all, then paint the lines, …</p>
<p>People often work the same way in software development, in architectural layers, so there’s nothing of value until the end when all the pieces are integrated. The result of such a big-bang integration is that problems are hidden until it’s way too late. It’s a great recipe for cost (and time) overruns. Such overruns like to grow in the dark places where no one is watching.</p>
<p>The sad thing is that it’s quite easy to do better. Instead of working in layers or components, implement functional slices of the requirements. The layers and components can be built bit by bit as more and more functionality is completed. And each functional slice provides a usable road that goes somewhere.</p>
<p>The pace of work can be more easily monitored by working in functional slices, also. It’s relatively easy to check whether a function works or not. The sum of functionality can be tracked over time to see how fast the work is proceeding. The total amount of functionality can be estimated to give an estimate of when the work will be done. I like a simple hand-drawn burn-up chart for this, as it doesn’t mislead with unwarranted precision.</p>
<p>And if the rate of completion is less than you hoped, or the cost of the work is higher than anticipated, or hidden work is uncovered, then you can detect it early and make appropriate contingency plans—very similar to what the &#8220;top-performing states&#8221; do when managing highway projects.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=860&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/12/13/errors-in-project-management/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tips and Advice: Test Driven Development</title>
		<link>http://blog.gdinwiddie.com/2011/11/17/tips-and-advice-test-driven-development/</link>
		<comments>http://blog.gdinwiddie.com/2011/11/17/tips-and-advice-test-driven-development/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 13:34:59 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=857</guid>
		<description><![CDATA[Yesterday, Bob Payne published one of our informal Tips and Advice discussions on the Agile Toolkit. Check out our Test Driven Development podcast and let me know what you think.]]></description>
			<content:encoded><![CDATA[<p>Yesterday, Bob Payne published one of our informal Tips and Advice discussions on the Agile Toolkit. Check out our <a title="Test Driven Development podcast on The Agile Toolkit" href="http://agiletoolkit.libsyn.com/webpage/tips-and-advice-test-driven-development-bob-payne-and-george-dinwiddie" target="_blank">Test Driven Development podcast</a> and let me know what you think.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=857&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/11/17/tips-and-advice-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who is&#8230;</title>
		<link>http://blog.gdinwiddie.com/2011/11/16/who-is/</link>
		<comments>http://blog.gdinwiddie.com/2011/11/16/who-is/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 12:34:18 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[About Me]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=851</guid>
		<description><![CDATA[Yesterday, Yves Hanoulle published his interview of me as part of his Who Is series.  It was a good opportunity for a little introspection about myself and my career. He included a photo of me wearing my Red-Green-Refactor TDD hat. This had may be more famous than I am, having been worn by Uncle Bob [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, Yves Hanoulle published his <a title="Who is George Dinwiddie" href="http://www.hanoulle.be/2011/11/who-is-george-dinwiddie/" target="_blank">interview of me</a> as part of his Who Is series.  It was a good opportunity for a little introspection about myself and my career.<span id="more-851"></span></p>
<div id="attachment_852" class="wp-caption alignright" style="width: 250px"><img class="size-full wp-image-852" title="TDD-hat" src="http://blog.gdinwiddie.com/wp-content/uploads/2011/11/TDD-hat.jpg" alt="Red-Green-Refactor Test Driven Development hat" width="240" height="320" /><p class="wp-caption-text">Hat for Test Driven Development</p></div>
<p>He included a photo of me wearing my Red-Green-Refactor TDD hat.  This had may be more famous than I am, having been worn by Uncle Bob Martin in <a title="Clean Code, Episode 6, part 1" href="http://www.cleancoders.com/codecast/clean-code-episode-6-part-1/show" target="_blank">Episode 6 of his CleanCoders videos</a>.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=851&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/11/16/who-is/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Sad Statements</title>
		<link>http://blog.gdinwiddie.com/2011/11/07/sad-statements/</link>
		<comments>http://blog.gdinwiddie.com/2011/11/07/sad-statements/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 10:28:30 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Collaboration]]></category>
		<category><![CDATA[Progress]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=847</guid>
		<description><![CDATA[I hope this will be done by then. These are sad and scary words to me.  When I hear them in the context of a software development project, I associate them with a project unlikely to meet expectations.  Further, it&#8217;s likely that there is no good indicator of what can be delivered when.  With no [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>I hope this will be done by then.</p></blockquote>
<p>These are sad and scary words to me.  When I hear them in the context of a software development project, I associate them with a project unlikely to meet expectations.  Further, it&#8217;s likely that there is no good indicator of what can be delivered when.  With no hard evidence to tell them what&#8217;s possible, and to judge the effects of changes they try, people fall back on a strategy of hope. They no longer feel in control of the situation.</p>
<blockquote><p>We&#8217;ve done our part.</p></blockquote>
<p>This signals the underlying hopelessness. When you can&#8217;t make things come out the way you want, when you can&#8217;t even predict how they will come out, one natural response is to give up. Often the cultural expectations don&#8217;t allow saying &#8220;this project is in trouble.&#8221; The person who does so is the person who will attract all the scrutiny. Without the clear data to back up the perception of trouble, why stick your neck out? Others should be noticing the same thing; let them call attention to it. And when things don&#8217;t work out as &#8220;hoped,&#8221; if weve &#8220;done our part,&#8221; then someone else will get the blame.</p>
<p>You can&#8217;t solve a problem that no one wants to see. Instead, we&#8217;ve found an acceptable way to fail.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=847&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/11/07/sad-statements/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Code of Christmas Past</title>
		<link>http://blog.gdinwiddie.com/2011/11/02/the-code-of-christmas-past/</link>
		<comments>http://blog.gdinwiddie.com/2011/11/02/the-code-of-christmas-past/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 02:34:20 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Craftmanship]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=832</guid>
		<description><![CDATA[When we write code, we’re often thinking about the short term. We need this code to function correctly so we can deliver within our immediate deadlines. I’ve found it important to also think of the long term. Sooner or later, we might encounter our own code, again. I spent a chunk of my career where [...]]]></description>
			<content:encoded><![CDATA[<p>When we write code, we’re often thinking about the short term. We need this code to function correctly so we can deliver within our immediate deadlines. I’ve found it important to also think of the long term. Sooner or later, we might encounter our own code, again.</p>
<p>I spent a chunk of my career where I often worked solo on projects that might get enhanced every year or two. This taught me a lot about the importance of code readability and what sort of things helped me quickly understand and avoid overlooking important considerations. I’ve also worked on a lot of legacy code bases, so I’m well aware of the pain and problems created by code that’s not readable, or is not organized in a helpful manner.<span id="more-832"></span></p>
<p>Last week at the <a title="AgileDC Conference" href="http://agiledc.org/" target="_blank">AgileDC Conference</a>, someone told me they were working on code I had written ten years ago. My first question was, “Are the unit tests still working?” This code was the first production code I ever wrote test-first, and it taught me a lot doing so. I was glad to hear that they had been maintained. When I was writing them, I couldn’t get anyone else interested in test-first development.</p>
<p>Even more gratifying was hearing that they’d recently used some of my code as an example in a discussion of object-oriented programming. The example they’d used was where I’d wrapped an integer in a class. Why would I do that? Because it wasn’t really an integer. It was a database ID. The integer was just an artifact of the database automatically creating ID values using a sequence. It would make no sense to perform arithmetic on it. And there were IDs for various entities that should not be used interchangeably.</p>
<p><img class="aligncenter size-full wp-image-833" title="NumericID" src="http://blog.gdinwiddie.com/wp-content/uploads/2011/11/NumericID.png" alt="Class diagram for a class wrapping an integer" width="483" height="304" /></p>
<p>The integer value was intended to be used only within the Data Access Object that read and wrote the database.</p>
<p>A few years ago, I was asked if I could change an algorithm in some embedded assembly code that I’d written more than ten years prior, and I hadn’t even seen for over ten years. Setting up the development environment wasn’t easy, as much of the hardware was no longer manufactured. The code, however, was not hard to modify. I had implemented the algorithm using state machines and data tables, and had created semi-readable constants for all of the “magic numbers” used.</p>
<p>Code is read much more frequently than it is written. Writing it clearly and expressively pays off when we have to read it next week or next month. Well-written code is also much more likely to be useful for decades into the future. If you write code only for the short term, it’s likely to have only a short life. People will find it necessary to rewrite it rather than maintain it for the long term.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=832&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/11/02/the-code-of-christmas-past/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>5 Minutes to Process Improvement Success</title>
		<link>http://blog.gdinwiddie.com/2011/10/10/5-minutes-to-process-improvement-success/</link>
		<comments>http://blog.gdinwiddie.com/2011/10/10/5-minutes-to-process-improvement-success/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 12:20:33 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Progress]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=828</guid>
		<description><![CDATA[Most of my recent writing has not yet been published. That, and work on the upcoming AgileDC Conference and Agile India beyond that, have meant relatively little output on my blog. I apologize for that. I&#8217;d like to share with you an interview conducted by Bill Fox for his 5 Minutes to Process Improvement Success [...]]]></description>
			<content:encoded><![CDATA[<p>Most of my recent writing has not yet been published. That, and work on the upcoming <a title="AgileDC Conference" href="http://agiledc.org/" target="_blank">AgileDC Conference</a> and <a title="Agile India 2012" href="http://agileindia2012.agilealliance.org/" target="_blank">Agile India</a> beyond that, have meant relatively little output on my blog. I apologize for that.</p>
<p>I&#8217;d like to share with you an interview conducted by Bill Fox for his <a title="Bill Fox's 5 Minutes to Process Improvement Success" href="http://5minutespisuccess.com/" target="_blank">5 Minutes to Process Improvement Success</a> project. My interview, &#8220;Measure Progress in a Way that’s Visible and Reliable,&#8221; is found on page 69 of the PDF.  You&#8217;ll also find interesting interviews with Karen Base, Kevin Schaaff, Hillel Glazer, Scott Ambler, Neil Potter, Bob Payne, Mike Bonamassa, Mario Hyland, Jeff Dalton, Paul E. McMahon, Karl Wiegers, Mary Lynn Penn, Ally Gill, Alan Shalloway, and Tom Cagley. And there are more to come in the future.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=828&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/10/10/5-minutes-to-process-improvement-success/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calling All Coaches and Mentors</title>
		<link>http://blog.gdinwiddie.com/2011/09/26/calling-all-coaches-and-mentors/</link>
		<comments>http://blog.gdinwiddie.com/2011/09/26/calling-all-coaches-and-mentors/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 19:48:01 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Conferences]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=825</guid>
		<description><![CDATA[If you coach Agile teams, if you mentor your peers in better software development practices and processes, or if you are just learning to do these things, the Agile India Coaching and Mentoring stage needs your help.  Please propose sessions about your work and your experiences.]]></description>
			<content:encoded><![CDATA[<p>If you coach Agile teams, if you mentor your peers in better software development practices and processes, or if you are just learning to do these things, the <a href="http://submit2012india.agilealliance.org/node/8734" target="_blank">Agile India Coaching and Mentoring stage</a> needs your help.<em></em>  Please propose sessions about your work and your experiences.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=825&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2011/09/26/calling-all-coaches-and-mentors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

