«Элегантный, безопасный код». Айтишники о том, за что любят и ненавидят Scala
Говорят, популярность Scala пришлась на 10-е, а сейчас язык тихо сидит в занятой нише. Но с тех пор его начали использовать многие крупные компании вроде The Guardian, NYT, SoundCloud. Переходят на Scala и отдельные программисты. Мы спросили у четырёх скалистов из Evolution, зачем они ушли в функциональщину, в чём были сложности перехода, что хорошего и плохого они находят в языке.
Впервые услышал о Scala в 2015 году, активно осваивать начал в 2017-м и уже через год устроился на работу в компанию, где Scala — это основной язык разработки back-end. До этого я успел пописать на разных языках: PHP, Objective-C и C#. Потом в компании, где я работал, мы очень плавно и органично перешли с C# на Java. Поэтому до перехода на Scala я в основном писал код на Java. Главной мотивацией для изучения Scala было желание пробиться в Evolution. Но чем глубже я погружался в мир функционального программирования, тем сильнее становилось желание писать именно в функциональном стиле.
Переходить с Java на Scala во многом было сложно, особенно сначала. Очень сложно было сломать императивное мышление, где ты думаешь о коде, как о наборе инструкций и не видишь ничего плохого в мутабельных переменных. Ещё довольно сложно отказаться от циклов и начать использовать рекурсию. Мне кажется, что изучать Scala без такого багажа опыта на Java может быть даже проще. Но опыт работы с JVM — это, разумеется, большая фора.
Я редко пересекаюсь с теми, кто критикует Scala. Знаю, например, что одна из претензий к языку — сложная терминология. Однако мне кажется, что ссылаясь на сложную терминологию скорее всего имеют ввиду вещи, позаимствованные из теории категорий — функторы, аппликативы, моноиды и монады. Понимание этих вещей приходит со временем. Затрудняет ли это процесс перехода? Вряд ли — каких-то глубоких познаний из области теории категорий здесь не требуется. И мне кажется, что они, наоборот, могут ускорить процесс перехода, потому дают очень хорошее представление о том, зачем ты до этого изучал иммутабельность, referential transparency, чистые функции и рекурсию.
— Почему говорят, что код, написанный на Scala, тяжело читать?
Тут очень сильно зависит от того, кто этот код писал. Обычно код на Scala очень лаконичный и хорошо читаемый. Испортить его можно по неопытности или написав свой DSL с использованием implicit class’ов, который понимаешь только ты. Ну или код может быть объективно сложным, решающим какую-то нетривиальную задачу, ещё и с использованием вышеупомянутых абстракций из теории категорий — тут важно понимать, что без них такой код будет ещё сложнее читать. В общем, к коду на Sсala по большей части нужно привыкнуть. Мне вот сейчас тяжело читать код на Java, и это нормально.
Лично я Scala очень люблю и мне её не за что критиковать. Я считаю, смысл изучать Scala есть и ещё какой. Вакансий много, платят в среднем больше, чем в Java (порой сильно больше). И сейчас вышла Scala 3.0 — синтаксис становится всё лаконичнее, компилятор — умнее. В общем язык не стоит на месте и развивается. Не вижу никаких причин для того, чтобы в ближайшем будущем что-то изменилось.
Я работала Java-разработчиком чуть меньше двух лет, когда начала изучать Scala. На курсы я решила пойти, потому что в университете как раз в это время мы изучали Haskell, и он показался мне очень не похожим на те языки, что мы учили до этого (C, C++, C#, Java, Python). Первое время было тяжело понять, как сделать какие-то простые вещи вроде функции для нахождения суммы элементов списка. Меня заинтересовала концепция функционального программирования, но показалось, что на Haskell найти работу будет проблематично, и не было понятно, как на нем писать большие проекты. Поэтому Scala выглядела как отличная альтернатива — функциональное программирование, неплохие вакансии, примеры проектов, написанных на этом языке и не такой большой отрыв от Java.
Опыт работы на Java помог мне лучше понять, зачем были придуманы определенные конструкции и решения в Scala.
Во время курсов Scala Bootcamp от Evolution изначально сложность состояла в том, что теория была в целом понятна, но, когда доходило до практических заданий, было тяжело перестроиться — даже объявить переменную или написать простое выражение хотелось так, как было в Java, но приходилось делать это по-другому.
Когда у нас появились полноценные практические домашние задания, стало лучше. Но больше всего мне помог именно финальный проект, потому что тут нужно было не просто написать несколько функций, а настроить зависимости, подключить библиотеки, подумать над архитектурой, попробовать разные подходы. И это во многом дало мне понимание того, чем я буду заниматься, если захочу работать Scala-разработчиком. Опыт работы на Java помог мне лучше понять, зачем были придуманы определенные конструкции и решения в Scala.
На данный момент я работаю на Scala полгода. За это время для меня выделились некоторые плюсы этого языка:
элегантный и более безопасный код. Когда пишешь на Scala, постоянно задумываешься, а можно ли как-то упростить то, что ты только что написал. И чаще всего оказывается, что можно;
мне нравятся тесты на Scala — удобный синтаксис и, как следствие, более интуитивно понятный код;
имплиситы — их непросто понять, но если разобраться, то они могут упростить вам жизнь.
Из того, что мне не нравится:
часто бывают проблемы с нахождением нужной информации. Ты гуглишь, и в лучшем случае находишь документацию, в худшем находишь ничего;
иногда ты просто не понимаешь, что написано в коде из-за большого количества незнакомых методов (особенно если их можно вызывать с помощью специальных сокращений типа *>);
нужно потратить больше времени, чем во многих других языках, чтобы достигнуть определенного уровня знаний;
— Многие критикуют Scala за медленную работу компилятора и за то, что он выдает нерелевантные ошибки. Насколько эта проблема актуальна?
— Я не могу сказать, что компилятор работает настолько медленно, что это затрудняет вам жизнь и вообще не дает нормально работать. Да, он работает чуть дольше обычного, но зато он помогает обнаружить больше проблем и ошибок. В итоге у вас будет меньше багов и вы потратите меньше времени на то, чтобы их найти и пофиксить. Также, например, за время работы со Scala я не сталкивалась с проблемой интеграции Java-фреймворков и библиотек, за что некоторые тоже могут критиковать этот язык. Для многих стандартных задач в Scala есть свои фреймворки.
Сейчас Scala не рекламируют и не предлагают ее как решение всех проблем программирования. Ее просто используют в тех случаях, когда это оправдано. Одно дело перейти на язык, который легко изучить, совсем другое — потратить кучу времени, чтобы переучить всю команду или перевести целый проект на язык, требующий гораздо больше теоретических знаний и вообще желания что-то учить, не имея на это веских причин.
Я учился в БГУИР-е на информатике, и там большой упор делался на 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.
И при этом, если ты все же ее обновишь, то заметить проблему сможешь только в рантайме. В таком случае приходится ждать обновления зависимостей. Похожая ситуация с версией компилятора — ты не можешь ее обновить, пока все зависимости не начнут ее поддерживать. Частично эта проблема будет решена в 3-ей версии Scala.
И в целом, Scala — достаточно старый язык, и в ней уже успело скопиться много legacy. От многого удалось избавиться в Scala 3, но стандартная библиотека там остается неизменной.
Для Scala достаточно изучить несколько новых базовых концепций, которые составляют основу всего языка.
Так или иначе, универсальных языков не бывает, у всех есть свои области применения, свои за и против. А что касается сложности изучения, существенная часть работы программиста — это изучение чего-то, с чем ты ни разу до этого не сталкивался. И для Scala достаточно изучить несколько новых базовых концепций, которые составляют основу всего языка.
Бывает, Scala критикуют со стороны Haskell, что она не такая удобная и функциональная, многое из этого правда. Например, в Scala есть вывод типов, но не такой мощный, как в Haskell. И он часто перестает работать именно в тех случаях, когда он нужен больше всего. Но точно так же критикуют и Haskell со стороны более жестких функциональных языков вроде Agda. Например, за то, что в Haskell нет различия в типах между данными и коданными. Так что тут однозначности какой-то нету, важно, чтобы язык оставался практичным и удобным.
Тем не менее, 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 и других С-подобных языков.
Что касается универсальности, то она точно такая же, как и для любого JVM-языка — если вы разрабатываете системы жесткого реального времени или операционную систему, то, вероятно, Scala будет не лучшим выбором
Есть мнение, что пик популярности Scala был в 10-х. Есть ли смысл сейчас изучать язык?
Scala прошла период хайпа, который бывает у каждого нового языка и теперь люди приходят в нее потому что она действительно предлагает что-то новое и интересное.
Рынок не такой огромный, как на Java, но выбрать есть из чего, только наша компания предлагает работу в четырех странах.
Для старта посоветую изучения Scala советую книгу Одерски Programming in Scala: A Comprehensive Step-by-Step Guide, и как можно больше практики.
Где изучать Scala тем, кто уже что-то знает. Собрали множество курсов и платформ (июнь, 2023)
Язык программирования Scala — один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.