Concept: Evolve to continuously obtain feedback and improve
Promote practices that allow the team to get early and continuous feedback from stakeholders, and demonstrate incremental value to them.
Relationships
Main Description

Introduction

It is usually not possible to know all stakeholders' needs, be aware of all project risks, comprehend all project technologies, or know how to work with your colleagues. Even if it were possible to know all of these things, they are likely to change over the life of the project. Promote practices that allow the team to demonstrate incremental value, and to get early and continuous feedback from stakeholders.

The intention behind this principle is to continuously get feedback, and to improve both the product and the process of the project team. When you provide structure and create a mindset for continuous feedback and improvement, changes are accommodated more easily. In addition, feedback is captured early and often, and high-priority risks are confronted early in the project. By constantly identifying and attacking risks, there is more confidence in project progress and quality.

Not only does the product evolve, but the team also finds better ways to work together and get involved with stakeholders. The process followed by the team can be adjusted accordingly to leverage lessons learned and adjust project pace and needs.

Practices

Develop your project in iterations

Developing a system in a single, linear pass is difficult, because it makes it expensive to incorporate changes and new knowledge. Worse, it can delay the discovery and mitigation of risks, because development efforts are scheduled later in the lifecycle.

Divide your project into a series of time-boxed iterations, and plan your project iteratively. This iterative strategy enables you to incrementally deliver capabilities (such as an executable, usable subset of implemented and tested requirements) that can be assessed by stakeholders at the end of each iteration. This provides rapid and timely feedback loops, so that issues can be addressed and improvements made at a lower cost. Also, this is accomplished while you still have sufficient budget and time left to do so, and you have not gone so far ahead that major rework is required.

Iterative development enables teams to continuously improve software throughout the development lifecycle.

Focus iterations on meeting the next management milestone

A project can appear to make progress while risks and unresolved issues pile up. Focus on bringing closure to important project issues (such as stakeholder concurrence regarding scope, and proving the proposed architecture).

Divide the project into phases (such as Inception, Elaboration, Construction and Transition), with each phase having a clearly visible management milestone. The focus of each iteration within a phase is on achieving that milestone.

Manage risks

Deferring difficult and risky issues until later in a project significantly increases the risk of project failure. Such procrastination may lead to investing in the wrong technologies, a bad design, or a set of requirements that may not address stakeholder needs.

Attack risks early, or they will attack you. Continuously identify and prioritize risks, and then devise strategies to mitigate them. Determine the focus of iterations based on risks. For example, architecturally significant risks should be addressed early in the project, no later than the end of the Elaboration phase, when the architecture has been proven and baselined.

Fore more information, see Guideline: Managing Risks.

Embrace and manage change

Change is inevitable, and while change presents opportunities to enhance stakeholder value, unconstrained change will result in a bloated, deficient system and unmet stakeholder needs. Furthermore, the later in the development cycle a change is made, the more the change is likely to cost.

Embrace and manage change. Embracing change helps you to build a system that addresses stakeholder needs, and managing change allows you to reduce costs and improve predictability of those changes. Changes made early in the project can usually be made with limited cost. As you progress in your project, changes can become increasingly costly.

To satisfy customer needs, you typically need to introduce changes to the project, but the customer must be made aware of the impact that those changes have on the project cost and schedule. Understand the impact of a change in the current phase, and isolate team members from disruptive changes during the current iteration. Change requests are reviewed and prioritized during the current iteration, but are not acted upon until assigned to a future iteration.

If necessary, document the changes. For informal projects, a discussion with stakeholders may be enough.

Measure progress objectively

If you do not objectively know how your project is progressing, you do not really know if it is failing or succeeding. Uncertainty and change make a software project’s progress difficult to measure objectively, and people are prone to making objective assessments from subjective information.

Get a clear picture of project status by objectively measuring progress. The best measure of progress is the delivery of working software, which is something that you do by taking an evolutionary approach. You can also define a set of objective metrics to collect during an iteration (for example, requirements that were implemented and validated, number of defects issued compared with number fixed) and review them as part of the iteration assessment.

Continuously re-evaluate what you do

On a regular basis, ask questions and verify assumptions about the project. Regularly meet with the team to track status and identify risks and issues. This can be done daily when the team gathers to share the status of individual responsibilities and identify and address issues. At the end of iterations, assess the status of what has been done and look for areas of improvement that can be addressed in the next iteration. Have a retrospective review at the end of the project and capture lessons learned to run future projects in a more efficient way.

If we always challenge what we do and seek new, innovative ways to develop software, we improve how we work. This leads to improved project results.