I distinctly recall the first class I taught in software design, in 1980. One student from that course is now a computer science (CS) professor and department head at a major college in Tel Aviv. This anecdote, with its dating, is relevant to this book. It is well known that a great productivity disparity exists between the best programmers and average programmers. This book claims to help solve the issue; however, I do not believe it does anything toward this goal. Has software design advanced since 1980? The book gives no references; this review does, but those herein date from the period of that first course.
This book is frankly a conundrum and vaguely disconcerting. While I pretty much agree with most of what the author says, I totally disagree with what he says in the preface and some of the first chapter, “Introduction,” where he “justifies” why he wrote the book:
[B]ut the core problem of software design is still largely untouched. David Parnas’ classic paper “On the Criteria to be used in decomposing Systems into Modules” appeared in 1971, but the state of the art in software design has not progressed much beyond that paper in the ensuing 45 years.
It is far from “untouched.” The author seems woefully ignorant of the professional literature. There have been hundreds of articles published since Parnas, and myriad books. The author does not cite any of them. As a matter of fact, he cites nothing.
The title states “a philosophy,” which implies that the book supplies a coherent set of overriding principles. The book does not supply a philosophy. The title states “of software design.” The book supplies a limited, and mostly old, set of coding techniques for beginning programmers, for example, those in a first-year course on basic coding techniques.
All, or nearly all, of these techniques can be found in Bergman and Bruckner’s  and Don Knuth’s  classic textbooks (except for the languages in which they are expressed). In addition, the basic concepts of software design--which, again, the author does not really cover here--can be found in Constantine and Yourdon’s classic textbook . I intentionally revert here to some of the first texts on these subjects, though many have appeared since, of course. And certainly, if Parnas’ wonderful article is “described” (but unfortunately not cited), then Niklaus Wirth’s paper  must also be cited. He at least actually dealt with a design technique (though still only a technique for program design and not for software design, which can and should be properly differentiated). Again, Ousterhout does not so differentiate, and this is critical to beginners--for whom this book might have proved worthy.
In a certain sense, I can see the book being useful to someone who is teaching a first-year course in computer programming for the first time. It would probably be useful when creating the first set of slides for the course--though I would be leery of revealing to the students where they came from, as the book can be misleading for those first starting out. Had the book been (at least) better organized, it might also be suitable for students. This book is borderline dangerous and should not be distributed to the inexperienced without heavy caveats.
More reviews about this item: Amazon, Goodreads