Сообщения об ошибках не работают
По иронии судьбы сообщения об ошибках не удерживают пользовате- лей от совершения ошибок. Мы воображаем, будто пользователи избе' гают проблем благодаря нашим надежным сообщениям об ошибках, направляющим их на путь истинный, – но это заблуждение. Что они действительно делают, так это предохраняют от проблем программу. В большинстве программ сообщения об ошибках стоят, как часовые, вовсе не там, где пользователь наиболее уязвим, а в самых чувстви' тельных местах программы, и самозабвенно служат идее, что програм' ма важнее любого пользователя. Имея дело с нашими программными продуктами, пользователи сталкиваются с массой проблем независи' мо от качества и количества сообщений об ошибках. Все, на что спо' собно сообщение об ошибке, – это удержать меня от ввода буквенных символов в числовое поле. Оно не удержит меня от ввода недопустимо' го числа – это гораздо более трудная задача проектирования.
Избавляемся от сообщений об ошибках
Мы не можем исключить сообщения об ошибках, просто выбросив ту часть кода, которая выводит на экран диалоговое окно с сообщением, и позволив программе завершаться аварийно в случае возникновения проблем. Мы должны перепроектировать приложения таким образом, чтобы они не были восприимчивы к этой проблеме. Мы должны заме' нить сообщение об ошибке более надежным кодом, который не допус' кает возникновения ошибочных ситуаций, а не просто жалуется, что дела идут не в точности так, как нужно. Проведя некое подобие вакци' нации, мы вырабатываем у программы иммунитет к проблеме, и толь' ко после этого можем выкинуть сообщение, которое извещало об этой проблеме. Чтобы избавиться от сообщения об ошибке, мы должны снизить вероятность совершения этой ошибки пользователем. Вместо того чтобы воспринимать сообщения об ошибках как норму, мы долж' ны думать о них как об исключительных решениях редких проблем, то есть как о хирургии вместо аспирина. Мы должны считать их идио' мой крайних мер.
Каждый хороший программист знает, что если модуль А передаст недо' пустимые данные модулю В, то последний должен немедленно и явным образом отвергнуть эти данные с соответствующей индикацией ошиб' ки. Отсутствие такой реакции было бы серьезным недостатком интер' фейса между этими двумя модулями. Однако люди – не модули про' граммного кода. Программный продукт не просто обязан перестать от' вергать введенные человеком данные, вывешивая сообщение об ошиб' ке, – проектировщики продукта должны пересмотреть само понятие
«недопустимых данных». Когда данные исходят от человека, програм' ма обязана исходить из того, что ввод корректен, – просто потому, что человек важнее программы. Вместо того чтобы отвергать ввод пользо' вателя, программа должна изо всех сил стараться разобраться в непо'
нятных данных и привести их в согласованный вид. Программа, воз' можно, знает, что происходит внутри компьютера, – но только пользо' ватель понимает положение вещей в реальном мире. В конце концов, реальный мир важнее того, что думает компьютер.
Предотвращаем ошибки
Сделать так, чтобы пользователь не мог ошибиться, – лучший способ избавиться от сообщений об ошибках. С помощью ограничивающих элементов ввода, таких как счетчики и раскрывающиеся списки, можно лишить пользователей возможности вводить ошибочные чис' ла. Вместо того чтобы заставлять пользователя вводить информацию с клавиатуры, предоставьте ему список, из которого он будет выбирать. Например, не требуйте от него код штата – дайте ему список всех ко' дов штатов, а еще лучше – нарисуйте карту. Иными словами, исклю' чите малейшую возможность ввода неверного кода штата.
Делайте так, чтобы ошибки были невозможны.
Другой превосходный способ избавиться от сообщений об ошибках – сделать программу достаточно сообразительной, чтобы она не требова' ла лишнего. Многие сообщения об ошибках имеют такой вид: «Непра' вильный ввод. Пользователь должен ввести ХХХХ». Если программа знает, что именно должен ввести пользователь, почему бы ей не ввести это самой, перестав трепаться попусту? Вместо того чтобы требовать от пользователя ввести имя файла и давать ему возможность ошибиться, заставьте программу запомнить, с какими файлами он работал раньше, и выведите их список. Еще один пример: сделайте так, чтобы програм' ма получала дату от системных часов, а не требовала ее пользователя.
Несомненно, все подобные решения потребуют дополнительной рабо' ты программистов. Но ведь именно программисты получают деньги за то, чтобы пользователь был удовлетворен, – а никак не наоборот. Если программист считает пользователя всего лишь еще одним устройством ввода, легко позабыть, кто кому служит в мире проектирования про' граммных продуктов.
Пользователи компьютеров безразличны к проблемам, стоящим перед программистами. Они не понимают технических причин появления диалогового окна с сообщением об ошибке. Все, что они видят, – это не' желание программы вести себя по'человечески. Они воспринимают все сообщения об ошибках как вариант того, что показано на рис. 25.2.
Одной из проблем сообщений об ошибках является то, что они уведом' ляют о неприятностях по факту. Они говорят: «Случилось нечто пло' хое, и все, что вы можете сделать, – признать катастрофу». Полез' ность таких сообщений сомнительна. И все эти диалоговые окна снаб'
Рис. 25.2. Именно так большинство пользователей воспринимает диалоговое окно с сообщением об ошибке. Оно представляется допросом в стиле Кафки, когда каждый следующий ответ все глубже погружает в яму возмездия и раскаяния
жены кнопкой ОК, требующей от пользователя стать соучастником преступления. Подобные сообщения об ошибках вызывают в памяти сцену из старых фильмов о войне. Злополучный солдат, пробираю' щийся по рисовому полю, наступает на противопехотную мину. Он и его товарищи отчетливо слышат щелчок взрывного механизма – и солдат понимает, что сейчас он в безопасности, но стоит лишь убрать ногу с мины – она сработает, и он потеряет какую'то большую и полез' ную часть тела. Примерно то же чувствуют пользователи при виде большинства сообщений об ошибках: им хочется оказаться за тысячи километров от этого места – где'нибудь в реальном мире.