Wokół debaty jest wiele silnych opinii, ale oczywiście to nie jest kwestia opinii, to fakty . Powinniśmy więc spojrzeć na badania empiryczne . Dowody z tego są jasne:
Tak , pisanie statyczne jest warte kompromisów - i to nie tylko odrobinę, ale w rzeczywistości znacznie . W rzeczywistości solidne dowody wskazują, że wpisywanie statyczne może zmniejszyć liczbę błędów w kodzie o co najmniej 15% (i jest to niski szacunek, faktyczny odsetek jest prawie na pewno większy). Jest to szokująco wysoka liczba: myślę, że nawet większość zwolenników pisania statycznego nie pomyślałaby, że ma to tak drastyczną różnicę.
Zastanów się: jeśli ktoś powiedział ci, że istnieje prosty sposób na zmniejszenie błędów w twoim projekcie o 15% w ciągu jednej nocy, nie powinno to być żadnym problemem. 1 To prawie przysłowiowa srebrna kula.
Dowody zostały przedstawione w artykule Zheng Gao, Christian Bird i Earl T. Barr w artykule Aby wpisać lub nie wpisać: Określenie wykrywalnych błędów w JavaScript . Zachęcam wszystkich do lektury, jest to dobrze napisany artykuł, który przedstawia przykładowe badania.
Trudno jest zwięźle streścić, jak rygorystycznie autorzy przeprowadzili analizę, ale oto (bardzo przybliżony) zarys:
TypeScript i Flow to dwa języki programowania oparte na JavaScript, które pozostając kompatybilne, dodają podpowiedzi i statyczne sprawdzanie typów. Pozwala to na powiększenie istniejącego kodu o typy, a następnie na sprawdzenie typu.
Badacze zebrali projekty Open Source napisane w języku JavaScript z GitHub, przejrzeli zgłoszone błędy i próbowali zredukować każdy z zgłoszonych błędów do fragmentu kodu, który zostałby przechwycony przez statyczny moduł sprawdzania typu TypeScript lub Flow. To pozwoliło im oszacować dolną granicę odsetka błędów, które można naprawić za pomocą pisania statycznego.
Badacze podjęli surowe środki ostrożności, aby ich analiza nie uwzględniła błędu niezwiązanego z typem jako powiązanego z typami. 2)
W porównaniu do poprzednich badań to nowe badanie ma szczególne zalety:
- Istnieje bezpośrednie porównanie pisania statycznego i dynamicznego, z kilkoma (jeśli w ogóle) mylącymi czynnikami, ponieważ jedyną różnicą między JavaScript a TypeScript / Flow jest pisanie.
- Wykonują replikację w wielu wymiarach, sprawdzając zarówno TypeScript, jak i Flow (tj. Różne systemy typów), a także pozwalając różnym osobom odtwarzać (ręczną) adnotację typu w celu naprawienia błędów. I wykonują to w wielu bazach kodu z różnych projektów.
- Artykuł mierzy bezpośredni wpływ pisania statycznego na możliwe do naprawienia błędy (zamiast pewnej bardziej niejasnej jakości).
- Autorzy określają rygorystyczny model tego, co mierzyć i jak z góry. Co więcej, ich opis jest niezwykle jasny i ułatwia analizę pod kątem wad (zawsze dobrze jest, gdy dokument badawczy otwiera się na ataki: jeśli żaden atak nie zdoła podważyć argumentów, wyjdzie jeszcze silniejszy). 3)
- Przeprowadzają odpowiednią analizę mocy , aby ich wielkość próbki była wystarczająca, a ich późniejsza analiza statystyczna jest hermetyczna.
- Są zbyt konserwatywni, aby wykluczyć mylące wyjaśnienia i mierzą tylko jedną ruchomą część. Ponadto ograniczają swoją analizę do błędów, które można natychmiast naprawić, włączając typy i wykluczają wszystko, co może wymagać bardziej zaawansowanego refaktoryzacji w celu dostosowania do pisania. Tak więc w rzeczywistości efekt jest znacznie większy, ale na pewno nie mniejszy niż to, co zgłosili.
- I w końcu nie widzą żadnego efektu, ale oszałamiającą różnicę. Pomimo zbyt zachowawczej procedury, nawet na dolnym końcu 95% przedziału ufności stwierdzają, że istnieje co najmniej 10% błędów, które zniknęłyby po minimalnym dodaniu kontroli typu.
O ile w papierze nie ma fundamentalnej wady, której nikt jeszcze nie odkrył, papier bez wątpienia wykazuje dużą zaletę pisania statycznego, prawie za darmo. 4
Historycznie rzecz biorąc, badania nad dyscyplinami pisania na klawiaturze miały gwałtowny początek, ponieważ przez długi czas dowody wcale nie były jasne. Powodem tego jest to, że robi systematyczne eksperymenty w celu zbadania wpływu statyczne vs dynamiczne typowanie nie jest łatwe: systematyczna eksperyment musi izolować efekt Badamy. I niestety nie możemy wyodrębnić efektu dyscypliny pisania, ponieważ jest on związany z językami programowania.
W rzeczywistości istniały języki programowania, które umożliwiały zarówno pisanie statyczne, jak i dynamiczne w różnych dialektach (np. VB z Option Strict
On
lub Off
lub statycznie wpisany Lisp). Nie nadawały się one jednak do bezpośredniego porównania, co najważniejsze, ponieważ nie istniały wystarczająco duże bazy kodu, które pozwalałyby na bezpośrednie porównanie. W najlepszym wypadku moglibyśmy je porównać w „warunkach laboratoryjnych”, w których badani losowo rozwiązują zadanie w statycznie lub dynamicznie typowanym wariancie języka.
Niestety te sztuczne zadania programistyczne nie modelują dobrze użycia w świecie rzeczywistym. W szczególności wiele z nich ma niewielki zakres i rozwiązuje dobrze zdefiniowany problem, który można streścić na połowie strony tekstu.
Na szczęście dzieje się tak w przeszłości, ponieważ TypeScript, Flow i JavaScript są w rzeczywistości tymi samymi językami, z wyjątkiem pisania statycznego, oraz ponieważ istnieje obszerny zestaw danych kodu i błędów, z których można pobierać próbki.
1 Zainspirowany cytatem z oryginału.
2 Nie do końca jestem z tego zadowolony: jedną z głównych zalet statycznie typowanych języków jest to, że pozornie niezwiązane z typem problemy można sformułować w sposób, który można sprawdzić statycznie. Przekształca to wiele błędów logicznych w błędy typu, co drastycznie zwiększa liczbę błędów, które można wykryć podczas pisania statycznego. W rzeczywistości papier z grubsza klasyfikuje błędy niezwiązane z typem i twierdzę, że duży procent z nich można w rzeczywistości złapać przez pisanie statyczne.
3 Zapraszam każdego, a zwłaszcza zwolenników pisania dynamicznego, aby starał się znaleźć nieadresowane błędy w analizie. Nie sądzę, że jest ich wiele (jeśli w ogóle) i jestem przekonany, że żadna potencjalna wada nie wpłynie znacząco na wynik.
4 Podejrzewam, że rzeczywisty koszt statycznego typowania realnych, projekty na dużą skalę jest nie istnieje, ponieważ wtedy staje się naturalną częścią architektury, a nawet może ułatwić planowanie. Naprawianie błędów typu statycznego zajmuje dużo czasu, ale znacznie mniej niż błędy wykryte później. Zostało to szeroko przebadane empirycznie i znane od dziesięcioleci (patrz np. Kod Complete ).