Часть III. Язык клиента и его устройств
Утром в воскресенье Eugen Valuev и YAPL завтракали в кафе напротив зала MS DevCon. На столе стояли два ноутбука, два телефона, две чашки. Всё попарно, всё разное. Eugen открыл на своём экране папку с фотографиями и перетащил её в другое место — одним движением, без вопросов. YAPL открыл ту же папку на своём устройстве и получил аккуратный вопрос: «Переместить или скопировать?»
— Вот, — сказал YAPL, улыбаясь. — Ты только что увидел разницу между нашими мирами за три секунды.
Eugen посмотрел на свой экран, потом на экран друга.
— У меня действие — это действие, — сказал он. — Перетащил — значит, переместил. Если ошибся, отменишь. Быстро, прямо, без лишних слов.
— А у меня действие — это вопрос, — ответил YAPL. — Система спрашивает, что ты имел в виду, прежде чем что-то менять. Медленнее, зато реже приходится отменять.
Они не спорили. Они переводили. Целый час они переводили друг другу обычные действия с одного диалекта на другой. «Удалить» в мире Windows часто означало «убрать с глаз, но оставить возможность вернуть». «Удалить» в мире Apple часто означало «убрать совсем, но сначала спросить дважды». «Поделиться» в одном мире означало «дать ссылку всем, у кого она есть». «Поделиться» в другом — «выбрать конкретных людей и решить, что именно они увидят».
— Знаешь, что здесь самое коварное? — сказал YAPL. — Слова одинаковые, а смысл разный. Человек переходит с одной платформы на другую и думает, что говорит на том же языке. А на самом деле он говорит на диалекте, где его «да» значит немного другое «да».
Eugen кивнул и вспомнил вчерашний разговор про helpful disambiguation для Registry. Там система не угадывала, что имел в виду человек, а уточняла — вежливо и точно. Перевод между диалектами, понял он, — это та же самая работа, только в масштабе целых платформ. Не угадать за человека, а уточнить так, чтобы человек сам узнал своё намерение в предложенной формулировке.
Они придумали игру. YAPL называл действие — «закрыть», «сохранить», «отправить», «разрешить», — а Eugen должен был сказать, что это действие значит в каждом мире и где прячется ловушка перевода. Ловушки находились быстро. «Закрыть» окно — не значит «выйти» из программы. «Сохранить» файл — не значит «отправить» его кому-то. «Разрешить» доступ — не значит «разрешить навсегда».
— Переводчик, который переводит только слова, — сказал Eugen, — предаёт смысл. Хороший переводчик переводит намерение. Он спрашивает: чего ты на самом деле хотел, когда нажал эту кнопку?
YAPL записал эту фразу и добавил свою: «Диалект — это не ошибка языка. Это его память». Windows помнит мир, где человек — хозяин машины и отвечает за свои действия сам. Apple помнит мир, где машина — хранитель человека и обязана переспросить, прежде чем рисковать. Оба мира правы в своей памяти. Неправ тот перевод, который делает вид, что памяти нет.
К концу завтрака у них получился короткий словарь. Не словарь слов, а словарь намерений. В нём было всего пять строк, но каждая строка спасала от одной ловушки. «Я хочу убрать это с глаз» — не то же самое, что «я хочу уничтожить это навсегда». «Я хочу показать это другу» — не то же самое, что «я хочу опубликовать это для всех». «Я хочу, чтобы это работало сейчас» — не то же самое, что «я хочу, чтобы это работало всегда и везде».
— Если бы у каждого перевода был такой словарь, — сказал YAPL, — людям не пришлось бы учить два языка. Им достаточно было бы говорить о том, чего они хотят.
— А машины учились бы слушать намерение, — добавил Eugen, — а не только команду.
Язык клиента и его устройств не един. Он существует в диалектах, и это не недостаток, а следствие истории. Каждая платформа выросла из своего представления о человеке: кто он, чего боится, за что отвечает. Windows говорит с человеком как со взрослым хозяином: ты решил — ты отвечаешь, отмена есть, но спрашивать каждый раз — значит мешать. Apple говорит с человеком как с гостем, которого надо беречь: лучше переспросить, чем позволить необратимое действие по ошибке.
Оба диалекта описывают одни и те же действия, но вкладывают в них разный вес. Поэтому перевод между ними нельзя сводить к замене слов. «Удалить» — «удалить», «поделиться» — «поделиться», а смысл уже уехал в другую сторону. Переводчик, который не замечает этого сдвига, не переводит, а подделывает согласие: человек думает, что сказал одно, а система поняла другое.
Отсюда положение этой главы: переводить надо не команды, а намерения. Команда — это то, как человек выразил желание в одном диалекте. Намерение — это то, чего он хотел на самом деле, независимо от диалекта. Хороший перевод находит намерение и выражает его средствами другого диалекта так, чтобы человек узнал себя в результате. Если человек смотрит на результат и говорит: «Да, именно это я и хотел», — перевод удался. Если он говорит: «Я не это имел в виду», — перевод предал смысл, даже если все слова переведены правильно.
Это правило работает и шире, чем между Windows и Apple. Оно работает между любыми двумя системами, которые говорят с одним и тем же человеком разными голосами: между телефоном и ноутбуком, между домом и работой, между старым устройством и новым. Везде, где человек переходит из одного мира в другой, ему нужен переводчик намерений, а не словарь кнопок.
И последнее. Диалекты не надо отменять ради единого языка. Единый язык, который стирает разницу, стирает и память, а вместе с ней — и осторожность, и свободу. Задача не в том, чтобы все заговорили одинаково. Задача в том, чтобы разные голоса научились понимать друг друга, не притворяясь одним голосом.
Возьмите одно действие, которое вы совершаете на двух разных устройствах: например, делитесь фотографией с телефона и с компьютера. Запишите, что происходит в каждом случае: что система спрашивает, что она делает по умолчанию, что можно отменить, а что — нет. Найдите место, где одно и то же слово означает разное действие.
Теперь составьте для этого действия словарь намерений из трёх строк. Каждая строка — в форме «я хочу…»: убрать с глаз или уничтожить навсегда, показать одному человеку или опубликовать для всех, разрешить один раз или разрешить всегда. Проверьте: если бы система спрашивала вас именно так, вы бы реже ошибались?
Для разработчиков — упражнение посложнее. Найдите в своём продукте действие, которое при переходе с другой платформы понимается неверно чаще всего. Добавьте туда не ещё одну подсказку, а вопрос о намерении: одну строку, которая различает два самых частых смысла. Это и есть перевод без предательства.
Почему перевод действия «удалить» с одной платформы на другую может предать смысл, даже если слово переведено правильно?
Ответ засчитывается, если в нём есть мысль: слово одно, а намерение разное — убрать с глаз с возможностью вернуть или уничтожить навсегда; хороший перевод переводит намерение, а не команду, иначе человек думает, что сказал одно, а система поняла другое.