Java Developer
6.45K subscribers
235 photos
8 videos
12 files
279 links
MAKE JAVA GREAT AGAIN

Мемы: @java_memes
加入频道
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
Как учить Scala

Есть два варианта изучения. Один быстрый, другой основательный. Оба подходят только, если вы хотите Scala хотя бы с минимальным ФП, то есть не ООП проект, где просто вместо Java решили заюзать Scala. Для вхождения нужно уже хорошо знать Java Core и многопоточку. Если что-то в Java плохо знаете, учите - потом будет поздно.

Основательное изучение
Первый путь для усидчивых людей, кто не знает лени и имеет кучу свободного времени.
1. Курс с Курсеры от Мартина Одерски (основатель Scala)
https://www.coursera.org/specializations/scala
2. Книга Одерски Programming in Scala
3. Красная книга Functional Programming in Scala (теория и задачи)
4. Вы готовы к бою

Быстрый путь
Второй путь для людей, у кого есть на изучение немного времени. Максимум полгода-год в расслабленном режиме или пару месяцев в хардкор режиме.
1. Курсы Rock the JVM с Udemy
https://www.udemy.com/course/rock-the-jvm-scala-for-beginners
https://www.udemy.com/course/advanced-scala
2. Книга Одерски в фоне
3. Красная книга хотя бы 70%
4. Между Udemy и красной книгой можно впихнуть курс Тинька, но это чисто для закрепления, прощёлкать тесты. Если нет времени, не стоит.
https://stepik.org/course/16243

Вне зависимости от выбранного варианта, нужно будет полистать мануалы котов (Cats) и, например, Monix. Так же много нового узнаешь на интервью. Про Tagless-Final и ZIO спрашивают уже сеньоров скалистов. И то, в Москве проекты с TF и ZIO большая редкость пока что. Когда попадете на такой проект, тогда и учите)

#scala