Стил: Последовательно, в духе Кнута — нет. Он повлиял на меня, заставив задумываться о таких вещах, и теперь, прежде чем написать подпрограмму, я обычно пишу абзац текста. Но последовательно литературным программированием я не занимался. Иногда мне интересно — пишет ли он литературно, занимаясь исследовательским программированием, до того как готовит свои программы для публикации? Я не знаю, как выглядит весь этот процесс.
Сейбел: Значит, вы пробовали, но не сочли этот способ делающим процесс программирования более эффективным или приятным?
Стил: Отчасти мне не хотелось самому делать утилиты для литературного программирования. У Кнута все утилиты были организованы сначала вокруг Паскаля, а потом Си. Паскаль еще ладно, но недостатки Си я видел ясно, и литературное программирование, по-моему, не позволяло их преодолеть. Вот если бы Кнут сделал утилиты литературного программирования для Common Lisp, возможно, я смог бы на них быстро переключиться.
Сейбел: Оставим литературное программирование и вернемся к чтению кода. Как по-вашему, хорошо написанную программу можно прочитать от начала и до конца — или она скорее напоминает гипертекст, и в нем надо разбираться?
Стил: Я вовсе не против гипертекста. Но если программа хорошо написана, ее структура такова, что по ней можно перемещаться в некоем логическом порядке. Это вопрос не о том, что делает программа, а о том, как она построена, в каком контексте призвана работать. Хочется видеть комментарии в начале каждой подпрограммы, или отдельный сводный документ, или особое именование переменных, облегчающие понимание программы. И, пожалуй, хороший программист — действительно хороший — постарается сделать это независимо от того,
Сейбел: Какой код вы читали в последний раз для собственного удовольствия?
Стил: Трудно найти код, заслуживающий чтения. У нас нет списка исходных кодов, обязательных для чтения. «Это прекрасный код. Читать всем». Поэтому чаще всего попадаются небольшие кусочки кода на одну страницу, скажем, в научных статьях, а не фрагменты реально работающих программ. Последним, скорее всего, был код, разработанный моей командой для реализации языка Fortress. Ну, и кое-что из Java-библиотек.
Наверное, последний крупный фрагмент кода, который я изучал для собственного удовольствия, — это код Джорджа Харта, математика, специалиста по многогранникам. Это был очень занятный фрагмент для генерации и отображения сложных многогранников в браузере с использованием VRML. У Харта получился огромный кусок кода на JavaScript, создающий VRML-код и передающий его в программу для отображения VRML.
Я попытался улучшить этот фрагмент, для чего пришлось тщательно изучить код Харта, потом я изменял его и смотрел, что получается: пытался сделать многогранники попричудливее. Кроме того, я умудрился сделать несколько грубых ошибок: там был релаксационный алгоритм, размывающий вершины многогранников, чтобы сделать их красивее и проще для отображения, и кое-где я случайно добавил математические нестабильности, которые приводили к забавным последствиям. Это было страшно занятно, — и все только ради самообразования. Это было лет шесть-семь назад.
Сейбел: Как связаны чтение и модификация кода? Вы можете сидеть с распечаткой или с кодом на экране компьютера — и, не исполняя код, понять, к чему приведет его изменение?
Стил: Обычно я печатаю код. И сижу с распечаткой за столом, часто делаю пометки, задаюсь вопросами и так далее. А потом иду к компьютеру, что-нибудь добавляю в код, и смотрю, как он себя ведет. Просматриваю его.*
Сейбел: Ну, это в случае когда вам надо изменить код. Но приносит ли какую-нибудь пользу или удовольствие просто чтение кода? Распечатать, почитать, сделать какие-то пометки — и отложить в сторону?
Стил: Да. Если бы я этим и ограничился, просто чтение кода все равно было бы полезным упражнением. Я многое узнал о VRML, а в JavaScript, на мой вкус, маловато абстракций. Динамическая типизация в объектно-ориентированном языке, по-моему, все же лишена нужной строгости.
Сейбел: Поговорим о проектировании ПО. Сейчас вы не пишете столько кода, сколько раньше, но как вы подходили к разработке программы с нуля? Садились за компьютер и начинали писать код? Или брали разлинованный блокнот? Или еще как-то?
Стил: Здесь надо быть осторожнее, ведь память обычно нас подводит. Очень легко сказать, что я делал так-то, лишь потому, что я сделал бы так сейчас. Постараюсь припомнить.
Иногда я рисовал блок-схемы — у меня был шаблон для блок-схем IBM и специальная бумага. Я учился программировать до эпохи структурного программирования, поэтому среди моих программ были и структурированные, и нет. Потом я понял пользу структурного программирования, и в 1970-е мои программы на языке ассемблера стали более структурированными: я делал циклы, if-then-else, больше заботился о структуре своего кода.