Разработка
Как один Android-разработчик за месяц сократил время запуска приложения Lyft на 21%
Когда вы начинаете свою собственную инициативу по совершенствованию приложений, стоит сначала стремиться к небольшим победам и достигать их. Тщательно выбирайте действенные задачи, которые принесут значительные результаты за счет соответствующих вложений ресурсов.
Lyft уделяет особое внимание качеству приложений. Как райдшеринговая компания, предоставляющая жизненно важные, срочные услуги десяткам миллионов пассажиров и сотням тысяч водителей, они должны быть такими. В таком масштабе каждое замедление, пропущенный кадр или сбой приложения могут привести к потере времени тысяч пользователей. Даже незначительная заминка повлияет на множество едущих (или везущих) пользователей. К счастью, команда разработчиков Lyft внимательно следит за производительностью своего приложения. Так они впервые заметили замедление времени запуска Android-приложения для своих водителей.
Им нужно было быстро добраться до сути проблемы — выяснить, что потребуется для ее решения, а затем оправдать такие инвестиции перед своим руководством. Это означало ответить на ряд сложных вопросов. Где было узкое место? Как это повлияло на пользовательский опыт? Насколько большим приоритетом это должно быть для их команды в данный момент? К счастью, в их распоряжении был мощный инструмент, который мог помочь им найти ответы. С помощью Android Vitals, инструмента Google Play для повышения стабильности и производительности приложений на устройствах Android, они обнаружили проблему, обосновали ее приоритет перед своим руководством и выделили необходимое количество ресурсов для ее решения. Вот как они это сделали.
Новые приоритеты
Первое, что нужно было сделать команде разработчиков Lyft, — выяснить, является ли эта проблема достаточно острой, чтобы убедить руководство выделить на нее ресурсы. Как и любое предложение по улучшению качества приложения, ускорение запуска Lyft Driver нужно было сопоставить с другими конкурирующими требованиями к пропускной способности разработки: с введением новых функций в продукт, внесением улучшений в архитектуру и улучшением обработки данных. Как правило, одна из проблем, связанных с тем, чтобы убедить руководство инвестировать в качество приложений, заключается в том, что может быть сложно соотнести улучшения производительности с бизнес-метриками.
Они обратились к Android Vitals, чтобы получить точную картину того, что поставлено на карту. Vitals предоставляет разработчикам доступ к данным о производительности их приложений, включая app-not-responding ошибки, разряд батареи, рендеринг и время запуска приложения. Текущая и предыдущая производительность каждой метрики отслеживается на реальных устройствах и может сравниваться с производительностью других приложений в категории. С помощью этого мощного инструмента команда разработчиков обнаружила, что время запуска приложения Lyft Driver было на 15–20% медленнее, чем у 10 других приложений в их категории, а это уже заметная проблема.
Затем команде нужно было определить правильный масштаб проекта, который сопоставил бы влияние замедления на бизнес-цели и пользовательский опыт. Данные Android Vitals прояснили ситуацию, особенно потому, что они предоставили прямое сравнение с конкурентами в сфере райдшеринга. Команда разработчиков подсчитала, что одного разработчика, работающего над проблемой в течение одного месяца, будет достаточно, чтобы заметно сократить время запуска приложения.
Опираясь на это огромное количество данных и апеллируя к стремлению Lyft к совершенству приложений, команда обратилась к своему руководству. Продемонстрировав явную возможность улучшить качество обслуживания клиентов, разумно поставленную и достижимую цель и четкую информацию о конкурентах, они получили добро.
Как они это сделали
Lyft использует «Время до взаимодействия» в качестве основного показателя запуска (также известного как «Время до полного отображения»). Чтобы понять факторы, влияющие на это, команда Lyft профилировала каждый из этапов запуска своего приложения, выискивая тупиковые ситуации. Приложение Lyft Driver запускается в четыре этапа: 1) Сначала запускается процесс приложения 2) Activity запускает визуализацию пользовательского интерфейса. 3) Bootstrap отправляет сетевые запросы на данные, необходимые для отображения домашнего экрана. 4) Наконец, Display открывает интерфейс водителя. Тщательное профилирование показало, что замедление произошло на третьем этапе начальной загрузки. Выявив узкое место, команда предприняла несколько шагов для его устранения.
Во-первых, они сократили ненужные сетевые вызовы на критическом пути запуска. После декомпозиции серверных служб они могли полностью удалить некоторые сетевые вызовы из запуска. Когда это стало возможным, они также предпочли выполнить сетевые вызовы асинхронно. Если какие-то данные по-прежнему требовались для работы приложения, но не были нужны во время запуска приложения, эти вызовы делались неблокирующими, чтобы запускать приложение без них. Блокирующие сетевые вызовы удалось безопасно перевести в фоновый режим. Наконец, они решили кэшировать данные между сеансами.
Это может показаться относительно небольшим изменением, но они привели к значительному сокращению времени запуска приложения на 21%. Это привело к увеличению количества сессий водителей в Lyft Driver на 5%. Имея на руках результаты, команда получила поддержку со стороны руководства. Создали специальный рабочий поток по производительности приложений, добавив инженера к работе, поскольку продолжили вносить улучшения. Успех инициативы распространился по всей организации, и несколько менеджеров обратились к команде, чтобы узнать, как они могут сделать дополнительные инвестиции в качество приложений.
Выводы
Успех этих усилий дает несколько более общих уроков, применимых к любой организации.
По мере того, как приложение растет, а вместе с ним растет и команда, совершенство приложения становится важнее, чем когда-либо. Разработчики часто первыми замечают проблемы с производительностью, поскольку они тесно работают над приложением, но могут столкнуться с трудностями при повышении осведомленности во всей организации. Android Vitals предлагает для этого мощный инструмент. Он предоставляет простой способ поддержки наблюдений разработчиков данными, упрощая сопоставление показателей производительности с бизнес-кейсами.
Когда вы начинаете свою собственную инициативу по совершенствованию приложений, стоит сначала стремиться к небольшим победам и достигать их. Тщательно выбирайте действенные задачи, которые принесут значительные результаты за счет соответствующих вложений ресурсов.
Также важно коммуницировать как можно раньше и вовлекать остальную часть организации в усилия команды разработчиков по обеспечению качества. Эти постоянные обновления в целях, планах и результатах помогут вам мотивировать всю вашу команду.
Дополнительные ресурсы
Android Vitals — это лишь один из многих инструментов в экосистеме Android, предназначенных для понимания и улучшения времени запуска приложений и общей производительности. Еще один дополнительный инструмент, Jetpack Macrobenchmark, может помочь предоставить информацию во время разработки и тестирования по различным показателям. В отличие от Android Vitals, который предоставляет данные с устройств реальных пользователей, Macrobenchmark позволяет локально оценивать и тестировать определенные области кода, включая время запуска приложения.
Библиотека Jetpack App startup обеспечивает простой и эффективный способ инициализации компонентов при запуске приложения. Разработчики могут использовать эту библиотеку для оптимизации последовательностей запуска и явного задания порядка инициализации. Между тем, Reach and Devices могут помочь вам понять своего пользователя и распределение проблем, чтобы принять более взвешенное решение о том, для каких устройств создавать, где запускать и что тестировать. Данные, полученные с помощью этого инструмента, позволяют вашей команде расставить приоритеты в усилиях по обеспечению качества и определить, какие улучшения окажут наибольшее влияние на большинство пользователей. Perfetto — еще один бесценный актив: инструмент трассировки системы с открытым исходным кодом, который можно использовать для инструментирования кода и диагностики проблем при запуске. В совокупности эти инструменты могут помочь вам обеспечить бесперебойную работу вашего приложения, удовлетворенность пользователей и поддержку ваших усилий по обеспечению качества.