об ошибках
Mar. 1st, 2009 02:36 amЭто интересная мысль - спрашивать "почему" и настаивать на осмысленном объяснении ошибки. Мне она, в такой форме общего принципа, не приходила в голову, хотя на практике я неоднократно так поступал (в роли программиста).
Мне кажется, одна из важных причин, что мешают сообщениям об ошибках быть понятными - модуляризация в программировании. Ошибка случается в одном месте в системе; общение с пользователем находится совсем в другом.
"Системой" здесь может быть как отдельное приложение, так и, скажем, весь интернет.
Во всеобъемлющей системе, в которой информация течет полным потоком отовсюду всем (через центральный контрольный модуль или стихийно), передать пользователю информацию о том, что именно случилось - относительно легко. Однако такие системы не работают, потому что они слишком сложны. Единственный известный способ построить сложную компьютерную систему - составить ее из отдельных модулей, общение которых между собой должно подчиняться заранее оговоренным протоколам. Чем лучше изолированы друг от друга модули, чем меньше доступа они имеют к информации от других модулей, которая их не касается, тем легче построить работающую сложную систему.
И эта потребность в модуляризации неизбежно вступает в конфликт с желанием передать много подробной информации, нарушающей изоляцию между модулями.
Скажем, ты находишься в графическом редакторе, и сохраняешь файл. В зависимости от того, где ты его сохраняешь, это может быть жесткий диск твоего компьютера или сетевая папка на сервере. Графический редактор не должен об этом ничего знать - он всего лишь пытается записать записать файл, а уже другие модули в операционной системе решают, послать этот файл на местный диск или по сети на другой компьютер. Теперь предположим, что по какой-то причине сохранить файл не удалось и программа-редактор получила код ошибки. Не так уж легко спроектировать интерфейс между программой и операционной системой так, чтобы он содержал полезную информацию о такой ошибке во всех случаях, и вместе с тем сохранить информационный барьер между программой и драйверами диска/сети, не заставлять программу что-то о них знать. Может, файл не записался оттого, что неожиданно свалился роутер, находящийся между твоим компьютером и сервером. Твое приложение не знает, что такое "роутер" и сетевые неполадки и не умеет объяснить это тебе внутри своего интерфейса, с ограничениями своего дизайна, понятным тебе языком. Ему (и его программистам) вообще ничего не хочется знать о сети, а только о том, как картинки редактировать. Оно всего лишь хотело записать файл, и это не удалось. Вот оно и пишет "Operation failed" или еще что-то в этом роде.
В примере из записи по ссылке - "удаленный хост не отвечает" - есть какой-то в цепочке роутеров от моего компьютера до хоста, который послал пакет следующему в цепочке, но не получил ответ. Ясно, что есть частные случаи, которые особенно интересны мне - например, если пакет не получен уже первым роутером, можно предположить какие-то проблемы с моим сетевым кабелем или домашним (рабочим) роутером; если получен последним, но не хостом, можно предположить проблему с удаленным сервером. Сейчас же я даже не знаю, получив такую ошибку, это у меня упал интернет или "там" что-то нет так, и должен делать дополнительные проверки, чтобы это узнать. Мне, программисту с опытом системной администрации, это сделать легко, но я не обычный пользователь. Все это - результат того, что протокол IP принципиально однонаправлен и настроен на то, чтобы роутер, отправив IP-пакет к следующему узлу, мгновенно забывал о нем. Лего понять, почему так спроектировано, из прагматических соображений; но мы платим за это, в частностью, вышеописанной непрозрачностью сбоев.
no subject
Date: 2009-03-01 01:23 am (UTC)любопытно, насколько востребованы такие объяснения. варианты действий после объявления об ошибке, пожалуй, были бы конструктивней. try again later - мне кажется много полезней, чем указание на крайнего.
no subject
Date: 2009-03-01 01:30 am (UTC)(no subject)
From: (Anonymous) - Date: 2009-03-01 01:37 am (UTC) - ExpandКто "пользователь"?
Date: 2009-03-01 03:55 pm (UTC)no subject
Date: 2009-03-01 01:37 am (UTC)For today, this sounds like a cope-out rather than an attempt to fix a problem.
I would like to split this problem into two parts:
1. Informational (provide accurate and detailed error reports).
2. Functional (provide information necessary for some higher layer to automatically correct the problem).
The solution to the Informational problem actually seems simple. We already have a Universal informational data structure: a text string. We should also respect module layering as the prevalent system organization, with each higher layer providing a more "user-friendly" abstraction. Hence, I'd propose a List of Text Strings. Each higher-level layer is able to append a more user-friendly error description, while retaining the root cause error.
Since the data structure of "a list of strings" is brain-dead simple, all modules can expect to adhere to this simple convention.
That way, your editor's Top error may be something like:
"Save operation failed". Then, GUI would give an option: "more information", which would unfold the next error: "Network error". "More information" here would unfold: "Foreign host xyz.com unreachable". Depending on the network stack implementation (and no one higher up should care), it may have even more information: "some trace route information".
2. The "Functional" problem seems a bit harder, since it needs information that can be parsed by a computer, which necessities a predefined shared structure/API specification. It seems that here, the best thing we can do is introspective, backward-compatible APIs. That's a lot more fragile and cumbersome. :(
no subject
Date: 2009-03-01 05:16 am (UTC)(no subject)
From:no subject
Date: 2009-03-08 07:03 am (UTC)Talk to me more about that. I think I know someone who once wrote a patent application for something very much like that. (ahem :) )
(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 01:41 am (UTC)Схеима такая:
1. Объект x класса X, который что-то делает, и может "делать" с ошибками.
2. Абстрактный базовый класс ErrorHandler, у которого виртуальная функция 'erro' (на входе - текст ошибки и код).
3. Отнаследованные от ErrorHandler классы, показывающие ошибки так или эдак (в консоли, в окне, в логе и т.п.)
Допустим, некий модуль использует объекты разных классов, которые могут генерировать ошибки. Перед использованием модуль создает (или берет откуда-нибудь) объект ErrorHandler - такой, какой ему нужен, в зависимости от того, как хочет показывать ошибки. ErrorHandler назначается всем объектам, генерящим ошибки. Объект x в случае ошибки формирует текст ошибки и вызывает 'erro'. Он знает все о причинах ошибки (поскольку сам выполнил "ошибкоопасные" действия) но не знает ничего о том, как она будет показана юзеру.
И фсе работает :)
no subject
Date: 2009-03-01 02:15 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 03:39 am (UTC)Пара примеров:
1. Компилятор когда не может что-то скомпилировать должен давать максимум информации почему. Оптимально - ссылку на нарушенное правило из стандарта языка. Я смогу прочитать и воспользоваться.
2. У меня дома стоит газовая отопительная печка. Если она не запускается, то я могу прочитать код ошибки (она передает его миганием лампочки). Кодов этих уйма, но доступных мне реакций на них только три - попробовать выключить и включить, проверить подачу газа, вызвать ремонтника. Подробный код мне совершенно не нужен и трех лампочек бы хватило вполне.
Из этих соображений на устройстве, которое мы делаем, есть лампочка "соединение с интернетом работает" - лампочка горит, а сайт не открывается - проблема с тем сайтом, лампочка не горит - звоните в свой "интернет" ;-)
no subject
Date: 2009-03-01 04:21 am (UTC)Моя плита вот вообше показала номер телефона, по которому надо было звонить, чтобы пришел ремонтник. Ну и кодовый номер ошибки показала. Пришел ремонтник, впечатал код ошибки в гугл, нашел номер детали, который надо было заменить, сказал, что мне будет выгодней самому купить и поставить, взял 50 зеленых и ушел. Вот я теперь думаю: хорошо что она мне номер телефона дала или нет? Если бы помалкивала, у меня было бы на 50 больше...
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 03:57 am (UTC)А всего-то надо спускать сверху информацию, добавляя на каждом уровне, чтобы потом, если надо, собрать ее в сообщение об ошибке.
no subject
Date: 2009-03-01 04:18 am (UTC)То есть отвал сетевого диска выглядел бы как:
"ошибка при сохранении файла h:\mypicture.bml: no route to host". И пользователю было бы достаточно вспомнить, что у него диск h: сетевой.
no subject
Date: 2009-03-01 04:49 am (UTC)В продуктах нашей конторы есть такой файл message.dat, в котором хранятся все возмодные мессаджи и сообщения об ошибках. И к каждой ошибке девелопер должен добавлять возможную причину (или несколько причин) и как с ними бороться. Не очень хорошо, если по идее ошибка вообще не должна возникать (тогда надо писать, что-то вроде, "проблема с вашей инсталляцией нашего софта, обратитесь в службу поддержки".
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 04:59 am (UTC)Пример: сообщения make. Никто же не ругается на сообщения об ошибках makе...
У сообщения об ошибках есть две крайности: сказать сам дурак, или абсолютно точно заметить, что накрылся блок 3 в функции 5 модуля 7. Как не езди между двумя крайностями, либо юзеру будет непонятны технические детали, либо неопределенность сообщения опять таки сделает сообщение об ошибке невразумительным. Можно запросто скомбинировать и то и другое.
Обычно люди стараются моделировать ситуации об ошибках и дают двухходовое пояснение: (1) сервер накрылся (2) скорее всего, из-за того, что юзер засандалил черезчур много последовательностей.
no subject
Date: 2009-03-01 05:03 am (UTC)http://avva.livejournal.com/2046108.html?thread=59199388#t59199388
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:логи, логи, логи
Date: 2009-03-01 05:08 am (UTC)На самом деле это сработает и в примере с сохранением файла на сетевой диск. На самом деле что ты тут пользователю не говори, а девочка-дизайнер не должна вообще быть в курсе, что её домашняя директория находится не на её компьютере, а на сервере. Но вот когда она звонит своему сисадмину и просит помочь, он должен сразу видеть в каком-нибудь application event log, что
failed to write h:\work\logo.png;
failure while accessing network drive h: mapped from \\fs4\homedirs\lisa
WINS resolution for fs4 failed;
failed to resolve hostname: 'fs4';
timed out while waiting for DNS query response from 192.168.1.2
после чего он сразу видит, что DNS сервер указа неверно, и все будет решено в 5 минут. Ещё раз: нет такого сообщения об ошибке, которое помогло бы конечному пользователю в этой ситуации.
no subject
Date: 2009-03-01 06:34 am (UTC)Имхо, речь тут именно и идет о сообщениях, понятных конечному пользователю, далекому от программирования. Понятно, что профессионал имеет много путей разобраться, но ведь на каждый сбой его не навызываешься.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 05:45 am (UTC)Я упомяну об еще одной важной причине - она хорошо прослеживается в посте и в комментариях, и интересно видеть, насколько она воспринимается, как нечто само собой разумеющееся. Сообщения об ошибках пишутся программистами, а должны бы писаться юзабилистами, или кому как угодно их называть. Это не пренебрежение по отношению к программистам, просто написание качественных сообщений об ошибках это действительно нетривиальная задача, и есть профессия, частью которой это является. Одна из причин, почему программистам лучше этим не заниматься - когда ты "слишком" хорошо знаешь систему, бывает крайне трудно абстрагироваться от этого, и представить себя в роли пользователя. Трудно понять, что является необходимой информацией, и трудно дать действительно полезные указания к действию (а они действительно необходимы, как упомянули выше). Указание "Обратитесь к сисадмину" будет обычно более верным, чем указание идти копаться в .ini файле. Верным "политически", потому что в данной фирме копаться в ini файлах - задача сисадминов, а не юзеров, и верным практически, потому что юзер может просто войти в ступор. А человеку, для которого решение копаться в файле намного более самоочевидно, чем решение звать сисадмина, который в этом понимает значительно меньше его самого, бывает сложно это понять.
И есть еще одна распространенная проблема - людям часто лень писать множество подробных сообщений, когда можно обойтись одним общим. Типа "Проверьте, нет ли в названии файла запрещенных символов: ! @ # $ % ^ & * ( ) < >" вместо того, чтоб сказать конкретно, какой запрещенный символ найден.
no subject
Date: 2009-03-01 06:38 am (UTC)Они часть дизайна и должны писаться теми же, кто пишет меню, расставляет элементы GUI... А то ведь иногда в пользовательской программе видишь что-то типа "Virtual function unresolved". И куда с этим бедному бухгалтеру или статистику? :)
(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 05:58 am (UTC)no subject
Date: 2009-03-01 08:06 am (UTC)Рассчитывать на то, что сообщение об ошибке будет не только подробным, но еще и будет каким-то образом автоматически анализоривано и даст пользователю конкретные рекомендации, например "перезапусти ADSL router" наивно, это слишком сложно.
Вне зависимости от подробности информации в сообщении об ошибке средий пользователь сделает одно из двух - или попробует еще раз (как вариант после ребута) или обратится за помощью.
Продвинутым пользователям это было бы полезно, но их меньшенство.
no subject
Date: 2009-03-01 09:02 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 08:42 am (UTC)Что делать полезно, так это давать пользователю возможность что-то сделать. Добавление кнопки "Report Error" к диалогу об ошибке ведет к магическому сокращению звонков в службу поддержки ;)
no subject
Date: 2009-03-01 10:14 am (UTC)no subject
Date: 2009-03-01 08:52 am (UTC)no subject
Date: 2009-03-01 10:02 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 09:08 am (UTC)Для продвинутых юзеров, возможно и понадобится детальное "module xxx can't reach the host yyy using protocol zzz" и стак трейс на сто строк, но что-то я сомневаюсь.
no subject
Date: 2009-03-01 10:09 am (UTC)(no subject)
From: (Anonymous) - Date: 2009-03-01 12:26 pm (UTC) - Expand(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-03-01 12:16 pm (UTC)http://tema.livejournal.com/286569.html?thread=125312873#t125312873
У тебя я не могу позволить подобной нездоровой лексики :-)
Приведённой мной пример ни в коем разе не претендует на полноту, но помоему он позволяет почувствовать, где должна проходить гранца между тем что можно, и что нельзя показывать пользователю в сообщениях об ошибках.
Т.е. если ворд не может записать на твой локальный харддиск, то он должен (и может) сообщить очень подробно почему он это не смог сделать. При этом, если он записывает на сетевое устройство, то часто единственное, что он должен (и обычно может сообщить) - это то, что устройство недоступно. Разумеется он может (и опять таки должен)предложить бейсик траблшутинг, типа, проверьте ваше подсоединение к интернет, и т.п., но вполне естественно, что в 90% случаев прийдётся позвонить в IT.
no subject
Date: 2009-03-01 01:26 pm (UTC)Лично я стараюсь считать что ошибка - это строка, часто её можно протащить между процессами, довольно часто среда это позволяет. Например, svn -> мой python скрипт -> visual studio.
no subject
Date: 2009-03-01 05:18 pm (UTC)его дело платить деньги и хавать, что даютдля этого как раз и существует служба техподдержки.no subject
Date: 2009-03-01 07:05 pm (UTC)На самом деле лампочки "Check engine" вполне достаточно, чтобы дать понять пользователю - пора ехать к механику %)
no subject
Date: 2009-03-01 07:52 pm (UTC)Хотя, конечно, платишь за это появлением еще слоя потрохов :)
no subject
Date: 2009-03-02 08:53 pm (UTC)no subject
Date: 2009-05-10 06:31 pm (UTC)http://dobrokot.ru/pics/nya2009-05-10__22-32-21_31kb.png