Real World Application of Leading Software Development Methodologies
Home Up Templates Opinion Resume BLOG

Real World Application of Leading Software Development Methodologies

Applying RUP and XP to a web services application

by Bryan Campbell and Dr. Glenn Ray

April 9, 2002

Article Attributes
Microsoft Word Icon Adobe Acrobat Icon            

Microsoft Word

Adobe Acrobat

 

    
Abstract
This paper presents the results of a web services application development project using the Rational Unified Process (RUP) combined with elements of eXtreme Programming (XP).  Developed for an international financial services company, the web-based application, called the Property Re-Insurance System, automates the reinsuring of property policies.  The client chose this high profile, e-commerce project for the initial use of an iterative software development process consisting of the Rational Unified Process supplemented with some principles of eXtreme Programming, (e.g., paired programming and unit testing).  Successfully completed on time and within budget, this experience suggests the Rational Unified Process and eXtreme Programming are complementary development processes that can be effectively applied to internet applications where time-to-market is a critical measure of success.  Nevertheless, there is potential for significant improvement in the areas of: definition, duration and sequencing of process activities; choice of documentation artifacts; and, use of automated tools.

Purpose
The Property Reinsurance System (PRS) described in this document refers to a ‘replacement and re-engineering’ project deployed for a Fortune 500 company over a twelve-month period from October 2000 to October 2001. The purpose of this document is to review the success of an iterative development approach using components of two leading methodologies, the Rational Unified Process (RUP) and eXtreme Programming (XP).  In addition to validating the methodology used during the project, the paper identifies key lessons learned from applying these methodologies to a real-world application. 

 

Property Reinsurance System Project

In October 2000, the customer, FederalRe, Inc. (a fictitious name to protect the client’s proprietary information), initiated the development of a new software application known as the Property Reinsurance System (PRS).  The application was intended to be an object oriented, web based application, which could provide real-time property re-insurance quotes to FederalRe customers.  As part of the development process, FederalRe required that a specific software development methodology, the Rational Unified Process (RUP), be used throughout the lifecycle of the project.  As the consulting company responsible for delivering the project under a fixed time and price contract, we recommended that RUP be complemented by a lightweight methodology known as eXtreme Programming (XP). 

PRS was intended to replace an existing client-server application that had been initially developed in the early 1980s for a specific customer.  Subsequently, this system was customized and marketed to other clients.  Currently, 130 insurers use the system generating more than $40 million (U.S.) in annual revenue to Federal Re.

The project had several stated objectives and constraints:

1.   Develop a new n-tiered, web services based version of PRS. Web services refers to exposing core application services through an XML interface using an HTTP transport layer.

2.   Develop the system using a Microsoft toolset (Visual Basic 6.0, ADO 2.5 and ASP 3.0), as required by the strategic architectural direction of FederalRe’s parent organization.

3.      Apply an iterative development process to the application based on the Rational Unified Process.

4.     Develop new functionality, not present in the current client-server version of PRS, and examine re-engineering opportunities in the process of developing the system.

Through the Rational Unified Process the project was delivered in a series of iterations over four phases (Inception, Elaboration, Construction and Transition). The project was a $3 Million (U.S.) initiative with a twelve month development period and involved a team of 11 full-time members (one project manager, two system analyst/architects and eight developers). 

The Rational Unified Process  (RUP) undeniably ranks among the leading software development processes available today. RUP evolved from the pioneering work of the ‘Three Amigos’ (Grady Booch, James Rumbaugh and Ivar Jacobson) who aligned their individual efforts to develop an object oriented, visual modeling process into a comprehensive approach with a common language, the Universal Modeling Language (UML) notation.  Currently supported by Rational Software Inc., the methodology is distributed on a CD in HTML format and is tightly coupled with some of the leading object oriented development tools such as Rational Rose and Requisite Pro.  RUP contains a wealth of information, including process roles, activities, recommended artifacts and document templates.

RUP is described as use-case driven, architecture-centric, iterative and incremental. Functional requirements are captured in use cases that drive the development process. Specified use cases support the analysis & design and test workflows. Use cases also help define the architecture, which in turn, influences the selection of use cases.  This interplay between use cases and architecture evolves in the context of an iterative and incremental process.  A project is divided into a series of iterations where the most architecturally significant and/or technically complex use cases should be tackled initially.  During early project iterations, some previous work may be discarded but later iterations add a greater proportion of incremental functionality.

The motivation for a process like RUP is based on the argument that iterative processes reduce project risk.  Requirements that change over time are more easily incorporated into an iterative process, and management gains greater visibility into the current status of the project. Project cost is reevaluated at the end of each iteration. By focusing on essential requirements first, a functional system can be delivered sooner with deferral of lower priority functionality to subsequent releases. 

As seen in Figure 1, RUP is composed of four phases and nine workflows.  The phases are Inception, Elaboration, Construction and Transition.  The workflows are Business Modeling, Requirements, Analysis and Design, Implementation, Test, Deployment, Configuration & Change Management, Project Management, and Environment.  Phases are subdivided into iterations during which the workflows are performed.  The core workflows, Requirements through Test, essentially constitute a mini-waterfall process. So RUP can be viewed as a succession of short waterfall processes during which a system is built incrementally.  Ambler [2] aptly describes this type of process as serial in the large-scale and iterative in the small-scale.

Figure 1 - The Rational Unified Process

During the Inception phase, the project scope is defined and the business case is justified.  High-level use cases are developed for the system’s primary functional requirements.  Project management tasks include conducting an initial risk assessment, and estimating resources, schedule and overall cost.  The completion of the Inception phase often acts as an important control gate for determining whether to proceed with the project.

During Elaboration, the problem domain is subjected to detailed analysis and the architectural foundation is established.  A supplementary specification is developed for non-functional requirements.  In addition, the architecture and design of the system should be validated throughout this phase and reflected in its iterations.   

In the Construction phase, the detailed designed is realized and implemented iteratively.  The objective is to produce a functional component of the system by the end of each iteration.  Supporting documentation is also developed iteratively.

The Transition phase results in the delivery of the system to the user community.  This commonly occurs after a beta release has been tested by end users and debugged.  The final iterations within Transition should focus on more debugging and lower risk development.

It is important to recognize that phases are more conceptual than tangible, particularly between Elaboration, Construction and Transition.  Determining when one phase ends and another begins is less important than ensuring that the fundamental components of each of the phases is addressed throughout the lifecycle of the project. 

RUP’s strengths lie in its foundation as an iterative process that is requirements driven and architecture-centric.  A working component of the system is delivered at the end of each iteration that enables the client to make a go/no-go decision.  The process is extensively documented, model artifacts are based on UML, and supported by a suite of automated tools.  It is a robust process framework that can be tailored to project needs.  

Nevertheless, there are deficiencies in RUP. Ambler notes that it is essentially a single-project development process.  It fails to consider enterprise-level, multi-project issues. As a result, application architectures may fragment across the enterprise and opportunities for software reuse may be lost.  It does not address the post-Transition phase concerns of operational support and maintenance, which over a system lifetime probably consume more total resources than initial development. Since it is based on UML, non-UML model artifacts are not covered and the process documentation can consume expensive resources.  In Ambler’s opinion, the marketing of Rational’s commercial tools dominates the process.  Other weak areas include metrics, testing and the crucial area of human resource management.        

Hesse’s [7] criticisms of RUP are more fundamental.  He argues that phases, which are a holdover from the classic waterfall process, are not an appropriate structuring concept for OO projects.  Instead, process activities and iterations should be linked to architecturally significant milestones.  Workflow is an overloaded term and its relationship to phases is overly complex.  RUP lacks high-level support for structuring complex processes such as hierarchy, recursion and orthogonality.  RUP should be decomposable into sub-processes.  There is inadequate support for project management and roles/interactions of project groups, especially in the area of user feedback.

In addition to these criticisms, we found that RUP lacks detailed advice on the Implementation workflow.  Since coding is arguably the most important project activity, a software development team needs comprehensive guidance on how to most efficiently manage the actual coding of the system.

 

eXtreme Programming (XP)

Kent Beck [4] started XP about six years ago, and it is probably the best known of the lightweight methodologies. Others include Peter Coad’s Feature-Driven Development (FDD), Alistair Cockburn’s Crystal family of methodologies [12], Jim Highsmith’s Adaptive Software Development [13], SCRUM [14], Scott Ambler’s Agile Modeling [1] and others.  More recently, the leading proponents of lightweight methodologies have formed the Agile Alliance, an umbrella organization that promotes the principles of lightweight processes.   A growing number of websites, magazine articles, books and conferences devoted to agile methods attest to their current popularity among programmers.    A complete discussion of agile methods is beyond the scope of this article and the reader is referred to [6] for further information.

XP promises a high level of customer satisfaction based on four process principles: communication, simplicity, feedback and courage.  To gather requirements, it supports communication within a development team that includes client staff, and it encourages the use of the simplest design and implementation that meets those requirements.   Feedback is obtained through extensive unit testing during each iteration.  In fact, unit tests should be written prior to actual coding. With this foundation of teamwork, simplicity, and automated testing, XP claims that developers have the courage to respond to unexpected requirements changes.

Its probably more accurate to classify XP as a collection of practical  programming techniques than a complete software development process.   Figure 2 depicts the process flow for an XP project.  Requirements are captured in user stories, which are essentially high-level use case descriptions without detailed, step-by-step functional details.   The XP website provides the following description of user stories:

User stories serve the same purpose as use cases but are not the same. They are used to create time estimates for the release planning meeting.  They are also used instead of a large requirements document. User Stories are written by the customers as things that the system needs to do for them. They are similar to usage scenarios, except that they are not limited to describing a user interface. They are in the format of about three sentences of text written by the customer in the customer’s terminology without techno-syntax.

.Figure 2 - eXtreme Programming (XP)

In XP (Figure 2), each iteration is preceded by a Release Planning activity that describes the work to be done based on the following inputs: requirements (User Stories), high-level architectural analysis (Architectural Spike) and throw-away programs that explore particularly difficult areas (Spikes).   The iteration proceeds after confident estimates are obtained and the code is debugged until it passes all acceptance tests.  The result of an iteration is the release of a functional sub-system.   Eventually, the complete system is developed through this iterative process.

XP is an iterative process designed for small (2-12) teams co-located at the client’s site.  Developers, who work in pairs, write unit tests prior to writing the actual code and they review each other’s code.  The code should be the simplest possible implementation of the requirements and it should be refactored repeatedly.

In reaction to heavyweight processes that have elaborate management structure and produce extensive documentation artifacts, XP deliberately minimizes these process activities.  Project management is viewed as inefficient bureaucracy, and code is regarded to be the only documentation that is inherently reliable. These policies are justified with claims that modern software development, especially internet applications, can not be developed with heavyweight processes when requirements are unpredictable and delivery timeframes are short.   

XP’s strength is its unflinching focus on getting the code written so that each iteration yields a functional product. It is a hands-on approach driven by developers with direct client involvement to foster communication, much of which is informal.  Product quality is achieved through pair programming and automated unit testing.

XP does have limitations.  Unlike RUP it does not have as much focus on establishing environment or architecture requirements for the system.  In fact, its focus is really in RUP’s construction phase where code is being planned and implemented.  The claim that pair programming is more productive is debatable. It does not provide clear guidance on what models or documentation artifacts should be developed, and a distributed development environment inhibits informal communication.  With minimal management and documentation activities, the ability of XP to scale to enterprise level projects is questionable.  This often makes it difficult for larger corporations to support application development driven by XP due to concerns that the software will be difficult to support and maintain.

 

Integration of RUP and XP

As mentioned previously, the client had already adopted RUP as its official process throughout the enterprise and this project was the first to use it. From our critical analyses of RUP and XP discussed above, we decided the best course of action was to selectively blend the strongest features of RUP and XP.  This is straightforward since the two processes are complementary.  Most importantly, RUP and XP are both iterative processes.  Although neither are enterprise-level processes, that limitation was not significant for this project.  RUP was used as the base process with XP primarily filling in the gaps of the implementation workflow. 

Per RUP, the requirements process was use case driven.  Model artifacts followed UML notation.  For the implementation workflow, we used pair programming and unit testing, both recommended XP techniques.  Programming estimates were developed by the developers based on design artifacts ‘handed off’ to them at the start of each iteration.  Based on management considerations, iterations were four weeks in duration and a formal demonstration of the system’s functionality was held at the end of each iteration.   Architectural considerations were the primary factor in the development of a project plan that mapped use cases to iterations and this plan was updated at the start of each iteration. 

The following section describes the application of this blended RUP/XP  process to the project.

 

Property Re-Insurance System
The development of the PRS application was mapped to the RUP phases.  The initial development of the system occurred over a 10-week period beginning October 2000.  This work mapped to the Inception phase of the RUP methodology and was intended to determine:  the scope of the overall project; an iterative development plan that implemented the architecturally important use cases in the early iterations; and, an estimate of project cost and time so the project sponsor could assess whether to proceed.   After project approval, the Elaboration, Construction and Transition phases of the project occurred over nine four- week iterations.

 

Inception phase

The Inception phase of the PRS project was a fixed price, fixed time contract that identified a series of key artifacts needed to identify the success criteria for the project.  The Inception phase followed the workflows of the Rational Unified Process and utilized the resources, as defined within RUP, of a Project Manager, Architect, Designer, Use Case Specifier, User Interface Designer and an Implementer.

The PRS project was initiated through a series of workshops intended to both solicit requirements while at the same introducing key stakeholders to the development process and project scope.  The workshops were half-day sessions with notes from each session captured and compiled for review in the following session.  A total of 15 workshops were held over four weeks, the results of which guided the development of a series of artifacts that would be used to develop a project plan and estimate.

The workshop sessions were complemented by analysis of business documents and interviews with stakeholders in order to develop most of the artifacts identified for this phase.  The artifacts produced as deliverables included the Software Development Plan, a Class Diagram, Project Glossary, Vision Document, an Exploratory Prototype, Candidate Architecture, Software Requirements Specifications, Business Rules, Business Use Cases Model and Use Cases, Collaboration and Sequence diagrams and Status Reports[1].  In addition, several other non-RUP artifacts were developed which included project artifacts (GANTT charts, a RUP Worker Matrix and a Mentoring Plan).

While a large number of formal artifacts were developed as part of the Inception Phase, the primary focus was on the Business Use Case Model and the Class diagram.  The exploratory prototype helped business stakeholders visualize the parameters of the project and was later used as the preliminary user interface during the Elaboration and Construction phases.  The remaining artifacts either served as direction setting documents (e.g., Vision and Business Case), or did not add sufficient value for use in subsequent phases (e.g., Business Rules and Software Requirements Specifications artifacts).


[1] These artifacts are described in detail in the Rational Unified Process

 
Elaboration and Construction phases

As discussed above, the key deliverables from the Inception phase was a set of high-level use cases, and a business domain class model.  The first objective of the Elaboration phase was to develop a more detailed plan for the completion of the project in nine, one-month iterations.  This timeframe was a hard customer requirement based on competitive factors. 

The initial task was to construct a development plan for the entire project that could be easily revised at the end of each iteration.  This plan, the Project Development Routemap (PDR), was maintained in an Excel spreadsheet.

The first step was to develop a list of all known use cases to be developed.  This included the Inception phase use cases, including the decomposition of some into more detailed use cases, e.g., CRUD (Create, Read, Update, and Delete) use cases, system administration use cases, etc.  Secondly, a list of classes was prepared.  This included the Inception phase classes supplemented with additional classes such as DB access. 

Desired functionality was ranked on two criteria: from highest to lowest risk, and from highest to lowest priority.  The preferred sequence of development is from use cases of highest risk/highest priority to use cases of lowest risk/lowest priority.

However, we agree with Hesse that in a truly architecture-centric process, iterations should be defined on meaningful architectural milestones.  This means the development sequence of use cases must be modified so that use cases composing an architecturally significant part of the system are developed in the same iteration. However, this requirement must be relaxed when the amount of work is too great for an iteration, the estimates of which are created by the development team themselves.  In that case, the remaining work is deferred to the following iteration. At the end of each iteration, the entire routemap is revised based on the amount of work completed and any new requirements discovered.

The strategy for segmenting the project into iterations during the Elaboration and Construction phases is governed by three principles in the following order of importance.  First, project management considerations dictate that iterations be a fixed duration that provides adequate time to develop significant functionality while short enough that the client can maintain visibility into the project’s status.  We believe that one-month iterations are a good compromise.  Deadlines are predictable and easy to schedule.  The development team can implement significant functionality in a month, and the client knows the project’s status.   Preparing for an end-of-iteration demo is time-consuming both for the project team and the many stakeholders who must participate.  If iterations are too short, you lose efficiency.  If iterations are too long, the project may flounder or stray off course.

Secondly, the actual work performed during an iteration is governed by architectural concerns with the most critical architectural issues addressed first.  The key architectural concern for this application was the rating engine.  It was also deemed the highest priority and the most complex of all the use cases.  The rating engine incorporated several independent rating algorithms, and the user could optionally specify the particular algorithm to use for a group of policies. Since practically all other functionality depended on the rating engine, it was tackled first. 

Third, core architectural components like the rating engine should be developed in parallel with related functionality.  For example, to realistically use the services of the rating engine, it was necessary to also develop lightweight implementations of related use cases and classes even though they were not necessarily the highest priority or most complex.    In fact, the necessity of incorporating this supplemental functionality required that only half of the rating algorithms could be implemented in the first iteration with the remaining algorithms deferred to the second iteration.

As we continued to discover new requirements during the project, we revised the routemap at the end of each iteration.  Figure 3 shows the final breakdown of work by iteration.

Figure 3 - Iteration Schedule of the PRS Project

Phase

Iteration

Major Requirements Implemented

 

Elaboration

1

·            Calculate a premium for a location using multiple rating algorithms (rating engine)

2

·            Finish the rating engine

·            Reinsure a policy with multiple locations

3

·            Associate policies with a governing reinsurance agreement

·            Associate policies and agreements with parties (organizations and people) along with their contact info

 

Construction

4

·            Calculate a premium for aggregate locations

·            Complete party functionality

·            Email notification to parties

·            Participation by other reinsurers

5

·            Refer  uninsurable policies for special review process

·            CRUD policy/location

6

·            Complete policy referral process

·            Endorse policies

·            Transfer policy data to/from client

7

·            CRUD parties

·            CRUD agreements

·            CRUD participation

·            Rescind endorsements

8

·            Security

·            Generate reports

9

·            Complete reporting functionality

·            Advanced endorsement processing

·            GUI re-design for usability

 

Transition

 

 

10 *

·            System integration testing & debug

·            QA acceptance testing

·            Deployment to hosting environment

·            Stress testing

·            Security testing

·            Release to client’s customers

 

* Note: a 10th iteration was added due to the customer requirement that an off-site hosting environment be used for deployment of the system.  This relatively late change in environment requirements constituted a final iteration to migrate the system and apply final Quality Assurance certification.

.

For an iterative project to be successful, a key skill is the ability to estimate the productivity of developer resources.  Overestimation is a bigger concern because developers may complete their work prior to the end of the iteration and have no work to do until additional use cases are specified.  Underestimation of work is also undesirable due to developer frustration and the impression that the project is not making adequate progress.  Of course, use cases not implemented are simply deferred to the next iteration.

Figure 4 - PRS Project Development Route Map

Figure 4 shows the Project Development Routemap for the initial iteration. The use cases and class to be implemented are listed and assigned priority and complexity rankings (high/medium/low).  The level of effort in perfect engineering days (PED) is based on the complexity attribute.  In this project, use cases were assigned a PED of 5 days for high complexity, 3 days for medium complexity and 1 day for low complexity.  The respective values for classes were 3, 2 and 1 days respectively.  A perfect engineering day assumes that a developer works at a high level of efficiency in a highly productive development environment for eight hours without any interruptions or lost time.  This is an unrealistic assumption.  Developers typically must ramp up on a new development environment, gain understanding of the problem domain and learn to work as a team.  Of course, there are always interruptions and downtime. 

Therefore, the level of work must be converted from PED to actual work days.  The total work in PED is multiplied by an adjustment factor (5) which reflects the productivity assessment of the team.  Initially, the adjustment factor is higher reflecting the development team getting introduced to the problem domain, developing a required team camraderie and accounting for other unforeseen productivity factors (such as installing new software, configuring computers etc.).  These estimates are used only as a tool to determine how much analysis and design is required for each iteration.  The developers themselves provide the detailed estimate of time required to realize the functionality of each iteration.  Over two or three iterations, however, the adjustment factor is refined to more accurately reflect true development productivity.

Then, the total days required (100 days) is divided by the number of developers to obtain the level of effort in team days.  Team days can be easily converted into team weeks and team months.  However, as the project progresses, the development team should become more productive and the PED adjustment factor should accordingly decrease.  In this project, the adjustment factor gradually declined to a stable value of 2.2 by the start of the fourth iteration.

The usefulness of this approach is dependent on assessing the complexity of use cases and classes in terms of PED and the selection of suitable PED adjustment factors through the project lifecycle.  XP recommends the use of a range between 2 and 5 with 2 being optimistic and 5 being used for unfamiliar technology.  Since the correct adjustment factor can only be determined after several iterations, our approach has been to apply a conservative estimate that can be adjusted downwards over time.  This semi-quantitative technique did a reasonably accurate job of estimating iteration workloads and overall the Project Development Routemap was a useful tool.

Figure 5 - Iterative Process Activity Diagram

Based on our experience, we agree with proponents of both RUP and XP that iterative processes offer a superior approach to software development.  Nevertheless, the successful execution of an iterative process is a challenging exercise requiring astute project management skills.   In our opinion, iterative processes succeed not because they are easier to execute. On the contrary, they place very high demands on project staff to meet frequently recurring deadlines.

This high performance level requires a clearly defined sequence of activities that explicitly maps roles to artifacts. Although RUP and XP offer much useful advice on this topic, we found that neither offer a sufficiently detailed iterative process plan.  Figure 5 is an activity diagram that depicts the process employed in each iteration of our project.  The diagram includes a swimlane for the client, analyst/architect and developer.  A role has lead responsibility (not necessarily sole responsibility) for all activities (rounded ellipses) within the role’s swimlane.  In cases where responsibility does not neatly map to a single role, the activity is shown straddling two swimlanes (e.g., Elicit requirements activity).  To our knowledge, this is a non-standard notation for UML activity diagrams but we believe it conveys useful information.  The obvious shortcoming of this notational compromise is that an activity can only straddle adjacent swimlanes.  

The central complexity of an iterative process is shown between the fork and join (heavy horizontal lines) bars within the analyst/architect swimlane.  The analyst/architect must always do analysis and design one iteration ahead of the developers.  At the end of an iteration, the developers have completed the implementation of the previous iteration’s analysis and design, while the analyst/architect has completed analysis and design tasks to be implemented during the next iteration.  Throughout the development process, however,

In addition, the analyst/architect has important responsibilities for support of the developers.  The analyst/architect must be available to answer questions from developers and to possibly modify the design of the system based on its actual implementation.  This role must prepare an iteration DB for developers, write test cases based on use cases, and perform integration testing after the developers finish their iteration build. 

Balancing these two sets of parallel activities requires careful time management by the analyst/architect.  In fact, the iterative process is a very delicate time management exercise.  The client must be able to provide requirements feedback early on during the current iteration. The analyst/architect must quickly prepare models for requirements validation and guidance to developers.  Finally, the developers must finish their implementation with sufficient time remaining for integration testing prior to the client’s demo at the end of each iteration.

This tight integration among the various roles makes the iterative process highly susceptible to disruption by factors such as vacations, sickness, and routine business schedule conflicts.  In our opinion, this high sensitivity to everyday events is one of the most serious weaknesses of an iterative process.  In particular, we found that having an adequate amount of time for integration testing was a constant challenge.  That problem is discussed in more detail below.

Although RUP was the client’s officially adopted process, every attempt was made to keep its implementation as lightweight as possible.  There were two rationales for this decision.  First, we expected an iterative process to be highly disruptive internally to the client as it had previously only followed waterfall based software development projects and we wanted to minimize the organizational impacts.  Secondly, we wanted to assess the potential usefulness of XP techniques within a RUP framework.

In keeping with an agile RUP process, we produced a compact suite of artifacts in order to minimize the resources needed to create and maintain these artifacts.  Functional requirements were specified in use cases maintained in a word processing document.  Test cases were taken directly from the use cases and were also maintained in a word processing document.  A class model was maintained in Rational Rose.  Screen designs were prepared informally by hand.  Occasionally, sequence diagrams were prepared by hand and usually discarded shortly after preparation. Only the use cases, test cases and class model were maintained throughout the entire project.  In summary, the artifacts were non-graphical with the class model being the notable exception.  The use case and test case documents grew to be quite lengthy, approximately 150 and 100 pages, respectively. 

According to RUP, the objective of the Elaboration phase is to baseline the architecture to provide a stable basis for the subsequent development of the system.  The most significant requirements are implemented during this phase, which should consume about 20% of project resources and 30% of schedule time.  The Construction phase  (65% of resources and 50% of schedule) is devoted to discovery and implementation of the remaining requirements.  In our experience, the boundary between Elaboration and Construction is somewhat arbitrary.

For this project, we defined the Elaboration phase to consist of three iterations.  This is based on the demonstrated ability to reliably calculate reinsurance premiums for a policy using a variety of rating algorithms.  The remaining six iterations are assigned to the Construction phase since they dealt with the more routine aspects of the business domain.  In terms of project resources (and schedule time), this results in a ratio of 1:2 between the Elaboration and Construction phases, which is within the guidance provided by RUP.

 

Transition phase

The transition phase of the PRS application involved the final iterations of the project and introduced the deployment of the application to an offsite hosting environment.  While the implementation complexity of this final  iteration was intended to be less than the iterations covered in Elaboration and Construction phases, the environment variables introduced more risk than had originally been forecast. 

FederalRe had recently established a contract with an offsite hosting company to provision 24x7 support services for its web based applications.  The rationale for the decision was based on the significant resource requirements for true 24x7 support.  However, the infrastructure implemented for the hosting environment contained some differences from the environment where the development and integration work had been completed.  The synchronization between these different environments also proved to be demanding particularly in ensuring the configuration of the production environment.  This also impacted the timelines required for Quality Assurance certification.

The transition period also provide an opportunity to address any outstanding defects that were identified in the final construction iteration as well as any minor functionality requirements (mostly centered around screen navigation) that could not be addressed in the previous iteration.

 

Lessons Learned

Using the blended RUP/XP process described above, this successful project was completed on time and within budget.  We believe there are several reasons for the project’s success.  First, it benefited from strong client commitment, both to the project and the process.  The consulting team was highly experienced in both the business domain and technology.  Project management, from both client and vendor, was intimately involved throughout the engagement. The entire team worked at the client’s site, enjoyed open access to stakeholders, and worked in a dedicated development lab. 

We believe this project benefited greatly from an iterative process.  Iterative development imposes a high level of discipline on all parties involved since deadlines occur frequently, and on a predictable schedule.  Since the most difficult functionality was tackled first, the development team was confident they could complete the project after the second iteration was finished.  The client was comfortable since they could see tangible evidence of progress on a monthly basis.  In our opinion, iterative development is a major risk reducer for two reasons.  First, the probability of failure is much less since risk is proactively managed throughout the project lifecycle.  Secondly, the system can begin generating revenue sooner because a functional system is delivered at the earliest possible date. In short, a successful project using an iterative process results in a higher rate of return on investment with lower assumed risk. This is a ‘best of both worlds’ scenario.

The inherent benefit of an iterative process is even more striking when one considers the partial process implementation used this project.  Supporting documentation was fairly minimal.  The only automated tool used for analysis and design was Rational Rose.  There was no automated tool for managing requirements or test cases.  The only maintained model was a UML class diagram. 

Nevertheless, we are convinced that iterative development processes like RUP and XP have substantial room for improvement.  In reality, both are process frameworks that must be tailored to specific projects.  There is only general guidance on how to customize these processes for a particular project, especially for organizations transitioning to an iterative process.

In particular, we think practitioners would benefit from detailed process activity diagrams like the activity diagram presented here.  We can envision a suite of such diagrams depicting best practices for various types of projects based on key project variables such as business domain, project size, performance requirements (e.g., real time, high reliability, etc.), project roles, and application architecture, just to name a few.   At the very least, the availability of detailed process diagrams would provide a basis for critical analysis, and help the industry evolve past its current state, which is all too often dominated by marketing hype.

There are some particularly challenging aspects of iterative processes that should be noted. A commonly touted advantage is that iterative processes avoid the unpredictably long testing period at project end.  Admittedly, it is less expensive to cure a defect early in the project.  Nevertheless, testing remains a major resource commitment that continually threatens the project schedule.  Even with automated unit testing, it was very difficult for the developers to finish the iteration build in time for adequate integration testing particularly with regression testing.

In this project, developers were scheduled to deliver a build early in the final week of the iteration.  The analyst/architect then performed integration testing.  Bugs were logged in a Lotus Notes database and the developers fixed bugs generating a new build at least daily. This cycle was repeated until Thursday afternoon at which time the system was frozen for the Friday demo to the client.  Unfortunately due to the ambitious workload, the initial build was often delivered later in the week.  This prevented the analyst/architect from conducting thorough testing, and the developers did not have enough time to fix all the bugs.  The unstable build was delivered to the client’s QA department on the following Monday as the project team kicked off the next iteration.

As a result, it was not possible to achieve the level of stability required and some known bugs were carried over to the next iteration.  This ongoing deferment of bug fixes to later iterations became a major impediment and resulted in a longer than planned stabilization period after iteration nine.  To some degree this necessitated an iteration ten, although this was also a reflection of a significant architectural change associated with an off-site hosing service.  We feel this problem can be partially addressed by automated integration testing.  To successfully use automated testing, it is crucial that the GUI be stabilized as early as possible.  Unfortunately, this was not possible because the usability expert joined the project very late resulting in extensive revisions to the GUI.

Another mitigating technique is to schedule a buffer period for extra testing periodically throughout the project, a practice employed by Microsoft.  The idea is to designate certain iterations as major release points which are allotted an extra period of time to stabilize the application with extra testing.  We believe that inserting a buffer period after every third iteration, for example, is merited given the scheduling challenges.  For a one-month iteration, we recommend a buffer period of at least one week (see Figure 6).

Figure 6- Iterative Process With Buffer Period for Testing

 

Another process area in need of reevaluation is determining the optimum suite of artifacts needed for communication with the client and the developers.  This tends to be controversial, particularly with adherents of agile methods who argue that the only reliable documentation is the code.   While certainly true, our experience indicates few business stakeholders know how to read code and even fewer are interested in learning how.  Therefore, this ‘lightweight’ argument largely misses the point.  In our quest to minimize documentation, we omitted routine UML models like activity and state diagrams that can be effective communication devices.  Instead, we generated documents over 100 pages in length containing dozens of use cases and test cases.  We did maintain a detailed class model that was indispensable for developers but largely ineffective for business users.

Not surprisingly, business users became more confused about the functional relationships of the use cases as the document grew in complexity.  A few carefully drawn activity diagrams could have helped immensely. 

It was also evident that developers can benefit from more artifacts than use cases and a class model.  Developers commonly spent precious time trying to decipher a use case when a well-designed activity or sequence diagram would have sufficed.  For complex use cases, we suggest a simple activity diagram to illustrate the alternative flows, and we advocate sequence diagrams for the major execution scenarios.  Sequence diagrams are especially valuable at linking the use cases to the class model.

Another important factor in determining appropriate artifacts is the client’s concern about ongoing support of the application.  Our client was extremely concerned about receiving mentoring throughout the project and substantial time was devoted to addressing that need.  The client wanted the ability to maintain both the iterative process and the application after the engagement was finished.  We believe that the breadth and depth of required documentation is a function of the client’s legitimate concern over their ability to protect a crucial investment after the consultant has left.  In other words, the  ‘lightweight’ vs. ‘heavyweight’ debate over documentation is largely irrelevant when not considered within the client’s context.

The client’s long-term goal in adopting RUP is to achieve a repeatable process for software development throughout the enterprise. This requires deliberate actions designed to acquire and maintain process knowledge within the organization.  From this perspective, documentation and mentoring assume an importance beyond the boundary of a single project.  We suggest clients carefully assess their long-term, enterprise-level knowledge management requirements when deciding how lightweight the documentation and mentoring should be for a specific project.  We are concerned that the overzealous adoption of lightweight methodologies may leave a client with insufficient in-house expertise.

We also believe these concerns are applicable to the consulting organization, too.  With a lightweight methodology, it is possible that junior members may have less opportunity for professional growth. 

This project gave us the valuable opportunity to assess some of XP’s implementation techniques, namely unit testing and pair programming.  We think unit testing is very useful and recommend its adoption where feasible.  This was the first time our development staff had done unit testing and it was partially implemented, mostly in methods that accessed data.  We believe that a full unit testing program would have significantly improved the quality of the code resulting in a shortened testing cycle.

We are more cautious in the use of pair programming even though its merits have been touted in published studies [11].  For example, it is very easy for the programmer not at the keyboard to become less engaged.   Personality conflicts can also occur although we did not encounter this problem but have witnessed it on other projects.  Our overall impression is that pair programming did not result in dramatically higher productivity or quality of code.  We do think that pair programming is useful as a mentoring technique between senior and junior staff and encourage its use in the early iterations of a project while developers are still learning the application domain.  However, one positive benefit provided by paired programming was that it provided a much more robust scheduling mechanism for vacations, sick days and other human factor elements of development.  This resource redundancy helped provided significant flexibility to the project schedule.

We are intrigued by the variation on pair programming employed at Microsoft [5] where the pair consists of a programmer and a tester.  We think that integrating a pair of programmer and tester roles with unit testing has potential, and in a future project we intend to evaluate this approach.  In our technique, a pair will be assigned a related set of use cases, and each programmer will write their own unit tests prior to writing their own code. Each member of the pair would then review his partner’s unit tests and code prior to jointly integrating their work.  We feel this arrangement will result in higher productivity and independence while preserving the comfort zone of a partner’s help with difficult issues.

Overall, we believe there is much to be learned about optimizing iterative processes such as RUP and XP.  Our experience with XP is generally consistent with its use on a large financial services project [8]. We hope other workers will publish critical reviews of actual projects supported with metrics, where possible.

 
Summary

An iterative process blending the best practices of the Rational Unified Process (RUP) and eXtreme Programming has been used to deliver FederalRe’s Property Reinsurance System (PRS) on time and within budget.  This web services application is deployed and currently in use by FederalRe’s clients. 

By any objective criteria, this project was successful. We attribute that success to the use of an iterative process supported by strong project management and competent technical staff.  Although iterative processes are difficult to implement, we are convinced they significantly reduce project risk. A committed project management, on both the client and consultant sides, is a precondition for the effective execution of an iterative process.  Finally, the technical staff must be able to work efficiently under a tight schedule to meet project milestones. 

Nevertheless, we are also convinced that the iterative process employed in PRS can be substantially improved.   The process needs to be specified in greater detail, especially in mapping roles to activities with resultant artifacts.  To maintain the project schedule, it is critical that additional automated tools be used, especially for requirements management and testing.  We recommend that buffer time for testing be inserted into the project schedule approximately every third iteration so that the application can be stabilized.  Otherwise, defects are carried into forward iterations.

Some process activities require further evaluation to assess their applicability.  We found unit testing helpful and plan to expand its use in future projects.  We are more cautious toward pair programming.  Although we think it has a niche, we are unconvinced that it is a more efficient implementation activity.  We do plan to explore variations on pair programming to determine if greater programming efficiency can be gained. 

Overall, the industry is making significant progress toward the goal of developing reliable software in a cost-effective manner, and the iterative development process is an important evolutionary step.  We encourage practitioners to implement and follow an iterative process, carefully monitor process efficiency, and report what works and what does not work.  In the meantime, beware of simple processes that claim happy programmers guarantee happy customers. In the long run, we expect the industry will evolve toward an iterative process framework that can be easily