1 заметка с тегом

дизайн и проектирование

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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