Написать пост

Как перейти с Java на Scala

Логотип компании Криптонит

Вместе с разработчиками компании «Криптонит» составили дорожную карту по изучению Scala для Java-разработчиков.

Обложка поста Как перейти с Java на Scala

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

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

  1. Зачем переходить на Scala
  2. Задачи и возможности Scala
  3. Чем занимается Scala-программист
  4. Общие инструменты
  5. Полезные материалы для изучения Scala

 

Зачем переходить на Scala

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

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

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

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

Задачи и возможности Scala

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

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

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

Безопасность типов. Scala имеет более строгую систему типов, чем Java, что позволяет предотвращать ошибки на этапе компиляции, а не на этапе выполнения.

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

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

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

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

А ещё Scala — один из самых динамично развивающихся языков и постоянно внедряет новые возможности. Сейчас активно развивается следующая итерация языка — Scala 3. В ней переработали компилятор, что улучшило автоматический вывод типов и снизило многословность кода. Одновременно с этим вышел из экспериментального статуса механизм макросов, который расширил возможности автоматической генерации кода.

Чем занимается Scala-программист

Согласно исследованию Stack Overflow, доля Scala-разработчиков среди профессиональных программистов — около 3%. И компании активно ищут таких специалистов: в марте 2023 года только на карьерной площадке Linkedin размещено почти 34 тысячи соответствующих вакансий.

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

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

До того, как стал писать на Scala коммерческие проекты, я уже знал Java, JavaScript и C. Примерно в 2012 году стали много говорить о том, что Java скоро умрёт и будут новые языки. Scala назывался как один из них, и я решил попробовать. Оказалось, это интереснее, чем писать на Java. Однако у «скалистов» более высокий порог входа. Чтобы начать писать на этом языке, нужно чуть больше знаний, чем для программирования на Java. На Scala я пишу почти 10 лет. Сначала делал небольшие программы для себя. Они выполняли какие-то рутинные действия, помогая мне в основной работе. Например, я сделал редактор protobuf’а (формата сериализации структурированных данных Protocol Buffers, который по сравнению с XML обеспечивает более компактное хранение и повышает скорость обработки данных). Особенно понравилось, что в среде разработки Scala есть консоль (среда программирования REPL с интерфейсом командной строки). В ней можно писать код в интерактивном режиме и тут же его выполнять. В «Криптоните» я занимаюсь бэкендом для клиента интеллектуальной системы транскрибации голоса. Это очень перспективная тема, и её интересно реализовать на Scala. Ещё я сейчас работаю над сервисами для платформы обработки больших данных. Я выполнил оптимизацию кода и потребления вычислительных ресурсов, используя принцип разделения функционала. Получились отдельные лёгкие микросервисы.

Кроме backend-разработки, у Scala-программистов есть карьерные перспективы в обработке данных. Это направление требует широкого кругозора и понимания того, по каким принципам строятся распределённые системы. Также для работы понадобятся сильные технические навыки, знание тонкостей работы платформы JVM и облачной инфраструктуры.

Впервые о языке Scala я узнал в 2015 году. Я уже знал Java, а также успел поучаствовать на проектах с Python, Ruby и немного — с JavaScript. Мой первый проект на Scala был связан с обработкой результатов тестов в генетической лаборатории. Он состоял из двух отдельных частей: ETL (извлечение, преобразование и загрузка) огромного потока данных и backend для отображения статистики. В «Криптоните» я занимаюсь разработкой ПО для наших заказчиков: поиском и обработкой больших массивов данных, транскрибацией голосовых сообщений, а также участвую в разработке внутренних проектов — например, сервисом доступа и хранения данных.

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

Scala-программисты описывают алгоритмы приведения неструктурированных данных к структурированным, находят зависимости и противоречия. Например, в «Криптоните» разрабатывают аналитические системы на базе единой платформы, которые позволяют безопасно работать с данными независимо от их формата, метода хранения и эксплуатации. Сейчас компания ищет тимлида на этот проект.

По образованию я физик. В университете для научной работы использовал Си и MatLab. Затем на работе нужно было использовать OpenText (OScript) и писать на JavaScript, а для хобби-проектов использовал Java. Программировать на Scala предложили на собеседовании, так как вся команда писала на этом языке. Моей первой задачей, реализованной на Scala, было написание коннектора к чат-серверу. В нём использовался публичный API социальной сети «Одноклассники», чтобы передавать сообщения к чат-серверу и обратно. Требования были такими: максимально быстрая передача сообщений, возможность для масштабирования и отказоустойчивость. В итоге коннектор был реализован мной с использованием набора библиотек Akka для разработки распределённых приложений и параллельных вычислений. В «Криптоните» я занимаюсь конструктором запросов для анализа большого количества данных. У нас в компании все продукты разрабатываются в рамках единой экосистемы, поэтому необходим сервис, который может их связывать. Конечная цель этого сервиса — возможность выстраивать компоненты для анализа различного типа данных (текст, изображение, аудио) в единую цепочку для их обработки. Коллеги из лаборатории больших данных и статистики приносят нам готовые ML-модели, а мы пишем на Scala сервис для конструктора запросов, который склеивает всё это в единый продукт.

Общие инструменты

Напомним, что Scala-разработчику доступны все JVM-библиотеки, написанные на Java, Kotlin и других. Поэтому в статье разберём только те инструменты, которые написаны на Scala или имеющие соответствующий API.

Основы языка

Изучение Scala с нуля стоит начать со стандартной библиотеки языка. Она сочетает в себе изменяемые и неизменяемые структуры данных, а предоставляемые ей интерфейсы используются во всех сторонних библиотеках.

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

Компиляция проектов

Несмотря на возможность сборки Scala-проектов с помощью gradle и maven, рекомендуем освоить работу Scala Build Tool. С помощью этого инструмента можно настраивать параметры компиляции проектов: выставлять необходимые флаги компилятора языка, разбивать проект на подмодули, осуществлять кросс-компиляцию с разными версиями библиотек и даже самого языка Scala.

Плагины компилятора

Scala позволяет не только гибко изменять и комбинировать программы, но и модифицировать этап компиляции проектов при помощи API для создания плагинов.

Предназначение плагинов компилятора может быть крайне разным. Например, плагины WartRemover и Scapegoat предоставляют инструменты для статического анализа кода, better-tostring изменяет поведение генерируемых по умолчанию функций, а Scala.js и Scala Native позволяют компилировать Scala-код для платформ, отличных от JVM.

Работа с консолью

Взаимодействовать со Scala-проектами можно не только путём их компиляции и последующего запуска, но и в интерактивном режиме при помощи Scala REPL. Эта консольная оболочка позволяет выполнять команды пользователя построчно. Использовать Scala REPL можно и на основе полноценных компилируемых проектов, и для интерпретации отдельных файлов.

Для работы с консолью также подходит Ammonite REPL. Это сторонний инструмент с бо́льшим числом возможностей по сравнению с оболочкой по умолчанию. Среди них — подсветка синтаксиса и динамическое подключение зависимостей.

Сериализация данных

Библиотеки для сериализации и десериализации данных применяются при синхронном взаимодействии сервисов с помощью API, при асинхронном взаимодействии с использованием очередей сообщений и при записи в файл или хранилище данных.

Хотя самый популярный формат сообщений для межсервисного взаимодействия — JSON, также активно используются Parquet, protobuf, Avro и CSV. Собрали наиболее крупные библиотеки для работы с этими форматами на Scala:

  • avro4s — библиотека для взаимодействия с форматом Avro;
  • ScalaPB — библиотека для генерации protobuf-сообщений;
  • parquet4s — библиотека для работы с форматом Parquet;
  • circe — одна из самых популярных библиотек для работы с JSON в функциональном стиле;
  • uJson — минималистичная библиотека для работы с JSON;
  • json4s — корневая библиотека, предоставляющая интерфейсы для работы с различными JSON-парсерами и сериализаторами.

Тестирование

Библиотеки для тестирования фокусируются на читаемости тестов и имеют синтаксис, близкий к обычному английскому языку.

Пример теста, написанного при помощи scalatest:

			class ExampleSpec extends AnyFlatSpec with should.Matchers {

  "A Stack" should "pop values in last-in-first-out order" in {
    val stack = new Stack%save-sc6%
    stack.push(1)
    stack.push(2)
    stack.pop() should be (2)
    stack.pop() should be (1)
  }

  it should "throw NoSuchElementException if an empty stack is popped" in {
    val emptyStack = new Stack%save-sc7%
    a %save-sc8% should be thrownBy {
      emptyStack.pop()
    } 
  }
}
		

Основные фреймворки и библиотеки для тестирования:

  • scalatest — фреймворк для тестирования кода, позволяющий гибко выбирать синтаксис написания тестов;
  • specs2 — альтернатива scalatest с фокусом на behavior-driven тестах;
  • scalacheck — обособленная библиотека тестирования кода путём случайной генерации входных данных. Имеет интеграции с основными фреймворками для тестирования;
  • munit — библиотека для тестирования с акцентом на читаемости ошибок в тестах;
  • uTest — минималистичная библиотека для тестирования.
  • weaver test — библиотека для тестирования с использованием cats-effect.

Логирование и конфигурация

Конфигурация проектов в Scala зачастую осуществляется на основе файла application.conf, аналогично языку Java. Наиболее популярный формат конфигурации — HOCON. Он позволяет использовать переменные окружения и ссылки на другие элементы конфигурации при её описании. Для чтения конфигурации используют эти библиотеки:

  • lightbend/config — библиотека без сторонних зависимостей, реализованная на языке Java;
  • pureconfig — Scala-библиотека с возможностью автоматической конвертации конфигурации в классы приложения.

Библиотеки для логирования в основном базируются на Java-интерфейсах. Выбирать библиотеку стоит исходя из совместимости с фреймворком и уменьшения числа зависимостей, используемых в проекте. Основные библиотеки:

  • scala-logging — высокопроизводительная библиотека-обёртка над slf4j интерфейсами;
  • log4cats — библиотека для логирования в функциональном стиле с интеграцией с cats-effec;
  • LogStage — оптимизированная библиотека для структурного логирования.

Полезные материалы для изучения Scala

Чтобы обучение языку Scala было максимально эффективным, следует запастись полезными ресурсами.

Списки Scala-библиотек:

Telegram-каналы:

  • Scala User Group — крупнейший русскоязычный чат для обсуждения языка Scala.
  • Scala Learning & Education: Ask for Review & Noob questions — чат для начинающих изучать Scala.
  • Scala Nishtyaki Channel — канал от создателей сообщества Scala_ru с публикациями статей, докладов и новостей из мира функционального программирования и Scala.

Книги:

Мартин Одерски, Лекс Спун, Билл Веннерс «Scala. Профессиональное программирование»

Мартин Одерски, Лекс Спун, Билл Веннерс «Scala. Профессиональное программирование»

Chiusano Paul, Bjarnason Runar «Functional Programming in Scala, 2nd Edition»

Chiusano Paul, Bjarnason Runar «Functional Programming in Scala, 2nd Edition»

Haoyi Li «Hands-on Scala Programming: Learn Scala in a Practical, Project-Based Way»

Haoyi Li «Hands-on Scala Programming: Learn Scala in a Practical, Project-Based Way»

Alvin Alexander «Scala Cookbook»

Alvin Alexander «Scala Cookbook»

Курсы и упражнения:

Работа для Scala-программистов

Если вы готовы перейти с Java на Scala, держите подборку вакансий в «Криптоните». Компания занимается разработкой платформы частного облака с ML-технологиями для аналитики и бизнес-решений. Основной стек технологий компании: Scala, Typescript, Rust, Python, K8S, Spark, Kafka, ClickHouse, Scylla, Postgres, Vue.

Прямо сейчас «Криптонит» ищет:

Переходите по ссылке и станьте частью команды!

Реклама АО «Научно-производственная компания «Криптонит» LjN8KWavY

Следите за новыми постами
Следите за новыми постами по любимым темам
4К открытий5К показов