Как создаются дизайн-системы: делимся собственным примером. Часть 1
Всем привет. Меня зовут Дмитрий Пашкевич, я фронтенд-разработчик в компании Quadcode, специализируюсь на создании и разработке систем проектирования. Эта статья предназначена для специалистов разного уровня, занимающихся дизайн-системами: от потребителей и разработчиков компонентов до тимлидов/техлидов, создающих дизайн-системы с нуля. Здесь я поделюсь своим опытом, и пройденным мной путем от создания UI-китов до полноценного построения дизайн-систем, и покажу преимущества, которые нам принесла готовая дизайн-система. Если вы хотите углубить свое понимание дизайн-систем, то эта статья для вас. Приятного чтения!
вступление
В какой-то степени это сочетание слов стало собирательным термином, поскольку опыт показывает, что разные компании по-разному его трактуют. Понимание зависит от уровня зрелости команды/проекта/компании/процессов, наличия желания, времени и ресурсов, а главное, людей с «увлеченными» глазами, которые будут развивать это направление несмотря на все трудности.
Я прошел путь от создания различных наборов пользовательского интерфейса, преобразования этих наборов пользовательского интерфейса в системы проектирования, до полного построения систем проектирования с нуля с точки зрения разработки FE в следующих ролях:
- Потребитель комплектующих.
- Разработчик компонентов.
- Ведение разработки дизайн-системы с нуля. Здесь 80–90% времени уходило на разработку компонентов, а остальные 10–20% приходилось на применение компонентов в коде продукта, а также на обмен знаниями и взаимодействие с командой разработчиков FE.
- Разработчик продукта — когда вы «строите компоненты» и сразу внедряете их в процессе разработки продукта. В этом случае в работе над дизайн-системой участвует вся команда.
В этой статье я хочу поделиться накопленным опытом и попытаться структурировать его на примере нашей компании. Я продемонстрирую этапы становления и развития дизайн-системы, через которые мы прошли, поделюсь техническим стеком нашего продукта и расскажу о преимуществах, которые принесла нам готовая дизайн-система.
С одной стороны, хотелось бы сразу дать определение, что такое дизайн-система в моем понимании, но давайте подойдем к этому немного иначе и сформулируем, что идет после основной части.
‹СПОЙЛЕР› Для тех, кто хочет узнать о различиях между дизайн-системой и UI-китом, вы можете сразу перейти ко второй части моей статьи и сразу перейти к разделу «Что такое UI-кит?». Короче говоря, это дизайн-система». Тем не менее, я все же рекомендую читать от начала до конца. ‹/СПОЙЛЕР›
Проблемы, которые приводят к появлению дизайн-систем
Во-первых, я начну с того, что обычно инициирует рождение дизайн-системы. Чаще всего причина кроется в накопившихся и признанных проблемах, которые начинает решать вся команда или отдельные ее части — области, где боль больше всего.
Итак, что это могут быть за проблемы?
- Старый дизайн утерян. Больше не поддерживается, либо существует только в образах (да, бывает). В этом случае разработчики сами или с помощью дизайнера придумывают способы включения конкретных элементов. Следствием этого является то, что разработка новых страниц становится проблемой. Продукт неизбежно становится несогласованным на разных страницах, потому что теряется логика построения интерфейса.
- Старый дизайн/интерфейс морально устарел, необходим редизайн. Возникает вопрос: что делать? Дорабатывать ли текущий продукт: модульно, постранично, или строить с нуля и т. д. — каждый выбирает свой путь. В разных путях есть нюансы, с которыми нужно разобраться.
- Сообщения о создании функций/изменениях интерфейса превышают разумные пределы. В этом случае создание нового элемента или подхода к UX становится не связанным с продуктом. Думаю, это можно рассматривать как продолжение пункта 2 и желание команды предоставить пользователям более удобный и современный продукт.
- Создание любой новой функции (даже похожей) занимает много времени. Этому могут способствовать различные факторы, такие как плохая архитектура, унаследованная от проекта MVP, устаревшие инструменты или невозможность просто обновиться.
- Необходимость улучшения процессов. Желание создать единую точку общения внутри команды, хотя бы между разработкой и дизайном. Небольшой спойлер: как показывает практика, при разработке этот пункт, он же дизайн-система, становится как минимум единственным источником истины, и там постоянно возникают дискуссии.
- Наличие значительной рутинной работы при создании новых макетов или кодировании в рамках одного продукта. Иногда нет возможности повторно использовать UI-кит в дизайне или коде. Такая ситуация часто возникает в разных проектах, а иногда и в одном проекте (что более актуально для проектирования в конкретном инструменте). Выглядит это примерно так: вы открываете новый дизайн-макет, видите похожие элементы, но с другими названиями. Разработчику становится сложно сопоставлять элементы с кодом, и возникает необходимость все стандартизировать, чтобы не тратить время на ненужные разъяснения, когда дело просто в том, чтобы взять, внедрить и использовать.
- В компании есть продуктовый пул, и в какой-то момент возникает необходимость стандартизировать UI/UX. У каждого продукта своя команда дизайнеров и разработчиков. Нужно ли каждой команде разрабатывать свой собственный комплект пользовательского интерфейса? Иногда бывает. Затем внедрение дизайн-системы можно начинать со стороны дизайна, что приводит все к единому внешнему виду. В результате в коде может появиться несколько UI-китов из-за сопротивления в разных командах, но уже через пару итераций начинает формироваться единая компонентная база.
Эти описанные проблемы не перечислены в каком-либо определенном порядке или степени важности; любой из них может стать отправной точкой для создания дизайн-системы.
Этапы формирования дизайн-системы
После реализации некоторых из вышеперечисленных действий процесс обычно начинается с создания чего-то похожего на набор пользовательского интерфейса или крупномасштабную дизайн-систему. Он разворачивается следующим образом:
- Распределяются человеческие и временные ресурсы.
- Формируются требования к стеку технологий, которые будут отвечать современным вызовам.
- Исходя из требований, выбирается стек. Появляются первые демо-версии каркасов проектов.
- Возникают первоначальные договоренности между командами разработчиков и дизайнеров — поиск общего языка, желание синхронизироваться.
- Рождается ядро дизайн-системы, точнее сказать, UI-кит, так как процессы еще не до конца сформированы.
- Первые компоненты созданы.
- Компоненты тестируются в первой функции продукта, и в них вносятся коррективы.
- Происходит органическая разработка компонентов в дизайне и коде, с обзорами дизайна или без них.
- Появляется больше времени для размышлений о том, что было сделано и что в настоящее время нуждается в корректировке. Команды разработчиков и дизайнеров согласовывают свои подходы и наборы инструментов, чтобы двигаться вперед, в том числе:
- Выявление и решение проблем.
- Внедрение новых процессов (синхронизация — встречи о том, как дизайнеры создают дизайн, фронтенд-разработчики работают над фронтендом, QA тестирует фронтенд-часть приложения и как все взаимодействуют с дизайн-макетами.
- Внедрение новых инструментов.
10. Постепенно наступает этап, когда команда дизайн-системы или отдельные лица, ответственные за дизайн-систему, меньше сосредотачиваются на создании новых компонентов и больше на сборке страниц и обслуживании компонентов.
На этом этапе моего личного опыта, связанного с разработкой дизайн-системы, я считаю это идеальным путем. Однако всегда есть нюансы, и это зависит от ситуации.
Этапы разработки дизайн-системы
Если углубиться в этот список, можно выделить следующие фазы развития:
Горячая фаза: когда компоненты претерпевают максимальное количество изменений в дизайне/коде во время их внедрения в конечный продукт. Эта фаза может длиться от нескольких месяцев (в среднем 6) до нескольких лет. Минимальная продолжительность, которую я испытал, составляет 3 месяца, а максимальная — 1,5 года. Это зависит от первоначальных договоренностей, опыта внутри команды разработчиков и бизнеса, который выделяет ресурсы, время и расставляет приоритеты.
Разработка компонентов как в коде, так и в дизайне происходит одновременно. Существует связь между разработкой и проектированием, установлением общего языка, соглашениями об именах компонентов и определением наилучшего способа организации библиотеки. Прилагаются усилия к тому, чтобы все в проекте ссылалось на базовые компоненты или чтобы более сложные компоненты были созданы из базовых.
Выявлено множество точек роста, но на данном этапе их можно не решать из-за ограниченности ресурсов или отсутствия острой необходимости. Эти проблемы решаются, когда появляется время или когда становится трудно двигаться вперед, не решив их.
Улучшение рабочих процессов дизайн-системы для проектирования и разработки внешнего интерфейса происходит параллельно. Они улучшают свои собственные процессы и постепенно начинают решать свои проблемы.
Этап синхронизации: вводятся общие собрания по синхронизации, такие как еженедельные или спринтерские собрания, на которых дизайнеры и разработчики обсуждают проблемы, вопросы и предложения, а также согласовывают небольшие шаги для улучшения совместной работы.
Иногда фаза синхронизации может зайти в тупик, когда команда начинает застревать в своих собственных взглядах и должна поделиться своими проблемами с третьей стороной, которая не так глубоко погружена в контекст. Этот человек может помочь найти решения быстрее.
Устранены недостатки в процессах, связанных с анализом проекта, например, как он проводится со стороны проекта, что и как они анализируют. Определены критические изменения дизайна и приоритеты. Устранено несоответствие между макетами дизайна и сжатыми сроками выпуска. Также решается вопрос о том, как процессы проектирования преобразуются в компоненты в Figma, или наоборот, когда дизайн не знает, как компоненты преобразуются в код.
Этап плато: создание новых страниц/функций/корректировок не требует серьезной переработки ключевых компонентов системы дизайна или требует лишь минимальных изменений. Возможны серьезные изменения в поведении компонентов. Например, переосмысление UI/UX, когда что-то оказывается неудобным и нуждается в переработке, или когда необходимо ввести новые компоненты с другим поведением. Время от времени создаются новые компоненты.
При редизайне нашего продукта мы прошли все эти этапы реализации и приемки в относительно быстром темпе: мы построили работающий продукт, а не только компоненты, за полгода.
Замечу, что все три фазы могут время от времени повторяться в зависимости от требуемых изменений. Например, при выделении компонентов в отдельную библиотеку, добавлении управления темами, установлении более строгих стандартов создания компонентов или реализации их в новом проекте.
Во второй части этой монументальной статьи я рассказываю о том, как определить требования к продукту и, как следствие, требования к дизайн-системе, а также объясню, почему мы выбрали Mantine в качестве основы для нашей собственной дизайн-системы. Подписывайтесь и следите за обновлениями! Буду рад ответить на любые вопросы в комментариях.