Михаил Бузиниер,
misha@mail.dnttm.rssi.ru
Сергей Трифонов,
trifon@mail.dnttm.rssi.ru

Идеалы недостижимы...
Грубая реальность
К чему приводит математическая стройность
Комфорт обывателя - залог успеха
Инженерные решения
Где же правда?

Среди пользователей компьютеров, а тем более в среде компьютерных "профессионалов" не стихают споры о том, какая машина, какой текстовый процессор, какая бухгалтерская система лучше. Машины и программы устаревают, уходят в историю, а споры продолжаются на новом материале. Характерная черта сегодняшнего дня - объединение всего комплекса программного обеспечения в единую операционную среду, и споры приобрели новую форму: какая операционная среда самая лучшая? Конкурентов осталось не так много, и от того, к какому заключению придет большинство людей, зависит судьба крупнейших мировых корпораций, а, может быть, и пути развития цивилизации. Впрочем, с нашей точки зрения, абсолютного победителя тут быть не может.

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

Видно, что одно только, далеко неполное, перечисление задач, которые должна решать современная операционная среда, занимает целый абзац. Подробное их описание, займет отдельную книгу. Такие книги действительно имеются, и желающие могут попробовать их почитать. Скорее всего, единственным впечатлением будет громоздкость и необъятность материала. Мы не хотим обсуждать все эти проблемы; вместо этого давайте попробуем ответить на более общий вопрос: почему до сих пор нет операционной среды, которая удовлетворила если не всех пользователей, то хотя-бы большинство? И почему наиболее популярная у пользователей среда безумно раздражает профессионалов.

В общем-то, ответ очевиден - слишком уж сложна проблема. Найти для нее простое и изящное решение практически нереально. Потенциальная система-победитель должна быть:

  • внутренне логична;
  • удобна в употреблении рядовым пользователем;
  • легко расширяться для новых задач;
  • эффективно использовать ресурсы компьютера.
  • Разумность трех последних пунктов не вызывает сомнений: они желанны всем, в том числе и профессионалам. А вот так ли уж необходима внутренняя логика? Ведь если остальные три условия будут выполнены, тогда без нее можно будет пережить? Тем не менее, практика показывает, внутренне нелогичных программ длиной в несколько миллионов строк не существует, такую программу просто невозможно написать. А системы, о которых идет речь, имеют никак не меньший объем. И все же, даже поверив нам в этом категорическом утверждении, читатель может все равно не понять, зачем мы вынесли это в отдельный пункт. Дальше мы постараемся это прояснить.

    Идеалы недостижимы...

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

    Поклонники структурного программирования временами признаются, как трудно избежать искушения вставить "запрещенный" оператор goto. Не лучше и при объектном подходе: незначительные расширения функциональности нет-нет, да и приводят к необходимости открытия защищенных данных. Несколько таких наспех сделанных действий - и система трещит по швам1).

    Стали притчей во языцах извечные противоречия между структурностью и эффективностью. До сих пор еще многие верят в легенду, что объектный подход (а не дурной стиль программирования) резко снижает скорость программ. Если программа написана логично, ее наверняка хорошо бы где-нибудь оптимизировать, убрать ненужные повторения и многоступенчатые вызовы вложенных процедур. Если программа очень эффективна, даже автор через одну-две недели вряд-ли объяснит вам, почему же она работает. А в конце концов приходит клиент, и требует включить в систему новые возможности. Естественно, эти дополнения противоречат и логической схеме, и возможностям оптимизированных модулей. Так появляются "заплатки" и "накрутки", а вместе с ними вскоре и необходимость переписывания программы "по новой": через пару месяцев такой постепенной доработки, программа разрослась как снежный ком и разваливается под собственным весом.

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

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

    Грубая реальность

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

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

  • Сформулировать несколько базовых принципов будущей среды и далее жестко следовать их логике.
  • Ориентироваться на предоставление максимально удобного интерфейса для среднестатистического пользователя.
  • Максимально оптимизировать систему для решения какого-то узкого класса задач.
  • Сегодня для каждого из этих подходов существуют основанные на нем достаточно широко распространенные операционные среды. Так что наше рассмотрение будет привязано к конкретным примерам.

    К чему приводит математическая стройность

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

    Сразу заметно, что этот подход "отдает" математикой. Это в математике принято строить обширные теории, основываясь на нескольких базовых аксиомах, считая второстепенным вопрос о соответствии получаемых результатов нелицеприятной реальности. Классический и всем известный пример науки, построенной на аксиомах - Евклидова геометрия. Аксиомы эти просты и всем понятны, более того, интуитивно очевидны. Ну какие сомнения могут возникнуть у нормального человека, что через две точки проходит ровно одна прямая, или, что от данной точки на данной прямой в указанном направлении можно отложить один и только один отрезок заданной длины? Между тем, можно привести примеры изрядного числа геометрических фактов, выведенных из этих аксиом, которые не только доказать, но и понять тот же нормальный человек просто не в состоянии. Уж тем более, он не сможет ими легко оперировать, пытаясь построить какой-нибудь новенький результат. Аналогичная ситуация происходит и с UNIX. Последовательное применение простых и понятных базовых принципов приводит к весьма сложным объектам.

    Попробуем выделить основные характерные черты такого аксиоматического подхода. Профессиональный математик знает аксиомы и умеет их применять. Скорее всего, он не помнит большинства фактов-теорем, тем более не помнит их доказательств, но умеет при необходимости их вывести. В отличие, скажем от геолога, который должен знать огромное количество информации, математик должен владеть способами получения информации. Так же и UNIX-среды, не предоставляя, в большинстве своем, набора готовых решений для практических задач на любой случай жизни, предоставляют инструменты для их решения. Четкая структура системы, жесткое выполнение правил-стандартов делает самостоятельное решение задачи делом возможным, избавляет от неприятных неожиданностей, когда нечто, сделанное до тебя, работает совсем не так, как должно быть по логике вещей2). При этом решение отнюдь не становится простым делом. Точно также, любую геометрическую теорему в принципе можно доказать, но иногда это совсем не просто. С другой стороны, совсем не обязательно помнить о стандартных решениях на все случаи - всегда можно построить свое.

    Другое важное отличие аксиоматических наук - их открытость. Математику не нужно никому верить на слово. Даже в такой традиционно математизированной науке, как физика, приходится опираться на данные наблюдений и экспериментов, которые нет технической возможности повторить и проверить. Математик же любое утверждение своих коллег может проверить самостоятельно от начала и до конца. Точно также, при работе в UNIX-среде вам доступна значительная часть исходных текстов используемого программного обеспечения, а часто даже всей ОС. Можно с отладчиком изучать работу программы, а, иногда, и вносить в нее изменения. Когда перед математиком возникает какая-либо задача, у него есть несколько возможностей. Для простых случаев легче и быстрее доказать все заново, в несколько более сложных - позаимствовать главную идею. Ну а уж если задача оказалась слишком тяжелой - можно взять на себя труд "раскопать" готовое решение. И, кстати, если перед вами стоит похожая, но несколько иная задача, можно модифицировать чужое решение для своего случая. То же, в общем-то, происходит и при работе с UNIX средами. В тривиальных ситуациях можно написать свою программку или "скрипт", при более сложных проблемах стоит разобраться в готовых программах или модифицировать их под свои нужды.

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

  • Во первых, он должен обладать математическим складом ума, чувствовать логику аксиоматических построений. При этом у него должен быть вкус к самостоятельному решению задач, скорее, чем к поиску в справочнике готового ответа.
  • Во-вторых, он не должен бояться сложных задач; необходима моральная готовность к тому, что на решение той или иной задачи уйдут время и силы. Нужна восприимчивость к нестандартным решениям, умение действовать не по шаблону, а исходя из логики ситуации.
  • В третьих, он должен обладать некоторыми навыками программирования, поскольку заведомо ряд задач ему придется решать самостоятельно, а в других случаях разбираться, как работают чужие программы.
  • Наконец, необходимо еще одно качество: поскольку система построена на логике, а не на интуиции или инстинктах, нельзя делать те действия, которые первыми приходят в голову в данной ситуации, перед каждым действием надо остановиться и подумать.
  • Очевидно, что перечисленные качества не так часто встречаются у представителей рода человеческого. Так что такая система обречена быть продуктом не массовым. С другой стороны, большинство индивидов с перечисленными свойствами сосредоточены во вполне определенных местах - в университетах и научных учреждениях. Что и определило судьбу UNIX, как университетской системы.

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

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

    Комфорт обывателя - залог успеха

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

    Теоретически, можно было бы представить среду, основанную на эстетическом восприятии вместо логических построений. Культура XX-го века, абстрактная живопись, формальная литература, постмодернистская поэзия вполне подготовили для этого почву, выработав свои каноны и правила. Беда, вероятно, в том, что до настоящего времени разработчики сложных программных систем должны исповедовать логическую, а не эстетическую парадигму. Может быть, какой-то шаг в этом направлении сделан в операционной среде на компьютере Macintosh.

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

    Весьма близкая по тематике и используемым методам к математике и программированию, семиотика3), похоже, совершенно чужда математике по духу. Известно много примеров ученых, одновременно работающих в самых различных и непохожих областях науки; не говоря уж о совмещении математических исследований с физическими, можно найти математиков - биологов, химиков, экономистов, даже лингвистов. Но вот припомнить математиков-семиотиков с ходу не удается. Скорее, семиотики совмещают свои исследования с исскуствоведением, литературоведением, лингвистикой (последняя, видимо и служит мостиком).

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

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

    Те, кто серьезно занимались разработкой пользовательского интерфейса, знают, что предугадать какой вариант окажется удобным, практически невозможно. Единственный эффективный способ - стоять за спиной испытуемых на бета-версии клиентов и замечать куда они пытаются тыкать пальцами или мышкой. Действия эти обычно вполне инстинктивны, и апеллировать к разуму тут бесполезно. Попытки демонстратора объяснить, что тыкать надо совсем в другое место, редко приводят к успеху. Самые внятные ответы, которые можно услышать: "А, по-моему, так было бы удобнее". Конечно, невозможно спроектировать систему так, чтобы любые, совершаемые наобум действия приводили к нужному эффекту, но требуется, чтобы, по крайней мере, последствия не ставили клиента в тупик и не уничтожали результатов его работы5). Приходится смириться, что пользователю лень, неохота, а может быть и нет возможности разобраться в логике системы. Его желания, которые рынок воспринимает как требования, просты: достичь результата быстро и "на автомате". Наконец, его основная работа - клерка, секретарши, бухгалтера или юриста, требует хорошо развитой памяти, и ему, в отличие от математика, совсем несложно запомнить какие клавиши надо нажимать для получения желаемого эффекта.

    А круг его интересов совершенно исключает интерес к тому, почему следует нажимать именно эти клавиши, и что произойдет, если нажать другие. Можно, если не получается с первого раза, ткнуться еще в несколько мест, в надежде, что хоть с пятой попытки получится. Но вот думать - это уж увольте... Своих проблем хватает.

    Естественно, что основываясь на подобных наблюдениях, трудно сделать что-то красивое и изящное. Но, собрав некоторую статистику, сделать программу, более или менее доступную для использования средним человеком, все-таки можно.

    Создание операционной среды, рассчитанной на обывателя - проблема невероятно тяжелая. Если бы речь шла о маленькой программке, и то стоит некоторого труда "изогнуть" логику работы так, чтобы учесть пожелания пользователей. Но в случае большой системы, приходится состыковывать по-разному деформированные логические куски, тратя последние силы на подгонку острых краев друг под друга. Только несгибаемая воля разработчиков к победе позволяет получить плотный конгломерат. Система в этом случае похожа на большую местность, где в разных местах, как города, сосредоточены островки порядка и комфорта. А вот "в глубинке", куда забредать приходится только профессионалам6), царит беспорядок и уныние.

    Однако, игра стоит свеч: рынок обывателей на несколько порядков шире рынка любых профессиональных групп. Это позволяет привлечь к разработке гигантские ресурсы. Результат всем нам известен - например, наиболее распространенная сегодня операционная среда Misrosoft Windows - Windows 95 - Windows NT. В ней успешно и эффективно работают те самые юристы, бухгалтеры, секретарши и клерки.

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

    Инженерные решения

    Кроме математического склада ума, случается еще и инженерный. Инженер не может без боли в сердце смотреть, как для реализации надуманных логических схем, в пустую расходуются компьютерная память, процессорное время, место на дисках. Расходуются только потому, что кто-то придумал дурацкие правила, не разрешающие обратиться к этой памяти напрямую или использовать более эффективный набор команд процессора. Не легче и в том случае, когда никакие правила не соблюдаются, никаких надуманных схем не просматривается, но ресурсы тратятся на идиотское перемигивание окнами, на отрисовки никому не нужных кнопок. Ведь куда проще было бы обойтись без всего этого, сделать какой-нибудь простенький интерфейс, ну хотя-бы пусть пользователь выучит три десятка команд из пары букв и цифр каждая. Это же совсем не трудно, и столько бы памяти сэкономилось, а уж работало бы как быстро! Вы когда-нибудь видели, как бронируют и выкупают билеты на самолеты и поезда? Нет, не только в России, во всем мире так же. И ничего, справляются!

    Можно, конечно, возразить инженерам: задача операционной среды слишком сложна для вашего подхода. Но ведь современный самолет или космический корабль по уровню сложности навряд-ли уступает операционной среде на персоналке, а ресурсы зря не тратятся! Выходит, инженерный подход вполне имеет право на существование, правда, обладает одним существенным ограничением. Это ограничение - неуниверсальность, специализированность результата. Ведь никто не видел самолета, выходящего раз в неделю на боевое дежурство в качестве стратегического бомбардировщика, а в остальное время совершающего пассажирские рейсы на Багамы. Так и в области программирования, системы, использующие инженерный подход, хорошо решают только ограниченный класс задач.

    По этому пути пошла, например, фирма Novell, создавшая безусловно самую эффективную сетевую операционную систему для персональных компьютеров. При этом Novell принципиально отказался от поддержки как дружественного пользовательского интерфейса, так и многих других важных функций: электронная почта, взаимодействие с другими операционными системами и т.д. Формально назвать получившийся продукт (точнее, набор продуктов) операционной средой нельзя. Но авторы открыли свою систему, предоставив возможность другим дописывать недостающие части. Эта открытость - нечто, отличное от открытости UNIX. Она заключается в гигантском объеме документации, не сравнимой по объему с документацией от фирмы Microsoft, строгом следовании стандартам взаимодействия приложений, технических консультациях для разработчиков. Результат - огромное количество дополнительного программного обеспечения к Novell системам, в том числе бесплатного, свободно - распространяемого, что делает их продукты вполне пригодными для использования и распространенными по всему свету.

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

    Где же правда?

    Возможно, в наших утверждениях были заметны несколько натяжек. Естественно, жизнь существенно сложнее всех вымышленных схем. Мы, например, знаем и о неистребимой мощи и универсальности программных продуктов фирмы Microsoft, и о "UNIX с человеческим лицом", позволяющим создавать удобные для обывателя красивые программы. И все же на наш взгляд, это не снимает главного противоречия: вершины в треугольнике "логичность - комфорт пользователя - эффективность" не удается (пока?) сблизить на достаточное расстояние.

    Давайте "жить" в этом треугольнике.


    1) Нам, конечно известно, что кроме структурного и объектного программирования имеются и другие методы. Мы не сомневаемся, что, например, в функциональном програмировании возникают аналогичные проблемы. Что же касается "простых программистов", считающих все "научные" подходы теоретическими изысками, то позволим себе предположить, что они никогда в своей жизни не написали (работающей) программы длиннее чем в 5000 строк.

    2) Попробуйте, например, в Windows 3.11 наладить одновременную поддержку более двух стеков сетевых протоколов, скажем, IPX, NETBEUI и TCP/IP - вы обнаружите, что настройка каждого стека почему-то влияет на настройку остальных. Причем никто не сообщит что именно в этих настройках поменялось.

    3) Для непосвященных скажем, что классическое применение семиотики - это попытки объяснить воздействие на человека музыки или абстрактной живописи, через изучение знаковых систем, использованных авторами произведений.

    4) "Развитой интерфейс командной строки" - не издевательство, а реально существующий, и даже удобный способ работы "для профессионала". Его, например, используют shell в ОС UNIX.

    5) В некоторых версиях UNIX, например, можно одной командой из 5 символов уничтожить все данные на всех машинах локальной сети, причем от вас даже не попросят подтверждения.

    6) Имеются в виду далеко не только профессионалы от программирования, а также профессионалы по подготовке сложных книг, сложных рисунков, и так далее. Обход причуд операционной среды в той или иной степени входит и в их профессиональные навыки.