Pull to refresh

Comments 72

Статья ради статьи? Ну елки палки. Этим основам эргономики. Сто лет в обед

Хорошая статья, есть на что сослаться. Для многих в настоящий момент — эти истины не очевидны

Комментарий ради комментария?
ради комментария...
Да нет же! У него в первом комментарии и смысл, и аргументы, и описание, и паника, и увиденные ошибки проблем статьи, и даже возмущение. А посмотрите на объем! Краткость сестра таланта иначе никак.


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

Данный ресурс всё же, должен быть на острие технологий. А основ в интернетах и так хватает.
На кой плодить банальщину? Ее и так уже 90% всего интернета

Если действие, которое выполнил пользователь, нельзя отменить — откладывайте его выполнение. Например, в Gmail есть возможность откладывания отправки писем на 15 секунд.
в Gmail. Там, в верхней части экрана, показывают жёлтый баннер, содержащий ссылку для отмены действия.
Немаловажно, что бы само действие все же выполнялось, если его не отменили:)
В том смысле. что вот в гмыльном приложении есть такая бага — удалил сообщение, и вроде пошел дальше делами заниматься, потом минут через 15 смотришь — удаление не сработало. Или отправил, а оно так и не отправилось и валяется в черновиках. Бесит неимоверно.
по поводу github: буквально сегодня вместо одного репозитория удалил другой. потому что название удаляемого репозитория, которое нужно ввести, как ни странно, можно копировать. одно из решений — user-select: none: скопировать все равно можно, но сложнее, чем набрать. однако виноват в удалении не github, а я сам. надо думать, что удаляешь. лично меня чрезмерная опека сервисов раздражает, поэтому специально для github пришлось стать мастером копипаста, за что и поплатился. почему у них нет корзины?)
Не очень понятно как блокировка копирования бы помогла от автоматического набора руками?
Тут логика в том чтобы сломать автоматизм — увидел окно — нажал согласие и еще раз посмотреть толи ты собираешься удалить.
Дополнительное согласие проходится не задумываясь автоматом и, по сути, ни от чего не защищает. А в корзину надо специально заходить, поэтому это лучший вариант с точки зрения безопасности.
Вы лучше объясните что вы такое с GitHub делаете, что вам постоянно репозитории нужно удалять.
Зачем постоянно? Достаточно один раз не то удалить — и это уже 100% фиаско.
Читаем:
специально для github пришлось стать мастером копипаста, за что и поплатился
Вы уж меня извините, но если вы репозитории удаляете, как нормальные люди, раз в месяц или раз в год, то вы не станете «мастером копипаста».

А если вы стали — то задумайтесь, почему…
Это уже про другое вопрос. А изначальный был в том, что любой может нечаянно скопипастить неправильное название (не того репозитория). Или вы никогда так не делаете и все удаляемое руками вводите?
Я пока не выкладывал на GitHub ничего, что мне хотелось бы, потом, удалить.

Так что не могу ответить на этот вопрос.
Так изначально и совсем не это было.
Разве если при удалении репозитария вставить туда название другого он удалится?
У них есть такая функция.
Настройки (Settings) > Репозитории (Repositories), там будет переключатель на удаленные, будут кнопки «восстановить» (Restore).

то есть там удаляется репозиторий, который вы вводите, а не проверяется то, что выбрано для удаления с тем, что вводите?

Я мож туповат, или не догоняю чего… image
Вот у меня операция очистки некоего журнала событий. Выводится окно подтверждения, и в случае ответа «Да» — выполняется очистка без возможности восстановления (память заполняется нулями, речь о микроконтроллере или ПЛИС, интерфейс с пользователем — на ПК).
Как это подтверждение можно заменить на Отмену действия?
Вы собираетесь очистить журнал, це очень опасная операция (память будет заполнена нулями!).
Отменить Отмена

:D не стоит искать в этом какой то смысл, отмена действия нужна в популярных кейсах (я часто удаляю файлы в корзину, но у меня остается вариант восстановления из корзины), но предупреждение нужно перед редкими кейсами (форматирование диска например).

Считать текущее состояние и восстановить, как вариант.
Как делают при апдейтах сложных железок — удваивают хранилище, заливают новую прошивку во второй раздел, проверяют и потом, как можно более атомарно, переключают разделы, оставляя старое как read-only. Помогает, если что, откатиться.

Можно и не удваивать хранилище, а хранить копию прошивки на компе.

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

Когда пользователь щёлкает на «Отмену действия» выводите ему диалоговое окно, похожее на то, которое было при операции удаления, и укажите в окне «операция невозможна. OK, Отмена». Пользователь по привычке щёлкает ОК, тем самым подтверждая что он согласен с невозможностью восстановления данных.
Очевидно, заполнять память нулями не сразу, а через время, но пользователю показывать пустоту и кнопку «отменить удаление».
Наверное, ваша идея может подойти, благодарю ))
Но вот по какому критерию выполнять настоящую очистку?
Если по времени — то через какое? А если до истечения этого времени нудно будет показать журнал пользователю. или, не дай бог, добавить туда новую запись?
Можно сделать как в файловых системах, запись помечать флагом «удалено» и не показывать, но физически оставлять, оставляя возможность для undelete, и переписывать поверх если место кончается.
А можно просто, поскольку у нас задача просто спастись от мисскликов, временно сместить указатель начала списка на конец записей, и запустить таймер секунд на 30. По окончанию (или если место под журнал кончилось), физически уже обнулить память и сдвинуть обратно. А если юзер нажал отмену, то просто двигать обратно без обнуления.
По заполнению буфера действий (новых записей), которые должны быть сделаны после очистки. То есть, просто переставляете указатель начала лога на текущую позицию и спокойно пишете дальше в хвост какие-то N записей. По достижению N записей или M времени или K сеансов сдвигаете эти новые записи в начало, зануляя остальное.

Также можно просто писать записи по одной с начала, очищая хвост по достижении N. Тогда полная отмена не будет возможно, но процент потерь будет обратно пропорционален времени до отмены.
Время до полной очистки может быть любое (например 1 мин), но до его истечения никакие операции с этими данными не должны быть возможны (если принудительно не подтвердить окончательное удаление).

Это проблема баланса между скоростью работы с базой и безопасностью. Граница всегда будет не очень комфортна.
Использовать логическое удаление — взводить флаг, что данные удалены, который проверяют все подпрограммы и делают вид, что данных нет (при попытки записи пишут поверх и реально удаляют данные). Если физическое удаление принципиально (например, вопрос приватности) выполнять его с задержкой, если флаг не был снят в течении какого-то времени или при следующем старте железки (если она часто перезапускается, а не работает годами без перезагрузки, разумеется). Подтверждение обычно самое простое в техническом плане решение, очень просто надобавлять диалоговых окон в уже имеющийся код, отмена действия требует изменения внутренней логики работы приложения.
Да очень просто. Текущее состояние памяти переносится в архив. После этого память забивается нулями. При необходимости можно восстановить из архива. Чтобы архив не раздувался, храните откаты на строго определенную глубину — 1,2,4,10…

Странно что такое тривиальное решение не приходит в голову.
Я же написал выше — речь о микроконтроллере или ПЛИС. А у них с памятью под архивы негусто, и дублировать значительные объемы объемы информации — нет возможности ))
А прочитать и запомнить на компе? Никак?

Ну вот пример. Мы работаем с БД. Таблиц очень много (тысячи, если не десятки тысяч). Для каждой таблицы есть модуль ее ведения (добавление/удаление/изменение записи). Все изменения делаются только через него.

У каждой таблицы есть т.н. «журнал» в котором есть заголовок (там содержится в том числе и информация кто и когда вносил изменеия). Этот заголовок есть ключ. Дальше идет образ записи. При изменении туда заносится две записи — с образами Before и After (при удалении только Before, при добавлении только After).

Есть еще «головной журнал» — туда пишется имя таблицы, тип изменения и заголовок для поиска записи в детальном журнале.

Такая система позволяет мониторить все изменения в таблицах и откатывать (по журналу в обратном порядке) состояния таблиц обратно на любой момент времени.

Если у вас есть возможность прочитать текущее содержимое ПЛИС, то перед любым изменением его можно прочитать и занести в журнал на ПК. А потом откатить при необходимости.
Времена, когда пользователи бездумно жали «Да» во всех подряд диалоговых окнах закончились тогда, когда каждый первый сайт стал упорно проситься в уведомления. Приходится читать и делать правильный выбор

Я вообще отключил эту теперь бессмысленную фичу

Сайты начали эволюционировать и теперь показывают сначала не встроенное в браузер окно, а своё собственное, на JS.

Ну подписать всё-равно не смогут

Зато показать окошко-то смогут.

Высший пилотаж — это вообще какое-нибудь такое окошко показать поверх всего прямо в HTML, а уже убирать — через JS.

Чтобы точно не избежали.
Умиляют подобные статьи. Всем давно понятно что undo и отсутствие окошек — куда лучше чем модалка с подтверждением. Но почему-то, с появлением касты UXD — далеко не всем понятно, что undo — часто на порядки более сложная в реализации штука.

Особенно умиляют молодые UXD, которые на голубом глазу приносят бизнес-аппам картинки с нотификашками типа «сотрудник Иван уволен [отменить]». Уходят грустные, обиженные почему-то на разрабов.

Кто-нибудь хоть приписывал к таким статьям врезку про то, почему UXD часто с такими штуками посылают. Можно что-нибудь про мульти-вселенные, с отсылками к фильму «Назад в будущее» — часто именно настолько сложно сделать отмену действия. Особенно когда у тебя распределенная система, и ты запустил процесс, в котором параллельно участвует десятки систем и людей.
А с другой стороны, часто инерция мешает понять что совсем даже и нет никакой магической проблемы с отменой действия, даже если это распределенная система. Есть нежелание ломать парадигму, но это не проблема молодых дизайнеров, это проблема старых бэкендеров
Если захотеть, то в 99% случаев отмену сделать можно. Например, просто задержкой выполнения операции. Тот же gmail позволяет отменять отправку сообщения, хотя на первый взгляд отменить отправку сообщения на внешний неподконтрольный сервер (и при том, что протокол электронной почты не предусматривает никаких отмен) выглядит не менее сложной задачей, чем отменить официальное увольнение сотрудника. Но на помощь приходит задержка перед выполнением операции, логическое удаление и комбинация этих двух методов (сначала удалить логически, физически когда-нибудь потом). Просто бекэндерам придётся немного подумать, а не написать шаблонный CRUD.

Никто не предлагает делать бесконечную возможность отмены, это действительно, не всегда возможно. Возможность отмены нужна для защиты от ошибочных действий. Если руководитель понял, что уволил не того сотрудника, спустя неделю после увольнения, то это уже клиника.
Про этот принцип еще сам Джефф Раскин писал еще 20 лет назад (Раскин Д. Интерфейс: новые направления в проектировании компьютерных систем. — Пер. с англ. — СПб: Символ-Плюс, 2003. — 272 с., ил). Вот цитата, аж в виде скришота, для солидности:

Впрочем, хорошее повтори и еще раз повтори.

В принципе, в мире программ все можно либо отменить (применив обратную операцию), либо заснепшотить и откатить (если обратной функции не существует, или она слишком трудоёмка). Другое дело взаимодействие с физическим миром — если после подтверждения фреза уже коснулась заготовки — то обратного пути не может быть.


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


Более-менее вменяемым компромиссом может быть внезапный вопрос/задание, ломающее шаблон мыслей юзера — типа «введите простое число, большее X” — но это тоже не 100% панацея — так как мозг часто проявляет свою «двухядерность» — одна часть не задумываясь о смысле продолжения просто просит вторую решить задачу и нажать ОК вместо просто нажатия ОК ;)

В нашем интерфейсе станка, после запуска программы, пока считался lookahead, интерфейс показывал грубо что за деталь и общие параметры программы, коэффициенты подачи, материал, инструменты и прочее. Все это специально делалось небыстро и обратимо, давая 15-20 секунд на осознать даже еще до того как началось первое движение.
Плюс полминуты к программе погоды не делают, она может часы занимать, а удобства такой подход добавляет.
Чем заставлять пользователя прыгать выше головы, нажимая на красные кнопки, лучше подумать и помочь ему поменьше косячить.
Ох и статья, вредных советов! Как же это раздражает, что если я к примеру хочу удалить плагин WordPress, то будь добр удали его, и не надо оставлять мне следы жизнедеятельности о плагина в базе данных (Если мне будет надо, я снова востановлю) Но нет же, если разработчик не позаботился о правильном удалении получи портянку неиспользуемого кода в базу. Если я хочу удалить свой аккаунт в социальной сети (даже если на меня сейчас нашло помутнение), то надо это сделать, а не просто скрыть мою страницу, что б потом за мой лайк под неугодной правительству фото меня ещё привлекли. Не надо так делать! Если пользователю дается право на удаление какой-то информации, это право должно быть реализовано. (Бэкапы вроде ни кто не отменял)

Как проверить, удалено или скрыто? Ждать слива? Ставить прокурора каждому сервису?
Как организовать удаление в бд, которые не рассчитаны на удаление из-за фрагментации и других фич с этим связанных?

Ну как бы соцсеть может слить и данные об «удалённом» аккаунте. Если между соцсетью и спецслужбами есть интеграция (а иначе скрытые для публики данные не увидит и товарищ майор, если только он не успел сделать нотариально заверенный скриншот, но в таком случае вам уже не поможет вообще ничего), то скорее всего полное удаление данных запрещено законодательно и за реализацию такой функции соцсети прилетит как минимум штраф, а то и проблемы посерьёзнее. А раз сохранение резервной копии для спецслужб всё равно неизбежно, то почему бы не дать пользователям возможность восстановить страницу в течении какого-то времени.
Соцсети хранят инфу вечно, и это тоже неправильно. Но вечно хранить никто и не призывает. Призывают хранить столько, чтобы человек успел понять что он что-то натворил и успел передумать. А сколько это — зависит от ситуации, секунды, минуты, дни.
Но естественно, удаление должно рано или поздно привести к удалению.
Оно не приведет к удалению. Если на кнопке написано «Удалить» — она должна удалять, а не скрывать, прятать, перемещать во временное хранилище, или делать копию для моих данных для спец служб и тд. Если пользователь не читает, предупреждающие сообщения это исключительно его проблемы.
У нас цель сделать удобный интерфейс, или педантично исполнить какой-то строго определенный кодекс, основанный исключительно на «так всегда делали»?
У нас нет и никогда не может быть задачи сделать так, чтобы у пользователя были «исключительно его проблемы», это худшее что может случиться с UX. У нас должна быть задача сделать пользователю удобно, и она решается в том числе подкапотной магией временных бэкапов, не смотря на то что там написано на кнопке.
Опять же, когда вы нажимаете удалить на файл, он физически-то не удаляется, а только помечается удаленным. С этим-то у вас нет проблем?

Ну это смотря что за ФС и что за носитель.
Зачастую (на SSD и со включенным discard) всё удаляется физически можно сказать мгновенно (SSD обычно стирает ячейки сразу же когда ему это разрешают).
Хотя да, "обычно" не гарантирует того, что всё будет работать так всегда.

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

Я боюсь тут даже вопрос не в UXD, а в юристах.

(Бэкапы вроде ни кто не отменял)
Ну вот вы же просите их отменить.
Несмотря на все приведенные доводы, считаю что лучшее решение это — комбинация нескольких. То есть правильнее давать пользователю возможность отмены действия (если это можно реализовать) но также ждать его подтверждения.
бороться с автоматизмом иногда можно меняя порядок кнопок в диалоге подтверждения. если в системе (винде, например) принято кнопку «да» размещать слева, то в диалоге она должна быть справа. и еще лучше выделять кнопку «отмена».
И еще чтобы первые пять секунд кнопка «ДА» убегала от указателя мыши.
Тут уже рассказивали про многозадачность мозга. Даже если вам нужно будет решить диффур, чтобы что-то удалить, но вы будете этот диалог видеть достаточно часто… Ну научитесь быстро решать диффуры, только и всего.
Это чтобы пользователя позлить в дополнение к рандомному интерфейсу.
На самом же деле просто нужна адекватность мер.
Бывало приходилось набирать YES полностью и нажимать ENTER, чтобы подтвердить намерения.
Не вижу тут ничего плохого, если это действие, которое вы совершаете, скажем, раз в месяц. Или ещё реже.

Если же подтверждать приходится постоянно — то можете считать у вас там никакого подтверждения и нету…
кстати, в Firefox в диалоге загрузки файла кнопка «OK» несколько секунд неактивна (disabled)
Довольно толковая защита от случайного нажатия, я доволен.
Это действительно намеренный таймер? Тогда непонятно, почему это действие так принципиально выделено.
видимо чтобы случайно не запустить скаченный exe-шник
Так он по этой кнопке не запускается, только скачивается, и такое отложенное ожидание происходит для всех файлов.
Ну таки есть возможность сразу открыть файл в связанной с ним программе — тоже ничего хорошего.
Exe файлы раньше тоже можно было запускать автоматом, потом отключили.
Звучит как агрессивный дизайн, воюем с пользователем. Когда я встречаю такое в реальности, оно меня только раздражает. Ментальное усилие тратится не на вопрос «а не фигню ли я творю», а на войну с дизайном и раздражение на того кто это придумал.
Лучше вообще не использовать кнопки «Да»/«ОК» и «Нет»/«Отмена». Например, подтверждение очистки журнала в одной из программ моей компании содержит кнопки «Очистить» и «Не очищать».
А мне как раз удобнее наличие подтверждения на существенные действия. Внимание расслабить слишком легко, а дополнительный контроль на существенные действия помогает лишний раз проверить детали.
Я думаю, что если вы используете подтверждение действия, то будет куда лучше добавить ещё и отмену действия. Потому что когда реализована только отмена действия (ещё и в 5 секунд), то я, например, в новом интерфейсе паникую, пока ищу, куда нажать, чтобы отменить действие. Пять секунд мало.

Согласен насчёт названия кнопок. Гораздо легче бездумно кликнуть на «ОК», чем на «Удалить most-important-file.txt»

А какие минусы у промежуточного варианта — кнопка, которую надо удерживать некоторое время? Что-то редко где вижу такое решение. И случайно не нажмётся, и отменить есть возможность.

Я думал о кнопке, которую нужно нажать 2 раза, чтобы применить действие. Но в реальности это лишь будет «блин, кто придумал два раза нажимать на кнопку? Я трачу время»
И случайно не нажмётся, и отменить есть возможность.
Нажмётся, разумеется. Сознание так устроено. Всё, что происходит между началом действия и моментом, когда оно завершено и можно расслабиться, после достаточного числа повторений мозг склассифицирует и упрессует в одно метадействие «удалить репу».

Даже если вы там чечётку заставите на камеру сплясать — неважно абсолютно. Хоть два клика, хоть долгое нажатие, хоть как.

Отмена в течении некоторого времени действует за счёт того, что вот это самое автоожидание после отправки/удаления — «вас не касается». «Репа», с точки зрения мозга, удалена, процесс завершён… можно «открутить стек задач» на один шаг и подумать — а ту ли, вообще, мы репу-то удалили, чёрт побери?

а если предоставить пользователю выбор через доп. настройки?
Меня вполне устраивает обычные операции по удалению делать с возможностью отмены/восстановления, а безвозвратные — с отдельным подтвержением. (напр. Del удаляет файл в корзину, а Shift+Del — совсем удаляет, но перед этим спрашивает, в здравом ли я уме и твёрдой памяти) :)

Sign up to leave a comment.