Про собеседования по программированию. Часть 1.

Я собирался написать большой пост про процесс собеседования в большие иностранные IT конторы, но оказалось, что это довольно хорошо описано в книгах. Например, в первых главах книги «Cracking the Coding Interview: 150 Programming Questions and Solutions, 5th ed», которую мне на днях показали. Поэтому я написал большой пост про то, как это происходило конкретно у меня, и какие полезные выводы я сделал.

Будем считать, что соискатель знает, чего хочет: получить оффер от какой-нибудь определённой фирмы, устроиться куда угодно, лишь бы подальше, или чего-то подобного. Эти вопросы выходят за рамки поста.

Я делаю упор на подготовку к решению паззлов и задач, где требуется подобрать/придумать алгоритм решения или подходящую структуру данных. Это не всё, о чём спрашивают на собеседованиях, но эти проблемы определённо вызывают затруднения у многих кандидатов.

 Предварительная подготовка

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

Список тем, которые надо знать, есть в книгах. Его также может прислать hiring manager, с которым вы будете общаться, поэтому я этот список здесь не привожу.

Я рекомендую начать с прочтения одной или двух книг про собеседования из перечисленных в данном и этом постах, затем перейти к чему-нибудь более основательному про алгоритмы и структуры данных. Здесь мой фаворит «The Algorithm Design Manual» Стивена Скиены. Одновременно с прочтением этих книг хорошо бы начать решать задачи. Я разделяю интересующие нас задачи на две категории — паззлы (puzzles, brain teasers; обычно в них не требуется ничего программировать) и задачи на применение знаний. В то время как для вторых нужна теория, начинать тренироваться с первыми можно хоть сразу.

Откуда брать задачи:

  • Те же самые книги. Вполне ожидаемо, что там есть примеры задач с решениями, обычно разделённые по темам.
  • Различные ресурсы в интернете, где люди делятся задачами с собеседований. Например, careercup.com. Также интересные задачи встречаются в блогах программистов.
  • Специализированные ресурсы для олимпиадников с большими архивами задач и автоматическими тестирующими системами. Например, acm.timus.ru, acm.sgu.ru, topcoder.com, codeforces.ru. Важно понимать, что олимпиадные задачи в среднем гораздо сложнее тех, что дают на собеседованиях, поэтому лучше выбирать из лёгких. Например, с acm.timus.ru рекомендую решать задачи со сложностью порядка 150 и ниже.

Поскольку на настоящем собеседовании вам почти наверняка придётся решать задачи на бумаге, маркерной доске или каком-нибудь collabedit.com без компилятора, тренироваться лучше тоже без компилятора. Придумываем решение, обдумываем детали реализации, кодим на бумаге или в редакторе без подсветки синтаксиса, проверяем программу глазами, мысленно прогоняем тесты. После этого можно скомпилировать и запустить, протестировать, найти и проанализировать ошибки. Сначала ваша бумажка с программой будет вся с перечёркнутыми и вставленными мелким шрифтом строчками, затем постепенно будет получаться лучше. Это нам и нужно. В идеале писать код нужно только сверху вниз, заранее продумав все ответвления и подводные камни.

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

По поводу режима хотелось бы посоветовать заниматься каждый или почти каждый день хотя бы часа по полтора, в выходные больше. Лучше заниматься почаще, но меньшими подходами, чем по 10 часов раз в неделю. Если очень хочется отдохнуть, отдыхайте. Надо быть готовым к тому, что предварительная подготовка в таком режиме может занять многие недели или даже месяцы. Тут всё индивидуально.

Чтобы дать понять масштабы бедствия, расскажу как было у меня. Мне написал рекрутёр из Google с предложением пройти к ним собеседование, прислал список тем, дал время на подготовку. Это меня очень оживило, и я две недели работал без остановки: решал задачи, читал теорию, даже учил наизусть реализации некоторых базовых алгоритмов. Надвигающееся собеседование очень мотивирует. После двух технических собеседований по телефону мне сообщили, что я справился, и пригласили пособеседоваться on-site (очно) к ним в лондонский офис через месяц-полтора. Я оживился ещё сильнее и стал готовиться ещё упорнее. Кстати, напомню, что я бывший олимпиадник, и некоторые базовые знания и опыт по теме у меня уже были. После собеседования меня так тошнило от всех этих паззлов и алгоритмов, что я пообещал себе месяца два ничего не читать и не решать. И сдержал обещание. А собеседование то я не прошёл. Зато почти через полгода они вспомнили про меня и всё-таки сделали оффер без дополнительных технических собеседований, но в другой офис (в главный, в Mountain View). А я к этому времени уже завалил собеседование в Facebook и разговаривал с каким-то стартапом. Но это уже другая история.

Часть 2

7 thoughts on “Про собеседования по программированию. Часть 1.

  1. Отличный пост, очень познавательный. Я почему-то думал, что ты меньше готовился к собеседованию. Респект и уважуха!

    Только убери, пожалуйста, “в общем” в первом предложении, оно там не нужно.

  2. Хотел бы добавить, что вопросы на программирование далеко не единственные, которые задают на интервью. Как минимум нужно еще быть готовым к вопросам на дизайн и архитектуру приложений. Примеры вопросов: “разработайте архитектуру для определения трендов в твиттере”, или “предложите архитектуру распределенного блэклиста”. Кроме того чтобы придумывать архитектуру нового сервиса довольно часто просят рассказать про дизайн проекта, над которым работали лично вы. Обычно это сопровождается вопросами типа, “а что бы вы улучшили”, “а почему вы сделали такой выбор, а не другой”. Надо уметь толково рассказать, нарисовать картинку и порассуждать по поводу альтернатив для различных компонентов системы.
    Еще один совет, которым я бы на самом деле не рекомендовал пользоваться: очень много задач, которые задают на интервью, можно найти на сайте http://glassdoor.com/ — проблема в том, что интервьюеру легко становится понятно, знает ли кандидат ответ на задачу или нет. Поэтому можно посмотреть, какие задачи бывают, но если на интервью спрашивают задачу, которую вы знаете, — лучше об этом сказать, это большой плюс в карму. Еще — большинство компаний (по крайней мере с которыми я сталкивался) не ставят требования использовать какой-либо выбранный язык программирования — на чем хотите, на том и пишите.
    По поводу офферов — помимо зарплаты обязательно обсуждайте всяческие стартовые бонусы, особенно помощь в переезде — временная квартира, авиабилеты, старап-бонус, машина в прокат на первое время.

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

  3. Здравствуй, Сергей. Хочу спросить, не встречал ли ты PDF-презентации некоего индусского товарища из Google о том, как проводить интервью? Помнится, на DZone или InfoQ пролетала, но я почему-то не сохранил. Позже (когда самому приходилось интервьюировать молодых) пытался искать (просматривал архивы за 2 года), но безрежультатно. Он там сухо и по делу рассказывает, как при помощи небольших модификаций исходной задачи (типа найти какой-то там элемент во множестве) переходить к разной степени сложности алгоритмам и структурам данных (сортированный массив, дерево, лес, …).
    Книжки это хорошо, но презентация в (не более сотни страниц) – это же ещё лучше.

Leave a Reply to Яков Макаров Cancel reply

Your email address will not be published. Required fields are marked *