Published on

> The 90% Mindset: Why Senior Developers Think Backwards

Authors

There's a moment in every developer's career where something clicks. You stop asking "how do I build this?" and start asking "how will this live in the world?"

That shift changes everything.

New developers optimize for creation. They want to ship. Get it working. Move on. And that instinct isn't wrong—it's just incomplete. Because building software is maybe 10% of the job. The other 90% is living with what you built.

Maintenance isn't the tax you pay for the privilege of creating. Maintenance is the work. Building is just the brief moment before the real job starts.

The Five Questions

Seasoned developers run a background process while they code. It's not conscious anymore—it's instinct developed through scar tissue. But if you slow it down, it looks something like this:

How am I going to test this?

If you can't prove it works, you can't prove your changes didn't break it. Every function, every integration point, every edge case—you're either writing tests now or debugging production later. The code you write today becomes the code someone else maintains tomorrow. That someone might be you, six months from now, having forgotten everything about why you made these choices.

Testability isn't about coverage metrics. It's about confidence. Can you refactor this module next quarter without holding your breath?

When the time comes, how will I extend this?

The requirements will change. They always change. The business will pivot. The integration partner will update their API. The edge case you dismissed will become the primary use case.

This isn't pessimism—it's pattern recognition. You're not building for today's requirements. You're building for today's requirements plus the inevitable second version that product hasn't thought of yet. The question isn't whether you'll need to extend this. It's whether extending it will take an afternoon or a quarter.

What common pitfalls cause things to break?

Every domain has its landmines. Race conditions in concurrent systems. N+1 queries in ORMs. Timezone assumptions in date handling. Floating point arithmetic in financial calculations. Character encoding in international text.

Senior developers have stepped on these mines before. They recognize the terrain. They see the bug before it exists because they've written that bug—or fixed it—a dozen times in other codebases.

This knowledge doesn't come from books. It comes from 3 AM incident calls and the particular shame of explaining how your code took down production.

What are the security implications of what I'm doing?

Every input is hostile. Every integration is a liability. Every assumption about user behavior is wrong.

This isn't paranoia. It's respect for the reality that your code runs in an adversarial environment. SQL injection hasn't gone away because we know about it—it persists because developers don't think about it while they're building. Same with XSS. Same with broken authentication. Same with the hundred other ways systems get compromised.

Security isn't a phase of development. It's a lens you apply to every decision.

How am I going to ensure I didn't break anything?

The courage to refactor comes from knowing you'll catch your mistakes. Without that confidence, codebases calcify. Nobody touches the legacy module because nobody knows what it actually does. Technical debt compounds because paying it down is too risky.

This is where your test suite earns its keep. This is where CI/CD stops being DevOps theater and starts being the guardrail that lets you move fast without breaking things.

Patterns as Insurance

Here's the thing about design patterns that nobody tells you in school: they're not academic exercises. They're not resume keywords. They're battle-tested answers to questions you're definitely going to be asked.

Every pattern exists because someone, somewhere, solved a problem the hard way enough times that they abstracted the solution. Repository pattern? That's decades of developers learning that coupling business logic to database access creates brittle systems. Strategy pattern? That's the collected wisdom of everyone who ever hardcoded a conditional that later needed to handle twelve cases.

When you master patterns, you stop reinventing broken wheels. You recognize the shape of problems faster. You reach for proven solutions instead of discovering—through painful experience—why your novel approach doesn't work.

This isn't about dogma. Senior developers don't apply patterns because a book told them to. They apply patterns because they've seen what happens when you don't. They've maintained the codebases where someone got clever instead of getting correct.

The Paradox

Here's what took me years to understand: thinking about maintenance reduces maintenance.

The upfront investment in asking these five questions pays compound interest. A testable system is a changeable system. An extensible architecture absorbs new requirements instead of fighting them. Security considered early is cheaper than breaches remediated later. Code written with failure modes in mind fails gracefully instead of catastrophically.

The developers who seem to move fastest aren't the ones who skip these questions. They're the ones who've internalized them so deeply that the answers are built into their first draft.

The Real Job

Junior developers write code. Senior developers write code that other people can work on.

That's the job. Not building features. Not shipping tickets. Not proving how clever you are with an elegant abstraction nobody else can understand.

The job is creating systems that survive contact with reality. That bend without breaking when requirements shift. That new team members can understand without archaeological expeditions through git history. That you can deploy on Friday afternoon without dread.

The five questions aren't a checklist. They're a mindset. And once you have it, you can't unsee it. Every line of code becomes a conversation with your future self and everyone who comes after you.

That conversation goes better when you think backwards from the beginning.