Quellcodemetriken zur Messung der Codestabilität?

17

In Anbetracht der Entwicklung von Software während eines Veröffentlichungszyklus (Implementierung, Testen, Fehlerbehebung, Veröffentlichung) dachte ich, dass man in der Lage sein sollte, ein Muster in den Codezeilen zu sehen, die in der Codebasis geändert werden. ZB gegen Ende eines Projekts, wenn der Code stabiler wird, sollte man sehen, dass weniger Codezeilen pro Zeiteinheit geändert werden.

Beispielsweise konnte man feststellen, dass in den ersten sechs Monaten des Projekts durchschnittlich 200 Codezeilen pro Tag und im letzten Monat 50 Codezeilen pro Tag und in der letzten Woche (kurz vor den Produkt-DVDs) verzeichnet wurden wurden ausgeliefert), wurden keine Codezeilen geändert (Code Freeze). Dies ist nur ein Beispiel, und je nach Entwicklungsprozess eines bestimmten Teams können unterschiedliche Muster auftreten.

Gibt es überhaupt Codemetriken (Literatur?), Die die Anzahl der modifizierten Codezeilen pro Zeiteinheit verwenden, um die Stabilität einer Codebasis zu messen? Sind sie nützlich, um ein Gefühl dafür zu bekommen, ob ein Projekt irgendwohin kommt oder noch lange nicht fertig ist? Gibt es Tools, die diese Informationen aus einem Versionskontrollsystem extrahieren und Statistiken erstellen können?

Giorgio
quelle
4
"Zweitens, der Mechanismus ist abstrakt, seine Produktion ist in seinem Design subsumiert. In dieser Hinsicht ist ein Programm wie ein Gedicht: Man kann ein Gedicht nicht schreiben, ohne es zu schreiben. Die Leute sprechen jedoch von Programmieren, als wäre es ein Produktionsprozess und eine Maßnahme." Programmiererproduktivität "in Bezug auf" Anzahl der produzierten Codezeilen ". Dabei wird diese Nummer auf der falschen Seite des Hauptbuchs verbucht: Wir sollten uns immer auf" die Anzahl der ausgegebenen Codezeilen "beziehen. - Die Früchte des Missverständnisses , Edsger W. Dijkstra.
Yannis
3
@ Yannis Rizos: Ich empfehle keineswegs, die Produktivität oder die Komplexität des Codes mit LOC zu messen, da ich weiß, dass dies keine gute Maßnahme ist. Wenn andererseits 300 Codezeilen zwei Tage vor dem Versand geändert würden, hätte ich als Manager eine große "RED ALERT" -Lampe im Kopf (sofern dies nicht geplant war und das Ergebnis einer sehr sorgfältigen Bewertung der Risiken ist) ). Im Allgemeinen würde ich annehmen, dass Code, der lange Zeit ohne Änderung verwendet (und getestet) wurde, "stabiler" ist als Code, in dem täglich 100 Zeilen geändert werden.
Giorgio
2
@Giorgio Argh, ich wurde unterbrochen (Mitte des Arbeitstages hier), als ich einen weiteren Kommentar veröffentlichte (traf das Zeichenlimit im ersten). Wollte nicht heißen, dass Sie über Produktivität sprachen, das Dijkstra-Zitat kam mir gerade in den Sinn und ich fand es interessant. In jedem Fall kommen Code-Churn-Metriken dem sehr nahe, wonach Sie suchen, und es gibt jede Menge Literatur darüber. Wie für Werkzeuge, Atlassians FishEye ist spektakulär.
Yannis
@Yannis Rizos: Es ist in der Tat eine sehr interessante Lektüre. Was FishEye betrifft, verwenden wir es an unserem Arbeitsplatz (für Überprüfungen), sodass ich sofort in das Handbuch schauen und sehen werde, welche Art von Statistiken wir erstellen können.
Giorgio

Antworten:

17

Eine Maßnahme, die Michael Feather beschrieben hat, ist " The Active Set of Classes ".

Er misst die Anzahl der hinzugefügten Klassen gegen die "geschlossenen". Der beschreibt den Klassenabschluss als:

Eine Klasse ist an dem Datum geschlossen, an dem von diesem Datum bis zur Gegenwart keine weiteren Änderungen daran vorgenommen wurden.

Er verwendet diese Kennzahlen, um Diagramme wie folgt zu erstellen: Aktives Klassendiagramm

Je kleiner der Abstand zwischen den beiden Linien ist, desto besser.

Möglicherweise können Sie eine ähnliche Kennzahl auf Ihre Codebasis anwenden. Es ist wahrscheinlich, dass die Anzahl der Klassen mit der Anzahl der Codezeilen korreliert. Es kann sogar möglich sein, dies zu erweitern, um eine Codezeilen-Kennzahl pro Klasse aufzunehmen, die die Form des Diagramms ändern kann, wenn Sie über einige große monolithische Klassen verfügen.

Dave Hillier
quelle
4

Solange es eine relativ konsistente Zuordnung von Features zu Klassen oder zu Dateisystemen gibt, können Sie so etwas wie eine Quelle in Ihr Versionskontrollsystem einbinden und sehr schnell erkennen, wo sich der größte Teil der Entwicklung befindet (und damit welche Teile des Codes am instabilsten sind).

Dies setzt voraus, dass Sie eine relativ ordentliche Codebasis haben. Wenn es sich bei der Codebasis um eine Schlammkugel handelt, werden Sie im Wesentlichen jeden kleinen Teil sehen, an dem aufgrund von gegenseitigen Abhängigkeiten gearbeitet wird. Das heißt, vielleicht ist das an sich (das Clustering während der Arbeit an einem Feature) ein guter Indikator für die Qualität der Codebasis.

Es wird auch davon ausgegangen, dass Ihr Unternehmen und das Entwicklerteam als Ganzes bestimmte Funktionen in der Entwicklung haben (seien es Zweige in der Versionskontrolle, jeweils eine Funktion, was auch immer). Wenn Sie beispielsweise an drei Hauptfunktionen in demselben Zweig arbeiten, führt diese Methode zu bedeutungslosen Ergebnissen, da Sie ein größeres Problem als die Codestabilität haben.

Leider habe ich keine Literatur, um meinen Standpunkt zu belegen. Es basiert ausschließlich auf meiner Erfahrung mit der Verwendung von Gource auf guten (und nicht so guten) Codebasen.

Wenn Sie git oder svn verwenden und Ihre Quellcode-Version> = 0.39 ist, ist es so einfach wie das Ausführen von gource im Projektordner.

Carl
quelle
Gource scheint auch ein großartiges Werkzeug zu sein! (+1)
Giorgio
1
Ich stolperte über diese Antwort und spielte die nächsten sechs Stunden mit Gource. Ich bin mir nicht sicher, ob das ein +1 oder ein -1 verdient, aber verdammt, das ist ein cooles Tool.
RonU
@RonU: Sie können gource verwenden, um den Status des Repositorys in einem benutzerdefinierten Zeitbereich anzuzeigen. Der Punkt dabei ist, dass es die Aktivität auf Ihrer Codebasis im Laufe der Zeit visualisiert. Wie einfach die Informationen zu interpretieren sind, hängt von vielen Faktoren ab, wie ich oben in meiner Antwort erläutert habe. Ja, es ist ein erstaunliches Werkzeug, wenn Sie das "große Bild" wollen, so denke ich, dass ein +1 verdient;)
Carl
Ja, als ich "sechs Stunden" sagte, meinte ich nicht, dass ich eine Gource-Sim für diese Zeit laufen ließ ... nur, dass ich mit vielen Optionen rumgespielt, sie an ffmpeg weitergeleitet, möglicherweise einen epischen Soundtrack hinzugefügt usw. Es war schon das Kaninchenbau. :)
RonU
Ich rate mal. Der Soundtrack war der geloopte Harlem Shuffle;)
Carl
0

Die Verwendung der Frequenz der modifizierten Zeilen als Indikator für die Codestabilität ist zumindest fraglich.

Die zeitliche Verteilung der modifizierten Linien hängt zunächst stark vom Software-Management-Modell des Projekts ab. Es gibt große Unterschiede in den verschiedenen Managementmodellen.

Zweitens ist das Unglück in dieser Annahme nicht klar - es ist die geringere Anzahl geänderter Zeilen, die durch die Stabilität der Software verursacht wird, oder einfach, weil die Frist abläuft und die Entwickler beschlossen, jetzt keine Änderungen vorzunehmen, sondern sie nach dem Ende der Frist vorzunehmen Freisetzung?

Drittens werden die meisten Zeilen geändert, wenn neue Funktionen eingeführt werden. Aber die neue Funktion macht den Code nicht stabil. Dies hängt von den Fähigkeiten des Entwicklers und der Qualität des Designs ab. Andererseits können sogar schwerwiegende Fehler behoben werden, wenn nur sehr wenige Zeilen geändert werden. In diesem Fall wird die Stabilität der Software erheblich erhöht, die geänderte Zeilenanzahl ist jedoch nicht zu groß.

Johnfound
quelle
"Das hängt von den Fähigkeiten des Entwicklers und der Qualität des Designs ab.": Sie benötigen jedoch mindestens einige Zeit, um die Änderungen zu testen, damit Sie sicher genug sind, dass Sie keine Bugs eingeführt haben. Selbst die erfahrensten Entwickler können Tippfehler machen, z. B. wenn sie unter Druck stehen, zu viele Überstunden gemacht haben oder zu wenig geschlafen haben. Wenn Sie das Open / Closed-Prinzip anwenden, sollte sich die Anzahl der Änderungen (Fehlerkorrekturen) nach einer Weile verringern. Auf jeden Fall habe ich in meiner Frage ausdrücklich angegeben, dass sich das Ergebnis einer solchen Messung je nach Entwicklungsprozess ändern kann.
Giorgio
Übrigens kann Code instabil sein, nicht weil die Entwickler schlecht sind, sondern weil die Anforderungen nicht klar sind und sich das Projekt noch in der Prototypenphase befindet.
Giorgio
@ Giorgio: Natürlich hast du recht. Aber genau das habe ich geschrieben: Die Anzahl der geänderten Zeilen hängt stark von zu vielen Faktoren ab. Einige davon betrafen die Codestabilität, andere nicht. Es ist so, als würde man versuchen zu berechnen, wie viele Menschen Sex haben, indem man die elektrische Energie misst, indem man annimmt - weniger Energie - weniger Licht - mehr Sex. Es ist zwar erwiesen, dass die Geburtenrate nach großen Stromausfällen steigt. ;)
Johnfound
-1

Robustheit ist ein Begriff, der sich auf die korrekte Funktion eines Befehlssatzes bezieht, nicht auf die Quantität, Ausführlichkeit, Knappheit und grammatikalische Korrektheit des Texts, der zum Ausdrücken dieser Anweisungen verwendet wird.

In der Tat ist die Syntax wichtig und muss korrekt sein, aber alles darüber hinaus, was sich auf die gewünschte Funktion der Anweisungen bezieht, indem man sich die "Metriken" der Anweisungen ansieht, ist vergleichbar mit dem Plotten Ihrer Zukunft durch Lesen des Musters der Teeblätter am unteren Rand von Sie Teetasse.

Die Robustheit wird durch Tests gemessen. Unit-Tests, Rauch-Tests, automatisierte Regressionstests; Tests, Tests, Tests!

Meine Antwort auf Ihre Frage ist, dass Sie den falschen Ansatz verwenden, um eine Antwort auf einen der Robustheit zu finden. Es ist ein roter Hering, dass Codezeilen mehr bedeuten als Code, der Zeilen belegt. Sie können nur feststellen, ob der Code das tut, was Sie möchten, wenn Sie testen, ob er das tut, was Sie von ihm verlangen.

Bitte überprüfen Sie die korrekten Testgeschirre und vermeiden Sie die Mystik der Codemetrik.

Die besten Wünsche.

Sassafras_wot
quelle
3
Ich habe ausdrücklich angegeben, dass ich LoC nicht als Maß für die Codekomplexität vorgeschlagen habe. Ich schlug die Änderungen im Code als Maß für die Codestabilität vor: Hat ein Codeteil stabile funktionale Anforderungen und eine stabile, getestete Implementierung, die diese Anforderungen erfüllt?
Giorgio
Ich möchte nicht mit Ihnen streiten, sondern Sie respektvoll von der Torheit der Code-Metrik-Bedeutungslosigkeit abbringen. Ich lese Ihre Frage noch einmal durch und Ihre Beispiele zeigen alle den Wunsch, auf eine Beziehung zwischen sich ändernden Codezeilen und der daraus resultierenden Robustheit zu schließen. Ich verstehe, je mehr Wörter Sie eingeben, desto wahrscheinlicher ist es, dass Sie einen Tippfehler machen. Aber ich bin so gegen den Grundsatz, den Sie fordern, dass ich entschieden dafür eintrete, dass Sie Ihre Suche auf diese Weise aufgeben. Gute Testpraktiken = gute Wahrscheinlichkeit der Robustheit.
Sassafras_wot
"Gute Testpraktiken = gute Wahrscheinlichkeit der Robustheit.": Ich stimme vollkommen zu. Aus diesem Grund schlage ich vor, dass ein Code, der kürzlich geändert wurde, erneut getestet werden muss, bevor wir sicher sein können, dass er korrekt ist.
Giorgio
Es gibt mehrere Definitionen von Stabilität und eine davon ist das, wofür Sie argumentieren. Es ist eine andere semantische Interpretation als die, die ich gemacht habe. Ich habe Stable so verstanden, dass es "keinen extremen Veränderungen unterworfen ist" anstatt "resistent gegen Veränderungen"
Dave Hillier