Search
 
     
   
   
 
Doing Software Right: Enterprise Architecture Development
 
 

Solving complex problems with teams of people requires planning. For enterprise software systems, some of the most important planning is highly technical (i.e. planning system architecture).

Planning generates artifacts, but planning (as an activity) is much more important, than project management plans, the typical artifacts. By this, we mean that document-driven processes, which focus on paper artifacts, are often ineffective, whereas the real product of any software development project is software. Instead, we view planning in a broader context, with multiple levels of formality and technical detail. For example, architecting is planning, and so is requirements analysis, design modeling and generating plans. The level of formality should be tied to the document audience's needs, including the longer-term usefulness of the documentation.

In architecture-centered development, planning is pragmatic (Figure 1). Project plans and design models are throwaway documentation because their accuracy is short-lived. Once a plan or specification is out of date, it is essentially useless. For example, source code changes can quickly obsolesce design models.

Figure 1. Without Planning, It Becomes Apparent That Many Individual Successes Are Not Sufficient for Overall Project Success.

In addition, software methods and standards should be treated as guidelines, not mandates. Project teams are encouraged to think for themselves, and tailor the process to meet the project's needs.

Pragmatics is a fundamental principle of software modeling: for requirements, architecture, and design. Every model has a purpose and focus, suppressing unimportant details. Models should document important decisions, based upon project assumptions and priorities. Deciding what's important is an essential decision skill that is part of being a competent architect.

Architecture-Centered Process

Figure 2 shows the 10-step process for Architecture-Centered Development, that covers the full system lifecycle. This process is based upon key software standards, and best-practice patterns proven in practice.

Figure 2. Architecture Centered Development Process

A key objective is to facilitate productivity in Step 7 for parallel iterative development (i.e. coding and testing). In this discussion, the activities preceding Step 7 are emphasized, because these steps comprise the architecture planning activities where we believe the key issues reside in current enterprise development.

We emphasize that this process is inherently iterative and incremental perhaps requiring revisions to artifacts from previous steps. However, the pre-development steps do have a waterfall progression, due to their interdependencies. The entire process is quality driven, with the ultimate goal of satisfying end-user needs, by establishing a stable architecture description and a working software codebase that can accommodate change.

Step 1: System Envisioning

In discussing modeling, we mentioned the key words purpose, focus, assumptions, and priorities. These are all essential elements of a systemwide Vision Statement. If they change during system development, the project is at risk of obsolescing its own models. Therefore, the first step of architecture-centered development is to establish a Vision Statement, with the binding assumption that the Vision Statement cannot change, once development begins (Step 7). Any changes must be reflected in key project plans, in particular, the System Architecture (Step 3).

In effect, the Vision Statement is a binding agreement between the system developers and the system users. It should be short and to the point, typically less than 10 pages of text, depending on the system.

The Vision Statement establishes the context for all subsequent project activities, starting with requirements analysis.

Step 2: Requirements Analysis

The requirements should define the external behavior and appearance of the system, without designing the internal structure of the system. The external behavior includes internal actions (such as persistence or calculation) that are required to ensure desired external behavior. The external appearance comprises the layout and navigation of the user interface screens.

An effective approach for capturing behavioral requirements is through use cases. A use case comprises a top-level diagram and extensive textual description. Use case notation is one of the most effective notations ever devised for expressing complex concepts. Hence, it's great for ensuring simplicity and clarity in representing top-level requirements concepts.

For each circle in the diagram (called an individual use case), there is an extensive textual description of the relevant requirements. This write-up takes the form of a long list, containing a sequence of actions, described in domain-specific prose. The definition of use cases should be done jointly with domain experts. Without continuous involvement of domain experts, the exercise is a common antipattern called Pseudo Analysis, i.e. something to be avoided.

Use cases provide a domain model of the system for the purpose of defining architecture. Use cases also have a downstream role. In development, Step 7, use cases are extended with system-specific scenario diagrams. Eventually, these scenarios are elaborated into software tests.

The appearance, functionality, and navigation of the user interface is closely related to the use cases. An effective approach to defining the screens is called low fidelity prototyping. In this approach, the screens are drawn out with paper and pencil. Again, the end-users domain experts are continuously involved in the screen definition process.

With the use cases and user interfaces defined, we have established context for architectural planning. In addition to generating documentation (including, paper and pencil sketches), the architecture team acquires a deep understanding of the desired system capabilities in the context of the end-user domain.

A final product of requirements analysis is a project glossary which should be extended during architecture planning (Step 3).

Step 3: Architecture Planning

Architecture bridges the huge semantic gap between requirements and software. Because requirements notation is prose, requirements are inherently ambiguous, intuitive, and informal. It's left-brain stuff. Software, on the other hand, has the opposite characteristics. Software source code is a formal notation. Software is interpreted unambiguously by a machine, and it's meaning is logically unintuitive (i.e. hard to decipher). It's right-brain stuff.

Architecture's first role is to define the mapping between these two extremes. Architecture captures the intuitive decisions in a more formal manner (which is useful to programmers), and it defines internal system structure before it is hardwired into code (so that current and future requirements can be satisfied). Architecture is a plan that manages system complexity in a way that enables system construction and accommodates change. Architecture has another significant role defining the organization of the software project. (See Step 6).

Architecture planning is the key missing step in many current software projects, processes, and methods. One causes of this gap is the ongoing debate about the question: "What is architecture?" Fortunately, this question has already been answered definitively, by the software architecture profession, in a formal ISO standards for Open Distributed Processing (ODP).

ODP is a powerful way to think about complex systems, which simplifies decision-making (i.e. working smarter, not harder). It organizes the system architecture in terms of five standard viewpoints, describing important aspects of the same system. These viewpoints include business enterprise, logical information, computational interface, distributed engineering, and technology selection (Figure 3).
Figure 3 ODP Viewpoints

For each viewpoint it is important to identify conformance to architectural requirements. If conformance has no objective definition, then the architecture is meaningless, because it will have no clear impact upon implementation. ODP facilitates this process because ODP embodies a pervasive conformance approach. Simple conformance checklists, are all that's needed to identify conformance points in the architecture.

Step 4: Mockup

The screen definitions from Step 2 are used to create an on-line mockup of the system. Dummy data and simple file IO can be used to provide more realistic interface simulation in key parts of the user interface. The mockup is demonstrated to end-users and management sponsors.

End users and architects should jointly review the mockups and run through the use cases (Step 2) in order to validate requirements. Often, new or modified requirements will emerge during this interchange. Generate screen dumps of any modified screens and mark them up for subsequent development activities. Any modifications to requirements are then incorporated by the other architectural activities.

Through the mockup, management is able to see visible progress, a politically important achievement for most projects. This step is an example of an external (or vertical) increment, which is used for risk reduction, both political and requirementswise.

With rapid prototyping technologies such as screen generation wizards, mockups can be generated in less than a staff month, for most systems.

Step 5: Architecture Prototyping

Architecture-centric software development addresses the big risks up front, such as integration risks and system performance risks. Architects are concerned with system-wide behaviors and challenges that can "make or break" the system. As a result, a goal of architecture is to avoid big, expensive mistakes in systems development; whereas, many other IT disciplines are focused on "making no small mistakes". Whenever an important unknown can't be resolved by paper studies, prototyping is appropriate. The purpose of architecture prototypes is to resolve big risks early in the system development cycle.

The architecture prototype is a experimental evaluation of the system architecture. For example, system API definitions can be compiled and stub programs are written to simulate the executing system. This architectural skeleton can be used to check cross-platform integration, as well as performance. When important, a trial interface between key software packages is also implemented. The architecture prototype is used to validate the computational and engineering architectures, including flow of control and timing across distribution boundaries.

Using technologies like CORBA, a computational architecture specification can be automatically compiled into a set of programming header files with distributed stubs (calling side) and skeletons (service side). Dummy code is inserted in the skeletons to simulate processing. Simple client programs are written to send invocations across computational boundaries with dummy data. A handful of key (e.g. high-risk) use cases are simulated with alternative client programs. Prototype execution is timed to validate conformance with engineering constraints.

Changes to the computational, engineering, or technology architectures are proposed, and evaluated. The "throw away" code from the architectural prototype can be used to create an architectural template for the system construction team. This is one of the ways to ensure that the architect's intentions are actually implemented.

Step 6: Project Management Planning

As the final step in the pre-development process, project management plans are defined and validated to resolve resource issues, including staffing, facilities, equipment, and commercial technology procurement. A schedule and budget are established, according to the availability (lead time) for resources and project activities.

The schedule for Step 7 is planned in terms of parallel activities for external and internal increments. External increments (focused on user-visible functionality) support risk reduction with respect to requirements and management support (See Step 4). Internal increments support the efficient use of development resources, for example, the development of back-end services used by multiple subsystems. Internal increments are the most cost-effective, involving the least "throw-away" code, but external increments are often politically necessary, as well.

Current best practices are to perform several smaller internal increments supporting larger scale external increments, called VW staging. Ideally, several project teams of up to 4 programmers are formed, with 3-month deliverable external increments. In practice, this has proven to be the most effective team size and increment duration.

The architecture-centric process enables the parallel increments. Because the system is partitioned with well-defined computational boundaries, development teams can work independently, in parallel with other teams, within their assigned boundaries. Integration planning includes increments, which span architectural boundaries.

The detail in the project plan should not be inconsistent. The plan should be very detailed for early increments, and should include re-planning activities, for later in the project. This recognizes the reality that; project planners don't know everything up front.

A risk mitigation plan is also prepared with identification of technical backups. The development team involved in mockup and architecture prototyping should continue to develop experimental prototypes with high-risk technologies in advance of the majority of developers. This is called the "run ahead team" and is a key element of risk mitigation.

The final activity is project management planning is the architectural review and startup decision. Up to this point, the enterprise sponsors have made relatively few commitments, compared to the full-scale development (about 5% of system cost, depending on the project).

Executive sponsors of the project must make a business decision about whether to proceed with building the system. This executive commitment will quickly lead to many other commitments which are nearly impossible to reverse (such as technology lock-in, expenses, and vendor-generated publicity). At this point, the system architects are offering the best possible solution and approach, in the current business and technology context.

If the system concept still makes business sense, compared to the opportunity costs, the enterprise is in an excellent position to realize the system because they're doing software right.

Step 7: Parallel Incremental Development

Development project kickoff involves several key activities. The developers must learn and internalize the architecture and requirements. An effective way to achieve this is with a multi-day kickoff meeting, which includes detailed tutorials from domain experts and architects. The results of all previous steps are leveraged to bring the developers up to speed quickly and thoroughly. We suggest that the lectures be videotaped, so that staff turnover replacements can be similarly trained.

Each increment involves a complete development process, including design, coding, and test. Initially, the majority of the increments will be focused on individual subsystems. As the project progresses, an increasing number of increments will involve multiple subsystem integration. A project rhythm is established that enables coordination of development builds and tests.

For the most of the software development activity, the architecture is frozen, except at some planned points, where architectural upgrades can be inserted without disruption. Architectural stability enables parallel development.

For example, at the conclusion of a major external increment, an upgrade to the computational architecture can be inserted, before the next increment initiates. The increment starts with an upgrade of the software, conformant with the changes. In practice, the need and frequency of these upgrades decreases as the project progresses. The architect's goal is to increase the stability and quality of the solution, based upon feedback from development experience. A typical project would require two architectural refactorings (upgrades) before a suitably stable configuration is achieved for deployment.

Step 8: System Transition

Deployment of the system to a pilot group of end users should be an integral part of the development process. Based upon lessons learned in initial deployment, development iterations might be added to the plan. Schedule slips are inevitable, but serious quality defects are intolerable for obvious reasons. Improving quality by refactoring software (improving software structure) is an important investment in the system that should not be neglected.

An important architect's role in this step involves system acceptance. The architect should confirm that the system implementation is conformant with the specifications and fairly implements the end users' requirements. This task is called architectural certification.

In effect, the architect should be an impartial arbitrator between the interests of the end users and those of the developers of the system. If the end-users define new requirements, which impact architectural assumptions, the architect assesses the request, and works with both sides to plan feasible solutions.

Step 9: Operations and Maintenance

Operations and Maintenance (O&M) is the real proving ground for architecture-centered development. Whether or not the result of "doing software right" was effective, will be proven in this step. The majority of system cost will be expended here. And as much as 70% of the O&M cost will be due to system extensions-requirements and technology changes that are the key source of continuing development.

Typically, half of programmer's time will be expended trying to figure out how the system works. Architecture-centered development resolves much of this confusion with a clear, concise set of documentation, the system architecture.

Step 10: System Migration

System migration to a follow-on target architecture occurs near the end of the system lifecycle. Two major processes for system migration are called big bang and chicken little. A big bang is a complete, overnight replacement of the legacy. In practice, the big bang seldom succeeds; it is a common antipattern for system migration.

The chicken little approach is more effective, and ultimately more successful. Chicken little involves simultaneous, deployed operation of both target and legacy systems. The initial target system users are the pilot group (as in Step 8).

Gateways are integrated between the legacy and target systems. Forward gateways allow legacy user to have access to data that is migrated to the target system. Reverse gateways allow target system users to have transparent access to legacy data. Data and functionality are migrated incrementally from the legacy to the target system. In effect, system migration is a continuous evolution. As time progresses, new users are added to the target system and taken off the legacy environment.

In the long term, it will become feasible to switch off the legacy system. By that time, it is likely that the target system will become the legacy in a new system migration. The target system transition, Step 8, overlaps the legacy system migration, Step 10. In the chicken little approach, steps 8, 9, and 10 are part of a continuous process of migration.

Concluding Remarks

From experience, we have seen so many projects doing software wrong, that it's no wonder five out of six projects are unsuccessful. The age of the heroic programmer is coming to an end, and the age of the professional software architect has begun. Driven by escalating user expectations, business changes, and technology innovations, many organizations now realize that proper system planning generally translates into system success, and improper planning leads to system failure.

The role of the software architect is relatively new in many project cultures. What has been called architecture, informally, needs to become conformant with standards and best practice patterns, if consistent development success is desired.

 
 
     
Copyright © 2006 iCMG. All rights reserved.
Site Index | Contact Us | Legal & Privacy Policy