Support us

«Элегантный, безопасный код». Айтишники о том, за что любят и ненавидят Scala

Говорят, популярность Scala пришлась на 10-е, а сейчас язык тихо сидит в занятой нише. Но с тех пор его начали использовать многие крупные компании вроде The Guardian, NYT, SoundCloud. Переходят на Scala и отдельные программисты. Мы спросили у четырёх скалистов из Evolution, зачем они ушли в функциональщину, в чём были сложности перехода, что хорошего и плохого они находят в языке.

Оставить комментарий

Говорят, популярность Scala пришлась на 10-е, а сейчас язык тихо сидит в занятой нише. Но с тех пор его начали использовать многие крупные компании вроде The Guardian, NYT, SoundCloud. Переходят на Scala и отдельные программисты. Мы спросили у четырёх скалистов из Evolution, зачем они ушли в функциональщину, в чём были сложности перехода, что хорошего и плохого они находят в языке.

Evolution открывает второй Scala Bootcamp. 4 месяца бесплатного обучения у опытных Scala-разработчиков Evolution. Лучшим студентам предложат работу. Подать заявку можно до 15 декабря 2020.

Иван Петров
Лично я Scala очень люблю и мне её не за что критиковать. Я считаю, смысл изучать Scala есть и ещё какой. Вакансий много, платят в среднем больше, чем в Java (порой сильно больше).

Впервые услышал о Scala в 2015 году, активно осваивать начал в 2017-м и уже через год устроился на работу в компанию, где Scala —  это основной язык разработки back-end. До этого я успел пописать на разных языках: PHP, Objective-C и C#. Потом в компании, где я работал, мы очень плавно и органично перешли с C# на Java. Поэтому до перехода на Scala я в основном писал код на Java. Главной мотивацией для изучения Scala было желание пробиться в Evolution. Но чем глубже я погружался в мир функционального программирования, тем сильнее становилось желание писать именно в функциональном стиле.

Переходить с Java на Scala  во многом было сложно, особенно сначала. Очень сложно было сломать императивное мышление, где ты думаешь о коде, как о наборе инструкций и не видишь ничего плохого в мутабельных переменных. Ещё довольно сложно отказаться от циклов и начать использовать рекурсию. Мне кажется, что изучать Scala без такого багажа опыта на Java может быть даже проще. Но опыт работы с JVM — это, разумеется, большая фора.

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

Я редко пересекаюсь с теми, кто критикует Scala. Знаю, например, что одна из претензий к языку — сложная терминология. Однако мне кажется, что ссылаясь на сложную терминологию скорее всего имеют ввиду вещи, позаимствованные из теории категорий — функторы, аппликативы, моноиды и монады. Понимание этих вещей приходит со временем. Затрудняет ли это процесс перехода? Вряд ли — каких-то глубоких познаний из области теории категорий здесь не требуется. И мне кажется, что они, наоборот, могут ускорить процесс перехода, потому дают очень хорошее представление о том, зачем ты до этого изучал иммутабельность, referential transparency, чистые функции и рекурсию.

— Почему говорят, что код, написанный на Scala, тяжело читать?

Тут очень сильно зависит от того, кто этот код писал. Обычно код на Scala очень лаконичный и хорошо читаемый. Испортить его можно по неопытности или написав свой DSL с использованием implicit class’ов, который понимаешь только ты. Ну или код может быть объективно сложным, решающим какую-то нетривиальную задачу, ещё и с использованием вышеупомянутых абстракций из теории категорий — тут важно понимать, что без них такой код будет ещё сложнее читать. В общем, к коду на Sсala по большей части нужно привыкнуть. Мне вот сейчас тяжело читать код на Java, и это нормально.

Лично я Scala очень люблю и мне её не за что критиковать. Я считаю, смысл изучать Scala есть и ещё какой. Вакансий много, платят в среднем больше, чем в Java (порой сильно больше). И сейчас вышла Scala 3.0 — синтаксис становится всё лаконичнее, компилятор — умнее. В общем язык не стоит на месте и развивается. Не вижу никаких причин для того, чтобы в ближайшем будущем что-то изменилось.

Вероника Ястребова
Я не могу сказать, что мне не нравилась Java, но мне стало слишком легко — я быстро могла найти любую нужную информацию и чувствовала себя достаточно уверенно.

Я работала Java-разработчиком чуть меньше двух лет, когда начала изучать Scala. На курсы я решила пойти, потому что в университете как раз в это время мы изучали Haskell, и он показался мне очень не похожим на те языки, что мы учили до этого (C, C++, C#, Java, Python). Первое время было тяжело понять, как сделать какие-то простые вещи вроде функции для нахождения суммы элементов списка. Меня заинтересовала концепция функционального программирования, но показалось, что на Haskell найти работу будет проблематично, и не было понятно, как на нем писать большие проекты. Поэтому Scala выглядела как отличная альтернатива — функциональное программирование, неплохие вакансии, примеры проектов, написанных на этом языке и не такой большой отрыв от Java.

Я не могу сказать, что мне не нравилась Java, но мне стало слишком легко — я быстро могла найти любую нужную информацию и чувствовала себя достаточно уверенно. Я изучала вакансии в разных компаниях в Беларуси и за ее пределами и видела одни и те же требования, одни и те же проекты, и мне становилось скучно.

Опыт работы на Java помог мне лучше понять, зачем были придуманы определенные конструкции и решения в Scala.

Во время курсов Scala Bootcamp от Evolution изначально сложность состояла в том, что теория была в целом понятна, но, когда доходило до практических заданий, было тяжело перестроиться — даже объявить переменную или написать простое выражение хотелось так, как было в Java, но приходилось делать это по-другому.

Когда у нас появились полноценные практические домашние задания, стало лучше. Но больше всего мне помог именно финальный проект, потому что тут нужно было не просто написать несколько функций, а настроить зависимости, подключить библиотеки, подумать над архитектурой, попробовать разные подходы. И это во многом дало мне понимание того, чем я буду заниматься, если захочу работать Scala-разработчиком. Опыт работы на Java помог мне лучше понять, зачем были придуманы определенные конструкции и решения в Scala.

На данный момент я работаю на Scala полгода. За это время для меня выделились некоторые плюсы этого языка:

  • элегантный и более безопасный код. Когда пишешь на Scala, постоянно задумываешься, а можно ли как-то упростить то, что ты только что написал. И чаще всего оказывается, что можно;
  • мне нравятся тесты на Scala — удобный синтаксис и, как следствие, более интуитивно понятный код;
  • имплиситы — их непросто понять, но если разобраться, то они могут упростить вам жизнь.

Из того, что мне не нравится:

  • часто бывают проблемы с нахождением нужной информации. Ты гуглишь, и в лучшем случае находишь документацию, в худшем находишь ничего;
  • иногда ты просто не понимаешь, что написано в коде из-за большого количества незнакомых методов (особенно если их можно вызывать с помощью специальных сокращений типа *>);
  • нужно потратить больше времени, чем во многих других языках, чтобы достигнуть определенного уровня знаний;

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

— Я не могу сказать, что компилятор работает настолько медленно, что это затрудняет вам жизнь и вообще не дает нормально работать. Да, он работает чуть дольше обычного, но зато он помогает обнаружить больше проблем и ошибок. В итоге у вас будет меньше багов и вы потратите меньше времени на то, чтобы их найти и пофиксить. Также, например, за время работы со Scala я не сталкивалась с проблемой интеграции Java-фреймворков и библиотек, за что некоторые тоже могут критиковать этот язык. Для многих стандартных задач в Scala есть свои фреймворки.

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

За эти полгода количество предложений на LinkedIn у меня больше, чем было с 1.5 годами опыта на Java. И эти предложения обычно с очень хорошими условиями, высокой зарплатой и чаще всего в Европе, а не в Беларуси.

Евгений Курневский
Язык очень лаконичный, не нужно писать лишний однотипный код. Отсутствие синтаксического шума также сильно упрощает чтение кода.

Я учился в БГУИР-е на информатике, и там большой упор делался на C#. Это и был мой самый первый язык, с которым довелось работать на проекте. Этот проект продлился около года и уже на следующем мы начали писать на Scala. У нас было требование использовать JVM, а язык мы могли выбирать сами. Java очень похожа на C#, но по возможностям на тот момент она была гораздо скуднее, и потому не очень хотелось ее использовать. Scala же воспринималась просто как современный и более удобный язык на JVM, потому выбор и пал на нее.

Сложно было переходить на Scala?

Если уже знаешь Java или C#, достаточно просто посмотреть примеры синтаксиса, чтобы начать писать на Scala. Одновременно со Scala я начинал учить Haskell по лекциям с Лекториума. Сначала он мне не понравился из-за своего необычного синтаксиса. Но чем больше лекций я смотрел, чем больше пробовал писать на нем, тем больше проникался его красотой и функционального программирования в целом. И затем пришло понимание, как писать на Scala в функциональном стиле — Haskell здесь очень сильно помогает, так как на нем нельзя писать императивный код.

Scala мне нравится по трём основным причинам:

  • мощная система типов. Очень многое можно выразить на типах, и все это будет проверено на этапе компиляции, меньше багов придется ловить в рантайме;
  • выразительность языка. Язык очень лаконичный, не нужно писать лишний однотипный код. Отсутствие синтаксического шума также сильно упрощает чтение кода;
  • неизменяемость по умолчанию. Если объявлять значения в скале через val, то они будут неизменяемыми. Не нужно дополнительно писать final, как в Java. Также в стандартной библиотеке Scala есть много неизменяемых коллекций. Все это подталкивает к использованию более функционального стиля и уменьшает количество неожиданных багов.

За что критикуете Scala?

— В Scala есть замечательный фреймворк для написания распределенных приложений на основе акторов — Akka. Его я и считаю самым большим минусом Scala, просто потому что чаще всего его используют неправильно. Очень часто выбирают Akka из-за ее популярности и просто вместо классов начинают писать акторы. Из-за этого полностью теряется типизация, отлов ошибок в рантайме и навигация по коду превращаются в ад. Часто проекты, написанные в таком стиле, умирают, и обвиняют во всем Scala.

Еще одна проблема — Dependency hell. Очень часто бывает так, что ты не можешь обновить версию какой-то библиотеки в проекте, потому что более старая версия требуется в зависимостях.

И при этом, если ты все же ее обновишь, то заметить проблему сможешь только в рантайме. В таком случае приходится ждать обновления зависимостей. Похожая ситуация с версией компилятора — ты не можешь ее обновить, пока все зависимости не начнут ее поддерживать. Частично эта проблема будет решена в 3-ей версии Scala.

И в целом, Scala — достаточно старый язык, и в ней уже успело скопиться много legacy. От многого удалось избавиться в Scala 3, но стандартная библиотека там остается неизменной.

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

Так или иначе, универсальных языков не бывает, у всех есть свои области применения, свои за и против. А что касается сложности изучения, существенная часть работы программиста — это изучение чего-то, с чем ты ни разу до этого не сталкивался. И для Scala достаточно изучить несколько новых базовых концепций, которые составляют основу всего языка.

Бывает, Scala критикуют со стороны Haskell, что она не такая удобная и функциональная, многое из этого правда. Например, в Scala есть вывод типов, но не такой мощный, как в Haskell. И он часто перестает работать именно в тех случаях, когда он нужен больше всего. Но точно так же критикуют и Haskell со стороны более жестких функциональных языков вроде Agda. Например, за то, что в Haskell нет различия в типах между данными и коданными. Так что тут однозначности какой-то нету, важно, чтобы язык оставался практичным и удобным.

Тем не менее, Scala же заняла свою нишу и постепенно продолжает развиваться. 

Андрей Бобылев
Долго откладывал свое знакомство со Scala, потому что примеры кода из русской Википедии мне казались нагромождением скобочек и знаков препинания.

На Scala пишу 4 года, попробовать решил, прежде всего, от скуки. До этого основной язык у меня был Java, писал на нем около 8 лет. Еще пару лет довелось поработать с JS / Node.js  Но со временем Java начала казаться слишком громоздкой и старомодной по сравнению с быстро развивающимся C#, однако кардинально менять стек и платформу не хотелось, поэтому перешел на Scala, захотелось попробовать язык, который умеет хотя бы автоматически выводить типы.

В то же время не хотелось просто выкинуть имеющийся багаж знаний и опыта программирования под JVM, поэтому предпочтительным был язык на этой платформе. Рассматривал Groovy, Ceylon и Scala (Kotlin в то время еще не зарелизился), и Scala выделялась тем, что позиционировалась не просто как «лучшая Java», а новый функциональный язык.

Я для себя выделяю несколько плюсов в Scala:

  • типобезопасный код и проверки на этапе компиляции. Если программа компилируется, то, с большой вероятностью, она работает правильно;
  • гораздо более простая и безопасная работа с конкурентным кодом и общим состоянием (shared state) по сравнению с традиционными языками;
  • главный плюс для меня — парадигма ФП это целая новая область, меняющая мышление, паттерны и подходы, и это дико интересно (улыбается).

А вот критиковать Scala мне сложно. Никогда не сталкивался с каким-либо недопониманием из-за разности терминологии и жаргона. Знаю, что в Haskell под классом подразумевается тайпкласс, но у нас все консервативно — класс это класс. Для людей, пришедших из ООП-вселенной, новыми могут быть только термины, общепринятые для ФП-языков, такие, как вышеупомянутые тайпклассы или знаменитые монады. Последние пришли из теории категорий, но я бы не сказал что знания этой теории так уж необходимы для практической работы с ними

Откуда появилось мнение, что код, написанный на скала, тяжело читать?

Если честно, я долго откладывал свое знакомство со Scala, потому что примеры кода из русской Википедии мне казались нагромождением скобочек и знаков препинания. Это чувство пропало сразу после того, как я написал свои первые строчки, так что не стоит бояться (некоторые пишут и на Lisp и серьезно заявляют, что все понятно).

Я думаю огромное преимущество Scala по сравнению, например, с Haskell, в том, что она сочетает в себе ООП и ФП подходы. Это делает порог вхождения в язык гораздо менее крутым, особенно при переходе с Java и других С-подобных языков.

С первого дня вы можете писать рабочий и лаконичный код, как будто это Java, какой она должна быть в 2020, и параллельно изучать и пробовать новые фишки и подходы, которые предлагает ФП.

Что касается универсальности, то она точно такая же, как и для любого JVM-языка — если вы разрабатываете системы жесткого реального времени или операционную систему, то, вероятно, Scala будет не лучшим выбором

Есть мнение, что пик популярности Scala был в 10-х. Есть ли смысл сейчас изучать язык?

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

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

Для старта посоветую изучения Scala советую книгу Одерски Programming in Scala: A Comprehensive Step-by-Step Guide, и как можно больше практики. 

Также, скоро мы запускаем второй по счету буткамп по Scala, где вы сможете узнать тонкости практического использования языка от специалистов нашей компании. 

Место солидарности беларусского ИТ-комьюнити

Далучайся!

Читайте также
Где изучать Scala тем, кто уже что-то знает. Собрали множество курсов и платформ (июнь, 2023)
Где изучать Scala тем, кто уже что-то знает. Собрали множество курсов и платформ (июнь, 2023)
Где изучать Scala тем, кто уже что-то знает. Собрали множество курсов и платформ (июнь, 2023)
Язык программирования Scala — один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.
1 комментарий
Как оплачиваются самые популярные языки GitHub и какой прогноз
Как оплачиваются самые популярные языки GitHub и какой прогноз
Как оплачиваются самые популярные языки GitHub и какой прогноз
Корпоративный абьюз в IT: как не попасть в рабство на работе
Корпоративный абьюз в IT: как не попасть в рабство на работе
Bubble
Корпоративный абьюз в IT: как не попасть в рабство на работе
Отказы, отзыв вакансий, нет денег на переезд. Узнали, как дела у джунов
Отказы, отзыв вакансий, нет денег на переезд. Узнали, как дела у джунов
Отказы, отзыв вакансий, нет денег на переезд. Узнали, как дела у джунов
6 комментариев

Хотите сообщить важную новость? Пишите в Telegram-бот

Главные события и полезные ссылки в нашем Telegram-канале

Обсуждение
Комментируйте без ограничений

Релоцировались? Теперь вы можете комментировать без верификации аккаунта.

Комментариев пока нет.