After a decade spent building and shipping hardware products, I became convinced that many of the problems and schedule delays I experienced could have been avoided with a little bit of planning and thought. Repeatedly, we painted ourselves into corners with code that seemed to work well initially but caused problems months later when we finally started end-to-end system testing. Serious problems resulted in major software rewrites, changes in the technology stack, and delayed the ship date. Even worse, as I migrated from one product team to another, I noticed that we were repeating the same basic mistakes.
I started pondering this situation. Why were we dealing major design problems and risk areas at the end of the project instead of the beginning? How could we describe ourselves as "agile" if we weren't able to quickly adapt our programs to change? Why did none of the teams I was on use anything resembling design activity before starting to build a system?
These questions led me to a deep immersion in the topics of software architecture, systems thinking, and system design. I've applied countless lessons to our internal projects, client projects, and business development efforts. Value exploration, visual modeling, and minimalistic architecture efforts have significantly improved our work quality and derisked many projects.
"Architecture" and "design" seem to be words that send programming teams running for the hills. However, I've had multiple embedded developers share their frustrations with me - the same that started me on my journey - and expressed their interest in learning more about software architecture but not knowing where to start. So, here are all the resources I've collected on software architecture. I hope they help guide you in your own journey.
Table of Contents:
Where to Start?
There's a lot of material here! You don't need to read all of it to get started with architecture.
For general architecture exposure, I recommend picking 1-2 books from this list:
If you are focused on embedded systems, I highly recommend Real-Time Software Design for Embedded Systems. This book provides a blueprint for modeling and architecting embedded systems. You will be introduced to UML and a variety of modeling approaches that you can use when architecting an embedded system.
The next step is to actually practice! There is no need for a long, drawn-out architecture stage. Allocate 2-4 weeks for value exploration and architecture efforts before starting any new project. Perform stakeholder interviews and explore the value you expect the system to provide. Then focus on answering core questions, like:
- What qualities and behaviors are most important?
- What requirements do they place on the design?
- What are the biggest risk areas?
- How can we reduce risk?
- What are we unsure about that might change?
- How can we make sure to support those changes without requiring a system redesign?
- What parts of the system will we buy, license, outsource, and build in house?
Those questions will inform the architecture effort. Model the system and begin prototyping the riskiest areas. As you develop the system, you will explore and refine the system architecture.
General Software Architecture
Before diving into embedded systems specifics, it is helpful to have a solid foundation in general software architecture techniques.
We've broken down our reading recommendations into the following categories:
What is Architecture?
Before diving into the how of architecture, it's helpful to know what it is.
Why Should We Architect?
Perhaps you're not convinced that architecture is valuable. Or perhaps you need to prepare yourself to advocate for architecture efforts on your projects. These articles will give you some insights into why we architect.
The Architect Role
These articles discuss the architect role itself, particularly the qualities and skillsets that are valuable to an architect.
We recommend the following architecture books:
These articles from around the web provide countless insights into the practice of software architecture:
Phil Koopman has a selection of lectures which are generally applicable to architecture and design:
Additionally, the slides and course notes from Hassan Gomaa are a useful introduction:
Here are talks which relate to the subject of architecture:
Here are some practical technique guides related to the architecture process, ideation, brainstorming, and value exploration.
Architecture work and documentation go hand in hand. Here are valuable resources on the that discuss architecture documentation:
Visual Architecture Process
These guides relate to Bredemeyer Consulting's Visual Architecture Process. They provide a practical blueprint for architecting your systems.
Simon Brown created the C4 architecture model, which focuses on four areas of architecture: Context, containers, components, and code. This is another practical blueprint for architecting your system.
Embedded Systems Architecture
Even just a little exposure to software architecture will reveal how deep the rabbit hole goes. We're focused on embedded systems, so here are embedded-specific resources.
Our favorite books on the subject of embedded systems architecture are:
Hassan Gomaa, a professor at George Mason University, published course notes for two courses which discuss embedded systems architecture and modeling:
Phil Koopman published the following course notes which are useful for embedded systems architects:
Safety and Critical Systems
Here are lectures, coures notes, and essays related to architecting for safety and for critical systems:
Here are lectures, coures notes, and essays related to architecting for security:
I would be remiss to talk about architecture without mentioning systems thinking. These two topics are intertwined: we must develop a habit of thinking about the system as a whole if we are to work at an architectural level.
Here are some of my favorite books and essays on systems thinking:
Design patterns are extremely useful to learn and familiarize yourself with. These are non-obvious solutions to common scenarios and problems. For generally useful software architecture patterns, see:
Embedded systems often work well with event-driven architectures and/or state machines. For more information, see:
Embedded systems are often under tight memory constraints. A useful reference for embedded developers is:
Layered or Hexagonal architectures are common abstractions that work well for embedded systems. Here are some links on both types of design:
Here are design patterns related to safety and critical systems:
Here are anti-patterns to avoid:
UML is frequently trashed by development teams (even those with no experience using it), but I find "UML-light" to be extremely useful for documenting and modeling my systems.
These books are wonderful resources for learning and applying UML:
Here are lectures related to UML:
As far as UML tools go, there are many options. We recommend three:
- Visual Paradigm is our tool of choice due to its support of SysML and the ability to tweak the models to support our needs
- StarUML is a UML modeling tool recommended to us by Grady Booch, who says he uses this tool on a regular basis
- PlantUML is a great tool which generates UML diagrams from textual descriptions, enabling you to store UML diagrams under revision control and to include them in source-code comments
If you prefer the C4 model, we recommend the following:
Who to Follow
You've already seen these names quite a bit throughout the article. I recommend keeping up with these folks:
- Bredemeyer Consulting
- Ruth Malan, a principal at Bredemeyer Consulting
- Dana Bredemeyer, a principal at Bredemeyer Consulting
- Simon Brown
- Grady Booch
- Martin Fowler
- Phil Koopman
- Alistair Cockburn
- Michael Nygard
- Rebecca Wirfs-Brock - agile architecture
- Jessica Kerr
- Brenda Michaelson
- Gene Hughson
- Michael Keeling
- Diana Montalion
- Robert Smallshire - embedded / systems architecture
- Indu Alagarsamy - DDD and architecture
- Matt McLarty
- Chris Bird - complex systems architecture
Architecture on Embedded Artistry
We publish articles related to Architecture and Systems Thinking on on this website.