My personal approach usually boils down to:
1. Nail the requirements spec
2. Iterative rapid-prototypes of core functionality with regular stakeholder input
3. Re-build (usually 90% from scratch, although I'll keep any prototype code that I feel stands up well)
4. Test
It's a bit of a mish-mash of models, but it's served me well.