Site icon AppTractor

Рефакторинг кодовой базы в Slack: Стабилизация, Модуляризация и Модернизация

Недавно Slack поделился своей историей о том, как они улучшают свою устаревшую кодовую базу мобильных приложений. Интересное чтение на полчаса.

Я резюмирую свои выводы в этой статье.

Зачем нужно было серьезное улучшение кодовой базы?

Код писался с 2015 года на Android и с 2013 года на iOS. На момент, когда команда занялась улучшением кода (в 2020 году), ему исполнилось 5 и 7 лет соответственно. Капитальная переделка была необходима, потому что:

Что можно было сделать

Как это было спланировано

Чтобы все это заработало, нужно было не просто начать. Нужно было предпринять шаги, чтобы спланировать все:

  1. Они назвали проект Project Duplo. Именование важно, чтобы проект можно было легко идентифицировать.
  2. Начали со списка намеченных целей. Нужно знать, какова цель проекта.
  3. Некоторые отдельные участники возглавили инициативы по раннему изучению возможностей и составлению более подробных планов.
  4. Поделились этим с заинтересованными сторонами, которые станут все реализовывать, учитывая, что это потребует времени и инвестиций (компромисса с некоторыми другими вещами). Сообщили им, что они получат взамен.
  5. Четко расписали, что нужно решить, как измерить прогресс и каков риск с планом смягчения последствий.

Чего они хотели достичь

Фаза стабилизации

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

iOS

Android

Метрики

Фаза модуляризации

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

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

Никакая другая часть проекта, кроме модульности, не оказала большего влияния на наши цели по ускорению мобильной разработки и очистке нашей кодовой базы.

Весь этап Модульности совместно с Модернизацией занял в общей сложности год.

Преимущества модульного подхода

Модульный подход

Разбит на 3 разные категории

Инструменты

Для успешной модуляризации более важными являются инструменты. Привлекли Команду опыта разработчиков (Developer Experience Team) для поддержки необходимого тулинга.

Фаза модернизации

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

Совместно с модульностью процесс занял 1 год.

Модернизация iOS

Модернизация Android

Результаты, достижения

В целом команда добилась того, к чему стремилась, за 1.5 года. Хотя проект еще не считается завершенным (и я думаю, что никогда не будет завершенным), он многого достиг:

Появившиеся проблемы и что нужно решить

Несмотря на множество преимуществ, есть некоторые проблемы.

Более длительное время локальной сборки

Это привело к увеличению времени локальной сборки из-за Bazel. Однако этому противодействуют с помощью

Сложные отношения между модулями

С модулями «Фичи», «Сервисы» и «Библиотеки» все еще недостаточно проработано, поскольку Фичи зависят от Фич, а Сервисы зависят от Сервисов, что может привести к более глубоким иерархическим и циклическим отношениям. Требуется дополнительная доработка.

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

Задача внедрения зависимостей

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

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

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

Нужно больше улучшений в кодовой базе Android

Мой личный взгляд

Инициатива Slack по рефакторингу действительно хорошо скоординирована с желаемым результатом. Здорово, что управленческая команда оказывает большую поддержку такой инициативе и позволяет всем разработчикам участвовать если не в большей части этого проекта Duplo, то хотя бы частично.

Что мне действительно нравится в инициативе:

  1. Разделение монолита на модульные части позволяет сократить время сборки, улучшить владение, и каждая команда может работать независимо.
  2. Нацеливание на модернизацию кодовой базы с помощью новейшего стека технологий, например, перенос Obj-C на Swift и Java на Kotlin, использование Combine и корутин и т.д.
  3. Целенаправленное участие некоторых членов команды, а также вклад всех разработчиков в инициативу с помощью команды Developer Experience.
  4. Различные измеримые показатели результативности, например, улучшение времени CI, % принятия, настроение разработчиков и т.д.

Вещи, которые, по моему мнению, могли бы быть лучше (с оговоркой, что это всего лишь моя личная ограниченная точка зрения):

  1. Миграция выполняется слишком рано, до того, как SwiftUI и Jetpack Compose будут признаны полезными для команды. В ближайшие 2–3 года мобильный мир будет полон SwiftUI и Jetpack Compose, поэтому команда Slack, планирующая, что инициатива Duplo продлится 5 лет, может и ошибиться. Возможно, с помощью SlackKit они смогут скрыть влияние этих изменений.
  2. Сотни модулей и многоуровневая модульная структура могут усложнить ситуацию в будущем. Для обеспечения масштабируемости в долгосрочной перспективе может потребоваться более точное разделение модулей, позволяющее избежать непрерывного роста их количества.
  3. Инициатива iOS и Android выполняется относительно по-разному, хотя фазы высокого уровня (стабилизация, модульность и модернизация) считаются одинаковыми. Возможно, на этапе модульности могут быть общие библиотеки или службы, которые можно использовать на обеих платформах.
  4. Наиболее предпочтительное согласование шаблонов между командами может ограничить модульную команду в большей автономии, в изучении новых шаблонов и использовании шаблонов, которые лучше подходят для конкретного функционального модуля. Принудительное выравнивание — это балансировка, когда чрезмерное выравнивание может задушить эволюционное развитие базы кода.

В целом, статья Slack является отличным уроком для многих в сообществе мобильных разработчиков по масштабированию мобильной разработки. Большое спасибо команде Slack за то, что поделились ей! Отличный прогресс и так держать!

Источник

Exit mobile version