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

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

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

Будучи управляющим компании, которая занимается подбором персонала, я хорошо это понимаю. Мы проводим собеседования с инженерами, не изучая их резюме, и по ускоренной процедуре направляем их непосредственно на дальнейшие интервью в другие компании бизнес-инкубатора Y Combinator. За последние девять месяцев мы собеседовали 1000 программистов. Особое внимание мы обращаем на практическое программирование, и позволяем кандидатам выбрать один из семи способов оценивания. Это означает, что мы работаем со многими (очень талантливыми) программистами, которые не закончили даже элементарную программу обучения компьютерным наукам. Многие из этих людей плохо показывают себя на собеседованиях. С огромными разрастающимися проблемами они имеют дело каждый день, но 45-минутный алгоритм вызывает у них трудности.

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

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

1. Проявляйте энтузиазм


Энтузиазм имеет огромное влияние на результаты собеседования. Около 50% наших кандидатов, не прошедших дальнейшие интервью в компаниях, провалили их не по техническим причинам. Обычно компании объясняют это тем, что человек «не вписывается в культуру компании». Однако, в девяти из десяти случаев «вписаться в культуру» — это проявить энтузиазм в том, чем занимается предприятие. Компании нанимают людей, которые проявляют живой интерес к их миссии. Для многих это так же важно, как и технические знания. И в этом есть смысл. Мотивированные сотрудники будут чувствовать себя счастливее и работать усерднее.

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

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

2. Изучите термины, часто встречающиеся на собеседованиях


Огромный процент задаваемых на собеседовании вопросов касается структуры данных и алгоритмов. Это правда. Мы собираем у кандидатов информацию о вопросах, задаваемых на собеседованиях в компаниях YC, и более 70% вопросов касается именно алгоритмов. Вам не нужно быть экспертом, но знание расположенного ниже списка алгоритмов и структур данных поможет вам получить работу в большинстве компаний.

  • Хеш-таблицы
  • Связанные списки
  • Поиск в ширину, поиск в глубину
  • Быстрая сортировка, сортировка слиянием
  • Бинарный поиск
  • 2D множества
  • Динамические массивы
  • Двоичное дерево поиска
  • Динамическое программирование
  • Big-O анализ

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

Выучить все это не так сложно, как предполагают многие люди, с которыми мы говорили. Алгоритмы обычно объясняются научным языком, и это может сбивать с толку. Но по сути своей, ничто из этого списка не сложнее, чем архитектура современного веб-приложения. Если вы можете (хорошо) построить веб-приложение, то вы сможете выучить и это. Со своей стороны, я могу порекомендовать книгу Стивена Скиены (Steven Skiena) под названием «Алгоритмы. Руководство по разработке» (The Algorithm Design Manual). Данный материал замечательно излагается в 3-5-й главах — просто и доступно. Да, в книге используется С и математический синтаксис, но она отлично раскрывает тему. На Coursera также можно найти несколько хороших курсов по алгоритмам. В этом курсе, в частности, уделено внимание понятиям, знание которых важно при собеседовании.

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

3. Пользуйтесь помощью своего интервьюера


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

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

  • Задавайте вопросы
  • Обговаривайте решение задачи «в лоб»
  • Обговаривайте оптимизированное решение
  • Пишите код

После того, как вам задали вопрос, начинайте с определения того, о чем именно вас спрашивают. Это как раз тот момент, когда вы должны быть педантичны. Уточните все неясности, которые вы находите. Спросите о пограничных случаях. Приведите конкретные примеры для начала решения задачи и убедитесь, что вы верно поняли, какой конечный результат от вас ожидают. Задавайте вопросы, даже если вы практически уверены в ответах. Это полезно, потому что дает вам возможность выяснить пограничные случаи и получить все данные, необходимые для решения задачи (умение кандидата «работать» с пограничными случаями — один из ключевых аспектов, который интервьюеры принимают во внимание для общей оценки проведенного собеседования). К тому же это дает вам время на то, чтобы собраться с мыслями до того, как вы начнете решать проблему.

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

Кандидаты зачастую пропускают первый шаг, считая, что самое простое решение проблемы слишком очевидно либо ошибочно. Это неправильно. Убеждайтесь в том, что вы всегда находите решения поставленных перед вами проблем (даже если нужно задействовать экспоненциальное время или суперкомпьютер NSA). После того как вы описали такое простое решение, спросите интервьюера, хочет ли он реализовать его или вам следует придумать более целесообразное решение. Как правило, вас попросят о последнем.

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

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

4. Говорите о вариантах решений


Интервью на должность программиста обычно состоит из вопросов, связанных с непосредственно с программированием, и именно о них я рассказывал ранее в этой статье. В то же время вы можете встретиться с вопросами по созданию определенной системы. Компании, судя по всему, склонны к тому, чтобы «помучить» таким образом более опытных кандидатов. В этом случае потенциального работника спрашивают, каким образом они бы разработали ту или иную сложную систему для применения на реальных данных. В качестве примеров используется разработка Карт Google, соцсети или же, например, создание API для банка.

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

  • HTTP (на уровне протоколов)
  • Базы данных (индексы, планирование запросов)
  • Сети доставки контента (CDN)
  • Работа с кэшем (LRU-кэш, memcached, Redis)
  • Системы балансировки нагрузки
  • Распределенные системы воркеров

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

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

5. Подчеркивайте результаты своей работы


Третий вид вопросов, с которыми вы можете столкнуться на собеседовании, касаются вашего профессионального опыта. Здесь интервьюер обычно просит кандидата рассказать о завершенных проектах. Ошибка многих программистов состоит в том, что они рассказывают исключительно о технической стороне того или иного проекта. Так, большинство специалистов рассказывают об успешном внедрении нейросетевого классификатора или реализации бота для проверки грамматики в Twitter. Это не лучший выбор, потому что человеку, который проводит собеседование, очень трудно судить о масштабе проекта. Многие кандидаты рассказывают о различных сторонних проектах, преувеличивая их значимость, и у интервьюера нет никакой возможности проверить, слышит ли он правду или красивую ложь.

В этом случае оптимальное решение — выбрать какой-то проект, который показал конкретные результаты, и подчеркнуть их. Здесь часто приходится пожертвовать более интересным (технической точки зрения) проектом, но, поверьте, это того стоит. Подумайте (заранее) о том проекте, который показал наиболее «осязаемые» результаты в реальном мире. Если вы создали игру под iOS, и она набрала 50 тыс. скачиваний, именно эту цифру стоит озвучить. Или, например, вы, проходя стажировку в какой-либо компании, написали интерфейс для доступа в «админку», который впоследствии решено было использовать для работы всех администраторов. Факт использования результата вашей деятельности — это отличный повод рассказать о вашем достижении. Кроме того, выбор более «технического» проекта при ответе на вопрос о своих прошлых достижениях посылает компании информацию о том, что вы сфокусированы на самой работе. Программисты, которых больше интересует «техническая» сторона каждого проекта, а не достигнутые результаты, обычно отсеиваются на начальном этапе подбора персонала (считается, что порой такие специалисты недостаточно продуктивны).

6. Используйте динамический язык программирования, но обязательно упомяните C


Я рекомендую, чтобы на собеседованиях вы использовали такие динамические языки, как Python, Ruby или JavaScript. Конечно же, вам следует использовать любой язык, который вы знаете лучше всего. Но мы обнаружили, что многие интервьюеры предпочитают C, C ++ или Java, почему-то считая, что именно они являются «настоящими» языками программирования. Несколько классических книг по прохождению собеседований рекомендуют, чтобы программисты выбрали Java или C ++. Но нам кажется, что по крайней мере для стартапов это — плохой совет. Кандидаты добиваются большего успеха, используя динамические языки. На мой взгляд, это происходит благодаря их компактному синтаксису, гибкой типизации, а также литералов списка и хэша. Это нестрогие языки программирования. С ними могут возникнуть определенные трудности при создании сложных систем (что также является очень спорным вопросом), но они хороши, когда вы пытаетесь влепить прямо на доске алгоритм бинарного поиска.

Независимо от того, какой язык вы используете, стоит упомянуть, что вы работали и с другими языками. Компании имеют предубеждения относительно специалистов, владеющих только одним языком программирования. Если же вы знаете только один язык, вы должны полагаться на то, что вы действительно круто им владеете. Но если вы когда-то сделали что-либо для основных или сторонних проектов на нескольких языках, обязательно скажите об этом не собеседовании. Если вы работали с такими машинно-ориентированными языками, как C, C++, Go или Rust, то упоминание об этом особенно важно.

Языки Java, C# и PHP в какой-то мере являются проблематичными. Мы обнаружили, что у стартапов есть некоторые предубеждения относительно этих языков. У нас есть данные, которые показывают, что программисты, использующие эти языки на собеседованиях, получают более низкие оценки. Это несправедливо, но это правда. Если у вас есть другие варианты, я рекомендую не использовать эти языки на собеседованиях в стартапы.

7. Практикуйтесь, практикуйтесь и еще раз практикуйтесь


Вы сможете лучше выглядеть на собеседовании, если заранее будете репетировать ваши ответы. Все потому, что любое собеседование — это стресс, а стресс негативно влияет на то, как вы себя преподаете. Решение одно — практика. Собеседования становятся менее трудными, когда вы приобретаете опыт в этом деле и со временем к ним привыкаете. Мы часто замечаем, что первые интервью кандидатов (даже в рамках одного поиска работы) оказываются неудачными, однако затем они обретают уверенность и лучше выглядят на интервью. Есть вам нелегко побороть стресс, то я рекомендую начать с инициирования собеседования. Найдите список вопросов для собеседования (рекомендуем книгу Cracking the Coding Interview, на российском рынке известную под названием «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию») и проработайте их. Установите таймер, уделяя на каждый вопрос по 20 минут и старайтесь ответить на него как можно быстрее. Потренируйтесь писать ответы на доске (не все компании этого требуют, но это самый худший вариант, который стоит отработать). Лист бумаги и ручка могут послужить вам для симуляции доски. Если у вас есть друзья, которые могут помочь вам потренироваться проходить собеседование, то это замечательно. Вы можете собеседовать друг друга по очереди. Чтение задаваемых на интервью вопросов также даст вам неплохие идеи, которыми вы можете воспользоваться во время реального собеседования. На удивление очень много вопросов используются повторно (целиком или частично).

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

8. Упомяните о своем послужном списке


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

9. Собирайте сделанные вам предложения работы


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

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

Заключение


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

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

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

Комментарии (18)