<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Till Death Do Us Part : </title>
    <link>http://blog.bcarlso.net/articles.rss</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Thoughts around my marriage to technology</description>
    <item>
      <title>Article posted on ProjectConnections</title>
      <description>I have posted an &lt;a href="http://blog.projectconnections.com/project_practitioners/2008/09/story-prioritiz.html"&gt;article&lt;/a&gt; on &lt;a href="http://projectconnections.com"&gt;ProjectConnections&lt;/a&gt; regarding how to prioritize your backlog. We're using it and it's working great so far. Check it out.

</description>
      <pubDate>Sun, 28 Sep 2008 09:42:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:8a157a9a-a016-433c-8901-5f0e302cab9a</guid>
      <comments>http://blog.bcarlso.net/2008/09/28/article-posted-on-projectconnections#comments</comments>
      <category>agile</category>
      <category>prioritization</category>
      <link>http://blog.bcarlso.net/2008/09/28/article-posted-on-projectconnections</link>
    </item>
    <item>
      <title>TDD vs. BDD? Really?</title>
      <description>Is there a difference between TDD and BDD? I don't really think so. I
have the debate occasionally and hear all about the goodness that is
BDD with &lt;a href="http://rspec.info"&gt;RSpec&lt;/a&gt;. RSpec is cool, ok, very English and all, but I can't
help but to ask myself what's the big deal? If I were to write a test
using JUnit I would write it like this:

&lt;pre&gt;
public class AgileSoftwareDevelopmentTest extends TestCase {
	public void testShouldBeEvolutionary() {
		assertTrue(new AgileSoftwareDevelopment().isEvolutionary());
	}
}
&lt;/pre&gt;

So there it is, a &lt;i&gt;test&lt;/i&gt; that ensures that Agile Software Development
is evolutionary, TDD style.

Ok, so on to the next example, one of the Ruby/RSpec variety.

&lt;pre&gt;
describe "Agile Software Development" do
	it "should be evolutionary" do
	    AgileSoftwareDevelopment.new.should be_evolutionary
	end
end
&lt;/pre&gt;

I personally see little difference between the two...

Now, with RSpec you can generate the nice readable documentation which,
by the way, is totally sweet using the RSpec command &lt;i&gt;spec agile_spec.rb --format specdoc&lt;/i&gt;

&lt;pre&gt;
Agile Software Development
- Should be evolutionary
&lt;/pre&gt;

Using a tool called &lt;a href="http://agiledox.sourceforge.net"&gt;AgileDox&lt;/a&gt; I can get the same results, in fact, BDD
was &lt;a href="http://dannorth.net/introducing-bdd"&gt;inspired by AgileDox&lt;/a&gt; and created by Dan North in order to eliminate
some of the confusion and learning curve involved with proper TDD.

Let's look at an AgileDox version of the JUnit test to see what we
would need to do to the test to be able to generate the RSpec style
documentation using AgileDox:

&lt;pre&gt;
public class AgileSoftwareDevelopmentTest extends TestCase {
	public void testShouldBeEvolutionary() {
		assertTrue(new AgileSoftwareDevelopment().isEvolutionary());
	}
}
&lt;/pre&gt;

See the difference? It's subtle... It's so subtle it's invisible, no changes required.
By simply removing the word test from the system, you get the same
effect.

I have no problems with using the term BDD, in fact I think it is
very beneficial to focus people on what's important in the test. It
unfortunately seems to me that whenever the two are brought up, they
are promoted as competitors in the same space, not as complementary
techniques. I guess I should get over it and tell people I do BDD
using JUnit...

</description>
      <pubDate>Thu, 10 Jul 2008 21:12:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:b64a1b13-05a4-4ff2-8979-f216bcd97fcf</guid>
      <comments>http://blog.bcarlso.net/2008/07/10/tdd-vs-bdd-really#comments</comments>
      <category>tdd</category>
      <category>bdd</category>
      <category>junit</category>
      <category>rspec</category>
      <link>http://blog.bcarlso.net/2008/07/10/tdd-vs-bdd-really</link>
    </item>
    <item>
      <title>Eclipse to Visual Studio + ReSharper</title>
      <description>&lt;p&gt;Another keystroke I discovered today:&lt;/p&gt;

&lt;p&gt;In Eclipse, I can type Ctrl+/ in order to comment out/uncomment a line of code. I've found a couple of ways to do this in Visual Studio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ctrl+K, C for commenting out a block and Ctl+K, U for uncommenting a block.&lt;/li&gt;
&lt;li&gt;Ctrl+Alt+/ for toggling between commenting out and uncommenting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The latter is a ReSharper key combination which I find I prefer because I don't have to think about it, it just toggles between the two.&lt;/p&gt;

</description>
      <pubDate>Thu, 10 Apr 2008 19:52:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:d5bf07ef-d3cb-408e-acd5-5da4fb2b71e5</guid>
      <comments>http://blog.bcarlso.net/2008/04/10/eclipse-to-visual-studio-resharper#comments</comments>
      <link>http://blog.bcarlso.net/2008/04/10/eclipse-to-visual-studio-resharper</link>
    </item>
    <item>
      <title>Eclipse to Visual Studio + ReSharper</title>
      <description>&lt;p&gt;
Moving from Eclipse to Visual Studio + ReSharper is proving to be difficult. I thought I would post some of the things I figure out along the way so I won't forget them.
&lt;/p&gt;
&lt;p&gt;
"Show In &gt; Package Explorer"
&lt;/p&gt;
&lt;p&gt;
When editing a file, I sometimes need to view it in the package explorer. In Eclipse, I can press &lt;i&gt;Alt+Shift+W, P&lt;/i&gt;, which will activate package explorer and highlight the current file.
&lt;/p&gt;
&lt;p&gt;
In Visual Studio you can achieve the same effect by pressing &lt;i&gt;Alt+Shift+L&lt;/i&gt; while editing a file. This changes focus to the Solution Explorer and highlights the current file.
&lt;/p&gt;
&lt;p&gt;
One shortcut down, only about 250 to go...
&lt;/p&gt;

</description>
      <pubDate>Sat, 29 Mar 2008 19:05:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:ae357b50-a824-440c-a6c1-dd5ea3ab8250</guid>
      <comments>http://blog.bcarlso.net/2008/03/29/eclipse-to-visual-studio-resharper#comments</comments>
      <category>eclipse</category>
      <category>visualstudio</category>
      <category>keyboard</category>
      <link>http://blog.bcarlso.net/2008/03/29/eclipse-to-visual-studio-resharper</link>
    </item>
    <item>
      <title>Standup Meetings Too Large?</title>
      <description>&lt;p&gt;
We were having a problem with focusing on the stories during the standup meeting so we made a simple change. Moving the whiteboard containing the stories to the standup area. Normally this wouldn't be a problem but because the open workspace is not completely finished, we had to make some adjustments.
&lt;/p&gt;
&lt;p&gt;
That was two days ago... So how did it work? Well, in a nutshell, not as good has we had hoped. As I thought about it some more, I think that part of the problem revolves around the fact that we've got a very large agile team, on the order of 20 or so people at each standup. This causes the standups to be incredibly long. We've ranged anywhere from 20-35 minutes a meeting, and that leads to people getting bored and not paying attention. Not to mention standing that long isn't the most fun thing in the world.
&lt;/p&gt;
&lt;p&gt;
I'm thinking of trying something new. With a team this large, it may be better to focus on discussing the status of each of the stories instead of each individual. Doing so may do a better job of focusing the team on the current iteration's deliverables as well as bringing the meeting down to an acceptable timeframe (10-15 minutes). I see one potential problem with this scenario. By focusing on the deliverables more than the team, some of the team members may slip through the cracks, struggling through problem areas without asking for help, therefore adversely impacting team throughput.
&lt;/p&gt;

</description>
      <pubDate>Fri, 21 Mar 2008 19:21:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:5db252cc-0b5d-476f-9c23-047691c1b6d2</guid>
      <comments>http://blog.bcarlso.net/2008/03/21/standup-meetings-too-large#comments</comments>
      <category>agile</category>
      <category>collaboration</category>
      <link>http://blog.bcarlso.net/2008/03/21/standup-meetings-too-large</link>
    </item>
    <item>
      <title>Iteration Focus... It's the little things</title>
      <description>After the stand-up today I got to thinking about how there didn't seem to be any focus on what was to be delivered at the end of this iteration; there was just a brain dump of each of the team members' entire day. We then did something drastic. We moved the whiteboard containing our iteration deliverables to the center of the standup, where no one could miss it. We'll see how it works tomorrow...

</description>
      <pubDate>Tue, 18 Mar 2008 18:09:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:7703b3f4-5d59-4aba-8c86-93fc8ac95a42</guid>
      <comments>http://blog.bcarlso.net/2008/03/18/iteration-focus-its-the-little-things#comments</comments>
      <category>agile</category>
      <category>focus</category>
      <link>http://blog.bcarlso.net/2008/03/18/iteration-focus-its-the-little-things</link>
    </item>
    <item>
      <title>Out of the frying pan...</title>
      <description>...and into the fire.

I never cared much for distributed planning meetings and was looking forward to having an easier time doing planning when I started my new job...

As if it isn't challenging enough, we now have distributed customers &lt;i&gt;and&lt;/i&gt; distributed developers.

I guess this means I'll earn some good experience with remote collaboration tools.

</description>
      <pubDate>Wed, 12 Mar 2008 17:09:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:49b4da08-e1f1-4f95-b42e-38905b7cbf78</guid>
      <comments>http://blog.bcarlso.net/2008/03/12/out-of-the-frying-pan#comments</comments>
      <category>agile</category>
      <category>collaboration</category>
      <link>http://blog.bcarlso.net/2008/03/12/out-of-the-frying-pan</link>
    </item>
    <item>
      <title>Jott + GTD</title>
      <description>Added a new contact to my &lt;a href="http://jott.com"&gt;Jott&lt;/a&gt; contacts today. Instead of having an e-mail sent to my GMail account, it now will send the e-mail to my &lt;a href="http://43actions.com"&gt;43 Actions&lt;/a&gt; page and land it directly in my inbox there. Works for &lt;a href="http://backpackit.com"&gt;Backpack&lt;/a&gt; also. Yeah, I know that there are Jott Links for both of these sites, but I didn't like the way they worked. (Or don't work, as is the case for the 43 Actions site)

</description>
      <pubDate>Sun, 17 Feb 2008 19:16:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:83ea8254-720c-4109-b04a-649a881131c1</guid>
      <comments>http://blog.bcarlso.net/2008/02/17/jott-gtd#comments</comments>
      <category>gtd</category>
      <category>jott</category>
      <link>http://blog.bcarlso.net/2008/02/17/jott-gtd</link>
    </item>
    <item>
      <title>Agile Metrics Part 2</title>
      <description>&lt;p&gt;In an &lt;a href="../../../2007/10/30/agile-metrics-part-1"&gt;earlier post&lt;/a&gt;, I talked about the burndown/burnup chart used in agile processes to report the status of a project. What I like the most about the chart is that it gives you a simple to use and maintain tool for making decisions about your project.&lt;/p&gt;

&lt;p&gt;Suppose we are writing a store management system that focuses on bicycle shops. We know that the software needs to be ready in time for its debut at &lt;a href=""&gt;Interbike 2008&lt;/a&gt;. There's just one problem, our burndown shows that we won't be ready until November of 2008, nearly two months after the show.&lt;/p&gt;

&lt;h3&gt;Decision Time&lt;/h3&gt;

&lt;p&gt;What we have on our hands is a fixed date project. What can we do to bring the date in by two months? When the date doesn't look good on an agile project, there are generally three proposed solutions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add Staff&lt;/li&gt;
  &lt;li&gt;Move the release date&lt;/li&gt;
  &lt;li&gt;Cut scope&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of the three, adding staff is usually the worst option. Remember &lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1195350218&amp;sr=8-1&amp;tag=bcarlso-20"&gt;Brook&amp;apos;s Law&lt;/a&gt;: &lt;blockquote&gt;Adding manpower to a late software project makes it later.&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;The next option, moving the release date, depends a lot on context. In our example, being ready for the Interbike show provides a major opportunity for securing new business, so we cannot afford to miss the show.&lt;/p&gt;

&lt;p&gt;The final option, cutting scope, makes the most sense for us at this time. Having a prioritized backlog allows us to cut out some of the lower priority features in exchange for having a releasable product ready for Interbike.&lt;/p&gt;

&lt;p&gt;Now, what happens if you can't cut scope? So we've got a fixed date, fixed scope project. There&amp;apos;s no other option right? We need to add staff... I don&amp;apos;t think so, there are other options.&lt;/p&gt;

&lt;h3&gt;Alternative metrics&lt;/h3&gt;

&lt;p&gt;At the &lt;a href="http://www.agile2007.org"&gt;Agile 2007&lt;/a&gt; conference this year I had the pleasure of hearing from &lt;a href="http://www.accelinnova.com/aboutus.html#niel"&gt;Niel Nickolaisen&lt;/a&gt; about his &lt;a href="http://www.accelinnova.com/strategy.html"&gt;Purpose Based Alignment model&lt;/a&gt;. By applying his model to the features in your project, you can gain insight about other ways to bring your project&amp;apos;s date in to where you need it to be.

In the next part of my post on Metrics, I'll take a look at at how you can use Niel&amp;apos;s model to help bring in that date.

</description>
      <pubDate>Sat, 17 Nov 2007 18:17:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:a1e70308-6b4a-436b-a6c9-5a9a3f7e6ef2</guid>
      <comments>http://blog.bcarlso.net/2007/11/17/agile-metrics-part-2#comments</comments>
      <category>agile</category>
      <category>metrics</category>
      <link>http://blog.bcarlso.net/2007/11/17/agile-metrics-part-2</link>
    </item>
    <item>
      <title>Easy(ier) Mock</title>
      <description>We use &lt;a href="http://www.easymock.org/"&gt;EasyMock&lt;/a&gt; as our mocking framework and it's pretty easy. You create a mock, set some expecations, put the mock into replay state, and exercise the class under test. Once you've exercised the code, you can verify all of the expectations you set. (For a complete description, see the EasyMock &lt;a href="http://www.easymock.org/EasyMock2_3_Documentation.html"&gt;documentation&lt;/a&gt;)

A typical test may look like this:

&lt;pre&gt;
public class StoreTest extends TestCase {
  @Test
  public void testThatCheckoutSendsPaymentInfoToProcessor() {
    CreditCardProcessor processor = EasyMock.createMock( CreditCardProcessor.class );
  
    PaymentInfo pi = new CreditCardPayment( "1234567890123456", "01/2008", 25.50 );

    EasyMock.expect( processor.handlePayment( pi )  ).andReturn( "confirmation-code" );

    EasyMock.replay( processor );

    Store store = new Store();
    store.setCreditCardProcessor( processor );
    store.checkout( pi );

    EasyMock.verify( processor );
  }
}
&lt;/pre&gt;

Pretty straightforward, but it&amp;apos;s a bit wordy. The first thing we did is use a static import to take care of the requirement to fully qualify the easymock methods. Our test now looks like this:
&lt;pre&gt;
public class StoreTest extends TestCase {
  @Test
  public void testThatCheckoutSendsPaymentInfoToProcessor() {
    CreditCardProcessor processor = createMock( CreditCardProcessor.class );
  
    PaymentInfo pi = new CreditCardPayment( "1234567890123456", "01/2008", 25.50 );

    expect( processor.handlePayment( pi )  ).andReturn( "confirmation-code" );

    replay( processor );

    Store store = new Store();
    store.setCreditCardProcessor( processor );
    store.checkout( pi );

    verify( processor );
  }
}
&lt;/pre&gt;

That&amp;apos;s a bit better (less typing), but the next issue came into the picture when we added additional mocks.

&lt;pre&gt;
public class StoreTest extends TestCase {
  @Test
  public void testThatCheckoutSendsPaymentInfoToProcessor() {
    double orderTotal = 25.50
    double receivablesBalance = orderTotal;
    CreditCardProcessor processor = createMock( CreditCardProcessor.class );
    AccountsReceivable receivables = createMock( AccountsReceivable.class );
  
    Order o = new Order( "123456",orderTotal );
    PaymentInfo pi = new CreditCardPayment( "1234567890123456", "01/2008", o );

    expect( processor.handlePayment( pi )  ).andReturn( "confirmation-code" );
    expect( receivables.add( o )  ).andReturn( receivablesBalance );

    replay( processor, receivables );

    Store store = new Store();
    store.setCreditCardProcessor( processor );
    store.setAccountsReceivable( receivables );
    store.checkout( pi );

    verify( processor, receivables );
  }
}
&lt;/pre&gt;

The problem with the above code is that it's easy to forget to replay and verify the new mock, it&amp;apos;s three steps instead of one. To resolve this, we turned to Java 5 generics and a new base class:

&lt;pre&gt;
public class TestCaseWithMocks {
	private List&amp;lt;Object&amp;gt; mocksUsed;
	
	@Before
	protected void createMockList() {
		mocksUsed = new ArrayList&amp;lt;Object&amp;gt;();
	}
	
	protected &amp;lt;T&amp;gt; T mock(Class&amp;lt;T&amp;gt; target) {
		T mock = EasyMock.createMock(target);
		mocksUsed.add( mock );
		return mock;
	}
	
	protected void replay() {
		EasyMock.replay( mocksUsed.toArray() );
	}
	
	protected void verify() {
		EasyMock.verify( mocksUsed.toArray() );
	}
}
&lt;/pre&gt;

Our base class now creates the mocks for us and keeps track of the mocks created by our test. Then, when verifying/replaying the mocks, it will verify/replay them all.

Our test case now looks like the following:

&lt;pre&gt;
public class StoreTest extends TestCase {
  @Test
  public void testThatCheckoutSendsPaymentInfoToProcessor() {
    double orderTotal = 25.50
    double receivablesBalance = orderTotal;
    CreditCardProcessor processor = mock( CreditCardProcessor.class );
    AccountsReceivable receivables = mock( AccountsReceivable.class );
  
    Order o = new Order( "123456",orderTotal );
    PaymentInfo pi = new CreditCardPayment( "1234567890123456", "01/2008", o );

    expect( processor.handlePayment( pi )  ).andReturn( "confirmation-code" );
    expect( receivables.add( o )  ).andReturn( receivablesBalance );

    replay();

    Store store = new Store();
    store.setCreditCardProcessor( processor );
    store.setAccountsReceivable( receivables );
    store.checkout( pi );

    verify();
  }
}
&lt;/pre&gt;

Now, when we add a new mock, we add it in one place, the replay and verify take care of themselves.

</description>
      <pubDate>Fri, 02 Nov 2007 15:46:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:bc576426-067f-434a-b4bf-8076a25ac6c8</guid>
      <comments>http://blog.bcarlso.net/2007/11/02/easy-ier-mock#comments</comments>
      <category>java</category>
      <category>tdd</category>
      <link>http://blog.bcarlso.net/2007/11/02/easy-ier-mock</link>
    </item>
  </channel>
</rss>
