среда, мая 02, 2007

Собеседование. Вопросы на засыпку.

Техническое интервью (собеседование) при приеме на работу - эта тема интересная всегда и всем. Мне повезло, я могу рассматривать ее с обеих сторон, и как интервьюируемый (при приеме на последнюю работу меня «интервьючили» четыре раза), и как интервьюер. За последние полтора года - пришлось провести около 40 интервью, в основном на позиции .Net developer различной степени крутости (младший, старший, ведущий). Пришлось даже составить специальный вопросник, ну и само собой накопилась определенная статистика. Сегодня перед вами своеобразный хит-парад элементарных вопросов по .Net, которые вызывают наибольшее затруднение у кандидатов:
10. «Какие типы можно использовать в предложении foreach?» - трудности с ответом на этот вопрос были примерно у 20% кандидатов.
9. «В чем различие между классом и структурой?» - из вариантов ответов на этот вопрос можно было бы составить подборку наподобие «цитаты из сочинений пятиклассников».
8. «Что означает модификатор virtual?». Если после стандартного ответа «член класса, помеченный virtual, будет объявлен виртуальным» попросить более развернутый ответ, это повергает в ступор каждого четвертого.
7. «Чем отличается event от delegate?» - о том, что «delegate – это класс, а event – это член класса с типом delegate» не казал вообще никто. Однако большинство сумели объяснить суть различия, что называется на пальцах.
6. «Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Каким образом?» - простой вопрос на explicit interface implementations вызвал сложности примерно у каждого четвертого.
5. «Что такое GAC?» - особые сложности с этим у ASP.NET-чиков.
4. «В чем разница инкапсуляции и сокрытия?» - вопрос из разряда «теоретических» вызывает сложности почти у всех.
3. «Что такое частные и общие сборки?» - с некоторых пор я боюсь задавать этот вопрос. Правильно ответить на него смогли не более 30% кандидатов.
2. «Что такое .Net Framework?» - это настоящий вопрос на засыпку, кто бы мог подумать? О том, что это CLR + class library сказали единицы.
1. «Чем managed code отличается от unmanaged code?» - ответ на этот вопрос в книжках по .Net занимает целую главу. Это обстоятельство делает вопрос очень интересным для оценки глубины знаний. Около половины кандидатов не смогли припомнить более одного отличия.

41 комментарий:

Анонимный комментирует...

Я думаю третий вопрос будет менее страшным если вы не будете перводить термины ;).

Sergey Rozovik комментирует...

> Я думаю третий вопрос будет менее страшным если вы не будете перводить термины ;)

Конечно. На интервью я стараюсь термины всегда дублировать по английски и по русски, если есть устоявшееся соответствие. Но мне кажется это вряд ли поможет если спросить про shared и private assembly. Не знаю почему, но люди готовы рассказывать про dynamic и static assembly. А про частные и общие - никак :)

Iv комментирует...

а эти вопросы какого уровня сложности, так понимаю, что средние. можно вопросы для "крутых" дот.нетчиков?

Peter Nikouline комментирует...

"Чем managed code отличается от unmanaged code?
Около половины кандидатов не смогли припомнить более одного отличия."
Управляемый код ранится под управлением CLR(на то он и называется управляемым).
Это означает, что CLR заботится об управлении памятью, о совместимости между платформами, о безопастности кода и так далее.
Это хорошо описано у Рихтера или у
Даффи.
Перечисленные вопросы, в основном, не выявляют практические знания,
требующиеся для программиста в ежедневной работе.

Peter Nikouline комментирует...

"можно вопросы для крутых дот.нетчиков?"
Сколько угодно.
Опишите "кухню"(внутреннюю логику) основных паттернов, реализующих слабую связанность между классами.
Конечно с примерами, скажем, на C#. Данная тема потянет на несколько статей.

Sergey Rozovik комментирует...

to iv
Нет все свои вопросы я публиковать здесь конечно не стану :)

to niksoft.
>"Чем managed code отличается от unmanaged code?
Около половины кандидатов не смогли припомнить более одного отличия."

Вы упомянули целых три. Это хороший результат :).
Не согласен с тем, что этот вопрос бесполезен. Вы, например, упомянули о безопасности. Можно попросить конкретнее остановиться на этом вопросе - тут уже сразу станет видно только ли книжки человек читал, или опыт практический имеет.

>Опишите "кухню"(внутреннюю логику) основных паттернов, реализующих слабую связанность между классами.

Нет, таких вопросов в моем арсенале, по счастью, нет :)

Анонимный комментирует...

Да бред эти вопросы, чушь...
Просто прочитав Троелсона любой чайник спокойно ответит на эту чушь...
Разница между managed и unmanaged?
А что вы мне ответите, если я спрошу что значит managed code в среде non-Windows (неа не угадали Mono и dotGNU здесь не причем)???

Повыдирали терминов, которые направлены на то чтобы мозги покрутить.
В чем различие между классом и структурой?
И что мне отвечать? Как внутри CLR представлены структуры и классы, Разница есть в их поведении, типа передача по значению, незя там типа конструктор по умолчанию переопределить и унаследованы типа ValueType и т.п.
Структурные типы есть и в плюсах...
Тоже какая разнница? А вы не пробовали сравнивать метр квадратный с метром кубическим???
Как результат? гы-гы...

Мне про паттерны вопрос намного больше понравился, я бы слету стопудово не сказал бы, так назвал бы парочку...
Хотя если честно это заботы архитектора...
Но книга по паттернам у меня со стола не слазит так лежит как справочник... просвещаюсь!

__max

Sergey Rozovik комментирует...

to анонимный
> Да бред эти вопросы, чушь...

Боитесь собеседований :)) Не надо бояться. Вопросы то не сложные. И попали они в хит-парад не по моей прихоти, а потому что люди на них сыпятся. Паттерны изучать тоже надо, но и об основах забывать не стоит. Как то пришлось разбираться с крахом приложения на .Net. Код был написан с использованием паттернов, но программист не очень понимал разницу между ValueType и ReferenceType.

Анонимный комментирует...

Если не секрет сколько вы платите дотнетчику и где находится (регион) ваша контора?

Дело же не в том что такое ValueType и ReferenceType. Это же уровень студента.

А что если придется программить на языке где нету ValueType аналога?
Одни ссылки на объекты?
MS хоть и M$ но там много умных людей. Козикер не зря сказал инструменты сакс, главное алгоритмы.
Понимать концепцию надо! Если человек не понимает суть, значит он студент... совковый студент... с ограниченными потребностями в профессиональном росте...
Но ведь не так об этом спрашивать надо!

P.S. Собеседования не боюсь.
Не решаюсь переезжать пока.
Но если соберусь то буду искать должность senior developer как минимум.

Крах это типа crash???
А то я тут подумал, что крах проекта...
Намного больше ошибок в коде из-за того, что в шею гонят, вы PM'ов тоже об озах менеджмента спрашиваете?

Недавно перешел на контору у которой свой собственный продукт, для внутреннего применения (Sale System).
Говорю система г@вн@, а главному пофиг. Уже всё ай-ти согласилось со мной (разложил по полкам и с примерами), а ему пофиг.
Сопровождать ее становится все сложнее, да и не охота дерьмовый код новыми стероидами накачивать!
И дырок немеряно...

Так о каком ValueType речь? Не это главное... хотя может у вас с зп хреново... тогда другое дело...

Анонимный комментирует...

вам, упорно попадались спецы не читающие первые главы книг про .NET

Unknown комментирует...

Интересно, существуют ли какие либо тесты для оценки знаний и способности разаработки на C#, т.к. работаю в данной сфере полтора года, а на некоторые вопросы затруднился ответить.
В ближайшем будущем планировал устроиться на новую работу, с прочтением данной статьи, задумался об удачном собеседованием.

Sergey Rozovik комментирует...

to MaxxaM
На Braibench есть бесплатный тест по C#. Но вопросы там не в пример сложнее приведенных здесь. Здесь перечислены простые вопросы, которые, как ни странно, часто вызывают затруднения.

Анонимный комментирует...

Зачем вообще задавать такие вопросы? Вообще-то лучше получить специалиста, который сможет разобраться в любых технических тонкостях при необходимости, зато с ясным мышлением, умением понять поставленную перед ним задачу и построить эффективный алгоритм, чем зубрилу, который знает, чем один встроенный в технологию X.00.151.2007 метод отличается от другоги.

Анонимный комментирует...

«Чем отличается event от delegate?» - о том, что «delegate – это класс, а event – это член класса с типом delegate» не казал вообще никто.

Так может никто не сказал по-тому, что delegatом называют и класс и объект. А фактически делегат и событие это почти одно и тоже. Или я не прав?

Sergey Rozovik комментирует...

> А фактически делегат и событие это почти одно и тоже.
В том то и дело, что "почти". Помимо сказанного есть еще одно не большое, но важное отличие. Для события гораздо строже контроль доступа. Исполнить делегат, назначенный событию можно только из кода внутри класса. Это очень важно.

Хэлкар комментирует...

Обрадовало, что смог ответить на все вопросы - однако на интервью мог бы и не ответить - там всегда нервничаешь и иногда не отвечаешь на простейшие вопросы.

Валерий Макаров комментирует...

И много народу, из тех, кто успешно прошел собеседование у Вас, до сих пор работают в вашей компании?

Sergey Rozovik комментирует...

Из тех, что я собеседовал, большинство продолжает работать. Навскидку вспомнил двоих, которые уволились.

Unknown комментирует...

Посмотрел МСДН и удивился почему у 80% собеседуемых не возникли трудности с 10м вопросом.

In C#, it is not absolutely necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach. As long as the class has the required GetEnumerator, MoveNext, Reset, and Current()()() members, it will work with foreach.

а ведь еще массивы (всключая многомерные) нада вспомнить и может еще что-то...

Неужели большинство сходу правильно отвечает?

Sergey Rozovik комментирует...

to Vuder
>почему у 80% собеседуемых не возникли трудности с 10м вопросом.

Большинство правильно отвечает что нужен IEnumerable или IEnumerator. Почему они нужны и как компилятор обрабатывает foreach - об этом никто не спрашивает. Но каждый пятый вообще никогда не задумывался о том почему с одними типами foreach можно применять, а с другими нет.

Анонимный комментирует...

Привет Сергей! Сейчас хожу на собеседования и могу подтвердить, что такие вопросы задают во многих местах. Из своего опыта добавлю следующие вопросы
1 Чем абстрактный класс отличается от интерфейса?
2 Отличия контрола от компонента
3 Что такое IDispose и как его использовать?

Анонимный комментирует...

Про 7. «Чем отличается event от delegate?» В Журнале "Алгоритм" 4 за 2005 есть интервью с Андерс Хейльсберг. Так вот Дерек Фергюсон спрашивает
нужны и события и делегаты. Честно говоря,
ответить не смог. Не могли бы вы объяснить это?
АХ: Это всё равно, что спрашивать - зачем нам нужны
классы и поля? Это просто разные вещи. Делегаты – это
типы, а события – это члены класса, так что они нам
нужны оба. Связка здесь проста – событие имеет тип
делегата, но в то же время инкапсулирует какой-то его
экземпляр.
Думать о событиях можно как о свойствах, имеющих
тип делегата. И вот мы добавили некоторые
синтаксические элементы в C#, так что теперь, вместо
непосредственного добавления/удаления методов для
реакции на события, мы просим вас использовать
операции -= и +=. Кроме этого нюанса, события – всё
равно, что свойства с типом делегата.

Анонимный комментирует...

Журнал с интервью можно скачать здесь
http://www.sql.ru/articles/mssql/2005/alg4sc.zip

Анонимный комментирует...

Полностью согласен с
вышеприведенным комментарием

"Зачем вообще задавать такие вопросы? Вообще-то лучше получить специалиста, который сможет разобраться в любых технических тонкостях при необходимости, зато с ясным мышлением, умением понять поставленную перед ним задачу и построить эффективный алгоритм, чем зубрилу, который знает, чем один встроенный в технологию X.00.151.2007 метод отличается от другого"

Вопросы, которые были здесь приведены, демонстрируют лишь уровень (не очень высокий) самого проводящего собеседование.

Sergey Rozovik комментирует...

> "Зачем вообще задавать такие вопросы? Вообще-то лучше получить специалиста, который сможет разобраться в любых технических тонкостях при необходимости, зато с ясным мышлением"

У меня очень большие сомнения в ясности мышления специалиста, который не знает что такое "virtual", и «Чем managed code отличается от unmanaged code?». Это просто must know и все. И не надо растопыривать пальцы по этму поводу, не серьезно.

Анонимный комментирует...

Я думаю, это вопросы на уровень Junior-developer.

Dmytro Krasun комментирует...

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

Анонимный комментирует...

о том, что «delegate – это класс, а event – это член класса с типом delegate» не казал вообще никто

возможно, потому, что event - это не "член типа delegate", а ключевое слово, модифицирующее поведение членов типа delegate?

В чем разница инкапсуляции и сокрытия?

чё? :)

Анонимный комментирует...

Спасибо за список вопросы!
Однако делегат - это все же "подпись метода" но не "класс", по определению...

Sergey Rozovik комментирует...

>Однако делегат - это все же "подпись метода" но не "класс",

Все сущее - есть класс. Во всяком случае на C#.

Андрей комментирует...

У Вассермана спросите — он знает, он ответит. Ещё кстати есть анекдот «Вам ехать или шашечки?».

Анонимный комментирует...

Спасибо за вопросы. Именно с таких и стоит начинать собеседование, чтоб определить уровень знаний человека, и стоит ли усиливать вопросы.

К примеру, когда я начинал изучать .net и толком даже не понимал c#, сходил на собеседования и после вопроса

"Что такое деструктор?"

я будучи начитанным про CLR, ответил что "А деструкторов нету, да и конструкторов тоже" :)))

Собеседование на этом закончилось. Смешно вспомнить :)

Анонимный комментирует...

Чем отличается event от delegate, а чем отличается метод от свойства, можно еще десяток глупых вопросов придумать, которые введут в ступор любого. Я бы на столь глупый вопрос ответил - буквы в названии разные. Если вопрос был на основы использования делегатов, ну так и надо было его сформулировать соответствующие.
Что такое GAC, что на этот вопрос нужно ответить? Глобальный кэш сборок или что, или нужно вдаваться в принципы работы CLR?
Инкапсуляция есть работа с объектами класса через некую обертку в виде свойства/метода, а сокрытие в понимании большинства net'чиков ассоциируется с областью видимости. Не мудрено, что все задумались над вопросом, не понимая как сравнить теплое с мягким.
Что такое частные и общие сборки, как думаете, сколькие из неответивших, реально не понимали различия?
Что такое .Net Framework, ну первое что мне в голову пришло - продукт компании Microsoft, правда я блондинко?!

Собственно я бы почти на все вопросы не смог ответить словами букваря, соответственно засыпался бы. Хотя C# использую больше 4 лет и имею не мало успешных реализаций.

Анонимный комментирует...

Вопросы очень глупые. Автор комплексует, и старается втоптать в какашки собеседуемых. Лечить такое нужно.

Victor M. комментирует...

«delegate – это класс, а event – это член класса с типом delegate»
ООО! Да вы сами то с теорией не дружите.
Event - это не совсем поле делегатного типа.
Например, при расширенном описании события (get/set) программист сам может задать объект делегатного типа, который будет содержать список вызовов нашего события.

Sergey Rozovik комментирует...

Во-первых, меня радует что по прошествии двух лет после публикации, пост продолжает вызыват интерес.
Во-вторых, я с теорией действительно не дружу. Я ее проверяю практикой и стандартами. Открываем "C# specifications" и читаем:

1.6.7.4 Events
An event is a member that enables a class or object to provide notifications. An event is declared like a field except that the declaration includes an event keyword and the type must be a delegate type.

А еще, Victor M. вам стоит над профессиональной лексикой поработать. "Объект делегатного типа" это не комильфо.

Victor M. комментирует...

///An event is a member that enables a class or object to provide notifications. An event is declared like a field except that the declaration includes an event keyword and the type must be a delegate type.///
Так эта цитата еще раз подтверждает некорректность вашего ответа.
An event is declared like a field. Но событие не в коем случае не является полем-объектом делегата, как вы сказали.

//"Объект делегатного типа" это не комильфо.//
Делегатный тип(delegate type) = функциональный тип = делегат - все это очень даже комильфо.
"Делегатный тип" я встречал в отечественных учебниках по C#

Sergey Rozovik комментирует...

Victor, я никогда не говорил что "событие является полем-объектом делегата". Я говорил "event – это член класса с типом delegate".
Разницу между "член класса" и "поле" улавливаете?

Кстати, ваш ответ был бы зачтен. Можно ошибаться в деталях, но понимать суть отношения двух понятий delegate и event.

Анонимный комментирует...

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

Анонимный комментирует...

Если я не ошибаюсь, то event - это особый вид delegate. А delegate - сторого типизированный указатель на функцию...

Анонимный комментирует...

«Чем отличается event от delegate?» - о том, что «delegate – это класс, а event – это член класса с типом delegate
Простите меня, но это полный бред. Вы не понимаете того, что такое event и чем он отличается от delegate. Но это и понятно, потому что это практически нигде не объясняется... :-( Всюду говорят что this is very confusing и тупо перечисляют 4-5 отличий... Для того чтобы реально понять различия надо вопрос поставить немного по другому, а именно "Почему Microsoft ввел в употребление 2 этих декларации? Почему невозможно было обойтись одной?" И если вы ответите на этот вопрос, то вам реально станет понятно различие. :-)