Should we rewrite our legacy software or improve it?
Most of the time, improve it in place. A full rewrite is one of the riskiest moves in software: it routinely runs long, freezes new features while the replacement catches up, and can quietly lose business rules buried in the old code. Re-engineering keeps the system earning while you fix it and lets you stop or reprioritise at any point. Reserve a from-scratch rebuild for when the foundation genuinely cannot carry where you are going.
Why are full rewrites so risky?
Because value only arrives at the very end, and the old system rarely sits still while you build. You face a long stretch with nothing shipped, a feature freeze that frustrates users, and the constant danger of losing undocumented rules the old code quietly enforced. Plenty of rewrites spend months and large budgets only to land roughly where they started. None of that means never rewrite, only that a rewrite has to clearly justify itself.
When is a rebuild genuinely the right call?
When the underlying design cannot support where the business is going and incremental fixes keep hitting the same wall, no matter how you approach them. If the data model, platform or core assumptions are fundamentally wrong for the future, patching around them costs more than starting clean. Even then, document the old system's behaviour first so the rebuild preserves what actually matters.
How do we keep the business rules buried in old code?
Before changing anything, work to understand and document what the system actually does, including the quiet edge cases users depend on. Add tests that capture current behaviour so you can tell when something changes by accident. This matters in both paths, but it is critical for a rewrite, where the old code is the only record of rules no one wrote down.
Can we re-engineer first and rebuild later if needed?
Yes, and it is often the wisest sequence. Stabilise and modernize the system in place to relieve the immediate pain and buy time, while you learn what a clean version would really need. If a rebuild still proves necessary, you go into it with a working reference, documented rules and a clear scope, which is exactly what most failed rewrites lacked.