Проблема в том, что разработчики не могут писать код без ошибок.
Более того, в сколько-нибудь сложных программных системах при внесении каких-либо изменений слишком сложно понять, как это отразится на других частях.
Для того, что бы минимизировать поиски этих багов и ускорить их обнаружение пишутся юнит тесты.
ТДД про то, что бы писать тесты до кода.
Зачем это надо? Потому что такой подход помогает лучше структурировать в голове необходимую функциональность перед написанием непосредственно кода.
Такой подход позволяет избегать избыточного усложнения кода, потому что подход "tests first" не позволяет написать полотнище сложного кода, не проверив правильность его работы.
Плюсов достаточно.
Теперь по поводу того, нужно ли ТДД всегда.
ТДД нужно не всегда, как и красивый, производительный и правильно работающий код.
Иногда, нужно закостылить MVP, проверить бизнес-идею и продолжить жить. В таком подходе 20% времени, потраченные на юниты - непозволительная роскошь.
Иногда, вы пишете систему, сложность которой такова, что держать в голове матрицу состояний даже одного модуля не представляется возможным. И тут уже без юнит-тестов никак. Тут ТДД будет полезно.
Резюмируя. ТДД - отличный инструмент. Он позволяет не откладывать на потом написание юнит тестов, добиваться хорошего покрытия и, что важнее всего, контролировать изменения, вносимые в систему. Любая неожиданная ветка поведения приведет к падению тестов.
Как и любой инструмент - ТДД хорошо тогда, когда ты применяешь его своевременно, правильно и по назначению.
Писать тесты когда продакшен в огне, а компания терпит крах - плохая идея. Везде нужен здравый смысл.