- 1 Introduction
- 2 The Problem
- 3 The Basics of Construction
- 4 Conclusion
2.3 The Basics of Construction
Building a high-rise building can be decomposed into a set of very high-level steps. Table 2-1 shows a simplified life cycle. The general flow seems to be a standard waterfall development process (Bocij et al., 1999), but we should bear in mind that increments and iteration will occur. For example, you may choose (or be forced) to occupy the lower level floors of a building before all of the construction is completed, which maps to incremental development. Incremental development is a technique for identifying priorities and delivering high priority items first. When building a high-rise building you may be happy to move staff into the building while the roof garden is being completed near the end of construction. The same is true for software, as you need working input screens before monthly reports. Iteration can be mapped to walls, as you usually start with bricks and come back to add a plaster coating, followed by paint or paper. This technique is termed additive, where a basic infrastructure is built upon. The infrastructure maps to software development as early versions of software evolve over time.
Table 2-1: Steps for Building a High-Rise
Step |
Construction Phase |
1 |
Analyze Business/Owners' Processes |
2 |
Define Business/Owners' Requirements |
3 |
Design Building |
4 |
Hire Construction Company |
5 |
Lay Foundation |
6 |
Construct Infrastructure |
7 |
Build Façade |
8 |
Decorate |
9 |
Occupy |
We can continue this table to include building maintenance, as shown in Table 2-2.
Table 2-2: Maintaining a High-Rise
Step |
Construction Phase |
10 |
Remodel Foyer |
11 |
Build Extension |
12 |
Join Two Office Blocks Together |
These typical construction steps can be easily mapped to a traditional software development life cycle. Before I move on to a comparison of software components with high-rise construction components, I will compare the processes for constructing both buildings and software in Table 2-3.
Table 2-3: Building Software
Step |
Construction Phase |
Software Development Life Cycle Phase |
1 |
Analyze Business/Owners' Processes |
Model Business Processes |
2 |
Define Business/Owners' Requirements |
Manage Requirements |
3 |
Design Building |
Model System Design |
4 |
Hire Construction Company |
Select Integrated Development Environment (IDE) |
5 |
Lay Foundation |
Build Database |
6 |
Construct Infrastructure |
Build Middleware |
7 |
Build Façade |
Build Client Software |
8 |
Decorate |
Test |
9 |
Occupy |
Roll-Out |
10 |
Remodel Foyer |
Maintenance |
11 |
Build Extension |
Extension |
12 |
Join Two Office Blocks Together |
Merge Systems |
The mapping of construction to software component development phases is straightforward, and you can see how increments and iterations map to the construction and software processes.
2.3.1 Componentization
Over the years the construction industry realized that it is impractical to build everything from scratch every time. Doors, windows, and bricks are all built off-site, often by a different companies or teams. In most cases, standard construction components will fit the needs of the designer and builder. At other times, a new component will be specified and built to suit the needs of a single building. I assert that no industry can become componentized until it has successfully shown how to consume, supply, and manage components.
In Figure 2-1, a repository is at the center of solution development, component development, and management. All the terms will be described in this chapter at length, while the term repository or component library will be explained more effectively in Chapter 32. A component repository is similar to a place where construction goods are stored and can be instantly retrieved for use when needed. Many parts may be very similar, but the warehouseman can find the exact part in minutes. The component repository provides the same services for components, their associated interfaces, and documentation, distinguishing one version of a component from another easily.
Figure 2-1: Consume, supply, and manage.
2.3.2 Consume
The basics of building a high-rise building map to the construction of a solution or application. The focus for this solution building process (Allen and Frost, 1998) is provided by the customer or the business (Eles and Sims, 1998). In the software engineering world this is usually achieved by modeling the required business processes (Jacobson, 1994). The contract between the customer and the designer can be achieved by documenting requirements or reviewing the designs as they progress. Once solution design starts, components begin to have an impact. The group responsible for building solutions is actually consuming components. This highlights a problem: not only is it important to stockpile components to prepare for the construction process, it is also important to design the solution using information about available components. One option for the design of interacting components is based on the UML and is proposed in Chapter 14. However, I believe the UML is better for designing the internals of black box components rather than designing static and dynamic relationships among components. The challenge for the solution builder is to assemble a large system from components. To do this successfully you will need information about the available software components, their required interfaces, and their services, operations, and methods.
The process of finding the right components is important to the component designer and is usually termed gap fulfillment (Bellows, 2000). The gap fulfillment process can have one of two outcomes: either an ideal (or similar) component is found and used or no relevant component exists. This introduces new issues to the stockpiling process because you may need to create a subproject to build a specific component. This means that the stockpiling process is not just about static holding areas for built components, but also an enabling process. The real productivity benefits of CBSE will only be realized by enabling parallel solution and component development, and this is achievable only through planning and design. For components that cannot be found, the stockpiling process must allow consumers to post a wanted notice for others to respond to.
Once you use a component, whether off-the-shelf or bespoke (a term used to describe unique, specially developed components), you need a process for configuration management. Because new versions of a component may be provided at any time, and the solution builder may want to take advantage of an upgrade, component consumers need a process to inform them when updated components are added to the stockpile. The solution builder must be able to easily replace an existing component with a newer version. This can be achieved, for example, if the solution builder registers to receive a notification when new component versions are stockpiled. Table 2-4 shows the application development life cycle with these additional component-based steps.
Table 2-4: High-Rise and Software Life Cycle with CBSE
Step |
Construction Phase |
Software Development Life Cycle Phase |
1 |
Analyze Process |
Model Business Processes |
2 |
Define Specifications |
Manage Requirements |
3 |
Design Building |
Model System Design (Components) |
CBSE |
Find Windows and Doors |
Gap Fulfillment |
CBSE |
Sub-Contract Roof Joists |
New Component Specification |
CBSE |
Design Windows |
Component Use |
CBSE |
Get on Mailing List |
Get on Mailing List |
4 |
Hire Construction Company |
Select Integrated Development Environment (IDE) |
5 |
Lay Foundations |
Build Database (Comp. Assembly) |
6 |
Construct Framework |
Build Middleware (Comp. Assembly) |
7 |
Build Façade |
Build Client Software (Comp. Assembly) |
8 |
Decorate |
Test |
9 |
Move In |
Roll-Out |
CBSE |
New Catalogue |
Receive Notification, New Component |
CBSE |
Read Catalogue |
Review New Component |
CBSE |
Update Design |
Update Design |
10 |
Remodel Foyer |
Maintenance |
11 |
Build Extension |
Extension |
12 |
Join Office Blocks Together |
Merge Systems |
This simplified table communicates the component considerations that improve the standard solution-building process. We can take this model one step further by considering the actual deployment of the components on the run-time environment. Typically, the computers on which the components run are called nodes (see UML 1.3), and mapping these nodes to the components allow system administrators to manage the deployment configuration. This is particularly important when components are widely distributed across an organization and updates occur. To handle this complexity the process is enhanced to include deployment recording during the application rollout stage. The distribution among appropriate nodes generally completes the steps in the solution development process or, as I call it, component consumption.
2.3.3 Supply
The component producer is responsible for building completed components, usually to predefined specifications. In the construction industry, for example, there are window supply companies whose sole source of revenue is window manufacturing. Windows generally come in standard sizes, though builders can request special sizes and materials described in a comprehensive specification. Roof joists, by contrast, are a good example of specified components that are often distinct to a particular building. As well as the customer's component specification, there may also be industry standards to apply. In the case of the high-rise building there will be safety, structural, emergency, and materials standards. These standards map to the concepts of quality, performance, error handling, and technology standards in software components.
Applying similar logic to the evolving discipline of CBSE, the component specification may come from the component producer's desire to provide a generic component or the solution builder's specific needs. The specification may also derive from an industry standard for component interaction or a component kit (D'Souza and Wills, 1999).
A component producer starts by identifying the discrete requirements of the component specification. An important step in the producer/consumer process, the component specification forms the contractual expectations of both parties to the component development process and final product, sometimes termed design by contract (Meyer, 1988). In the construction industry the specification is represented by a comprehensive design developed by a contractor for a subcontractor or a contractor's use of industry standards for components, such as bricks, windows and doors.
The component producer starts with this specification and perhaps some component-specific use cases and iteratively and comprehensively develops a design that satisfies the specification. Typically, the design and development of the internals of the component will be carried out using techniques such as the Unified Modeling Language (UML) and object-oriented (OO) languages, or even plugging together smaller components. Tools for design and code generation may also be used. Testing, debugging, and compilation generally are applied. The important result, for the subject of this chapter, is the completed component. Building upon the definition of a component provided in Chapter 1, I identify four levels of abstraction, as shown in Table 2-5.
Table 2-5: Component Abstraction Levels
1 |
Component Specification |
2 |
Component Implementation |
3 |
Component Executable |
4 |
Component Deployment |
The component specification or façade (Gamma et al., 1995) includes the technology independent definition of the component, but also information to facilitate gap fulfillment. The minimum requirements for a component specification are defined earlier and these form the binding contract between the supplier and consumer. Component management tools can help with this process, as well as ensuring that authority to proceed is granted. The component specification will be the primary reference resource used at design time. It has been my experience that component specifications change during the development life cycle; therefore, component producers will generally develop multiple versions of a particular component.
A component implementation occurs when you decide on the language to use to develop the component. This defines the inside (D'Souza and Wills, 1999) of the component, with its internal components and collaborations. The implementation source code is typically what will be stored in a configuration management or version control system. Because a component specification can be implemented using more than one language, there is a one-to-many relationship between a specification and an implementation; multiple versions of an implementation will occur during the course of the life cycle. The component executable is the real pluggable component used in the assembly of the solution. Each executable may result in more than one version and there may be more than one executable per implementation. Finally, the executable is deployed on a number of nodes. All nodes need to be inventoried and tracked so that updates are managed and a stable production environment is maintained.
The producer will need to publish accurate information about a component, such as its available interfaces and its services. Most important in publishing the component is communicating the specification of the component and its interfaces with a focus on making the physical component available. Updates to software will occur, so new component versions will need to be published in the same manner as the original. When you buy building materials from a builder's merchant, you are typically added to a mailing list. As a component consumer, you receive the latest catalogs, updates, and information about recalls.
The process of building and marketing software components is similar to the company that builds windows or doors for the construction industry. A window can be viewed as a black box component. The high-rise contractor will not need to know the size of each pane of glass or the size of nails used in the windows' construction. The contractor does not need to know the thickness (3 inches), and information about its functionality. The functionality information is required because the builder's component specification, acquired from the developer of the high-rise building, likely in consultation with an engineer, forms the contract among the developer, the contractor, and the subcontractor. Double or single-glazed, top or side-opening, and tinted windows are all examples of functions of a window that do not relate directly to the interface. In the case of a window, the interface is where it touches the brick, that is, the 3-foot by 4-foot hole in the wall.
We can see from this short discussion that you need more than just an interface specification to find and use a component. A degree of functionality and how it is achieved needs to be communicated as part of the component specification.
2.3.4 Manage
The third high-level role in general component-based engineering is component management. In this chapter, I have referred to a stockpile of components and that is exactly what a typical component library is.
A component library is similar to a builder yard or warehouse; both environments are where construction companies order and purchase their components. Component producers publish their components in both settings. Builder yards and warehouses are staging areas between producers and consumers. They serve as the middlemen for construction component businesses.
In the construction world there are various levels of interacting component stores. The top level is the warehouse of the component producer. Component producers that assemble windows will typically have a central store used to supply all of the builder's merchants. The builder's merchants will have their own warehouses that are closer to the construction company sites and will typically service many companies. Warehouse organization is important, as cataloguing helps to manage and locate components. The standard way to support multiple sites and interacting levels of warehouses is usually an integrated set of component repositories or catalogues. In this example, a third level would be the builder's yard for the construction company. The stock in the builder's yard will consist of newly acquired components and components left over from previous jobs. Therefore, construction companies develop an inventory from previous contract assignments and attempt to use existing stock before they purchase more, or before building the stock themselves. This technique is typically termed reuse before you buy, and before you build.
Component producers should not simply ship new components to the builder's yard. Effective yards will employ a receivable goods clerk who will assure that the products arriving at the warehouse are of acceptable quality. If the components do not meet quality standards, the shipment will be rejected. If the components comply with standards, the clerk will certify the components for consumers and end-users of the warehouse to purchase the stock.
New components are the other key factor for component librarians, as they may not always arrive fully documented or designed. Generally, with new components, extra information will need to be recorded if the components are to be easily retrieved and used. Especially with software components, required information, often referred to as meta data (see Chapter 3) can include technology type, features provided, where to get support, examples of use, help files, and installation procedures.