Software Architecture - 4
Documenting Software Architectures Effectively
Requirements for Architecture
Architectural requirements
Functional requirements
Functional requirements define what the system should do or its functions and features. They include:
System functions
Business processes
User tasks
Functional requirements shape the high-level design and modules of the system architecture.
Non-functional requirements
Non-functional requirements define how well the system should perform or behave. They include:
Performance (speed, scalability, throughput)
Usability (interface design)
Reliability
Security
Maintainability
Non-functional requirements constrain architectural decisions and choices.
Constraints and Assumptions
These include:
Technical constraints (hardware, software, platforms)
Resource constraints (time, cost, people)
Environmental constraints (operating conditions)
Assumptions about the system scope, users, and usage scenarios also influence the architecture.
Architecture Life Cycle
Architecture Design in SDLC
In the Software Development Life Cycle, architecture design typically happens in the following phases:
Requirements Analysis:
Functional and non-functional requirements are gathered from stakeholders.
Initial high-level architectural decisions are made based on requirements.
System scope, constraints and assumptions are documented.
Design:
Detailed architectural design is done including:
Module decomposition into subsystems and components
Component allocation to tiers or layers
Interface design between components
Selection of architectural patterns and styles
Low-level design of components is done.
Implementation:
The architecture is implemented by:
Developing individual components
Integrating components through their interfaces
Configuring and deploying infrastructure to support the architecture
Testing:
Unit testing of individual components
Integration testing of groups of components
System testing of the whole architecture:
Functional testing
Performance testing
Stress testing
Scalability testing
Deployment:
The system is deployed onto the target environment based on the defined architecture.
Deployment details like server configurations, network settings, etc. are finalized.
Maintenance:
The architecture evolves over time through:
Adding new features
Improving performance and scalability
Changing technologies
Replacing obsolete components
Changes are made through iterative cycles of:
Requirements analysis
Design changes
Implementation of changes
Regression testing
The architecture is continuously evaluated and improved.
Evolutionary prototyping model
In this model, an initial architecture is designed and implemented. Then it evolves through iterations by:
Developing prototypes
Evaluating prototypes
Making necessary changes to the architecture
This allows for continuous improvement of the architecture based on user feedback.
Analysis and Evaluation Methods
The architecture is evaluated using methods like:
Inspections
Experts inspect and evaluate the architecture design against requirements and quality attributes.
Walkthroughs
The architecture design is presented and explained to stakeholders who provide feedback.
The architecture life cycle is iterative and evolutionary in nature. The initial architecture is designed based on requirements and then evolves through prototyping, evaluation and refinement. The architecture continues to change and improve as the system evolves over time.
Economic Analysis Methods
Cost Benefit Analysis Method (CBAM)
This method compares the costs and benefits of different architectural alternatives.
Steps in CBAM:
Identify architectural alternatives
Identify costs and benefits for each alternative
Quantify costs and benefits in monetary terms
Calculate the net present value (NPV) for each alternative
Select the alternative with the highest NPV
CBAM helps choose the alternative with the best return on investment.
Cost Benefit Analysis (CBA) evaluates alternatives based on their costs and benefits. CBA would identify things like:
Development and implementation costs of different architectural options
Expected income or productivity gains from each option
Overall return on investment of each alternative
CBA helps choose the architectural option with the highest net present value.
Architecture Tradeoff Analysis Method (ATAM)
ATAM evaluates architectural design based on:
Quality attribute requirements
Architectural approaches
Trade-offs
The ATAM process:
Identify stakeholders and quality attributes
Present architectural approaches
Evaluate architectural approaches against quality attributes
Identify trade-offs
Prioritize trade-offs
Generate and evaluate risk items
Develop revised architecture based on findings
ATAM helps improve the architecture by identifying risks, trade-offs and mismatches with respect to quality attribute requirements.
Architecture Tradeoff Analysis Method (ATAM) evaluates architectures based on quality attributes and trade-offs. ATAM would identify things like:
How well each architectural approach meets quality requirements like performance, security, modifiability, etc.
Trade-offs between quality attributes, for example, improved security may reduce performance.
Risks in the architecture that could impact quality attributes.
ATAM helps improve the architecture by finding ways to better meet quality requirements and manage trade-offs and risks.
Active Reviews
Active reviews involve stakeholders actively participating in evaluating and improving the architecture.
Active Reviews for Intermediate Design (ARID)
ARID is a method for reviewing architecture during the design phase. It involves:
Preparation
Identify reviewers, materials, goals and criteriaOverview
Present the architectural overview and design rationaleWalkthrough
Explain the details of the architecture and answer questionsHypothetical Scenarios
Pose hypothetical scenarios to evaluate how well the architecture meets its goals
Example scenario: "What if there is a 10x increase in the number of users?"
Issues List Reviewers document issues, concerns, risks and suggestions
Negotiation
Discuss and negotiate resolutions for issuesClosure
Document action items and next stepsFollow Up
Implement changes and revisit unresolved issues
For example, during the hypothetical scenarios in an e-commerce site ARID, a scenario about a 10x increase in users uncovered that the architecture did not scale well. This led to identifying an issue around scalability and suggesting changes like using a distributed cache to improve it.
Attribute Driven Design
Attribute Driven Design (ADD) is an architectural design process that focuses on quality attributes.
ADD process
The steps in ADD are:
Attribute Identification Identify quality attributes that are important for the system.
Attribute Prioritization
Prioritize attributes based on stakeholder needs.Architecture Synthesis Generate architectural candidates that satisfy the attributes.
Analysis and Evaluation
Analyze and evaluate candidates against attributes.Decision Making
Select the final architecture based on analysis.
Attribute classification
Attributes can be classified as:
Functional: Reliability, performance, security
Non-functional: Usability, maintainability, portability
Attribute-driven design decisions
Design decisions are made to satisfy attributes, like:
Data distribution to improve performance
Caching to improve response time
Module decomposition to improve maintainability
Exception handling to improve reliability
Example
Here are some examples of design decisions that target specific quality attributes in attribute-driven design:
Performance
Caching frequently used data
Partitioning data across multiple servers
Using in-memory databases
Reliability
Implementing retry mechanisms
Adding redundancy through failover systems
Handling exceptions gracefully
Maintainability
Creating modular, loosely coupled components
Abstracting low-level details into libraries and frameworks
Implementing design patterns for code reuse
Security
Performing input validation
Encrypting sensitive data
Using access control lists to restrict access
Usability
Providing meaningful error messages
Using familiar UI metaphors and navigation
Supporting undo/redo actions
Architecture Reuse
Reusing existing architectures can provide many benefits.
Benefits of architecture reuse
Faster development time
Reduced development costs
Increased reliability
Proven designs
Methods of architecture reuse
Component reuse: Reusing existing architectural components to build a new system.
Reference model reuse: Reusing an existing architectural model or framework as a template.
Challenges of architecture reuse
Matching requirements: Existing architectures may not match new requirements perfectly.
Integration issues: Integrating reused components into a new system can be difficult.
Incompatible styles: The style of the reused architecture may be different.
Outdated technology: The reused architecture may use outdated technologies.
Domain-Specific Architecture
Domain-specific architecture focuses on the architectural needs of a particular domain.
Concept
A domain-specific architecture:
Addresses the core abstractions and constraints of a domain
Reuses architectural knowledge within that domain
Is optimized for a specific type of system
Examples of domains:
E-commerce
Business information systems
Real-time systems
Mobile applications
Benefits and Challenges
Benefits:
Faster development time
Architectures optimized for the domain
Challenges:
Limited reusability outside the domain
Requires domain knowledge
Design patterns for specific domains
User interface patterns for desktop, web and mobile applications
Distribution patterns for real-time and embedded systems
Integration patterns for enterprise information systems
Example
Here are some examples of design patterns for domain-specific architectures:
Real-time systems:
Polling - Constantly check for new data at fixed intervals
Interrupt-driven - Use hardware interrupts to trigger event handlers
Preemptive multitasking - Allow tasks to preempt each other to meet deadlines
Embedded systems:
Event-driven - Trigger actions in response to external events
Cooperative multitasking - Tasks voluntarily relinquish control
Producer-consumer - For asynchronous data flow between components
Mobile applications:
Model-view-controller - Separate data, UI and logic
Fragment - Reusable UI components
Service locator - Locate and share services across app components
E-commerce systems:
Order processing - Handle order creation, validation and fulfillment
Catalog management- Manage product listings and attributes
Shopping cart - Maintain state of customer purchases
These patterns provide domain-specific solutions that address the needs of real-time systems, mobile apps, e-commerce systems and other domains. They reuse architectural knowledge within a particular domain.