This website uses cookies

Read our Privacy policy and Terms of use for more information.

👋 Hey {{first_name|there}},

Your team followed clean architecture to the letter, and now a single-field change touches seven files across four layers. Here's how to measure whether your abstractions are earning their keep.

Why this matters / where it hurts

A few years ago, I joined a team that had done everything "right." Hexagonal architecture. Ports and adapters. Domain layer isolated from infrastructure. The dependency arrows all pointed inward. The diagram on the wiki looked beautiful.

Then someone asked us to add a field to an API response.

One new field. We touched the domain model, the domain service, the application service, the response DTO, the mapper between domain and DTO, the integration test fixtures, and the API contract test. Seven files. The pull request took two days to review because reviewers had to verify that the same value threaded correctly through four layers of transformation. And the thing is, nobody questioned it. We'd internalized the cost as "the price of clean code."

That price has a name. I call it the abstraction tax: the operational overhead your team pays every time they navigate, debug, or change code that passes through layers which exist for architectural correctness rather than actual need. In Lesson #34 on the distributed monolith (https://www.techarchitectinsights.com/p/the-distributed-monolith-is-worse-than-the-monolith), we talked about how structural decisions made for "good reasons" can quietly compound into something worse than the problem they solved. The abstraction tax is the same pattern, one level down. It lives inside your services, not between them.

🧭 The shift

From: More abstraction layers mean better architecture.
To: Every layer is a liability until it proves it's an asset.

Clean architecture, hexagonal architecture, onion architecture. They're not wrong. But they're patterns, not laws. The original authors described them as tools for specific contexts: large teams, long-lived systems with genuinely distinct deployment boundaries, domains where business logic must be tested in complete isolation from infrastructure. Somewhere along the way, the industry started applying them as defaults. Every new service gets four layers on day one, whether it needs them or not.

The problem isn't abstraction itself. It's an unexamined abstraction. Layers that exist because a blog post said they should, not because your team's actual pain demanded them. And those layers have real costs that show up in production, not in architecture diagrams.

  • Treat every indirection layer as carrying a recurring cost: onboarding time, debugging hops, and change amplification. If you can't name the cost a layer prevents, it probably isn't preventing one.

  • Defer layers until pain demands them. A service that starts with two layers and grows a third when complexity justifies it will almost always outperform one that starts with five and never removes the two it didn't need.

  • Evaluate abstractions by operational impact, not by how satisfying the folder structure looks in an IDE.

📘 New Career Guide

I just finished a major update to the From Developer to Architect career guide. It now includes a self-assessment rubric, a week-by-week 90-day growth plan, architecture artifact templates, and interview prep frameworks. If you're actively working toward a Staff, Tech Lead, or Architect role, this is the structured roadmap.

Free download here: https://www.techarchitectinsights.com/from-developer-to-architect-free-career-guide

Subscribe to keep reading

This content is free, but you must be subscribed to Tech Architect Insights to continue reading.

Already a subscriber?Sign in.Not now

Keep Reading