\chapter{Пользовательский интерфейс}\label{GUI}

Как сказано в нашем определении ОС, операционная система должна
предоставлять пользовательский интерфейс. Как минимум она должна
предоставлять \termin{командную оболочку}{shell}, которая дает
пользователю возможность тем или иным способом запустить его прикладную
программу. Однако в некоторых случаях, например, во встраиваемых
контроллерах и других специализированных приложениях, такая оболочка может
отсутствовать. При этом либо система вообще функционирует без вмешательства
человека, либо пользователь работает только с одной прикладной программой.

Кроме того, ОС часто предоставляют средства -- разделяемые библиотеки,
серверы и т.д. для реализации графического пользовательского интерфейса
прикладными программами. Часто оказывается сложно провести границу между
ядром ОС и этими средствами, особенно если стандартная оболочка ОС
реализована с их использованием. В некоторых системах, например в
\sysname{MS Windows 3.x} и \sysname{MacOS}, практически все ядро состоит
из средств реализации графического интерфейса.

В настоящее время оформилось два принципиально различных подхода
к организации пользовательского интерфейса. Первый, исторически более
ранний подход состоит в предоставлении пользователю командного языка,
в котором запуск программ оформлен в виде отдельных команд.
Этот подход известен как \termint{интерфейс командной строки}%
{Command Line Interface}{CLI}.

Альтернативный подход состоит в символическом
изображении доступных действий в виде картинок -- \term{икон}{icons} на
экране и предоставлении пользователю возможности выбирать действия
при помощи мыши или другого координатного устройства ввода.
Этот подход известен как \termint{графический пользовательский интерфейс}%
{Graphical User Interface}{GUI}. Мы в дальнейшем будем использовать
английские аббревиатуры, потому что писать полное название долго,
русскоязычные аббревиатуры-кальки очень уж неблагозвучны, а выдумать
короткий, корректный и благозвучный русскоязычный термин мы -- скажем
честно -- слабы.

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

\section{Аргументы в пользу CLI}\label{CLI_advocacy}

Язык представляет одно из величайших достижений человечества. Многие
ученые и философы обоснованно считают, что именно язык определяет границу,
по которой проходит граница между человеком и животным.
По современным представлениям, человеческий мозг содержит врожденные
структуры, облегчающие понимание текстов на естественных и искусственных
языках и генерацию таких текстов.

В свою очередь, компьютер, во всяком случае универсальный неймановский
компьютер, представляет собой языковую машину: устройство, которое
исполняет последовательность предложений некоторого формализованного языка.

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

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

Удачно спроектированные искусственные языки удобны и для компьютера:
интерпретаторы полнофункциональных командных языков обходятся десятками,
в худшем случае сотнями килобайт оперативной памяти и обеспечивают очень
высокую скорость и эффективность использования ресурсов системы.
Поэтому синтетический язык как средство человеко-машинного общения
является наилучшим и наиболее естественным выбором для обеих сторон.

Командные языки позволяют естественным образом перейти к написанию
командных файлов или \termin{скриптов}{scripts}, позволяющих
автоматизировать часто исполняемые задачи. Трудно провести границу
между написанием скриптов и программированием; можно даже сказать,
что написание скриптов и даже просто интерактивное использование
командного языка и есть частный случай программирования. Но ведь
смысл компьютера и состоит в том, что это универсальная программируемая
машина!

Современные интерактивные командные процессоры решают практически
все проблемы командных языков предыдущих поколений.
\begin{itemize}
\item Исправление опечаток в командах и набор последовательностей
одинаковых или похожих команд осуществляется с использованием
средств вспоминания ранее набранных строк -- \term{<<истории>>}.
Современные командные процессоры обеспечивают гибкие средства
поиска команд в историческом списке, их редактирования, повторного
использования отдельных частей этих команд и т.д.

\item Набор длинных имен файлов, каталогов и других объектов
облегчается автоматическим расширением имен. Это средство, реализованное
во многих командных процессорах ОС семейства \sysname{Unix}
и программах типа \progname{4DOS/4OS2/4NT}, позволяет, набрав первые
несколько символов имени, расширить это имя до полного или получить
список всех имен, начинающихся с данной последовательности букв.

\item Неудобные, плохо запоминаемые или почему-либо не устраивающие
пользователя команды могут быть переименованы с использованием
\termin{синонимов}{aliases}. Этот же механизм может быть использован
для сокращения часто исполняемых сложных команд.
\end{itemize}

Важными преимуществом хороших командных языков по сравнению с GUI
является их алгоритмическая полнота: в GUI пользователь ограничен теми
возможностями, для которых разработчик программы нарисовал иконки или
сочинил пункты в меню. Командные же языки могут использоваться для
решения любых алгоритмизуемых задач, в том числе и таких,
о которых разработчики языка никогда и не задумывались.

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

\section{Аргументы в пользу GUI}\label{GUI_advocacy}

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

{\small Любопытно, что большинство женщин, впервые севших за компьютер
задают один и тот же вопрос: <<А на что тут нажимать?>>.
Встречный вопрос: <<А чего, собственно, вы хотите получить?>>
обычно повергает их в еще большую растерянность.
}

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

В некоторых случаях излишнее богатство вариантов
может просто запутать пользователя. Не нужно забывать, что человек
способен одновременно оперировать лишь довольно ограниченным количеством
объектов и параметров; по современным представлениям для человека и
большинства теплокровных животных это количество ограничено 6 - 7 объектами.

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

Утверждение о том, что GUI ограничивает возможности пользователя заранее
предопределенными возможностями просто не соответствует действительности:
хорошо продуманные интерфейсы обеспечивают почти такую же гибкость в
комбинации операций, как и командные языки. Возможность же записывать
и вновь проигрывать последовательности действий во многих ситуациях
может отлично заменить командные файлы.

Относительно высокие накладные расходы, неразрывно связанные с
графическими интерфейсами, не являются таким уж большим злом.
Современные цены на аппаратуру достаточно низки для того, чтобы
б\'{о}льшая эффективность изучения и использования графической системы
быстро себя окуп\'{а}ла. Кроме того, многие современные настольные системы
используются для приложений, которые сами по себе требуют
высококачественной графики и большой вычислительной мощности:
САПР, полиграфические работы, синтез и обработка видеоданных и т.д.
На фоне потребностей таких приложений накладные расходы, связанные с
графическим интерфейсом, оказываются просто не стоящими упоминания.

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

\section{Попытка сделать выводы}

Изложив, в соответствии с правилами диалектики, тезис и антитезис,
попробуем перейти к синтезу. Излагая аргументы сторон, мы намеренно
выпустили ряд убийственных доводов типа таких:
<<Вы, сторонники CLI, хотите всех нас вернуть в каменный век и заставить
пользоваться перфокартами>> или <<разработайте систему, которой сможет
пользоваться даже идиот -- и только идиот захочет ей пользоваться>>.

Если попытаться непредвзято сравнить доводы, становится видно, что
основное противоречие состоит во взглядах на сложность изучения
командного языка: сторонники CLI считают его простым делом, в то
время как для сторонников GUI это едва ли не основное препятствие
к использованию компьютера\footnote{По наблюдениям авторов,
программистам и сторонникам командной строки легче среднего дается изучение
иностранных языков. Мы не можем сказать, что здесь является причиной,
а что -- следствием.}.

Возможно, такое различие свидетельствует о том, что разные
категории пользовательских интерфейсов предпочтительны для людей
с разным складом мышления. Например, можно предположить, что
командные интерфейсы удобнее для людей с логическим складом
мышления, а графические -- с образным. Отчасти это подтверждается тем,
что ориентированные на GUI компьютеры \machname{Macintosh}
в основном используются художниками, дизайнерами и другими
представителями <<образных>> творческих профессий.

К сожалению, большинство открытых исследований психологических аспектов
человеко-машинного взаимодействия либо до ужаса непрофессиональны, либо
финансируются фирмами, продающими программное обеспечение.
Такие <<исследования>> обычно лишь подтверждают, что продукт фирмы
\entname{X} на 50 \% быстрее при исполнении <<типичных>>, что бы под
этим ни подразумевалось, задач, чем продукт конкурирующей фирмы \entname{Y}.

Авторы не располагают ни ресурсами, ни квалификацией, необходимыми
для проведения объективного независимого исследования, однако есть
основания утверждать, что командные и графические интерфейсы
оптимальны в разных ситуациях и для разных целей. Командный интерфейс хорош,
когда пользователь ясно представляет себе, чего он хочет, а особенно
для автоматизации регулярно исполняемых рутинных задач. Графические
же интерфейсы удобнее при решении нечетко сформулированных или
плохо алгоритмизуемых проблем.

Поэтому хорошая система должна предоставлять {\it оба} интерфейса.
Например, разработчики фирмы \entname{Apple} долгое время пытались
избежать включения в систему командного интерпретатора но в конце концов
под давлением пользователей и особенно специалистов по технической
поддержке они были вынуждены реализовать командный язык
\progname{AppleScript}.

В свете этого представляется, что утверждения, которые часто приходится
слышать в спорах между сторонниками различных категорий интерфейсов --
<<CLI безнадежно устарели>> с одной стороны и <<GUI никому не нужны
и вообще это пустая трата машинных ресурсов>> с другой -- свидетельствуют
либо о чрезмерном накале спора, либо о том, что говорящий не представляет
себе всей ситуации или попросту глуп. Впрочем, если такая фраза произносится
в беседе между продавцом и покупателем, это может свидетельствовать
об остром желании продать именно свой продукт или, напротив, о желании
опорочить систему, предлагаемую конкурентами.
