Волею судеб, мне приходится набирать web-программистов уже несколько лет. Прошерстив сотни резюме, проведя десятки собеседований, хочу поделиться текущей структурой интервью.
А ты записался добровольцем прошел собеседование?
Интервью состоит из трех частей, занимает 30-60 минут.
1. Рассказ программиста о себе.
2. Короткие вопросы на кругозор.
3. Решение задач
Рассказ программиста о себе.
В первую очередь прошу человек рассказать, как пришел к web-программированию. Когда начал, когда подсел на программирование :)
Очень спрашиваю про последнее место-два работы, что человек делал, за что отвечал, что в техническом и организационном плане там делал.
Нужно, чтобы человек расслабился.
Когда-то на этом этапе спрашивал про пять вариантов, почему люки круглые и прочие вопросы, но это давно отмерло, потому что не дает ничего :)
Как только становится понятно, что движет человеком и какой у него опыт, переходим к технической части.
Короткие вопросы на кругозор.
Web-программирование — это зоопарк технологий, вспоминается анекдот про требования к водителям, если бы они были такие же мощные, как и программисты :)
За 10-15 минут нужно понять, а как глубоко человек владеет той или иной технологией, понять уровень его понимания.
Опрашиваю по следующим сферам: СУБД, SQL, алгоритмы, структуры данных, языки, командная строка, ООП, *nix.
Опыт и понимание делю на три уровня — elementary, OK, advanced :)
Прежде всего, базы данных. Есть среди вопросов первого типа есть «чем right join отличается от JOIN?», а третьего — «что такое B+-tree и почему они так часто применяются в реализации индексов?».
Очень интересно про ООП. Если вопрос «что такое инкапсуляция, полиморфизм, наследование» это второй уровень, то объяснить, что это такое на деле, зачем нужно, какие метрики архитектуры ухудшает/улучшает рефакторинг с упором на SOLID + DRY + IoC, могут единицы (или не путают рефакторинг с оптимизацией производительности).
Как правило, на вопрос ответ идет одним-двумя предложениями. Иногда можем побеседовать отвлеченно, если знающий кандидат, вспомнит, к примеру, самобалансирующиеся красно-черные деревья. Отлично, если он отметит, что регулярно читает Хабр и видел статью об этом там.
Конечно, я спрошу про Линукс и обрадуюсь, если человек сидит хотя бы под Ubuntu. Спрошу на деле, как вывести список файлов с «test» в имени с grep (ls | grep «test»), или что такое ls | xargs svn up.
«Но и это еще не все» (С) TV-SHOP 90х
Решение задач
Но как бы красивой не была теория, это все только разогрев перед самой главной частью.
Стараюсь за полчаса поговорить с кандидатом, чтобы он понял, что перед ним не HR-девочка, понять его мотивацию, проговорить моменты по графику и его пожелания по ЗП.
И даю задачи. Я согласен со статьей, которую тут переводили как-то, что настоящий программист определяется умением применять рекурсию и указатели.
Во многом, это сродни эволюции человека. Говорят, что нас отличает от обезьян умение оперировать в уме сразу 7+-2 элементами, и понимание рекурсии (нужно для заточки зубил, узор, рекурсивно уменьшаясь, позволяет сделать лезвие очень острым и хорошо режущим).
Так и умение в уме представлять, что такое арифметика указателей, и понять работу рекурсии выделяет программистов среди простых людей.
Как правило, даю простую задачу и прошу писать код прямо онлайн, безо всяких проверок. В последнее время даю 10-15 минут без меня, если человек переволновался.
И за одну-две задачи становится понятно, каков итог собеседования.
Вопросы про люки — нафиг. Да здравствует рекурсия!
upd. задача с устного собеседования и допзадача на дом.
Задача 1
Дан массив неограниченной вложенности, нужно написать функцию, которая выведет его в виде вложенного списка с отступами, пропорциональными глубине, и текущем путем к элементу.
Вызов showMenu(menu);
должен выдавать HTML-код, как по адресу
Массив:
menu = [ 'simple item', [ 'title' => 'Complex item', 'items' => [ 'simple item2', 'simple item3', [ 'title' => 'Another complex item', 'items' => [ '...' ] ] ] ] ];
Задача 2
Сделать, чтобы для строки
"{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}." выдавались все возможные варианты (вложенность не ограничена)
например
для str="{A | B | C} тест"
три варианта
«А тест»
«Б тест»
«С тест»
для str = "{A | B} {A | B}" четыре варианта
«A A»
«B B»
«A B»
«B A»
Автор: Cord