Przedmówię to faktem, że większość tego, co znajduję, pochodzi z lat siedemdziesiątych i wczesnych osiemdziesiątych. W tym czasie sekwencyjne modele procesów były znacznie bardziej powszechne niż podejścia iteracyjne i / lub przyrostowe (model spiralny lub metody zwinne). Wiele z tych prac opiera się na tych modelach sekwencyjnych. Nie sądzę jednak, by niszczyło to związek, ale jedną z korzyści podejścia iteracyjnego / przyrostowego jest szybkie uwalnianie funkcji (całego pionowego wycinka aplikacji) i rozwiązywanie problemów przed wstrzyknięciem zależności i złożonością każdej fazy jest wysoko.
Właśnie wyciągnąłem kopię Software Engineering Economics i znalazłem odniesienie do danych zawartych w tym wykresie w rozdziale 4. Przytacza „Projektowanie i kontrole kodu w celu ograniczenia błędów w rozwoju programu” autorstwa ME Fagana ( IEEE , PDF z UMD ), EB Daly's „Management of Software Engineering”, WE Stephenson's „Analiza zasobów wykorzystywanych w programowaniu oprogramowania Safeguard System Software” ( ACM ) oraz „kilka projektów TRW”.
... względny koszt korekty błędów oprogramowania (lub wprowadzenia innych zmian oprogramowania) w zależności od fazy, w której dokonywane są poprawki lub zmiany. Jeśli błąd wymagań oprogramowania zostanie wykryty i skorygowany podczas fazy planów i wymagań, jego korekta jest względnie prostą kwestią aktualizacji specyfikacji wymagań. Jeśli ten sam błąd nie zostanie naprawiony do fazy konserwacji, korekta obejmuje znacznie większy spis specyfikacji, kodu, instrukcji obsługi i konserwacji oraz materiałów szkoleniowych.
Ponadto późne korekty obejmują o wiele bardziej formalny proces zatwierdzania i kontroli zmian oraz o wiele szersze działania mające na celu ponowne sprawdzenie poprawności. Czynniki te łącznie powodują, że błąd zazwyczaj jest 100 razy droższy do skorygowania w fazie konserwacji w dużych projektach niż w fazie wymagań.
Bohem przyjrzał się również dwóm mniejszym, mniej formalnym projektom i stwierdził wzrost kosztów, ale o wiele mniej znaczący niż 100-krotny wzrost zidentyfikowany w większych projektach. Biorąc pod uwagę tabelę, różnice wydają się 4 razy większe, aby naprawić wadę wymagań po uruchomieniu systemu niż w fazie wymagań. Przypisał to mniejszej inwentaryzacji elementów składających się na projekt i zmniejszonej formalności, która doprowadziła do możliwości szybszego wdrożenia prostszego rozwiązania.
Oparta na Boehm in Software Engineering Economics, tabela w Code Complete jest raczej rozdęta (dolna granica zakresów jest często zbyt wysoka). Koszt wprowadzenia jakiejkolwiek zmiany w fazie wynosi rzeczywiście 1. Ekstrapolując z rysunku 4-2 w Software Engineering Economics, zmiana wymagań powinna wynosić 1,5-2,5 razy w architekturze, 2,5-10 w kodowaniu, 4-20 w testowaniu i 4 100 w konserwacji. Kwota zależy od wielkości i złożoności projektu, a także formalności zastosowanego procesu.
W załączniku E do Barry Boehm i Richarda Turnera Balansująca zwinność i dyscyplina zawiera niewielką część na temat empirycznych ustaleń dotyczących kosztu zmiany.
Pierwsze akapity cytują Extreme Programming Kent wyjaśnił, cytując Becka. Mówi, że jeśli koszty zmian rosną powoli w miarę upływu czasu, decyzje byłyby podejmowane możliwie późno i wdrażane byłyby tylko to, co było potrzebne. Nazywa się to „płaską krzywą” i to właśnie napędza programowanie ekstremalne. Jednak poprzednią literaturą była „stroma krzywa”, przy małych systemach (<5 KSLOC) o zmianie 5: 1 i dużych systemach o zmianie 100: 1.
Sekcja cytuje Centrum Inżynierii Oprogramowania na Uniwersytecie Maryland (sponsorowane przez National Science Foundation). Przeszukali dostępną literaturę i stwierdzili, że wyniki zwykle potwierdzają stosunek 100: 1, a niektóre wyniki wskazują na zakres od 70: 1 do 125: 1. Niestety były to zazwyczaj projekty „dużego projektu z góry”, którymi zarządzano w sposób sekwencyjny.
Istnieją przykłady „małych komercyjnych projektów Java” uruchamianych za pomocą Extreme Programming. Dla każdej historii śledzono wysiłek związany z naprawianiem błędów, nowym projektem i refaktoryzacją. Dane pokazują, że wraz z rozwojem systemu (wdrażanie kolejnych historii użytkowników) średni wysiłek zwykle rośnie w nie-trywialnym tempie. Wysiłek w refaktoryzacji wzrasta o około 5%, a wysiłki w kierunku ustalania nakładów - o około 4%.
Uczę się, że złożoność systemu odgrywa ogromną rolę w wymaganym nakładzie pracy. Budując pionowe przekroje przez system, spowalniasz tempo krzywej, powoli dodając złożoność zamiast dodając ją w stosy. Zamiast zajmować się masą złożoności wymagań, a następnie niezwykle złożoną architekturą, a następnie niezwykle złożoną implementacją itd., Zaczynasz bardzo prosto i dodajesz.
Jaki to ma wpływ na koszt naprawy? W końcu może niewiele. Ma jednak tę zaletę, że pozwala na większą kontrolę nad złożonością (poprzez zarządzanie długiem technicznym). Ponadto częste rezultaty często kojarzone z agile oznaczają, że projekt może zakończyć się wcześniej - zamiast dostarczać „system”, części są dostarczane do momentu zaspokojenia potrzeb biznesowych lub drastycznej zmiany w stosunku do nowego systemu (a zatem nowego projektu) jest potrzebne.
Metryki i modele Stephena Kana w inżynierii jakości oprogramowania mają rozdział w rozdziale 6 na temat opłacalności usuwania wad fazowych.
Zaczyna od cytowania artykułu Fagana z 1976 r. (Cytowanego także w Software Engineering Economics), aby stwierdzić, że przeróbki wykonane w projektowaniu wysokiego poziomu (architektura systemu), projektowaniu niskiego poziomu (projektowanie szczegółowe), a wdrożenie może być od 10 do 100 razy tańsze niż praca wykonana podczas testowania na poziomie komponentów i systemu.
Przytacza także dwie publikacje Freedmana i Weinberga z 1982 i 1984 r., Które omawiają duże systemy. Pierwszy to „Podręcznik solucji, inspekcji i przeglądów technicznych”, a drugi to „Recenzje, solucje i inspekcje”. Zastosowanie recenzji na wczesnym etapie cyklu programowania może zmniejszyć liczbę błędów, które docierają do faz testowania 10-krotnie. To zmniejszenie liczby wad prowadzi do obniżenia kosztów testowania o 50% do 80%. Musiałbym przeczytać badania bardziej szczegółowo, ale wydaje się, że koszt obejmuje również znalezienie i naprawę wad.
W badaniu z 1983 r. Przeprowadzonym przez Remusa, „Integrated Software Validation in View of Inspections / Review”, przeanalizowano koszty usuwania defektów na różnych etapach, w szczególności kontroli projektu / kodu, testów i konserwacji, z wykorzystaniem danych z Santa Teresa Laboratory IBM w Kalifornii. Cytowane wyniki wskazują na stosunek kosztów w wysokości 1:20:82. Oznacza to, że defekt wykryty podczas inspekcji projektu lub kodu ma koszt zmiany wynoszący 1. Jeśli ta sama defekt ucieknie do testowania, będzie kosztować 20 razy więcej. Jeśli ucieknie aż do użytkownika, podwoi koszt naprawy do 82. Kan, korzystając z przykładowych danych z firmy Rochester w Minnessocie, stwierdził, że koszt usunięcia defektu dla projektu AS / 400 jest podobny o 1:13:92. Wskazuje jednak, że wzrost kosztów może wynikać ze zwiększonej trudności ze znalezieniem usterki.
Wspomniane są publikacje Gilba z 1993 r. ( „Kontrola oprogramowania” ) i 1999 („Optymalizacja specyfikacji inżynierii oprogramowania i procesów kontroli jakości”) dotyczące kontroli oprogramowania w celu potwierdzenia innych badań.
Dodatkowe informacje można znaleźć na stronie Construx w temacie Wzrost kosztów defektów , który zawiera szereg odniesień do wzrostu kosztów naprawy defektów. Należy zauważyć, że Steve McConnell, autor Code Complete, założył i pracuje dla Construx.
Niedawno wysłuchałem przemówienia Real Software Engineering , wygłoszonego przez Glenna Vanderburga na konferencji Lone Star Ruby Conference w 2010 roku. Wygłosił to samo wystąpienie na szkockiej konferencji Ruby Conference i Erubycon w 2011 roku, QCon San Francisco w 2012 roku i O'Reilly Software Architecture Conference w 2015 r . Słuchałem tylko Konferencji Rubinowej Lone Star, ale rozmowa ewoluowała z czasem, gdy jego pomysły zostały dopracowane.
Venderburg sugeruje, że wszystkie te dane historyczne faktycznie pokazują koszt naprawy wad w miarę upływu czasu, niekoniecznie w miarę, jak projekt przechodzi przez kolejne fazy. Wiele projektów zbadanych we wspomnianych wcześniej artykułach i książkach było sekwencyjnymi projektami „wodospadu”, w których faza i czas poruszały się razem. Jednak podobny wzór pojawiłby się w projektach iteracyjnych i przyrostowych - jeśli defekt zostałby wstrzyknięty podczas jednej iteracji, naprawienie tej iteracji byłoby stosunkowo niedrogie. Jednak w miarę postępu iteracji dzieje się wiele rzeczy - oprogramowanie staje się bardziej złożone, ludzie zapominają o drobnych szczegółach dotyczących pracy w poszczególnych modułach lub częściach kodu, zmieniają się wymagania. Wszystko to zwiększy koszt naprawy wady.
Myślę, że jest to prawdopodobnie bliższe rzeczywistości. W projekcie wodospadu koszt wzrasta ze względu na liczbę artefaktów, które należy poprawić z powodu problemu z prądem. W projektach iteracyjnych i przyrostowych koszty rosną z powodu wzrostu złożoności oprogramowania.