My workflow used to be:
1. Draft rough spec
2. Write a bunch of C/C++ code
3. Test manually
Now it's more like: 1. Put some actual care into a detailed spec
2. Write equally detailed test harness spec
3. Hand both specs to clanker. Surf HN for a while
4. Review target code casually
5. Review test harness very carefully
6. Run test(s) manually (or, lately, get the clanker to do that too)
7. Iterate if necessary, going back to step 1, 2, or 3 as appropriate
This doesn't necessarily even save that much time, but it makes the job easier and more enjoyable, and it forces me to do things I should've been doing all along. If steps 1, 2, and 5 are done properly, step 4 can be "Meh, whatever, LGTM."The analogy I like to use is Harold Black's work in the 1930s, trying to convince the patent office and his peers that yes, negative feedback is a huge, huge F'ing deal, because it only takes a small amount to make a large improvement in linearity. Anytime you have something that is 95% as good as it needs to be, it will be good enough if you can wrap a loop around it.