Legacy application failures rarely come out of nowhere. In almost every modernization project we've taken on, the warning signs were visible for months, sometimes years, before the system finally forced a reckoning. Here are the five most reliable ones.
1. Every change takes longer than it should
If a simple feature that should take a day is regularly taking a week because "we need to check it doesn't break three other things," that's not a process problem — it's a sign the codebase has accumulated undocumented, tangled dependencies that make safe change difficult.
2. No one wants to touch a specific part of the code
Every long-lived system eventually has a module everyone avoids. That avoidance is a reliable signal of hidden risk — usually the least-tested, least-understood part of the application, and often the part most core to the business.
3. Onboarding new engineers takes months
If new hires need months before they're productive, the system's complexity has outpaced its documentation and structure. This is a compounding cost: it makes the team more dependent on a shrinking pool of people who "just know" how it works.
4. Performance complaints are trending up, not flat
Occasional slow pages are normal. A steady upward trend in load times or error rates as usage grows usually means the architecture wasn't built for the scale you're now at, and patching around it is starting to cost more than a structural fix would.
5. You're afraid of your own dependencies
If upgrading a language version, framework, or major library feels too risky to attempt, your technical debt has crossed from "annoying" to "actively a security and hiring risk."
What to do about it
None of these signs mean you need a full rewrite. Most systems showing two or more of these signs can be modernized incrementally — extracting the riskiest modules first, behind a stable API, without a long feature freeze. The Larkspur Logistics case study on our portfolio is a real example of this approach.
Simbyte