Względna efektywność kosztowa rozwoju opartego na testach (akceptacja)

15

Chciałbym wiedzieć, jaki jest ogólny wpływ planowania zasobów na projekt oprogramowania, gdzie wymagania i projekt projektu są napędzane przez automatyczne testy akceptacyjne i testy jednostkowe, w przeciwieństwie do bardziej „tradycyjnego” podejścia do tworzenia oprogramowania.

wprowadź opis zdjęcia tutaj

Jaki, z twojego doświadczenia, jest ogólny wpływ na wymagania dotyczące zasobów do ukończenia projektu oprogramowania w ramach TDD, w przeciwieństwie do bardziej „tradycyjnych” metodologii programistycznych? Wydaje mi się oczywiste, że jakość wzrośnie, a poziom niepewności spadnie, ponieważ testy są wykonywane wcześniej, ale wymaganie testów z wyprzedzeniem wydaje się wymagać więcej godzin pracy programisty. O ile wzrósł wysiłek programistyczny, czy faktycznie maleje z powodu eliminacji błędów z góry?

Ile wysiłku wymaga klient? Czy muszą zmienić sposób, w jaki odnoszą się do projektu, zwłaszcza jeśli są przyzwyczajeni do dużego projektu z góry? Czy liczba godzin wymaganych od klienta ogólnie wzrasta, czy faktycznie maleje?

Wyobrażam sobie, że szacunki czasowe byłyby bardzo niejasne w iteracyjnym procesie TDD na początku projektu TDD (ponieważ nie ma Planu Rozwoju Oprogramowania). Czy jest sens, powiedzmy, 20% w projekcie, w którym zaufanie rośnie na tyle, że klientowi można w końcu uzyskać mniej więcej stabilny szacunek czasu i pieniędzy?

Uwaga: nie szukam tutaj subiektywnych opinii ani teorii, więc proszę nie spekulować. Szukam bardziej rzeczywistego doświadczenia w TDD.

Robert Harvey
źródło
Jestem pewien, że nie ma danych z prawdziwego świata. Otrzymujesz tylko subiektywne opinie i teorie oparte na prawdziwych doświadczeniach peoeple.
Euforyczny
1
@Euphoric: Szukam obiektywnych obserwacji i rzeczywistości opartych na doświadczeniach z prawdziwego świata. Przepraszam, że nie wyjaśniłem tego. Nie potrzebuję jednak twardych liczb; Zaakceptuję ogólne wrażenia, takie jak: „chociaż nasz czas programowania znacznie się wydłużył, nasze koszty konserwacji spadły, ponieważ oprogramowanie było bardziej niezawodne, a klient lepiej rozumiał oprogramowanie, ponieważ uczestniczył w projektowaniu podczas prac rozwojowych”.
Robert Harvey
2
Czy to pytanie jest oparte na opiniach? To na pewno brzmi jak jeden
BЈовић
@ BЈовић: Zobacz ostatni akapit w moim pytaniu.
Robert Harvey

Odpowiedzi:

11

Pierwszą rzeczą, którą należy stwierdzić, jest to, że TDD niekoniecznie podnosi jakość oprogramowania (z punktu widzenia użytkownika). To nie jest srebrna kula. To nie jest panaceum. Zmniejszenie liczby błędów nie jest powodem, dla którego robimy TDD.

TDD odbywa się przede wszystkim dlatego, że zapewnia lepszy kod. Mówiąc dokładniej, TDD powoduje, że kod jest łatwiejszy do zmiany .

To, czy chcesz korzystać z TDD, zależy bardziej od twoich celów projektu. Czy będzie to krótkoterminowy projekt doradczy? Czy wymagane jest wsparcie projektu po uruchomieniu? Czy to jest trywialny projekt? W takich przypadkach dodatkowe koszty ogólne mogą nie być tego warte.

Jednak z mojego doświadczenia wynika, że ​​propozycja wartości TDD rośnie wykładniczo, ponieważ czas i zasoby zaangażowane w projekt rosną liniowo.

Dobre testy jednostkowe dają następujące korzyści:

  1. Testy jednostkowe ostrzegają twórców przed niezamierzonymi skutkami ubocznymi.
  2. Testy jednostkowe pozwalają na szybki rozwój nowej funkcjonalności na starych, dojrzałych systemach.
  3. Testy jednostkowe zapewniają nowym programistom szybsze i dokładniejsze zrozumienie kodu.

Skutkiem ubocznym TDD może być mniej błędów, ale niestety z mojego doświadczenia wynika, że ​​większość błędów (szczególnie tych najbardziej paskudnych) jest zwykle spowodowana niejasnymi lub złymi wymaganiami lub niekoniecznie będzie objęta pierwszą rundą testów jednostkowych.

Podsumować:

Rozwój wersji 1 może być wolniejszy. Rozwój wersji 2-10 będzie szybszy.

Stephen
źródło
1
Podoba mi się wyraźne zestawienie różnic między „lepszym kodem” a podnoszeniem „jakości oprogramowania”, to znaczy, że rzeczy, które programiści cenią w kodzie, niekoniecznie muszą robić to, czego chce klient.
1
Czy wstępne testy akceptacyjne i testy jednostkowe nie powinny wyjaśniać wymagań?
Robert Harvey
@RobertHarvey Powinny być, ale niekoniecznie . Testy jednostkowe i testy akceptacyjne będą odzwierciedlać zrozumienie przez dewelopera wymagań, gdy zostaną napisane. Deweloperzy mogą mieć wszystko, od pełnego zrozumienia do braku zrozumienia wymagań, gdy zaczynają pisać oprogramowanie. Ta część równania zależy znacznie bardziej od klienta i menedżera produktu niż cokolwiek innego. Teoretycznie testy powinny bardzo pomóc. W praktyce „zależy”.
Stephen
1
Powinienem wyjaśnić, że mówimy tutaj o TDD w izolacji, a nie o implementacji SCRUM, która zawiera TDD. W izolacji TDD polega wyłącznie na pisaniu testów, dzięki czemu można pisać lepsze kody, a później można je refaktoryzować szybciej i bezpieczniej.
Stephen
1
@Stephen: Być może powinienem był wyjaśnić, że mówię o smaku TDD, który obejmuje testy akceptacyjne jako część procesu zbierania wymagań. Dodałem grafikę do pytania, aby było to jaśniejsze.
Robert Harvey
6

W rozdziale Tworzenie oprogramowania o rozwoju opartym na testach znajduje się rozdział , który cytuje omawiany tutaj artykuł .

Studia przypadków przeprowadzono z trzema zespołami programistycznymi w firmie Microsoft i jednym w IBM, które przyjęły TDD. Wyniki studiów przypadków wskazują, że gęstość defektów przed wydaniem czterech produktów spadła od 40% do 90% w stosunku do podobnych projektów, które nie stosowały praktyki TDD. Subiektywnie zespoły odnotowały 15–35% wzrost początkowego czasu rozwoju po przyjęciu TDD.

To, czy wyniki te można uogólnić w twoim przypadku, jest oczywiście oczywiste, a zwolennicy TDD twierdzą, że jest to nieprawda.


źródło
4
Problem z tym badaniem polega na tym, że nie testowali kodu jednostki przed adaptacją TDD. TDD nie jest magicznym narzędziem, które zmniejsza liczbę defektów o 40-90%, po prostu adoptując
BЈовић
1
@ BЈовић Nie sądzę, by twierdzili, że „magią” nigdzie w tym artykule. Twierdzą, że niektóre zespoły przyjęły TDD, niektóre nie, otrzymały „podobną” pracę oraz odnotowano gęstość wad i czasy rozwoju. Gdyby i tak zmusili zespoły spoza TDD do napisania testów jednostkowych, aby wszyscy mieli testy jednostkowe, nie byłoby to badanie ważne z ekologicznego punktu widzenia.
Badanie ważne z ekologicznego punktu widzenia? Sorta zależy od tego, co mierzysz. Jeśli chcesz wiedzieć, czy pisanie testów z góry ma znaczenie, wszyscy muszą pisać testy jednostkowe, nie tylko grupa TDD.
Robert Harvey
1
@robert Harvey to kwestia mylących zmiennych, a nie ważności ekologicznej. Zaprojektowanie dobrego eksperymentu wymaga odmienienia tych. Na przykład, gdyby grupa kontrolna pisała testy jednostkowe post hoc, ludzie twierdziliby, że eksperyment nie był uzasadniony, ponieważ grupa kontrolna pracowała w sposób niespotykany na wolności.
2
Na szczęście nie powiedziałem, że są.
5

Nie mam żadnych dokumentów naukowych ani statystyk, które mogę ci przekazać, ale opowiem o swoich doświadczeniach z pracy w zespole / organizacji, która historycznie miała niską do średniej liczbę testów jednostkowych i żadnych testów kompleksowych, i stopniowo przesunięcie poprzeczki do miejsca, w którym jesteśmy teraz, z bardziej ATDD (ale, o ironio, nie tradycyjnym TDD).

W szczególności tak wyglądały harmonogramy projektu (i wciąż rozgrywane w innych zespołach / produktach w tej samej organizacji):

  • Do 4 tygodni analizy i wdrożenia
  • 2 tygodnie testów regresji, naprawy błędów, stabilizacji i przygotowania do wydania
  • 1-2 tygodnie naprawy znanych usterek
  • 2-3 tygodnie czyszczenia kodu i problemów postprodukcyjnych / wsparcia (nieznane wady / nieplanowane przestoje)

Wydaje się to niedorzeczne, ale w rzeczywistości jest bardzo powszechne, po prostu często jest maskowane w wielu organizacjach przez brak lub nieskuteczną kontrolę jakości. Mamy dobrych testerów i kulturę intensywnych testów, więc te problemy są wychwytywane wcześnie i naprawiane (przez większość czasu), a nie wolno im grać powoli przez wiele miesięcy / lat. 55-65% kosztów utrzymania jest niższe niż powszechnie przyjęta norma 80% czasu poświęcanego na debugowanie - co wydaje się rozsądne, ponieważ mieliśmy pewne testy jednostkowe i zespoły międzyfunkcyjne (w tym QA).

Podczas pierwszego wydania naszego zespołu przez nasz najnowszy produkt zaczęliśmy modernizować testy akceptacyjne, ale nie były one dość wymagające i wciąż musieliśmy polegać na wielu testach ręcznych. Wydanie było nieco mniej bolesne niż inne, IMO częściowo z powodu naszych przypadkowych testów akceptacyjnych, a także częściowo z powodu naszego bardzo wysokiego zasięgu testów jednostkowych w porównaniu z innymi projektami. Mimo to spędziliśmy prawie 2 tygodnie na regresji / stabilizacji i 2 tygodnie na kwestiach poprodukcyjnych.

Natomiast każde wydanie od pierwszego wydania miało kryteria wczesnej akceptacji i testy akceptacyjne, a nasze obecne wersje wyglądają następująco:

  • 8 dni analizy i wdrożenia
  • 2 dni stabilizacji
  • 0-2 połączone dni wsparcia poprodukcyjnego i czyszczenia

Innymi słowy, przeszliśmy od 55–65% kosztów utrzymania do 20-30% kosztów utrzymania. Ten sam zespół, ten sam produkt, a główną różnicą jest stopniowe doskonalenie i usprawnianie naszych testów akceptacyjnych.

Koszt ich utrzymania wynosi na sprint 3-5 dni dla analityka ds. Kontroli jakości i 1-2 dni dla programisty. Nasz zespół ma 4 programistów i 2 analityków ds. Kontroli jakości, więc (nie licząc UX, zarządzania projektami itp.) To maksymalnie 7 osobodni na 60, które zaokrąglić do 15% narzutów związanych z wdrożeniem bezpieczna strona.

Wydajemy 15% każdego okresu wydania na opracowanie automatycznych testów akceptacyjnych, a tym samym jesteśmy w stanie wyciąć 70% każdego wydania, przeprowadzając testy regresji i naprawiając błędy przedprodukcyjne i postprodukcyjne.

Być może zauważyłeś, że druga oś czasu jest znacznie bardziej precyzyjna, a także znacznie krótsza niż pierwsza. Jest to możliwe dzięki wstępnym kryteriom akceptacji i testom akceptacyjnym, ponieważ znacznie upraszcza „definicję ukończenia” i pozwala nam być znacznie bardziej pewnym stabilności wydania. Żadnemu innemu zespołowi (jak dotąd) nie udało się wydać dwutygodniowego harmonogramu wydań, chyba że robią to dość trywialne wydania konserwacyjne (tylko poprawki błędów itp.).

Kolejnym interesującym efektem ubocznym jest to, że byliśmy w stanie dostosować nasz harmonogram wydań do potrzeb biznesowych. Pewnego razu musieliśmy go wydłużyć do około 3 tygodni, aby zbiegło się to z kolejną wersją, i byliśmy w stanie to zrobić, zapewniając większą funkcjonalność, ale bez poświęcania dodatkowego czasu na testowanie lub stabilizację. Innym razem musieliśmy skrócić go do około 1,5 tygodnia z powodu świąt i konfliktów zasobów; musieliśmy podjąć mniej pracy programistów, ale zgodnie z oczekiwaniami mogliśmy spędzić odpowiednio mniej czasu na testowaniu i stabilizacji bez wprowadzania jakichkolwiek nowych wad.

Z mojego doświadczenia wynika zatem, że testy akceptacyjne, zwłaszcza gdy są wykonywane bardzo wcześnie w projekcie lub sprincie, i gdy są dobrze utrzymane zgodnie z kryteriami akceptacyjnymi napisanymi przez właściciela produktu, są jedną z najlepszych inwestycji, jakie możesz zrobić. W przeciwieństwie do tradycyjnego TDD, na co inni słusznie wskazują, skupia się bardziej na tworzeniu testowalnego kodu niż kodu bez wad - ATDD naprawdę pomaga znacznie szybciej wykrywać defekty ; jest to organizacyjny odpowiednik posiadania armii testerów codziennie wykonujących pełny test regresji, ale o wiele tańszy.

Czy ATDD pomoże ci w długoterminowych projektach wykonanych w stylu RUP lub (ugh) Waterfall, projektach trwających 3 miesiące lub dłużej? Myślę, że jury wciąż nie bierze udziału w tym. Z mojego doświadczenia wynika, że ​​największym i najbrzydszym ryzykiem w długoterminowych projektach są nierealne terminy i zmieniające się wymagania. Nierealistyczne terminy spowodują, że ludzie zaczną używać skrótów, w tym skrótów testowych, a znaczące zmiany wymagań prawdopodobnie unieważnią dużą liczbę testów, wymagając ich przepisania i potencjalnie zwiększając koszty wdrożenia.

Jestem prawie pewien, że ATDD ma fantastyczną wypłatę dla modeli Agile lub zespołów, które oficjalnie nie są Agile, ale mają bardzo częste harmonogramy wydawania. Nigdy nie próbowałem tego w długoterminowym projekcie, głównie dlatego, że nigdy nie byłem w żadnej organizacji, ani nawet nie słyszałem o organizacji, która chciałaby wypróbować ten projekt, więc wstaw tutaj standardowe wyłączenie odpowiedzialności. YMMV i tak dalej.

PS W naszym przypadku „klient” nie wymaga dodatkowego wysiłku, ale mamy dedykowanego, pełnoetatowego właściciela produktu, który faktycznie zapisuje kryteria akceptacji. Podejrzewam, że jeśli zajmujesz się oprogramowaniem konsultingowym, o wiele trudniej będzie skłonić użytkowników końcowych do napisania użytecznych kryteriów akceptacji. Właściciel produktu / Product Manager wydaje się być bardzo istotnym elementem do wykonywania ATDD i chociaż mogę ponownie mówić tylko z własnego doświadczenia, nigdy nie słyszałem o tym, że ATDD jest skutecznie praktykowany bez kogoś, kto pełniłby tę rolę.

Aaronaught
źródło
To bardzo przydatne, dzięki. Nie przyszło mi do głowy, że ATTD może zmienić charakter wysiłku TDD, ale ma to sens, szczególnie, gdy słyszy się o ludziach, którzy potrafią na czas i przy założonym budżecie wypisać dobrze napisane, względnie wolne od błędów oprogramowanie. z konieczności intensywnie wykorzystując testy jednostkowe.
Robert Harvey
@RobertHarvey: Powinienem wyjaśnić - wciąż tworzymy testy jednostkowe, ale nie w ramach procesu TDD. Zazwyczaj testy akceptacyjne odbywają się najpierw lub równolegle z początkowym opracowaniem, następnie kod jest kompletny, a następnie testy jednostkowe i refaktoryzacja. Czasami myślałem, że TDD pomoże niektórym programistom napisać lepszy kod, ale nie mogę tego zrobić (jeszcze). Chociaż mogę mówić za siebie - często łapię wiele błędów i projektuję błędy we własnym kodzie podczas pisania testów jednostkowych.
Aaronaught
1

Wymagania dotyczące zasobów

Jaki, z twojego doświadczenia, jest ogólny wpływ na wymagania dotyczące zasobów do ukończenia projektu oprogramowania w ramach TDD, w przeciwieństwie do bardziej „tradycyjnych” metodologii programistycznych?

Z mojego doświadczenia wynika, że koszt wymagania testów z wyprzedzeniem jest natychmiast zmniejszany poprzez zdefiniowanie jasnych kryteriów akceptacji z góry, a następnie napisanie do testu. Koszt wstępnych testów nie tylko został obniżony, ale ogólnie przyśpieszyłem ogólny rozwój. Chociaż te ulepszenia prędkości mogą zostać usunięte przez złą definicję projektu lub zmieniające się wymagania. Nadal jesteśmy jednak w stanie dość dobrze reagować na tego rodzaju zmiany bez poważnego wpływu. ATDD znacznie zmniejsza wysiłki programistów w sprawdzaniu poprawności działania systemu za pomocą jego automatycznego zestawu testów w następujących przypadkach:

  • duże reaktory
  • aktualizacje platformy / pakietu
  • migracja platformy
  • aktualizacje toolchain

Zakłada się, że zespół jest zaznajomiony z procesem i praktykami.

Zaangażowanie klienta

Ile wysiłku wymaga klient?

Muszą być bardziej zaangażowani na bieżąco. Widziałem ogromną redukcję inwestycji z wyprzedzeniem, ale o wiele większy popyt w toku. Nie mierzyłem, ale jestem pewien, że to inwestycja dłuższa dla klienta.

Jednak zauważyłem, że relacje z klientami ulegają znacznej poprawie po około 5 demonstracjach, gdzie widzą, jak ich oprogramowanie powoli się kształtuje. Zaangażowanie klienta w czas zmniejsza się z czasem wraz z rozwojem relacji, wszyscy przyzwyczajają się do procesu i związanych z nim oczekiwań.

Ocena projektu

Wyobrażam sobie, że szacunki czasowe byłyby bardzo niejasne w iteracyjnym procesie TDD na początku projektu TDD (ponieważ nie ma Planu Rozwoju Oprogramowania).

Przekonałem się, że jest to zazwyczaj pytanie o to, jak dobrze zdefiniowane jest zapytanie i czy potencjalni partnerzy techniczni są w stanie dokonać kart (w tym oceny karty) projektu. Zakładając, że projekt jest dobrze udokumentowany i masz rozsądną średnią prędkość i standardowe odchylenie, stwierdziliśmy, że łatwo jest uzyskać przyzwoitą ocenę. Oczywiście im większy projekt, tym większa niepewność, dlatego generalnie dzielę duży projekt na mały projekt z obietnicą kontynuacji później. Jest to o wiele łatwiejsze po nawiązaniu kontaktu z klientem.

Na przykład:

„Sprinty” mojego zespołu trwają tydzień, a my mamy średnią bieżącą i standardowe. odchylenie z ostatnich 14 tygodni. Jeśli projekt ma 120 punktów, mamy średnio 25 i std. odchylenie 6, a następnie oszacowanie ukończenia projektu wynosi:

Project Total / (Mean Velocity - (2 * Std. Deviation) = 95% Time Estimate
120           / (25            - (2 * 6             ) = 9.2 weeks

Używamy 2 Std. Praktyczna zasada odchylenia dla naszego szacunku 95% zaufania. W praktyce zwykle realizujemy projekt w ramach pierwszego etapu. odchylenie, ale ponad naszą średnią. Jest to zwykle spowodowane udoskonaleniami, zmianami itp.

dietbuddha
źródło
Więc w zasadzie mówisz, że TDD poprawia wysiłki rozwojowe, zachęcając interesariuszy do robienia rzeczy, które i tak powinni robić, takich jak zapewnienie jasnych, wykonalnych wymagań i kryteriów akceptacji.
Robert Harvey
1
Cóż, nie tylko to. W miarę postępu projektu zwiększony udział pozwala na lepszą rozmowę między twórcami i interesariuszami. Pozwala to na takie rzeczy, jak deweloper oferujący tańsze alternatywy, ponieważ ich zrozumienie tego, czego chce interesariusz, zostaje dopracowane. Umożliwia zainteresowanym stronom wcześniejszą zmianę wymagań, ponieważ zdają sobie sprawę, że czegoś brakuje, lub nie będą działać bez takiej antagonistycznej odpowiedzi od deweloperów; i bez wielu nieuzasadnionych oczekiwań, które zwykle pochodzą od interesariuszy.
dietbuddha
-1

wymaganie testów z góry wydaje się, że wymagałoby to więcej godzin programistów. O ile wzrósł wysiłek programistyczny, czy faktycznie maleje z powodu eliminacji błędów z góry?

To w rzeczywistości nie jest prawdą. Jeśli programiści piszą testy jednostkowe (i powinni), czas powinien być mniej więcej taki sam lub lepszy. Powiedziałem lepiej, ponieważ twój kod zostanie całkowicie przetestowany i będą musieli napisać tylko kod, aby spełnić wymagania.

Problem z programistami polega na tym, że mają tendencję do wdrażania nawet rzeczy, które nie są wymagane, aby oprogramowanie było tak ogólne, jak to możliwe.

Ile wysiłku wymaga klient? Czy muszą zmienić sposób, w jaki odnoszą się do projektu, zwłaszcza jeśli są przyzwyczajeni do dużego projektu z góry? Czy liczba godzin wymaganych od klienta ogólnie wzrasta, czy faktycznie maleje?

To nie powinno mieć znaczenia. Ktokolwiek spełnia wymagania, powinien to zrobić tak dobrze, jak to możliwe.

Jeśli robisz zwinny sposób rozwoju, nie oznacza to dużego projektu z góry. Ale im lepsze są wymagania, architektura i projekt - jakość kodu wzrośnie, a czas do ukończenia oprogramowania zmniejszy się.

Dlatego jeśli lubią robić BDUF, pozwól im to zrobić. Ułatwi ci to życie jako programista.

BЈовић
źródło
1
Jak rozumiem, TDD i BDUF zasadniczo nie są ze sobą kompatybilne.
Robert Harvey
3
BDUF zasadniczo nie jest zgodny z żadnymi dobrymi praktykami zarządzania rozwojem. Możliwe byłoby jednak wykonanie projektu BDUF w sposób TDD. TDD jest techniką tworzenia oprogramowania o lepszej jakości, podczas gdy BDUF jest techniką wywoływania wymagań. Zła technika, ale mimo to technika.
Stephen
@RobertHarvey Racja, ale jeśli chcą zrobić BDUF - to ich wybór. Jeśli naprawdę pracujesz zwinnie, możesz swobodnie ulepszać ich projekt i nadal wykonywać TDD.
BЈовић
więc mówicie, że jeśli napiszę test jednostkowy, mój kod zostanie całkowicie przetestowany, a jeśli wszystkie testy zakończą się pomyślnie, oznacza to oczywiście, że oprogramowanie jest wolne od błędów (a przynajmniej lepiej). Potrzebuję więc tylko przetestować każdą metodę mojego oprogramowania, np. „Function testSqr () {int a = 3; assertTrue (mySqr (a) == 9);} function mySqr (int a) {return 9;}”
Dainius
@Dainius Nie, przeczytaj ponownie. 100% pokrycia kodu nie jest wolne od błędów. Tak, musisz przeprowadzić test jednostkowy każdej metody. Oczywiście testowanie dostępu do bazy danych, GUI itp. Nie ma sensu. Testy jednostkowe nie są dla nich.
BЈовић