Ich werde derzeit gebeten, mir ein Projekt anzusehen, das vor fünf Monaten die Kernentwicklung abgeschlossen hat, aber immer noch viele Mängel aufweist. Was sich für etwa alle 10 festgestellten Mängel herausstellt, erheben wir mindestens 4 und in einigen Fällen 8 Mängel.
Ich bin der Meinung, dass die Codierungspraxis beim Anbieter schlecht ist und dass diesbezüglich eine allgemeine Übereinstimmung besteht. Ich frage mich jedoch, ob es ein strukturelles Problem mit der Software gibt. Die Fehlerdichte ist ein nützliches Maß, aber mehr noch, wenn die Kernsoftware schlecht geschrieben ist, verschiebt der Hersteller das Problem.
In der Infrastruktur ist es klarer definiert, ob etwas schlecht gebaut ist. Welche Messungen können Sie für Software neben Defekten pro LOC verwenden?
Das Produkt befindet sich seit 4 Monaten in der Fehlerbehebungsphase und hat immer noch nicht genügend kritische Fehler behoben. Wir fügen keine neuen Funktionen hinzu, sondern beheben nur Regressionsprobleme.
Dies weist auf ein Entwicklungsqualitätsproblem hin, das nicht zufrieden ist. Wenn jedoch das Produkt selbst grundlegend fehlerhaft ist, ist dies ein anderes Problem. Die Sorge ist, dass die Kerncodebasis schlecht geschrieben und die Dokumentation begrenzt ist. Alles, was die externen Entwickler tun, ist, das Problem von A nach B zu verschieben. Sobald die internen Entwicklungsteams die Aufgabe übernehmen, befürchte ich, dass sie den Code grundlegend umschreiben müssen Lass es funktionieren.
Also, wenn Sie ein Produkt von einem Dritten akzeptieren und gebeten werden, es zu unterstützen, welche Akzeptanzkriterien würden Sie verwenden, um Standards zu definieren?
Sie sind sich nicht sicher, was Sie sonst noch tun können, obwohl Sie unseren Hauptentwickler veranlassen, eine Peer-Überprüfung des Codes pro Release durchzuführen?
quelle
Antworten:
Das tust du nicht.
Die Softwarequalität lässt sich nur schwer objektiv messen. Schwer genug, dass es keine Lösung gibt. Ich verzichte auf diese Antwort, um mich mit der Frage zu befassen, ob es überhaupt eine Lösung geben kann, sondern weise einfach darauf hin, warum es wirklich schwierig ist, eine zu definieren.
Argumentation nach Status quo
Wie Kilian Foth betonte, wenn es eine einfache Maßnahme für "gute" Software gäbe, würden wir sie alle verwenden und jeder würde sie fordern.
Es gibt Projekte, in denen Manager beschlossen haben, bestimmte Metriken durchzusetzen. Manchmal hat es funktioniert, manchmal nicht. Mir sind keine signifikanten Zusammenhänge bekannt. Besonders kritische Systemsoftware (z. B. Flugzeuge, Autos usw.) muss eine Vielzahl von Metriken erfüllen, um die SW-Qualität zu gewährleisten. Es sind mir keine Studien bekannt, die belegen, dass diese Anforderungen tatsächlich zu einer höheren Qualität führen, und ich habe persönliche Erfahrungen mit der Gegenteil.
Argumentation durch Spionageabwehr
Auch schon von Kilian angedeutet und allgemeiner ausgedrückt als "jede Metrik kann und wird gespielt".
Was bedeutet es, eine Metrik zu spielen? Es ist ein lustiges Spiel für Entwickler: Sie sorgen dafür, dass die metrischen Werte wirklich gut aussehen, während Sie wirklich beschissene Dinge tun.
Angenommen, Sie messen Fehler pro LOC. Wie soll ich das spielen? Einfach - fügen Sie einfach mehr Code hinzu! Machen Sie dummen Code, der dazu führt, dass mehr als 100 Zeilen nicht ausgeführt werden und Sie plötzlich weniger Fehler pro LOC haben. Das Beste von allem: Sie haben die Softwarequalität auf diese Weise tatsächlich verringert.
Werkzeugmängel werden missbraucht, Definitionen werden bis zum Äußersten erweitert, völlig neue Wege werden gefunden. Im Grunde genommen sind Entwickler wirklich kluge Leute. Wenn Sie nur einen Entwickler in Ihrem Team haben, der Spaß am Spielen von Metriken hat, sind Ihre Metriken fraglich.
Das heißt nicht, dass Kennzahlen immer schlecht sind - aber die Einstellung des Teams zu diesen Kennzahlen ist entscheidend. Dies impliziert insbesondere, dass es für Beziehungen zwischen Subunternehmern und Drittanbietern nicht gut funktionieren wird.
Argumentation durch falsches Targeting
Was Sie messen möchten, ist die Softwarequalität. Was Sie messen, sind eine oder mehrere Metriken.
Es gibt eine Lücke zwischen dem, was Sie messen und dem, was Sie glauben, dass es Ihnen sagen wird. Diese Lücke ist geradezu riesig.
Es passiert die ganze Zeit in allen möglichen Unternehmen um uns herum. Schon mal Entscheidungen auf Basis von KPIs (Key Performance Indicators) gesehen? Es ist genau das gleiche Problem - Sie wollen, dass ein Unternehmen gut abschneidet, aber Sie messen etwas anderes.
Begründung durch Quantifizierbarkeit
Metriken können gemessen werden. Nur deshalb beschäftigen wir uns überhaupt mit ihnen. Die Softwarequalität geht jedoch weit über diese messbaren Einheiten hinaus und hat eine Menge zu bieten, die nur schwer zu quantifizieren ist: Wie lesbar ist der Quellcode? Wie erweiterbar ist Ihr Design? Wie schwer ist es für neue Teammitglieder, an Bord zu kommen? usw. usw.
Die Softwarequalität nur anhand von Metriken zu beurteilen und die Teile der Qualität, die Sie nicht quantifizieren können, nicht zu beurteilen, wird mit Sicherheit nicht gut funktionieren.
bearbeiten:
Zusammenfassung
Lassen Sie mich darauf hinweisen, dass es darum geht, objektiv zu beurteilen, ob Software gut oder schlecht ist, basierend auf Metriken. Das heißt, es sagt nichts darüber aus, ob und wann Sie Metriken anwenden sollten.
Tatsächlich ist dies eine unidirektionale Implikation: Schlechte Metriken implizieren schlechten Code. Unidirektional bedeutet, dass fehlerhafter Code keine fehlerhaften Metriken garantiert und gute Metriken keinen guten Code garantieren. Auf der anderen Seite bedeutet dies, dass Sie Metriken anwenden können, um ein Stück Software zu beurteilen - wenn Sie diese Implikation berücksichtigen.
Sie messen Software A, und die Messdaten fallen wirklich schlecht aus. Dann können Sie sicher sein, dass die Qualität des Codes schlecht ist. Wenn Sie Software B messen und die Metriken in Ordnung sind, haben Sie keinerlei Ahnung von der Codequalität. Lassen Sie sich nicht täuschen und denken Sie "Metriken gut = Code gut", wenn es wirklich nur "Code gut => Metriken gut" ist.
Im Wesentlichen können Sie Metriken verwenden, um Qualitätsprobleme zu finden, nicht jedoch die Qualität selbst.
quelle
Ja, Sie können feststellen, dass der Code Qualitätsprobleme aufweist, indem Sie sich die Metriken bis zu einem gewissen Grad ansehen.
Wenn Sie ein Komplexitätsanalyse-Tool für die Codebasis ausführen, erhalten Sie eine Vorstellung davon, ob der Code gut oder schlecht ist.
Zum Beispiel könnten Sie laufen Quellmonitor .
Dies zeigt Ihnen, wie komplex der Code ist. Ich kann Ihnen sagen, dass jedes problematische System, das ich erlebt habe, schlechte Zahlen hatte. Die Komplexität von 10s bis 100s von Methoden liegt weit über akzeptablen Grenzen. Schreckliche Zahlen. Schreckliche Komplexität, Verschachtelung, Tiefe usw. Dies führt zu vielen Problemen, einer konstant hohen Fehlerrate, schwer durchzuführenden Änderungen, ohne dass etwas anderes kaputt geht usw.
Eine andere Sache sind Mängel. Im Laufe der Zeit sollte sich das System stabilisieren. Im Idealfall sollten neue Fehler gegen Null tendieren oder auf eine niedrige Zahl abflachen, was bedeutet, dass neue und aktuelle Fehler im Laufe der Zeit abnehmen sollten.
Die Handlung sollte ungefähr so aussehen:
Defekte im Laufe der Zeit
Wenn sie konstant bleiben oder zunehmen, ist die Software nicht gut. Du bist nur 4 Monate in, also würde ich es ein paar Monate bis zu einem Jahr geben. Wenn Sie nach 6 Monaten bis zu einem Jahr einen konstanten Strom von Fehlern hatten, ist die Qualität schlecht. Ihr Team hat einen weiteren Schlammball entwickelt .
Nächste Tests. Hast du sie? Wenn nicht weniger Qualität, mehr Fehler, mehr Abwanderung. Wenn Sie sie haben, sind Metriken wie die Codeabdeckung gut, um eine Vorstellung davon zu bekommen, wie viel Code abgedeckt wird, aber sie messen nicht die Qualität . Ich habe große Code-Abdeckungszahlen gesehen, aber die tatsächlichen Tests waren Mist. Sie testeten kein Verhalten oder keine Funktionalität des Systems. Die Entwickler haben sie nur geschrieben, um die Kennzahlen für das Management zu verbessern. Man muss also Tests haben und sie müssen gut sein. Kennzahlen zur Codeabdeckung sind an sich kein Qualitätsindikator.
Code Reviews, führen Sie diese durch? Wenn nicht, weniger Qualität. Dies ist besonders wichtig bei Nachwuchsentwicklern. Wenn Sie agil sind, fügen Sie Ihrer Story einfach eine Codeüberprüfungsaufgabe mit dem Namen "Codeüberprüfung" hinzu. Wenn das Management Zahlen nachverfolgen möchte, benötigen Sie ein Tool, mit dem Bewertungen wie Crucible nachverfolgt werden können . Ich denke, die Code-Überprüfungszahlen oder Metriken sind hier nicht so wichtig, außer dass sie Teil Ihres Prozesses sein sollten. Nicht jeder Check-in muss überprüft werden. Bewertungen können jedoch dazu beitragen, dass die Benutzer das Rad nicht neu erfinden oder Code schreiben, den andere nicht verstehen und / oder nicht warten können.
Schließlich müssen Sie nur den Code bewerten, da keine Metrik hilfreich ist. Jedes problematische Code-Projekt hatte diese Eigenschaften:
Mein Rat wäre eine Komplexitätsanalyse des Codes. Teilen Sie die Ergebnisse nicht mit, sondern verfolgen Sie die Ergebnisse, führen Sie eine unabhängige Untersuchung durch (sehen Sie sich den Code an) und bestimmen Sie den Gesamtzustand der Codebasis. Erstellen Sie daraus einen Aktionsplan und versuchen Sie, einige der komplexen Bereiche des Codes zu korrigieren.
quelle
Das Traurige an Metriken ist, dass Sie möglicherweise die resultierenden Werte Ihrer Metriken verbessern, aber nicht die Qualität, die daran gemessen werden soll ...
In Visual Studio gibt es eine Einstellung zum Behandeln von Compilerwarnungen als Fehler. Jetzt verstehen einige Leute die Warnungen nicht und verwenden zum Kompilieren des Codes einfache Tricks (wie "Pragma-Deaktivierungswarnung" oder das Hinzufügen eines "neuen" Schlüsselworts zu einer Funktion / Eigenschaft, die ein nicht virtuelles Mitglied einer Basis versteckt Klasse).
Wenn Sie Zugriff auf den Quellcode haben, können Sie eine statische Codeanalyse ausführen. Für .Net-Projekte können Sie zB FxCop oder ReSharper InspectCode verwenden. Bei korrekter Verwendung durch das Entwicklerteam tragen die Tools zur Qualitätsverbesserung bei. Aber natürlich sind einige "Korrekturen" zum Entfernen von Warnungen möglich, ohne sie zu verstehen.
Sie könnten sich automatisierte Tests / UnitTests ansehen: Wie gut ist die Codeabdeckung? Ob die Tests den Code tatsächlich überprüfen oder ihn nur einmal ausführen mussten, lässt sich jedoch nicht allein aus der Berichterstattung ableiten.
Das Streben nach hoher Qualität ist eine Einstellung, die von vielen Tools und ihren Metriken unterstützt werden kann, aber Metriken ohne die Einstellung der Entwickler helfen nicht.
quelle
Eine Sache, auf die Sie zusätzlich zur Erfassung einer metrischen Fehlerinjektion achten sollten, ist die Ermittlung der Fehlerquelle. Oft hängt es mit der Spezifikation zusammen.
Grundsätzlich ist es ein Fehler in der Spezifikation, eine Mehrdeutigkeit in der Spezifikation, die den Implantaten überlassen bleibt, zu entscheiden, oder es ist ein Fehler in der Implementierung.
Ein qualitativerer Ansatz ist die Frage, ob die Software nützlich ist. Wenn Sie genau hinschauen, können Sie Fehler in jeder Software feststellen. Wenn es jedoch gut genug funktioniert, um Geld zu verdienen, ist es möglicherweise nicht so schlecht.
quelle
Unten gibt es keinen Weg zu wissen.
Für die ursprüngliche Frage (vor der philosophischen Antwort): Was soll das Produkt tun und macht es? Die Messung nach Fehleranzahl / -dichte ist nicht ausreichend. Ich konnte nicht sagen, ob es sich um eine Bibliothek oder eine Anwendung handelte, wie groß die Codebasis war, wie groß die Problemdomäne war und wie schwerwiegend die Fehler waren. Wenn Sie beispielsweise eines der 123 Eingabeformate nicht verarbeiten, kann dies ein geringfügiger Fehler oder ein Show Stopper sein, je nachdem, wie wichtig es ist, dass das Format nicht ordnungsgemäß verarbeitet wird. Und besser als nichts ist ein hoher Standard.
Annahme, die ich für diese Frage mache: Es gibt einen Unterschied zwischen Code und Software. Ich definiere Software als das, was ein Client / Benutzer verwendet, um ein Problem zu lösen, während Code das Baumaterial von Software ist.
Software kann nur subjektiv gemessen werden. Das heißt, die Metrik, die für Software von Bedeutung ist, ist, ob Menschen sie zur Lösung eines Problems verwenden. Diese Metrik hängt vom Verhalten des anderen ab und ist daher subjektiv. Hinweis: Bei einigen Problemen kann eine Software sehr nützlich sein und wird daher als qualitativ hochwertig eingestuft (Excel für Berechnungen), jedoch nicht als qualitativ hochwertige Software für ein anderes Problem (Excel zum Abspielen von MP3-Dateien).
Code kann (normalerweise) mit empirischen Metriken gemessen werden . Aber die Interpretation ist nicht "Ja / Nein" für Qualität oder sogar wirklich auf einer Skala von "0 bis N". Metriken messen gegen einen Standard. Daher können Metriken durch die Norm definierte Problembereiche finden. Das Fehlen von Problembereichen ist jedoch kein Beweis dafür, dass es sich um einen Qualitätscode handelt. Zum Beispiel nützliche Metriken: Kompiliert es? Nein -> Nicht Qualität. Ja -> ???. Besteht es den Unit Test? Nein? Vielleicht? (weil, ist der Unit Test Quality Code?), Ja -> ???.
So wie Godels Unvollständigkeitsbeweis für Axiome der Mathematik gezeigt hat (das heißt, es gibt mathematische Aussagen, die nicht für eine endliche Menge von Axiomen als wahr oder falsch bewiesen werden können), glaube ich nicht, dass wir jemals wirklich antworten könnten Code?' für jedes Stück Code. Intuitiv gibt es wahrscheinlich eine Zuordnung zwischen Softwaremetriken zur Beantwortung von Qualität und mathematischen Axiomen zur Beantwortung von nachweislich wahr oder falsch.
Ein anderer Weg, um dieses Argument vorzubringen, ist, in die natürliche Sprache einzusteigen. William Shakespeare, Lewis Carroll und Mark Twain waren erfolgreiche Schriftsteller und wegen der Qualität ihrer Schriften von vielen geliebt. Welchen Standard in Bezug auf Grammatik, Wortschatz, Stil oder Stimme könnten wir jedoch anwenden, der sie durchweg höher einstuft als zufällige Zwölftklässler? Und während es möglich sein mag, eine synthetische Maßnahme für diese drei zu schaffen, wie würde sie das Buch Johannes (KJV), JRR Tolkien, Homer, Cervantes usw. bewerten? Dann werfen Sie Burroughs, Faulkner, Hemingway, Sylvia Plath und so weiter ein. Die Metrik funktioniert nicht.
quelle
Ich würde dies messen, indem ich ihren Prozess überprüfe (und nach Abweichungen darin Ausschau halte).
Ich würde nach Beweisen für einen Prozess suchen, der die zentrale Quellcodeverwaltung, das zentrale Build-System und einen Prozess umfasst, der sicherstellt, dass Code vor der Integration in den freigegebenen Zweig getestet wird.
Ich würde auch nach Beweisen suchen, wie sie ihre Prozesse als Reaktion auf Situationen geändert haben, in denen Fehler ihren Freigabeprozess durchlaufen haben.
Wenn sie diese Prüfungsebene nicht bestehen können, können Sie nicht erwarten, dass sie konsistente, zuverlässige Releases liefern.
Wenn sie diese Prüfung bestehen und ihren Prozess kontinuierlich verbessern, wird sich die Konsistenz der Ausgabe mit der Zeit wahrscheinlich verbessern.
Wenn dies nicht behebt wird, liegt wahrscheinlich ein Problem mit der Codearchitektur vor, das das Erweitern und Testen der aktuellen Codebasis erschwert. In diesem Fall gibt es keine guten Optionen.
quelle
Wenn Sie auf der Suche nach vollständig automatisierten Messungen sind, empfehle ich die folgenden Typen: Software Improvement Group
Es handelt sich im Wesentlichen um ein Aggregat verschiedener Metriken, die automatisch aus dem Quellcode extrahiert werden können (z. B. Unit-Test-Coverage, Funktionsgröße, Klassenverschränkung, Duplizierung, LOC usw.). Diese Werte werden dann in 1-5 Sterne umgewandelt.
Sie haben auch ein anständiges Buch alle ihre Metriken in der Praxis zu beschreiben, die es wert eine ist zu lesen: ‚Gebäude wartbare Software‘ .
quelle