Основы iOS в Revolut

Многие пользователи Revolut управляют своей финансовой жизнью в нашем приложении для iOS. Давайте заглянем за кулисы разработки iOS в Revolut - как мы предоставляем выдающиеся финансовые услуги и удобство взаимодействия с пользователем на любом устройстве iOS.

Освободить поезд

У нас есть три приложения для iOS: Revolut, Revolut Junior и Revolut Business, которые еженедельно обновляются в App Store. Мы работаем на принципах непрерывной интеграции / непрерывной доставки, чтобы быстро создавать новые функции для пользователей - как только функция или ее часть будут готовы.

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

Архитектура

Все наши продукты реализованы с использованием чистой архитектуры и MVVM. Мы используем Flow Coordinator, чтобы представить последовательность экранов и поведение жизненного цикла, которое помогает нам реализовать многоразовые поведения View Controller.

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

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

  • Более быстрое время сборки. У каждого модуля есть пример / демонстрационный проект для быстрой изолированной разработки без компиляции всего приложения.
  • Более быстрая разработка благодаря более быстрой компиляции и легкому доступу к экранам в примере проекта.
  • Изолированная среда, позволяющая легко пробовать новое.
  • Тесты выполняются за секунды.

Стек технологий

Пишем на Swift и используем iOS SDK. Мы предпочитаем не использовать RxSwift, поддерживаемый сообществом, поскольку мы не можем позволить себе полагаться на кого-то еще, чтобы исправить какие-либо проблемы, пока мы ждем. Вместо этого мы реализуем методы реактивного программирования внутри наших основных библиотек.

Другие инструменты и технологии, которые мы используем, включают:

  • Xcode и выбранный клиент Git (например, Sourcetree)
  • Фигма
  • CoreData для хранения данных. Данные из базы данных кэша CoreData могут отображаться на экране, когда приложение находится в автономном режиме.
  • Опасность, проверяющая PR перед запуском автотестов, и SwiftLint, проверяющий стиль кода.
  • fastlane и TeamCity для поддержки CI

Любая сборка из выпуска, разработки или функциональной ветки может быть опубликована в TestFlight и AppCenter. Каждый месяц наша команда iOS создает приложение 15 000 раз, поэтому мы решили поэкспериментировать с Bazel от Google, чтобы увеличить скорость сборки. Это помогло нам сократить время сборки почти вдвое, с 4,2 минуты до 2,64, сэкономив ~ 400 рабочих часов в месяц. Это привело к нашему решению перейти со сборки Xcode на Bazel.

Кросс-функциональные команды

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

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

Общие принципы

В кросс-платформенной команде проще обеспечить соблюдение наших основополагающих принципов во всех наших продуктах и ​​платформах - CI / CD, автоматическое тестирование, согласованность пользовательского интерфейса и многое другое.

Безопасность данных клиентов. Все наши команды понимают, что успех Revolut во многом зависит от того, насколько серьезно мы справляемся с рисками безопасности. Мы предпочитаем собственные решения для отслеживания и анализа пользовательских данных, чтобы личные данные никогда не передавались третьим лицам. Мы используем данные, чтобы улучшить взаимодействие с пользователем, например удалить ненужные шаги из потока или найти лучшее место для кнопки в приложении. В частности, для iOS мы храним пользовательские данные и учетные данные в KeyChain. Мы используем Firebase в регионах GDPR в качестве исключения для сбора данных о сбоях приложений.

Автоматическое тестирование. Ожидается, что разработчики Revolut возьмут на себя ответственность за качество своего кода и напишут автоматические тесты пользовательского интерфейса, модульные тесты и тесты снимков экрана / снимков. Вовлечение разработчиков в автоматическое тестирование не должно быть болезненным - мобильные команды используют специальную платформу для тестов пользовательского интерфейса, для создания теста которой требуется всего несколько строк кода. Мы также считаем, что очень важно протестировать все основные компоненты, поэтому у нас есть 100% тестовое покрытие наших основных модулей.

Последовательность дизайна

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

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

Присоединяйтесь к Revolut

Хотите создать финансовый продукт мирового уровня для iOS? Изучите карьерные возможности в Revolut и присоединитесь к команде самых талантливых разработчиков.