TDD на первый взгляд выглядит хорошо, но потом начинается свистопляска.
С одной стороны, код, находящийся под контролем тестов, выглядит очень красиво, к нему не прикопаешься, потому что тесты его как бы "зажимают" в правильный вид. Есть такое выражение "пуленепробиваемый код". Когда такого кода много, смотреть на него - одно удовольствие.
С другой стороны, я как-то около месяца просидел, обкладывая тестами будущую программу, в которой не было ничего, кроме воздуха. А потом просто потерял мотивацию и программу уже писать не хотелось.
Это выглядит так:
Однажды ты хочешь написать классную программу, которая делает это, это и это. Ты, находясь под впечатлением от её возможностей (в воображении), продумываешь все её компомненты в голове до мельчайших подробностей и готов броситься в бой. Уже видишь эти данные, полученные из неё в результате, и уже лазишь по ним, применяя там-то и там-то.
Но надо соблюсти правила TDD и ты утопаешь в этих покрытиях каждой шпуньки тестами со всех сторон. В результате, у тебя множество тестов, длинная история в репозитории из их создания и ноль программы.
А ведь нужна именно программа, а не тесты к ней.
Поэтому сейчас делаю программу вообще без тестов (прототип), чтобы проявить все подводные камни, а потом пишу тесты и уже новую программу. При этом всё это происходит под мотивацию, получаемую из данных (прототипа), ради которых вся эта программа и затевалась.
Но это ещё не всё. Однажды наступает момент, когда программу надо не отрефакторить, а кардинально изменить. (А это самое важное - вовремя убрать какой-нибудь тупик, к которому всё идёт. Если этого не делать, программа будет представлять из себя конгломерат из затычек - и пример уже есть, десятой версии.) И становится просто жалко стирать тесты, которые к новой версии вообще не подходят.