What is Agile Extreme Programming (XP)?
Extreme Programming (XP) is actually a deliberate and disciplined
approach to software development
As a type of agile software development,it advocates frequent
"releases" in short development cycles (timeboxing), which is intended to
improve productivity and introduce checkpoints where new customer requirements
can be adopted
Other elements of Extreme Programming include: programming in pairs or doing
extensive code review, unit testing of all code, avoiding programming of
features until they are actually needed, a flat management structure,
simplicity and clarity in code, expecting changes in the customer's
requirements as time passes and the problem is better understood, and frequent
communication with the customer and among programmers
In traditional system development methods (such as SSADM or the
waterfall model) the requirements for the system are determined at the
beginning of the development project and often fixed from that point on. This
means that the cost of changing the requirements at a later stage (a common
feature of software engineering projects) will be high. Like other agile
software development methods, XP attempts to reduce the cost of change by
having multiple short development cycles, rather than one long one. In this
doctrine changes are a natural, inescapable and desirable aspect of software
development projects, and should be planned for instead of attempting to define
a stable set of requirements.
Extreme Programming also introduces a number of basic values,
principles and practices on top of the agile programming framework
Basic Values of Extreme Programming
Extreme Programming initially recognized four values in 1999. A new
value was added in the second edition of Extreme Programming Explained. The
five values are:
Communication
Building software systems requires communicating system
requirements to the developers of the system. In formal software development
methodologies, this task is accomplished through documentation. Extreme
Programming techniques can be viewed as methods for rapidly building and
disseminating institutional knowledge among members of a development team. The
goal is to give all developers a shared view of the system which matches the
view held by the users of the system. To this end, Extreme Programming favors
simple designs, common metaphors, collaboration of users and programmers,
frequent verbal communication, and feedback.
Simplicity
Extreme Programming encourages starting with the simplest solution.
Extra functionality can then be added later. The difference between this
approach and more conventional system development methods is the focus on
designing and coding for the needs of today instead of those of tomorrow, next
week, or next month. This is sometimes summed up as the "you're not gonna need
it" approach. Proponents of XP acknowledge the disadvantage that this can
sometimes entail more effort tomorrow to change the system; their claim is that
this is more than compensated for by the advantage of not investing in possible
future requirements that might change before they become relevant. Coding and
designing for uncertain future requirements implies the risk of spending
resources on something that might not be needed. Related to the "communication"
value, simplicity in design and coding should improve the quality of
communication. A simple design with very simple code could be easily understood
by most programmers in the team.
Feedback
Within Extreme Programming, feedback relates to different
dimensions of the system development:
Feedback from the system: By writing unit tests or running periodic
integration tests, the programmers have direct feedback from the state of the
system after implementing changes.
Feedback from the customer: The functional tests (aka acceptance
tests) are written by the customer and the testers. They will get concrete
feedback about the current state of their system. This review is planned once
in every two or three weeks so the customer can easily steer the development.
Feedback from the team: When customers come up with new
requirements in the planning game the team directly gives an estimation of the
time that it will take to implement. Feedback is closely related to
communication and simplicity. Flaws in the system are easily communicated by
writing a unit test that proves a certain piece of code will break. The direct
feedback from the system tells programmers to recode this part
Courage
Several practices embody courage. One is the commandment to always
design and code for today and not for tomorrow. This is an effort to avoid
getting bogged down in design and requiring a lot of effort to implement
anything else. Courage enables developers to feel comfortable with refactoring
their code when necessary.This means reviewing the existing system and
modifying it so that future changes can be implemented more easily. Another
example of courage is knowing when to throw code away: courage to remove source
code that is obsolete, no matter how much effort was used to create that source
code. Also, courage means persistence: A programmer might be stuck on a complex
problem for an entire day, then solve the problem quickly the next day, if only
they are persistent.
Respect
The respect value manifests in several ways. In Extreme
Programming, team members respect each other because programmers should never
commit changes that break compilation, that make existing unit-tests fail, or
that otherwise delay the work of their peers. Members respect their work by
always striving for high quality and seeking for the best design for the
solution at hand through refactoring.
Adopting the four earlier values leads to respect gained from
others in the team. Nobody on the team should feel unappreciated or ignored.
This ensures high level of motivation and encourages loyalty toward the team,
and the goal of the project. This value is very dependent upon the other
values, and is very much oriented toward people in a team.
Principles of Extreme Programming
The principles that form the basis of XP are based on the values
just described and are intended to foster decisions in a system development
project. The principles are intended to be more concrete than the values and
more easily translated to guidance in a practical situation.
Feedback
Extreme Programming sees feedback as most useful if it is done
rapidly and expresses that the time between an action and its feedback is
critical to learning and making changes. Unlike traditional system development
methods, contact with the customer occurs in more frequent iterations. The
customer has clear insight into the system that is being developed. He or she
can give feedback and steer the development as needed.
Unit Tests
Unit tests also contribute to the rapid feedback principle. When
writing code, the unit test provides direct feedback as to how the system
reacts to the changes one has made. If, for instance, the changes affect a part
of the system that is not in the scope of the programmer who made them, that
programmer will not notice the flaw. There is a large chance that this bug will
appear when the system is in production.
Assuming simplicity
This is about treating every problem as if its solution were
"extremely simple". Traditional system development methods say to plan for the
future and to code for reusability. Extreme programming rejects these ideas.
The advocates of Extreme Programming say that making big changes all at once
does not work. Extreme Programming applies incremental changes: for example, a
system might have small releases every three weeks. When many little steps are
made, the customer has more control over the development process and the system
that is being developed.
Embracing change
The principle of embracing change is about not working against
changes but embracing them. For instance, if at one of the iterative meetings
it appears that the customer's requirements have changed dramatically,
programmers are to embrace this and plan the new requirements for the next
iteration
Extreme Programming Practices
Pair programming
Pair programming means that all code is produced by two people
programming on one task on one workstation. One programmer has control over the
workstation and is thinking mostly about the coding in detail. The other
programmer is more focused on the big picture, and is continually reviewing the
code that is being produced by the first programmer. Programmers trade roles
regularly.
The pairs are not fixed: it's recommended that programmers try to
mix as much as possible, so that everyone knows what everyone is doing, and
everybody can become familiar with the whole system. This way, pair programming
also can enhance team-wide communication
Planning Game
The main planning process within Extreme Programming is called the
planning game. The game is a meeting that occurs once per iteration, typically
once a week. The planning process is divided into two parts Release Planning
and Iteration Planning.
I-Release Planning: This is focused on determining what
requirements are included in which near-term releases, and when they should be
delivered. The customers and developers are both part of this. Release Planning
consists of three phases:
1.Exploration Phase: In this phase the customer will provide a
short list of high-value requirements for the system. These will be written
down on user story cards.
2.Commitment Phase: Within the commitment phase business and
developers will commit themselves to the functionality that will be included
and the date of the next release.
3.Steering Phase: In the steering phase the plan can be adjusted,
new requirements can be added and/or existing requirements can be changed or
removed.
II-Iteration Planning: This plans the activities and tasks of the
developers. In this process the customer is not involved. Iteration Planning
also consists of three phases:
1.Exploration Phase: Within this phase the requirement will be
translated to different tasks. The tasks are recorded on task cards.
2.Commitment Phase: The tasks will be assigned to the programmers
and the time it takes to complete will be estimated.
3.Steering Phase: The tasks are performed and the end result is
matched with the original user story
Test driven development
Unit tests are automated tests that test the functionality of
pieces of the code (e.g. classes, methods). Within XP, unit tests are written
before the eventual code is coded. This approach is intended to stimulate the
programmer to think about conditions in which his or her code could fail. XP
says that the programmer is finished with a certain piece of code when he or
she cannot come up with any further condition on which the code may fail.
Whole team
Within XP, the "customer" is not the one who pays the bill, but the
one who really uses the system. XP says that the customer should be on hand at
all times and available for questions. For instance, the team developing a
financial administration system should include a financial administrator.