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?
- General Software Architecture
- Embedded Systems Architecture
- Systems Thinking
- Design Patterns
- Visual Modeling
- Who to Follow
- Architecture on Embedded Artistry
- Books Mentioned Above
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:
- Documenting Software Architectures, which will teach you much more than just documentation
- Just Enough Software Architecture, which focuses on risk-driven architecture and is written for developers
- Software Architecture for Developers: Vol 1 & 2, pragmatic approach to architecture using the C4 method
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?
- Why Should We Architect?
- The Architect Role
What is Architecture?
Before diving into the how of architecture, it's helpful to know what it is.
- What is Software Architecture? by Bredemeyer Consulting
- Five Things Every Developer Should Know about Software Architecture by Simon Brown
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.
- Why Do We Need Software Architecture? by Bredemeyer Consulting
- Architecture as Business Competency by Bredemeyer Consulting
- Software Architects: Do We Need 'em? by Ruth Malan
- Your Code Is Not Enough by Gene Hughson
- The Code is the Design? by Ruth Malan
- Visual Agility: Why We Model
The Architect Role
These articles discuss the architect role itself, particularly the qualities and skillsets that are valuable to an architect.
- Architect: What's in a name? by Bredemeyer Consulting
- The Architect Role and Skills by Bredemeyer Consulting
- The Role of the Architect by Bredemeyer Consulting
- Architects and Accountability by Bredemeyer Consulting
- Architects and Complexity Management by Bredemeyer Consulting
- Architecture Teams by Bredemeyer Consulting
- Quest for Great Architects by Bredemeyer Consulting
- Architect Competencies: What you Know, What you Do, and What you Are
- Architect Competency Elaboration: Technology by Bredemeyer Consulting
- Architect Competency Elaboration: Strategy by Bredemeyer Consulting
- Architect Competency Elaboration: Organizational Politics by Bredemeyer Consulting
- Architect Competency Leadership: Organizational Politics by Bredemeyer Consulting
We recommend the following architecture books:
- Just Enough Software Architecture: A Risk Driven Approach, by George Fairbanks
- Documenting Software Architectures: Views and Beyond by Paul Clements et al.
- Software Architecture for Developers, Vol. 1 & 2 by Simon Brown
- 97 Things Every Software Architect Should Know: Collective Wisdom from the Experts
- Design It!: From Programmer to Software Architect by Michael Keeling
- Building Evolutionary Architectures: Support Constant Change by Neal Ford, Rebecca Parsons, Patrick Kua
- Software Systems Architecture: Working with Stakeholders Using Viewpoints and Perspectives by Nick Rozanski, Eoin Woods
- Beyond Software Architecture: Creating and Sustaining Winning Solutions by Luke Hoffman
These articles from around the web provide countless insights into the practice of software architecture:
- Visual Design and Architecture by Ruth Malan
- What I Learned at Bredemeyer Consulting's Software Architecture Workshop by Embedded Artistry
- Architecture Clues: Heuristics, Part i. SCARS by Ruth Malan
- Architecture Clues: Heuristics, Part ii. Decisions and Change by Ruth Malan
- The Architect's Clue Bucket by Ruth Malan
- Software Architecture as Code, a talk by Simon Brown
- Where does Software Architecture fit in the development process? by Bredemeyer Consulting
- Software Architecture: Central Concerns, Key Decisions by Bredemeyer Consulting
- Architecture Strategy by Bredemeyer Consulting
- How is Software Architecture Created? by Ruth Malan
- Creating an Architectural Vision: Collecting Input by Bredemeyer Consulting
- The Difference Between Marketecture and Tarchitecture by Luke Hohmann
- Agilists and Architects: Allies not Adversaries, a talk by Rebecca Parsons and Martin Fowler
- Is Design Dead? by Martin Fowler
- Less is More with Minimalist Architecture by Bredemeyer Consulting
- Sacrificial Architecture by Martin Fowler
- Evolutionary Design by Joshua Kerievsky
- Evolutionary Design Still Requires Up-front Thinking by Simon Brown
Phil Koopman has a selection of lectures which are generally applicable to architecture and design:
- Software Architecture and High Level Design
- Lifecycle and Configuration Management
- Traceability (YouTube lecture)
- Dependability (YouTube lecture)
- Humans as a System Component by Phil Koopman
Additionally, the slides and course notes from Hassan Gomaa are a useful introduction:
Here are talks which relate to the subject of architecture:
- Deliberate Architecture by Robert Smallshire
Here are some practical technique guides related to the architecture process, ideation, brainstorming, and value exploration.
- Disney Brainstorming Method: Dreamer, Realist, and Spoiler by Idea Sandbox
- Rich Pictures by Kaye Stevens
- Stakeholder Profile
- Documenting Architecture Decisions
Architecture work and documentation go hand in hand. Here are valuable resources on the that discuss architecture documentation:
- Documenting Software Architectures: Views and Beyond is an excellent book on describing all aspects of creating and documenting a software architecture
- arc42 provides a pragmatic methodology for architecture documentation, as well as a set of templates you can use for your system's documentation
- Software Architecture Diagram Review Checklist by Simon Brown
Visual Architecture Process
These guides relate to Bredemeyer Consulting's Visual Architecture Process. They provide a practical blueprint for architecting your systems.
- Visual Architecting Process Guide
- The Visual Architecting Process
- Architectural Requirements in the Visual Architecting Process
- Software Architecture Action Guide
- Meta-Architecture Action Guide
- Conceptual Architecture Action Guide
- The Visual Strategy Framework
- The Business Strategy Process
- Architectural Principles Template
- Interface Template
- Use Case Template
- Stakeholder Profile
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.
- C4 Model Website
- The C4 Model for Software Architecture
- Software Architecture for Developers: Vol 1 & 2, which provides a practical guide to architecture using the C4 model
- Software Architecture Diagram Review Checklist
- Visualising Software Architecture Cheat Sheet
- Documenting Software Architecture Cheat Sheet
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:
- Real-Time Software Design for Embedded Systems by Hassan Gomaa, which provides a usable approach for architecting embedded systems and modeling them with UML
- Modeling and Analysis of Real-Time and Embedded Systems with UML and MARTE by Bran Selic and Sebastien Gerard
- Practical UML Statecharts in C/C++: Event-Driven Programming for Embedded Systems by Miro Samek, which describes building embedded systems using state machines
Hassan Gomaa, a professor at George Mason University, published course notes for two courses which discuss embedded systems architecture and modeling:
- Course Material for Real-Time Software Design for Embedded Systems by Hassan Gomaa
- Course Material for Software Modeling and Design
Phil Koopman published the following course notes which are useful for embedded systems architects:
- Embedded System Engineering Economics
- Distributed Embedded Scheduling
- Distributed Time
- Dependability for Embedded Systems (from the Distributed Embedded Systems Course)
Safety and Critical Systems
Here are lectures, coures notes, and essays related to architecting for safety and for critical systems:
- Critical Systems and Software Safety by Phil Koopman
- Embedded Software Safety Overview by Phil Koopman (YouTube lectures)
- Safety Plan by Phil Koopman (YouTube lecture)
- Safety Requirements by Phil Koopman (YouTube lecture)
- Safety Architecture Patterns by Phil Koopman (YouTube lecture)
- Critical Systems Engineering by Phil Koopman
- Critical Systems by Phil Koopman (YouTube lecture)
- Single Points of Failure by Phil Koopman (YouTube lecture)
- Critical System Isolation by Phil Koopman (YouTube lecture)
- Redundancy Management by Phil Koopman (YouTube lecture)
- Toyota Unintended Acceleration and Software Safety Case Study by Phil Koopman (YouTube lecture)
Here are lectures, coures notes, and essays related to architecting for security:
- Distributed Embedded Systems: Embedded Internet & Security Overview by Phil Koopman
- Security Plans by Phil Koopman (YouTube lecture)
- Security Vulnerabilities by Phil Koopman
- Security Mitigation and Validation by Phil Koopman
- Security Pitfalls by Phil Koopman (YouTube lecture)
- Security Threats by Phil Koopman
- Embedded Security Resources by Embedded Artistry
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:
- Donna Meadows
- Russ Ackoff
- Systemantics (The Systems Bible) by John Gall
- General Systems Theory: Foundations, Development, Applications by Ludwig on Bertalanffy
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:
- Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma et al.
- Pattern-Oriented Software Architecture: A System of Patterns by Frank Buschmann et al.
- Software Architecture Patterns by Mark Richards
Embedded systems often work well with event-driven architectures and/or state machines. For more information, see:
- Event Driven Architecture by Mark Richards
- Practical UML Statecharts in C/C++: Event-Driven Programming for Embedded Systems by Miro Samek
Embedded systems are often under tight memory constraints. A useful reference for embedded developers is:
- Small Memory Software: Patterns for Systems with Limited Memory by James Noble and Charles Weir
Layered or Hexagonal architectures are common abstractions that work well for embedded systems. Here are some links on both types of design:
- Layered Architecture by Mark Richards
- Presentation Domain Data Layering by Martin Fowler
- Hexagonal != Layers by Thomas Pierrain
- The Pattern: Ports and Adapters by Alistair Cockburn
- Layers, Hexagons, Features, and Components by Simon Brown
Here are design patterns related to safety and critical systems:
- Self-Monitoring and Single Points of Failure by Phil Koopman
- Monitor Actuator Pair Design Pattern by Phil Koopman
- Redundant Input Processing for Safety by Phil Koopman
- Safety Architecture Patterns by Phil Koopman (YouTube lecture)
Here are anti-patterns to avoid:
- Avoid Concurrency Defects by Phil Koopman
- Top 16 Embedded Security Pitfalls by Phil Koopman
- Security Pitfalls by Phil Koopman (YouTube lecture)
- Rich Pictures by Kaye Stevens
- Stakeholder Profile by Bredemeyer Consulting
- Diagrams for System Evolution by Simon Brown
- Thing Explainer: Complicated Stuff in Simple Words by Randall Monroe provides a great example for explaining complicated topics with visual aids and simple descriptions
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:
- UML Distilled by Martin Fowler is an excellent overview of the most useful subset of UML
- SysML Distilled by Lenny Delligatti is a similar work to help you get started with SysML, an extension to the UML language which supports system engineering
- Real-Time Software Design for Embedded Systems by Hassan Gomaa also describes modeling embedded systems using SysML, UML, and MARTE
- Modeling and Analysis of Real-Time and Embedded Systems with UML and MARTE by Bran Selic and Sebastien Gerard describes MARTE, a UML extension for modeling real-time embedded systems
Here are lectures related to UML:
- Distributed Embedded Systems: UML-Based Design by Phil Koopman
- The course material for Software Modeling and Design by Hassan Gomaa includes many discussions and examples of UML-based modeling
- The course material for Real-Time Software Design for Embedded Systems by Hassan Gomaa includes many discussions and examples of UML-based modeling
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:
- Visualising Software Architecture with the C4 Model
- Structurizr is the tool which can be used to create C4 architecture diagrams
- C4-PlantUML combines the benefits of PlantUML and C4
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