Java to Scala. Вопросы с собеседований
Недавно у меня друг перешел на Scala-проект. Он готовился две недели, прошел 17 собеседований, получил 7 офферов. До этого у него было два года коммерческого опыта на java-проекте. Я попросил его расписать, что спрашивают на собеседованиях. Получилось очень подробно и здорово.
Типичное собеседование по Scala можно описать как hardcore-версию собеседования на позицию Senior Java. Причем не берем в счет позиции типа better Java или Java/Scala. Речь о Scala, где нет как минимум var переменных, циклов, сеттеров и мутабельных коллекций, ну или где за этим хотя бы стараются следить. Практически нигде вам не будут задавать типичных вопросов про HashMap, методы Object, контракты equals/hashcode, как работает Docker и прочую лабуду, а сразу начнут лезть в душу. Большинство вопросов, конечно, задают и на Java-собесах, но насыщенность Scala собеседования глубокими вопросами зашкаливает и отделаться каким-нибудь определением не получится, нужно будет объяснять как это работает внутри. Вот примерный список тем, которые необходимо довольно глубоко изучить. Начнём с обязательной части.
1.Многопоточка. Про неё спрашивают вместо HashMap. Нужно знать всё. Как работает многопоточное приложение, отличие потоков java от потоков системы и процессов, может ли одно java/scala приложение работать на нескольких процессорах, happens-before, какие языковые конструкции могут гарантировать happens-before, как в жизни помогают и как работают volatile/final, CAS, способы синхронизации, виды дедлоков, как бороться с ними, Future, недостатки и преимущества Future, пулы потоков, какие пулы в каких кейсах лучше использовать. Отдельно выделяют fork/join и просят рассказать, как он устроен внутри и для каких бизнес-задач подходит, а для каких нет. Атомики, как атомики реализованы, виды локов, проблемы с lazy полями в многопоточной среде и как реализованы lazy поля, отсюда вопрос про минусы этих реализаций и все что в голову взбредет.
2. Java Memory Model. Первая часть собеса никогда не обходится без обсуждения JMM. Виды GC, алгоритмы работы, различия, преимущества и недостатки, способы оптимизации работы, основные показатели, в каких случаях какой необходимо выбрать, способы поиска проблем. Рассказать, как реализована оптимизация хвостовой рекурсии в Scala. Обычно разбор многопоточки и JMM занимает 50% времени всего собеседования.
3.Алгоритмы и структуры данных. В 90% случаев обязательно попросят написать на бумажке задачку а-ля Фибоначчи с хвостовой рекурсией, реализовать метод flatMap/map у листа, обход графа/дерева, развернуть рекурсивно лист. Или другую из первых 40 задач с leetcode, которые заточены на рекурсию. Дальше интервьюеры пройдутся по всем структурам данных в Scala, их различия, юз кейсы, сложности, что там под капотом. Спросят про сортировки. Очень популярен вопрос про различные кейсы сортировок огромных файлов и поиск в уже отсортированных файлах нужного элемента, где бинарным поиском не обойтись.
4.Scala Core. Иерархия типов, иерархия коллекций, система типов, Nothing/Null. Где-то спрашивали, как реализован Nothing и как получается, что он подтип всех? Часто собеседующие спрашивают про вариантность, просят рассказать про кейсы, дают какие-нибудь задачки на расставления вариантности у типов. Задают вопросы про тайп классы, тайп конструкторы, экстеншен методы, функции и типы высшего порядка, виды имплиситов, зачем это все нужно и области применения.
For comprehension: во что раскладывается, что будет, если не написать yield, дают различные примеры, где типы не совпадают и спрашивают, будет ли работать, во что превращается в байткоде.
Pattern matching: что нужно, для того, чтобы это работало. Отсюда вопросы про алгебраические типы данных, как они реализованы в Scala и почему именно так. Ещё нужно быть готовым объяснить, чем Scala тебя так привлекла. Рассказать о плюсах и минусах.
#scala