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.