User-hostile interfaces
В последнее время тема user friendly интерфейсов весьма популярна, производители ОС для мобильных телефонов предоставляют подробные указания, как писать хорошие интерфейсы… Так почему же ими невозможно пользоваться? А дело в фундаментальных ошибках, заложенных во все живые мобильные ОС: это однозадачные ОС. Нормальное приложение под android, ios или wp7 должно включать свой оконный менеджер, менеджер задач (как само управление задачами, так и пользовательский интерфейс к нему), обеспечивать изоляцию этих процессов и не падать при ошибках в некоторых из них, а также поддерживать режим сна и восстановление из него. Но это же задачи ОС! В рамках приложения их решить или очень сложно или невозможно. Рассмотрим примеры странного поведения мобильных ОС.
Предыстория
Когда-то нехорошие люди решили применить модную сборку мусора вместо традиционного закрытия приложений пользователем. Правда сделали её плохо: очистка запускалась, если заканчивалась память, и пользователя явно спрашивали, что он хочет закрыть. Чтобы память не забивалась ненужными более приложениями пошли на хитрый ход™: отказались от классической панели задач и сделали так, что запуск открытого приложения вызывал находящийся в памяти экземпляр. Таким образом, потерялась возможность открыть несколько документов одновременно (в том числе веб страниц). К счастью, любая сторонняя оболочка для windows mobile заменяла кнопку сворачивания на кнопку закрытия и добавляла панель задач. Некоторые приложения реализовали табы (тогда это были только браузеры Net Front и Opera Mobile), некоторые научились обманывать ОС и запускаться в нескольких экземплярах (некоторые читалки книг). Но проблема открытия нескольких документов осталась.
Наше время
Разработчики современных ОС решили, что идея была хорошая, только реализация плохая. И они сделали гораздо более продуманную и стройную систему. Она выглядит красиво, но… имеет сложное неочевидное поведение. А это то, чего нельзя допускать в программировании: обязательно найдутся случаи, когда система ведет себя странно.
Факты
- Мы говорим о мобильных ОС, работающих на мобильных телефонах, как правило соединяющихся с интернетом через GPRS/3G. А GPRS/3G работают очень неустойчиво. У МТС они почти не работают даже в Москве. Кроме того, это дорогой ресурс. В роуминге безумно дорогой. А в случае безлимитного тарифа типа БИТ, 5 мегабайт в час очень быстро кончаются. Другими словами: если что-то удалось загрузить с интернета, это ценный ресурс и его надо хранить.
- Просмотр веб страниц — это обход графа. Я просматриваю страницу хабра, открываю во вкладках интересные статьи, затем читаю их по очереди, открывая во вкладках ссылки, если там есть что-то интересное. Вкладок много и прочесть я их могу далеко не сразу.
Если нужно сделать выбор между несколькими предметами, их приходится сравнивать. Для этого нужно открыть несколько однотипных документов и быстро переключаться между ними.
Странное поведение
Автоматическое закрытие программ
Открываем браузер, открываем в нем вкладки, отвлекаемся на поступивший звонок или пришедший email. ОС закрывает браузер. Большая часть браузеров (встроенный, Doplhin browser, Opera, Firefox) грузят страницу заново, возможно забирая что-то из кэша. Только Chrome сумел загрузить страницу заново полностью из кэша, не имея подключения к интернету, только рекламу потерял. Это неприемлемо, см. факт 1 и 2. У меня интернет снова появится через 20 минут пути на электричке по ближайшему подмосковью, ах да, я же наконец ушел с МТС.
Открываем браузер, начинаем писать пост в блог/форум, сомневаемся в правильности какого-то факта, лезем в даташит, затем в словарь, возвращаемся в браузер… Куда? Куда делся набранный на экранной клавиатуре текст? Может быть при перезагрузке страницы надо было восстановить содержимое формы?
Открываем adobe reader, выбираем документ, переключаемся на другую задачу, затем снова на adobe reader. Почему мне опять показывают список документов? Если сразу открыть документ в adobe reader, то все нормально.
Открываем контакты в android ICS на huawei honor, выбираем импорт контактов с накопителя и, пока телефон тупит, опускаем руку с телефоном. Экран меняет ориентацию на ландшафтную, ОС пересоздает виджет и… окно выбора контактов исчезает.
Я проверил несколько популярных игр под андроид: angry birds, cut the rope, blade master, blockout 3D, death racing, nethack, крокодильчик Свомпи. Ни одна из них не реализует восстановление своего состояния при повторном включении. Только nethack сообщил мне, что нашел некорректно завершённую сессию и предложил её продолжить. Причем в крокодильчике Свомпи обнаружилась еще более сложное неочевидное поведение: при сворачивании игры она выгружает часть ресурсов и подгружает обратно, когда приложение снова активируется. Но при этом выключение корректно не обрабатывается.
Сохранение и восстановление сессий приложений есть в KDE с незапамятных времен. Много программ корректно его поддерживают? Так почему вы думаете, что программы под android будут его нормально поддерживать? Это сложный код и в нем обязательно будут ошибки. Разработчикам лениво и непонятно зачем его писать.
Открытие нескольких документов
Сейчас нет ни одного браузера без табов, надеюсь никому не надо объяснять, для чего они нужны. Но html не единственный формат, есть, например, pdf. В этом формате часто публикуют статьи. Иногда, просматривая тему на форуме, я встречаю по несколько ссылок на pdf, которые я хочу подгрузить в фоновом режиме для дальнейшего прочтения. А еще мне последнее время надо даташиты на электронные компоненты перед глазами иметь. PDF viewer не позволяет быстро между ними переключаться вообще. В Adobe reader нужно сделать тап на странице, затем на появившуюся кнопку «Главная» и выбрать среди недавно открывавшихся документов. Сойдет.
Редакторы. Текстовые в первую очередь. Их много, а табы нашлись только у 920 Text Edit. Вы действительно думаете, что когда я переключаюсь между документами, я хочу чтобы меня спрашивали, сохранить ли текущий документ? 5 тапов на переключение между документами (меню, файл, история, да сохранить, выбрать файл) — это лучше чем 5 обычных 5 длинных тапов в windows mobile 2003, но это никак нельзя назвать дружественным интерфейсом.
Электронные книги. Где табы? Никто же не читает две книги одновременно? Лет 8 назад я учился в школе, у меня был КПК и мне разрешили им пользоваться на уроках литературы. «Луч света в тёмном царстве» и «Грозу» надо иметь открытыми одновременно. Когда проходят стихи, они часто оказываются в разных сборниках, особенно если это «памятник» Пушкина и Державина. Их проходят одновременно, проводя сравнение между двумя этими стихотворениями. «Война и мир» выложена на lib.ru в четырёх томах, между ними надо быстро переключаться.
Вернёмся на землю. Яндекс.Афиша. Замечательное приложение, которое очень хорошо отвечает на вопрос: «Где рядом со мной идёт фильм X?». Но оно не позволяет решить, на какой фильм стоит сходить. Переключиться между описаниями фильмов можно только через алфавитный указатель, забитый мусором. Вот вам самые популярные фильмы, смотрите их.
Яндекс.Маркет. Тоже замечательное приложение, хорошо отвечает на вопросы: «Что это за железяка?», «Где её можно купить?». Но это приложение в принципе не предназначено для того, чтобы сравнить два товара или выбрать самый подходящий товар из категории. Это сложно писать, это загромождает интерфейс, это не нужно.
Но давайте вспомним, для чего запретили создание более одного экземпляра приложения? Для того, чтобы ручной сборщик мусора windows mobile не спрашивал постоянно пользователя, что закрывать! Это был костыль, как расположение кнопок на клавиатуре печатной машинки. Нет уже windows mobile, есть нормальный алгоритм сборки мусора и есть аналог панели задач. Так зачем оно сейчас?
А теперь подумайте, что происходит, когда у вас открыто много табов в приложении? У вас куча неиспользуемых документов, занимающих оперативную память. При нехватке памяти ОС должна их позакрывать, но ведь ОС про них не знает, поэтому она закроет приложение целиком. Есть ли такая проблема в настольных ОС? Нет, её давно решили: неиспользуемые блоки памяти переносятся в swap, память освобождается для тех приложений, которым она нужна. Но если в ОС есть сборка мусора, то swap ей не нужен. В итоге, приложения с табами идут в разрез с идеологией ОС и мешают ей нормально работать.
Выводы
- Не надо реализовывать сложное неочевидное поведение в программах или их компонентах. Они потом странно работают.
- Не надо тащить костыли из ОС, разработчиков которой разогнали и написали новую ОС с нуля.
- Не льстите себе. Прошло почти десять лет, а libastral так и не довели до production использования. Нейроинтерфейсы также все еще не пришли с экранов кинофильмов. Современная мобильная ОС способна предугадывать только самые базовые шаблоны поведения пользователей, весьма неплохо. Но не надо считать, что вы знаете о пользователях все.
Автор: kibergus