РИТ++ 2017, Frontend Сonf
Зал Дели + Калькутта, 6 июля, 17:00
Тезисы:
http://frontendconf.ru/2017/abstracts/2561
Компонентный подход принес много пользы, а вместе с тем и проблему переиспользования компонентов. В проекте появились сотни, тысячи компонентов, но со временем мы совсем забыли, где они живут, как их использовать и как они выглядят.
Тут на помощь приходят различные инструменты и системы для работы с компонентами и их композициями. Такие решения призваны облегчить и оптимизировать работу фронтенд-разработки, а также улучшить взаимодействие с другими функциями, такими как дизайн и тестирование. Решений становится больше и это здорово, но часто оказывается, что большим компаниям и проектам готовые решения не подходят, и тогда создается собственное.
9. 2016
• 26 разработчиков фронтенда
• Формальные процессы в разработке
• Сложные задачи (react, basis, no jquery)
• SPA приложения и много компонентов (HOC, Composition)
• Сложные инструменты тестирования (Chai + Mocha + Karma)
• Со временем код устаревает
9
10. Создание продукта
10
Product Design Engineering
Нет уникального стиля
Нет базовых элементов
Дизайнеры + Разработчики = ⚔️
Нет UI компонентов
Сложно найти компонент
Нет просмотра
компонентов
16. 16
Open + In Progress
Invalid
In ReviewПроблема переиспользования компонентов
17. Проблемы
• Отсутствие синхронизации (дизайнера и разработчика)
• Поиск нужного компонента
• Много разных версий компонента (какую использовать?)
• Сложное тестирование компонентов
• Изменения связанных компонентов (могут сломать продукты)
• Страдание нового разработчика (обучение)
17
31. Процессы
• Манифест создания приложений
• Манифест хранения данных приложений
• Мониторинг ключевых метрик
• Оптимизация старых процессов
• Проект “Инициативы”
31
34. Зачем?
• Индустриализация разработки интерфейсов
• Много “продуктовых” команд (дорого изобретать с нуля)
• Согласованность разработки
• Повышение качества разработки
• “Дизайн-система” звучит круто
• Набор стандартных шаблонов
• Технологическая платформа компонентов
34
65. Возможности
• Информация о структуре компонента
• Генерация дерева компонента (jest.snapshot)
• Генерация разных состояний компонента
• Поиск элементов в компоненте
• Поиск компонента в компоненте
• Эмуляция событий в компоненте
69
66. // Snapshot test
test('button', () => {
const snap = snapshot(<Button>Button</Button>);
expect(snap.snapshot).toMatchSnapshot();
});
Генерация структуры
67. События компонента
// Event test
test('button with onClick', () => {
const fn = jest.fn();
const snap = snapshot(<Button onClick={fn}>Button</Button>);
snap.find('button').simulate('click');
expect(snap.snapshot).toMatchSnapshot();
expect(fn).toHaveBeenCalled();
});
71. Возможности
• Позволяет писать правила, по которым будет проверяться
компонент
• Проверка свойств компонента
• Проверка сложных зависимостей в компоненте
• Возможность задания кастомных правил для проверки
75
76. Image refs
• Fabricio Rosa Marques
https://dribbble.com/shots/2810191-Lego-Brick-Loader
• Kee Lee
https://dribbble.com/shots/3106656-10000-Layers-Of-Legos-2x
• Berin Catic
https://dribbble.com/shots/3274286-Microservices-illustration-for-magazine-4
• Clip Art Bunny Rabbits
http://olddesignshop.com/2017/02/free-vintage-clip-art-bunny-rabbits/
80
Notes de l'éditeur
Всем привет. Спасибо, что нашли время и пришли на доклад. Сегодня хотелось бы рассказать историю компонентов, какие проблемы возникли и какие инструменты у нас получились в результате решения проблем.
Я работаю разработчиком в компании Avito, и так получилось, что я начал заниматься платформой для компонентов.
Но прежде продолжить рассказ про платформу, хотелось бы рассказать историю о том, с чего все начиналась
В 2014 году вроде бы шло всё хорошо.
* Мало разработчиков, все знали, кто что написал или какой компонент стоит использовать
* Простой императивный код на jquery, небольшие базовые компоненты
* Все было просто, условно один интерфейс - один большой компонент
* Тестов было не много, в основном юнит-тесты, поэтому использовались простые инструменты Chai + Mocha
* Код ещё пахнет свежей травкой
Если схематически изобразить путь доставки продукта на рынок, всё было просто. Нужен новый продукт > проектируется дизайн > инженеры разрабатывают продукт > он уже на Авито.
Компоненты создавались новые или активно переиспользовались простые компоненты, например, кнопка. Доставка продукта была быстрой.
Даже была начальная версия дизайн-системы, но просуществовало недолго. Спустя некоторое время компоненты начали активно изменятся, система устаревала, так как нужно было добавлять и обновлять компоненты вручную.
По мере того, как компания активно развивалась, старые процессы и подходы к разработке перестали справляться.
* Уже больше 20 разработчиков, появилось много маленьких функциональных команд, состоящие из всех видов инженеров
* Формализация процессов разработки — изменились процессы, много код-ревью, стандартизация кода и внешних зависимостей, уже не подключишь свой любимый плагин на jQuery :D.
* Задачи становятся сложными, $ уже не справляется, часть разработчиков пишут на реакте или базисе
* Наступила эра ренесанса, уже много SPA приложений для эко-системы Авито. Из компоненты на jQuery, компоненты плавно перетекли в react/basis компоненты, появилась интеграция с данными. Интерфейсы также становятся сложными, уже представляются собой живые организмы с данными, композициями и компонентами.
* К существующим инструментам тестирования добавились новые, платформа для тестирования росла. Тратилось много времени на написания тестов.
* С течением времени код устаревает, тяжело поддерживать в актуальном состоянии. Накапливается технический долг, так как любые рефакторинги болезненно влияют на продукт.
Теперь процесс создания продукта можно изобразить примерно так. Я думаю выглядит знакомо, не правда ли?
Как видно, компонентный подход несет в себе много опасностей и проблем без соответствующих решений. Давайте попробуем разобраться, почему так происходит?
Представим страницу, на которой есть очень много разных компонентов и приложений. Если показать компоненты на странице, выглядит примерно так.
Компонентов много. Например, ссылки, кнопки и другие базовые компоненты связаны между отдельными интерфейсами, потому что это один компонент. Без специальных инструментов очень сложно найти какой-то компонент на странице и понять где он используется ещё.
Получается, что чем больше компонентов, чем труднее их переиспользовать. Проще взять и сделать свой компонент, чем найти компонент или разобраться как работает другой компонент. Ценность каждого компонента падает.
Не так давно мы выгрузили данные из JIRA в систему аналитики и построили график. На графике видно, что если раньше до 2016 года накатывало волнами большие задачи, то после все задачи начали выполняться дольше. Скорее всего тут проблема не больших задач, а переиспользования существующего кода, то есть компонентов.
Давайте ещё раз перечеслим основные проблемы с большим количеством компонентов.
* Дизайнер и разработчик не могут найти общий язык
* Приходит новый дизайн, разработчик пытается найти компонент и посмотреть, где используется
* Дублирование компонентов, на проекте иногда появляются несколько похожих кнопок
* Инструменты тестирования перестают справляться, тестов много и долго выполняются
* Изменение инпута в одном проекте возможно могут сломать другие продукты, необходимо наглядно видеть как изменения одного компонента повлияют на другие компоненты
* Самая большая боль — это интеграция нового разработчика в проект, для него много компонентов представляют собой новый мир
Давайте попробуем найти выход.
И так, мы определились с проблемами, пришло время определиться с потребностями.
Зная потребности и страдания разработчиков и дизайнеров, мы создали технический продукт под названием “Компонент платформа”
Что включает в себя компонент платформа или что такое компонент платформа? Постараюсь подробно рассказать что скрывается под этим громким названием и из чего состоит компонент-платформа.
Если описывать кратко компонент-платформу, то это технологии и процессы для эффективного создания продуктов. Помните нашу цель? Доставлять продукты как можно быстрее на рынок.
Компонент платформа состоит из трех важных составляющих — прозрачные процессы разработки, дизайн-система и инструменты оценки качества изменений.
Отсутствие процессов отъедает много времени в разработке — сложно понять, как делать правильно, что лучше использовать x или y, можно ли использовать новый фреймворк x или y. Основная цель процессов — максимально эффективно использовать знания и опыт разработчика в разработке.
* Описали, как эффективно разрабатывать приложения или компоненты
* Описали процесс потока данных на странице и как эффективно хранить данные в приложение
* Отслеживаем ключевые метрики кода и интерфейсов, которые показывают насколько оптимальный климат в коде и в компонентах
* Выкинули всё не нужное в разработке :)
* Разработчики всегда хотят привнести свой опыт в проект, нельзя этому мешать, для этого у нас есть инициативы
* Когда вы распределяете дизайнеров и разработчиков небольшими группами в рамках организации из сотен или тысяч человек, то они вносят свой вклад в код с очень небольшой площадью покрытия.
* Невероятно дорого, чтобы сотни хорошо оплачиваемых дизайнеров и разработчиков заново изобретали интерфейс и программировали его с нуля с каждой итерацией
Прежде чем начинать делать свои технические решения, мы посмотрели готовые решения на рыке, наверное уже кто-то решал схожие проблемы?
Давайте поговорим про ценности, которые он привнес
Дизайнеры и разработчики начинают разговаривать на одном языке — компонентами, в большей степени готовыми компонентами.
Из-за того, что все используют текущие компоненты, происходит унификация стилей.
По той же причине возрастает скорость создания продукта и
повышается гибкость изменения продукта
Скучнооооо, упроситить или убрать.
Убрать сервис слово
Сделать мультяшно
Нету демки на систему, очень плохо. Нужны очень демки.
Добавить пример платформ.джс
Инструменты оценки качества компонента — это платформа для тестирования компонентов. Для чего она нужна?
При изменение компонента необходимо видеть, как изменения повлияли на структуру компонента, например, на верстку или стили.
Когда компонент используется в других компонентах или приложениях, необходимо видеть как эти изменения повлияли на продукт в целом и контролировать их.
Достаточно сложно вносить изменения в существующий компонент и при этом не сломать продукт или связанный компонент. Иногда это останавливает от внесения изменений в код компонента, проще сделать новый компонент. Необходимо уничтожить этот страх.
Цель — достичь максимального качества и разбора компонента на маленькие кусочки. Давайте поговорим про инструменты, которые позволяют достичь этого.
Сравнивали много платформ и библиотек, остановились на Jest. Jest подходил под эти требования.