Продолжаем серию статей об особенностях, применении, плюсах и минусах языков, которые используются в «Криптоните». Опытом разработки на Scala поделится Олег Булатов, старший программист направления серверной разработки.

1. Особенности

У Scala полно «экзотических» особенностей. Сначала обучаться этому языку и вырабатывать навыки в программировании на нём довольно непросто. В Scala есть смысл вкладываться с расчётом на долгосрочную перспективу: если вы освоили этот язык, то будете легко разбираться в сложных проектах (чего не скажешь, например, о Java). Плюс, если вы делаете проект, который можно сделать на Java или Scala — лучше выбирать Scala, так как его инструментарий намного интереснее.

Конечно, Scala можно использовать исключительно в рамках парадигмы ООП (объектно-ориентированного программирования), однако если вас интересует и функциональное программирование, Scala выступит «трамплином» и даст возможность вырасти от нуля до профи.

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

Разработчики языка выделяют универсализм Scala за счёт своей экосистемы. Например, его можно запускать на разных платформах за счёт использования JVM или в браузерах с помощью компиляции в JavaScript. На данный момент доступна даже компиляция в нативные приложения при помощи Scala Native.

2. Где используется

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

Первый проект, который я делал на Scala — это чат-сервер. Его особенность — возможность обмениваться сообщениями между разными социальными сетями (ВКонтакте, Одноклассники и т.д.) с помощью официального API. Этот продукт затем использовался в контакт-центрах для обслуживания клиентов банков и интернет-провайдеров. Для удобства им нужен был такой чат-сервер, где были собраны все сообщения одного клиента, отправленные через мессенджер или социальные сети.

В «Криптоните» я занимаюсь конструктором запросов для анализа большого количества данных. У нас в компании все продукты разрабатываются в рамках единой экосистемы, поэтому необходим сервис, который может их связывать. Конечная цель этого сервиса — возможность выстраивать компоненты для анализа различного типа данных (текст, изображение, аудио) в единую цепочку для их обработки. Коллеги из лаборатории больших данных и статистики приносят нам готовые ML-модели, а мы пишем на Scala сервис для конструктора запросов, который склеивает всё это в единый продукт.

3. Плюсы и минусы

Scala играет на одной площадке с Java, поэтому легче всего перечислить плюсы и минусы относительно него.

Плюсы:

1. Scala можно использовать вместо Java, например, если в legacy project библиотека написана на Java.

2. Легче разобраться в сложном коде, написанном на Scala, чем на Java. Элементы функционального программирования позволяют писать модульные программы, которые легко компонуются друг с другом. Таким образом можно писать программу по кусочкам и избегать определённого класса ошибок.

3. Scala community призывает изучать эффективные практики для разработки программного продукта. Достаточно прочитать несколько статей, чтобы узнать, как тот или иной функционал делается проще, современнее и полезнее. Это ценно для разработчиков и при желании позволяет многому научиться. Например, разобраться, как устроен веб-сервер или библиотека для сериализации и десериализации данных.

4. На Scala, в силу возраста, меньшее количество legacy projects. Например, на Java есть проекты, которые давно работают в продуктовых системах. Но разработка для них уже не ведётся, осуществляется только поддержка: оптимизация и поиск багов. На Scala же сейчас активно развиваются новые проекты.

Минусы:

1. На данный моменты на Scala в основном пишут программы, если собираются запускать их на JVM, доля Scala.js и Scala Native очень невелика. В результате возникает ограничение: Scala можно использовать только там, где можно использовать Java.

2. Многие не спешат переходить с Java на Scala.

Первый предполагает стабильность. На Java уже написано столько legacy software, что работы по его поддержке хватит на десятилетия.

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

4. Комьюнити

Среди Scala community слежу только за англоязычным. Scala Official Discord Server посвящён языку и компилятору Scala.

Также там можно найти сообщества, которые посвящены отдельным Scala-продуктам. Например, Typelevel Discord Server посвящён популярным библиотекам cats, fs2 для функционального программирования на Scala.

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

5. Обучение

Сложность Scala лучше оценивать относительно других языков:

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

  • Scala сложнее Javascript и Python.

  • Scala точно проще C/C++ или Rust. Но и применяются Scala с одной и Rust/C++ с другой стороны для решения существенно разных задач.

Кстати, в нашем телеграм-канале есть подборка ресурсов от наших «скалистов» для самостоятельной прокачки. Там есть рекомендации по книгам, подкастам, курсам, СМИ и комьюнити.

6. Open source-проекты на Scala

На Scala есть много проектов с открытым исходным кодом, таких как «Lila» (онлайн-игра в шахматы) или «BigBlueButton» (сервис для проведения онлайн-уроков).

«BigBlueButton» интересен тем, что используется для практических целей, и поэтому он получил поддержку от Министерства образования Франции.

Все эти проекты размещены на GitHub.

[1] https://github.com/lichess-org/lila

[2] https://github.com/bigbluebutton/bigbluebutton  

[3] https://bigbluebutton.org/2023/01/11/french-ministry-of-education-chooses-bigbluebutton/

Приглашаем на митап для Scala-разработчиков 20 апреля, Москва+онлайн. Вместе с экспертами «Криптонита» и Scala-комьюнити поговорим о том, что такое эффекты и трамплины и зачем их использовать, разберём новые средства декомпозиции в Scala 3, рассмотрим построение SICK — надмножества JSON, и, конечно, выпьем кофе и пообщаемся в неформальной обстановке.

Зарегистрироваться на митап и получить ссылку на трансляцию можно здесь.

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


  1. maxzh83
    10.04.2023 08:40

    2. Легче разобраться в сложном коде, написанном на Scala, чем на Java

    Ага, смотришь на такой код и все сразу предельно понятно:

    implicit val option: Traverse[Option] with MonadPlus[Option] = new Traverse[Option] with MonadPlus[Option] {
        def point[A](a: => A) = Some(a)
        def bind[A, B](fa: Option[A])(f: A => Option[B]): Option[B] = fa flatMap f
        override def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa map f
        def traverseImpl[F[_], A, B](fa: Option[A])(f: A => F[B])(implicit F: Applicative[F]) =
          fa map (a => F.map(f(a))(Some(_): Option[B])) getOrElse F.point(None)
        def empty[A]: Option[A] = None
        def plus[A](a: Option[A], b: => Option[A]) = a orElse b
        def foldR[A, B](fa: Option[A], z: B)(f: (A) => (=> B) => B): B = fa match {
          case Some(a) => f(a)(z)
          case None => z
        }
      }

    Это, если что, пример из scalaz


    1. andreyds95
      10.04.2023 08:40
      +1

      Ну, ты сразу за больное. Даже создатели при переходе со Scala 2 на Scala 3 признали, что с implicit они перемудрили ????

      А тут в примере имплиситная монада, видимо, чтобы мозг окончательно взорвался. Вообще в этом примере почти все перемудрёные штуки собрались. Тут тебе и возможность писать методы с условно динамической типизацией, и монады (прикол чисто функциональных языков, в Scala перекочевало из Haskell), и implicit (что они употребляли, когда это придумывали?), и pattern matching, и даже смесь инфиксной и постфиксной нотации.


      1. maxzh83
        10.04.2023 08:40
        +1

        Ну, ты сразу за больное.

        Я просто когда прочитал, что разобраться в сложном коде на Scala легче чем на Java, я аж поперхнулся. При том, что у Scala очень много других плюсов.