<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
  <channel>
    <title>
      James Shore
      
    </title>
    <link>http://jamesshore.com</link>
    <description>The Art of Agile</description>
    <language>en</language>
    <copyright>Copyright 2000-2006, James Shore</copyright>
    <generator>Blosxom v2.0</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    
<item>
  <title>Agile Friday: &quot;Done Done&quot; Now Online</title>
  <link>http://jamesshore.com/Blog/Agile-Friday-Done-Done-Now-Online.html</link>
  <category>/Blog</category>
  <pubDate>Fri, 12 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Blog/Agile-Friday-Done-Done-Now-Online.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;12 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Blog/"&gt;James Shore/Blog&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt; won the poll for this week's &lt;cite&gt;Art of Agile Development&lt;/cite&gt; release. I've posted the &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;full text online&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm working a bit ahead (yay, vacation!), so I need to get your thoughts on two more weeks' worth of excerpts. I'd like your suggestions for the &quot;Developing&quot; chapter excerpt, which will be posted on March 26th:&lt;/p&gt;

&lt;script language=&quot;JavaScript&quot; src=&quot;http://www.micropoll.com/akira/MicroPoll?id=239649&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;div&gt;&lt;a href=&quot;http://www.micropoll.com/akira/mpview/847433-239649&quot;&gt;Click Here for Poll&lt;/a&gt;&lt;/div&gt;&lt;/noscript&gt;&lt;!-- END MICROPOLL JAVASCRIPT CODE --&gt;

&lt;p&gt;We also need to choose April 2nd's excerpt, which loops back around to the &quot;Thinking&quot; chapter:&lt;/p&gt;

&lt;script language=&quot;JavaScript&quot; src=&quot;http://www.micropoll.com/akira/MicroPoll?id=239650&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;div&gt;&lt;a href=&quot;http://www.micropoll.com/akira/mpview/847433-239650&quot;&gt;Click Here for Poll&lt;/a&gt;&lt;/div&gt;&lt;/noscript&gt;&lt;!-- END MICROPOLL JAVASCRIPT CODE --&gt;

&lt;p&gt;This week's winner, &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt;, surprised me. I thought &lt;a href=&quot;http://jamesshore.com/Agile-Book/ten_minute_build.html&quot;&gt;Ten-Minute Build&lt;/a&gt; or &lt;a href=&quot;http://jamesshore.com/Agile-Book/continuous_integration.html&quot;&gt;Continuous Integration&lt;/a&gt; would win the day, since they're so central. But they tied for fourth place. In retrospect, getting to &quot;done done&quot; is something I see a lot of teams struggle with, and while I've seen people write about the importance of getting to &quot;done done,&quot; I haven't seen a lot of people writing about &lt;em&gt;how&lt;/em&gt; to do it. Perhaps that's why there was so much interest.&lt;/p&gt;

&lt;p&gt;The final results:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;img src=&quot;http://jamesshore.com/images/star.gif&quot; alt=&quot;**&quot; /&gt; &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt; - 38%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/no_bugs.html&quot;&gt;No Bugs&lt;/a&gt; - 15%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/version_control.html&quot;&gt;Version Control&lt;/a&gt; - 0%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/ten_minute_build.html&quot;&gt;Ten-Minute Build&lt;/a&gt; - 12%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/continuous_integration.html&quot;&gt;Continuous Integration&lt;/a&gt; - 12%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/collective_code_ownership.html&quot;&gt;Collective Code Ownership&lt;/a&gt; - 19%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/documentation.html&quot;&gt;Documentation&lt;/a&gt; - 4%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results are also in for next week's excerpt. &lt;a href=&quot;http://jamesshore.com/Agile-Book/slack.html&quot;&gt;Slack&lt;/a&gt; will be posted on March 19th.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/vision.html&quot;&gt;Vision&lt;/a&gt; - 0%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/release_planning.html&quot;&gt;Release Planning&lt;/a&gt; - 17%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/the_planning_game.html&quot;&gt;The Planning Game&lt;/a&gt; - 11%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/risk_management.html&quot;&gt;Risk Management&lt;/a&gt; - 6%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/iteration_planning.html&quot;&gt;Iteration Planning&lt;/a&gt; - 6%&lt;/li&gt;
	&lt;li&gt; &lt;img src=&quot;http://jamesshore.com/images/star.gif&quot; alt=&quot;**&quot; /&gt; &lt;a href=&quot;http://jamesshore.com/Agile-Book/slack.html&quot;&gt;Slack&lt;/a&gt; - 33%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/stories.html&quot;&gt;Stories&lt;/a&gt; - 11%&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/estimating.html&quot;&gt;Estimating&lt;/a&gt; - 17%&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Blog/Agile-Friday-Done-Done-Now-Online.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Art of Agile Development: &amp;quot;Done Done&amp;quot;</title>
  <link>http://jamesshore.com/Agile-Book/done_done.html</link>
  <category>/Agile-Book</category>
  <pubDate>Fri, 12 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Agile-Book/done_done.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;12 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore/Agile-Book&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/no_bugs.html&quot;&gt;No Bugs&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/releasing_intro.html&quot;&gt;Chapter 7: Releasing&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/releasing_intro.html&quot;&gt;Chapter 7: Releasing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;in 99 words&lt;/h3&gt;

&lt;blockquote class=&quot;ninetynine_words&quot;&gt;

&lt;p&gt;A story is only complete when on-site customers can use it as they intended.  In addition to coding and testing, completed stories are designed, refactored, and integrated.  The build script builds, installs, and migrates data for the story.  Bugs have been identified and fixed (or formally accepted), and customers have reviewed the story and agree it's complete.&lt;/p&gt;

&lt;p&gt;To achieve this result, make progress on everything each day.  Use test-driven development to combine testing, coding, and design.  Keep the build up to date and integrate continuously.  Demonstrate progress to your customers and incorporate their feedback as you go.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;!--

&lt;h3&gt;as haiku&lt;/h3&gt;

&lt;blockquote class=&quot;haiku&quot;&gt;
	&lt;p&gt;&lt;/p&gt;
	
&lt;/blockquote&gt;

--&gt;

&lt;h3&gt;Commentary&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Blog/The-Cornerstone-of-Agile-Planning.html&quot;&gt;The Cornerstone of Agile Planning&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Full Text&lt;/h3&gt;

&lt;p&gt;The following text is excerpted from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; by James Shore and Shane Warden (O'Reilly 2007). Copyright &amp;copy 2008 James Shore and chromatic. All rights reserved.&lt;/p&gt;

&lt;h2&gt;&quot;Done Done&quot;&lt;/h2&gt;

&lt;dl class=&quot;audience&quot;&gt;&lt;dt&gt;Audience&lt;/dt&gt;&lt;dd&gt;Whole Team&lt;/dd&gt;&lt;/dl&gt;

&lt;p class=&quot;goal&quot;&gt;We're done when we're production-ready.&lt;/p&gt;

&lt;p&gt;&quot;Hey, Liz!&quot; Rebecca sticks her head into Liz's office.  &quot;Did you finish that new feature yet?&quot;&lt;/p&gt;

&lt;p&gt;Liz nods.  &quot;Hold on a sec,&quot; she says, without pausing in her typing.  A flurry of keystrokes crescendos and then ends with a flourish.  &quot;Done!&quot;  She swivels around to look at Rebecca.  &quot;It only took me half a day, too.&quot;&lt;/p&gt;

&lt;p&gt;&quot;Wow, that's impressive,&quot; says Rebecca.  &quot;We figured it would take at least a day, probably two.  Can I look at it now?&quot;&lt;/p&gt;

&lt;p&gt;&quot;Well, not quite,&quot; says Liz.  &quot;I haven't integrated the new code yet.&quot;&lt;/p&gt;

&lt;p&gt;&quot;Okay,&quot; Rebecca says.  &quot;But once you do that, I can look at it, right?  I'm eager to show it to our new clients.  They picked us precisely because of this feature.  I'm going to install the new build on their test bed so they can play with it.&quot;&lt;/p&gt;

&lt;p&gt;Liz frowns.  &quot;Well, I wouldn't show it to anybody.  I haven't tested it yet.  And you can't install it anywhere&amp;mdash;I haven't updated the installer or the database schema generator.&quot;&lt;/p&gt;

&lt;p&gt;&quot;I don't understand,&quot; Rebecca says irritably.  &quot;I thought you said you were done!&quot;&lt;/p&gt;

&lt;p&gt;&quot;I am,&quot; insists Liz.  &quot;I finished coding just as you walked in.  Here, I'll show you.&quot;&lt;/p&gt;

&lt;p&gt;&quot;No, no, I don't need to see the code,&quot; Rebecca says.  &quot;I need to be able to show this to our customers.  I need it to be finished.  &lt;em&gt;Really&lt;/em&gt; finished.&quot;&lt;/p&gt;

&lt;p&gt;&quot;Well, why didn't you say so?&quot; says Liz.  &quot;This feature is done&amp;mdash;all coded up.  It's just not &lt;em&gt;done&lt;/em&gt; done.  Give me a few more days.&quot;&lt;/p&gt;

&lt;h3&gt;Production-Ready Software&lt;/h3&gt;

&lt;blockquote class=&quot;coach&quot;&gt;You should able to deploy the software at the end of any iteration.&lt;/blockquote&gt;

&lt;p&gt;Wouldn't it be nice if, once you finished a story, you never had to come back to it?  That's the idea behind &quot;&lt;em&gt;done done&lt;/em&gt;.&quot;  A completed story isn't a lump of unintegrated, untested code.  It's ready to deploy.&lt;/p&gt;

&lt;p&gt;Partially-finished stories result in hidden costs to your project.  When it's time to release, you have to complete an unpredictable amount of work.  This destabilizes your release planning efforts and prevents you from meeting your commitments.&lt;/p&gt;

&lt;p&gt;To avoid this problem, make sure all of your planned stories are &quot;done done&quot; at the end of each iteration.  You should be able to deploy the software at the end of any iteration, although normally you'll wait until more features have been developed.&lt;/p&gt;

&lt;p&gt;What does it take for software to be &quot;done done&quot;?  That depends on your organization.  I often explain that a story is only complete when the customers can use it as they intended.  Create a checklist that shows the story completion criteria.  I write mine on the iteration planning board:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;Tested (all unit, integration, and customer tests finished)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Coded (all code written)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Designed (code refactored to the team's satisfaction)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Integrated (the story works from end to end&amp;mdash;typically, UI to database&amp;mdash;and fits into the rest of the software)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Builds (the build script includes any new modules)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Installs (the build script includes the story in the automated installer)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Migrates (the build script updates database schema if necessary; the installer migrates data when appropriate)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Reviewed (customers have reviewed the story and confirmed that it meets their expectations)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Fixed (all known bugs have been fixed or scheduled as their own stories)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Accepted (customers agree that the story is finished)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/the_xp_team.html&quot;&gt;The XP Team&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Some teams add &quot;Documented&quot; to this list, meaning that the story has documentation and help text.  This is most appropriate when you have a technical writer as part of your team.&lt;/p&gt;

&lt;p&gt;Other teams include &quot;Performance&quot; and &quot;Scalability&quot; in their &quot;done done&quot; list, but these can lead to premature optimization.  I prefer to schedule performance, scalability, and similar issues with dedicated stories (see &lt;a href=&quot;http://jamesshore.com/Agile-Book/performance_optimization.html&quot;&gt;Performance Optimization&lt;/a&gt; in Chapter 9).&lt;/p&gt;

&lt;h3&gt;How to Be &quot;Done Done&quot;&lt;/h3&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Make a little progress on every aspect of your work every day.&lt;/blockquote&gt;

&lt;p&gt;XP works best when you make a little progress on every aspect of your work every day, rather than reserving the last few days of your iteration for getting stories &quot;done done.&quot;  This is an easier way to work, once you get used to it, and it reduces the risk of finding unfinished work at the end of the iteration.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Allies&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/test_driven_development.html&quot;&gt;Test-Driven Development&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/continuous_integration.html&quot;&gt;Continuous Integration&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/ten_minute_build.html&quot;&gt;Ten-Minute Build&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Use test-driven development to combine testing, coding, and designing.  When working on an engineering task, make sure it integrates with the existing code.  Use continuous integration and keep the ten-minute build up to date.  Create an engineering task (see &lt;a href=&quot;http://jamesshore.com/Agile-Book/iteration_planning.html&quot;&gt;Iteration Planning&lt;/a&gt; in Chapter 9) for updating the installer and have one pair work on it in parallel with the other tasks for the story.&lt;/p&gt;

&lt;p&gt;Just as importantly, include your on-site customers in your work.  As you work on a UI task, show a customer what the screen will look like, even if it doesn't work yet (see &lt;a href=&quot;http://jamesshore.com/Agile-Book/incremental_requirements.html&quot;&gt;Incremental Requirements&lt;/a&gt; in Chapter 9).  Customers often want to tweak a UI when they see it for the first time.  This can lead to a surprising amount of last-minute work if you delay any demos to the end of the iteration.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/exploratory_testing.html&quot;&gt;Exploratory Testing&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Similarly, as you integrate various pieces, run the software to make sure they all work together.  While this shouldn't take the place of testing, it's a good check to help prevent you from missing anything.  Enlist the help of the testers on occasion and ask them to show you exploratory testing techniques.  (Again, this review doesn't replace real exploratory testing.)&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/no_bugs.html&quot;&gt;No Bugs&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Throughout this process, you may find mistakes, errors, or outright bugs.  When you do, fix them right away&amp;mdash;then improve your work habits to prevent that kind of error from occurring again.&lt;/p&gt;

&lt;p&gt;When you believe the story is &quot;done done,&quot; show it to your customers for final acceptance review.  Because you reviewed your progress with customers throughout the iteration, this should only take a few minutes.&lt;/p&gt;

&lt;h3&gt;Making Time&lt;/h3&gt;

&lt;p&gt;This may seem like an impossibly large amount of work to do in just one week.  It's easier to do if you work on it throughout the iteration rather than saving it up for the last day or two.  The real secret, though, is to make your stories small enough that you can completely finish them all in a single week.&lt;/p&gt;

&lt;p&gt;Many teams new to XP create stories that are too large to get &quot;done done.&quot;  They finish all of the coding, but they don't have enough time to completely finish the story&amp;mdash;perhaps the UI is a little off, or a bug snuck through the cracks.&lt;/p&gt;

&lt;p&gt;Remember, &lt;em&gt;you&lt;/em&gt; are in control of your schedule.  &lt;em&gt;You&lt;/em&gt; decide how many stories to sign up for and how big they are.  Make any story smaller by splitting it into multiple parts (see &lt;a href=&quot;http://jamesshore.com/Agile-Book/stories.html&quot;&gt;Stories&lt;/a&gt; in Chapter 8) and only working on one of the pieces this iteration.&lt;/p&gt;

&lt;p&gt;Creating large stories is a natural mistake, but some teams compound the problem by thinking, &quot;well, we really &lt;em&gt;did&lt;/em&gt; finish the story, except for that one little bug.&quot;  They give themselves credit for the story, which inflates their velocity and perpetuates the problem.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;If a story isn't &quot;done done&quot;, don't count it towards your velocity.&lt;/blockquote&gt;

&lt;p&gt;If you have trouble getting your stories &quot;done done,&quot; don't count those stories towards your velocity (see &lt;a href=&quot;http://jamesshore.com/Agile-Book/estimating.html&quot;&gt;Estimating&lt;/a&gt; in Chapter 8).  Even if the story only has a few minor UI bugs, count it as a zero when calculating your velocity.  This will lower your velocity, which will help you choose a more manageable amount of work in your next iteration.&lt;/p&gt;

&lt;p&gt;You may find that this lowers your velocity so much that you can only schedule one or two stories in an iteration.  That means that your stories were too large to begin with.  Split the stories you have and work on making future stories smaller.&lt;/p&gt;

&lt;h3&gt;Questions&lt;/h3&gt;

&lt;h4 class=&quot;faq&quot;&gt;How does testers' work fit into &quot;done done&quot;?&lt;/h4&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/exploratory_testing.html&quot;&gt;Exploratory Testing&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;In addition to helping customers and programmers, testers are responsible for nonfunctional testing and exploratory testing.  Typically, they do these only &lt;em&gt;after&lt;/em&gt; stories are &quot;done done&quot;.  They may perform some non-functional tests, however, in the context of a specific performance story.&lt;/p&gt;

&lt;p&gt;Regardless, the testers are part of the team, and everyone on the team is responsible for helping the team meet its commitment to deliver &quot;done done&quot; stories at the end of the iteration.  Practically speaking, this usually means that testers help customers with customer testing, and they may help programmers and customers review the work in progress.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;What if we release a story that we think is &quot;done done,&quot; but then we find a bug or stakeholders tell us they want changes?&lt;/h4&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/slack.html&quot;&gt;Slack&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;If you can absorb the change with your slack, go ahead and make the change.  Turn larger changes into new stories.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/release_planning.html&quot;&gt;Release Planning&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;This sort of feedback is normal&amp;mdash;expect it.  The product manager should decide whether the changes are appropriate, and if they are, he should modify the release plan.  If you are constantly surprised by stakeholder changes, consider whether your on-site customers truly reflect your stakeholder community.&lt;/p&gt;

&lt;h3&gt;Results&lt;/h3&gt;

&lt;p&gt;When your stories are &quot;done done,&quot; you avoid unexpected batches of work and spread wrap-up and polish work throughout the iteration.  Customers and testers have a steady workload through the entire iteration.  The final customer acceptance demonstration takes only a few minutes.  At the end of each iteration, your software is ready to demonstrate to stakeholders with the scheduled stories working to their satisfaction.&lt;/p&gt;

&lt;h3&gt;Contraindications&lt;/h3&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Allies&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/iteration_planning.html&quot;&gt;Iteration Planning&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/stories.html&quot;&gt;Stories&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/the_xp_team.html&quot;&gt;The XP Team&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/sit_together.html&quot;&gt;Sit Together&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/incremental_design.html&quot;&gt;Incremental Design And Architecture&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/test_driven_development.html&quot;&gt;Test-Driven Development&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;This practice may seem advanced.  It's not, but it does require self-discipline.  To be &quot;done done&quot; every week, you must also work in iterations and use small, customer-centric stories.&lt;/p&gt;

&lt;p&gt;In addition, you need a whole team&amp;mdash;one that includes customers and testers (and perhaps a technical writer as well) in addition to programmers.  The whole team must sit together.  If they don't, the programmers won't be able to get the feedback they need in order to finish the stories in time.&lt;/p&gt;

&lt;p&gt;Finally, you need incremental design and architecture and test-driven development in order to test, code, and design each story in such a short timeframe.&lt;/p&gt;

&lt;h3&gt;Alternatives&lt;/h3&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Allies&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/release_planning.html&quot;&gt;Release Planning&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/trust.html&quot;&gt;Trust&lt;/a&gt;&lt;/dd&gt;&lt;dd class='separated'&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/energized_work.html&quot;&gt;Energized Work&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;This practice is the cornerstone of XP planning.  If you aren't &quot;done done&quot; at every iteration, your velocity will be unreliable.  You won't be able to ship at any time.  This will disrupt your release planning and prevent you from meeting your commitments, which will in turn damage stakeholder trust.  It will probably lead to increased stress and pressure on the team, hurt team morale, and damage the team's capacity for energized work.&lt;/p&gt;

&lt;p&gt;The alternative to being &quot;done done&quot; is to fill the end of your schedule with make-up work.  You will end up with an indeterminate amount of work to fix bugs, polish the UI, create an installer, and so forth.  Although many teams operate this way, it will damage your credibility and your ability to deliver.  I don't recommend it.&lt;/p&gt;

&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/no_bugs.html&quot;&gt;No Bugs&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/releasing_intro.html&quot;&gt;Chapter 7: Releasing&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/releasing_intro.html&quot;&gt;Chapter 7: Releasing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Agile-Book/done_done.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Art of Agile Development: Chapter 7: Releasing</title>
  <link>http://jamesshore.com/Agile-Book/releasing_intro.html</link>
  <category>/Agile-Book</category>
  <pubDate>Fri, 12 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Agile-Book/releasing_intro.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;12 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore/Agile-Book&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/reporting.html&quot;&gt;Reporting&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Full Text&lt;/h3&gt;

&lt;p&gt;The following text is excerpted from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; by James Shore and Shane Warden (O'Reilly 2007). Copyright &amp;copy 2008 James Shore and chromatic. All rights reserved.&lt;/p&gt;

&lt;h2&gt;Releasing&lt;/h2&gt;

&lt;p&gt;What is the value of code?  Agile developers value &quot;working software over comprehensive documentation.&quot;&lt;sup&gt;1&lt;/sup&gt;  Does that mean a requirements document has no value?  Does it mean unfinished code has no value?&lt;/p&gt;

&lt;p class=&quot;aside&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;The Agile Manifesto, &lt;cite&gt;http://www.agilemanifesto.org/&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Like a rock at the top of a hill, code has &lt;em&gt;potential&lt;/em&gt;&amp;mdash;potential energy for the rock and potential value for the code.  It takes a push to realize that potential.  The rock has to be pushed onto a slope in order to gain kinetic energy; the software has to be pushed into production in order to gain value.&lt;/p&gt;

&lt;p&gt;It's easy to tell how much you need to push a rock.  Big rock?  Big push.  Little rock?  Little push.  Software isn't so simple&amp;mdash;it often looks ready to ship long before it's actually done.  It's my experience that teams underestimate how hard it will be to push their software into production.&lt;/p&gt;

&lt;p&gt;To make things worse, software's potential value changes.  If nothing ever pushes that rock, it will sit on top of its hill forever; its potential energy won't change.  Software, alas, sits on a hill that undulates.  You can usually tell when your hill is becoming a valley, but if you need weeks or months to get your software rolling, it might be sitting in a ditch by the time you're ready to push.&lt;/p&gt;

&lt;p&gt;In order to meet commitments and take advantage of opportunities, you must be able to push your software into production within minutes.  This chapter contains seven practices that give you leverage to turn your big release push into a ten-minute tap:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt;&lt;/em&gt; ensures that completed work is ready to release.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/no_bugs.html&quot;&gt;No Bugs&lt;/a&gt;&lt;/em&gt; allows you to release your software without a separate testing phase.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/version_control.html&quot;&gt;Version Control&lt;/a&gt;&lt;/em&gt; allows team members to work together without stepping on each others' toes.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;A &lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/ten_minute_build.html&quot;&gt;Ten-Minute Build&lt;/a&gt;&lt;/em&gt; builds a tested release package in under ten minutes.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/continuous_integration.html&quot;&gt;Continuous Integration&lt;/a&gt;&lt;/em&gt; prevents a long, risky integration phase.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/collective_code_ownership.html&quot;&gt;Collective Code Ownership&lt;/a&gt;&lt;/em&gt; allows the team to solve problems no matter where they may lie.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Post-hoc &lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/documentation.html&quot;&gt;Documentation&lt;/a&gt;&lt;/em&gt; decreases the cost of documentation and increases its accuracy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;sidebar&quot;&gt;&lt;h3&gt;&quot;Releasing&quot; Mini-Etude&lt;/h3&gt;
 
 &lt;p&gt;The purpose of this &amp;eacute;tude is to examine pushing your software into production. If you're new to agile development, you may use it to create a map of all the steps involved in releasing software, even if you're not currently using XP. If you're an experienced agile practitioner, review Chapter 13 and use this &amp;eacute;tude to help you modify your process to remove communication bottlenecks.&lt;/p&gt;
 
 &lt;p&gt;Conduct this &amp;eacute;tude for a timeboxed half-hour every day for as long as it is useful. Expect to feel rushed by the deadline at first. If the &amp;eacute;tude becomes stale, discuss how you can change it to make it interesting again.&lt;/p&gt;
 
 &lt;p&gt;You will need red and green index cards, an empty table or magnetic whiteboard for your &lt;em&gt;value stream map&lt;/em&gt;,&lt;sup&gt;2&lt;/sup&gt; and writing implements for everyone.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt;  Start by forming heterogeneous pairs&amp;mdash;have a programmer work with a customer, a customer work with a tester, and so forth, rather than pairing by job description.  Work with a new partner every day.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 2.&lt;/strong&gt;  &lt;em&gt;Timebox this step to 10 minutes.&lt;/em&gt;  Within pairs, consider all of the activities that have to happen between the time someone has an idea and when you can release idea to real users or customers.  Count an iteration as one activity, and group together any activities that take less than a day.  Consider time spent waiting as an activity, too.  If you can't think of anything new, pick an existing card and skip to Step 3.&lt;/p&gt;
 
 &lt;p&gt;Choose at least one task, and write it on a &lt;em&gt;red&lt;/em&gt; card.  Reflect on all of the times you have performed this activity.  If you have released software, use your experience; do not speculate.  How long did it take?  Think in terms of calendar time, not effort.  Write three times down on the card: the &lt;em&gt;shortest&lt;/em&gt; time you can remember, the &lt;em&gt;longest&lt;/em&gt; time you can remember, and the &lt;em&gt;typical&lt;/em&gt; time required.  (See Figure.)&lt;/p&gt;
 
 &lt;div style='text-align: center'&gt;
 
 
 
 &lt;p&gt;&lt;img width=&quot;67%&quot; src=&quot;http://jamesshore.com/images/art-of-agile/figs/releasing_intro__sample_card.gif&quot; alt=&quot;figure (releasing_intro__sample_card.gif)&quot; /&gt;&lt;/p&gt;
 
&lt;p class='caption'&gt;Figure. A sample card.&lt;/p&gt;&lt;/div&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 3.&lt;/strong&gt;  &lt;em&gt;Timebox this step to 10 minutes.&lt;/em&gt;  Discuss things that your team can do to &lt;em&gt;reduce&lt;/em&gt; the time required for this activity or &lt;em&gt;eliminate&lt;/em&gt; it entirely.  Choose just one idea and write it on a &lt;em&gt;green&lt;/em&gt; card.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 4.&lt;/strong&gt;  &lt;em&gt;Timebox this step to 10 minutes.&lt;/em&gt;  As a team, discuss your cards and place them on the table or whiteboard in a value stream map.  Place activities (red cards) that must happen first before activities that can happen afterward.  (See Figure.)  If you're using a whiteboard, draw arrows between the cards to make the flow of work more clear.  Place green cards underneath red cards.&lt;/p&gt;
 
 &lt;p&gt;Consider these discussion questions:&lt;/p&gt;
 
 &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;At which step does work pile up?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Which results surprise you?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Who is the constraint in the overall system?  How can you improve the performance of the overall system?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Are there green cards with ideas you can adopt now?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
 
 &lt;div style='text-align: center'&gt;
 
 
 
 &lt;p&gt;&lt;img width=&quot;67%&quot; src=&quot;http://jamesshore.com/images/art-of-agile/figs/releasing_intro__value_stream_map.gif&quot; alt=&quot;figure (releasing_intro__value_stream_map.gif)&quot; /&gt;&lt;/p&gt;
 
&lt;p class='caption'&gt;Figure. A sample value stream map.&lt;/p&gt;&lt;/div&gt;
 
&lt;/blockquote&gt;

&lt;p class=&quot;aside&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;The value stream map was inspired by [Poppendieck &amp;amp; Poppendieck].&lt;/p&gt;


&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/reporting.html&quot;&gt;Reporting&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Agile-Book/releasing_intro.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Art of Agile Development: Sit Together</title>
  <link>http://jamesshore.com/Agile-Book/sit_together.html</link>
  <category>/Agile-Book</category>
  <pubDate>Fri, 05 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Agile-Book/sit_together.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;05 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore/Agile-Book&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/real_customer_involvement.html&quot;&gt;Real Customer Involvement&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/trust.html&quot;&gt;Trust&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/collaborating_intro.html&quot;&gt;Chapter 6: Collaborating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;in 99 words&lt;/h3&gt;

&lt;blockquote class=&quot;ninetynine_words&quot;&gt;

&lt;p&gt;Sitting together fuels team communication.  This has impressive results, cutting time-to-market by two thirds in one field study&lt;sup&gt;*&lt;/sup&gt;.  It enables simultaneous phases, eliminates waste, and allows team members to contribute insights to others' conversations.&lt;/p&gt;

&lt;p&gt;To sit together, create an open workspace.  This takes longer than you expect.  Organize your workspace around pairing stations, locating people according to conversations they should overhear.  Provide plenty of whiteboard space.  Make sure there's room for personal effects and a place for private conversations.&lt;/p&gt;

&lt;p&gt;Open workspaces are hard for some to accept.  Get team members' permission before switching, or they may rebel.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p class=&quot;footnote&quot;&gt;&lt;sup&gt;*&lt;/sup&gt;Teasley, Stephanie, Lisa Covi, M. S. Krishnan, Judith Olson.  2002.  &quot;Rapid Software Development Through Team Collocation.&quot;  &lt;cite&gt;IEEE Trans. Softw. Eng.&lt;/cite&gt;  28(7):671-83.  &lt;a href=&quot;http://dx.doi.org/10.1109/TSE.2002.1019481&quot;&gt;http://dx.doi.org/10.1109/TSE.2002.1019481&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;as haiku&lt;/h3&gt;

&lt;blockquote class=&quot;haiku&quot;&gt;

	&lt;p&gt;
	&lt;br /&gt;mulch builds the soil;
	&lt;br /&gt;herbs bring bees, bulbs repel grass:
	&lt;br /&gt;come autumn, apples
	&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h3&gt;Behind the Scenes&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Blog/Time-Lapse-Author.html&quot;&gt;Time-Lapse Author&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Full Text&lt;/h3&gt;

&lt;p&gt;The following text is excerpted from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; by James Shore and Shane Warden (O'Reilly 2007). Copyright &amp;copy 2008 James Shore and chromatic. All rights reserved.&lt;/p&gt;

&lt;h2&gt;Sit Together&lt;/h2&gt;

&lt;dl class=&quot;audience&quot;&gt;&lt;dt&gt;Audience&lt;/dt&gt;&lt;dd&gt;Whole Team&lt;/dd&gt;&lt;dd&gt;Coaches&lt;/dd&gt;&lt;/dl&gt;

&lt;p class=&quot;goal&quot;&gt;We communicate rapidly and accurately.&lt;/p&gt;

&lt;p&gt;If you've tried to conduct a team meeting via speakerphone, you know how much of a difference face-to-face conversations make.  Compared to an in-person discussion, teleconferences are slow and stuttered, with uncomfortable gaps in the conversation and people talking over each other.&lt;/p&gt;

&lt;p&gt;What you may not have realized is how much this affects your work.&lt;/p&gt;

&lt;p&gt;Imagine you're a programmer on a nonagile team and you need to clarify something in your requirements document in order to finish an algorithm.  You fire off an email to your domain expert, Mary, then take a break to stretch your legs and get some coffee.&lt;/p&gt;

&lt;p&gt;When you get back, Mary still hasn't responded, so you check out a few technical blogs that you've been meaning to read.  Half an hour later, your inbox chimes.  Mary has responded.&lt;/p&gt;

&lt;p&gt;Uh-oh... it looks like Mary misunderstood your message and answered the wrong question.  You send another query, but you really can't afford to wait any longer.  You take your best guess at the answer&amp;mdash;after all, you've been working at this company for a long time, and you know most of the answers&amp;mdash;and get back to work.&lt;/p&gt;

&lt;p&gt;A day later, after exchanging a few more emails, you've hashed out the correct answer with Mary.  It wasn't exactly what you thought, but you were pretty close.  You go back and fix your code.  While in there, you realize that there's an edge case nobody's handled yet.&lt;/p&gt;

&lt;p&gt;You could bug Mary for the answer, but this is a very obscure case.  It's probably never going to happen in the field.  Besides, Mary's very busy and you promised that you'd have this feature done yesterday.  (In fact, you &lt;em&gt;were&lt;/em&gt; done yesterday, except for all these nitpicky little details.)  You put in the most likely answer and move on.&lt;/p&gt;

&lt;h3&gt;Accommodating Poor Communication&lt;/h3&gt;

&lt;p&gt;As the distance between people grows, the effectiveness of their communication decreases.  Misunderstandings occur and delays creep in.  People start guessing to avoid the hassle of waiting for answers.  Mistakes appear.&lt;/p&gt;

&lt;p&gt;To combat this problem, most development methods attempt to reduce the need for direct communication.  It's a sensible response.  If questions lead to delays and errors, reduce the need to ask questions!&lt;/p&gt;

&lt;p&gt;The primary tools teams use to reduce reliance on direct communication are development phases and work-in-progress documents.  For example, in the requirements phase, business analysts talk to customers and then produce a requirements document.  Later, if a programmer has a question, he doesn't need to talk to an expert.  He can simply look the answer up in the document.&lt;/p&gt;

&lt;p&gt;It's a sensible idea, but it has flaws.  The authors of the documents need to anticipate which questions will come up and write clearly enough to avoid misinterpretations.  This is hard to do well.  In practice, it's impossible to anticipate all possible questions.  Also, adding up-front documentation phases stretches out the development process.&lt;/p&gt;

&lt;h3&gt;A Better Way&lt;/h3&gt;

&lt;p&gt;In XP, the whole team&amp;mdash;including experts in business, design, programming and testing&amp;mdash;sits together in an open workspace.  When you have a question, you need only turn your head and ask.  You get an instant response, and if something isn't clear, you can discuss it at the whiteboard.&lt;/p&gt;

&lt;p&gt;Consider the previous story from this new perspective.  You're a programmer and you need some information from your domain expert, Mary, in order to code an algorithm.&lt;/p&gt;

&lt;p&gt;This time, rather than sending an email, you turn your head.  &quot;Mary, can you clarify something for me?&quot; you ask.&lt;/p&gt;

&lt;p&gt;Mary says, &quot;Sure.  What do you need?&quot;&lt;/p&gt;

&lt;p&gt;You explain the problem and Mary gives her answer.  &quot;No, no,&quot; you reply.  &quot;That's a different problem.  Here, let me show you on the whiteboard.&quot;&lt;/p&gt;

&lt;p&gt;A few minutes later, you've hashed out the issue and you're back to coding again.  Whoops!  There's an edge case you hadn't considered.  &quot;Wait a second, Mary,&quot; you say.  &quot;There's something we didn't consider.  What about....&quot;&lt;/p&gt;

&lt;p&gt;After some more discussion, the answer is clear.  You're a little surprised: Mary's answer was completely different than you expected.  It's good that you talked it over.  Now, back to work!  The code is due today, and it took 20 whole minutes to figure out this nitpicky little issue.&lt;/p&gt;

&lt;h3&gt;Exploiting Great Communication&lt;/h3&gt;

&lt;p&gt;Sitting together eliminates the waste caused by waiting for an answer, which dramatically improves productivity.  In a field study of six colocated teams, [Teasley et al.] found that sitting together doubled productivity and cut time to market to almost one third of the company baseline.&lt;/p&gt;

&lt;p&gt;Those results are worth repeating: the teams delivered software in &lt;em&gt;one-third&lt;/em&gt; their normal time.  After the pilot study, 11 more teams achieved the same result.  This success led the company to invest heavily in open workspaces, by building a new facility in the US that supports 112 such teams and making plans for similar sites in Europe.&lt;/p&gt;

&lt;p&gt;How can sitting together yield such impressive results?  Communication.&lt;/p&gt;

&lt;p&gt;Although programming is the emblematic activity of software development, &lt;em&gt;communication&lt;/em&gt; is the real key to software success.  As [Teasley et al.] report, &quot;Past studies have indicated that less than 30 percent of a programmer's time is spent on traditional programming tasks and less than 20 percent of the time is spent on coding.  The rest of the time is spent on meetings, problem resolution with the team, resolving issues with customers, product testing, etc.&quot;&lt;/p&gt;

&lt;p&gt;My experience is that programmers on XP teams spend a far greater percentage of their time programming.  I attribute that to the increased communication effectiveness of sitting together.  Rather than sitting in hour-long meetings, conversations last only as long as needed and involve only the people necessary.&lt;/p&gt;

&lt;p&gt;Teams that sit together not only get rapid answers to their questions, they experience what [Cockburn] calls &lt;em&gt;osmotic communication&lt;/em&gt;.  Have you ever been talking with someone in a crowded room and then heard your name out of the blue?  Even though you were focusing on your conversation, your brain was paying attention to all of the other conversations in the room.  When it heard your name, it replayed the sounds into your conscious mind.  You not only hear your name, you hear a bit of the conversation around it, too, in a phenomenon known as the &lt;em&gt;cocktail party effect&lt;/em&gt;.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p class=&quot;aside&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;The best layman's description of the cocktail party effect I've seen is on Wikipedia: http://en.wikipedia.org/wiki/Cocktail_party_effect, accessed 17 July 2006.&lt;/p&gt;

&lt;p&gt;Imagine a team that sits together.  Team members are concentrating on their work and talking quietly with their partners.  Then somebody mentions something about managing database connections, and another programmer perks up.  &quot;Oh, Tom and I refactored the database connection pool last week.  You don't need to manage the connections manually anymore.&quot;  When team members are comfortable speaking up like this, it happens often (at least once per day) and saves time and money every time.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;When I see an adversarial relationship between separate groups in a team, I suggest that they sit together.&lt;/blockquote&gt;

&lt;p&gt;There's another hidden benefit to sitting together: it helps teams jell and breaks down us-versus-them attitudes between groups.  Distance seems to encourage adversarial relationships and blaming &quot;those people.&quot;  Whenever I see this (for example, between programmers and testers), I suggest that they sit together.  This helps the groups interact socially and gain respect for each other professionally.&lt;/p&gt;

&lt;h3&gt;Secrets of Sitting Together&lt;/h3&gt;

&lt;p&gt;To get the most out of sitting together, be sure you have a complete team (see &lt;a href=&quot;http://jamesshore.com/Agile-Book/the_xp_team.html&quot;&gt;The XP Team&lt;/a&gt; in Chapter 3).  It's important that people be physically present to answer questions.  If someone must be absent often&amp;mdash;product managers tend to fall into this category&amp;mdash;make sure that someone else on the team can answer the same questions.  A domain expert is often a good backup for a traveling product manager.&lt;/p&gt;

&lt;p&gt;Similarly, sit close enough to each other that you can have a quick discussion without getting up from your desk or shouting.  This will also help encourage osmotic communication, which relies on team members overhearing conversations.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Ask for help when you're stuck.&lt;/blockquote&gt;

&lt;p&gt;Available instant help doesn't do any good if you don't ask for it.  Many organizations discourage interruptions, I encourage them on my XP teams.  There's no sense in banging your head against a wall when the person with the answer is right across the room.  To support this attitude, many teams have a rule: &quot;We must always help when asked.&quot;&lt;/p&gt;

&lt;p&gt;Interruptions disrupt flow and ruin productivity, so this rule may sound foolish.  It takes a programmer 15 minutes or more to get back into flow after an interruption [DeMarco &amp;amp; Lister 1999].&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Fortunately, with pair programming, flow works differently.  The delay doesn't seem to occur.  One programmer answers the question and the other keeps thinking about the problem at hand.  When the interruption is over, a quick &quot;Where were we?&quot; gets work moving again.&lt;/p&gt;

&lt;p&gt;Pairing helps in a few other ways, too.  Osmotic communication depends on a buzz of conversation in the room.  If people aren't pairing, there's less talking.  Pairing also makes it easier for programmers to ignore irrelevant background conversations.&lt;/p&gt;

&lt;h3&gt;Making Room&lt;/h3&gt;

&lt;p&gt;Sitting together is one of those things that's easy to say and hard to do.  It's not that the act itself is difficult&amp;mdash;the real problem is finding space.&lt;/p&gt;

&lt;blockquote class=&quot;notetip&quot;&gt;
 
 &lt;p&gt;Start arranging for a shared workspace &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
 
&lt;/blockquote&gt;

&lt;p&gt;A team that sits in adjacent cubicles can convert them into an adequate shared workspace, but even with cubicles, it takes time and money to hire people to rearrange the walls.&lt;/p&gt;

&lt;p&gt;When I say &quot;time&quot;, I mean weeks or even months.&lt;/p&gt;

&lt;p&gt;In a smaller company, you might be able to take matters (and screwdrivers) into your own hands.  In a larger company, you could run afoul of Facilities if you do that.  That may be a worthwhile cost, but talk to your project manager first.  She should have some insight on the best way to get a shared workspace.&lt;/p&gt;

&lt;p&gt;While you're waiting for construction on your dream workspace to finish, a big conference room is a good alternative.  One team I worked with set up shop in the company boardroom for six weeks while they waited for their workspace to be ready.&lt;/p&gt;

&lt;h3&gt;Designing Your Workspace&lt;/h3&gt;

&lt;p&gt;Your team will produce a buzz of conversation in its workspace.  Because they'll be working together, this buzz won't be too distracting for team members.  For people outside the team, however, it can be very distracting.  Make sure there's good sound insulation between your team and the rest of the organization.&lt;/p&gt;

&lt;p&gt;Within the workspace, group people according to the conversations they most need to overhear.  Programmers should all sit next to each other because they collaborate moment-to-moment.  Testers should be nearby so programmers can overhear them talk about issues.  Domain experts and interaction designers don't need to be quite so close, but should be close enough to answer questions without shouting.&lt;/p&gt;

&lt;p&gt;The product manager and project manager are most likely to have conversations that would distract the team.  They should sit close enough to be part of the buzz but not so close that their conversations are distracting.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Leave room for individuality in your workspace.&lt;/blockquote&gt;

&lt;p&gt;An open workspace doesn't leave much room for privacy, and pair programming stations aren't very personal.  This loss of individuality can make people uncomfortable.  Be sure that everyone has a space they can call their own.  You also need an additional enclosed room with a door, or cubes away from the open workspace, so people can have privacy for personal phone calls and individual meetings.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/informative_workspace.html&quot;&gt;Informative Workspace&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;As you design your workspace, be sure to include plenty of whiteboards and wall space for an informative workspace.  Try to have at least 24 linear feet of whiteboard space, magnetic if possible.  You can never have too many whiteboards.&lt;/p&gt;

&lt;p&gt;Some teams include a projector in their workspace.  This is a great idea, as it allows the team to collaborate on a problem without moving to a conference room.&lt;/p&gt;

&lt;p&gt;Finally, the center of an XP workspace is typically a set of pairing stations.  I like to have the stations facing each other so people can see each other easily.  A hollow triangle, square, or oval setup works well.  Provide a few more pairing stations than there are programming pairs.  This allows testers and customers to pair as well (either with each other or with programmers) and it provides programmers with space to work solo when they need to.&lt;/p&gt;

&lt;blockquote class=&quot;notetip&quot;&gt;
 
 &lt;p&gt;For information on building a good pairing station, see &lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt; in Chapter 5.&lt;/p&gt;
 
&lt;/blockquote&gt;

&lt;h3&gt;Sample Workspaces&lt;/h3&gt;

&lt;p&gt;The sample workspace in Figure was designed for a team of 13.  They had six programmers, six pairing stations, and a series of cubbies for personal effects.  Nonprogrammers worked in cubbies close to the pairing stations so they could be part of the conversation even when they weren't pairing.  Programmers' cubbies were at the far end: they typically sat at the pairing stations.  For privacy, people adjourned to the far end of the workspace or went to one of the small conference rooms down the hall.&lt;/p&gt;

&lt;div style='text-align: center'&gt;
 
 
 
 &lt;p&gt;&lt;img width=&quot;67%&quot; src=&quot;http://jamesshore.com/images/art-of-agile/figs/sit_together__sample_workspace_2.gif&quot; alt=&quot;figure (sit_together__sample_workspace_2.gif)&quot; /&gt;&lt;/p&gt;
 
&lt;p class='caption'&gt;Figure. A sample workspace&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;In addition to the pairing stations, everybody had a laptop for personal work and email.  The pairing stations all used a group login so that any team member could work at them.&lt;/p&gt;

&lt;p&gt;Before creating this workspace, the team sat in cubicles in the same part of the office.  To create the workspace, they reconfigured the inner walls.&lt;/p&gt;

&lt;p&gt;This workspace was good, but not perfect.  It didn't have nearly enough wall space for charts and whiteboards and non-programmers didn't have enough desk space.  On the plus side, there was plenty of room to accommodate people at the pairing stations, which meant that customers paired with programmers frequently, and there were also extra cubbies for bringing people into the team temporarily.&lt;/p&gt;

&lt;h4&gt;A Small Workspace&lt;/h4&gt;

&lt;p&gt;The small workspace in Figure was created by an up-and-coming startup when they moved into new offices.  They were still pretty small so they couldn't create a fancy workspace.  They had a team of seven: six programmers and a product manager.&lt;/p&gt;

&lt;div style='text-align: center'&gt;
 
 
 
 &lt;p&gt;&lt;img width=&quot;67%&quot; src=&quot;http://jamesshore.com/images/art-of-agile//figs/sit_together__sample_workspace_1.gif&quot; alt=&quot;figure (sit_together__sample_workspace_1.gif)&quot; /&gt;&lt;/p&gt;
 
&lt;p class='caption'&gt;Figure. A small workspace&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;This team arranged its pairing stations along a long wall.  They had a table on the side for meetings, and charts and whiteboards on dividers surrounding them.  The programmers had a pod of half-cubicles to the other side for personal effects, and there were small conference rooms close by for privacy.&lt;/p&gt;

&lt;p&gt;This was a great workspace with a serious problem: the product manager wasn't in earshot and didn't participate in team discussions.  The team couldn't get ready answers to its questions and struggled with requirements.&lt;/p&gt;

&lt;h3&gt;Adopting an Open Workspace&lt;/h3&gt;

&lt;p&gt;Some team members may resist moving to an open workspace.  Common concerns include loss of individuality and privacy, implied reduction in status from losing a private office, and managers not recognizing individual contributions.  Team members may also mention potential distractions and noise, but I find that this is usually a cover for one of the other concerns.&lt;/p&gt;

&lt;p&gt;As with pair programming, people come to enjoy the benefits that sitting together provides, but it can take a few months.  In [Teasley et al.]'s study, team members initially preferred cubicles to the open workspace, but by the end of the study, they preferred the open workspace.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Don't force people to sit together against their will.&lt;/blockquote&gt;

&lt;p&gt;However, forcing people to sit together in hopes that they'll come to like it is a bad idea.  When I've forced team members to do so, they've invariably found a way to leave the team, even if it meant quitting the company.  Instead, talk with the team about their concerns and the tradeoffs of moving to an open workspace.  Discuss how team members will be evaluated in the new system and what provisions for privacy you can make.  You may be able to address some concerns by providing a shared workspace in addition to existing offices and cubicles.&lt;/p&gt;

&lt;p&gt;If a large portion of the team is against the open workspace, sitting together is probably not a good choice.  If you only have one or two adamant objectors and the rest of the team wants to sit together, you may wish to sit together anyway and allow the objectors to move to a different team.&lt;/p&gt;

&lt;h3&gt;Questions&lt;/h3&gt;

&lt;h4 class=&quot;faq&quot;&gt;How can I concentrate with all that background noise?&lt;/h4&gt;

&lt;p&gt;A team that's working together in a shared workspace produces a busy hum of activity.  This can be distracting at first, but most people get used to it in time.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Pairing makes background conversations fade away.&lt;/blockquote&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;For programmers, pair programming is an excellent way to focus your attention away from the background noise.  You won't notice it if you're pairing.  Nonprogrammers can work in pairs too.&lt;/p&gt;

&lt;p&gt;If you work alone and find the background noise distracting, put on headphones, wear earplugs, or sit further away from the team for a time.  You'll miss out on osmotic communication, but at least you'll be able to concentrate.&lt;/p&gt;

&lt;p&gt;Sometimes, the team gets a little noisy and rambunctious.  It's okay to ask for quiet&amp;mdash;the sound in the team room should be a &lt;em&gt;hum&lt;/em&gt;, not a full-throated chorus.  Some teams have a bell for team members to ring when they want the team to be more quiet.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;When one person is interrupted, the whole team stops what they're doing to listen.  What can we do to prevent people from being distracted so easily?&lt;/h4&gt;

&lt;p&gt;Especially in the beginning of the project, it's possible that the whole team really does need to hear these conversations.  As time goes on, team members will learn which conversations they can comfortably ignore.&lt;/p&gt;

&lt;p&gt;If this is a continuing problem, try stepping a little further away from the pairing stations when a conversation lasts more than a few minutes.  Interested team members can join the conversation and the rest of the team can continue working.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;What if I need privacy for phone calls?&lt;/h4&gt;

&lt;p&gt;Some people, particularly customers and project managers, need to take a lot of calls as they work.  Either situate them further away from the rest of the team or arrange for an enclosed office with a door.  Keep the door open as often as possible to allow information to flow smoothly.&lt;/p&gt;

&lt;h3&gt;Results&lt;/h3&gt;

&lt;p&gt;When your team sits together, communication is much more effective.  You stop guessing at answers and ask more questions.  You overhear other people's conversations and contribute answers they may not expect.  Team members spontaneously form cross-functional groups to solve problems.  There's a sense of camaraderie and mutual respect.&lt;/p&gt;

&lt;h3&gt;Contraindications&lt;/h3&gt;

&lt;p&gt;The hardest part about sitting together is finding room for the open workspace.  Cubicles, even adjacent cubicles, won't provide the benefits that an open workspace does.  Start working on this problem now as it can take months to resolve.&lt;/p&gt;

&lt;p&gt;Don't force the team to sit together against their will.  Adamant objectors will find a way to leave the team, and possibly the company.&lt;/p&gt;

&lt;p&gt;Be careful about sitting together if programmers don't pair program.  Programming alone requires a quiet workspace.  &lt;em&gt;Pair&lt;/em&gt; programming, on the other hand, enables programmers to ignore the noise.&lt;/p&gt;

&lt;h3&gt;Alternatives&lt;/h3&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Multisite teams are difficult and expensive.&lt;/blockquote&gt;

&lt;p&gt;Sitting together is one of the most powerful practices in XP.  It's important for communication and team dynamics.  Sitting apart tends to fray fragile relationships, particularly between different functional groups, and puts your team at a disadvantage.  If your team is in a single location, you're better off figuring out how to sit together.&lt;/p&gt;

&lt;p&gt;If you have a multisite team, consider turning each site into its own team.  For example, if programmers are in one site and customers are in another, the programmers may engage some business analysts to act as proxy customers.  In this scenario, the customers and development team should still work together, face-to-face, for several weeks at the beginning of each release.&lt;/p&gt;

&lt;p&gt;If you have multiple teams of programmers, consider separating their responsibilities so that each works on entirely different codebases.  [Evans] has an excellent discussion of the options for doing so.&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; practice XP with a single, multi-site team, but it requires a lot of travel.  [Yap] has a good experience report describing how her team made this work 24 hours a day across three time zones.  She focused on maximizing communication by regularly flying team members to a single location for several weeks at a time.  They also conducted daily phone calls between locations.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;If you can't sit together, talk to your mentor about your options.&lt;/blockquote&gt;

&lt;p&gt;If your whole team cannot sit together and you still wish to practice XP, talk to your mentor (see &quot;Find a Mentor&quot; in Chapter 2) about your options and hire experienced XP coaches for each site.&lt;/p&gt;

&lt;h3&gt;Further Reading&lt;/h3&gt;

&lt;p&gt;&lt;cite&gt;Agile Software Development&lt;/cite&gt; [Cockburn] has an excellent chapter on communication.  Chapter 3, &quot;Communicating, Cooperating Teams,&quot; discusses information radiators, communication quality, and many other concepts related to sitting together.&lt;/p&gt;

&lt;p&gt;If you can't sit together, &quot;Follow the Sun: Distributed Extreme Programming Development&quot; [Yap] is an interesting experience report describing a single XP team divided into three locations, each eight hours apart.&lt;/p&gt;

&lt;p&gt;Similarly, &lt;cite&gt;Domain-Driven Design&lt;/cite&gt; [Evans] has an excellent discussion of coordinating multiple development teams in chapter 14, &quot;Maintaining Model Integrity.&quot;  While the book's focus is object-oriented domain models, this chapter is applicable to many design paradigms.&lt;/p&gt;


&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/real_customer_involvement.html&quot;&gt;Real Customer Involvement&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/trust.html&quot;&gt;Trust&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/collaborating_intro.html&quot;&gt;Chapter 6: Collaborating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Agile-Book/sit_together.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>Agile Friday: &quot;Sit Together&quot; Now Online</title>
  <link>http://jamesshore.com/Blog/Agile-Friday-Sit-Together-Now-Online.html</link>
  <category>/Blog</category>
  <pubDate>Fri, 05 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Blog/Agile-Friday-Sit-Together-Now-Online.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;05 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Blog/"&gt;James Shore/Blog&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Blog/Art-of-Agile-Development-Going-Online.html&quot;&gt;It's Friday!&lt;/a&gt; I've posted the full text of &lt;a href=&quot;http://jamesshore.com/Agile-Book/sit_together.html&quot;&gt;Sit Together&lt;/a&gt; from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; on the &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;book's site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You might have noticed that I'm not posting the practices in order. One of my motivations in putting the book online is that I want to provide a reference that people can easily link to. So I'm starting with the practices that I think people will reference most frequently.&lt;/p&gt;

&lt;p&gt;I want your help! Next week, I'm posting a practice from the &quot;Releasing&quot; chapter. Which one do you think will be the most useful? Vote below, then explain your reasons in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poll closed.&lt;/strong&gt; Winner: &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;Done Done&quot;&lt;/a&gt; (to be posted March 12th).&lt;/p&gt;

&lt;p&gt;I also need to prepare the following week's release. Which practice from the &quot;Planning&quot; chapter should I post next?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poll closed.&lt;/strong&gt; Winner: &lt;a href=&quot;http://jamesshore.com/Agile-Book/slack.html&quot;&gt;Slack&lt;/a&gt; (to be posted March 19th).&lt;/p&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Blog/Agile-Friday-Sit-Together-Now-Online.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Art of Agile Development: Chapter 6: Collaborating</title>
  <link>http://jamesshore.com/Agile-Book/collaborating_intro.html</link>
  <category>/Agile-Book</category>
  <pubDate>Fri, 05 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Agile-Book/collaborating_intro.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;05 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore/Agile-Book&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/trust.html&quot;&gt;Trust&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/retrospectives.html&quot;&gt;Retrospectives&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Full Text&lt;/h3&gt;

&lt;p&gt;The following text is excerpted from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; by James Shore and Shane Warden (O'Reilly 2007). Copyright &amp;copy 2008 James Shore and chromatic. All rights reserved.&lt;/p&gt;

&lt;h2&gt;Collaborating&lt;/h2&gt;

&lt;p&gt;Sometimes I like to imagine software development as a pulsing web of light, with blips of information flowing along lines from far-flung points.  The information races towards the development team, which is a brilliant, complex tangle of lines, then funnels into a glowing core of software too bright to look at.&lt;/p&gt;

&lt;p&gt;I'm a little weird that way.&lt;/p&gt;

&lt;p&gt;There's truth to the idea, though.  Software development is all about information.  The more effectively your programmers can access and understand the information they need, the more effective they will be at creating software.  The better information customers and managers have, the better they can manage the schedule and the flow of feedback to the programmers.&lt;/p&gt;

&lt;p&gt;Communication in the real world is a lot more messy than it is in my image.  There are no glowing lines to sterilely transport information from one brain to another.  Instead, people have to work together.  They have to ask questions, discuss ideas, and even disagree.&lt;/p&gt;

&lt;p&gt;This chapter contains eight practices to help your team and its stakeholders collaborate efficiently and effectively:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/trust.html&quot;&gt;Trust&lt;/a&gt;&lt;/em&gt; is essential for the team to thrive.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/sit_together.html&quot;&gt;Sitting together&lt;/a&gt;&lt;/em&gt; leads to fast, accurate communication.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/real_customer_involvement.html&quot;&gt;Real Customer Involvement&lt;/a&gt;&lt;/em&gt; helps the team understand what to build.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;A &lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/ubiquitous_language.html&quot;&gt;Ubiquitous Language&lt;/a&gt;&lt;/em&gt; helps team members understand each other.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/stand_up_meetings.html&quot;&gt;Stand-Up Meetings&lt;/a&gt;&lt;/em&gt; keep team members informed.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/coding_standards.html&quot;&gt;Coding Standards&lt;/a&gt;&lt;/em&gt; provide a template for seamlessly joining the team's work together.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/iteration_demo.html&quot;&gt;Iteration Demos&lt;/a&gt;&lt;/em&gt; keep the team's efforts aligned with stakeholder goals.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/reporting.html&quot;&gt;Reporting&lt;/a&gt;&lt;/em&gt; helps reassure the organization that the team is working well.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;sidebar&quot;&gt;&lt;h3&gt;&quot;Collaborating&quot; Mini-Etude&lt;/h3&gt;
 
 &lt;p&gt;The purpose of this &amp;eacute;tude is to explore the flow of information in your project. If you're new to agile development, you may use it to help you understand how collaboration occurs in your project, even if you're not currently using XP. If you're an experienced agile practitioner, review Chapter 12 and use this &amp;eacute;tude to help you modify your process to remove communication bottlenecks.&lt;/p&gt;
 
 &lt;p&gt;Conduct this &amp;eacute;tude for a timeboxed half-hour every day for as long as it is useful.  Expect to feel rushed by the deadline at first. If the &amp;eacute;tude becomes stale, discuss how you can change it to make it interesting again.&lt;/p&gt;
 
 &lt;p&gt;You will need white, red, yellow, and green index cards; an empty table or magnetic whiteboard for your information flow map; and writing implements for everyone.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt;  Start by forming pairs.  Try for heterogeneous pairs&amp;mdash;have a programmer work with a customer, a customer work with a tester, and so forth, rather than pairing by job description. Work with a new partner every day.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 2.&lt;/strong&gt;  &lt;em&gt;(Timebox this step to 10 minutes.)&lt;/em&gt;  Within your pair, discuss the kinds of information that you need in order to do your job, or that other people need from you in order to do their job.  Choose one example that you have personally observed or experienced.  If you can't think of anything new, pick an existing card and skip to Step 3.&lt;/p&gt;
 
 &lt;p&gt;Information usually flows in both directions.  For example, during an iteration demo as the example, the flow may be the developers asking if the software behaves correctly.  Alternately, it may be the customer asking what the software actually does.  Choose just direction.&lt;/p&gt;
 
 &lt;p&gt;Reflect on all of the times you remember needing or providing this information.  How long did it take?  For information you needed, think of the &lt;em&gt;calendar time&lt;/em&gt; needed from the moment you realized you needed the information to the moment you received it.  For information you provided, think of the &lt;em&gt;total effort&lt;/em&gt; that you and other team members spent preparing and providing the information.&lt;/p&gt;
 
 &lt;p&gt;Next, think of the &lt;em&gt;typical&lt;/em&gt; time required for this piece of information.  If the typical time required is less than ten minutes, take a &lt;em&gt;green&lt;/em&gt; index card.  If it's less than a day, take a &lt;em&gt;yellow&lt;/em&gt; index card.  If it's a day or longer, take a &lt;em&gt;red&lt;/em&gt; index card.  Write down the type of information involved, the group that you get it from (or give it to), the role you play, and the time required, as shown in Figure.&lt;/p&gt;
 
 &lt;div style='text-align: center'&gt;
 
 
 
 &lt;p&gt;&lt;img width=&quot;67%&quot; src=&quot;http://jamesshore.com/images/art-of-agile/figs/collaborating_intro__sample_card.gif&quot; alt=&quot;figure (collaborating_intro__sample_card.gif)&quot; /&gt;&lt;/p&gt;
 
&lt;p class='caption'&gt;Figure. Sample Cards&lt;/p&gt;&lt;/div&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 3.&lt;/strong&gt;  &lt;em&gt;(Timebox this step to 10 minutes.)&lt;/em&gt;  Within your pair, discuss things that your team can do to &lt;em&gt;reduce&lt;/em&gt; or &lt;em&gt;eliminate&lt;/em&gt; the time required to get or provide this information.  Pick one and write it on a &lt;em&gt;white&lt;/em&gt; card.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 4.&lt;/strong&gt;  &lt;em&gt;(Timebox this step to 10 minutes.)&lt;/em&gt;  As a team, discuss all of the cards generated by all of the pairs.  Consider these questions:&lt;/p&gt;
 
 &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;Where are the bottlenecks in receiving information?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Which latencies are most painful in your current process?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Which flow is most important to optimize in your next iteration?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;What is the root cause of those latencies?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;What will you do next iteration to improve information flow?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
 
 &lt;p&gt;After everyone has had a chance to share their cards, add them to the table.  Place colored cards on the table so that the cards visually show information flow.  For example, if an interaction designer gets information about usage from real customers and gives it to the development team, those two cards would be placed side by side.  Place white cards underneath colored cards.&lt;/p&gt;
 
&lt;/blockquote&gt;

&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/trust.html&quot;&gt;Trust&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/retrospectives.html&quot;&gt;Retrospectives&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Agile-Book/collaborating_intro.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>Alternatives to Acceptance Testing</title>
  <link>http://jamesshore.com/Blog/Alternatives-to-Acceptance-Testing.html</link>
  <category>/Blog</category>
  <pubDate>Mon, 01 Mar 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Blog/Alternatives-to-Acceptance-Testing.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;01 Mar 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Blog/"&gt;James Shore/Blog&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;p class=&quot;update&quot;&gt;Updated 3 Mar 2010: Clarified &quot;Customer Examples&quot; section.&lt;/p&gt;

&lt;p&gt;My essay on &lt;a href=&quot;http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html&quot;&gt;the problems with acceptance testing&lt;/a&gt; caused a bit of a furor. (&lt;a href=&quot;http://gojko.net/2010/03/01/are-tools-necessary-for-acceptance-testing-or-are-they-just-evil/&quot;&gt;Gojko Adzic&lt;/a&gt;, &lt;a href=&quot;http://blog.gdinwiddie.com/2010/03/01/the-reality-of-automated-acceptance-testing/&quot;&gt;George Dinwiddie&lt;/a&gt;, &lt;a href=&quot;http://xprogramming.com/xpmag/problems-with-acceptance-testing&quot;&gt;Ron Jeffries&lt;/a&gt;.) The biggest criticism was that, without acceptance testing, how do you know that the software continues to work? The classic approach, manual regression testing, is a huge burden that only increases over time.&lt;/p&gt;

&lt;p&gt;It's true. Manual regression testing is not a good idea. I'm not recommending it. But that's only one of the alternatives to automated acceptance testing.&lt;/p&gt;

&lt;p&gt;Every software development practice has a cost and a benefit. The trick in designing your ideal method is to choose families of practices that combine to maximize benefits and minimize costs. When &lt;a href=&quot;http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html&quot;&gt;I said&lt;/a&gt;, &quot;acceptance testing tools cost more than they're worth. I no longer use it or recommend it,&quot; I meant that I've found alternatives that provide the same benefit for lower cost.&lt;/p&gt;

&lt;p&gt;This is what I do instead.&lt;/p&gt;

&lt;h3&gt;My Goal&lt;/h3&gt;

&lt;p&gt;When it comes to testing, my goal is to eliminate defects. At least the ones that matter. (Netscape 4.01 users, you're on your own.) And I'd much rather &lt;em&gt;prevent&lt;/em&gt; defects than &lt;em&gt;find and fix&lt;/em&gt; them days or weeks later.&lt;/p&gt;

&lt;p&gt;I think of defects as coming from four sources: programmer errors, design errors, requirements errors, and systemic errors. When trying to eliminate defects, I look for practices that address these four causes.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Programmer errors&lt;/strong&gt; occur when a programmer knows what to program but doesn't do it right. His algorithm might be wrong, he might have made a typo, or he may have made some other mistake while translating his ideas into code.&lt;/li&gt;
	
	&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Design errors&lt;/strong&gt; create breeding grounds for bugs. According to &lt;a href=&quot;http://csse.usc.edu/csse/TECHRPTS/1985/usccse85-499/usccse85-499.pdf&quot;&gt;Barry Boehm (PDF)&lt;/a&gt;, 20% of the modules in a program are typically responsible for 80% of the errors. They're not necessarily the result of an outright mistake, though. Often a module starts out well but gets crufty as the program grows.&lt;/li&gt;
	
	&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Requirements errors&lt;/strong&gt; occur when a programmer creates code that does exactly what she intends, but her intention was wrong. Somehow she misunderstood what needed to be done. Or, perhaps, no one knew what needed to be done. Either way, the code works as intended, but it doesn't do the right thing.&lt;/li&gt;
	
	&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Systemic errors&lt;/strong&gt; make mistakes easy. The team's work habits include a blind spot that lets subtle defects escape. In this environment, everybody thinks they're doing the right thing--programmers are confident that they're expressing their intent, and customers are confident that programmers are doing the right thing--yet defects occur anyway. Security holes are a common example.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use the following techniques to eliminate these sources of errors. Although there are a lot of practices here, nearly all of them are practices my teams already use. I get them for free. Also, a &lt;em&gt;long list&lt;/em&gt; doesn't translate to &lt;em&gt;high cost&lt;/em&gt;. My experience with acceptance testing is that it's high cost, even though it doesn't take much time to describe. These practices, despite taking a lot of time to describe, are low cost. Many of them, such as TDD and fixing bugs promptly, actually decrease costs.&lt;/p&gt;

&lt;p&gt;Finally, and most importantly, I can't take credit for these practices. Most of them are standard XP practices. All I've done is tweak the package a bit so I get the benefits of acceptance testing without the cost.&lt;/p&gt;

&lt;h3&gt;1. Preventing Programmer Errors&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/test_driven_development.html&quot;&gt;Test-Driven Development&lt;/a&gt; (TDD) is my defect-elimination workhorse. Not only does it improve the quality of my code, it gives me a comprehensive regression suite that I can use to detect future errors. My criteria for TDD is that I need to continue to write tests until I'm confident that the code does what I think it does &lt;em&gt;and&lt;/em&gt; that the tests will alert me of improper changes in the future.&lt;/p&gt;

&lt;p&gt;A lot of people think that TDD is just for unit testing. I don't use it that way. As I use TDD, I write three kinds of tests:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Unit tests&lt;/strong&gt;, which are focused on a single class or set of interrelated classes. These tests don't cross process boundaries, don't involve I/O, and should run at a rate of hundreds per second. The number of tests scales linearly with the size of the code. Typically, 30-50% of my codebase is unit test code.&lt;/li&gt;
	
	&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Focused integration tests&lt;/strong&gt;, which test specific integration points in my program. For example, if I have a library that provides a database abstraction, I'll write tests that prove that I can connect to a database, perform queries, insert rows, and so forth. These tests run at a rate of tens per second. The number of tests scales proportionally to the number of ways my code talks to the outside world.&lt;/li&gt;
	
	&lt;br /&gt;&lt;li&gt;&lt;strong&gt;End-to-end integration tests&lt;/strong&gt;, which test all layers of the application, from UI to database. Typically, the test will act like a user of the program, entering text and clicking buttons (or simulating clicks in the presentation layer), and then check the result by looking at the database or checking the program's output. These tests are very slow--seconds or even minutes per test--and tend to break when the program changes. I keep these to the minimum necessary for me to be confident that all of the pieces of the program fit together properly. Legacy systems written without TDD require a lot more end-to-end tests, but my goal is to replace them with unit tests and focused integration tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to TDD, &lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt; helps prevent programmer error through continuous code review. Two brains are better than one. Pairing also improves design quality, which reduces design errors.&lt;/p&gt;

&lt;p&gt;I also implement policies that enable &lt;a href=&quot;http://jamesshore.com/Agile-Book/energized_work.html&quot;&gt;Energized Work&lt;/a&gt;. Tired, burned-out programmers make dumb mistakes. I use sensible work hours and encourage people to go home on time.&lt;/p&gt;


&lt;h3&gt;2. Preventing Design Errors&lt;/h3&gt;

&lt;p&gt;The techniques for eliminating programming errors also benefit the design, but I use additional practices to continually improve the design.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/simple_design.html&quot;&gt;Simple Design&lt;/a&gt; emphasizes creating small, focused designs that only solve the problems we're facing today. Keeping the designs focused makes them easier to understand, reducing the likelihood of creating a bug breeding ground.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/incremental_design.html&quot;&gt;Incremental Design and Architecture&lt;/a&gt; works hand-in-hand with Simple Design by enabling us to grow our initial, simple designs as our needs become more complex. The two practices together are sometimes called Evolutionary Design.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/refactoring.html&quot;&gt;Refactoring&lt;/a&gt; is an essential tool that allows us to change existing designs. Not only does it enable Incremental Design and Architecture, we can use it to improve poor quality designs. Even the best design gets crufty over time. I build &lt;a href=&quot;http://jamesshore.com/Agile-Book/slack.html&quot;&gt;Slack&lt;/a&gt; into every iteration and use the extra time to refactor away &lt;a href=&quot;http://jamesshore.com/Articles/Business/Software%20Profitability%20Newsletter/Design%20Debt.html&quot;&gt;technical debt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And finally, when my teams find a bug, we fix it right away--or decide that it isn't ever worth fixing. Not only do bugs get more expensive to fix over time, they're probably in the 20% of the code that causes 80% of the defects. After writing a test to reproduce the bug and fixing it, we look for ways to refactor the code so similar bugs are less likely in the future.&lt;/p&gt; 


&lt;h3&gt;3. Preventing Requirements Errors&lt;/h3&gt;

&lt;p&gt;Acceptance tests are mostly about requirements. Since I don't use acceptance tests, I need lots of collaboration instead.&lt;/p&gt;

&lt;h4&gt;Whole Team&lt;/h4&gt;

&lt;p&gt;First, a &lt;a href=&quot;http://jamesshore.com/Agile-Book/the_xp_team.html&quot;&gt;Whole Team&lt;/a&gt; is essential. My teams are cross-functional, co-located, and have the resources necessary to succeed. In particular, my teams include customers and testers on-site as part of the team.&lt;/p&gt;

&lt;p&gt;&quot;On-site customers&quot; is a broad term that includes product managers, product owners, domain experts, business analysts, interaction designers, and others. Essentially, these are the people on the team who &lt;em&gt;understand&lt;/em&gt; and &lt;em&gt;generate&lt;/em&gt; the software's requirements. Sometimes they make requirements up out of whole cloth, but more often they supplement their work with lots of stakeholder feedback.&lt;/p&gt;

&lt;p&gt;When programmers need to understand requirements, they simply turn their head and ask the on-site customers. For anything that can't be explained easily, the customers provide concrete examples, cunningly called &lt;em&gt;Customer Examples&lt;/em&gt;, to illustrate the point.&lt;/p&gt;

&lt;h4&gt;Customer Examples&lt;/h4&gt;

&lt;p&gt;Examples turn out to be a very powerful form of communication, and it's the legacy of Fit that's provided me with the most value. Typically, when you ask an on-site customer to explain something, she will try to explain the general principle. For example, she might say, &quot;when a customer buys a ringtone, we either debit his pre-paid account or charge his credit card, but if he's using a credit card and the ringtone costs less than one dollar, we batch up the charges until the end of the month or until his total expenses are more than twenty dollars.&quot; Not only is this hard to understand, customers often leave out important details.&lt;/p&gt;

&lt;p&gt;Instead, I have the customers illustrate their descriptions with concrete examples. I'll say, &quot;Okay, so we have a customer named Fred, and he's paying with a credit card. He buys a ring-tone that costs fifty cents. He's already purchased 12 dollars of merchandise this month. How much do we charge his card for?&quot; Once the dam has broken, the customers are able to provide additional examples in the same vein, and we keep going until we have examples for all of the edge cases we need.&lt;/p&gt;

&lt;p&gt;Examples aren't just for domain rules. I also ask for work-flow examples and UI examples, such as screen mock-ups. Any non-trivial requirement can benefit from a concrete example. They can be informal, such as a discussion at a whiteboard, or formal, such as a Powerpoint mockup. I let the on-site customers decide how much formality they need--they often keep some of the examples for later reference.&lt;/p&gt;

&lt;p&gt;The programmers use these examples to guide their work. Sometimes they'll use the examples directly in their tests. Domain rule examples are most likely to map directly to programmer concepts, particularly if the team uses &lt;a href=&quot;http://domaindrivendesign.org/&quot;&gt;Domain-Driven Design&lt;/a&gt;, a &lt;a href=&quot;http://jamesshore.com/Agile-Book/ubiquitous_language.html&quot;&gt;Ubiquitous Language&lt;/a&gt;, and &lt;a href=&quot;http://c2.com/ppr/checks.html#1&quot;&gt;Whole Value&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More often, though, the examples are too high-level to be used directly in the tests. Workflow examples, in particular, often correspond to the end-to-end integration tests I prefer to avoid. Instead, programmers use the examples as a guide, writing a multitude of more focused, programmer-centric tests as they use TDD. (As they're working, they're likely do a few manual walk-throughs of the program to make sure things come together as expected, but these &quot;tests&quot; aren't saved or repeated in any way. They're just part of the conscientious, paranoid programmer's workflow.)&lt;/p&gt;

&lt;p&gt;The programmers stop when they're confident that the software reflects the customers' goals, as illustrated with the examples. Because they use TDD, they've also created a sophisticated suite of regression tests that are far more complete and thorough than the original examples. Even though the examples themselves aren't coded as tests, the regression suite will fail if the software breaks.&lt;/p&gt;

&lt;p&gt;There's one problem with this approach: it doesn't close the feedback loop. Programmers work from customers' examples, and talk with the customers when they have questions, but how do they confirm that they &lt;em&gt;really&lt;/em&gt; understood what the customers wanted? That's where &lt;em&gt;Customer Review&lt;/em&gt; of the completed software comes in.

&lt;blockquote class=&quot;sidebar&quot;&gt;
	&lt;h4&gt;Aside: Customer Confidence&lt;/h4&gt;
	
	&lt;p&gt;If tests are for the programmers' confidence, what gives the customers confidence? This was one of the hardest lessons for me to learn. I would show customers passing Fit tests, and they would say, &quot;How do I know that the program is really doing what this says? How do I know you didn't just program it to give the right answer for these examples?&quot; It was so frustrating! We were essentially being accused of fraud. I wanted to shout, &quot;Just trust us!&quot; But, of course, that was the problem. They didn't.&lt;/p&gt;
	
	&lt;p&gt;The question of customer confidence isn't one that any tool can resolve. It all comes down to interpersonal relations. Customers that don't trust the programmers aren't going to be assuaged by a test run. Customers who &lt;em&gt;do&lt;/em&gt; trust the programmers don't need a test run to bolster that confidence.&lt;/p&gt;
	
	&lt;p&gt;In my experience, a reliable track record of shipping defect-free software is what improves customer confidence. Nothing more; nothing less. (Sorry.)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h4&gt;Customer Review&lt;/h4&gt;

&lt;p&gt;The check on the programmers' interpretation of requirements is continuous customer review. As programmers finish parts of the system, they pair with on-site customers to walk through the new functionality. This review often reveals minor flaws--sometimes purely cosmetic--that nobody thought to mention. Sometimes customers realize that what they asked for wasn't quite right. Reviews happen as soon as programmers have something to show, which exposes errors in time to be corrected. In addition, stories aren't marked &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;done done&quot;&lt;/a&gt; until the on-site customers agree they're done.&lt;/p&gt;


&lt;h4&gt;Bring Testers Forward&lt;/h4&gt;

&lt;p&gt;Although examples help communicate complex requirements, customers typically have trouble thinking of edge cases. Programmers can help them spot holes, but I've experienced even better results from bringing testers into the mix.&lt;/p&gt;

&lt;p&gt;In my experience, some testers are business-oriented testers: they're very interested in getting business requirements right. These testers work with the customers to uncover all the nit-picky details the customers would otherwise miss. They'll often prompt the customers to provide examples of edge cases during requirements discussions.&lt;/p&gt;

&lt;p&gt;Other testers are more technically-oriented. They're interested in test automation and non-functional requirements. These testers act as technical investigators for the team. They create the massive testbeds that look at issues such as scalability, reliability, and performance.&lt;/p&gt;


&lt;h3&gt;4. Preventing Systemic Errors&lt;/h3&gt;

&lt;p&gt;If everyone does their job perfectly, the previous practices yield a system with no defects. Too bad perfection is so hard to come by. The team is sure to have blind spots: subtle areas where they don't do everything they need to, but they don't know it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Escaped defects&lt;/em&gt; are a clear signal of problems in paradise. Although defects are inevitable--TDD alone has programmers finding and fixing defects every few minutes--defects that are found by end-users have &quot;escaped.&quot; Every escaped defect is an indication of a flaw somewhere in the process.&lt;/p&gt;

&lt;p&gt;Of course, we don't really want our end-users to be our beta testers. (Not usually, anyway.) That's where exploratory testing comes in.&lt;/p&gt;


&lt;h4&gt;Exploratory Testing&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/exploratory_testing.html&quot;&gt;Exploratory Testing&lt;/a&gt; is a technique for finding surprising defects. Testers use their training, experience, and intuition to form hypotheses about where defects are likely to be lurking in the software, then they use a fast feedback loop to iteratively generate, execute, and refine test plans that expose those defects. It appears similar to ad-hoc testing to an untrained observer, but it's far more rigorous.&lt;/p&gt;

&lt;p&gt;Some teams use exploratory testing to check the quality of their &lt;em&gt;software&lt;/em&gt;. After a story's been coded, the testers do some exploratory testing, the team fixes bugs, and repeat. Once the testers don't find any more bugs, the story is done.&lt;/p&gt;

&lt;p&gt;I do it differently. If the team is preventing defects like they should be, their code should be defect-free without additional testing. Instead, I use exploratory testing as a check on the quality of the &lt;em&gt;process&lt;/em&gt;, not the software. Any defects found through exploratory testing are considered &quot;escaped defects,&quot; indicating a flaw in the process. Only completed stories go through exploratory testing. In fact, once the team has demonstrated that it produces nearly zero defects, they release at-will, without a separate testing phase.&lt;/p&gt;


&lt;h4&gt;Fix the Process&lt;/h4&gt;

&lt;p&gt;Every escaped defect, whether found in exploratory testing or found by end-users, is a indication of a flaw in the process. When we find one, we fix our process.&lt;/p&gt;

&lt;p&gt;The first thing is to analyze the defect, write a test that reproduces it, and fix it. While we're fixing it, we look at the design of the code and see if it needs improvement, too.&lt;/p&gt;

&lt;p&gt;Next, we conduct &lt;a href=&quot;http://jamesshore.com/Agile-Book/root_cause_analysis.html&quot;&gt;Root-Cause Analysis&lt;/a&gt;. We ask ourselves, &quot;What about our process allowed this defect to escape?&quot; We continue asking &quot;why&quot; until we get to the root cause. Once we find it, we make changes to prevent that entire category of defects from happening again.&lt;/p&gt;

&lt;p&gt;Sometimes we can prevent defects by changing the design of our system so that type of defect is impossible. For example, if find a defect that's caused by mismatch between UI field lengths and database field lengths, we might change our build to automatically generate the UI field lengths from database metadata.&lt;/p&gt;

&lt;p&gt;When we can't make defects impossible, we try to catch them automatically, typically by improving our build or test suite. For example, we might create a test that looks at all of our UI field lengths and checks each one against the database.&lt;/p&gt;

&lt;p&gt;And lastly, we might change our process to make defects less likely. For example, we might add an item to our &lt;a href=&quot;http://jamesshore.com/Agile-Book/done_done.html&quot;&gt;&quot;done done&quot;&lt;/a&gt; checklist that reminds us to double-check any field lengths we changed.&lt;/p&gt;


&lt;h4&gt;'Tude&lt;/h4&gt;

&lt;p&gt;I also encourage an attitude among my teams... a bit of eliteness, even snobbiness. It goes like this: &quot;Bugs happen to other people.&quot;&lt;/p&gt;

&lt;p&gt;In a lot of teams, bugs are a way of life. But when you have the attitude that defects are inevitable, you aren't motivated to prevent them. They're just a nuisance to be fixed and forgotten as quickly as possible.&lt;/p&gt;

&lt;p&gt;All of the practices I've described here take discipline and rigor. They're not necessarily difficult, but they break down if people are sloppy or don't care about their work. A culture of &quot;&lt;a href=&quot;http://jamesshore.com/Agile-Book/no_bugs.html&quot;&gt;No Bugs&lt;/a&gt;&quot; helps the team maintain the discipline required, as does &lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;pair programming&lt;/a&gt;, a &lt;a href=&quot;http://jamesshore.com/Agile-Book/sit_together.html&quot;&gt;co-located team&lt;/a&gt;, and &lt;a href=&quot;http://jamesshore.com/Agile-Book/collective_code_ownership.html&quot;&gt;collective ownership&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;The Complete Package&lt;/h3&gt;

&lt;p&gt;So that's how I achieve low defects without using acceptance tests. As I said in &lt;a href=&quot;http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html&quot;&gt;my previous essay&lt;/a&gt;, I've found acceptance testing to be high cost and low value. This set of practices, though long, is mostly free for teams using XP. For those teams, it costs less than acceptance testing and does a better job of preventing defects.&lt;/p&gt;

&lt;p&gt;It's not easy, by any means. To achieve the value I'm describing here, you have to be rigorous in your approach to TDD and you have to commit wholeheartedly to having a cross-functional, co-located team. It's really based on a rigorous application of XP. If you can't do that, then perhaps automated acceptance tests are your best alternative.&lt;/p&gt;

&lt;p&gt;But if you can to do this instead, I think you'll find that it gives you better results. It has for me.&lt;/p&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Blog/Alternatives-to-Acceptance-Testing.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Art of Agile Development: Chapter 5: Thinking</title>
  <link>http://jamesshore.com/Agile-Book/thinking_intro.html</link>
  <category>/Agile-Book</category>
  <pubDate>Sun, 28 Feb 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Agile-Book/thinking_intro.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;28 Feb 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore/Agile-Book&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/assess_your_agility.html&quot;&gt;Assess Your Agility&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Full Text&lt;/h3&gt;

&lt;p&gt;The following text is excerpted from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; by James Shore and Shane Warden,  published by O'Reilly. Copyright &amp;copy 2008 James Shore and chromatic. All rights reserved.&lt;/p&gt;

&lt;h2&gt;Thinking&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;What's wrong with this sentence?&lt;/p&gt;

&lt;blockquote&gt;
 
 &lt;p&gt;What we really need is more keyboards cranking out code.&lt;/p&gt;
 
&lt;/blockquote&gt;

&lt;p&gt;That's a quote from a manager I once worked with.  In a way, he was right: you will never give your customer what she wants without typing on a keyboard.&lt;/p&gt;

&lt;p&gt;That wasn't our problem, though.  I later realized that our progress had a single bottleneck: the availability of our staging environment.  More keyboards wouldn't have helped, even if we had more programmers sitting at them.  If we had realized this sooner, we would have been much more productive.&lt;/p&gt;

&lt;p&gt;Sometimes the biggest gains in productivity come from stopping to think about &lt;em&gt;what&lt;/em&gt; you're doing, &lt;em&gt;why&lt;/em&gt; you're doing it, and &lt;em&gt;whether&lt;/em&gt; it's a good idea.  The best developers don't just find something that works and use it; they also question why it works, try to understand it, and then improve it.&lt;/p&gt;

&lt;p&gt;XP doesn't require experts.  It &lt;em&gt;does&lt;/em&gt; require a habit of mindfulness.  This chapter contains five practices to help mindful developers excel.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt;&lt;/em&gt; doubles the brainpower available during coding, giving one person in each pair the opportunity to think about strategic, long-term issues.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/Energized work.html&quot;&gt;Energized Work&lt;/a&gt;&lt;/em&gt; acknowledges that developers do their best, most productive work when they're energized and motivated.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;An &lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/informative workspace.html&quot;&gt;Informative Workspace&lt;/a&gt;&lt;/em&gt; gives the whole team more opportunities to notice what's working well and what isn't.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/Root-cause analysis.html&quot;&gt;Root-Cause Analysis&lt;/a&gt;&lt;/em&gt; is a useful tool for identifying the underlying causes of your problems.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/Retrospectives.html&quot;&gt;Retrospectives&lt;/a&gt;&lt;/em&gt; provide a way to analyze and improve the entire development process.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;sidebar&quot;&gt;&lt;h3&gt;&quot;Thinking&quot; Mini-Etude&lt;/h3&gt;
 
 &lt;p&gt;The purpose of this &amp;eacute;tude is to practice mindfulness. If you're new to agile development, you may use it to help you understand the XP practices, even if you're not currently using XP. If you're an experienced agile practitioner, review Chapter 11 and use this &amp;eacute;tude to consider how you can go beyond the practices in this book.&lt;/p&gt;
 
 &lt;p&gt;Conduct this &amp;eacute;tude for a time-boxed half-hour every day for as long as it is useful.  Expect to feel rushed by the deadline at first.  If the &amp;eacute;tude becomes stale, discuss how you can change it to make it interesting again. &lt;/p&gt;
 
 &lt;p&gt;You will need multiple copies of this book (if you don't have enough copies on hand, you can make photocopies of specific practices for the purpose of this exercise), paper, and writing implements.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt;  Start by forming pairs.  Try for heterogeneous pairs&amp;mdash;have a programmer work with a customer, a customer work with a tester, and so forth, rather than pairing by job description.  Work with a new partner every day.&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 2.&lt;/strong&gt;  &lt;em&gt;(Timebox this step to 15 minutes.)&lt;/em&gt;  Within your pair, pick one practice from Part II of this book and discuss one of the following sets of questions.  Pick a practice that neither of you have discussed before, even if you didn't get to lead a discussion yesterday.  Timebox your discussion to fifteen minutes.  It's okay not to finish the section, particularly if you haven't read it before.  You'll have the chance to read it again.&lt;/p&gt;
 
 &lt;p&gt;&lt;em&gt;If you aren't using the practice:&lt;/em&gt;&lt;/p&gt;
 
 &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;What about the practice would be easy to do?  What would be hard?  What sounds ridiculous or silly?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;How does it differ from your previous experiences?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;What would have to be true in order for you to use the practice exactly as written?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
 
 &lt;p&gt;&lt;em&gt;If you are using the practice:&lt;/em&gt;&lt;/p&gt;
 
 &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;What aspects of the practice do you differently than the book says?  (Observations only&amp;mdash;no reasons.)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;If you followed the practice exactly as written, what would happen?&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;What one experimental change could you try that would give you new insight about the practice?  (Experiments to prove that the practice is inappropriate are okay.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
 
 &lt;p&gt;&lt;strong&gt;Step 3.&lt;/strong&gt;  &lt;em&gt;(Timebox this step to 15 minutes.)&lt;/em&gt;  Choose three pairs to lead discussions of their answers.  Try to pick pairs so that, over time, everyone gets to lead equally.  Timebox each presentation to five minutes.&lt;/p&gt;
 
&lt;/blockquote&gt;


&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/pair_programming.html&quot;&gt;Pair Programming&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/assess_your_agility.html&quot;&gt;Assess Your Agility&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Agile-Book/thinking_intro.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Problems With Acceptance Testing</title>
  <link>http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html</link>
  <category>/Blog</category>
  <pubDate>Sat, 27 Feb 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;27 Feb 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Blog/"&gt;James Shore/Blog&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;p&gt;&lt;a href=&quot;http://gojko.net/&quot;&gt;Gojko Adzic&lt;/a&gt; wrote to ask about my experiences with acceptance testing. For those who don't know, I was the coordinator of the &lt;a href=&quot;http://fit.c2.com/&quot;&gt;Fit&lt;/a&gt; project for a while and co-author of the C# version. Fit is &lt;a href=&quot;http://c2.com/~ward/&quot;&gt;Ward Cunningham&lt;/a&gt;'s brainchild and (as far as I know) inspired a lot of the current Agile acceptance testing tools, such as &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt;, &lt;a href=&quot;http://cukes.info/&quot;&gt;Cucumber&lt;/a&gt;, and &lt;a href=&quot;http://fitnesse.org/&quot;&gt;FitNesse&lt;/a&gt;. FitNesse, in particular, started out as a fork of Fit.&lt;/p&gt;

&lt;p&gt;When Ward first introduced me to Fit, I was very excited about the possibilities. I embraced it wholeheartedly (as evidenced by my participation in the project) and introduced it to my consulting clients. Over the years, my enthusiasm dimmed. It just didn't work as well in practice as it was supposed to. Here's what I had to say to Gojko:&lt;/p&gt;

&lt;blockquote&gt;
	&lt;p&gt;My experience with Fit and other agile acceptance testing tools is that they cost more than they're worth. There's a lot of value in getting concrete examples from real customers and business experts; not so much value in using &quot;natural language&quot; tools like Fit and similar.&lt;/p&gt;
	
	&lt;p&gt;The planned benefit of those tools is that the customers are supposed to write the examples themselves, thus improving communication between customers and programmers. In practice, I found that customers (a) weren't interested in doing that, and (b) often couldn't understand and didn't trust tests that were written by others. Typically, responsibility for the tests gets handed off to testers, which defeats the whole point.&lt;/p&gt;
	
	&lt;p&gt;Furthermore, acceptance testing tools are almost invariably used to create end-to-end integration tests, which are slow and brittle. Fit works best for targeted tests that describe the domain, but that's not how it's used. Also, tools like Fit don't work with refactoring tools. Once you have a lot of tests, they become a real maintenance burden.&lt;/p&gt;
	
	&lt;p&gt;These two problems--that customers don't participate, which eliminates the purpose of acceptance testing, and that they create a significant maintenance burden, means that acceptance testing isn't worth the cost. I no longer use it or recommend it.&lt;/p&gt;
	
	&lt;p&gt;Instead, I involve business experts (on-site customers) closely throughout the iteration. I do have them create concrete examples, but only when faced with particularly complex topics, and never with the intention that they be run by a tool like Fit. Instead, the programmers use those examples to inform their test-driven development, which may or may not involve creating automated tests from the examples, at the programmers' discretion.&lt;/p&gt;
	
	&lt;p&gt;I also have the on-site customers conduct ad-hoc review of the software as programmers complete it. They pair with a programmer, look at what's been created, and ask for changes that the programmer implements on the spot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Further Reading&lt;/h3&gt;

&lt;p&gt;If you'd like to know more, I highly recommend listening to Scott Hanselman's &lt;a href=&quot;http://www.hanselminutes.com/default.aspx?showID=169&quot;&gt;&quot;Is Fit Dead?&quot; podcast&lt;/a&gt;. In this podcast, Scott interviewed Ward and I together. We talked about our goals for Fit, what actually happened, and passed the torch. I'm very happy with how this interview turned out.&lt;/p&gt;

&lt;p&gt;That podcast kicked off an excellent discussion about Fit on Twitter. Eric Lefevre-Ardant wrote &lt;a href=&quot;http://ericlefevre.net/wordpress/2009/03/06/is-fit-dead-a-debate-on-twitter/&quot;&gt;a great summary&lt;/a&gt;. 

&lt;p&gt;&lt;a href=&quot;http://gojko.net/2010/03/01/are-tools-necessary-for-acceptance-testing-or-are-they-just-evil/&quot;&gt;Gojko Adzic&lt;/a&gt;, &lt;a href=&quot;http://blog.gdinwiddie.com/2010/03/01/the-reality-of-automated-acceptance-testing/&quot;&gt;George Dinwiddie&lt;/a&gt;, and &lt;a href=&quot;http://xprogramming.com/xpmag/problems-with-acceptance-testing&quot;&gt;Ron Jeffries&lt;/a&gt; each posted thoughtful reactions to this essay on their blogs.&lt;/p&gt;

&lt;p&gt;I've posted a follow-up essay describing &lt;a href=&quot;http://jamesshore.com/Blog/Alternatives-to-Acceptance-Testing.html&quot;&gt;Alternatives to Acceptance Testing&lt;/a&gt;.

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Blog/The-Problems-With-Acceptance-Testing.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
<item>
  <title>The Art of Agile Development: Pair Programming</title>
  <link>http://jamesshore.com/Agile-Book/pair_programming.html</link>
  <category>/Agile-Book</category>
  <pubDate>Fri, 26 Feb 2010 00:00:00 PST</pubDate>
  <guid isPermaLink="true">http://jamesshore.com/Agile-Book/pair_programming.html</guid>
  <description>

    

    &lt;table width="100%" border="0" padding="0" spacing="0"&gt;
      &lt;tr&gt;
        &lt;td align="left"&gt;
          &lt;b&gt;26 Feb 2010&lt;/b&gt;
        &lt;/td&gt;
        &lt;td align="right"&gt;
          &lt;i&gt; &lt;a href="http://jamesshore.com/Agile-Book/"&gt;James Shore/Agile-Book&lt;/a&gt; &lt;/i&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  
    
    
      
&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/energized_work.html&quot;&gt;Energized Work&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/thinking_intro.html&quot;&gt;Chapter 5: Thinking&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/thinking_intro.html&quot;&gt;Chapter 5: Thinking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;in 99 words&lt;/h3&gt;

&lt;blockquote class=&quot;ninetynine_words&quot;&gt;

&lt;p&gt;It's more fun than it sounds: two programmers at one computer.  One drives; the other navigates.  Switching roles fluidly, they constantly communicate.  Together, they accomplish better work more quickly than either could alone.&lt;/p&gt;

&lt;p&gt;The driver types.  She focuses on &lt;em&gt;tactics&lt;/em&gt;--writing clean code that compiles and runs.  The navigator focuses on &lt;em&gt;strategy&lt;/em&gt;--how the code fits into the overall design, which tests will drive the code forward, and which refactorings will improve the entire codebase.&lt;/p&gt;

&lt;p&gt;Pairs self-organize by selecting partners who can best help with the current task.  They switch every few hours to share perspectives and knowledge.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h3&gt;as haiku&lt;/h3&gt;

&lt;blockquote class=&quot;haiku&quot;&gt;

&lt;p&gt;Summer bakes the earth
&lt;br /&gt;Heads together, we ponder
&lt;br /&gt;Aha!  An insight.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h3&gt;Behind the Scenes&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Blog/Iterative-Writing.html&quot;&gt;Iterative Writing&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Poster&lt;/h3&gt;

&lt;a href=&quot;http://jamesshore.com/downloads/art-of-agile/pairing-tips.pdf&quot;&gt;&lt;img class=&quot;framed&quot; width=&quot;200&quot; src=&quot;http://jamesshore.com/images/art-of-agile/pairing-tips-thumb.jpg&quot; alt=&quot;'Pairing Tips' poster&quot; /&gt;&lt;/a&gt;&lt;p&gt;

&lt;h3&gt;Full Text&lt;/h3&gt;

&lt;p&gt;The following text is excerpted from &lt;cite&gt;The Art of Agile Development&lt;/cite&gt; by James Shore and Shane Warden (O'Reilly 2007). Copyright &amp;copy 2008 James Shore and chromatic. All rights reserved.&lt;/p&gt;

&lt;h2&gt;Pair Programming&lt;/h2&gt;

&lt;p class=&quot;goal&quot;&gt;We help each other succeed.&lt;/p&gt;

&lt;dl class=&quot;audience&quot;&gt;&lt;dt&gt;Audience&lt;/dt&gt;&lt;dd&gt;Programmers&lt;/dd&gt;&lt;dd&gt;Whole Team&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Do you want somebody to watch over your shoulder all day?  Do you want to waste half of your time sitting in sullen silence watching somebody else code?&lt;/p&gt;

&lt;p&gt;Of course not.  Nobody does&amp;mdash;especially not people who pair program.&lt;/p&gt;

&lt;p&gt;Pair programming is one of the first things people notice about XP.  Two people work at the same keyboard?  It's weird.  It's also extremely powerful and, once you get used to it, tons of fun.  Most programmers I know who tried pairing for a month find that they prefer it to programming alone.&lt;/p&gt;

&lt;h3&gt;Why Pair?&lt;/h3&gt;

&lt;p&gt;This chapter is called &lt;em&gt;Thinking&lt;/em&gt;, yet I included pair programming as the first practice.  That's because pair programming is all about increasing your brainpower.&lt;/p&gt;

&lt;p&gt;When you pair, one person codes&amp;mdash;the &lt;em&gt;driver&lt;/em&gt;.  The other person is the &lt;em&gt;navigator&lt;/em&gt;, whose job is to think.  As navigator, sometimes you think about what the driver is typing.  (Don't rush to point out missing semicolons, though.  That's annoying.)  Sometimes you think about what tasks to work on next and sometimes you think about how your work best fits into the overall design.&lt;/p&gt;

&lt;p&gt;This arrangement leaves the driver free to work on the tactical challenges of creating rigorous, syntactically correct code without worrying about the big picture, and it gives the navigator the opportunity to consider strategic issues without being distracted by the details of coding.  Together, the driver and navigator create higher-quality work more quickly than either could produce on their own.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p class=&quot;aside&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;One study found that pairing takes about 15% more effort than one individual working alone, but produces results more quickly and with 15% fewer defects [Cockburn &amp;amp; Williams].  Every team is different, so take these results with a grain of salt.&lt;/p&gt;

&lt;p&gt;Pairing also reinforces good programming habits.  XP's reliance on continuous testing and design refinement takes a lot of self-discipline.  When pairing, you'll have positive peer pressure to perform these difficult but crucial tasks.  You'll spread coding knowledge and tips throughout the team.&lt;/p&gt;

&lt;p&gt;You'll also spend more time in &lt;em&gt;flow&lt;/em&gt;&amp;mdash;that highly-productive state in which you're totally focused on the code.  It's a different kind of flow than normal because you're working with a partner, but it's far more resilient to interruptions.  To start with, you'll discover that your office mates are far less likely to interrupt you when you're working with someone.  When they do, one person will handle the interruption while the other continues his train of thought.  Further, you'll find yourself paying more attention to the conversation with your programming partner than surrounding noise; it fades into the background.&lt;/p&gt;

&lt;p&gt;If that isn't enough, pairing really is a lot of fun.  The added brainpower will help you get past roadblocks more easily.  For the most part, you'll be collaborating with smart, like-minded people.  Plus, if your wrists get sore from typing, you can hand off the keyboard to your partner and continue to be productive.&lt;/p&gt;

&lt;h3&gt;How to Pair&lt;/h3&gt;

&lt;p&gt;I recommend pair programming on all production code.  Many teams who pair frequently, but not exclusively, discover that they find more defects in solo code.  A good rule of thumb is to pair on anything that you need to maintain, which includes tests and the build script.&lt;/p&gt;

&lt;p&gt;When you start working on a task, ask another programmer to work with you.  If another programmer asks for help, make yourself available.  Never assign partners: pairs are fluid, forming naturally and shifting throughout the day.  Over time, pair with everyone on the team.  This will help improve team cohesion and it will spread design skills and knowledge throughout the team.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Get a fresh perspective by switching partners.&lt;/blockquote&gt;

&lt;p&gt;When you need a fresh perspective, switch partners.  I usually switch when I'm feeling frustrated or stuck.  Have one person stay on the task to help bring the new partner up to speed.  Often, even explaining the problem to someone new will help you resolve it.&lt;/p&gt;

&lt;p&gt;It's a good idea to switch partners several times per day even if you don't feel stuck.  This will help keep everyone informed and moving quickly.  I switch whenever I finish a task.  If I'm working on a big task, I switch within four hours.&lt;/p&gt;

&lt;p&gt;When you sit down to pair together, make sure that you're physically comfortable.  Position your chairs side by side, allowing for each others' need for personal space, and make sure the monitor is clearly visible.  When you're driving, place the keyboard directly in front of you.  Keep an eye out for this one&amp;mdash;for some reason, people pairing tend to contort themselves to reach the keyboard and mouse rather than moving them closer.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/test_driven_development.html&quot;&gt;Test-Driven Development&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Paired programmers produce code through conversation.  As you drive or navigate, think out loud.  Take small, frequent design steps&amp;mdash;test-driven development works best&amp;mdash;and talk about your assumptions, short-term goals, general direction, and any relevant history of the feature or project.  If you're confused about something, ask questions.  The discussion may enlighten your partner as much as it does you.&lt;/p&gt;

&lt;blockquote class=&quot;notetip&quot;&gt;
 
 &lt;p&gt;When a pair &lt;em&gt;goes dark&lt;/em&gt;&amp;mdash;talks less, lowers their voices, or doesn't switch off with other pairs&amp;mdash;it's often a sign of technical difficulty.&lt;/p&gt;
 
&lt;/blockquote&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/energized_work.html&quot;&gt;Energized Work&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Expect to feel tired at the end of the day.  Pairs typically feel that they have worked harder and accomplished more than when working alone. Practice energized work to maintain your ability to pair every day.&lt;/p&gt;

&lt;h3&gt;Driving and Navigating&lt;/h3&gt;

&lt;blockquote class=&quot;coach&quot;&gt;Pairing will feel natural in time.&lt;/blockquote&gt;

&lt;p&gt;When you start pairing, expect to feel clumsy and fumble-fingered as you drive. You may feel that your navigator sees ideas and problems much more quickly than you do.  She does&amp;mdash;navigators have more time to think than drivers do.  The situation will reverse when you navigate.  Pairing will feel natural in time.&lt;/p&gt;

&lt;p&gt;When navigating, expect to feel like you want to step in and take the keyboard away from your partner.  Relax; your driver will often communicate an idea with both words and code.  He'll make typos and little mistakes&amp;mdash;give him time to correct them himself.  Use your extra brainpower to think about the greater picture.  What other tests do you need to write?  How does this code fit into the rest of the system?  Is there duplication you need to remove?  Can the code be more clear?  Can the overall design be better?&lt;/p&gt;

&lt;p&gt;As navigator, help your driver be more productive.  Think about what's going to happen next and be prepared with suggestions.  When I'm navigating, I like to keep an index card in front of me.  Rather than interrupting the driver when I think of an issue, I write my ideas on the index card and wait for a break in the action to bring them up.  At the end of the pairing session, I tear up the card and throw it away.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/spike_solutions.html&quot;&gt;Spike Solutions&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Similarly, when a question arises, take a moment to look up the answer while the driver continues to work.  Some teams keep spare laptops on hand for this purpose.  If you need more than a few minutes, research the solution together.  Sometimes the best way to do so is to split up, pursue parallel lines of inquiry, and frequently come back together to share what you have learned.  Spike solutions are a particularly powerful approach.&lt;/p&gt;

&lt;p&gt;As you pair, switch roles frequently&amp;mdash;at least every half hour, and possibly every few minutes.  If you're navigating and find yourself telling the driver which keys to press, ask for the keyboard.  If you're driving and need a break, pass the keyboard off to your navigator.&lt;/p&gt;

&lt;blockquote class=&quot;sidebar&quot;&gt;&lt;h3&gt;Pairing Tips&lt;/h3&gt;
 
 &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;Pair on everything you'll need to maintain.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Allow pairs to form fluidly rather than assigning partners.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Switch partners when you need a fresh perspective.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Avoid pairing with the same person for more than a day at a time.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Sit comfortably, side-by-side.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Produce code through conversation.  Collaborate, don't critique.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Switch driver and navigator roles frequently.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
 
&lt;/blockquote&gt;

&lt;h3&gt;Pairing Stations&lt;/h3&gt;

&lt;p&gt;To enjoy pair programming, good pairing stations are essential.  You need plenty of room for both people to sit side by side.  Typical cubicles, with a workstation located in a corner, won't work.  They're uncomfortable and require one person to sit behind another, adding psychological as well as physical barriers to peer collaboration.&lt;/p&gt;

&lt;p&gt;You don't need fancy furniture to make a good pairing station; the best ones I've seen are just simple folding tables found at any good office supply store.  They should be six feet long, so that two people can sit comfortably side-by-side, and at least four feet deep.  Each table needs a high-powered development workstation.  I like to plug in two keyboards and mice so each person can have a set.&lt;/p&gt;

&lt;p&gt;Splurge on large monitors so that both people can see clearly.  Some teams mirror the display onto two monitors, which makes things a little easier to see, but you may find yourself pointing to the wrong monitor.  Others prefer to spread one desktop across two monitors.&lt;/p&gt;

&lt;blockquote class=&quot;notetip&quot;&gt;
 
 &lt;p&gt;For ideas about where to put the pairing stations, see &quot;&lt;a href=&quot;http://jamesshore.com/Agile-Book/sit_together.html&quot;&gt;Sit Together&lt;/a&gt;&quot; in Chapter 6.&lt;/p&gt;
 
&lt;/blockquote&gt;

&lt;h3&gt;Challenges&lt;/h3&gt;

&lt;p&gt;Pairing can be uncomfortable at first, as it may require you to collaborate more than you're used to.  These feelings are natural and typically go away after a month or two, but you have to face some challenges.&lt;/p&gt;

&lt;h4&gt;Comfort&lt;/h4&gt;

&lt;p&gt;It bears repeating: pairing is no fun if you're uncomfortable.  When you sit down to pair, adjust your position and equipment so you can sit comfortably.  Clear debris off the desk and make sure there's room for your legs, feet, and knees.&lt;/p&gt;

&lt;p&gt;Some people (like me) need a lot of personal space.  Others like to get up close and personal.  When you start to pair, discuss your personal space needs and ask about your partner's.&lt;/p&gt;

&lt;p&gt;Similarly, while it goes without saying that personal hygiene is critical, remember that strong flavors such as coffee, garlic, onions, and spicy foods can lead to foul breath.  Decide as a team, &lt;em&gt;before&lt;/em&gt; any issues come up, how to notify people of challenging personal habits respectfully.&lt;/p&gt;

&lt;h4&gt;Mismatched Skills&lt;/h4&gt;

&lt;p&gt;Pairing is a collaboration between peers, but sometimes a senior developer will pair with a junior developer.  Rather than treating these occasions as student/teacher situations, restore the peer balance by creating opportunities for both participants to learn.  For example, if you know you'll be pairing with a junior developer, you could ask him to research a topic that no one else knows, such as the inner workings of a library that the team depends on.  Give everyone a chance to be an expert.&lt;/p&gt;

&lt;h4&gt;Communication Style&lt;/h4&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/test_driven_development.html&quot;&gt;Test-Driven Development&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;New drivers sometimes have difficulty involving their partners; they can take over the keyboard and shut down communication.  To practice communicating and switching roles while pairing, consider &lt;em&gt;ping-pong pairing&lt;/em&gt;.  In this exercise, one person writes a test.  The other person makes it pass and writes a new test.  Then the first person makes it pass and repeats the process by writing another test.&lt;/p&gt;

&lt;p&gt;The flip side of too little communication is too much communication&amp;mdash;or rather, too much blunt communication.  Frank criticism of code and design is valuable, but it may be difficult to appreciate at first.  Different people have different thresholds, so pay attention to how your partner receives your comments.  Try transforming declarations (such as &quot;This method is too long&quot;) into questions or suggestions (&quot;Could we make this method shorter?&quot; or &quot;Should we extract this code block into a new method?&quot;).  Adopt an attitude of collaborative problem solving.&lt;/p&gt;

&lt;h4&gt;Tools and Keybindings&lt;/h4&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/coding_standards.html&quot;&gt;Coding Standards&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Even if you don't fall victim to the endless &lt;code&gt;vi&lt;/code&gt; versus &lt;code&gt;emacs&lt;/code&gt; editor war, you may find your coworkers' tool preferences annoying.  Try to standardize on a particular toolset.  Some teams even create a standard image and check it into version control.  When you discuss coding standards, discuss these issues as well.&lt;/p&gt;

&lt;h3&gt;Questions&lt;/h3&gt;

&lt;h4 class=&quot;faq&quot;&gt;Isn't it wasteful to have two people do the work of one?&lt;/h4&gt;

&lt;p&gt;In pair programming, two people aren't really doing the work of one.  Although only one keyboard is in use, there's more to programming than that.  As Ward Cunningham said, &quot;If you don't think carefully, you might think that programming is just typing statements in a programming language.&quot;&lt;sup&gt;2&lt;/sup&gt;  In pair programming, one person is programming and the other is thinking ahead, anticipating problems, and strategizing.&lt;/p&gt;

&lt;p class=&quot;aside&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;http://en.wikiquote.org/wiki/Ward_Cunningham, accessed 12 December 2006.&lt;/p&gt;

&lt;p&gt;If you're looking for hard data, [Williams] has a chapter on pairing research.  Keep in mind that the number of variables in software development make it notoriously difficult to conduct large-scale controlled studies.  Sometimes the best way to know whether something will work for your team is just to try it.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;How can I convince my team or organization to try pair programming?&lt;/h4&gt;

&lt;p&gt;Ask permission to try it as an experiment.  Set aside a month in which everyone pairs on all production code.  Be sure to keep going for the entire month, as pair programming may be difficult and uncomfortable for the first few weeks.&lt;/p&gt;

&lt;p&gt;Don't just ask permission of management; be sure your fellow team members are interested in trying pairing as well.  The only programmers I know who tried pairing for a month and didn't like it are the ones who were forced to do it against their will.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;Do we really have to pair program all the time?&lt;/h4&gt;

&lt;p&gt;This is a decision that your whole team should make together.  Before you decide, try pairing on all production code (everything you need to maintain) for a month.  You may enjoy it more than you expect.&lt;/p&gt;

&lt;p&gt;Regardless of your rule, you will still produce code that you don't need to maintain.  (Spike solutions are one example.)  These may benefit from individual study.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;If you're bored while pairing, consider how you can make your design less repetitive.&lt;/blockquote&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/simple_design.html&quot;&gt;Simple Design&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Some production tasks are so repetitive that they don't require the extra brainpower a pair provides.  Before abandoning pairing, however, consider why your design requires so much repetition.  It could be an indication of a design flaw.  Use the navigator's extra time to think about design improvements and consider discussing it with your whole team.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;How can I concentrate with someone talking to me?&lt;/h4&gt;

&lt;p&gt;When you navigate, you shouldn't have too much trouble staying several steps ahead of your driver.  If you do, ask your driver to think out loud so you can understand her thought process.&lt;/p&gt;

&lt;p&gt;As driver, though, you may sometimes find that you're having trouble concentrating.  Let your navigator know&amp;mdash;she may have a suggestion that will help you get through the roadblock.  At other times, you may just need a few moments of silence to think through the problem.&lt;/p&gt;

&lt;blockquote class=&quot;coach&quot;&gt;If you have trouble concentrating, try taking smaller steps.&lt;/blockquote&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/test_driven_development.html&quot;&gt;Test-Driven Development&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;If you find yourself in this situation a lot, you may be taking steps that are too large.  Use test-driven development and take very small steps.  Rely on your navigator to keep track of what you still need to do (tell him if you have an idea; she'll write it down) and focus only on the few lines of code needed to make the next test pass.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/spike_solutions.html&quot;&gt;Spike Solutions&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;If you are working with a technology you don't completely understand, consider taking a few minutes to work on a spike solution.  You and your partner can work on this together or separately.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;What if we have an odd number of programmers?&lt;/h4&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/exploratory_testing.html&quot;&gt;Exploratory Testing&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;A programmer flying solo can do productive tasks that don't involve production code.  She can research new technologies, or learn more about a technology the team is using.  She can pair with a customer or tester to review recent changes, polish the application, or do exploratory testing.  She could be the team's batman (see &quot;&lt;a href=&quot;http://jamesshore.com/Agile-Book/iteration_planning.html&quot;&gt;Iteration Planning&lt;/a&gt;&quot; in Chapter 8).&lt;/p&gt;

&lt;p&gt;Alternatively, a solo programmer may wish to spend some time reviewing the overall design&amp;mdash;either to improve his own understanding, or to come up with ideas for improving problem areas.  If a large refactoring is partially complete, the team may wish to authorize a conscientious programmer to finish those refactorings.&lt;/p&gt;

&lt;p&gt;If your team is on the smaller side, you may run out of useful solo tasks.  In this case, consider relaxing the &quot;no production code&quot; rule or bringing in another programmer.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;There are only two (or three) of us.  Should we still pair all the time?&lt;/h4&gt;

&lt;p&gt;Even a saint will get on your nerves if you have to pair with him day-in, day-out.  Use your own judgment about when to pair and when you need time to yourself.  If you feel fine but your pair is getting cranky, don't escalate; just say &lt;em&gt;you're&lt;/em&gt; tired and need a break.&lt;/p&gt;

&lt;p&gt;I pair-programmed with the same person for three months straight during a two-person project.  I think it helped that we had a large office and a big desk: it gave us room to move around.  We also kept a mini-fridge stocked with goodies.&lt;/p&gt;

&lt;p&gt;Even with these comforts, I had my cranky moments. Perhaps the most important factor was that my partner was a very laid-back, easy-going person who put up with my occasional bad mood.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;We get engrossed in our work and forget to switch pairs.  How can we encourage more frequent pair switching?&lt;/h4&gt;

&lt;p&gt;One approach is to remember that you can switch when you feel stuck or frustrated.  In fact, this is a perfect time to switch partners and get a fresh perspective.&lt;/p&gt;

&lt;p&gt;Some teams use kitchen timers to switch partners at strictly defined intervals.  [Belshee] reports interesting results from switching every ninety minutes.  While this could be a great way to get in the habit of switching pairs, make sure everybody is willing to try it.&lt;/p&gt;

&lt;h4 class=&quot;faq&quot;&gt;How can we pair remotely?&lt;/h4&gt;

&lt;p&gt;You can use a phone headset and a desktop sharing tool such as VNC or NetMeeting to pair remotely.  I have heard of teams who use individual workstations with shared &lt;code&gt;screen&lt;/code&gt; sessions and VoIP applications.&lt;/p&gt;

&lt;p&gt;When I tried this, I found it to be a poor substitute for pairing in person.  XP teams usually sit together, so remote pairing isn't often necessary.&lt;/p&gt;

&lt;h3&gt;Results&lt;/h3&gt;

&lt;p&gt;When you pair program well, you find yourself focusing intently on the code and your work with your partner.  You experience fewer interruptions and distractions.  When interrupted, one person deals with the problem while the other continues thinking.  Afterward, you slide back into the flow of work immediately.  At the end of the day, you feel tired yet satisfied.  You enjoy the intense focus and the camraderie of working with your teammates.&lt;/p&gt;

&lt;p&gt;The team as a whole enjoys higher quality code.  Technical debt decreases.  Knowledge travels quickly through the team, raising everyone's level of competence and helping to integrate new team members quickly.&lt;/p&gt;

&lt;h3&gt;Contraindications&lt;/h3&gt;

&lt;p&gt;Pairing requires a comfortable work environment (see &quot;&lt;a href=&quot;http://jamesshore.com/Agile-Book/sit_together.html&quot;&gt;Sit Together&lt;/a&gt;&quot; in Chapter 6 for design options).  Most offices and cubicles just aren't set up that way.  If your workspace doesn't allow programmers to sit side-by-side comfortably, either change the workspace or don't pair program.&lt;/p&gt;

&lt;p&gt;Similarly, if your team doesn't sit together, pairing may not work for you.  Although you can pair remotely, it's not as good as in-person.&lt;/p&gt;

&lt;p&gt;Programmer resistance may be another reason to avoid pairing.  Pairing is a big change to programmers' work styles and you may encounter resistance.  I usually work around this by asking people to try it for a month or two before making a final decision.  If they still resist, you're probably better off avoiding pairing rather than forcing anyone to pair against their will.&lt;/p&gt;

&lt;h3&gt;Alternatives&lt;/h3&gt;

&lt;p&gt;Pairing is a very powerful tool.  It reduces defects, improves design quality, shares knowledge amongst team members, supports self-discipline, and reduces distractions; all without sacrificing productivity.  If you cannot pair program, you need alternatives.&lt;/p&gt;

&lt;p&gt;Formal code inspections can reduce defects, improve quality, and support self-discipline.  However, my experience is that programmers have trouble including inspections in their schedules, even when they're in favor of them.  Pairing is easier to do consistently, and it provides feedback much more quickly than scheduled inspections.  If you're going to use inspections in place of pairing, add some sort of support mechanism to help them take place.&lt;/p&gt;

&lt;p&gt;Inspections alone are unlikely to share knowledge as thoroughly as collective code ownership requires.  If you cannot pair program, consider avoiding collective ownership, at least at first.&lt;/p&gt;

&lt;p&gt;If you'd still like to have collective code ownership, you need an alternative mechanism for sharing knowledge about the state of the codebase.  I've formed regular study groups  in which programmers meet daily for a timeboxed half-hour to review and discuss the design.&lt;/p&gt;

&lt;dl class=&quot;practice&quot;&gt;&lt;dt&gt;Ally&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;http://jamesshore.com/Agile-Book/energized_work.html&quot;&gt;Energized Work&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;I'm not aware of any other tool that helps reduce distractions as well as pair programming does.  However, I find that I succumb to more frequent distractions when I'm tired.  In the absence of pairing, put more emphasis on energized work.&lt;/p&gt;

&lt;h3&gt;Further Reading&lt;/h3&gt;

&lt;p&gt;&lt;cite&gt;Pair Programming Illuminated&lt;/cite&gt; [Williams] discusses pair programming in depth.&lt;/p&gt;

&lt;p&gt;&quot;The Costs and Benefits of Pair Programming&quot; [Cockburn &amp;amp; Williams] reports on Laurie Williams' initial study of pair programming.&lt;/p&gt;

&lt;p&gt;&quot;Promiscuous Pairing and Beginner's Mind: Embrace Inexperience&quot; [Belshee] is an intriguing look at the benefits of switching pairs at strict intervals.&lt;/p&gt;

&lt;p&gt;&quot;Adventures in Promiscuous Pairing: Seeking Beginner's Mind&quot; [Lacey] explores the costs and challenges of promiscuous pairing.  It's a must-read if you plan to try Belshee's approach.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Peer Reviews in Software: A Practical Guide&lt;/cite&gt; [Wiegers] discusses formal inspections and peer reviews.&lt;/p&gt;


&lt;ul class=&quot;book_nav&quot;&gt;
	&lt;li&gt;Next: &lt;a href=&quot;http://jamesshore.com/Agile-Book/energized_work.html&quot;&gt;Energized Work&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Previous: &lt;a href=&quot;http://jamesshore.com/Agile-Book/thinking_intro.html&quot;&gt;Chapter 5: Thinking&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Up: &lt;a href=&quot;http://jamesshore.com/Agile-Book/thinking_intro.html&quot;&gt;Chapter 5: Thinking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    
    
    &lt;p&gt;&lt;a href="http://jamesshore.com/Agile-Book/pair_programming.html#comments"&gt;Comments&lt;a&gt;&lt;p&gt;
  </description>
</item>
  </channel>
</rss>