Software maintenance is not limited to fixing defects after launch. Dependencies age, usage patterns change, knowledge leaves the team and shortcuts make later work slower or riskier. A practical maintenance plan makes system health visible, assigns ownership and balances reliability work with product delivery before urgent incidents consume the schedule.

1. Create a system health inventory

List applications, services, dependencies, data stores, environments and owners. Record supported versions, known risks, monitoring gaps and critical business journeys. This inventory should reveal where one person, outdated component or undocumented process creates operational risk. Avoid a document that is detailed once and never updated; ownership and review dates matter as much as the first snapshot.

  • Map components and owners.
  • Record version, support and risk status.
  • Connect technical components to business journeys.

2. Separate routine maintenance from technical debt

Routine maintenance includes updates, backups, certificate renewal, monitoring and recurring operational work. Technical debt is a design or implementation choice that makes future change harder or riskier. Keep both visible but describe them differently. A debt item should explain the affected capability, present consequence, likely future cost and safe options rather than using vague labels such as “needs refactoring.”

3. Prioritise by risk and delivery friction

Combine user impact, security exposure, failure likelihood, recovery difficulty and the frequency with which an area slows product work. Small improvements in a heavily changed component may create more value than a large rewrite of a stable one. Link maintenance to upcoming roadmap work where possible, and reserve capacity so only emergencies do not receive attention.

4. Modernise in reversible increments

Large rewrites concentrate risk and delay feedback. Prefer boundaries that allow one module, dependency or workflow to be improved and measured at a time. Protect behaviour with focused tests, observe production signals and define rollback paths. Remove obsolete paths only after traffic, data and operational ownership have moved safely.

5. Measure whether maintenance improves delivery

Track indicators connected to outcomes: recurring incidents, recovery time, failed deployments, slow builds, vulnerable unsupported dependencies and time lost to repeated manual work. Numbers need context and should not become performance targets for individuals. Review the plan after incidents and major releases so completed work, new risks and ownership changes remain visible.

Frequently asked questions

Short answers on the topic

Is every old technology technical debt?

No. Age alone is not debt. A component becomes a concern when support, security, reliability or change cost creates a meaningful business risk.

Should technical debt stop feature development?

Not entirely. Reserve regular capacity and address debt where it reduces risk or enables upcoming work instead of switching between neglect and total rewrites.

When is a rewrite justified?

Consider it when incremental change cannot reasonably meet reliability, security or product needs, and only with clear migration, validation and rollback plans.