Über Produktivität und SLOC
Das Problem mit SLOC
Das Problem mit der SLOC- Metrik ist, dass sie eine Annäherung an die Menge des geschriebenen Codes misst, ohne Folgendes zu berücksichtigen:
- die Qualität des Codes (dh was ist, wenn Sie aufgrund von Fehlern für jeweils 100 SLOC weitere 90 SLOC hinzufügen müssen, aber im Moment, in dem Ihr Code ausgeliefert wird, nicht wissen, ob dies der Fall ist?)
- die mit dem Code erreichten Ziele (dh behandelt der 10K SLOC alle erwarteten Use Cases oder User Stories? oder nur eine winzige Teilmenge?)
- die Wartbarkeit des Codes (dh müssen Sie 1% oder 50% mehr Code hinzufügen, um den Code an die zu erwartenden sich ändernden Anforderungen anzupassen?).
Andernfalls wird die Produktion von fehleranfälligem, nicht wartbarem Spaghetti-Code mit vielen kopiert eingefügten Teilen als produktiver angesehen als sorgfältig entwickelter, wiederverwendbarer Code.
SLOC ist also definitiv nicht der beste Weg, um die Produktivität zu messen.
Welche Produktivität erwägen wir?
Die Produktivität wird für einen Prozess gemessen. Somit könnte SLOC ein perfekter Indikator für den Codierungsprozess sein.
Wenn Sie beispielsweise schlechte Anforderungen missverstehen, fünf Monate für die Erstellung der Software aufwenden, diese dem Benutzer zeigen, feststellen, dass sie völlig falsch ist, und weitere fünf Monate für das endgültige Neuschreiben der Software aufwenden, haben Sie die gleiche Produktivität in SLOC / Monat, dass ein Team den Code gleich beim ersten Mal schreibt, zum Beispiel weil es einen agilen Prozess verwendet, der Missverständnisse durch häufiges Feedback reduziert. Diese scheinbar gleiche Produktivität birgt große Probleme.
Um die Produktivität der Softwareentwicklung zu messen, muss der gesamte Prozess berücksichtigt werden, einschließlich der Analyse der Anforderungen, des Entwurfs von Code, des Codierens, Testens, Debuggens und der Überprüfung, ob die Erwartungen der Benutzer erfüllt werden. Da all diese Aktivitäten sehr unterschiedlich sind, ist es am besten, den einzigen entscheidenden Gedanken zu messen: funktionierende Software, dh was die erzeugte Software für den Benutzer bedeutet .
Wie messe ich Software-Ergebnisse?
Es gibt verschiedene Ansätze:
- Der typische Ansatz in der klassischen Softwareentwicklung ist Function Points (FP). Funktionspunkte werden anhand der zu erfüllenden Anforderungen gemessen (z. B. Anzahl der Formulare, Anzahl der Felder in den einzelnen Formularen usw.). Die Produktivität wird dann in FP pro Zeiteinheit und pro Person gemessen. Einige Unternehmen haben sogar Daten, die angeben, wie viele Funktionspunkte ein Entwickler pro Zeiteinheit in einer bestimmten Sprache für eine bestimmte Domäne erzeugen kann. Das Problem bei FP ist, dass es sehr detaillierte Anforderungen im Voraus erfordert und zeitaufwendig ist.
- Ein moderner und pragmatischer Ansatz ist Story Points (SP). Diese dienen zur Bewertung der Komplexität des zu erstellenden Codes und werden routinemäßig zur Bewertung der Geschwindigkeit von Entwicklungsteams verwendet. SP ist jedoch ein Schätzmaß für die geleistete Arbeit, bevor alle Details bekannt sind. Es ist kein endgültiges Maß dafür, was tatsächlich passiert ist. Daher muss bei der Verwendung als Produktivitätsmaß vorsichtig vorgegangen werden, da dies zu Fehlschlägen beim Schätzungsprozess führen kann .
Über die Produktivität des statischen und dynamischen Tippens
Ich muss gestehen, dass ich persönlich ein Fan von statisch getippten Sprachen bin, weil ich in meinem Inneren weiß, dass es zuverlässiger ist (jahrelange Codierung hat mir das bewiesen).
Ich gehe davon aus, dass statisch typisierte Sprachen beim Kompilieren wesentlich mehr Fehler / Bugs (z. B. Tippfehler, Nichtübereinstimmung der erwarteten Typen usw.) verhindern können als nicht statisch typisierte Sprachen. Aber bei aller Objektivität würde ich es nicht wagen, dies missbräuchlich als höhere Produktivität zu verallgemeinern.
Hat Ihr Architekt Recht?
Vielleicht, vielleicht nicht.
Seine Argumente scheinen jedoch nicht zu stimmen: Der Produktivitätsgewinn statisch typisierter Sprache beruht auf einer erheblichen Anzahl von Fehlern, die der Compiler im Voraus abfängt.
Infolgedessen ist es nicht möglich, diesen "höheren" Produktivitätsgewinn zu ermitteln, indem nur SLOC betrachtet wird, ohne die für dynamisch typisierte Sprachen erforderliche Überarbeitung zu berücksichtigen. Sein Vergleich kann also nicht fair sein.
Das Argument der vergleichbaren Umstände trifft auch nicht zu. Einige dynamisch typisierte Sprachen ermöglichen Konstruktionen höherer Ebenen, die weniger Code erfordern, als dies in einer der klassischen statisch typisierten Sprachen der Fall ist. Sie könnten also weniger Zeit benötigen, weniger Code schreiben, aber den gleichen Aufwand für Analyse, Test und Überprüfung aufwenden. Das Messen der Produktivität durch das SLOC würde also die potenziellen Produktivitätsgewinne verwässern und somit eine Tendenz gegenüber dynamisch getippter Sprache erzeugen.
Irgendeine Studie, die diese Behauptung stützt?
Zu diesem Thema existieren mehrere neuere akademische Studien. Obwohl einige von ihnen den Vorteil der statischen Typisierung sehen, ist sie im Allgemeinen auf einen bestimmten Zweck beschränkt (Dokumentation, Wiederverwendung von schlecht dokumentiertem Code oder API usw.). Vorsichtige Formulierungen werden auch verwendet, weil moderne IDE die mit dynamischer Typisierung verbundenen Risiken erheblich verringert hat: