Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В прошлой части расследования Роман Тимушев посоветовал связаться с Владом, что я и сделал. Влад уточнил, что меня интересует, делайны и согласился написать несколько абзацев. На следующее утро я увидел уведомление в Facebook. Это Влад нашел нового свидетеля — Александра Подхалюзина. С 2008 по 2017 он работал как тимлид над Scala plugin в IDEA и лично видел все развитие Scala-движения, но, в основном, не российскую часть.
В голове «щелкнуло» — планы меняются, это новая нить в расследовании. Обозначили время и записали часовое интервью с Александром. Информации столько, что вместить его куда либо кроме отдельной части не было вариантов. Поэтому, предупреждаю — впереди много текста.
В этой части говорим с Александром Подхалюзиным и Михаилом Муцянко. Вне программы — комментарий Ильи Сергея. Scala plugin, первые Scala-мероприятия в России, уход в Kotlin, Native на обоих языках, закат Eclipse и многое другое под катом.
Александр Подхалюзин с 2008 по 2017 разрабатывал в JetBrains Scala plugin в IDEA как тимлид. Позже ушел в Kotlin Tooling сначала для Kotlin/Native, затем и для всего Kotlin в целом.
Александр: Задача крупная, все путается за давностью лет. Кстати, движение началось не в 2010, а на три года раньше. В 2007 я как раз пришел работать в JetBrains и мне повезло с MPS… Ты знаешь, что такое MPS?
Вадим: Я слышал, что это декларативный и визуальный язык.
Александр: MPS опередило время. Это Meta Programming System — генеративное программирование cразу с IDE. Я устраивался в компанию на MPS, но там уже нашли человека. Поэтому мне повезло — меня отправили писать Scala plugin.
В JetBrains начали писать плагин, но бросили, потому что был Groovy. Он был популярен и требовал поддержки. Все, кто занимался Scala plugin, пошли работать над плагином Groovy. Scala никто не занимался и мне досталось такое наследство.
В компанию я пришел в начале 2008 года. Я ничего не умел, начал копать парсер, фиксил одну багу, вторую, третью — это продолжалось бесконечно долго. В итоге сел и переписал его. Так потихоньку поехали разрабатывать.
До меня над плагином работал Илья Сергей. Я его застал и работал с ним над плагином. Забавно, что я был математиком, а Илья — программистом. Но он хотел быть математиком, а я — программистом. Мне понравилось программировать, я готов был этим заниматься и не понимал, почему Илье не нравится. А он не понимал меня. В итоге жизнь все расставила по местам.
Илья ушел из JetBrains и занимается Computer Science в Испании, чуть ли не профессором. Он недавно приезжал, рассказывал, как искать автоматические гонки — это какая-то наука. Еще на каком-то соревновании сел и написал на Scala 10 тысяч строк. Сказал, что все супер, все работает. Он еще ездил на первый Scala Days, кажется в 2009 году.
Посмотрев биографию Ильи, я посчитал, что важно уточнить детали у первоисточника.
Александр: Я на Scala Days начал ездить с 2011 года. Вот уже три года мы пишем второй фронтенд-компилятор Scala, по сути. Это занимает годы, это нормально. У нас все работало медленно и плохо, но при этом было хоть что-то. С точки зрения редакторов ничего лучше все равно не было. Я не помню, начали ли Eclipse поддерживать на тот момент. Да, кажется его поддерживали параллельно.
Вадим: Я разговаривал с Романом Тимушевым и он мне рассказывал про 13 год, как начал писать и проводить митапы в Москве. По его версии, тогда все пользовались Eclipse. Это было вполне сносно, он официально поддерживался.
Александр: Да, так и было. В 2011 году Eclipse был совсем плох, а в 2013 достиг скорости как у нас в 2011. В отличие от Eclipse, мы пишем свой фронтенд, поэтому подсветка ошибок отличалась от компилятора. Это неудобно и это ключевая проблема. Какие-то ошибки не подсвечиваются, а в компиляторе наоборот. Eclipse же использует код компилятора.
Использование кода компилятора — это плохая затея, потому что все будет работать медленно. В Kotlin аналогично при использовании кода компилятора. Ситуация не настолько плоха как была в Scala — немножко думали про IDE, но все равно непросто обеспечить хороший перформанс с точки зрения IDE.
В 2011 году Scalathon (фотки) проводили в Филадельфии. Это первая конференция на которую нас позвали, но было странно, что мы туда поехали. Они обратились в JetBrains, не хотим ли мы посетить мероприятие. До этого никуда не звали со Scala, а когда мы что-то начали делать — заметили. Пользователей, как и Scala-программистов, было с гулькин нос — около 100 человек на всей конференции. На Scalathon я и познакомился с Bill Venners.
Вадим: Имя знакомо, но я не помню, кто это.
Александр: Автор двух вещей: Scalatest и главной книги «Programming in Scala». Это книга, которая написана вместе с Martin Odersky — наша библия!
Вадим: Я не читал.
Александр: Неважно. У меня дома лежит эта книга с автографами Bill Venners и Martin Odersky. Они мне ее подарили на одном из Scala Days в 12 или 13 году. На званом ужине для всех участников награждали людей, которые сделали вклад в коммьюнити. Неожиданно позвали меня и я получил книгу за вклад.
Scala Days стали посещать тоже с 2011 года. Сначала они проходили один раз в год в Европе или в Америке, а позже два раза. В прошлом году я посетил одну конференцию, а на вторую не поехал. На прошлогоднюю я подал доклад о сравнении Kotlin/Native и Scala Native. Никто в Kotlin-команде не верил, что доклад примут, но его взяли. Возможно, из уважения или по другим причинам. На доклад пришло мало слушателей. У Scala-программистов не вызывает интереса все, что содержит слово «Kotlin». Так было и есть до сих пор.
Вадим: Я думаю, что и слово «Native» сыграло роль.
Александр: Нет, на Scala Days все доклады о Scala Native всегда собирают полные залы, например, выступление Дениса Шабалина. Но при этом, технология далека от продакшн. Ей не суждено туда попасть еще 10 лет, как минимум.
Вадим: Почему ты так думаешь? Я удивился, но есть Richard Whaling, который пишет книгу о Scala Native — материала уже много. Он ходит на подкасты и рассказывает как использует это в продакшн. У него и сфера такая, где много данных. Он очень рад Native в этих условиях.
Александр: Посмотри мой доклад о сравнении Scala Native и Kotlin/Native, в котором я объясняю свою точку зрения. На момент выступления над Scala Native трудился один человек. Поэтому ни о каком продукте речи быть не может. Если говорить про одного человека, который где-то применил технологию — может быть. Просто это не мейнстрим, будет мало пользователей.
У Kotlin/Native есть конкретное применение — шаринг кода между iOS и Android. Как раз это создает определенный интерес. У Scala Native этого нет и цепляться не за что. Scala Native можно использовать для вычислений, когда приходится комбинировать Scala-код и быстрые вычисления типа Tensorflow. Но Scala Native не означает, что между Scala и Native можно спокойно вызывать друг друга или шарить общий код.
В Kotlin мы паримся над тем, чтобы писать и компилировать один и тот же код. Это адский труд в смысле дизайна, что используешь не POSIX, а какую-то прослоечную библиотеку, которая одинаково работает и в JVM и без нее. Если у тебя такой библиотеки нет — все, кранты. Код будет разный в этом месте, а если он разный, то как его поддерживать? Как деплоить библиотеки, в которых разные эндпоинты — их же надо скомпилировать, деплоить, тут еще билд-система, зависимости? Если копать, то вопросов — бездна. Ответить на все не сможет один человек, который разрабатывает Scala Native. Применение — отдельная история, и об этом можно посмотреть мой доклад.
Вадим: Хорошо, вернемся обратно. В 2011 ты съездил на Scala Days, а до 2016 года ты был еще со Scala plugin?
Александр: До 2017.
Вадим: Потом тебя дернуло в Kotlin. Что произошло?
Александр: C какой-то точки зрения, я не сделал все, что мог. Можно было продолжать разрабатывать Scala plugin — много фишек, есть что доделывать. Но, с точки зрения бизнеса, он успешен как проект. 80% Scala-программистов используют IntelliJ IDEA. Как много ты знаешь продуктов, которые захватили 80% рынка? Таких мало.
Что делать дальше? Хочется новые цели, новые горизонты, а в рамках Scala plugin это было невозможно. В JetBrains разрабатывается собственный язык программирования и отношение к Scala скептическое. Найти местечко под Scala в компании невозможно, поэтому либо я ухожу, либо работаю здесь и дальше. В энтерпрайз какой-нибудь, или что-то еще. Пришлось принять трудное решение.
В какой-то степени я готовился. Первое — я понял, что если ухожу из команды, то вместо меня будет Коля Тропин. Он сейчас возглавляет команду. Я готовился, и его своеобразно подготовил, понимал, что он может встать вместо меня. Второе — потихоньку раздавал все подсистемы, отказывался от них. Мне уже не надо было их программировать.
Апофеозом всего этого стала травма руки, операция и 2 месяца больничного. После выхода я пошел к гендиректору Максиму Шафирову. Пришел и сказал: «Дай мне что- нибудь другое». Был такой триггер, что-то неосознанно готовилось, чтобы можно было это сделать, а эти два месяца позволили решиться. И Макс предложил. Я говорил «что угодно, только не Kotlin». Понятно, я же со Scala-мира, а Scala-мир ненавидит Kotlin.
Вадим: Я не то чтобы ненавижу, просто неприятно, что такой продукт появился. Это «огрызок» Scala. При этом маркетинг активный, захватывается рынок — те люди, кто могли бы перейти на светлую сторону Scala.
С другой стороны, это же неплохо? Если представить разрыв в знаниях, которые нужно освоить, чтобы эффективно писать на Scala или Haskell, то для Java-разработчика он гигантский. Здесь Kotlin — перевалочный пункт, до которого можно довольно безопасно дойти, отсидеться и идти дальше.
Александр: Это не совсем так. Когда не было Kotlin, в Scala приходили люди, которых не устраивала Java — не хватает чего-то, много boilerplate. Scala занимала место того, что называется «Better Java». Kotlin целится исключительно в эту нишу.
С Kotlin случился Android и все вытекающие, а теперь — мультиплатформенность и все. Kotlin не зациклился на одном Android, на одной нише, и пошел дальше.
Вадим: Мне кажется это хорошо — Oracle расшевелился. Сейчас хоть какие-то нормальные JEPы пошли, чтобы Java развивалась.
Александр: Я думаю, что причина не в Kotlin — это нормальное следствие. За 2 года до объявления Google о Kotlin, его было ничтожно мало. Когда я решил переходить, Макс Шафиров дал мне список для выбора. Хотя я говорил «только не Kotlin», вариант поддержки Kotlin/Native в IDEA был в этом списке. В итоге, из всего списка я решил попробовать перейти в Kotlin. На следующий день после того, как я взял на себя обязанность за Kotlin/Native, Андрей Бреслав сказал, что на следующем Google I/O объявят, что Kotlin официально поддерживаемый язык на Android.
Тут мысль: «Опаньки». Я думал, что позанимаюсь чем-то для условно маргинального языка. Было понятно, что нишу «Better Java» трудно завоевать. С выходом Java 8 с лямбдами, это стало еще труднее. У Scala все нормально с этим, она сильна не лямбдами и не тем, что лучше Java. Она случайна — случайные люди пришли в Scala с пониманием, что им нужна лучшая Java.
После Java 8 поток этих людей замедлился. В Scala и Kotlin ради этого они не пойдут — у них лямбды появились. Этого достаточно для начала, а лучшее уже не интересует. Я присел, задумался и осознал, что масштаб теперь другой.
В голове я переходил в команду масштабом не сильно больше, чем в Scala plugin. На тот момент там было 100 тысяч пользователей, а у Kotlin — 40 тысяч. Совершенно другой масштаб. Я понял, что это прикольно, что мне не сказали заранее. Решил пойти в Kotlin потому, что было интересно попробовать, а не ради грандиозных и масштабных целей.
В целом, на Scala приятнее программировать. Когда после 9 лет программирования на Scala начинаешь писать на Kotlin, оказываешься как без рук. В этом есть какая-то грусть.
Что бы я делал, если бы я был CTO? Для какой-то простой задачи на Kotlin мне было бы проще собрать команду. Она была бы дешевле или эффективней. Я мог бы набрать Scala-программистов дешевле, но получил бы результат хуже, потому что они наворотят что-то страшное в этой Scala. Даже если на рынке труда сложно, я начну набирать Java-программистов — Kotlin их обучить будет гораздо проще. Это с точки зрения начала нового проекта, если там нет каких-то технологических серьезных вещей.
Для банковской индустрии, например, есть причины, по которым нужно использовать Scala. Kotlin их не сможет решить. То же метапрограммирование в Scala гораздо удобнее.
Если крепко задуматься на эту тему, на Scala можно создать крутые инфраструктурные вещи, а в Kotlin невозможно. Там те же самые annotation-процессоры. Когда-нибудь будет возможно, но лишь в перспективе нескольких лет.
Вадим: Почему считаешь, что для банков хороша Scala?
Александр: Много boilerplate, который не связан с языком программирования. Это система, где есть объекты типа пользователя. Она требует много дупликации, начиная от базы данных и заканчивая всем. Чтобы эффективно изменять что-то, нужна хорошая поддержка метапрограммирования. Она нужна везде, но втыкать ее нужно с осторожностью, иначе можно влипнуть.
В 11 году меня позвали в Академический университет. Мне было лень вести весь курс, и я договорился со Светой Исаковой, которая сейчас developer-адвокат Kotlin. Мы договорились вести курс пополам, но он был о Scala. Она хотела, наверно, узнать про Scala подробнее.
Вадим: Универ был топовый на тот момент?
Александр: Да, с магистратурой на 5-6 курсе. Первые годы конкурс был небольшой. Но конкуренция за место повысилась, когда пришли JetBrains, Яндекс и Транзас со спонсорством, приглашением на стажировки и целью выращивать кадры для себя.
Получилось классно: частные деньги и частная инициатива под государственным прикрытием и прикрытием Алферова. Он дал полный карт-бланш — делайте как хочется! Получилось классно, потому что курсы релевантные. Они набрали людей, которые были на острие, понимали, что происходит в индустрии прямо сейчас, а не 10 лет назад непонятно где. Если говорить про обычные университеты, аля «матмех/мехмат», то там разве что Паскаль не проходят — к реальной жизни это не имеет никакого отношения.
Этим и был силен Академический университет. Люди понимали, что придя туда, они очень быстро влетят в индустрию. Выпускников университета с удовольствием набирали в Яндекс и JetBrains. Это хорошая карьерная ступенька, и конкурс был 10 студентов на место. Я преподавал там 5 лет. Света на второй год не стала со мной рассказывать о Scala, а я призвал разных помощников, в частности Свету для Kotlin. В итоге мы переименовались в JVM-languages.
В какой то момент мне досталась поддержка Clojure, и я немного разобрался в этом языке. По отзывам студентов, они не понимали, что в курсе делает Clojure, что это за хрень несусветная. Рассказывают про нормальные языки — Scala и Kotlin, и, внезапно, невнятный Clojure. Просто я не был экспертом. Вот такая история была.
Александр: Потом в Питере появились ивенты типа Scala Days. Прошел первый ScalaDev, а ко второму мероприятию организаторы оригинального Scala Days связались с питерскими и попросили переименоваться.
Вадим: Это какой год?
Александр: Да все там же — 11-13. Ивент делали ребята из питерского аутсорсера e-legion. Кажется, они писали приложение Райффайзенбанк. Они даже писали мобильное приложение на Scala, но сейчас так никто уже не пишет — люди в своем уме.
Вадим: Один из гостей подкаста — Матвей Мальков — рассказывал о Scala и Android два года назад. Говорил, что у них все хорошо, и они этим пользуются. Основной выигрыш у них, что и бэкенд на Scala, и приложения.
Недавно написал ему с запросом выступить на конференции, потому что про мобилки никого не найдешь. Оказалось, что он ушел из компании и последнее, что сделал — настроил на CI сборку модуля Kotlin из того проекта на Scala, чтобы ребята постепенно на него перекатывались.
Александр: Еще два года назад про Kotlin ничего не было понятно. Теоретически, Google мог взять и Scala, но не взял.
Мы выступали на первых Scala Days и даже собирали людей. Точнее не на первом, а на втором, который проводили в JetBrains. Тогда выступала Света Исакова с интро в Kotlin.
Это было забавно — все Scala-разработчики воспринимали Kotlin как врага номер один. Зал отреагировал очень негативно, закидал вопросами: «Почему это не делается, почему это не так, почему это не то?» Было жутко, какое-то хейтерство.
После Светы я был вторым человеком, который рассказал что-то о Kotlin на Scala-конференции — о Kotlin/Native. Мой опыт показал, что это бессмысленно. Я не ради доклада, мне было интересно посмотреть Scala Native. Как он устроен внутри, программы позапускать, чему-то порадоваться. Даже на тот момент я был рад тому, что размер бинарника у Scala Native был меньше, чем у Kotlin. Я думаю, что сейчас у Kotlin/Native меньше, потому что 10 человек работает над этим.
Вадим: Ох, ну вы так Дениса Шабалина точно задушите.
Александр: Это невозможно, это очень сложная технология. У нас 10 человек, и этого мало. Причем 10 крутых людей, прямо очень крутых, таких попробуй еще собери. Денис сам по себе крутой, но что он может один?
Довольно интересна история о коммьюнити, как и вся история Scala. Много людей стремилось создать какой-нибудь фреймворк, скорее всего, никому не нужный, чтобы распиариться и бросить. Образовалось много своеобразных звезд, а некоторым помогал еще и EPFL. Одно из требований — дипломная работа от аспиранто. Например, Scalameta — работа Жени Бурмако. В процессе работы у аспирантов повышается цена как программиста, и после окончания они находят крутую работу. Первую работу с зарплатой больше, чем у людей, которые работают 10 лет. Потому что они известные, они докладывались на куче конференций и раскрутились.
Вот еще что. Смотришь, в Kotlin: здесь собираемся сделать это, здесь то, и в Scala абсолютно также. Здесь Tasty, в Kotlin backend IR. Но, так как в Scala все драйвит сообщество, все в полном хаосе. Нет никакого централизованного дизайна. Что получится, то получится. Человек захотел что-то напедалить, получилось. Мартину понравилось, одобрение пошло в массы. А в Kotlin все более четко и профессионально, вот что значит индустрия.
Александр: В 13 году мы ездили на конференцию. Все в компиляторе программировали на Eclipse. Мы стояли и к нам подходили люди, которые пользовались IDEA. Они были довольны, благодарили. У нас 10% рынка, остальные на Eclipse. Все компиляторщики на нем сидят. Они долго обходили нас стороной, вдруг мы их убедим пользоваться. Но в какой-то момент произошел сдвиг.
В 11 или 12 году у нас появился контрибьютор Jason Zaugg. В Open Source мире это не странно, но редко появляются люди, которые инвестируют много времени и много кодят. Джейсон пришел, много наконтрибьютил, а сам работал в каком-то банке. Мы даже дали ему права на коммиты. Ему даже не надо было показывать ревью на публикацию. Просто сидели, кодили, вместе обсуждали какие-то вещи. На основе нашего фронтэнда он разобрался, как работает Scala. Все закончилось тем, что Джейсон устроился работать в Scala-компилятор. Грустно, что мы его не устроили к себе. Мне кажется, это неправильная стратегия. Если на тебя человек бесплатно работает — его надо устраивать к себе, иначе он уйдет в Scala-компилятор. Больше такого не было.
Джейсон прекрасный человек и классный контрибьютор. Он был фанатом IDEA. Дело в том, что Scala plugin вис на компиляторном коде. Код сложный — dependency-injection (DI), которой, по сути, cake-паттерн. Когда открываешь любой файл, нужно проанализировать весь компилятор. За счет DI в контексте есть ВСЕ, а там все с type-inference, и нужно выводить тип везде — все переплетено. Анализ одного файла занимал 5 минут. Даже в настройке компилятора как проекта шел еще bootstrap. Он же должен зависеть сам на себя, это называется bootstrap. Такие проекты было трудно настроить.
Мы с Джейсоном потратили много времени на адаптацию. Чтобы можно было делать bootstrap-проекты, программировать в компиляторе, чтобы в этих сложных файлах хотя бы можно было набирать код. Сначала все было красное, и я потратил кучу времени, чтобы перевести все в зеленое. Мы даже тест сделали, который проверял, что наш фронтенд на компиляторе зеленый или содержит мало ошибок. И, соответственно, команда компилятора перешла целиком на IDEA.
Вадим Челышов: В этот момент и начался отток с Eclipse?
Александр: Для оттока есть несколько причин. Первая — IDEA выпустила коммьюнити-версию. Это значит, что можно поставить Scala-плагин на бесплатную версию пользователя. Мы с самого начала были Open Source и когда начинали, он был проприетарный, с открытыми сорцами. Но устанавливался он на платную IDE. Для этого и писали Eclipse поддержку, потому что нужен был стандартный инструмент, который можно использовать бесплатно. Поэтому мы тоже стали бесплатными.
Вторая — Eclipse как платформа начал умирать еще в 14 году. Он не умер, это смешно говорить, но финансирование резко оборвалось. Eclipse Foundation стал собирать меньше денег и непонятно, как развивать платформу в таких условиях.
Третья причина — у них не получалось сделать быструю IDE. Presentation compiler работал медленно, а если говорить про какой то функционал — это вообще трындец, рефакторинг сделать крайне трудно. В компиляторе, с точки зрения оптимизации, деревья строятся однонаправленные, нельзя взять родителя. Чтобы найти родительский узел, надо сверху взять файлик, пойти в них и посмотреть — жуткая возня.
Четвертая причина — они работают с отображением в компиляторе. Это дерево, которое получается после дешугаризации. Редактор написан во front statement, а в presentation compiler вообще непонятно, что за код. Непонятно как с этим работать и организовать рефакторинги. Как заэкстрактить этот front statement, а не всю эту безумную хрень? Соответственно, фичи появлялись медленно.
При этом наш фронтенд был убогий и плохо работал. Но, чтобы он был хотя бы таким, пришлось делать жуткие вещи. Когда-то метод for
Сейчас в IDEA написано много конвертеров языков. Они странные, но разные, и когда все это началось уже никто не помнит. В 2009 году я ездил на конференцию и там меня стрельнуло — почему бы не сделать конверсию из Java в Scala? Мы обсуждали, что устанешь точки с запятой убирать и разворачивать типы — надо же как-то переезжать. Я сел и за вечер написал тысячу строк — простой конвертер одного языка в другой.
Но я пошел дальше и придумал как сделать так, чтобы легко найти эту фичу. Когда я копирую в Java-код, то ожидаю, что сейчас вставлю и буду убирать точки с запятой. Это мой любимый случай, когда ты делаешь фичу, которая идеальна по discoverability. Пока она тебе не нужна — ты о ней не знаешь. Как только она тебе понадобилась — сразу ее получаешь. Это типа Apple-stylе — просто и понятно. Соответственно, с тех времен у JetBrains было написано много конвертеров, и рекламная фича, что они на вставке предлагаются. Но да, это придумал я, это моя гордость.
К записи подключается Михаил Муцянко — один из текущих разработчиков Scala plugin в JetBrains. В этом выпуске подкаста Михаил и его коллега Андрей Козлов обсуждали плагин подробнее.
Александр: Я тут травлю байки про Scala. Миша, расскажи, как ты появился?
Михаил: Изначально я появился в Kotlin. Андрей Бреслав делал одну из первых стажировок — курсовик. Я попал на проект генерации котлиновских DSL по байткоду андроидовской UI-библиотеки. Она сейчас называется anko. Потом я искал какие-нибудь темы для диплома, и он меня направил к Саше. В качестве диплома я делал интерпретатор деревьев для Scalameta.
Александр: Точно, эта та тема, которая Мише досталась в виде диплома — поддержка мета-программирования. Миша долго этим и занимался. Что-то мы сделали в итоге?
Михаил: Да, оно работало. Правда потом Scalameta задепрекейтили. В Scala 3 будет что-то похожее, но с более стандартизированным API.
Александр: Про Dotty я уже ничего совсем не знаю.
Вадим: Я только сегодня видел то, что Miles Sabin пошарил свой кусочек кода, где он shapeless мигрирует на Dotty c новыми макросами, и вроде как получается. Typeable мигрировал.
Михаил: Да, в частности, он один из тех людей, кто раздает указания как нужно делать typechecker в Scala, чтобы Shapeless работал из коробки, без костылей. По сути, забандлят shapeless в компилятор.
Александр: Да ну! Ты шутишь? Скажи еще и Scalaz забандлят?
Михаил: Ну, как-то не понятно, кто вообще сейчас Scalaz пишет. За ним же не стоит Майлз.
Вадим: Сейчас все сообщество присматривает за Dotty. Майлз смотрит за shapeless. Вот уже который раз эти имплиситы поменяли, вкупе с обсуждением, как надо делать тайп-классы от Luka Jacobowitz.
Александр: Про сообщество. В начале 17 года Scala Center решили собрать инфлюенсеров на коммьюнити для рабочей группы. На JetBrains всегда смотрели издалека и осторожно. Не дай бог мы заставим программировать на IntelliJ IDEA — опасно. Когда стало трудно отрицать, что программировать все равно придется на IDEA, нас приняли. Пригласили на какое-то обсуждение, но я тогда травмировал руку и не пришел. Потом ушел из Scala и так ни разу и не появился в рабочей группе.
Еще меня всегда забавляло, что народ говорил: «Зачем нам документировать детали компилятора, все равно не существует второго компилятора?» Это было забавно, потому что Scala plugin всегда был тем самым вторым альтернативным компилятором. Был еще конечно Typelevel, но это форк.
На нас сильно влияло развитие Scala. Когда Jason Zaugg появился в компиляторе, это было круто. Он начал нам сообщать: «Мы такое сделали, поддержите нас». Появилась коммуникация. Когда компиляторщики смотрят свысока и не пользуются — они нам ничего не рассказывают. До Джейсона так и было.
Михаил: Сейчас я периодически попинываю Guillaume Martres, который пилит Tasty, и Fengyun Liu — он пилит макросы.
Вадим: Александр, спасибо большое, давай подытожим. Я вчера говорил с человеком. Он рассказывал, что в Scala ему нравился единый концепт имплисита, на который навешивались разные фичи. Сейчас в Dotty пришли к тем же явным extension-методам, явно все usecase имплиситов задекларировали точными словами. Подсмотрели у Kotlin и Swift, наверное. Как ты к этому относишься? И вообще к Scala 3?
Александр: В 2018 был последний Scala Days, который я посетил. На нем Martin Odersky рассказывал о том, что у Scala столько-то языковых концепций, у Kotlin в три раза больше, у C# еще больше. Но при этом, возможности Scala обширнее.
Мы думали что это клево, но это не так. Я впечатлился, понял, что Мартин понимает, что надо шевелиться. Единственное, что беспокоит, что Scala должна стать своеобразно нишевым языком. Безграничные возможности языка и создают эту самую нишу. Это и DSL, которую она умеет делать, и все это круто. Гоняться с Kotlin за лучшую Java уже тяжело, и с каждым годом тяжелее. Главное не потерять свою нишевость. Если они эту всю функциональность добавят и не потеряют нишевость — это будет круто. Но если Miles всем этим заправляет, то может и получится. Да, Миша?
В голове «щелкнуло» — планы меняются, это новая нить в расследовании. Обозначили время и записали часовое интервью с Александром. Информации столько, что вместить его куда либо кроме отдельной части не было вариантов. Поэтому, предупреждаю — впереди много текста.
В этой части говорим с Александром Подхалюзиным и Михаилом Муцянко. Вне программы — комментарий Ильи Сергея. Scala plugin, первые Scala-мероприятия в России, уход в Kotlin, Native на обоих языках, закат Eclipse и многое другое под катом.
Как Александр попал в Scala, ушел в Kotlin и преподавание
Александр Подхалюзин с 2008 по 2017 разрабатывал в JetBrains Scala plugin в IDEA как тимлид. Позже ушел в Kotlin Tooling сначала для Kotlin/Native, затем и для всего Kotlin в целом.
Александр: Задача крупная, все путается за давностью лет. Кстати, движение началось не в 2010, а на три года раньше. В 2007 я как раз пришел работать в JetBrains и мне повезло с MPS… Ты знаешь, что такое MPS?
Вадим: Я слышал, что это декларативный и визуальный язык.
Александр: MPS опередило время. Это Meta Programming System — генеративное программирование cразу с IDE. Я устраивался в компанию на MPS, но там уже нашли человека. Поэтому мне повезло — меня отправили писать Scala plugin.
В JetBrains начали писать плагин, но бросили, потому что был Groovy. Он был популярен и требовал поддержки. Все, кто занимался Scala plugin, пошли работать над плагином Groovy. Scala никто не занимался и мне досталось такое наследство.
В компанию я пришел в начале 2008 года. Я ничего не умел, начал копать парсер, фиксил одну багу, вторую, третью — это продолжалось бесконечно долго. В итоге сел и переписал его. Так потихоньку поехали разрабатывать.
До меня над плагином работал Илья Сергей. Я его застал и работал с ним над плагином. Забавно, что я был математиком, а Илья — программистом. Но он хотел быть математиком, а я — программистом. Мне понравилось программировать, я готов был этим заниматься и не понимал, почему Илье не нравится. А он не понимал меня. В итоге жизнь все расставила по местам.
Илья ушел из JetBrains и занимается Computer Science в Испании, чуть ли не профессором. Он недавно приезжал, рассказывал, как искать автоматические гонки — это какая-то наука. Еще на каком-то соревновании сел и написал на Scala 10 тысяч строк. Сказал, что все супер, все работает. Он еще ездил на первый Scala Days, кажется в 2009 году.
Посмотрев биографию Ильи, я посчитал, что важно уточнить детали у первоисточника.
Доклад, который упомянул Александр, был о статическом анализе для нахождения состояний гонки в Java-приложениях. В 2018 году мы проводили работу совместно с Facebook. По ней написали доклад и еще две статьи. Правда там весь код на OCaml. Соревнования — это ICFP Programming Contest, которые я вел в этом году. Почти весь код для контеста также написал я на Scala с использованием Scala.js.
Использую Scala исключительно как пользователь. При помощи IntelliJ IDEA и Scala plugin написаны многие прототипы для моих исследовательских проектов: синтез программ с указателями TyGus/suslik, тестирование геометрических алгоритмов. В университете я читаю курс по многопоточности, где Scala основной язык.
Илья Сергей, профессор Национального Университета Сингапура.
Александр: Я на Scala Days начал ездить с 2011 года. Вот уже три года мы пишем второй фронтенд-компилятор Scala, по сути. Это занимает годы, это нормально. У нас все работало медленно и плохо, но при этом было хоть что-то. С точки зрения редакторов ничего лучше все равно не было. Я не помню, начали ли Eclipse поддерживать на тот момент. Да, кажется его поддерживали параллельно.
Вадим: Я разговаривал с Романом Тимушевым и он мне рассказывал про 13 год, как начал писать и проводить митапы в Москве. По его версии, тогда все пользовались Eclipse. Это было вполне сносно, он официально поддерживался.
Александр: Да, так и было. В 2011 году Eclipse был совсем плох, а в 2013 достиг скорости как у нас в 2011. В отличие от Eclipse, мы пишем свой фронтенд, поэтому подсветка ошибок отличалась от компилятора. Это неудобно и это ключевая проблема. Какие-то ошибки не подсвечиваются, а в компиляторе наоборот. Eclipse же использует код компилятора.
Использование кода компилятора — это плохая затея, потому что все будет работать медленно. В Kotlin аналогично при использовании кода компилятора. Ситуация не настолько плоха как была в Scala — немножко думали про IDE, но все равно непросто обеспечить хороший перформанс с точки зрения IDE.
В 2011 году Scalathon (фотки) проводили в Филадельфии. Это первая конференция на которую нас позвали, но было странно, что мы туда поехали. Они обратились в JetBrains, не хотим ли мы посетить мероприятие. До этого никуда не звали со Scala, а когда мы что-то начали делать — заметили. Пользователей, как и Scala-программистов, было с гулькин нос — около 100 человек на всей конференции. На Scalathon я и познакомился с Bill Venners.
Вадим: Имя знакомо, но я не помню, кто это.
Александр: Автор двух вещей: Scalatest и главной книги «Programming in Scala». Это книга, которая написана вместе с Martin Odersky — наша библия!
Вадим: Я не читал.
Александр: Неважно. У меня дома лежит эта книга с автографами Bill Venners и Martin Odersky. Они мне ее подарили на одном из Scala Days в 12 или 13 году. На званом ужине для всех участников награждали людей, которые сделали вклад в коммьюнити. Неожиданно позвали меня и я получил книгу за вклад.
Scala Days стали посещать тоже с 2011 года. Сначала они проходили один раз в год в Европе или в Америке, а позже два раза. В прошлом году я посетил одну конференцию, а на вторую не поехал. На прошлогоднюю я подал доклад о сравнении Kotlin/Native и Scala Native. Никто в Kotlin-команде не верил, что доклад примут, но его взяли. Возможно, из уважения или по другим причинам. На доклад пришло мало слушателей. У Scala-программистов не вызывает интереса все, что содержит слово «Kotlin». Так было и есть до сих пор.
Вадим: Я думаю, что и слово «Native» сыграло роль.
Александр: Нет, на Scala Days все доклады о Scala Native всегда собирают полные залы, например, выступление Дениса Шабалина. Но при этом, технология далека от продакшн. Ей не суждено туда попасть еще 10 лет, как минимум.
Вадим: Почему ты так думаешь? Я удивился, но есть Richard Whaling, который пишет книгу о Scala Native — материала уже много. Он ходит на подкасты и рассказывает как использует это в продакшн. У него и сфера такая, где много данных. Он очень рад Native в этих условиях.
Александр: Посмотри мой доклад о сравнении Scala Native и Kotlin/Native, в котором я объясняю свою точку зрения. На момент выступления над Scala Native трудился один человек. Поэтому ни о каком продукте речи быть не может. Если говорить про одного человека, который где-то применил технологию — может быть. Просто это не мейнстрим, будет мало пользователей.
У Kotlin/Native есть конкретное применение — шаринг кода между iOS и Android. Как раз это создает определенный интерес. У Scala Native этого нет и цепляться не за что. Scala Native можно использовать для вычислений, когда приходится комбинировать Scala-код и быстрые вычисления типа Tensorflow. Но Scala Native не означает, что между Scala и Native можно спокойно вызывать друг друга или шарить общий код.
В Kotlin мы паримся над тем, чтобы писать и компилировать один и тот же код. Это адский труд в смысле дизайна, что используешь не POSIX, а какую-то прослоечную библиотеку, которая одинаково работает и в JVM и без нее. Если у тебя такой библиотеки нет — все, кранты. Код будет разный в этом месте, а если он разный, то как его поддерживать? Как деплоить библиотеки, в которых разные эндпоинты — их же надо скомпилировать, деплоить, тут еще билд-система, зависимости? Если копать, то вопросов — бездна. Ответить на все не сможет один человек, который разрабатывает Scala Native. Применение — отдельная история, и об этом можно посмотреть мой доклад.
Вадим: Хорошо, вернемся обратно. В 2011 ты съездил на Scala Days, а до 2016 года ты был еще со Scala plugin?
Александр: До 2017.
Вадим: Потом тебя дернуло в Kotlin. Что произошло?
Александр: C какой-то точки зрения, я не сделал все, что мог. Можно было продолжать разрабатывать Scala plugin — много фишек, есть что доделывать. Но, с точки зрения бизнеса, он успешен как проект. 80% Scala-программистов используют IntelliJ IDEA. Как много ты знаешь продуктов, которые захватили 80% рынка? Таких мало.
Что делать дальше? Хочется новые цели, новые горизонты, а в рамках Scala plugin это было невозможно. В JetBrains разрабатывается собственный язык программирования и отношение к Scala скептическое. Найти местечко под Scala в компании невозможно, поэтому либо я ухожу, либо работаю здесь и дальше. В энтерпрайз какой-нибудь, или что-то еще. Пришлось принять трудное решение.
В какой-то степени я готовился. Первое — я понял, что если ухожу из команды, то вместо меня будет Коля Тропин. Он сейчас возглавляет команду. Я готовился, и его своеобразно подготовил, понимал, что он может встать вместо меня. Второе — потихоньку раздавал все подсистемы, отказывался от них. Мне уже не надо было их программировать.
Апофеозом всего этого стала травма руки, операция и 2 месяца больничного. После выхода я пошел к гендиректору Максиму Шафирову. Пришел и сказал: «Дай мне что- нибудь другое». Был такой триггер, что-то неосознанно готовилось, чтобы можно было это сделать, а эти два месяца позволили решиться. И Макс предложил. Я говорил «что угодно, только не Kotlin». Понятно, я же со Scala-мира, а Scala-мир ненавидит Kotlin.
Вадим: Я не то чтобы ненавижу, просто неприятно, что такой продукт появился. Это «огрызок» Scala. При этом маркетинг активный, захватывается рынок — те люди, кто могли бы перейти на светлую сторону Scala.
С другой стороны, это же неплохо? Если представить разрыв в знаниях, которые нужно освоить, чтобы эффективно писать на Scala или Haskell, то для Java-разработчика он гигантский. Здесь Kotlin — перевалочный пункт, до которого можно довольно безопасно дойти, отсидеться и идти дальше.
Александр: Это не совсем так. Когда не было Kotlin, в Scala приходили люди, которых не устраивала Java — не хватает чего-то, много boilerplate. Scala занимала место того, что называется «Better Java». Kotlin целится исключительно в эту нишу.
С Kotlin случился Android и все вытекающие, а теперь — мультиплатформенность и все. Kotlin не зациклился на одном Android, на одной нише, и пошел дальше.
Вадим: Мне кажется это хорошо — Oracle расшевелился. Сейчас хоть какие-то нормальные JEPы пошли, чтобы Java развивалась.
Александр: Я думаю, что причина не в Kotlin — это нормальное следствие. За 2 года до объявления Google о Kotlin, его было ничтожно мало. Когда я решил переходить, Макс Шафиров дал мне список для выбора. Хотя я говорил «только не Kotlin», вариант поддержки Kotlin/Native в IDEA был в этом списке. В итоге, из всего списка я решил попробовать перейти в Kotlin. На следующий день после того, как я взял на себя обязанность за Kotlin/Native, Андрей Бреслав сказал, что на следующем Google I/O объявят, что Kotlin официально поддерживаемый язык на Android.
Тут мысль: «Опаньки». Я думал, что позанимаюсь чем-то для условно маргинального языка. Было понятно, что нишу «Better Java» трудно завоевать. С выходом Java 8 с лямбдами, это стало еще труднее. У Scala все нормально с этим, она сильна не лямбдами и не тем, что лучше Java. Она случайна — случайные люди пришли в Scala с пониманием, что им нужна лучшая Java.
После Java 8 поток этих людей замедлился. В Scala и Kotlin ради этого они не пойдут — у них лямбды появились. Этого достаточно для начала, а лучшее уже не интересует. Я присел, задумался и осознал, что масштаб теперь другой.
В голове я переходил в команду масштабом не сильно больше, чем в Scala plugin. На тот момент там было 100 тысяч пользователей, а у Kotlin — 40 тысяч. Совершенно другой масштаб. Я понял, что это прикольно, что мне не сказали заранее. Решил пойти в Kotlin потому, что было интересно попробовать, а не ради грандиозных и масштабных целей.
В целом, на Scala приятнее программировать. Когда после 9 лет программирования на Scala начинаешь писать на Kotlin, оказываешься как без рук. В этом есть какая-то грусть.
Что бы я делал, если бы я был CTO? Для какой-то простой задачи на Kotlin мне было бы проще собрать команду. Она была бы дешевле или эффективней. Я мог бы набрать Scala-программистов дешевле, но получил бы результат хуже, потому что они наворотят что-то страшное в этой Scala. Даже если на рынке труда сложно, я начну набирать Java-программистов — Kotlin их обучить будет гораздо проще. Это с точки зрения начала нового проекта, если там нет каких-то технологических серьезных вещей.
Для банковской индустрии, например, есть причины, по которым нужно использовать Scala. Kotlin их не сможет решить. То же метапрограммирование в Scala гораздо удобнее.
Если крепко задуматься на эту тему, на Scala можно создать крутые инфраструктурные вещи, а в Kotlin невозможно. Там те же самые annotation-процессоры. Когда-нибудь будет возможно, но лишь в перспективе нескольких лет.
Вадим: Почему считаешь, что для банков хороша Scala?
Александр: Много boilerplate, который не связан с языком программирования. Это система, где есть объекты типа пользователя. Она требует много дупликации, начиная от базы данных и заканчивая всем. Чтобы эффективно изменять что-то, нужна хорошая поддержка метапрограммирования. Она нужна везде, но втыкать ее нужно с осторожностью, иначе можно влипнуть.
В 11 году меня позвали в Академический университет. Мне было лень вести весь курс, и я договорился со Светой Исаковой, которая сейчас developer-адвокат Kotlin. Мы договорились вести курс пополам, но он был о Scala. Она хотела, наверно, узнать про Scala подробнее.
Вадим: Универ был топовый на тот момент?
Александр: Да, с магистратурой на 5-6 курсе. Первые годы конкурс был небольшой. Но конкуренция за место повысилась, когда пришли JetBrains, Яндекс и Транзас со спонсорством, приглашением на стажировки и целью выращивать кадры для себя.
Получилось классно: частные деньги и частная инициатива под государственным прикрытием и прикрытием Алферова. Он дал полный карт-бланш — делайте как хочется! Получилось классно, потому что курсы релевантные. Они набрали людей, которые были на острие, понимали, что происходит в индустрии прямо сейчас, а не 10 лет назад непонятно где. Если говорить про обычные университеты, аля «матмех/мехмат», то там разве что Паскаль не проходят — к реальной жизни это не имеет никакого отношения.
Этим и был силен Академический университет. Люди понимали, что придя туда, они очень быстро влетят в индустрию. Выпускников университета с удовольствием набирали в Яндекс и JetBrains. Это хорошая карьерная ступенька, и конкурс был 10 студентов на место. Я преподавал там 5 лет. Света на второй год не стала со мной рассказывать о Scala, а я призвал разных помощников, в частности Свету для Kotlin. В итоге мы переименовались в JVM-languages.
В какой то момент мне досталась поддержка Clojure, и я немного разобрался в этом языке. По отзывам студентов, они не понимали, что в курсе делает Clojure, что это за хрень несусветная. Рассказывают про нормальные языки — Scala и Kotlin, и, внезапно, невнятный Clojure. Просто я не был экспертом. Вот такая история была.
О первых ScalaSPB/ScalaDev
Александр: Потом в Питере появились ивенты типа Scala Days. Прошел первый ScalaDev, а ко второму мероприятию организаторы оригинального Scala Days связались с питерскими и попросили переименоваться.
Вадим: Это какой год?
Александр: Да все там же — 11-13. Ивент делали ребята из питерского аутсорсера e-legion. Кажется, они писали приложение Райффайзенбанк. Они даже писали мобильное приложение на Scala, но сейчас так никто уже не пишет — люди в своем уме.
Вадим: Один из гостей подкаста — Матвей Мальков — рассказывал о Scala и Android два года назад. Говорил, что у них все хорошо, и они этим пользуются. Основной выигрыш у них, что и бэкенд на Scala, и приложения.
Недавно написал ему с запросом выступить на конференции, потому что про мобилки никого не найдешь. Оказалось, что он ушел из компании и последнее, что сделал — настроил на CI сборку модуля Kotlin из того проекта на Scala, чтобы ребята постепенно на него перекатывались.
Александр: Еще два года назад про Kotlin ничего не было понятно. Теоретически, Google мог взять и Scala, но не взял.
Мы выступали на первых Scala Days и даже собирали людей. Точнее не на первом, а на втором, который проводили в JetBrains. Тогда выступала Света Исакова с интро в Kotlin.
Это было забавно — все Scala-разработчики воспринимали Kotlin как врага номер один. Зал отреагировал очень негативно, закидал вопросами: «Почему это не делается, почему это не так, почему это не то?» Было жутко, какое-то хейтерство.
После Светы я был вторым человеком, который рассказал что-то о Kotlin на Scala-конференции — о Kotlin/Native. Мой опыт показал, что это бессмысленно. Я не ради доклада, мне было интересно посмотреть Scala Native. Как он устроен внутри, программы позапускать, чему-то порадоваться. Даже на тот момент я был рад тому, что размер бинарника у Scala Native был меньше, чем у Kotlin. Я думаю, что сейчас у Kotlin/Native меньше, потому что 10 человек работает над этим.
Вадим: Ох, ну вы так Дениса Шабалина точно задушите.
Александр: Это невозможно, это очень сложная технология. У нас 10 человек, и этого мало. Причем 10 крутых людей, прямо очень крутых, таких попробуй еще собери. Денис сам по себе крутой, но что он может один?
Довольно интересна история о коммьюнити, как и вся история Scala. Много людей стремилось создать какой-нибудь фреймворк, скорее всего, никому не нужный, чтобы распиариться и бросить. Образовалось много своеобразных звезд, а некоторым помогал еще и EPFL. Одно из требований — дипломная работа от аспиранто. Например, Scalameta — работа Жени Бурмако. В процессе работы у аспирантов повышается цена как программиста, и после окончания они находят крутую работу. Первую работу с зарплатой больше, чем у людей, которые работают 10 лет. Потому что они известные, они докладывались на куче конференций и раскрутились.
Вот еще что. Смотришь, в Kotlin: здесь собираемся сделать это, здесь то, и в Scala абсолютно также. Здесь Tasty, в Kotlin backend IR. Но, так как в Scala все драйвит сообщество, все в полном хаосе. Нет никакого централизованного дизайна. Что получится, то получится. Человек захотел что-то напедалить, получилось. Мартину понравилось, одобрение пошло в массы. А в Kotlin все более четко и профессионально, вот что значит индустрия.
Об Eclipse и Jason Zaugg
Александр: В 13 году мы ездили на конференцию. Все в компиляторе программировали на Eclipse. Мы стояли и к нам подходили люди, которые пользовались IDEA. Они были довольны, благодарили. У нас 10% рынка, остальные на Eclipse. Все компиляторщики на нем сидят. Они долго обходили нас стороной, вдруг мы их убедим пользоваться. Но в какой-то момент произошел сдвиг.
В 11 или 12 году у нас появился контрибьютор Jason Zaugg. В Open Source мире это не странно, но редко появляются люди, которые инвестируют много времени и много кодят. Джейсон пришел, много наконтрибьютил, а сам работал в каком-то банке. Мы даже дали ему права на коммиты. Ему даже не надо было показывать ревью на публикацию. Просто сидели, кодили, вместе обсуждали какие-то вещи. На основе нашего фронтэнда он разобрался, как работает Scala. Все закончилось тем, что Джейсон устроился работать в Scala-компилятор. Грустно, что мы его не устроили к себе. Мне кажется, это неправильная стратегия. Если на тебя человек бесплатно работает — его надо устраивать к себе, иначе он уйдет в Scala-компилятор. Больше такого не было.
Джейсон прекрасный человек и классный контрибьютор. Он был фанатом IDEA. Дело в том, что Scala plugin вис на компиляторном коде. Код сложный — dependency-injection (DI), которой, по сути, cake-паттерн. Когда открываешь любой файл, нужно проанализировать весь компилятор. За счет DI в контексте есть ВСЕ, а там все с type-inference, и нужно выводить тип везде — все переплетено. Анализ одного файла занимал 5 минут. Даже в настройке компилятора как проекта шел еще bootstrap. Он же должен зависеть сам на себя, это называется bootstrap. Такие проекты было трудно настроить.
Мы с Джейсоном потратили много времени на адаптацию. Чтобы можно было делать bootstrap-проекты, программировать в компиляторе, чтобы в этих сложных файлах хотя бы можно было набирать код. Сначала все было красное, и я потратил кучу времени, чтобы перевести все в зеленое. Мы даже тест сделали, который проверял, что наш фронтенд на компиляторе зеленый или содержит мало ошибок. И, соответственно, команда компилятора перешла целиком на IDEA.
Вадим Челышов: В этот момент и начался отток с Eclipse?
Александр: Для оттока есть несколько причин. Первая — IDEA выпустила коммьюнити-версию. Это значит, что можно поставить Scala-плагин на бесплатную версию пользователя. Мы с самого начала были Open Source и когда начинали, он был проприетарный, с открытыми сорцами. Но устанавливался он на платную IDE. Для этого и писали Eclipse поддержку, потому что нужен был стандартный инструмент, который можно использовать бесплатно. Поэтому мы тоже стали бесплатными.
Вторая — Eclipse как платформа начал умирать еще в 14 году. Он не умер, это смешно говорить, но финансирование резко оборвалось. Eclipse Foundation стал собирать меньше денег и непонятно, как развивать платформу в таких условиях.
Третья причина — у них не получалось сделать быструю IDE. Presentation compiler работал медленно, а если говорить про какой то функционал — это вообще трындец, рефакторинг сделать крайне трудно. В компиляторе, с точки зрения оптимизации, деревья строятся однонаправленные, нельзя взять родителя. Чтобы найти родительский узел, надо сверху взять файлик, пойти в них и посмотреть — жуткая возня.
Четвертая причина — они работают с отображением в компиляторе. Это дерево, которое получается после дешугаризации. Редактор написан во front statement, а в presentation compiler вообще непонятно, что за код. Непонятно как с этим работать и организовать рефакторинги. Как заэкстрактить этот front statement, а не всю эту безумную хрень? Соответственно, фичи появлялись медленно.
При этом наш фронтенд был убогий и плохо работал. Но, чтобы он был хотя бы таким, пришлось делать жуткие вещи. Когда-то метод for
{i <- 0 to 10} println(i)
требовал поддержки 80% языка. Потому что оно дешугаризуется, и у тебя implicit-конверсия для Range - 1 to 10
, по пути implicit-конверсия для map
, implicit-параметры, которые CanBuildFrom
. Дальше там еще безумная иерархия коллекций и лямбды, и еще какая-нибудь анонимная лямбда с неизвестным параметром — полная жесть. Как только работает этот пример — надо понимать, что это работает 80% фронтенда. Поэтому даже убогенький фронтенд означал, что у нас поддерживается невероятное количество функциональности Scala.Сейчас в IDEA написано много конвертеров языков. Они странные, но разные, и когда все это началось уже никто не помнит. В 2009 году я ездил на конференцию и там меня стрельнуло — почему бы не сделать конверсию из Java в Scala? Мы обсуждали, что устанешь точки с запятой убирать и разворачивать типы — надо же как-то переезжать. Я сел и за вечер написал тысячу строк — простой конвертер одного языка в другой.
Но я пошел дальше и придумал как сделать так, чтобы легко найти эту фичу. Когда я копирую в Java-код, то ожидаю, что сейчас вставлю и буду убирать точки с запятой. Это мой любимый случай, когда ты делаешь фичу, которая идеальна по discoverability. Пока она тебе не нужна — ты о ней не знаешь. Как только она тебе понадобилась — сразу ее получаешь. Это типа Apple-stylе — просто и понятно. Соответственно, с тех времен у JetBrains было написано много конвертеров, и рекламная фича, что они на вставке предлагаются. Но да, это придумал я, это моя гордость.
О компиляторах
К записи подключается Михаил Муцянко — один из текущих разработчиков Scala plugin в JetBrains. В этом выпуске подкаста Михаил и его коллега Андрей Козлов обсуждали плагин подробнее.
Александр: Я тут травлю байки про Scala. Миша, расскажи, как ты появился?
Михаил: Изначально я появился в Kotlin. Андрей Бреслав делал одну из первых стажировок — курсовик. Я попал на проект генерации котлиновских DSL по байткоду андроидовской UI-библиотеки. Она сейчас называется anko. Потом я искал какие-нибудь темы для диплома, и он меня направил к Саше. В качестве диплома я делал интерпретатор деревьев для Scalameta.
Александр: Точно, эта та тема, которая Мише досталась в виде диплома — поддержка мета-программирования. Миша долго этим и занимался. Что-то мы сделали в итоге?
Михаил: Да, оно работало. Правда потом Scalameta задепрекейтили. В Scala 3 будет что-то похожее, но с более стандартизированным API.
Александр: Про Dotty я уже ничего совсем не знаю.
Вадим: Я только сегодня видел то, что Miles Sabin пошарил свой кусочек кода, где он shapeless мигрирует на Dotty c новыми макросами, и вроде как получается. Typeable мигрировал.
Михаил: Да, в частности, он один из тех людей, кто раздает указания как нужно делать typechecker в Scala, чтобы Shapeless работал из коробки, без костылей. По сути, забандлят shapeless в компилятор.
Александр: Да ну! Ты шутишь? Скажи еще и Scalaz забандлят?
Михаил: Ну, как-то не понятно, кто вообще сейчас Scalaz пишет. За ним же не стоит Майлз.
Вадим: Сейчас все сообщество присматривает за Dotty. Майлз смотрит за shapeless. Вот уже который раз эти имплиситы поменяли, вкупе с обсуждением, как надо делать тайп-классы от Luka Jacobowitz.
Александр: Про сообщество. В начале 17 года Scala Center решили собрать инфлюенсеров на коммьюнити для рабочей группы. На JetBrains всегда смотрели издалека и осторожно. Не дай бог мы заставим программировать на IntelliJ IDEA — опасно. Когда стало трудно отрицать, что программировать все равно придется на IDEA, нас приняли. Пригласили на какое-то обсуждение, но я тогда травмировал руку и не пришел. Потом ушел из Scala и так ни разу и не появился в рабочей группе.
Еще меня всегда забавляло, что народ говорил: «Зачем нам документировать детали компилятора, все равно не существует второго компилятора?» Это было забавно, потому что Scala plugin всегда был тем самым вторым альтернативным компилятором. Был еще конечно Typelevel, но это форк.
На нас сильно влияло развитие Scala. Когда Jason Zaugg появился в компиляторе, это было круто. Он начал нам сообщать: «Мы такое сделали, поддержите нас». Появилась коммуникация. Когда компиляторщики смотрят свысока и не пользуются — они нам ничего не рассказывают. До Джейсона так и было.
Михаил: Сейчас я периодически попинываю Guillaume Martres, который пилит Tasty, и Fengyun Liu — он пилит макросы.
Подытожим
Вадим: Александр, спасибо большое, давай подытожим. Я вчера говорил с человеком. Он рассказывал, что в Scala ему нравился единый концепт имплисита, на который навешивались разные фичи. Сейчас в Dotty пришли к тем же явным extension-методам, явно все usecase имплиситов задекларировали точными словами. Подсмотрели у Kotlin и Swift, наверное. Как ты к этому относишься? И вообще к Scala 3?
Александр: В 2018 был последний Scala Days, который я посетил. На нем Martin Odersky рассказывал о том, что у Scala столько-то языковых концепций, у Kotlin в три раза больше, у C# еще больше. Но при этом, возможности Scala обширнее.
Мы думали что это клево, но это не так. Я впечатлился, понял, что Мартин понимает, что надо шевелиться. Единственное, что беспокоит, что Scala должна стать своеобразно нишевым языком. Безграничные возможности языка и создают эту самую нишу. Это и DSL, которую она умеет делать, и все это круто. Гоняться с Kotlin за лучшую Java уже тяжело, и с каждым годом тяжелее. Главное не потерять свою нишевость. Если они эту всю функциональность добавят и не потеряют нишевость — это будет круто. Но если Miles всем этим заправляет, то может и получится. Да, Миша?
В следующих частях расследования о зарождении Scala-движения нас ждут интервью с Владимиром Успенским, Романом Елизаровым и Николаем Татариновым. Если хотите добавить новые грани в историю Scala-движения или поделиться опытом использования — подавайте доклады. Call for Papers закрывается через 10 дней.