Самое бедное лицо решает первым
Разбирали экран с общей игровой доской. Доска на двоих: двигаешь фишки, никаких правил, кто как играет — договариваются сами. И там строчка, на которую я до сегодняшнего дня смотрел и не видел:
перетаскивание доступно обоим и в любой момент
Перетаскивание. Единственный способ походить. То есть с клавиатуры играть нельзя, а экранному диктору не достаётся вообще ничего: доска молча меняется, и всё.
Сел думать, как делать доступную доску. Это, честно говоря, самая неприятная задача во всём продукте: сетка, фишки, две руки, которые тянут одновременно. Прикидывал фокус, роли, живые области, где объявлять изменения.
А потом открыл соседний документ.
Ответ был написан три недели назад
У продукта три лица: браузер, терминал и админка. Терминальный клиент — самый зажатый: там нет мыши, нет картинок, нет анимаций, есть моноширинная сетка и клавиши. И в его документе, в разделе про доску, спокойно лежало:
·───·───· · игра: точки и клетки
│ вы│ │ ваш ход
·───· · ·
[hjkl] выбрать ребро [enter] ход [esc] выйти
Это и есть доступная доска. Дискретный выбор, явное подтверждение, обратимый выход. Ни одной вещи не надо придумывать: бери и переноси в браузер.
Причём переносить оказалось совсем дёшево, и вот почему. Раньше в спеке было записано решение описывать игры примитивами, а не названиями: не «шашки, домино, нарды», а «доска-сетка», «свободный стол», «колода и рука», и четыре операции над фишкой — взять, положить, повернуть, перевернуть. Решение принималось ради движка: чтобы новая игра была строкой в таблице, а не новым экраном.
Так вот эти четыре операции и есть готовый словарь для клавиатуры. И для диктора тоже: «положила фишку на e4», «перевернула шашку на c3». Решение, принятое ради одного, окупилось в месте, о котором никто не думал. Приятно, когда так, — редко.
Почему так вышло, а не случайно
Терминал нельзя сделать недоступным «по недосмотру». В нём нет перетаскивания как варианта. Ограничение не позволило принять ленивое решение, и разработчик терминала — я же — был вынужден придумать дискретную грамматику в первый же день.
В браузере можно всё, поэтому в браузере я взял самое очевидное, а самое очевидное оказалось самым исключающим. Богатая среда не наказывает за плохой выбор сразу; она наказывает потом и не тебя.
Отсюда правило, которое я забираю себе: если делаешь одно и то же в нескольких средах, начинай с самой бедной. Не потому, что она важнее — по числу пользователей терминал у нас, скажем прямо, не победитель. А потому, что она не даёт схалтурить, и её решение почти всегда переносится вверх. Обратно — почти никогда: попробуйте перенести drag-and-drop в консоль.
Частный случай того же: если застряли на доступности, посмотрите, как эта же функция сделана там, где нет мыши. Скорее всего, она там уже доступна — просто потому, что иначе не работала бы вовсе.
Бонусом — конфликт двух правил, где оба правы
Заодно вылезло место, где два наших документа спорят, и оба по делу.
Экран доски: «зум на большой доске — нормально, го на телефоне иначе не помещается». Документ о доступности, правило номер три: «цель касания не меньше 44 px».
Клетка го на телефоне — это пиксели три. Формально нарушение. По сути — нет: человек сам приближает доску, и промах по клетке стоит одного движения обратно, а не увода в другой раздел.
Разрешил в пользу зума, но не молча: провёл границу по смыслу. 44 px — про органы управления, где промах уводит не туда: кнопки, меню, «пожаловаться» рядом с «лайком». Клетка доски — поверхность, а не орган управления.
И пометил прямо в тексте, что это первое исключение в списке, который до сих пор держался вообще без исключений. Такое надо считать вслух: два исключения — это уже не список правил, а список пожеланий.
Что унести к себе
Начинайте с самого зажатого клиента. Терминал, старый браузер, экран 320 пикселей, человек без мыши — что у вас в этой роли. Там нельзя принять ленивое решение, поэтому оттуда решения переносятся вверх, а не наоборот.
И когда застрянете — проверьте, не написан ли ответ уже. У меня он лежал в соседнем файле три недели и терпеливо ждал, пока я перестану проектировать заново.