Лучшие кинорежиссеры овладевали своим искусством в сравнительно примитивных условиях, часто в странах с отсталой кинопромышленностью.
И в последние годы кажется, что большинство важных вещей, которые мы узнаем о программировании, исходят от людей, которые не имели доступа к очень мощным машинам. Мораль, как мне кажется, заключается в том, что мы должны использовать идею ограниченных ресурсов для нашего собственного усовершенствования. Мы можем добиться больших успехов путём составления различных «игровых» программ при заданных искусственных ограничениях, так чтобы нужно было выжимать свои способности до предела. Мы не должны жить всё время в роскоши, так как это ведет к апатии. Искусство решать с максимальной энергией мини-проблемы разовьёт наши способности для решения настоящих больших задач, и опыт поможет нам получать больше удовольствия от работы при ограниченных возможностях. Точно так же мы не должны отказываться от «искусства ради искусства»; мы не должны стыдиться программ, которые служат только «для развлечения». Я однажды получил огромное удовольствие от составления АЛГОЛ-программы, которая реализовала процедуру скалярного произведения таким необычным способом, что вместо скалярного произведения она вычисляла m-е простое число. Несколько лет назад студенты Стэнфорда были взволнованы составлением самой короткой FORTRAN-программы, которая печатает сама себя в том смысле, что выходная информация идентична её собственному исходному тексту. Та же самая задача рассматривалась для многих других языков. Я не думаю, что работа над этим была пустой тратой времени. Бентам не отрицал бы «полезности» такого приятного времяпрепровождения. Он писал: «Напротив, нет ничего, полезность которого является более неоспоримой. Чему же приписать характер полезности, если не тому, что является источником удовольствия?»
Другим свойством современного искусства является акцент на творческие способности. Мне кажется, что сейчас многие художники не заботятся о создании прекрасных произведений; только новизна идеи имеет значение. Я не рекомендую, чтобы программирование было подобно современному искусству в этом смысле, но это приводит меня к наблюдению, которое я считаю важным. Иногда мы должны программировать безнадежно скучную, бестолковую задачу, не дающую нам никакого выхода, не говоря о каком-то творчестве. И в таких случаях человек вполне может прийти ко мне и сказать: «Значит, программирование прекрасно? Вам, конечно, хорошо говорить, что я должен получать удовольствие, создавая элегантные, красивые программы, но почему Вы предполагаете, что я могу превратить этот мусор в произведение искусства?»
Да, это верно, не все задачи программирования кажутся приятными.
Подумайте о хозяйке в домашней «западне», которая должна каждый день убирать один и тот же стол: не всякая ситуация способствует творчеству или артистизму. Однако даже в таких случаях есть возможность улучшения: даже рутинная работа может доставлять удовольствие, если мы имеем дело с красивыми вещами. Например, человеку может быть приятно день за днем вытирать обеденный стол, если это красивый стол из какого-нибудь высококачественного твердого дерева.
Поэтому я хочу адресовать мои заключительные замечания системным программистам и разработчикам машин, которые создают те системы, с которыми мы должны работать.
Пожалуйста, дайте нам инструменты, которыми было бы приятно пользоваться, вместо таких, с которыми нам приходится бороться. Пожалуйста, дайте нам инструменты, которые стимулируют нас писать лучшие программы, увеличивая удовольствие, которое мы получаем при этом.
Разработчики компьютеров могут сделать использование машин гораздо более приятным, если они, например, организуют арифметику с плавающей точкой, которая удовлетворяет простым математическим правилам. Средства, имеющиеся сейчас на большинстве машин, делают задачу точного анализа погрешностей безнадежно трудной. В то же время соответствующим образом построенные операции могли бы помочь программисту создать хорошие подпрограммы, имеющие гарантированную точность.
Что может сделать разработчик софтвера? Один из лучших способов поддержать бодрость духа пользователя – обеспечить его программами, с которыми он может взаимодействовать. Мы не должны делать системы слишком автоматизированными, когда действие всегда происходит за сценой. Мы должны пользователю-программисту дать шанс направить свои творческие способности в соответствующие каналы. Есть одна особенность, общая для всех программистов: им приятно работать с машинами; так давайте держать их в цикле. Некоторые задачи лучше выполняет машина, другие могут быть лучше решены с помощью человеческой интуиции; хорошо разработанная система должна найти разумный баланс. (Я в течение многих лет пытался устранить излишнюю автоматизацию.)
Хорошим примером являются средства оценки программ. В течение многих лет программисты не имели представления о том, как в действительности стоимость вычислений распределена в их программах. Опыт показывает, что почти все программисты имеют смутное представление об узких местах в их программах; неудивительно, что попытки оценить эффективность так часто терпят неудачу: программист никогда не знает распределения стоимости по строкам написанного им кода. Его работа в чем-то напоминает молодоженов, которые пытаются построить сбалансированный бюджет, не зная цен на продукты, одежду и жильё. Всё, что мы давали программистам, – это оптимизирующий компилятор, который таинственным образом что-то делает с программами, которые он транслирует, но никогда не объясняет, что он делает. К счастью, сейчас мы, наконец, наблюдаем появление систем, которые позволяют пользователю поверить в их разумность. Они автоматически анализируют программы и выдают информацию о реальной стоимости. Эти экспериментальные системы – большой успех, поскольку они позволяют оценить усовершенствование программы, и особенно потому, что с ними приятно работать. Таким образом, я уверен, что со временем использование таких систем станет стандартной процедурой. В моей статье в Computing Surveys[69]этот вопрос рассматривается подробнее. В этой статье высказываются также другие идеи, которые могут способствовать удовлетворению программистов.
Долг разработчиков языков – создавать такие языки, которые стимулируют хороший стиль, поскольку мы знаем, что стиль в значительной степени зависит от используемого языка.
Нынешний подъём интереса к структурному программированию показывает, что никакой из наших существующих языков не является идеальным для работы с программами и данными, и вообще не ясно, каким должен быть идеальный язык. Поэтому я надеюсь в ближайшие годы увидеть множество серьёзных экспериментов в области разработки языков.
Мы видели, что программирование – это искусство, потому что в нем применяются накопленные в мире знания, потому что оно требует умения и изобретательности, и особенно потому, что оно создает прекрасное. Программист, который подсознательно чувствует себя художником, будет наслаждаться тем, что он делает, и будет делать это всё лучше. Поэтому мы можем радоваться, что люди, которые выступают на конференциях по вычислительным машинам, говорят о State of the Art.