Бюджет производительности
=========================

Бюджет производительности - это лимит для предотвращения регрессий. Этот бюджет может быть применён к файлам, типам файлов, всем ресурсам приложения, определённым общим показателям (например, Время до интерактивности) пользовательским показателям (например, Время до главного элемента) или к пороговым значениям к определённым точкам во времени.

Зачем нужен бюджет?
-------------------

Бюджет существует для отражения желаемых вами целей. С бюджетом вы сможете осознанно выстраивать компромиссы между пользовательским опытом и объективным индикаторами эффективности приложения (например, конверсией)

Эти цели можно разбить на категории:

* Временные (например, Время до интерактивности, Первая отрисовка контента).
* Количественный (например, размер загруженных JS файлов, количество изображений).
* Определённые правилами (например. индекс Pagespeed, баллы Lighthouse).

Главная цель такого подхода - сокращение регрессии. Но этот подход может помочь предсказать поведение приложения в будущем. Например, в Сентябре 50% месячного бюджета было использовано за неделю - значит, нужно ждать увеличения потребления контента, нагрузки на сервера и т.д.

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

Как определить бюджет?
----------------------

Бюджет должен включать 2 уровня:

* Предупреждение
* Ошибка

Уровень предупреждения позволяет вам быть проактивным и заниматься техническим долгом, не блокируя разработку нового функциональности

Уровень ошибки - это граница, по достижении которой приложение воспринимается негативно.

Для начала, вам нужно выяснить, какими технологиями пользуются ваши пользователи. Например, большая часть пользователей приходят с Anroid-телефонов бюджетного уровня и подсоединяются через 3G). Для подобного исследования существует множество инструментов (en-US). Эти метрики должны стать базой для бюджета размера файлов.

Базовая цель - достигнуть показателя "Время до интерактивности" до 5 секунд при 3G/4G, и до 2 секунд для последующих загрузок. Однако, вы можете придумать свои цели, основанные на контенте приложения, географии пользователей и технологиях.

Например, для приложения с большим количеством текста (блоги, новостные сайты), показатель Первая отрисовка контента (First Contentful Paint) будет гораздо лучше показывать, с чем сталкивается пользователь. Иными словами, этот показатель покажет, как быстро пользователь начинает читать. И этот показатель должен быть включён в специфичные бюджеты, например, бюджет шрифтов, где вы можете применять разные техники для оптимизации. Например, font-display, чтобы улучшить Субъективно Ощущаемую производительность (en-US)).

Но самая главная цель таких бюджетов - это возможность корреляции Производительности и Бизнес-целей. Когда вы определяете какие-то показатели, вы должны сфокусироваться на пользовательском опыте. Только он может диктовать, как мы должны изменять приложение таким образом, чтобы не просто улучшить конверсию, но и предсказать вероятность того, что пользователь вернётся.

Как создать бюджет?
-------------------

Во время разработки вы можете использовать несколько инструментов, чтобы проверять некоторые показатели:

* Сборщики (например, webpack), из коробки содержат инструменты оценки производительности, которые сообщат вам, если какой-то из файлов превысил допустимые размеры.
* Bundlesize, позволяет вам определить и проверять размеры файлов каждый раз при интеграции вашего кода с помощью CI.

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

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

С этим может помочь, например, Lighthouse Bot, который можно встроить в Travis CI и использовать для получения аналитики Lighthouse и Webpage Test. Этот бот будет сообщать об ошибке или успешном прохождении тестов на основе определённых минимальных оценок.

Как я могу усилить влияние бюджета?
-----------------------------------

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

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

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

Смотрите также
--------------

* Start Performance Budgeting by Addy Osmani
* Performance Budgets 101 by Milica Mihajlija
* Performance Budgets That Stick by Tim Kadlec