Continuing with the series of articles about software architecture, in this article, I would like to look into some of the architectural characteristics that you might have to think about.
If you just landed on this page, you might want to look at the previous articles in the series:
Demystifying Software Architecture: Choosing the Right Approach for Your Project
Understanding Software Architecture
The Role of a Software Architect
The Three Criteria
When developing an application, the specified requirements outline its intended functionality, while the architecture characteristics define the operational and design criteria necessary for its successful implementation. These characteristics address how the requirements will be realized and justify the choices made during the design process. For instance, ensuring a certain level of performance for the application is often crucial, even though it might not be explicitly mentioned in the requirements. Similarly, preventing technical debt is a common concern for architects and developers, despite not being explicitly stated in any requirements document.
Explicit: non-domain design considerations
Implicit: structural aspects of the design
Architectural: critical or important to success
The primary motivation behind describing architecture characteristics in projects revolves around design considerations. Architects need to assess whether certain characteristics demand specific structural attention to ensure their success. For instance, security is a critical concern for nearly every project, and a baseline of precautions must be taken during design and coding. However, it becomes an architectural characteristic when the architect needs to devise specialized measures to address security adequately.
Applications have the potential to support numerous architecture characteristics, but incorporating too many can introduce unnecessary complexity into the design. Therefore, a pivotal responsibility for architects lies in judiciously selecting the most essential architecture characteristics rather than trying to include as many as possible. By prioritizing and focusing on the crucial characteristics, architects can ensure a more streamlined and successful application design.
Operational Architecture Characteristics
Operational architecture characteristics heavily overlap with operations and DevOps concerns, forming the intersection of those concerns in many software projects.
Operational architecture characteristics cover capabilities such as:
Availability: This characteristic refers to the duration that the system needs to remain accessible and operational. Ensuring high availability is crucial for systems that require continuous service to users or businesses.
Continuity: Disaster recovery capability is a vital consideration to ensure the system can quickly recover from unexpected events, such as hardware failures or natural disasters. Implementing robust continuity measures ensures minimal downtime and data loss.
Performance: Assessing performance involves conducting stress testing, peak analysis, and evaluating the frequency of function usage. Additionally, analyzing required capacity and response times helps optimize the system's efficiency and responsiveness.
Recoverability: This characteristic addresses the system's ability to recover from adverse events and maintain business continuity. Defining a comprehensive backup strategy and having redundant hardware arrangements ensures data and service recovery.
Reliability/Safety: For systems with a direct impact on human lives or those that require fail-safe measures, reliability and safety are paramount. Ensuring a robust and fault-tolerant architecture is essential in such mission-critical scenarios.
Robustness: The system's robustness pertains to its capability to handle errors and boundary conditions effectively. It should gracefully handle scenarios like internet connection loss, power outages, or hardware failures, minimizing disruption to users.
Scalability: As user numbers and requests increase over time, the system's scalability becomes critical. A scalable architecture enables the system to efficiently handle growing loads, ensuring optimal performance without compromising responsiveness.
Structural Architecture Characteristics
Architects must concern themselves with code structure. In many cases, the architect has sole or shared responsibility for code quality concerns, such as good modularity, controlled coupling between components, readable code, and a host of other internal quality assessments.
Configurability: This characteristic focuses on providing end-users with intuitive interfaces to modify various aspects of the software's configuration. A highly configurable system empowers users to tailor the software to their specific needs without the need for extensive technical expertise.
Extensibility: The importance of extensibility lies in the system's ability to seamlessly incorporate new pieces of functionality. A well-designed architecture allows developers to add new features and modules without disrupting the existing codebase.
Installability: The ease of system installation across different platforms is essential for a smooth user experience. A streamlined installation process ensures that users can deploy the software efficiently on various environments.
Leveragability/Reuse: Leveraging common components across multiple products enhances development efficiency and reduces redundancy. Reusable components promote consistency and accelerate the creation of new software solutions.
Localization: Supporting multiple languages and multibyte characters, both in data fields and reports, ensures the software's global reach. The ability to adapt to various units of measure and currencies enables seamless internationalization.
Maintainability: The ease with which changes and enhancements can be applied to the system is a crucial factor. A maintainable architecture simplifies maintenance tasks, reduces development time, and lowers the risk of introducing errors.
Portability: The system's portability refers to its ability to run smoothly on different platforms. Whether it needs to operate with Oracle, SAP DB, or other platforms, a portable architecture ensures wide compatibility and deployment options.
Upgradability: Enabling easy and quick upgrades from previous versions of the application is vital for continuous improvement. An upgradable system streamlines the process of transitioning to newer versions, ensuring seamless updates on both servers and client devices.
Cross-Cutting Architectural Characteristics
Cross-cutting architectural characteristics, refer to aspects of software design that affect multiple modules or components throughout the application. Unlike core concerns, which directly relate to the primary functionality of individual modules, cross-cutting concerns often involve functionality that spans across multiple modules, affecting the system as a whole. These characteristics tend to cut across the traditional modular structure of the application, making them challenging to manage using regular module-based design approaches.
Accessibility: This characteristic focuses on providing access to all users, including those with disabilities like colorblindness or hearing loss. Ensuring an inclusive design enables a diverse user base to interact with the application effectively.
Archivability: Assessing the need for data archiving or deletion after a specific period is crucial for data management and compliance. Implementing an efficient archiving strategy helps maintain data integrity and regulatory compliance.
Authentication: Strong security requirements for user authentication are vital to ensure users are verified and authorized to access the system. Robust authentication mechanisms protect against unauthorized access and data breaches.
Authorization: Defining granular security requirements for user authorization allows fine-grained control over the functions users can access within the application. This safeguards sensitive data and maintains data integrity.
Legal Compliance: Understanding and adhering to legislative constraints, such as data protection laws, Sarbanes-Oxley Act, GDPR, and other regulations, is essential for operating within legal boundaries and safeguarding user data.
Privacy: The ability to secure transactions from internal company employees through encryption ensures data confidentiality. Encrypting data in the database and during network communication adds an extra layer of protection against unauthorized access.
Security: Implementing robust security measures, such as database encryption and secure network communication, is critical to protect sensitive data from potential threats and unauthorized access.
Supportability: Assessing the level of technical support required by the application helps provide adequate assistance to users when issues arise. Extensive logging and debugging facilities facilitate efficient error diagnosis and resolution.
Usability: Ensuring a user-friendly interface reduces the training required for users to achieve their goals with the application. A well-designed and intuitive user interface enhances user satisfaction and productivity.
A thorough understanding of both explicit and implicit software architecture characteristics is essential for architects and developers to create successful software systems. While explicit characteristics provide the foundation and structure, implicit characteristics influence the system's behavior and performance in subtle yet significant ways. By acknowledging and addressing both aspects, software architects can make informed decisions, resulting in more maintainable, scalable, and reliable software solutions that meet the evolving needs of users and businesses alike.
Comments