1) Simple CRUD or data-centric systems
If the core problem is straightforward data storage and retrieval with minimal business rules:
-
Admin dashboards
-
Basic inventory apps
-
Simple reporting tools
DDD adds layers (aggregates, repositories, domain services) without real benefit.
👉 Better fit: Transaction scripts, layered architecture, or even low-code.
2) Stable domains with little change
DDD shines when:
-
Rules change frequently
-
Language evolves
-
Domain knowledge deepens
If the domain is mature and unlikely to change (e.g., fixed regulatory forms, static catalogs), DDD’s modeling effort doesn’t pay off.
3) Small teams or short-lived projects
DDD requires:
-
Shared language
-
Modeling workshops
-
Ongoing refinement
For:
-
1–2 developers
-
Proof-of-concepts
-
Hackathons
-
MVPs with uncertain future
…the coordination cost exceeds value.
4) When the domain complexity is low but technical complexity is high
Example:
-
Real-time streaming pipeline
-
High-performance compute system
-
Infrastructure tooling
Here, the challenge is technical architecture, not domain modeling.
DDD solves the wrong problem.
5) CRUD over a well-understood schema
If the system mostly mirrors a database or external schema:
-
ERP extensions
-
Data entry portals
-
ETL staging apps
DDD entities become thin wrappers over tables → unnecessary abstraction.
6) When the organization lacks domain collaboration
DDD depends on:
-
Domain experts
-
Ubiquitous language
-
Iterative modeling
If stakeholders are unavailable or knowledge is fragmented, DDD collapses into guesswork and ceremony.
7) Premature microservices / bounded contexts
A common anti-pattern:
“We’ll do DDD → bounded contexts → microservices”
For small systems this creates:
-
Distributed complexity
-
Integration overhead
-
Deployment burden
DDD does not require microservices — but is often misused to justify them.
8) Performance-critical tight loops
DDD object graphs, aggregates, and invariants can add:
-
Allocation overhead
-
Indirection
-
ORM complexity
In high-frequency trading, simulation engines, or embedded systems, simpler data-oriented design is superior.
Practical rule of thumb
DDD is justified when all three are true:
-
Domain complexity is high
-
Domain knowledge is evolving
-
Business rules drive architecture
If any of these are missing → reconsider DDD.
Common signs you’re over-engineering with DDD
-
Entities with no behavior
-
Repositories that just wrap ORM
-
Aggregates = database tables
-
Excessive value objects for primitives
-
Services passing DTOs everywhere
-
More modeling than coding
When to use instead of DDD
| Situation | Better approach |
|---|---|
| Simple CRUD | Transaction script |
| Data pipelines | Data-oriented design |
| MVP | Clean architecture lite |
| UI-heavy apps | MVC / MVVM |
| Static schemas | Anemic model |
| Infra systems | Procedural / functional |
Bottom line
DDD is a strategic modeling approach, not a default architecture.
Use it when the business domain is the hardest part of the system —
avoid it when the system is mainly data, UI, or technical plumbing.
Comments
Post a Comment