Вы просто не знаете зачем нужны языки с динамической типизацией



Пока некоторые незрелые личности бомбят от языков с динамической типизацией, хотелось бы сказать и показать, что многие разработчики просто не понимают необыкновенной свободы этих языков.


Я, конечно же, я верю в статическую типизацию. Я убежден что она захватит (и уже захватывает) мир. Люди, бросавшие мне в лицо: "нам не нужны все эти ваши типы" с таким же фанатизмом рукоплескали добавлению различных типов в их любимые языки с динамической типизацией (классы в JavaScript, аннотации типов вместе с mypy в python). Мне не нужны извинения за их недальновидность и невежество. Они вели себя радикально лет 10-15 назад и проиграли. То, во что превратилась экосистема их любимых языков — это лучшее наказание, а их поведение обязательно должно быть наказано. Пока питонисты решают на каком питоне писать: 2.7, 3.8 или подождать 4-ку — по сути теперь есть три разных питона. JavaScript-еров справедливо ненавидят подростки освоившие статически типизированный TypeScript — точно с таким же пренебрежением JavaScript'еры смотрели на корпоративных программистов на Java в свое время.


Однако, в языках со статической типизацией существует серьезная проблема. Проблема не в том, что типы надо указывать и соблюдать. Настоящая проблема: отсутствие свободы и принуждение к весьма посредственному дизайну языка. Давайте я приведу несколько примеров.


Диктатура


Java сопротивлялась добавлению "синтаксического сахара" около 10-ти лет (условно где-то 2002-2012). Наконец-то в нее добавляют все то, что должно быть в хорошем языке программирования — даже лень приводить полный перечень, потому что это будут буквально все фичи нормальных языков. Это не было каким-то вынужденным 10-ти летним простоем в дизайне языка, во время которого переписывали компилятор или решали другие объективные проблемы развития. Просто Sun и Oracle предпочитали нанимать юристов, а не разработчиков. Да, они за это поплатились — туда им и дорога, но это не отменяет того факта, что множество программистов было вынуждено писать на убогом языке по милости каких-то мутных управленцев с сомнительной экспертизой.


В C# только что добавили тип данных запись (record type), это заняло всего лишь 9 лет — отсчитывая от релиза другого языка F# 2.0 (2010), в котором уже была очевидна полезность этих типов. Оба языка разрабатывались под одной и той же крышей Microsoft — трудно предположить, что в команде C# не заметили возможностей F#. Просто они решили не торопиться. Возможно года через 3-4 мы получим именованные объединения (tagged union или discriminated union) в C#. Почему так долго? А нет никаких причин — просто дизайнерам языка так захотелось.


Программисты на Scala надменно ухмыляются — у них-то нет этих проблем. Нет проблем, как и нет нормального перечисляемого типа (enum). 14 лет выходили новые релизы этого языка начиная с 2006 года (релиз 2.0) ломая обратную совместимость компилятора на минорных релизах, но во всем этом бардаке не нашлось места перечисляемым типам. Есть enumeratum, но в Dotty одна из новых фич языка — это enum, прямо новое ключевое слово. Существующие до сих пор костыли никуда не годятся настолько, что требуется новое ключевое слово. Если бы только мы не должны были ждать Dotty 3+ лет. Хотя, это ничто по сравнению с 14 годами без enum'ов.


Мой посыл, я думаю, понятен: когда вы пишите на языках со статической типизацией вы отдаете свою профессиональную жизнь на милость диктатуре. Диктатуре Гослинга, Хейлсберга, Одерского, Бреслава. От их настроения в день принятия решения будет зависеть, получите ли вы какую-то фичу в этом году или лет через 10. В языках с динамической типизацией это не так — в них больше свободы, если тебе чего-то не хватает создай это сам и для этого есть все удобства и инструменты. Конечно же будет меньше безопасности. Но ведь не все люди готовы жертвовать свободой ради безопасности.


А что народ?


Раз уж я сравнил главных дизайнеров языков с диктаторами, теперь придется доводить аналогию до конца. Программисты предпочитающие конкретный язык со статической типизацией — это народ. Учитывая, что народ многочислинен и подразумевается, что умён, как так получается, что диктатура настолько успешна?


Случалось ли вам встречать Java-программиста эмоционально утверждающего, что "синтаксический сахар" не нужен, более того — он вреден? "Не надо нам как в C# — это недоязык от мелкомягких". Целые орды высококлассных специалистов объясняющие в книгах и на ресурсах вроде Stackoverflow, как текущее положение абсолютно прекрасно и исчерпывающе достаточно.


Видели ли вы когда-либо в книге уровня "Философия Java" (Брюса Эккеля) раздел хотя бы на пару страниц, в котором обсуждались бы возможные улучшения в языке? Хотя бы одним глазком посмотреть: как может быть или (не дай Бог) как должно быть. Были ли лямбда-функции такой уж инновационной концепцией, что сложно было предположить как это могло бы выглядеть в Java? Только диктатор может предлагать, остальные только соглашаются и доказывают друг другу насколько хороши все принятые решения.


Особенность работы программиста в том, что он создает нечто гибкое, что можно дополнять, масштабировать, применять в различных сценариях, крутить и вертеть как захочется. Software — от слова soft — мягкий, гибкий. Однако вся гибкость исчезает, как только программисты начинают говорить о языках программирования со статической типизацией. Любая новая возможность воспринимается как "противоречащая идеологии языка" или, в крайнем случае, "излишне сложная и избыточная".


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


Никогда вы не увидите такого поведения толпы в сообществах, пишущих на динамически типизируемых языках.


Свобода


Свобода динамически типизированных языков очевидна на примере JavaScript. Этим людям дали скобки () {} и точку . и на этом они построили такое, что в какой-то момент времени JavaScript считался функциональным языком программирования (при живом-то Haskell). Там программисты создали себе все: от классов до прототипов.


Очевидно, что дизайн решений в JavaScript оставляет желать лучшего и едва ли этот опыт можно назвать успешным, но хотя бы у программистов была свобода. Это другой менталитет. Здесь нет авторитетов и диктаторов. Если чего-то не хватает, то это можно разработать. Никто не будет сидеть сложа руки 14 лет, пока Одерский прдпочитает заниматься алгебраическими типами данных вместо простых перечисляемых типов. Никто не будет ждать, когда команда C# наиграется с переписыванием компилятора и интеграцией его в свою посредственную IDE и наконец-то обратит внимание на то, что языку нужны современные фичи.


Меня же на все эти мысли натолкнул мой опыт с python. Мне понадобился новый тип — именованное объединение (tagged union или discriminated union), который проверял бы типы своих кейсов во время исполнения кода. Зачем понадобился — я, возможно, расскажу в будущей статье. Я вспомнил, что класс данных (record type) добавлен в стандартную библиотеку питона через декоратор @dataclass — это не дополнительная возможность языка, и не ключевое слово, класс данных реализован на стандартных возможностях питона в виде библиотеки. Без особых проблем я смог реализовать @tagged_union. Вся реализация занимает 120 строк кода и один вечер. Код на КДПВ как раз использует мой микромодуль.


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