Популярность TypeScript в последнее время резко возросла. Мне нравится TypeScript, и мне нравятся статические типы. У него есть несколько замечательных функций. Он структурный, а не номинальный, что означает, что он работает в основном как автоматическая утиная печать, а не проверка типа на основе имени или личности. Это хорошо подходит для динамических языков, таких как JavaScript.

Что мне не нравится, так это то, что многие люди думают, что TypeScript решает проблему, которую он на самом деле не решает - по крайней мере, в незначительной степени.

Известная маркетинговая риторика гласит, что «крупномасштабные веб-приложения сложно без статических типов». Это правда, что статические типы используются в некоторых действительно отличных инструментах разработчика, таких как переход к определению и автоматический рефакторинг, и эти инструменты, по ощущениям, делают нас более продуктивными. (И может действительно сделать нас более продуктивными, нам нужно больше изучить реальные преимущества статических типов).

Но многие люди считают, что статические типы помогают уменьшить количество ошибок, которые попадают в приложение. Несомненно, что статические типы улавливают значительный подкласс ошибок, но правда ли, что статические типы уменьшают общую плотность ошибок?

Статические типы дают вам ложное чувство безопасности

В нескольких недавних исследованиях использовались обширные данные, доступные на GitHub, чтобы проверить плотность ошибок, и результаты… ну… на самом деле не такие уж и горячие:

«Хотя это и неубедительно, но отсутствие в диаграммах доказательств того, что более продвинутые языки шрифтов спасут нас от написания ошибок, очень тревожит». - Даниэль Лебреро, «Нарушенное обещание статической печати»

Статические типы показали себя немного лучше в более формальном исследовании: «Крупномасштабное исследование языков программирования и качества кода в Github» от Байшахи Рэя, Дэрила Поснетта, Владимира Филькова, Премкумара Т. Деванбу, из Калифорнийского университета в Дэвисе:

«Данные показывают, что функциональные языки лучше процедурных; это говорит о том, что строгий набор лучше, чем слабый; что статическая типизация лучше динамической; и что использование управляемой памяти лучше, чем неуправляемой ».

Теперь это больше похоже на это! Кроме:

«Хотя эти отношения статистически значимы, эффекты весьма незначительны» [выделение добавлено].

Фактически, мне не известны какие-либо эмпирические доказательства того, что статические типы сильно влияют на плотность ошибок.

Поэтому, несмотря на то, что они предоставляют отличные инструменты для разработчиков, статические типы на самом деле не помогают значительно снизить общую плотность ошибок. Почему?

Правильность типа не гарантирует правильность программы.

Если вы не тестировали код, вы действительно не знаете, работает он или нет. Конечно, вы можете знать, была ли определена переменная, или же функция передает массив вместо объекта, но как выясняется:

  • Есть много других способов выразить ошибку в ваших программах, проверка типов не обнаружит, и ...
  • Множество других способов отловить ошибки, связанные с типом.

Так что же на самом деле снижает плотность ошибок?

Разработка через тестирование (TDD). В частности, методология «сначала тестирование».

TDD приходит на помощь.

Было проведено несколько хороших исследований эффектов TDD. Есть несколько хороших метаисследований и знаменитое исследование от Microsoft, IBM и Springer. Исследование Springer показало снижение количества ошибок на 40–90% по сравнению с аналогичными проектами, в которых не использовалась практика сначала тестирование. Многие другие исследования показали аналогичные результаты, сравнивая сначала тестирование и тестирование после, а тесты не проводились вообще, с впечатляющим сокращением количества ошибок в случае сначала тестирование (что значительно лучше, чем после тестирования), в основном попадая в диапазон от 40% до 80%.

Другими словами, TDD может эффективно снизить количество ошибок при доставке вдвое, и есть множество доказательств, подтверждающих это утверждение.

Стоит ли попробовать TypeScript?

Вы по-прежнему можете использовать статические типы, но если вы собираетесь использовать статические типы, сделайте это из-за тех полезных преимуществ, которые они действительно предоставляют, а не из-за их предполагаемых способностей к обнаружению ошибок .

Я был настолько впечатлен TypeScript, что он в первую очередь повлиял на rtype: обозначение типов, разработанное для дополнения стандартного JavaScript. Почему я просто не использовал TypeScript?

Я беспокоюсь о создании большой базы кода с использованием TypeScript, только для того, чтобы спецификация ECMAScript вводила конфликтующие ключевые слова и функции типа, такие как `interface` и ` Implements`.

Преимущество использования компилятора TypeScript заключается в том, что даже если это произойдет, вы можете просто скомпилировать различия. Недостатком является то, что вы больше не пишете стандартный JavaScript. Я предполагаю, что TypeScript не сможет сохранить свои позиции как надмножество JavaScript. Я считаю, что со временем они неизбежно разойдутся.

И это меня больше всего беспокоит, потому что я преподаю JavaScript и хочу, чтобы то, что я преподаю, можно было применить к очень широкому кругу разработчиков, использующих различные фреймворки и инструменты разработчика.

Вероятно, у вас нет этого беспокойства, но ваша кодовая база по-прежнему должна быть простой, чтобы другие разработчики могли ее изучать и вносить свой вклад, и вы, как личность, должны иметь возможность адаптироваться, если присоединитесь к команде, которая не использует TypeScript.

Прямо сейчас, хотя TypeScript быстро растет, у него крошечная пользовательская база по сравнению со всем языком JavaScript в целом или даже jQuery, но он движется по впечатляющей траектории. Он уже со значительным отрывом доминирует среди альтернатив компиляции в JavaScript.

Некоторые инструменты стоят компромиссов. Сейчас это не подходит мне, но, может быть, тебе это понравится. Если вы еще не сталкивались с Code IDE от Microsoft в сочетании с TypeScript, вам стоит надеть игру. Вы можете влюбиться.

Заключение

Что касается уменьшения количества ошибок, я думаю, будет справедливо сказать:

Статические типы переоценены.

Но когда дело доходит до других функций, статические типы по-прежнему хороши, и, возможно, их стоит использовать.

Нижняя линия:

Вы хотите уменьшить количество ошибок? Используйте TDD. Вам нужны полезные инструменты анализа кода? Используйте статические типы.

Хотите посидеть со мной, пока я создаю настоящие приложения с использованием TDD?

Изучите JavaScript с Эриком Эллиоттом

Эрик Эллиотт - автор книг Программирование приложений JavaScript (О’Рейли) и Изучение JavaScript с Эриком Эллиоттом. Он участвовал в разработке программного обеспечения для Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC и ведущие музыканты, включая Usher, Frank Ocean, Metallica и многие другие.

Он проводит большую часть времени в районе залива Сан-Франциско с самой красивой женщиной в мире.