Дойч: Я улыбаюсь, поскольку это была очень небольшая программа. Вы видели ее листинг? Там всего около пары сотен строк кода на ассемблере.
Сейбел: Я видел его, но даже не пытался понять. То есть вы просто перевели написанное в руководстве по версии 1.5 в программу на ассемблере?
Дойч: Нет-нет. Все, что я взял из руководства по версии 1.5, — это интерпретатор. Мне нужно было написать считывание и токенайзер, разработать структуры данных и все такое. Насколько помню, все это я сделал так же, как делал большую часть своих программ - сначала занялся структурами данных. Когда я был молод, интуиция подсказывала мне - не все время, но практически всегда - действительно верные и удачные подходы к написанию программ.
В последние годы я замечаю, что стал уже не тот - интуиция не работает так здорово, как раньше. Я уже несколько лет занимаюсь (нерегулярно, конечно) крупным проектом по созданию хорошего музыкального редактора с открытым исходным кодом и понимаю, что привычный метод работы - позволить интуиции привести меня к подходящей организации структуры данных, и уже потом просто написать код - больше не работает.
Сейбел: Вы считаете, что все дело именно в том, что ваша интуиция стала хуже работать, или, может быть, вы раньше прикладывали больше сил, чтобы все заработало так, как надо, даже если интуиция вас подводила?
Дойч: Думаю, что истина где-то посередине, хотя первое утверждение все-таки более верно. Как мне представляется, интуиция - это бессознательный процесс поиска решения на огромном поле исходной информации. И чем меньше я погружен в работу над ПО, тем меньше в моем распоряжении исходной информации, которая используется при поиске решений.
Я где-то слышал мнение, согласно которому профессионал в любом деле должен иметь в своем распоряжении около 20 000 конкретных примеров. И дело в том, что 20 000 конкретных примеров из области разработки ПО, которые прошли перед моими глазами за 45 лет работы в этой индустрии, постепенно выветриваются из моей памяти, как это всегда бывает. Мне кажется, по большому счету дело именно в этом.
Сейбел: Вы помните, что именно привлекло вас в программировании?
Дойч: Имея возможность окинуть ретроспективным взглядом 50 лет, вижу, что меня всегда интересовали системы денотативных символов - языки. И не только “словесные” (человеческие) языки, но и языки, в которых все высказывания имеют определенные результаты. Языки программирования идеально соответствуют этому требованию.
Мне кажется, этим же в какой-то мере объясняется и то, почему я сейчас занимаюсь именно сочинением музыки. Музыка - это язык, или семья языков, но у высказываний на этих языках есть не только значения, они еще и воздействуют определенным образом на людей. Музыка представляет для меня интерес, поскольку по степени формализации она находится между естественными языками и языками программирования. Музыка более формализованна и упорядоченна в сравнении с естественными языками, но до языков программирования ей в этом отношении очень далеко. Именно этим, наверное, объясняется, почему я выбрал музыку, а не поэзию. Мне кажется, что поэзия для меня недостаточно формализована.
Но если говорить коротко, то меня туда просто сразу потянуло.
Сейбел: Помните первую интересную программу, которую вы написали?
Дойч: Первой программой, которую я написал, потому что тема заинтересовала меня, стала моя вторая по счету программа. Первой программой был небольшой фрагмент кода, имевший отношение к Кембриджскому ускорителю электронов. Второй же стала программа для форматирования чисел с плавающей запятой.
Сейбел: Это достаточно сложная задача.
Дойч: Для бинарной машины - конечно. Но работая на десятичной машине, эту задачу решить вовсе не сложно. А я работал на десятичной машине.
Нужно просто двигаться по строке и решать, где поставить десятичную запятую. Нужно решить, какой формат использовать - Е или F. Но в те дни все было намного сложнее - я писал на ассемблере на машине пакетной обработки, поэтому эта задача все-таки не была столь уж тривиальной. Это была первая программа, которую я написал, потому что хотел написать.
Сейбел: В старших классах вы много времени проводили в MIT, после чего поступили в колледж в Беркли. Вы хотели сбежать с восточного побережья?
Дойч: Что-то вроде того. Я решил, что мне будет полезно уехать куда-нибудь подальше от своих родителей. Серьезно я рассматривал три места: университеты в Рочестере, Чикаго и Беркли. Думать тут особенно было нечего: лишь в одном из этих трех городов сносная погода. Именно так я оказался в Беркли. И это событие было одним из лучших в моей жизни.
Я учился в Беркли и нашел там - достаточно быстро - проект Genie, и продолжал заниматься им до тех пор, пока... Сначала был проект Genie, затем Berkeley Computer Corporation, потом Xerox.
Сейбел: Судя по всему, именно в Беркли вы стали работать над гораздо более крупными проектами, чем разработка Лиспа на PDP-1.
Дойч: О, да. В рамках проекта Genie я работал над гораздо более крупными проектами. Для начала я написал ядро операционной системы, практически целиком. А это больше 10 000 строк.
Сейбел: Каким образом это изменение масштаба работы повлияло на процесс написания кода?
Дойч: Пытаюсь вспомнить, из чего состояло ядро. Это была достаточно небольшая программа, поэтому я мог воспринимать ее как единое целое. Очевидно, там были некие функциональные части. Помню, что у меня было ясное представление того, какие разделы программы и ключевые структуры данных могли вступать во взаимодействие друг с другом. Но на самом-то деле, черт возьми, этих самых структур данных было не так уж много. Была таблица процессов, были таблицы готовности. Были буферы ввода/вывода и было что-то, что отвечало за отслеживание виртуальной памяти. Кроме того, была таблица открытых файлов - для каждого процесса. Но описания всех системных структур данных, видимо, можно было бы уместить - в терминах структур языка Си - на двух страницах. Поэтому, как вы понимаете, это была не очень сложная система.
Сейбел: Какой была самая большая программа, над созданием которой вы работали, и чье устройство вы помните?
Дойч: Я был основным вдохновителем трех крупных систем. В Ghost-script - не считая драйверов устройств, большинство из которых написал не я, - мною было написано порядка 50-100 тысяч строк на Си.
Что касается ParcPlace, виртуальной машины Smalltalk, то в этом проекте я работал лишь над JIT- компилятором, составлявшим лишь 20% от всего проекта. Количество написанных мною строк исчисляется четырехзначными числами, где-то 3000-5000.
Что касается реализации Interlisp - той ее части, к которой я имел отношение, - то я написал около пары тысяч строк микрокода, и возможно - сейчас я могу только гадать, - еще около 5000 строк на Лиспе. Получается, что Ghostscript - самая большая система, над которой я когда-либо работал.
Сейбел: И не считая драйверов устройств, написанных другими, вы создали его практически в одиночку.
Дойч: До конца 1999 года я написал код практически целиком - до единой строки. Сначала я принял несколько архитектурных решений, первым из которых стало решение полностью развести языковой интерпретатор и графику.
Сейбел: Язык, о котором идет речь, - Postscript?
Дойч: Именно он. То есть интерпретатор языка ничего не знал о структурах данных, которые использовались для создания графики. Они обращались к графической библиотеке, у которой был API.
Второе решение, которое я принял, заключалось в структуризации графической библиотеки с помощью интерфейса драйвера. Таким образом, графическая библиотека знала все про пикселы, про визуализацию кривых и текста, но ничего не понимала в том, каким образом пикселы были закодированы