Ci sono molte opinioni forti intorno al dibattito, ma ovviamente questa non è in realtà una questione di opinione, è una questione di fatti . Quindi dovremmo guardare alla ricerca empirica . E le prove da ciò sono chiare:
Sì , la tipizzazione statica vale i compromessi - e non solo per un po ', ma in effetti sostanzialmente . In effetti, prove concrete dimostrano che la tipizzazione statica può ridurre il numero di bug nel codice di almeno il 15% (e questa è una stima bassa, la percentuale effettiva è quasi certamente maggiore). Questo è un numero incredibilmente alto : penso che anche la maggior parte dei sostenitori della tipizzazione statica non avrebbe pensato che avesse fatto una differenza così drastica.
Considera questo: se qualcuno ti dicesse che esiste un modo semplice per ridurre i bug nel tuo progetto del 15% dall'oggi al domani, dovrebbe essere un gioco da ragazzi. 1 È quasi il proverbiale proiettile d'argento.
Le prove sono presentate nel documento Per scrivere o non scrivere: quantificare i bug rilevabili in JavaScript di Zheng Gao, Christian Bird e Earl T. Barr. Incoraggio tutti a leggerlo, è un documento ben scritto che presenta ricerche esemplari.
È difficile riassumere sinteticamente quanto rigorosamente gli autori hanno eseguito la loro analisi, ma ecco uno schema (molto approssimativo):
TypeScript e Flow sono due linguaggi di programmazione basati su JavaScript che, pur rimanendo altrimenti compatibili, aggiungono suggerimenti sul tipo e controllo statico del tipo. Ciò consente di aumentare il codice esistente di tipi e quindi di controllarlo.
I ricercatori hanno raccolto progetti Open Source scritti in JavaScript da GitHub, hanno esaminato le segnalazioni di bug risolte e hanno tentato di ridurre ciascuno dei bug segnalati a un pezzo di codice che sarebbe stato catturato dal controllo statico del tipo di TypeScript o Flow. Ciò ha permesso loro di stimare un limite inferiore della percentuale di bug che potrebbe essere risolto utilizzando la tipizzazione statica.
I ricercatori hanno preso rigorose precauzioni per garantire che la loro analisi non considerasse un bug non correlato al tipo come correlato ai tipi. 2
Rispetto agli studi precedenti, questo nuovo studio ha particolari punti di forza:
- Esiste un confronto diretto tra tipizzazione statica e dinamica, con pochi (se presenti) fattori confondenti, poiché l'unica differenza tra JavaScript e TypeScript / Flow è la tipizzazione.
- Eseguono la replica su più dimensioni controllando sia TypeScript che Flow (ovvero sistemi di tipo diverso) e facendo in modo che persone diverse riproducano l'annotazione di tipo (manuale) per correggere i bug. E lo fanno attraverso un gran numero di basi di codice di diversi progetti.
- L'articolo misura l'impatto diretto della tipizzazione statica sui bug risolvibili (piuttosto che su una qualità più vaga).
- Gli autori definiscono un modello rigoroso di cosa misurare e come, in anticipo. Inoltre, la loro descrizione è incredibilmente chiara e semplifica l'analisi dei difetti (è sempre utile quando un documento di ricerca si apre agli attacchi: se nessun attacco riesce a intaccare le sue argomentazioni, risulta ancora più forte). 3
- Eseguono un'adeguata analisi della potenza in modo che la loro dimensione del campione sia sufficiente e la loro successiva analisi statistica sia ermetica.
- Sono eccessivamente conservatori per escludere spiegazioni confondenti e misurare solo una singola parte mobile. Inoltre, limitano la loro analisi ai bug immediatamente risolvibili includendo i tipi ed escludono tutto ciò che potrebbe richiedere un refactoring più avanzato per adattarsi alla digitazione. Quindi, in realtà, l'effetto è plausibilmente molto più grande, ma certamente non inferiore a quello che hanno riportato.
- E infine, non trovano un leggero effetto ma una differenza sbalorditiva . Nonostante la loro procedura eccessivamente conservativa, anche nella parte bassa dell'intervallo di confidenza al 95% scoprono che ci sono almeno il 10% di bug che svanirebbero semplicemente con controlli di tipo aggiunti minimi.
A meno che non vi sia un difetto fondamentale nel documento che nessuno ha ancora scoperto, il documento mostra in modo conclusivo un grande vantaggio della digitazione statica, quasi a costo zero. 4
Da un punto di vista storico, la ricerca sulle discipline tipografiche nella programmazione ha avuto un inizio difficile perché, per molto tempo, le prove non erano affatto chiare. La ragione di ciò è che fare esperimenti sistematici per esaminare l'effetto della tipizzazione statica vs dinamica non è facile: un esperimento sistematico deve isolare l'effetto che stiamo studiando. E sfortunatamente non possiamo isolare l'effetto della disciplina di battitura, poiché è legata ai linguaggi di programmazione.
In realtà c'erano linguaggi di programmazione che permettevano la digitazione sia statica che dinamica in dialetti diversi (ad es. VB con Option Strict
On
o Off
, o Lisp tipicamente statico). Tuttavia, questi non erano adatti per un confronto diretto, soprattutto perché non esistevano basi di codice sufficientemente grandi che consentano il confronto diretto. Nella migliore delle ipotesi, potremmo confrontarli in "impostazioni di laboratorio", in cui i soggetti del test risolvono in modo casuale un'attività nella variante della lingua tipizzata staticamente o dinamicamente.
Sfortunatamente questi incarichi di programmazione artificiale non modellano bene l'uso nel mondo reale. In particolare, molti di essi hanno una portata ridotta e risolvono un problema ben definito che può essere riassunto in mezza pagina di testo.
Fortunatamente è passato, perché TypeScript, Flow e JavaScript sono in effetti gli stessi linguaggi, tranne per la tipizzazione statica, e perché esiste un ampio set di dati del codice e bug presenti nel mondo reale.
1 Ispirato da una citazione dalla carta originale.
2 Non ne sono del tutto contento: uno dei principali punti di forza dei linguaggi tipizzati staticamente è che i problemi apparentemente non correlati al tipo possono essere formulati in modi che possono essere controllati staticamente. Ciò trasforma molti errori logici in errori di tipo, che aumentano drasticamente la velocità di bug che possono essere rilevati dalla tipizzazione statica. In effetti, il documento classifica approssimativamente i bug non correlati al tipo e io sostengo che una grande percentuale di questi potrebbe in effetti essere catturata dalla tipizzazione statica.
3 Invito chiunque, in particolare i sostenitori della tipizzazione dinamica, a cercare di trovare difetti non risolti nell'analisi. Non credo che ce ne siano molti (se ce ne sono), e sono fiducioso che nessun potenziale difetto altererebbe materialmente il risultato.
4 Sospetto che il costo effettivo della tipizzazione statica in progetti reali su larga scala sia inesistente, dal momento che diventa una parte naturale dell'architettura e potrebbe persino semplificare la pianificazione. La correzione degli errori di tipo statico richiede tempo, ma molto meno degli errori rilevati in seguito. Questo è stato ampiamente studiato empiricamente ed è noto da decenni (vedi ad esempio Codice completo ).