Software architecture provides the technical structure for a project. The time in which the software is mapped to diagrams and prototypes, and the program is partitioned into systems and subsystems.
Everything is described in the software architecture document, that contains the software organization, support for changes, reuse or purchase of components, and design of functionalities.
This document has the following categories:
- System Overview: Describe the system in general terms. Help build the developer the idea of what is he going to build. As well as a description of the design alternatives that were considered, and why were or weren’t chosen.
- Conceptual Integrity: Descriptions and diagrams of the almost obvious solution to the problem. Simple, short, and easy.
- Subsystems and Organization: Here the major clusters of functionality must be defined (Output formatting, data storage, analysis, user input…). Usually a complete system hast five to nine subsystems. The responsibilities of each subsystem are stated, and how are they intercommunicated and restricted.
- Notation: Describe the notation that will be used for the pseudocode and diagrams (Such as UML)
- Change Scenarios and Change Strategy: List what parts of the software will need (Most likely) to be changed, and how the team must approach this changes.
- Reuse Analysis and Build vs. Build Decisions: Define what components are going to be developed from scratch, reused (If available) or bought.
- Approach to Standard Functional Areas: Functional areas that the architecture must address:
- External software interfaces: How is the software expected to communicate with other software.
- User interfaces: How is it isolated, so that the changes made to the interface won’t affect to the system (And reverse).
- Database organization: Organization and content of the DB.
- Data storage: Major data structures and what isn’t stored in the DB.
- Key algorithms: Defined, or for later definition.
- Memory management: Allocation of memory.
- String storage: How is the text stored and retrieved.
- Concurrency/Threads: How is the concurrency going to be handled if the software is multithreaded.
- Security: Is the software going to operate in a secure environment?
- Localization: Is the software going to be translated for other countries or regions to use?
- Networking: Network operations.
- Portability: Handle other environments (Android/iOS, Windows/UNIX)
- Programming language: Specific language?
- Error handling: Strategy to handle errors.
- Requirements Traceability: Assign each of the requirements to a subsystem.
- Support for a Staged Delivery Plan: Describe how the project will adjust to support staged delivery. What is going to be delivered on each stage.