Design and Architecture

The software architecture is the system high design, but when does high design finish and starts the detailed design?

To answer this question it is necessary to define the architecture’s goal: It establishes the systemic qualities of a software system and these qualities have to support the system stakeholders’ needs. These needs are associated to how stakeholders perceive the system, and correspond to non-functional requirements, like the system level of availability, its performance, in terms of number of transactions per second or the duration of a transaction, time to market, how long does it take to implement the system, etc.

So, the software architecture is a bridge between the problem space and the solution space and intends to guarantee that the proposed solution, the architecture, will be able to fulfil the stakeholders’ needs. The architectural design is the design from the perspective of stakeholders, the parts of the system that stakeholders want to know about in order to be sure that the system will fulfil their needs.

Another example that illustrates the difference between software architecture and detailed design is the difference between an architectural pattern and a design pattern. Suppose that we are talking to a layperson about software and we refer to, for instance, the strategy design pattern. This person will not be able to understand that it is a way to encapsulate an algorithm inside an object to take advantage of polymorphism and dynamic biding to allow the change of the algorithm during runtime. However, if we refer to the client-server architectural pattern he may be able to say that when he wants to know how is going to be the weather tomorrow accesses a web site, and recently decided to start looking at another site because the one he used is often not available. So, although he does not understand the details of the architectural pattern he understand some of its qualities from the perspective of a user, a stakeholder, in this case that the service is publicly available and the level of availability may change.

Therefore, the work of a software architect consists on a clear definition of the system qualities, its non-functional requirements, such that all the stakeholders agree on the compromises taken to define them, and on the definition of a design of the system that shows that the system will consider the identified qualities. The software architect mixes the roles of requirements engineer and software designer.