Wednesday, January 27, 2010

Fitnesse with C#

I've decided to try out Fitnesse on my current project so I attempted to find a complete tutorial on fitnesse with C# today. The best tutorial I found is contained in the following 2 links:

1. Installing FitNesse
2. Writing your first Hello World test

This is a great tutorial. Although in the end I figured everything out, there are a few steps that were implied in the tutorial that I missed on the initial pass. Here are those steps:

a. Leave the command line open. You need to execute this command line everytime you want to use Fitnesse. If you close the command line, Fitnesse will not work.
b. When downloading the FitSharp binaries from github, place the contents of the zip file in a "dotnet2" folder that you create as a subfolder in the folder that you downloaded/installed the .jar file to.

After adding those 2 steps, everything worked great. Thanks to Gojko for all the work you put into the tutorial at the links above. I found the Fitnesse User Guide to be lacking.

Tuesday, January 26, 2010

Delivering Bad News Early

I was listening to a Controlling Chaos podcast today, and heard this:

Project Team to Executive: "When should we tell you if we have bad news?"
Executive (dumbfounded of a little): "Well, right away of course!"
Project team (Excellent - thanks for giving us permission)

Yes, I think we all realize that it is important to deliver bad news as soon as possible. And the technique above can be useful to gain permission to deliver it early and allow you to understand and negotiate what 'bad news' means. Bad news can be found on all projects regardless of methodology - resource changes, customers who aren't sure what they want, budget risk, schedule risk, etc. The sooner we can identify the bad news and deal with it, the better.

For bad news related to the budget, how do your teams know when you will be over budget or schedule? Traditional project management methodologies use "Earned Value" to measure project progress against a budget. What frustrates me about this method is that until your team has delivered value through working code, your actual earned value is... zero. If requirements or design is complete, what value is that to the business? Does it verify what % complete the project is? Does it verify your estimates? Does it ensure that the business is getting what they asked for? How useful is it to measure the "Earned Value" on a traditional project until that project is complete?

This is my favourite thing about agile. Once your backlog is complete, estimated using relative estimating, and your first iteration is complete with working code you can calculate your initial velocity and compare it to the budget and schedule. After your second, third and future iterations you refine your velocity and with it your cost and schedule. You have delivered value through working and implemented code and you can calculate actual Earned Value based on what you have delivered vs what is remaining in the backlog. In this way, you can verify your project process early and report budget and schedule issues to your executive or sponsor early and more accurately.

Of course, this depends on short iterations, a backlog of user stories based on the INVEST model that is relatively complete, and working to 'done'. More on these at a later date.

Monday, January 11, 2010

Generate index cards from your Excel 2007 backlog

You have captured all your user stories in Excel 2007 and now you want to print them out as index cards. Follow these steps in Word 2007.

First, create the word document and select your data
1. Make sure you have headings in your excel document. Example: User Story, Points, User Story ID
2. Open Word 2007 and create a new document
3. Go to the "Mailings" tab
4. Click "Start Mail Merge" and select "Step by Step Mail Merge Wizard"
5. Click "Select Recipients" and select "Use Existing List"
6. Select your excel file and then the name of the sheet (eg. 'Sheet1$')

Second, setup your index cards
7. In the "Mail Merge" window (usually on the right), select the "Labels" document type and click "Next: Starting document" at the bottom.
8. Click "Label options…" to choose create a custom label size for your index cards
9. Click "New Label…"
10. Use the following settings for 4 index cards per page:
○ Label name: "Index Cards"
○ Top margin: 1.5 cm
○ Side margin: 0.6 cm
○ Vertical pitch: 13 cm
○ Horizontal pitch: 10 cm
○ Page size: Letter (8 1/2 x 11 in)
○ Label height: 12 cm
○ Label width: 9 cm
○ Number across: 2
○ Number down: 2
11. Click OK (Note - you can now re-use the new "Index Cards" label format the next time you print index cards. Look under "Product Number" on the "Label Options" window)
12. Click OK again to close the "Label Options" window

Now we add data to the index cards
13. Click "Next: Select recipients"
14. If you want to select only some of your stories, use the check box column to do so. Click OK.
15. The page should now show four labels, with the first one blank and the other three containing "<>"
16. Click "Next: Arrange your labels"
17. In the blank label, add the static text you want to display. I like to show Story ID, Points and the User Story on the card, but you can display whatever information is relevant for your project and process.
17. To add the fields from your product backlog, place the cursor where your field should go and click "More Items". Select the field you want to add and click "Insert". Repeat for any additional fields
18. Now format your fields (bold, size, positioning etc) within the first label.
19. When you are finished, click the "Update all labels" button to move your formatting to all the index cards.
20. Click "Next: Preview your labels". At this point, you should have four index cards per page populated with your stories.
21. Click "Next: Complete the merge"
22. Now print your index cards! (make sure they are not printing double sided…)

Bonus Tip: Use the "Scotch Glue Stick Restickable Adhesive" to turn your index cards into reusable sticky notes.

Want to receive future blog posts in your inbox? Enter your email address here