4 вопроса для разработчика Scala
Представляем вам перевод статьи Джейми Аллен, который является директором глобальных сервисов в Typesafe, базирующейся в Сан-Франциско.
В ней он рассказал о том, какие вопросы могут быть на собеседовании на должность Scala-разработчика и о том, как на них лучше ответить.
Медленно, но верно Scala набирает обороты, и вместе с этим растет спрос на программистов, которые с ним знакомы. Несмотря на то, что Scala занимает всего лишь 39 позицию в августовском рейтинге TIOBE, ему предсказывают невероятную популярность и ведущую роль в корпоративной сфере к 2018 году.
Как следует готовиться к собеседованию на вакансию разработчика Scala? Джейме говорит, что обычно рекрутеры стараются определить общий уровень понимания языка, а затем пытаются узнать о знании библиотек и основных классов.
В чем разница между следующими понятиями: ‘Nil,’ ‘Null,’ ‘None,’ ‘Nothing’?
- Как отвечает большинство людей: Nil - это конец списка. Null – отсутствие значения. None - это значение Option, если в ней ничего нет.
- Что следует ответить: Null – это тип, который представляет отсутствие информации для сложных типов данных, наследуемых от AnyRef. Nothing – это низший тип всей системы Scala, включающий все типы AnyVal и AnyRef. Nothing обычно используется как return из метода, который сработал с ошибкой или выдал исключение.
- Почему нужно ответить именно так: Первый ответ неплохой, но разработчик не понимает, что перечислил только термины и не объяснил разницы между типами и понятиями. К тому же он не рассказал о типах данных в Scala. Способность объяснять подобные, часто вводящие в ступор части языка, показывает понимание основных концепций от систем типов до коллекций контейнеров в среде выполнения JVM. Даже если вы не используете эти типы и понятия, они обязательно всплывут во время работы, поэтому необходимо знать, что им нужно.
Что такое ‘Option’ и как его используют?
- Как отвечает большинство людей: Option - это тип-оболочка, который позволяет избежать NullPointerException в коде. Для этого можно использовать методы get() и map().
- Что следует ответить: Option - это контейнер, который предоставляет возможность различия внутри системы типов, которые могут иметь нулевые значения и тех, которые не могут. Значение можно получить с помощью get(), но предпочтительнее использовать функции высшего порядка вроде map, flatMapand foreach. Использовать map нужно, когда необходимо вернуть значение другой Option, flatmap для того, чтобы сгруппировать несколько значений Option вместе, foreach для операций, которые влияют на значение внутри Option без возвращения нового значения и для того, чтобы вывести их сочетание кратко и ясно.
- Почему нужно ответить именно так: Второй ответ демонстрирует понимание нескольких всеобъемлющих концепций. Например, в нем объясняется, как система типов предоставляет семантическое значение, а также время выполнения компиляции, что делается и когда. Это также показывает, что у вас есть понимание основ функционального программирования, например, того как использовать лямбды или именованные функции с функциями более высокого порядка. Более того, такой ответ показывает, что вы думаете о функциональной композиции.
В чем разница между конкурентностью и параллелизмом? Назовите некоторые конструкции, с помощью которых можно задействовать оба понятия.
- Как отвечает большинство людей: Конкурентность - это способ избежать доступа к изменчивому состоянию несколькими потоками одновременно.
Параллелизм – разбиение одного задания на несколько частей для выполнения потоками в одно и то же время. Actors – конкурентность, parallel collections – параллелизм. - Что следует ответить: Конкурентность – несколько вычислений, которые выполняются последовательно в совпадающие периоды времени. Параллелизм описывает процессы, которые выполняются одновременно. Концепции часто путают потому что actors могут быть и конкурентны и параллельны, временами в одно и то же время. Например, Node.js обладает конкурентностью через event loop несмотря на реализацию в одном потоке. Parallel collections - классический пример параллелизма, но ими также являются Futures и библиотека Async. Я сравниваю производительность конструкции параллелизма, для того чтобы убедиться, что затраты на параллелизацию и объединение задачи, не превышают скорость параллельного выполнения по сравнению с tight loop над массивом в одном потоке выполнения, как определено законом Амдала.”
- Почему нужно ответить именно так: И вновь первый ответ совсем не плохой, однако конкурентность может происходить и без множества потоков. Второй ответ демонстрирует, что вы понимаете влияние конкурентности и параллелизма на написание реактивных приложений, которые вовлекают все ядра на всех сокетах всех устройств. С растущим числом ядер, очень важно, чтобы разработчики понимали, как использовать их наиболее эффективно и представляли какие задачи могут возникать перед ними во время работы.
Что такое ‘Unit’ и ‘()’?
- Что следует ответить: Unit - это тип, который является эквивалентом void в Java, но при этом обеспечивает язык абстракцией над платформой Java. Пустые круглые скобки – представляют значение Unit.