What Abstractions Really Are

Software developers hear about abstractions all the time. They’re hailed as the answer to complexity, the foundation of clean architecture, and the secret to flexible systems. But what is an abstraction really? Is it just a way to hide details? Is it a simplification? A mental model? Something real, or something made up?

This post explores what abstractions actually are by unpacking several common assumptions about them. Spoiler: abstractions are more subtle and more powerful than we often give them credit for.

Do abstractions need to simplify or reduce complexity?

Not necessarily. While abstractions often feel like they’re simplifying things, that’s not their core purpose. Instead, abstractions organize complexity, which may or may not reduce it.

A good abstraction provides a vocabulary, a structured way to interact with something complex. Consider a container orchestration API like Kubernetes: it’s not simple. In fact, it’s incredibly sophisticated. But it’s abstract in the sense that it offers a consistent surface to reason about containers, pods, volumes, and clusters. It doesn’t make the underlying infrastructure simpler – it makes it navigable.

Abstractions give shape to complexity, not always reduction.

The essence is not about making things smaller. It’s about partitioning complexity so that different concerns are isolated and exposed only as needed.

Do abstractions need to extract essential properties?

Yes, this is core. A strong abstraction captures what matters for a specific purpose, while hiding what doesn’t. The idea of “essential properties” is always contextual.

For example:

  • A List<T> gives you order and indexed access.
  • An Iterable<T> gives you just sequential access.

Both abstract over collections, but extract different essentials.

Good abstractions are selective. They shine a spotlight on what matters and darken what doesn’t. That’s what makes them usable and portable. They distill relevance.

Do abstractions need to work differently than the thing they abstract?

No. An abstraction often offers a different interface, not a different mechanism. It doesn’t have to work differently internally, just look different externally.

Consider a virtual machine. From the outside, it abstracts over hardware. From the inside, it’s still running assembly code (just one layer removed). Similarly, an interface in Java doesn’t change how methods work, it changes how we reason about object behavior.

Abstraction is about shaping the experience, not necessarily changing the implementation.

Sometimes the abstraction does work differently (e.g., when simulating future behavior), but that’s optional. It’s not a defining trait.

Do abstractions need to be based on something real or pre-existing?

Absolutely not. Many abstractions are invented. Their job isn’t to mirror the real world but to provide a coherent model that’s useful.

  • The concept of a Monad in functional programming? Entirely invented.
  • A File in your OS? Just a metaphor for a bunch of disk blocks.

Abstractions need to be internally consistent, composable, and fit for purpose. Real-world analogues can help comprehension but aren’t required.

Don’t overvalue realism. Value usefulness.

Do abstractions need to be useful or “real-world”?

They must be useful. But not necessarily real-world. The value of an abstraction lies in its utility, not its mimicry of reality. Trying to reflect the real world too closely often leads to clumsy models. For example, modeling a User as if it were a full human being—complete with emotions, facial features, and food preferences—is usually overkill.

Instead, model abstractions to serve the system’s purpose. Abstract what you need to reason about, not what the world contains.

Real-world inspiration is fine, but real-world fidelity is a trap.

So what is an abstraction, really?

Here’s a working definition:

An abstraction is a structured interface to a set of concerns, highlighting what matters and hiding what doesn’t — based on context, purpose, and perspective.

It may or may not:

  • simplify complexity,
  • reflect real-world things,
  • work differently underneath.

But it must:

  • expose the right concerns,
  • be coherent,
  • be usable.

Final Thoughts

The word “abstraction” is often thrown around loosely. But real design work demands clarity. Abstractions aren’t magic. They’re tools — conceptual scaffolding that allows us to manage complexity, evolve systems, and write code that fits the task at hand.

So next time you’re designing a system, ask yourself:

  • What’s the purpose of this abstraction?
  • What concerns is it exposing?
  • What complexity is it hiding?
  • Is it shaped for my context — or just borrowed from someone else’s?

Because the best abstractions aren’t just elegant. They’re purposeful.

Read more