Охота на жуков

КАК Я НАУЧИЛСЯ НЕ БЕСПОКОИТЬСЯ И ПОЛЮБИЛ ОТЧЕТЫ ОБ ОШИБКАХ

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

Теперь, когда iStumbler не является ни бесплатным, ни открытым исходным кодом, эти удобные пути отхода были закрыты, и, поскольку я заинтересован в том, чтобы иметь много довольных платящих клиентов, любые ошибки, о которых они сообщают, должны быть исправлены. С момента первоначального выпуска iStumbler 100 я сделал более десяти выпусков с исправлением ошибок и один выпуск функций, сосредоточенный на возвращении функций, удаленных с выпуска 99, потому что в них были ошибки, и исправлении новых проблем, обнаруженных в полевых условиях. Вот краткий список дополнений из журнала изменений:

  • Сборка 88: исправления форматирования MAC-адреса и ведения журнала, ошибки лицензирования
  • Сборка 90: проблема с настройками Wi-Fi, добавлен платежный процессор Stripe.
  • Сборка 92: программа обновления Sparkle вернулась
  • Сборка 104: добавлен установщик Let’s Move, масштабирование шрифта и жирные линии диаграммы.
  • Сборка 115: исправления плагина Bonjour, исправления пользовательского интерфейса и дополнения
  • Сборка 117: еще больше исправлений плагина Bonjour
  • Сборка 121: совместимость с Yosemite, добавлены отчеты о сбоях
  • Сборка 122: проблемы с пользовательским интерфейсом, ошибки отчетов о сбоях, добавлено восстановление после исключения
  • Сборка 123: ошибки лицензирования и улучшения пользовательского интерфейса

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

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

ЕСЛИ АВАРИЯ ПРОИЗОЙДЕТ В ЛЕСУ

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

Глядя на доступные в настоящее время варианты, Crashlytics давно стал золотым стандартом продукта Freemium (-ium на латыни означает не совсем) и был интегрирован в Fabric framework Twitter для разработки мобильных приложений. Доступна бета-версия Mac OS X, судя по всему, по запросу, я не стал спрашивать.

Если я потрачу время на то, чтобы упрекнуть председателя Грубера в том, что он использует Google Analytics (хотя он щедро делится с нами полученной информацией), это будет болезненно гиппократовски с моей стороны, если я буду использовать Crashlytics в iStumbler. Я настаиваю на очень строгой внутренней политике конфиденциальности и безопасности для всей своей работы, поэтому сбор данных о сбоях не является исключением: все должно быть конфиденциальным и под моим контролем.

Это всегда помогает сформулировать требования: удобные для пользователя, конфиденциальные и безопасные отчеты об ошибках, которые помогают повысить удовлетворенность клиентов и снизить количество ошибок в полевых условиях. Без проблем. Но я не хотел создавать его сам, поэтому я пошел искать решение с открытым исходным кодом.

Первое, что я нашел, это Plausible Labs, PLCrashReporter framework, нативный фреймворк с широкой лицензией для Mac OS и iOS, единственное, чего не хватало, так это пользовательского интерфейса для создания отчетов и соответствующего CGI-скрипта для получения
отчетов. Я отложил их в сторону, протестировал отчеты о сбоях и добавил их в сборку 121 вместе с некоторыми исправлениями Yosemite. Проблема решена, верно?

ОШИБКИ И ИСКЛЮЧИТЕЛЬНЫЕ СИТУАЦИИ

Теперь у обработки ошибок в OS X и iOS нет самой связной истории разработчиков. Платформы Foundation и AppKit вместе со средой выполнения Objective-C предоставляют ряд различных способов решения различных типов проблем, от традиционных кодов возврата C в низкоуровневых средах и платформах ядра до случайного использования указателей на буфер для получения подробной информации. информацию к абстракциям CFError/NSError, встроенным в CoreFoundation. Добавьте к этому механизмы обработки исключений C++ и Objective-C (и, я думаю, Swift теперь тоже) и сигналы процесса UNIX, и вы получите то, что можно было бы описать как ядовитую адскую похлебку источников проблем.

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

Итак, я добавил поддержку CrashReporter для их перехвата и отображения, перехватывая механизм представления ошибок NSApplication, библиотека может предоставить окно отчета вместо стандартного диалогового окна предупреждения. Точно так же необработанные исключения, которые обычно приводят к сбою приложения, перехватываются и представляются пользователю. Наконец, открытое окно отчета об ошибке позволяет пользователям отправлять любые запросы, которые им нравятся, быстро и прямо в приложении. Есть даже сочетание клавиш: Command + !

ПОХОРОНЯТЬСЯ

Недостатком забрасывания широкой сети является то, что вы ловите много рыбы или, в этом случае, отправляете отчеты о проблемах по электронной почте. Входящие запросы в службу поддержки увеличились от легко управляемой горстки до 30–100 запросов в день, на большинство из которых нельзя было ответить, поскольку у них не было адресов электронной почты. Поскольку мой почтовый ящик службы поддержки был переполнен, я начал искать варианты, как уменьшить поток информации, который можно было бы использовать.

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

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

ВОССТАНОВЛЕНИЕ И ИСКУПЛЕНИЕ

Как только кровотечение остановлено и самые громкие жалобы устранены, что делать дальше? Что ж, теперь, когда популярные и болезненные проблемы ушли в сторону, пришло время заняться действительно уродливыми проблемами. Вы знаете такие: они прячутся в уголках вашего пользовательского опыта и сеют такой хаос, что единственное рекомендуемое решение — «Просто снести все и переустановить приложение».

Решение таких проблем часто означает запуск некоторого кода во время возникновения исключения. Чтобы облегчить это, я добавил обработчики исключений в свою структуру ReportWindow. Первый случай, требующий их использования, выглядит примерно так:

  • На вашем компьютере установлена ​​старая версия плагина ClickToFlash Safari.
  • Эта старая версия плагина ClickToFlash содержит старую версию программы обновления Sparkle.
  • Когда Sparkle обнаруживает наличие обновления, он пытается показать пользователю окно, в котором сообщается об изменениях и запрашивает разрешение на установку.
  • Это окно содержит WebView, который загружает старый плагин ClickToFlash, содержащий старую структуру Sparkle.
  • Старый фреймворк Sparkle перезаписывает новый, который вы включили в свое приложение.
  • Все это происходит менее чем за секунду, задолго до того, как окно отрисуется на экране.
  • К тому времени, когда ваш пользователь нажимает кнопку «Обновить сейчас», выход, к которому он был подключен, уже давно исчез, будучи добавленным где-то между старой и новой версиями Sparkle.

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

ОТДАВАЯ

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

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



Удачного взлома!

Альф