понедельник, ноября 12, 2007

Интервью при приеме на работу: взгляд интервьювера

Дарк разразился постом о типичных вопросах на собеседовании по PHP в NIX Solutions Ltd - линк

В гугл ридер ленте проскочил пост о методе приема на работу одного строгого товарища - линк

Решил я и своим опытом поделиться.

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

На ход собеседования сильно повлияла статья из книги Джоела Спольски, которая была любезно предоставлена Ромой.

Перед собеседованием с человеком общается HR и "продает" ему компанию, рассказывает какие мы крутые и как у нас классно.

Собеседование со мной состоит из 4 частей: рассказ человека о себе, вопросы по теории (ООП), вопросы по технологиям Java, практическое задание, вопросы от претендента ко мне.

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

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

Потом переходим к собственно программированию: ООП, Core Java, JDBC/SQL, Web

ООП

Двигаемся к ООП из утверждения о том, что Java является объектно-ориентированным языком. Многих ставит в тупик вопрос о том, а зачем собственно нужно ООП, если за 50 лет программирования люди обходились прекрасно зарекомендовавшим себя процедурным подходом. Тут обнаруживаем зачатки светлой головы и с помошью подсказок и аналогий ищем ответ, который я хочу услышать :)
Если же ответил быстро прошу пояснить понятие полиморфизма и переходим к Core Java.

Core Java

- коллекции. Какие типы есть, чем отличаются List от Set от Map. Чаще всего подвожу к вопросу о сравнении объектов и выясняем, что человек знает об equals, hashCode и ==.
- исключения. Мой любимый вопрос, зачем нужны исключения, как механизм. Какие причины были у авторов языка вводить такой инструмент. Обсуждаем иерархию исключений, выясняем отличия между RuntimeExceptions и всеми остальными. Говорим о блоке finally{}
- потоки. Что такое, как работает. Разница между Thread и Runnable. Как присходит синхронизация потоков, какие проблемы там могут вылезти? Как их решать?
- XML. Принципы работы с XML в Java, основные преимущества/недостатки данного подхода для хранения данных, передачи сообщений.

JDBC/SQL

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

Web

- JSP/Servlets. Что между ними общего? Какие методы нужно переопределять в HttpServlet для добавления собственной функциональности? Чем отличается doGet от doPost , сигнатуры ведь одинаковые? Какие переменные доступны пользователю на JSP странице без их объявления (request, response, out, exception)? Разница между jsp:redirect и jsp:forward. Какие уровни хранения информации есть в вебном приложении (request, session, application)?
- Struts. Вспоминаем о том, что это MVC framework, и очень мне интересно, какие классы в этом framework отвечают за Model, Controller и View. Обсуждаем ответ и спорим по поводу решения интервьюируемого.
- JSF. Обсуждаем принципы, валидацию введенных пользователем данных. Жизненный цикл запроса.
- HTML/CSS/JavaScript. Обсуждаем уровень знакомства с данными вещами, в дебри не лезем.
- Web services. Что такое, как работает, когда может применяться.

Практическое задание

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

Задание должно быть такое, чтоб его легко можно было разбить на подзадачи и сделать за 10-15 минут на листике бумаги без отладки.

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

Потом по настроению могу спросить задачку на размышление: сколько автозаправок в городе Харькове (нагло содрал у Спольски). Суть вопроса не в том, чтоб получить точный ответ, а понять какой способ решения выберет человек. Можно обсудить предоставленное решение на предмет времени получения конкретной цифры и т.п.

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

Давно хочу добавить в собеседование этап, когда человек садится за комп и за час-полтора делает более сложное задание. Это позволяет посмотреть, как он умеет пользоваться ИДЕ, как ищет нужную инфу, чем пользуется, какого code convention придерживается. Но это только для senior developer вакансии имеет смысл делать.

В общем ничего страшного на собеседованиях не случается, приходите, пообщаемся :)

вторник, ноября 06, 2007

Купили забаву

Созрели таки до покупки стиральной машинки. Взяли Bosch WLF 20260 в МКС, сегодня установили, теперь сидим в ванной на полу смотрим в иллюминатор...