[Перевод] Наиболее распространённые мифы о Scala: сеанс с разоблачением
В этом посте развенчивается ряд очень существенных мифов о языке Scala, которые, как нам известно, циркулируют в блогосфере. Для каждого развенчанного мифа мы представим альтернативную точку зрения, подкреплённую данными из надёжных источников.
Для работы со Scala требуются мега-аналитические навыки
Вероятно, первый миф сформировался из-за того, в какой предметной области впервые прославился язык Scala — это были распределённые вычисления над большими данными, в которых использовались Apache Spark или другие подобные фреймворки. Действительно, для работы в этой сфере нужны аналитические навыки, но это не означает, что они критически важны для любого проекта на Scala.
Язык Scala отличается простым синтаксисом и успешно используется во многих областях, в том числе, в разработке высококонкурентных бекендов на основе таких библиотек как akka-http, finagle или фреймворка Play. Также Scala применяется в конвейерной обработке с привлечением библиотек akka или fs2 и — не так давно — служит в качестве языка сценариев при работе с Ammonite или scala-cli. Особенно это касается Scala 3. Тем временем, Scala всё лучше подхватывается и в фронтенд-разработке. Можете попробовать библиотеку Scala.js, компилирующую Scala в JavaScript. На мой взгляд, ничто из этого не требует экспертных аналитических навыков.
Для работы со Scala требуется уверенно понимать функциональное программирование
Scala — это гибридный язык, в котором сочетается объектно-ориентированная и функциональная парадигма. Это не означает, что от вас требуется мастерски владеть обеими. Например, многие Scala-разработчики не знают, что такое функтор, монада или полугруппа, либо какова конкретная структура данных — ковариантная, контравариантная или инвариантная. Многие даже не знают, что такие концепции существуют!
Если ранее вам доводилось работать с объектно-ориентированными или процедурными языками, то можете точно таким же образом приступать к использованию Scala. Для начала можете попробовать сравнительно простые библиотеки, не требующие серьёзных знаний функционального программирования. В качестве хороших примеров можно рассмотреть некоторые библиотеки, написанные Ли Хаойи, представляющие собой порты для популярных инструментов Python. Таков, например, cask — простой HTTP-сервер на основе фреймворка Flask. Набирая опыт работы со Scala, вы заметите, как сами впитываете функциональную парадигму. Когда вы освоитесь с обычной версией Scala, вы, возможно, захотите попробовать свои силы с более продвинутыми функциональными библиотеками, например, cats или ZIO — которые более популярны при реализации чуть более сложных проектов.
Во многих современных версиях объектно-ориентированных языков, например, в Java, уже включаются одни и те же базовые элементы функционального программирования. Например, вводятся лямбда-выражения или функции, принимающие в качестве предиката другие функции. В Scala просто значительно удобнее работать с такими сущностями. Есть множество руководств по переходу с Java на Scala, можете познакомиться с этим документом или с этим разделом документации Scala — и убедиться, что на базовом уровне Scala не отличается от других (обычных) языков программирования.
Синтаксис Scala странный и сложный
Язык Scala очень гибкий — на мой взгляд, базовый синтаксис у Scala очень прост, благодаря чему Scala очень хорошо подходит для начинающих в качестве первого языка программирования. В то же время, эксперт найдёт в Scala мощный инструментарий. Большинство пользователей Scala придерживаются базового синтаксиса, который можно усвоить за считанные минуты, об этом рассказано в следующем коротком туториале или в шпаргалке по базовому синтаксису, выложенной на сайте по языку Scala.
Одно время в Scala были популярны абстрактные символьные операторы. Но сегодня такое соглашение об именовании уже перешло в разряд сильно нежелательных, и лучше его избегать. В ранних версиях Scala предпринимались попытки имитировать синтаксис других языков программирования, например, Haskell — чтобы привлечь пользователей и облегчить им переход на Scala. С тех пор вышло несколько мажорных релизов Scala, и во всех них фигурировали описательные названия методов.
Давайте разберём пример? Допустим, у нас есть список строк, для которого мы хотим подсчитать общую длину всех элементов. Можно применить к этой последовательности обычный метод `foldLeft` — он принимает в качестве аргументов исходное состояние и двоичный оператор. При применении символьного синтаксиса у нас получился бы символьный код — явно путаный, особенно для не очень опытных разработчиков.
(0 /: list)(_ + _.length)
Тогда как в более развёрнутом, но чаще используемом синтаксисе можно просто написать
list.foldLeft(0){ (sum, string) => sum + string.length }
либо вот так, с использованием джокерных символов
list.foldLeft(0)(_ + _.length)
Не каждый способен понять «магию» Scala
Магия и в лучшие времена была неоднозначным феноменом! Правда такова: можно с успехом пользоваться Scala в качестве альтернативы для других языков, например, для Java или Python, игнорируя её функциональные аспекты. Тоже верно: игнорируя функциональные аспекты, можно пропустить всё то лучшее, что способна предложить Scala! На мой взгляд, целесообразно уделить некоторое время и как следует разобраться в функциональных аспектах. Благодаря этому вы как разработчик только вырастете.
Если ранее вы пробовали Scala и скептически к ней относитесь, попробуйте ещё раз. Особое внимание уделите Scala 3, так как именно в этой версии язык обогатился совершенно новыми идиомами.
Сегодня в Scala имеются чистые и легкие для понимания неявные значения, улучшены перечисления, и вся система стала более выразительной. Кроме того, полностью переписано метапрограммирование на Scala — сегодня система метапрограммирования в Scala одна из лучших в индустрии. Также важно отметить, что решены проблемы с обратной совместимостью, вызывавшие серьёзные сложности при миграции на новые версии ещё во времена Scala 2. Один из лучших ресурсов для изучения Scala — это книга Мартина Одерски (автора Scala) и его коллег.
Хотел бы поделиться с вами, как открыл для себя «магию Scala». Когда я впервые стал заниматься этим языком в качестве младшего разработчика, я по достоинству оценил неизменяемость по умолчанию, неявное разрешение типов, выразительность и сцепление операций с коллекциями, а также насколько просто в этом языке работать с конкурентностью. В Scala нашлось несколько элементов, в которые я сразу влюбился. Благодаря этим деталям код на Scala получается лаконичным, удобочитаемым и легко понятным. Более того, самые серьёзные преимущества Scala я усматривал в микромасштабе — например, в одноклассных функциях.
Набирая опыт, я научился работать с неявными элементами и стал безопасно использовать их у меня в коде — например, передавать в приложение некоторый контекст или расширять имеющиеся типы дополнительными методами. На мой взгляд, неявные элементы в Scala поддерживать гораздо проще, чем автомагические инъекции кода, известные по таким фреймворкам как Spring — поскольку их область видимости можно ограничивать, а IDE помогает отслеживать, как они используются. Также в тот период я изучил вывод типов и метапрограммирование, благодаря чему нам с командой удалось в значительной степени избавиться от шаблонного кода. После этого мы смогли сосредоточиться на нашей модели и логике, а не запутываться в дополнительном коде.
Я считаю, что функциональные аспекты Scala начинают по-настоящему раскрываться по мере роста и усложнения проекта. Предпочитая чистые функции (функции без каких-либо побочных эффектов, где одинаковый ввод всегда результирует в одинаковый вывод), вы получаете возможность с лёгкостью компоновать ваши блоки и быть уверены, что код всегда будет действовать именно так, как вы ожидаете. Используя типы высшего порядка, вы сможете генерализовать ваш код. Наконец, нужно отметить, что при помощи ссылочной прозрачности можно абстрагировать некоторые значения и внедрить мощные варианты оптимизации без существенных издержек.
Scala — умирающий язык без будущего
Нет, это неправда. Потребность в Scala-разработчиках как никогда высока. Scala — по-прежнему один из топовых языков для распределённых вычислений с использованием Apache Spark и для конвейерной обработки с применением Akka. Наряду с этими долгоиграющими проектами есть и более молодые, будоражащие сообщество Scala. Например, не так давно были введены в обращение библиотеки ZIO и cats-effect. В настоящее время обе эти библиотеки широко используются для асинхронного и конкурентного программирования в Scala. Ещё один пример из свежих успешных проектов — это Caliban, функциональный сервер GraphQL и клиентская библиотека. Своим успехом вышеупомянутые проекты обязаны чисто функциональному подходу, обеспечивающему безопасную обработку ошибок и лёгкую компоновку с другими составными частями.
Действительно, некоторые компании переходят со Scala на другие языки, но это объясняется в основном дефицитом опытных Scala-разработчиков. В последние несколько лет наблюдаем, что Scala-разработчики лидируют по зарплатам, а для закрытия имеющейся потребности даже предлагают бесплатную прокачку или предложения по переходу с другого языка.
Сообщество Scala — элитарное и обособленное
Никогда не воспринимал сообщество Scala таким образом. Действительно, оно гораздо меньше, чем у Java, PHP или Python, но новички здесь приветствуются. Есть множество конференций, мастерских, митапов, как оффлайновых так и онлайновых. На них можно учиться, выступать с докладами, а также дать пять кому-нибудь из известнейших представителей сообщества Scala и не только.
Элитарна ли эта группа? Не думаю. В неё может войти каждый. Возможно, идея об элитарности возникла в 2010-е, когда был бум Scala, и многие старшие разработчики из Twitter и других технологических гигантов ею пользовались. К сожалению, на фоне этих пресс-релизов потерялось множество новостей о более мелких компаниях, в которых также начинали осваивать Scala.
Сообщество Scala очень нарциссично
На мой взгляд, в сообществе любого языка программирования найдутся люди, которые много шумят и пылят в прессе. Однако, обычно это малая доля от всего сообщества. В Scala такая же ситуация, но здесь такие крикуны заметнее, поскольку само сообщество невелико. Я слышал истории о таких смутьянах, но при личном контакте никто из них не разочаровал меня с профессиональной точки зрения.
Кроме того, поскольку ранее Scala использовалась преимущественно крупнейшими компаниями в отрасли, куда нанимали только самых высококлассных специалистов из Кремниевой долины, логично допустить, что некоторые из них перебрали с самооценкой.
Чтобы изучить Scala, нужно сначала освоить sbt и массу других странных инструментов
Программа sbt по умолчанию применяется в качестве сборочного инструмента при работе со Scala. На мой взгляд, это наилучший сборочный инструмент для средних проектов на Scala, здесь куча возможностей, множество расширений-плагинов и конфигураций для многих областей применения. Судя по статистике оценок на GitHub, этот инструмент сейчас используется в 74 из 80 самых популярных библиотек на Scala. Правда, sbt часто оказывается непрост для новичков, ранее пользовавшихся Maven или Gradle. В последнее время во многих небольших проектах берётся на вооружение Mill — новый сборочный проект¸ идеально подходящий для проектов на 1–5 модулей. Его вдобавок гораздо проще сконфигурировать, то есть, вы сможете быстро приступить к работе.
Но если вы новичок в Scala, рекомендую вам попробовать scala-cli — совершенно новый инструмент, разработанный VirtusLab. Этот инструмент молниеносно взаимодействует с командной строкой, которая превращается в де-факто стандарт взаимодействия со Scala. Этот инструмент идеально подходит для одномодульных проектов или скриптов, использующих Scala.
Инструментарий Scala медленный и сложный в обращении
Не думаю, что это так. Отчасти такие слухи возникли из-за недопонимания инструментов. Как упоминалось выше, sbt, в отличие от Gradle или Maven, следует использовать с интерактивной оболочкой, куда из командной строки передаются одиночные инструкции. Так удаётся значительно повысить удобство работы, ведь на первый запуск приложения может уйти некоторое заметное время. Именно поэтому распространились ошибочные слухи о медленной сборке. Но не будем забывать, что система типов в Scala гораздо сложнее, чем в других языках для JVM, и, следовательно, компилируются эти типы дольше. Почти во всех случаях Scala требует для компиляции больше времени, чем какие-либо иные языки.
Ещё один миф о медленности Scala связан с тем, какой IDE пользуются разработчики. Наиболее популярна IntelliJ от JetBrains, а на её подготовку к работе может потребоваться достаточно длительное время, в особенности в больших проектах. Недавно появилась отличная альтернатива: Metals — это легковесный языковой сервер Scala, сочетающийся со многими текстовыми редакторами, в частности, с VS Code, Vim и Emacs. Запускается он быстро, потребляет не так много вычислительных ресурсов, и зачастую гораздо быстрее IntelliJ. Он не такой многофункциональный как IntelliJ, но на мой взгляд, для новичков и в небольших проектах это хороший вариант.
Многие популярные инструменты Scala просты в начальной настройке и использовании. Например, `scalafmt` — выбор номер один для форматирования вашего кода на Scala, помогающий унифицировать следование правилам для разных участников проекта. По умолчанию в нём выставляются качественные настройки, но вы можете детально скорректировать их, чтобы они отвечали вашим потребностям. Ещё один пример — `scalafix`: это инструмент для рефакторинга и линтинга, позволяющий с лёгкостью формулировать правила для модификации вашего кода. Оба этих инструмента легко настроить при помощи `coursier`, отлично подходящего для выборки артефактов и установки инструментов, нужных на вашей машине для работы со Scala.
Если же вы хотите больше узнать про Scala, то вашему вниманию мы предлагаем книгу Мартина Одерски, Лекса Спуна, Билла Веннерса, Фрэнка Соммерса «Scala. Профессиональное программирование. 5-е изд.»:
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Scala