Write the whole thing, and only then, scrap it and rewrite it. This way you actually have a good understanding of the entire implementation when you are rewriting. When I refractor while writing my draft I will slow myself down and trip over myself, I'll be way more likely to rewrite something I've already rewritten.
Sure there is a limit to the size of projects this can work for, but even for massive projects they can still be broken into decently sized chunks. I'm just advocating for not rewriting function A as soon as you finish function B.
Write the whole thing, and only then, scrap it and rewrite it.
Exactly. And that's the part a lot of folks don't understand about writing tests. If we're not sure an interface will survive into the rewrite, it probably doesn't belong in the test suite.
And the rewrite can be very fast, if we tested the right things.