Статьи

Руководство по техническим интервью


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

Читайте « Взлом интервью» (доступно бесплатно  здесь , в  Google Play и других местах). Это невероятно, оно в основном охватывает все вопросы, которые может задать вменяемый интервьюер. Это действительно мое главное предложение, но вот несколько дополнительных советов:

Pre-Prep

Зайдите на Glassdoor и посмотрите, что люди говорят о процессе собеседования в компании. Часто они перечисляют вопросы, которые им задавали, и интервьюеры не настолько креативны: если есть какие-либо вопросы, перечисленные вообще, убедитесь, что вы можете их идеально кодировать. Google также может быть полезен: «<компания> экран телефона» или «<компания> интервью» часто будут давать вам другие возможные вопросы.

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

* Ответ всегда «hashtables». Используйте их рано и часто, они почти всегда облегчают проблему.

Нетехнические вопросы

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

Проект 1_ Проект 2_ Проект 3
Самый сложный
Что вы узнали
Наиболее интересно
Сложная ошибка
Понравилось больше всего
Конфликты с товарищами по команде

Это в значительной степени охватывает все «мягкие» вопросы, которые вы, вероятно, получите. Я сделал это, используя частную доску Noodlin , которая хорошо сработала для меня (но Google Spreadsheet также, вероятно, работал бы хорошо):

NoodlinMatrix

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

Тогда практикуйте свои ответы вслух ! По крайней мере, для меня говорить вещи вслух — это совсем не то, что говорить в моей голове. Я ушел на случайные касательные, жалуясь на вещи, а затем понял, как это звучит на полпути.

Ваши ответы должны быть короткими (1-5 минут) и рассказать о вашем кодировании. Например, вы могли бы сказать: «Весь код был в гигантском операторе switch, поэтому я абстрагировал его в <структуру данных>, а затем проследил его». Плохой ответ: «Я использовал <некоторую платформу> и <горячую новую технологию>».

Подготовка к техническим вопросам

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

На все вопросы, которые вы можете получить, придумайте альтернативные ответы. Вы можете оптимизировать для пространства? Можете ли вы оптимизировать по времени? Как правило, вы можете найти быстрое решение, которое использует много места и медленное решение, которое использует очень мало. Если бы вы сделали это рекурсивно, могли бы вы сделать это итеративно (и наоборот)?

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

Перед экраном телефона

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

После того, как ваше интервью настроено, убедитесь, что вы все готовы за 15 минут до назначенного времени. Если они не сказали вам, что это будет техническое интервью, предположите, что это будет, и подготовьте свой компьютер к интернету. Имейте мобильный телефон с гарнитурой громкой связи (я получил этот на Амазоне за 10 $, и это работало отлично).

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

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

Наконец, наркотики! Я завариваю чашку кофе за 15 минут до собеседования и пью большую ее часть, но оставляю немного. Я обнаружил, что хорошо иметь бустер (или, по крайней мере, кое-что для моего рта), если я полностью застрял в вопросе.

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

Выполнение технических вопросов

Во время интервью проходите кодирование в несколько этапов:

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

    • Когда вы думаете о крайних случаях, делайте заметки о них (или уточняйте с помощью собеседника). Возможно, вы понимаете, что должны обработать переполнение на 20 строк, но уже забыли к строке 30. Просто добавьте a, // TODO: handle overflowа затем сделайте пропуск, чтобы позаботиться обо всех TODO.
    • Если вы не уверены, что можете придерживаться логики, оставляйте комментарии. Например, для проблемы с пулом соединений вы можете сделать что-то вроде:
      Connection* getConnection() {
          // Check if pool is empty
          // If so, create new connection
          // If not, return connection from pool
      }

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

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

      if (valid) {
          counter++;
      }
      else {
          while (x[i] == '\0') {
               int j;
               for (j = counter; j >= 0; --j) {
                    // oh crap, this is going to be even more complicated... 
               }
          }
      }

      следует включить в это:

      if (valid) {
          counter++;
      }
      else {
          counter += chompNulls(x, i);
      }

      • Тогда иди пиши chompNulls.

    • Проверь свою работу. Существует почти непреодолимое искушение сказать «хорошо, готово», когда все, что у вас есть, это первый набросок. После того как вы закодировали последнюю строку, дважды просмотрите код, прежде чем сказать «готово»
      • Сначала проверьте крайние случаи. Вы можете передать в ноль? Нуль? Пустой строки? Отрицательные числа? Действительно короткие строки? Длинные струны? Ответ в начале / середине / конце? Вы можете найти большинство ошибок с помощью нескольких быстрых проверок здесь.
      • Убедитесь, что подпись вашего метода все еще имеет смысл. Часто на полпути вы понимаете, что возвращаете что-то не то, что думали, или вам не нужен параметр.
      • Пройдите любой тестовый пример, который вам дали, убедитесь, что он работает. (Если они дали несколько, вам не нужно проходить их все, просто выберите один.)
    • Сообщите, когда вы закончите. Конечно, постоянно держите интервьюера в курсе, но это особенно важно, как только вы перестанете программировать и просто сидите в тишине (проверяя все). «Теперь позвольте мне проверить случай, когда n отрицательно» будет иметь большое значение для того, чтобы интервьюер был доволен.

      Затем дайте им знать: «Хорошо, я думаю, что это нужно сделать», как только вы закончите (пожалуйста, не сидите в тишине).

    Долгий путь

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

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

    Кроме того, если вы не знакомы с кодированием на доске, попробуйте ответить на некоторые ответы «Взломать кодирование» от руки, прежде чем входить. Убедитесь, что вы оставляете много пробелов между строками, даже если они вам не нужны, они вам понадобятся , Я обнаружил, что, если я сконцентрируюсь на распространении чего-либо, мой мозг неосознанно оставляет больше места, где мне нужно будет что-то добавить позже (например, проверка на крайние случаи, добавление большего количества условий в if и т. Д.). Ваш пробег может варьироваться.

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

    потом

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

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

    Если вы получили согласие, поздравляем! Они любят тебя. Теперь вам просто нужно выяснить, что делать дальше. Для ведения переговоров (и более общего интервью / резюме / сопроводительного письма) я настоятельно рекомендую Спросить менеджера .