Clean architecture for small teams (without overengineering)
Clean architecture is useful when it reduces coupling and makes change safer. It’s not useful when it becomes ceremony.
The version I like
- Domain rules are isolated from frameworks.
- Use cases are explicit (the “verbs” of the system).
- Infrastructure is swappable (DB, external services, file storage).
- UI/API stays thin (validation, mapping, auth).
What I avoid
- Creating 12 projects/modules before there’s a second feature.
- Abstractions that hide simple code.
- “Generic repositories” that fight the ORM.
A good heuristic
Start simple, but enforce direction of dependencies:
- API depends on application
- application depends on domain
- infrastructure depends on application (interfaces) and domain (models)
If a new feature takes longer because the architecture “demands” it, you’re doing it wrong.