Привет, Хабр! Меня зовут Мария Бажина, я Android Developer в компании Звук

Вот уже полтора года я работаю над дизайн-системой, поэтому знаю здесь каждую мелочь. И в этой статье я хочу рассказать, зачем нам нужна дизайн-система и в каком виде она существует в нашем проекте. А также, что изменилось в архитектуре приложения и коде после ее внедрения. 

Спойлер – в результате разработка фич стала быстрее в 2 раза, сборка дизайн-макетов ускорилась в 3-4 раза, а UI приложения удалось избавить от хаоса из рандомных шрифтов и иконок и унифицировать. Подробнее – в статье. 

Зачем нам понадобилась дизайн-система

Каждый раз, когда возникает идея внедрить новую фичу или сделать рефакторинг, важно точно понимать, почему нам это нужно. Начнём именно с этого.

Основная цель дизайн-системы — ускорить процесс разработки UI. Для этого нужно сначала упростить дизайнерам процессы создания макетов, а после облегчить и стандартизировать процессы перевода этих макетов в код. 

Наш проект в разработке уже почти 7 лет. За это время у нас накопилось огромное количество цветовых решений и иконок. Чтобы создать макет для новой фичи, дизайнерам часто приходилось делать копии уже готовых интерфейсов и вносить в них правки. Например, чтобы добавить новые цвета. А разработчикам при реализации этих макетов нужно было дублировать уже существующие куски кода из-за отличий в дизайне. Это увеличивало кодовую базу и добавляло работы QA. 

На это уходило очень много времени и у дизайнеров, и у разработки, и у QA. Часто макеты могут совсем незначительно отличаться друг от друга. Но таких изменений со временем становится все больше. И в результате может получиться, что дизайнер просто не знает, какой референс взять для нового макета, потому что есть много очень похожих между собой источников. Вот чтобы такого не случилось, и нужна дизайн-система. 

В самом начале пути в приложении Звука были три основные проблемы с точки зрения дизайна.

Проблема 1: UI не унифицирован

Кажется, что интерфейс сделан в одном стиле, но на самом деле есть очень много несовпадений: разные цветовые решения, нет общего стиля иконок, отличается внешний вид треков в похожих разделах приложения.

Если зайти на другие экраны приложения, то проблемы становятся все заметнее. Это сильно ухудшает пользовательский опыт — на разных экранах приходится осваивать новые способы взаимодействия с UI. 

Чтобы такого не было, все элементы нужно унифицировать — создать систему, в которой правила разработки пользовательского интерфейса будут понятны и дизайнерам, и разработчикам, и QA.

Проблема 2. Цвета и шрифты

До внедрения дизайн-системы в нашем приложении было 176 разных цветов. Это много, да. Некоторые были раскиданы по коду всего приложения и из-за этого часто дублировались — при разработке не всегда можно было найти и понять, что цвет уже есть. 

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

Подобное было почти во всех UI-элементах: стили, кнопки, списки, заголовки разделов и многом другом. 

Проблема 3. Архитектура 

Недостатки были и в архитектуре самого приложения. UI и бизнес-логика зачастую находились в одних и тех же классах. Часто мы сталкивались с такой проблемой при реализации новых фич: надо было немного изменить логику работы уже существующего UI-элемента, и для этого приходилось создавать новый класс-наследник. В результате мы всё больше увеличивали иерархию наследования и создавали больше практически одинаковых классов.

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

Что мы хотели получить от дизайн-системы

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

Но при этом мы хотели достичь и некоторых стратегических целей:

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

  • Упростить верстку UI и разработку внешнего вида. В дизайн-макете есть подробные инструкции для разработчиков интерфейсов — они действуют по чётким алгоритмам, которые собраны в одном документе.

  • Создать единый набор иконок для всего приложения. Это упрощает жизнь командам дизайна и разработки — не нужно искать конкретные иконки по всему приложению. 

  • Унифицировать процессы разработки приложения. Ведь дизайн-система — это не только про дизайн, а еще про принципы и организацию рабочих процессов.

Как решали проблемы дизайна и разработки

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

Цвета, шрифты и иконки

Сначала мы разобрались с хаосом в дизайне. Вот что мы для этого сделали:

  • Собрали все цвета, которые используются в приложении, и разделили их на два уровня: hex-цвета на первом и семантические цвета на втором. Весь код завязан на семантические цвета. И если нужно поменять оттенок в иконках или отдельных темах, то мы меняем только hex-цвета — код при этом не трогаем вообще. Это сильно упростило модификацию и правки макетов в процессе работы. 

  • Дальше составили таблицу замены цветов по всему приложению и написали скрипт импорта, который генерирует hex и семантические цвета по макетам из Figma. На скрине как раз файл, где хранятся значения всех hex-цветов.  

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

Для унификации шрифтов и иконок использовали тот же алгоритм и инструменты.

Сейчас дизайнеру во время создания нужно просто открыть гайд, а не искать референсы по всему приложению — время на разработку макетов сократилось на 30%. 

Компоненты 

Компонент — это отдельный UI-класс, который можно использовать для типичных UI-кейсов. Его можно конфигурировать и переиспользовать на различных экранах приложения.

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

  • Начинается каждый компонент из описания в Figma. Его формирует команда дизайнеров. Дизайнер описывает все возможные состояния и варианты поведения компонента, а также какие настройки у него есть. 

  • Далее проект проходит ревью у команды разработчиков дизайн-системы для разных платформ (iOS, Android, Web). 

  • После правок и утверждения идёт непосредственно разработка: специалисты (я в их числе) верстают компонент, задают атрибуты, реализуют логику работы компонента, его различные варианты отображения и переходы между ними, а после этого переносят всю эту прелесть в код. На этом этапе компонент добавляют в документацию разработчиков, которая лежит в нашем Android-репозитории. Для нее мы выбрали формат markdown — его удобно смотреть как из браузера, так и из IDE.

  • Тестирование и прод. Здесь каких-то особых процессов или секретов нет, поэтому останавливаться на них не буду. Тест-кейсов для компонента нужно больше, потому что его работу нужно проверить в максимально возможном количестве вариантов размеров экранов и всех состояний внешнего вида. Ведь важно понимать, что компонент дизайн-системы — это основа для построения UI всего приложения, поэтому он должен работать в совершенно разных UX-сценариях. 

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

Вся UI-логика уже находится внутри компонентов. А бизнес-логика уже создается нашими разработчиками из продуктовых команд в зависимости от бизнес-целей. Таким образом, команды могут независимо друг от друга использовать компоненты и не пересекаться по коду. 

Архитектура 

Если раньше логика у нас была в одних классах, то теперь мы разделили её на два уровня. В компонентах дизайн-системы оставили только UI-логику. Бизнес-логика находится в продуктовых модулях, которые как раз используют компоненты дизайн-системы.

Основные плюсы решения:

  • Мы можем переиспользовать компоненты в различных виджетах приложения без дублирования. 

  • Экономится время на тестировании. QA теперь тратят время только на тестирование бизнес-логики фичи. А тестирование компонента уже выполнено заранее. 

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

Процесс дальнейшей работы над дизайн-системой

Дизайн-система — это фундамент приложения. Поэтому важно, чтобы в её разработке и улучшении принимали представители всех специальностей, которые напрямую с ней работают: дизайнеры, а также iOS, Android, Web-разработчики.

Нужно заранее учитывать не только визуальную составляющую, но и ограничения, которые накладывают разные платформы. 

Тоже и с разработкой каждого нового компонента. Нужно покрутить его со всех сторон и подобрать компромиссный вариант, который можно будет без особых проблем интегрировать на всех платформах.

Организационные вопросы у нас решены достаточно просто:

  • Раз в неделю мы собираемся на митап командой дизайн-системы. Она кроссплатформенная — в ней есть дизайнеры, а также iOS, Android, Web-разработчики.

  • Есть отдельный канал в нашем внутреннем мессенджере, где мы обсуждаем текущие вопросы. 

  • Ведем коммуникацию с продуктовыми командами. С их стороны могут прилетать реквесты на доработку компонентов или разработку новых. В этих случаях мы стыкуемся по срокам и договариваемся об интеграции изменений. 

В целом у нас здоровый процесс коммуникации со всеми, потому что дизайн-система сильно влияет на визуальную составляющую приложения и его перформанс целиком. 

Что получили в итоге 

Если опираться на структуру Android-проекта, то вся наша дизайн-система получилась вынесенной в один gradle-модуль. В нем находятся все классы наших UI-элементов (компоненты, UI-кит) и весь остальной визуал (иконки, цвета, стили шрифтов). 

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

Дизайн-система находится на одном из нескольких уровней иерархии проекта. От нас зависит довольно большое число модулей, в большинстве случаев продуктовых. При этом сама дизайн-система по максимуму свободна и зависит по факту только от разных утилитных классов, которые ей нужны.

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

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

  • В среднем разработчики стали писать в 2-3 меньше кода для тех же задач, поэтому и скорость работы значительно выросла. А разработка фич целиком стала быстрее в среднем в 2 раза.

  • Процессы дизайн-сборки макетов ускорились в 3-4 раза. Во многом из-за того, что сильно сократилось время на поиск нужных цветов, шрифтов, иконок и подобных дизайн-элементов. Теперь не нужно искать их по всему приложению — просто открываешь базу знаний и смотришь нужный элемент. 

  • Интерфейс выглядит целостно. Каждый экран в приложении примерно на 90% состоит из компонентов дизайн-системы. Есть общая концепция и стиль, нет больше разброса по цветам, шрифтам и формам, а с точки зрения UX все элементы ведут себя полностью предсказуемо.

  • Онбординг новых специалистов стал быстрее. По сути сейчас новому разработчику или дизайнеру нужно только проштудировать нужные гайды и понять логику процессов — за неделю или две он сможет полноценно влиться в работу. 

Да, по сути чуть больше времени мы стали тратить на тестирование компонентов, но с другой стороны мы экономим время на тестировании продуктовых фич. Сейчас рефакторинг старых виджетов у нас почти закончен, но планов у нас еще много. Мы собираемся сделать ещё больше компонентов и детальную документацию на все нюансы системы, создать библиотеку анимации и плейсхолдеров, а также расширить коммуникации команды дизайн-системы с другими командами Звука. Это нужно, чтобы реагировать на запросы быстрее и еще больше улучшать фундамент приложения. 

И конечно, есть отдельный трек по переходу на Compose.

Пишите в комменты, если есть вопросы. По возможности отвечу на все.

Комментарии (2)


  1. SuharkovMP
    26.04.2024 10:35


  1. zubrbonasus
    26.04.2024 10:35
    +1

    Интересно там у вас, в Звук-е!