Сполски обновил свои рекоммендации: http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html
Все больше склоняюсь к тому, что он прав: "At the end of the interview, you must be prepared to make a sharp decision about the candidate. There are only two possible outcomes to this decision: Hire or No Hire. There is no other possible answer."
Окончательное решение о кандидате должно формироваться в течении собеседования. Откладывать нельзя. Такие рамки заставляют и проводящего собеседование более ответственно готовиться к разговору. Раньше я никода не обсуждал во время собеседования конкретные задачи, образцы кода. Последние собеседования, однако, были разбиты на две части: руководитель проекта разговаривает "за жизнь", а я потом один на один обсуждаю технические вопросы. Эффективность таких собеседований выросла очень сильно, и задавшись целью к концу разговора формировать свое "да" или "нет", а не "мы посоветуемся", я совершенно по-другому стал его проводить.
Неплохая подборка вопросов и ссылок: http://www.hanselman.com/blog/WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions.aspx
Поскольку наша специализация - .NET, то для того, чтобы сложилось впечатление, затрагивают следующие темы:
1. Типы, передаваемые по ссылке и по значению (reference/value types). Boxing/unboxing. Смежный вопрос - как эффективность хранения и доступа коллекций value-типов улучшена в .NET 2.0 (generics). Был случай, когда уже на этом вопросе мнение о кандидате (к сожалению) сформировалось.
2. Обработка исключительных состояний. Кстати, разницу между "throw" и "throw ex" не знает почти никто.
3. ADO.NET, доступ к базам данных. Если кандидат понимает, что использование DataSet при записи данных позволительно, лишь когда данные спускаются с уровня интерфейса пользователя, это уже хорошо.
4. Assembly version management, strong naming.
5. XML. Тривиальный вопрос-индикатор: вам нужно объекты классы сохранить как XML-файл. Самый простой код, который позволит вам это сделать. Про XmlSerializer знает не больше половины кандидатов. Незнание этого еще не означает "No Hire", но это тревожный симптом: программист с опытом работы с .NET должен обладать соответствующим кругозором.
6. Disposable objects. Почему конструкция "using (SqlConnection con = new SqlConnection(...)) {}" возможна, а "using (string str = new string(...)) {}" - нет?
7. Средства обмена данными между процессами в .NET.
8. Вопросы для определения опыта работы с .NET: пользовался ли кандидат reflection, remoting, cross-domain communication, globalization. Отрицательные ответы на эти вопросы общего впечатления не ухудшают, а вот положительные идут в копилку.
9. Автоматизированные тесты. "Печально я гляжу на наше поколенье". Практически никто ими серьезно не пользуется, хотя ответственность за это несут, конечно, руководители проектов. Один из кандидатов со статусом руководителя, т.е. определяющий выбор инструментальных средств, сказал, что на ручное тестирование времени уходит много, а вот с автоматизированным тестированием пока не познакомился - времени нет. Видимо, ручное тестирование все съедает.
10. Любимые книги по профессии, часто посещаемые программистские сайты.
Я, однако, по-прежнему не прибегаю к практике постановки алгоритмических задача, которые кандидат должен в моем присутствии решить, написав соответсвующий код. Умение сконцетрироваться и выдать код хорошего качества в присутствии наблюдающего - имхо, способность, далеко не обязательная для хорошего программиста. Видимо, средний уровень кандидатов, приходящих к Джоэлю Сполски или в Майкрософт, значительно выше, чем у приходящих к нам, поэтому они могут позволить себе отсечь хороших программистов, не справившихся с волнением во время разговора. Мы стараемся их не упустить - не так уж велик выбор.
- Собеседования с программистами
http://willprice.blogspot.com/2006/06/structured-interviewing.html
Изобретатель метода сравнения "каждый с каждым" перевернулся в гробу.
> я совершенно по-другому стал его проводить
Психологический какой-то момент, похоже...
> Типы, передаваемые по ссылке и по значению
> эффективность хранения и доступа коллекций value-типов
Вы какой-то экстремальный софт разрабатываете. У вас что десятки тысяч подлючений в секунду?
> Про XmlSerializer знает не больше половины кандидатов.
Про его существование я знаю ибо пользуюсь постоянно.
> Самый простой код, который позволит вам это сделать
Не напишу. Потому что я взял готовый пример с codeproject, он отлично работает. Я посмотрел что он более-менее оптимальный, не тормозящий, встроил его в проект, да и забыл про него.
И нафига, скажите, мне его знать на таком уровне типа "ночью разбуди - должен помнить"?!
Чтобы в случае если он понадобится в другом месте я смог его легко вспомнить? И ускорить разработку на пять минут?
> reflection, remoting, cross-domain communication, globalization.
reflection - аналогично XmlSerializer, поставил и забыл.
globalization щаз буду использовать. Но опять же возьму готовый пример с другой страницы.
Незнание remoting - это вообще смишно. Чего там знать? За день можно освоить. А если человек им на предыдущей работе не пользовался дык всё, неуч?
И вообще, я так понимаю что если придёт человек с сертификатом MCSD, то вы ему вообще никакие вопросы задавать не будете, возьмёте автоматом?
Нет, конечно. Проведем такой разговор. А если вы работаете с .NET и НЕ СЛЫШАЛИ о сериализации XML, то это в минус. Должна быть любознательность у разработчика. Необязательно опыт - любознательность.
Мне такой вариант (с кодированием на предварительном этапе) кажется довольно разумным.
Последний раз оно было с тестированием (алгоритмические задачи) -- и интересовали их странное:
Их очень интересовало в каких случаях
при
float x,y,a,b,c;
x=a+b+c; y=c+b+a;
будет x!=y.
Но при этом совершенно игнорировали race coditions (
сравнение с неиницаиализироваными переменными) --- это мол неважно.
Странные люди.
Одного аж 2 раза приглашали - не могли поверить после прочтения резюме что он не может даже изобразить 10 компилируемых строчек. Второй раз - такой же результат
мое личное мнение
2. Любой идиот работающий программистом может очень легко прикинуться хорошим специалистом и отличить очень сложно. Например, вопросы типа вышеперечисленных отсеют только крайних идиотов и хороших специалистов, которые захотели попробовать себя в новой области.
3. Соответственно лично я полагаюсь только на references и прошлые проекты - способен ли человек вменяемо объяснить что он там делал и какие проблемы были и как он с ними справлялся и кто его знает в этом мире.
4. Самые надежные способы: (1)нанимать контракторов, плохих быстро увольнять, а хороших переманивать на постоянную работу, (2) возиться со студентами.
И еще одно, если нанимающая организация серьезно га-га-га на тему инструментов (Java, .Net, Oracle, C++, Unix, Win32, MFS, ...) которые они используют, это выглядит очень подозрительным. Может быть они не слишком понимают чем занимаются, поскольку инструменты приходят и уходят, а программисты остаются, и хороший специалист начинающий свое знакомство с каким-либо инструментом все равно покажет 5Х результат по сравнению со средним знатоком интсрументария, а через год-два выйдет на нормальные 10Х.
Re: мое личное мнение
Почти согласен, но ведь и взять человека, не посмотрев как он пишет, тоже нельзя – вы же его код писать берете, а не знания проявлять. Очень хороший вариант – давать большое задание по email на сутки примерно, мой опыт hiring manager говорит, что так узнаешь на порядок больше, чем из любых разговоров. А мой опыт человека, только что искавшего работу говорит, что в Silicon Valley эта практика приобрела весьма широкое распространение.
А в качестве бантика, сценка из моего последнего интервью:
Самое смешное, что я с какого-то перепугу его действительно написал...
Снимаю шляпу!!!
Простите, очень уж напомнило:
Just for fun, here is the worst interview question on Earth: “What’s the difference between varchar and varchar2 in Oracle 8i?” This is a terrible question. There is no possible, imaginable correlation between people that know that particular piece of trivia and people that you want to hire. Who cares what the difference is? You can find out online in about fifteen seconds!