Как перейти с Java на Scala
Вместе с разработчиками компании «Криптонит» составили дорожную карту по изучению Scala для Java-разработчиков.
5К открытий6К показов
Scala — редкий, местами сложный в освоении и вместе с тем высокооплачиваемый язык программирования. Он полностью совместим с Java и работает на той же виртуальной машине. Поэтому, имея опыт разработки на Java, стать «скалистом» будет проще.
Вместе с разработчиками технологической и научно-исследовательской компании «Криптонит» мы составили дорожную карту по изучению Scala. Этот роадмап подойдёт Java-разработчикам, которые хотят освоить больше связанных технологий.
- Зачем переходить на Scala
- Задачи и возможности Scala
- Чем занимается Scala-программист
- Общие инструменты
- Полезные материалы для изучения 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:
Основные фреймворки и библиотеки для тестирования:
- 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.
Книги:
Курсы и упражнения:
- Специализация Functional Programming in Scala
- Scala on Exercism
- Effective Programming in Scala
- Онлайн-книги с упражнениями от Underscore
Работа для Scala-программистов
Если вы готовы перейти с Java на Scala, держите подборку вакансий в «Криптоните». Компания занимается разработкой платформы частного облака с ML-технологиями для аналитики и бизнес-решений. Основной стек технологий компании: Scala, Typescript, Rust, Python, K8S, Spark, Kafka, ClickHouse, Scylla, Postgres, Vue.
Прямо сейчас «Криптонит» ищет:
Переходите по ссылке и станьте частью команды!
Реклама АО «Научно-производственная компания «Криптонит» LjN8KWavY
5К открытий6К показов