107

Какие вопросы я задаю на собеседовании java разработчикам1

Всем привет, я работаю разработчиком на java стеке с 2014 года, прошел довольно много собеседований и также собеседовал сам. Порядок интервью обычно такой: представить проект и стек технологий, дать представиться кандидату, обсудить вопросы по нескольким темам, ответить на вопросы кандидата. Темы зависят от уровня кандидата, не выходят за рамки резюме. Я выработал несколько вопросов, которые предлагаю обсудить кандидату, в этом посте поделюсь ими.

Первый вопрос касается процессов на прошлой работе: откуда кандидат узнавал постановку задач, как понимал что делает свою работу правильно. Не задаю вопрос, почему кандидат хочет сменить работу. Далее идут технические темы.

По классике java интервью, нужно начать с обсуждения алгоритмов и структур данных: ArrayList vs LinkedList, HashMap с hashCode и прочее. Так как в резюме почти у всех указан SQL, предлагаю вместо этого обсудить индексы в БД. Почему по дефолту используется Tree индекс вместо Hash индекса, хотя алгоритмическая сложность первого больше второго (logN > 1). Тот же вопрос: на что влияет порядок колонок в составном индексе? Это позволяет выяснить, понимает ли кандидат структуры данных, или просто запомнил стандартные вопросы.

Следующий вопрос: есть однопоточный сервис для переводов денег между пользователями, можно уйти в минус, но нужно следить чтобы деньги не потерялись (сумма на всех счетах является инвариантом). Что нужно учесть, чтобы сделать из него многопоточный. Это показывает, понимает ли кандидат проблемы синхронизации памяти потоков и организации блокировок. Стандартное решение для исключения взаимных блокировок - последовательный захват мониторов, если не ответите сразу то можете спровоцировать дополнительные вопросы.

У middle разработчиков обычно указан опыт работы с Kafka (система доставки сообщений на базе лога). Я предлагаю обсудить систему зачисления денежных средств на счет пользователя, поручения на зачисление приходят по кафке. Кто знаком с Задачей двух генералов понимает, что если кафка гарантирует доставку сообщений за счет многократных попыток, то она не сможет гарантировать единственность доставки. Прошу кандидата указать возможность идемпотентной обработки поручений.

Кандидатов junior и middle уровней я также прошу решить задачку в онлайн редакторе. Не обязательно чтобы решение компилировалось. Это позволяет понять, умеет ли кандидат на практике применять структуры данных. Пример задачи: определить, являются ли две строки перестановкой символов (a..z) друг друга. Перестановками являются "abba", "baba", не являются "nppn" и "npp". Ожидается, что кандидат сможет формализовать задачу (строки являются перестановками, если в обоих строках совпадает количество каждого из символов), и предложит эффективное решение. Можно просто сослаться на алгоритм Сортировки подсчетом.

Общий совет - проходить собеседования как можно чаще, даже когда я не ищу работу, мое резюме "приоткрыто". Сейчас я не собеседуюсь часто, так как не расчитываю радикально улучшить мои условия, но для специалистов среднего уровня советую делать это на постоянной основе.

Лига программистов

2.1K постов11.9K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

37
Автор поста оценил этот комментарий
А в итоге всё равно 90% задач это одни и те же бесконечные перекладывания json'ов и обмазывание if'ми
Может, стоит искать того, кто хорошо перекладывает json?
раскрыть ветку (1)
5
Автор поста оценил этот комментарий

90% от тех 50%, которые остаются после совещаний, да). На проекте могут быть сотрудники разных уровней, тогда типовые задачи разумно делегировать начальным позициям.

1
Автор поста оценил этот комментарий
А как сейчас вообще с джунами по Java? Они нужны или все затаились и ждут лучших времён?
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Не могу сказать точно, субъективно - с начала года конкуренция среди джунов выросла

5
Автор поста оценил этот комментарий

Классный вопрос про HashMap, позволяет утопить почти любого кандидата )


И что значит последовательный захват мониторов для предотвращения взаимных блокировок?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

https://stackoverflow.com/a/528336

Суть проблемы - при переводе денег с одного счета на другой, нужно запретить изменять содержимое обоих счетов всем потокам, кроме одного, который произведет списание и зачисление. Для этого нужно использовать примитив синхронизации "монитор", если один поток захватил монитор то все остальные потоки, желающие захватить монитор, будут ждать пока монитор освободится. Так как в операции участвует два счета, то поток должен захватить два монитора (освобождение мониторов всегда происходит в обратном порядке).

Допустим, решим при каждой операции захватывать сначала монитор счета списания, а потом счета получения. Пусть поток1 выполняет перевод между счетами A -> B, успел захватить монитор А, но еще не успел захватить монитор В. В это время поток2 выполняет перевод между счетами B -> A, успел захватить монитор B. Получается, дальше эти потоки будут бесконечно ждать, так как ни один не может захватить второй монитор.

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

показать ответы
0
Автор поста оценил этот комментарий

Это на мидлов такие вопросы из однопоточного многопоточный сервис сделать?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Миддл должен иметь представление о примитивах синхронизации и о проблемах которые они решают (видимость, атомарность). Меня несколько раз просили реализовать блокирующую очередь на wait/notify, из java.util.concurrent любят посправшивать про read/write lock. В чем отличие Collections.synchronized(new HashMap) от ConcurrentHashMap. Что такое оптимистичная и пессимистичная блокировки. Для подготовки к теоретической части рекомендую ознакомиться со статьей https://shipilev.net/blog/2014/jmm-pragmatics/

показать ответы
4
Автор поста оценил этот комментарий

Строго говоря, монитор — это не примитив, а высокоуровневая обёртка над примитивом «мьютекс».

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Возможно мы говорим про разные термины, в java монитором выступает обьект, ссылка на который передается в оператор обьявления критической секции:

Object mon = new Object()

synchronized(mon) { .. }

показать ответы
47
Автор поста оценил этот комментарий
Ну и традиционно, в работе вы пилите круды, с классикой в виде контроллер-сервис-репозиторий в которых вам нужно знать только традиционные аннотации спринга. Кафку вы используете тоже просто: аннотация с названием очереди и погнали дальше по тем же трубам.
сколько раз уже сталкивался с таким: собеседование прям с многопоточностью, сложностями алгоритмов, затрахать до смерти кандидата, а потом посадить его круды пилить.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Стандартизация технологий позволяет пилить проекты силами разработчиков начального уровня. К сожалению, без понимания работы под капотом легко накосячить в нефункциональных требованиях - забыть индекс, создать запрос с кучей join, в многопоточном приложении небезопасно использовать переменную.

Очевидно что на собеседовании нет смысла ограничиваться вопросом - какие аннотации вы использовали. Хардкор тоже ни к чему. Я постарался привести примеры из середины этого интервала

показать ответы
0
Автор поста оценил этот комментарий

А что делать тем, кто учит java, но кого не приглашаю на собеседования, не смотря на тонну откликов на вакансии?(

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Можно приписать себе опыта, но тогда ждите завалов на собеседовании

Нанять рекрутера для помощи в написании резюме

Писать в личку лидам в LinkedIn и узнать не нужны ли стажёры

показать ответы
0
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Чем выше позиция, тем внимательней требуется проверять поведенческие качества. Давно понял что в свою команду собеседовать сотрудников нужно лично, даже если их специальность отличается

0
Автор поста оценил этот комментарий
Так как в резюме почти у всех указан SQL, предлагаю вместо этого обсудить индексы в БД. Почему по дефолту используется Tree индекс вместо Hash индекса, хотя алгоритмическая сложность

Капец у вас вопросы для джунов О_о

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

На самом деле обсуждение идёт как диалог, с наводящими вопросами. Можно предложить вспомнить про HashMap/TreeMap, подсказать пример вроде "получить записи за день"

3
DELETED
Автор поста оценил этот комментарий

Так и нужно проверять кандидата - просто смотреть на его проекты, решения которые он применял. А не задавать всякие вопросы которые ни о чем по сути не скажут, потому что знать это одно, а уметь применять другое.


Только вот это всё херня, пустая болтовня. Вот ты будешь теперь смотреть на проекты кандидатов, понимая что они скажут тебе больше чем ответы на вопросы которые перечислил в посте?


У меня на собесах ещё ни разу не задавали вопросы по моим проектам.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

К сожалению, на собеседовании нет времени вникнуть в проект. Можно только по-быстрому посмотреть используемые компоненты и выявить явные ошибки.

показать ответы
7
Автор поста оценил этот комментарий

Я правильно понимаю, что вы гоняете кандидатов по типам индексов в базе,  но операции с пользовательским балансом у вас построены на самодельных костылях, а не как принято за счет транзакций в базе ?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нет, это синтетический пример. Нужно понимать, что транзакции в базе работают не на магии, а на таких же блокировках. Можно обсудить более сложный вопрос, например уровни изоляции транзакций, но я обычно выбираю простую модель

показать ответы
1
Автор поста оценил этот комментарий

Leetcode и подобные - это косвенный признак. Этакая корреляция с "общей увлеченностью темой", откуда вытекают "способность и желание освоить".

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, это показывает умение на практике использовать структуры данных. В рабочем проекте видел такую конструкцию:

if (new HashSet(list).contains(x))

Разработчик знает что поиск в мапе быстрее чем в списке, но не думает что не даст прироста при однократном поиске

показать ответы
0
Автор поста оценил этот комментарий

Мы говорим об одном и том же. Если в джаве существует оператор критической секции, это не делает объект-монитор "примитивом синхронизации", поскольку "под капотом" у него лежит настоящий примитив — мьютекс.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Примитивность определяется в рамках используемой модели - так же как материальная точка в физике. Детали реализации мониторов скрыты от java разработчика спецификацией. Не поленился почитать в jls - понятие монитора вводится в пункте 17.1, а понятие мьютекса отсутствует. По такой же аналогии, при работе с мьюетксами разработчики не думают что под капотом лежат транзисторы.

показать ответы
2
Автор поста оценил этот комментарий

То есть вы не спрашиваете о том, чем сами пользуетесь? Почему же тогда вопросы про LinkedList и Hash-индексы задаёте?


И что будете делать, если вам придёт проект со сложной архитектурой, где используется множество паттернов, а в команде их никто не знает?

раскрыть ветку (1)
Автор поста оценил этот комментарий

HashMap используется в коде постоянно как дефолтная реализация Map. Поэтому важно понимать стоящий за ней алгоритм, но вопрос я формулирую в контексте индексов БД а не java коллекций.

Если придут со сложной задачей - будем разбираться)

2
Автор поста оценил этот комментарий

Уважаемый интервьюер, а почему вы ни одного вопроса по архитектуре ПО и объектно-ориентированному проектированию не спрашиваете?

раскрыть ветку (1)
Автор поста оценил этот комментарий

ООП это довольно холиварная тема, но в проектах где я работаю в основном довольно простая организация кода. Мы используем анемичные модели: сервисы-синглетоны без состояния и сущности без поведения. У интерфейсов обычно единственная реализация, а вместо наследования используется композиция и делегирование. Достаточно понимать структурное программирование чтобы включиться в проект. Поэтому я не уделяю этому времени.

Архитектура это тоже размытое понятие. Вопрос по кафке я считаю архитектурным, другие нет

показать ответы