Интервьюирование — это навык сам по себе. Вы можете быть лучшим разработчиком в мире, но все равно можете провалить собеседование.

Google: 90 % наших инженеров используют программное обеспечение, которое вы написали (Homebrew), но вы не можете инвертировать двоичное дерево на доске, так что отвали.

– Макс Хауэлл (@mxcl), 10 июня 2015 г.

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

Первое интервью

Позвольте мне ответить на тот же вопрос выше «Инвертирование бинарного дерева».

Интервьюер (I): Привет! Добро пожаловать в нашу компанию. Я xxx делаю yyy. И так, расскажи мне о себе.

Кандидат © : мне xxx. У меня около 5 лет опыта в Backend разработке. Люблю решать технические задачи…..

Я: Отлично. Итак, перейдем к проблемной части?

Я: Итак, вам дано бинарное дерево. Я хочу, чтобы вы инвертировали бинарное дерево и распечатали полученное дерево.

C: Я чист. Теперь я просто думаю о способе печати узлов, начиная с листа.

Я: Что значит печатать узлы, начиная с листа?

C: Значит, я должен печатать от листа к корню, верно? Легко пройти до листа. Но самое сложное — вернуться назад?

Я: Хммм. Вы уверены, что правильно поняли вопрос? Инвертирование дерева означает, что вы должны поменять местами левый и правый дочерние элементы.

C: Извините, я не понимаю. Когда вы сказали инвертировать, я предполагал, что вы имели в виду печать от листа к корню.

C: Я закончил с кодом.

Я: Круто. Так что ты здесь сделал?

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

К: О боже. Так что это не просто корень, а полное дерево. Я прав?

Я: Да, верно.

К: Хорошо. Дай мне подумать об этом.

(Через 2 минуты)

К: Кажется, я понял. Так что в основном мне нужно сделать тот же алгоритм, который я написал для всего дерева. Я прав?

Я: Да, но как это сделать?

Итак, я предполагаю, что это должно сработать.

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

Я: Хммм. Но левый и правый узлы возвращают новые узлы после обмена, верно? Вы все еще меняете старые узлы.

C: Я не совсем понимаю, что вы имеете в виду. Я думаю, что это подойдет для всех случаев.

Я: Великий человек! У нас закончилось время. Спасибо за ваше время, было приятно поговорить с вами. HR свяжется с вами.

Обратная связь

Теперь, как вы думаете, каким было окончательное решение и каков был отзыв интервьюера? Гипотетическая обратная связь будет примерно такой:

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

Если бы это было настоящее собеседование, кандидат был бы отклонен. Как же должно проходить идеальное собеседование?

Второе интервью

Интервьюер (I): Привет! Добро пожаловать в нашу компанию. Я xxx делаю yyy. И так, расскажи мне о себе.

Кандидат ( C ): Меня зовут xxx. У меня около 5 лет опыта в Backend разработке. Люблю решать технические задачи…..

Я: Отлично. Итак, перейдем к проблемной части?

Я: Итак, вам дано бинарное дерево. Я хочу, чтобы вы инвертировали бинарное дерево и распечатали полученное дерево.

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

К: Хорошо. Так что же происходит в этом случае?

Приводит пример и поясняет ввод и вывод

К: О, понял! Поэтому я думаю, что мне нужно сделать это рекурсивно. Мужик, это тяжело! Дайте-ка подумать. Но перед этим я просто проверю свое понимание, пробежав еще один пример. Предоставляет еще один элемент, например, для уточнения недостающих элементов

Я: Да, вы правы. Это выход. Я думаю, что вы полностью поняли проблему. Итак, как вы относитесь к этому?

К: Дай-ка посмотреть. Таким образом, чтобы поменять местами левое и правое, я могу просто использовать temp. Но тогда как я сделаю это, чтобы остаться? О да, я мог бы просто повторить для других и сделать то же самое.

Я: Круто. Есть ли проблема с таким подходом?

К: Хммм. Да, если я просто рекурсивно поменяю местами левое и правое, как я буду отслеживать старое и новое дерево?

Я: я не уверен, что слежу за вами. Что такое старое и новое?

C: Я имел в виду, что будут обновленные дочерние элементы, мне нужно поменять местами их, а не старые дочерние элементы.

Я: Да, правильно.

C: Да, я могу просто вызвать эту функцию рекурсивно для левого и правого и сохранить эти значения в переменной. Затем я мог бы обновить дерево с помощью этих переменных. Таким образом, я могу убедиться, что все дерево перевернуто.

Я: Круто. Что-то еще вам не хватает?

Я: я в порядке. Вы можете начать кодирование.

Я: Думаю, вы правы. Это работает для всех случаев?

К: Хммм. Думаю, я получу исключение нулевого указателя для пустого дерева. Позвольте мне исправить это, добавив нулевую проверку.

Я: Теперь все выглядит хорошо. Что-нибудь еще, что вам не хватает.

Я: Круто. У меня все хорошо. Любые вопросы? :)

Обратная связь

Итак, что вы думаете об этом интервью?

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

Вывод

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

Первоначально опубликовано на https://kaizencoder.com 5 августа 2019 г.