Кто-то нажал на маленький латвийский флаг в углу нашего сайта, и ничего не произошло. Меню закрылось. Адрес в строке изменился. Маленькая иконка глобуса поменяла надпись. И каждое видимое слово на странице оставалось на английском, самодовольное и неподвижное. Жесткое обновление страницы исправило это мгновенно. Мы наблюдали, как это происходит десятки раз подряд: переключение, сосредоточенный взгляд, обновление, переключение, сосредоточенный взгляд, обновление, как будто продолжали щелкать выключателем света в комнате, где, вы знали, есть электричество.
Самая раздражающая часть заключалась в том, что все было правильно. Латвийские слова пришли. Они находились в памяти, разобранные, идеальные. Часть системы, отслеживающая, какой язык вы выбрали, с полной уверенностью знала, что вы хотите латышский. Единственное, что в здании не знало, это сама страница, та часть, чья единственная задача заключалась в том, чтобы это показать.
Поэтому мы начали искать пропущенное уведомление. Когда экран не обновляется, вы ищете сообщение, которое должно было это сделать. Мы потратили на это достаточно времени. Мы сделали уведомление громче. Мы убедились, что каждый уголок страницы его услышал. И они действительно его услышали. Они снова посмотрели слова, добросовестно, и вернули точно тот же английский текст, который уже возвращали раньше. Звонок звонил. Информация была свежей. Вид просто не двигался.
Что мы наконец поняли, так это то, что экран не упрямый, он честный. Он перерисовывает себя только тогда, когда что-то, что он действительно отслеживает, изменяется. А он никогда не следил за коробкой, в которой находились слова. Он заглядывал в эту коробку, брал слово и уходил, не оставив ни одной ниточки, привязанной к нему. Поэтому, когда мы заменили всю коробку английских слов на коробку латвийских, экран не ощутил повода для движения. Он ничего не чувствовал, поэтому ничего не сделал. Механизм работал точно так, как задумывалось. Мы были теми, кто тихо обрезал нить.
Ремонт свелся к тому, чтобы снова привязать эту нить, а затем сделать одну маленькую, почти глупую вещь: дать экрану умышленный щелчок по плечу в тот момент, когда новые слова появились, даже несмотря на то, что, технически, ничего не изменилось относительно того, какой язык вы выбрали. Без этого щелчка экран продолжал читать значение, никогда не чувствовал его движения и оставался застывшим на первой загрузке. Один небольшой толчок. Вся ошибка.
Урок не о экранах. Он о разрыве между правильными данными и тем, что человек на самом деле видит правильное. Большинство малых бизнесов, работающих на куче соединенных инструментов, имеют версию этой самой ошибки. В списке контактов указан новый адрес. Этикетка для отправки по-прежнему печатает старый, потому что принтер-этикеток загрузил свою копию, когда кто-то вошел в систему этим утром, и никто не сказал ему взглянуть снова. Счета знают, что счет был оплачен. Напоминание все равно уходит, потому что напоминание читает из снимка, сделанного в полночь. Каждый инструмент, по своему, правильный. То, что получает ваш клиент, неправильно. И ваша команда проводит понедельник, извиняясь за ошибку, которую ни одна отдельная система на самом деле не допустила.
Инстинкт, когда это происходит, — прикрепить еще одно уведомление, еще одно маленькое сообщение, передаваемое между приложениями, еще одну синхронизацию на ночь. Иногда это помогает. Чаще всего это добавляет третью версию истины, которая не согласуется с первыми двумя. Глубокое исправление — это то, к чему мы пришли: сделать так, чтобы нижележащая вещь действительно зависела от вышестоящего значения, с настоящей нитью, привязанной между ними, а не тихо копировала значение в частный ящик и надеялась позже вспомнить, чтобы выкинуть устаревшую копию. Копия, которую вы должны помнить, чтобы обновить, просто ошибка с таймером задержки на ней. Нам важны такие вещи, и это заложено в то, что мы создаем. Если ваш стек не позволяет вам даже выразить, что одно приложение должно действительно следовать за другим, это настоящая цена стека, и она почти всегда выше, чем счет.