Чем занимается разработчик Scala?
Разработчик Scala является экспертом в объектно-ориентированном языке программирования высокого уровня.
Они проектируют, разрабатывают и тестируют технические решения и компоненты для организаций и создают корпоративные приложения в облаке.
Что такое Scala и для чего он нужен?
Scala — это функциональный объектно-ориентированный язык программирования, который отличается компактным и лаконичным стилем программирования. Scala работает на виртуальной машине Java (JVM) и особенно подходит для разработки сложных приложений.
По сравнению с Java Scala требует меньше строк кода, более безопасен по типам, поддерживает функциональное программирование (FP) и в то же время превосходит Java с точки зрения ООП.
Унаследованный от SCAlable LAnguage (масштабируемый язык), Scala подходит для всех измерений приложений: от небольших интерпретируемых сценариев до распределенных корпоративных приложений и реализаций промежуточного ПО.
Scala поддерживает несколько библиотек и API и, как следует из названия, является масштабируемым языком. Он также может поддерживать несколько языковых конструкций и может поддерживать функции высокого порядка.
Обязанности разработчика Scala
Основная ответственность разработчика Scala — проектировать, разрабатывать и поддерживать приложения с использованием Scala. Они также участвуют в любых архитектурных разработках, связанных с приложением.
Разработчики Scala пишут код в соответствии со спецификациями приложений, проводят анализ программного обеспечения и работают в составе группы разработки программного обеспечения, чтобы гарантировать, что дизайн приложений соответствует спецификациям.
Они также отвечают за тестирование и отладку приложений, а также рекомендуют любые изменения, которые необходимо внести для улучшения процессов и инфраструктуры приложений.
Разработчики Scala эффективно взаимодействуют между командами, вносят свой вклад в повышение производительности команды и документируют весь процесс разработки — от стадии концепции до конечного результата.
- Проектирование, разработка и сопровождение приложений с использованием Scala
- Отвечают за любые архитектурные разработки, относящиеся к приложению
- Пишут код в соответствии со спецификацией приложения
- Проводят анализ программного обеспечения
- Работают в команде разработчиков программного обеспечения, чтобы убедиться, что приложение соответствует спецификациям.
- Занимаются тестированием и отладкой приложений
- Рекомендуют любые улучшения в процессах и инфраструктуре приложений.
- Эффективно сотрудничают между командами
- Повышают производительность команды
- Участвуют в создании процесса разработки документов
Они должны обладать сильными техническими навыками и хорошо разбираться в концепциях и шаблонах объектно-ориентированного программирования (ООП). Базовые знания Spark, Hadoop и MapReduce также являются важным требованием.
Разработчики Scala должны иметь опыт работы с архитектурой ETL, а также с общедоступными облачными платформами, такими как AWS. Они также должны хорошо разбираться в методологиях разработки программного обеспечения.
Помимо всех упомянутых выше навыков, разработчики Scala также должны обладать хорошими коммуникативными и аналитическими навыками. Они также должны уметь излагать информацию кратко и ясно.
- Знание Scala
- Знание других объектно-ориентированных языков программирования, таких как Java и Python.
- Опыт создания программных решений
- Сильные технические навыки
- Знание концепций и шаблонов объектно-ориентированного программирования
- Базовые знания Spark, Hadoop и MapReduce
- Опыт работы с ETL-архитектурой
- Опыт работы с облачными платформами, такими как AWS
- Твердое понимание методологий разработки программного обеспечения
- Сильные коммуникативные навыки
- Умение излагать информацию кратко и ясно
- Сильные аналитические способности
HR Блог для IT рекрутера в Телеграм
Хочешь всегда получать новые статьи, бесплатные материалы и полезные HR лайфхаки! Подписывайся на нас в Telegram! С нами подбор ит персонала становится проще 😉
Введение
Здесь вы увидите вводное описание наиболее часто используемых возможностей Scala. Этот обзор предназначен для новичков в изучении языка.
Это лишь небольшая экскурсия, а не полный курс освоения языка. Для глубокого погружения рекомендуем почитать книги или воспользоваться курсами на других ресурсах.
Что такое Scala?
Scala — это современный мультипарадигмальный язык программирования, разработанный для выражения общих концепций программирования в простой, удобной и типобезопасной манере. Элегантно объединяя особенности объектно-ориентированных и функциональных языков.
Scala объектно ориентированный
Scala — это чистый объектно-ориентированный язык в том смысле, что каждое значение — это объект. Типы и поведение объектов описаны в классах и трейтах(характеристиках объектов). Классы расширяются за счет механизма наследования и гибкого смешивания классов, который используется для замены множественного наследования.
Scala функциональный
Scala также является функциональным языком в том смысле, что каждая функция — это значение. Scala предоставляет легкий синтаксис для определения анонимных функций, поддерживает функции высшего порядка, поддерживает вложенные функции, а также каррирование. Scala имеют встроенную поддержку алгебраических типов данных, которые используются в большинстве функциональных языках программирования (эта поддержка базируется на механизме сопоставления с примером, где в качестве примера выступают классы образцы ). Объекты предоставляют удобный способ группировки функций, не входящих в класс.
Вдобавок к этому, концепция сопоставления с примером логично переносится на обработку XML-данных используя в качестве примера регулярные выражения, при поддержке функционала объектов экстракторов. Для еще большего удобства обработки данных представлена схема формирования запросов с использованием for-выражения. Такие возможности делают Scala идеальным решением для разработки приложений по типу веб-сервисов.
Scala статически типизированный
Scala оснащен выразительной системой типов, которая обеспечивает безопасное и гармоничное использование абстракций. В частности, система типов поддерживает:
- обобщенные классы
- вариантность типов
- верхние и нижние границы типов
- внутренние классы и члены абстрактного типа, как часть объектов
- составные типы
- самоописываемые типы
- неявные параметры и неявные преобразования
- полиморфные методы
Выведение типов означает, что разработчику не обязательно добавлять в код избыточную информацию о типах. Такой функционал обеспечивает основу для безопасного переиспользования абстракций и типобезопасного развития программного обеспечения.
Scala расширяемый
Зачастую разработка приложений для очень специфичных областей требует специфичных для этих областей языковых возможностей, либо отдельных специализированных языков программирования. Вместо этого Scala предлагает уникальные механизмы, для легкой модификации и расширения самого языка.
Во многих случаях такое можно сделать без использования средств мета-программирования, таких как макросы. Например:
- Неявные классы позволяют добавлять новые методы к уже существующим.
- Интерполяция строк позволяет добавлять обработку строк (расширяется разработчиком с помощью интерполяторов).
Scala совместимый
Scala полностью совместим с популярной средой Java Runtime Environment (JRE). Взаимодействие с основным объектно-ориентированным языком программирования Java происходит максимально гладко. Новые функции Java, такие как SAM, лямбды, аннотации и дженерики, имеют прямые аналоги в Scala.
Те функции Scala, которые не имеют аналогов в Java, такие как параметры по умолчанию и именованные параметры, компилируются как можно ближе к Java. Scala имеет такую же компиляционную модель (отдельная компиляция, динамическая загрузка классов), как у Java, что позволяет получить доступ к тысячам уже существующих высококачественных библиотек.
Наслаждайтесь туром!
Для продолжения знакомства предлагаю перейти на следующую страницу нашего тура.
Scala как первый язык
Эта статья, как и мой предыдущий пост, не похожа на то, что обычно публикуют на Хабре. Здесь не объясняется никаких новых или старых концепций, я не рассказываю что такое ООП и функциональное программирование, сложного кода почти нет. Я хочу пригласить вас к дискуссии стоит ли начинать программировать с языка Scala.
Меня иногда просят научить программированию или помочь с поиском подходящего курса. Я хорошо понимаю недостатки и сложности со скалой, но думаю, что Scala 3 — подходящий язык, для того чтобы начать обучение с него, если правильно составить курс. Вся языковая мощь и сложность, конечно, не нужны начинающему программисту, но ему и незачем о них знать. На скале можно писать вполне простой и понятный код, постепенно наращивая инструментарий.
Я согласен с теми комментаторами, кто считает что для этого нужен толковый преподаватель. Это безусловно. Или талантливый преподаватель, который разбирается в предмете, или хорошая книжка, или толковый курс просто необходимы. Иначе есть риск захлебнуться, так и не научившись плавать.
И тем не менее я считаю, что Scala — это язык будущего.
Если коротко, то Scala — это возможность научиться функциональному программированию на безопасном языке, у которого есть большое будущее
Умный компилятор
У скалы один из самых умных и сложных компиляторов. Это приводит к медленным билдам (особенно в первых версиях языка), и за это скалу хейтят. Но зато мы можем отдать компилятору очень много работы по анализу кода, проверке его на безопасность и отсутствие ошибок, что очень важно для программиста. Эта сложность — на стороне разработчика, в том числе и начинающего, которому компилятор очень помогает и облегчает работу.
Скала — это единственный язык, где я пишу код, и он сразу работает без утомительной отладки. Конечно, так происходит не всегда, но с джавой, джаваскриптом, си, паскалем и бейсиком так не происходило никогда. Я люблю говорить, что джава — это язык для компилятора, а скала — это язык для программиста.
JVM-экосистема
Как известно, Джеймс Гослинг, создатель языка джава, считает самой лучшей ее частью джава-машину. Действительно, много инженеров потратило десятки человеко-лет на разработку виртуальной машины и достигли скоростей, в некоторых случаях превышающих Си++. Вот исследование производительности JVM в мобильных устройствах, в нем чаще побеждает нативный код на Си, но в одном случае победила JVM: Java vs C app performance.
Java Memory Model (Модель памяти для многопоточных вычислений) — это зрелая, непротиворечивая, проверенная многими годами промышленного программирования парадигма, которая при правильном использовании гарантирует достаточный уровень абстракции и безопасности. Благодаря этому возможны удобные конструкции для параллельного программирования, доступные даже начинающим.
Кроме того, на джаве написаны миллионы строк кода, которые вы можете использовать из скалы или без проблем в нее транслировать.
Кстати, Джеймсу Гослингу скала тоже нравится.
Но в этом всем есть и минусы. Как мы знаем, высокоуровневые абстракции протекают, и для того чтобы программировать на скале, важно знать как устроена виртуальная машина джава, и учитывать ее особенности. Например, такие как Type Erasure. Это довольно серьезный минус, но плюсы от использования JVM его перевешивают.
Эволюция vs революция
В экосистеме скалы приняты довольно слабые гарантии обратной совместимости по сравнению с джавой. С одной стороны, это приводит к тому, что разработчикам постоянно приходится поддерживать свой код в форме при переходе на новую версию языка или библиотек. Кроме того, разработчикам библиотек приходится прибегать к кросс-компиляции для того чтобы обеспечить несколько версий скомпилированных библиотек, подходящих для нескольких версий языка. Это, безусловно, минус.
Но с другой стороны такой подход обеспечивает быстрое и динамичное развитие языка, которое не может себе позволить джава. Именно поэтому я думаю что будущее — за скалой.
К тому же, в Scala 3 появилось типизированное абстрактное синтаксическое дерево компилятора TASTY, которое позволит взаимодействовать классам, собранным разными версиями компилятора. Разумеется, начинающим программистам нет нужды разбираться в этом.
Scala 3
Благодаря более слабым гарантиям обратной совместимости, разработчики языка получили возможность пересмотреть его основы, включая синтаксис.
Первоначальным посылом к созданию скалы было сделать язык промышленного уровня, на котором будет приятно программировать. Это действительно был большой шаг вперед.
Но некоторые решения, принятые более 15 лет назад, были неверными и приводили к неочевидному, либо многословному коду. И сейчас создатели языка делают его действительно лучше. После этих изменений шансы скалы в качестве первого языка программирования заметно вырастают.
Я уже пару лет с нетерпением жду его выхода и мечтаю начать писать на нём. Вот сжатый рассказ Мартина Одерски про новую версию языка: Countdown to Scala 3 by Martin Odersky. Для опытных разработчиков — интересная статья Annoying things in Scala 2 that’ll be (mostly) gone in Scala 3
DOT
Dependent Object Types — это теоретические основы языка Scala 3, разработанные его основателем Мартином Одерски. Мало какой язык может похвастать математически точным исчислением, лежащем в его основе.
Согласитесь, приятно учить язык с таким бэкграундом, хотя начинающим программистам знать о нём не обязательно.
Выразительность и лаконичность
То, что я больше всего люблю в языке — это его сжатость и лаконичность. Я ненавижу длиннейшие конструкции джавы, в которых приходится сложно и многословно объяснять компилятору простые вещи. Моя любимая шутка про джаву — что это такой язык, в котором уан-лайнер занимает около 30 строк. Так вот, в скале уан-лайнер — это уан-лайнер.
Я думаю, что это качество важно не только для опытных разработчиков, но и для тех кто только изучает язык. Думаю, выразительность — это та причина, по которой так популярны динамические и скриптовые языки. Уверен, скала способна с ними в этом поспорить. И даже сама послужить отличным скриптовым языком.
Конечно, лаконичность не должна наносить ущерб читаемости кода. Таких неудачных примеров в программировании полно, вспомним регулярные выражения, паттерн-матчинг и парсер-комбинаторы. Понятно, что для написания библиотек важно понимать сложные концепции и знать много умных слов. Но для того, чтобы ими пользоваться и писать простой код, всего этого знать не надо. Минимальный уровень скалы, который подойдет начинающим, очень простой.
Вот мой любимый пример для библиотечного кода на скале. Конечно, он не предназначен для начинающих разработчиков:
class Stack[+A] < def push[B >: A](elem: B): Stack[B] = new Stack[B] < override def top: B = elem override def pop: Stack[B] = Stack.this override def toString = s"$elem $" > def top: A = sys.error("no element on stack") def pop: Stack[A] = sys.error("no element on stack") override def toString = "" > object VariancesTest extends App
В новой версии языка даже есть возможность писать намного меньше фигурных скобок, если есть желание. Это будет выглядеть примерно так:
enum IndentWidth: case Run(ch: Char, n: Int) case Conc(l: IndentWidth, r: Run) def that match case Run(ch2, n2) => n1 this that match case Conc(l2, r2) => l1 == l2 && r1 false def < (that: IndentWidth): Boolean = this val kind = ch match case ' ' => "space" case '\t' => "tab" case _ => s"'$ch'-character" val suffix = if n == 1 then "" else "s" s"$n $kind$suffix" case Conc(l, r) => s"$l, $r" object IndentWidth: private inline val MaxCached = 40 private val spaces = IArray.tabulate(MaxCached + 1)(new Run(' ', _)) private val tabs = IArray.tabulate(MaxCached + 1)(new Run('\t', _)) def Run(ch: Char, n: Int): Run = if n
Статическая типизация
По-моему это самое важное, что должно быть в первом языке программирования. Программисту важно понимать, что не стоит складывать яблоки с апельсинами.
Именно по этой причине на мой взгляд не стоит начинать обучение с Питона, Руби, Джаваскрипта, Си и Си++. Динамическая типизация — это верный способ выстрелить себе в ногу.
Другое дело, что статическая типизация неудобна, неочевидна и требует дополнительного бойлер-плейта. Скала вполне успешно позволяет избавиться от этих недостатков в простых программах.
ООП
Объектно-ориентированное программирование — это самая популярная парадигма, без которой не обходится ни один современный язык программирования.
В скале эта парадигма изначально присуща языку, в отличии от Питона, Си/Си++ и в каком-то смысле джаваскрипта. Разумеется, сейчас у этих языков с ООП полный порядок.
Функциональное программирование
Функциональное программирование — это многообещающая тенденция. Скале она присуща в не меньшей степени чем ООП, и они взаимно обогащают друг друга благодаря этому языку. Рискну предположить, что скала — первый язык промышленного уровня с такими свойствами. Сейчас за ним подтягивается Котлин и другие более новые языки.
Начинающим разработчикам стоит узнать про функциональное программирование подробнее, этот подход позволяет писать гибкий, надежный и хорошо масштабируемый код. Вот несколько хабропостов о нём:
- Почему вы должны думать о функциональном программировании?
- Почему разработчики влюбляются в функциональное программирование?
- Почему функциональное программирование такое сложное?
Иммутабельность
Вообще-то это свойство функционального программирования. Мне кажется очень важным прививать умение пользоваться неизменяемыми структурами данных с самого начала. Это позволит в будущем создавать безопасный многопоточный код. И не только многопоточный.
Расширяемость
Как известно, название языка изначально преподносилось как аббревиатура Scalable Language. Особенности языка позволяют писать гибкие и красивые DSL, удобные даже для не-программистов, вкладывать абстракции друг в друга, создавать очень удобные библиотеки и простые скрипты.
Часто этот инструмент обращается против пользователей библиотек, повышая порог входа в их API. Но в умелых руках такая гибкость может обратиться в большое благо. Опытные разработчики могу создавать на Scala простое и удобное API, тем самым заметно облегчая жизнь начинающим программистам.
Мощь
В целом язык скала предоставляет большое количество мощных инструментов, и обратная сторона этого — высокий порог входа, особенно в отсутствии хорошего курса, учебника, или наставника.
Но думаю, что с хорошим наставником или туториалом вполне можно начинать изучать программирование с языка скала и получать правильные привычки статической типизации, функционального программирования и иммутабельных структур данных.
Рынок вакансий
Конечно, вакансий для скала-программистов значительно меньше, чем для джава-программистов. Но зато Scala выше оплачивается.
Вот вам картинка про области применения скалы:
Мои первые книжки
Самая лучшая книжка про скалу, которую я читал — Scala by Example Мартина Одерски, написанная уже 10 лет назад. Прежде чем начинать сейчас читать книгу по скале, очень рекомендую убедиться что она обновлена до версии Scala 3.
А любимый курс — это Functional Programming in Scala, я проходил его в самой первой версии, с тех пор он, конечно, успел измениться. Первые уроки этого курса основываются все на той же Scala by Example. Сейчас команда курса работает над его обновлением.
Если вы хотите поиграть скалой или дотти, не устанавливая IDE — добро пожаловать в Scastie.
Пример кода
Много примеров короткого кода на скале можно найти вот в этом обсуждении: Samples of Scala and Java code where Scala code looks simpler/has fewer lines? Вот один из них:
Scala
object Main extends App
Java 8
import java.util.*; class Main < public static void main(String[] args) < Listkeywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer"); Map result = keywords.stream().sorted().collect(Collectors.groupingBy(it -> it.charAt(0))); System.out.println(result); > >
Java 7
import java.util.*; class Main < public static void main(String[] args) < Listkeywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer"); Map result = new HashMap(); for(String k : keywords) < char firstChar = k.charAt(0); if(!result.containsKey(firstChar)) < result.put(firstChar, new ArrayList()); > result.get(firstChar).add(k); > for(List list : result.values()) < Collections.sort(list); >System.out.println(result); > >
Поступь прогресса
На прощанье — шутка Кея Хорстмана «The March of Progress»
1980: C
printf("%10.2f", x);
1988: C++
cout
1996: Java
java.text.NumberFormat formatter = java.text.NumberFormat.getNumberInstance(); formatter.setMinimumFractionDigits(2); formatter.setMaximumFractionDigits(2); String s = formatter.format(x); for (int i = s.length(); i < 10; i++) System.out.print(' '); System.out.print(s);
2004: Java
System.out.printf("%10.2f", x);
2008: Scala and Groovy
printf("%10.2f", x)
2012: Scala 2.10
println(f"$x%10.2f")
На этом я рискну опубликовать этот пост, но по-прежнему планирую его дописывать по результатам обсуждения с вами.
- изучение программирования
- tutorial
Язык программирования Scala
Scala - объектно-ориентированный и в то же время функциональный язык, представляющий собой, по сути, улучшенную версию Java. Для трансляции кода на устройства с различными ОС Скала применяет интерпретатор Java Virtual Machine.
История развития
Scala создан группой ученых из Лозаннского политехнического университета в Швейцарии в 2003 году. Перед разработчиками стояла задача сделать полностью масштабируемый язык, программы на котором можно было бы расширять и сокращать, контролируя уровень нагрузки на систему. При исполнении задумки акцент был сделан на двух вещах. Во-первых, на сочетании объектно-ориентированной и функциональной парадигм программирования. Во-вторых, на расширении инструментов абстракции и агрегации в коде. Кроме того, в Скала была применена статическая типизация, что не характерно для языков с несколькими стилями разработки.
Плюсы и минусы языка
Преимущества Scala вытекают из его изначальной концепции.
- Работа на разных платформах.
Совместимость с любыми устройствами достигается через Java Virtual Machine. Виртуальная машина переводит код, написанный на Scala, в промежуточный байт-код. Обработанную программу способен считать любой гаджет, на котором установлена JVM, и ему для этого не понадобятся драйвера или другие инструменты. Это касается даже умных вещей, работающих в связке IoT (Internet of Things). - Интегрируемость с Java.
Scala полностью совместим с Java и может применяться совместно с ним для разработки единой системы. Программы на Джава могут быть значительно доработаны и оптимизированы с помощью функций Скала. - Высокая масштабируемость.
Абстрагирование позволяет менять архитектуру программы в большую или меньшую сторону, не перегружая систему. Планирование разработки за счет этого становится более гибким. - Продвинутый параллелизм.
Для распределения параллельных потоков в Scala применяются акторы. Они ускоряют обработку данных и устраняют зависания программы. - Широкие возможности для ООП.
Скала - это объектно-ориентированное программирование в чистом виде. Любая программа на этом языке - сама по себе объект, содержащий внутри все описываемые методы.
Есть у языка и ряд недостатков.
- Усложненный подход.
В сравнении с Java код на Scala выглядит менее интуитивным, и в целом архитектура построения программ на этих языках заметно отличается, хоть во многих моментах они и схожи. - Медленный компилятор.
Скорость трансляции программы в машинный код у Scala ниже, чем у большинства других языков. Из-за этого тестирование и отладка проектов, особенно крупных, растягивается во времени. - Относительно низкая распространенность.
Да, Scala - не самый популярный язык. Во многом из-за того, что функционала того же Java, либо C++ и Python, обычно хватает для решения распространенных практических задач программирования. Но иногда, например, при построении высоконагруженных веб-систем, Скала проявляет себя значительно лучше.
Где применяется Scala
Скала - универсальный язык без узкой специализации. На нем пишется программное обеспечение для разных устройств - от компьютеров до “умных” холодильников. Уже упоминавшаяся раньше JVM делает код кроссплатформенным.
Фреймворки Play и Lift сделали Scala удобным инструментом для разработки и поддержки крупных сайтов с высокой посещаемостью. Это язык, к примеру, используют Twitter, новостные ресурсы Guardian и New York Times. Скала обеспечивает им стабильную работу при постоянном росте нагрузки на сервера.
Главные отличия от Java
Можно выделить несколько черт, разделяющих два рассматриваемых родственных языка.
- Синтаксис.
Scala менее “придирчив” к форматированию кода. Компилятор без проблем поймет код без разделяющих точек с запятой, а в некоторых случаях и без фигурных скобок. - Новые структуры.
В Java нет case-классов, программирования в DSL стиле и некоторых других возможностей, добавленных в Scala. - Фреймворки и библиотеки.
Java гораздо старше Scala, и поэтому в его арсенале накопилось больше инструментов разработки. Но ситуация постепенно меняется, и у Скала появляются достаточно мощные расширения, как, например, веб-фреймворки. - Скорость компиляции.
Java сам по себе не самый быстрокомпилирующийся язык, и Scala немного обыгрывает его в этом вопросе. В веб-среде тем не менее это не имеет принципиального значения.
Примеры кода
Элементарный вывод надписи на экран в своей краткой версии занимает две строки.
object HelloWorld extends App
Рассмотрим также пример простой функции, выполняющей сложение двух чисел.
object add < def addInt( a:Int, b:Int ) : Int = < var sum:Int = 0 sum = a + b return sum >>
Как заметно, программа всегда начинается с объявления объекта.
Заключение
Scala - мультипарадигмальный язык программирования, направленный на разработку сложных систем с переменной нагрузкой. Прародителем Скала можно назвать Java. У этих платформ действительно есть много общего, хотя присутствуют и различия. Среди преимуществ Scala - быстрая масштабируемость, кроссплатформенность и статическая типизация. Для владельца It-продукта разработка на Scala означает стабильность системы и возможность ее быстрого расширения.