What do you think?
Rate this book


480 pages, Kindle Edition
Published November 27, 2019
Things that change at the same rate belong together. Things that change at different rates belong apart.As the book progresses, however, this seems to be largely forgotten, and instead the design of a project takes up most of the narrative. This part was more interesting, although it was too long, and there were too many deus-ex-machina rescues.
This book has an offbeat sense of humor and seems to take its terminology from much earlier in computers, say the 1980s and 1990s, but that doesn't prevent it from having interesting ideas that apply today.
The prime directive of the book is "Never design to the requirements" (which is unfortunately stated as "Never design against the requirements", implying its near opposite). Instead, assume that requirements are partial and under-specified, and design architectures that can contain use cases matching the requirements, use cases resembling the requirements, reasonable extrapolations, etc.
Using this approach, you can designate coarse blocks that capture what's needed in terms of resources, resource access, engines (core blocks of business logic), managers (which coordinate engines and resource access, and sending messages to other managers), utilities, and clients. Designating these correctly will yield systems and subsystems which will change independently with volatility in requirements across changing needs over users and time.
The manager/engine distinction is missing from other recent books about software architecture, particularly those on domain-driven design, which seem to be all about managers but very little about engines and the core design of the domains.
Despite the apparent strangeness of attempting to architect the system and project plant, including estimates the whole project, upfront, there is still a usefully agile set of ideas hidden here. Effectively, you can reduce the scheduled time through also investing more in interfaces that allow parallel development (compression) and reduce the risk of that schedule slipping by adding slack time back to the project (decompression). The overall effect it to enable a more agile parallel development between teams by asking what communication allows concurrent learning.
Overall, this book presented a really different point of view than many other software engineering books, one that I usually disagreed with on trivial points but agreed with on the fundamental value of creating architectures that allow continued development from ongoing learning while usefully shaping it.