image

В этом посте развенчивается ряд очень существенных мифов о языке 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.

imageЕсли же вы хотите больше узнать про Scala, то вашему вниманию мы предлагаем книгу Мартина Одерски, Лекса Спуна, Билла Веннерса, Фрэнка Соммерса «Scala. Профессиональное программирование. 5-е изд.»:

» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — Scala

Комментарии (18)


  1. aborouhin
    07.04.2023 13:24
    +2

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


    1. sshikov
      07.04.2023 13:24

      Есть разные применения. Иногда нужно знать магию, изнутри, иногда достаточно среднего уровня понимания. Скажем, вот есть такой тест по скала Linkedin. Я как-то недавно решил его пройти. Прошел — попал в топ 95 что-ли процентов сдавших (уже не помню, сколько их таких там было). При этом я пользуюсь скалой время от времени, как вспомогательным инструментом (который называется Spark Shell), и применяю лишь весьма ограниченное подмножество. И для меня этот язык довольно полезен. Вот в таком вот ограниченном виде.


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


      1. aborouhin
        07.04.2023 13:24
        +4

        Так то, что скалистов на рынке маловато, а те, что есть, очень дорогие - тоже камень в огород языка. Как и те моменты, на которые обращает внимание De Goes. В общем, каким бы привлекательным ни был сам по себе язык, выбирая его для нового проекта, об этих вопросах нельзя не задумываться.


        1. sshikov
          07.04.2023 13:24
          +1

          Ну это все понятно… есть мода на питон, например. Но в тоже время, спрашиваю наших DS: "а вам не нужны питонисты, у нас тут мимо кандидат пробегал"? А они отвечают — знаешь, нам теперь модели нужно не просто придумать, а внедрить, а внедрить их на Java/Scala намного проще. Поэтому мы нынче на них пишем сразу, и иногда без всякого там юпитера, как раньше. Не то чтобы массовая тенденция — но имеет место. И я таки, имея опыт питона с 2010 где-то, а скалы прилично меньше — практически без вариантов выберу скалу, чтобы писать что-то новое.


          Очень дорогие… ну мы нанимали человека где-то на 200к. Ему не очень понравились наши задачи, и мы разошлись друзьями. Но уровень был вполне приличный. Это Москва. Ну и потом, можно выучить. Вот моему ограниченному подмножеству, например, где самое сложное — это flatMap.


          1. aborouhin
            07.04.2023 13:24
            +2

            Я не так давно на Скалу, с которой сам давно балуюсь понемногу, смотрел именно как на язык общего назначения, написать бэкенд очередной. Но столкнулся с тем, что даже в попытке начать набрасывать прототип быстро понял, что со Скалой 3 пока без костылей и компромиссов не взлететь, а начинать с нуля со старой версией языка не хочется.

            Ну ок, написал бы я сам что-то, наверное даже не без удовольствия. А дальше? Найти фрилансера на конкретные проектные задачи или в перспективе программиста на постоянный контракт будет непросто. Нафига скалисту стартап с криво набросанным прототипом, для них именно что "задачи не понравились, пошёл я в большой финтех / ML" - нормальное позиционирование с учётом текущего состояния рынка.

            В общем, вот в процессе этих размышлений та самая статья De Goes мне очень зашла.


            1. sshikov
              07.04.2023 13:24

              ну не знаю. у нас версия определяется спарком, и она 2.12. И мы не паримся по этому поводу :) В смысле — так тоже было можно.


              задачи не понравились, пошёл я в большой финтех / ML
              Да, именно так это и выглядит. Скажем, у нас проект уже легаси (ему лет 5 примерно), куча поддержки, но и куча сложных технических задач. Но это не модные задачи, ML нет, мозги поломать есть над чем — но похвастаться этим можно только таким же, большинство не оценит скорее всего.


          1. thevlad
            07.04.2023 13:24
            +1

            Jupyter и python, по моему опыту это в основном инструмент исследования, когда надо быстро и удобно, и до 80% написанного кода пойдет в ведро. Внедрение это отдельный вопрос.


            1. sshikov
              07.04.2023 13:24

              Естественно. Юпитер в особенности — если питон еще можно было переделать в PySpark, то юпитер конечно выкидывался. А теперь просто люди пришли к выводу, что проще сразу и писать на целевом языке. Может это вообще ни о чем не говорит — но факты такие есть.


  1. odisseylm
    07.04.2023 13:24

    Scala 3 поддерживается Идеей не очень - поиск extension-functions не работает, @targetName не поддерживается.

    Это я просто ковырялся пару месяцев в скале.

    На scala 3 переход идёт так себе, если вообще идёт (а ей уже не меньше 5 лет).

    Зоопарк библиотек..., что новичку и не понятно за что хвататься - с джавой проще => java + spring + database.


    1. sshikov
      07.04.2023 13:24

      Ну, строго говоря, если у вас задачи поработать с базой — то Spring Jdbc и скала вполне себе живут вместе. То есть, обычный Java набор подходит из коробки.


      А если задачи посложнее, то тут и на Java повозиться придется, прежде чем выберешь лучшее.


  1. ivankudryavtsev
    07.04.2023 13:24
    +4

    Потребность в разработчиках COBOL как никогда высока. Аналогично Perl. Имхо, Scala не набрала динамику, о чем говорит даже то, что даже Lightbend отполз от Scala к Java.

    Конечно, ниша есть, но неужели Вы думаете, что в Spark на Java, Kotlin нельзя? Да и Python для Spark почти first class citizen.

    Да и Twitter, в прошлом очень активный участник мира Scala, отполз от нее.

    А, это перевод... одни переводы в последнее время, грустинка...


    1. thevlad
      07.04.2023 13:24
      +2

      По моим ощущениям Scala была лучшей попыткой из всей функциональщины.


      1. ivankudryavtsev
        07.04.2023 13:24
        +3

        А как же lisp, haskel, erlang? По мне, Scala смесь ежа с ужом и ощущение, что ты все время нарушаешь закон, что у тебя синдром самозванца из-за недостаточного scala-way или когда ты не можешь понять код очередного "гения", который писал для себя, а не для других. Я такое еще в Perl помню, ощущение исключительности и элитарности, когда ты пол языка перегрузил, препроцессор добавил и херачишь SQL прям посреди хрен-знает чего, отдаленно напоминающего Perl. Отстойно все это, на самом деле. Из-за этого люди на Java, Python, Golang молятся. Может быть это и не языки для гениев, но каждый может понять замысел автора.


        1. thevlad
          07.04.2023 13:24
          +1

          Имелось ввиду насколько язык прижился в промышленной разработке. На scala в среднем на порядок больше вакансий. Эрланг тоже встречается, но у него довольно узкая ниша.


  1. LedIndicator
    07.04.2023 13:24
    +1

    Люблю Scala! Один из самых недооцененных языков, как по мне.
    Забавно наблюдать, как в Джаву постепенно перетаскивают фичи из Скалы, которые там уже лет двадцать, а джава-разработчики такие: "Ух ты, паттерн-матчинг! Ни фига себе, запечатанные классы!".
    А ты только печально улыбаешься. Да, дети мои, так можно было.
    Ждём в Джаве каррирования и частичного применения функций.


    1. ris58h
      07.04.2023 13:24
      +2

      Наглядное подтверждение "мифов" про сообщество.


    1. kacetal
      07.04.2023 13:24
      +1

      фичи из Скалы

      Ну конечно из Скалы, ведь больше таких фичей нигде нет.


  1. Stas911
    07.04.2023 13:24
    +2

    Не скажу, что прям хорошо знаю, но пришлось пользоваться как-то несколько месяцев на одной из работ (даже была сертификация от Lightband как-то). Имхо, если пользоваться всеми плюсами языка по полной, то получается весьма нетривиальный код, который потом сложно читать и поддерживать. А если нет - то проще Java пользоваться и не плодить сущностей без надобности. Вот для Spark - ничего против не имею, весьма удобно под него на Scala писать, но это все же не general-purpose программирование.

    Ну и про сообщество - может это только мне так повезло, но более заносчивых, чванливых и токсичных коллег, чем те скалисты, что у нас работали, я ни до ни после не встречал. Хотя судя по тому, что этот пункт отдельно отмечен в статье - проблема не единична.