Imagine one of those Russian dolls, except that each time you open a doll up, you find a larger one inside, TARDIS-style.
Welcome to my afternoon.
It started off as a support request. A user was complaining that when they tried to disable a Confluence plugin, they were getting back a NullPointerException. I verified the error and re-filed it in Jira as a bug report.
“Easy”, I thought as I checked out the latest stable source and opened up IDEA. “NullPointerExceptions are easy. I’ll just fix it up so it does the right thing with null. Two-line fix, one-file patch, the user gets a happy new year.”
Except the error wasn’t in Confluence. It was in Seraph, our open-source web security framework. Which meant I’d have to add my two-line fix to Seraph, tag a new version, upload the new version to the repository and update the dependencies in Confluence. Oh well, a jar file still counts as a one-file patch, right?
It wasn’t going to be a two-line fix, either. The NullPointerException wasn’t just a simple missing guard-clause, it was a symptom of something bigger. The Confluence code was attempting to tell Seraph to do something it’d never been designed to do, and Seraph wouldn’t have a bar of it. “OK, I can still fix this”, I thought. I’d have rolled my sleeves up and got to work, but that would have looked a little stupid in a t-shirt.
Tests coded, fix written, tests green. Time to check everything in and tag. This is the point that I remembered something had changed since I last worked on Seraph. In the intervening time, the whole project had been moved from CVS to Subversion. Oh look. Open it up and there’s another doll inside. And this one’s got fangs!
* Download OSX Subversion packages
* Look up on the extranet how to log into our SVN server.
* Look up on the extranet how to check things out of SVN.
* Re-apply my fixes.
* Guess how to commit my fixes back to SVN
* Google for a way to tag the revision
Phew. Done. Now I can update Confluence, run the tests and I’m done.
Build scripts.
When we build the source distribution for Confluence, we bundle in the source of the relevant Atlassian libraries. Our ever-so-nifty automated build script pulls the appropriate versions of each project out of CVS. Except, of course, Seraph isn’t in CVS any more, and the build scripts don’t speak SVN at all.
When a programmer tells you they can fix something in five minutes, don’t believe a word.

The Development Cascade