The Hallmarks of Iterative Development
Home
Up
Articles
Templates
Resume
BLOG
The Hallmarks of Iterative Development
Most people are familiar with the general tenets of Iterative Development techniques - time boxed iterations, demos of
business value at the completion of each iteration, emphasizing high risk / architecturally significant work
early in
the project lifecycle but there are also a number of other characteristics that aren't immediately evident that should also be
considered.  Below are some general observations that I have made regarding effective iterative development.  This is a blend
of different approaches ranging from the Unified Process to elements of XP, SCRUM and Lean Programming.
Rapid Feedback
Many people should be aware of this benefit but the primary goal of an iteration is taking a requirement (which represents
value) and realizing it in working, tested software.  This allows a business sponsor to actually see something working and
understand whether what they've asked for is what they actually want.  It has a beneficial byproduct of allowing a developer
to stay engaged and actively involved in realizing functionality.  In the perfect world this model consists of a requirements
specifier telling a developer what is desired and seeing that provided in small incremental chunks.  In the real world, the
two of these roles need to have some ways in which they can communicate requirements and ensure that what is being
asked for is specific and vague.  I personally think this can work very well using a
Scott Ambler, white board approach but it
can also work equally as well with rich sets of artifacts such as use cases, supplementary specifications, models and
leveraging UML.
Pull vs Push:
While there are different ways in which to achieve the  benefits of rapid feedback, I think a true iterative development
approach will always emphasize a pull model for specifying software.  By this I mean the idea that information should be
produced that meets the needs of the person consuming it.   Why produce a fully dressed,
Cockburn style use case if a
developer really only needs a short
XP style story.  On the other hand if a scenario is sufficiently complex and requires
System Sequence Diagrams and Operation Contracts the same developer should be able to receive these instead.  The
challenge often is that many processes are seen as prescriptive and information ends up being 'pushed' to its recipients
instead of being pulled.

These days I particularly like the idea of 'Executable Requirements' (XR) to capture requirements.  This approach has the
benefit of not only enabling the Pull method described above but they also ensure that software developed matches the
specifications provideds.  XR bsaically provides a mechanism where a requirement is captured in a 'pass/fail' style using
an Excel or HTML table to define the requirements.  The power of this approach is that it not only moves requirements out
of the fuzzy, prose style that can plague use cases (and which is why use cases have so many sections) but also allow a
team to automate a series of tests that demonstrate that a requirement has been 'fulfilled'.  For those of us with a testing
orientation we can immediately see the opportunity to regress through all of our tests every iteration and ensure that new
changes don't break old functionality.  There's a lot to this subject and something that I'll update on more in the future but
there are some good reference sources for this such as the
Fitnesse wiki which leverages Ward Cunningham's Functional
Integration Testing (FIT) framework.
Collaborative Development
This, to some degree, is an enabler of the first two points above but its worth pointing out because too often the creative
process of software development is compartmentalized into distinct disciplines which rely on artifacts as the sole form of
communication.  Small teams with a range of skills working on a common problem achieve success.  Teams should have a
simple construct of a leader, an analyst, a lead developer or architect, three or four developers and a tester. The
developers will play multiple roles including build management, deployment, persistence etc. but they should all be
somewhat interchangeable if necessary.  The goal is to have everyone
working together, literally, the entire team should be
sitting close to one another with no impediments to their communication amongst each other.  Later I'll discuss how to
scale this into a larger program setting but I think this is ultimately one of the most important hallmarks of iterative
development.
Quality at the Source
The days of having large teams of functional testers who manually execute test scripts and painstakingly document defects
are over.  Good software should be written with a net of small unit tests that are automatically and continuously executed
with every build.  Validating requirements through tests is important and necessary but these should be automated through
Fit/Fitness tests and the tolerance for discovering software defects (as opposed to requirements defects) after a build has
been completed should be almost zero.  Obviously (and my apologies if this isn't completely obvious)
continuous
integration and the development of a comprehensive and automated suite of test harnesses is critical to accomplishing
this goal.  I've written some piecs on how to manage the test process such as
Iterative Development Testing Approaches
and the
Top Ten Questions for a Project Test Plan.
Adaptive Planning
A detailed software development plan developed months in advance isn't worth the paper its printed on.  Instead a high
level set of Features mapped to timeboxed, iterations with a detailed view of the activities required to support the existing
iteration is the most realistic and effective approach to software development planning.  While having an overall plan,
identifying resources requirements, dependencies (particularly with other organizations or areas) and related PMI project
planning components is important it is even more important to have a lightweight and adjustable approach which supports
changes (which after all is most of what a project manager deals with on a software development project).  Tools like
XPlanner (an open source iterative development project management tool) or commercial products (like Rally Software)
provide a great mechanism for providing a blend between long term planning and short term execution.  I recently wrote a
blog entry on how to select the
correct iteration length for your project.
Continuous Improvement
Accepting the fact that you won't get everything right the first time is a critical hallmark of iterative development adoption.  
Developing a plan from what you know and then adjusting it based on what you experience is critical.  Every member of the
team should be involved in continuous learning and fostering a trusting environment where team members can safely
contribute their observations is the only way in which a true team can learn.  One technique frequently used is a
Retrospective at the completion of each iteration where teams share the Plus's and Delta's of the last iteration.  It's
important to ensure that these observations are put into practice though, so give some time to thinking how to facilitate
these sessions and ensure that they are useful.  The Japanese call this process
Kaizen which emphasizes a continuous
improvement process focused on eliminating waste and increasing efficiency.
July 2002
by Bryan Campbell
The Opinion piece was authored by Bryan Campbell, www.bryancampbell.com, all rights reserved.  Visit my blog at
blog.bryancampbell.com to learn more