Agile is not a recipe for success, is a recipe for failure...
Fail fast, cheap and learning during the process... Agile will not avoid the failure, but it will help to avoid failing in the same way, at the same problem or using a ton of resources.
Agile assume the following:
- We will fail to estimate.
- We will fail to understand the customer's requests.
- We will fail to select technologies.
- The requirements will change (always).
- Estimate very small chunks (or no estimate at all).
- Deliver running systems to obtain feedback and adapt the system to the real need of the customer.
- Use agile practices to have under control the technical debt and to allow maintenance/evolution of the system with a reasonable cost.
- Maximize the amount of work not done.
- Create code with good quality to make very easy to adapt it to future changes.
And all this process reinforced with a continuous improvement process (with retrospectives and team improvements).