Es gibt verschiedene Arten von Qualität, die an Softwareprodukten gemessen werden können, z. B. Gebrauchstauglichkeit (z. B. Endverwendung), Wartbarkeit und Effizienz. Einige davon sind subjektiv oder domänenspezifisch (z. B. können sich die Prinzipien für ein gutes GUI-Design in den verschiedenen Kulturen unterscheiden oder vom Verwendungskontext abhängen, denken Sie an die militärische oder die Verbrauchernutzung).
Was mich interessiert, ist eine tiefere Form der Qualität in Bezug auf das Netzwerk (oder den Graphen) der Typen und ihre Wechselbeziehung, dh auf welche Typen bezieht sich jeder Typ? Gibt es klar identifizierbare Cluster von Interkonnektivität in Bezug auf eine ordnungsgemäße mehrstufige Architektur, oder umgekehrt gibt es eine große "Kugel" von Typreferenzen ("monolithischer" Code). Außerdem sollte die Größe jedes Typs und / oder jeder Methode (z. B. gemessen in der Menge des Java-Byte-Codes oder .Net IL) einen Hinweis darauf geben, wo große komplexe Algorithmen als monolithische Codeblöcke implementiert wurden, anstatt in besser verwaltbare / wartbare zerlegt zu werden Stücke.
Eine Analyse, die auf solchen Ideen basiert, kann möglicherweise Metriken berechnen, die mindestens ein Stellvertreter für die Qualität sind. Die genauen Schwellen- / Entscheidungspunkte zwischen hoher und niedriger Qualität sind meines Erachtens subjektiv, da unter Wartbarkeit die Wartbarkeit durch menschliche Programmierer zu verstehen ist und die funktionale Zerlegung daher mit der Funktionsweise des menschlichen Geistes vereinbar sein muss. Als solches frage ich mich, ob es jemals eine mathematisch reine Definition von Softwarequalität geben kann, die alle möglichen Software in allen möglichen Szenarien übersteigt.
Ich frage mich auch, ob dies eine gefährliche Idee ist, dass wenn objektive Proxys für Qualität populär werden, der Geschäftsdruck Entwickler dazu veranlasst, diese Metriken auf Kosten der Gesamtqualität zu verfolgen (jene Aspekte der Qualität, die nicht von den Proxys gemessen werden).
Eine andere Art, über Qualität zu denken, ist unter dem Gesichtspunkt der Entropie. Entropie ist die Tendenz von Systemen, von geordneten zu ungeordneten Zuständen zurückzukehren. Jeder, der jemals an einem realen, mittelgroßen bis großen Softwareprojekt gearbeitet hat, wird es zu schätzen wissen, inwieweit sich die Qualität der Codebasis im Laufe der Zeit verschlechtert. Der Geschäftsdruck führt in der Regel zu Änderungen, die sich auf neue Funktionen konzentrieren (außer wenn Qualität selbst das Hauptverkaufsargument ist, z. B. bei Avionik-Software), und zu Qualitätsverlusten durch Regressionsprobleme und Fehlfunktionen eine Qualitäts- und Wartungsperspektive. Können wir also die Entropie von Software messen? Und wenn ja, wie?
quelle
Antworten:
Das ist eine gefährliche Idee. "Objektive" Proxies für Qualität führen direkt zu Belohnungen für das Management, und Entwickler verfolgen diese Metriken auf Kosten der tatsächlichen Qualität.
Dies ist das Gesetz der unbeabsichtigten Konsequenzen.
Qualität ist zwar wichtig, aber nur ein kleiner Aspekt von Software. Funktionalität und Wertschöpfung durch die Software sind weitaus wichtiger als Qualität.
Alle Metriken führen zu Aktivitäten zur Optimierung der Metrik. Dies hat wiederum Konsequenzen, die Sie vielleicht nicht wirklich mögen.
Software ist sehr komplex. Es ist schwer zu verstehen, wie komplex es wirklich ist.
Sogar "offensichtliche" Dinge wie die Codeabdeckung bei Einheitentests können Zeit verschwenden. Um 100% zu erreichen, müssen möglicherweise Tests erstellt werden, die komplexer sind als der zu testende Trivialcode. Das Erreichen einer 100% igen Deckung kann mit inakzeptablen Kosten verbunden sein. [Die Alternative für trivialen, kleinen, selten verwendeten Code ist ein Test durch Inspektion. Aber das passt nicht zum Metrikspiel von 100%.]
Ein weiteres Beispiel ist die zyklomatische Komplexität. Es ist eines der besten Maßstäbe für die Codequalität. Zum Spielen können jedoch viele kleine Funktionen erstellt werden, die möglicherweise schwerer zu lesen (und zu warten) sind als eine größere Funktion. Sie landen in Codeüberprüfungen, in denen Sie zustimmen, dass der Code möglicherweise nicht gut lesbar ist, aber die Komplexitätsschwelle erreicht.
quelle
Bingo und kein "Wenn". Dies nennt man "Measurement Dysfunction" und es wurde oft beobachtet und geschrieben, wie Joel 2002 einen Artikel darüber schrieb, in dem auf ein Buch eines Harvard-Professors verwiesen wurde.
Das bedeutet nicht, dass solche Metriken nutzlos sind, nur, dass man niemals Anreize oder Richtlinien explizit auf solche Proxy-Messungen stützen sollte. Wenn Sie die Qualität verbessern möchten, ist eine Proxy-Metrik mit einem sehr schlechten Wert wahrscheinlich ein guter Ausgangspunkt. Sie können jedoch nicht zu dem Schluss kommen, dass die Qualität gut ist, nur weil alle Ihre Messdaten hohe Werte aufweisen.
quelle
Das klingt nach Fan-In und Fan-Out. Fan-In zählt die Anzahl der Module, die ein bestimmtes Modul aufrufen, und Fan-Out zählt die Anzahl der Module, die von einem bestimmten Modul aufgerufen werden. Ein zu verwendendes Warnzeichen wären Module mit einem großen Fan-In und einem großen Fan-Out, da dies auf ein schlechtes Design und ein wichtiges Ziel für Refactoring oder Redesign hindeuten könnte.
Eine einfache Messung wäre Codezeilen. Sie können es in Codezeilen über das gesamte Projekt und Codezeilen pro Modul aufteilen (möglicherweise mit Modulen unterschiedlicher Größe). Sie können dies als Warnanzeige verwenden, die angibt, dass Sie bestimmte Module überprüfen sollten. Ein Buch über Softwarequalitätsmessungen und -metriken beschreibt einige Arbeiten, die darauf hinweisen, dass die Beziehung zwischen Fehlerraten und Modulgröße krummlinig ist, wobei der durchschnittliche Fehler pro KSLOC bei Modulen mit einer Größe zwischen 175 und 350 SLOC auftritt.
Etwas komplexer wäre die zyklomatische Komplexität, die die Testbarkeit, Verständlichkeit und Wartbarkeit eines Systems anzeigt. Die zyklomatische Komplexität zählt die Anzahl unabhängiger Pfade durch eine Anwendung oder ein Modul. Die Anzahl der Tests und damit der Aufwand für die Erstellung und Durchführung der Tests hängt stark von der zyklomatischen Komplexität ab.
Ich bin mir nicht sicher, ob das der Fall ist.
Zum Beispiel gibt es Untersuchungen, die darauf hindeuten, dass das Arbeitsgedächtnis eines Menschen nur 7 plus / minus 2 Objekte aufnehmen kann . Dies ist wahrscheinlich für die Messung von Fan-In und Fan-Out von Interesse. Wenn ich in einem Modul arbeite und es mit mehr als ~ 7 anderen Modulen verbunden ist, kann ich wahrscheinlich nicht genau verfolgen, was diese sind Andere Module sind in meinem Kopf.
Es wurde auch daran gearbeitet, Fehler mit Metriken wie der zyklomatischen Komplexität in Beziehung zu setzen. Da Sie Fehler in Ihrem System minimieren möchten, können Sie Punkte identifizieren, die entweder aufwendiger getestet oder umgestaltet werden müssen, was durch eine hohe zyklomatische Komplexität gekennzeichnet ist.
Dies ist bei allen Messungen oder Metriken der Fall. Sie müssen verwendet werden, um das System zu verstehen und fundierte Entscheidungen zu treffen. Der Satz "Sie können nicht verwalten, was Sie nicht messen können" fällt Ihnen ein. Wenn Sie hochwertige Software benötigen, benötigen Sie einige Messungen und Metriken, um diese Qualität zu bewerten. Dies hat jedoch eine Kehrseite. Sie können nicht ausschließlich nach den Zahlen verwalten. Sie können die Zahlen verwenden, um fundierte Entscheidungen zu treffen, aber Sie können keine Entscheidung treffen, nur weil die Zahlen dies aussagen.
quelle
Für viele der Eigenschaften, an denen Sie interessiert sind, gibt es Metriken oder Proxies:
Es gibt einige Probleme mit all diesen Elementen:
Der Gesamteffekt dieser Probleme besteht darin, dass Metriken wie diese wahrscheinlich nur innerhalb einer breiteren Kultur von Nutzen sind - wie z. B. TQM, Qualitätssicherung (nicht Kontrolle), kontinuierliche Verbesserung, Kaizan usw. Es ist erforderlich, Elemente beider Kulturen zu definieren und wie es sich ändern muss. Wenn Sie eine Definition dieser Kennzahlen haben, werden Kennzahlen wie diese zu unverzichtbaren Werkzeugen, um die Qualität des Codes, die Arbeitspraktiken, die Produktivität usw. zu verbessern. Ohne diesen weiteren Kontext erzeugen Kennzahlen Arbeit zur Optimierung der Kennzahl. wird zum Werkzeug des Beancounters, um die Produktivität zu steigern und die Kosten zu senken; und wird zu einem Hindernis für die Entwickler.
quelle
Sie könnten von Metriken besessen sein, oder Sie könnten von den besten Leuten, Tools, Praktiken für das Engineering und der Qualitätssicherung besessen sein, die Sie sich leisten können. Ich wäre viel glücklicher, wenn ich mehrere paranoide QA-Genies hätte, die "Fooled by Randomness" gelesen haben und die lieber automatisieren als ein paar gut formatierte Berichte mit Zahlen.
quelle
Es gibt dieses grundlegende Problem mit Metriken.
Es hat sich gezeigt, dass praktisch alle vorgeschlagenen Metriken in der realen Welt mit echtem Code stark oder sehr stark mit rohem SLOC (Quellcodezeilen) korrelieren.
Dies ist, was Halsteads Metriken in den 1970er Jahren tötete. (Durch Zufall habe ich eines Tages, ca. 1978, an einem Vortrag einer neuen Doktorarbeit über Halsteads Metriken teilgenommen, in dem er darauf hingewiesen hat.)
In jüngerer Zeit hat sich gezeigt, dass McCabes zyklomatische Komplexität sehr stark mit dem rohen SLOC korreliert, so dass sich der Typ, der die Studie durchgeführt hat, laut gefragt hat, ob McCabes Metrik überhaupt etwas Nützliches verrät.
Wir wissen seit Jahrzehnten, dass große Programme eher Probleme haben als kleine. Wir wissen seit Jahrzehnten, dass große Unterprogramme mit größerer Wahrscheinlichkeit Fehler aufweisen als kleine. Warum brauchen wir arkane Metriken, um dies zu sagen, wenn das Betrachten von vier Druckerseiten, die über eine Tabelle verteilt sind, überzeugend genug sein sollte?
quelle
Angesichts all der anderen Antworten hier, fühle ich mich irgendwie albern mit diesem kleinen. Schauen Sie sich Crap4j an , das versucht, Methoden in Java danach zu ordnen , wie sehr sie stinken. (Das Projekt sieht verlassen aus.)
Es verwendet eine Kombination aus zyklomatischer Komplexität und Testabdeckung. Wie jede andere Metrik ist sie spielbar.
quelle