Хочу поделиться личным опытом прохождения собеседований в ведущие российский IT-компании на Go и PHP разработчика.
Статья, в первую очередь, написана для тех, кто еще не устраивался в крупные IT-компании. Надеюсь, статья поможет соискателям лучше подготовиться к собеседованию и найти работу в компании мечты.
До 2021 года я работал в малом бизнесе на себя. 3 года назад принял решение стать наемным сотрудником, и устроится какую-нибудь компанию первой десятки IT. Тогда для меня стало откровением, что с 20-летним стажем программиста я не заинтересовал серьезных игроков рынка. Сейчас же подавляющее большинство моих собеседований заканчиваются предложением о работе.
Последнее время мне также приходилось выступать в роли интервьюера на собеседованиях, поэтому я знаком с процессами интервью с обеих сторон.
Если вы уже знаете как получить приглашение на интервью и как оно проходит - смело проматывайте до раздела "Собеседование - скрининг"
Процессы найма разработчиков в топовые IT- компаниях похожи друг на друга. Поэтому чем больше личный опыт собеседований, тем выше понимание что будут спрашивать и лучше подготовка. Для объективного сравнения сотен кандидатов и выбора лучшего у каждой компании процессы, задачи и вопросы на собеседованиях стандартизированы. Иногда создается впечатление, что они копируют эти процессы друг у друга процессы.
В небольших компаниях собеседования скорее носят эксклюзивный характер, порой не имея никакой системности - каждый интервьюер проводит собеседование на свое усмотрение.
В общем случае процесс собеседований состоит из этапов:
Знакомство с рекрутером
Собеседование - скрининг
Собеседование по платформе
Собеседование по алгоритмам (или программирование)
Собеседование по архитектуре (или system design)
Знакомство с командой
Получение офера
Каждый из этапов будет подробно рассмотрен далее. Интервалы между этапами могут быть от одного дня до недели. Некоторые этапы собеседований могут объединяться в один, их названия могут отличаться, но суть остается прежней.
Поиск
Для поиска работы на мой взгляд, достаточно следующих ресурсов:
hh.ru (он же HeadHunter) - это главный российский ресурс, где ищут дорогих специалистов, поэтому нам сюда. Размещайте здесь свое резюме. Тут же можно откликаться на понравившиеся вакансии.
linkedin.com - международная соцсеть для поиска работы. В основном, здесь ищут в кандидатов иностранные компании, но и рекрутеры российских компании тоже ее активно используют. Сейчас сеть не доступна из РФ без VPN. Чем больше у тебя коннекшенов (друзей), тем чаще тебя будут находить рекрутеры. Поэтому постарайся найти как можно больше своих знакомых и зафрендиться с ними. Желательно иметь не менее 100 контактов. Мало реальных знакомых? Тогда френдись с it-рекрутерами, с друзьями друзей или с кем-нибудь близким по специальности.
Сайты компаний твоей мечты. На сайте всех компаний есть раздел со списком вакансий и форма для отправки резюме. Кстати, там могут быть размещены далеко не все существующие вакансии. Найдите несколько особо понравившихся вакансий и отправьте на них свое резюме. Оно улетит ответственному рекрутеру и вероятно, он свяжется с вами.
Пока у тебя мало опыта и резюме не выглядит круто - придется самому активно искать вакансии, откликаться на них и самостоятельно рассылать резюме. Очень часто будут игнорировать или присылать вежливые отказы.
Как только твое резюме станет выглядеть круто, все кардинально изменится. Уже не обязательно искать вакансии. Рекрутеры сами будут выходить на вас и звать на собеседования.
Ситуация на рынке труда сейчас такая, что граница между "я никому не нужен" и "все меня хотят" очень резкая. Много джунов, с которыми не хотят связываться, и очень большая востребованность в мидлах и сеньорах.
Чтобы резюме выглядело круто и привлекательно, на мой взгляд необходимо:
Опыт работы IT-шником несколько лет в любой компании
Последнее место работы в солидной конторе или в каком-то непонятном месте, но с солидно звучащим названием (например, иностранная фирма)
Перечень нужных технологий. Портянки на целую страницу писать не обязательно. Достаточно перечислить основные технологии. Рекрутеры ищут в резюме нужные ключевые слова, например, Go, Postgres, Redis, Kafka, Docker. Увидев набор нужных слов, рекрутер начинает работать с кандидатом
Нужно указать нормальную желаемую зарплату. Низкая зарплата - это плохой сигнал для рекрутера! Выясните какие средние зарплаты в этой фирме на эту позицию. Цени себя и тебя оценят другие.
Главная задача твоего резюме - заинтересовать рекрутера и начать диалог. Как будет развиваться дальнейший диалог - это следующая тема.
Знакомство в рекрутером
Все начинается со знакомства с рекрутером. Рекрутер это специалист который будет закреплен за тобой и проведет по всем этапам собеседований. Рекрутер может быть как штатным рекрутером компании, так и представителем рекрутингового агентства, но для вас это не имеет особого значения, это внутреннее дело компании. Рекрутер может позвонить или написать на почту, но чаще пользуются мессенджерами.
Рекрутер это не технический специалист, поэтому в наших с вами умных терминах не всегда хорошо ориентируется, хотя и слышал о них. Кстати, рекрутеры сейчас обычно это девушки, поэтому есть шутка, что "LinkedIn это такой сайт знакомств, где стремные парни отшивают красивых девушек"
После нескольких фраз в переписке вам предложат созвониться минут на минут на 20. В разговоре будет следующее:
Попросят немного рассказать о своем опыте
Расскажут о вакансии и чем именно придется заниматься (обычное ищут на конкретную вакансию, но не всегда)
Возможно зададут несколько технических вопросов. Но так как рекрутер это не технарь, то вопросы он задает по шпаргалке, и может вообще не понимать их смысла. В шпаргалке написан текст вопроса и какие ключевые слова от вас хочется услышать в ответ.
Просто постараются убедиться что вы вменяемый человек, и что вы действительно тот специалист за которого вы выдаете себе в резюме.
Если беседа прошла хорошо, то рекрутер переведет вас на этап технических собеседований. Эти собеседования уже будут проводить реальные сотрудники компании куда вы хотите устроиться, а рекрутер будешь координировать процесс.
Рекрутер заинтересован в том чтобы вы успешно прошли все этапы и затем приняли офер. От этого зависит его доход, поэтому считайте его своим союзником. Например, можно попытаться разузнать про что именно вас будут спрашивать на технических собеседованиях, и возможно вам намекнут какую тему стоит повторить перед собесом.
Технические собеседования
Технические собеседования проводят сотрудники компании. Обычно это обычные разработчики компании или тим- тех- лиды, которые изъявили желания участвовать в проведении интервью.
Типичное интервью длиться 1 час. Но если компания впихивает несколько этапов в одно интервью, то интервью может длиться и 2 часа.
В начале интервью интервьюер представится и предложит перейти на "ты". Дальше идет само интервью, а после остается 10 минут, где вам предлагают самим задать вопросы. Тут вы можете расспросить о том как устроен процесс разработки в компании, какие технологии применяются, как строится командная работа. Очень рекомендую задать эти вопросы. Во первых вы лучше узнаете о том куда идете, а во вторых, если кандидат ничем не интересовался, то это покажет незаинтересованность и пассивность, и это будет не в вашу пользу.
После окончания интервью, интервьюер попрощаться с вами и составит отчет о встрече. Сразу или в течении 1-2 дней. Отчет уйдет рекрутеру. Дальше будет приниматься решение, стоит ли вас переводить на следующий этап или стоит попрощаться.
Собеседование проходит в одном из мессенджеров с показом видео, например, в Zoom или в чем то подобном. Так что постарайтесь чтобы ваше изображение в камере оставило хорошее впечатление.
Если вас собеседуют одновременно 2 интервьюера и один в основном молчит, то с большой вероятностью один из них это опытный интервьюер-учитель, а второй ученик, который еще только обучается проводить интервью самостоятельно.
Собеседование по алгоритмам и по платформе подразумевает написание кода. Это называется live coding. Писать код вы будете в онлайн редакторе с подсветкой синтаксиса, и скорее всего у вас не будет возможности запускать написанный код. Будьте морально готовы к этому.
Для собеседования на архитектуру - вам дадут графический онлайн редактор где вы сможете рисовать схемы.
Если вам предстоит собеседование с live coding, попробуйте поинтересоваться у рекрутера, какие виды задачек там будут. Будет ли это собеседование по алгоритмами или наоборот это будут какие то практические задачи, которые встречаются в повседневной работе.
Собеседование - скрининг
Скрининг - это первое техническое собеседование. Его задача понять, стоит ли продолжать общение с кандидатом. По сути это первичный фильтр. Собеседование короткое, около 30 минут. Проходит по стандартной анкете со списком стандартных вопросов по нескольким темам. Вопросов несколько десятков, времени на ответ у вас будет мало и глубоких ответов от вас не ждут. Интервьюер даже будет часто прерывать ваш ответ фразой "ага, понял, ты это знаешь" и переходить к следующему вопросу, чтобы уложиться в 30 минут. Грубо говоря у вас на каждый ответ будет около минуты. Результат скрининга - обычно бинарный, просто прошел или не прошел. Вы должны просто корректно ответить на определенный процент вопросов.
Типичные темы скрининга:
Про язык программирования на которым вы будете работать (языковые конструкции, их особенности…)
Про базы данных (в основном про SQL запросы, виды индексов, оптимизацию, шардирование, репликация, ACID)
Про сети (TCP/IP и прикладные протоколы)
Про работу и устройство операционных систем Linux
Поверхностно про контейнеризацию
Про процессы деплоя CI/CD, тестирование, деплой и мониторинг больших систем
Собеседование по платформе
Это собеседование по языку программирования на котором вам предстоит работать. Нужно хорошо знать свой язык и все его конструкции. Так же нужно ориентироваться во вспомогательных инструментах, таких как отладчики, профилировщики и пр.
Вам предложат несколько задач с написанием кода, которые покажут ваше понимание языка и умение его применять. Параллельно с написанием кода вас будут расспрашивать о сопутствующих темах, которые имеют отношение к текущей задаче.
На этом собеседовании не потребуется работа со сложными алгоритмами. Для алгоритмов есть отдельное собеседование.
Примеры задач, с которыми вы можете столкнуться:
Написан какой то коварный код, и вас спрашивают что будет выведено и почему. Чтобы корректно ответить нужно понимать как работают указатели, как аллоцируется память, понимать тонкости области видимости переменных и тонкости работы с замыканиями. Задачи коварные, и возможно вы ошибетесь в ответе. Тогда вам подскажут корректный ответ и предложат попытаться объяснить почему он такой. Если ошиблись в ответе, но смогли разобраться, то это уже неплохо.
Для многопоточных языков типа Go дадут задачку в которой надо корректно работать с несколькими параллельными работающими горутинами и использовать примитивы синхронизации. Так что гошникам точно надо повторить работу со всеми базовыми примитивами синхронизации, особенно с каналами (и select-тами), вейтгруппами, атомиками. Так же стоит поглубже вспомнить что такое контексты, почему то многие кандидаты затрудняются объяснить что это такое и для чего нужно.
Практичные задачи связанные с работой с сетью и вводом-выводом. Для Go хиты последнего сезона это задачи на написание кэшей и различных rate-лимитеров.
Чтобы получить высокую оценку, вам еще необходимо разбираться в кишочках языка программирования, инче ваш уровень будет оценен как начальный-средний-джуновский, и на хорошую позицию в компании вы не сможете претендовать.
Например, в PHP стоит понимать внутреннее устройство ZVAL, как работает память, что такое copy-on-write, как работает менеджер процессов FPM…
Для Go нужно разбираться с тем, что находится под капотом у каналов, интерфейсов, мапов. Разберитесь в том как устроена работа с памятью, конкурентностью и вводом выводом и особенно с сетью. Нужно хорошо понимать чем горутины отличаются от тредов и почему ввод-вывод на Go такой эффективный. Подсказка: асинхронный ввод-вывод, пулы, собственный планировщик, собственный менеджер памяти.
Можно найти кучу статей на хабре и роликов на ютубе по всем этим кишочкам. От вас не будут требовать деталей, но важно понимать как все это работает под капотом и уметь рассуждать об этом. Хорошо если вы немного покопаетесь исходном коде рантайма языка программирования (в статьях и роликах вы найдете подсказки в каких именно файлах исходников стоит покопаться). Упомянув о копании в исходниках - вы вызовете уважение интервьюера.
В этом же собеседовании с вами могут обсудить знание сопутствующих технологий, таких как базы данных, серверы очередей, контейнеризацию и пр. Желательно разбираться в этих вопросах не только с точки зрения пользователя, но и немного разбираться в их внутреннем устройстве. Например, для баз данных, будет неплохо понимать как под капотом устроены различные виды индексов, или каким образом реализуется изоляция транзакций в MVCC.
Собеседование по алгоритмам
Для многих кандидатов это самое сложное собеседование. Ведь чтобы пройти собеседование по платформе, достаточно просто иметь большой опыт работы. А вот решение задач по алгоритмам обычное не является чем то типичным для обычного разработчика.
Можно быть крутым и опытным программистом, но проваливать собеседования по алгоритмам. К собеседованиям по алгоритмам надо долго готовиться, если только ты не опытный участник олимпиад по программированию или не проводишь свободное время в LeetCode. Данный собес в какой то степени лотерея, ведь если ты уже сталкивался с подобной задачей - то ты ее решишь, а если первый раз видишь, то шансов у тебя мало. Например я сомневаюсь что можно самому на собеседовании изобрести методы backtracking и dynamic programming, если ты еще не сталкивался с ними ранее. А эти задачи - весьма популярны.
Есть мнение что собеседования по алгоритмам не нужны, это все придумал Google, а остальные просто повторяют за ним. В общем можно долго спорить, воевать с ветряными мельницами. Но проще все таки подготовиться к алгоритмам. Со временем вам это даже может понравиться.
Я замечаю что последнее время этот вид собесов постепенно упрощается или даже исключается. Но, например, в компании Я* это чуть ли не самое основное что требуется от кандидатов. В компаниях А* и O* и в некоторых отделах V* собеседования на алгоритмы попроще, но все равно к ним надо готовиться. Без подготовки, пройти их шансов мало.
Разбираясь с алгоритмами вы попутно разберетесь работой некоторых нужных вещей. Например лучше разберетесь с тем как работают различные виды индексации в различных БД или сможете более эффективно писать свой прикладной код.
На собеседовании надо будет написать код, который максимально эффективно решает поставленную задачу. Очень часто, возможности запустить и отладить код не будет, так что придется все отлаживать в уме. Но с другой стороны и у интервьюера, возможно, не будет возможности запустить ваш код, и он тоже будет проверять все в уме. Задач обычно за час надо решить 2 или 3.
Иногда решение задачи просят описать на словах, а не писать код. Тут надо рассказать какие методы, алгоритмы и структуры данных ты бы использовал для их решения.
Помимо решения конкретных задач, вам будут задавать общие вопросы про различные алгоритмы и структуры данных. Надо будет готовым рассказать о них, о их устройстве и вариантах применения.
Итак, как подготовиться? Сразу скажу, с нуля быстро не получиться. Придется внимательно почитать книжки про "Алгоритмы и структуры данных" и набить руку на решении задач на LeetCode. Это займет несколько месяцев.
Посоветую несколько книжек, по которым учился сам:
Стивенс Род. "Алгоритмы. Теория и практическое применение"
https://www.bookvoed.ru/book?id=13295894
Мне очень зашла. Благодаря этой книге я разобрался с основными алгоритмами и структурами данных. После вдумчивого прочтения вы сможете шустро рассуждать об устройстве наиболее популярных алгоритмов и структур данных, рассказывать об их практическом применении. И при этом вы научитесь применять для решения задач на собеседованиях.
Бхаргава Адитья. "Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих"
https://www.bookvoed.ru/book?id=7243711
Эта книга часто рекомендуется компаниями для подготовки к собесам по алгоритмам. Тоже весьма хороша. В отличии от предыдущей, здесь уклон больше в сторону именно решения задачек на собеседованиях и меньше теории.
Лааксонен Антти. "Олимпиадное программирование. Изучение и улучшение алгоритмов на соревнованиях."
https://www.bookvoed.ru/book?id=10668914
Книга для подготовки олимпиадников к решению сложных алгоритмических задач, но при этом отлично подходит для подготовки к жестким собесам. Прочитайте хотя бы первые 7 глав. Дальше уже идет олимпиадная жесть, которая не часто встречается на обычных собеседованиях.
Ну а дальше, регистрируйтесь и практикуйтесь на leetcode.com. Решайте задачи уровня easy и medium. Заморачиваться задачами уровня hard не надо, это уже слишком. Решайте из разных тем. Попытайтесь сначала решить самостоятельно, но если совсем не получается, там для каждой задачи есть разбор ее решения и решения других участников. Даже если решили сами, потом посмотрите каким образом ее решили другие участники.
Почти каждую задачу можно решить с разной степенью эффективности в смысле нотации О-большое. Если вы не знаете что это такое обязательно разберитесь, ведь без этого вам могут не дать хорошую оценку, даже при корректном решении задачи! Очень обидно, когда хорошие кандидаты не могу оценить асимптотику задачи и приходится им занижать оценку. Еще раз прошу, разберитесь что такое О-больше и научитесь его оценивать! Тем более что это вовсе не сложно.
Если вы решите задачу например за O(N^2) то вам могут предложить решить ее эффективнее за O(N logN) или даже O(N). Все решения будут зачитываться, но более эффективное добавит вам баллов. Вполне нормально если вы решите задачу не очень эффективно, а потом придумаете вариант получше.
Кстати, на ютубе полно роликов с разбором задач. Иногда даже озвучиваются в каких компаниях такие задачи попадались. Я скажу, что если вы решите сотню задач на LeetCode то с большой вероятность вам они будут попадаться на собеседованиях. Компании не часто придумывают какие то собственные уникальные задачи, в основном это популярные задачи с LeetCode или их модификации.
Вот важные темы задач на алгоритмы которые стоит изучить:
linked lists
binary search
hash table
queue, stack
sort, heap
two pointers
sliding window
tree, dfs/bfs
greedy problems
backtracking
dynamic programming
И вот еще, разберетесь со структурой данных бинарная-куча, пригодиться! Почему то про эту структуру почти все забывают.
Собеседование по архитектуре
Этот этап у вас будет если вы идете на высокую позицию. Обычно вам дают задание высокоуровнево спроектировать какой нибудь большой проект и набросать его схему в графическом онлайн редакторе. Типичная задача звучит так: "Спроектируй нам YouTube и чтобы выдержал миллиард юзеров" или "Сделай клон ВКонтекта, и чтобы держал такую нагрузку".
Конечно никто не ждет что вы проектируете полноценный проект. Для варианта с YouTube, скорее всего вас попросят например продумать как и где вы будете хранить видеоконтент, как будете делать транскодинг, как реализуете геораспределенность и доставку контента. Надо будет продумать шардирование, кэширование, очереди, подумать о CDN, учесть что все это может работать в нескольких датацентрах.
Важно, сразу не бросаться в проектирование, а сначала уточнить у интервьюера требования к функционалу и к нагрузкам. Если вы сразу начнете что то рисовать не уточнив требования - это будет ваш минус.
Вот отличная книжка, с разбором подобных задач и о том как успешно проходить интервью по архитектуре
Сюй Алекс. "System Design. Подготовка к сложному интервью"
https://www.bookvoed.ru/book?id=13485756
Также бывает вариация такого собеседования, где вас просят спроектировать не глобальный супер проект, а спроектировать какой нибудь небольшой реальный проект. Обычно это какой то реальный небольшой внутренний проект компании. В этому случае вы будете проектировать уже менее высокоуровневую систему и большое внимания уделять низкоуровневым техническим деталям
Знакомство с командой или руководителем
Если все предыдущие этапы успешно пройдены, то считайте что оффер уже у вас в почти в кармане. Но все же, ваш будущий руководитель захочет познакомиться с вами лично, ведь до этого весьма вероятно он с вами еще лично не общался и если что то и знает о вас, то только из отчетов по предыдущим этапам собеседования.
Цель этого собеседования просто убедиться что вам комфортно друг с другом и что вам подходит команда. Можно сказать это взаимное собеседование. Вас спрашивают о вашем опыте работы, вы расспрашиваете о команде, процессах, о рабочих задачах.
Возможно, здесь вам тоже будут задавать технические вопросы, но они уже не будут особо сложными. Основная цель вопросов - оценить комфортность общения с вами, а не снова проверять знания.
Так же вас спросят, с какой приблизительной даты вы готовы приступить к работе.
Получение оффера
Если знакомство с командой прошло хорошо, то скорее всего в течении нескольких дней рекрутер пришлет вам предложение о работе, он же оффер. Обычно это красивое оформленная pdf-ка или email, к котором расписаны условия, ваша должность, отдел, руководитель и указано, что компания будет очень рада если вы примите их предложение.
Обычно, кандидаты одновременно собеседуют в несколько компаний. И тут можно встать перед непростым выбором, какой из нескольких классных офферов все же выбрать.
Если вы проваливаете собеседование
Ничего страшного. Я знаю супер крутых специалистов, которые иногда ходят на собесы из спортивного интереса. И они тоже периодически проваливаются.
В компаниях при найме распространена политика: Лучше по ошибке отказать хорошему кандидату, чем взять плохого. Период адаптации нового сотрудника приносит компании высокие затраты и минимум пользы. Если через несколько месяцев выяснится, что новый сотрудник не подходит - это оборачивается убытками и ресурсами на новый поиск.
Если ты провалил собеседование, то общение с тобой останавливается на 6 месяцев. После чего тебе снова с радостью предложат пройти новое собеседование, в надежде, что ты подготовился лучше, чем прошлый раз. 6 месяцев - условный срок. Я как-то провалил собеседование по алгоритмам в компанию V*. Через 2 недели мне перезвонили и предложили попробовать меня в другую команду, потому что на остальных этапах я показал себя очень хорошо. В этот раз я получил оффер.
Каждое собеседование, даже проваленное, добавляет опыта. И каждое следующее собеседование будет легче. Провалив собес, обязательно запоминайте где именно была сложность и развивайте эту область! Можете попросить рекрутера фидбек - у него всегда есть отчет с замечаниями от интервьюера. Обычно в кратком фидбеке не отказывают.
Быстрый найм
Выше я описал классический процесс найма, состоящий обычно из 3-4 этапов и растянутый примерно на 2-3 недели. Но сейчас компании испытывают кадровый голод, и если долго тянуть, то возрастает риск, что крутой кандидат уйдет в другую компанию, которая быстрее сделает ему свой офер.
В связи с этим, многие компании сейчас проводят мероприятия быстрого найма несколько раз в году. Типичное название такого мероприятия "One day offer" или "Weekend offer". Суть такого мероприятия, в том что вам втиснут все этапы собеседований в 1 или 2 дня и сразу же дадут оффер. Кстати, есть впечатление, что собесы на таких мероприятиях менее жесткие чем в обычном процессе.
О начале таких мероприятий объявляют за несколько месяцев заранее, так что следите за новостями компаний вашей мечты и у вас будет шанс получить оффер за пару дней.