TDD as in religion is overrated. TDD done right is IMHO extremely effective.
The problem is, writing good tests is really hard, and I have seen/committed/experienced a lot of bad tests... just the top of my mind problems with TDD done wrong:
- testing the implementation instead the interface
- creating a change detector
- not writing / factoring the tests in a good way
- writing tests / TDD w/o having an overall design for the software
For every non trivial piece of software written w/o TDD, I always saw the same pattern: First few hours/days/weeks, rapid progress compared to TDD, afterwards: hours/days/weeks wasted in debugging, bug fixing etc... and the people can not even catch up with tests if they wanted.
Is TDD always the answer? Of course not, it is a tradeoff like everything else in technology. OTOH I have yet to see a project which benefited from not using TDD by any metric after a few days in.