Мой подход такой:
- Прошу рассказать об опыте (сколько всего, сколько на конкретных технологиях, знает ли кандидат другие языки, в качестве кого участвовал в проектах, есть ли собственные проекты, участвует ли в open source и т.д.). Появляется первое представление о человеке, общий контекст. Можно понять, насколько человек открыт, насколько точно и емко излагает мысли, и много чего еще.
- Задаю пару вопросов о сути технологий, которые будут использоваться в проекте. Смысл данного вопроса не в том, чтобы проверить, хорошо ли кандидат зубрил учебник, а в том, чтобы понять, насколько он вообще понимает, с чем работает, насколько глубоко и масштабно мыслит, умеет ли описать своими словами то, что понимает.
- Даю небольшую не техническую задачу, а-ля "даны вот такие-то требования, такие-то вводные данные, расскажите, какие возникают вопросы к такой постановке задачи". Это одновременно позволяет понять, насколько кандидат задумывается о том, что делает, делает ли он выводы из прошлого опыта и хорошо ли использует эти выводы при решении стандартных задач. Также вопрос является для многих небольшим стресс-тестом, т.к., судя по реакции, он достаточно нестандартный и многих поначалу ставит в тупик. Это хороший способ понаблюдать, как кандидат справляется с нестандартными ситуациями, насколько широко мыслит вообще в целом (а не в рамках профессии).
- Снова возвращаюсь к техническим вопросам. Спрашиваю, пользуется ли кандидат современными технологиями в своей области, прошу порассуждать, какие преимущества у этих технологий, какие плюсы и (возможно) минусы.
- Предлагаю "математическую" задачу. В кавычках, т.к. фактически решать ее не обязательно. Сама задача достаточно простая, но конкретную формулу большинство людей вряд ли помнит (хотя она проходится в школе, если мне не изменяет память), т.к. используется она в очень редких случаях. Здесь я ожидаю, что кандидат догадается поискать формулу в интернете и не будет, например, предлагать подключить стороннюю библиотеку для решения этой тривиальной задачи.
- Наконец, даю небольшую (если не сказать крохотную) практическую задачу. Но, так сказать, "со звездочкой". Предлагается код, который надо определенным образом доработать, добавив новые возможности, чтобы при этом сохранилась совместимость (предполагается, что код уже где-то используется). Кандидату дается полная свобода выбора: можно написать отдельный новый фрагмент кода, который вообще не будет затрагивать имеющийся код, либо как-то изменить имеющийся фрагмент. Здесь нет правильного выбора, мне важно услышать рассуждения - чем вызвано то или иное решение. Также в коде намеренно скрыта ошибка. Предполагается, что кандидат должен ее заметить.
Моей целью в первую очередь является понять, как кандидат мыслит и рассуждает. Замечу, однако, что важно учитывать конкретную ситуацию. Мой вариант не является универсальным, т.к. рассчитан на достаточно квалифицированного и опытного специалиста (senior). Для начинающего (junior), полагаю, нужен другой формат, с большим уклоном в сторону конкретных технических вопросов и с меньшим количеством "рассуждений".