The most difficult aspect of software development is deciding what, exactly, needs to be built.

The original Chaos Report shows the top three impediments to a successful development effort are lack of user input, incomplete requirements and specifications, and changing requirements and specifications [CHAOS].

No other activity, if done incorrectly, stands to compromise the system more than incorrect requirement specifications.

We cannot define detailed up-front requirements specifications and expect them to survive the development lifecycle intact.

We cannot establish an initial design of the conceptual construct and expect the structure to go unscathed throughout the process of construction.

Software development is an error prone human activity involving experts with varying backgrounds and skills who must come together and attempt to communicate uniformly, working as a team toward a common goal.

Agile project managers prioritize features based on stakeholder feedback, and make adjustments as the iterations progress.

Facilitating and negotiating requirements scope provides important feedback, helping plan future iterations, where each iteration produces a deliverable that can be shared with clients and stakeholders.

Agile software developers work with a similar set of goals, knowing functional software must be delivered early and often.

Agile software developers work to grow a code base built upon a solid foundation, where each day represents a step forward.

Agile software developers integrate frequently, and do not tolerate failed builds. A rich suite of tests provide the courage necessary to respond to change when the need arises.

Agile software developers avoid the notion of code ownership, empowering other developers to make improvements to any component of the software product.

Four practices used by successful agile software development teams are:

Releasing early and often to project stakeholders, using an iterative lifecycle.