Devs Need System Design Tools, Not Diagramming Tools
<bob> How can I echo the last three characters in a filename?
<feline> If they're in a variable: echo ${foo: -3}
<feline> Why 3 characters? What do you REALLY want?
<feline> Do you want the extension?
<bob> Yes.
<feline> There's no guarantee that every filename will have a three-letter extension,
<feline> so blindly grabbing three characters does not solve the problem.
<feline> echo ${foo##*.}
- Which diagramming tool should we use to map our system architecture?
- How do we share and store architectural decision records?
- Where can we list all of the APIs in our system?
- We need to ship functional software on a schedule, so we need an easy way to visualize and access up-to-date information about our system architecture.
- We need to reach a consensus on the system design effortlessly and have a single source of truth for decision records.
- We need to understand the system behavior and catch breaking changes before they occur.
System Design vs. System Architecture Diagrams
System design is often mistakenly equated with simply drawing diagrams of software architecture. Another misconception is to align it solely with BDUF (Big Design Up Front), UML (Unified Modeling Language), specific architectural frameworks like TOGAF, or various documentation types such as HLD (High-Level Design), SAD (Software Architecture Document), KDD (Key Design Decisions), ARD (Architecture Requirements Document), LLD (Low-Level Design), and ADR (Architecture Decision Record). System design transcends any specific tool or document; it is an ongoing process that outlines the high-level conceptual structure of a complex system (the system architecture) and defines its significant components and interactions. It encompasses all aspects of the system (i.e., software, hardware, data, interfaces, and user interactions) to ensure that they work together effectively and efficiently to meet the application’s requirements. Outputs of this process may include:- System Requirements Documentation (i.e., Detailing both functional and non-functional requirements.)
- System Architecture Documentation (i.e., Describing the goals, constraints, and rationale behind the chosen architecture.)
- System Architecture Diagram (i.e., Providing a visual representation of components, services, their interactions, and relationships.)
Nowadays, Diagrams Are Not Enough
Developers often use diagrams to tackle a fundamental communication challenge: conveying the complexities of a distributed software system — including its components, dependencies, and APIs — clearly and effectively to a distributed team. Software development is inherently collaborative, requiring a shared understanding of the system’s construction, constraints, and future evolution. This alignment is crucial for eliminating ambiguity and enabling cohesive team progress. Visual illustrations are powerful tools for achieving this alignment, as they help bypass the potential misunderstandings and delays inherent in written and verbal communication, ensuring that mental models are aligned across the team. However, diagramming tools have significant limitations. Effective diagrams are designed to tell a specific story to a particular audience, providing a static snapshot of a software system that addresses the concerns of specific stakeholders (e.g., Backend team, Frontend team, QA, PMs, DevOps, C-suite). In the past, when software systems were smaller and more straightforward, a single diagram could (potentially) capture all necessary information. Today, with the proliferation of SaaS, APIs, composable platforms, and legacy systems, the complexity of software systems has exponentially increased.“Software tech stacks today look way more like a rainforest — with animals and plants co-existing, competing, living, dying, growing, interacting in unplanned ways — than like a planned garden.” — Jean Yang.We’ve all seen diagrams that attempt to fit the entire architecture of these modern software systems into a single picture. Ironically, these systems would benefit the most from effectively communicating their complexity.

“Microservices “death star” – source Microservices Diagram guide
- Lack of Real-Time Updates: Diagrams provide a static representation and cannot automatically reflect the dynamic nature of modern systems.
- Clunky User Interface: Updating diagrams can be cumbersome, with significant time formatting and arranging components.
- Version Control Issues: Maintaining updated versions across teams is challenging.
- Limited Collaboration Capabilities: Real-time collaboration and feedback often need better support.
- There is no single source of Truth. Diagrams rarely include information about requirements, trade-offs, design decisions, etc. Design documentation is often used.
- Incapable of Managing Cloud Resources: Diagrams do not control or generate infrastructure code (e.g., CloudFormation, Terraform).
Final Thoughts
Many engineering teams persist in using diagramming tools due to a combination of sunk cost fallacy (” We’ve already invested 30 hours in creating and updating this diagram, so we might as well continue and not waste that time”), resistance to change (” Switching tools takes time and training, we have other priorities now”), and unclear problem definition (”we need an updated diagram” vs. “we need a real-time understanding of our system”).
The sunk cost fallacy is the tendency for people to continue an endeavor or course of action even when abandoning it would be more beneficial.