Strategy and Tactics in Test Architecture
Tags: testing, architecture, programming, learning
Published: 2023-07-03 13:10:00

In the bustling world of software development, test architecture holds a critical spot. Whether you're a tech aficionado or a software prodigy, you must have run into two key components of test architecture: design strategy and tactics. Are they different sides of the same coin or completely different entities? In this post, we will explore these concepts and understand their significance in shaping quality attributes.

## Building Blocks: Quality Attributes

The soul of any robust software is its quality attributes - the characteristics or properties that can make or break your software's performance, security, usability, and much more. Quality attributes, also known as non-functional requirements, are the overall factors that shape the behavior of a system. They are the benchmarks against which the performance of a system can be measured.

These are not about what the software does (which is often referred to as 'functionality') but rather, how the software does it. Here are some key quality attributes you might come across in software engineering:

1. **Performance**: This measures how well the software performs under certain conditions. It can include attributes like speed, response time, resource usage, throughput, and efficiency.

2. **Security**: This attribute involves the protection of information and data so unauthorized users cannot access it. It includes aspects like confidentiality, integrity, and availability.

3. **Usability**: Usability refers to the degree to which the software can be used by specified consumers to achieve quantified objectives with effectiveness, efficiency, and satisfaction in a quantified context of use.

4. **Scalability**: This attribute measures the system's ability to handle increased loads of work. It could refer to increasing the number of users, the data size, or the complexity of the tasks it can handle.

5. **Reliability**: This refers to the system's ability to perform its required functions under stated conditions for a specified period of time.

6. **Maintainability**: This attribute refers to the ease with which a software system or component can be modified to correct faults, improve performance or other attributes, or adapt to a changing environment.

7. **Portability**: This refers to the ease with which the system can be transferred from one hardware or software environment to another.

Each of these quality attributes affects the system differently and is usually in a trade-off relationship with another. For example, enhancing security may impact system performance. Therefore, it's essential to identify which quality attributes are most crucial during the initial concept of a system to avoid high restructuring costs in the later stages.

## Building Blocks: Constraints 

In the broadest sense, constraints are restrictions or limitations imposed on a project. They define what you can't do or what boundaries you must operate within. These can come in many forms, often varying based on the project's nature, scale, and context.

Here are some common types of constraints in software development:

1. **Technical Constraints**: These are limitations based on the technology being used for the project. They can include aspects like the programming language, development platform, databases, or systems that must be used. For instance, a project may need to be developed in C# due to the expertise of the available team members or to be compatible with existing systems.

2. **Budgetary Constraints**: Every project has a budget that it must stick to. Budgetary constraints may affect the number of resources you can hire, the quality of hardware or software you can purchase, or the project's timeline.

3. **Time Constraints**: This refers to the project deadlines and milestones that must be met. Time constraints can often dictate the pace of work and can impact decisions about scope and resources.

4. **Resource Constraints**: These are limits on the available resources, such as personnel, equipment, or materials. This could mean limitations on the number of available team members, their skills or expertise, or physical resources like office space or hardware.

5. **Regulatory or Compliance Constraints**: These are constraints imposed by laws, regulations, or industry standards. For instance, software for healthcare or financial industries often has to comply with regulations regarding data security and privacy, such as HIPAA or GDPR.

6. **Business Constraints**: These constraints are imposed by the organization's business strategy, needs, or goals. This could include things like target market needs, company branding, or alignment with other projects or initiatives in the organization.

7. **Environmental Constraints**: These could be physical or social environmental factors such as geographical distribution of teams (remote work, time zones), or organizational culture.

Constraints are a critical part of the project planning and management process. They define the project's boundaries and inform decision-making throughout the project's lifecycle. While they may pose challenges, they can also foster creativity and innovation by requiring teams to find solutions within a defined set of parameters.

## Identifying Quality Attributes

When it comes to quality attributes, timing is everything. The earlier you pin down these attributes, the smoother your software's journey will be. Think of it as setting up the road map for your software's development lifecycle. If your software doesn't support relevant quality attributes right off the bat, chances are you'll be paying a steep price for restructuring further down the road.

## Strategies & Tactics

Now, let's dig into the heart of the matter - strategies and tactics. At their core, they are mechanisms to deal with quality attributes. They are like the wheels on a bicycle, working together to propel the software forward.

**Strategies** are comprehensive plans that give a bird's eye view of how quality attributes can be achieved in a software system. These strategies take into account various factors, including the system's nature, its intended functionality, the requirements, and the constraints. They set the overall direction for the software architecture, guiding the design and development process towards the desired goals.

One could compare a strategy to the captain of a ship, charting the course and steering the vessel. The strategies lay out the "what" – outlining what needs to be done to achieve the desired level of each quality attribute. 

Let's say you want to ensure high performance in a web application. The strategy might involve:
- Using efficient algorithms and data structures.
- Implementing a robust caching mechanism.
- Minimizing network calls.
- Applying load balancing.

These strategies are fairly high-level and abstract, and they would need to be refined and implemented through specific tactics.

Strategies play a crucial role because they ensure that these attributes are not treated as afterthoughts, but rather as integral parts of the design process from the outset. Architects and developers can keep their focus on the quality attributes and ensure that the final product lives up to them.

Moreover, it's important to remember that strategies are not created in a vacuum. They need to take into account various constraints (such as resources, timeline, and technical limitations) and need to be flexible enough to adapt to changes in requirements or circumstances.

Strategies in software test architecture play an essential role in bridging the gap between the desired quality attributes and the actual system that gets built. They provide the roadmap that guides the team towards building software that fulfills its intended function while meeting quality standards.

**Tactics** are the actionable steps or methods that put the strategies into practice. They offer practical ways to achieve the abstract goals set out by the strategy. Tactics deal with the nitty-gritty details of the implementation, answering the "how" of the equation.

To continue with the metaphor of the ship, if the strategy is the captain setting the course, the tactics are the crew members, working diligently below deck to make sure that the ship moves forward. 

For instance, in the case of the strategy aiming for high performance in a web application, here's how tactics could look:

- **Efficient algorithms**: Optimize existing algorithms or choose more efficient ones that provide the same output but consume less computational resources.
- **Robust caching mechanism**: Implement caching solutions to store and quickly access frequently used data.
- **Minimizing network calls**: Bundle or batch network requests to reduce the number of network calls.
- **Load balancing**: Use a load balancer to distribute network or application traffic across many servers, reducing the risk of a single server becoming a bottleneck.

Each of these tactics directly corresponds to an aspect of the strategy and provides concrete actions that can be taken to achieve the desired quality attribute. 

It's important to note that tactics often involve trade-offs. For example, implementing a caching mechanism (which could improve performance) might make the system more complex, which could affect maintainability. Therefore, it's crucial to carefully consider the implications of each tactic and how it aligns with the overall strategy and the system's quality attributes.

While tactics are aimed at implementing the strategies, they're not set in stone. As the development progresses, tactics may need to be adjusted or even changed altogether to respond to new challenges or changes in the system requirements or environment.

Tactics are the means to an end, the tools in a developer's toolbox that bring the software's design strategy to life. They're the practical steps that, when executed correctly, result in a software system that lives up to its quality attributes.

## Key Takeaways

Understanding the relationship between design strategy and tactics in test architecture is like unlocking a secret weapon. It's about setting up your software for success from the get-go. And it's also about creating a resilient framework that keeps your software game strong in the long run.

So, keep these concepts close to your heart and set the stage for a software journey that's nothing short of spectacular!

*References:*
1. Bass, Len / Clements, Paul / Kazman, RickSoftware - Architecture in Practice, 3rd edition Addison-Wesley, 2012ISBN: 978-0321815736, 2nd edition
2. SSA Wiki Design Tactics for Quality Attributes
3. NFR Engineering Repository