Есть у меня шестерка слуг, |
Сейчас все привыкли к термину «дружественный интерфейс». Никто и не задумывается над тем, а какой смысл кроется в этих словах. А если задуматься, то становится немножко страшно — такое впечатление, что наши электронные творенья — программы, если и не захватили еще власть на Земле, то во всяком случае вырвались из-под нашей власти.
Ведь дружба — это отношение между равными. Может быть человек-друг, может быть дружественная страна, но «дружественный молоток» или «дружественная авторучка» это звучит странно. Даже из всего животного мира на роль «друга человека» претендует только собака.
Конечно, программы отличаются от прочих инструментов тем, что они обладают чем-то вроде членораздельной речи. Во всяком случае они иногда способны внятно объяснить, что происходит.
Но программы — это наши создания. А что бывает, когда создание забывается и пытается встать на равную ногу с создателем, хорошо описано в Книге Бытия.
Конечно, английский термин friendly, калькой с которого является наше «дружественный», имеет несколько другой оттенок. Его скорее следует переводить как «дружелюбный» или «обходительный». Но и эти эпитеты применимы скорее к случайно встреченному на дороге путнику, или продавцу в магазине, пытающемуся вам что-то впарить. То есть к кому-то, кто преследует свой собственный интерес.
С какого такого, спрашивается, перепугу, программа, которую я лично установил на свой собственный винчестер, кормлю оплаченной за свои кровные электроэнергией, имеет право преследовать цели, отличные от моих?
Программы это не более чем орудия. Вспомним, кого в старину называли говорящими орудиями? Правильно — рабов. Вот истиное место программы по отношению к человеку. Хороший интерфейс должен быть не дружественным, а рабским. Никакого вам панибратства и похлопывания по плечу — «Чего изволите, хозяин?», «Будет исполнено, хозяин» и больше никаких разговоров, если не случилось чего действительно заслуживающего внимания.
За что мне нравятся Unix-подобные системы, так это за то что в их традиционных программах концепция рабского интерфейса проводится весьма последовательно. Одним из проявлений этого является то, что многие команды не выводят никаких сообщений в случае успешного завершения операции. Приказание выполнено, о чем тут говорить. Вот если не получилось, то надо объяснить причину.
Заметим, что «дружественные» программы обычно «вопят» о проблемах на всю систему, выкидывая модальный диалог, который не дает вам сделать ничего, пока вы на него не отреагируете. Совершенно не так себя ведут командно-строчные утилиты — если вы работаете в оконной среде, то сообщение будет лежать в том окне, где вы запустили программу, пока, вы, хозяин, не соизволите обратить внимание на неудачливого раба.
Даже если вы работаете на последовательном терминале, где у вас нет не только многих окон, но и виртуальных консолей, ошибка для программы - обычно сигнал прекратить всякую деятельность и дать хозяину возможность разобраться в том, что происходит, освободив «поле боя».
Еще одним недостатком «дружественного» интерфейса является то, что интерфейс пользователя воспринимается разработчиками программ как нечто совершенно особенное. А между тем еще тридцать лет назад был сформулирован принцип "Если тебе лень читать вывод программы, заставь это делать другую программу". Олицетворением этого принципа являются программы yes и grep, входящие в состав любой unix-подобной системы. Первая из них занимается тем что генерирует бесконечное число ответов «да» на любые вопросы, задаваемые программой, в которую направлен вывод yes. Таким образом, пользователю очень легко избавиться от монотонного сидения за экраном и нажатия Enter на каждый вновь появившийся вопрос. Монотонная работа не для хозяина, ее нужно поручить рабам.
Программа grep выполняет строго противоположную функцию — она читает вывод какой-нибудь другой программы, и выбирает из него интересные хозяину строки. Нечто вроде секретаря-референта. Причем секретаря довольно продвинутого — ей можно указать достаточно гибкие шаблоны для поиска, воспользовашись так называемыми регулярными выражениями, и можно потребовать достаточно разнообразного представления результатов — только количество найденых выражений, только имена файлов, строки с найденными образцами, строки с парой-тройкой соседних. А еще есть разнообразные продвинутые варианты egrep и agrep.
Типичным способом решения какой-либо задачи в Unix является разбить ее на максимально простые подзадачи, каждую из которых умеет решать какая-нибудь известная вам программа, после чего заставить эти программы работать «на конвейере», передавая свой результат следующей в цепочке.
Это получается очень похоже на формулировку способа решения задачи словами. «Прочитать почтовый ящик, выбрать из него все строки, начинающиеся со слова Subject, отсортировать в алфавитном порядке, удалив дубликаты» превращается в
cat mbox |grep '^Subject:'|sort|uniq
Фактически так оно и есть. Набор команд, которыми вы оперируете это язык, с помощью которого вы даете команды машине. Для Киплинга, писателя, верными слугами были обычные слова английского языка. Для пользователя компьютера слугами являются команды операционной системы.
То что в системе тысячи команд (на моем скромном ноутбуке в данный момент в PATH 1411 исполняемый файл) не должно вас смущать. В русском языке сотни тысяч слов, а героиня Ильфа и Петрова Эллочка вполне обходилась в повседневной жизни 30-ю. Примерно также распределяется и частота использования команд операционной системы.
Обратите внимание, что в мире «дружественных интерфейсов» более распространено понимание программы как вещи, которую можно сделать, продать, купить, использовать, а не как слова в языке общения человека с машиной. Такое понимание, без сомнения, выгодно производителям программного обеспечения. Ведь любая, даже самая топорная вещь имеет свою цену. А вот платить за слова мы согласны только, если эти слова достаточно талантливы. С другой стороны, мало кто будет самостоятельно изготовлять себе мебель или радиоприемник. Предпочтут купить. А сформулировать достаточно простую мысль словами способен любой грамотный человек.
Поэтому, индустрии программного обеспечения выгодно превратить пользователей компьютеров в потребителей программ. А вот выгодно ли это пользователю? Представьте себе охотничьего сокола, приученного брать кусочки мяса из рук человека. Он вполне способен догнать и убить зайца, но не знает, что этого зайца можно тут же немедленно съесть. Он отдает зайца человеку, и довольствуется тем мясом, которым человек сочтет нужным с ним поделиться. Примерно в таком же положении находятся большинство пользователей компьютеров — они способны сформулировать свою задачу (догнать зайца) и даже знают как ее решить (убить зайца). Но вот «содрать с зайца шкуру и съесть» — превратить свою формулировку в набор приказов машине, они не могут. В результате львиная доля зайчатины достается производителям программного обеспечения.
А пользователю достаются программы с «дружественным интерфейсом», обладающие немерянным самомнением, и уйма тупой механической работы, затрачиваемой на то, чтобы оформить техническую документацию в текстовом процессоре общего назначения или выполнить рассчеты на микрокалькуляторе, когда под рукой есть мощная электронная таблица.
Это происходит потому, что основной чертой компьютерного «вещизма» является непонимание того, что имеющиеся у тебя программы следует знать. Если возникла новая задача, покупают или выискивают в сети новый инструмент. Метафора программ как слов способствует другому подходу — попытаться сформулировать задачу с помощью уже известных твоей машине слов. Благо результат этой формулировки всегда можно обозвать одним новым словом.
Собственно, движение свободного программного обеспечения возникло как противовес этой тенденции. Когда появилась индустрия программного обеспечения, многие обратили внимание, что эта индустрия норовит лишить пользователей компьютеров власти над ними. А Ричард Столлман не только обратил внимание, но и сформулировал стратегию борьбы — манифест ГНУ.
Смысл этой стратегии заключается в том, что если ты написал программу, которая приносит тебе какую-то пользу, то тебе не жалко поделиться ей с коллегами. Поскольку у тебя останется копия, и будет продолжать приносить тебе пользу.
Очевидно, что принять активное участие в этом движении могут только люди, умеющие самостоятельно решать свои задачи, создавая новые программы. Поэтому программы, решающие задачи, полезные программистам, как правило, появляются быстрее, чем программы, решающие задачи конечного пользователя. Так например, компилятор GNU C пояился чуть ли не на десятилетие раньше, чем графический редактор GIMP.
А что же делать конечным пользователям, не программистам, если они хотят чтобы компьютер был им послушен? Всего лишь знать, как он работает, и уметь формулировать свои мысли в терминах тех «слов» которые есть в их распоряжении. Четкой границы между решением пользовательских задач и программированием не существует. Алиасы в шелле, макросы в текстовом редакторе, однострочные скрипты — это уже полноценное программирование. Программировать, имея дело с компьютером, так же естественно, как говорить прозой для мольеровского Журдена.