Шрифт:
Интервал:
Закладка:
Конечно, программа может быть «хорошей» в различном смысле. В первую очередь очень хорошо иметь программу, которая правильно работает. Во-вторых, часто бывает полезно иметь программу, которую было бы нетрудно изменить, если наступила пора адаптировать ее. Обе эти цели достигаются, если человек, знающий соответствующий язык, легко читает и понимает эту программу.
Другой важный способ создавать хорошие программы – дать им возможность элегантно взаимодействовать с пользователями, особенно при исправлении ошибок во входных данных. Это настоящее искусство – сочинять содержательные сообщения об ошибках или разрабатывать гибкие форматы ввода, не подверженные ошибкам.
Ещё один важный аспект качества программ – это эффективность использования ресурсов компьютера. К сожалению, я должен сказать, что в наши дни многие программисты отрицают эффективность программ, утверждая, что это признак плохого вкуса.
Причина этого заключается в том, что мы сейчас испытываем реакцию того времени, когда эффективность была единственным общепризнанным критерием качества и программисты были настолько озабочены эффективностью, что они производили неоправданно сложные коды. Результатом этой излишней сложности было снижение общей эффективности за счет трудностей отладки и эксплуатации.
Настоящая проблема заключалась в том, что программисты тратили слишком много времени в заботах об эффективности в неподходящих местах и в неуместное время.
Преждевременная оптимизация – это корень всех ошибок в программировании (или, по крайней мере, большинства).
Мы не должны быть на пенни мудрыми и на фунт глупыми, мы не должны всегда думать об эффективности в том смысле, сколько процентов времени или пространства мы выиграли или потеряли. Когда мы покупаем автомобиль, то многие из нас не обращают внимания на разницу в 50 или 100 долларов в его цене. Но в то же время мы способны сделать специальный рейс к определенному магазину, чтобы купить какую-нибудь мелочь стоимостью 50 центов всего лишь за 25 центов.
Я считаю, что для эффективности есть время и место. Истинную роль эффективности я рассматриваю в своей статье о структурном программировании, которая выходит в текущем номере журнала «Computing Surveys».
Меньше возможностей – больше удовольствия
Одна довольно любопытная вещь, которую я заметил относительно эстетического удовлетворения, заключается в том, что наше удовольствие значительно увеличивается тогда, когда мы создаем что-либо при ограниченных средствах труда. Например, программа, которая мне лично доставила больше всего удовольствия и гордости, – это компилятор, который я когда-то написал для примитивной мини-машины, имевшей запоминающее устройство ёмкостью 4096 16-разрядных слов. Человек чувствует себя настоящим виртуозом, когда он достигает чего-то в условиях серьёзных ограничений.
Подобное явление имеет место во многих других сферах. Например, часто люди кажутся влюбленными в свои «Фольксвагены», но редко в свои Линкольны «Continental» (которые, по-видимому, гораздо лучше). Когда я изучал программирование, было популярным развлечением сделать с программой всё возможное, чтобы уместить её на одной перфокарте. Я полагаю, что это как раз то самое явление, которое заставляет энтузиастов APL наслаждаться своими «one-liners» («программа в одной строке»). Когда мы сегодня учим программированию, то наблюдаем любопытный факт: нам редко удается увлечь студента вычислительной наукой до тех пор, пока он не проходит курс, который позволяет поработать с мини-машиной. Использование наших больших вычислительных машин с их удивительными операционными системами и языками не вызывает особой любви к программированию, по крайней мере поначалу.
Не совсем понятно, каким образом применить этот принцип, чтобы программисты получали большее удовольствие от своей работы. Конечно, программисты застонали бы, если бы их менеджер объявил неожиданно, что у новой машины объём запоминающего устройства в два раза меньше, чем у старой. И я не думаю, что кто-нибудь, даже из самых преданных «программистов-художников», приветствовал бы такую новость, так как никому не хочется терять имеющиеся возможности. Другой пример может помочь прояснить ситуацию: кинорежиссёры очень сильно сопротивлялись введению звукового кино в 20-х годах, так как они гордились тем, что могли передавать содержание без звука. Точно так же истинный программист-художник мог бы негодовать по поводу введения более мощной техники. Так, современные запоминающие устройства имеют тенденцию разрушить красоту наших старых методов сортировки на магнитных лентах. Однако сегодняшние режиссеры не хотят возвращаться к немым фильмам. И не потому, что они ленивы, а потому, что они знают, что можно создать прекрасные фильмы, используя новую технологию. Форма искусства изменилась, но вместе с тем появилась масса новых художественных средств. Как же они развивали своё искусство?
Лучшие кинорежиссеры овладевали своим искусством в сравнительно примитивных условиях, часто в странах с отсталой кинопромышленностью.
И в последние годы кажется, что большинство важных вещей, которые мы узнаем о программировании, исходят от людей, которые не имели доступа к очень мощным машинам. Мораль, как мне кажется, заключается в том, что мы должны использовать идею ограниченных ресурсов для нашего собственного усовершенствования. Мы можем добиться больших успехов путём составления различных «игровых» программ при заданных искусственных ограничениях, так чтобы нужно было выжимать свои способности до предела. Мы не должны жить всё время в роскоши, так как это ведет к апатии. Искусство решать с максимальной энергией мини-проблемы разовьёт наши способности для решения настоящих больших задач, и опыт поможет нам получать больше удовольствия от работы при ограниченных возможностях. Точно так же мы не должны отказываться от «искусства ради искусства»; мы не должны стыдиться программ, которые служат только «для развлечения». Я однажды получил огромное удовольствие от составления АЛГОЛ-программы, которая реализовала процедуру скалярного произведения таким необычным способом, что вместо скалярного произведения она вычисляла m-е простое число. Несколько лет назад студенты Стэнфорда были взволнованы составлением самой короткой FORTRAN-программы, которая печатает сама себя в том смысле, что выходная информация идентична её собственному исходному тексту. Та же самая задача рассматривалась для многих других языков. Я не думаю, что работа над этим была пустой тратой времени. Бентам не отрицал бы «полезности» такого приятного времяпрепровождения. Он писал: «Напротив, нет ничего, полезность которого является более неоспоримой. Чему же приписать характер полезности, если не тому, что является источником удовольствия?»
Создание прекрасных инструментов
Другим свойством современного искусства является акцент на творческие способности. Мне кажется, что сейчас многие художники не заботятся о создании прекрасных произведений; только новизна идеи имеет значение. Я не рекомендую, чтобы программирование было подобно современному искусству в этом смысле, но это приводит меня к наблюдению, которое я считаю важным. Иногда мы должны программировать безнадежно скучную, бестолковую задачу, не дающую нам никакого выхода, не говоря о каком-то творчестве. И в таких случаях человек вполне может прийти ко мне и сказать: