Home > itblogs > О разнице взглядов на привычные вещи.

О разнице взглядов на привычные вещи.

June 2nd, 2010

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

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

Пригласили мы его на интервью. Спрашиваю у него, какими проектами он занимался.

  • Тем-то и тем-то. Драйвера, системное программирование.
  • Отлично, а почему вы занимаетесь системным программированием?
  • Ну, меня этому научили.
  • Гм. Вот я, например, занимаюсь системным программированием, потому что мне это нравится. А вы – потому что вас этому научили?
  • Ну да! Меня этому научили и я всю жизнь этим успешно занимался.

«Вот те раз, подумал Штирлитц». Ну ладно, подумалось, что тут такого? Ну, зарабатывает на жизнь себе человек системным программированием, ну и что?

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

Доходим до рисования кода на доске. Задача (тут я немного упрощаю): есть два произвольных бинарных дерева. Нужно сказать является ли второе дерево поддеревом первого дерева. В лоб это решается рекурсивным обходом дерева и рекурсивным сравнением в каждом узле дерева. Задача на внимательность – нужно постараться не пропустить граничных условий. А дальше следует дискуссия в таком вот ключе:

  • (Он) А каков алгоритм построения дерева?
  • (Я) Произвольное бинарное дерево, произвольной глубины. Выбирайте наиболее удобную структуру данных.
  • Нет, но каков, все-таки, алгоритм построения дерева? Я знаю Infix, Postfix and Prefix алгоритмы построения дерева. Ведь зная алгоритм, я могу оптимизировать поиск.
  • Правильно, зная алгоритм либо порядок узлов в дереве можно оптимизировать поиск. Однако, в данном случае, про дерево известно только то, что оно произвольное бинарное дерево. Я согласен, что в результате получится менее эффективный алгоритм, но таковы условия задачи.
  • Но я должен знать алгоритм, иначе эту задачу невозможно решить!
  • (Сдаюсь). Ну, хорошо. Алгоритм построения дерева такой. Есть случайная (намек!) строка символов. Алгоритм берет каждый из символов в цикле и на каждой итерации вызывает генератор случайных чисел. Если тот возвращает 1, то символ вставляется как левый дочерний узел. Если возвращается 2 – как правый. Если соответствующий дочерний узел существует, то алгоритм спускается на один узел вниз в соответствующую сторону и снова вызывается генератор случайных чисел.
  • Да, но этот алгоритм сгенерирует разные деревья для одних и тех же данных!
  • Совершенно верно.
  • Но тогда нельзя решить поставленную задачу.
  • Я уверен, что можно. Смотрите, сначала мы обходим все дерево рекурсивно и в каждом узле сравниваем поддерево с правым деревом.

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

  • (Он) Я никогда не сталкивался с такой задачей. Разве у нее есть практическое применение?
  • (Я) Вообще-то это выдуманная задача, но представьте, что вам нужно определить входит ли определенный кусок XML в произвольный XML файл, скачанный из интернета.
  • Но по XML можно построить грамматику, которая описывает правила построения этого XML файла!
  • Правильно. Грамматика произвольного XML позволяет любой порядок узлов и любую вложенность. Что, с точки зрения исходной задачи, эквивалентно грамматике произвольного бинарного дерево (для педантов, – XML не бинарное дерево. :-) )
  • (после пару минут разговора) Мне такая задача не встречалась. Может если бы в книге мне встретилась такая задача…

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

  1. Filipp
    June 2nd, 2010 at 23:19 | #1

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

  2. June 3rd, 2010 at 00:02 | #2

    А зачем там мучиться с граничными условиями сильно? Реализуем “рекурсивный” проход по дереву снизу-вверх итератором, а дальше задача сводится к поиску подстроки в строке :)

  3. r4ge
    June 3rd, 2010 at 00:20 | #3

    Разве это не называется “профессиональным идиотизмом”. Когда человек имеет кучу правильных шаблонов и умеет их правильно применять, но не умеет выйти из их плена.
    Потихоньку программирование стабилизируется, а значит и на таких людей будет потребность.

  4. Александр
    June 3rd, 2010 at 00:29 | #4

    >> А еще ругаются, зачем нам высшее образование, матан, дифуры, ведь это не нужно для программирования.

    Почему же, сударь? Это все очень полезно большинству программистов.. на собеседованиях.

  5. acerv
    June 3rd, 2010 at 00:41 | #5

    По моему, вы подбирали человека исходя из “если будет думать прям как я, значит, берем”.

    человек тут просто растерялся, по-моему. знаете, бывает на собеседованиях, находит ступор, и все тут. я бы сделал тест на дискретку и общие алгоритмы (аля егэ) и оставлял человека с тестом наедине – так он сможет сосредоточится.

    плюс, можно будет сразу отсеивать идиотов (тест может давать эйчарка) изначально, и если порог, скажем, 45% правильных пройден, то уже можно собеседовать лично.

  6. syncro
    June 3rd, 2010 at 01:03 | #6

    Не такая уж и редкость, когда разработчики думаю как бы не туда и у них тоже есть сильные стороны

  7. Xeningem
    June 3rd, 2010 at 01:21 | #7

    Айзек Азимов «Профессия» – в чистом виде.

  8. Anonymous
    June 3rd, 2010 at 01:37 | #8

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

  9. Anonymous
    June 3rd, 2010 at 01:57 | #9

    Возможно, этим и отличаются “программисты” от “кодеров” (в моем субъективном понимании). Есть люди способные писать грамотный, аккуратный код по заранее известным шаблонам, а есть те, кто могут решать общие и нестандартные задачи. Первые “работают на работе”, а вторые живут поиском решений. Намного реже встречаются люди, совмещающие в себе оба этих умения.

  10. metaclass
    June 3rd, 2010 at 02:00 | #10

    http://belnetmon.livejournal.com/1102245.html
    Народ в комментариях сильно недоволен тем, что на собеседованиях задают такие вопросы.

  11. Jonh Smith VII
    June 3rd, 2010 at 07:19 | #11

    Жизненно написано. Я бы сказал что вы провели грань которая разделяет программиста и кодера. Вот к вам пришел кодер, а не программист. Грамотный, опытный. Но не думающий и не обобщающий. Врядли такой сам изобретет B-дерево если не прочитает о нем в книжке, например.

  12. Jonh Smith VII
    June 3rd, 2010 at 07:21 | #12

    @Filipp
    Матан и диффуры – это здорово, но если не иметь стойкого желания заниматьяс системными делами – как максимум станете заурядным кодером, не более. Чтобы захотеть думать – это должно быть вам интересно, а не просто средством для зарабатывания денег. Где-то так.

  13. June 3rd, 2010 at 07:44 | #13

    kmmbvnr :
    А зачем там мучиться с граничными условиями сильно? Реализуем “рекурсивный” проход по дереву снизу-вверх итератором, а дальше задача сводится к поиску подстроки в строке

    Да, почти так. Если собеседуемый предложит такой вариант (или другой) – это только плюс.

  14. June 3rd, 2010 at 07:47 | #14

    acerv :
    человек тут просто растерялся, по-моему. знаете, бывает на собеседованиях, находит ступор, и все тут. я бы сделал тест на дискретку и общие алгоритмы (аля егэ) и оставлял человека с тестом наедине – так он сможет сосредоточится.

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

  15. June 3rd, 2010 at 07:49 | #15

    metaclass :
    http://belnetmon.livejournal.com/1102245.html
    Народ в комментариях сильно недоволен тем, что на собеседованиях задают такие вопросы.

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

  16. Wesha
    June 3rd, 2010 at 10:53 | #16

    “Позднее я узнал, что если американец заостривает только кончики, так он знает это дело лучше всех на свете, но он может никогда ничего не слыхать про игольи ушки. Игольи ушки — не его специальность, и он не обязан их знать.” – Маяковский В.В. “Моё открытие Америки”

  17. jerald
    June 3rd, 2010 at 10:54 | #17

    у многих программистов деревья – любимая вещь. а ведь подумаешь – накуя они нужны во многих случаях, где их применяют программисты? и ведь не убедишь никого, а ведь “там – на дне души” все потому, что построение деревьев – наиболее сложная задача на стандартных паттернах и выливается так в виде понтов на собеседовании, а в общем – в задротство и мозгоЁ*ство

  18. June 3rd, 2010 at 11:09 | #18

    jerald :
    …построение деревьев – наиболее сложная задача на стандартных паттернах…

    :-) Не ходили бы вы, мужики, в программисты. Об вас там всякие ботаны будут ноги вытирать на собоседованиях. ;-)

  19. legolegs
    June 3rd, 2010 at 12:29 | #19

    Я думаю, что он просто затупил и не понял задания. “Критический промах” так сказать. Возможно, ему зажевало мозги предыдущей задачей и он всё никак не отойдёт. Ну не может нормальный человек в нормальном состоянии так тупить. Ну или он вообще о деревьях не слышал, но это явно не тот случай.

  20. Kaspersky
    June 5th, 2010 at 10:52 | #20

    А мне кажется что он просто индус\китаец\рабочий, но не архитектор.
    Согласен с 1 комментатором.

  21. Фотограф
    June 25th, 2010 at 13:01 | #21

    В данном случае человек является банальным, но отличным исполнителем. Это тоже нужная должность. Он будет отлично писать код на простые задачи, алгоритмы которых описаны в книгах. Он выучил книги, отлично их понял и может на основе полученных шаблонных знаний эффективно решать задачи. Да, он не сможет придумать алгоритм для нестандартной задачи, но для этого в Microsoft есть специалисты более высокого звена. Я считаю, парня нужно было брать на работу.

    В интервью вы должны узнать, кем является человек –
    1. отличным исполнителем – он был перед вами
    2. отличным решателем проблем – ценнее чем предыдущее, но сложнее найти
    3. фуфлом

    Неужели у вас нет рутинных задач? У меня на работе 95% – это рутина и только в 5% приходиться выдумывать решения нестандартным задачам.

  22. solomon
    June 30th, 2010 at 03:00 | #22

    Комменты не осилил, но скажу что с таким встречаюсь достаточно часто.
    Это шаблонное высшее образование вот и все… Неспособность посмотреть на любую задачу под другим узлом. А один раз мне вообще сказали: А на фига, если и так все работает?

Comments are closed.