О разнице взглядов на привычные вещи
Jun 2, 2010 · CommentsИнтервьюПрограммированиеРабота
За последнее время мне пришлось побеседовать со многими соискателями на место разработчика в нашей команде. Нужно сказать, это было очень познавательно. Иногда - даже слишком.
Один из кандидатов, судя по резюме, очень и очень подходил под наши требования. Кроме того, у неги имелся солидный опыт за плечами. Несколько законченных проектов, каждый из которых подтверждал то или иное требование нашей позиции. В общем, очень многообещающий кандидат.
Пригласили мы его на интервью. Спрашиваю у него, какими проектами он занимался.
- 
Тем-то и тем-то. Драйвера, системное программирование. 
- 
Отлично, а почему вы занимаетесь системным программированием? 
- 
Ну, меня этому научили. 
- 
Гм. Вот я, например, занимаюсь системным программированием, потому что мне это нравится. А вы – потому что вас этому научили? 
- 
Ну да! Меня этому научили и я всю жизнь этим успешно занимался. 
«Вот те раз, подумал Штирлитц». Ну ладно, подумалось, что тут такого? Ну, зарабатывает на жизнь себе человек системным программированием, ну и что?
Продолжаем разговор. Он вполне отвечает на вопросы, - видно, что он знает о чем говорит, причем, знает, похоже, из практического опыта. Хотя мы явно говорим на разных языках – от него сложно сходу получить ответ на мало-мальски общий вопрос. Он предпочитает думать о проблемах на конкретных примерах. Ну ладно, ничего особенного пока. Хотя немного странно. От Senior SDE ожидаешь умения обобщать.
Доходим до рисования кода на доске. Задача (тут я немного упрощаю): есть два произвольных бинарных дерева. Нужно сказать является ли второе дерево поддеревом первого дерева. В лоб это решается рекурсивным обходом дерева и рекурсивным сравнением в каждом узле дерева. Задача на внимательность – нужно постараться не пропустить граничных условий. А дальше следует дискуссия в таком вот ключе:
- 
(Он) А каков алгоритм построения дерева? 
- 
(Я) Произвольное бинарное дерево, произвольной глубины. Выбирайте наиболее удобную структуру данных. 
- 
Нет, но каков, все-таки, алгоритм построения дерева? Я знаю Infix, Postfix and Prefix алгоритмы построения дерева. Ведь зная алгоритм, я могу оптимизировать поиск. 
- 
Правильно, зная алгоритм либо порядок узлов в дереве можно оптимизировать поиск. Однако, в данном случае, про дерево известно только то, что оно произвольное бинарное дерево. Я согласен, что в результате получится менее эффективный алгоритм, но таковы условия задачи. 
- 
Но я должен знать алгоритм, иначе эту задачу невозможно решить! 
- 
(Сдаюсь). Ну, хорошо. Алгоритм построения дерева такой. Есть случайная (намек!) строка символов. Алгоритм берет каждый из символов в цикле и на каждой итерации вызывает генератор случайных чисел. Если тот возвращает 1, то символ вставляется как левый дочерний узел. Если возвращается 2 – как правый. Если соответствующий дочерний узел существует, то алгоритм спускается на один узел вниз в соответствующую сторону и снова вызывается генератор случайных чисел. 
- 
Да, но этот алгоритм сгенерирует разные деревья для одних и тех же данных! 
- 
Совершенно верно. 
- 
Но тогда нельзя решить поставленную задачу. 
- 
Я уверен, что можно. Смотрите, сначала мы обходим все дерево рекурсивно и в каждом узле сравниваем поддерево с правым деревом. 
Я думал, что уж после этого дискуссия перейдет в более знакомое русло, но не тут-то было. Мы каким-то образом снова съехали к алгоритму построения дерева, вместо алгоритма его обхода.
- 
(Он) Я никогда не сталкивался с такой задачей. Разве у нее есть практическое применение? 
- 
(Я) Вообще-то это выдуманная задача, но представьте, что вам нужно определить входит ли определенный кусок XML в произвольный XML файл, скачанный из интернета. 
- 
Но по XML можно построить грамматику, которая описывает правила построения этого XML файла! 
- 
Правильно. Грамматика произвольного XML позволяет любой порядок узлов и любую вложенность. Что, с точки зрения исходной задачи, эквивалентно грамматике произвольного бинарного дерево (для педантов, - XML не бинарное дерево. :-) ) 
- 
(после пару минут разговора) Мне такая задача не встречалась. Может если бы в книге мне встретилась такая задача… 
После этого разговора состояние у меня было – офигеть, не встать. С одной стороны вроде бы знающий и опытный программист. С другой стороны – такая фиксация на конкретных проблемах и никаких попыток обобщения и анализа. И ведь я уверен, что где-то он вполне успешно будет работать.