Junior Developers Love Writing Code. Senior Developers Love Deleting It.

A few years ago, I submitted what I thought was my best pull request.
It had everything.
New services. Helper classes. Design patterns. Custom abstractions. Over 2,500 lines of code.
I was proud of it.
Then a staff engineer reviewed my PR. He spent about 10 minutes reading it. After that, he left a single comment:
"This could probably be done in 500 lines."
That's it. No praise. No detailed review. Just one sentence.
At first, I was annoyed. How could removing code possibly make the solution better? Wasn't software engineering about building things?
A week later, we paired on the implementation. He didn't add new code. He deleted code. Lots of it.
Extra abstractions disappeared. Duplicate logic disappeared. Unnecessary layers disappeared.
By the end, the feature was smaller, faster, easier to test, and far easier to understand.
That's when I learned something that completely changed how I write software:
Junior developers measure progress by how much code they write. Senior developers measure progress by how much complexity they remove.
And once you see it, you start noticing it everywhere.
Why Most Developers End Up Writing Too Much Code
Nobody wakes up and decides to overcomplicate a system. It happens gradually.
A helper class here. A utility function there. A repository layer. A service layer. Another abstraction "just in case."
A few months later, a simple feature requires navigating through fifteen files just to understand what happens when a button is clicked.
The scary part? Every individual decision looked reasonable at the time. That's why complexity is dangerous. It doesn't arrive all at once. It accumulates.
Senior engineers understand this. That's why they constantly ask a question many developers never consider:
"Can we solve this with less?"
The 5 Patterns Senior Developers Use Instead
Pattern #1: Delete Before You Build
When most developers receive a new requirement, their first instinct is: "Let's add something."
Senior developers do the opposite. Their first instinct is: "Do we already have something that solves this?"
What most developers do — need a new feature? Create a new service, new helper, new utility, new abstraction, new configuration. The codebase grows. The maintenance cost grows. The confusion grows.
What senior developers do — before writing code, they look for opportunities to remove it. Questions they ask: Can we extend an existing component? Can we simplify an existing flow? Can we eliminate duplication? Do we really need another layer?
Sometimes the best feature implementation is 50 lines. Not 500.
Every line of code is a future maintenance cost. Spend it carefully.
Pattern #2: Optimize for the Next Developer
Here's a hard truth. Most code is not written for computers. It's written for humans.
Computers don't care if your code is elegant. Your teammates do. Future-you definitely does.
Clever code:
final total = users.where((u) => u.active).fold(0, (a, b) => a + b.points);
Short? Yes. Easy to understand six months later? Not always.
Readable code:
final activeUsers = users.where(
(user) => user.active,
);
final totalPoints = activeUsers.fold(
0,
(sum, user) => sum + user.points,
);
Takes a few more lines. Saves hours of confusion later.
Code is read far more often than it's written. Optimize for readers.
Pattern #3: Prevent Problems Instead of Handling Them
One of the biggest mindset shifts in engineering is realizing that prevention beats recovery.
Many bugs exist because systems allow invalid states. Negative prices. Invalid dates. Missing IDs. Broken relationships.
Then teams spend months adding checks everywhere. Senior engineers solve the problem differently. They stop invalid data from entering the system in the first place. Because once bad data gets inside, every layer becomes more complicated.
The cheapest bug to fix is the one that never reaches production.
Pattern #4: Automate Anything That Feels Boring
If a developer repeats something every week, a machine should probably be doing it.
Yet many teams still manually run deployments, update versions, generate release notes, execute repetitive tests, verify configurations.
Senior engineers hate repetitive work. Not because they're lazy. Because humans are unreliable at repetitive work.
Automation is consistency. Automation is reliability. Automation is scale.
If you're doing the same thing repeatedly, automate it before it becomes a process.
Pattern #5: Build for Change
Most software survives far longer than expected. The feature you're building today might still exist three years from now. Maybe longer. And requirements will change. They always do.
Senior developers don't build systems for today's requirements. They build systems that can survive tomorrow's changes.
That's why they prioritize simplicity, clear boundaries, loose coupling, predictable architecture.
The goal isn't perfection. The goal is adaptability.
Good code solves today's problem. Great code survives tomorrow's changes.
The Mental Model That Changed My Career
For years I believed great engineers wrote impressive code. Now I believe great engineers remove unnecessary complexity.
Whenever I review code today, I ask: Can this be simpler? Can this be smaller? Can this be clearer? Can this be automated? Can this be removed entirely?
Because software rarely fails from lack of code. It usually fails from too much of it.
Your Challenge For Tomorrow
Open the last feature you worked on. Then ask yourself:
- What can I delete?
- What can I simplify?
- What can I automate?
- What can I make impossible to break?
- What would confuse a new developer?
You might be surprised by how much complexity has quietly accumulated. And that's where senior-level engineering begins. Not when you learn another framework. Not when you memorize another design pattern. But when you learn that sometimes the most valuable code you'll write… is the code you choose not to write.
No spam, no schedule — just an email when a new post goes up.