This book addresses the topic of software design: how to decompose
complex software systems into modules (such as classes and methods)
that can be implemented relatively independently. The book first
introduces the fundamental problem in software design, which is
managing complexity. It then discusses philosophical issues about
how to approach the software design process, and it presents a
collection of design principles to apply during software design.
The book also introduces a set of red flags that identify design
problems. You can apply the ideas in this book to minimize the
complexity of large software systems, so that you can write
software more quickly and cheaply.