<?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&#039;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>Wed, 16 May 2012 19:37:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Design for Testability</title>
		<link>http://blog.gdinwiddie.com/2012/05/16/design-for-testability/</link>
		<comments>http://blog.gdinwiddie.com/2012/05/16/design-for-testability/#comments</comments>
		<pubDate>Wed, 16 May 2012 17:36:05 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=935</guid>
		<description><![CDATA[Asked on the Agile-Testing mailing list: Lesson 136: Testability is often a better investment than automation. (I&#8217;m quoting &#8220;Lessons Learned in Software Testing&#8221; by Kaner/Bach/Pettichord) If anyone has practical examples of improving testability, I&#8217;d be very interested to understand, and grateful. I first encountered the issues of testability when working with integrated circuit design in [...]]]></description>
			<content:encoded><![CDATA[<p>Asked on the <a title="Agile-Testing Yahoogroup" href="http://groups.yahoo.com/group/agile-testing/" target="_blank">Agile-Testing</a> mailing list:</p>
<blockquote><p>Lesson 136: Testability is often a better investment than automation.</p>
<p>(I&#8217;m quoting &#8220;Lessons Learned in Software Testing&#8221; by Kaner/Bach/Pettichord)</p>
<p>If anyone has practical examples of improving testability, I&#8217;d be very interested to understand, and grateful.<span id="more-935"></span></p></blockquote>
<p>I first encountered the issues of testability when working with integrated circuit design in the 1980s. The same issues apply to software systems.</p>
<ol>
<li> You want to be able to easily put the system into a known state. It&#8217;s best if you can get to the state you want for your test without going through a number of interactions or other states on the way.</li>
<li> You want to be able to drive internal nodes of the system so that you can test parts in isolation. It&#8217;s much harder to test everything through the GUI, public API, IC pins, or whatever is the normal interface.</li>
<li> You want to be able to sense internal nodes of the system so that you can test parts in isolation. Like being able to drive internal nodes, this reduces the combinatorial complexity.</li>
<li> The special access you add for testability does add some complexity, can provide new failure modes, and might leave some paths untested. Be aware of this and consider what these issues are for your system.</li>
</ol>
<p>Your work gets a bit easier if you consider this as part of building the system, rather than just as part of testing it. If you build your tests first, the tests will specify the state and access you need for testability. Running these tests while the system is built will result in testability appearing almost magically. Because of that, I&#8217;d say that testability trumps automation only when you&#8217;re already late in starting.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=935&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/05/16/design-for-testability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Time to Shut AOL Down</title>
		<link>http://blog.gdinwiddie.com/2012/05/02/time-to-shut-aol-down/</link>
		<comments>http://blog.gdinwiddie.com/2012/05/02/time-to-shut-aol-down/#comments</comments>
		<pubDate>Wed, 02 May 2012 22:49:37 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=932</guid>
		<description><![CDATA[This is an unusual topic for this blog. And a bold statement: It&#8217;s time for AOL to go out of business. Why? Because they are an irresponsible participant in the internet community. They are damaging the internet. I run several mailing lists hosted on DreamHost. I&#8217;ve been having problems the last couple years with bounces [...]]]></description>
			<content:encoded><![CDATA[<p>This is an unusual topic for this blog. And a bold statement: <strong>It&#8217;s time for AOL to go out of business.</strong></p>
<p>Why? Because they are an irresponsible participant in the internet community. <strong>They are damaging the internet.<span id="more-932"></span></strong></p>
<p>I run several mailing lists hosted on <a title="DreamHost" href="http://dreamhost.com/" target="_blank">DreamHost</a>. I&#8217;ve been having problems the last couple years with bounces from AOL for subscribers who have AOL (or CompuServe or Netscape) email addresses. The reason? AOL customers have complained about spam being sent via DreamHost mail servers, so AOL frequently (and randomly, it seems) bounces all mail from a particular mail server. Now, I don&#8217;t know how many domains are hosted on DreamHost, but it&#8217;s a lot. It&#8217;s no surprise that some of them might send some spam, or have their accounts compromised and spam sent in their name. Spam, phishing, and malware emails are the scourge of the internet, but a very hard problem to solve. <strong>Blocking thousands of legitimate email senders will not address the problem.</strong> It&#8217;s gotten so bad that I had to notify my AOL subscribers (via a GMail account, since I couldn&#8217;t otherwise reach them) that it was unlikely they would receive their emails if they continued to use AOL email. The DreamHost customer support has worked on this issue numerous times, just on my behalf. It&#8217;s a losing battle. AOL is not listening. I&#8217;ve thrown in the towel at trying to keep them connected.</p>
<p>An event today added insult to injury. I received a couple of malware links from one of those AOL addresses, sent to me and a number of other addresses. I replied to let the owner of that account know that it was compromised. What happened? You guessed it; AOL bounced the email. It&#8217;s OK for AOL to send malware emails, but not possible for me to report it.</p>
<p>I don&#8217;t seem to have any way to get AOL&#8217;s attention. I&#8217;ve tried sending mail to postmaster@aol.com before, but that seems to go nowhere. I&#8217;ve tried to get their attention via DreamHost&#8217;s support department. I&#8217;ve tried to get their attention by asking their customers, whom they are inconveniencing by blocking legitimate email, to contact AOL&#8217;s support department. It all seems a dead end.</p>
<p>So, I&#8217;d like to see AOL come to a dead end. I&#8217;d like it if all ISPs would start bouncing all email from AOL, just as they do with DreamHost. If AOL cannot play nicely in the internet sandbox, I&#8217;d like for the rest of the internet to shun them as a pariah. I&#8217;m very tired of their pushing work on those of us trying to be good citizens of the net. Let them now become just a painful memory.</p>
<hr />
<p>P.S. DreamHost isn&#8217;t perfect. For the price they charge, I certainly don&#8217;t expect them to be. They&#8217;re an excellent value, though, and I&#8217;ve been mostly happy with them for a number of years. If you&#8217;d like to sign up with them, use the code <code>GD60DOLLAR</code> and you&#8217;ll save $60, subject to their terms for the discount.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=932&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/05/02/time-to-shut-aol-down/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Post-Agile?</title>
		<link>http://blog.gdinwiddie.com/2012/04/23/post-agile/</link>
		<comments>http://blog.gdinwiddie.com/2012/04/23/post-agile/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 10:00:13 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=925</guid>
		<description><![CDATA[Seen on Twitter &#8220;Most people doing Agile today are actually doing Waterfall with Agile terms. Agile is dead.&#8221; There are a lot of people talking about &#8220;post-agile&#8221; now that the word Agile has been taken up by the masses, including those selling products and services with the word without ever doing what some might consider [...]]]></description>
			<content:encoded><![CDATA[<p>Seen on Twitter</p>
<blockquote><p>&#8220;Most people doing Agile today are actually doing Waterfall with Agile terms. Agile is dead.&#8221;</p></blockquote>
<p>There are a lot of people talking about &#8220;post-agile&#8221; now that the word Agile has been taken up by the masses, including those selling products and services with the word without ever doing what some might consider to be truly Agile.<span id="more-925"></span></p>
<p>What did you expect?</p>
<p>It&#8217;s not been so many years since the mailing lists were abuzz with people suggesting Agile to anyone who would listen, and many who would not. Why the shift from pushing Agile to walking away from it? Did you think people would &#8220;see the light&#8221; and be suddenly changed?</p>
<p>Let&#8217;s face it, working in an Agile fashion is hard. It requires paying attention to what you&#8217;re doing and the results of that. It requires thinking and making choices. It requires honoring the thoughts and feelings of those around you. None of this is easy stuff. It doesn&#8217;t just fall into place because you&#8217;ve decided to &#8220;do Agile.&#8221;</p>
<p>It doesn&#8217;t &#8220;just happen&#8221; even when you&#8217;ve been working in an Agile fashion for a decade. Every day is another day of practice. I still make mistakes. I expect that; I just strive to notice and correct them earlier.</p>
<p>I&#8217;m often helping large organizations, or parts of large organization, move to a more Agile process. The process of making that shift is more complicated than the process of Agile, itself. When you have dozens of people affected, each one reacts differently and in a different time scale. When you have hundreds, the same is still true. Large ships turn slowly. Large organizations even more so, as they are not &#8220;one thing&#8221; to be turned.</p>
<p>Often the successful transformations of large organizations do not look Agile to those who work in small ones. There are many aspects that may be compromised or suboptimal in comparison to what a small organization can achieve. Yet large organizations can learn to deliver working software more reliably and more frequently, or at least determine when they can&#8217;t, much sooner. And the working lives of those involved can be much more engaging and rewarding.</p>
<p>Those who are abandoning Agile because &#8220;the wrong people&#8221; have gotten involved and it hasn&#8217;t transformed the world of work into the place envisioned in your dreams, what did you expect? When has anything been a broad and unalloyed success?</p>
<p>Take another look at the successes, at the progress that has been made, and rejoice in that. Do not be discouraged that the struggle to succeed will never cease.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=925&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/04/23/post-agile/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Build a Cache, not a Stash</title>
		<link>http://blog.gdinwiddie.com/2012/03/26/build-a-cache-not-a-stash/</link>
		<comments>http://blog.gdinwiddie.com/2012/03/26/build-a-cache-not-a-stash/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 10:19:14 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Craftmanship]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=916</guid>
		<description><![CDATA[There are many times where a call to get some data is time-consuming or expensive. Perhaps it makes a webservice call, or a network connection to a database, or iterates over a large collection to perform a calculation. If the values isn’t going to change rapidly, and might be needed again soon, it’s natural to [...]]]></description>
			<content:encoded><![CDATA[<p>There are many times where a call to get some data is time-consuming or expensive. Perhaps it makes a webservice call, or a network connection to a database, or iterates over a large collection to perform a calculation. If the values isn’t going to change rapidly, and might be needed again soon, it’s natural to want to save the value for that use.<span id="more-916"></span></p>
<p>Things get a little more complicated when the next use isn’t immediate, or is under the control of external events. Perhaps it depends on what links a user clicks on the UI. No problem—we build a storage mechanism a bit more complex than a variable.</p>
<p>What’s wrong with that?</p>
<p>The problem arises when the code that uses the value has to check in two places for it. Oops! We haven’t build a cache, even if we call it that. Instead the code is just stashing the value in a temporary place. The fact that our code has to check two places is a dead giveaway that we’ve violated the single responsibility principle.</p>
<p>Instead, let our code call for the value as it’s always done. Build a caching facade that sits in front of the expensive call and offers the same API. This facade will have only one purpose: caching those results and returning the cached value if the same request is made. Our original code will have only one purpose: whatever it’s doing that requires it to need those results.</p>
<p>It’s a simple thing, and it avoids a common mistake that introduces complexity and accompanying defects.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=916&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/03/26/build-a-cache-not-a-stash/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Technical debt comes in various varieties</title>
		<link>http://blog.gdinwiddie.com/2012/03/12/technical-debt-comes-in-various-varieties/</link>
		<comments>http://blog.gdinwiddie.com/2012/03/12/technical-debt-comes-in-various-varieties/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 10:16:31 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Responding to Change]]></category>
		<category><![CDATA[Working Software]]></category>
		<category><![CDATA[Craftmanship]]></category>
		<category><![CDATA[Sustainability]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=911</guid>
		<description><![CDATA[Ward Cunningham originally coined the term Technical Debt and described it at OOPSLA 1992 &#8220;Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite&#8230; The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts [...]]]></description>
			<content:encoded><![CDATA[<p>Ward Cunningham originally coined the term Technical Debt and described it at OOPSLA 1992</p>
<blockquote><p>&#8220;Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite&#8230; The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.&#8221;</p></blockquote>
<p>In this, Ward was not referring to poor programming practices,<span id="more-911"></span> but to choices made based on the immediate needs of the time, but which had since been found to be at odds with future needs. An example of this might be a scheduling system that supports recurring events based on Gregorian calendar constructs when the situation also requires other basis such as a Lunar calendar. The concept of technical debt, and the techniques of paying down that debt, allow us to proceed with implementation of a naive or straightforward system knowing that as new requirements come to light, we can refactor to accommodate them. If we’ve built our scheduling system to have a dependency on the Gregorian calendar, we can refactor that to introduce a construct that better fits our needs, e.g. a Scheduling calendar, of which the Gregorian calendar is just one type.</p>
<p>I’m going to call this <strong>domain debt</strong>.</p>
<p>It has become popular in recent years to refer to &#8220;code smells&#8221; (a term apparently coined by Kent Beck) as technical debt. Code smells are things about the code that may not prevent it from working correctly, but that don’t &#8220;seem right&#8221; by the heuristics of an experienced programmer. These issues may span a wide variety of issues, from a method name that seems too general to give a clear understanding of what the method does, to a overly long method that does many things at many levels of abstraction. Some of these smells are stronger than others. Robert C. &#8220;Uncle Bob&#8221; Martin has identified some Principles of Object Oriented Development which are violated by some code smells. There are other &#8220;laws&#8221; of object oriented development, such as the Law of Demeter, which are generally good practice but perhaps not completely universal.</p>
<p>Inattention to code smells leads to a different type of technical debt. This one is based on a naive vision of implementation rather than a naive vision of the domain. It’s my experience that this debt mounts more rapidly. Taking on technical debt in terms of the domain or requirements may be analogous to taking on an automobile load so that we have reliable transportation that allows us to access gainful employment and further our goals. Taking on technical debt in terms of implementation is more analogous to incurring debt for expenses that may not be aligned with our future well-being. A marginal case would be similar to eating out at restaurants and paying with a credit card. While we need sustenance, if we spend more on it than we can afford to immediately pay, we reduce our ability to pay for necessities in the future. Sometimes it might be reasonable if we know the situation is going to change at a particular time, but often people get crushed by debt that grows unchecked in this fashion. Sometimes there are more significant acquisitions of debt such as taking a home equity loan to finance a vacation at an expensive resort. This is surely a recipe for future trouble.</p>
<p>I’m going to call this <strong>implementation debt</strong>.</p>
<p>A third category of problem that is often termed &#8220;technical debt&#8221; in the current vernacular is code that doesn’t work correctly. It may work for some cases, but miss some boundary conditions and either give incorrect answers or blow up spectacularly. I would call this a &#8220;defect&#8221; rather than a &#8220;debt.&#8221; There’s no doubt that, in most cases, such defects are related to technical debt of the second kind, implementation debt.</p>
<p>In the words of C. A. R. Hoare:</p>
<blockquote><p>&#8220;There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies.&#8221;</p></blockquote>
<p>Most forms of implementation debt obscure the purpose of code, forcing us to deal directly with the details of implementation. The goal should be to write code that clearly states both its intent and design. To do this, we must purge it of duplicated functionality and enhance its expressiveness. Note that these are the middle two elements of Kent Beck’s four rules of simple design.</p>
<p>There was a time when it was generally accepted that the expression of the design was in one place, and the code merely followed the design that was expressed. Such a strategy has generally been found wanting. Such a separate design is not executable, and therefore cannot be tested to ensure it has the properties we seek in the system. Even when that separate design is excellent, there is no easy mechanism to ensure that the code follows it.</p>
<p>Fortunately, it has been shown that it’s possible to work from the other end. It’s quite possible to express a design adequately in the code, and use separate design artifacts to explain particular points or as an aid to conversation. To do this, we must purge our code of virtually all implementation debt, so that the design is clearly visible. Then we must keep the design debt at bay, so that our design reflects our current understanding of the problem domain—at least as far as we’ve implemented.</p>
<p><strong>Notes:</strong></p>
<ol>
<li><strong></strong>When asked about this passage, Ward told me, &#8220;I regret using the word &#8216;rewrite&#8217;. We did not use the word refactoring in 1992. I coined the term &#8216;consolidation&#8217; later in the paper to describe the process that now goes by the term refactoring. I never rewrote more than a few dozen lines at a time.&#8221;</li>
<li>Martin Fowler has a nice <a title="Martin Fowler on Technical Debt Quadrants" href="http://martinfowler.com/bliki/TechnicalDebtQuadrant.html" target="_blank">article classifying types of technical debt</a>. I don&#8217;t think I&#8217;d ever read that before writing this one.</li>
</ol>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=911&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/03/12/technical-debt-comes-in-various-varieties/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Lessons from Sailboat Racing</title>
		<link>http://blog.gdinwiddie.com/2012/02/13/lessons-from-sailboat-racing/</link>
		<comments>http://blog.gdinwiddie.com/2012/02/13/lessons-from-sailboat-racing/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 11:38:32 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Craftmanship]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=898</guid>
		<description><![CDATA[Recently, I was attending a sailing seminar on racing small keelboats. As the lecturer talked about the crew requirements for winning races, I noted a lot of similarities with effective software development teams. Both situations require a small group of people to work in coordinated concert to achieve a common goal. No one on the [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I was attending a sailing seminar on racing small keelboats. As the lecturer talked about the crew requirements for winning races, I noted a lot of similarities with effective software development teams. Both situations require a small group of people to work in coordinated concert to achieve a common goal. No one on the team succeeds alone&#8211;they all reach the finish line together. There is a mix of specialized skills and general work that almost anyone can do. And there is a constant need for improvement, coupled with a desire to go fast. <span id="more-898"></span></p>
<p>In casual but competitive racing on a boat the size of mine, a total crew of six is generally considered a full crew. That includes a foredeck person, two jib trimmers, a main trimmer, a helmsman, and moveable ballast who can attend to anything else that needs it. Each of these jobs has specific responsibilities, but most crew members have general enough skills to jump in on other responsibilities when needed. If the crew is smaller, people can take on multiple jobs, though at some expense of efficiency.</p>
<p>One of the recommendations made was to get out on the racecourse an hour before the start and sail, with that crew and in those conditions, for 30 minutes to get acclimated. Then, relax and review what was learned during those 30 minutes. Finally, discuss what is the goal and strategy of the race ahead.</p>
<p>Looking forward at the goal and strategy ahead is very much like chartering. Every project needs a good liftoff. Ainsley Nies and Diana Larsen have just written <a title="Liftoff: Launching Agile Teams &amp; Projects by Diana Larsen and Ainsley Nies" href="http://www.amazon.com/gp/product/097792016X/ref=as_li_ss_tl?ie=UTF8&amp;tag=alberg30-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=097792016X" target="_blank">a great book</a> about why and how that’s necessary.</p>
<p>The pre-race practice at the technical skills of sailing the boat together, and the subsequent retrospective on that practice, are a fairly obvious strategy for sailboat racing. I hadn’t considered it, but I think the same approach would be beneficial for software development. What would happen if you assembled your team prior to chartering and held your own <a title="Building sand castles on a rising tide" href="http://blog.gdinwiddie.com/2010/04/28/building-sand-castles-on-a-rising-tide/" target="_blank">Code Retreat</a> or other day of kata exercises? In one day, each technical member, both programmers and testers, of a small team could pair with every other on the team. They would gain familiarity with each other’s style of working and build a foundation for trust. The katas could be performed using the language and tools expected to be used in the project, but without the pressure to produce shippable functionality.</p>
<p>In sailboat practice, if a tack goes slowly, crew members get confused about their roles, or lines get tangled, then you can immediately stop, discuss it, and try again. In a race, the pressure is on to get things straightened out and then focus on what needs doing next. That &#8220;next thing&#8221; is often harder than it would have been because of the delay and confusion that follows a mistake. The same is true in software development.</p>
<p>&#8220;You can’t improve your fundamentals during a race.&#8221; This was the statement that caught my attention to the parallels between sailboat racing and software development. The lecturer recommended other practice days to hone fundamental skills such as tacking the jib, gybing the spinnaker, and making sail changes. The correlation between a race and a development project starts to break down in this metaphor, but the fact remains that we need to practice to improve. We learn far more if we practice mindfully, thinking about and discussing what we did and what we might have done, and then practice some more.</p>
<p>Most software projects I’ve seen make the assumption that the developers already have sufficient skill, or they should work on their skills on their own time. These things are somewhat true, which make this assumption very seductive. It’s also true that skills can always be improved, and most projects can benefit from spending time on improving those skills. How much time and how often is a balancing act decided in the context of the current skills and abilities, and the needs of the project. Of course, spending all your time on developing skills won’t get the project done, but spending zero time on developing skills is unlikely to be the fastest way to get the project done, also. Even the best teams will find there are new wrinkles to learn on every project.</p>
<p>And if you don’t spend time improving your fundamentals, you’ll lose the race.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=898&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/02/13/lessons-from-sailboat-racing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Running cucumber on jruby under ant</title>
		<link>http://blog.gdinwiddie.com/2012/02/10/running-cucumber-on-jruby-under-ant/</link>
		<comments>http://blog.gdinwiddie.com/2012/02/10/running-cucumber-on-jruby-under-ant/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 17:26:47 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[Continuous Integration]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=902</guid>
		<description><![CDATA[I&#8217;ve just spent more time than I expected getting this to work. It seemed like it would be easy, since running cucumber from the command line is so easy. But ant is very helpful in sanitizing the environment for subprocesses&#8211;a little too helpful, perhaps. After chasing a number of dead ends and increasingly complicated detours, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just spent more time than I expected getting this to work. It seemed like it would be easy, since running <code>cucumber</code> from the command line is so easy. But <code>ant</code> is very helpful in sanitizing the environment for subprocesses&#8211;a little too helpful, perhaps. After chasing a number of dead ends and increasingly complicated detours, I ended up with this target: <span id="more-902"></span></p>
<pre>  &lt;target name="cucumber" description="Run the cucumber tests"&gt;
    &lt;property environment="env" /&gt;
    &lt;exec executable="${jruby.home}/bin/cucumber" &gt;
      &lt;env key="PATH" path="${jruby.home}/bin:${env.PATH}" /&gt;
      &lt;env key="CLASSPATH" file="${jruby.home}/lib/jruby.jar" /&gt;
    &lt;/exec&gt;
  &lt;/target&gt;</pre>
<p>I hope this helps others.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=902&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/02/10/running-cucumber-on-jruby-under-ant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Safety Exercise</title>
		<link>http://blog.gdinwiddie.com/2012/02/06/safety-exercise/</link>
		<comments>http://blog.gdinwiddie.com/2012/02/06/safety-exercise/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 11:37:18 +0000</pubDate>
		<dc:creator>George Dinwiddie</dc:creator>
				<category><![CDATA[Individuals and Interactions]]></category>
		<category><![CDATA[Tools and Techniques]]></category>
		<category><![CDATA[Communication]]></category>
		<category><![CDATA[Retrospectives]]></category>

		<guid isPermaLink="false">http://blog.gdinwiddie.com/?p=891</guid>
		<description><![CDATA[In my recent posting on Separate Retrospectives, I mentioned sometimes performing a Safety Exercise at the beginning of a retrospective where the situation was unknown or seemed a bit charged with emotion. I was asked about that exercise. I use a simple poll of how safe people feel. I got this from Norm Kerth’s book, [...]]]></description>
			<content:encoded><![CDATA[<p>In my recent posting on <a title="Separate Retrospectives" href="http://blog.gdinwiddie.com/2012/01/30/separate-retrospectives/">Separate Retrospectives</a>, I mentioned sometimes performing a Safety Exercise at the beginning of a retrospective where the situation was unknown or seemed a bit charged with emotion. I was asked about that exercise.</p>
<p>I use a simple poll of how safe people feel. I got this from Norm Kerth’s book, <a title="Project Retrospectives on Amazon" href="http://www.amazon.com/exec/obidos/ISBN=0932633447/alberg30-20" target="_blank">Project Retrospectives</a> (page 110). <span id="more-891"></span> Norm describes this as part of an exercise to increase the sense of safety in the room and promote honest and open speech. In the context of a day-long-or-more end-of-project retrospective, then I can see the value of such an exercise. For an heartbeat retrospective, I don’t attempt this. I’m not optimistic about significantly raising the level of trust in a short period of time. There will be other retrospectives, and there will be time to work on trust issues in between. It’s often helpful, though, to bring the issue of trust and safety to the surface.</p>
<p>For getting a sense of the safety in the room, I’ll ask people to rate their feeling using this scale:</p>
<p>1.    I&#8217;ll just keep my mouth shut<br />
2.    I&#8217;ll agree with whatever the group says<br />
3.    I&#8217;ll discuss the non-controversial topics<br />
4.    I&#8217;ll discuss almost anything<br />
5.    I&#8217;m willing to talk about anything</p>
<p>I have everyone write a number on an index card or sticky note as a private ballot, and fold it so the number is not visible. I will then collect the ballots (or delegate to someone who seems both trusted and without power over others) and count the number of each value. On a whiteboard or flip chart I’ll record these with hashmarks. This gives a simple obvious view of the reported safety.</p>
<p>Sometime I’ll point out that this is only the reported level of safety. After all, if someone doesn’t feel safe, they may not feel safe enough to answer this question openly, either. They may give then number that they think is expected, or the one they think others will give.</p>
<p>Retrospectives are difficult in low-trust situations. They’re also a great tool for building trust over time.</p>
          <img src="http://blog.gdinwiddie.com/?ak_action=api_record_view&id=891&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.gdinwiddie.com/2012/02/06/safety-exercise/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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>7</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>8</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>8</slash:comments>
		</item>
	</channel>
</rss>

