There are a handful of engineering sayings that have survived for decades. Not because they’re catchy, but because they keep proving themselves true.

You’ve probably heard them before.

“Never optimize what you haven’t taken the time to understand.”

“YAGNI. You Aren’t Gonna Need It.”

“Before you automate a task, do it manually a few times so you understand what you’re automating.”

At first glance, these seem like unrelated pieces of advice. One is about performance, another about software design, and the third comes from generations of battle-hardened system administrators. But I don’t think they’re teaching different lessons. I think they’re all expressions of the same principle:

Every solution is a commitment.

Optimization is a commitment. Automation is a commitment. Abstraction is a commitment. Architecture is a commitment. Each decision makes your system a little more difficult to change tomorrow than it is today. That’s not an argument against making those decisions. It’s a reminder that commitments should be made because you’ve earned confidence in them—not because they seemed like a good idea in the moment.

Take optimization. It’s easy to fall into the trap of making code faster simply because you can. We add another cache, another index, another asynchronous queue, or replace a perfectly adequate algorithm with something more sophisticated. But if we haven’t identified the real bottleneck, we’ve simply traded simplicity for complexity. Premature optimization isn’t dangerous because optimization is bad. It’s dangerous because we’ve committed ourselves to additional complexity before we’ve earned confidence that the complexity is necessary.

YAGNI teaches exactly the same lesson from a different angle. Engineers are naturally drawn toward solving future problems. We imagine needing multiple providers, a plugin architecture, or support for millions of users. Sometimes those predictions are right. Often they aren’t. Every extension point, every configuration option, and every abstraction carries a cost. They all have to be understood, tested, documented, and maintained. YAGNI isn’t anti-planning; it’s anti-fiction. Don’t build for futures that only exist in your imagination.

System administrators arrived at the same conclusion long before DevOps became fashionable. Ask an experienced sysadmin how to automate a repetitive task, and they’ll often tell you to do it manually first. Then do it again. Then do it a third time. The first execution teaches you the process. The second exposes the rough edges. The third reveals what is genuinely repetitive and what only appeared to be. Automate too early, and you often automate your misunderstandings. Now you’ve built software that faithfully repeats a process you never fully understood.

The same principle extends beyond code into architecture. Don’t split a monolith because microservices are fashionable. Don’t introduce a message bus because you’ll “probably need it someday.” Don’t divide teams around service boundaries you haven’t actually observed. Good architecture shouldn’t be an exercise in predicting the future. It should be a response to patterns that have revealed themselves over time. Architecture isn’t where understanding begins. It’s one of the places understanding eventually leads.

One of the recurring themes in Borrowed Eyes is that our first instinct is usually to improve something before we’ve truly seen it. We want to fix it, optimize it, automate it, or abstract it. Those activities feel productive because they produce visible change. Observation rarely does. Yet observation changes the next decision, and that is often far more valuable than changing the current implementation.

That connects to another idea I’ve written about before: Proximity dulls perception. The closer we are to a system, the more certain we become that we understand it. Familiarity creates confidence, but confidence isn’t the same as insight. It’s why we optimize the wrong query, automate the wrong workflow, generalize too early, or design for requirements that never arrive. The danger isn’t ignorance. The danger is believing we’ve already seen enough.

Maybe that’s what these old engineering sayings have been trying to teach us all along. Not to avoid optimization. Not to avoid automation. Not to avoid architecture. Instead, they’re reminding us to earn the right to make those decisions.

Because every solution is a commitment.

The question isn’t whether you’ll make commitments. Every engineer does.

The question is whether you’ve taken the time to understand the problem before making one.

Category
Tags

No responses yet

Leave a Reply

Your email address will not be published. Required fields are marked *