О разнице взглядов на привычные вещи.
За последнее время мне пришлось побеседовать со многими соискателями на место разработчика в нашей команде. Нужно сказать, это было очень познавательно. Иногда – даже слишком.
Один из кандидатов, судя по резюме, очень и очень подходил под наши требования. Кроме того, у неги имелся солидный опыт за плечами. Несколько законченных проектов, каждый из которых подтверждал то или иное требование нашей позиции. В общем, очень многообещающий кандидат.
Пригласили мы его на интервью. Спрашиваю у него, какими проектами он занимался.
- Тем-то и тем-то. Драйвера, системное программирование.
- Отлично, а почему вы занимаетесь системным программированием?
- Ну, меня этому научили.
- Гм. Вот я, например, занимаюсь системным программированием, потому что мне это нравится. А вы – потому что вас этому научили?
- Ну да! Меня этому научили и я всю жизнь этим успешно занимался.
«Вот те раз, подумал Штирлитц». Ну ладно, подумалось, что тут такого? Ну, зарабатывает на жизнь себе человек системным программированием, ну и что?
Продолжаем разговор. Он вполне отвечает на вопросы, – видно, что он знает о чем говорит, причем, знает, похоже, из практического опыта. Хотя мы явно говорим на разных языках – от него сложно сходу получить ответ на мало-мальски общий вопрос. Он предпочитает думать о проблемах на конкретных примерах. Ну ладно, ничего особенного пока. Хотя немного странно. От Senior SDE ожидаешь умения обобщать.
Доходим до рисования кода на доске. Задача (тут я немного упрощаю): есть два произвольных бинарных дерева. Нужно сказать является ли второе дерево поддеревом первого дерева. В лоб это решается рекурсивным обходом дерева и рекурсивным сравнением в каждом узле дерева. Задача на внимательность – нужно постараться не пропустить граничных условий. А дальше следует дискуссия в таком вот ключе:
- (Он) А каков алгоритм построения дерева?
- (Я) Произвольное бинарное дерево, произвольной глубины. Выбирайте наиболее удобную структуру данных.
- Нет, но каков, все-таки, алгоритм построения дерева? Я знаю Infix, Postfix and Prefix алгоритмы построения дерева. Ведь зная алгоритм, я могу оптимизировать поиск.
- Правильно, зная алгоритм либо порядок узлов в дереве можно оптимизировать поиск. Однако, в данном случае, про дерево известно только то, что оно произвольное бинарное дерево. Я согласен, что в результате получится менее эффективный алгоритм, но таковы условия задачи.
- Но я должен знать алгоритм, иначе эту задачу невозможно решить!
- (Сдаюсь). Ну, хорошо. Алгоритм построения дерева такой. Есть случайная (намек!) строка символов. Алгоритм берет каждый из символов в цикле и на каждой итерации вызывает генератор случайных чисел. Если тот возвращает 1, то символ вставляется как левый дочерний узел. Если возвращается 2 – как правый. Если соответствующий дочерний узел существует, то алгоритм спускается на один узел вниз в соответствующую сторону и снова вызывается генератор случайных чисел.
- Да, но этот алгоритм сгенерирует разные деревья для одних и тех же данных!
- Совершенно верно.
- Но тогда нельзя решить поставленную задачу.
- Я уверен, что можно. Смотрите, сначала мы обходим все дерево рекурсивно и в каждом узле сравниваем поддерево с правым деревом.
Я думал, что уж после этого дискуссия перейдет в более знакомое русло, но не тут-то было. Мы каким-то образом снова съехали к алгоритму построения дерева, вместо алгоритма его обхода.
- (Он) Я никогда не сталкивался с такой задачей. Разве у нее есть практическое применение?
- (Я) Вообще-то это выдуманная задача, но представьте, что вам нужно определить входит ли определенный кусок XML в произвольный XML файл, скачанный из интернета.
- Но по XML можно построить грамматику, которая описывает правила построения этого XML файла!
- Правильно. Грамматика произвольного XML позволяет любой порядок узлов и любую вложенность. Что, с точки зрения исходной задачи, эквивалентно грамматике произвольного бинарного дерево (для педантов, – XML не бинарное дерево.
) - (после пару минут разговора) Мне такая задача не встречалась. Может если бы в книге мне встретилась такая задача…
После этого разговора состояние у меня было – офигеть, не встать. С одной стороны вроде бы знающий и опытный программист. С другой стороны – такая фиксация на конкретных проблемах и никаких попыток обобщения и анализа. И ведь я уверен, что где-то он вполне успешно будет работать.
А еще ругаются, зачем нам высшее образование, матан, дифуры, ведь это не нужно для программирования. Книги по программированию не дают такого теоретического понимания. А теория обычно помогает в сложной и незнакомой ситуации
А зачем там мучиться с граничными условиями сильно? Реализуем “рекурсивный” проход по дереву снизу-вверх итератором, а дальше задача сводится к поиску подстроки в строке
Разве это не называется “профессиональным идиотизмом”. Когда человек имеет кучу правильных шаблонов и умеет их правильно применять, но не умеет выйти из их плена.
Потихоньку программирование стабилизируется, а значит и на таких людей будет потребность.
>> А еще ругаются, зачем нам высшее образование, матан, дифуры, ведь это не нужно для программирования.
Почему же, сударь? Это все очень полезно большинству программистов.. на собеседованиях.
По моему, вы подбирали человека исходя из “если будет думать прям как я, значит, берем”.
человек тут просто растерялся, по-моему. знаете, бывает на собеседованиях, находит ступор, и все тут. я бы сделал тест на дискретку и общие алгоритмы (аля егэ) и оставлял человека с тестом наедине – так он сможет сосредоточится.
плюс, можно будет сразу отсеивать идиотов (тест может давать эйчарка) изначально, и если порог, скажем, 45% правильных пройден, то уже можно собеседовать лично.
Не такая уж и редкость, когда разработчики думаю как бы не туда и у них тоже есть сильные стороны
Айзек Азимов «Профессия» – в чистом виде.
Ошибка формализации желаемого результата. Надо было найти толкового (обучаемого) человека, а нашли обученную обезьяну. Все по резюме
Возможно, этим и отличаются “программисты” от “кодеров” (в моем субъективном понимании). Есть люди способные писать грамотный, аккуратный код по заранее известным шаблонам, а есть те, кто могут решать общие и нестандартные задачи. Первые “работают на работе”, а вторые живут поиском решений. Намного реже встречаются люди, совмещающие в себе оба этих умения.
http://belnetmon.livejournal.com/1102245.html
Народ в комментариях сильно недоволен тем, что на собеседованиях задают такие вопросы.
Жизненно написано. Я бы сказал что вы провели грань которая разделяет программиста и кодера. Вот к вам пришел кодер, а не программист. Грамотный, опытный. Но не думающий и не обобщающий. Врядли такой сам изобретет B-дерево если не прочитает о нем в книжке, например.
@Filipp
Матан и диффуры – это здорово, но если не иметь стойкого желания заниматьяс системными делами – как максимум станете заурядным кодером, не более. Чтобы захотеть думать – это должно быть вам интересно, а не просто средством для зарабатывания денег. Где-то так.
Да, почти так. Если собеседуемый предложит такой вариант (или другой) – это только плюс.
Вполне возможно, что растерялся. Если так, то он учтет это на будущее и с блеском пройдет интервью в другой компании.
Нормально. Я ожидал комментариев в духе, что я на самом чешу свое эго вместо проведения нормального интервью.
“Позднее я узнал, что если американец заостривает только кончики, так он знает это дело лучше всех на свете, но он может никогда ничего не слыхать про игольи ушки. Игольи ушки — не его специальность, и он не обязан их знать.” – Маяковский В.В. “Моё открытие Америки”
у многих программистов деревья – любимая вещь. а ведь подумаешь – накуя они нужны во многих случаях, где их применяют программисты? и ведь не убедишь никого, а ведь “там – на дне души” все потому, что построение деревьев – наиболее сложная задача на стандартных паттернах и выливается так в виде понтов на собеседовании, а в общем – в задротство и мозгоЁ*ство
Я думаю, что он просто затупил и не понял задания. “Критический промах” так сказать. Возможно, ему зажевало мозги предыдущей задачей и он всё никак не отойдёт. Ну не может нормальный человек в нормальном состоянии так тупить. Ну или он вообще о деревьях не слышал, но это явно не тот случай.
А мне кажется что он просто индус\китаец\рабочий, но не архитектор.
Согласен с 1 комментатором.
В данном случае человек является банальным, но отличным исполнителем. Это тоже нужная должность. Он будет отлично писать код на простые задачи, алгоритмы которых описаны в книгах. Он выучил книги, отлично их понял и может на основе полученных шаблонных знаний эффективно решать задачи. Да, он не сможет придумать алгоритм для нестандартной задачи, но для этого в Microsoft есть специалисты более высокого звена. Я считаю, парня нужно было брать на работу.
В интервью вы должны узнать, кем является человек –
1. отличным исполнителем – он был перед вами
2. отличным решателем проблем – ценнее чем предыдущее, но сложнее найти
3. фуфлом
Неужели у вас нет рутинных задач? У меня на работе 95% – это рутина и только в 5% приходиться выдумывать решения нестандартным задачам.
Комменты не осилил, но скажу что с таким встречаюсь достаточно часто.
Это шаблонное высшее образование вот и все… Неспособность посмотреть на любую задачу под другим узлом. А один раз мне вообще сказали: А на фига, если и так все работает?