Стил:
Почти. Я делал столько упражнений, сколько мог. Некоторые требовали знаний, которых у меня было, - скажем, высшей математики. Такие я пропускал или делал кое-как. Но первые два тома и солидный кусок третьего я прочел очень внимательно. Сортировке я учился по книге алгоритмов Ахо, Хопкрофта и Ульмана. Что до остальных, то надо поглядеть в моей библиотеке. Я ведь настоящий старьевщик и храню все свои книги. Но те, которые я назвал, сразу всплывают в памяти. И еще книги по Лиспу. Например, та, что издали Беркли и Бо-броу: это скорее собрание отдельных статей, но я многое вынес из него. Потом я начал читать журнал “SIGPLAN” и ежемесячный журнал “Communications of the ACM” (“CACM”). Тогда в “САСМ” было полно технических подробностей, их интересно было читать.Вспоминаются два эпизода. В Латинской школе я участвовал в научных конкурсах, делал кое-какие компьютерные проекты. И вот член жюри одного из конкурсов спросил меня: “А почему бы тебе не вступить в АСМ?” Не помню, как звали этого человека, но я последовал его совету, за что ему очень благодарен.
А в Гарварде, если у меня было утром окно, я шел в библиотеку и делал одно из двух: читал “Scientific American”, узнавая что-нибудь из истории науки, или “САСМ”, заглядывая в будущее. Я не пропускал ни одной колонки Мартина Гарднера про математические игры. А в “САСМ” я читал то, что меня интересовало. В1972 году журналу исполнилось только 15 лет, и я прочитал все выпуски довольно быстро.
Сейбел:
Должно быть, тогда было проще в том смысле, что если понимаешь, как работает система в целом, то можно охватить умом и целую отрасль знания.Стил:
Именно так: целую отрасль. Было полно одностраничных статей. Например: “Вот новый эффективный метод хеширования”. Я много читал такого.Сейбел:
Мне кажется, сейчас понимать старые статьи сложновато, они завязаны на какие-нибудь особенности старых языков или железа.Стил:
Да. Необходимость - мать изобретения: идея появляется, когда в ней есть потребность. И только позже становится понятно, что идея эта очень важна. Чтобы убрать случайные обстоятельства, взглянуть на суть идеи, нужно несколько лет. Допустим, есть эффективный способ изменить порядок битов в слове на обратный, но реализован он на языке ассемблера 7090. В основе - интересная математическая идея, но она еще недостаточно абстрагирована.Сейбел:
Это ведь то, что делает Кнут?Стил:
Верно. Кнут и такие, как он.Сейбел:
Возможно, те, кто изучает компьютерные науки в колледже, проходят все это. Но многие программисты без официального образования учатся прямо в процессе работы. Что вы можете посоветовать в таком случае? От чего вы отталкиваетесь, как вам удается читать и понимать эти статьи? Может быть, надо прочесть все до единого выпуски “САСМ”, начиная с первых?Стил:
Прежде всего, я читал этот журнал, совершенно не собираясь прочесть все возможное и стать гением компьютерной науки. Просто это было мне интересно, я чувствовал потребность в этом чтении. Думаю, здесь две проблемы. Во-первых, нужно иметь внутреннюю мотивацию: вам либо интересно, либо хочется улучшить свои навыки.Во-вторых, как найти хороший материал, тем более что само это понятие меняется со временем? То, что хорошо сегодня, через десять лет устареет. Надо спросить у того, кто в этом разбирается. Что было полезным мне? Кнут, Ахо, Хопкрофт и Ульман. Затем “The Psychology of Computer Programming” Джеральда Вайнберга - она все еще не утратила ценности. Кое-что мне дал “The Mythical Man-Month”1
Фреда Брукса.Я тогда захаживал в отдел компьютерной литературы книжного магазина MIT - не реже раза в месяц я рылся там в книгах. Сейчас отделы компьютерной литературы в десять раз больше, но что вы там найдете?
Ф. Брукс “Мифический человеко-месяц или Как создаются программные системы”. - СПб.: Символ-Плюс, 2000.
В основном учебники по Си и Java. Но если хорошо порыться, найдется немного книг по теории программирования, алгоритмам и так далее.
Сейбел:
Есть другое чтение, и я знаю, что вы считаете его важным, - это чтение кода. Как вы ориентируетесь в чужом коде большого объема?Стил:
Если я знаю, для чего предназначен этот код, но не знаю его внутреннее устройство, я беру конкретную команду и начинаю распутывать.Сейбел:
Путь исполнения?Стил:
Да. Возьмем Emacs. Я говорю: посмотрим на код, который служит для перемещения курсора на один символ вперед. Я не понимаю его полностью, но с его помощью пойму какие-то структуры данных и способ представления буфера. Если повезет, то я найду место, где добавляется единица. Изучив это, я возьму код, перемещающий курсор на один символ назад. “Стереть строку”. Так я отслеживаю все более сложные участки кода, пока не пойму, что нащупал важную его часть.Сейбел:
А что значит “отслеживаете”? Смотрите на код и пытаетесь выполнить его в уме? Или берете отладчик и проходите код шаг за шагом?