Es gibt eine Menge starker Meinungen rund um die Debatte, aber dies ist offensichtlich keine Frage der Meinung, sondern eine Frage der Fakten . So sollten wir in der empirischen Forschung suchen . Und die Beweise dafür sind klar:
Ja , statisches Tippen ist die Kompromisse wert - und zwar nicht nur ein wenig, sondern tatsächlich im Wesentlichen . Tatsächlich zeigen solide Beweise, dass statische Typisierung die Anzahl der Fehler im Code um mindestens 15% reduzieren kann (und dies ist eine geringe Schätzung, der tatsächliche Prozentsatz ist mit ziemlicher Sicherheit größer). Das ist eine erschreckend hohe Zahl: Ich denke, selbst die meisten Befürworter der statischen Typisierung hätten nicht gedacht, dass dies einen so drastischen Unterschied ausmacht.
Bedenken Sie Folgendes: Wenn jemand Ihnen sagte, dass es eine einfache Möglichkeit gibt, die Fehler in Ihrem Projekt über Nacht um 15% zu reduzieren, sollte dies ein Kinderspiel sein. 1 Es ist fast die sprichwörtliche Silberkugel.
Die Beweise werden in der Arbeit To Type or Not to Type: Quantifying Detectable Bugs in JavaScript von Zheng Gao, Christian Bird und Earl T. Barr vorgestellt. Ich ermutige alle, es zu lesen, es ist eine gut geschriebene Arbeit, die beispielhafte Forschung präsentiert.
Es ist schwer, genau zusammenzufassen, wie rigoros die Autoren ihre Analyse durchgeführt haben, aber hier ist ein (sehr grober) Abriss:
TypeScript und Flow sind zwei auf JavaScript basierende Programmiersprachen, die, obwohl sie ansonsten kompatibel bleiben, Typhinweise und statische Typprüfung hinzufügen. Dies ermöglicht es, vorhandenen Code nach Typen zu erweitern und ihn dann zu überprüfen.
Die Forscher sammelten in GitHub in JavaScript geschriebene Open Source-Projekte, untersuchten behobene Fehlerberichte und versuchten, jeden der gemeldeten Fehler auf einen Code zu reduzieren, der von der statischen Typprüfung von TypeScript oder Flow abgefangen werden würde. Dies ermöglichte es ihnen, eine Untergrenze des Prozentsatzes der Fehler zu schätzen, die durch statische Typisierung behoben werden konnten.
Die Forscher haben strenge Vorkehrungen getroffen, um sicherzustellen, dass bei ihrer Analyse ein nicht typbezogener Fehler nicht als typbezogen eingestuft wird. 2
Im Vergleich zu früheren Studien weist diese neue Studie besondere Stärken auf:
- Es gibt einen direkten Vergleich zwischen statischer und dynamischer Typisierung mit wenigen (wenn überhaupt) Störfaktoren, da der einzige Unterschied zwischen JavaScript und TypeScript / Flow in der Typisierung besteht.
- Sie führen eine Replikation über mehrere Dimensionen durch, indem sie TypeScript und Flow (dh verschiedene Typsysteme) überprüfen und die (manuelle) Typanmerkung von verschiedenen Personen reproduzieren lassen, um die Fehler zu beheben. Und das über eine Vielzahl von Codebasen aus verschiedenen Projekten hinweg.
- Das Papier misst den direkten Einfluss der statischen Typisierung auf behebbare Fehler (und nicht auf etwas vageere Qualität).
- Die Autoren definieren ein strenges Modell dafür, was und wie im Voraus gemessen werden soll. Darüber hinaus ist ihre Beschreibung unglaublich klar und lässt sich leicht auf Fehler analysieren (es ist immer dann gut, wenn sich eine Forschungsarbeit für Angriffe öffnet: Wenn keine Angriffe ihre Argumente eindämmen, kommt sie noch stärker zum Vorschein). 3
- Sie führen eine ordnungsgemäße Leistungsanalyse durch, damit ihre Probengröße ausreicht und ihre anschließende statistische Analyse luftdicht ist.
- Sie sind zu konservativ, um störende Erklärungen auszuschließen, und messen nur einen einzigen beweglichen Teil. Darüber hinaus beschränken sie ihre Analyse auf Fehler, die durch das Einbeziehen von Typen sofort behoben werden können, und schließen alle Elemente aus, die möglicherweise ein erweitertes Refactoring erfordern, um das Eingeben zu ermöglichen. In Wirklichkeit ist der Effekt plausibel viel größer, aber sicherlich nicht kleiner als von ihnen berichtet.
- Und schließlich finden sie keine leichte Wirkung, sondern einen erstaunlichen Unterschied. Trotz ihrer zu konservativen Vorgehensweise stellen sie fest, dass selbst am unteren Ende des 95% -Konfidenzintervalls mindestens 10% der Bugs mit minimalen zusätzlichen Typprüfungen einfach verschwinden würden.
Sofern das Papier keinen fundamentalen Fehler enthält, den noch niemand entdeckt hat, zeigt das Papier schlüssig einen großen Vorteil der statischen Typisierung, und das fast ohne Kosten. 4
Historisch gesehen hat die Erforschung der Schreibdisziplinen in der Programmierung einen schwierigen Anfang genommen, da die Beweise für eine lange Zeit überhaupt nicht klar waren. Der Grund dafür ist, dass es nicht einfach ist, systematische Experimente durchzuführen, um den Effekt der statischen und dynamischen Typisierung zu untersuchen : Ein systematisches Experiment muss den Effekt, den wir untersuchen, isolieren. Und leider können wir die Wirkung der Schreibdisziplin nicht einschränken, da sie an die Programmiersprachen gebunden ist.
Es tatsächlich waren Programmiersprachen , die sowohl statische als auch dynamische Typisierung in verschiedenen Dialekten erlaubt (zB VB mit Option Strict
On
oder Off
oder statisch Lisp eingegeben). Diese waren jedoch für einen direkten Vergleich nicht gut geeignet, vor allem, weil es keine ausreichend großen Codebasen gab, die einen direkten Vergleich ermöglichten. Bestenfalls könnten wir sie in „Laboreinstellungen“ vergleichen, in denen Testpersonen eine Aufgabe in der statisch oder dynamisch typisierten Variante der Sprache zufällig lösen.
Leider modellieren diese künstlichen Programmieraufgaben den realen Gebrauch nicht gut. Insbesondere sind viele von ihnen von geringem Umfang und lösen ein genau definiertes Problem, das auf einer halben Textseite zusammengefasst werden kann.
Zum Glück ist dies in der Vergangenheit der Fall, da TypeScript, Flow und JavaScript mit Ausnahme der statischen Typisierung in der Tat die gleichen Sprachen sind und es einen umfangreichen realen Datensatz mit Code und Fehlern gibt, aus dem Sie Beispiele erstellen können.
1 Inspiriert von einem Zitat aus dem Originalpapier.
2 Ich bin damit nicht ganz zufrieden: Eine der Hauptstärken statisch typisierter Sprachen besteht darin, dass scheinbar typunabhängige Probleme auf eine Art und Weise formuliert werden können, die statisch typisiert werden kann. Dies wandelt viele logische Fehler in Typfehler um, was die Fehlerrate, die durch statisches Tippen aufgefangen werden kann, drastisch erhöht. In der Tat werden in der Veröffentlichung typunabhängige Fehler grob klassifiziert, und ich behaupte, dass ein großer Prozentsatz dieser Fehler tatsächlich durch statische Typisierung aufgefangen werden könnte.
3 Ich lade jeden ein, insbesondere Befürworter des dynamischen Schreibens, zu versuchen, nicht adressierte Fehler in der Analyse zu finden. Ich glaube nicht, dass es viele gibt (wenn überhaupt), und ich bin zuversichtlich, dass kein möglicher Fehler das Ergebnis wesentlich verändern würde.
4 Ich vermute, dass die tatsächlichen Kosten für die statische Eingabe in realen Großprojekten nicht vorhanden sind, da sie dann zu einem natürlichen Bestandteil der Architektur werden und die Planung möglicherweise sogar vereinfachen . Das Beheben statischer Typfehler ist zeitaufwändig, jedoch weitaus weniger als die später entdeckten Fehler. Dies wurde ausführlich empirisch untersucht und ist seit Jahrzehnten bekannt (siehe zB Code Complete ).