Дональд Кнут (Donald Knuth) — учёный-компьютерщик, который достиг совершеннолетия вместе со своей сферой научной деятельности. Талант программиста впервые проявился у Кнута в тринадцатилетнем возрасте, то есть в середине прошлого века, когда искусство компьютерного программирования только зарождалось. Тогда одна из кондитерских фирм организовала для детей конкурс, в рамках которого им следовало определить, сколько слов можно получить, используя буквы, входящие в название фирменной плитки шоколада Ziegler’s Giant Bar. Это была чётко сформулированная проблема, состоящая из разных частей, — как раз такая, какие ему нравились.
«У меня была обсессивно-компульсивная жилка, побуждавшая меня браться за решение цифровых, дискретных проблем. И я любил тщательно изучать большие коллекции информации», — вспоминает Кнут.
Кнут, сидя в подвале, методично пролистал все 2000 страниц полного стандартного словаря английского языка Funk & Wagnalls. Чтобы ничто не отвлекало от решения конкурсной проблемы, он даже сумел сказаться больным, и родители позволили ему две недели не ходить в школу. Пометив учётные карточки двумя буквами, которые могли быть начальными для слова, содержащего только буквы, входящие в название шоколадной плитки, — например «Aa», «Ab» и «Ba», — он скользил вниз по столбцам словаря, отмечая подходящие слова. Он обнаружил, что можно пропустить целые разделы словаря, например те, что посвящены словам, начинающимся с буквы «C», или словам, в которых первая буква «B», а вторая «U».
По прикидкам организаторов конкурса, должно было получиться около 2000 слов, но Кнуту удалось найти более 4700. В награду за это его показали по телевидению и угостили шоколадом вместе со всеми его одноклассниками. А потом было много других наград, в том числе первая премия ACM (Ассоциации вычислительной техники) имени Грейс Мюррей Хоппер (Grace Murray Hopper), Национальная научная медаль (National Medal of Science) и премия A.M. Тьюринга (A.M. Turing Award).
В конце концов, Кнут сделал так, что любовь к дискретным цифровым проблемам слилась у него с любовью к большим коллекциям информации в его magnum opus «Искусство программирования» (The Art of Computer Programming) — серии книг, работу над которой он начал в 1962 году, ещё будучи аспирантом, и до сих пор не завершил. Первый том, впервые опубликованный в 1968 году, выдержал 42 издания. Второй том вышел в 1969 году, третий — в 1973 году. К тому времени Кнут уже работал профессором информатики в Стэнфордском университете (Stanford University), но его беспокоило, что эта работа помешает ему завершить серию книг. И вот в 1990 году он взял отпуск, а затем в 1993 году ушёл в отставку, чтобы посвятить остаток жизни созданию семитомного произведения. Сейчас ему 82 года, и он усердно работает над частью B четвёртого тома. По его замыслу, в этом томе будет не две части, а больше — как минимум, от A до F.
«Искусство программирования» — это больше, чем просто руководство для начинающих программистов. Подобно Айзеку Азимову (Isaac Asimov) и Эрику Темплу Беллу (Eric Temple Bell), вплетавшим науку и математику в повествования о приключениях персонажей, Кнут наслаждается, рассказывая истории о компьютерных науках.
Благодаря этой страсти рассказчика Кнут стал одним из главных действующих лиц в истории информатики, и не только как автор своего magnum opus. Когда в 1970-х годах издатель прислал ему гранки второго издания второго тома, Кнута расстроили расположение и облик чисел, символов и слов на страницах. Он полетел в Лос-Анджелес, чтобы взглянуть на машину, печатавшую глянцевые журналы, используя их цифровой макет. С её помощью Кнут надеялся улучшить эстетический вид своего произведения, но затея оказалась слишком дорогой. Тем не менее, эта поездка не была бесполезной: она побудила Кнута приступить к разработке компьютерного языка, позволяющего печатать математические тексты, представленные в цифровом виде.
Вернувшись в Стэнфорд, Кнут почти на десять лет отставил в сторону «Искусство программирования», чтобы разработать TEX (произносится «тех») — сложную, революционную программу, позволяющую поместить цифровую типографию в настольный компьютер. Он сделал эту программу с открытым исходным кодом, стремясь учесть потребности профессиональных математиков, учёных-компьютерщиков, экономистов, инженеров, лингвистов, статистиков и других пользователей ПК, страдавших от нехватки технических символов, вводимых с помощью клавиатуры, и разбиравшихся в сложных формулах лучше, чем издатели их текстов. В мире компьютерных программ, нередко очень быстро выходящих из употребления, TEX прочно удерживает позиции стандартного инструмента, позволяющего придать научной статье такую изящность, какая максимально облегчает специалистам её чтение и понимание.
Кроме того, склонность Кнута рассказывать истории побудила его разработать философию грамотного программирования — метода написания компьютерных программ в виде литературных эссе. При таком программировании получается «грамотная программа», в которой исходный код представляет собой вкрапления в элегантную прозу, написанную на естественном, например английском, языке. Исходный код обеспечивает функциональность и эффективность, а экспозиция предназначена для читателя-человека, а не для компилятора компьютера. Тому, кто взялся обновить или отладить «грамотную программу», не надо выяснять задействованные её создателем алгоритмы, дизайнерские решения и стратегии реализации, что зачастую представляет собой весьма трудоёмкое и дорогостоящее дело. Кнут относится к тем учёным-компьютерщикам, которые понимают, что слова имеют значение.
В феврале журнал Quanta взял у Кнута интервью в его доме, находящемся на территории Стэнфордского университета.
Вам всегда хотелось писать?
Д. К. В детстве меня настраивали на то, что понять реальный мир мне будет слишком сложно. Я не рассчитывал открыть что-то новое, но мне нравилось письменно выражать восхищение теми или иными идеями.
В шестом классе я и пара моих друзей с помощью копировальной машинки взялись издавать двухстраничную газету. Мы развлекались. В старших классах я, будучи редактором этой газеты, каждый понедельник трудился ночь напролёт, чтобы выпустить очередной номер. Именно будучи редактором газеты в колледже, я впервые увидел свой текст напечатанным. На младших и старших курсах мы учились писать обзоры на темы науки и техники. Однажды я написал так: «Th5E4 CH3EmIC2Al2 Ca3P4Er». Каждое слово в заметке было химической формулой.
И именно это привело вас к вашему magnum opus? Или, на ваш взгляд, его появление представляет собой другую историю?
Д. К. «Искусство программирования» — это манифест. Он говорит о тех методах исследования, какие я люблю использовать в математике, и о тех методах обучения, какие я приветствую у моих учителей. Начиная с первой страницы, я рассказываю историю алгоритмов. В то время учебники, как правило, не исследовали человеческий аспект открытий. Они просто описывали результаты научной деятельности: «Вот так работает химия» или «Вот так работает физика».
А ещё я рассказываю техническую историю. Я говорю: «Вот то, что не работает, а вот способ решения этой проблемы». Вместо того чтобы преподносить одни лишь факты, я добавляю драму. Изучать науку намного легче, когда знаешь последовательность открытий. Кроме того, я не могу удержаться от рассказа, когда встречаю хорошую историю. Я всегда считал себя не учёным-первопроходцем, а журналистом.
Что представляет собой «Искусство программирования» помимо такой истории?
Д. К. После двух лет работы над книгой я понял, что её новизна состоит в количественном определении степени совершенства программ. Мне мало сказать, что одна программа лучше другой. Мне хочется сказать, что одна программа на 13,8% лучше другой, и объяснить, как их нужно сравнивать.
Пусть автор A рассказал про свой алгоритм A, а автор B — про свой алгоритм B, конкурирующий с алгоритмом А. При этом автор A никогда не писал про алгоритм B, а автор B — про алгоритм A. Кроме того, авторы A и B использовали разные компьютеры. Работая как нейтральный журналист, я оцениваю оба алгоритма с одной точки зрения. Выяснять, насколько хорош в реальности тот или иной алгоритм, — увлекательная проблема. Это анализ алгоритмов.
Не означает ли «анализ алгоритмов» то же самое, что и «искусство программирования»?
Д. К. В 1967 году, когда я был на конференции Общества промышленной и прикладной математики (Society for Industrial and Applied Mathematics), кто-то спросил меня, чем я занимаюсь. В те дни в информатике выделяли три области: численный анализ, искусственный интеллект и языки программирования. Вот и всё. Я понял, что мне нужно придумать название для того, что я делаю.
Новизна моей книги заключалась в тщательном изучении степени совершенства алгоритмов. И я решил, что в следующий раз, когда мне зададут вопрос о том, чем я занимаюсь, я отвечу: «Анализом алгоритмов». Что это такое, я определял так: если меня это интересует, это — анализ алгоритмов. Не очень-то строгое определение.
Позднее я решил улучшить это определение так: анализ алгоритмов — это количественное исследование степени их совершенства. Данное исследование распадается на две части: в рамках одной из них рассматриваются всевозможные алгоритмы, предназначенные для решения определённой проблемы, в рамках другой — один конкретный алгоритм, предназначенный для решения определённой проблемы.
Анализ алгоритмов становился делом всей моей жизни. Я попросил своего издателя изменить название моей книги на «Анализ алгоритмов». Издатель ответил так: «Это никто не купит». Считаю, что решение издательства было правильным. Тем не менее, когда 40 лет спустя вышло пять или шесть книг с названием «Анализ алгоритмов», я был счастлив.
Однако, с вашей точки зрения, программирование не сводится к решению функциональных задач. Например, разрабатывая TEX, вы стремились к тому, чтобы кривые, соединяющие определённые точки, были «наиболее приятными». Вы пытались программировать красоту?
Д. К. Моя программа должна была соединять точки так, как это мог бы делать мастер-каллиграф. При написании буквы «S» возникает точка, в которой кривизна вместо положительной становится отрицательной, но какое-то время линия может идти прямо. Вычерчивая буквы, их дизайнеры придерживались определённой логики. Я хотел уловить не только результат этого дизайна, но и менталитет его создателей. То, как они работают, походит на создание компьютерной программы.
Я разговаривал с дизайнерами, чтобы понять, чего они стремятся достичь. Математика нужна им для того, чтобы дизайн получил своё количественное выражение. С помощью математики я будто снабжаю все элементы формы маленькими цифровыми устройствами набора. К примеру, я могу указать, что у буквы «А» здесь есть точка, там — толщина, здесь — углы, там — сужение, горб в нижней части и засечки определённой длины.
Я никогда не собирался заменить своей программой дизайнеров. Я лишь хотел в точности запечатлеть для будущих поколений то, что я и они делали в то время. Благодаря TEX дизайн воспроизводим.
Вы ожидали, что TEX получит мировое признание и окажется удивительно живучим?
Д. К. TEX предназначался только для меня и моей секретарши. Филлис (Phyllis) [Астрид Бенсон Уинклер (Astrid Benson Winkler)] была замечательной секретаршей. Она разбирала мой почерк, и делала это превосходно. Технология печати шла ко дну, потому что проверенные методы становились слишком дорогими. Почти все математические труды, опубликованные в 1970-х годах, выглядели ужасно. В American Mathematical Monthly шрифт подстрочных индексов отличался от шрифта основного текста. Я знал, что благодаря компьютерному программированию книжные тексты снова смогут выглядеть прилично.
Отладку пробной версии TEX я закончил в апреле 1978 года. В мае у меня было 10 пользователей, в июне — 100, в июле — 1000. И все могли бы сказать: «Эта замечательная штука необходима». Пять лет спустя я опубликовал то, что, по сути, представляет собой нынешний TEX. Эта программа была разработана для американцев. Затем её начали использовать европейцы. Поэтому в 1980-х я сделал так, чтобы она могла работать с разными мировыми языками.
Похоже, вы всегда стремились что-то открыть. Это так и сегодня?
Д. К. В среднем каждую неделю я создаю пять новых программ. Поэты должны писать стихи. Я должен писать компьютерные программы.
Конечная проверка того, понимаю ли я что-то, — моя способность объяснить это компьютеру. Я могу вам о чём-то сказать, и вы кивнёте мне головой, но и в этом случае я не могу быть уверен, что выразил свою мысль хорошо. А компьютер не кивает головой. Он в точности повторяет всё, что я говорю. Можно обмануть кого угодно, но нельзя обмануть компьютер.
Вы не можете не писать, но у вас есть и другие интересы. Как вы планируете каждый свой день?
Д. К. Каждый день, прежде чем с кем-то общаться, Джек Лондон должен был написать 1000 слов. Это было для него законом: «Никого не знаю, пока не написал свою тысячу слов!» А в оставшееся время он пил или правил написанное. У меня другой принцип планирования: сначала делать то, что я больше всего ненавижу. И в конце недели я очень счастлив.
В самом деле? Разве можно стать счастливым, сделав что-то ненавистное?
Д. К. Мне очень легко встать в позу: «Я — гений, поэтому не обязан чистить туалет». Но даже уборкой туалетов вполне можно заниматься. Мы с [моей женой] Джилл (Jill) приобрели спецкостюмы, удобные для использования очистителя «Формула 409». Идёшь в туалет, разбрызгиваешь очиститель и, делая это, чувствуешь себя хорошо!
Жизненный успех личности зависит от того, каков у неё низший минимум, а не высший максимум. Если вам удаётся делать что-то по-настоящему хорошо, но есть и что-то другое, что у вас не получается, это другое будет мешать вам идти вперёд. Но если почти всё, что вы делаете, у вас получается, значит, ваша жизнь прекрасна. Вот почему я учусь делать то, что другие считают неприятным.
У вас за плечами есть и много проектов, не имеющих ничего общего с информатикой, например, ваша музыкальная композиция Fantasia Apocalyptica. Вы даже построили свой дом вокруг двухэтажного органа. Это разнообразие тоже необходимо вам для счастья?
Д. К. Я написал пару книг на богословские темы, в том числе «То, о чём редко говорит учёный-компьютерщик» (Things a Computer Scientist Rarely Talks About). Эти книги о том, что невозможно доказать, а не о проблемах математики или информатики. Моя жизнь не была бы полной, если бы всё было ясным и понятным. Мистические вещи, которые я не могу объяснить, смиряют мою гордыню. Есть то, что за пределами моего понимания.
В математике я знаю, какая теорема — истинное утверждение. Мне нравится это. Но в моей жизни не было бы многих вещей, если бы всё было выполнимо. Знание об этом не угнетает меня. Напротив, оно помогает мне не погрязнуть в рутине.
Насколько важно для вас завершить «Искусство программирования»?
Д. К. О, я понимаю, что информатика будет и дальше жить и развиваться. Вот один из сценариев: вместо нынешних компьютеров будут использоваться квантовые и всюду воцарится машинное обучение. Тогда я мог бы закончить рассказ об истории неквантовых компьютеров. Я становлюсь ещё более счастливым, когда могу сказать: «Вот и конец истории». Это самый простой способ представить, в каких условиях я закончу своё главное произведение. Но это не ответ на ваш вопрос.
Вы знаете историю Тристрама Шенди? Во второй половине XVIII века Лоренс Стерн (Laurence Sterne) написал автобиографическую книгу «Жизнь и мнения Тристрама Шенди, джентльмена», которую он публиковал порциями, или частями. В этой книге почти 100 страниц ушло лишь на то, чтобы закончить описание первой недели жизни главного героя. Автор явно хотел сделать историю жизни полной, но это, конечно, невыполнимо. Стерн писал историю Тристрама Шенди до тех пор, пока мог писать.
Я хочу и дальше писать хорошие рассказы в самой лучшей, с моей точки зрения, манере и освещать вещи, о которых могу сказать что-то оригинальное. Вместо того, чтобы установить какой-то срок завершения своей работы, скажу так: я сделаю столько, сколько смогу. Мне здорово повезло, что меня несли волны информатики и что я родился в то время, которое оказалось наиболее подходящим для развития моих уникальных особенностей. Если не учитывать «Искусство программирования», я осуществил все главные цели своей жизни. И сейчас дело обстоит так: я и впредь буду рассказывать разные истории, чтобы поделиться ими с читателями.