Analysis ->
Design ->
Code ->
Test
The major problem with the waterfall life cycle is that you don't get
any working program until the end, so analysis (finding out what the user
wants) and design bugs may go unnoticed until it is far too late. This
problem can be partly aleviated by using CASE (computer assisted software
engineering) which allow you to model your program design in some formal
language and check it for consistency.
Analysis -> Design
^ |
| v
Test <- Code
In each iteration of the spiral, you take some small chunk of what the
user wants, analyze them, figure out how to add them to the code you
have already, add them to your prototype program, then test them both
for bugs and for how well they meet the user's desires. Analysis and
design bugs may still occur, but they are spotted sooner and don't
affect as much code.