Я работаю в одной компании 13 лет и над одним и тем же проектом 11 лет. Этого достаточно, чтобы увидеть, как многие ошибки приходят и уходят. Я хочу поделиться чем-то, чего я боюсь так же сильно, как и любой активной ошибки. Я опишу жуков-призраков и то, как я с ними справляюсь, но сначала нам нужно прочитать Моби Дик.

Моби Дик

Из Моби Дика можно извлечь множество уроков, например, неуклонно следовать плохой идее вместо того, чтобы искать что-то лучшее. Я собираюсь рассказать о совсем другом, более неясном уроке.

Моя любимая часть Моби Дика находится в главе 69, Похороны». Китобойное судно закончило отделять тушу кита от ценных частей и выпустило тушу. Рассказчик книги описывает, как лишенное жира тело тонет, а затем снова всплывает, становясь пиршеством для акул и птиц. (Напоминает мне, как ошибка может привести к питательному анализу первопричины, но я отвлекся).

Что происходит дальше, чем я хочу поделиться:

И это не конец. Каким бы оскверненным ни было тело, мстительный призрак выживает и парит над ним, чтобы напугать. Замеченный каким-нибудь робким военным кораблем или неуклюжим судном-разведчиком издалека, когда расстояние, скрывающее роящихся птиц, тем не менее еще показывает белую массу, плавающую на солнце, и белые брызги, вздымающиеся высоко над ней; тотчас невредимый труп кита дрожащими пальцами кладут в бревно — отмели, скалы и буруны тут кругом: берегись! И еще, может быть, годы после этого корабли сторонятся этого места; прыгают через него, как глупые овцы прыгают через пустоту, потому что их вожак изначально прыгал туда, когда в руках была палка. Вот вам закон прецедентов; вот вам и полезность традиций; вот история вашего упорного выживания старых верований, так и не укоренившихся на земле, а теперь даже не витающих в воздухе! Есть православие!

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

Ты веришь в призраков, мой друг? Есть и другие призраки, кроме призрака Кок-лейна, и гораздо более глубокие люди, чем доктор Джонсон, которые верят в них.

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

Вот что происходит, когда ошибка исправлена, но она живет в памяти пользователей, их привычках и в их автоматизации. Я называю их «жуками-призраками».

Определение жука-призрака

жук-призрак: существительное. Исправлена ошибка, но пользователи продолжают использовать обходные пути.

Например, предположим, что на веб-сайте есть ошибка, из-за которой он падает, если вы щелкаете слишком быстро. Пользователи, которым приходится пользоваться сайтом, учатся нажимать медленно и, скорее всего, будут продолжать нажимать медленно даже после того, как вы исправите проблему, постоянно проклиная дизайнера. Хуже того, те, кому не нужно использовать сайт, уйдут и не вернутся, даже если ошибки будут исправлены.

Предположим, вы поддерживаете инструмент командной строки с замечательной функцией добавления милых щенков. Однажды вы добавляете ошибку, из-за которой щенки вызывают ужасное падение производительности. Пользователи жалуются, и вы говорите им, что они могут использовать --no-puppies, чтобы отключить щенков и получить функциональный, хотя и менее приятный результат. Вы исправляете регрессию на следующий день, но они уже добавили этот переключатель в свои скрипты, так что теперь вы застряли, поддерживая интерфейс без щенков в дополнение к стандартному.

Как избежать ошибок-призраков

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

Если у вас есть ошибка, иногда вы можете предотвратить ее вторую жизнь в виде ошибки-призрака.

Отказ от обходных путей

Если у вас есть возможность быстро исправить ошибку, может иметь смысл не информировать пользователей о возможных обходных путях. Если я могу решить проблему за 10 минут, я бы предпочел не сообщать пользователям, как ее обойти. Излишне говорить, что это не относится к очень серьезным ошибкам, на исправление которых уходят недели. Это одно из неочевидных преимуществ хорошо отлаженного конвейера развертывания.

Обходные пути самоуничтожения

Если вы не можете избежать обмена обходными решениями или пользователь находит их самостоятельно, все еще может быть возможно автоматически определить, когда пользователи используют обходные пути после устранения проблемы. Обычно я делаю обходное предупреждение на месяц или около того, прежде чем сделать серьезную ошибку, чтобы дать моим пользователям время для адаптации. Может показаться жестоким подвергать пользователей ошибке дважды, но это спасет вас в долгосрочной перспективе.

Связь с пользователем

Если вы не можете автоматически обнаружить обходные пути, вы всегда можете сообщить об этом пользователям по своим обычным каналам. К сожалению, у меня очень низкие ожидания, что таким образом вы сможете охватить более 75% пользователей. Я видел пользователей, с которыми я регулярно встречаюсь, которые все еще используют обходные пути спустя годы после того, как они были исправлены. Хуже того, я видел новых пользователей, использующих обходные пути, которые не были нужны в течение десяти лет, прежде чем они присоединились. Их тренировал кто-то, кого тренировал кто-то, кого укусил жук.

Заключение

Привычки формируются быстро, и сценарии быстро обновляются, добавляя обходные пути, но медленно удаляя их. Я не думаю, что долгоживущие системы с пользователями действительно могут избежать ошибок-призраков, но, надеюсь, наличие языка, на котором можно говорить о них, может немного помочь. Оптимизируйте свои конвейеры развертывания для быстрого исправления, избегайте обмена обходными решениями, если возможно быстрое исправление, превращайте обходные пути в ошибки, когда ошибка исправлена, и, если ничего не помогает, войте на ветер. Удачной охоты на жуков-призраков!