Категория: Open Source


Я только что закончил разбирать свой опыт настройки CUPS, Common Unix Printing System. Он явил собой образцовое объяснение того, почему неспециалисты в ужасе бегут от Unix. И, что более поразительно, разработчики CUPS вполне очевидно старались создать доступную систему, - но их лучшие намерения и усилия вылились в систему, которая, несмотря на внешнюю псевдо-дружественность, настолько непостижима, что с тем же успехом могла бы быть написана на санскрите.

Визуальных инструментов и многотомных руководств недостаточно. Нужно думать о том, что испытывает конкретный пользователь, собираясь выполнить конкретную задачу, и думать об этом нужно с точки зрения пользователя. Создатели CUPS, несмотря на доброту намерений, позорно провалили эту задачу. Я собираюсь детально рассмотреть произошедшее, потому что из него можно извлечь уроки, которые очень не помешали бы другим опен-сорсным проектам. Задача, то есть, не в том, чтобы поиздеваться над создателями CUPS, а в том, чтобы поиздеваться над каждым опен-сорсным дизайнером, который творит вещи того же уровня бессмысленности, будучи в крепких объятиях заблуждения, что глянцеватый интерфейс - это хорошо спроектированный интерфейс. Смотрите и учитесь…


Суть проблемы проста. У меня есть компьютер под именем 'snark'. Он через домашнюю локальную сеть подключён к компьютеру моей жены Кэти, названному 'minx'. К последнему через параллельный порт подключен LaserJet 6MP. На обоих машинах запущена Fedora Core 1, и Кэти может печатать со своего minx. Я могу подсоединиться к нему через ssh, так что с сетью всё точно в порядке. Раз плюнуть, верно? *могильный хохот* Распространённые последние слова…

Прежде всего я сделал то, что сделал бы любой неспециалист. В меню рабочего стола я выбрал System Settings->Printing и ввёл рутовый пароль в появившемся окне. Диалог "Настройка принтера". "Добавить". Появившийся мастер был озаглавлен "Добавление новой очереди печати", большими приятными буквами. Что ж, пока непл.хо. "Далее".

Те из вас, кто близко знаком с CUPS, знают, что я уже допустил принципиальную ошибку. Мне вообще не следовало пытаться создать новую очередь печати на snark и потом связать её с сервером на minx. Чтобы передавать задания на печать на minx, надо посмотреть в мастере настройки, обнаружить там очередь печати с minx и прописать её по умолчанию snark’у. Но нигде в мастере настройки на это нет даже намёка! А очередь печати с minx не обнаруживается по причине, которую мы узнаем чуть дальше по ходу этой грустной истории.

Новое окно, "Имя очереди" (столь же большими приятными буквами) . По умолчанию предлагается "printer". Меняю на "laserjet", потому что позже могу захотеть прицепить древний матричный агрегат, который у меня всё ещё есть. Ввожу короткое необязательное примечание: "the laser printer". Пока всё непл.хо. Тётушка Тилли отлично справилась бы. "Далее"…

Новое окно. "Вид очереди", говорит нам оно. Выпадающий список. По умолчанию выбрано "присоединён локально", что здраво. Клик по списку, и я созерцаю варианты:

Networked CUPS (IPP)
Networked Unix (LPD)
Networked Windows (SMB)
Networked Novell (NCP)
Networked JetDirect

Первый намёк на неприятности. Если бы я был тётушкой Тилли, исконным нетехническим пользователем, я бы в этот момент думал "Что, ради всего святого, это всё означает? И, что не менее важно, почему я должна отвечать на этот вопрос? ". У меня, в конце концов, нет windows-машин в сети. Как и Netware. И уж определённо у меня нет "Networked JetDirect", что бы это ни означало.

Если бы дизайнеры хотя бы наполовину знали толк в вопросах пользовательского интерфейса (как, скажем, программисты Windows), они бы опросили сетевое окружение и убрали бы недопустимые варианты. Если бы они знали толк полностью (как, скажем, программисты Mac), они бы оставили недопустимые варианты, но пометили бы их серым, давая понять, что если настроить систему чуть иначе, то можно будет печатать и на Windows-машинах, если уж вам не посчастливится заиметь парочку.

Но нет. Вместо этого к тётушке Тилли медленно приходит мысль о том, что эта программа написана воинствующими компьютерными фанатиками.

Но подождите! Стойте! Аллилуйя! Здесь есть кнопка помощи! Кликаем. Появляется чудесная глянцевая страница онлайновой документации. Но вместо ответа на терзающий меня вопрос "Как выбрать правильный тип очереди", эта страница освещает добавление локального принтера. Да, она про выбранный по умолчанию тип очереди, а не про операцию выбора очереди. Помощь явно… беспомощная.

Тётушка Тилли на данный момент либо решает покорно предать себя очередному сеансу пыток скудным выбором, предоставленным ей исполненными благими намерениями идиотами, либо приходит к мысли о необходимости вышвырнуть этот Linux и вернуться к старому Windows. Там частенько синие экраны, но по крайней мере там ей дозволена роскошь неведения – ей не нужно ни знать, ни думать о том, что такое JetDirect или CUPS.

Я не несведущ, но и у меня есть собственный эквивалент проблемы тётушки Тилли. Я знаю, что мне нужен один из двух верхних вариантов, но я не знаю, какой именно. И я не хочу ни знать, ни думать о разнице между ними; у меня есть лучшее применение своему мозгу, чем захламление его тонкостями сисадминства. Если можно определить, что оба варианта допустимы в локальной сети (а это должно быть несложно, порты известны), следует поместить "(рекомендуется)" около одного из них, чтобы можно было его выбрать и продолжить.

Но нееееет. Я должен пялиться в экран и думать: "Где бы найти руководство, и почему всё это заняло уже такую кучу времени?". Применив своё грозное хакер-джитсу, я кликнул "Предыдущая". Получаем страницу о настройке принтера, где описываются типы очередей, но всё ещё не объясняется, как выбрать между CUPS и LPD.

Очевидно, разработчикам CUPS никогда не приходило в голову, что это может быть проблемой, для тётушки ли Тилли или для кого попродвинутей. Рядом с "Выберите тип очереди" нет большой приятной кнопки "Как выбрать тип очереди". Камень преткновения, превращающий внешне нарядный пользовательский интерфейс в насмешку и издевательство.

Вновь применив своё грозное хакер-джитсу, я наугад выбираю "CUPS (IPP)". Появившееся окно превращает пользовательский интерфейс из насмешки в нечто худшее. Два текстовых поля. Одно называется "Сервер" и не содержит ничего. Другое - "Путь:", и в нём строка "/printers/queue1".

Если бы тётушка Тилли всё ещё была с нами, она в этот момент сказала бы что-нибудь не подобающее даме. И имела бы полное право, потому что это вопиюще жёсткое приземление. Чтобы понять, почему, прекратите думать как хакер. Втисните своё сознание, если сможете, в образ мыслей несведущего пользователя. Кого-то, кто не только не знает смысл строки "/printers/queue1", но и не хочет знать, и даже не думает, что стоило бы.

С точки зрения тётушки Тилли, поле "Сервер" вполне может быть пустым, она же его не указывала, в конце концов. Но вот содержимое поля "Путь" не просто бесполезно, оно губительно – тётушка не знает, в чём его смысл, и не знает, как понять, было бы предложенное по умолчанию содержимое правильным, если бы она указала имя сервера. Полный тупик.

Что следовало бы представить тётушке Тилли на этой стадии, так это одну из двух вещей: либо список очередей печати CUPS, которые доступны в её сети, либо большое жирное сообщение "Не удаётся найти локальные очереди печати; возможно, необходимо настроить сервер печати". Запрос сервера и пути, представленный на самом деле, - непроходимая стена; она оставляет не только тётушку Тилли без малейшей догадки о том, что делать дальше, она столь же непроницаема для опытного хакера вроде меня.

Коренная проблема в том, что мастер настройки выполняет все общепринятые ритуалы (интерфейс со стандартизированными приятными кнопочками, отображение справки в браузере, и т.д. и т.п.), но не имеет того главного, для чего всё это делается: понятности. То есть, чтобы каждая шаг сопровождался запросами и действиями, из которых можно понять, что делать дальше. А ваш проект этим обладает?

Вообще, диалог "Тип очереди" изначально порочен – он ведёт вас прямо в тупик попыток настроить локальную очередь печати и направить её на сервер, который точно печатает, вроде машины моей жены Кэти, и потом говорить нехорошие слова, потому что напечатать ничего не удаётся. Собственно, это со мной дальше и произошло.

Я ввёл "minx.thyrsus.com" в поле "Сервер", предположив, что "/printers/queue1" вполне может быть допустимым умолчанием, которое используют другие запущенные экземпляры CUPS. Затем выбор производителя и модели, и подтверждение создания очереди. Мастер предложил напечатать пробную страницу, я согласился… и ничего не произошло. Вообще-то, это было хуже, чем ничего, диалог настройки сказал ‘Удалённый хост "minx.thyrsus.com" занят; автоматический повтор через 30 секунд’, после чего (судя по всему) завис.

Мы уже далеко в непроходимом болоте, порождённом бессмысленным и беспощадным дизайном интерфейса – такого графического, вылизанного и бесполезного. В этот самый момент я и решил, что хочу пораспространяться на эту тему, и начал делать заметки.

Диалог "Тип очереди" не дал мне ни намёка на присутствие, отсутствие или степень доступности каких бы то ни было очередей печати в моей сети. У меня дома ещё две машины, они подключены к сети, и на обоих запущено Fedora Core; и самым правильным было бы показать мне сообщение "Вижу демонов CUPS, запущенных на minx, golux и grelber, но очередей печати не обнаружено" со ссылкой на документацию CUPS.

Полученная же помощь вновь оказалась беспомощной. Страница "Сетевой принтер CUPS (IPP)" утверждала, что "Все обнаруженные сетевые IPP принтеры перечислены в главном окне в разделе "Обнаруженные очереди". Неужели? И какое же "главное окно" имеется в виду? И что я, собственно, должен делать, если я не вижу никакого раздела "Обнаруженные очереди", и, что особенно приятно, если это нормальная ситуация при новой установке?

И это ведь не ядерная физика. Проблема не в том, что правильные вещи трудно реализовать; в CUPS уже должна быть встроена возможность обнаруживать доступные очереди печати. Проблема в отношении разработчиков CUPS. Они никогда не выходили за пределы своих предположений. Они никогда не предпринимали умственного усилия, чтобы забыть о своих знаниях и влезть в шкуру глупого пользователя, который никогда прежде всего этого не видел, – и уж тем более они не видели этого пользователя в действии!

CUPS не одинок. Эта разновидность бесполезности встречается в стране опен-сорса на каждом шагу. И это то, благодаря чему Майкрософт всё ещё в деле, – ибо они могут писать позорное дырявое низкопробное программное обеспечение и драть за него в три дорога, но по одной только этой проблеме их бестолковые недоделанные вещи на порядок лучше, чем обычно получается у нас.

Но хватит пока разглагольствовать. Я расскажу вам о своих поисках путей выхода из этого тупика, ибо здесь тоже есть чему поучиться. Прежде всего я обратился к документации. В Unix-хакерском стиле, просматривая результаты поиска по "обнаружение принтеров" во всём из /usr/share/doc, что имело отношение к CUPS. Нашёл /usr/share/doc/cups-1.1.19/printers/index.html и натравил на него браузер. Тот перенаправился на http://localhost:631/, что нормально, хотя и прошло слишком быстро и незаметно.

И вот я смотрю на страницу, которая не была сразу очевидно полезной для решения моей проблемы. Я попробовал кликнуть на "Администрирование" в надежде, что появившаяся утилита будет более постижима, чем диалог настройки. У меня запросили пароль.

И чё? Как я должен догадаться, что с этим делать? Мне дозволено знать лишь, что требуется ввести "логин CUPS". Это то же, что логин root, или же есть какая особо замечательная сущность CUPS, о которой я обязан телепатически догадаться? Запрос на ввод пароля легко изменить; он мог бы предложить мне наводку и ссылку на документацию. Не предложил.

И снова, речь об отсутствии понятности. Этот запрос пароля, вместо того, чтобы быть путеводным камнем на пути дальнейшего понимания системы, стал ещё одним камнем преткновения.

Что ж, когда ничего не помогает, есть Google. Я поискал CUPS printing HOWTO" и нашёл ссылку на "The Linux Printing HOWTO" – который оказался 404, как только я проследовал по нему. Ну, скорее всего, разработчики CUPS здесь ни при чём; я упоминаю об этом случае только чтобы описать, что на тот момент я чувствовал себя так, словно меня крупно поимели. Отполированная непроницаемость CUPS, похоже, победила меня в том, что должно было быть тривиальной полуминутной задачей.

Но я не сдался. Следующий шаг – соединяюсь по ssh с minx и смотрю, нельзя ли узнать имя активной очереди CUPS. Возможно, думаю я, если ввести это имя в мастер настройки на snark, всё заработает. Не тут-то было. Две команды казались подходящими - lpinfo(8) и lpadmin, но получить список очередей печати нельзя ни той, ни другой. Вывод "lpinfo -v" выглядел полезным, но я понятия не имел, как вывести имена очередей из URL устройств.

Мы в прямом эфире. Я пишу эту тираду по мере попыток найти выход из этого лабиринта. Сейчас читаю Руководство системного администратора CUPS, которое утверждает, что "CUPS поддерживает автоматическую настройку клиентов печати в пределах одной подсети. Чтобы настроить принтеры в пределах одной подсети, не требуется делать ничего. Каждый клиент должен увидеть доступные принтеры в пределах 30 секунд автоматически. Списки принтеров и классов обновляются автоматически по мере добавления и удаления принтеров и серверов". Что ж, очень мило, но это беззаботно-самонадеянное описание не оставляет ни малейшего намёка на то, что делать, когда автоматическая настройка не работает!

Читаю руководство, нахожу ссылку на "BrowseAddress" и /etc/cups/cupsd.conf, которые начинают постепенно раскрывать мне тайну того, как работает автоматическая настройка. Похоже, что запущенные экземпляры CUPS периодически посылают широковещательные запросы с информацией о своём состоянии и доступных принтерах. Умно! Но… чёрт побери, широковещательные запросы выключены по умолчанию, и в документации об этом ни слова!

Итак, что мы имеем. Чтобы милое дружественное автоматическое конфигурирование заработало, нужно сначала отредактировать файл в /etc. На другой машине, не на той, которую вы настраиваете. Надо прочитать комментарии в конфигурационном файле и понять, что следует делать прежде всего.

Какой поистине чудесный, классический просчёт. То, что поддержка автоматической настройки отключена, можно понять, исходя из соображений безопасности. Но то, что об этом не написано в Руководстве администратора, и то, что при настройке пользователю не сообщают, что принтеры могут быть не видны, пока администратор не потанцует с бубном вокруг машины, к которой они подключены… это полнейший идиотизм.

Это именно из-за него у Linux такие проблемы с распространением среди нетехнических пользователей – и тем более непростительно, что всё это по уши увешано графической сладкой ватой, добавляющей сложности и не предоставляющей взамен ни йоты дружественности.

Я поместил широковещательный адрес моей сети в /etc/cups/cupsd.conf на minx. То, что документация к cupsd(8) не сообщает, перечитает ли CUPS этот файл после стандартного kill –HUP, удивления уже не вызвало, так как на тот момент я уже уверился в бесполезности документации. Я просто сделал /etc/init.d/cups restart.

Я пишу последний абзац, затем возвращаюсь к мастеру настройки. Пара небольших тычков заставляет его явить пункт Действие->Общий доступ. После "ОК" появляется "Обнаруженные очереди". О чудо! Похоже, snark теперь получает данные о конфигурации с minx. И правда, LaserJet 6 показывается в разделе устройств. Любопытно, однако, что он озаглавлен "lp0", без всякого упоминания о том, что он не на локальной машине.

Запускаю веб-интерфейс. И тот конечно находит LaserJet 6 на minx. Но не всё безоблачно. Попытка распечатать тестовую страницу выливается в "Запрос на соединение с minx.thyrsus.com:631 был отклонён".

Я вновь не удивлён узнать, что и пользовательское, и администраторское руководство хранят молчание о разрешении проблем с CUPS. От интерфейса lpr(1) помощи не дождаться вовек; посланные же со snark задания на печать словно исчезают в чёрной дыре.

В конце концов я замечаю команду Listen в файле /etc/cups/cupsd.conf. "Ага!", - говорю я себе, - "Может это как в sendmail, когда надо явно указать слушать адрес IP-сервера". Добавляю "Listen 192.168.1.21" (IP-адрес minx), перезапускаю cupsd… и о чудо – мои задания на печать выползают из принтера.

На что следует обратить здесь внимание – сколь далеко позади мы оставили тётушку Тилли. Первое правило написания программы для нетехнических пользователей гласит: если для её использования необходимо читать документацию, вы спроектировали её неверно. Интерфейс – вот вся документация, которая должна быть нужна. Нетехнического пользователя вы потеряли бы задолго до той точки, где даже хакеру, как я, пришлось неслабо поднапрячься.

В этом же случае, документация вяло, но уп#рн вводила в заблуждение в одних вещах и вредоносно умалчивала о других. В конце концов мне пришлось применить m4d skillz, полученные в борьбе с sendmail, чтобы решить проблему, на которую в документации к CUPS не было ни малейшего намёка.

Как уже говорил, смысл этого опуса не в издевательстве над разработчиками CUPS. Они не хуже, чем тысячи других, и вот в этом тот самый смысл. Мы рассуждаем о мировом господстве, но мы не будем ни обладать им, ни заслуживать его, пока не сумеем продвинуться в этом. Значительно продвинуться.

И ведь это не сложно же ничуть. Никакое из описанных изменений в поведении CUPS или его документации не было бы техническим вызовом; проблема в том, что эти простые вещи никогда не приходили на ум разработчикам, которые применяют огромное количество своих ранее полученных знаний каждый раз, когда смотрят на свой пользовательский интерфейс.

Так что, если вы там пописываете графические приложения под Linux, или BSD, или ещё под что, вот несколько вопросов, которые вам стоит задать себе:

1. Как выглядит моя программа для нетехнического пользователя, который никогда раньше её не видел?
2. Есть в ней какой-то диалог, после которого непонятно, что вообще делать дальше?
3. Требование, чтобы пользователь прочитал документацию, - знак того, что дизайн неудачен. Мой дизайн удачен?
4. В технических задачах, где документация нужна, освещает ли она ключевые моменты?
5. Принимаются ли отзывы от пользователей об удобстве работы, и есть ли реакция на них?
6. И, самое важное… позволяю ли я своим пользователям восхитительную роскошь неведения?

Источник