- PVSM.RU - https://www.pvsm.ru -

TDD не работает

TDD не работает - 1

TDD не работает.

Правда? Странно. У меня всегда работал хорошо.

А вот новое исследование [1] говорит об обратном.

Новое исследование?

Да, глубокое исследование, повторившее шаги другого исследования, проведенного несколько лет назад. Оба показали, что TDD не работает. Новое исследование проходило в нескольких местах, использовало слепой анализ. Выглядит убедительно.

Авторы считают его убедительным?

Авторы рекомендуют проводить новые исследования. Но они скорее всего просто скромничают. Результаты довольно убедительные.

Какие результаты?

Исследование показывает, что утверждения про TDD – ложь. TDD не увеличивает скорость разработки. Не уменьшает количество дефектов. Не помогает писать более качественный код.

Очень странно. Мне кажется, что TDD увеличивает мою скорость, улучшает мой код и точность. Я знаю других людей, которые согласятся со мной. Для меня удивительно, что исследование пришло к другому выводу.

Ну, тем не менее. DHH был прав. TDD is Dead [2].

Хмм. Хорошо, так что именно сделали авторы исследования? Как они пришли к такому выводу?

Я не знаю. Я знаю только, что было исследование.

Как ты узнал про это исследование?

Я прочитал про него в блоге [3]. В конце автор сказал, что оно заставило его переосмыслить TDD. Он считал, что TDD работал.

Что же, хорошо, давай посмотрим на это исследование. Хмм… Да, тут говорится, что они сравнивали TDD с TLD.

Что такое TLD?

Test LAST development. Это когда ты пишешь юнит-тесты после написания кода.

Ну вот! Исследование показало, что лучше писать тесты в самом конце!

Хмм. Нет, кажется, это совсем не то, что показало исследование. Вообще-то оно показало, что нет существенной разницы.

Ну хорошо. То есть если я пишу код, а потом пишу тесты, то это не хуже, чем TDD.

Ну, не совсем. Во всяком случае это не то, о чем говорит исследование. В его ходе сторонников TLD просили работать "небольшими кусками".

Небольшими кусками?

Да. Сторонники TLD писали немного продакшн-кода, а потом немного тестов.

Ага, понял. То есть они писали продакшн-код 10 минут, а потом 10 минут писали тесты, или что-то в этом роде.

Ну, возможно. Но, смотри, тут говорится, что все участники имели TDD-подготовку. А потом некоторых из них просили делать TLD маленькими кусками.

Ага. ОК. Ну, мое утверждение все еще верно. Они писали продакшн-код, потом писали юнит-тесты. И это ни на что не повлияло.

Позволь задать вопрос: как бы ты писал юнит-тесты после продакшн-кода, но небольшими кусками.

Я бы написал немного продакшн-кода – достаточно, чтобы пройти пару тестов, а потом бы написал эти тесты.

Как бы ты понял, сколько кода нужно для удовлетворения пары тестов?

Я бы представил пару тестов, а потом написал бы удовлетворяющий их код. Потом бы написал тесты.

У тебя есть навыки в TDD; такой стиль мышления [4] был бы очевидным для тебя, правда?

Мм… Хмм… Кажется, я понял, о чем ты. TLD'шники просто делали TDD в голове, а потом реализоывали все в обратном порядке.

Правильно. Чтобы работать небольшими кусками, им нужно было представить тесты заранее. Чтобы можно было написать поддающийся тестированию продакшн-код.

Может быть это исследование не исследовало то, что было задумано.

Мне кажется они пытались исследовать порядок написания тестов, а не сам процесс TDD. В попытках уменьшить количество переменных, они избавились от них всех. Они заставили TLD-участников использовать процесс TDD короткими циклами. И это заставило участников работать над кодом и думать о тестах заранее.

ОК. Может быть. Но все же эти TLD'шники писали тесты в конце. Тесты показали как минимум то, что не нужно обязательно писать тесты вначале – как минимум если работа проходить короткими циклами.

Конечно. Эффективность TDD зависит от размера цикла, и в меньшей степени от первоочередности тестов. Мы пишем тесты заранее, потому что это подталкивает к сокращению длины циклов.

То есть это исследование показало, что люди, работающие короткими циклами, могут не волноваться о написании тестов заранее. Главное продолжать работать короткими циклами.

Похоже на справедливое заключение. Но, взгляни сюда. Участники работали над проблемой The Bowling Game. Это очень маленькая задача. Они сказали, что на все про все им понадобилось всего три часа.

Это важно?

Конечно. Польза в написании тестов заранее это дисциплина. Написание тестов заранее не дает циклу разрастаться. Сохраняет высокую степень покрытия на протяжении длительных периодов времени.

Да, но если у тебя достаточно дисциплины чтобы сохранять циклы короткими, то, согласно исследованию, без разницы когда писать тесты.

Да, но это больше "если". Исследование показывает, что если взять группу людей, имеющих подготовку в TDD, и сказать им все делать также, в том числе сохранить циклы разработки, и лишь изменить порядок написания тестов, то за три часа программирования невозможно заметить никакой разницы.

Ага. Ага. Исследование показывает именно это.

Так что в реальности исследование делало различие без отличия.

Ну… Хе-хе, они не обнаружили отличий, так что, пожалуй, да.

То есть исследование не показало, что TDD не работает, правда?

Нет, пожалуй, не показало.

Что же оно показало?

Думаю, оно показало, что нельзя интерпретировать выводы исследований без прочтения исследований.

Автор: freetonik

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/razrabotka/208734

Ссылки в тексте:

[1] новое исследование: http://people.brunel.ac.uk/~csstmms/FucciEtAl_ESEM2016.pdf

[2] TDD is Dead: http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html

[3] в блоге: http://neverworkintheory.org/2016/10/05/test-driven-development.html

[4] мышления: http://www.braintools.ru

[5] Источник: https://habrahabr.ru/post/314994/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best