среда, 9 декабря 2009 г.

Steve Yegge - Get that job at Google / Устройся на работу в Google


 Хочу описать некоторые советы для прохождения собеседования в Google, впервые за долгое время. Я откладывал это, потому что это выведет вас из себя. Вероятно. Среднестатистического читателя, эта статья разочарует.
Почему? Потому что… ну, я написал маленькую песенку об этом:

Эй, чувак, я не знаю фигню,
Про которую Стив говооооорит,
Если мой босс думает, что это важно,
Я собираюсь уволииииииииться,
Да, да, да  детка, деттккаа, да…..

В те далекие времена, я, будучи в других компаниях, ещё только начинал писать о собеседованиях,  не думал, что все настолько однообразно и стандартно. И это всего лишь после беглого просмотра!
Смотрите, все происходит приблизительно так:
Я: бла, бла, бла, мне бы хотелось поговорить  об Х на собеседовании, бла, бла, бла…
Вы: Об Х? Да я не слышал об этом со времен колледжа! Я ни разу не пользовался этим  на работе! А он об этом спрашивает? Похоже, для них это очень важно, раз они спрашивают, а я…, а я не знаю этого! Если они заметят мои пробелы в этом вопросе, то меня уволят по причине некомпетентности и даже без благодарностей, и вообще мне не сделают предложение те работодатели, которые задают этот вопрос об Х.  А к мнению старины Стиви прислушиваются многие! И я стану нищим и бездомным! И лишь из-за того, что не знал чего-то такого, что мне раньше и не особо требовалось-то! Ужас! Конечно, я бы мог заняться вплотную изучением этого вопроса об Х и доказать его сомнительную значимость, но мне неохота перелопачивать кучу талмудов. И если честно, нужно оооочень постараться, чтобы заставить людей усомниться в правоте слов Стива.
Я: Итак, подводя итоги, бла, бла, бла… А? Вы сказали «уволить»? «нищий»? О чем вы вообще говорите?
Вы: АААААААААААммммммммм? *stab* *stab* *stab*
Я: В этом-то и дело.  Больше, я никогда не говорил про это интервью.
Не имеет значение, что такое Х. Оно произвольно. Я бы мог сказать: «Мне доставляет удовольствие спрашивать у соискателей, например, их имени на собеседовании», и люди до сих пор бы пугались как, в общем, собеседования, так и знания своего собственного имени - будем надеяться, что первого.
Но ПОТОМ, проходит время, соискатели приходят и уходят, и мы всегда думаем: «Боже, мы очень хотим, чтоб вполне умный человек подготовился к своему собеседованию немножко лучше. Можем ли мы как-либо помочь будущим кандидатам некоторыми подсказками?»
И впоследствии, никто ничего не делает, потому что мы все боимся получить жестокий удар от Людей, Которые Не Знают Х.

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



Пояснения и отказ об ответственности
Этот блог не поддерживается Google. Google не знает о том, что я публикую эти советы. Это только между нами, договорились? Не говорите им, что я готовлю вас. Просто блесните на вашем собеседовании, и мы будем в расчете.
Я говорю только о вакансии обычного инженера программного обеспечения и собеседовании на эту должность.
Фактически, советы являются довольно общими, и разницы между Google и любой другой софтверной компании в этом плане нет. Я могу написать эти же советы про мою первую работу программиста 20 лет назад. Это подразумевает, что данные советы не имеют срока давности, по крайней мере, на протяжении нашей карьеры.
Очевидно, что лишь только эти советы не решат ваш вопрос трудоустройства. Я надеюсь, что следуя им, вы проявите все свои лучшие качества на собеседовании, и покажете себя намного лучше.
Эээ… хм… Почему Google
Ого! Вы спрашиваете, почему Google? Хорошо, давайте начистоту.
Вы: Должен ли я работать в Google? Правда ли всё, что они говорят? Буду ли я там счастлив? Должен ли я высылать резюме немедленно.
Я: да
Вы: на какой воп… Подожди, что ты имеешь ввиду под словом «Да»? Я даже не рассказал кто я!
Я: Чувак, ответ – да (ты можешь быть девушкой, но я всё равно буду обращаться к тебе так)
Вы: Но… но… Я парализован инертностью. И в моей текущей компании я испытываю некий уровень комфорта, или, по крайней мере, я начал относительно привыкать к дискомфорту. Здесь я всех знаю, а в Google никого. Мне придется учиться Google системой построения билдов, технологии, и другие мелочи. У меня там ни авторитета, ни репутации – фактически, мне придется начинать все с начала. Я ждал так долго, это не повышение! Я бооооооооюсь!
Я: Чувак. Ответ Да, хорошо. Он не изменится. Все, кто приходили в Google были абсолютно в такой же ситуации, в мире есть лишь кучка знаменитых людей с бородами, которые посрамят даже Гендальфа, но их ничтожно мало. У всех, кто посылал резюме, были такие же причины, как и у вас, не делать этого. Но здесь каждый говорит: «БОЖЕ, Я, ОПРЕДЕЛЕННО, СЧАСТЛИВ, ЧТО ПРИШЕЛ СЮДА». Поэтому обязательно подавайте резюме. Но, вначале, подготовьтесь.
Вы: Но что будет, если я получу от ворот поворот. Я могу быть умным и квалифицированным, но вследствие какой-либо случайности я буду плох на собеседовании и не получу предложения. Это будет огромный удар моему эго. Я лучше пропущу возможность, чем потерплю неудачу.
Я: Это, по крайней мере, частично, правда. Я чуть не поступил так на моем первом интервью, но я умолял, обращался к ним до тех пор пока они не дали мне второй шанс. Через неделю, на второй раз, я подготовился, и показал себя намного лучше.
Дело в том, что у Google широко известный большой уровень отказов, это означает, что иногда мы отказываем квалифицированным претендентам, потому, что лучше сделать так, чем когда-либо нанять неквалифицированных людей. Это распространенное явление в отрасли, но уровень отказов варьируется от компании к компании. У Google данный показатель отказов очень высок. Я не знаю, что это, но я знаю много умных, квалифицированных людей, которые не прошли наше собеседование. Неприятный опыт.
Но действительно важный вывод таков: если вы не получили предложения работы, вы остаётесь квалифицированным сотрудником на текущем месте работы. Поэтому это вообще не должно задевать ваше эго.
Каждый, кого я знаю, может сказать, что негативный ответ полностью случаен, и не зависит от ваших способностей или квалификации. Он может зависеть от различных факторов, включая, но, не ограничиваясь этими:

      1) У вас сегодня неудачный день;
      2) У одного или нескольких ваших собеседников неудачный день;
      3) Присутствовали проблемы коммуникации, незаметные для вас и/или для одного или нескольких ваших собеседников;
      4) Вам не повезло, и вы получили отказ

О нет, отказ на собеседовании!
Да я боюсь, вы должны волноваться об этом.
Вы спросите, что это? Возвращаясь к тем временам, когда я работал в Amazon, мы проводили (и, несомненно, они до сих пор проводят) обширный самокритический анализ этой проблемы. Мы пришли к мнению, что у каждого работника E в Amazon был, как минимум, один случай "отказа": множество других работников S, которые не наняли E. Основная причина - важна вам для понимания, когда вы идете на собеседование, поэтому я расскажу, немного о том, что я узнал за годы работы.
Во-первых, вы не можете говорить интервьюеру что важно. Ни в одной из компаний. До тех пор пока они не попросят вас о совете. У вас есть довольно таки ограниченное временное окно, где то один год после выпуска с университета, пока вы можете влиять на взгляды человека относительно проведения собеседования, после чего окно закроется, и он будет верить, что является "отличнейшим интервьюером". И ему никогда не стоит изменять набор вопросов, стиль вопросов, стиль собеседования, отзывов.
Это проблема. Я уже столько раз обжегся на этом, что уже и не пытаюсь.
Вторая проблема: каждый "опытный" интервьюер имеет набор любимых предметов и, вероятно, определенных вопросов, которые он или она считает верной шкалой определения способностей кандидата. Набор вопросов двух различных интервьюеров может значительно отличаться и даже вовсе не пересекаться.
Классический пример, который можно найти где угодно: интервьюер A всегда спрашивает о конструкциях C++, файловой системе, сетевых протоколах и дискретной математике. Интервьюер B всегда спрашивает о Java конструкциях, web framework, и управлению проектами. Любому кандидату, которому посчастливится попасть на собеседование к A и B, А и В дадут очень разные отзывы. Дай им шанс, и A и B не наймут друг друга, но им обоим пришлось пройти через интервьюера C, который задавал им вопросы о структурах данных, UNIX утилитах, процессах и потоках, и оба A и B ели прошли его.
Это происходит практически всегда, когда вы получаете предложение от технической компании. Вам повезло и вы проскочили.  Из-за несовершенства процесса собеседования, вполне возможно, что вы во время него не впечатлите кого-то, даже если вы Алан Тюринг. Особенно если вы Алан Тюринг, потому как это означает, что вы не знаете C++.
В итоге, когда вы идете на собеседование в любую софтверную компанию, вы должны учитывать вероятность, что вам просто не повезет, один или более человек не оценит вас во время собеседования. Если это произошло, вы будете бороться до конца, потом вам скажут, что вы в данный момент не подходите на эту вакансию, и вы почувствуете разочарование. И до тех пор, пока вы не будете чувствовать себя архи-плохо, всё хорошо. Вам должно быть хорошо, что вы чувствуете себя плохо, после того, как это произошло, потому что, это означает, что вы – человек.
Подождите после этого 6-12 месяцев и пробуйте снова. Это лучшее решение, которое мы (да и любой другой, кого я знаю) можем предложить по поводу отрицательного решения. Мы стерли все неприятные моменты, и начали всё сначала. Здесь куча народу, которые попали сюда со второй, а то и третьей попытки, и они очень счастливы.
Вы можете также.
Хорошо, я уже не переживаю так по поводу потенциального отказа.
Хорошо, тогда давайте приступим к советам.
Если вы пристально следили за моей мыслью, вы могли обнаружить, что я интервьюер Д. Означает, что мой персональный набор любимых вопросов и тем – исключительно мой, и они не лучше и не хуже любых других. Поэтому я не могу сказать вам какие они, неважно насколько мне хотелось бы, потому что я обижу интервьюера А из-за Х, у которого незначительно отличающийся рабочий набор вопросов.
Вместо этого, я хочу подготовить вас по некоторым общим темам, которые, как я полагаю, разделяют большинство технических специалистов в компаниях, похожих на Google. Грубо говоря, это подразумевает компании, которые проектируют множество собственного программного обеспечения и занимаются распределенными вычислениями. Существует другой тип тех-компаний, противоположные рассматриваемым, которые отдают всю работу консультантам и пытаются максимально, насколько это возможно, использовать приложения сторонних разработчиков. Мои советы будут полезны только в сегменте рынка компаний, похожих на Google.
Итак, вы можете с таким же успехом достичь этого в Google.
Вначале, давайте обсудим не техническую подготовку.

Разминка

Никто не приходит на матч бокса не разогретым. Урок: вы должны взять свои перчатки для бокса на собеседование. Нет, подожди, прости, я имел в виду: разомнитесь перед ним!
Как вам разниматься? В основном, есть кратковременная и долговременная разминка. Вы должны выполнить оба вида.
Долговременная разминка означает: учеба и практика за неделю, две перед интервью. Для вас должно быть обычным делом решать задачи, используя доску. Если у вас получается, используя доску, на любом другом устройстве (ноутбук, сетевой документ, всё что угодно) это будет пустяковым делом. Поэтому настраивайтесь на доску.
Кратковременная разминка означает: отдохните ночь перед собеседованием, и потом выполните интенсивную, быструю разминку с утра.
Два лучших метода долговременной зарядки, которые я знаю:
1)      1) Изучайте структуры данных и алгоритмические книги. Почему? Да потому, что это наиболее вероятно поможет вам разобраться в проблемах идентификации/классификации. Многие интервьюеры будут счастливы, когда вы поймете класс задачи, про которую вас спрашивают, без объяснения. Например, если вас попросили раскрасить в различные цвета штаты США, вы получите большой бонус, когда отнесете её к графо - цветовому классу задач, даже ели вы не помните, как решаются графо – цветовые задачи.
И если вы знаете, как они решаются, тогда вы достаточно быстро придете к ответу. Итак, ваш лучший выбор, при подготовке к собеседованию,- практиковаться в искусстве опознавания класса задач, а также подбора лучших алгоритмов и структур данных для их решения.
Моя любимейшая книжка, для подготовки к этой части интервью, автора Стивена Скиена The Algorithm Design Manual. Больше чем все остальные книги, она помогает мне осознать насколько поразительно банальны (и важны) графовые задачи – они должны быть частью каждого набора инструментальных средств программиста (toolkit). Книга также охватывает базовые вопросы структур данных и алгоритмы сортировки, довольно таки приятный бонус. Но особо ценна – вторая часть книги, она похожа на энциклопедию на одной страницы триллион полезных задач и различных вариантов их решения без описания подробностей. Практически на каждой странице присутствует простая картинка, описывающая решение, делая её легкой для запоминания. Это замечательный способ для обучения как, идентифицировать сотни типы задач.
Другие интервьюеры также рекомендуют Introduction to Algorithms. Это действительно классика, но наверняка она потребует от вас более чем две недели для изучения. Но если вы хотите прийти на собеседование подготовленным, тогда отложите отправку вашего резюме, до тех пор, пока полностью не изучите эту книгу.
2)      2) Попросите друзей собеседовать вас. Друзья должны задавать вам случайные вопросы относительно собеседования, и вы должны отвечать на них, используя доску. Должны продолжать делать пока не закончите, неважно насколько устали или насколько вам лень. Делайте это до тех пор, пока можете это терпеть.

Я не выполнил эти два типа подготовки перед моим первым собеседованием, и был абсолютно шокирован, насколько тяжело мне стало писать код на доске, с моего последнего собеседования 7 лет назад. Это тяжело. Также я забыл множество алгоритмов и структур данных, которые знал раньше, или, по крайней мере, слышал.
Выполнение этих упражнений в течение недели, основательно подготовило меня ко второму туру собеседования в Google, и я показал себя лучше, намного лучше. В этом, собственно, вся суть.
Относительно кратковременной подготовке, всё, что вы можете сделать – это убедиться что вы готовы и разогреты по максимуму. Не идите расслабленными. Решите несколько задач, пролистайте книги, по которым готовились. Выпейте кофе: оно поможет вам думать быстрее, верите или нет. Убедитесь, что вы потратили, по крайней мере, час практикуясь, непосредственно перед выходом на собеседование. Считайте это спортивным матчем, музыкальным сольным выступлением, черт побери, экзаменом: если вы сделаете разминку, вы покажете лучшие результаты.

Моральная подготовка
Итак. Вы высокопрофессиональный программист с большим списком достижений. Время забыть об этом и сосредоточиться на прохождении собеседования.
Вы должны быть скромными, непредвзятыми и сфокусированными.
Если будете высокомерны, люди зададутся вопросом, захотят ли они с вами работать. Лучший способ показать свою высокомерность – обосновано отвечать вопросом на вопрос интервьюера – это действительно выводит их из себя. Помните, я упоминал, что не стоит указывать интервьюеру, как проводить собеседование. Это истинно, особенно если вы кандидат.
Поэтому не кричите: «черт возьми, неужели алгоритмы действительно настолько важны. Неужели вы когда-нибудь используете это в реальной жизни? Я никогда не пользовался этой фигнёй». Вам только лишь откажут, поэтому не говорите таких вещей. Считайте каждый вопрос логичным, даже если осознаёте, что не знаете ответа.
Не стесняйтесь попросить помощь или подсказки, если вы в тупике. Некоторые интервьюеры снимают балы за такое, но это подчас позволит вам преодолеть данное препятствие и даст хорошую опору в дальнейшем ответе, вместо того, чтобы полчаса мучиться в страшной тишине.
Не произносите "эм, эм, эм" когда вы "думаете".
Не старайтесь сменить тему и отвечать на другой вопрос. Не пытайтесь отвлечь интервьюера от задавания вам вопросов, рассказывая байки. Не старайтесь блефовать с вашим интервьюером. Сфокусируйтесь на задачах, которые они вам дают и приложите все усилия, чтобы всеобъемлюще (полно) ответить на неё.
Некоторые интервьюеры не будут просить вас написать код, но они ожидают, что вы начнете это делать на каком-то этапе ответа. Они дадут вам подсказки, но не обязательно придут и скажут: "А сейчас, мне бы хотелось, чтобы вы написали некоторый код". Если вы сомневаетесь, спросите, хотели бы они увидеть программный код.
У интервьюеров чрезвычайно различные ожидания, касательно кода. Персонально меня, не заботит синтаксис (разве что вы напишете то, что никогда не будет работать ни на одном из языков программирования, с этой точки зрения, я вмешаюсь и уточню, что вы, фактически, не цирковой клоун, и что это, по справедливости, ошибка). Но у некоторых интервьюеров действительно есть пунктик по поводу синтаксиса, и они будут даже молча снижать оценку из-за пропущенной точки с запятой, или фигурной скобки, не говоря вам. Я называю таких интервьюеров, знаете, одним  техническим термином, который рифмуется с "bass soles", но себя они считают золотыми техническими экспертами, и не существует способа сказать им, что это не так.
Поэтому, спросите. Спросите, заботит ли их синтаксис, и если да, постарайтесь писать правильно. Внимательно всмотритесь в ваш код, под различными углами и расстояниями. Считайте, что это чужой код, и вам была дана задача найти в нём ошибки. Вы будете достаточно потрясены тем, как много вы могли упустить, если отойти на полметра от доски и глянуть на нее вместе с интервьюером за плечом.  
Это нормально (и даже поощряется) задать несколько уточняющих вопросов, подтверждая у интервьюера, что вы точно поняли цель, к которой должны прийти. Некоторые интервьюеры понизят вам оценку, если вы просто вскочите и начнете писать код, даже если он будет верным. Они скажут, что вначале, вы не обдумываете проблему, и вы один из тех, которые кричат "не будем делать никакого дизайна системы (архитектуру)". Итак, даже если вам кажется, что вы знаете ответ на поставленную задачу, задайте несколько вопросов и расскажите немного о подходах, которые вы будете принимать, перед написанием кода.
С другой стороны не тяните долго перед решением проблемы, иначе интервьюеры начислят вам штраф за ожидание. Пытайтесь двигаться (и писать) быстро, т.к. часто интервьюер хочет задать больше чем один вопрос на протяжении собеседования, и если решите первую задачи чересчур медленно, у них не останется времени. Они поставят заниженные оценки, потому что не смогли получить полное представление про ваши возможности. Сомнения редко когда приносит преимущества на собеседовании.
Последняя не техническая подсказка: возьмите с собой маркеры для доски. В магазинах офисных канцтоваров продаются тонкие маркеры, в то время большинство компаний (включая Google) покупают толстые. Тонкие маркеры превратят доску из телевизора со стандартным разрешением 480i в 58 дюймовую 1080p HD плазменную панель. Вам потребуется любая помощь, и свободное пространство на доске будет очень кстати.
Вам было бы неплохо потренироваться в управлении свободным пространством на доске, например, не начинать справа и писать к правому нижнему углу крохотным, нечитаемым шрифтом. Интервьюер не будет потрясен этим. Забавно, хотя это меня всегда нервирует, когда люди делают так, на своём собеседовании я делал также. Просто, помните об этом.
И не допускайте, чтобы маркеры высыхали, пока вы стоите, крутя ими. Берусь утверждать: вряд ли вы бы хотели отвлекаться на протяжении собеседования, и это, кстати, вполне логично и взаимно.
Пожалуй, хватит по поводу не технических советов. Что касается X, некоторое намеки на X! Не доставайте меня!

Советы по технической подготовке
Лучший совет: получите диплом в компьютерных науках. Чем больше у вас будет компьютерных дисциплин, тем лучше. У вас не обязательно должен быть диплом по компьютерным наукам, но это поможет. Вы не обязаны иметь какие-либо дополнительные звания, но это также будет плюсом.
Однако вы, вероятно, рассчитываете работать в Google несколько раньше, чем через 2-8 лет, поэтому дам для вас несколько советов, требующих меньше времени для подготовки.
Алгоритмическая сложность: вы должны знать Big-O (прим. перев.  нотация "большого O " определяет время выполнения алгоритма, например, O(n) обозначает время, пропорциональное числу обрабатываемых элементов n, а O(1) - время, независимое от числа элементов). Это обязательно. Если вы плаваете в основах big-O анализа сложности, тогда вам наверняка гарантирован отказ. Это всего одна глава в начале теории в книге о вычислительной технике, просто прочтите. Вы можете это сделать.
Сортировка: знание сортировки. Не используйте сортировку пузырьком. Вы должны знать в деталях, по крайней мере, один из n*log(n) алгоритмов сортировки, а ещё лучше два (скажем, быстрая сортировка и сортировка слиянием). Сортировка слиянием может быть полезна в тех случаях, где использование быстрой не очень практично, поэтому посмотрите её.
И ради всего святого, не пытайтесь сортировать связанный список на собеседовании.
Хеш-таблицы: хеш-таблицы возможно единственные наиболее главные структуры данных известных человечеству. Абсолютно точно, вы обязаны знать, как они работают. Опять же, это одна глава в книге о структурах данных, так что прочитайте о них. Вы должны уметь реализовать их на вашем любимом языке, используя исключительно массив, на протяжении собеседования.
Деревья: вы должны знать про деревья. Говорю вам: это базис, про это стыдно упоминать, но некоторые из вас не знают даже элементарных вещей о построении, обходу и манипуляции с деревьями. Вы должны быть знакомы с бинарными деревьями, n-арное дерево и префиксными деревьями, как минимум. Наверное, деревья это лучший источник практических упражнений во время долговременной подготовки.
Вам должен быть известен, хотя бы, один способ балансировки бинарного дерева, вне зависимости от того, какое это дерево – красно/черное, расширяющееся или АВЛ. Вы должны знать, как они реализуются.
Также вы должны знать алгоритмы обхода деревьев: BFS (breadth-first search - поиск в ширину ) и DFS (depth-first search - поиск в глубину), знать разницу между inorder, postorder и preorder (прим. перев. прямым и обратным порядком обхода вершин, обходом в глубину).
Вы, возможно, немного используете деревья изо дня в день, но это потому, что избегаете задач с ними. Вам не надо будет этого делать, как только вы научитесь, как они работают. Учитесь!!!

Графы
Графы действительно очень, очень важны. Даже больше чем вы думаете. Даже если вы считаете их важными, они важнее, чем вы думаете.
Существует три основных способа представления графа в памяти (объекты и указатели, матрица, лист смежности), вам должен быть известен каждый способ представления а также, их достоинства и недостатки.
Должны знать базовый алгоритм обхода графа: поиск в ширину и в глубину. Вы должны знать их вычислительную сложность, их взаимозаменяемость, и как реализовать их в реальном коде.
Вы должны попытаться выучить знаменитые алгоритмы, такие как Dijkstra и A*, если появится возможность. Они просто потрясающие для всего чего угодно, от программирования игр до распределенных вычислений. Вы должны знать их.
Всякий раз, когда кто-то предлагает вам решить задачу, подумайте о графах. Они – наиболее фундаментальный и гибкий путь представления отношений любого типа, поэтому с вероятностью в 50% любая интересная архитектура решения задачи содержит в себе граф. Убедитесь, что вы не можете решить проблему, используя графы, перед тем как двигаться к другому виду решений. Этот совет крайне важен.

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

Математика
Некоторые интервьюеры задают основные вопросы с дискретной математики. Это больше свойственно Google, чем другим компаниям, в которых я работал, и считаю, что это хорошая штука, даже, несмотря на то, что я не очень хорошо разбираюсь в дискретной математике. Мы постоянно сталкиваемся с задачами подсчета, вероятности и многими другими 1000 и одна ситуациями, связанными с дискретной математикой, и их бесчисленное множество, приводит нас в замешательство, не зная, что нам делать.
Не злитесь, когда вам зададут математические вопросы. Покажите себя с лучшей стороны. А лучше всего будет, если вы потратите немного времени перед собеседованием, освежая в памяти (или узнавая новое) основы комбинаторики и теории вероятности. Вы должны знать задачи выбора n из k элементов и их производные - чем больше, тем лучше.
Я знаю, вы ограничены временем. Но этот совет может склонить чашу весов на вашу сторону, почувствуйте разницу "мы не уверены" и "давайте наймем его". И это всё не так уж и плохо – дискретная математика не сильно использует школьную математику, которую вы выучили и забыли. Она основывается на элементарной школьной математике, и вы, наверняка, выучите всё, что вам необходимо для интервью за пару дней интенсивного обучения.
К сожалению, я не могу порекомендовать хорошую книгу по дискретной математике, поэтому если вам такая известна, пожалуйста, укажите её в комментариях. Спасибо.

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

Наилучшая, наиболее практическая книга, которую я когда-то читал - это Doug Lea Concurrent Programming in Java. Она оказала на меня наибольшее влияние. О параллелизме написано множество книг. Я бы избегал академических частей и сфокусировался бы на практической части, т.к. наиболее вероятно, что именно из этой области будут вопросы на собеседовании.

Программирование
Вы должны знать, по крайней мере, один язык программирования очень хорошо, было бы неплохо, если бы это был C++ или Java. C# тоже хорош, т.к. он довольно-таки похож на Java. Ожидайте, что от вас потребуется написание кода, как минимум на некоторых ваших собеседований. От вас также ожидается знание изрядного количества тонкостей вашего любимого языка программирования.

Остальные мелочи
Учитывая правила, которые я очертил раньше, возможно, что вы попадете на интервьюера A, и ни одна из вещей, которую вы почерпнули из этих советов, не будет напрямую полезной (за исключением, подготовки – разминки). Тогда, просто сделайте всё возможное. В худшем случае, вы всегда сможете прийти через 6-12 месяцев, правильно? Возможно, это кажется долгим сроком, но я уверен, оно пройдет очень быстро, не успеете и оглянуться.
Те вещи, про которые я упоминал, в общем то, как красная тряпка: вещи, которые действительно беспокоят людей, если вы не знаете их. Знание дискретной математики, скорее всего, не обязательно, но довольно таки рискованно, если вы не знаете, хотя бы основы. Всё остальное, что я упомянул, вы должны знать хорошо, и тогда, вы будете подготовлены, как минимум, к основному уровню собеседования. Оно может быть намного тяжелее, чем это, или может быть намного проще, зависит от интервьюера.
По сути, это зависит от того, насколько удачливы вы. Чувствуете ли вы себя удачливыми? Тогда попробуйте!
Далее автор предлагает прислать ему резюме, поэтому шлем на его странице.
Надеюсь, это было полезным.


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




P.S. Надеюсь, перевод тоже будет для многих полезен. Хотя конечно критерии отбора у американских фирм и отечественных намного отличаются, но знание основ и подготовка к собеседованию всегда будет для вас большим плюсом при прохождении собеседования и устройстве на работу.
 P.P.S. Большое спасибо yevda за помощь в переводе.
Share/Save/Bookmark

4 комментария:

  1. Перевод - дословный и, особенно в начале, местами ужасен

    ОтветитьУдалить
  2. Хм, всегда удивлялся людям которые хотят работать в крупных компаниях и вечно быть винтиком, закручивающим чужие гайки. Видимо мозгов для создания чего-то нового и полностью своего не хватает, вот и изучают все эти "тонкости" c++, алгоритмов и тп дабы "пройти" собеседование =)

    Зрите в корень!

    ОтветитьУдалить
  3. Хм, всегдя удивлялся вот таким вот анонимам.

    ОтветитьУдалить
  4. >>>Хм, всегда удивлялся людям которые хотят
    работать в крупных компаниях и вечно быть винтиком, закручивающим чужие гайки.

    А меня всегда удивляли кулибины, страстно изобретающие велосипед в одиночку и не попробовавшие быть винтиками хотя бы в рамках приобретения опыта!

    ОтветитьУдалить