|
Волею судеб, мне приходится набирать 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»
Источник |