I find TDD to be useful in two cases: 1. When I already know what I'm doing and it's just a matter of coding what's already in my mind 2. When I'm writing in a dynamically typed language, it forces me to be not lazy and have adequate test coverage since I don't have compile time type safety I do less of TDD when dealing with a statically typed language and/or when I'm working in an exploratory mode. TDD doesn't help…
1. When I already know what I'm doing and it's just a matter of coding what's already in my mind
A concept often used in TDD is spiking. If you don't know what you're doing, do a quick and dirty untested version until you do know what you're doing. Throw that code away and TDD it with your new found knowledge.