Нет, это не опечатка. Мы действительно облажались.

Что случилось?

26 апреля 2019 года в 8.31 утра мы увидели отчет пользователя, в котором упоминалось, что наше расширение Chrome открыло вкладку на демонстрационной странице.

Оказалось, что в обновлении версии 2.1.0.10 нашего расширения, которое включало небольшое изменение для открытия демонстрационной страницы при установке, была ошибка, из-за которой демонстрационная страница открывалась каждый раз при запуске расширения background.js.

Для тех, кто не знаком с расширениями Chrome, это означает, что каждый раз при инициализации расширения, например при открытии Chrome или выходе из спящего режима и переходе в Chrome.

В результате этого инцидента в течение 24 часов было удалено 296 приложений. Наши ежедневные деинсталляции обычно составляют от 10 до 20. Хотя ошибка проста и была быстро исправлена ​​(подробнее ниже), она вызвала резкий скачок количества удалений. Мы даже получали угрозы смертью среди слов поддержки.

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

Лента новостей

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

25 апреля 2019 г.
20:36 SGT: Наши инженеры отправили расширение версии 2.1.0.10 в Chrome Store.

21:53 SGT: Первая форма удаления, в которой проблема описывалась спокойно: «Она открывала страницу покупок под предлогом [sic], чтобы показать мне, как это работает, хотя я уже использовал ее раньше».

23:46 SGT: Первый прямой отчет из канала поддержки пользователей: «Расширение открывает вкладку для демонстрации из ниоткуда».

26 апреля 2019 г.
08:31 SGT: Первый взгляд на проблему, о которой сообщил клиент.

09:00 SGT: Проблема передана на рассмотрение инженерной группе.

09:11 SGT: проблема, подтвержденная инженером другой группы, что проблема возникает у всех пользователей с 2.1.0.10. Проблема повышена до наивысшего приоритета.

10:19 SGT: PR по исправлению ошибки был сделан инженером, который внес первоначальное изменение. Версия расширения 2.1.0.11 представлена ​​в Chrome Store. (Начинаем работу в 10:00)

11:57 SGT: Мы разослали всем нашим пользователям электронное письмо с подробным описанием проблемы и о том, что исправление уже находится на рассмотрении. Предусмотрено немедленное исправление (к сожалению, отключение расширения)

12:57 SGT: Опубликована версия 2.1.0.11.

Почему так случилось?

  1. Почему мы хотим открывать демонстрационную вкладку при установке?

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

2. Почему открылась вкладка при инициализации расширения?

К сожалению, это была непреднамеренная ошибка, которая не была обнаружена в процессе разработки и развертывания, из-за которой вкладка открывалась каждый раз при инициализации расширения.

Чтобы дать некоторый контекст, ниже приводится выдержка ошибочного изменения:

class DemoInitializer {
    public static initialize() {
        // old
        this.setUpInstallListenerToIncludeLinkToDemoOnInstallPage() 
        // new
        this.openLazadaDemoPage()
    }

...
}

Первоначальная функция размещения демонстрационной кнопки на странице после установки заменена функцией открытия демонстрационной страницы.

3. Почему ошибка не была обнаружена до ее развертывания?

Поскольку изменение кода довольно небольшое, было легко упустить из виду основную проблему, которую вызывает DemoInitializer при инициализации расширения.

Автор предположил, что слушатель для размещения демонстрационной ссылки вызывается один раз сразу после установки. Фактически он вызывается при инициализации для прослушивания страницы после установки, которая открывается только путем добавления слушателя в onInstalled.

Код setUpInstallListener… () был скрыт от рецензента, поскольку в коде функции не было изменений.

Тестирование и обеспечение качества были проведены, но только в положительном случае. Повторное открытие Chrome как негативный случай не рассматривалось.

4. Почему раньше ошибка не обнаруживалась в производственной среде?

Проверка Chrome Store обычно занимает 1-2 часа, прежде чем новая версия станет доступна пользователям. Расширения Chrome обновляются автоматически (обычно в течение 24 часов при активном использовании Chrome).

Команда расширения не следила за появлением новой версии и выполняла принудительное обновление, чтобы протестировать новые функции. При этом предполагается, что развертывание было произведено в нерабочее время около 20:00.

5. Почему развертывание было произведено в нерабочее время?

В четверг была спешка по развертыванию, и новая версия не включала сложных изменений. Команда также знает, что следует избегать развертывания по пятницам (из предыдущих уроков развертывания).

6. Почему количество удалений увеличивалось даже после того, как исправление было опубликовано в Chrome Store?

К сожалению, многие пользователи получили 2.1.0.10 в пятницу утром (начало работы означает загрузку компьютеров и открытие Chrome). Поскольку браузер недавно обновил расширение, разумно предположить, что этим затронутым пользователям потребовалось больше времени для поиска новой версии.

Пики деинсталляции утихли в пятницу вечером.

Что было хорошо

Меры быстрого реагирования после (позднего) обнаружения
Внедрение в четверг означает, что вся команда разработчиков должна была на следующий день смягчить последствия кризиса. Исправление было отправлено незамедлительно (но все еще зависит от времени проверки Chrome Store). К сожалению, из-за упомянутого выше механизма автообновления патч откладывается для тех, кто больше всего в нем нуждается. По крайней мере, последующие автообновления получали исправленную версию расширения.

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

Команда по удовлетворению запросов клиентов столкнулась с основной массой жалоб клиентов и обрабатывала разочарованных клиентов без единой жалобы.

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

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

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

Что можно улучшить

Более низкий канал отчетности
Мы получили больше отзывов пользователей о формах удаления, чем о наших официальных каналах поддержки. Мы должны поработать, чтобы услышать мнение пользователей, прежде чем они удалят наш продукт.

Будьте еще менее навязчивыми, чем мы уже есть
Этот инцидент является убедительным свидетельством того, как пользователи не любят навязчивые расширения Chrome (или любые приложения в целом). Мы всегда стремились разработать наше расширение таким образом, чтобы оно появлялось в нужный момент, когда мы нуждаемся в нас. Однако иногда это может быть субъективным. Из-за этого инцидента мы должны быть более строгими в наших предположениях и еще больше ориентироваться на пользователя.

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

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

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

Есть какие-нибудь мысли, которыми вы хотели бы поделиться? Думаете, мы можем предпринять дополнительные меры? Или, может быть, у вас есть свои собственные ужасающие истории о развертывании?

Будем рады услышать ваше мнение в комментариях!