> Software engineering is not what I do when I program. I am programming. I write software as part of doing science. I use software as a machine or instrument to explore how the mind / brain might work. Not when the mind’s thinking—that’s old AI. I mean when people are creating.
I find that it's pretty common when I'm, say, tweaking gameplay in a game, that I have no trouble making the code behave the way I expect, but impossible to predict ahead of time how I will feel about different possible behaviors. I have to try them on to see how I feel in them. Adding tests to that feedback loop doesn't help; it just slows it down, dramatically slowing down the process of learning and exploration.
On the other hand, when I am writing code to meet someone else's needs rather than as a form of self-expression or exploration, I usually want the code to behave in a specific way, at least in certain situations, and to keep behaving that way as I make other changes to it in the future, unless I change my mind. In those cases I think it's very rare for automated tests to slow me down instead of speeding me up.
In languages with expressive static type systems like OCaml, the crossover happens a little later, because the static type system already constrains the program's behavior a lot. But automated tests still become very valuable very soon when I want a specific behavior.
I've also, unfortunately, worked on projects where the test suite we had was worse than nothing. Invariably it wasn't because we were throwing itching powder at tulips so that the optimal test suite would be empty; it was because we'd done a bad job writing the tests.