Мои собеседования 2021 edition
Внимание: повествование будет идти в стиле «здравствуй дорогой дневничок», без критики и срывов покровов. Я строго против публичной критики компаний в разрезе процесса интервью. Хотят устраивать 5 алгораундов — их дело, они будут платить тебе деньги и вправе решать как проводить собеседования. С другой стороны, я считаю, что могу высказывать свое мнение без конкретных имен. Все описанные компании не российские. Извиняюсь за англицизмы.
Глоссарий
Термины используются исключительно в контексте данной статьи
сторонний рекрутер — рекрутер, который пытается тебя продать другим компаниям, получая % от твоего оклада. Некоторые компании принципиально не нанимают сами, и единственная возможность попасть к ним — через стороннего рекрутера
CV — резюме
leetcode easy — задачи, которые должен уметь решать каждый программист
leetcode medium — задачки сложнее, без подготовки решить которые может быть сложно
leetcode hard — сложные задачи, требуют предварительной подготовки
простой system design — придумай архитектуру системы
классический system design — придумай архитектуру системы, но так, чтобы она работала под нагрузкой
follow-up — когда текущая задача изменяется в сторону усложнения
DP — динамическое программирование
О себе
Опыт 10+ лет в бэкенде, небольшой опыт управления, стек самый разнообразный: от ruby до clojure. Интересующие позиции: синьор+, строго бэкенд, строго не блокчейн и не node.js/php.
Почему собеседуюсь: проверить свой уровень, если будет что-то интересное, то готов перейти. Текущая компенсация устраивает, и переходить в другую компанию я готов только на бОльшую з/п.
Сам подал CV только в Сloudflare, но получил отказ. Очень надеюсь, что из-за миграционного статуса.
Компания по доставке еды
Известна тем, что платит сильно меньше рынка. Связались на прямую в linkedin, предложили менеджерскую позицию, но я отказался. Узнав финансовые ожидания, подумали и решили провести пару раундов.
Первый раунд был очень простым кодингом (leetcode easy).
Второй раунд был простым system design: придумать схему данных и какие эндпойнты использовать для решения конкретной задачи + обсудили пару подводных камней.
Третье интервью было с нанимающим менеджером, просто поговорили за жизнь. Задачи команды показались мне неинтересными.
Через неделю пришел отказ без объяснения причин. Через третьих лиц удалось узнать, что причиной стало «не соответствие опыта и запрашиваемой з/п». Один из собеседующих позже подтвердил, что технически все ок, значит дело было в менеджерском раунде или размере запрашиваемой з/п.
Выводы:
завалить можно не только техническую секцию
детального фидбека в случае отказа добиться очень тяжело
компания может запустить процесс, даже если уже заранее знает, что по деньгам вы не сойдетесь
Компания по бизнес процессам
В linkedin со мной связался сторонний рекрутер. Данную компанию я знал, и мне было бы интересно поработать в ней.
Первое собеседование было чисто по ruby. Это мое первое собеседование на знание конкретного языка за последние 5 лет точно: proc vs lambda, prepend vs include и так далее (рубисты поймут). Далее были вопрос про oauth, ssl и одна интересная задачка, не связанная с кодингом, которую я решил. Ответил по ощущениям процентов на 80%, это собеседование было полезным, нашел пару пробелов в знаниях.
Второе собеседование было больше на поболтать с руководителем SRE отдела.
Третий раунд был с топ менеджером на поболтать + задача на LRU кеш (leetcode medium).
Четвертое было полностью аналогично третьему, только без задач.
Рекрутер мне обещал оффер «вот-вот», но просил подождать (а я и не торопился). Через месяц пришел отказ без объяснения причин. Мне казалось, что все шло хорошо, и что я сделал так не знаю до сих пор.
Выводы:
Банк #1
Не смотря на мою нелюбовь к банкам, я рассматривал эту позицию, потому что там используется язык, который мне крайне интересен.
В первом раунде два человека спрашивали по всему от big-oh до многопоточного программирования:
что такое REST и unicode
как бы ты закодил X
что такое big-oh
процесс vs поток
Ответил на 90% вопросов.
Вторым раундом было несложное тестовое задание. Сама поставленная задача достаточна популярна и вне банка, что подтвердилось легким гуглежом. Я принципиально не списывал, хотя, возможно, если бы заглянул в решения, то увидел бы подсказки к третьему раунду, но я рад, что все получилось честно.
В третьем раунде было исправление ошибок в виде парного программирования + новые фичи. Самым сложным из ошибок для меня были интеграционные тесты: никак не мог заставить работать руби с входными потоками ввода и вывода (гуглить было можно). Убил 20 минут, но все-таки сделал. Оказалось, что для follow-up задач моя архитектура совершенно не подходит, я наговнокодил (именно так) одно задачу, но ни я, ни собеседующие, не были в восторге от результата.
Как итог желаемую з/п мне предложить не смогли, поэтому разошлись.
Выводы:
Карточная компания
В эту компанию я очень хотел попасть. Она известна своей крутой инжиниринговой культурой + отличная компенсация + офисы где хочешь. Компания написала в linkedin, созвонились и договорились на скрининг.
На скрининге была простая задача с двумя простыми follow-up-ами. Дальше был назначен онсайт в зуме. На почту пришло подробное описание всех раундов
Первая сессия была алгокодинг, с какой-то простой задачей (чуть слабее medium)
Вторая сессия была на реальный код: нужно было написать кусок кода, который делает http запросы, агрегирует данные и посылает их в третий эндпойнт. Было несложно, но допустил неприятную ошибку и не успел сделать последний этап (всего их было 5). Собеседующий отключил звук и камеру, что мне не понравилось.
Третья сессия была беседа с менеджером и запомнилось его интересным ответом — почему он сменил компанию из FAANG на эту.
В четвертой сессии случился конфуз — нужно было найти ошибку в специально подготовленном PR, тест был. Баг заключался где-то в недрах обработки сложной древовидной структуры, связанной с обработкой текста. Без дебаггера мне найти ошибку было практически невозможно, а я выбрал язык который я отлаживаю исключительно выводом логов. Я успел локализовать баг, но не исправить его. Фейл.
Пятая сессия была классическим system design на сбор метрик с микросервисов. Человек по ту сторону экрана очень плохо говорил по-английски, и друг-друга мы практически не понимали. Не уверен какой я рейтинг получил, но я считаю, что с задачей справился.
Вскоре пришел отказ с предложением обсудить фидбек, от которого я отказался. Очень интересное собеседование и компания, только положительные эмоции.
Выводы:
Карточная компания #2
Как они на меня вышли восстановить в памяти не удалось, но точно это был сторонний рекрутер.
Первый этап был созвон с CTO, поболтали за жизнь.
Вторым этапом шло тестовое задание на node.js, которого я не знаю. После переговоров мне было разрешено делать на golang. Пришлось реализовывать не только само задание, но и болванку, так как оригинальная болванка была все на той же ноде. Кроме того, в требованиях было настроить прекоммит-хуки и малоизвестный лоад-тестер, оба эти требования мне показались странными.
После отправки тестового выяснилось, что я в конфиге лоадтестера в одном месте забыл поправить абсолютный путь на относительный (тест у меня не работал локально и я «игрался с настройками»), что стало результатом отказа с формулировкой «лоад тест не запускается». Мне было очень обидно: ни архитектуру, ни тот факт, что решение сделано полностью на другом языке, ни чего бы то ни было другого команда даже не посмотрела.
Рекрутер (именно сторонний рекрутер, а не компания) предложил исправить и переотправить, но я отказался. Из интересного впереди меня ожидало два дня неоплачиваемой работы на эту компанию, чтобы «посмотреть на друг друга», я рад что до этого не дошло.
Выводы:
тестовые задания буду делать только в те компании, в которые я хочу попасть, свое время дороже
Интернет-магазин
Бомбардировали мой linkedin давно, но все время было не до них.
Первый этап были общие вопросы + кодинг. Первый раз за долгое время попалась задача, которую я сходу не знал как решить (очень похожа на 2-sum по идее, но не решению). Я упустил важный момент и закодил ее неверно. Позже, буквально за минуту до конца мне удалось ее поправить.
Про что был второй этап я, к сожалению, не помню. На обоих этапах были значительные проблемы с коммуникацией.
Третий этап был менеджерский, и тут с английским было все хорошо, менеджер пошел по моему резюме и сходу задал три релевантных вопроса, на которые я дал неправильный ответ. Интервью прервалось через 30 минут после начала. Я был в шоке, было ощущение, что я ничего не знаю и вообще пора в джуны. Один из вопросов был: является ли редис однопоточным и я ответил неверно, второй был про сборщик мусора в питоне, (я писал на питоне 3 спарк джобы и только поэтому его упомянул, этот вопрос был помимо упомянутых трех, и я не считаю его релевантным). Мне было стыдно, но провалы случаются, надо двигаться дальше. Все свои ошибки я учел.
Выводы:
никогда не поздно свершиться epic fail-у
если с чем-то ты работал вскользь — стоит об этом упомянуть или вообще не показывать в CV
Барахолка
Компания написала мне в linkedin, позиция звучала как «principal engineer». Мы созвонились с рекрутером в пятницу, он обещал мне выдать тестовое задание буквально через пару часов, и я должен был его сделать за выходные.
Тестовое задание не пришло (возможно я чем-то не понравился, дело явно было не в деньгах), и я забыл про эту компанию. Внезапно, через неделю, опять же в пятницу задание пришло! На эти выходные у меня были другие планы и я предложил сделать через неделю, на что был получен ОК. За следующую неделю задание я так и не сделал и даже не начал, о чем честно написал и предложил прекратить общение, но мне дали еще одну неделю, и время найти у меня получилось. Ничего сложного, консольное приложение с минимальной многопоточностью.
Второй этап был онлайном кодингом: нужно было сделать крестики нолики с любым размером поля за час. Была одна подсказка по коду, которую я должен был учесть сам, но в целом я считаю, что все прошло хорошо, а собеседующий меня похвалил.
Вторая сессия была классическим system design, первая часть прошла хорошо, на второй мне дали задачу, которую я не мог понять минут 15. Когда до меня все-таки дошло, то времени на кодинг уже практически не оставалось, то что я сделал не устроило интервьювера, а в планах было еще разобрать эту задачу в рамках классического system design, но как это планировалось сделать за 30 минут для меня загадка. Интервьювер пытался подсказать, но ни одной подсказки я не понял.
Через пару дней пришел ожидаемый отказ.
Выводов из этой истории я не сделал
Банк #2
Сторонний рекрутер отправил мою кандидатуру, и через месяц меня пригласили на кодинг сессию по телефону. С этим банком я уже общался пару лет назад, но прервал процесс, так как принял другой оффер.
На первой сессии было две задачи: rain drop и на технику scan line. С первой я просидел почти час, почему-то она мне давалась с трудом, а вторую решил за 15 минут. Был получен позитивный фидбек.
На второй сессии два человека гоняли меня по всему — от флагов в chmod до оценки памяти в merge сорт. Было все: и как найти процесс по порту, и как решить задачу на анаграмму. Куча вопросов, на все я ответил только по алгоритмам, остальные с переменным успехом. Аналогичный раунд повторился еще 3 раза (решили проверить на мне весь банк вопросов видимо)! Вопросы были разные, правда по chmod повторился, и тут я уже был готов. Одна сессия была про дебаг упавшего приложения (не работает сервис, что делать?) мне понравилось, подобные секции отлично показывают твой опыт. Один из вопросов, на который я не ответил, звучал так: «система выдает ошибку «нет места», хотя место есть, как такое может быть?». Больше всего мне не понравился вопрос «чем отличается абстрактная фабрика от обычной». Почему-то подобные вопросы вгоняют меня в уныние. Я старался экономить время интервьюверов и на подобные вещи сразу отвечал «no idea». Вот некоторые вопросы, с которыми я столкнулся:
how ssl works?
could you explain /proc structure
heap sort vs normal sort
is it possible to have more than one A-record
what’re json pitfalls
what’s the difference between .net gc and python gc
Последний вопрос у меня вызвал искреннее удивление, если оба языка у меня присутствуют в CV значит, видимо, такие детали я должен знать.
Последним раундом было собеседование в команду SRE, которое остановилось после моей фразы «я не SRE» (20 минут, рекорд).
Пришел отказ без фидбека, отличная встряска для мозгов, всегда можно найти то, что ты не знаешь.
Выводы:
Компания «прикольные видосики онлайн»
Они и сейчас продолжают бомбардировать linkedin. Со мной связалась сторонний рекрутер.
Первый раунд был на все про все а-ля Банк #2, но ближе к моему CV. Я ответил на все вопросы, разве что ответ про circuit-breaker звучал недостаточно убедительно (или мне так показалось). Последовала простая задачка на двухмерное DP, чем-то она смутила интервьювера, но ошибку найти не удалось (потому что ее не было).
Вторая секция была на классический system design: url-shortener.
Третья беседа с менеджером — обычная болтовня. После этого мы пообщались с рекрутером, я переслал данные по своей ожидаемой и текущей з/п. Было явно видно, что мои ожидания им не нравятся, хотя я заранее проверил рейт компании в открытых источниках, и мои цифры отлично в эти данные вписывались.
Через две недели мне пришел отказ: «у нас закончился хед-каунт» и предложение пройти собесы с нуля в другую команду.
Четвертая секция (назовем это так) была разговором с менеджером другой команды — общие вопросы и простая задача. Здесь был очень странный момент с вопросом про модель конкурентности в go (какая-то аббревиатура, но не CSP), на что я рассказал то, что знал: про n: m мэппинг горутинг в треды, паркинг горутин при I/O, CSP, но видимо это было не то, что ожидал рекрутер. Я очень негативно отношусь к подобным специфичным вопросам.
Через неделю пришел отказ без объяснения причин.
Выводы:
даже в случае успех во всех раундах тебя могут не взять, например могут найти другого кандидата дешевле, и это нормально
Банк резюме
Со мной связалась компания в linkedin. Первый этап был скрининг, который проводила сторонняя компания, специализирующаяся на скринингах. Это был интересный опыт: были две-три простые задачки, потом из 5 тем на обсуждение нужно выбрать две, темы были такие:
frontend
OOP design
highload
linux internals
пятую не помню. Очевидно, что я выбрал две последних. Ничего интересного не было, стандартные thread vs process и дебаг упавшего приложения.
Был получен положительный фидбек и последовал онсайт. Перед онсайтом был созвон, где мне 45 минут советовали как правильно проходить собеседование, сообщали, что «мы ищем причины взять, а не отказать» и тому подобные вещи. Лично я крайне отрицательно отношусь к подобным сессиям, они не несут никакой пользы для кандидата.
Онсайт в данной компании проводится строго по средам, 5 этапов + вводный и заключительный от главы подразделения в данной стране. Первая неприятность случилась уже на вводном этапе — на зум колле было 4 кандидата, включая меня, и все кандидаты увидели друг друга, как по мне компания пренебрегает приватностью. Это не было озвучено заранее, иначе я бы не включал камеру и изменил бы имя. На заключительном этапе я дал на это фидбек (его просили), и лид офиса встретил мои комментарии полным непониманием. «В таком случае мне пришлось бы тратить час по 15 минут на каждого» утром и вечером. Что ж.
Первая секция была на валидацию программы по некоторым правилам. Особенность секции была в том, что запускать программу нельзя, нужно объяснить решение полностью словами, потом написать код, потом сделать трассировку и исправить ошибки. Если честно, мне больше нравится запускать и отлаживать, чем трассировать словами, но выбора не было, справился.
Вторая секция была на ревью онлайн PR. Была взята реальная функциональность с сайта компании и код, который ее реализует. Язык нужно было выбрать заранее, список такой: Python, Java, C++, Javascript, Go. Go добавили буквально месяц назад, так что считаю, что мне повезло, с остальными у меня нет опыта написания «веб-штук». Размер PR-а был небольшим, и тебе дается 30 минут, чтобы отметить все, что тебе не нравится. Я нашел два бага, пару неточностей, предложил как улучшить алгоритмическую сложность в паре мест и попросил добавить тесты. Тут скорее всего я не обратил внимание на очень важную вещь — сервис был не durable, то есть все данные хранились в памяти, и абсолютно точно нужно было об этом указать. Но я даже об этом не подумал, и осознание пришло уже вечером. Я не был готов к этому заданию, в следующий раз буду.
Секция system design была стандартной, но мы очень долго обсуждали как сделать пагинацию, и мне кажется интервьювер меня так и не понял. Я совершил ошибку, предложив сделать пагинацию не page/perPage, а after=timestamp, там всплыло пару подводных камней.
Вторая алго-секция начиналась с классической задачи на рейт-лимитинг. Кодинг занял очень мало времени, но вот с оценкой я напортачил, тут она O (1) amortized. Так как задачу я решил быстро, было решено обсудить аналогичную задачу только на плавающую медиану (leetcode hard). Я объяснил свое решение и оценку и закодил. Интервьювер остался доволен.
Последний раунд был с менеджером, ничего интересного я рассказать не могу, все стандартно.
Через 40 часов пришло письмо, что на эту позицию они взяли другого, а для меня ищут другие позиции. Через 3 дня пришел отказ. Самый безболезненный отказ, так как мне абсолютно не понравились технологии, используемые компанией, и отзывы в интернетах.
Компания из фаанг
Все-таки мне повезло, и компания из фаанг мне написала. Им требовался опыт с java, которого у меня не было, о чем я сразу сообщил, но компания решила продолжать. Что меня удивило, что тут с тобой связывается менеджер, а не рекрутер.
Первый раунд был с нанимающим менеджером. Была простенькая задачка на поиск по категориям и вопросы по tcp/ip.
Второй раунд был с другим менеджером, на которой мне попалась несложная (не считаю ее hard-ом) задачка, но я решил ее неоптимально и, что еще хуже, я считал что решил ее оптимально. Предложенные оптимизации ставил под сомнение, так как не понимал как они работают. Было очень много синтаксических ошибок в java (опыта-то нет).
Компания запомнилась рекрутером, который пожелал мне удачи на интервью, которое прошло два дня назад.
Тут не пришел даже отказ, вспомнился этот анекдот:
Второй год пошел, как не звонят после собеседования…
Начинаю подозревать, что они взяли кого-то другого…
Электронный банк
Со мной связался сторонний рекрутер в linkedin.
Первым этапом были две простые задачи на hackerrank-е (или codility, не помню). Я получил 100 из 100.
Вторым было техническое интервью все обо всем а-ля банк #2, но с нацелом на требуемые технологии и мое CV. Был очень неформальный и взаимоуважительный разговор. Вопросы:
что такое докер?
как бы ты сделал авторизацию для веб приложения
как избегать проблем с at least once delivery
Была задачка на Go, решенная на 70%. Второй раунд был с менеджером, который спросил про SOLID и дал задачку на бинарный поиск. Закончили за 30 минут. Через 2 недели был фидбек «выбрали другого кандидата». Именно тут, как мне кажется, сыграл вопрос денег и тот факт, что у меня уже был оффер от другой компании, который я должен был подписать за два дня.
Еще было примерно 5–10 компаний, которые прекращали общения после озвучивания ожиданий от з/п, ни одна не написала «слишком много для нас».
Процесс в компанию, куда я принял оффер, описывать не буду. Все достаточно стандартно, кроме того факта, что во время технических раундов я настолько понравился, что меня решили попробовать на должность повыше, и не без труда я справился с этой задачей.
Из всех перечисленных компаний, еще раз попробовать я бы хотел только карточную компанию.
Выводы и мысли вслух
Я считаю собеседование на знание языка программирования в большинстве своем бесполезными. В своей карьере я скакал примерно так: ruby → clojure → golang → C# и проблем это не вызывало, фидбеки от руководства и коллег я имел положительные. Синьорность — это в первую очередь софт скиллы и опыт некоторого говна, знания по языку подтягиваются очень быстро.
Алгоритмические собеседования отходят на второй план. Они все еще имеют место быть там, где нужно произвести большой отсев, но чтобы проверить просто кодинг можно дать что-то не алгоритмическое, максимум — бин поиск. Так что в ФААНГ без литкода никак.
Крупные компании используют разные секции и это отлично, 5 раундов кодинга, как по мне, не имеют большого смысла.
Тестовые задания не супер популярны, что не может не радовать. Обычно, тестовое задание является первым или вторым раундом и очень обидно потратить пачку выходных на него и потом завалить, например, алго-секцию. Я для себя решил, что буду делать тестовое задание, только если куда-то очень захочу попасть или буду сидеть без работы.
linkedin обязателен если планируешь работать вне России.
Glassdoor дает хорошее представление о том, какие вопросы и задачи вас ожидают на собеседовании.
На собеседования тратиться очень много времени и сил, которые лучше потратить на свою текущую работу. Часто я приходилось брать выходные, так как было много этапов в один день.