Современное собеседование по программной инженерии касается не только технических навыков.

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

1. Дерево

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

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

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

Мотивация:

  • показывает, как человек моделирует данную ситуацию в код
  • проверяет знание структур данных
  • показывает процесс решения проблем и отладки

2. Объяснение

Мы выбираем проблему или необычное поведение, которое происходит в коде. Кандидат может запускать его столько раз, сколько захочет, модифицировать и отлаживать его поведение. Задача, которую ставит кандидат, — подробно объяснить нам, что происходит внутри кода и его аргументацию. Примером может быть использование декораторов в Python. Во фрагменте нужно объяснить, как работают декораторы и рефакторинг данного кода.

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

Мотивация:

  • демонстрирует навыки обмена знаниями
  • показать процесс решения проблемы

3. Обзор кода

Сделать надлежащий код-ревью — действительно сложная работа. Очень легко пропустить какие-то ошибки или плохо сформулировать комментарий. Мы предоставляем кандидату плохо написанный фрагмент кода, который должен нарушать как можно больше правил чистого программирования. Кандидат выполняет проверку кода в используемом нами инструменте с возможностью комментирования. Мы должны проверить, замечает ли кандидат нарушение таких правил, как SOLID, DRY, DIP или другие несоответствия. Знание специфических для языка соглашений, таких как PEP 8, также важно, поэтому мы должны нарушить некоторые из них в предоставленном коде.

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

Этот пример может быть слишком неправильным, но он дает много места для поиска ошибок. Соглашения об именах, обнаружение ошибок, разделение обязанностей или Magic Number — это вещи, которые каждый опытный разработчик должен легко указать и быть в состоянии объяснить, что не так и что нужно отрефакторить.

Мотивация:

  • демонстрирует навыки код-ревью и работу с кодом других людей
  • показывает знание хороших практик кодирования

Полный исходный код можно найти здесь: