When are scheduled code drops not enough?

In the past week and a half I've had some great conversations with one of my coworkers about the scheduling of our code drops. As background to those of you who don't work with me (which is darn near all of you), our current project has a set of scheduled two week iterations. Every two weeks we release the completed code to the testing team and they begin to test the most recent additions and fixes to previously found defects. While they are testing we developers carry on our merry way, writing code for the next set of new functionality and fixing the bugs being reported.

We have two primary goals on the development team. First we are trying to keep to our release schedule so we can meet our final release date. Next we are attempting to have a 0 bug count at the time we do our every two week release. The first goal is a matter of life and unemployment (or perhaps lower employment). The second goal is a great one to strive for, but it's a difficult one to achieve. So far we've had two code drops and we've had 0 and 1 bug carry over on each of those.

Where am I going with all this you ask? Well, the conversations with my coworker center around his, and admittedly mine too, urge to release bug fixes as quickly as we possibly can. In my mind this is a good trait for a developer to have. My coworker wants to get the best code, with the most functionality, to the testers and the business in the most timely fashion. This is perfect. A developer that's concerned about quality and punctual delivery. There is one drawback though, and I'm not sure how to strike the right balance with it.

Because we are performing continuous development cycles, we have to do our bug fixes at the same time as we are working on new code and in the same code base. This is fine but for the times that we want perform non-scheduled releases of bug fixes. So far I've been been managing this by fighting the urge to release more often than scheduled. I am however prepared to, and slightly reorganizing the work orders to help accommodate, build when a defect that seriously impeded the progress of the testers is raised. In my mind this takes an exceptional case.

One of the reasons I'm fighting both my and my coworker's urges to release each time bugs are fixed, is that I think this can set a very dangerous precedence with the test team. If the testing team becomes comfortable with us jumping to fix and build on every defect raised event, they will begin to expect and ultimately demand that we do this at all times. This ties in with my second reason for not doing on demand bug fix builds: Time, effort and scheduling. Each time you perform a build, uninstall the previous version from the servers, install the new version and perform a smoke test you have eaten up time. Depending on your project and schedule, time may be a valuable and rare commodity. In my environment each build requires the following efforts to get to a state where testing can resume.
  • coordinate with development team to ensure that the code base is in a state that the testers will find acceptable
  • Kick start build process (Forced through CruiseControl.NET)
  • Uninstall previous version from the developer's test servers
  • Install new version to the developers test servers (no xcopy here)
  • Smoke test software in the developer test environment
  • Notify test team that their environment will be upgraded
  • Wait for test team to reach "good stopping points"
  • Uninstall previous version from test environment
  • Install new version to test environment
  • Smoke test software in the test team's environment
  • Notify test team of the upgrade's completion and which fixes were included with it
As you can see a simple bug fix can turn into more than an hours effort just where deployment is concerned. Certainly bundling multiple bug fixes can help reduce the per-bug effort required, but grouping bugs together depends on the timing of the bugs coming in from the test team. If we get three or four bugs in the first day or two of a new iteration, then we are able to easily fix and bundle these for a new release. But what happens if we get no bugs until half way through the iteration? By that point we most likely have some significant pieces of code opened up for changes and we've probably checked in some full or partial new functionality that may not be ready for release to the test team. This is the situation that is the most difficult to work with while still staying nimble in our releases.

Perhaps releases every two weeks is as nimble as we should strive for. If any of you have experienced this situation and are willing to share some of your thoughts with me, please do. I'd really appreciate any ideas that you may have.

I'm the Igloo Coder and every time I take some of my ice flow to melt for water my situation gets a little more precarious.

posted @ Monday, July 17, 2006 5:26 PM

Print

Comments on this entry:

# Interesting Finds: July 17, 2006

Left by Jason Haley at 7/17/2006 7:22 PM
Gravatar

# re: When are scheduled code drops not enough?

Left by Mike at 7/18/2006 7:11 AM
Gravatar
Maybe you should consider the staging process to be an automated task, manually kicked off by CC.NET. The task could: 1. be driven by source files from the source control system, including scripts, executables, etc. 2. apply schema change scripts to a target server/database 3. run uninstall packages and install packages 4. run a set of unit tests as a smoke test. 5. run a compile process against deployment package projects (either the VS type, or 3rd party like InstallShield or WIX or whatever) 6. post client install packages in drop areas, with either automatic client updating (one-click or similar) or an email notification of an update. That makes deployments an automated, repeatable, consistent activity. I think, though, that the reasons you give for sticking to a two-week testing release schedule are very valid and I agree that a release in between iterations should be a rare thing. All I am proposing is that you consider using CC.NET (or Nant, whatever) to reduce the risks (inconsistency and time) around deployment.

# re: When are scheduled code drops not enough?

Left by The Igloo Coder at 7/18/2006 8:29 AM
Gravatar
Mike. I've been working on a set of scripts that can be run from CCNet and will distribute the installation packages to the servers as required. I have had some seriously long thoughts on the ability to kick start an installation on a remote server from CCNet. My largest concern is that people will be able to browse to our CCNet server and, without any security check, uninstall and re-install software on a group of servers that the entire test team relies on. I am all for consistency and repeatability though, so I might end up taking the risk at some point.

# re: When are scheduled code drops not enough?

Left by Mike at 7/18/2006 1:07 PM
Gravatar
Yeah, you could just remove the Anonymous access to the CC.NET site and that could help with the control. I had another thought - if you were using Team System Source Control, and you had a must-fix-now defect discovered halfway through an iteration, you could shelve your current code changes, make the defect fixes to the version of the source that was deployed, build/deploy that, then unshelve the iteration changes and merge in the defect fix...Team System makes that a much easier process than previously was kinda impossible (without shelving).
Comments have been closed on this topic.