9.3 Maintenance And Evolution
Software is not finished after launch. Real software spends most of its life in maintenance: fixing defects, adapting to new environments, improving experience, and reducing future risk.
Maintenance is not low-status work. It is the engineering capability that lets software keep creating value.
Four Types Of Maintenance
Maintenance is often grouped into four types:
- Corrective maintenance: fix defects already observed.
- Adaptive maintenance: adapt to external changes such as browsers, operating systems, regulation, or third-party APIs.
- Perfective maintenance: improve performance, experience, usability, or feature detail.
- Preventive maintenance: reduce future failure probability through tests, refactoring, dependency upgrades, or risk cleanup.
The value of the categories is not memorization. They help teams plan different work rhythms.
Legacy Systems
A legacy system is not automatically a bad system. It may run critical business, but use old technology, have few tests, spread knowledge across people, or hide unclear boundaries.
The most dangerous move is changing core logic heavily without protection. A safer path:
- Observe real behavior first.
- Add logs, metrics, and characterization tests.
- Document known business rules.
- Wrap change behind small boundaries.
- Use feature flags or parallel runs to reduce migration risk.
Evolution Instead Of Rewrite Impulse
Rewrites are tempting because new code looks clean. But rewrites often lose hidden business knowledge inside the old system. Many failed rewrites fail not because the technology is impossible, but because the team underestimated exceptions, data, and user habits carried by the old system.
Evolutionary maintenance emphasizes:
- Small replacement steps.
- Behavior comparison.
- Rollback.
- Data compatibility.
- Minimal user disruption.
The goal is not to keep the system forever young. It is to keep the system reliable, understandable, and evolvable under change.