отдельности.
Удивительно, что есть люди, которые читают мои книги от корки до корки. Насколько я знаю, обычно человек выбирает подходящие для себя разделы. Но знает, что если глубже копнет ту или иную тему, то увидит в ней узкий набор терминов, а не все возможные нотации и жаргоны, - и без моих книг людям было бы тяжелее разбираться во всех этих темах. Вот что меня по-настоящему вдохновляет.
Кроме того, я стараюсь вести исследования в наиболее актуальном для практикующего программиста ключе, а вовсе не пытаюсь добиться признания в академических кругах, публикуя вещи, интересные в теории, но вряд ли употребимые в настоящей программе.
Я не включаю в свои книги исследования, где, например, фигурирует структура данных, в которой множитель log log
Сейбел: А что вы используете?
Кнут: Обыкновенное дерево двоичного поиска, которое с недавнего времени стал особым образом рандомизировать.
Сейбел: Кстати, о практической работе - в разгар работы над “Искусством программирования” вы взяли десятилетний перерыв, для того чтобы написать систему компьютерной верстки ТеХ. Насколько я понимаю, первую версию ТеХ вы написали без применения компьютера.
Кнут: Когда в 1977-1978 годах я написал первую версию ТеХ, у меня, разумеется, еще не было литературного программирования, но уже было структурное программирование. Я писал в большом блокноте, без сокращений, карандашом.
Полгода спустя, завершив проект в целом, я начал набирать его на компьютере. Отладку я выполнил в марте 1978 года, а программу начал писать в октябре 1977-го. Код хранится в архивах Стэнфордского университета - он весь написан карандашом. И, конечно, я часто возвращался к написанному и по мере обнаружения ошибок менял подпрограммы.
Это была система первого поколения, поэтому можно было использовать разные архитектуры, которые следовало отбросить, пока я не пожил с ней достаточно долго и не понял что к чему. Это была своего рода вечная проблема - нельзя было набирать текст без шрифтов, но нельзя было создать шрифты, не имея возможности набирать текст.
Однако структурное программирование подсказало мне идею инвариантов и представление о том, как создавать “черные ящики”, которые я смогу понимать. Поэтому я обрел уверенность, что код заработает, как только я наконец-то закончу с отладкой. Я думал, что смогу выиграть кучу времени, если подожду еще полгода, прежде чем приступать к какому-либо тестированию. Я не сомневался, что с кодом все было более или менее в порядке.
Сейбел: И на экономию времени вы рассчитывали, поскольку вам не пришлось бы писать вспомогательный код и модули для тестирования, чтобы протестировать незаконченный код?
Кнут: Именно.
Сейбел: Помимо того что ваши книги так хорошо набраны, как по-вашему, они бы сильно изменились, если бы вы не потратили десять лет на создание ТеХ?
Кнут: Хороший вопрос. Использование структурного программирования не в чисто академических целях - другими словами, я думаю об инвариантах не только в пробных, но и в реальных программах, - возможно, повлияло на то, как я сейчас описываю алгоритмы в своих новых книгах. А если не повлияло, то должно было.
Я бы ничего не узнал о кэшировании и о тенденциях изменений в компьютерной индустрии, и о других подобных вещах, если бы просто шел по накатанной дорожке - черпая знания для своих книг из уже написанных трудов. Пока я писал первые три тома, я не создавал программ, подобных ТеХ, написание которых более характерно для активной программистской деятельности. Я же писал пробные программы. Таким образом, я получал некое представление о числах и величинах.
На самом деле, это потрясающе - осознавать во время процесса написания книги те вещи, которые заставляют тебя использовать то или иное слово. Это поистине тайна — как это все происходит. Это наиболее важное влияние, которое оказал на меня опыт создания ТеХ, - я по-другому стал относиться к вещам, и я стал писать по-иному, по-иному составлять предложения — они стали менее громоздкими. У всей книги появилась какая-то новая интонация - уверенности или еще чего-то.
Сейбел: То есть к моменту завершения ТеХ вы были уже значительно лучшим программистом, чем когда начинали его создавать?
Кнут: Да, потому что я стал применять методы литературного программирования.
Сейбел: Понятно, у вас появились более качественные инструменты, но улучшились ли непосредственно ваши навыки?
Кнут: Я узнал очень много нового, пока работал над этим проектом. В частности узнал, как много ресурсов вашего мозга съедает разработка ПО. Это оказалось намного более сложным заданием, чем я ожидал. Я не мог одновременно преподавать на полную ставку и полноценно заниматься разработкой ПО. Но я мог преподавать на полную ставку и полноценно заниматься написанием книг; ПО же требовало невероятного внимания к мельчайшим деталям. Мой мозг был забит только программным обеспечением, так что я не мог думать ни о чем другом. Поэтому я стал с особым уважением относиться к тем, кто работает в крупных проектах по разработке ПО; я бы никогда не узнал, как они работают, если бы сам не занимался схожей работой.
Сейбел: То есть, по-вашему, программировать сложнее, чем писать книги; где-то я читал ваше мнение, согласно которому невозможно сказать, сколько времени займет написание той или иной книги. Значит ли это, что сказать, сколько времени займет написание одной программы, еще сложнее?
Кнут: Да, это так. Это очень верный вывод.
В этом году я написал три крупные программы с помощью методов литературного программирования, код каждой из которых занимает больше 100 страниц формата А4. Две из них взаимосвязаны, так что это скорее две с половиной программы. И еще около 150 небольших программ. Пожалуй, за предыдущий год мне удалось сделать меньше. То есть я очень плотно занимался в этом году созданием небольших программ, но некоторые из них я писал по месяцу или дольше.
Сейбел: И вы с самого начала могли сказать, что будете писать их месяц?
Кнут: Что касается одной из них - да, я ожидал, что на ее создание уйдет месяц. Я знал, что это будет непростое задание, но не мог предположить, насколько у нее богатый потенциал, - я даже добавил несколько дополнительных свойств по ходу ее использования. Я считаю, что это абсолютная истина, которую должен усвоить каждый руководитель отдела разработки: сроки написания программы нельзя спрогнозировать.
Сейбел: Помимо того что вы написали “Искусство программирования” и ТеХ, вы изобрели и всячески продвигали литературное программирование - способ программирования, при котором код гораздо легче прочитать неспециалисту. Вы написали WEB и CWEB, инструменты реализации языков литературного программирования на базе Паскаля и Си.
Кнут: Вы сказали
Сейбел: Так, может, объясните, почему вы так любите литературное программирование и чем оно отличается от нелитературного программирования?
Кнут: Первое правило пишущего человека - нужно понимать свою аудиторию: чем