Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

Собеседование

У нас с Сергеем Чистовичем сейчас проходит примерно по 1—2 собеседования в день. Для оптимизации (чтобы быстрее понять что знает кандидат, а что нет), приходится придумывать вопросы с подвохом.

Например (это Python), что будет тут — True или False и почему:
u'ВАС' == 'ВАС'
str('') == str('')
object() == object()
Добавлено через несколько часов: ребята из комментариев, вы что правда считаете этот элементарнейший тест «тонкостями» и «хитростями» языка? То есть вы в коде никогда не сравниваете два объекта? Два числа, например, да что числа, просто любые два объекта?

А такие вещи как разное поведение наследования у «классических» и «новых» классов, наверное, вообще у вас считается заумью?
27 июля 2010 14:40

www.google.com/accounts/o8/id?id=AItOawlshtQ45olmYVRhHMAzYLaq7Zn0SkQC78o (www.google.com/accounts/o8/id?id=AItOawlshtQ45olmYVRhHMAzYLaq7Zn0SkQC78o)
27 июля 2010, 16:47

И какие знания помогает определить этот вопрос?

Splurov (инкогнито)
27 июля 2010, 16:48

(какой ужасный урл, жж-ый openid что-то не хочет работать)

mphome.myopenid.net (инкогнито)
27 июля 2010, 17:00

Это вопросы не для того что бы взять, а для того что бы отсеять. :)

Vladimir Moskva (fulc.ru)
27 июля 2010, 17:12

Первый с подвохом =)

bolk (bolknote.ru)
27 июля 2010, 18:57, ответ предназначен Splurov

И какие знания помогает определить этот вопрос?
Массу. Попробуйте без интерпретатора ответить на эти вопросы, потом объяснить почему так, потом внести в интерпретатор и посмотреть, сойдётся ли.

bolk (bolknote.ru)
27 июля 2010, 18:58, ответ предназначен Vladimir Moskva (fulc.ru):

Первый с подвохом =)
Точно :)

Splurov (инкогнито)
27 июля 2010, 19:23, ответ предназначен bolk (bolknote.ru):

Я к тому, что знание этих тонкостей в реальной работе могло никогда и не встретиться, поэтому не может сказать ничего о знаниях кандидата.

sergey-cheban.livejournel.com (инкогнито)
27 июля 2010, 19:35, ответ предназначен bolk (bolknote.ru):

Мы всем кандидатам ещё до собеседования письмом отправляем два вопроса с подвохом (C++):
1.
char *a = new char[n];
char *b = new char[n];
f(a,b,n);
delete [] b;
delete [] a;

2.
if( argc > 1 )
  printf( argv[1] )

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

Тем, кто приходит на собеседование, мы предлагаем для решения несколько не слишком сложных ситуаций, просим написать код и смотрим, можем ли мы допустить кандидата к разработке. Т.е. способен ли он в принципе писать код, который потом не придётся переписывать кому-нибудь другому.

bolk (bolknote.ru)
27 июля 2010, 19:52, ответ предназначен Splurov

Я к тому, что знание этих тонкостей в реальной работе могло никогда и не встретиться, поэтому не может сказать ничего о знаниях кандидата.
«Тонкости»? Это по-вашему, тонкости? :) Это базовые знания — сравнение двух объектов.

Igor Davydenko (djangonaut.blogspot.com)
27 июля 2010, 19:52

Первый False, так как юникодная строка != обычной строке, если в ней находятся не ASCII символы
Второй True, пустая строка == пустой строке
Третий False, так как идентификатор первого объекта != идентификатору второго объекта

bolk (bolknote.ru)
27 июля 2010, 19:52, ответ предназначен sergey-cheban.livejournel.com

Мы всем кандидатам ещё до собеседования письмом отправляем два вопроса с подвохом (C++)
Не могу оценить, так как не знаю C++

bolk (bolknote.ru)
27 июля 2010, 19:54, ответ предназначен Igor Davydenko (djangonaut.blogspot.com):

Первый False, так как юникодная строка != обычной строке, если в ней находятся не ASCII символы
А кто сказал, что в ней находятся не ASCII символы?
Третий False, так как идентификатор первого объекта != идентификатору второго объекта
Дальше следует вопрос почему две одинаковых строки — True, а два пустых экземпляра одного класса object — False?

bolk (bolknote.ru)
27 июля 2010, 20:02, ответ предназначен sergey-cheban.livejournel.com

Впрочем, ответ на второй вопрос я знаю.

indeec17 (инкогнито)
27 июля 2010, 20:10, ответ предназначен bolk (bolknote.ru):

False скорее всего потому, что сравнивать больше нечего, кроме указателей.

troll (инкогнито)
27 июля 2010, 20:22

1. False - два разных типа (unicode и str)
2. True - две одинаковых строки (это даже один и тот же объект, т.к. короткие строки кэшируются)
3. False - возвращается по умолчанию при сравнении, если не переопредел спец. метод __eq__
правильно?

Splurov (инкогнито)
27 июля 2010, 20:30, ответ предназначен bolk (bolknote.ru):

Это по-вашему, тонкости? :)
Да. 2 и 3 из области того, что можно знать из мануала, но никогда на практике не применять. А вот результат «u'ВАС' == 'ВАС'» мне интересен, предполагаю, что если запустить из консоли будет ошибка, а если файлик сохранить в юникоде, то ошибки не будет :-) Но это всё гадание...

Splurov (инкогнито)
27 июля 2010, 20:32, ответ предназначен bolk (bolknote.ru):

Хотя после последнего комментария troll признаю свою неправоту, нечего мне лезть не в свою степь :-)

indeec17 (инкогнито)
27 июля 2010, 20:37, ответ предназначен troll

1 - True

troll (инкогнито)
27 июля 2010, 21:01, ответ предназначен indeec17

ага, с первым я ошибся - если ASCII символы - то True, если нет - то False

bolk (bolknote.ru)
27 июля 2010, 21:31, ответ предназначен troll

ага, с первым я ошибся - если ASCII символы - то True, если нет - то False
Правильно.

bolk (bolknote.ru)
27 июля 2010, 21:33, ответ предназначен Splurov

Да. 2 и 3 из области того, что можно знать из мануала, но никогда на практике не применять
Вы сейчас говорите полную ерунду. На практике вы никогда не сравнивали объекты? Магический метод __eq__, по-вашему, придумали «чтобы был»?

Ещё раз: это не «тонкость», это элементарное знание о том, что разные экземпляры не равны между собой, но операция сравнения может быть перекрыта.

bolk (bolknote.ru)
27 июля 2010, 21:34, ответ предназначен indeec17

False скорее всего потому, что сравнивать больше нечего, кроме указателей
Да, если не определён __eq__ то сравнивается — один и тот это экземпляр или нет, иначе зависит от.

bolk (bolknote.ru)
27 июля 2010, 21:35, ответ предназначен indeec17

Впрочем, я не совсем точен. Есть ещё __cmp__.

Andrii Kasian (mrkandy.wordpress.com)
27 июля 2010, 22:08

Абсолютно не зная питона, ответил правильно на все вопросы (судя по комментария) исходя из принципа "как наиболее ожидаемо"

Vladimir Moskva (fulc.ru)
27 июля 2010, 22:27

Можно спрашивать, чем отличается 'вася' от u'вася' и наслаждаться ответами типа "тем, что вторая строка в cp-1251". Тех, кто ответит правильно, нужно спросить, чем они отличаются и почему не равны даже, если локаль юникодная.

P.S. Вообще всем, кто считает, что в каких-то нерусских продуктах кодировка по умолчанию может быть cp-1251, нужно ставить жирный минус.

indeec17 (инкогнито)
27 июля 2010, 22:36, ответ предназначен Andrii Kasian (mrkandy.wordpress.com):

я также, абсолютно не зная питона, запустил его командную строку (давно инсталлировал для гуглодевелопердея) и скопировал туда каждое из условий. И только потом начал думать. По моему скромному имхо, самая правильная последовательность. Именно из-за наличия компа и интернета, которые на работе, связанной с инетом, отнимать не будут, считаю, что тесты такие отсеивают способных, оставляя опытных. У опытных же свои недостатки... А новичку покажи True-True-False, он же посидит минуту подумает, где это пригодится, поймёт и всё, уже не отличается от опытного. Сделали бы просто обучение "Питону от Яндекса", можно ж и платное...

Vladimir Moskva (fulc.ru)
27 июля 2010, 22:43, ответ предназначен indeec17

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

Victor Grinchik (wiktar.com)
27 июля 2010, 22:46

А если человек с хорошим алгоритмическим мышлением и умением находить правильные решения, структуры данных, но абсолютно без знаний питона?

bolk (bolknote.ru)
27 июля 2010, 23:00, ответ предназначен indeec17

считаю, что тесты такие отсеивают способных, оставляя опытных.
Нам нужны способные и опытные. Кстати, должен пояснить, что у нас нет такого «провалил один тест — гуляй». Это влияет, конечно, но не столь однозначным образом.

Нанимать человека за хорошие деньги, а потом его ещё и учить тому, что он должен уметь — это как-то странно. У нас есть стажировка в «Яндексе», Володя Москва (который fulc.ru) именно так и пришёл.

bolk (bolknote.ru)
27 июля 2010, 23:01, ответ предназначен Victor Grinchik (wiktar.com):

А если человек с хорошим алгоритмическим мышлением и умением находить правильные решения, структуры данных, но абсолютно без знаний питона?
Я думаю, в «Яндексе» для него найдётся место. Но это вряд ли место «разработчика на Пайтоне», не так ли?

bolk (bolknote.ru)
27 июля 2010, 23:20, ответ предназначен indeec17

Думаю, ваше предположение строится из ложной предпосылки, что человек должен писать код, ну или читать свой. Это, конечно же, не так.

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

Для данной вакансии это куда ценнее, чем уметь написать/придумать алгоритм, который ищет циклы в связанном списке за O(n), используя память O(1).

indeec17 (инкогнито)
27 июля 2010, 23:56, ответ предназначен bolk (bolknote.ru):

Спасибо, я понял предпосылки свои и ожидания от пайтоновцев. В тоннах неизвестного заранее кода скорее всего встретится магия с экземплярами объектов =) Используемый быстрый тест хорош. И замечательно то, что он используется совместно с другими, которые напрямую относятся к обязанностям. Типа вот тебе тонна, пойми задачу и исправь 10 ошибок =)

Andrei Charnou (www.shcoder.by)
28 июля 2010, 00:17

Я вот тоже всегда такие тесты считаю немного ущербными.

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

Мне кажется, что понятный код - это одна из основных ценностей промышленного разработчика, разве не так?

Andrei Charnou (www.shcoder.by)
28 июля 2010, 00:20

Кстати, проблема с чтением существующего кода вполне может расти из критериев отбора на проект.

bolk (bolknote.ru)
28 июля 2010, 00:25, ответ предназначен Andrei Charnou (www.shcoder.by):

Например, если человек любые такие задачки сходу решает, то скорее всего ему нравится. Если ему нравятся такие задачки, то вероятно его код будет состоять из многих тонкостей и хитростей.
Ребята, вы чего все? Какие «тонкости» и «хитрости»? Это тест на понимания очень базовой вещи, сравнения объектов. Это то, что встречается очень и очень часто.

bolk (bolknote.ru)
28 июля 2010, 00:26, ответ предназначен indeec17

Типа вот тебе тонна, пойми задачу и исправь 10 ошибок =)
Не, неверно понял. Откуда такие выводы?

Vladimir Moskva (fulc.ru)
28 июля 2010, 00:41, ответ предназначен Andrei Charnou (www.shcoder.by):

Это не какие-то хаки, а базовые вещи - знать, что возвращает str(), и как сравниваются строки. Не нужно думать, что человек, знающий ответ на первый вопрос, будет таким способом всегда проверять, есть ли в строке ASCII-символы.

Умение писать читаемый код не должно пропадать от знания таких вещей, но по ним можно понять, насколько глубоко человек знает тему, и оценить реальный опыт.

indeec17 (инкогнито)
28 июля 2010, 12:11, ответ предназначен bolk (bolknote.ru):

это не выводы, я не утверждаю, что у вас так. Это краткое описание теста, с адекватностью которого описанным задачам "читать и быстро разбираться в тоннах чужого кода, что-то дописывать, выправлять и т.п." я бы согласился. Евгений, тебе твоя ситуация ближе, поэтому оставляю за собой право не понимать задачи отбора в точности, только в общем приближении. Хотелось бы, конечно, понимать.

bolk (bolknote.ru)
28 июля 2010, 20:09, ответ предназначен Splurov

(какой ужасный урл, жж-ый openid что-то не хочет работать)
http://roem.ru/2010/07/23/addednews15686/

Andrei Charnou (www.shcoder.by)
28 июля 2010, 20:35

Bolk, не знаю ответ на первый вопрос - в Java/.NET все строки в Unicode :) Наивно понял, что зависит от того в какой кодировке сохарнен исходник, так что ли? Или это действительно разные типы? Если так, ну немного "хитро" выглядит. Остальные вопросы в принципе одинаковы везде и базовые, согласен.

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

На самом деле недавно участвовал в собеседовании, один из товарищей начал гонять человека по внутренностям Java похожими вопросами. Человек в итоге немного разнервнечался, в конце уже даже простой логичской задачи в коде не мог решить. Ловил себя на мысли, что в некоторых областях сам плаваю (хотя уже пару лет серьезно не кодировал, да и Java не мой родной язык), но уверен, что многих товарищей заткну за пояс при решении реальных задач. Просто дело не в деталях, дело в подходе.

Мы вот один раз брали .NET-чика на Java позицию (была уверенность в человеке просто), так вот писать код он смог сразу, а писать код лучше всех остальных жаверов - уже через пару месяцев. Не в знании языка дело.

bolk (bolknote.ru)
28 июля 2010, 21:43, ответ предназначен Andrei Charnou (www.shcoder.by):

Наивно понял, что зависит от того в какой кодировке сохарнен исходник, так что ли?
Зависит от того русские буквы или латинские :)
Если так, ну немного "хитро" выглядит.
Ну, слава богу, в Python3 это не так.

isk (livejournal.com) (инкогнито)
29 июля 2010, 14:30, ответ предназначен sergey-cheban.livejournel.com

а в первом коде в чем недостаток, кроме бесмыссленности?

isk (livejournal.com) (инкогнито)
29 июля 2010, 14:32, ответ предназначен bolk (bolknote.ru):

насчет опеид и жж:
http://ksena.livejournal.com/2526151.html?mode=reply&style=mine

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3