The following are the books I recommend and I keep them handy:
– Fundamentals of Software Architecture: An Engineering Approach
This book provides a solid overview of software architecture. Many topics are presented including architectural characteristics, architectural patterns, component concept, diagramming and presenting architecture, evolutionary architecture, and many other topics.
– Software Architecture in Practice
This is the Fourth Edition of this book. It explains what software architecture is, why it’s important, and how to design, instantiate, analyze and evolve it.
This book covers very well the architecture lifecycle, presents practical guidance and methods that you can use in your projects. You’ll also learn about the quality attributes and how to use them to build your architecture.
– Patterns of Enterprise Application Architecture
Even if this book has been published in 2002 it is still very relevant.
The book presents over forty patterns with UML diagrams, implementation information, as well as detailed code examples in Java or C#.
Armed with this book, you will learn to make important architectural decisions about building an enterprise application and the proven patterns for use when building them.
– Clean Architecture: A Craftsman’s Guide to Software Structure and Design
This book talks about design and architecture. In the first chapter, he explains the difference between the two. The next chapters are dedicated to present the programming paradigms and explain the Design Principles including the SOLID design principles.
Parts four and five of the book focus mostly on architecture. You will learn about components, services, and how to define appropriate boundaries and layers, and organize components and services.
– A Philosophy of Software Design
This is a short book with several good design advices. The ideas in this book help you to minimize the complexity of software systems so that you can write software more quickly and cheaply.
It introduces the fundamental problem in software design, which is managing complexity. Then discusses how to approach the software design process, and presents a collection of design principles to apply during software design. The book also introduces a set of red flags that identify design problems.