The core of agile software development is building system features incrementally by working in a collaboratively. Agile methods are all built around a key assumption – we continue to learn about a system and it’s operating environment during the project. When we recognize that our understanding develops during the project then we realize that freezing requirements during early project phases will either cause rework or the delivery of a system that does not meet the customer needs. We need an approach to software development that can embrace change during the project. Agile methods iteratively evolve both requirements and the system under development by planning the development in short cycles (weeks rather than months). This is not a new idea [3].

When we develop the system incrementally then this allows the customer/user to try the software developed during the project rather than waiting until the end. Their feedback can be used to refine the system behaviour.

When we move to an iterative lifecycle, we lose the traditional waterfall phases: analysis, design, code and test. These activities now run in parallel. This has an impact on how we organise a project team. Rather than assembling specialist teams dedicated to waterfall phases with handover artefacts, it makes more sense to form a cross-functional project team; a team of individuals whose task is to shape and deliver a software system together. Business people are needed throughout the project to explain how the system under development will generate business value and support the user community through different scenarios. Technical people are needed throughout the project to translate those requirements into executable code and verify the system meets conditions of satisfaction.