Matthew Boston

Simple Is Better Than Complex

March 27, 2025

Complexity Is the Default

Complex code is easy to write. You think through a problem sequentially, handle each case as it appears, and the result is a tangle of branches and edge cases that technically works. No discipline required.

Simple code is the opposite. It requires you to understand the problem deeply enough to find the clean solution – the one that handles the cases without special-casing them, that expresses the logic without obscuring it. That understanding takes time. Simplicity is the output of effort, not the absence of it.

This is why over-engineering is so common. It feels like progress. Adding layers, abstractions, and configuration options feels like building something robust. But robustness comes from simplicity, not from complexity with guardrails.

Simple Doesn’t Mean Easy

There’s a critical distinction between simple and easy. Easy is what you reach for first. Simple is what you arrive at after removing everything that doesn’t need to be there.

A function with one responsibility is simple. A class that does one thing well is simple. A system where you can trace a request from input to output without jumping through six layers of indirection is simple. None of these are easy to design. All of them are easy to maintain.

The Zen of Python follows “simple is better than complex” with “complex is better than complicated.” That ordering matters. Sometimes genuine complexity exists in the problem domain. The principle isn’t to deny that complexity – it’s to never add accidental complexity on top of it.

The Readability Dividend

Simple code pays compound interest in readability. When a function is short, named well, and does one thing, you can read it in seconds. When a module has a clear interface and minimal dependencies, you can reason about it in isolation. When a system is composed of simple parts, you can understand the whole by understanding the pieces.

Every layer of unnecessary complexity breaks this. A reader hits an abstraction and has to ask: “Why is this here? What problem does this solve?” If the answer is “none, currently,” you’ve just spent their attention on nothing.

Simplicity Is a Practice

Writing simple code isn’t a one-time decision. It’s a practice you apply at every level, every day:

  • Before adding a new abstraction, ask whether the concrete code is actually hard to understand.
  • Before adding a configuration option, ask whether anyone will ever change it.
  • Before splitting a function, ask whether the pieces are genuinely independent ideas.
  • Before reaching for a pattern, ask whether the pattern serves the code or the other way around.

The answer is often “no.” And “no” is the most powerful tool for keeping things simple.


The Zen got it right. Simple is better than complex. Not because simplicity is easy, but because it’s worth the effort.

This article was originally posted on LinkedIn.