I was watching a talk by Martin Fowler and Neal Ford (the introduction is in French, but the talk is in English) and Neal remarked that in many projects, requirements are unstable. That sparked a realization…
While this is certainly true, I’ve been involved in quite a few projects where what was required was absolutely stable, but the design changed significantly once the coding started. In these cases, discoveries were made as the project progressed that increased the understanding of the system, which in turn implied logical changes to the requirements and design.
Agile is a learning method; waterfall is not.
Agile methods can easily adapt to changes. You can use Agile methods to do waterfall development, but the converse is not true.
Which is yet another reason that I strongly prefer Agile methods over more traditional, rigid methodologies.