Systems Thinking - Managing Complexity and Chaos by Jamshid Gharajedaghi
This book is a cornucopia of ideas, patterns, and solutions for looking at complex systems and creating order and structure throughout them. It's a book about organizing businesses and people but applies equally well to software systems, especially those built through domain driven design principles. It's a dense read but full if mind-blowing concepts. It's is a business book but I'm classifying it as a architecture and design book for one good reason - it has the best description of architecture that I've ever encountered.
Here's how he describes it:
Architecture is a general description of a system. It identifies its vital functions, major elements and their relationships, and the organizational processes that define the nature of the whole. An architecture consists of a set of distinct but interrelated platforms (views). Each platform (view) represents a dimension of the system signifying a unique context, output, and mode of behavior controlled by a predefined set of performance criteria and measures. These dimensions and their complementary processes are individually necessary and collectively sufficient to give rise to a viable system capable of realizing its desired specifications.
I could do an entire talk on this definition. Architecture boils down to two things: 1) determining the minimal but necessary set of views you need to define the design of a system (e.g. logical, physical, deployment) and 2) designing the system in question through models for each of those views.