I’ve been practicing some form of Agile Software Development throughout my entire career, beginning with Spiral in the 90’s, Scrum and XP throughout most of the 2000’s, and Lean Software Development over the last two years. One thing all of these practices have in common is the basic concept of doing short iterations through a backlog of work vs. planning up front and delivering over a longer release cycle (Waterfall).
The reason Agile methods are typically preferred over Waterfall is because it allows the team to deliver the backlog items that have the highest business value early and often. We’ve all heard the anecdotes about Waterfall where the product was delivered 18 months late and it wasn’t even what the business needed anymore. Considering that I am still an avid practitioner of Agile methods, I do believe that unless you are delivering a mission critical piece of software, you must use some form of Agile. In these times, we just don’t have the time or the money to wait months (or years) for a new software release. Your market will eventually be gobbled up by a competitor who is smaller and more nimble.
Because you are constantly reprioritizing and building for the current iteration, you build up technical debtthat needs to be repaid in future iterations. As you continue to iterate, you need to be disciplined enough to pay off some debt of before adding more. This is all well and good, but what happens after the team stops iterating and the resources move onto a new project? Everything will be humming along well for a while until the production system crashes. The team takes a look and realizes that the XML file they were using for simple data lookups grew to 250MB. So the team spends some time refactoring the XML file into a database table and the system is up and running again. About a month later, the system crashes again due to another issue. You get the idea: Much like financial debt, technical debt builds up interest over time until you finally go bankrupt if it is unmanaged.
So how do you make sure this doesn’t happen? Here are some things you should do with every agile project to avoid it:
- During each iteration, don’t mark a feature “done” unless it has appropriate logging, monitoring, and notifications in failure conditions
- Make sure you add a few iterations to the end of the project to pay off the debt
- Continue to staff a skeleton crew on the project as long as it is live in production
Technical debt is an often necessary means to achieve goals with less staff, budget, and a shrinking market window. If you are going to “finance your roadmap” with technical debt, just make sure you manage it like any other debt or you would face some unhappy customers and stakeholders.