ierhyna

15 марта 2021, Sunnyvale, CA

# Понедельник 21 твит

Всем привет! Меня зовут Ирина @ierhyna, я фронтенд-разработчик в Semrush. Последние полтора года занимаюсь улучшени… twitter.com/i/web/status/1…

10:19
@jsunderhood @ierhyna performance очень круто и сложно, нужно много времени, чтобы погрузиться и разобраться, уж то… twitter.com/i/web/status/1…

Я считаю, что хороший разработчик должен знать best practices по веб-производительности, ведь разработка это не тол… twitter.com/i/web/status/1…

@jsunderhood @ierhyna performance очень круто и сложно, нужно много времени, чтобы погрузиться и разобраться, уж то… twitter.com/i/web/status/1…

11:03

Давайте для начала познакомимся, сегодня расскажу немного о себе и своём пути в разработке.

13:33

Наверно как и многие, я увлеклась программированием ещё в школе. К сожалению, не благодаря, а скорее вопреки школьн… twitter.com/i/web/status/1…

15:03

Тут надо пояснить, что я росла в маленьком посёлке в Ханты-Мансийском округе, и о такой профессии, как "программист", там никто не слышал.

15:17

Примерно в 2001 году дома появился компьютер и интернет. Но он был медленным и с поминутной оплатой, поэтому единст… twitter.com/i/web/status/1…

16:05

Моим любимым развлечением стало открывать сохраненные страницы в Блокноте, что-то там менять, открывать в IE, и смотреть, что произошло.

16:06

Потом я нашла самоучитель HTML с сайта "постройка-ру", и понеслось :) Сделала страничку про наш класс, сайт про Гар… twitter.com/i/web/status/1…

16:32

Но когда возник вопрос, на какой факультет я буду поступать, мысли про IT даже не возникло. Сайты делать? Да кто же… twitter.com/i/web/status/1…

16:32

Учиться было сложно ("прочитайте 600 страниц к семинару на завтра", и так по всем предметам), а временами даже физи… twitter.com/i/web/status/1…

17:02

На третьем курсе преподаватели узнали о том, что я умею делать сайты, и меня стали привлекать к работе над грантами… twitter.com/i/web/status/1…

17:17

Вдохновившись этим успехом, летом после 3го курса мы с приятелями основали свою веб-студию, чтобы делать сайты-визи… twitter.com/i/web/status/1…

17:37

Бизнес не взлетел, и через год мы закрылись. В 20 лет это было просто, походы в налоговую казались приключением, а… twitter.com/i/web/status/1…

18:50

Я поняла, что мне больше нравится делать что-то самой, чем организовывать работу людей. И с 2012 года стала занимат… twitter.com/i/web/status/1…

19:04

В таком режиме прошло три года, я работала в разных местах якобы по специальности, а по ночам фрилансила. И однажды… twitter.com/i/web/status/1…

19:21

Сейчас понимаю, что явно себя недооценивала: я имела опыт в open source, умела использовать git, настраивать деплой… twitter.com/i/web/status/1…

19:27

Кстати, та фирма заплатила мне за тестовое задание!

19:29

Но через полгода основатели поругались, и фирма закрылась 😅 Решив, что со стартапами покончено, я устроилась в Data… twitter.com/i/web/status/1…

19:47

Кстати, про DataArt я узнала благодаря этому андерхуду. Пришла на собес, а там @suevalov, который вёл неделю. И я с… twitter.com/i/web/status/1…

19:50

А потом я устала от аутсорса. Захотелось погрузиться в продуктовую разработку и видеть, как твои решения влияют на… twitter.com/i/web/status/1…

20:02

С этими мыслями я пришла в Semrush, где работаю чуть больше 2,5 лет. Сначала я занималась фронтом в только своей ко… twitter.com/i/web/status/1…

20:12

# Вторник 37 твитов

Доброе утро! В ближайшие три дня планирую рассказать:

8:12

Давайте проведём несколько опросов, чтобы я лучше понимала, о чем именно и насколько подробно писать :)

8:27

Занимаются ли в вашей компании веб-производительностью?

8:33

Если вам скажут, что ваше приложение/сайт медленный, знаете ли вы, как это проверить?

8:37
Занимаются ли в вашей компании веб-производительностью?
8:40
Если вам скажут, что ваше приложение/сайт медленный, знаете ли вы, как это проверить?
8:40

Если нужно сделать ваше приложение/сайт быстрее, знаете ли, как можно это сделать?

8:48
Если нужно сделать ваше приложение/сайт быстрее, знаете ли, как можно это сделать?
8:48

Первая тема — о метриках web performance. Как замерить, насколько приложение быстрое, какие для этого существуют метрики и инструменты.

13:17

Пожалуй, самый известный инструмент для отслеживания веб-производительности, это Lighthouse. Я надеюсь, что о нём в… twitter.com/i/web/status/1…

13:17

Однако на результат может повлиять конфигурация вашего компьютера, поэтому лучше запускать проверки в изолированном… twitter.com/i/web/status/1…

13:17

Получить более подробные данные, на изолированном окружении, можно через Web Page Test. Он позволяет сравнивать рез… twitter.com/i/web/status/1…

13:17

На основе Web Page Test работают многие другие инструменты, например, Speedcurve speedcurve.com, который м… twitter.com/i/web/status/1…

13:19

Но Speedcurve, в отличие от Web Page Test, платный.

13:19
@jsunderhood Lighthouse измеряет только скорость загрузки страницы, практически ничего не говорит о возможной скоро… twitter.com/i/web/status/1…

Для отслеживания скорости переключения между страницами и взаимодействия, например, когда по действию что-то появл… twitter.com/i/web/status/1…

@jsunderhood Lighthouse измеряет только скорость загрузки страницы, практически ничего не говорит о возможной скоро… twitter.com/i/web/status/1…

13:35

Смысл в том, что когда на странице происходит какое-то изменение, нужно выполнить performance.mark('my-mark'), и эт… twitter.com/i/web/status/1…

13:37

То есть нужно будет дописать в коде метрики в тех местах, производительность которых требуется отслеживать

13:39

Ещё есть вкладка Performance в хроме, где можно профилировать приложение, но пока я не буду на этом останавливаться

13:44

Если вы знаете и используете какие-то другие инструменты для мониторинга производительности, напишите! А я пока перейду к метрикам.

13:55
@jsunderhood Если спиннер появляется дольше чем на "Оооооп", но приложение медленное!
14:11
@jsunderhood Ежедневно мониторю Page Load Speed в Яндекс.Метрике, так как там показывается срез загрузки сайта у ре… twitter.com/i/web/status/1…
14:35

Метрик производительности довольно много. Они показывают определенные события, которые происходят в процессе загруз… twitter.com/i/web/status/1…

15:19

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

15:19

Сейчас мне кажется оптимальным следить за Core Web Vitals, это отличный вариант, если вы не знаете, с чего начать.… twitter.com/i/web/status/1…

15:19

Особенно важны Core Web Vitals, если у вас сайт, индексируемый поисковиками — гугл умеет определять скорость загруз… twitter.com/i/web/status/1…

15:21

Если у вас SPA, или приложение, которое не индексируется, Core Web Vitals можно рассматривать как показатель скорос… twitter.com/i/web/status/1…

15:24
@jsunderhood В какой момент нужно задумываться о производительности и начинать её измерять?

Хороший вопрос. В идеальном мире, на этапе проектирования. В реальности, перед выходом в продакшен уже хорошо. Мы з… twitter.com/i/web/status/1…

@jsunderhood В какой момент нужно задумываться о производительности и начинать её измерять?

15:40

Скорее всего, для мониторинга интерактивности SPA потребуется добавить собственные метрики, которые будут показыват… twitter.com/i/web/status/1…

15:49
Для отслеживания скорости переключения между страницами и взаимодействия, например, когда по действию что-то появл… twitter.com/i/web/status/1…

Я немного рассказала об этом в соседнем треде:

Для отслеживания скорости переключения между страницами и взаимодействия, например, когда по действию что-то появл… twitter.com/i/web/status/1…

15:50

В зависимости от используемого инструмента, метрики можно визуализировать на графиках. Вот, например, так выглядит… twitter.com/i/web/status/1…

15:56
@jsunderhood Плюсую, производительность - это базовое свойство системы. Если его не закладывать изначально, то пото… twitter.com/i/web/status/1…
17:10
@jsunderhood Что скажешь по поводу недавнего добавления поддержки HTTP/2?

"With this improvement, you can expect m… twitter.com/i/web/status/1…

Спасибо, пропустила эту новость. Мне кажется, что для сервисов, использующих HTTP2, синтетические метрики будут бо… twitter.com/i/web/status/1…

@jsunderhood Что скажешь по поводу недавнего добавления поддержки HTTP/2?

"With this improvement, you can expect m… twitter.com/i/web/status/1…

17:20
@jsunderhood Мы сейчас используем APDEX apdex.org как способ выразить производительность продукта осн… twitter.com/i/web/status/1…
18:27
@mr_mig_by @jsunderhood Если это базовое свойство системы, то оно должно быть зафиксировано в требованиях, при этом… twitter.com/i/web/status/1…

В моём представлении, разработчик участвует во всех этапах жизни приложения. Требования не должны появляться, пото… twitter.com/i/web/status/1…

@mr_mig_by @jsunderhood Если это базовое свойство системы, то оно должно быть зафиксировано в требованиях, при этом… twitter.com/i/web/status/1…

18:32
@jsunderhood Было бы здорово иметь инструмент для тестирования производительности взаимодействия, типа Lighthouse,… twitter.com/i/web/status/1…
18:32
@jsunderhood По поводу сатисфакции и конкретных чисел в трешхолдах тоже интересно. Например Гугл как-то писал о мод… twitter.com/i/web/status/1…
18:42
@jsunderhood В интерактивных приложениях немного другая модель. Например навигация должна быть максимально быстрой,… twitter.com/i/web/status/1…

UX и визуальная производительность очень интересная тема!

@jsunderhood В интерактивных приложениях немного другая модель. Например навигация должна быть максимально быстрой,… twitter.com/i/web/status/1…

18:48

# Среда 35 твитов

@jsunderhood А у вас как-то эта история автоматизирована (например, после выкатки очередного билда приходит репорт,… twitter.com/i/web/status/1…

У нас сбор, мониторинг и алерты по метрикам настроены через SoeedCurve, данные собираются несколько раз в сутки, и… twitter.com/i/web/status/1…

@jsunderhood А у вас как-то эта история автоматизирована (например, после выкатки очередного билда приходит репорт,… twitter.com/i/web/status/1…

6:10

Привет! Сегодня расскажу о том, как устроены процессы работы над web perf у нас в компании.

7:58

Немного контекста. В Semrush много (30-40?) кроссфункциональных команд разработки, и каждая полностью отвечает за с… twitter.com/i/web/status/1…

8:31

И есть инфраструктурная команда, которая делает интеграционный сервис с общими частями интерфейса и API, куда все о… twitter.com/i/web/status/1…

8:31

Отсюда следуют несколько особенностей:

8:32

Стек технологий у всех команд очень разный. Пожалуй, общее только то, что фронте почти у всех TS + React (потому чт… twitter.com/i/web/status/1…

8:38

Это, с одной стороны, повышает вовлеченность команд в их работу (многих мотивирует то, что они сами принимают решен… twitter.com/i/web/status/1…

8:40

Для принятия решений, которые будут влиять на работу многих команд, создаются рабочие группы из заинтересованных уч… twitter.com/i/web/status/1…

8:47

Так как команда саа принимает решения по своему продукту, мы, как рабочая группа по webperf, не можем "заставить" и… twitter.com/i/web/status/1…

8:57

Еще одна особенность, вызванная архитектурой, где много SPA встраиваются в общий сервис — при переходе по меню, пол… twitter.com/i/web/status/1…

9:12

До того, как мы начали заниматься улучшением скорости загрузки и оптимизировать размеры бандлов, типична была ситуа… twitter.com/i/web/status/1…

9:16
@jsunderhood Простите, пожалуйста, за вероятный повтор. Может пропустил.

Но сколько человек в вашей "рабочей групп… twitter.com/i/web/status/1…

В рабочей группе 2 фронтенд-разработчика и engineering manager, так как в основном мы фокусируемся на фронтенде. Пр… twitter.com/i/web/status/1…

@jsunderhood Простите, пожалуйста, за вероятный повтор. Может пропустил.

Но сколько человек в вашей "рабочей групп… twitter.com/i/web/status/1…

9:35

У нас есть некоторое разделение ролей, я больше занимаюсь "экспертизой", создаю общие решения, и консультирую коман… twitter.com/i/web/status/1…

9:48

Но мы в целом готовы подхватить задачи друг друга :)

9:49

Когда мы решили заняться оптимизациями веб-производительности, основными задачами стали:

10:10

Список метрик мы определили исходя из типа приложения: для статичных страниц и для SPA.

12:41

Для статичных страниц отслеживаем:

12:46

Для SPA метрики те же, и дополнительно отслеживаем собственную метрику First App Render, которая показывает в секун… twitter.com/i/web/status/1…

12:46

Значения метрик мы выбирали, основываясь на:

12:48

Список метрик и их значений общеизвестен в компании, хранится в Confuence, и при необходимости обновляется.

12:50

Также есть рекомендации по размерам JS/CSS-бандлов, их значения тоже немного отличаются для статичных станиц и для SPA.

12:53

При выборе инструмента мониторинга ориентировались на возможности создать "спейс" для каждой из команд разработки,… twitter.com/i/web/status/1…

12:57

Через SpeedCurve мониторим как синтетические метрики (lab tests несколько раз в день), так и снимаем данные по прои… twitter.com/i/web/status/1…

13:01

Для каждой команды разработки настроен свой спейс с дашбордами (по дашборду на каждый продукт команды), на которых… twitter.com/i/web/status/1…

13:19

Если по какой-то метрике произошло превышение допустимого значения, об этом приходит уведомление в Slack команде.

13:20

Приложения, которые нужно оптимизировать в первую очередь, выбрали количеству трафика и критичности для пользовател… twitter.com/i/web/status/1…

13:59

С командами, отвечающими за эти сервисами, вели точечную работу:

14:05

Это дало неожиданный эффект, некоторые команды, у которых ещё не был запланирован webperf-аудит, сами находили проб… twitter.com/i/web/status/1…

14:07

В течение года, мы провели аудиты примерно 20 команд, и поняли, что дальше продолжать не очень эффективно — в прило… twitter.com/i/web/status/1…

14:12

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

14:14

Если у вас похожая ситуация, то полезным может быть выделить самый распространенный user flow, понять, какие продук… twitter.com/i/web/status/1…

14:16

Оказалось, что многие проблемы общие у разных команд/продуктов, и можно создать единый список рекомендаций, best pr… twitter.com/i/web/status/1…

14:24

Про рекомендации, случаи из практики, best practices, планирую рассказать завтра и послезавтра

14:26

Попросили показать, как выглядят дашборды. Показываю :) Красная горизонтальная линия — отметка на которой происходи… twitter.com/i/web/status/1…

15:01
⏱ Улучшение метрики First Contentful Paint (FCP) — нелегкая и комплексная задача. Однако, есть простые шаги с котор… twitter.com/i/web/status/1…

Тред про улучшение метрики First Contentful Paint (FCP)

⏱ Улучшение метрики First Contentful Paint (FCP) — нелегкая и комплексная задача. Однако, есть простые шаги с котор… twitter.com/i/web/status/1…

15:11

# Четверг 1 твит

Thread of my favorite web performance tools 🚀
15:15

# Пятница 15 твитов

Привет! Сегодня поговорим про оптимизации, что влияет на метрики, расскажу про best practices и случаи из жизни :)

9:12

Выделю три основные направления возможных оптимизаций:

10:06

1. Про бандлы и доставку:

11:59

Кажется очевидным, но почему-то часто об этом забывают:

11:59

Тоже очевидно, но всё же, убедитесь, что вебпак собирает бандлы в продакшен-режиме с включенной опцией minimize: pic.twitter.com/RgHk5F3Ajr

12:31

Следующим шагом можно настроить в вебпаке разбивку на чанки. Чтобы это сделать, неплохо для начала проанализировать… twitter.com/i/web/status/1…

12:31

Распространён подход, когда в один чанк (или несколько) выносят зависимости node_modules, а в другой код приложения… twitter.com/i/web/status/1…

12:42

Лучше, изучив состав бандла через webpack-bundle-analyzer, выделить в отдельный чанк общие зависимости для всех роу… twitter.com/i/web/status/1…

12:42

Для генерации отдельного чанка для каждого роута отлично подходит React.lazy() в сочетании с react-router ru.reactjs.org/docs/code-spli…

13:28

Дать файлам чанков человеко-читаемые имена поможет волшебный комментарий для вебпака: pic.twitter.com/yQN2fHTxXF

18:10

Хорошим способом сократить объем кода, скачиваемого при первой загрузке React приложения, будет импортировать с laz… twitter.com/i/web/status/1…

18:49

Некоторые npm пакеты могут существенно увеличить объем бандла кодом, который никогда не будет использован. Например… twitter.com/i/web/status/1…

19:04

Исключить лишние локали из moment.js можно через moment-locales-webpack-plugin,
github.com/iamakulov/mome…, IgnorePlu… twitter.com/i/web/status/1…

19:04

Про загрузку только необходимых функций lodash, можно почитать тут: azavea.com/blog/2019/03/0…

19:04

Про загрузку, отрисовку и взаимодейстивие со страницей продолжу завтра

19:10

# Суббота 12 твитов

2. Про загрузку и отрисовку страницы:

14:12

Чтобы разобраться в том, как оптимизировать отрисовку, нужно понимать, как браузер рендерит страницу.
Пара ссылок:… twitter.com/i/web/status/1…

14:28

Блокируют отрисовку страницы:

14:28

Чтобы немного упростить браузеру задачу отрисовки:

14:38

Пользователь, заходя на страницу, видит только какую-то её часть. Важно сделать так, чтобы эта видимая часть отобра… twitter.com/i/web/status/1…

14:49

Применение critical css позитивно скажется на метриках, например, Largest contentful paint

14:52

На контентные метрики (Largest contentful paint / First meaningful paint) влияет и то, как подключаются и использую… twitter.com/i/web/status/1…

15:03

Ещё немного про шрифты:

15:13

Про изображения:

15:42

Для контентных картинок можно использовать тег picture (developer.mozilla.org/en-US/docs/Web…), чтобы, например, загружать более… twitter.com/i/web/status/1…

15:42

Совет от кэпа: убедитесь, что картинки минимизованы и имеют адекватные размеры! Особенно, если картинки могут загру… twitter.com/i/web/status/1…

15:48
@jsunderhood Более правильный совет будет - не мешайте Webpack делать его работу и не советуйте как следует разделя… twitter.com/i/web/status/1…
16:00

# Воскресенье 25 твитов

Кулстори про клиентский и серверный рендеринг. Есть мнение, что рендерить страницу на сервере быстрее, чем на клиен… twitter.com/i/web/status/1…

8:00

Постепенно к странице появлялись всё новые требования: сначала кастомизации в зависимости от тарифного плана и стра… twitter.com/i/web/status/1…

8:00

Поддерживать это стало очень сложно, решили снова переписать на реакте. Страница стала отдаваться за 200мс, но выро… twitter.com/i/web/status/1…

8:00

Тогда придумали к̶о̶с̶т̶ы̶л̶ь изящное решение: для видимой части сверстали скелетон (штуку как на картинке) и заинл… twitter.com/i/web/status/1…

8:00

Если нужно передать через шаблон данные с сервера на клиент (например, initial state для redux store), лучше заверн… twitter.com/i/web/status/1…

8:10

3. Про взаимодействие и UX.

8:33

Если использовать скелетон, а не спиннер, то пользователям кажется, что страница загружается быстрее:… twitter.com/i/web/status/1…

8:38

Полезно изучить, как пользователи переходят по страницам сайта, и использовать это знание для предварительной загру… twitter.com/i/web/status/1…

11:59

С rel="prerender" нужно работать осторожно, так как это ускоряет следующую страницу для части пользователей за счёт… twitter.com/i/web/status/1…

11:59

Используюя rel="preload" можно скачать и закешировать ресурсы, которые скоро понадобятся. В отличие от rel="prerend… twitter.com/i/web/status/1…

12:05

Guess.js — экспериментальная библиотека, которая на основе данных гугл-аналитики предсказывает, на какую страницу д… twitter.com/i/web/status/1…

12:11

Для Webpack есть preload-webpack-plugin, он решает проблему добавления ссылок на ресурсы с хешем в имени:
npmjs.com/package/@vue/p…

12:28

Совсем немного про отзывчивость интерфейса:

12:51

Если в течение ~100мс после действия (клик по кнопке, нажатие на меню, фокусировка в инпуте и начало ввода текста и… twitter.com/i/web/status/1…

12:51

Поэтому важно не блокировать интерфейс при выполнении запросов к API и других операциях, и максимально быстро показ… twitter.com/i/web/status/1…

12:58

Есть паттерн Optimistic UI, согласно которому предполагается, что операция завершилась успехом, и показывает резуль… twitter.com/i/web/status/1…

13:00

Особенно хорошо такой подход работает в случае с атомарными независимыми друг от друга операциями

13:02

Как реализовать Optimistic UI с Apollo GraphQL:
apollographql.com/docs/react/per…

13:06

Как реализовать Optimistic UI с React Query:
react-query.tanstack.com/guides/optimis…

13:06

С вами была Ирина Соколовская, и моя неделя в этом аккаунте подошла к концу. Вы классные, мне было с вами интересно… twitter.com/i/web/status/1…

13:54
Давайте для начала познакомимся, сегодня расскажу немного о себе и своём пути в разработке.

О себе:

Давайте для начала познакомимся, сегодня расскажу немного о себе и своём пути в разработке.

13:54
Доброе утро! В ближайшие три дня планирую рассказать:

Опросы о том, насколько аудитория андерхуда знакома с темой веб-производительности:

Доброе утро! В ближайшие три дня планирую рассказать:

13:54
Первая тема — о метриках web performance. Как замерить, насколько приложение быстрое, какие для этого существуют метрики и инструменты.

О метриках и инструментах:

Первая тема — о метриках web performance. Как замерить, насколько приложение быстрое, какие для этого существуют метрики и инструменты.

13:54
Привет! Сегодня расскажу о том, как устроены процессы работы над web perf у нас в компании.

О процессах работы над производительностью в компании:

Привет! Сегодня расскажу о том, как устроены процессы работы над web perf у нас в компании.

13:54
Привет! Сегодня поговорим про оптимизации, что влияет на метрики, расскажу про best practices и случаи из жизни :)

Оптимизации, лучшие практики, истории:

Привет! Сегодня поговорим про оптимизации, что влияет на метрики, расскажу про best practices и случаи из жизни :)

13:54

other