Мой опыт
Я работал с обоими, вероятно, около десяти лет с каждым профессионально, всего.
Я анекдотично потратил далеко больше времени, пытаясь заставить статически типизированные языки понять, что я хочу сделать (возможно, недели - возможно, месяцы в целом), чем я потратил на исправление ошибок, вызванных ошибками динамического типа (возможно час или два в год?).
Исследования
Люди очень старались получить доказательства того, что одно или другое лучше с точки зрения продуктивности программистов, но в самом последнем обзоре, который я прочитал, сказано, что нет убедительных доказательств того или другого.
Тоталитарный
Статический анализ типа полезен в некоторых ситуациях. Я не думаю, что это не должно быть встроено в ваш язык. Это должен быть инструмент в вашей интерактивной вычислительной среде, наряду с вашими тестами, вашим REPL, вашими рефакторами, вашими документами, вашим грамотным кодированием и т. Д.
Системы статического типа могут заставить вас думать о полезных вещах. Это особенно верно в таких языках, как Haskell с классами типов и монадами (которые, признаюсь, до сих пор не совсем понятны). Это хорошо, но я считаю, что тоталитарно полагать, что это всегда хорошо. Вы должны подумать об этом, когда это уместно. Язык не должен заставлять вас думать об этом или осознавать его с самого начала развития.
Слишком ограничительный и недостаточно ограничительный
Системы статического типа, которые не являются полными по Тьюрингу, имеют ограниченную выразительность. Зачем использовать это для языка, используя новый специальный предметно-ориентированный язык только для разговоров о типах? Теперь ваш язык устанавливает точный уровень выразительности, к которому у вас есть доступ. Хочу больше? Вам нужно переписать свой код или обновить язык. Хотите меньше? Вам не повезло - используйте другой язык.
Вместо этого, почему бы не использовать базовый динамический язык для описания типов и систем типов, когда вы хотите? Как библиотека. Это более выразительно; более мощный (при желании); более гибкий; и означает меньший базовый язык.
Boilerplate
Статически типизированные языки, кажется, поощряют шаблон или генерацию кода. Я не уверен, если это присуще. Возможно, достаточно мощная система макросов преодолеет это. Я сравниваю состояние макетов для тестирования в Swift с состоянием цели c.
Монолитная
Языки со статической типизацией, кажется, поощряют монолитные приложения - это мнение и наблюдение, которое я не могу подтвердить, но оно кажется верным ... Они или инструмент, с которым они приходят, кажется, поощряют монолитные приложения и мышление.
Напротив, в интерактивных вычислительных средах вы не создаете новое приложение, а вместо этого расширяете систему, чтобы она делала больше. Системы, которые я знаю (машины Lisp, Smalltalk и Unix - их инструменты имеют динамически типизированный интерфейс между ними), используют динамическую типизацию для сборки деталей.
Мы должны создавать крошечные расширения для целого, а не создавать новые целые приложения, поэтому эта монолитная тенденция, если она существует, наносит ущерб.
Скорость
Самые быстрые JIT-компиляторы с динамической трассировкой производят быстрый код, и они все еще довольно молодая технология. Тем не менее - вы также можете сделать это с помощью статически типизированного языка.
Долгосрочный
Я подозреваю, что в долгосрочной перспективе мы получим среды, которые поддерживают мощный статический анализ, где вы сможете объявлять типы и протоколы, а система поможет вам увидеть, удовлетворены ли они, или поможет показать Вы подразумеваемые типы. Но вам не понадобится , чтобы сделать это.