If you’re losing capacity maintaining brittle code or infrastructure, the “litter patrol” in a related neighborhood may be good practice but how do you visualize and manage the true source of your pain?
This is based on a mix of my own experiences and great nugget of insight picked up from Jim Highsmith at Agile 2010 who in turn credited Israel Gatt.
First the paraphrased nugget from Jim…
“Teams need both debt reduction and debt prevention strategies.”
Here’s the quote from Israel back in December ’09.
“If your company relentlessly pursues growth, the quality/technical debt liability it is likely to incur could easily outweigh the benefits of growth. Consider the upside potential of growth vis-a-vis the downside of the resultant technical debt. When appropriate, monetize technical debt using the technique described in Technical Debt on Your Balance Sheet.”
Here’s my expansion to Israel’s article…
How do we know we have debt?
We “know” it’s there, we feel it. But do the right people know about it? You may be allocating permanent team capacity to keep bailing without seeing the hole.
- Train all your teams in spotting technical debt
- Develop and communicate your debt strategy to your teams and stakeholders.
- Determine a common unit of currency (points, hours, money, NUTs) that your stakeholders can understand and engage with and use this to describe the transaction decisions you’re making.
Communicate current debt – “Balance”
- This is obvious but hard to achieve. For the debt that hurts; quantify the cost and determine what you could do if it were resolved. Get that opportunity cost shared and get your solution sponsored. In most large companies if you can demonstrate a cost reduction or productivity improvement you can get support.
Communicate new debt – “Recent Transactions”
- Not the decade-old pile in the corner! Focus on what you’re forced to add because of deadlines and market pressure. Every time you make a debt-related compromise, get that conversation exposed. Determine the maximum acceptable age for any debt being added, a cost (in your selected currency) and a priority. Whilst there are cases where a debt may never need to be repaid, chances are you’ll need to pay the next transaction off.
Limit debt – Set yourself a “Credit Limit”
- What’s the maximum debt your team/project/product is willing and/or able to tolerate? Set a credit limit and stick to it. If we blow our limit, we’re in trouble. My personal rule-of-thumb is if it’ll take more than one whole sprint for the entire team to clear all new debt then you’re worryingly-leveraged and heading away from releasable software. This approach means a simple default credit limit for a new project (using story points as currency) is the same as your velocity – simple to calculate and remember. You could convert this into the average hours (and therefore financial impact) a story of that size takes if that means more to your leaders.
Whatever you do, don’t over-mortgage your product. You don’t want your product portfolio to collapse under unrecoverable bad debt.
Set a maximum age threshold - “Payment Terms”
- Use topping & tailing approaches to control and ratchet your debt age to keep the span down. If your debt exists for more than N sprints (say 3) promote it to the top of the priority stack. Fixing new debt when it arrives is hard work and items do slip through. For those that escape, setting a maximum age means you’ll cycle all your debt through and keep it fresh. Even tough problems get resolved rather than rotting in the debt heap.
Visualize and report your debt – provide a “Debt Statement”
- Put all debt visibly on your wall as cards or stickies, give it a different color, heading, whatever – make it visible. Now every sprint let’s highlight the numbers, the growth, reduction, reiterate your limit. If you’re using an electronic tool, try putting all the debt items under a single parent and tracking cumulative flow and burn-up of debt rolled up to that item.
Prioritize your debt – “Positions”
This is getting a little more advanced and difficult to manage – I’d reserve this for only projects that already have high debt where the simple strategies alone are too invasive.
- Partition your debt into 3 positions. New:Short-term, New:Long-term, Old:All.
Set a different credit limit and payment terms for each of these and as part of prioritization set a ratio of effort/pay-off against each that ensures that at a minimum debt is sustained at a constant level but focus on cycling through so that the contents remain fresh.
Here are a few other points to explore – mostly around debt reduction.
• What “small wins” exist for you? Are there some simple debts than can be cleared quickly?
• If you sacrificed a team member for 1 sprint to pay off some short-term debt, would you be able to increase the overall team performance in later sprints?
• If a particular single debt item is too big for a team to swallow in a single sprint, can you call in or implement a parallel “SWAT Team” to fix it?
• What capacity do you need to reserve to sustain your current debt level?
• If you were going to reduce your debt burden by 10-20% what effort/capacity would that require and how long would it take?
• Can you demonstrate a return on investment for a particular piece of debt-reduction?
• Worst-case scenario: Could some debt control run “under the radar”? (And if this were discovered, what problems would be caused?)
Develop both debt prevention and reduction strategies for your teams, don’t just focus on reduction.
Treat technical debt like real personal or business debt: use “credit limits”, “statements”, “balance”, “transactions” & “payment terms” to your advantage.
To achieve effective reduction, work through the Oubliette strategies and in worst cases, consider a “SWAT Team”.