Пожалуйста, чаще спрашивайте кандидата на собеседовании: «Зачем? Для чего?»

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Оговорюсь сразу - у меня нет огромного опыта прохождения интервью: всего довелось присутствовать на 7-10. К этому добавляются интервью знакомых, которыми они поделились, а также те, что лежат на просторах интернета (например, на YouTube).

Типы вопросов

Я предпочитаю делить вопросы на некоторые категории.

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

Это может быть:

  • Что такое ООП?

  • Что такое паттерн MVC?

  • Что такое event loop?

  • Что такое http?

  • Что такое атака типа XSS?

  • Что такое DOM/BOM/Telebom загорелся кошкин дом?

Задачки-забиячки.
Задачи с подковырками на знание специфического поведения языка или библиотеки. Встречаются вопросы о том, как использовать определенные функции, методы или конструкции языка. Как правило, 95%-99% из того, что будет представлено кандидату, он никогда не увидит в продакшн коде. А самое бесячее - это когда на экране происходит миллиард всего, и где-то на какой-то строчке хитро спрятана ловушка (неправильный синтаксис или внезапная операция над переменной). Эдакие задачки на внимательность.

Это может быть:

  • Что выведет console.log() в N ситуации?

  • Что будет содержать переменная в данном случае?

  • Будет ли здесь ошибка?

  • Промис с цепочкой в 100 вызовов then, catch, finally, что будет в последнем then.

  • Адский экспрешен, который в жизни не встретить, по типу ('aboba' == !typeof '123' != 123), и что он даст.

  • Что будет, если два раза сделать bind на функции с разными объектами?

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

Вот пример сборника подобных задач: (гитхаб)

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

Задачи в контексте какого-то фреймворка или библиотеки.
Эти вопросы представляют собой задачи, связанные с использованием определенного фреймворка или библиотеки. В основном это задачи в вакууме и придуманных ситуациях. Также задачки-забиячки не исключены и тут. Но иногда просят сделать действительно что-то похожее на мини-таску на 15-20 минут, чтобы посмотреть, как вы пользуетесь данным инструментарием.

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

Это может быть:

  • Нам надо хранить много данных на стороне клиента, что будем делать?

  • Надо организовать хранение паролей в БД, как сделаем?

  • Нужно сделать красивую анимацию, как реализуем?

  • Нужно сделать много вычислений на стороне клиента, как поступим?

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

Это может быть:

  • Случился баг на проде и теперь сайт полностью лежит. Что вы будете делать?

  • Каждые 5 минут падает сервер или база данных, что делать?

  • Не работает конкретное поведение, как предполагалось в браузере/интерфейсе, что делать?

  • Тестировщик Василий завел 100 багов без описания и прикрепил к вам, ваши действия?

А в чем, собственно говоря, проблема-то?

Проблема для меня в том, что выглядит это всё, как какой-то тест, экзамен вроде ЕГЭ. То, где мы выбираем ответ, ставим галочку. И можем либо ответить правильно, либо неправильно. Эти тесты не похожи на то, с чем вы столкнетесь в реальности. Мы в вебе даже шутим: «Есть два вида JavaScript - для собеседований и для работы».

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

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

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

Как пример. Я предполагаю (когда-то читал доку или по логике вещей догадываюсь), что в библиотеке React Router Dom есть какой-то способ взаимодействовать с параметрами поиска в строке состояния браузера. Я иду, открываю документацию и уже конкретно ознакамливаюсь с подробностями использования и применения данного функционала, заодно это попадает в мою память на определенное время.

Зачем держать в голове всё-всё, когда есть справочники, документации и заметки? Мы запоминаем только то, с чем мы чаще всего взаимодействуем. Если мне надо сделать какую-то навигацию по DOM дереву, а я уже 100 лет этого не делал, конечно же, я не вспомню всех методов навигации, я открою справочник, посмотрю и выберу нужные мне вещи, заодно и в памяти это освежится.

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

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

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

Поэтому, когда в описании позиции для разработчика с 3-6 годами опыта написано: «...для вас event loop и потеря контекста не должно быть пустым звуком, а конкретными терминами...», это для меня выглядит, как если бы в описании вакансии водителя говорилось: «Для вас педали газа и тормоза не должны быть пустым звуком, а конкретными частями автомобиля». Ну, тут еще, возможно, HR описание делал без консультации, такое встречается регулярно.

Конечно, нужен отдельный разговор про накручивание опыта работы и про то, что на интервью с опытом работы в 5 лет тебя спрашивают: «Что такое коллекция Set?». Да и в принципе никто не гарантирует, что человек с 3-6 годами реального опыта работы будет знать на этот опыт работы. Можно же не развиваться и не учиться, кто заставляет-то?

Так, а как надо-то тогда?

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

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

Вместо вопроса «Что такое event loop?», можно задать вопрос: «Как ты думаешь, зачем нам вообще нужен этот event loop? Без него никак вообще? Какие проблемы он решает?». Вы не будете слушать очередное до смерти зазубренное определение про очереди макротасок и микротасок и стек выполнения, а вы услышите, как видит это кандидат, понимает ли он концепцию event loop'а.

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

Вместо вопроса «Что такое http протокол?» - «Зачем нам нужен http протокол? Зачем там какие-то хедеры, зачем там какие-то еще методы http существуют? Для чего его вообще придумали?»

Вместо вопроса «Что такое связный список? Напиши мне реализацию связного списка» - «Использовал ли ты связный список? Зачем нам нужен связный список? Где его можно применить, в каких ситуациях?»

Принцип понятен. Разговариваем с кандидатом и слушаем, как он рассуждает и какие решения предлагает, какие выводы делает. Ясное дело, что кандидат с какими-то ситуациями мог и не сталкиваться и что-то не знает, невозможно всё постичь. Тут важнее понять ход мыслей человека: просто ли он зазубрил какие-то определения или осмыслил то, что использует.

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

Насчет алгоритмов тут отдельная история. Весь смысл же в том, чтобы посмотреть, как кандидат размышляет и как он пытается решить этот алгоритм, а не как быстро он его решит и каким у него выйдет так называемая Big O. Или я чего-то не догоняю, и все классные люди пишут легко любые алгоритмы, не используя никакую справочную информацию? По-моему, некоторые алгоритмы годами придумывались и улучшались, а не за 15-20 минут.

Также не понимаю, зачем спрашивать узконаправленные вещи и требовать их знание. На каком-то проекте N есть неосновная библиотека Х, и мало того, что требуют ее знание в вакансии, так еще и могут пару вопросов о ее использовании задать на собеседовании. Я понимаю еще спрашивать про основную используемую библиотеку или фреймворк (а-ля React, Angular, Vue и тд.), но требовать знание кучи библиотек с работой с глобальным состоянием, формами, запросами и т.д.? Я же не учу в свободное время все библиотеки подряд и могу просидеть на проекте с определенным набором инструментов долгое время, а потом начать искать другой проект с другим инструментарием. Получается, мне надо обязательно быть знакомым со всем, что использует искомый мной проект?

Логика должна быть в том, что я в первую очередь — инженер, который ознакомится и начнет использовать любой инструмент. Как я могу овладеть каким-то инструментом, не поработав с ним? Идти пилить пет-проект? Так некоторые требуют именно коммерческий опыт. А потом проходит время и никто уже не пользуется таким инструментарием, и твои знания устарели, иди новый пет-проект собирай. Так может важнее база и умение адаптироваться, а не погоня за бесконечно выходящими библиотеками?

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

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

Надо отметить, что из 10 кандидатов выберут того, кто знает больше остальных, тут уже ничего не поделать. Или нет? Смотря какие вопросы задавались кандидатам. Если вопросы по типу, что я описал выше - в виде экзамена-теста, то да, выбор будет сделан очевиднейшим образом. А если вопросы с рассуждением и логикой, то тут можно и посмотреть, действительно ли кандидат понимает, что он использует, или просто выучил синтаксис.

Так и к чему это всё?

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

Источник: https://habr.com/ru/articles/750250/


Интересные статьи

Интересные статьи

Любая организация, от госструктуры до стартапа, всегда имеет некоторый набор принципов и задач, которыми руководствуются менеджеры при принятии решений и распределении ресурсов. Иногда он формализован...
Я думаю, все, кто использует node.js, понимает про что эта картинка.npm - это ужасный менеджер пакетов. В этом признавался даже сам создатель node.js. Npm для каждого вашего проекта создает папку node...
Всем привет!Меня зовут Роман Сергеев, я  - менеджер по внедрению и развитию продуктов и систем в ИТ «Ренессанс страхование». В этом материале я расскажу о том, как п...
Разбираем тему простыми словами с практическими рекомендациями для специалистов и управленцев разного уровня. Комментируют эксперты «Актион Право» и «Актион 360». ...
Disclaimer. Костис Капелонис — Developer advocate (человек, защищающий и отстаивающий принципы программной разработки) Codefresh, первой платформы CI/CD для Kubernetes и контейнеров. Миссия Codef...