This post may contain affiliate links. Please see my full disclosure policy for details.
A recent tweet got me thinking about software architecture. The question on twitter was something along the lines of “Are there any good resources for software architecture or is Clean Code good enough”.
“Are there any good resources for software architecture or is Clean Code good enough?”
So that question really got me thinking about software architecture. I’ve been creating and maintaining software for the last 18 years or so. Along the way, I’ve got my hands on many books that introduced and established the way to design and create software.
I want to share and introduce my favorite software architecture books. Many of these have in some form or fashion established the way to design software applications. The books, although old, have stood the test of time and their concepts are just as applicable today as the date they were written.
I’d like to start this list with Design Patterns: Elements of Reusable Object-Oriented Software by Gamma, Helm, Johnson, and Vlissides also-known as the GoF (Gang of Four). You cannot claim to know software architecture if you have not at least heard of the GoF and the classic design patterns.
This book introduced many patterns and categorized them; Creational, Behavioral and Structural. Chances are that if you’ve created any line of business applications you have used at least one of the patterns introduced int his book.
The patterns apply to Java and C# and if you are interested in those languages you have better options available (listed below). However since this book gave birth to the concept of design patterns, it is worth knowing where the concept was born.
A better alternative would be Head First Design Patterns: A Brain-Friendly Guide
Code Complete written by Steve McConnel has stood the test of time. The concepts still apply. This book is well grounded with factual research to prove it’s conclusions. The book can sometimes contradict some things that are accepted as gospel in the agile community. However, this book provides its opinions based on hard facts.
Code complete is the missing link to more commonly known topics such as data structures and algorithms. Code complete can teach the beginner how to write better code.
CC will teach ways to write more efficient and less bug prone code that is more robust and clearer to write.
If you have just recently learned a language, that’s fine because now you know how the language works. But if you want to learn how to code, this book will provide you with the goods to just that.
This book can serve as a precursor to other concepts such as algorithms, clean code and SOLID.
Patterns of Enterprise Application Architecture
Many years ago I embarked on a major project with a team of about four other programmers. None of us had more than around three years of professional experience. While the project was successful and accomplished it’s mission until it was shelved about 12 years later, we could have done a much better job if at least one of us would have had more experience with the topic of Application Architecture.
The project eventually became really tough to maintain and had some significant complexities that required complete re-writes of subsystems.
If we had only known and understood the concepts in Patterns of Enterprise Application Architecture the quality would have been much better and would have reduced its lifetime cost significantly.
This book is excellent. However, it may go well over the head of anyone that has not had a decent amount of exposure to large applications. In fact, many of the concepts laid out in this book served as the catalyst for more refined concepts such as those found in many frameworks and libraries that you find today like Model Mappers, Domain Driven Design and Object Relation Mappers to name a few.
This book is a classic. If you really want some food for thought about the mechanics of components and designs you would really enjoy this book and gain a lot from it.
By now you might have heard me mention DDD (Domain-Driven Design)a few times. Many of the other books mentioned earlier sort of led to this book. This book can almost be considered the bible of the modern line of business application design.
This book starts you off with the concept of a Ubiquitous language and why it matters that everyone involved, from developers to stakeholders, uses the same language. This book introduces many ideas about how to write large applications. While it’s highly opinionated, the opinions must be good because the industry has adopted and accepted many of these concepts with a warm embrace.
If you’ve designed applications and used DTOs, Entities, Services (Business Domain Services not Web Services), Domain Models, Model Views chances are you can find the origin of those terms in this book.
This book is great if you are a full stack developer working on applications that consist of services, RESTful or otherwise, background services, web APIs and web UIs.
Clean Architecture: A Craftsman’s Guide to Software Structure and Design (Robert C. Martin Series), provides a different perspective about application architecture. Robert Martin provides a different view of architecture. In his book, he describes what architecture is and how an application should help identify the type of application that it is and not what technology it was written with.
This book is an easy read and it really gets you thinking about the way you layout your project code and what that layout says. The layout should say “I am an HR application” or “I am an Insurance Application” not “I am a Node application” or “I am a .Net application”.
Object Design – Roles, Responsibilities and Collaborations
Object Design is yet another great book to help you break down domain logic by knowing how to separate, as the title says, the Roles, Responsibilities and Collaborations of your objects.
It is a great learning tool to help you learn how to break down application design into an object-oriented design. This is not only useful for line of business applications but for any type of OOP application.
Data Modeling and Database Design
I included this Data Modeling and Database Design because so much of our investment in modern applications is in some form of relational databases.
This book will make you re-evaluate how you see database design. In actuality, this book can help you design an application by starting with the objects that lead directly to the data. it teaches you how to properly write Entity Relationship Diagrams and trust me when I say you have not been using ERDs properly if you have not read this book.
Enterprise Integration Patterns
I want to close out this list with Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. It is part of the Martin Fowler series and it’s extremely valuable because it lays the foundation for the concept of applications communicating with one another. I have yet to see an application of significant size that does not have to communicate with other applications either directly or indirectly.
Just One More Mention…
It is worth noting that all this will require some understanding of UML. Therefore I would recommend getting your hands on UML Distilled by Martin Fowler.
So… I still did not get to describe what software architecture is. Software architecture is the design of an application. It is important to understand some fundamental concepts when designing an application. There are many unknowns when we first create an application. You may have some ideas and you may even know some things. Regardless of how much you know, it is important to know what architectural considerations you must make upfront.
The software is not as soft and malleable as one may think. So it is important to understand principles that will allow you to make it more malleable or at least use ideas that will make it more robust upfront.
Most of the time we have to live and suffer from the choices made upfront regarding the architecture that we choose (or fail to choose). There will be concurrency issues, maintenance issues, bottlenecks issues, complexity issues, reliability issues, performance issues, security issues, and bad user experiences. The better you understand software architecture and the patterns available to you, the more resilient, robust and maintainable your application will be.
Not only will your application perform better, but it will be easier to maintain and easier to allow for repairs and modifications. This is essential to the bottom line in the end.
I wish there was one source that summarized all these concepts into one place, until one is created you have this list to help you grow.
Feel free to comment with books that I may have missed.