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