Why do I favour practices like developer testing, TDD, refactoring and continuous integration?

It's to enable rapid & sustained evolution of *working* software.

The odds of delivering the right thing in a single pass are so remote that many iterations are likely required.

And even when we hit the bullseye, it's almost always a moving target. Not least because putting software into an environment has a tendency to change that environment and the problems we need to solve.

And cue people saying "But Jason, there are *other ways* to rapidly and sustainably iterate release-ready software!"

That may be. Feel free to list them 🙂

@jasongorman and cue management insisting on a gantt chart plan and why are you deviating from it. Plenty of “managers” in the software industry are in complete and utter denial
@jasongorman Also, if you're making software for use inside of a business: businesses change! All the time, and for reasons which have nothing to do with the software. But that also means what they need from the software changes.
@cammerman This is the thing about evolution: it doesn't happen in isolation.
@jasongorman now tell that to interviewers...