Обработка ошибок и турникеты

16 февраля 2008, 19:10

Часть первая, проектировочная

Я начну с довольно пространной цитаты из книги Дж. Гарретта «Веб-дизайн, ориентированный на пользователя. Элементы опыта взаимодействия». Гарретт выделяет три уровня обработки ошибок — предотвращение (prevention), исправление (correction) и восстановление (recovery) — и описывает их следующим образом:
Что должна делать система, когда люди совершают ошибки, и, прежде всего, что она может предпринять для предотвращения этих ошибок?

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

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

Следующий способ исключить ошибки — сделать их затруднительными. Однако в этом случае даже при самых серьезных мерах предосторожности некоторые ошибки обязательно произойдут. Тогда система должна сделать все возможное, чтобы помочь пользователю осознать ошибку и устранить ее. В некоторых ситуациях система может даже устранить ошибку за пользователя, но будьте осторожны: ничто так не раздражает в поведении программного продукта, как чрезмерное рвение в устранении ошибок пользователя. (Если вы работали с редактором Microsoft Word, вы меня поймете: в Word встроены бесчисленные функции, призванные исправлять некоторые распространенные ошибки, но я всегда отключаю эти функции, чтобы иметь возможность нормально работать, не занимаясь исправлением исправлений.)

Информативные сообщения об ошибках и хорошо продуманные интерфейсы во многих случаях помогут пользователям обнаружить совершенные ошибки. Однако некоторые действия пользователя могут вначале казаться корректными, а потом будет слишком поздно, чтобы система могла их обработать. В таких случаях система должна предоставить пользователю способ восстановления после ошибки. Самым известным примером такой функции является «отмена действия», однако восстановление после ошибки может принимать разные формы. Если восстановление невозможно, то единственным доступным системе способом удержать пользователя от ошибки является большое количество предупреждений. Разумеется, предупреждения эффективны, только если пользователи действительно обращают на них внимание, и поэтому последовательность диалоговых окон «Вы уверены?..» больше раздражает, чем помогает.
Что происходит на практике, когда программист работает над кодом? Предотвращение обычно отметается, поскольку является весьма затратным именно с точки зрения программиста. Допустим, некоторая операция в данный момент не может быть выполнена или не имеет смысла (например, копирование в буфер обмена, когда только что создан новый пустой документ — в котором нечего копировать по определению). Чтобы предотвратить ее выполнение, надо сделать ее недоступной во множестве мест: заблокировать в меню, заблокировать в контекстном меню, заблокировать на стандартной панели инструментов, заблокировать на пользовательских панелях инструментов (если она там есть), заблокировать соответствующие «горячие» клавиши, заблокировать стандартную «быструю» комбинацию клавиш (если она не переназначена), заблокировать пользовательские комбинации клавиш (если есть)... (К чести Microsoft Word, в ней работа в этом случае идет именно на уровне предотвращения.)

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

Часть вторая, жизненная

Мой старший сын очень не любит метро. Причина этой неприязни весьма проста: однажды, когда ему было лет 5 или 6, турникет — тот самый советских времен турникет, который в ответ на попытку неоплаченного прохода грозно лязгает «челюстями», — сработал не так, как должен был. Сейчас в московском метро идет постепенная замена турникетов на «французские» (так их называет мой сын, которому в качестве утешения я рассказал тогда про то, что бывают более «дружелюбные» турникеты и что я видел такие в Париже). «Французский» турникет действует ровно наоборот: он открывает проход, если получена оплата.

Давайте посмотрим на ситуацию с точки зрения схемы взаимодействия пользователя с системой.

Происходят последовательно два действия пользователя: (А) оплата и (Б) проход. Если в ходе действия А случилась ошибка (проход рассматривается системой как неоплаченный — потому что он действительно не оплачен, или потому что билет просрочен, или потому что билет размагнитился, или потому что пользователь не достал обработанный билет из щели, или потому что просто сбойнула электроника, и т. п.), пользователь не должен совершить («ошибочное») действие Б.

«Французский» турникет работает по принципу предотвращения: он не открывает проход, просто не давая возможности совершить ошибочное действие. «Извините, проход закрыт».

«Советский» турникет блокирует действие Б в момент его совершения — по сути своей это соответствует крайней форме сообщения об ошибке. «КУДА ПРЕШЬ, КР-Р-РЕТИН?!»

(К слову, мне кажется, что это свидетельствует и о разнице в менталитете проектировщиков этих турникетов.)

Подавляющее большинство программистов живут в крупных городах и хотя бы однажды были «неправедно защелкнуты» турникетом старого образца. Полагаю, в тот момент это вызвало вполне определенную эмоциональную реакцию; теперь достаточно просто ее вспомнить, чтобы на своей шкуре почувствовать, как рядовой пользователь воспринимает сообщение об ошибке: «ЧТО ТЫ СДЕЛАЛ, НЕДОУМОК?!»
Поделиться
3 комментария
Winnie Pooh
Разница французской и советской систем почти наверняка имеет другие причины: советская рассчитана на крайнюю редкость ошибок и экономию на ненужных закрываниях-открываниях, французская рассчитана на многих ошибающихся (или даже пытающихся смухлевать). Оптимизм — пессимизм.
Какая система лучше? Я бы сказал, что это дело вкуса. На мой вкус лучше модифицированная советская система: корридор закрывается при ошибке, но барьер не бьет человека (для этого можно сделать корридор длинным).
Xendz
Хм... Не думаю, что у советского проектировщика были серьезные основания быть оптимистом и считать соотечественников существенно более внимательными и/или честными по сравнению с европейцами... Когда проектировались эти турникеты, уже очень хорошо было понятно, что ситуация как раз обратная: «все вокруг народное — все вокруг мое» — «приватизировали» все, что плохо лежит («грех не надуть родное государство»). (А в Европе вот, к слову, уже и сама идея турникетов начинает постепенно отходить в небытие...) Скорее на советского проектировщика влияли две совсем другие вещи: 1) общая атмосфера «тащить и не пущать»; 2) некоторая общая обесцененность человеческой жизни, когда ресурс движущихся частей важнее человеческого настроения.

Что касается «коридорной» системы — есть попытка реализации подобной идеи на вокзалах (как минимум на Казанском): там более длинный турникет с двумя системами защелок, которые перекрываются то вместе, то поочередно — и логика этого чуда-юда уж совсем невразумительна и непостижима... Но даже при более разумной реализации у «коридорного» турникета минимум два недостатка: 1) малая пропускная способность — надо ждать, пока по «коридору» пройдет один, чтобы запустить следующего; 2) в случае ошибки пользователю придется дальше возвращаться назад, что только усилит его раздражение.

Так что «французская» система — пока самая человеколюбивая из мною виденных. Но — с повышенным износом движущихся частей:).
Марик
А моего сына как раз французским турникетом прихлопнуло в довольно нежном возрасте.
Это был турникет на выход с платформы пригородных электричек. По моему билету турникет открылся, пока я доставала билет, навстречу ломанулся какой-то мужик, проскочил, а когда пошла я с ребенком на руках, ребенок получил этим оргстеклом по башке очень больно :-(
Я, конечно, тормоз и поступила неправильно.
Но с тех пор никаким турникетам не доверяю :-)
Xendz
— Это было не на Земле, — сказал Маленький принц.
Лис очень удивился:
— На другой планете?
— Да.
— А на той планете есть охотники?
— Нет.
— Как интересно! А куры есть?
— Нет.
— Нет в мире совершенства! — вздохнул Лис.
Антуан де Сент-Экзюпери, «Маленький принц»
Xendz
В связи с тем, что эта заметка попала в поле зрения спам-роботов, ее комментирование пришлось закрыть :(.
Xendz
Если у вас возникло желание оставить свой комментарий, воспользуйтесь «Книгой жалоб и предложений». Я постараюсь найти время, чтобы перенести его сюда.