Jest ich sporo, ale zalety zdecydowanie przewyższają wady.
Istnieje stroma krzywa uczenia się.
Wydaje się, że wielu programistów spodziewa się, że od pierwszego dnia będą mogli efektywnie programować od pierwszego testu. Niestety zdobycie doświadczenia i programowanie z taką samą prędkością jak wcześniej zajmuje dużo czasu. Nie da się tego obejść.
Mówiąc ściślej, bardzo łatwo się pomylić. Możesz bardzo łatwo (z bardzo dobrymi intencjami) napisać całą masę testów, które albo są trudne do utrzymania, albo testować niewłaściwe rzeczy. Trudno tu podać przykłady - tego rodzaju problemy wymagają doświadczenia. Musisz dobrze rozdzielić problemy i zaprojektować testowalność. Moja najlepsza rada tutaj to programowanie parami z kimś, kto naprawdę dobrze zna TDD.
Robisz więcej kodowania z góry.
Test-first oznacza, że nie możesz pominąć testów (co jest dobre) i oznacza, że skończysz pisać więcej kodu z góry. To oznacza więcej czasu. Znów nie da się tego obejść. Otrzymujesz nagrodę za kod, który jest łatwiejszy w utrzymaniu, rozszerzaniu i generalnie mniej błędów, ale zajmuje to trochę czasu.
Może być trudną sprzedażą dla menedżerów.
Menedżerowie oprogramowania zazwyczaj zajmują się tylko osiami czasu. Jeśli przejdziesz do programowania pierwszego testu i nagle poświęcasz 2 tygodnie na ukończenie funkcji zamiast jednej, nie spodoba im się to. To zdecydowanie bitwa, którą warto stoczyć, a wielu menedżerów jest wystarczająco oświeconych, aby ją zdobyć, ale może to być trudna sprzedaż.
Może być trudną sprzedażą dla innych programistów.
Ponieważ istnieje stroma krzywa uczenia się, nie wszyscy programiści lubią programować w pierwszej kolejności. W rzeczywistości zgaduję, że na początku większość programistów tego nie lubi. Możesz robić rzeczy takie jak programowanie parami, aby pomóc im nabierać prędkości, ale może to być trudna sprzedaż.
W końcu zalety przeważają nad wadami, ale nie pomaga, jeśli po prostu zignorujesz wady. Wiedza o tym, z czym masz do czynienia od samego początku, pomaga ci pokonać niektóre, jeśli nie wszystkie, wady.