Кодеры за работой. Размышления о ремесле программиста
Шрифт:
Сейбел: С какими машинами вы имели дело в Гарварде?
Стил: С DEC PDP-10. В кампусе была PDP-10, но, кажется, к ней допускали только магистров. А нам давали доступ к телетайпным терминалам коммерческой системы, которую Гарвард арендовал или что-то в этом роде.
Сейбел: Вы бы хотели что-то изменить в том, каким путем пришли к программированию? Может быть, вы что-то упустили?
Стил: У меня никогда не было четко поставленной цели. И я не жалею о своем пути. Думаю, в моей жизни было много интересных совпадений и полезных напутствий.
Сейчас я понимаю, что посещать одновременно MIT
Необычным было и то, что связь с MIT у меня появилась уже в старших классах. В 15 лет я мог возиться с компьютером за миллион долларов, а тогда миллион долларов был немалой суммой. Поэтому у меня нет сожалений насчет того, что жизнь могла бы сложиться иначе. И потом, я принимаю все таким, как есть.
Сейбел: В чем больше всего изменились ваши взгляды на программирование по сравнению с теми годами? Кроме того, что теперь вы понимаете, что пузырьковая сортировка - не лучший способ?
Стил: Пожалуй, вот что: сейчас невозможно знать абсолютно все, что происходит внутри компьютера. Есть вещи, вам неподвластные, - сегодня невозможно знать все о всем программном обеспечении. В 1970-е память компьютера вмещала только 4000 слов. Можно было сделать дамп ядра и проверить каждое слово. По распечаткам исходного кода операционной системы можно было понять, как она работает. Я изучал утилиты для работы с диском и с устройством для чтения перфокарт, создавал свои варианты. И мне казалось, что я понимаю, как работает вся IBM 1130. Ну, или понимал в этом достаточно для себя. Сейчас все не так.
Сейбел: Вам помогали книги?
Стил: В 1970-е - конечно, да. Например, “Искусство программирования” Кнута.
Сейбел: Вы прочли ее от корки до корки?
Стил: Почти. Я делал столько упражнений, сколько мог. Некоторые требовали знаний, которых у меня было, - скажем, высшей математики. Такие я пропускал или делал кое-как. Но первые два тома и солидный кусок третьего я прочел очень внимательно. Сортировке я учился по книге алгоритмов Ахо, Хопкрофта и Ульмана. Что до остальных, то надо поглядеть в моей библиотеке. Я ведь настоящий старьевщик и храню все свои книги. Но те, которые я назвал, сразу всплывают в памяти. И еще книги по Лиспу. Например, та, что издали Беркли и Бо-броу: это скорее собрание отдельных статей, но я многое вынес из него. Потом я начал читать журнал “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. Я говорю: посмотрим на код, который служит для перемещения курсора на один символ вперед. Я не понимаю его полностью, но с его помощью пойму какие-то структуры данных и способ представления буфера. Если повезет, то я найду место, где добавляется единица. Изучив это, я возьму код, перемещающий курсор на один символ назад. “Стереть строку”. Так я отслеживаю все более сложные участки кода, пока не пойму, что нащупал важную его часть.