Информационные материалы → Разное →
Базовое руководство по собеседованиям. Часть Шестая.
Дело в том, что мой партнер Джейрд торгует облигациями и всегда рассказывает мне о заключенных им интересных сделках. Есть такая вещь, как опцион, а также опционы на продажу, на покупку и рыночные тенденции. Короче, все это запутанно, но мне известно, что все эти слова означают, и точно известен опцион на продажу (право, но не обязанность что-то продать за определенную цену). Только за три минуты я могу вычислить, что же произойдет, если я приобрету опцион на продажу, а рынок пойдет вверх. Но на вычисление этого мне требуется целых три минуты, а когда мой партнер рассказывает что-то более сложное, где опционы на продажу - это только самая простая деталь в его рассказе, а там есть еще многое другое, я очень быстро "теряю нить", потому что теряю мысль (Видишь ли, рынок идет вверх, а это значит, что проценты идут вниз, и сейчас опцион на продажу - это право что-то продать...). "Нить" будет потеряна до тех пор, пока он не возьмет бумагу с графиком и не начнет вести меня по нему, а мои глаза не станут тусклыми, и это очень печально. Даже поняв все самые мелкие детали, я не сделаю это настолько быстро, чтобы увидеть общую картину происходящего.
То же самое относится и к программированию. Если основные понятия для вас не настолько легкие, чтобы о них можно было и не думать, то сложные понятия вы не поймете.
Сердж Лэнг, профессор математики в Йеле, в первый же день занятий по математическому анализу давал студентам довольно простую задачку по алгебре, которую могли решить почти все, но некоторые ее решали уже тогда, когда записывали, а другим на решение требовалось довольно много времени. И тогда профессор Лэнг заявлял, что тот, кто решил задачу уже тогда, когда записывал, получит по анализу отличную оценку, а все остальные - не получат. Скорость, с какой студенты решали простую математическую задачку, была таким средством предсказания конечной оценки по анализу, как и целый семестр домашних работ, экзамены (как промежуточные, так и итоговый).
Видите ли, если вы не можете мчаться в легких условиях даже со скоростью 160 км/час, то никогда не преодолеете сложные условия.
Но, как я уже сказал, хорошие программисты встают, пишут на планшете ответ, иногда добавляя остроумную реплику (Оп-ля! Unicode-совместимую! Прекрасно!), и все занимает 30 секунд. Теперь мне надо решить, действительно ли они хорошие, поэтому я задействую тяжелую артиллерию - рекурсию и указатели.
Пятнадцатилетний опыт собеседований убедил меня в том, что все лучшие программисты способны легко разбираться сразу с несколькими уровнями абстракции. По отношению к программированию это означает, что у них нет проблем с рекурсией (при обдумывании которой, среди прочего, надо держать в уме сразу несколько уровней стека вызовов) или со сложными алгоритмами, использующими указатель (в которых адрес объекта является чем-то вроде абстрактного представления самого объекта).
Я пришел к выводу, что понимание указателей языка C - это не квалификация, а способность. Когда начинается первый год изучения компьютерной науки, в начале семестра набирается около 200 детей, и все они, когда им было по четыре года, уже написали на языке BASIC для своих ПК сложные программы с приключениями. Они уже достаточно изучат в колледже язык C или Pascal, пока однажды профессор не познакомит их с указателями, и вдруг студентам становится ясно, что указатели им непонятны. Они просто ничего не понимают. 90% студентов уходят и специализируются на политических науках, а своим друзьям говорят, что среди студентов-компьютерщиков было мало хорошеньких представителей соответствующего пола, потому они и ушли. По некоторой причине большинство людей, скорее всего, рождаются без той части мозга, которая понимает указатели. Указатели требуют сложной формы двойного абстрактного мышления, которая некоторым людям просто недоступна, а она очень важна для хорошего программирования. Никогда не занимались изучением указателей многие "скрипт-жокеи", которые начали программировать, копируя JavaScript-фрагменты в свои Web-страницы, а затем стали изучать Perl, и они никогда не сумеют создать код нужного вам качества.
Отсюда и берут начало все задаваемые на собеседованиях знаменитые вопросы, о которых вы слышали, например, о том, как "перестроить связанный список в обратном порядке" или "найти петли в древовидной структуре".