A poorly written greenfield will always be a painful legacy system.
In the end, we are all dying. The same applies to software systems. But what matters is how well we lived and served our purpose.
Software systems don’t die naturally, we have to kill them when they become too hard to manage. We usually judge software by uptime or speed. But I think there is another important metric:
How the software treated its creators.
Generally, the term “legacy” implies wisdom, something to learn from. But in our industry, “legacy” scares developers. It implies pain. It shouldn’t be this way.
Imagine coding is a journey with no map. With every step and shortcut you take, you leave footprints. Later, you (or a new developer) have to walk that path again.
If you hacked through the jungle, the path is painful to walk. If you built a road, the next revisit is easier.
We need to stop viewing “Legacy” as a bad word and start viewing it as the goal. The goal of designing a system is to eventually become a good legacy system. One defined by value, not by the fear of making a small change.