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.
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.
źródło
Odpowiedzi:
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:
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.
źródło
W rozdziale Tworzenie oprogramowania o rozwoju opartym na testach znajduje się rozdział , który cytuje omawiany tutaj artykuł .
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
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):
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:
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ę.
źródło
Wymagania dotyczące zasobów
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:
Zakłada się, że zespół jest zaznajomiony z procesem i praktykami.
Zaangażowanie klienta
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
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:
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.
źródło
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.
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.
źródło