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