Как сдвинуть гору Фудзи, или Интервью для гениев

Эту статью я опубликовала несколько лет назад на Хабре. Но она по-прежнему актуальна, и я уверена, что не все ее читали.

Дискляймер: Эта статья написана мной несколько месяцев назад (upd: в 2010 году), но, думаю, она все еще не потеряла свою актуальность. Тут я постаралась собрать информацию, которую бы мне хотелось получить в самом начале подготовки ко всяческим интервью. Статья основана на большом количестве личного опыта, но про опыт я написала и напишу отдельно.

Наверняка многие из вас слышали об ужасно сложных интервью для желающих работать в компаниях типа «Microsoft», «Google» или «Apple» (на самом этот список можно продолжать и продолжать). Еще бы — общеизвестно, что Google каждый день получает порядка 1000 резюме, все именитые компании рассказывают направо и налево, что они ищут не меньше, чем гениев, а на просторах безграничного интернета время от времени появляются вопросы, которые задавались на интервью вроде «Как вы сдвинете гору Фудзи?» или «Сколько мячиков влезет в автобус?» или даже «Как создать хорошую поисковую систему, вроде Google?».

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

Итак, допустим цель «получить работу мечты» поставлена. Что же делать дальше?

0. Составьте хорошее резюме. На этом пункте я останавливаться не буду — я вообще не специалист по резюме. Обязательно почитайте всякие полезные статьи о том, как правильно писать ИТ резюме и, по возможности, последуйте их советам. Одну хорошую статью, написанную инженером из Google, можно найти тут.

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

2. Если знакомых не нашлось, ищите другие возможности. Например, заведите сайт, напишите туда много интересных статей по ИТ тематике и разместите там же свое резюме. Или пройдите тесты на Brainbench — ходят слухи (я не проверяла :), что рекрутеры из Майкрософта регулярно туда заглядывают и сами пишут особо отличившимся. Или отличитесь на каких-нибудь олимпиадах вроде CodeJam или TopCoder. Или поищите в интернете другие success stories — как компания сама вышла на кандидатов и, если это не очень сложно, сделайте то же самое, что и те кандидаты.

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

4. Узнайте побольше о процессе. На самом деле процессы интервью в больших и именитых компаниях очень похожи. Сначала вам устраивают телефонные интервью (1-3) и, по их результатам, приглашают на интервью очные (которых бывает от 2 до 6). И, если немного поискать на бескрайних просторах интернета, можно обнаружить, что большинство интервью сводится к нескольким областям:

  1. Основы математики: прикладная математика, теория чисел, комбинаторика, основы вероятности…
  2. Алгоритмы и структуры данных: сортировки, на графах, O-notation, деревья…
  3. Объектно-ориентированное программирование…
  4. Общее понимание: как работает операционная система, что делает компилятор, как работает сеть…
  5. Знание какого-нибудь языка программирования на хорошем уровне.



Знать специальный синтаксис открытия сокета в языке С, вероятнее всего, необязательно :).

5. Соберите толковые источники для подготовки. В интернете полно книг, сайтов и статей, из которых можно черпать информацию и по которым можно учиться и готовиться. Лично мне были полезны в свое время 3 книги: «Алгоритмы и задачи» ШеняАлгоритмы от Скиены иклассический талмуд по алгоритмам от Кормена и компании. И очень полезен вот этот сайт, специализирующийся на всякие интервью.

6. Решайте задачи и набивайте руку. Есть простое правило — когда Вы делает чего-то, чего угодно, много, вы рано или поздно начинаете делать это хорошо. Это в полной мере справедливо и для подготовки к интервью в большие компании и это, пожалуй, самый важный пункт из всех. Когда Вы прорешаете тысячи вопросов и задач, напишете сотни алгоритмов и десятки тысяч строк кода в выбранном языке — то Вы достигнете такого уровня дзена, когда задачи на интервью покажутся вам простыми. Главное начать с простого и постепенно двигаться вперед, наращивая сложность. И в какой-то момент Вы обнаружите, что 70% задач и вопросов вы решаете практически сходу, над 20% надо немного подумать и над 10% надо подумать хорошо. А это уже довольно неплохие шансы на прохождение интервью :).

7. Будьте оригинальны. Вас намного лучше запомнят, если вы будете отличаться от других (только постарайтесь отличаться не в худшую сторону). Если в Вас будет что-то, чего нет у других, что будет вас от них отличать и заинтересовывать одновременно — это большой плюс. Если Вы бывший шаолиньский монах или топ-модель, которые решили переквалифицировать в отличных программистов — то, считайте, Вы нашли свою «фишку» :). Если же нет — то можно во время интервью писать код на Python (большинство кандидатов пишет на стандартных языках вроде Java или C++), или упомянуть грозу всех программерских языков Brainfuck и, если это будет в тему, написать небольшую программу на нем. Или принести с собой джедайский мечь и оставить его в углу. Или вспоните какую-нибудь из программерских шуток (вроде того, что если P = NP => P = 0 or N = 1). В общем, нашалите как-нибудь — необидно, необременительно и в тему :).

UPD: По поводу пункта 7 – он спорный. Лучше шалить, если у вас гарантированно, проверенное годами, отличное чувство юмора. Иначе может вместо запоминающегося момента получиться awkward moment :).