Є багато сильних думок навколо дискусій, але очевидно, це насправді не питання думки, це питання фактів . Отже, ми повинні подивитися на емпіричне дослідження . І докази цього зрозумілі:
Так , статичний набір вартий компромісів - і не лише трохи, а фактично істотно . Насправді, ґрунтовні дані свідчать, що статичне введення тексту може зменшити кількість помилок у коді принаймні на 15% (а це низька оцінка, фактичний відсоток майже напевно більший). Це вражаюче велика кількість: я думаю, що навіть більшість прихильників статичного набору тексту не могли б подумати, що це настільки різко зміниться.
Подумайте про це: якщо хтось сказав вам, що існує простий спосіб зменшити помилки у вашому проекті на 15% протягом ночі, це повинно бути незрозумілим. 1 Це майже прислівна срібна куля.
Докази представлені в документі " Ввести або не набрати": кількісна оцінка виявлених помилок у JavaScript від Чжен Гао, Крістіан Берд та графа Т. Барра. Я закликаю всіх її прочитати, це добре написаний документ, який представляє зразкові дослідження.
Важко коротко підвести підсумки того, наскільки суворо автори виконували свій аналіз, але ось (дуже приблизний) контур:
TypeScript і Flow - це дві мови програмування на основі JavaScript, які, залишаючись в іншому випадку сумісними, додають підказку типу та перевірку статичного типу. Це дозволяє збільшити існуючий код за типами, а потім перевірити його.
Дослідники збирали проекти з відкритим кодом, написані в JavaScript від GitHub, розглядали вирішені звіти про помилки та намагалися зменшити кожну з повідомлених помилок до фрагмента коду, який би потрапив у перевірку статичного типу TypeScript або Flow. Це дозволило їм оцінити нижню межу відсотка помилок, які можна було б виправити за допомогою статичного набору тексту.
Дослідники вживали суворих запобіжних заходів, щоб гарантувати, що їх аналіз не вважатиме помилку, що не стосується типу, як пов’язану з типами. 2
Порівняно з минулими дослідженнями, це нове дослідження має особливі переваги:
- Існує пряме порівняння статичного та динамічного набору тексту з кількома (якщо такі є) заплутаними факторами, оскільки єдиною різницею між JavaScript та TypeScript / Flow є введення тексту.
- Вони виконують реплікацію в декількох вимірах, перевіряючи і TypeScript, і Flow (тобто системи різних типів), і шляхом того, щоб різні люди відтворювали анотацію (вручну) типу, щоб виправити помилки. І вони виконують це у великій кількості баз коду з різних проектів.
- У роботі вимірюється прямий вплив статичного набору тексту на помилки, що виправляються (а не на якусь більш невиразну якість).
- Автори визначають сувору модель того, що вимірювати, і як наперед. Крім того, їх опис неймовірно зрозумілий і дозволяє легко проаналізувати недоліки (це завжди добре, коли дослідницький документ відкриває себе для атак: якщо жодним з атак не вдасться вбити свої аргументи, він вийде ще сильнішим). 3
- Вони виконують належний аналіз потужності, щоб їх розмір вибірки був достатнім, а подальший статистичний аналіз був герметичним.
- Вони надмірно консервативні, щоб виключати заплутані пояснення, і вимірюють лише одну рухому частину. Крім того, вони обмежують свій аналіз помилками, які можна негайно виправити, включивши типи, і виключають все, що може потребувати більш вдосконаленого рефакторингу для приведення тексту. Тож насправді ефект, ймовірно, набагато більший, але, безумовно, не менший, ніж те, про що вони повідомили.
- І, нарешті, вони не знаходять незначного ефекту, але приголомшливої різниці. Незважаючи на їх надмірно консервативну процедуру, навіть у нижньому кінці 95% -го довірчого інтервалу вони виявляють, що є щонайменше 10% помилок, які просто зникнуть з мінімальними перевірками на доданий тип.
Якщо в роботі не є принципового недоліку, якого ще ніхто не виявив, документ напевно показує велику користь статичного набору тексту майже без витрат. 4
Як свідчить історична примітка, дослідження типізації дисциплін у програмуванні розпочали неабиякий початок, оскільки тривалий час докази взагалі не були чіткими. Причиною цього є те, що робити систематичні експерименти для дослідження ефекту статичного проти динамічного набору тексту непросто: систематичний експеримент повинен ізолювати ефект, який ми досліджуємо. І, на жаль, ми не можемо виділити ефект дисципліни набору тексту, оскільки він прив’язаний до мов програмування.
Насправді існували мови програмування, які дозволяли вводити як статичне, так і динамічне введення в різні діалекти (наприклад, VB з Option Strict
On
або Off
, або статично набраний Lisp). Однак вони були не дуже придатними для прямого порівняння, головне, тому що не було існуючих, досить великих баз коду, які дозволяли би безпосередньо порівняти. У кращому випадку ми могли б порівняти їх у "лабораторних налаштуваннях", де випробувані випадковим чином вирішують завдання в статично або динамічно набраному варіанті мови.
На жаль, ці завдання на штучне програмування не моделюють використання реального світу добре. Зокрема, багато з них мають малі обсяги і вирішують чітко визначену проблему, яку можна узагальнити на половині сторінки тексту.
На щастя, це було раніше, тому що TypeScript, Flow та JavaScript справді є одними і тими ж мовами, за винятком статичного набору тексту, і тому, що існує широкий реальний набір даних про код та помилки, з яких можна вибирати.
1 Натхненний цитатою з оригіналу статті.
2 Я не цілком задоволений цим: одна з головних сильних сторін мов, що мають статичний тип, полягає в тому, що нібито непов'язані з типом проблеми можна сформулювати способами, які можна перевірити статично. Це перетворює багато логічних помилок у помилки типу, що різко збільшує швидкість помилок, які можуть бути виявлені статичним набором тексту. Насправді, документ приблизно класифікує помилки, що не пов'язані з типом, і я стверджую, що великий відсоток тих, хто насправді може бути схоплений статичним набором тексту.
3 Я запрошую всіх, особливо прихильників динамічного набору тексту, спробувати знайти неадекватні недоліки в аналізі. Я не думаю, що їх багато (якщо такі є), і я впевнений, що жоден потенційний недолік істотно не змінить результат.
4 Я підозрюю, що фактична вартість статичного набору тексту в реальних масштабних проектах відсутня, оскільки вона стає природною частиною архітектури і може навіть спростити планування. Виправлення помилок статичного типу потребує часу, але набагато менше, ніж помилок, виявлених пізніше. Це було широко досліджено емпірично і було відомо десятиліттями (див., Наприклад, Кодекс повний ).