Шрифт:
Интервал:
Закладка:
Сейбел: Итак, при написании кода сегодня вы отдаете предпочтение выстраиванию его «сверху вниз»: сначала высокоуровневые функции, затем низкоуровневые, от которых те зависят?
Стил: Я стараюсь показывать высокоуровневые идеи. Наилучший для этого способ — показать центральную управляющую функцию со всем, чем она управляет, внизу. Или, возможно, важно показать сначала структуры данных, хотя бы наиболее важные из них. Идея в том, чтобы выстроить что-то вроде истории, а не сваливать в кучу фрагменты кода.
В MIT прекрасно было то, что человек мог знакомиться с кодом, написанным довольно умными хакерами, — код не держали под замком. Так я изучил код операционной системы ITS, реализации ТЕСО и Лиспа. И программу структурной печати Билла Госпера для Лиспа. Я освоил их еще в старших классах и попытался воспроизвести кое-что на своей IBM 1130.
Но я бы не смог реализовать Лисп на IBM 1130, не имея доступа к реализациям этого языка для других компьютеров. Я просто не знал бы, что делать. И это было важной частью моего образования. Отчасти проблема сегодня в том, что программы приобрели ценность, что большинство серьезных программ — коммерческие, и у нас не так много хороших примеров кода для изучения. Открытый исходный код отчасти решает эту проблему. Можно, к примеру, посмотреть код Linux. Для меня очень полезным оказалось чтение исходного кода ТеХ, потому что это был хорошо продуманный, хорошо отлаженный код.
Сейбел: Я обычно читаю код, если мне надо узнать, как работает программа. А что подвигло вас читать исходный код ТеХ?
Стил: Иногда у меня есть четко определенная цель, поскольку мне требуется решить проблему. Дважды я не мог найти ошибку в макросе ТеХ, читая книгу «Все про ТеХ»[64], и тогда пришлось читать «ТеХ: The Program»[65], чтобы точно понять, как что работает. И оба раза я справлялся с трудностями за четверть часа, так как исходный код ТеХ очень хорошо документирован, снабжен перекрестными ссылками. Это само по себе откровение — то, что программа может быть так тщательно построена, документирована и индексирована, что все находится быстро.
Еще я узнал тогда, как нужно выстраивать структуры данных, как сделать код легче для чтения. «ТеХ: The Program» Кнута читается почти как роман, можно просто взять и читать подряд. Конечно, иногда возникает желание пролистать несколько страниц вперед или назад. Кнуту пришлось проделать огромную работу, поэтому мало кто поступает таким образом.
Сейбел: Добравшись до конца, что вы для себя выносите?
Стил: Я понимаю, как устроен код, и у меня могут возникнуть идеи, как рациональнее построить свой собственный. Вряд ли я смогу подражать Кнуту, как не смогу писать в стиле Фолкнера или Хемингуэя. Но чтение этих авторов воспитывает чувство стиля. Может быть, по той или иной причине я приму сознательное решение не писать, как Хемингуэй. Это ценный опыт. Ну и потом, читать хорошо написанный роман или код — само по себе удовольствие.
Сейбел: Вы занимались литературным программированием?
Стил: Последовательно, в духе Кнута — нет. Он повлиял на меня, заставив задумываться о таких вещах, и теперь, прежде чем написать подпрограмму, я обычно пишу абзац текста. Но последовательно литературным программированием я не занимался. Иногда мне интересно — пишет ли он литературно, занимаясь исследовательским программированием, до того как готовит свои программы для публикации? Я не знаю, как выглядит весь этот процесс.
Сейбел: Значит, вы пробовали, но не сочли этот способ делающим процесс программирования более эффективным или приятным?
Стил: Отчасти мне не хотелось самому делать утилиты для литературного программирования. У Кнута все утилиты были организованы сначала вокруг Паскаля, а потом Си. Паскаль еще ладно, но недостатки Си я видел ясно, и литературное программирование, по-моему, не позволяло их преодолеть. Вот если бы Кнут сделал утилиты литературного программирования для Common Lisp, возможно, я смог бы на них быстро переключиться.
Сейбел: Оставим литературное программирование и вернемся к чтению кода. Как по-вашему, хорошо написанную программу можно прочитать от начала и до конца — или она скорее напоминает гипертекст, и в нем надо разбираться?
Стил: Я вовсе не против гипертекста. Но если программа хорошо написана, ее структура такова, что по ней можно перемещаться в некоем логическом порядке. Это вопрос не о том, что делает программа, а о том, как она построена, в каком контексте призвана работать. Хочется видеть комментарии в начале каждой подпрограммы, или отдельный сводный документ, или особое именование переменных, облегчающие понимание программы. И, пожалуй, хороший программист — действительно хороший — постарается сделать это независимо от того, что делает программа.
Сейбел: Какой код вы читали в последний раз для собственного удовольствия?
Стил: Трудно найти код, заслуживающий чтения. У нас нет списка исходных кодов, обязательных для чтения. «Это прекрасный код. Читать всем». Поэтому чаще всего попадаются небольшие кусочки кода на одну страницу, скажем, в научных статьях, а не фрагменты реально работающих программ. Последним, скорее всего, был код, разработанный моей командой для реализации языка Fortress. Ну, и кое-что из Java-библиотек.
Наверное, последний крупный фрагмент кода, который я изучал для собственного удовольствия, — это код Джорджа Харта, математика, специалиста по многогранникам. Это был очень занятный фрагмент для генерации и отображения сложных многогранников в браузере с использованием VRML. У Харта получился огромный кусок кода на JavaScript, создающий VRML-код и передающий его в программу для отображения VRML.
Я попытался улучшить этот фрагмент, для чего пришлось тщательно изучить код Харта, потом я изменял его и смотрел, что получается: пытался сделать многогранники попричудливее. Кроме того, я умудрился сделать несколько грубых ошибок: там был релаксационный алгоритм, размывающий вершины многогранников, чтобы сделать их красивее и проще для отображения, и кое-где я случайно добавил математические нестабильности, которые приводили к забавным последствиям. Это было страшно занятно, — и все только ради самообразования. Это было лет шесть-семь назад.
Сейбел: Как связаны чтение и модификация кода? Вы можете сидеть с распечаткой или с кодом на экране компьютера — и, не исполняя код, понять, к чему приведет его изменение?
Стил: Обычно я печатаю код. И сижу с распечаткой за столом, часто делаю пометки, задаюсь вопросами и так далее. А потом иду к компьютеру, что-нибудь добавляю в код, и смотрю, как он себя ведет. Просматриваю его.*
Сейбел: Ну, это в случае когда вам надо изменить код. Но приносит ли какую-нибудь пользу или удовольствие просто чтение кода? Распечатать, почитать, сделать какие-то пометки — и отложить в сторону?
Стил: Да. Если бы я этим и ограничился, просто чтение кода все равно было бы полезным упражнением. Я многое узнал о VRML, а в JavaScript, на мой вкус, маловато абстракций. Динамическая типизация в объектно-ориентированном языке, по-моему, все же лишена нужной строгости.
Сейбел: Поговорим о проектировании ПО. Сейчас вы не пишете столько кода, сколько раньше, но как вы подходили к разработке программы с нуля? Садились за компьютер и начинали писать код? Или брали разлинованный блокнот? Или еще как-то?
Стил: Здесь надо быть осторожнее, ведь память обычно нас подводит. Очень легко сказать, что я делал так-то, лишь потому, что я сделал бы так сейчас. Постараюсь припомнить.
Иногда я рисовал блок-схемы — у меня был шаблон для блок-схем IBM и специальная бумага. Я учился программировать до эпохи структурного программирования, поэтому среди моих программ были и структурированные, и нет. Потом я понял пользу структурного программирования, и в 1970-е мои программы на языке ассемблера стали более структурированными: я делал циклы, if-then-else, больше заботился о структуре своего кода.
- Николай Георгиевич Гавриленко - Лора Сотник - Биографии и Мемуары
- Свидетельство. Воспоминания Дмитрия Шостаковича - Соломон Волков - Биографии и Мемуары
- Первый учитель муай тай в России. Sanit Konak (THA). 1993 г. - Сергей Иванович Заяшников - Биографии и Мемуары / Спорт / Публицистика
- Фридрих Ницше в зеркале его творчества - Лу Андреас-Саломе - Биографии и Мемуары
- На заре космонавтики - Григорий Крамаров - Биографии и Мемуары
- Конец Грегори Корсо (Судьба поэта в Америке) - Мэлор Стуруа - Биографии и Мемуары
- Рассказы - Василий Никифоров–Волгин - Биографии и Мемуары
- Победивший судьбу. Виталий Абалаков и его команда. - Владимир Кизель - Биографии и Мемуары
- Власть в тротиловом эквиваленте. Наследие царя Бориса - Михаил Полторанин - Биографии и Мемуары
- Записки нового репатрианта, или Злоключения бывшего советского врача в Израиле - Товий Баевский - Биографии и Мемуары