Release retrospective on extreme programming practices – level 300

Tomorrow, my team will make a software release that’s been in the works
since the end of January (2.5 months of work).  We’ve been using exteme programming
practices, and I’ll lay out the good, the bad, and the ugly as I look
back on the release.  First, here is a rundown of some things we
have been doing:

  • Source control with Subversion
    Every developer also receives email notifications of every commit to
    source control.  Each developer is responsible for reviewing
    commits.
  • Continuous integration with CruiseControl.Net.  Every time code is committed to source control, CC.Net runs our automated build that is based on NAnt
    Each developer receives a success or failure notification in his
    CCTray.  Broken builds are not acceptable and must be fixed
    immediately.  Code cannot be checked into source control while the
    build is broken.  Our build runs unit tests, integration tests and
    acceptance tests as well as creating a deployment package that’s used
    for the install.
  • Automation.  We automate everything.  For example, we
    have 8 development databases, and when the database scripts are updated
    in source control, all 8 databases are dropped and recreated from the
    changed scripts.  Builds of components are propogated to
    components that depend on them.  Installation of the latest build
    on the dev and test environment is completely automated allowing our
    tester to pull the latest build with the click of a button. 
  • Test-driven development (TDD)
    - we drive the design of our classes through unit tests.  The
    byproducts are a loosely-coupled design and a large battery of unit
    tests that are run continuously with every build.
  • Pair programming
    All production code is written by a pair of developers.  We have
    single tasks too (like tweaks to the CC.Net build, etc), but all new
    code and code changes are written by two developers.  We use VNC
    for pairing because it allows us more comfort by having our own mouse,
    keyboard and display even though we are working on a single workstation.
  • Collective code ownership
    We don’t have a concept of a single person’s code.  If we need to
    change some code, we change it.  No need to consult someone for
    “permission”.
  • The simplest design that will work
    Not the simplest design that will compile.  “Work” is defined by
    the customer.  We will defer longer-range designs because in
    practice we know that code written for 6 months down the road will
    likely be wasted work because in 6 months, the customer will decide to
    go in a different direction.  If not, it’s just as easy to add the
    same code 6 months from now.
  • Constant improvement.  We are constantly improving the
    system and the way in which it’s tested.  We have an idea wall
    (whiteboard) with a list of items we try to squeeze in that will allow
    us to go faster.
  • Iterations
    We use 2 week iterations.  We define and execute work two weeks at
    a time.  The customer is allowed to reprioritize every two
    weeks.  We know change is a part of software engineering, so we
    don’t try to fight it.

So now, I’ll run down the good, the bad, and the ugly:
The good:

  • We finished a week early.  Our automated testing and
    installs really paid off by allowing us to move very quickly. 
    From the time we changed some code, a new build could be on the test
    environment within 30 minutes (after being confirmed by all automated
    tests passing).
  • Very, very few bugs.  Because of the heavy emphasis on
    automated testing, bugs are squeezed out of existence.  The only
    place where bugs creeped in were places where we missed an opportunity
    for an integration test or a small feature overlooked.  The code
    with tests had absolutely no bugs.
  • Easy deployment.  Because of our emphasis on automation, our
    system installs on development and test servers, and it’s super easy to
    use the same process for deployment to our hosted servers. 
  • No deathmarch at the end of the release cycle.  We used a
    sustainable pace throughout the release, and we avoided a last-minute
    firedrill to make a date.

The bad:

  • It was hard.  To maintain the sustainable pace, we worked
    hard all day every day.  It was mentally tiring because of the
    discipline required to work at this level of efficiency.
  • It makes it hard for the wife to be able to call at any
    time.  Because we all work in the same war room and are pairing on
    all production code, when my wife calls, it’s never a good time to
    talk, and I have to help her understand our way of working and that I
    can’t have a phone conversation at any time.  Family emergencies
    obviously take precendence, but my wife likes to call and chat, and
    that doesn’t work with extreme programming because we are engaged all
    the time.
  • It takes a certain type of programmer to work in this disciplined
    fashion, and not all programmers want to work this way.  It is
    taxing for us because sometimes we don’t want to pair program, but we
    know we must. 

The ugly:

  • The code we inherited.  We are improving a system with
    inadequate test coverage.  The test that are there are integration
    tests and when they fail, it’s a mystery to discover what part of the
    code is actually the problem.  We made vast improvements on the
    testability of the system, and we’ve employed acceptance tests with the
    FitNesse wiki to allow for automated full system tests.
  • Technical debt and politics.  We constantly made
    improvements to the code and the way we worked.  Sometimes this
    wasn’t obvious to management.  We had to make some changes to
    facilitate some needed behavior, but management wanted the behavior
    without paying for the prerequisite work.  In this case, it was
    our responsibility to push back and not allow technical debt to
    accumulate just for political reasons.  We try as much as possible
    to keep technical decisions out of political ones.  It’s our job
    to take customer requirements and translate them into working
    software.  The manner in which we do that is our decision (the
    decision of the technical players on the software team).

Overall, the employment of these extreme programming practices has been
wildly successful.  We’ve improved the system in a very short
period of time while adding functionality, and we’ve paid down
technical debt we inherited without incurring more.  We are
encouraged by these results, and we will continue these practices that
have been working for us.  We’ll look for even more ways to go
faster by improving efficiency.  We’ll increase our level of test
automation to free up our tester for more in-depth exploratory
testing.  Overall, management is pleased because we’ve produced
the business value that matters.  That’s all that matters: 
delivering software that adds business value.

This entry was posted in Agile. Bookmark the permalink. Follow any comments here with the RSS feed for this post.

8 Responses to Release retrospective on extreme programming practices – level 300

  1. Joey says:

    Agreed. Small steps are good. I started off by just getting our build and deployment process automated and its benefits have clearly been seen. I’ve been practicing TDD for a couple years now so I’m hoping to first start showing the benefits of “automated tests”, even if they are not necessarily written before the code, then start introducing the benefits of true TDD-style development. (Since TDD can be a bit hard for some to “get” if they dive in too fast…)

    Thanks for the tips!

  2. jpalermo says:

    As James Shore puts it, don’t push change. Have the dialog, but don’t call it change. Once you help the others convince themselves that there is a better way, the change will happen on its own. Some people are scared of the unknown, but a good way to present it is steps to improve efficiency.

  3. Joey says:

    Yep. I’m also big on simplicity. CB’s own Paul Laudeman and I work together, and we’re both agile developers at a small non-agile company and we’ve been trying to steer the company towards many of the practices you talked about in this post. And I know one of the many areas that need to be transformed is how we manage requirements and tasks.

    I really like the idea of using a wiki for stating the requirements for the team. In fact, I’m doing this now on my own for the projects I’m currently working on and I really like how simple it is to maintain.

    Any tips on “persuading” team members to “embrace change”? :)

    Thanks for the info and keep up the great posts!

  4. jpalermo says:

    Joey,
    We use our whiteboard. Our boss sticks stuff into Excel so he can communicate with management. We’ve talked about putting up swim lanes and using index cards. We use a wiki to publish the state of our requirements with bullet points and to share information with people not in the war room.

    I like using “the simplest thing that will work”.

  5. Joey says:

    What are you guys using to manage overall project tasks, iteration tasks, etc? The true XP story cards? wiki? some other management system?

    Thanks,
    Joey

  6. jpalermo says:

    I’m sorry, Brian. I should have clarified. Checkins are allowed only by the pair that broke the build (until the build is fixed).

    This is a team-level rule. Since we all work in the same room, it’s very obvious when the build breaks (folks have creative sounds for their CCTray).

  7. Brian says:

    Quick question… If you don’t allow checkins while the build is broken how do you get it fixed? Or do you mean that its agreed upon that no one will check in new code while the build is broken? I guess my question is really, where is this enforced at the source control level, or at the peer level…

  8. Great post. I especially appreciated the part in the “The Bad” about your wife calling, and how difficult the environment is. That is something that I have often thought to myself, but nobody seemed to be saying it out loud. There are downsides to xp, and they are very real – not to be discounted. BUT, as your post clearly summarizes, the pros for your team outweighed the cons. Great information.

    The one point that struck me as out of place was the statement about “very few bugs”. Since you aren’t even releasing the software to real world use until tomorrow, I think that statement is a little premature. Sure, there are very few bugs in the code that you’ve designed tests for, which cover all of the situations that you anticipate.
    What are you counting – the number of bugs discovered during the development process, or the number of existing known bugs in the code you are releasing? Maybe you can expand on the point you were trying to make around bug count?

Leave a Reply