You Are Not Paid to Write Code. You Are Paid to Solve Problems.
by Eric Hanson, Backend Developer at Clean Systems Consulting
The Reframe That Changes Everything
Your team spent two weeks building a sophisticated caching layer with Redis Cluster, cache warming logic, and a custom eviction policy. The page load went from 800ms to 180ms. Engineering was proud of it. Then someone asked: what was the user complaint we were solving? Turns out users were abandoning a checkout flow — but not because of page load. They were confused by the address form. Conversion didn't move.
Two weeks of solid engineering work, zero business impact.
This is not a story about wasted effort. It is a story about what the job actually is. You are not paid to write elegant code. You are paid to change outcomes. Code is the tool, not the product.
Why This Distinction Gets Blurry
Most engineering organizations reward visible, measurable technical output: features shipped, PRs merged, velocity maintained. The feedback loop between "what did we build" and "did it matter" is often weeks or months long. So engineers optimize for what gets measured and recognized in the short term — code quality, architectural decisions, technical sophistication.
This isn't malicious. It's rational. But it creates a subtle drift where engineers become focused on the craft of software to the exclusion of the purpose of software.
The drift shows up in a few recognizable patterns:
- Spending a sprint refactoring code that no user will ever notice because it offended your sense of design
- Building a generic, extensible system to solve a problem that only has one known use case
- Choosing a technology because it's interesting to work with rather than because it's the right fit
- Arguing over whether to use gRPC or REST when the actual bottleneck is the database query taking 4 seconds
None of these are bad in isolation. All of them are problematic when the underlying problem — the one a real user or business process depends on — hasn't been solved yet.
What Problem-First Thinking Looks Like in Practice
Before writing a line of code, the question to answer is: what changes in the world if this works perfectly?
This sounds abstract but it's very concrete in practice. For a given ticket or project:
- What user behavior is this expected to change?
- What business metric does success move?
- How will we know, in two weeks, whether this worked?
If you can't answer these questions, the requirements are not ready and you should not be writing code yet. This is not the product manager's problem to solve alone — this is your problem too, because you're the one who will build the wrong thing if the question isn't answered.
The Simplest Solution Is Often Not Code
Some of the highest-leverage interventions an engineer can make involve not writing code at all:
- Discovering that a "feature request" is actually a workaround for a bug that already exists and can be fixed in twenty lines
- Recognizing that a proposed microservice decomposition will add distributed systems complexity to a problem that a SQL query with a proper index already solves
- Pointing out that a scheduled job that processes data nightly could be replaced by a database trigger, eliminating an entire service
-- Proposed solution: a Python service that polls for unpaid invoices
-- every 5 minutes, updates status, sends notifications.
-- Actual solution that doesn't require deploying or maintaining anything:
CREATE EVENT update_overdue_invoices
ON SCHEDULE EVERY 5 MINUTE
DO
UPDATE invoices
SET status = 'overdue'
WHERE due_date < NOW() AND status = 'pending';
The engineer who proposes the SQL event is not doing less work — they're doing better work. They solved the problem with the minimum surface area necessary.
The Trap of Technical Elegance
There is a real tension here. Code quality matters. Architecture matters. Technical debt is real and has real costs. None of that is wrong.
The trap is treating technical quality as the goal rather than a constraint. Good engineers hold both: they solve the actual problem and they solve it in a way that doesn't create a mess for the next person. But when forced to choose between a beautiful solution that ships late and a messy solution that ships on time, the correct default is to ask whether the problem is urgent enough to warrant shipping the messy solution now and cleaning it up later — with a specific plan for when "later" is.
What is never correct is shipping a beautiful solution to the wrong problem.
The Practical Takeaway
Before you start your next significant piece of work, write one sentence that describes what changes in the world — not in the codebase — if you succeed. Keep it somewhere visible while you're working. When you're three days in and arguing about whether to use an abstract factory or a builder pattern, read that sentence. Ask whether the argument you're having affects the outcome in that sentence.
If it doesn't, make the simpler choice and get back to the problem.