The industry tends to celebrate beginnings.
New repositories. Clean architecture diagrams. The excitement of choosing tools before real constraints show up. First commits get attention because they feel like authorship.
Most developers, though, don’t spend their careers starting from scratch. They spend them stepping into systems that already exist, already have users, and already have decisions embedded in them.
You open the repository and there are hundreds of thousands of lines of code waiting for you. Patterns layered over time. Workarounds that solved real problems in earlier moments. Comments that hint at context you weren’t there for. You didn’t choose the framework version. You didn’t pick the database. You didn’t design the way billing logic is structured.
You inherited it.
That inheritance is the work.
The Rails Default Debate
This is why debates about what DHH changed in the default rails new template sometimes feel slightly disconnected from day-to-day reality.
Threads fill up with opinions about JavaScript bundling, database adapters, testing philosophy. The conversation centers on defaults and direction.
Meanwhile, most developers working with Ruby on Rails haven’t typed rails new in years, at least not on anything beyond a side project or experiment.
They’re inside a twelve year old system that has been upgraded across versions, shaped by product demands, team turnover, and business pressure. Their attention is on stability. On how to change something without breaking adjacent workflows. On whether a refactor will surface an edge case that only appears in production.
The generator shapes the beginning.
Maintenance shapes everything after that.
Software Has Second Acts
We often talk about software in terms of launch and decline, as if those are the only meaningful chapters. In practice, most valuable products spend the majority of their life in a long second act.
The second act is what happens after product-market fit, after early growth, after the architecture has already been bent once or twice. It’s when the team has turned over. When new engineers are maintaining code they didn’t write. When uptime and predictability matter more than novelty.
It’s the stage where you stop asking, “What should we build?” and start asking, “How do we keep this adaptable without destabilizing it?”
That’s the environment most engineers operate in.
Not at the starting line, but in the middle of a system that already has gravity.
Legacy Code Is Accumulated Context
A mature codebase is accumulated decision-making. Each file reflects what someone believed was reasonable under the constraints they faced at the time.
A couple of years ago you introduced an abstraction that felt thoughtful and clean. It simplified things. It made sense with what you knew then. Today it may feel slightly overbuilt or misaligned with how the system evolved. The code you once defended now requires explanation.
Legacy code is not a moral category.
It is accumulated context.
Most legacy systems were built by people responding to real constraints. That includes you. The second act is less about erasing that history and more about working within it deliberately.
The Rewrite Fantasy
The urge to rewrite usually comes from frustration. We could design this better. We understand the domain more clearly now. The stack feels dated.
The real cost of a rewrite isn’t just risk or budget. It’s attention.
The moment a team decides “we’re rewriting this anyway,” the current system quietly becomes second-class. Tests stop improving. Refactors are postponed. Documentation is deferred. People stop investing in clarity because the future version will “fix it.”
Months pass. Sometimes years.
When the rewrite finally ships, it inherits the same domain complexity, the same business pressures, and often a team that hasn’t practiced maintaining what they already had.
Rewrites don’t just reset code. They reset discipline.
That’s the cost teams underestimate.
Stewardship Is the Craft
Most careers unfold inside inherited systems. The skill is learning how to move those systems forward without pretending they began today.
We inherit. We understand. We stabilize. We extend. We improve what we can without destabilizing what already works.
This kind of work rarely attracts attention. It looks like incremental improvement and steady compounding over time.
But if most of your career is going to be spent in the second act, then the real question isn’t whether you get to start something new.
It’s whether what you inherit gets better because you were there.