Есть полно исследований, демонстрирующих эффективность TDD
Действительно. Если зайти на Google Scholar, забить ключевые слова «TDD» и «Эффективность» — будет много научных статей, но так ли все просто? Хоть я сам и являюсь большим фанатом TDD, но я так же считаю себя скептиком, и решил проверить, доказано ли научно, что TDD так крут.
Test-driven development (TDD) с нами уже долгое время, и все это время он был предметом горячих споров. Суть TDD в том, что начинать разработку надо с написания падающего Unit test, после чего пишется код, который сделает этот тест «зеленым», и так по циклу. Для тех, кто не в курсе, можно посмотреть руководство по TDD в IDE Idea.
Часть разработчиков уверены, что TDD улучшает эффективность и качество не менее чем до 146%. Часть разработчиков точно знает, что TDD — это полный бред, и писать тесты до написания кода — это как кататься лыжами по асфальту. Компромисса между этими группами разработчиков ждать не стоит.
Но вернемся к науке. По счастливой случайности, так совпало, что я учусь в магистратуре Wrexham Glyndŵr University по программе Computer Science with Big Data Analytics (кстати — всем рекомендую, и распишу про нее отдельно) и прямо сейчас прохожу модуль «Critical Research», где учат читать научные статьи и анализировать их достоверность.
Какие наши доказательства?
Исследований на тему эффективности и полезности TDD, действительно, много. Однако, если почитать сами исследования, можно заметить, что они приходят к противоречивым выводам.
К примеру, в докладе “An Experimental Evaluation of the Effectiveness and Efficiency of the Test Driven Development”, опубликованном в 2007 был сделан вывод, что TDD улучшает продуктивность разработчиков, при этом не оказывая влияния на качество [1].
В другом докладе, в котором были рассмотрены выводы нескольких других исследований и проведено собственное исследование, “Evaluating the Effectiveness of Test Driven Development: Advantages and Pitfalls”, 2017 пришли к выводу, что TDD может улучшить качество продукта, но приводит с снижению продуктивности. Дополнительно, было замечено, что большинство разработчиков находят TDD неестественным [2].
По результатам еще одного исследования, “A Replicated Experiment on the Effectiveness of Test-First Development”, 2013 исследователи не смогли обнаружить убедительного и значимого влияния Test-First или Test-Last подходов на продуктивность разработчика или качество продукта [3].
Чтобы забить гвоздь в гроб «доказанности» эффективности и полезности TDD, можно почитать обзорный отчет “Overview of the Test Driven Development Research Projects and Experiments”, 2012 [4], в котором, на основе большого количества доступных исследований пытались придти к выводу о доказанности эффективности и положительном эффекте TDD. Авторы заключили, что не существует убедительных доказательств о положительном эффекте TDD. Различия в результатах предыдущих исследований авторы обосновали Confirmation bias — исследования, которые показали эффективность TDD изначально исходили из гипотезы, что TDD — эффективен.
Так почему же люди (включая меня), считают TDD отличной практикой?
После прочтения исследований, у меня есть только один логичный ответ — эффективность и применимость TDD зависит, прежде всего, от конкретного разработчика. Исследования эффективности TDD, видимо, недостаточно учли, что разработчики — не роботы, а TDD — не программа. Для части разработчиков, TDD принесет хорошие результаты, для части — не будет значимой разницы между TDD и простым написанием Unit tests, для части — TDD приведет к падению качества, продуктивности и мотивации.
Программирование — это социальная активность. Проблема с социальным взаимодействиями — это то, что это не точная наука. Осталось придумать как провести более-менее научный эксперимент чтобы подтвердитьопровергнуть эту гипотезу. Для начала предлагаю опрос.
Если вдруг вы захотите поделиться этой публикацией с англоязычными коллегами — есть чуть более формальная английская версия: medium.com/@alexspush/is-tdd-effective-2474c0471ac4
Список источников
[1] A. Gupta, P. Jalote “An Experimental Evaluation of the Effectiveness and Efficiency of the Test Driven Development” presented at First International Symposium on Empirical Software Engineering and Measurement, Madrid, Spain, 2007[2] Z. Khanam, M. Ahsan, “Evaluating the Effectiveness of Test Driven Development: Advantages and Pitfalls” International Journal of Applied Engineering Research vol. 12, no 18, p. 7705, 2017. Available: www.ripublication.com/ijaer17/ijaerv12n18_81.pdf. [Accessed May 13, 2020].
[3] D. Fucci, B. Turhan, “A Replicated Experiment on the Effectiveness of Test-first Development” presented at ACM / IEEE International Symposium on Empirical Software Engineering and Measurement, Baltimore, MD, USA, 2013
[4] A. Bulajic, S. Sambasivam and R. Stojic “Overview of the Test Driven Development Research Projects and Experiments” presented at Proceedings of Informing Science & IT Education Conference (InSITE), 2012. Available: pdfs.semanticscholar.org/3278/971bb53a25822171df127d47a57243dd3bbd.pdf. [Accessed May 13, 2020].