The flow of team software design

This week, I taught another installment of Headspring’s Agile Boot Camp, part 2.  On one of the days, I lead the team (class) through a team design session to add some rather involved behavior to the software system used in the class.  I started out by putting on my customer hat and laying out the release objectives.

When attempting to get everyone on the same page, visuals are very important.  Either whiteboard, chalkboard, paper, or anything visual will do.  Here is a picture of the release goals written out.  I invited the team to ask me clarifying questions about the goals.


The top three, we pulled out as stories and put them on our story wall.  The next three were cross-cutting business rules that applied to the three stories.  The team quickly complete the first story and then split up the next two. 

Before the team began test-driving the functionality through pair-programming, we conducted a team design session to get everyone on the same page.  We did just enough drawing to ensure that everyone had a meeting of the minds.  In reality, if team members start slinging code before everyone has a shared understanding of the approach, there is bound to be wasted work.  Individuals will create assumptions and act on them.  Then, when the assumptions are invalidated, we also have work that becomes invalidated.  This is waste, and you never get that time back.  A little bit of communications (meeting of the minds) goes a long way to ensuring that the work done is the right work. 

We started the design session by coming up with all the individual responsibilities that are necessary to satisfy the stories.

The blue initials next to each responsibility is the acronym for the interface that has been assigned the responsibility.  After responsibilities had been identified, we took to the whiteboard and created a sequence diagram using the chosen type names.  This allowed us to determine dependencies and flow.

There are actually two different threads present on this sequence diagram.  On the left, the state command initiates a notification that gets placed into a queue.  On the right, a queue watcher peeks at the queue (intended to be run with Windows Scheduler) and kicks off the sending process according to business rules.

There are only certain state transitions when a notification needs to be send.  This is visualized through a state diagram:

The most hairy part of the design is the IQueueWatcher implementation.  This deserved its own graphic, and there was lots of discussion while we were fleshing out the flowchart.

Even as crude as it looks, the act of creating this as a team caused each team member to think critically about how the feature needed to be implemented.  There are lots of different places in code where a decision can be made, and putting it in visual form solidified the approach across the team.

The last step before actually pairing up and hitting the keyboards was to task out everything that needed to be done.

Notice that the first task was to create all the interfaces and common types.  By doing this first, other tasks could be accomplished without being blocked by uncompleted work.  One pair can work on the calling side of an interface, and another pair can work on the implementation.  Interfaces are natural seams, and when used liberally, provide a natural decoupling.  This decoupling enables team development while still working closely on the same stories.  My experience has shown that collective code ownership falls in line naturally when using this approach.

At the end of the day, the team hammered through the stories very quickly because each class by itself was very, very simple.  I really enjoyed the class, and I look forward to teaching the next Agile Boot Camp.

MvcContrib v1.0 Released! Download now

Now that the ASP.NET MVC Framework is released, it’s time to release MvcContrib as version 1.0Download it here.

MvcContrib started very shortly after the first CTP was released for the ASP.NET MVC Framework.  Since then, lots of folks have contributed LOTS of patches to the project, and there are over 20,000 hits on Google.  Special thanks to the committers who have worked very hard accepting patches and contributing functionality.  Recently, we have reorganized MvcContrib so that there are two main usage options:

  1. Just MvcContrib.dll – get the core and most commonly used features.
  2. MvcContrib.Extras – get all the controller factories and view engines and everything else.  Warning – this comes with dependencies to many other libraries.

I want to especially thank Eric Hexter and Jeremy Skinner.  I co-founded MvcContrib with Eric Hexter, but Eric has done much more work on it than I have.  He is responsible for all the nice build and release automation as well as oversight.  Jeremy Skinner has contributed lots of code, but more importantly, he has the most commits because he watches the patches like a hawk!  I can’t give these guys enough credit!

I’m excited to announce (with Eric) version 1.0 of MvcContrib.

Now running Dell Precision M4300 with 6GB of RAM

I did quite a bit of research into memory capacity of the Dell Precision M4300 laptops.  We use those as well as Lattitude D830s here at Headspring.  The chipset is the same, just the case is a bit different (and video card).  Folks have had mixed results on moving to 8GB of ram, so I decided to purchase a single 4GB chip of PC2-6400 800 Mhz.  I popped it in slot B and worked like a charm.

Full-day seminar on ASP.NET MVC available on April 17th, 2009

I will be giving a full-day seminar at the University of Wisconsin, Milwaukee.  The seminar isn’t expensive, but it isn’t free. ($125 – low, low price for a full day of training).

Details below:

ASP.NET MVC in Action
featuring Jeffrey Palermo, Headspring Systems

Friday, April 17, 2009
8:30 AM – 4:30 PM
Breakfast and check-in at 8 AM
UWM Lubar School of Business
Lubar Hall, Room N146

A lesson in installer testing at the expense of Adobe Premiere Elements 7

My wife is putting together a video for her brother’s wedding, so I purchased Adobe Premiere Elements 7, at the recommendation of Blake Caraway.  After some frustration that the serial number I was granted did not work, I tried to get it to work on my laptop just to be sure I wasn’t screwing it up somehow.

I tried to install it on my laptop, and the installer bombed saying that D: is an invalid path.  I’m not sure why it cares, and it just so happens that I don’t keep a CD drive in my laptop.  I opt instead for an extra battery.  This leaves my computer without a D: drive.  Apparantly, Adobe’s installer was NEVER tested with a basic computer that only has a c: drive.  And somehow the installer logic fails when looking for the D: drive.

The experience just trying to BUY the software is very frustrating.  I can’t even get the point of USING it.  Tomorrow I’ll have to spend time on the phone with “Keith” from their India call center just to get them to give me a serial number that will actually work.  I’m sure the software is actually fantastic.  It’s a bummer that is takes so much effort just to discover that.

Software testing is SOOO important.  The testing environment should closely match the target environment.  In fact, it should be even more restrictive. 

MvcContrib Release Candidate posted to CodePlex – now with more consolidated packaging

Eric Hexter has posted another MvcContrib Release Candidate to CodePlex.  The RC build is, and we are planning to release verion 1.0 shortly after the ASP.NET MVC Framework goes RTW.

Here is Eric’s description of the packages.


  • MvcContrib = this contains MvcContrib and MvcContrib.TestHelper assemblies.  
    • It also includes the Microsoft.Web.Mvc which is a MvcContrib dependency and Rhino.Mocks with is a dependency of the TestHelpers assembly.
  • MvcContrib.Extras = This is the full release of all MvcContrib dlls and dependencies.  We are still talking about moving some assemblies to the other package but for now this is the full release.
  • Change Log = This is the actual change log from our source control system.  We are pretty good and commenting every check in.  This file will be generated for each release so that you can see what has been modified since your last download.
  • Source = This is the full source code for the project.  

You can download the release here:

If you are on twitter you can follow @mvccontrib.  The publish scripts will automatically announce releases on twitter.

Time Warner Digital Phone is broken, and so is their customer service

My home phone service hasn’t worked in about a month.  I have Time Warner Digital Phone service (or had).  I have spent much too much time on their automated phone system and talking with customer service reps.  I’ve done the diagnostics, scheduled the tech appointments and even had my wife sit at home all afternoon waiting for a guy who didn’t come when he said he would (and he had both of our cell phone numbers to call).

I run a business and have to provide customer service, just like the Time Warner folks.  A simple report from their system would show all the people who have registered a problem that has not been confirmed as resolved.   If they would just fix my phone, I’d be happy.  Instead, I have to find a time to sit on their phone system again for more of my day and schedule another tech appt where they will require me or my wife to be chained to the house for a half-day hoping they will show up or call the mobile phone.

By rendering proper customer service in the Austin, TX area, Time Warner could keep its customer happy instead of turning them into angry bloggers like this one.  I can’t wait to get the bill to pay for the month of service I haven’t received.