Как я нашел лучший в мире язык программирования. Часть 2
Первая часть здесь. Продолжение: Семь долбаных лет я ждал язык, который хоть как то ответит части моих желаний. За это время, и в фоновом режиме я препробывал всё. Всё — означает, всю херню общего назначения, и всю херню не совсем общего назначения. Нельзя прочувствовать язык только что-то прочитав про него и написав Hello World. Чтобы понять — надо хоть немного попрограммировать — написать какую нить вещь. И вот все это время, я в минуты отчаянья качал какой-нить «замечательный язык», и пытался что-то написать. Какие-то вещи даже до сих пор крутятся в конторе (или крутились).
ClojureДелал всякую мелочевку, типа REST-сервер лицензий на Clojure, которую после отложил. Вердикт: Clojure — функциональный PHP. Чувства (эмоции) при программировании такие же как при программировании на PHP. Иногда положительные (особенно в начале), ровно как от многих языков с динамической типизацией: хоп-хоп и в продакшен, все красиво и работает, код довольно элегантный, если глаза натренировать на распознавание скобочек. В общем отношение у меня сформировалось такое же как к PHP, если мне нужно нахерачить какую нить страничку на сервере, показывающую что-нибудь коллегам из БД — я возьму PHP, нет ничего лучше решить такую задачу быстро и надежно. Что-то более сложное — кранты. Требует большой головы, какой-то культуры производства, инструментов/процессов и так далее. А далее все хуже и хуже.
Я ни в коем случае не скажу что Clojure — плохо. Rich Hickey (создатель Clojure) — голова, концепции в Clojure (PDS, STM) просто прекрасны, но они мало имеют отношения к языку и могут быть реализованы везде. Ну, а отбросив концепции — это Lisp, и у меня к счастью нет бороды писать на Lisp в 2015 году. Некоторые на Clojure как и на PHP пишут действительно большие, сложные, а на Clojure и восхитительные вещи (один Datomic чего стоит), но опять же, динамическая типизация мне не интересна. Это все для людей с большим модулем памяти в башке. Короче новая модель Фольксваген Жук — можно съездить в клуб, но для Camel Trophy бесполезен.
Scala Scala — к ней я возвращался несколько раз и несколько раз бросал. Я прекрасно понимаю чем Scala привлекает неопытную молодежь (а она в основном и хочет Scala). Привлекает несколькими вещами:
Ореолом элитности: действительно прогресс в Scala делают умнейшие ребята, типа дураки на Scala не пишут, и если ты пишешь на Scala, то типа ты умный. Оп, ребята, программирование — это не учеба в университете, ты не будешь более «умным» программистом, чем сложнее заморочку ты решишь. Сложностью: наверно многие из Scala-фанатов и любителей не осознают, да и не способны сформулировать что их привлекает в сложности. Подсознательно кто-то думает, что сложность == мощь. Типа чем сложнее тем мощнее. Это естественно для обывателя (а я сейчас пишу в основном про класс программистов-обывателей). Тех кто еще толком ничего в своей жизни не напрограммировал (да и показать нечего). Естественная реакция взять какой нить инопланетный автомат с сотней рычагов и кнопок, как в кино — такая штука походу должна замочить всех вокруг, с их примитивным оружием. Беда в том что обывателю не сказали, о том что это типа-оружие сделано было не для того чтобы замочить всех вокруг, а для того чтобы там все как внутри элегантно и красиво двигалось/цеплялось, да по науке. Но вообще направление мысли верное: любому математику известно, что абсолютная сложность задачи не меняется, а вот решение может быть как простым так и сложным, простое решение сложной задачи (в одну строчку) может быть когда мы перекладываем сложность задачи на уже решенные вещи (теоремы). То есть очень сложную задачу можно просто решить переиспользуя сложные решения. В нашем случае компилятор должен брать на себя как можно больше сложности упрощая решение. Компилятор Scala безусловно сложен, но есть проблема — язык в котором эта сложность выражается. Пользоваться таким языком безумно сложно (я сейчас далеко не про тот кейс, когда Scala пользуют как «улучшенную» Java — эта в раздел ореол элитности). Что далеко ходить, последний раз я возвращался к Scala неделю назад. Язык мне надо было выбрать «еще вчера», и я, каюсь, решил что Scala была бы минимальным злом. Наличие ScalaJS и относительно богатые возможность метапрограммирования (читай макросы), дали мне надежду что можно вырулить. К тому же какой то хипстер из EPFL начал за меня решать некоторые проблемы c off-heap data structures, озвученные в первой части статьи.
В общем я глубоко вздохнул и сказал коллеге: «Короче, походу будем мы писать Next Big Thing на Scala. Вот ребята то охереют — я тут годами на Scala гнал, а сейчас такой опаньки: концепция изменилась…». Настроившись на позитив, начал пытаться что-нибудь напрограммировать. Сразу скажу знаний Scala и опыта у меня близко к нулю, что я компенсирую знаниями и опытом по-жизни. Сразу было понятно что мне нужны Type Classes, ну и я давай глядеть в Интернет. Сразу натыкаюсь на некую, да простят меня фанаты Scala, либу shapeless, от Miles Sabin.
Кратенько отступая, этого типа Майлза я не люблю с момента нашей первой и последней встречи. Дело было на EclipseCon 2009 (or so). Стою я нажратый пивом на стенде, тут подходит этот перец, я тут типа Miles Sabin, пишу Eclipse-based IDE для Scala, хочу значит перетереть с программистами DLTK за пацанские вещи (а он в своей Scala IDE JDT нагибал, в общем какой то странной херней маялся, и IDE у него была — гавно. Как я понимаю TypeSafe свою потом написал —, но я ее не глядел). Ну так вот, говорит мне этот Miles типа где тут программисты? Я ему ну я программист, можешь со мной поговорить. А я как бы в те времена выглядил так что на программиста совсем не был похож, скорее на подсобного рабочего. Ну и вот Miles говорит, типа ты мне не нужен, программистов давай. Сука :) Но я не стал ему объяснять что типа я DLTK Project Lead, и более того в курсе того что он никогда свою IDE нормально не сделает потому как не туда полез, но не стал. Отправил его Лехе Панченко, и пошел дальше бухать с пацанами… В общем мир тесен.
Ну вот, нагугливаю я, значит, этот shapeless (а нужны мне type classes). Документации, как и полагается элите у них нет, и в первом абзаце сразу ссылки на четыре научные статьи. Дальше написано как им помочь, куда контрибутить и как скомпилячить. И пипец. Ну давай я дальше гуглить — есть видосы от этого Miles где он про свое чудо рассказывает. По 40–45 минут, про то, что в основе shapeless лежит его волшебное изобретение под названием HList. И это типа главная фишка, которую он мутил последние годы, и она почти заработала, а потом в Scala добавили макросы и он свою фишку (HList) переделал и теперь этот HList более кайфов, чем старый HList. Мутил он ее реально долго, с хЕровой тучей кода, который в основном выглядит вот так:
object IsHCons1 {
type Aux[L[_], FH[_[_]], FT[_[_]], H0[_], T0[_] <: HList] = IsHCons1[L, FH, FT] { type H[t] = H0[t] ; type T[t] = T0[t] }
def apply[L[_], FH[_[_]], FT[_[_]]](implicit tc: IsHCons1[L, FH, FT]): Aux[L, FH, FT, tc.H, tc.T] = tc
implicit def mkIsHCons1[L[_], FH[_[_]], FT[_[_]]]: IsHCons1[L, FH, FT] = macro IsHCons1Macros.mkIsHCons1Impl[L, FH, FT]
} Это вообще чо? Это для кого? Это для людей или нет? Не предлагаете ли вы мне вот такое писать каждый день, да сотнями строк и остаться в здравом уме, или это для илиты, а мы, приземленные практики будем это ваше пользовать?
Что делать дальше, после того как слушатель познал HList он рассказать все три раза не успевает, отсылая к его воркшопам, видосам и курсам, которые мы все можем приобрести за деньги. Я вообще не против приобрести знания за деньги, но:
Чувак убил годы на то, чтобы люди убивали недели и месяцы чтобы сука сослаться на тип, и понять тип значения в рантайме, ну и при желании что-то там намутить на стадии комплияции (типа узнать размер коллекции), причем для того чтобы это сделать, нужно хорошо так вынести себе мозг, и нахерачить код типа того что я привел выше. Я конечно глубоко не вникал, может этот shapeless на который надо убить тучу времени (и который видимо далеко не самая навороченная библиотека Scala мира) делает что то там еще полезное, но у меня нет слов — люди делают про это какие-то толки на конфах, воркшопы, презы на 56 страниц типа Demystifying Shapeless. И все это зачем? Чтобы выковырять тип значения во время компиляции, братан.
Бебать, да я в 95 программировал на Delpi и у меня все это сразу было. Я ничего не знал про Polymorphic typed λ-calculus, да и сейчас ничего не знаю, но вот цимус в том что и без знаний любой школьник на дельфи, напишет такой HList за 10 минут, и тип в рантайме познает, и сошлется на него, и сравнит и хрен знает что еще. И даже не задумается как все это сделать. Если бы в Delph были макросы, и генерики — я уверен в том, что школьники писали бы точно такие же либы как и вся эта элита пишет на Scala, но только на порядки быстрее, чем эти дяди, и даже не задумывались, о том что им нужны structural refinement types и прочая лабуду (правда что-ли нужны?). Жизнь мне это подтвердила, о чем позже. Да, кстати работал бы этот школьный код в продакшене тоже на порядки быстрее — старая школа в Borland умела делать вещи.
В общем резюме по Scala такое — чуваки решили скрыть в инструменте сложность решаемых задач, заменив ее сложностью использования инструмента. Что в результате оказалось сложнее — хер его знает, по мне так сложность программирования на Scala сильно превышает бенефиты от ее использования. По аналогии с машинами — это первая версия Google-мобиля. Провода, вся херня, камеры надо развесить, пропатчить все нахер, ну и иногда можно отпустить руль, но с приборов глаз не спускать. А если что-то сломалось, то пока за день не разберешься чтобы поехать дальше. Ага, и глохнет когда красный шар видит. В топку.
Прощай любимый мир JVM, я не нашел чего искал Короче в JVM-based историях я порылся, любимый мной Fantom меня не устраивал по ряду причин, периодически заглядывал в Ceylon и Kotlin. Все истории с динамической типизацией тоже отметаем (только не советуйте мне core.typed). Опять же от разочарования задумывался глянуть TeaVM, что расширило бы список кандидатов, но не дошел, поскольку кандидатов не видел. Короче все это вещи одного класса — такие Ford Focus языков программирования, ездят в пробках хорошо, но вау не скажешь.
Не найдя ничего в JVM мире я пустился во все тяжкие. Потрогал сука все, что хоть как то на слуху и даже то что совсем не на слуху. Из понравившихся мне малоизвестных — Clay. У него был потенциал, как мне кажется. Достойный язык — такая статически типизированная версия Julia. Создатели язык забросили, как я понял один из авторов сейчас в Apple и имеет какое то отношение к Swift.
Но сегодня написать про это я не успеваю. До следующей части.