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