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

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

3 комментария

Говорят, популярность 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, где вы сможете узнать тонкости практического использования языка от специалистов нашей компании. 

Хотите сообщить важную новость? Пишите в Телеграм-бот.

А также подписывайтесь на наш Телеграм-канал.

Читайте также

«Каждый выбирает место, где комфортно и безопасно». CEO из США набирает команду
«Каждый выбирает место, где комфортно и безопасно». CEO из США набирает команду
«Каждый выбирает место, где комфортно и безопасно». CEO из США набирает команду
Билл Зински — белорусский американец в третьем поколении. Его предки переехали в Штаты из Кобрина, а спустя время он вернулся на историческую родину, чтобы открыть здесь сервисную компанию 1PT. Летом 20-го вектор расширили. Теперь 1PT будет работать и над собственным продуктом: портфолио слот-игр и разработка контента для онлайн и наземных дистрибьюторов.  dev.by поговорил с Биллом про переезд, решение начать дело в Беларуси, местных разработчиков, а также спросил, кого бизнесмен ищет в новую команду. 
3 комментария
«Политика вторична, люди - первичны». Зачем видеостриминг открыл офис в Минске
«Политика вторична, люди - первичны». Зачем видеостриминг открыл офис в Минске
«Политика вторична, люди - первичны». Зачем видеостриминг открыл офис в Минске
4 комментария
Бастовавшего учителя информатики уволили. Он ищет работу программистом
Бастовавшего учителя информатики уволили. Он ищет работу программистом
Бастовавшего учителя информатики уволили. Он ищет работу программистом
4 комментария
Один из «диджеев перемен» ищет работу в ИТ
Один из «диджеев перемен» ищет работу в ИТ
Один из «диджеев перемен» ищет работу в ИТ

Обсуждение

1

А что по поводу книги "Scala для нетерпеливых" скажете?
А то книга Одерски - в 2 раза толще :)

Сергей Боровский
Сергей Боровский Scala-developer в Evolution Gaming
1

Добрый вечер!

Напрямую зависит от того какую цель вы преследуете, просто познакомиться с синтаксисом, новыми фишками и побороть страх перед Scala, вполне.

Но если цель детально разобраться и глубже понять как работает та или иная вещь, то Одерски или Красная книга(https://www.manning.com/books/functional-programming-in-scala).

Анастасия Тарасюк
Анастасия Тарасюк HR Generalist в Evolution Gaming
0

https://github.com/evolution-gaming/scala-bootcamp#books По этой ссылке находятся книги, которые мы от души рекомендуем тем, кому интересна Scala :)

Спасибо! 

Получать рассылки dev.by про белорусское ИТ

Что-то пошло не так. Попробуйте позже