<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Richard Lawrence</title>
	<atom:link href="http://www.richardlawrence.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.richardlawrence.info</link>
	<description>On making software teams happier and more productive</description>
	<lastBuildDate>Fri, 09 Mar 2012 18:38:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>New Story Splitting Resource</title>
		<link>http://www.richardlawrence.info/2012/01/27/new-story-splitting-resource/</link>
		<comments>http://www.richardlawrence.info/2012/01/27/new-story-splitting-resource/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 18:41:27 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[product management]]></category>
		<category><![CDATA[Product Owner]]></category>
		<category><![CDATA[user stories]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=421</guid>
		<description><![CDATA[More than two years after I originally published it, &#8220;Patterns for Splitting User Stories&#8221; remains one of the most visited posts on my blog. Splitting user stories continues to be one of the areas where the teams I work with most often need coaching. To support the teams I coach, I&#8217;ve created a flow chart [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>More than two years after I originally published it, <a href="/2009/10/28/patterns-for-splitting-user-stories/">&#8220;Patterns for Splitting User Stories&#8221;</a> remains one of the most visited posts on my blog. Splitting user stories continues to be one of the areas where the teams I work with most often need coaching. </p>
<p>To support the teams I coach, I&#8217;ve created a flow chart that goes through the questions I&#8217;ll ask when I&#8217;m helping a team split their stories.<span id="more-421"></span> I was going to keep this resource for my coaching clients, but I&#8217;ve decided to share it here for free. Click the thumbnail below to download the full-size PDF version.</p>
<p><a href='http://rslawrence.wpengine.com/wp-content/uploads/2012/01/Story-Splitting-Flowchart.pdf'><img src="http://rslawrence.wpengine.com/wp-content/uploads/2012/01/Story-Splitting-Flowchart-Thumbnail.png" alt="" title="&quot;How to Split a User Story&quot; Flowchart" width="669" height="438" class="aligncenter size-full wp-image-422" /></a></p>
<p>Let me know in the comments if you find this useful. If you can share them, I&#8217;d love to see examples of how you&#8217;ve used it, what the stories looked like before and after splitting.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2012/01/27/new-story-splitting-resource/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Coaching Surgeons, Cyclists, and Software Teams</title>
		<link>http://www.richardlawrence.info/2012/01/11/coaching-surgeons-cyclists-and-software-teams/</link>
		<comments>http://www.richardlawrence.info/2012/01/11/coaching-surgeons-cyclists-and-software-teams/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 17:26:56 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[coaching]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=411</guid>
		<description><![CDATA[Atul Gawande is a surgeon and author who has written some excellent books and New Yorker articles reflecting on the state of modern medicine. Recently, his writing has gone beyond medicine in interesting ways. As he looks for lessons for medicine from other disciplines, he ends up with things to teach both medical professionals and [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Atul Gawande is a surgeon and author who has written some excellent books and New Yorker articles reflecting on the state of modern medicine. Recently, his writing has gone beyond medicine in interesting ways. As he looks for lessons for medicine from other disciplines, he ends up with things to teach both medical professionals and skilled knowledge workers more generally. His book <a href="http://amzn.com/0805091742"><em>The Checklist Manifesto</em></a> manages to be a riveting 224 pages on what ought to be one of the least interesting topics possible: the checklist.</p>
<p>So I was intrigued to see a link to <a href="http://www.newyorker.com/reporting/2011/10/03/111003fa_fact_gawande?mbid=social_retweet&#038;currentPage=all">a New Yorker article from Dr. Gawande on my own specialty, coaching</a>. It&#8217;s as good as I might have hoped.<span id="more-411"></span> Noticing that his own performance as a surgeon seems to have plateaued, he wonders whether a brief experience with a tennis coach might apply to surgery:</p>
<blockquote><p>
One July day a couple of years ago, when I was at a medical meeting in Nantucket, I had an afternoon free and went looking for someone to hit with. I found a local tennis club and asked if there was anyone who wanted to play. There wasn’t. I saw that there was a ball machine, and I asked the club pro if I could use it to practice ground strokes. He told me that it was for members only. But I could pay for a lesson and hit with him.</p>
<p>He was in his early twenties, a recent graduate who’d played on his college team. We hit back and forth for a while. He went easy on me at first, and then started running me around. I served a few points, and the tennis coach in him came out. You know, he said, you could get more power from your serve.</p>
<p>I was dubious. My serve had always been the best part of my game. But I listened. He had me pay attention to my feet as I served, and I gradually recognized that my legs weren’t really underneath me when I swung my racquet up into the air. My right leg dragged a few inches behind my body, reducing my power. With a few minutes of tinkering, he’d added at least ten miles an hour to my serve. I was serving harder than I ever had in my life.</p>
<p>Not long afterward, I watched Rafael Nadal play a tournament match on the Tennis Channel. The camera flashed to his coach, and the obvious struck me as interesting: even Rafael Nadal has a coach. Nearly every élite tennis player in the world does. Professional athletes use coaches to make sure they are as good as they can be.</p>
<p>But doctors don’t. I’d paid to have a kid just out of college look at my serve. So why did I find it inconceivable to pay someone to come into my operating room and coach me on my surgical technique?
</p></blockquote>
<p>The rest of the article wanders through a history of coaching; interesting examples from sports, music, and education; and describes his own experience engaging a coach. He concludes,</p>
<blockquote><p>
There was a moment in sports when employing a coach was unimaginable—and then came a time when not doing so was unimaginable. We care about results in sports, and if we care half as much about results in schools and in hospitals we may reach the same conclusion.
</p></blockquote>
<p>I value coaching enough to spend my own money on it. I&#8217;ve hired a mountain bike coach, <a href="http://www.leelikesbikes.com/">Lee McCormack</a>, to help me prepare for this summer&#8217;s <a href="http://trestlebikepark.com/enduro.html">Trestle All Mountain Enduro race</a>. It&#8217;ll be my first downhill race. I don&#8217;t expect to win, but I want to get a result I can be happy about and enjoy the experience.</p>
<p>I used to do cross-country mountain bike races, and I have a pretty good idea how to train for an event. I have Lee&#8217;s books. I could probably do this on my own. But I know from my own experience as a software development coach how much faster a good coach can help you improve.</p>
<p><div class="wp-caption alignright" style="width: 320px">
	<a href="http://www.leelikesbikes.com/testing-my-pump-track.html"><img alt="Lee McCormack on his backyard pump track" src="http://www.leelikesbikes.com/wp-content/pump13.jpg" title="Lee McCormack on his backyard pump track" width="320" /></a>
	<p class="wp-caption-text">Lee McCormack on his backyard pump track</p>
</div>I started working with Lee yesterday morning. We spent a couple hours working on basic pumping and cornering skills on his pump track and practicing seated and standing pedaling on the roads around his house in the Boulder foothills. Lee would demonstrate a technique. I&#8217;d try it. He&#8217;d give me feedback. I&#8217;d try it again. He&#8217;d modify the exercise to focus on whatever I was struggling with, and I&#8217;d ride a bit more. </p>
<p>After just two hours of coaching—working on things I would have said I already knew how to do—I could see a marked improvement in my skills. And I had a nice list of things to practice on my own.</p>
<p>This brings me back around to software development. Our world today runs on software. But most software teams struggle to deliver anywhere near as quickly and reliably as they could. A software profession living up to its potential would transform the world. <strong>So, to paraphrase Gawande: If we care half as much about results in software development as we do in sports, how is it imaginable that so few teams engage a coach? How is it imaginable that so many teams with access to coaching fail to make the most of it?</strong></p>
<p>What about your team? Do you have a coach? If so, do you make the most of the coaching you have available to you? </p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2012/01/11/coaching-surgeons-cyclists-and-software-teams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cucumber Tip: IRB From Inside a Step Definition</title>
		<link>http://www.richardlawrence.info/2011/12/07/cucumber-tip-irb-from-inside-a-step-definition/</link>
		<comments>http://www.richardlawrence.info/2011/12/07/cucumber-tip-irb-from-inside-a-step-definition/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 20:05:35 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=401</guid>
		<description><![CDATA[Most Ruby programmers know about Ruby&#8217;s interactive console, IRB. (If you don&#8217;t, stop right here, open up a command window and run irb. Type some Ruby code. See how it returns the result of each line right away.) IRB is great for poking around with unfamiliar libraries. Suppose you&#8217;re using Capybara with Cucumber for the [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Most Ruby programmers know about Ruby&#8217;s interactive console, IRB. (If you don&#8217;t, stop right here, open up a command window and run <code class="codecolorer text default"><span class="text">irb</span></code>. Type some Ruby code. See how it returns the result of each line right away.) IRB is great for poking around with unfamiliar libraries.</p>
<p>Suppose you&#8217;re using Capybara with Cucumber for the first time. It would be nice to use IRB to experiment with what Capybara can do on a particular page. You could launch an IRB session and duplicate all the Capybara setup from your Cucumber <code class="codecolorer text default"><span class="text">support/env.rb</span></code> file. But wouldn&#8217;t it be nice if you could just fire up IRB in the context of a step definition so you know everything in your IRB session matches what you&#8217;d get in the step def? Turns out you can. Here&#8217;s how&#8230;<span id="more-401"></span></p>
<p>Install the ruby-debug gem. If you&#8217;re using Ruby 1.9 like me, you need the ruby-debug19 gem. In Rails 3, just add <code class="codecolorer text default"><span class="text">gem ruby-debug19</span></code> to your Gemfile, probably in the test group, and run <code class="codecolorer text default"><span class="text">bundle install</span></code>.</p>
<p>Require ruby-debug in <code class="codecolorer text default"><span class="text">support/env.rb</span></code>.</p>
<p>Add <code class="codecolorer text default"><span class="text">breakpoint</span></code> where you want to jump into IRB. For example:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given <span style="color:#006600; font-weight:bold;">/</span>^I am on the advanced search page$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; visit <span style="color:#996600;">'http://http://www.google.com/advanced_search'</span><br />
&nbsp; breakpoint<br />
&nbsp; <span style="color:#006666;">0</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>(Note the extra line after <code class="codecolorer text default"><span class="text">breakpoint</span></code> with <code class="codecolorer text default"><span class="text">0</span></code> on it. <code class="codecolorer text default"><span class="text">breakpoint</span></code> breaks before executing the next line, so if it&#8217;s the last thing in a block, you won&#8217;t jump into the debugger in the context you expect; <code class="codecolorer text default"><span class="text">0</span></code> is a dummy line to keep us in the right context.)</p>
<p>Run Cucumber like normal. When it reaches <code class="codecolorer text default"><span class="text">breakpoint</span></code>, ruby-debug will take over, and you&#8217;ll see a prompt like this: <code class="codecolorer text default"><span class="text">(rdb:1)</span></code>.</p>
<p>You can do a lot of different things at this prompt, but we only care about one right now: type <code class="codecolorer text default"><span class="text">irb</span></code> and hit Enter. Now you should see a an IRB prompt. You&#8217;re in the context of a Cucumber step definition. Type <code class="codecolorer text default"><span class="text">self</span></code> and hit Enter. You&#8217;ll see that <code class="codecolorer text default"><span class="text">self</span></code> is an instance of Cucumber&#8217;s World with various things mixed in. From here, you can do anything you would do inside that step definition.</p>
<p>When you&#8217;re done, run <code class="codecolorer text default"><span class="text">quit</span></code> to get out of IRB and <code class="codecolorer text default"><span class="text">continue</span></code> to get out of the debugger. Cucumber execution will continue like normal. Keep in mind, though, that if you change the state of your system from IRB, you might not get the test results you expect.</p>
<p>Enhancements and variations for you to explore:</p>
<ul>
<li>Make IRB nicer to use with gems such as irbtools</li>
<li>Create a step definition just for launching the debugger</li>
<li>Create a tagged scenario just for launching the debugger</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/12/07/cucumber-tip-irb-from-inside-a-step-definition/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Building a Useful Task Board</title>
		<link>http://www.richardlawrence.info/2011/11/21/building-a-useful-task-board/</link>
		<comments>http://www.richardlawrence.info/2011/11/21/building-a-useful-task-board/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 16:42:55 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=388</guid>
		<description><![CDATA[The task board is a simple, yet powerful, tool for Scrum teams. As a coach, I can tell a lot about a team just by looking at their task board in the middle of a sprint. If your Scrum team is in the same location, I can&#8217;t think of a good reason why you wouldn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>The task board is a simple, yet powerful, tool for Scrum teams. As a coach, I can tell a lot about a team just by looking at their task board in the middle of a sprint. If your Scrum team is in the same location, I can&#8217;t think of a good reason why you wouldn&#8217;t want to build and use a task board.</p>
<p>Here&#8217;s how to build a basic task board, various ways to enhance it to convey more information, and some analysis of the many things you can learn from this simple tool.<span id="more-388"></span></p>
<h2>Supplies Required</h2>
<ul>
<li>A black or blue poster marker</li>
<li>A black fine tip marker</li>
<li><a href="http://amzn.com/B0002DOF7E">3 inch square Super Sticky Post-It notes in yellow</a> (generic sticky notes tend not to stick for a whole sprint)</li>
<li>A large surface (e.g. whiteboard, foam core, smooth wall, etc.)</li>
</ul>
<h2>Optional Supplies</h2>
<ul>
<li>Blue and red fine tip markers</li>
<li>Two 1&#8243; photos of each team member</li>
<li><a href="http://amzn.com/B000YD1XNG">Larger sticky notes in another color</a> such as blue or green</li>
<li>Square or small sticky notes in orange or red</li>
<li>Removable, semi-transparent color dot stickers</li>
<li>Narrow electrical tape</li>
<li><a href="/2009/12/21/growing-done-how-to-make-the-definition-of-done-work-for-your-team/">Story Definition of Done</a> printed as checklists</li>
<li><a href="http://amzn.com/B00006IFBO">Post-It glue stick</a></li>
<li>Blue masking tape</li>
</ul>
<h2>Basic setup and use</h2>
<p>Make sure you place your task board where the team will use it. Ideally, the team is in a team room together and the board is in the same room. At the very least, it should be in a place where the team will see it several times a day. It&#8217;s very valuable to use the board to focus the Daily Scrum, so there should be enough space for the whole team to stand around it.</p>
<p>On your task board surface, mark out the following columns with marker or tape: Story, Not Started, In Progress, Done.</p>
<p>Create a card (on a sticky note) for each story you committed to in the current sprint. If you have two colors of stickies or a larger sticky available, use that for the stories. Use the black fine marker to write a title for the story in large, clear print. If the story is in the typical &#8220;As a <user>, I want <feature> so that <value>&#8221; format, you&#8217;ll want to shorten it to a 3-6 word title. You can write the full story on the card with a pen if you want. Write the story point estimate on the card, in a different color marker if you have one. The story titles on the cards should be readable from about 6 feet away. Arrange the story cards in priority order in the first column, leaving space between them. Each story thus defines a horizontal lane across the board. (I don&#8217;t recommend drawing or taping horizontal lines, though; different stories need different amounts of space at different times.)</p>
<p>Create a card for each task you&#8217;ve defined. Again, use the black fine marker and a short title to make them readable from 3-6 feet away. Arrange the tasks in the Not Started column with their corresponding story.</p>
<p>Some teams generate all or most of their tasks at sprint planning. Some generate tasks as they start a story or just-in-time. Still others don&#8217;t use tasks at all. If you generate tasks throughout the sprint, you can expand and contract the story lanes to make room for tasks as needed. If you don&#8217;t use tasks, you&#8217;ll want to eliminate the Story column and move the story cards through the other three columns.</p>
<p>Tasks will almost always be placed on the board in the Not Started column. As a team member assigns a task to himself, he&#8217;ll write his name or initials on the card and move the card into the In Progress column. When the task is done, he&#8217;ll move it into the Done column and likely choose another task to start.</p>
<p>The basic board should look something like this:</p>
<p><img src="/wp-content/uploads/2011/11/basic-task-board.png" alt="" title="Basic Scrum Task Board" width="660" height="400" class="alignnone size-full wp-image-394" /></p>
<h2>Enhancements and variations</h2>
<p>If you have photos for each team member, attach them to small sticky notes or put Post-It glue on the back. Place the photo stickies on the edge of the board to indicate team members available for tasks. I suggest only making one sticky per person readily available. You can have a second sticky available for the rare times a task is blocked and they need to work on a second task. Instead of writing their names on tasks, team members will use their photo to indicate task assignments.</p>
<p>Make a half- or quarter-page checklist for your story definition of done. Print a stack of them. Place one on the board for each story and use it to make sure you generate the right tasks and actually reach done for the story.</p>
<p>If you regularly get work outside your sprint commitment that has to be addressed right away, such as production support, consider adding an &#8220;Expedite&#8221; lane above the first story. When something new appears in the Not Started column on the Expedite lane, the team focuses on that item rather than stories in order to get it done as soon as possible. (If the &#8220;urgent&#8221; item doesn&#8217;t trump the other stories, it probably should be added to the product backlog and wait until a future sprint, so this rule is a good way to distinguish between truly urgent work and someone just trying to change the team&#8217;s priorities mid-sprint.)</p>
<p>Use the red or orange stickies to represent impediments. Place them directly on the items they&#8217;re blocking. This avoids the disconnect between an impediment list and the task board and may explain otherwise strange indications on the board (e.g. a high-priority story in progress while low-priority stories get done).</p>
<p>Use different color cards or dots on cards to indicate themes, larger features, dependencies on other teams, etc. </p>
<p>Consider setting a WIP limit, a restriction on the number of stories you can have in progress at once. Post this number in the header of the In Progress column. Note: It&#8217;s helpful to write &#8220;limit 3 stories&#8221; rather than just &#8220;3&#8243; because you&#8217;re limiting the number of stories in progress even though the column actually contains tasks.</p>
<h2>What the task board can tell you</h2>
<p><strong>What have we committed to?</strong> The stories on the left of the board reflect the team&#8217;s commitment for the sprint. Because they&#8217;re readable at the 6&#8242; distance, someone can see the overall commitment at a glance.</p>
<p><strong>What&#8217;s done?</strong> Assuming you&#8217;ve created all the tasks for a story to get done, the presence of all a story&#8217;s task cards in the Done column indicates that the story is done.</p>
<p><strong>What are we currently working on?</strong> The presence of task cards in In Progress indicates that the team is currently working on the corresponding story.</p>
<p><strong>Are we working on the right things?</strong> Since stories on the task board are ordered according to their priority in the product backlog, the top stories should be getting to done first. If stories in the middle or at the bottom of the board are done while stories at the top are not started or in-progress, this can indicate a problem. For example, maybe there&#8217;s an impediment blocking a high-priority story but no one is talking about it.</p>
<p><strong>Are we working together?</strong> The number of stories in progress and the distribution of names reveals whether the team is collaborating or whether each team member is working on her own story.</p>
<p><strong>What&#8217;s blocked?</strong> If you use impediment stickies, you can see at a glance what&#8217;s blocked and make sure something is being done about the impediment.</p>
<p><strong>How much urgent/unplanned work is being added?</strong> If you use the Expedite lane, you can see by the accumulation of cards how much work has been added after the start of the sprint. This may lead the team to discuss with the Product Owner dropping one or more stories from the bottom of the board.</p>
<p><strong>What work should I do next?</strong> When you&#8217;re ready for a new task, the task board can tell you which stories are open so you can find a way to contribute to the highest priority open stories rather than opening a new story.</p>
<h2>Next steps</h2>
<p>Check out fellow CSC Xavier Quesada Allue&#8217;s <a href="http://www.xqa.com.ar/visualmanagement/">excellent blog on visual management</a>, which covers this topic in much more detail.</p>
<p>Share in the comments: How have you made the task board work better for your team? Which suggestions from above are you going to try? </p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/11/21/building-a-useful-task-board/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cucumber Tip: Key-Value Tables</title>
		<link>http://www.richardlawrence.info/2011/10/27/cucumber-tip-key-value-tables/</link>
		<comments>http://www.richardlawrence.info/2011/10/27/cucumber-tip-key-value-tables/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 21:38:28 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=375</guid>
		<description><![CDATA[You may not realize this: Tables in Cucumber steps don&#8217;t have to have a header row. Sometimes it can work really well to use a headerless table of key-value pairs. Let&#8217;s look at an example. Suppose we have a scenario that fills out an advanced search form to search for medical providers matching certain criteria. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>You may not realize this: Tables in Cucumber steps don&#8217;t have to have a header row. Sometimes it can work really well to use a headerless table of key-value pairs. </p>
<p>Let&#8217;s look at an example. Suppose we have a scenario that fills out an advanced search form to search for medical providers matching certain criteria. A mockup of the form looks something like this:</p>
<p><img src="/wp-content/uploads/2011/10/medical-provider-advanced-search-form.png" alt="" title="Advanced Provider Search Mock-up" width="358" height="544" class="aligncenter size-full wp-image-378" /></p>
<p>If we were using the <a href="http://aslakhellesoy.com/post/11055981222/the-training-wheels-came-off">recently deprecated web steps</a> generated by cucumber-rails, we might write steps to perform a search like these:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given I'm on the advanced search page<br />
And I select &quot;Endocrinology&quot; from &quot;Specialty&quot;<br />
And I choose &quot;Yes&quot; within &quot;Accepts Insurance&quot;<br />
And I fill in &quot;ZIP Code&quot; with &quot;90010&quot;<br />
And I select &quot;5 miles&quot; from &quot;Search Radius&quot;<br />
When I press &quot;Search&quot;</div></td></tr></tbody></table></div>
<p>But we know better than to do that, right? After all, we&#8217;re trying to describe how the search logic should work, not how the form should look. <span id="more-375"></span>So we try to write our own steps to do these same thing without talking about the implementation so much, but it&#8217;s really hard to get away from the implementation. Even if we drive out words like select, fill in, and click, we still have a step per form element. </p>
<p>Suppose we try to combine them into a single step for the domain concept of performing a search. We might get something like:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">When I search for an endocrinologist within 5 miles of 90010 who accepts insurance</div></td></tr></tbody></table></div>
<p>The implementation details are gone, but it&#8217;s long and hard to read. Enter the key-value table:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">When I search for a provider with the criteria:<br />
&nbsp;| Provider Type &nbsp; &nbsp; | Doctor &nbsp; &nbsp; &nbsp; &nbsp;|<br />
&nbsp;| Specialty &nbsp; &nbsp; &nbsp; &nbsp; | Endocrinology |<br />
&nbsp;| Accepts Insurance | Yes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp;| ZIP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 90010 &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp;| Search Radius &nbsp; &nbsp; | 5 miles &nbsp; &nbsp; &nbsp; |</div></td></tr></tbody></table></div>
<p>In the step definition, we can use the <code class="codecolorer ruby default"><span class="ruby">rows_hash</span></code> method on the table object to convert that key-value table to a single hash. There&#8217;s no need to iterate through the rows ourselves. For example, assuming a helper method called <code class="codecolorer ruby default"><span class="ruby">provider_search</span></code> that actually performs the search,</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I search <span style="color:#9966CC; font-weight:bold;">for</span> a provider with the criteria:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>table<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; criteria = table.<span style="color:#9900CC;">rows_hash</span><br />
&nbsp; provider_search <span style="color:#ff3333; font-weight:bold;">:provider_type</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Provider Type'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:specialty</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Specialty'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:accepts_insurance</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Accepts Insurance'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_bool</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:zip_code</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'ZIP'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:radius</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Search Radius'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_i</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>You may have noticed the call to <code class="codecolorer ruby default"><span class="ruby">to_bool</span></code>. This uses a helper method like the following to allow us to use <em>yes</em> and <em>no</em> instead of <em>true</em> and <em>false</em> to make more readable scenarios. Put this somewhere in the support directory.</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">String</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> to_bool<br />
&nbsp; &nbsp; !!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span> =~ <span style="color:#006600; font-weight:bold;">/</span>^yes<span style="color:#006600; font-weight:bold;">|</span>y<span style="color:#006600; font-weight:bold;">|</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span><span style="color:#006666;">1</span>$<span style="color:#006600; font-weight:bold;">/</span>i<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>The call to <code class="codecolorer ruby default"><span class="ruby">to_i</span></code> on the search radius takes advantage of Ruby&#8217;s string to integer conversion behavior—if a string starts with an integer but has other text after the integer, the other text is stripped off during the conversion. Try it: Fire up <code class="codecolorer text default"><span class="text">irb</span></code> (the interactive Ruby console) in a command window and run <code class="codecolorer ruby default"><span class="ruby"><span style="color:#996600;">&quot;5 miles&quot;</span>.<span style="color:#9900CC;">to_i</span></span></code>.</p>
<p>These key-value tables can get long for a complex entity. Not all the details will matter each time. We can make the step read better by introducing a concept of a default provider search. Maybe we have to supply a ZIP code and search radius, but the scenario we&#8217;re working on is really about specialties and insurance. We could say,</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">When I search for a provider with the default criteria and:<br />
&nbsp;| Provider Type &nbsp; &nbsp; | Doctor &nbsp; &nbsp; &nbsp; &nbsp;|<br />
&nbsp;| Specialty &nbsp; &nbsp; &nbsp; &nbsp; | Endocrinology |<br />
&nbsp;| Accepts Insurance | Yes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</div></td></tr></tbody></table></div>
<p>In the step definition, we&#8217;ll declare the default values in a hash and merge it with the supplied values.</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I search <span style="color:#9966CC; font-weight:bold;">for</span> a provider with the default criteria <span style="color:#9966CC; font-weight:bold;">and</span>:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>table<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; default_criteria = <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#996600;">'Provider Type'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Doctor'</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'Specialty'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'General'</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'Accepts Insurance'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Yes'</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'ZIP'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">90010</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'Search Radius'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'5 miles'</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<br />
&nbsp; criteria = default_criteria.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span>table.<span style="color:#9900CC;">rows_hash</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; provider_search <span style="color:#ff3333; font-weight:bold;">:provider_type</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Provider Type'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:specialty</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Specialty'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:accepts_insurance</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Accepts Insurance'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_bool</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:zip_code</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'ZIP'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:radius</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Search Radius'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_i</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>If the defaults are well known, this is enough. If they need to be documented, one way I like to do it is as executable documentation with a scenario like this:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Scenario: Default Search Criteria<br />
&nbsp; When I search for a provider with the default criteria<br />
&nbsp; Then the search criteria should include:<br />
&nbsp; &nbsp;| Provider Type &nbsp; &nbsp; | Doctor &nbsp; &nbsp; &nbsp; &nbsp;|<br />
&nbsp; &nbsp;| Specialty &nbsp; &nbsp; &nbsp; &nbsp; | General &nbsp; &nbsp; &nbsp; |<br />
&nbsp; &nbsp;| Accepts Insurance | Yes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp; &nbsp;| ZIP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 90010 &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp; &nbsp;| Search Radius &nbsp; &nbsp; | 5 miles &nbsp; &nbsp; &nbsp; |</div></td></tr></tbody></table></div>
<p>If you do this, you&#8217;ll want to move the default criteria hash into a helper method or constant to make sure it&#8217;s the same hash used in the real scenario and the documentation scenario.</p>
<p>We could make the step definition read better by separating the key and value conversions from the use of the data. Cucumber&#8217;s table object has <code class="codecolorer ruby default"><span class="ruby">map_headers!</span></code> and <code class="codecolorer ruby default"><span class="ruby">map_column!</span></code>. Unfortunately, those don&#8217;t work for <code class="codecolorer ruby default"><span class="ruby">rows_hash</span></code> at this time. I recently submitted a pull request to make it work. Hopefully, we&#8217;ll see that in a Cucumber release soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/10/27/cucumber-tip-key-value-tables/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Future of Cucumber on .NET</title>
		<link>http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/</link>
		<comments>http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 17:56:14 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Cuke4Nuke]]></category>
		<category><![CDATA[SpecFlow]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=371</guid>
		<description><![CDATA[Beginning just over two years ago, I worked with some great developers to create Cuke4Nuke as a way to bring Cucumber to .NET. Shortly after the first releases of Cuke4Nuke, TechTalk released SpecFlow, a native .NET tool inspired by Cucumber. As a pure .NET solution without Ruby dependencies, SpecFlow seemed to be easier for Microsoft [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Beginning just over two years ago, I worked with some great developers to create <a href="https://github.com/richardlawrence/Cuke4Nuke">Cuke4Nuke</a> as a way to bring <a href="http://cukes.info/">Cucumber</a> to .NET. Shortly after the first releases of Cuke4Nuke, TechTalk released <a href="http://www.specflow.org/">SpecFlow</a>, a native .NET tool inspired by Cucumber. As a pure .NET solution without Ruby dependencies, SpecFlow seemed to be easier for Microsoft shops to adopt. But Cuke4Nuke had (to me) enough advantages that I kept it going. </p>
<p>By this summer, however, it was clear that SpecFlow had made up for most of Cuke4Nuke&#8217;s advantages and had more momentum in the .NET community and was under much more active development. <span id="more-371"></span>There were just a few gaps SpecFlow needed to overcome (in my opinion), mostly related to better harmonization with the other Cucumber projects. (With the pure Java Cucumber-JVM under active development as a Cuke4Duke replacement, there was no longer as compelling an argument for shared code between Cucumber versions, Cuke4Nuke&#8217;s biggest remaining advantage.)</p>
<p>At AA-FTT and later in the week at Agile 2011, my colleague <a href="http://www.virtual-genius.com">Paul Rayner</a> and I met with Christian Hassa and Gaspar Nagy from the SpecFlow team. We discussed the few things that needed to change in SpecFlow to make it behave more like the other Cucumbers. </p>
<p>This week, most of those changes were released as part of SpecFlow 1.8. With that release, I&#8217;m letting Cuke4Nuke die. I won&#8217;t be maintaining or extending Cuke4Nuke. My Cucumber classes and book will cover SpecFlow rather than Cuke4Nuke. </p>
<p>I&#8217;ve had a great time getting to know the SpecFlow guys, and I look forward to collaborating with them in the future to help bring Cucumber to more and more teams in the Microsoft world.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Why Longer Sprints Probably Won&#8217;t Help</title>
		<link>http://www.richardlawrence.info/2011/09/02/why-longer-sprints-probably-wont-help/</link>
		<comments>http://www.richardlawrence.info/2011/09/02/why-longer-sprints-probably-wont-help/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 17:55:43 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=362</guid>
		<description><![CDATA[As a coach, I&#8217;m frequently told, &#8220;Our sprint length is too short. We want to change it from X to Y weeks.&#8221; The time box—the sprint in Scrum, the iteration in XP and other iterative methods—is one of the most powerful tools in agile software development for revealing problems in a team or organization. Notice [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>As a coach, I&#8217;m frequently told, &#8220;Our sprint length is too short. We want to change it from X to Y weeks.&#8221;</p>
<p>The time box—the sprint in Scrum, the iteration in XP and other iterative methods—is one of the most powerful tools in agile software development for revealing problems in a team or organization. Notice I said <em>reveal</em>, not <em>fix</em>. I&#8217;ve seen a few cases where the sprint length really was too short. More often, though, the feeling that the sprint is too short is a sign of deeper problems. Lengthening the sprint might push these problems back under the surface, but it&#8217;s unlikely to actually solve them.</p>
<p>Before you increase your sprint length, ask &#8220;Why?&#8221; a few times to see if you have any of the following underlying issues, and try to deal with those first. Maybe your sprint really is too short. But don&#8217;t start there, lest you miss an opportunity to improve.<span id="more-362"></span></p>
<h3>Underlying Problem #1—You&#8217;re trying to do &#8220;mini-waterfalls&#8221;</h3>
<p>It&#8217;s very difficult to fit a mini-waterfall cycle into 1 or 2 weeks. If you regularly find that testing starts late in the sprint and gets less time than it deserves, experiment with something like ATDD to move testing earlier in the work and try working on fewer stories at a time.</p>
<h3>Underlying Problem #2—You struggle to split stories</h3>
<p>To maximize predictability without too much overhead, I recommend 6-10 stories in a sprint. Sometimes teams want to increase their sprint length because they struggle to get even one story small enough to fit into 2 weeks. Instead of increasing the sprint length, <a href="/splitting-user-stories">work on your story splitting skills</a> for a while. Splitting stories is a skill that takes time and practice to develop.</p>
<h3>Underlying Problem #3—Meetings take too long</h3>
<p>Perhaps your Scrum meetings, especially Sprint Planning, are long and painful. It&#8217;s natural to want to do them less often. But consider this: Do you expect to do 50% more work in 3 weeks than you did in 2 weeks? Probably. Then you&#8217;ll have 50% more to talk about at Sprint Planning. The most effective hour of a meeting is usually the first hour. After that people, get tired and distracted and accomplish less. So, by increasing the content of your planning meeting by 50%, you&#8217;ll probably increase the total meeting time by more than 50%. True, it will happen less often. But it will be even more painful than today. </p>
<p>Instead, work on getting better at your meetings. One team I coached decreased their bi-weekly Sprint Planning meeting from 10 hours to 20 minutes by </p>
<ol type="a">
<li>doing regular backlog grooming every day or two for very short periods with just the necessary team members,</li>
<li>planning using story point velocity rather than task estimates, </li>
<li>creating tasks just-in-time during the sprint, and</li>
<li>doing Sprint Planning in multiple passes, a high-level initial discussion and commitment based on velocity and then more detailed discussion of each story as needed.</li>
</ol>
<p>Could one or more of these techniques help you?</p>
<h3>Underlying Problem #4—Deployment (or merging or integration or whatever) is too hard</h3>
<p>Perhaps you try to deploy completed stories into some kind of staging or formal test environment at the end of each sprint. Maybe you even need to engage outside release managers to do it. It&#8217;s difficult and time-consuming to do, so naturally you want to do it less often.</p>
<p>I wholeheartedly agree with the advice in Jez Humble and David Farley&#8217;s excellent book, <em>Continuous Delivery</em>: &#8220;If It Hurts, Do It More Frequently, and Bring the Pain Forward.&#8221; (p. 26) Instead of deferring the pain—and probably making it worse in the process—try to make it less painful so you can do it more often. If deploying every sprint is hard, figure out how to deploy nightly or on every commit. (<em><a href="http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912">Continuous Delivery</a></em> is a great resource to start this journey.)</p>
<h3>Underlying Problem #5—You can&#8217;t get anything done in 2 weeks</h3>
<p>Sometimes teams tell me, &#8220;We simply can&#8217;t deliver anything valuable in 2 weeks, so we have to go to a longer sprint.&#8221; But changing your sprints from 2 to 4 weeks really hasn&#8217;t changed how much value you deliver in 2 weeks; it&#8217;s just given you half the visibility into progress. Instead of changing the sprint length, try these two things: </p>
<ol>
<li>Use a concept like the Minimum Marketable Feature to group user stories into larger units of value. You&#8217;ll still work on stories, but you&#8217;ll have better visibility into how those stories contribute to releasable value.</li>
<li>Do some root cause analysis (e.g. the 5 whys or a similar tool) to find out why you deliver less value per week than you&#8217;d like. Maybe you have some technical debt you need to deal with. Maybe you have too much process overhead. Maybe a specialist is a bottleneck because skills are unevenly distributed on your team. Maybe you&#8217;re building on an out-of-date platform and could get more productivity with newer technology. There is a wide range of possible causes for low productivity. Whatever the cause, longer sprints are unlikely to be a fix.</li>
</ol>
<h3>Underlying Problem #6—It takes too long to get feedback</h3>
<p>If the Product Owner takes a week to answer questions, it probably going to be very difficult to complete work in a 1 or 2 week sprint. But will a 3 week sprint be much better? Instead, find ways to shorten feedback cycles such as,</p>
<ol type="a">
<li>take other responsibilities away from the PO so she can focus on her role,</li>
<li>give the PO (or team) more authority to make decisions without having to ask hard-to-reach stakeholders, or</li>
<li>work to increase knowledge on the team to reduce the number of questions that need to go to the PO or outside experts (ATDD can be a great tool to accelerate this learning, especially if you use it to build a ubiquitous language).</li>
</ol>
<h3>Underlying Problem #7—Dependency on outside specialists</h3>
<p>Related to #6, sometimes teams can&#8217;t complete a story without help from a specialist outside the team—a DBA, tech writer, expert on a particular technology, etc.—and this outside person is part-time on many teams. Before lengthening the sprint to work around this issue, try to reduce the dependency by</p>
<ol type="a">
<li>moving the specialist into the team,</li>
<li>reducing the specialist&#8217;s load so he can be more available to the team, or</li>
<li>growing the team&#8217;s own skills and/or authority in the speciality area.</li>
</ol>
<h3>Conclusion</h3>
<p>If you&#8217;ve dealt with all the underlying problems you can find and your sprints still feel too short, then by all means, try a longer sprint length. Make your process for you. Just don&#8217;t start by lengthening your sprint and miss out on an opportunity to improve.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/09/02/why-longer-sprints-probably-wont-help/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cucumber Regular Expressions Cheat Sheet</title>
		<link>http://www.richardlawrence.info/2011/08/23/cucumber-regular-expressions-cheat-sheet/</link>
		<comments>http://www.richardlawrence.info/2011/08/23/cucumber-regular-expressions-cheat-sheet/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 15:39:56 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[regular expressions]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=356</guid>
		<description><![CDATA[Regular expressions are a big part of what makes Cucumber tests both expressive in English and DRY on the automation side. To make the most of that power, you have to know something about regular expressions. I&#8217;ve created a cheat sheet for my Cucumber class workbook based on last year&#8217;s &#8220;Just Enough Regular Expressions for [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Regular expressions are a big part of what makes Cucumber tests both expressive in English and <a href="http://books.google.com/books?id=5wBQEp6ruIAC&#038;lpg=PA27&#038;dq=dry%20pragmatic%20programmer&#038;pg=PA27#v=onepage&#038;q=dry%20pragmatic%20programmer&#038;f=false">DRY</a> on the automation side. To make the most of that power, you have to know something about regular expressions. </p>
<p>I&#8217;ve created a cheat sheet for my Cucumber class workbook based on last year&#8217;s &#8220;<a href="/2010/07/20/just-enough-regular-expressions-for-cucumber/">Just Enough Regular Expressions for Cucumber</a>&#8221; post. Download and print a copy to post by your computer until regular expressions become natural for you:</p>
<p><a href='/wp-content/uploads/2011/08/Cucumber-Regular-Expressions-Cheat-Sheet.pdf'>Cucumber Regular Expressions Cheat Sheet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/08/23/cucumber-regular-expressions-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Getting Started with Ruby, Cucumber, and Capybara on Windows</title>
		<link>http://www.richardlawrence.info/2011/08/20/getting-started-with-ruby-cucumber-and-capybara-on-windows/</link>
		<comments>http://www.richardlawrence.info/2011/08/20/getting-started-with-ruby-cucumber-and-capybara-on-windows/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 15:23:20 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Capybara]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=348</guid>
		<description><![CDATA[The Ruby version of Cucumber isn&#8217;t just for Rails developers. If you have a .NET or Java web or service app, Ruby can be a great language for testing. With libraries like Capybara for driving web apps and JSON, RestClient, SOAP, and others for interacting with service apps, you&#8217;ll find testing in Ruby requires much [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>The Ruby version of Cucumber isn&#8217;t just for Rails developers. If you have a .NET or Java web or service app, Ruby can be a great language for testing. With libraries like Capybara for driving web apps and JSON, RestClient, SOAP, and others for interacting with service apps, you&#8217;ll find testing in Ruby requires much less code than in C# or Java.</p>
<p>It can be hard to find instructions for setting up Ruby and Cucumber on Windows, though, so I&#8217;ve compiled these to help my clients get started, and I thought they might be useful to others. I&#8217;ve tested this on a clean Windows 7 VM, and everything works. Your mileage may vary, but let me know if you have any issues. <span id="more-348"></span></p>
<ol>
<li>You&#8217;re going to be working in a command window quite a bit with Cucumber. You may want to customize your command window to make it more pleasant to use. I like the following settings (right click on the top left corner of the command window and choose Properties to set these):<br />
Font: Consolas, 20pt<br />
Screen Buffer: 120&#215;3000<br />
Window Size: 120&#215;60</p>
<p>On a smaller screen, you&#8217;ll of course want a smaller window size and screen buffer. If you&#8217;re on an earlier version of Windows, you won&#8217;t be able to choose Consolas for the font, but Lucida Console is still better than the default.</p>
<p>I also like to set a PROMPT environment variable to <code class="codecolorer text default"><span class="text">$P$_$+$G</span></code> (right click on My Computer and choose Properties, then Advanced, then Environment Variables).</li>
<li> Download and install Ruby. For Windows, <a href="http://rubyinstaller.org/">http://rubyinstaller.org/</a> is the best option. Install the latest release of version 1.9.2. Make sure you check the option to &#8220;Add Ruby executables to your PATH.&#8221;</li>
<li> Also install the Ruby Development Kit from the same place, which will allow Ruby to build native extensions for libraries. Instructions are available here: <a href="https://github.com/oneclick/rubyinstaller/wiki/Development-Kit">https://github.com/oneclick/rubyinstaller/wiki/Development-Kit</a>.</li>
<li> Confirm that the installation worked by opening a command window and running <code class="codecolorer text default"><span class="text">ruby -v</span></code>. You should see a description of the Ruby version installed. If you see an error, something went wrong with the installation.</li>
<li> Make sure you have RubyGems installed by running <code class="codecolorer text default"><span class="text">gem -v</span></code> on a command line. RubyGems is the package manager for Ruby and should come with the standard Ruby installation.</li>
<li> Run <code class="codecolorer text default"><span class="text">gem install cucumber</span></code> to download and install Cucumber. Run <code class="codecolorer text default"><span class="text">cucumber --help</span></code> to confirm that it worked.</li>
<li> Cucumber complains that you need ANSICON to get console colors because Windows doesn&#8217;t understand ANSI color escape sequences. Download ANSICON from <a href="http://adoxa.3eeweb.com/ansicon/">http://adoxa.3eeweb.com/ansicon/</a>. Extract it somewhere (I put it in c:utils). In your command window, <code class="codecolorer text default"><span class="text">cd</span></code> to either the x86 or x64 directory where you extracted ANSICON, depending on your OS, and run <code class="codecolorer text default"><span class="text">ansicon -i</span></code>. Exit that command window and open a new one. Now, when you run <code class="codecolorer text default"><span class="text">cucumber --help</span></code>, you should no longer see the message in the output about needing ANSICON.</li>
<li> Run <code class="codecolorer text default"><span class="text">gem install capybara</span></code> to download and install the Capybara web automation library.</li>
<li> Run <code class="codecolorer text default"><span class="text">gem install rspec</span></code> to download and install a nice library for readable assertions (among other things).</li>
<li> You&#8217;ll want <a href="http://www.getfirefox.com/">Firefox</a> with the <a href="http://www.getfirebug.com/">Firebug</a> plugin to do UI-related tests. If you haven&#8217;t already, install those.</li>
<li> You can edit Cucumber tests and automation code in Notepad, Visual Studio, or any other text editor. But I like having an editor that knows about Cucumber and provides Cucumber-oriented features, so I use <a href="http://www.jetbrains.com/ruby/">JetBrains RubyMine</a> to work with my Cucumber tests. There&#8217;s a free 30 day trial available.</li>
<li> To make sure Cucumber and Capybara are working nicely together, download and extract this <a href="http://rslawrence.wpengine.com/wp-content/uploads/2011/08/ruby-capybara.zip">Ruby, Cucumber, and Capybara Starter Project</a> somewhere on your machine. Open a command window at the root of the folder (if you run <code class="codecolorer text default"><span class="text">dir</span></code> or <code class="codecolorer text default"><span class="text">ls</span></code> there, you should see a &#8220;features&#8221; folder). Run <code class="codecolorer text default"><span class="text">cucumber</span></code>, and you should see all the tests run and pass.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/08/20/getting-started-with-ruby-cucumber-and-capybara-on-windows/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Another Story Splitting Pattern (Maybe)</title>
		<link>http://www.richardlawrence.info/2011/05/04/another-story-splitting-pattern-maybe/</link>
		<comments>http://www.richardlawrence.info/2011/05/04/another-story-splitting-pattern-maybe/#comments</comments>
		<pubDate>Wed, 04 May 2011 11:36:45 +0000</pubDate>
		<dc:creator>rslawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[user stories]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=344</guid>
		<description><![CDATA[User stories are typically written using a template like, &#8220;As a &#60;role&#62;, I want to &#60;action&#62; so that &#60;value&#62;.&#8221; My other story splitting patterns focus on complexity in the action part of the story. But sometimes the functional complexity in a user story is hidden in the role rather than the action. Consider: could you [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>User stories are typically written using a template like, &#8220;As a &lt;role&gt;, I want to &lt;action&gt; so that &lt;value&gt;.&#8221; My other <a href="/splitting-user-stories/">story splitting patterns</a> focus on complexity in the action part of the story. But sometimes the functional complexity in a user story is hidden in the role rather than the action. <strong>Consider: could you split the story by splitting the role and only satisfying a subset of potential users in the first story?</strong></p>
<p>As the title suggests, I&#8217;m not sure this is actually a new pattern. Every example I can think of actually fits under another pattern. So, if you like, you can think of this as a thought experiment to identify simple/complex, business rule, data entry or other splits where splitting the role reveals a split somewhere else.</p>
<p>Share in the comments: Has discussing splitting the role for a story ever helped you find functional complexity to split the story? Can you provide an example? Is this a sufficiently distinct pattern to merit updating the original article?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/05/04/another-story-splitting-pattern-maybe/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

