Guideline: Analyze the Architecture
This guideline provides additional information to support the analysis of architecturally significant requirements and the creation of an outline architecture.
Relationships
Main Description

Identify architectural goals

Architectural goals provide the motivation and rationale for decisions. These goals are often driven by the software requirements, particularly in Supporting Requirements, because they are not always obvious from the use cases alone [ALL02].

Architectural goals define how the system needs to respond to change over time. Consider these questions when writing your goals:

  • What is the expected lifespan of the system?
  • Will the system need to respond to technological changes over that time, such as new versions of middleware or other products?
  • How frequently is the system expected to adapt to change?
  • What changes can we anticipate in the future, and how can we make them easier to accommodate?

These considerations will have a significant effect on the structure of the system.

Identify architectural constraints

Often, the system that you develop will be integrated into an existing environment. To ensure a smooth integration, you need to gather information about this environment and identify any architectural constraints.

Architectural constraints can arise from various factors:

  • Network topology
  • Use of a given database vendor or an existing database
  • Web environment (server configurations, firewall, DMZs, and so forth)
  • Servers (hardware model, operating system)
  • Use of third-party software or a particular technology
  • Compliance with existing standards

For example, if the company uses only one type of database, you will probably try to use it as much as possible to leverage the existing database administration skills, rather than introducing a new one.

These architectural constraints, combined with the requirements, help you define an appropriate candidate for the system architecture.

Survey, assess, and select from available assets

To assess and select assets to reuse on your project, you need to understand the requirements of the system's environment. You also need to understand the scope and general functionality of the system that the Stakeholders require. There are several types of assets to consider, including (but not limited to): reference architectures; frameworks; patterns; analysis mechanisms; classes; and experience. You can search asset repositories (internal or external to your organization) and industry literature to identify assets or similar projects.

You need to assess whether available assets contribute to solving the key challenges of the current project and whether they are compatible with the project's architectural constraints. You also need to analyze the extent of the fit between assets and requirements, considering whether any of the requirements are negotiable (to enable use of the asset). Also, assess whether the asset could be modified or extended to satisfy requirements, as well as what the tradeoffs in adopting it are, in terms of cost, risk, and functionality.

Finally, decide, in principle, whether to use one or more assets, and record the rationale for this decision.

Define approach for structuring the system

Structuring your system helps you manage its complexity by using the well-known "divide and conquer" strategy. By breaking the process into smaller and more manageable pieces, you make development easier.

Layering  is one of the most commonly used approaches for structuring and decomposing systems. Each layer groups similar classes or components, which communicate insofar as possible only with adjacent layers.

You do not define which layers contain which classes or components. Instead, you define how many layers you will need and which kinds of layers you will use. For example, if you are developing a new middleware system, you probably do not need a business layer. Later, during design activities, you decide which classes and components will populate these layers.

Develop deployment overview

Develop a high level overview of how the software is deployed. For example, determine if the system needs to be accessed remotely, or has requirements that suggest distribution across multiple nodes. Some sources of information to consider are:

  • users at locations, defined in the Vision and use cases
  • organization of business data
  • service level requirements defined in the Supplementary Specifications.
  • constraints (in the Supplementary Specifications, such as requirements to interface with legacy systems)

Validate that the deployment overview supports users (especially users at remote locations if this is required) performing typical use cases while satisfying nonfunctional requirements and constraints. Validate that the nodes and connections are adequate to support the interactions between components on different nodes, and between components and their stored data.

Identify key abstractions

Requirement and analysis tasks usually uncover key concepts that the system must be able to handle. These concepts manifest in design as key abstractions. Your Vision and Glossary work products are good sources for key abstractions. You can often easily identify these abstractions, because they represent things that are significant to the business. For example, Customer and Account are typical key abstractions in the banking business.

When you define the key abstractions, also define any obvious relationships that exist between entity classes. You can capture these in a table or on UML class diagrams (in a tool or whiteboard), and create a short description for each abstraction. In general, it is not worth agonizing over defining a highly detailed set of relationships at this early stage in design. The relationships will become more concrete and detailed later and will  probably modify your initial assumptions.

The classes that you identify at this point will also probably change and evolve during the course of the project. The purpose of this step is not to identify a set of classes and relationships that will survive throughout design. Rather, it is to identify the key concepts that the system must handle. Don't spend too much time describing entity classes in detail at this initial stage, because there is a risk that you will identify classes and relationships that the use cases do not actually need. Remember that you will find more entity classes and relationships when looking at the use cases.

Identify analysis mechanisms

See Analysis Mechanism.

Capture architectural decisions

It is often useful to record key architectural decisions and working assumptions on an architectural overview diagram to make it easier to communicate the architecture to the project team and stakeholders. This information should be part of the description of the architecture, but it can vary in format to suit the needs of the project. For example, on an agile and low-ceremony project the overview diagram can be an informal picture story board or a graph with icons on either a whiteboard or a drawing tool. The illustration needs to show the nature of the proposed solution, convey the governing ideas, and represent the major building blocks.

If a more complex system is required, then a more formal and comprehensive set of models that describe the architecture from a number of viewpoints is more appropriate. See Architectural View for more information. 

You will find it useful to develop these three Unified Modeling Language (UML) diagrams at this stage:

  • Layer map (represented as a class diagram using packages) that describes the upper-level layers of the architecture
  • Draft deployment diagram that outlines the expected network topology
  • Simple class diagram that shows the key abstractions and any obvious relationships among them