Ich gehe davon aus, dass das meiste, was ich finde, aus den 1970er und frühen 1980er Jahren stammt. In dieser Zeit waren sequentielle Prozessmodelle weitaus häufiger als die iterativen und / oder inkrementellen Ansätze (das Spiralmodell oder die agilen Methoden). Ein Großteil dieser Arbeit basiert auf diesen sequentiellen Modellen. Ich denke jedoch nicht, dass dies die Beziehung zerstört, aber einer der Vorteile von iterativen / inkrementellen Ansätzen besteht darin, Features (ein ganzes vertikales Segment einer Anwendung) schnell freizugeben und Probleme darin zu beheben, bevor Abhängigkeiten und die Komplexität jeder Phase hinzugefügt werden ist hoch.
Ich habe gerade mein Exemplar von Software Engineering Economics herausgezogen und einen Verweis auf die Daten hinter dieser Tabelle in Kapitel 4 gefunden. Er zitiert "Design- und Code-Inspektionen zur Reduzierung von Fehlern in der Programmentwicklung" von ME Fagan ( IEEE , PDF von UMD ), EB Daly's "Management of Software Engineering", WE Stephenson's "Eine Analyse der in der Safeguard System Software Development ( ACM ) verwendeten Ressourcen" und "mehrere TRW-Projekte".
... die relativen Kosten für die Korrektur von Softwarefehlern (oder andere Softwareänderungen) in Abhängigkeit von der Phase, in der die Korrekturen oder Änderungen vorgenommen werden. Wenn ein Softwareanforderungsfehler während der Planungs- und Anforderungsphase erkannt und korrigiert wird, ist seine Korrektur eine relativ einfache Sache der Aktualisierung der Anforderungsspezifikation. Wenn derselbe Fehler erst in der Wartungsphase behoben wird, umfasst die Korrektur einen viel größeren Bestand an Spezifikationen, Code, Benutzer- und Wartungshandbüchern sowie Schulungsmaterial.
Darüber hinaus erfordern späte Korrekturen einen viel formelleren Genehmigungs- und Kontrollprozess für Änderungen und eine viel umfangreichere Aktivität zum erneuten Validieren der Korrektur. Diese Faktoren machen den Fehler in der Wartungsphase bei großen Projekten in der Regel 100-mal teurer als in der Anforderungsphase.
Bohem untersuchte auch zwei kleinere, weniger formelle Projekte und stellte einen Anstieg der Kosten fest, der jedoch weitaus weniger bedeutsam war als der 100-fache Wert, der in den größeren Projekten ermittelt wurde. In Anbetracht des Diagramms scheinen die Unterschiede viermal größer zu sein, um einen Anforderungsfehler zu beheben, nachdem das System betriebsbereit ist, als in der Anforderungsphase. Er führte dies auf den geringeren Bestand an Artikeln zurück, aus denen das Projekt bestand, und auf die verringerte Formalität, die dazu führte, dass einfacher und schneller repariert werden konnte.
Basierend auf Boehm in Software Engineering Economics ist die Tabelle in Code Complete ziemlich aufgebläht (das untere Ende der Bereiche ist oft zu hoch). Die Kosten für Änderungen innerhalb der Phase betragen in der Tat 1. Ausgehend von Abbildung 4-2 in Software Engineering Economics sollte eine Anforderungsänderung das 1,5- bis 2,5-fache der Architektur, 2,5 bis 10-fache der Codierung, 4 bis 20-fache der Testphase und 4 bis 5-fache der Testphase betragen. 100 in Wartung. Die Höhe hängt von der Größe und Komplexität des Projekts sowie der Formalität des verwendeten Prozesses ab.
In Anhang E von Barry Boehm und Richard Turner enthält das Buch Balancing Agility and Discipline einen kleinen Abschnitt zu den empirischen Ergebnissen in Bezug auf die Kosten von Veränderungen.
Die ersten Absätze zitieren Kent Becks Extreme Programming Explained und zitieren Beck. Wenn die Kosten für Änderungen im Laufe der Zeit langsam steigen würden, würden Entscheidungen so spät wie möglich getroffen und nur das umgesetzt, was benötigt würde. Dies ist als "flache Kurve" bekannt und treibt Extreme Programming an. Bisherige Literatur fand jedoch die "steile Kurve" mit kleinen Systemen (<5 KSLOC) mit einer Änderung von 5: 1 und großen Systemen mit einer Änderung von 100: 1.
Die Sektion zitiert das von der National Science Foundation gesponserte Center for Empirically Based Software Engineering der University of Maryland. Sie führten eine Suche in der verfügbaren Literatur durch und stellten fest, dass die Ergebnisse tendenziell ein Verhältnis von 100: 1 bestätigten, wobei einige Ergebnisse einen Bereich von 70: 1 bis 125: 1 anzeigten. Leider handelte es sich in der Regel um "große Design-Up-Front" -Projekte, die sequentiell verwaltet wurden.
Es gibt Beispiele für "kleine kommerzielle Java-Projekte", die mit Extreme Programming ausgeführt werden. Für jede Story wurde der Aufwand für die Fehlerbehebung, das neue Design und das Refactoring nachverfolgt. Die Daten zeigen, dass mit der Entwicklung des Systems (mehr User Stories werden implementiert) der durchschnittliche Aufwand in der Regel nicht unbedeutend zunimmt. Der Aufwand für das Refactoring steigt um ca. 5% und der Aufwand für die Aufwandsbehebung um ca. 4%.
Was ich lerne, ist, dass die Komplexität des Systems eine große Rolle für den Aufwand spielt. Indem Sie vertikale Schnitte durch das System erstellen, verlangsamen Sie die Kurvengeschwindigkeit, indem Sie die Komplexität langsam erhöhen, anstatt sie stapelweise hinzuzufügen. Anstatt sich mit der Komplexität der Anforderungen zu befassen, die von einer äußerst komplexen Architektur gefolgt wird, gefolgt von einer äußerst komplexen Implementierung usw., starten Sie ganz einfach und fügen weitere hinzu.
Welche Auswirkungen hat dies auf die Kosten für die Reparatur? Am Ende vielleicht nicht viel. Es bietet jedoch den Vorteil, dass die Komplexität besser kontrolliert werden kann (durch die Verwaltung der technischen Schulden). Darüber hinaus führen die mit Agile oft verbundenen häufigen Ergebnisse dazu, dass das Projekt möglicherweise früher endet - anstatt "das System" zu liefern, werden Teile geliefert, bis die Geschäftsanforderungen erfüllt sind oder sich ein neues System (und daher ein neues Projekt) drastisch geändert hat. wird gebraucht.
Stephen Kans Metriken und Modelle in Software Quality Engineering enthalten in Kapitel 6 einen Abschnitt über die Kostenwirksamkeit der Beseitigung von Phasendefekten.
Zunächst zitiert er Fagans 1976 erschienenen Aufsatz (ebenfalls in Software Engineering Economics zitiert), in dem er feststellt, dass Nacharbeiten im High-Level-Design (Systemarchitektur), im Low-Level-Design (Detail-Design) und in der Implementierung zehn- bis hundertmal billiger sein können als die Arbeit, die beim Testen auf Komponenten- und Systemebene geleistet wurde.
Er zitiert auch zwei Veröffentlichungen von Freedman und Weinberg aus den Jahren 1982 und 1984, die sich mit großen Systemen befassen. Das erste ist "Handbuch für exemplarische Vorgehensweisen, Inspektionen und technische Überprüfungen" und das zweite "Überprüfungen, exemplarische Vorgehensweisen und Inspektionen". Die Anwendung von Überprüfungen zu Beginn des Entwicklungszyklus kann die Anzahl der Fehler, die die Testphasen erreichen, um den Faktor 10 verringern. Diese Verringerung der Anzahl der Fehler führt zu einer Reduzierung der Testkosten um 50% bis 80%. Ich müsste die Studien genauer lesen, aber es scheint, dass die Kosten auch das Auffinden und Beheben der Mängel beinhalten.
In einer 1983 von Remus durchgeführten Studie mit dem Titel "Integrierte Softwarevalidierung im Hinblick auf Inspektionen / Überprüfungen" wurden die Kosten für die Beseitigung von Fehlern in verschiedenen Phasen untersucht, insbesondere für Inspektionen, Tests und Wartungen von Konstruktionen / Codes anhand von Daten aus dem Santa Teresa Laboratory von IBM in Kalifornien. Die genannten Ergebnisse geben ein Kostenverhältnis von 1:20:82 an. Das heißt, ein Fehler, der bei Konstruktions- oder Codeprüfungen festgestellt wurde, hat Änderungskosten von 1. Wenn derselbe Fehler beim Testen auftritt, sind die Kosten 20-mal höher. Wenn es einem Benutzer vollständig entgeht, werden die Korrekturkosten um bis zu 82 multipliziert. Unter Verwendung von Beispieldaten aus dem IBM-Werk in Rochester, Minnessota, stellte Kan fest, dass die Kosten für die Fehlerbehebung für das AS / 400-Projekt ähnlich sind um 1:13:92. Er weist jedoch darauf hin, dass die Erhöhung der Kosten auf die erhöhte Schwierigkeit zurückzuführen sein könnte, einen Defekt zu finden.
Die Veröffentlichungen von Gilb aus den Jahren 1993 ( "Software Inspection" ) und 1999 ("Optimizing Software Engineering Specification and Quality Control Processes") zur Softwareinspektion bestätigen die anderen Studien.
Weitere Informationen finden Sie möglicherweise auf der Seite von Construx zur Erhöhung der Fehlerkosten , die eine Reihe von Hinweisen zur Erhöhung der Fehlerkosten für die Reparatur enthält. Es sei darauf hingewiesen, dass Steve McConnell, Autor von Code Complete, Construx gründete und für diese arbeitet.
Ich habe kürzlich einen Vortrag, Real Software Engineering , von Glenn Vanderburg auf der Lone Star Ruby Conference im Jahr 2010 gehört. Er hat den gleichen Vortrag auf der Scottish Ruby Conference und Erubycon im Jahr 2011, der QCon San Francisco im Jahr 2012 und der O'Reilly Software Architecture Conference gehalten im Jahr 2015 . Ich habe nur die Lone Star Ruby Conference gehört, aber die Diskussion hat sich im Laufe der Zeit weiterentwickelt, als seine Ideen verfeinert wurden.
Venderburg schlägt vor, dass all diese historischen Daten tatsächlich die Kosten für die Behebung von Fehlern im Laufe der Zeit aufzeigen, nicht unbedingt, wenn ein Projekt mehrere Phasen durchläuft. Viele der Projekte, die in den zuvor erwähnten Artikeln und Büchern untersucht wurden, waren sequentielle "Wasserfall" -Projekte, bei denen Phase und Zeit zusammen verschoben wurden. Ein ähnliches Muster würde sich jedoch bei iterativen und inkrementellen Projekten einstellen - wenn ein Fehler in einer Iteration injiziert würde, wäre es relativ kostengünstig, ihn in dieser Iteration zu beheben. Während die Iterationen fortschreiten, passieren viele Dinge - die Software wird komplexer, die Leute vergessen einige der kleinen Details über die Arbeit in bestimmten Modulen oder Teilen des Codes, die Anforderungen ändern sich. All dies erhöht die Kosten für die Behebung des Fehlers.
Ich denke, dass dies wahrscheinlich näher an der Realität ist. In einem Wasserfallprojekt steigen die Kosten aufgrund der Anzahl der Artefakte, die aufgrund eines vorgelagerten Problems korrigiert werden müssen. Bei iterativen und inkrementellen Projekten steigen die Kosten aufgrund der zunehmenden Komplexität der Software.