Моя история прохождений интервью в IB IT (Java разработчик) с примерами типичных заданий

habr.png

Так получилось, что я хотел стать программистом еще учась в университете в Москве, но стал им уже за пределами России и не сразу — путь был долог и тернист. Я ходил на множество интервью (вначале искал я, потом уже искали меня), вникал в тонкости работы и размышлял на тему — как же стать хорошим программистом.

Один из аспектов, который актуален на протяжении всей карьеры, это поиск работы и прохождение интервью. Я сам проводил очень мало интервью (4–5), но посетил большое их количество (>100). У меня было 3–4 периода по поиску работы за последние ~7 лет, кода я ходил на интервью месяц-два, по 1–2–3 в день иногда.

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

Что бы мне было интересно узнать в комментариях — как это бывает у других, особенно в Москве/России, наверняка есть различия с Европой.

Основано на моем личном опыте, разговоре с коллегами, чтение форумов, книжек и проч. Я бы сказал так — это мое субъективное мнение на ситуацию в целом, этот пост претендует на цельность информации и на то, что он охватывает, если не все, то большинство аспектов. Там, где мое мнение, я так и пишу, по-моему. В остальном, я претендую на объективность.

Почти весь мой опыт это собеседования в IT в европейских финансовых компаниях на позицию java (senior)developer, преимущественно в Лондоне. Нет ни веба (в любом виде, front/end-backend), ни интеграции, ни работы на заказчика (по типу — есть CRM и компания внедряет ее в банках), амазон, фейсбук, гугл тоже не представлены — я не знаю, как там и не очень стремлюсь, наверное. Мой опыт начинается от простого программиста и заканчивается senior developer. Team/techlead/manager — нет.


Об интервью в общем

Интервью процесс статистический, т.е. — подаемся везде где интересно, что-то не получится просто потому, что не повезло, уже наняли, какие-то еще конъюнктурные соображения или опыта маловато или просто нашелся кандидат лучше. Т.е. очень сложно пройти интервью, если это только одна компания, позиция — как ловить сетью только одну рыбу N раз, лучше найти рыбное место и закинуть сеть там. В этом смысле, мне кажется гугл проблематичен — он такой один. Банков, занимающихся схожими вещами много, не в одном, так в другом найдется интересный проект, день будет удачным и т.д.

Интервью это игра по своим правилам, которые принято соблюдать, знание этих правил помогает выстаривать ожидания и процесс подготовки, прохождения. Отчасти это условности, которые не приходится применять на практике. Никто не пишет сортировки вручную, да даже synchronized вряд ли придется писать, не говоря о notify/notifyAll. Равно как и вряд ли понадобится детальное знание внутреннего устройства hashmap —, но это один из самых популярный вопросов — 70 процентов интервью не обходятся без этого, с этим вопросом может поспорить только контракт между equals and hashcode. Но с другой стороны, это говорит об общей подготовке кандидата, как хорошо он подходит к рабочей задаче (а поиск работы это тоже своего рода маленький проект).


Из администратвных вопросов

Забудьте ждать ответа. Нет ответа — ответ отрицательный.
Иногда мне казалось, это у них правило хорошего тона — они не отвечают, если не заинтересованы. Это на примере с рекрутерами — если ты ему ответил, что работа сейчас не нужна, то это типа слабак. Ибо они сами, естественно, не овтечают, если име не нужно, лоигка — что время тратить. Вообще, рекрутеры, это удивительные люди, когда то мне стало казаться, что они как сирены — стоит ответить и вот все, ты уже на интервью, на которое не пошел бы. Умение четко сказать нет, или сформулировать, что мне нужно, это хороший навык. Я верю агентам, но никогда не доверяю. Беру только факты, причем те, которые можно доказать, из разряда «это новый проект, там все очень хорошо» — это сотрясание воздуха. А если «они готовы поднять зарплату на 10 тысяч» — то это уже что-то :-)

Немного любопытной информации — агент (агентство) получает 20–25 процентов годовой зарплаты успешного кандидата (и прошедшего испытательный срок. Вроде бы, у компании отдельный бюджет на агентов, т.е. если найти ту же самую работу без агента, то, скорей всего, вряд ли можно рассчитывать на бОльшую зарплату. Не совсем понимаю, почему так, может быть, в маленьких компаниях это по-другому.

От агентов, конечно, есть толк, иногда они полезны и хороши. Факт в том, что какие-то очень интересные вакансии мне приходили только через агентов. Но и верно обратное, не смотря на распространенное мнение, работу без агента найти можно и нужно. Особенно, если интересует работа в более менее понятной области — берем топ 20 компаний по миру/стране в этой отрасли и идем на их сайты. Так я нашел свою первую работу в Лондоне, которой был очень доволен.

Также стоит упомянуть, что к интервью надо готовиться, форма в начале забега существенно отличается через месяц хождений по интервью, для разогрева походить на «все подряд». Вопросы повторяются, простые задачки пишутся просто, сразу и быстро. Рассказ о своем опыте, сильных сторонах, проектах и планах на будущее отскакивает от зубов. В какой-то момент, мне захотелось носить с собой плакат с архитектурой нашей системы чтобы было удобней рассказывать, чем же я занимаюсь :-)

В целом, всегда и везде- средний уровень не интересует, надо быть ВЫШЕ среднего, в том числе, и выше своих способностей, в том смысле, что надо выложиться по полной. Все стараются быть лучше, чем оно есть, так что просто высказать все по чесноку, скорей всего, будет не самой выигрышной стратегий. Безусловно, бывают редкие случаи, когда говорят как есть, но это надо чувствовать и быть уверенным, что сказав — «да меня в работе, честно говоря, интересует, чтобы мной были довольны, работа была сделана и, конечно деньги» — надо быть уверенным, что на том конце вас правильно поймут. Рассказывать про стремление к профессиональному росту, ценность успеха компании и гордость за отдел, это даже не так далеко от истины, но оформлено более приятно, абстрактно — в корпоративном стиле:-) Bullshit’ерство? да. Но такие правила. Оптимистично, бодро, корпоративно. В конце концов, это показывает, что вы умеете играть по правилам и их принимаете, умеете учитывать обычаи коллектива. Финансовое ай ти это огромная бюрократия, и надо уметь в ней существовать, да, на это тратятся ресурсы и все неэффективно, но таковы правила и лучшего варианта иногда просто нет. Из плюсов — есть интересные, очень интересные проекты, бюрократия и бизнес аналитики не сильно достают и оч оч хорошие деньги :)

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


Этапы собеседований

Предварительный этап это телефонное интервью.

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

Спрашивают серьезно про мотивацию, почему ищешь, меняешь работу.

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

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

Было немного случаев (но они стабильно были), когда начинается все жестко уже на первом интервью — здрастье, здрастье, ну пройдемся по джвае, алгоритмам и тд. Просто 40–50 минут тех вопросов в духе экзамена по computer science.


Про деньги

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

для Лондона -можно посмотреть на glassdoor и умножить на 1.5. верхняя часть зарплат там почему то не представлена, хотя это самая сладкая часть и, что важно — вполне достижима. Если кому интересно — обсудим в комментариях или личных сообщениях, как заведено — с вас цифры и я в ответ свои (интересует по отрасли в целом, как там в люксофте платят, а как в дойче или сбертехе?). В любом случае, программист в Лондоне в банке это очень и очень хорошие деньги и уровень жизни выше, чем в Москве (это мое субъективное мнение, исходя из моих представлениях об уровне жизни и потребностях, так же сами города накладывают ограничения, в Москве, мне кажется, об ипотеке я бы и не думал, в Лондоне, Европе, 2% годовых — норм, 20–25% первый взнос уже достаточно).

Вернемся к интервью, я так понимаю, что работодатель хочет видеть кандидата с определенной суммой. Я бы сказал, что лучше ответить каким-то интервалом, но надо его ставить разумно, чтобы потом не оказалось, все хорошо, но хочу больше денег. В целом, я бы казал, что +10–15% к текущей зарплате это средний вариант. Увеличение зарплаты почти вдвое тоже возможно и увеличение в год на 10% на текущем месте также, что бы ни говорили агенты — с одной стороны, чем дороже агент продаст, тем больше он получит, но приоритет — продать вас вообще, а за сколько, там как получится, 5–10% разницы в вашей зарплате для агента это не такая большая разнциа в том, что агент сам получит на руки.


Форматы интервью


Орг вопросы

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

Ну дальше все стандартно, пришел (увидел победил :-)), доложился на ресепшн, за тобой спустились или отправили одного в переговорную. Как правило все же за вами спускается сотрудник и ведет вас сам. Время в лифте и по дороге тоже можно использовать для переговоров.

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

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

Еще интересная метрика — во сколько началось интервью, (может, я уже просто развлекаюсь), мне были интересны две вещи- начало интервью (Я всегда приходил на 10 минут до начала) и какие картины весят на стенах, дизайн переговорных — как правило это переговорные для клиентов банка и в их оформление вкладывают большие деньги. Это всю нюансы, но лично для меня — это составляет общее впечатление.

Есть такой момент — заявлено интервью на 2 часа с 4 людьми, а после часа вам говорят спасибо. Понятно, что вы не прошли. Не знаю как к этому относиться, это не о том, что — мне обидно, я готовился, пусть слушают (ну или пусть я хоть практику прохождения интервью получу) — тут все четко и да, жестко; это скорей о том, что, возможно, это было неудачное выступление и если продолжить, то все станет лучше. Но тут, значит опять логика — лучше не нанять хорошего, чем нанять плохого.


Телефон

Самое базовое, как я описывал, телефонный разговор. Технические вопросы могут быть, но что-то очень тяжелого или сложного, очевидно, спрашивать сложно. Детали реализации in places quick sort вряд ли будут спрашивать, а если будут — надо бежать, потому что, имхо, это неадекватно.


Он лайн

Далее, любимое в последнее время (этого не было 5–7 лет назад или было меньше) — онлайн программирование типа hackerrank или и онлайн тесты.

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

Поэтому, я думаю, это такой грубый фильтр.

Онлайн программирование с интервьюером, выглядит так — заходите на сайт, авторизуетесь, и перед вами он-лайн IDE, которая видна вам и интервьюеру. Он дает вам задания, и вы тут же пишете код, запускаете его и т.д. Лишь один раз мне встретилось, когда это был просто гугл док, все остальное — вполне себе простая онлайн IDE.


Домашнее задание

Старые и добрые тестовые задания, когда просто дается опиание задачки, и надо прислать решение — иногда на время, иногда просто, в течении 1–2–3–4 дней.

По форматам заданий — домашние задания, как правило, очень вразумительные и осмысленные. Это либо алгоритмически что-то (не самое хорошее задание, ну что-то вроде поиск пути в лабиринте, или маленькая система по подсчетам среднего значение из потока цен и хранения самого последнего, там немного надо спроектировать классы и написать все с упором на low latency) или на, как я это называю, ООП — есть простая предметная область, надо просто написать программу которая отображает поставленную задачу. Ну например, у нас есть больница, в ней пациенты, каждому пациенту дают определенный список лекарств, лекарства по определенным правилам взаимодействуют друг с другом вызывая разный эффект. Надо написать программу, которая по заданному списку лекарств выдает результат применения их на список больных (у каждого из которых своя история болезни). Ну или написать банкомат (привет атомарности транзакций). Или написать игру камень ножницы бумага.

Оналйн программирование на время (без участия человека с той стороны) — как правило, это что-то алгоритмическое из разряда обхода дерева, работа с массивами — ну все то, что есть на geelforgeeks, нередки и более зубодробительные задачи. Имхо — бред, ибо любая задача просто серчится за 10 минут и еще за 10 адаптируется.

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

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

Кстати, об агентах — иногда бывают, что агенты как бы знают что будут спрашивать и могу это как-то описать. Это серая зона, с одной стороны хорошо знать, будет ли интервью чисто техническим или просто разговоры. Это ок. Но вот говорить конкретные задания, я считаю это плохо, нельзя и плохой признак, говорящий о нечестности агента.

Собственно, кандидат будет ооочень плохо выглядеть, если он волшебный образом сразу написал решение задачи, но не смог объяснить его. Поэтому я бы предпочёл такими подсказками не пользоваться.


Онсайт интервью

парное программирование, по сути тот же онлайн программирование, только интервьюер не на телефоне, а на стуле рядом.

домашнее задание — дают задание, комп, час времени, напишете — позовите.
Кодить, дизайнить на бумаге\доске.

Просто разговор.

По самой беседе — 50/50 будет 1 или много интервьюеров, в целом, неплохо когда сразу несколько, и интересно, когда это выглядит как перекрестный допрос — спрашивают все и много.


Пример типичных заданий/вопросов

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

Например — как смержить два отсортированных массив. Потом, если у нас массивов больше чем 2. Какая сложность, как оптимизировать, а что если мы изменим это и то. На мой взгляд, это очень хороший подход. Тебя не огорашивают сложным алгоритмом, а дается что-то простое, а потом начинается разговор на тему.


Спецификация Java


  • equalsand hashcode contract, что будет если нарушить
  • как устроен hahsmap. С разной степенью детализации начиная от как hash используется (даже не спросили что будет если нарушить контакт) до — CHM, copy on write array, как устроены внутри, blocking read/write. как бы сделал, segments locks, conc level.
  • volatile (memory barier), happens before semantic
  • java 7 — chm, atomics, nio (?)
  • java 8 — streams, lambda
  • GC (я кажется могу делать презентации на эту тему уже)
  • вопрсо про volatile массив, volatile int[] arr; arr[2] = 2; int j = arr[2];
  • double checking locking
  • не понял, но где то видел как пример интересного вопроса:
    Object[] o = new OBject[10](); VS Object b = new Object[10]();(вот тут я не знаю сам ответ, если кто читает — помогите с этим вопросом)
  • notify notify All, producer consumer и когда можно\нельзя исползовать notify вместо notifyAll


Алгоритмы

норм-сложно


  • проверка баланса скобок ({[ — check-for-balanced-parentheses-in-an-expression
  • вычисление выражение (дана строка с цифрами, ±*/ скобками вычислить значение) — expression-evaluation
  • BFS/DFS — bfs-vs-dfs-binary-tree
  • поиск пути в графе от вершины ко всем, наименьшего между 2 вершинами — find-if-there-is-a-path-between-two-vertices-in-a-given-graph
  • отсортировать стэк — sort-stack-using-temporary-stack

сложно


  • поиска наибольше одинаковой подстроки в двух строках — longest-common-substring-java
  • нахождение наименьшего суффикса слова, при добавлении которого к слову получится — палиндром — Longest palindrome prefix
  • нахождение компонент связности в графе (union find)


Задачки

легко


  • числа Фибоначчи, (итеративно, рекурсивно, tail recursion c примерами)
  • проверка числа на простоту, напечатать все простые числа меньше N
  • fuzz buzz (с 2 сравнениями это чуть интересней)

норм


  • ring buffer, thread (non)safe, (non)blocking.
  • producer consumer, различиные notify/notifyAll, когда можно заменить один другим.
  • сделать из queue → blocking queue черех wait notify
  • thread safe кэширование результатов тяжелой функции
  • calculate VWAP (with sliding window, global)
  • sliding mean/avg
  • найти наибольий треугольник в массиве чисел
  • все числа из цифр, все цифры из чисел
  • найти общего предка в дереве (с известной-неизвестной глубиной)
  • подсчет битов в числе — среднее количество итераций, средний ответ.
  • посчитать самую длинную последовательность одного и того же символа в строке (строка дана изначально, строка как стрим).
  • различные варианты с массивом цены на сток и операциями купить продать (купить только раз, N раз) — надо максимизировать прибыль
  • найти все одинаковые строки ротаций — check-for-string-rotation-in-java/

сложно (из разряда, непонятно кто их составлял и для кого)


  • поиск выхода в лабиринте — maze
  • кони на шахматной доске — Knight’s tour, сколько потребуется ходов чтобы достичь клетку i, j
  • поиск слова в матрице букв — leetcode-word-search-java
  • дейкстра (пересчитывать только те, кого зааффектили, использовать для этого разницу между текущей оценки вершины и новой).

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


  • раскраска красками домов — leetcode-paint-house-java
  • есть массив из высоты потолка и пола. На каждом шагу мы можем остаться на полу или потолке, как построить луч максимальной длинны.
  • написать throthler для публикации потока цен, простой вариант — есть поток цен, мы должны паблишить не чаще чем раз в 1 секунду. throttling vs conflation.
  • спроектировать как брут форсить пароли.
  • есть 2 текста (каждый по 1GB), по одному у каждого пользователя. Пользователи могут обменяться только <1000 байтами, как понять одинаковые ли у них тексты в 99% случаем (важно — не чтобы это работало на 99% текстов, а именно в 99% случаев сравнения лубых двух текстов). Тут просто поговорить, т.к. сколько надо бит информации, чтобы вероятность успеха была 1-epsilon.


ООП


  • написать программу, которая бы эмулировала работу библиотеки
  • ATM (банкомат)
  • больница — есть пациенты с болезнями, есть лекарства, которые лечат болезни и имеют определенные побочные эффекты, эмулировать пример X лекарств на Y множестве пациентов.
    организовать систему хранения данных для навигатора (хранить карту дорог и домов по сути). оценить количество индексов, количество перекрестков.


Немного занимательной математики


  • макс площади треугольник вписанный в круг\квадрат.
  • среднее время ожидания автобуса (автобус ходить 3 раза в час по расписанию\случайно)
  • поезда отходят от платформы на восток и на запад с одинаковой частотой. Мужчина приходит на платформу и садится в первый поезд. Жена живет на востоке, любовница на западе — почему то так получается, что он чаще едет к жене — как так?…
  • при заданном объеме найти цилиндр максимальной площади


Общие вопросы по разработке


  • приложение зависло — что будем делать
  • как профайлить, смотреть память
  • как вы тестируете свое приложение
  • TDD
  • SOLID
  • популярная нынче тема — микросервисы.


Ресурсы для подготовки


  • leetcode
  • hackerrank
  • interviewbit
  • geeksforgeeks
  • и много много им подобных (проект Эйлера еще)
  • glassdoor
  • google
  • practice-practice-practice and have fun!

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

© Habrahabr.ru