Jump to ratings and reviews
Rate this book

Domain-Driven Design: Tackling Complexity in the Heart of Software

Rate this book
"Eric Evans has written a fantastic book on how you can make the design of your software match your mental model of the problem domain you are addressing. "His book is very compatible with XP. It is not about drawing pictures of a domain; it is about how you think of it, the language you use to talk about it, and how you organize your software to reflect your improving understanding of it. Eric thinks that learning about your problem domain is as likely to happen at the end of your project as at the beginning, and so refactoring is a big part of his technique. "The book is a fun read. Eric has lots of interesting stories, and he has a way with words. I see this book as essential reading for software developers--it is a future classic." --Ralph Johnson, author of Design Patterns "If you don't think you are getting value from your investment in object-oriented programming, this book will tell you what you've forgotten to do. "Eric Evans convincingly argues for the importance of domain modeling as the central focus of development and provides a solid framework and set of techniques for accomplishing it. This is timeless wisdom, and will hold up long after the methodologies du jour have gone out of fashion." --Dave Collins, author of Designing Object-Oriented User Interfaces "Eric weaves real-world experience modeling--and building--business applications into a practical, useful book. Written from the perspective of a trusted practitioner, Eric's descriptions of ubiquitous language, the benefits of sharing models with users, object life-cycle management, logical and physical application structuring, and the process and results of deep refactoring are major contributions to our field." --Luke Hohmann, author of Beyond Software Architecture "This book belongs on the shelf of every thoughtful software developer." --Kent Beck "What Eric has managed to capture is a part of the design process that experienced object designers have always used, but that we have been singularly unsuccessful as a group in conveying to the rest of the industry. We've given away bits and pieces of this knowledge...but we've never organized and systematized the principles of building domain logic. This book is important." --Kyle Brown, author of Enterprise Java(TM) Programming with IBM(R) WebSphere(R) The software development community widely acknowledges that domain modeling is central to software design. Through domain models, software developers are able to express rich functionality and translate it into a software implementation that truly serves the needs of its users. But despite its obvious importance, there are few practical resources that explain how to incorporate effective domain modeling into the software development process. Domain-Driven Design fills that need. This is not a book about specific technologies. It offers readers a systematic approach to domain-driven design, presenting an extensive set of design best practices, experience-based techniques, and fundamental principles that facilitate the development of software projects facing complex domains. Intertwining design and development practice, this book incorporates numerous examples based on actual projects to illustrate the application of domain-driven design to real-world software development. Readers learn how to use a domain model to make a complex development effort more focused and dynamic. A core of best practices and standard patterns provides a common language for the development team. A shift in emphasis--refactoring not just the code but the model underlying the code--in combination with the frequent iterations of Agile development leads to deeper insight into domains and enhanced communication between domain expert and programmer. Domain-Driven Design then builds on this foundation, and addresses modeling and design for complex systems and larger organizations.Specific topics covered include:
Getting all team members to speak the same language Connecting model and implementation more deeply Sharpening key distinctions in a model Managing the lifecycle of a domain object Writing domain code that is safe to combine in elaborate ways Making complex code obvious and predictable Formulating a domain vision statement Distilling the core of a complex domain Digging out implicit concepts needed in the model Applying analysis patterns Relating design patterns to the model Maintaining model integrity in a large system Dealing with coexisting models on the same project Organizing systems with large-scale structures Recognizing and responding to modeling breakthroughs With this book in hand, object-oriented developers, system analysts, and designers will have the guidance they need to organize and focus their work, create rich and useful domain models, and leverage those models into quality, long-lasting software implementations.

560 pages, Hardcover

First published August 20, 2003

Loading interface...
Loading interface...

About the author

Eric Evans

30 books142 followers

Ratings & Reviews

What do you think?
Rate this book

Friends & Following

Create a free account to discover what your friends think of this book!

Community Reviews

5 stars
2,352 (42%)
4 stars
1,986 (36%)
3 stars
860 (15%)
2 stars
213 (3%)
1 star
87 (1%)
Displaying 1 - 30 of 299 reviews
Profile Image for Einar.
35 reviews19 followers
April 19, 2015
This book is impossible to rate.

The ideas in this book are incredibly useful, and I am grateful to the author for sharing them with the software development community. In this perspective, not reading this book borders on professional negligence.

Unfortunately, I find the writing practically impenetrable. There are so many quaint and opaque verbs and adjectives that never get defined or even justified. Does "tightening" make a model "richer" and/or "deeper"? What about "enriching"? Is either one distinct from "distilling"? Is a "sharp" design always "supple" and vice versa? Could you "sharpen" a model too, or does it only apply to designs? What is it about the nature of domains that makes "carve off" a suitable description of what you do when you separate out a subdomain? What does it mean for knowledge to be "crunched"? There are so many vague terms, so many implied metaphors! Why? I am convinced that it would be possible to present these terrific ideas in a much more -ah- "distilled" form. With a "tighter" vocabulary. As it is, I am using a high-concentrate mixture of willpower and espressos to force my way through because I need the insights buried underneath the text.

The book also suffers from poor editing. There is quite a bit of redundancy, and some discussions lack focus. Many of the introductions or summaries to chapters could have been cut in their entirety. I've even found the same sentence repeated just a few paragraphs apart - something that just a single alert proofreader capable of focusing throughout the text should have caught. But it *is* hard to keep that focus.

It is a crying shame, since the underlying ideas and intentions are so good.

Profile Image for Sandy Maguire.
Author 3 books176 followers
July 11, 2020
For some reason this book is greatly beloved in programming circles. I can't tell if that's because the people doing the beloving are die-hard Java Enterprise programmers, or if I'm just missing something here. But I think it's the former.

Domain-Driven Design is an excessively dry, boring book whose main thesis seems to be "make sure everybody agrees on what terminology is being used." What could have been this one sentence is instead 650 pages, chocked full of UML diagrams and insipid discussions about shipping containers. And that's saying something, coming from a guy who reads excessively dry boring math and engineering books on the regular.

If I had to be charitable, I would say that this book is independently groping towards functional programming without knowing it, and trying to shoehorn the ideas into an OOP-mindset. There is a lot of potential here for things to like, but it ultimately falls short. If you've only ever coded in Java, or frequently sketch UML diagrams, this might be the book for you. And if so, may god have mercy on your soul.
Profile Image for Alexander Petrov.
5 reviews17 followers
January 23, 2020
Amazing book!

Every programmer must read it! As well as Pragmatic Programmer by Dave Thomas and Andy Hunt and Refactoring by Martin Fowler.

There are many books tells you to separate domain logic from other parts like UI and Persitence, because it is the most valuable part of application and you should be able to make changes as quick, as your business changes and as your understanding of domain improves.

But! There are very few books about how to design domain layer of your application!

This is the first of and The Best one!

It is very easy to read DDD, because of excellent language of Eric Evans. Every pattern and principle goes with clear example from real authors practice.

One of my favourite points in the book, that you can never make all requirements and design upfront and write all code right after, unless you are working on very small application, or(and) requirements are as clear as the periodic table of Dmitry Mendeleev. That is because only the code reflects your current understanding of domain model and gives you deeper understanding of directions of improving your model and UBIQUITOUS LANGUAGE. Clear justification of this point is in the book!

I can recommend DDD to every programmer, even with small experience.

The world would be much better if every project (especially enterprise) and product manager also read this book! But unfortunately it is utopia:(

The earlier you read it the happier professional you will become!
Profile Image for Luboš.
434 reviews56 followers
June 13, 2018
It is a quite famous book but I did not enjoy it. I finished the book just because we had been reading it together with my colleagues. There are several interesting poinst but otherwise it is too long. Indeed, summary at InfoQ is available.
Profile Image for Barbara Krein.
12 reviews
October 31, 2019
A good book to read for any coder. The ratio of time spent reading vs. writing is well over 10:1.
Profile Image for Melika Barzegaran.
10 reviews6 followers
February 17, 2021
I'd heard about domain-driven design and had read about that here and there, and I wanted to know more. So, I picked up this book.

Disappointingly, reading it was a very painful experience. Ideas were scattered and lacked focus. Examples were unnecessarily complicated and lacked enough context to be educational. Sentences were repeated and repeated again without adding much value. The whole idea of the book could be simply presented in a blog post.

If you're like me and want to know more about domain-driven design, just read some blog posts on the topic, or watch some recordings of conferences regarding the concept. It saves your time and you can learn much more.
Profile Image for Stijn.
71 reviews
November 11, 2021
Ironic how a book that advocates concise documentation and diagrams over text looses itself in way too much narrative. The ideas in this book are good, but it could have easily been half as long. It keeps on repeating itself in long paragraphs, full of vague terms.
The used examples are realistic (all coming from real projects), but sometimes lacked context to understand the reasoning that was applied to apply the patterns.
Profile Image for Andreea.
46 reviews18 followers
April 9, 2013
While reading this book I complained a lot about the author repeating the same ideas supported by different examples. However, I really enjoyed reading it and I feel I gained a lot of knowledge about designing software applications. Of course, this knowledge is purely theoretical, but we all have to start somewhere.

One thing I really appreciated is that the author doesn’t isolate the design and development part from the human interaction. One has to know the team members’ skills and employ them as efficiently as possible in the software development process. The main idea he tries to promote is knowing your domain and making your code express that domain.

This book does not offer recipes for designing and developing software applications, but provides a series of guidelines that one can follow and/or adapt to a certain project.

I think it’s quite a valuable book to read, although it might arise some developer mixed feelings about the author giving exhaustive examples and explanations in some cases. It is always a pleasure to read a book that has behind it a lot of experience in software development and also in applying domain driven design principles throughout one’s work.
Profile Image for Sebastian Gebski.
1,061 reviews1,083 followers
February 3, 2013
Actually, it's the 2nd time I've read that book. After the 1st time I was quite happy with what I've received - I've generally agreed to author's approach, even more: I've found it rather obvious ("so not a big deal") - I'd do pretty much the same in the example cases, I agree that those design decisions are more reasonable, etc.

Some time has passed, I've discussed DDD with several people on several occassions and I think now I got the value of this book: author does not only gives you the example of good design, but he provides you the rules / formulas how to achieve that. I didn't see that when I was reading DDD for the first time, because I'm doing design "automatically" / intuitively, so I've never really needed those rules (and I've ignored them, to put it bluntly).

But I have a problem with teaching people how to make a good design, how to make a difference between snapshotting reality and making a proper model. And here's where this book really excels, this is the first book I've seen that actually CAN make reader a better designed. Very recommended.
Profile Image for Tom.
50 reviews5 followers
October 29, 2009
Great, great book. However, you should probably have at least some understanding of agile, design patterns, and refactoring before reading this book if you truly want to get the most out of it. The book talks about using model-driven design to create a domain model and ubiquitous language that everyone in the company can leverage - a topic that seems to be getting more attention as of late.

Some of the topics are pretty abstract, and I would have liked to see some more code and concrete examples for some of them. Nonetheless, I encourage all programmers to at least read chapters 1-3, 5, 6, 9, 10, and 14.
4 reviews
March 12, 2016
Please take this with grain of salt; most of my reading of this book was fast reading.

What I like about this book is that there is a genuine trial to bring examples to the various concepts. This is done throughout the book.

What I don't like:
- Too much repetition and too verbose
- I feel that the statements are structured in a way that makes it really hard for fast reading
- Even with examples, sometimes I feel it's too much theory
Profile Image for Jan.
83 reviews9 followers
November 26, 2016
Bardzo ważna, ale niestety równie fatalnie (a przynajmniej nieprzystępnie) napisana książka - językowo blisko jej do pracy naukowej. Na pewno nie na początek z DDD.
Profile Image for Vlad Ardelean.
152 reviews30 followers
June 16, 2021
Far too long, generic to the point where it doesn't really say anything, ideas in it are not too far from trivial.

There are a lot of positive reviews for this book, and I started reading it because I saw them, and because I also saw recommendation for this book in a lot of other books that I read. However now that I finished it, I think it is the most overrated book I read.

So why am I so different from the majority here? Why do I consider this book to be a waste of one's time, when so many smart people think it's good?

The good:
I think this book is "a classic" in the sense that when it was written, 16 years ago (wild speculations coming up), I am imagining these types of phenomena were going on:
1. Java was a new thing
2. Big systems are built with Java
3. Big systems require architects
4. Software architecture was a category which sold books quite well
5. It's possible a lot of people were writing stuff about UML and concrete patterns

...so this book was written on a niche topic, in a niche way, so to stand out form the crowd.
1. Topic = "the domain model"
2. The way = "be very generic, talk about things in new ways, talk about very high level things, and about things other people aren't writing". I am a big fan of talking concretely, so I will explain these terms. By "talk about things in new ways" I mean that he wrote about the good old factory pattern, but also introduced 2 accompanying concepts: services and repositories. Sure, one could argue a lot about whether those could be considered factories or not. I don't have a strong opinion, but I like the distinction, even though those 3 concepts do resemble a lot. In any case, the discussion about factories/services/repositories is one which, in my opinion, is just a way to fill up a book with text that brings very little value. You must understand that the author spends dozens of pages comparing these 3 concepts in a way I'll call innovative repetition: He does say the same thing, he just uses slightly different words. Also each time he does it, he presents slightly more information, which he then repeats in subsequent paragraphs. The guy's an artist at this, but I was neither expecting nor wanting to read a book for the artistic impact it might have on me.
Same thing for "talking about very high level things": here the author talks about "large scale structures". He talks about frameworks, system metaphors, bounded contexts, conformist pattern, anticorruption layers and more stuff like this. This might have brought some fresh air into the discussions in 2005, but for some reason, I find very little value here for anyone. The value of these ideas is the same value a fish would get, when another fish told it they were living in water. Sure, it's kind of mind-blowing to realise that layers are a choice, that duplicating work is not necessarily bad, and that it's good to have some (any!) way of talking about your system, but really it's very far from an actionable idea. Maybe this book would be good for people who haven't studied communication, and haven't really thought about how to present software systems to other people. But if I could use an analogy, the value of these ideas is like the first time someone invented a city name place. Sure, it's a very useful thing for someone coming into the city, to know the city name, but it's far from groundbreaking.

Let me randomly write here about some ideas I found interesting. I took a lot of notes, but a lot of them are to refute the idea. Anyway:
1. To make the domain less complicated, functions/methods should take as parameters, or return either simple things (basic data types) or instances of the class defining that method. Example: `colour3 = colour1.mixWith(colour2)`.
2. Side-effect-free functions are good (that's almost common knowledge nowadays)
3. If you mutate state with a function, surround the mutation with `assertions`. Good practice really!
4. Read the book "Analysis Patterns" (Martin Fowler)
5. Apparently "good developers" tend to use their skills in setting up infrastructure, whereas the less skilled ones end up working on the domain. Does seem familiar, yes.
6. Sometimes architecture can impact a project negatively. It can lead to "developers fighting architects". Not too interesting, but does make some sense.
7. Layers: Potential, Operational, Commitments (contractual), Policies (legal requirements/business decisions), Decision support (analytics). Good ideas!
8. To give a large system some structure, one could apply "softer" or "harder" constraints on it. Going from soft to hard: System metaphor (a story about what that component is supposed to do), Layers, Pluggable component framework.

Some additional aspects worth mentioning: Maybe, just maybe, the patterns in this book have influenced the industry so profoundly, that I can't even realise it. Examples:
1. People paying attention to the domain might have influenced the move towards microservices. Maybe this is how people of 2021 are trying to implement bounded contexts.
2. The repository pattern is very widespread now. Sure, it's kind of a trivial pattern if you look at it with from 2021, but maybe 20 years ago people were structuring their codebases totally differently. I wouldn't know. Maybe the ORMs were supposed to be "the domain" layer, but they're definitely not JUST what the author describes, as they contain both business and persistence logic.

So I can understand that there could be people who get value out of this, but I personally have not gained too much. You should also know that I was struggling really hard to write positive things about the book. I went through all ~100 notes to find good ideas, and all I found good is listed here. I did NOT go through my notes to write about the bad/ugly parts, so maybe this review is too positive.

The bad:
More bad stuff: The author prepares the stage a lot for concepts he'll eventually exemplify. A lot of times however, the code doesn't seem to prove his point too much. He realises that, and ends sub-chapters with advice like "this is no silver bullet, you'll have to experiment for yourself, this problem rarely helps". That's fair as a disclaimer, but most of the time I found the concepts to be so vague and examples so useless that I wondered if really they were worth reading about. I'm sure a lot of intelligent people already realise that experimentation is useful, and situations tend to be unique. It feels like he's not doing too much above "preaching to the choir".

The ugly:
1. Wordpres! It just got 40% of the CMS market recently. Developers I talked to say it's one of the ugliest pieces of software ever written. It's horrible to be a developer and work on that. The value of this book is highly arguable when you see someone literally urinating on top of all software architecture literature, and then being rewarded by the market for it. Someone please correct me if I'm wrong.
2. django! One of the many web frameworks which uses fewer layers than this book would suggest. People use it, it's fine, it works for small/medium websites just fine!

You never get a feeling of how bad/good something is from this book. You just get qualitative "this is a better way" comparison. I'm getting the feeling that if the author would have honestly evaluated the advice he gave, this book wouldn't be nearly as famous. As it is, I think he simply uses scare tactics, to frighten people into "architecting everything". I would have loved it to read things like: "In 2-people teams, working for 3 years on a project, you don't need any large scale architecture", "in a 20-people team working for 10 years, you will find it highly desirable to use system metaphors", or "When the domain comprises less than 50 entities, you're fine to not use any patterns". My remarks might be trivial, yes, but I don't think enough people realise the scale at which you have to begin fearing the software. This creates a large gap in the heads of beginners between theory and reality. I think even beginners should realise that if you want to travel 2 meters, you walk on foot, but if you need to travel 3k kilometers, you take the airplane. This information is missing, and I think authors might be purposefully over-selling their airplane-ideas, hurting the industry and enriching themselves - maybe I'm too paranoid, but there it is. Would authors have an incentive to over-sell their skills? Yes! Should they address the conflict of interest? Yes. Did the author of this book address the issue? No....

I do not recommend this book.
Profile Image for سامح دعبس.
187 reviews53 followers
September 5, 2020
معلومات الكتاب
--------
الكتاب يعرف أيضا بالكتاب الأزرق (The blue book)
اسم المؤلف: إريك إيفانز Eric Evans
دار النشر: Addison-Wesley Professional
سنة النشر: 2003
عدد الصفحات: 563
التقييم: 4 من 5
المستوى: متقدم
.
موضوعات الكتاب
----------
هذا هو الكتاب المؤسس للـ Domain-Driven Design وأول كتاب أُلف في الموضوع، وأفكار الكتاب هي امتداد لأفكار أخرى مثل الـ Object-Oriented Design و الExtreme Programming وال Design By Contract وال Analysis Patterns وغيرها.
الهدف من الDomain-Driven Design هو السيطرة على هذه التعقيدات والصعوبات المصاحبة لعملية صناعة البرمجيات. كيف ذاك؟
بالتركيز على مجال العمل (Business Domain) وعزله عن المجالات المصاحبة أو المساعدة، وكذلك عزله عن اللوازم التقنية الضرورية للنمذجة، أي تحويل مجال العمل إلى برنامج. وهذه النمذجة هذه هي الفكرة الأولى في الDomain-Driven Design، ويمكن تسميتها الDomain Modeling، وامتداد هذه الفكرة هو استخدام نموذج واحد في التحليل والتصميم وتطبيق هذا النموذج في التنفيذ (الكود)، وهذه الفكرة تسمى Model-Driven Design.
ولإيجاد هذه النموذج الموحد، وجدت الحاجة لإيجاد لغة موحدة في التواصل بين المطورين والمحللين والمتخصصين في المجال (Domain Experts) وكل ذوي العلاقة بالمشروع، وهذه اللغة تستخدم كذلك في جميع الوثائق المتعلقة بالمشروع وفي الكود والشاشات وفي كل مكان ذي صلة بالمشروع، وهذه يمكن تسميتها Ubiquitous Language (وتنطق هكذا يوبيك-وي-طاص). وهذه في الفكرة الثانية في الـ Domain-Driven Design.
الفكرة الثالثة هي التدرج والتواصل المستمر بين كل ذوي العلاقة بالمشروع لفهم مجال العمل وتحسين نموذج البرنامج وعمليات التصميم والتطوير.
هذه هي الأفكار الرئيسية في الجزء الأول من الكتاب، ومنها انبثقت بقية أفكاره.
في الجزء الثاني من الكتاب توسع المؤلف في الModel-Driven Design، فتحدث عن فكرة فصل أو عزل نموذج مجال العمال (Business Domain) ثم استعرض أنماط التصميم (Design Patterns) ذات الصلة مثل الEntities و الValue Objects وال Aggregates و ال Repositories وغيرها، وهذه الأنماط مشهورة وشائعة في أدبيات الDomain-Driven Design، حتى يظن كثير من الناس أن أنماط التصميم هذه هي ال Domain-Driven Design، وهذا من الأغلاط الشائعة، في حين أن كل الحديث عنها لم يتجاوز ثلاثة فصول من الكتاب من أصل 17 فصلا! من الأغلاط الشائعة أيضا الاعتقاد أن الDomain-Driven Design لا تطبق إلا عن طريق ال Object Oriented Programming/Design - كما قد توحي أنماط التصميم هذه، وهذا خطأ أيضا، فأي طريقة تؤدي إلى إيجاد نموذج موحد يمكن تطبيقه برمجيا جاز استعماله، ومن هذه النماذج: الWorkflow أو الـ Rule Engines، ومؤخرا صار التنفيذ باستخدام الfunctional paradigms شائعا أيضا.
الجزء الثالث من الكتاب هو الذي استمتعت به أكثر شيء، ويتكلم عن ضرورة فهم مجال العمل ووسائل تحقيق هذا الفهم، وأهمها التدرج والتحسين أو إعادة البناء المستمر (continuous refactoring)، ولا يُكتفي بذلك في الكود فقط، بل في نموذج مجال العمل أيضا (model refactoring)، إضافة إلى مبادئ نافعة في تصميم البرمجيات.
وفي الجزء الرابع والأخير، يتكلم الكتاب عن مبادئ التعامل مع مجالات العمل الضخمة، بالغة التعقيد، والتي تتطلب تكامل بين أنظمة وفرق مختلفة. ولا يُذكر التكامل إلا و يذكر معه تقاطع التقنية مع السياسة! ومن الأفكار التي وردت في هذا القسم: تقسيم مجال العمل إلى مجالات أساسية (Core Subdomain) ومجالات فرعية، وتطبيق ذلك على الBounded Contexts أو مجال تطبيق اللغة المشتركة المذكورة آنفا، وال Context Maps أي العلاقة بين الBounded Contexts المختلفة، وما يتفرع عن هذه الأفكار - وهو كثير، حيث يستغرق هذا الجزء وحده أكثر من ثلث الكتاب! -، وكذلك الكلام على التدرج في المعمارية (Evolutionary Architecture) - وإن لم ترد بهذا الاسم في الكتاب -
.
ملاحظات عامة على الكتاب
------------
المؤلف يحكي الكثير من التجارب الشخصية الناجحة والفاشلة وهذا يعطي مصداقية لكلامه.
الكتاب يبدأ بالتفاصيل ثم يتدرج للصورة الكلية (bottom-up) لكن أهمية الأفكار في الكتاب - من وجهة نظري -هي بعكس هذا الترتيب.
الكتاب دسم جدا ومليء بالأفكار الملهمة، ولذلك لا يصلح للمبتدئين، وعلى الرغم من ذكره بعض الأمثلة التطبيقية لكنها لا تكفي لتمكينك من تطبيق كل هذه الافكار بنفسك.
.

اقتباسات من الكتاب
----------
Manufacturing is a popular metaphor for software development. One inference from this metaphor: highly skilled engineers design; less skilled laborers assemble the products. This metaphor has messed up a lot of projects for one simple reason—software development is all design. All teams have specialized roles for members, but over-separation of responsibility for analysis, modeling, design, and programming interferes with MODEL-DRIVEN DESIGN.
Profile Image for Marcel.
Author 2 books7 followers
November 26, 2016
very valid concept
but, omg, so painful to read
I am not sure what is wrong with it, but I just couldn't finish it. It's boring, long-winded and just hard work...
I can't really recommended. I mean the concepts are all valid, but I'd rather go for a summary...

I am not sure this topic justifies 516 pages...

For those who are interested, this goes will with
Implementing Domain-Driven Design

And this seems to be a shorter summary (though I have not read it yet myself):
Domain-Driven Design Distilled
Profile Image for Vlad Ardelean.
152 reviews30 followers
November 15, 2023
Far too long, generic to the point where it doesn't really say anything, ideas in it are not too far from trivial.

There are a lot of positive reviews for this book, and I started reading it because I saw them, and because I also saw recommendation for this book in a lot of other books that I read. However now that I finished it, I think it is the most overrated book I read.

So why am I so different from the majority here? Why do I consider this book to be a waste of one's time, when so many smart people think it's good?

The good:
I think this book is "a classic" in the sense that when it was written, 16 years ago (wild speculations coming up), I am imagining these types of phenomena were going on:
1. Java was a new thing
2. Big systems are built with Java
3. Big systems require architects
4. Software architecture was a category which sold books quite well
5. It's possible a lot of people were writing stuff about UML and concrete patterns

...so this book was written on a niche topic, in a niche way, so to stand out form the crowd.
1. Topic = "the domain model"
2. The way = "be very generic, talk about things in new ways, talk about very high level things, and about things other people aren't writing". I am a big fan of talking concretely, so I will explain these terms. By "talk about things in new ways" I mean that he wrote about the good old factory pattern, but also introduced 2 accompanying concepts: services and repositories. Sure, one could argue a lot about whether those could be considered factories or not. I don't have a strong opinion, but I like the distinction, even though those 3 concepts do resemble a lot. In any case, the discussion about factories/services/repositories is one which, in my opinion, is just a way to fill up a book with text that brings very little value. You must understand that the author spends dozens of pages comparing these 3 concepts in a way I'll call innovative repetition: He does say the same thing, he just uses slightly different words. Also each time he does it, he presents slightly more information, which he then repeats in subsequent paragraphs. The guy's an artist at this, but I was neither expecting nor wanting to read a book for the artistic impact it might have on me.
Same thing for "talking about very high level things": here the author talks about "large scale structures". He talks about frameworks, system metaphors, bounded contexts, conformist pattern, anticorruption layers and more stuff like this. This might have brought some fresh air into the discussions in 2005, but for some reason, I find very little value here for anyone. The value of these ideas is the same value a fish would get, when another fish told it they were living in water. Sure, it's kind of mind-blowing to realise that layers are a choice, that duplicating work is not necessarily bad, and that it's good to have some (any!) way of talking about your system, but really it's very far from an actionable idea. Maybe this book would be good for people who haven't studied communication, and haven't really thought about how to present software systems to other people. But if I could use an analogy, the value of these ideas is like the first time someone invented a city name place. Sure, it's a very useful thing for someone coming into the city, to know the city name, but it's far from groundbreaking.

Let me randomly write here about some ideas I found interesting. I took a lot of notes, but a lot of them are to refute the idea. Anyway:
1. To make the domain less complicated, functions/methods should take as parameters, or return either simple things (basic data types) or instances of the class defining that method. Example: `colour3 = colour1.mixWith(colour2)`.
2. Side-effect-free functions are good (that's almost common knowledge nowadays)
3. If you mutate state with a function, surround the mutation with `assertions`. Good practice really!
4. Read the book "Analysis Patterns" (Martin Fowler)
5. Apparently "good developers" tend to use their skills in setting up infrastructure, whereas the less skilled ones end up working on the domain. Does seem familiar, yes.
6. Sometimes architecture can impact a project negatively. It can lead to "developers fighting architects". Not too interesting, but does make some sense.
7. Layers: Potential, Operational, Commitments (contractual), Policies (legal requirements/business decisions), Decision support (analytics). Good ideas!
8. To give a large system some structure, one could apply "softer" or "harder" constraints on it. Going from soft to hard: System metaphor (a story about what that component is supposed to do), Layers, Pluggable component framework.

Some additional aspects worth mentioning: Maybe, just maybe, the patterns in this book have influenced the industry so profoundly, that I can't even realise it. Examples:
1. People paying attention to the domain might have influenced the move towards microservices. Maybe this is how people of 2021 are trying to implement bounded contexts.
2. The repository pattern is very widespread now. Sure, it's kind of a trivial pattern if you look at it with from 2021, but maybe 20 years ago people were structuring their codebases totally differently. I wouldn't know. Maybe the ORMs were supposed to be "the domain" layer, but they're definitely not JUST what the author describes, as they contain both business and persistence logic.

So I can understand that there could be people who get value out of this, but I personally have not gained too much. You should also know that I was struggling really hard to write positive things about the book. I went through all ~100 notes to find good ideas, and all I found good is listed here. I did NOT go through my notes to write about the bad/ugly parts, so maybe this review is too positive.

The bad:
More bad stuff: The author prepares the stage a lot for concepts he'll eventually exemplify. A lot of times however, the code doesn't seem to prove his point too much. He realises that, and ends sub-chapters with advice like "this is no silver bullet, you'll have to experiment for yourself, this problem rarely helps". That's fair as a disclaimer, but most of the time I found the concepts to be so vague and examples so useless that I wondered if really they were worth reading about. I'm sure a lot of intelligent people already realise that experimentation is useful, and situations tend to be unique. It feels like he's not doing too much above "preaching to the choir".

The ugly:
1. Wordpres! It just got 40% of the CMS market recently. Developers I talked to say it's one of the ugliest pieces of software ever written. It's horrible to be a developer and work on that. The value of this book is highly arguable when you see someone literally urinating on top of all software architecture literature, and then being rewarded by the market for it. Someone please correct me if I'm wrong.
2. django! One of the many web frameworks which uses fewer layers than this book would suggest. People use it, it's fine, it works for small/medium websites just fine!

You never get a feeling of how bad/good something is from this book. You just get qualitative "this is a better way" comparison. I'm getting the feeling that if the author would have honestly evaluated the advice he gave, this book wouldn't be nearly as famous. As it is, I think he simply uses scare tactics, to frighten people into "architecting everything". I would have loved it to read things like: "In 2-people teams, working for 3 years on a project, you don't need any large scale architecture", "in a 20-people team working for 10 years, you will find it highly desirable to use system metaphors", or "When the domain comprises less than 50 entities, you're fine to not use any patterns". My remarks might be trivial, yes, but I don't think enough people realise the scale at which you have to begin fearing the software. This creates a large gap in the heads of beginners between theory and reality. I think even beginners should realise that if you want to travel 2 meters, you walk on foot, but if you need to travel 3k kilometers, you take the airplane. This information is missing, and I think authors might be purposefully over-selling their airplane-ideas, hurting the industry and enriching themselves - maybe I'm too paranoid, but there it is. Would authors have an incentive to over-sell their skills? Yes! Should they address the conflict of interest? Yes. Did the author of this book address the issue? No....

I do not recommend this book.
Profile Image for Casper Weiss Bang.
39 reviews4 followers
November 18, 2022
A must read for software engineers. There are probably a ton of better reviews than I can ever write. The initial 100~ pages are must reads. And the further you get in the book the more okay (in my opinion) it is to skip a chapter. It could probably have been two books, as the latter parts are more specific patterns and practices. I am glad i read it and even though I skipped parts of the end, I imagine I'll reread those either when specifics might be of interest (as a compendium) or when i just feel it's worth to reread, which i assume i will someday.
Profile Image for David.
878 reviews48 followers
September 18, 2012
Been reading this on and off for a while now. I would put this on the "must read" shelf of anyone involved in the development side of software engineering, including programmers, designers, architects, even development managers. It presents a lot of important points and topics that some developers sort of know or understand but never clearly defined and put forth. There are best practices on patterns, approaches to design and development, architecture, and communication.

It takes OO development up to a new level, expanding on the generic technical ideas into the realm of domain knowledge. It's about closing the gap of understanding between business users, project owners, and and the developers.

The concepts presented take some time to absorb and are best learned when put in actual practice. It's not easy to digest but as you glean bits and pieces there, sometimes it's like, "I know doing this way always felt right", and now the book explains why it felt right. Some of the explanations are rather abstract (there are very specific examples throughout the book) for things that are hard to define, so I'd say I found it difficult to relate to things where I had no practical experience. Still, I come away from this book with a good understanding of the benefits of placing high importance on the correctness and representational value of domain model.
10 reviews
January 6, 2013
Excellent software engineering book. It presents a working strategy for writing and organizing software code in classes and packages in a clean and usable environment. The book presents a "common language" concept that improves communication between team members and between the team and stake holders. It presents strategies for managing code by associating class names and packages with specific functionalities, proving and common understanding of what-goes-where for a team working with domain driven design (DDD).

We have been working with DDD in our team increasingly over the last 6 months. Together with Domain-Driven Design Quickly (which we use as our quick guide) the book by Eric Evans provides excellent value for us. By helping us with create a common understanding of what different concepts, like service, model, value object etc, means to our team, we can make our code a lot better organized. By incorporating concepts from the DDD book, for example stateless services, domain objects and root aggregates we improve our code quality as well.
Profile Image for Miloš.
67 reviews3 followers
November 27, 2019
Initially I decided not to write a review since I found a bunch of people who shared my impressions of the book and whose reviews put those impressions to words in a far more eloquent and analytical manner than I ever could but in the end it feels a shame not to say anything.

All in all, DDD was in many ways a great read, worthy of its highly lauded cult status - the ideas it presented, especially at the time of its writing, were almost groundbreaking. To top it off, the methodology it proposes seems as valid as ever so in that regard it's aged quite well (or our profession hasn't matured enough or maybe a bit of both).

Where it hasn't aged so well is the writing. At times it felt so dry and abstract and repetitive that I had to re-read whole paragraphs when the examples section came around because I've forgotten what the examples were about to demonstrate. I also quickly learned not to bother if I wasn't at the top of my game concentration-wise. While DDD is definitely a complex topic, it definitely isn't more complex than others I've read about but it certainly felt so...

So there it is, my 2¢. You'll excuse the lack of potatoes though.
Profile Image for Erika RS.
767 reviews237 followers
December 29, 2012
See elsewhere for my more detailed summary.

The short summary is that Domain-Driven Design is a great book for any programmer or software designer who wants to deepen their ability to model application domains. Evans describes why domain modelling is important and sets out a number of patterns for achieving better models. He has a good grasp of real world complexities and, because of that, insists that a model must be implementable if it is to be successful. Any overlap between the model and the implementation should be identical or the model will become obsolete.

Evans provides a number of patterns to help determine the best domain model for an application. These patterns range from the abstract to the concrete, from the brilliant to the pedantic. Overall, I highly enjoyed the book although, at just over 500 pages, I am glad that I had a reading group to work through it with.
Profile Image for Rahul Gupta.
43 reviews1 follower
November 30, 2018
I didn't like the author's style of writing/explaining.
Things were repeated and even after reading more than a hundred pages, the only thing I understood was that, developers and software architects should use domain language to discuss about the project, build diagrams and, write code. At the same time, domain experts should talk code.
Having the common language between developers and domain experts reduces the amount of errors while developing and the overall product becomes better.

The book failed to grip my attention and maybe I'll read it again in the future.

I feel that a blog article would be enough for whatever is there in the book of over 400 pages.
112 reviews
December 16, 2018
A lot of the concepts from this book should be obvious to an experienced software developer. Despite this, it was an important read.

The book is too lengthy, so I scanned it from time to time. I also supported my reading with browsing the ideas from the book on the internet.
Profile Image for Kiril Kirilov.
110 reviews14 followers
May 15, 2017
This book contains some interesting conceptions/terms. Like - Entity, Value Object, Closure of Operations, Repository, side effect free function, Core Domain, Bounded Context.
Profile Image for Aron.
16 reviews6 followers
September 16, 2023
I read this book over the course of three years, making it hard to retain every piece of valuable insight contained within. Even so, the books was almost continuously on my mind, and it has permanently changed my perspective on software development. While some of the content is noticeably outdated, with some of the finer technical details not strictly true anymore, the principles remain relevant and clear in today's landscape. Several of the patterns have instantly given me clear and useful ideas on how to refactor code in projects I've been working on. I highly recommend this book to anyone working in software engineering, and I look forward to reading what I guess you might call a spiritual successor, Learning Domain-Driven Design: Aligning Software Architecture and Business Strategy.
Profile Image for Rezaul Karim Sajib.
18 reviews9 followers
October 21, 2018
This book is the bible for the software engineers. It' clearly changes the thinking perspective of every software engineer. Even though it is a "must read"book for developers who are willing to implement the domain driven design in their application, but in my opinion, others can also hugely benefitted from this book. I cannot give full 5 stars because this book can have more elaborated examples and it is hard to understand some of the concepts for less experienced developers. Nevertheless, I highly recommend every software engineer to read this book.
September 16, 2022
The content of the book is a MUST read for every TechLead/ software architect or anyone who builds larger software systems.
Yet, Eric‘s choice of words comes across very academic and sometimes hard to follow along. I had passages in the book that were really hard to read which is why it took me a few months with a lot of long pauses to make it through the book.
Displaying 1 - 30 of 299 reviews

Join the discussion

Can't find what you're looking for?

Get help and learn more about the design.