Do you look around your org and see a pile of problems? Untested legacy code, knowledge silos, tooling gaps, recurring fires. Perhaps you know what needs to change, but the list is so long it feels insurmountable. You feel defeated before you’ve taken the first step. Don’t get overwhelmed and “freeze.”
It Doesn’t Have to Be Like That
Often, leaders tell me they feel they just don’t have the time to take action on all these fronts, and in the meanwhile things keep moving forward (or downward). That’s an excuse. Virtually every team I’ve worked with could find wiggle room through creative thinking, tech capital, or honest conversations with product.
It’s crucial that you snap out of it and start taking action. If not, you’re making things worse, because while you’re paralyzed planning, you’re still digging the hole deeper. Eventually, no ladder will be enough.
Phase 1: Stop Digging
Before you can cover your debt, of any kind, make sure it’s not getting worse. Look at what currently sucks and ask: how do we at least stop making this worse? For example, I talked to a VPE who kept equivocating about how to tackle their mountain of untested code. That’s indeed a big issue to solve, but in the meantime, how about deciding that no new code will be committed without tests? He was waiting for the “perfect solution”, de facto letting things deteriorate.
Another example could be a team suffering from knowledge centralized in a handful of seniors. Yeah, ultimately, you want to spread out their knowledge across the team, but ensure it doesn’t continue like that! Every new initiative involves others from day one, ideally as owners. This is about changing the trajectory from declining to holding steady.
Phase 2: Flipping Momentum
Now, hopefully, things are stable. You’re at “break even.” You can decide to tackle things incrementally. Whereas sometimes you might have an issue that you can allocate a couple of days to tackle and get rid of, most things are not that simple.
Start enabling small upgrades and leaps forward to address those long-standing issues. Lots of untested code? The previous phase was about ensuring new code is tested; now you can make it a habit to add a few basic tests whenever someone touches an old file. Hero senior engineers? Start enforcing pairing on their work and teaching them to explain what’s to be done rather than doing it themselves.
Again, don’t get stuck in analysis paralysis here. Create an inventory of the things on your plate and backlog it. Map the different constraints and current costs, and just choose something. Don’t agonize over the perfect path; it’s better to start gaining momentum. Even saving whoever is doing on-call five minutes every morning because AI will skim the night logs for them counts.
Not Sexy
Most of these aren’t sexy or shiny. They’re not the tasks teams are excited about. Yet they’re necessary, and don’t require too much work. Assuming you cannot take concentrated weeks to address it, this is the path forward. In addition, it will also help your team regain ownership, agency, and feel proud in its craft again. This is especially important for cases where the team feels somewhat disassociated with the existing codebase or past decisions.
Also, this is about cultural change. Whatever hole you found yourself in is one your team has been digging for a while. To make a lasting change in how the team acts, it’s sometimes beneficial to spread the work so that everyone gets exposed to the wanted behavior over time and has enough opportunity to digest it.
An impossible situation can look 180° different within 6 months. Do you want to spend the next year lamenting that it’ll take you months, or do you want to get to it?