Как пройти собеседование на программиста

от автора

imageЛюбой программист рано или поздно сталкивается с вопросов о трудоустройстве. И первое, с чем должен справиться соискатель — конкуренция, особенно, когда речь идет о крупной организации. Сотрудники нашей компании PayOnline, которая занимается автоматизацией приема платежей, не исключение. Сейчас в штате PayOnline 60 человек, к найму сотрудников мы относимся с особой ответственностью, так как знаем, профессиональная команда — залог успеха компании в целом. За время нашего существования мы рассмотрели тысячи заявок о приеме на работу и провели сотни собеседований и знаем не понаслышке, как сложно бывает специалистам раскрыться при первой встрече с работодателем. Данная статья-перевод поможет избежать вам многих ошибок при устройстве на работу.

Научитесь непринужденно общаться

Перед тем как оценивать непосредственно код, интервьюер скорее всего захочет узнать вас как личность. Что ему интересно знать:

  • Как вы вообще понимаете программирование. Вы задумываетесь над тем, что значит хорошо программировать?
  • Какие у вас лидерские качества. Следите ли вы за проектом до самого завершения? Исправляете ли косяки, даже если не должны?
  • Насколько вы коммуникабельны. Обсуждать с вами техническую задачу — это продуктивно или тяжело?


Имейте наготове хотя бы что-то из этого списка:

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

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

Излагайте ясно

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

Первым делом, разберитесь, чего от вас хотят:

  1. Написать код. Интервьюер хочет видеть ясный, эффективный код, который решает задачу.
  2. Поболтать. Интервьюер лишь хочет обсудить задачу. В этом случае он обычно или задает общий вопрос по архитерктуре («Как бы вы написали аналог Твиттера?»), или просит рассказать интересных фактов («Что сейчас модно в Javascript?»). Бывает, что второе — это подводка к «настоящему» вопросу, например: «Насколько быстро можно отсортировать список целых чисел? Хорошо, а если вместо чисел будут…».

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

Заставьте собеседника почувствовать, как будто вы уже в команде. Он ведь хочет знать, каково этого работать над задачей с вами. Так что пусть собеседование станет вашей коллективной задачей. Говорите «мы», а не «я»: «Если нам нужен поиск в ширину, то ответ получим на O(n)». Если есть выбор писать на бумаге или доске, всегда выбирайте доску. Так вы окажетесь рядом с интервьюером и лицом к задаче, а не напротив него.

Думайте вслух. Нет, правда. Типа, «Давайте попробуем так — хотя я не уверен, что сработает». Если застряли, просто скажите, о чем думаете. Скажите вслух, что могло бы сработать. Скажите, что как будто должно было сработать, и объясните, почему оно все-таки не сработает. Это относится не только к вопросам о программировании. Если просят объяснить замыкания в Javascript, скажите: «Это что-то, связанное с областью видимости и штуками внутри функций». Скорее всего, это принесет пользу.

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

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

Научитесь выходить из тупиков

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

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

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

Напишите наивное неэффективное решение; оптимизируете его потом. Используйте грубую силу. Делайте все, чтобы получить хоть какой-то ответ.

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

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

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

  • «По-любому придется просмотреть все элементы, так что лучше, чем O(n), не получится».
  • «Решение „в лоб“ — проверить все возможные варианты. Получится O(n²)».
  • «В ответе будет n² элементов, поэтому потребуется минимум столько времени».

Сразу записывайте мысли

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

Вызывайте вспомогательную функцию и двигайтесь дальше. Если не можете сразу написать часть алгоритма, вставьте вызов функции с более-менее говорящим названием — «this will do X» — и двигайтесь дальше. Если эта вспомогательная функция тривиальна, может, ее вообще не придется писать.

Не парьтесь насчет синтаксиса. Не тратьте время на полировку синтаксиса. Если надо, просто пишите по-английски и скажите, что вернетесь к этому позже.

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

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

Используйте «говорящие» переменные. Да, именование переменных займет больше времени, зато не потеряетесь в коде. Лучше «names_to_phone_nums_map», чем «nums». Указывайте типы в названиях. Функции, которые возвращают булевы значения, должны начинаться с «is_». Переменная, в которой лежит список, должна кончаться на «s». Установите правила и придерживайтесь их.

В конце отполируйте решение

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

Проверьте циклы. Может, в цикле надо заменить «<» на «<=»?

Проверьте граничные условия. Тут могут быть пустые множества, множества с одним элементом, отрицательные числа. Бонус: упомяните юнит-тесты!

Не будьте занудой. Для некоторых интервьюеров финальная чистка не имеет значения. Если не уверены, спросите: «Тут я обычно проверяю код на граничные условия — стоит ли мне сейчас это сделать?».

Практикуйтесь

В конце концов, ничто не заменит практики.

Попробуйте написать код ручкой на бумаге. Будьте честны с собой. Поначалу будет стремно. Это хорошо. Надо преодолеть неудобство — тогда не будете блуждать на настоящем собеседовании.

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

ссылка на оригинал статьи http://habrahabr.ru/post/271691/