Design rationale describes why we made each design decision. Maybe you chose a pattern to promote a certain quality attribute. Maybe you picked a technology the team is familiar with or one that had the right cost. Every decision had alternatives, pros, and cons. We weighed trade-offs among properties and justified our conclusions through some logical thought process.
The better downstream designers understand the rationale for your decisions, the better they can embrace the intent of your design. The better others understand the intent behind your decisions, the more likely they will be to uphold the architectural integrity of the system as it evolves.
Rationale in an architecture description comes in many forms. It might be prose, a story, or a couple of bullet points. Sometimes your pile of rejected decisions can be more telling than a lengthy explanation.
Developing software is a journey. The path is winding and there are dozens of roads leading to the same destination. Every fork in the road, every decision you make, is an opportunity to help others understand why the software architecture is the way that it is. One method for helping people understand the decisions you made is to enumerate all the options you rejected.
Consider the paths not taken in the Project Lionheart architecture. See the table.
Path not taken | Discussion |
---|---|
One huge web application | Doesn’t allow us to schedule computationally intensive operations |
Java for Display Business service | Several teammates know Node.js, promote maintainability with JavaScript in the client and server |
Index RFPs in SQL database, search service reads the database directly | Doesn’t give an expressive enough query syntax required by stakeholders |
MongoDB for data storage | While it seems like a good fit, no expertise on the team |
Isolate services to their own containers | Not enough familiarity with technology. We can ship sooner putting everything on the same VM. This decision is not binding. We can change strategies later. |
Not everyone can be in the room when we make a decision. Reading the paths not taken lets you play back decisions so others can get a feeling for the architecture’s journey. Without this knowledge, it’s like watching the last five minutes of a movie. You missed all the character development and anything the characters do at the end will seem random. When you have the background, Darth Vader’s decisions at the end of the Return of the Jedi hold a deeper meaning. Without the background, you might think Vader is just fickle and annoyed.
You will always reject many more ideas than you keep. Humans can dismiss dozens of options in the blink of an eye without even realizing it. Formally record any decision you discuss as a team. If you notice you’re having an intense inner monologue, try to externalize your thoughts so others can benefit.
Think about a recent project. Write down some of the alternative architecture choices that your team considered and why you rejected each option. Of these decisions, who on your team can describe the rationale for the decision?
Here are some things to think about:
52.15.88.130