← все записи

Самое бедное лицо решает первым

29 августа 2026, 19:05

Разбирали экран с общей игровой доской. Доска на двоих: двигаешь фишки, никаких правил, кто как играет — договариваются сами. И там строчка, на которую я до сегодняшнего дня смотрел и не видел:

перетаскивание доступно обоим и в любой момент

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

Сел думать, как делать доступную доску. Это, честно говоря, самая неприятная задача во всём продукте: сетка, фишки, две руки, которые тянут одновременно. Прикидывал фокус, роли, живые области, где объявлять изменения.

А потом открыл соседний документ.

Ответ был написан три недели назад

У продукта три лица: браузер, терминал и админка. Терминальный клиент — самый зажатый: там нет мыши, нет картинок, нет анимаций, есть моноширинная сетка и клавиши. И в его документе, в разделе про доску, спокойно лежало:

   ·───·───·   ·       игра: точки и клетки
         │ вы│   │           ваш ход
         ·───·   ·   ·
        [hjkl] выбрать ребро   [enter] ход   [esc] выйти

Это и есть доступная доска. Дискретный выбор, явное подтверждение, обратимый выход. Ни одной вещи не надо придумывать: бери и переноси в браузер.

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

Так вот эти четыре операции и есть готовый словарь для клавиатуры. И для диктора тоже: «положила фишку на e4», «перевернула шашку на c3». Решение, принятое ради одного, окупилось в месте, о котором никто не думал. Приятно, когда так, — редко.

Почему так вышло, а не случайно

Терминал нельзя сделать недоступным «по недосмотру». В нём нет перетаскивания как варианта. Ограничение не позволило принять ленивое решение, и разработчик терминала — я же — был вынужден придумать дискретную грамматику в первый же день.

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

Отсюда правило, которое я забираю себе: если делаешь одно и то же в нескольких средах, начинай с самой бедной. Не потому, что она важнее — по числу пользователей терминал у нас, скажем прямо, не победитель. А потому, что она не даёт схалтурить, и её решение почти всегда переносится вверх. Обратно — почти никогда: попробуйте перенести drag-and-drop в консоль.

Частный случай того же: если застряли на доступности, посмотрите, как эта же функция сделана там, где нет мыши. Скорее всего, она там уже доступна — просто потому, что иначе не работала бы вовсе.

Бонусом — конфликт двух правил, где оба правы

Заодно вылезло место, где два наших документа спорят, и оба по делу.

Экран доски: «зум на большой доске — нормально, го на телефоне иначе не помещается». Документ о доступности, правило номер три: «цель касания не меньше 44 px».

Клетка го на телефоне — это пиксели три. Формально нарушение. По сути — нет: человек сам приближает доску, и промах по клетке стоит одного движения обратно, а не увода в другой раздел.

Разрешил в пользу зума, но не молча: провёл границу по смыслу. 44 px — про органы управления, где промах уводит не туда: кнопки, меню, «пожаловаться» рядом с «лайком». Клетка доски — поверхность, а не орган управления.

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

Что унести к себе

Начинайте с самого зажатого клиента. Терминал, старый браузер, экран 320 пикселей, человек без мыши — что у вас в этой роли. Там нельзя принять ленивое решение, поэтому оттуда решения переносятся вверх, а не наоборот.

И когда застрянете — проверьте, не написан ли ответ уже. У меня он лежал в соседнем файле три недели и терпеливо ждал, пока я перестану проектировать заново.

← визитка · RSS