Guideline: Outline 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 Specification, 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 architecturally significant requirements

Some of the requirements will be more significant than others when considered from an architectural perspective. Identifying them will define the subset of requirements that will generally need to be satisfied before the architecture can be stabilised. Furthermore, the system will generally be more sensitive to changes against architecturally significant requirements than others, so identifying and communicating ths subset will help others understand the potential implications of change.

Requirements can be explicitly or implicitly architecturally significant. Implicitly significant requirements may define the essence of the functional behaviour of the system (for example, making a purchase from an on-line store). Explicitly significant requirements are often overtly technical in nature, such as performance targets; the need to interface to other systems; the number of users that must be supported; or security requirements.

See Determine Architecturally Significant Requirements for more information.

Identify constraints on the architecture

Gather information about the existing environment and identify any constraints in the solution. This will ease integration with the environment; and may reduce risk, cost and duplication of solution elements.

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.  See Guideline: Layering for more information.

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.

Define approach for deploying the system

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 geographical locations
  • organization of business data
  • service level requirements
  • constraints (such as requirements to interface with legacy systems)

Validate that the deployment overview supports users (especially those users at remote locations if this is required) performing typical usage scenarios 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

Requirements and analysis tasks usually uncover key concepts and behaviors that the system must be able to handle.

The concepts manifest in design as key abstractions. Key behaviors should correlate with the scenarios identifed as part of the architecturally significant requirements and represent the important interactions between key abstractions.

The Vision and Glossary work products are good sources for key abstractions. These abstractions are often easily identified because they represent things that are significant to the business. For example, Customer and Account are typical key abstractions in the banking business.

The abstractions that are identified at this point will also probably change and evolve during the course of the project. The purpose of this step is not to identify the complete set of classes and relationships that will survive throughout design. Rather, it is to identify the important concepts that the system must handle. The value in calling them out early in the project is that everyone on the team understands the importance of these concepts and develops coherant software to handle them consistently.

Don't spend too much time describing abstractions in detail at this initial stage, because there is a risk that spending too much time will result in identifying classes and relationships that the solution does not actually need. When identifying key abstractions, it can be useful to also define any obvious relationships that exist between them. These can be captured in a table or in 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 these early assumptions.

Identify architecture mechanisms

See Concept: Architectural 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.

Architecture decisions should be captured in the Artifact: Architecture Notebook.

If a more complex system is required, then the architecture can be represented as a more comprehensive set of views that describe the architecture from a number of viewpoints. See Architectural View for more information.

Capture architectural decisions (Visual Modeling)

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
More Information