Davide's Code and Architecture Notes - Software Architecture vs Software Design
Software Architecture and Software Design are terms that look similar but refer to two totally different aspects of software. Let’s find the differences and their purposes.
Table of Contents
Just a second! π«·
If you are here, it means that you are a software developer. So, you know that storage, networking, and domain management have a cost .
If you want to support this blog, please ensure that you have disabled the adblocker for this site. I configured Google AdSense to show as few ADS as possible - I don't want to bother you with lots of ads, but I still need to add some to pay for the resources for my site.
Thank you for your understanding.
- Davide
Usually, technical definitions are unclear. Especially when it comes to abstract definitions. However, having a clear jargon helps define common rules and gives people responsibilities for a certain aspect.
In this article, I’m going to explain MY OWN definitions of Software Architecture and Software Design. This explanation is generally shared among technical professionals, but I think each of you can disagree with specific points or may want to add further clarification to each definition.
Feel free to leave a comment here, and let me hear your voice π©
Software Architecture: the high-level view
Software Architecture defines the high-level view of the whole software system, aligning the overall structure to the company vision. It’s essential to note that the architecture must be designed based on the current project requirements but also be prepared to adapt to the company’s anticipated future needs.
Software Architecture is about how the system is divided into major modules, services, or layers and how these components interact with each other - whether through APIs, messaging systems, or event-driven mechanisms.
Especially when it comes to data exchange and communication, Software Architecture must focus on the way data is exposed and sent, their high-level format (JSON via HTTP? Binary data via RPC?), and what components must perform the data exchange (directly the main module? use a sidecar? use a single message queue? or maybe send the messages through an API Gateway?).
Selecting the right technology stack is a crucial architectural decision, as it involves choosing the most suitable frameworks, databases, and platforms to support the system’s needs. Even though these aspects are often driven by the company (if the whole company is using Python, then adding a brand new module written in Java requires hiring new people, creating new processes to deploy the component, and so on), it may happen that for specific components a particular stack is truly required (like using a graph database for handling a specific use case), and the company must provide the support to reach the goal.
Additionally, Architecture must address some essential quality attributes (such as scalability, performance, security, and fault tolerance), ensuring the system meets its non-functional requirements. Ideally, a good architecture is defined with specific metrics in mind (we must guarantee a 5-nines SLA on a component), so it all starts with analysing non-functional requirements.
Software Design: the implementation details
Software Design is primarily concerned with the detailed implementation of individual features and components.
The focus is on how each feature or module should operate internally, applying principles like abstraction and encapsulation to organise code in a logical and maintainable way.
A good design must follow shared best practices, such as SOLID, DRY, and KISS principles, to create code that is both clear and reusable. Also, Design Patterns are often used to solve common problems - but the goal of Software Design is not to apply Design Patterns everywhere but rather to locate where they can come in handy and where they can bring more complexity than benefits.
A good Software Design also supports effective unit testing and debugging, making it easier to maintain and extend the system over time.
A clear separation of concerns?
Software Architecture and Software Design are both applied to the same systems, but they focus on different aspects.
Those two disciplines do not live in silos: one influences the other. A good Software Design helps support the implementation of the Architecture while still being independent. On the other side, a proper Architecture helps define the minimum set of requirements for the Design, making it easier to define.
We can also notice that the two disciplines have a different audience: the Software Architecture must (or, at least, should) be shared with the upper management to ensure that the Architecture is going in the same direction as the company’s vision; the Software Design is mainly a concern of the development team, as it helps writing more maintainable code, improving the overall quality of the project.
Further readings
There are topics that belong both to Software Architecture and to Software Design. For example, how do you handle errors in your application?
π The Error Management Trio, and how it affects your software architecture | Code4IT
This article first appeared on Code4IT π§
Also, a good architecture design should satisfy some non-functional requirements that, if not met, may have legal consequences:
π Introducing SLI, SLO, and SLA | Code4IT
Wrapping up
I hope you enjoyed this article! Let’s keep in touch on LinkedIn, Twitter or BlueSky! π€π€
Happy coding!
π§