We've looked at a few different practices that specifically target increasing our confidence when using an incremental delivery approach.
Refactoring helps us keep our software in a healthy and easy to maintain state. Using the analogy of the field, it's essential that we keep the weeds down because before we know it, we may be dealing with thickets or bushes. To do this, we regularly garden our code as we enhance or add to existing areas of functionality.
We can think of Test-Driven Design (TDD) or specification driven approach because it changes our thought processes regarding how we write software compared to a test-after pattern.
Refactoring and TDD support an emergent approach to designing our software. So, although we still require some architectural design upfront, we require less big-design thinking overall.
Also, the resulting TDD automated test suite...