Сейбел: Когда вы научились программировать?
Кнут: Во время учебы на первом курсе в Технологическом институте Кейса. Осенью 1956 года - в течение четверти или семестра - в институте появился компьютер.
Сейбел: IBM 650?
Кнут: Да, это была модель 650. Первая модель, которую IBM выпустила партией больше 100 штук. Наверное, количество проданных компьютеров тогда исчислялось тысячами, вряд ли десятками тысяч. Так или иначе, это был первый компьютер массового производства - и он появился даже в институте Кейса.
Я работал тогда в лаборатории статистики и занимался там сортировкой карт. Я сводил статистические данные в таблицы, зарабатывая этим хоть какую-то прибавку к стипендии. В окне первого этажа был виден стоящий в кабинете компьютер с мигающими лампочками. Зрелище завораживало.
Как-то раз один сотрудник лаборатории, встав к доске, объяснил мне и еще паре моих друзей- первокурсников, как работает эта машина. Я нашел руководство пользователя для этого компьютера - в нем были примеры программ строк по десять. Мне они показались глуповатыми - видимо, даже эти небольшие программки можно было улучшить.
Позже выяснилось, что ночью можно пойти и поработать на компьютере. Это было необычно. Думаю, только в университете Дартмута и Кей-совском институте первокурсникам позволялось дотрагиваться до компьютеров. В других университетах были профессиональные операторы, которым приносишь пачку перфокарт и на утро получаешь у них ответ. Но в Кейсе нас подпускали к компьютерам. Только предупреждали: “Смотри, осторожнее вот с этим; не нужно делать вот этого — в компьютере от этого произойдет сбой”. В общем, нам выпал прекрасный шанс поработать с этим компьютером.
Так или иначе, я проверил, сработает ли одна из моих небольших поправок к одной из программ - и она сработала. Я подумал: “Боже мой, это поразительно. Я всего лишь первокурсник, а у меня уже получается лучше, чем написано в этой книге, - наверное, у меня к этому талант”. В итоге оказалось, что у меня действительно к этому были способности, но не в том смысле, в каком я думал, ведь ту конкретную программу практически кто угодно мог написать лучше, чем в том конкретном руководстве.
Это была десятичная машина, поэтому работать было проще, ведь мне не пришлось учить двоичную арифметику, хотя в старших классах я в принципе немного занимался ею. Тем не менее из-за того что машина была десятичной, работать на ней было немного проще, удобнее. До сих пор помню тот машинный язык, например
Сейбел: Ого, кажется, вы только что выдали свой секрет.
Кнут: Да, точно. Затем я решил написать небольшую программу для разложения числа на простые множители. В программе было около 100 строк. Я приходил по ночам, когда машина была не занята, и занимался отладкой. В моей 100-строчной программе я нашел больше 100 ошибок. Но две недели спустя у меня была готова программа, с помощью которой можно было вычислить простые множители любого десятизначного числа, набранного с помощью переключателей консоли.
Так я и учился программировать - брал собственную программу и сидел за компьютером неделями, пытаясь сделать ее чуточку лучше.
Моя вторая программа переводила двоичный код в десятичный. А третьей была программа для игры в крестики-нолики - именно после нее я стал настоящим программистом.
Тогда мне пришлось использовать структуры данных. Я сделал три версии игры в крестики-нолики, одна из которых была основана на самообучении программы: она начинала играть, ничего не зная об игре, и затем запоминала после каждого проигрыша свои ходы как сомнительные, а ходы соперника как удачные, а после этого соответственно повышала рейтинг одних позиций и уменьшала рейтинг других. После 400 игр она была уже достаточно приемлемым игроком в крестики-нолики.
Сейбел: Похоже, многие из тех, с кем я беседовал, имели непосредственный доступ к компьютерам в самом начале своей карьеры. Тем не менее у Дейкстры есть работа - уверен, вы с ней знакомы, - в которой он прямо говорит, что студентов компьютерных специальностей первые несколько лет обучения не следует допускать к работе за компьютером - все это время они должны учиться работать с символами.
Кнут: Но он и сам так не учился. Он высказывал очень много правильных и прекрасных мыслей, но не всегда был прав. Как и я. Моя позиция по этому поводу такова. Допустим, есть некий ученый - в любой области науки. Становясь старше, этот ученый думает: “Да, что-то из того, что я делал, оказалось действительно полезно, а что-то я уже не использую. Моим студентам не стоит тратить время на какие-то неглобальные вещи. Я вообще не буду с ними обсуждать никакие частные и низкоуровневые задачи. Теоретические понятия - вот что действительно важно и необходимо. Да, и забудем о том, как я до всего этого дошел сам”.
Думаю, это фундаментальная ошибка ученых в любой области науки. Они не понимают, что когда чему-то учишься, ты должен видеть это что-то на всех возможных уровнях. Нужно увидеть пол, прежде чем приступать к работе над потолком. Все это в голове переплетается и настолько смешивается, что ученые в возрасте забывают о том, что эти вещи им действительно нужны.
Сейбел: Всех, кого интервьюировал для этой книги, я спрашивал, насколько хорошо они знакомы с вашим трудом “Искусство программирования”. Многие ответили, что используют ее в качестве справочника, и лишь некоторые прочли этот труд от корки до корки. Обязан ли каждый программист понимать ваши книги? Ведь их математическая составляющая достаточно сложна.
Кнут: Иногда я сам не уверен, что понимаю их. Я пытаюсь изложить множество умных мыслей по поводу темы того или иного раздела - я нахожу их в различных источниках, где они высказаны частично, и объединяю в некое целое, которое уже может быть использовано в дальнейшем, в котором история передана верно, где исправлены ошибки и двусмысленности, присутствовавшие в оригинале.
Взять, к примеру, главы, которые я пишу сейчас: работа начинается с обработки материала, взятого из математических журналов и написанного на собственном жаргоне, который большинство программистов, как мне кажется, даже и не подумают учить. Поэтому я пытаюсь адаптировать эти тексты до такой степени, чтобы хотя бы
Другими словами, любой вопрос, раскрытый в моей книге на пяти страницах, этими пятью страницами далеко не исчерпывается - его изучению можно посвятить всю жизнь, потому что компьютерные науки - действительно очень богатая область. Компьютерные науки вовсе не сводятся к ряду простых вещей. Если бы компьютерные науки действительно были очень просты и все свелось бы лишь к тому, чтобы сформулировать 50 правильных вещей и выучить их, тогда, да, тогда бы я сказал: “Да, каждый человек в мире должен знать эти 50 вещей - и должен знать их хорошенько”.
Но это не так. В моих книгах - тысячи страниц и тысячи примеров, которые я записываю и включаю в книги, для того чтобы не держать их все в голове. Мне приходится постоянно возвращаться к ним и изучать их заново. В моих книгах есть ответы ко всем заданиям, так как я знаю, что десять лет спустя я не буду помнить ничего о том, как делать ту или иную вещь, и мне придется потратить много времени на то, чтобы восстановить утраченные знания. Поэтому я оставляю для себя хотя бы минимальные подсказки на будущее.
Я постоянно разрываюсь между мыслью “Ну, это слишком сложно - не стоит об этом говорить совсем” и ощущением, что те, кто прочтет книгу, скажут: “Все, о чем вы пишете, очевидно. От ваших книг никакой пользы”. В любой отдельно взятый момент меня можно застать за спором с самим собой - выкинуть ли мне все или набрать еще материала, поскольку имеющегося недостаточно.
В итоге же все сводится к тому, что все по-настоящему интересное, что можно изложить на половине страницы моей книги, должно занимать полстраницы. Также должны быть включены все вещи, которые слишком хороши, чтобы их не включить. Я тут выяснил, что в раздел о двоичных диаграммах решений, который я только что написал, включено больше 260 заданий - по ходу дела у меня набиралось все больше и больше материала не для широкой аудитории. Не все из этих 260 заданий будут интересны абсолютно всем. Тем не менее я уверен, что многие оценят по достоинству каждое из этих заданий в