Как не завалить техническое собеседование в IT-компании. О техническом собеседовании

11 июля 2011 в 02:36
  • IT-компании

Я уже достаточно давно провожу технические интервью с кандидатами на позицию Software engineer и на моем счету их имеется несколько десятков. Сегодня я попробую сформулировать основные моменты, которые лично мне, как интервьюеру, кажутся довольно важными.

Советы довольно очевидные (хотя, как показывает практика, бывают и те, кто не знает этих очевидных вещей) и субъективные.

1. Отвечая на общие вопросы помните, что интервьюер может ничего не знать о том, о чем вы говорите .
Бывает, что в самом начале интервью интервьюер задает общие вопросы - например «Расскажите о проекте Х, над котором вы работали в У» (список проектов берется из резюме) или «Расскажите про самую любимую технологию» или еще что-нибудь такое. Отвечая на этот вопрос очень важно помнить, что вы рассказываете о проекте не себе, а интервьюеру - и ваша задача, чтобы интервьюер вас понял.
Не надо предполагать, что интервьюер очень умный и все знает - он, вероятно, действительно умный, но точно знает далеко не все. И то, что для вас может быть очевидным потому, что вы этим занимались пару лет кряду, для интервьюера может быть совершенно новой областью. И поэтому не стесняйтесь начать с самых основ и время от времени интересуйтесь, понимает ли вас интервьюер.

2. Не гуглите во время интервью.
Бывает такое, что интервьюер задает вопрос, ответ на который вы смутно помните, и если бы только одним глазком взглянуть в википедию… Так вот - не надо этого делать. Стук клавиш обычно довольно неплохо слышен через телефон и ответ, который зачитывается из википедии без особого понимания - тоже довольно несложно отличить. Стоит ли говорить, какое впечатление оставляет у интервьюера такой кандидат?

3. Не врите в резюме.
Есть вещи, которые проверить относительно легко - знание какой-то технологии, например. И вещи, которые проверить сложно - например, если кандидат написал, что он в top 100 на topcoder (это такой сайт, где проводятся соревнования по программированию). Лично я этого на уровне «А под каким ником вы там числитесь?» никогда не проверяю, но от кандидата, который в top 100 на топкодере я жду, что простые вещи он напишет не приходя в сознание (я уже интервьюировала олимпиадников - и по моему опыту так и происходит). И если вдруг окажется, что кандидат пишет код медленно, с кучей ошибок - то это, скорее всего, значит, что либо он очень плохо себя чувствует, либо в резюме он указал неверную информацию.
Конечно, в компетенцию интервьюера не входит оценивать состояние кандидата, но я обязательно упомяну об этом несоответствии в своем отзыве.

4. Не пытайтесь «уболтать» интервьюера.
Если интервьюер задал вопрос - например, «Какая сложность у сортировки пузырьком?» - а вы не помните, то ли это O(N^2), то ли O(N), то ли O(NlogN), то ни в коем случае не надо маскировать свое незнание под кучей фраз, которые вы надеетесь что интервьюер примет за правильный ответ. Интервьюер очень внимательно вас слушает и замечает все попытки невзначай увести его от вопроса, на который кандидат не знает ответа. Лучше просто признаться, что вы точно не помните и подумать вслух - скорее всего вы придете к правильному ответу и так.

5. Говорите и объясняйте. Но не слишком много.
Бывают две крайности - кандидат, который молчит и почти ничего не говорит и даже на вопрос вроде «Расскажите мне, что вы думаете о Х, какие у Х достоинства и недостатки» умудряется ответить максимум одним предложением. И кандидат, который говорит и объясняет все вплоть до последней запятой - «Вот тут я ставлю запятую, потому, что таков синтаксис языка». И первый, и второй тип кандидатов очень сложно интервьюировать - из одних приходится тянуть ответы клещами, а других постоянно обрывать на полуслове.
Объяснений должно быть в самый раз - чтобы интервьюер понял суть, но при этом не чувствовал, что кандидат постоянно хочет сорваться в объяснение тривиальных основ.

6. Тестируйте код сами.
Во время интервью вы написали какой-то код, который по вашему мнению правильный. В этот момент важно этот код протестировать не дожидаясь, пока интервьюер вам скажет «А теперь давайте протестируем код на простом примере 123». Во время тестирования очень важно проверить так называемые corner cases - например, null, пустые строки и массивы, отрицательные числа, ноль - и еще более важно удостовериться, что код действительно работает на простых примерах. Потому что кандидат, который тестирует код, но при этом во время тестирования не замечает очень грубую ошибку, обычно не производит самого лучшего впечатления.

7. Не пытайтесь угодить интервьюеру.
В фильме «Bad teacher» есть один момент - один из главных героев спрашивает другого об акулах:
1: Что вы думаете об акулах?
2: О, акулы это такие ужасные рыбы, я слышал что они едят людей…
1: Но некоторые из них никого не едят, и очень даже милые…
2: О да, это ужасно, что люди истребляют акул, ведь акулы - это вымирающий вид и Бог создал их такими. Они - прекрасные создания…
1: Но ведь они едят людей…
2: Да, да, это ужасно, целые семьи бывают разрушены из-за акул…

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

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

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

Сирадж Равал, разработчик, писатель и видеоблоггер, рассказывает как успешно пройти любое техническое собеседование в 5 шагов.

Я проходил через этот процесс дюжины раз в различных IT-компаниях, на моей памяти огромное число как отказов, так и предложений. И вот какие уроки я из этого извлек. Собеседование требует труда: не верьте тем, кто утверждает, что это должно быть легко. Это не так. Люди говорят только о своих успехах и никогда - о провалах.

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

Шаг 1. План подготовки

Учитесь. Еще до того, как вас посетит светлая мысль попытаться устроиться куда-нибудь работать, вы должны сконцентрироваться на прокачке своих технических навыков.

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

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

Возникает вопрос, что именно надо практиковать? У вас не будут проверять знание синтаксиса какого-либо языка. При желании можно изучить основы синтаксиса Ruby за одну ночь. Но на что ночи не хватит, так это на основы фундаментальной информатики. А ведь на собеседовании у вас будут проверять именно знания структур данных и алгоритмов.

Начните с прохождения двух курсов:
введение в структуры данных (My Code School)
введение в алгоритмы (MIT Open Courseware)
Оба они находятся в открытом доступе и идеально подходят для того, чтобы получить базовые знания по этим разделам.

После этого можно закрепить полученные знания на HackerRank и HackerEarth . Эти ресурсы содержат огромное количество задач для оттачивания навыков программирования.

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

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

Шаг 2. Найдите компании, которые вас интересуют

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

Отслеживание процесса подготовки и прохождения собеседований в компаниях может быть довольно стрессовым делом, но пытайтесь оставаться организованным. Составьте список интересных вам компаний и отмечайте, на какой стадии находятся ваши отношения с каждой из них. Неплохими ресурсами для этого могут служить angel.co и Hacker News .

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

Шаг 3. Составьте портфолио

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

Неплохая идея - иметь несколько резюме: по одному на каждую специальность или для каждой компании, куда вы пытаетесь устроиться. В портфолио разделите личные проекты, проекты с хакатонов, вливания в проекты с открытым кодом.

GitHub - прекрасное место не только для хранения вашего кода, но и как еще одно портфолио, которое может сослужить вам хорошую службу.

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

Шаг 4. Получите приглашение на собеседование

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

Настало время перейти к…

Шагу 5. Пройдите собеседование

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

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

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

Заключение

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

Виктория Придатко – известный эксперт в области позитивного управления ИТ-персоналом: её можно встретить на ИТ-конференциях, посвящённых менеджменту. В этом году она является одним из хедлайнеров конференции HR-специалистов в ИТ «Найти Ответ» в Питере. Мы публикуем её доклад с конференции Software Project Management Conference , которая в этом году пройдёт в Минске.
Презентация доклада Видео доклада

Текст доклада

Одна из моих любимых фраз – я её часто повторяю, поскольку это «Капитан Очевидность», –
Первое впечатление второй раз не создашь.
Первое впечатление является очень важным, и часто кандидаты составляют впечатление о компании именно по первому собеседованию. Если оно было негативым – очень трудно потом убедить их в обратном. Зачем вам это надо? Где могут пригодиться эти знания? Чем приятней общение с вами, тем лучше ваша репутация, тем больше денег и больше выбор. Когда вы известны, в хорошем смысле этого слова, когда на вас обращают внимание – претенденты хотят попасть на собеседование именно к вам. И чем больше людей хотят к вам попасть, тем больше компаний делают вам предложения. А чем лучше вы проводите собеседования, тем больше у вас принятых офферов. Часто ПМ-ы говорят так: рекрутеры не могут нам никого найти, поэтому мы не можем создать команду. Когда я прихожу к ним на техническое собеседование и смотрю, как они его проводят, – я понимаю, почему так трудно найти людей, которые согласились бы там собеседоваться. Хорошее собеседование – это шаг к должности менеджера: если вы ещё не менеджер, но хотите стать им, вам надо уметь собеседовать.
  • Собеседование – это коммуникация. Об этом мы и поговорим,
  • Как это происходит? Я буду рассказывать о своём опыте.
  • Ошибки в собеседованиях.
  • Признаки классного интервью.
  • Кто\что может помочь?

Интервью с HR-ом

Я не могу говорить за Россию, но в Украине сейчас в HR-ы берут очень симпатичных, не побоюсь этого слова – сексуальных девушек, которые всячески заманивают кандидатов. Как правило, организуются два интервью: с HR-ом и техническое. Часто кандидат на первом интервью расслабляется, а второе интервью очень сильно отличается от первого – собеседовать приходит технически сильный специалист. Проблема еще и в том, что очень часто такие специалисты хотят не сколько провести интервью, сколько показать себя. К сожалению, в компаниях этот процесс не всегда построен, и технических специалистов не спрашивают, когда им удобнее проводить интервью, – их просто вырывают из проекта. Как вы знаете, программисты работают в потоке, и им потом очень трудно в него вернуться... к сожалению, не все компании это учитывают. Соответственно, ощущения технического интервьюера следующие:
  • Чёрт, опять собеседование!
  • Ну, рассказывай что знаешь...
  • Ага, так этого ты не знаешь, бугага – опять рекрутеры пригласили тупняков.
  • А я вот знаю это и это, поэтому – я ПЕРЕЦ!
У меня как-то был такой опыт: мы очень долго искали джависта в одну компанию, и вот рекрутеры нашли классного джависта, пригласили на интервью, всё было супер, он пришёл во второй раз, и его собеседовал другой джавист, которому надо было самоутвердиться. В итоге он сказал: «Ну что, будем… меряться или поговорим?» Это впечатление просто убило кандидата, и впечатление сложилось соответствующее. Самое плохое, что эта информация потом транслируется дальше.
Почему так делать нельзя? Потому что по собеседованию люди часто составляют мнение о всей компании. Как известно – люди приходят в компанию, а уходят от менеджера. Допустим, во время интервью вы померялись… и ушли с ощущением, что вы классный, а кандидат ушёл с ощущением, что он ужасен, и что он будет рассказывать людям?.. Чем больше у вас таких собеседований, тем, к сожалению, меньше у вас кандидатов. Основные ошибки на техническом собеседовании:
  • Понты;
  • Умничанье и болтовня – когда люди компетенты в какой-то теме, они склонны эту тему развивать, и в результате интервью превращается в рассказ интервьюирующего о его любимом вопросе. Хочешь рассказать о себе – вали на конференцию и рассказывай, какая проблема?
  • Равнодушие – тоже часто встречающийся паттерн, когда технические интервьюверы сидят устало, вся их поза свидетельствует о том, что им страшно скучно и вообще непонятно, что они здесь делают… Опять же, это очень сильно зависит от того, как это организованно в компаниях. Я знаю компании, где этот процесс организован классно, где людям, проводящим техническое интервью, за это еще и платят...
  • Стресс-собеседование – такой вид панельного интервью, когда пять собеседующих тебя по очереди «мочит»… Хотя я видела интервью, когда интервьюировали пять человек и при этом была вполне дружественная обстановка.
  • Опоздание . Давайте уважительно относиться к кандидатам: мы часто вырываем людей из проекта их компании, мы забираем их рабочее время и при этом сами позволяем себе опаздывать… Моя позиция такая: если человек приходит к вам в обеденный перерыв – накормите его обедом. Для компании это копейки – предложите ему сэндвич, а не только кофе или чай! Или, допустим, кандидат пришёл вечером – если рабочий день заканчивается в 18:00, а вы пригласили его на 19:00, то понятно, что он пришел к вам голодный. Ребята! Простой сэндвич творит чудеса! Вы не поверите, как сильно у людей меняется впечатление о вас.
  • Отсутствие фидбэка . Итак, мы провели техническое интервью, а дальше мы считаем, что фидбэк – это ответственность рекрутера (я, кстати, тоже так считаю). Но фидбэк по техническому интервью должен давать тот человек, который его проводил. Когда мы звоним человеку – неважно, взяли мы его или нет – мы можем сказать ему, что нам понравилось, а что, на наш взгляд, можно улучшить. Чувство благодарности, которое возникает у людей после того, как вы им это рассказали, – это просто ни с чем не сравнимое ощущение. Они будут об этом помнить, и вы потом еще не раз удивитесь, в какие моменты это будет всплывать. Ведь кандидата всегда есть за что похвалить, и нет таких людей, которые вообще ни в чем не разбираются, – иначе мы не приглашали бы этого человека на собеседование. При этом очень важно сказать, что было хорошо, а что можно улучшить, и что плохо. У HR-ов есть такое выражение «зона развития»: не то чтобы у тебя всё плохо, просто у тебя в какой-то области наметилась «зона развития».
Бывает такое: вы долго искали человека, хантили, наконец, позвали его на собеседование и там задаёте ему вопрос: «А почему вы хотите работать в нашей компании»? И это называется «когнитивный диссонанс». А ведь это стандартный вопрос – люди просто не задумываются о том, что они спрашивают. Потому обязательно отслеживайте ресурсы, благодаря которым кандидат приходит к вам, – это действительно важно. Если вы хантите человека, то и сам процесс интервью должен быть другим, и вопросы должны быть построены по-другому. Какие последствия?
  • Не плюй в колодец . Иногда случается, что человек, которого вы собеседовали, потом может собеседовать вас. У меня был такой случай в жизни – у меня достаточно много знакомых, и, допустим, наша компания отсобеседовала кандидата не очень хорошо, а потом ты сам попадаешь к нему на собеседование, и он говорит, ага, сейчас я тебя отсобеседую.
  • Be nice or leave … Как я уже говорила, очень важно оставить у людей положительное впечатление. Для технических специалистов важна компетентность человека, который проводит собеседование, но его «хорошесть» (в хорошем смысле этого слова – его уважительное отношение, его «принятие другого человека») – важна не менее, чем техническая компетентность, а иногда даже больше.
  • Тот человек, которого вы собеседуете, может оказаться вашим руководителем или рекомендателем в будущем. Рынок непредсказуем – люди растут по-разному, переходят в разные компании и, соответсвенно, все друг друга знают.
Как лучше? Лучше общаться с кандидатом как с потенциальным коллегой и приятным человеком. Представьте, что человек попал к вам в команду: как бы вы общались с уже нанятым сотрудником? Неважно, возьмете вы человека или нет, – помните, что вы можете пересекаться с этим человеком, и всякие резкие суждения могут быть неуместны. Спрашивайте его из желания узнать что-то новое, а не из чувства превосходства. Все люди знают что-то, чего не знаем мы, и мы не можем знать всё. Потому мы должны проводить собеседование с искренним интересом и действительно слушать человека. А понять, что мы на самом деле не слушаем, очень легко – это видно по нашим глазам, по нашей позе. Даже если люди не владеют языком тела – они всё равно понимают, слушают их или нет. Спросите человека о том, что для него важно. Благодаря этому вы многое узнаете от самого человека: что важно для него и что из этого может быть важно для вашего проекта. Так вы поймёте, как его лучше мотивировать и как с ним лучше обращаться. Спросите, с какими людьми ему нравится работать? Это очень важный вопрос: если вы понимаете, что у вас на проекте люди совсем не такие, то это для вас тоже будет индикатором. Я всегда за честное интервью: я за то чтобы говорить правду. Вы можете рассказать человеку про проект, про людей, чем они отличаются от его ожиданий – и пускай он выбирает, подходит ему это или нет. Берите людей, которые обожают то, что они делают. В ИТ очень любят «сениоров», по ним сходят с ума, их перекупают. Но некоторые «сениоры» не любят то, что они делают. Да они «сениоры», они ценятся на рынке, они получают хорошие деньги, но они терпеть не могут то, что они делают. Порой они приходят, «звездятся», уходят и таким образом часто перемещаются по компаниям. Я знаю людей, которые не так уж мегакомпетентны на данный момент, но за счёт того, что они заинтересованы и обожают то, что они делают, – очень быстро могут стать «сениорами». Совпадение по ценностям и умению взаимодействовать могут стать более важными, чем знания. Навыки и знания – это те вещи, которые можно получить. Если вы не совпадаете по ценностям – то это проблема на более глубоком уровне. Конфликт на ценностном уровне может решаться, но решается он очень нелегко… Сначала надо узнать мотивацию кандидата, а потом продавать бенефиты компании. В каждой компании по-разному, но часто техническое и HR интервью проходят вместе. Что обычно делает HR? Обычно он «продаёт» компанию, не спрашивая, что интересно кандидату. А ведь все аутсорсинговые, а то и продуктовые компании примерно равны по уровню компенсаций. Но не всем, например, важна страховка. Бывает такое, что человеку рассказывают про страховку, а он спрашивает: «А у вас в команде есть люди, которые играют в баскетбол?» – он ищет есть ли у него общие интересы с командой. Выслушайте, что человеку интересно, и продавайте ему то, что ему интересно. Обязательно узнайте, чем увлекаются люди у вас в команде, и спросите об увлечениях кандидата. Когда я просматриваю резюме – я обращаю внимание на то, чем увлекается кандидат, расспрашиваю его об этом, а потом рассказываю об этом в команде, и тогда у людей в команде формируется о нем совершенно другое впечатление. Кстати, заранее расскажите команде о новом человеке – и я за то, чтобы интервью проходило с участием членов команды. Когда спрашиваете у кандидата о достижениях – уточните, кто может это подтвердить. Покажите кандидату офис, его рабочее место. Этот момент часто упускают. Человека обычно сразу ведут в переговорку, там с ним общаются битый час, а потом выводят через «ресепшн». Я не считаю, что показать офис, показать проект, в котором вы участвуете, – значит раскрыть коммерческую тайну. Для меня очень важно атмосфера в компании, куда я прихожу работать. Для меня важно зайти в комнату и почувствовать, «как там». Приведите человека в проект, покажите, где у вас кто сидит, – даже если он у вас не будет работать, он может порекомендовать других людей. Ваш внешний имидж должен соответствовать внутреннему состоянию, состоянию внутри компании. Покажите человеку то, что вам в компании самим нравится, то что вызывает у вас эмоции, – люди откликаются на эмоции, и, когда они видят, что вам это нравится, – им тоже это нравится. Проводите собеседование с юмором и энергией, УГ много в компаниях-конкурентах:). Если есть возможность провести собеседование с юмором – это создает положительное ощущение у кандидатов. Люди постоянно сравнивают: в этой компании было хорошее собеседование, в той – не очень, и если ваше собеседование будет отличаться от других, это может дать вам бонусы.

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

  1. JavaCore
  2. Базы данных.
  3. Инструменты, которыми пользуешься.

JavaCore

    Вначале меня попросили нарисовать иерархию интерфейсов у Коллекций (это было не сложно, там всего их несколько (Collection , List , Set , Queue , Map).

    В чем различие ArrayList и LinkedList (это один из самых заезженных вопросов и ответов в инетах просто тьма).

    Обсудили скорость выполнения запросов в них и какая разница между листами.

    Вопрос про класс Object . Какие у него методы, что они делают.

    Рефлексия. Что делает метод getClass() . Очень интересный вопрос, разберите его. Особенно про то, как получить всё про класс, пусть даже там приватные методы или переменные.

    Спросили за многопоточность. Слабенько, как я считаю, так рассказать как ты понимаешь что такое многопоточность. Что нужно, чтоб запустить новый поток. Реально, если вы 20+ уровень, то эти вопросы для вас покажутся смешными.

    Что можешь сказать про Stream . Это имеется в виду не про Java 8. Имеется в виду потоки ввода и вывода. Как базовые интерфейсы, какие они (символьные и байтовые). На понимание, никакой конкретики.

  • Исключения. Здесь опять-таки попросили нарисовать иерархию исключений, какие бывают, какие из них checked , а какие unchecked . Что нужно делать с Runtime исключениями. Назовите самое часто попадающее (NullPointerException).
  • Вопрос с тем, что нужно делать с checked исключениями(пробрасывать дальше или обработать - понятно и то и другое).

ООП

    Что такое ООП в двух словах?

    Какие еще есть парадигмы программирования? В чем их различие от ООП

    Какие основные принципы ООП (наследование,полиморфизм и инкапсуляция)? Рассказать про каждый из них. Пока всё абстрактно, не привязываясь к какому-то языку.

    Задача на понимание проектирования систем: есть Лошадь и Птица. Нужно получить Пегаса. принцип "has a" и "is a"

REST

    Что такое REST. В Википедии об этом говориться очень круто. Реально статьи из Википедии для ознакомления хватит.

    HTTP. Здесь тоже общие фразы. Его методы, для чего каждый из них.

    Коды состояния HTTP. На какие пять частей делиться, расскажите про самые известные (200,204,404,500,501). Зачем они. Спросили еще про 401 и 403. Но я не знал их. Сказали они важные.

Базы данных

Здесь я рассказал, что знаю MySQL. Рассказал про три нормальные формы. Рассказал про Join"ы, какие бывают и нарисовал пересечение областей, в котором используются разные джоины. Рассказал про то, как я понимаю реляционную БД. Не забыл еще о про MongoDB - это NoSQL база данных. Через некоторе время я напишу и про это.

Другие инструменты

Здесь мы прошлись по моем резюме. У меня было написано, что использую Maven/Gradle для сборки, использую JIRA для тасков, git, Docker, Swagger. Для Continuous Integration - Stash, Bamboo, Puppet. Для тестирования JUnit , Mockito, JMeter. Я мог что-то забыть, поэтому если интересно - спрашивайте в комментариях постараюсь ответить. Это была первая часть собеседования. Теперь жду результаты и если да, то будет вторая часть. Напишу о ней как только так сразу. Всем кому статья понравилась и была полезна - ставьте "+". Пишите в комментариях. См. также мои другие статьи:

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

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

При этом «модели» используются самые разные. В гугле когда-то считали, что человек, который сможет ответить на вопрос: сколько шариков для гольфа влезет в багажник Lexus LS470 является хорошим программистом и сможет успешно решать их задачи. Майкрософт когда-то использовал похожий подход (вспомните «Чтобы сделал мистер Фейнман» Эрика Липперта), а сейчас они садят кандидата за стол и просят его покодить. Очевидно, что эта модель также не совершенна, ведь она не соответствует реальному миру, ведь мы никогда не кодим на работе, когда от этого зависит наша судьба, а наш начальник при этом заглядывает в код через наше левое плечо.

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

ПРИМЕЧАНИЕ
Помимо отечественного аутсорса подобные тип собеседований активно используется и в некоторых компаниях в США. Например, в Нью Йорке большинство собеседований очень напоминают киевские;)

Кого мы хотим найти?

Прежде чем решить, как же нам подобрать правильных людей (и отсеять «неправильных») нужно определиться с тем, кого же мы ищем.

Проблема здесь в том, что к отечественному аутсорсу (который составляет существенную часть нашего рынка труда) не применимы те же самые критерии, что и к мировым гигантам, типа МС-а, Фейсбука или Гугла. Главное отличие между этими мирами в том, что аусорсу нужно не столько высочайшее качество, сколько большее количество при вменяемом качестве. И хотя требования к разработчикам в аутсорсе может быть и недотягивают до гугловских, тем не менее они достаточно высокие и наши программисты обычно превосходят в техническом плане многих представителей заказчика.

Так что планка в наши компании несколько ниже, ключевые критерии совпадают: нам нужно найти человека, который умеет думать, решать задачи и доводить дело до конца (кстати, именно умение довести дело до конца Бертран Мейер считает самой полезной чертой разработчика, о чем он поведал в своем недавнем интервью).

ПРИМЕЧАНИЕ
Я тут здорово все упростил, поскольку процесс отбора существенно сложнее. Как минимум нужно учитывать человеческие качества, ведь даже rock star разработчику стоит отказать, если из-за него развалится вся команда.

Техническое собеседование

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

Отечественный аутсорс при отборе уделяют максимальное внимание конкретным техническим навыкам: знаниям языков программирования, технологий и платформ. Можно сколько угодно спорить, насколько коррелируют знания языка C# с умением решать рабочие задачи и насколько этот подход лучше/хуже альтернативных вариантов. Как по мне, значительно важнее не то, какие вопросы вы задаете и какие знания проверяете, а то, как вы слушаете ответы и каким образом их анализируете.

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

Узнайте, как человек думает

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

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

СОВЕТ
Очень полезно обсуждать задачи, суть которых хорошо известна кандидату, но которые он не решал на практике. Это немного выведет кандидата из зоны комфорта и будет показывать не его способность запоминать факты, а его способность думать и принимать решения.

Никаких вопросов из "тестов"

Из первого совета вытекает второй совет о том, чего делать никогда не нужно. Не нужно задавать вопросы, ответы на которые легко гуглятся, и главное, нельзя трактовать ответы по принципу тестов: "ответил/не ответил", без продолжения обсуждения.

Меня всегда очень беспокоит, когда на собеседовании задается вопрос следующего вида: "Скажите, а какой тип возвращаемого значения должен быть у перегруженного оператора = в С++? Ссылка или константная ссылка?". Особенно печально, когда ответ на этот вопрос просто записывается на бумажке и интервьюер переходит к следующему подобному вопросу.

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

Сосредоточьтесь на фундаментальных вещах

Есть некоторые позиции, которые требуют очень глубокой экспертизы в определенной области. Бывает, что команде нужен эксперт по WCF, WPF или ASP.NET, который должен знать технологию очень глубоко и тогда на собеседовании придется гонять кандидата по всем дебрям. Во всех других случаях значительно полезнее сосредоточиться на фундаментальных вопросах, даже если они и привязаны к конкретной технологии.

Обычно под фундаментальными вещами я понимаю ключевые концепции: основы типов в.NET, основы сборки мусора и проблемы управления ресурсами; основы языка C# типа делегатов, событий, замыканий. Фундаментальные вещи из области проектирования, типа cohesion & coupling, проблемы наследования/агрегации, опасностей изменяемости и т.п; паттерны проектирования, отношение к ним и их роль в арсенале разработчика. Основы алгоритмов, можно в привязке к платформе ("Что будет если метод GetHashCode будет всегда возвращать 42?") и т.п.

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

Определите свой уровень по шкале от 1 до 10

Я уже несколько лет пользуюсь подходом, подсмотренным когда-то у Эрика Липперта и в качестве первого вопроса собеседования задаю следующий: "Определите, пожалуйста свой уровень знания языка C# по шкале от 1 до 10, где 1 – это уровень моей мамы, преподавателя математики, а 10 – уровень автора языка C# – Андерса Хейлсберга.".

Это довольно распространенный вопрос, но для меня он не самодостаточен (хотя бывает любопытно услышать от синьера, что его уровень ниже 6 или выше 8). После этого вопроса я всегда задаю второй: "Ок, ваш уровень 8, а какие именно знания перевели вас с уровня 7 на уровень 8?".

Польза такого подхода в том, что можно узнать следующее: (1) чем человек интересуется и интересуется ли чем-то вообще, и (2) можно пропустить ряд простых тем, если кандидат говорит о недавнем изучении каких-то продвинутых вещей. Так, если кандидат говорит, что он узнал о сегментах в GC и Card Table, о реализации обобщений, деревьях выражений, о проблемах изменяемых значимых типах или о генерации IL-кода, то вполне можно пропустить базовые вопросы, типа разницы между ссылочными и значимыми типами и углубиться в более серьезные подробности.

К тому же такой вопрос позволит оценить человеческие качества: насколько кандидат уверен в себе и насколько он адекватно оценивает свои знания, насколько сильно он отстаивает знания в тех областях, в которых он считает себя экспертом и т.п.

ПРИМЕЧАНИЕ
Не так давно на rsdn было обсуждение этого вопроса: "Как вы оцениваете... по 10ти бальной шкале?" , в котором я также принял участие .

Тяните за ниточку

Я очень редко провожу собеседование по бумажке. Обычно происходит следующее: берется несколько ключевых вопросов (таких себе "якорей"), на основе которых строится все обсуждение. Ответ на вопрос n зачастую дает почву для вопроса n+1, который в свою очередь дает почву для следующих вопросов.

Обычно даже невинный вопрос, типа, а зачем нужен интерфейс IDisposable приводик к обсуждению управляемых и неуправляемых ресурсов, Dispose-паттерна, откуда легко перейти к обсуждению стандартов кодирования (поскольку все эти вещи описаны в Framework Design Guideline).

Аналогично, невинный вопрос, типа "А атомарна ли операция i++, где i – это System.Int32?" может послужить хорошим началом разговора, поскольку наверняка даст почву к другим темам, таким как неизменяемость и многопоточность, проблеме гонок, вопросам об атомик операциях и многим другим.

Именно поэтому мне нравится сверх простая задача следующего вида:

class Foo
{
public event EventHandler MyEvent;
private readonly int _syncRoot = 42 ;public void RaiseMyEvent()
{
Monitor . Enter(_syncRoot);
try
{
if (MyEvent != null )
MyEvent(this , new EventArgs ());
}
finally
{
Monitor . Exit(_syncRoot);
}
}
}

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

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

Насколько "технологическое" интервью эффективно?

Есть ли связь между знанием языка C# и умением решать производственные задачи? Тут все не так просто. Можно выделить две крайние ситуации.

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

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

В целом, разумный подход на основе технологических интервью показал вполне хорошие результаты. Полноценный синьер не обязан знать про Card Table, но сможет относительно легко ответить о пользе поколений в сборке мусора, и даже не зная о SOLID принципах мы наверняка сможем пообщаться на предмет cohesion и coupling, о роле тестов и паттернах проектирования.

Талантливый разработчик знает свою кухню, как минимум на продвинутом уровне, поэтому "технологический" критерий не хуже любого другого.

Интервью – это двусторонний процесс

Для любого специалиста собеседование является двусторонним процессом: интервьюер оценивает кандидата, а кандидат оценивает компанию посредством оценки интервьюера.

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

Можно подумать, что это лишь мое личное наблюдение, и не каждый интервьюер готов спрашивать C# MVP о языке C# (хотя лично я не вижу в этом ни каких проблем). Но ведь такую же картину видят и многие мои коллеги, которые проходят собеседования на Senior или даже Middle позиции.

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

З.Ы. Если так уж случилось, что вы были на моих собеседованиях (Земля ведь квадратная;), будет интересно услышать ваше мнение о нем.