Developing software in a cost-effective manner is the objective of all phases. If you have only started to think about it in Construction, then you will fail to achieve it. However, if you have done Elaboration correctly ”that is, if you have created a baselined, robust executable architecture ”you can develop a more cost-effective software than would otherwise be the case. This is possible since you can reuse architectural mechanisms; you can work in parallel by organizing around the architecture (see the following section, Organize Around Architecture), and you will run into fewer unexpected problems since you have mitigated many major technical risks. In this section, we will look at some of the things that especially larger teams should consider in Construction (and possibly earlier) to ensure successful software development. Organize Around ArchitectureOne of the many benefits of a robust architecture is that it clearly divides the system responsibilities into well-defined subsystems. You have an architect or an architecture team worrying about the architecture and how it all ties together, and individuals can focus primarily on their assigned subsystem(s). Developers still need to understand the overall system, but they can focus primarily on a subset of a system, that is, one or several subsystems assigned to them. Organizing around the architecture prevents people from stepping on each other's feet. Organizing around the architecture also helps with communication. Face-to-face communication is normally the most effective form of communication, but as projects grow bigger, you need to reduce the need for communication since the face-to-face method does not scale well. The upper half of Figure 8.3 shows how many possible communication paths there are among all team members (note that it grows geometrically with the size of the team). For a team of size N, the number of communication paths = N * (N “1) / 2. This means that a two-person team has 1 communication path , a three-person team has 3 communication paths, but a six-person team has 15 communication paths. Figure 8.3. Organization Around Architecture Minimizes Communication Overload. The possible communication paths between team members grows geometrically with the size of the team. Organizing around the architecture radically reduces the number of communication paths within a team. Issues regarding subsystem interaction are resolved by the architecture team, which owns the interfaces between subsystems.
An increase in communication paths destroys project team efficiency, and you need to find better means of communication (other than everybody communicating with everybody). This can be achieved by having one team responsible for the architecture, and several small teams each responsible for one or several subsystems. Communication between these few teams is channeled through the architecture team to resolve issues around the overall solution and interfaces between subsystems. As you can see from the lower half of Figure 8.3, this leads to simplified communication, enabling effective communication even in large projects. For those same reasons, you should have one integration team. Configuration ManagementConfiguration Management SystemThe Configuration Management (CM) system needs to be set up during Inception and refined in Elaboration when you baseline the architecture. Here, we describe why you need a CM system and how it benefits you during Construction. As a project progresses, it becomes increasingly complex to track all versions of the many files being created and changed. Especially during iterative development, you are continually creating new versions of files, and you need help with, among others, the following tasks :
The solution is to use a CM system that tracks all this. You need to set up "units of responsibility/visibility" [2] attributes in your CM system. A robust architecture helps here since "units of responsibility/visibility" are typically mapped to the subsystem structure. It is the configuration manager's responsibility to set up the CM system.
Once the CM system has been set up, team members can pay less attention to the thousands of code files, documents, and their versions, allowing them to focus more on core development tasks, thus increasing their efficiency. Integration PlanningWith iterative development, it becomes increasingly complex to plan builds and integration testing. Each iteration needs an Integration Build Plan specifying which capabilities should be testable in each build and which components need to be integrated to produce required capabilities, such as use cases, parts of use cases, or other testable functionality. The tests may include functional, load, stress, or other types of tests. In many cases, a build is produced by incrementally integrating several smaller builds. This is typically done bottom-up in the layered structure of subsystems in the implementation model. For each build, define which subsystems should go into it and which other subsystems must be available as stubs (that is, as mock-up code emulating the required capabilities of the subsystem). Figure 8.4 shows three builds. Figure 8.4. Incremental Builds Facilitate Builds for Large Systems. Builds of large systems are often done by integrating several smaller builds, starting from the bottom. This figure shows an integration performed in three builds: build 1 and test, add build 2 and test, then add build 3 and test.
Enforce the ArchitectureTo benefit fully from the work done with the architecture, you need to actively enforce the architecture. Small teams should be able to achieve this by frequently discussing design options. Larger teams need to pay more attention to this problem. You have defined architectural mechanisms ”that is, reusable solutions to common problems, such as dealing with persistency or inter-process communication. You now need to prevent each developer from arbitrarily reinventing solutions for these problems. This can be done through training on the architecture and architectural mechanisms available, coupled with design reviews that include the architects and developers. You also need to ensure that interfaces of subsystems are not arbitrarily changed and that any changes are properly communicated to other teams to minimize impact on them. This communication can be done through a Configuration Management system, where you, among others, put interfaces under CM. Ensure Continual ProgressTo ensure continual progress, you need to establish short- term goals and continually prove that you have achieved them. The following guidelines are proven recipes for success:
For each of our three example projects, you do the following:
|