Расширенные вопросы и ответы на собеседовании по Scala

Перед прочтением этого поста, пожалуйста, ознакомьтесь с двумя предыдущими постами на тему “Основы Scala” и “Продвинутые вопросы и ответы на собеседование по Scala” для получения базовых знаний о языке Scala.

Продвинутые вопросы на собеседовании по Scala

В этом посте мы обсудим некоторые продвинутые вопросы на собеседовании по Scala, которые связаны с продвинутыми концепциями Scala, а также с некоторыми концепциями, связанными с реальными проектами. Примечание: Поскольку этот список уже стал очень большим, я собираюсь опубликовать еще один пост с оставшимися вопросами и ответами. Пожалуйста, обратитесь к этому посту по адресу: “Scala Intermediate and Advanced Interview Questions and Answers”. Мы также обсудим вопросы и ответы на собеседовании по параллельности и параллелизму Scala/Java, которые полезны для опытных разработчиков Scala/Java.

Продвинутые вопросы на собеседовании по Scala

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

  1. Какая версия Scala является текущей последней? Какие основные изменения или обновления в Scala 2.12?
  2. Что такое Option в Scala? Что такое Some и None? Что такое паттерн проектирования Option/Some/None в Scala?
  3. Что такое Either в Scala? Что такое Left и Right в Scala? Объясните паттерн проектирования Either/Left/Right в Scala?
  4. Какая аналогичная конструкция Option в Java SE 8? Для чего используется Option в Scala?
  5. Каковы преимущества функционального программирования (FP) или преимущества чистых функций?
  6. Какие популярные фреймворки на Scala существуют для разработки RESTful веб-сервисов или REST API?
  7. Какой лучший фреймворк для создания документации REST API для приложений на Scala?
  8. Аналогично Hibernate для приложений на Java, какие популярные фреймворки ORM доступны для использования в приложениях на Play/Scala?
  9. Какой лучший инструмент для разработки приложений Play/Scala для сохранения данных в базе данных MongoDB NoSQL?
  10. Популярные клиенты, использующие Play и Scala для разработки своих приложений?
  11. Какой язык лучше использовать с фреймворком Play: Scala или Java?
  12. Как Scala поддерживает как высокомасштабируемые, так и высокопроизводительные приложения?
  13. Какие инструменты сборки доступны для разработки приложений на Play и Scala?
  14. Что такое SBT? Какой лучший инструмент сборки для разработки приложений на Play и Scala?
  15. Какие существующие фреймворки для модульного тестирования, функционального тестирования и/или BDD доступны для приложений, основанных на Play и Scala?
  16. Какой лучший инструмент для оценки покрытия кода доступен для приложений, основанных на Play и Scala?
  17. Какой лучший инструмент для проверки стиля кода на Scala доступен для приложений, основанных на Play и Scala?
  18. Какие среды разработки поддерживают разработку приложений на Play и Scala и как?
  19. Какой фреймворк для модульного и функционального тестирования является стандартным для Play? Какая система сборки является стандартной для Play? Какой шаблонизатор является стандартным для Play? Какой встроенный веб-сервер доступен в Play Framework?
  20. Почему Scala лучше, чем Java? Каковы преимущества Scala по сравнению с Java (Java 8)? По сравнению с Java, какие основные преимущества или преимущества есть у Scala?
  21. Что такое анонимная функция в Scala? Что такое литерал функции в Scala? Каковы преимущества анонимной функции/литерала функции в Scala?
  22. Что такое функция высшего порядка (HOF)?
  23. Какие различия между классом Case и обычным классом?
  24. Каковы преимущества стека Play/Scala для разработки веб-приложений?
  25. Что такое передача по имени? Поддерживают ли Scala и Java передачу по имени? В чем разница между функциями с передачей по значению и с передачей по имени?
  26. Какие объектно-ориентированные конструкции Java не поддерживаются Scala? Какие объектно-ориентированные конструкции Scala не поддерживаются Java? Какие новые объектно-ориентированные конструкции введены в Scala, но не поддерживаются Java?
  27. Какие популярные фреймворки MVC для языка Scala используются для разработки веб-приложений?
  28. Какие основные различия между структурой проекта на базе Java и проекта на базе Scala в Maven?
  29. Что такое Extractor в Scala? В чем разница между Constructor и Extractor в Scala? Для чего используется Extractor в Scala?
  30. Для чего используется ‘???’ в приложениях на Scala?
  31. Объясните основное отличие между List и Stream в Scala Collection API. Как можно доказать это различие? Когда следует выбирать Stream?
  32. В чем разница между :: и #:: в Scala? В чем разница между ::: и #::: в Scala?
  33. Если я хочу стать разработчиком Fullstack на Scala, какой технологический стек мне следует изучить?

Вопросы и ответы на собеседование по продвинутому Scala

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

Какая текущая последняя версия Scala? Какие основные изменения или обновления в Scala 2.12?

Текущая стабильная версия Scala – 2.11.7. Она поддерживает Java SE 7. Основное изменение или обновление в версии Scala 2.12 заключается в том, что она поддерживает только Java SE 8 или более поздние версии. Scala 2.12 несовместима с бинарным кодом серии 2.11.x. Она все еще находится только в стадии Mile Stone Builds.

Что такое Option в Scala? Что такое Some и None? Что такое шаблон проектирования Option/Some/None в Scala?

В Scala Option используется для представления необязательных значений, которые могут существовать или не существовать. Option является абстрактным классом. Option имеет два подкласса: Some и None. Все три (Option, Some и None) определены в пакете “scala” под названием “scala.Option”. Option является ограниченной коллекцией в Scala, которая содержит либо ноль, либо один элемент. Если Option содержит ноль элементов, то это None. Если Option содержит один элемент, то это Some. Some используется для представления существующего значения. None используется для представления отсутствующего значения. Пример:

def get(val index: Int): Option[String]

Предположим, что этот метод относится к типу данных List. Этот метод имеет возвращаемый тип Option[String]. Если в списке есть элементы, этот метод возвращает элемент “Some[String]” на указанной позиции индекса. В противном случае он возвращает “None” (то есть нет элементов). Some – это класс case class, а None – объект. Поскольку оба они являются case class/object, мы можем хорошо использовать их в сопоставлении с образцом. Комбинация всех этих трех определений известна как шаблон проектирования Option/Some/None в Scala.

Что такое Either в Scala? Что такое Left и Right в Scala? Объясните шаблон проектирования Either/Left/Right в Scala.

В Scala Either является абстрактным классом. Он используется для представления одного значения из двух возможных типов. Он принимает два параметра типа: Either[A,B]. У него есть два подтипа: Left и Right. Если Either[A,B] представляет экземпляр A, это означает, что он является Left. Если он представляет экземпляр B, это означает, что он является Right. Это известно как шаблон проектирования Either/Left/Right в Scala.

Какой аналог у Scala’s Option в Java SE 8? Для чего используется Option в Scala?

Option в Scala похож на Optional в Java SE 8. В Java SE 8 был добавлен новый утилитарный класс Optional для представления наличия или отсутствия значения. Optional доступен в пакете java.util. И Option в Scala, и Optional в Java SE 8 используются для представления необязательных значений. Оба используются для избежания нежелательных проверок на null и NullPointerException.

Каковы преимущества функционального программирования (FP) или чистых функций?

Следующие преимущества функционального программирования (FP) или чистых функций:

  • Большая модульность
  • Легче понять или легче анализировать
  • Легче тестировать
  • Меньше подвержены ошибкам
  • Легче переиспользовать
  • Легче параллелизировать и обобщать

Существует множество фреймворков на Scala, которые используются для разработки RESTful веб-сервисов. Самые популярные из них:

  • Фреймворк Play
    В Play мы называем URL-адреса REST API маршрутами. Мы размещаем все маршруты в одном месте в фреймворке Play. Это безсостояний веб-фреймворк, который облегчает разработку REST API.- Фреймворк Scalatra
    Это очень простой и удобный фреймворк на Scala для разработки REST API.- Фреймворк Spray
    Он очень краткий и построен на основе фреймворка Akka, поэтому лучше всего разрабатывать REST API с использованием модели акторов.- Фреймворк Lift
    Он позволяет маршрутизацию с использованием концепции сопоставления шаблонов.

Какой фреймворк лучше всего использовать для генерации документации для Scala-приложений, использующих REST API?

Swagger – лучший инструмент для этой цели. Это очень простой и открытый инструмент для генерации документации REST API с использованием JSON для Scala-приложений.

  • Если мы используем Play с Scala для разработки вашего REST API, то используем модуль play-swagger для документирования REST API.
  • Если мы используем Spray с Scala для разработки вашего REST API, то используем модуль spray-swagger для документирования REST API.

Как JPA, Hibernate и Toplink и другие ORM-фреймворки для приложений на языке Java, существует множество ORM-фреймворков, которые можно использовать в приложениях на базе Play/Scala. Популярные ORM-фреймворки для приложений на базе Play/Scala:

  • Slick
  • Anorm
  • SORM(Scala ORM)
  • Squeryl

Какой лучший инструмент для разработки приложений Play/Scala для сохранения данных в хранилище данных MongoDB NoSQL?

ReactiveMongo – лучший Scala-драйвер для разработки приложений Play/Scala для хранения данных в хранилище MongoDB NoSQL. Он полностью поддерживает неблокирующие и асинхронные операции ввода-вывода.

Тысячи клиентов используют Play и Scala в производстве. Вот список более популярных клиентов, которые активно используют Play и Scala.

  • LinkedIn
  • The Guardian
  • Ocado
  • LuchidChart
  • GOV.UK

Какой язык лучше всего использовать с фреймворком Play: Scala или Java?

Play 2 полностью написан на Scala. Если мы используем Java с фреймворком Play, нам придется столкнуться со многими проблемами, поскольку Java не поддерживает полноценные функциональные возможности. Scala – лучший вариант для использования с фреймворком Play для разработки высокомасштабируемых, более производительных приложений с параллелизмом и низкой задержкой, потому что:

  • Play 2 полностью написан на Scala.
  • Он поддерживает полный набор возможностей FP.
  • Это скорее язык выражений, чем Java.
  • Он очень легко поддерживает модель акторов Akka
  • Он поддерживает некоторые новые функции ООП, такие как трейты.
  • Встроенные шаблоны Play разработаны на Scala.

Как Scala поддерживает высокомасштабируемые и высокопроизводительные приложения?

Поскольку Scala поддерживает многопарадигменное программирование (ООП и FP) и использует модель акторов, мы можем очень легко разрабатывать высокомасштабируемые и высокопроизводительные приложения.

Какие существуют инструменты сборки для разработки приложений на Play и Scala?

Существуют три самых популярных инструмента сборки для разработки приложений на Play и Scala:

  • SBT
  • Maven
  • Gradle

Что такое SBT? Какой лучший инструмент сборки для разработки приложений Play и Scala?

SBT расшифровывается как Scala Build Tool. Это простой инструмент сборки для разработки приложений на основе Scala. Большинство людей использует SBT в качестве инструмента сборки для приложений Play и Scala. Например, плагин Scala для IntelliJ IDEA по умолчанию использует SBT в качестве инструмента сборки для этой цели.

Какие существуют фреймворки для модульного тестирования, функционального тестирования и/или BDD для приложений на основе Play и Scala?

Вот некоторые из самых популярных фреймворков для модульного тестирования, функционального тестирования и/или BDD для приложений на основе Play/Scala:

  • Spec2
  • ScalaTest
  • ScalaCheck
  • Mokito

Какой лучший инструмент для оценки покрытия кода доступен для приложений, основанных на Play и Scala?

SCoverage – это инструмент для оценки покрытия кода для приложений, основанных на Play и Scala. SCoverage означает Scala инструмент для оценки покрытия кода. У него есть три отдельных плагина, которые поддерживают следующие инструменты сборки:

  • SBT
  • Maven
  • Gradle

Какой лучший инструмент для проверки стиля Scala доступен для приложений, основанных на Play и Scala?

Как Checkstyle для приложений на Java, Scalastyle – это лучший инструмент для проверки стиля Scala, доступный для приложений, основанных на Play и Scala. Scalastyle анализирует наш исходный код на Scala и указывает на потенциальные проблемы. У него есть три отдельных плагина, которые поддерживают следующие инструменты сборки:

  • SBT
  • Maven
  • Gradle

У него есть два отдельных плагина, которые поддерживают следующие две среды разработки:

  • IntelliJ IDEA
  • Eclipse IDE

Какие среды разработки поддерживают разработку приложений на Play и Scala и как?

Следующие две популярные среды разработки поддерживают разработку приложений на Play и Scala:

  • IntelliJ IDEA
  • Eclipse IDE

Они поддерживаются с помощью плагинов Scala, например, Eclipse IDE имеет Scala IDE для Eclipse, чтобы поддерживать разработку приложений на Play и Scala. IntelliJ IDEA имеет плагин “Scala Plugin for IntelliJ IDEA”, чтобы поддерживать приложения на основе “Scala, SBT и Play 2 Framework”.- Какая единица измерения и функциональный тестовый фреймворк используется по умолчанию для Play? Какая среда сборки используется по умолчанию для Play? Какой шаблонный движок используется по умолчанию для Play? Какой встроенный веб-сервер доступен в Play Framework?
Единицей измерения и функциональным тестовым фреймворком Play Framework по умолчанию является Spec2. Очень легко тестировать приложения на основе Play/Scala с использованием фреймворка Spec2. Встроенный шаблон по умолчанию в Play Framework – “Twirl”. Он разработан на Scala. Используя эти шаблоны, мы можем очень легко разрабатывать приложения на основе Play/Scala. Встроенный или используемый по умолчанию веб-сервер для Play Framework – Netty Server.

Почему Scala лучше, чем Java? Каковы преимущества Scala по сравнению с Java (Java 8)? В чем основные преимущества или польза Scala по сравнению с Java?

Scala лучше Java 8, так как поддерживает следующие дополнительные функции:

  • Полноценные функциональные возможности
  • Более выразительный язык
  • Паттерн-матчинг
  • Лучшая поддержка модели актеров Akka
  • Автоматическое разрешение проблемы “алмазного” наследования с помощью трейтов
  • Асинхронное и неблокирующее программирование с использованием фреймворка Akka
  • Полноценный реактивный API для потоков

Что такое анонимная функция в Scala? Что такое функциональный литерал в Scala? Каковы преимущества анонимных функций/функциональных литералов в Scala?

Анонимная функция также является функцией, но у нее нет имени функции. Ее также называют литералом функции. Преимущества анонимной функции/литерала функции в Scala:

  • Мы можем присвоить анонимную функцию переменной
  • Мы можем передать анонимную функцию другой функции/методу
  • Мы можем вернуть анонимную функцию в качестве результата/возвращаемого значения другой функции/метода.

Что такое функция высшего порядка (HOF)?

Функция высшего порядка (HOF) также является функцией, которая выполняет одну, две или обе из следующих вещей:

  • Принимает другие функции в качестве аргументов
  • Возвращает функции в качестве результатов

Каковы различия между Case-классом и обычным классом?

Case-класс также является классом, однако по сравнению с обычным классом он имеет следующие дополнительные функции или преимущества:

  • По умолчанию параметры конструктора Case-класса являются ‘val’. Нам не нужно объявлять параметры с ‘val’.
  • По умолчанию параметры конструктора Case-класса становятся полями класса.
  • Эти методы добавляются автоматически: toString, equals, hashCode, copy. apply и unapply.
  • Он автоматически получает объект-спутник.
  • Не нужно использовать ключевое слово “new” для создания экземпляра класса Case.
  • Просто использовать в сопоставлении шаблонов.

Все эти функции добавляются компилятором Scala на этапе компиляции. Это невозможно с обычным классом.

Каковы преимущества стека Play/Scala для разработки веб-приложений?

Основные преимущества стека Play/Scala для разработки веб-приложений:

  • Открытый исходный код
    Play – это фреймворк с открытым исходным кодом для разработки веб-приложений. – Большая производительность
    Функция автоматической перезагрузки в Play повышает производительность разработчика. Нет необходимости собирать, развертывать и тестировать изменения. Просто вносите изменения и обновляйте страницу, чтобы увидеть их. – Безсостоятельные и легко разрабатываемые REST API
    Play основан на модели без сохранения состояния HTTP для обслуживания веб-запросов, поэтому очень легко разрабатывать REST API или RESTful веб-сервисы. – Лучшая обработка ошибок
    Если мы разрабатываем наше веб-приложение, используя фреймворк Play, он информирует обо всех ошибках в браузере в очень удобном формате. Он показывает сообщение об ошибке, местоположение файла, номер строки, где произошла ошибка, подсвечивает фрагмент кода для легкого понимания ошибки. – Высокая производительность и лучшая масштабируемость с реактивностью
    Фреймворк Play разработан в соответствии с реактивными шаблонами проектирования и построен на основе сервера Netty для использования функции неблокирующего ввода-вывода. Благодаря этой функции мы можем легко разрабатывать масштабируемые и производительные приложения. – Легкое расширение
    Play – очень гибкий фреймворк и поддерживает разработку плагинов, что делает его функциональность и возможности легко расширяемыми. – Высокая параллельность и лучшая параллелизация
    Поскольку Scala и Play поддерживают функциональное программирование, очень легко разрабатывать приложения с высокой параллельностью и лучшей параллелизацией, потому что ФП поддерживает неизменяемость, чистые функции (функции без побочных эффектов), сопоставление шаблонов, модель акторов и т. д. – Лучшая переиспользуемость, легкость тестирования и большая модульность
    Поскольку Scala и Play поддерживают функциональное программирование, мы можем разрабатывать более модульные и переиспользуемые приложения. Также очень легко тестировать более модульные приложения.

Какие конструкции ООП Java не поддерживает Scala? Какие конструкции ООП Scala не поддерживает Java? Какие новые конструкции ООП были введены в Scala, но не поддерживаются Java?

Конструкции ООП Java, которые не поддерживаются Scala:

  • В Scala отсутствует понятие интерфейса
  • В Scala отсутствует понятие перечисления (Enum)

Конструкции ООП Scala, которые не поддерживаются Java или новые конструкции ООП, введенные в Scala, но не поддерживаемые Java:

  • Трейты (Traits) в Scala
  • Автоматическое решение проблемы алмазного наследования.

Что такое передача параметров по имени? Поддерживают ли Scala и Java передачу параметров по имени? В чем разница между параметрами функции, передаваемыми по значению и по имени?

Передача параметров по имени означает, что метод/функция вычисляет параметры только тогда, когда они нам нужны или к ним обращаются. Если мы не используем их, то они не вычисляются. Scala поддерживает как передачу параметров по значению, так и по имени. Однако Java поддерживает только передачу по значению, но не по имени. Разница между передачей по значению и по имени: Основная разница между этими двумя подходами описана ниже:

  • В случае передачи по имени параметры функции вычисляются только тогда, когда они нужны, но не при вызове функции.
  • В случае передачи по значению параметры функции вычисляются при вызове функции.
  • В случае передачи по значению параметры вычисляются перед выполнением функции и вычисляются только один раз, независимо от того, сколько раз мы используем их внутри функции.
  • В случае передачи по имени параметры вычисляются каждый раз, когда мы к ним обращаемся, и вычисляются каждый раз, когда мы используем их внутри функции.
  • Различия в синтаксисе Scala
    Передача по значению:
def myFunction(a: Int, b: Int) { }

Здесь и a, и b – параметры передачи значения по значению в функцию myFunction. Передача по имени:

def myFunction(a: Int, b: => Int) { }

Здесь a – параметр передачи значения по значению, а b – параметр передачи значения по имени в функцию myFunction.

Следующие MVC-фреймворки являются наиболее популярными для разработки веб-приложений на языке Scala:

  • Play Framework
  • Scalatra Framework
  • Spray Framework
  • Lift Framework

Какие основные различия между структурой проекта на базе Java и проекта на базе Scala с использованием Maven?

Большинство проектов на основе Java используют Maven в качестве средства сборки. Однако большинство людей используют SBT в качестве средства сборки для разработки приложений на Scala, но некоторые команды также используют Maven в качестве средства сборки для разработки приложений на Scala. Структура папок Maven для проектов на Java и Scala практически одинакова, за исключением изменения имени одной папки, как показано на нижеприведенных диаграммах: имена папок java и scala. Структура папок Maven для проекта на Java: Структура папок Maven для проекта на Scala:

Что такое Extractor в Scala? В чем разница между Конструктором и Extractor в Scala? Как используется Extractor в Scala?

Не только в Java и Scala, но и во многих других объектно-ориентированных языках программирования конструктор используется для создания (или сборки) объекта или экземпляра класса с использованием его параметров (или компонентов). Экстрактор, наоборот, используется для разбора или разборки объекта на его параметры (или компоненты). В Scala метод apply является конструктором. Внутренне экстрактор использует метод unapply для разбора объектов на его части (или параметры). В Scala экстрактор преимущественно используется в концепции сопоставления с образцом. Мы обсудим концепцию сопоставления с образцом в ближайшее время.

Для чего используется “???” в приложениях на Scala?

Три вопросительных знака “???” не являются оператором или методом в Scala. Они используются для обозначения метода, который находится в процессе разработки, то есть разработчик должен предоставить его реализацию. Этот метод определен в классе scala.PreDef, как показано ниже:

def ??? : Nothing = throw new NotImplementedError

Если мы вызываем этот метод без предоставления реализации, то будет сгенерировано исключение “NotImplementedError”, как показано ниже:

scala> def add(a:Int, b:Int) : Int = ???
add: (a: Int, b: Int)Int

scala> add(10,20)
scala.NotImplementedError: an implementation is missing

Объясните основное отличие между List и Stream в Scala Collection API? Как можно доказать это отличие? Когда следует выбирать Stream?

В Scala и List, и Stream являются частью Scala Collection API и работают почти одинаково. Оба являются неизменяемыми коллекциями. Однако, основное отличие между List и Stream в Scala Collection API заключается в следующем: элементы List вычисляются немедленно (eagerly), а элементы Stream вычисляются лениво (lazily), то есть только при доступе к ним.

scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)

Мы можем заметить, что все элементы List вычисляются в момент создания объекта List. Однако, если мы сделаем то же самое со Stream, мы не сможем увидеть все элементы. Мы сможем увидеть только первый вычисленный элемент, а остальные элементы будут вычисляться лениво, как показано ниже:

scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

Когда нам нужна ленивая коллекция, чтобы вычислять элементы только при доступе к ним, тогда лучше использовать Stream.

В чем разница между :: и #:: в Scala? В чем разница между ::: и #::: в Scala?

В API коллекций Scala,

  • :: и ::: являются методами, доступными в классе List.
  • #:: и #::: являются методами, доступными в классе Stream.
  • В классе List метод :: используется для добавления элемента в начало списка.
scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)

scala> list1 = 0 :: list1
list1: List[Int] = List(0, 1, 2, 3, 4)
  • В классе List метод ::: используется для объединения элементов данного списка перед этим списком.
scala> var list1 = List(3,4,5)
list1: List[Int] = List(3, 4, 5)

scala> val list2 = List(1,2) ::: list1
list2: List[Int] = List(1, 2, 0, 1, 2, 3, 4)
  • В классе Stream метод #:: используется для добавления данного элемента в начало потока. Только этот новый добавленный элемент вычисляется и за ним следуют лениво вычисляемые элементы потока.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> s1 = 0 #:: s1
s1: scala.collection.immutable.Stream[Int] = Stream(0, ?)
  • В классе Stream метод #::: используется для объединения данного потока в начале потока. Только этот новый добавленный элемент вычисляется и за ним следуют лениво вычисляемые элементы потока.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> val s2 = Stream(-1,0) #::: s1
s2: scala.collection.immutable.Stream[Int] = Stream(-1, ?)
  • Метод :: работает как оператор конструктора для класса List, а метод #:: работает как оператор конструктора для класса Stream. Здесь “cons” означает конструирование.
  • ::: Метод работает как оператор конкатенации для класса List, а #::: Метод работает как оператор конкатенации для класса Stream.

Если вы хотите стать Fullstack Scala Developer, вам следует изучить следующий стек технологий:

Если вы хотите стать Fullstack Scala Developer, вам следует изучить следующий стек технологий:

  • Scala 2.11.7
  • Play 2.4.6 Framework
  • Akka 2.3 Framework
  • Один инструмент сборки: SBT/Maven
  • Один JS Framework: CoffeeScript/JavaScript
  • Один IDE: IntelliJ IDEA 15/Eclipse IDE 4.x
  • Один TDD & BDD Framework: ScalaTest, Spec2, ScalaCheck, Mockito
  • Микросервисы с помощью Play и Scala
  • SCoverage
  • Scalastyle
  • Функциональные шаблоны проектирования
  • Машинное обучение с помощью Scala

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/scala-advanced-interview-questions