Давайте заглянем за кулисы iOS-разработки в Revolut, где мы стремимся предоставить исключительные финансовые услуги и беспроблемный опыт для клиентов, которые полагаются на наши iOS-приложения для управления своей финансовой жизнью.
Мы верим, что можно быстро создать высококачественное программное обеспечение. Для этого мы следуем ряду важных принципов и применяем ряд современных Agile-практик, в основном вдохновленных XP (eXtreme Programming).
Быстрая доставка
В настоящее время на платформе iOS у нас есть как приложения, так и SDK.
Вот список того, что уже работает:
Все приложения для iOS обновляются в App Store еженедельно. Мы работаем по принципам непрерывной интеграции и непрерывной доставки, чтобы оперативно предоставлять клиентам новую функциональность — как только функция или ее часть будет готова.
Мы создали свой собственный фреймворк для релизов, основанных на функциях. Согласно нашему процессу, владелец продукта указывает функцию, которая должна быть включена, начиная с выбранной версии приложения. Затем и версия приложения, и его функции постепенно распространяются, начиная с небольшого процента нашей клиентской базы. Эти два подхода — установка флагов и постепенное развертывание версий и функций — позволяют предоставлять клиентам ценность с минимальным риском. Если что-то пойдет не так, флаг будет отключен или старая версия будет повторно представлена в виде отката, чтобы удалить проблемное изменение. Кроме того, флаги функций позволяют членам команды легко переключаться между различными пользовательскими впечатлениями, сравнивать их или включать и выключать для тестирования.
Мы также разработали собственную платформу для проведения экспериментов, которая позволяет командам экспериментировать с новыми функциями и измерять их влияние с помощью заранее заданных показателей статистически значимым образом. Эта платформа гарантирует правильную постановку экспериментов и получение результатов с использованием надежной статистической базы.
Все идеи тестируются, а решения принимаются с использованием логики, основанной на данных, что позволяет гарантировать, что только лучшие фичи получат основные усилия в разработке. Это позволяет быстро и целенаправленно разрабатывать ключевые функции, ориентированные на пользователей.
Архитектура
Вникая в основы iOS, важно понимать, что наши приложения для iOS — это лишь один из элементов большой экосистемы. Наша цель — развивать передовые технологии для улучшения пользовательского опыта, сохраняя при этом простоту и эффективность. Чтобы обеспечить согласованность между разнообразными приложениями, функциями и командами, мы используем структурированный процесс, известный как System Design Review (SDR).
Процесс SDR служит важнейшим механизмом для оценки и уточнения архитектуры наших решений. Архитектура выступает в роли клея, органично объединяющего технологические элементы для создания единой и эффективной системы. В контексте SDR мобильной архитектуре придается особое значение, что гарантирует, что наши iOS-решения прочны, масштабируемы, соответствуют или превосходят отраслевые стандарты.
Понимание solution-level архитектуры не только способствует эффективному участию в процессе SDR, но и дает возможность для личного и профессионального роста внутри Revolut.
С точки зрения iOS-платформы, все наши продукты реализованы на основе чистой архитектуры и MVVM-C.
Наши приложения не монолитны. Они включают в себя общие модули, такие как основной модуль, компоненты пользовательского интерфейса и функциональные модули, такие как торговля, платежи, криптовалюты, кредиты и карты.
В настоящее время у нас есть:
- 160 общих модулей
- 170 модулей в Revolut
- 80 модулей в Revolut Business
- 45 модулей в Revolut <18
Все наши приложения и общие модули хранятся в едином моно-репозитории, и каждый модуль может быть собран и запущен независимо.
Краткие преимущества модульной архитектуры:
- Ускоренное время сборки — каждый модуль имеет пример или демонстрационный проект, что позволяет быстро разрабатывать его отдельно, не компилируя все приложение
- Ускоренная разработка благодаря более быстрой компиляции и легкому доступу к экранам в проекте примера
- Изолированная среда для опробования новых вещей
- Тесты выполняются за считанные секунды
Технологический стек
Мы разрабатываем на Swift и используем iOS SDK. Наша цель — снизить зависимость от сторонних фреймворков, чтобы минимизировать зависимость от внешнего кода. Например, вместо того чтобы сильно полагаться на внешние фреймворки, мы применяем облегченный реактивный подход в нашей основной библиотеке. Эта стратегия отражает функциональность Combine и будет способствовать более плавному переходу на SwiftUI в будущем с минимальными усилиями.
В нашем приложении мы сильно превысили возможности сборки в XCode, и чтобы соответствовать нашему главному принципу — быстрому созданию качественного программного обеспечения — мы используем комплекс отлаженных инструментов с открытым исходным кодом и собственных разработок.
Чтобы иметь возможность быстро собирать и тестировать наши приложения и фреймворки, мы перешли на Bazel от Google, который обеспечивает надежный облачный и локальный кэш для сборки модулей.
Наши собственные инструменты полностью построены на Swift (чтобы их мог понять и модифицировать каждый iOS-инженер в компании) в виде интерфейса командной строки и позволяют легко работать со всей кодовой базой.
Мы можем легко собирать, тестировать и развертывать проекты, поскольку наш CI-конфиг аналогичен локальному. Это означает, что сборки могут быть созданы и протестированы где угодно: из любого окружения, как удаленного, так и локального, из любой ветки, как релиз, версия для разработки или конкретной функции, и могут быть опубликованы в TestFlight и AppCenter.
Чтобы лучше понять масштабы разработки, давайте посмотрим на цифры. Каждый месяц наши iOS-инженеры создают около 2,200 пул-реквестов, которые приводят к созданию около 4 или 5 тысяч CI-сборок.
При такой интенсивной разработке мы также неустанно оптимизируем наши конфигурации и структуру модулей. Например, последняя такая оптимизация помогла сократить время проверки PR с 40 до 10 минут, что привело к сокращению CI почти на 2 000-2 500 часов в месяц.
Также стоит отметить другие инструменты и технологии, которые мы используем, в том числе:
- Git
- Xcode
- Figma
- CoreData для хранения данных (все наши приложения поддерживают офлайн-просмотр, поэтому данные из кэша базы CoreData могут быть показаны на экране, когда нет доступа к интернету, а клиенту нужно, например, посмотреть данные карты)
- SwiftLint, TeamCity и другие
Кросс-функциональные команды
У нас более 120 высококвалифицированных iOS-разработчиков, распределенных по разным командам и локациям. В компании установлено право собственности на код, и каждая команда отвечает за поддержку одного или нескольких модулей. Каждая команда обычно состоит из разработчиков для iOS, Android, Web и Backend, владельца продукта, дизайнера и аналитика данных. Таким образом, каждая команда похожа на небольшой стартап, который может выдвигать идеи и превращать их в продукты или функции.
Члены команды имеют полный контроль над функционалом, который они разрабатывают. Для инженера быть частью кросс-функциональной команды — значит иметь возможность влиять на продукт, участвовать в принятии решений и изучать технологии, не относящиеся к его компетенции.
Чтобы повысить продуктивность нашей команды, мы используем множество инструментов для бесперебойной разработки с учетом распределенных способов работы. Конечно, каждая команда уникальна в своих настройках и процессах, но в целом мы следуем Agile-методологии, общаемся в Slack, храним артефакты разработки в Confluence и отслеживаем прогресс в Jira.
Качество
Чтобы обеспечить быстрое создание высококачественного программного обеспечения, мы уделяем первостепенное внимание максимальной автоматизации процесса обеспечения качества. Наша пирамида тестирования образует прочный фундамент: все тесты, используемые в наших iOS-продуктах, написаны на Swift и используют нативные SDK, такие как XCTest и XCUITest. Кроме того, для облегчения синтаксиса и разработки тестов на основе документации мы используем такие фреймворки, как Quick + Nimble, в которых реализованы контекстное и поведенческое тестирование. Кроме того, для многоразовых компонентов дизайна мы используем SnapshotTestCases.
Вот некоторые цифры, касающиеся нашей автоматизированной части пирамиды тестирования:
- На самом нижнем уровне у нас есть около 12,000 наборов модульных тестов с более чем 150,000 отдельных тестовых случаев для проверки отдельных компонентов.
- На среднем и верхнем уровне у нас 3,000 UI-тестов, охватывающих как интеграцию, так и UI/UX-часть приложения.
Также важно отметить, что обеспечение качества наших продуктов — это общая ответственность всех наших сотрудников. Хотя у нас нет специальных QA-инженеров, наши разработчики, владельцы продуктов, дизайнеры и все остальные сотрудники принимают комплексные меры для поддержания высоких стандартов. Они включают в свой рабочий процесс различные методы тестирования, в том числе ручные перекрестные проверки и ежедневное тестирование использования приложений. Применяя такой автоматизированный и совместный подход к обеспечению качества, мы поддерживаем наше обязательство предоставлять надежные и удобные продукты нашим клиентам.
Безопасность
Наша специализированная команда информационной безопасности (InfoSec) играет ключевую роль в защите систем Revolut и данных пользователей. Благодаря тщательной проверке кода, тестированию на проникновение, автоматическому сканированию уязвимостей и проактивному поиску угроз. Благодаря их неизменной приверженности делу наши пользователи могут доверять Revolut свою конфиденциальную информацию, зная, что приняты все меры для защиты их конфиденциальности и безопасности.
В частности, для нашей iOS-платформы мы применяем комплексные меры безопасности, чтобы обеспечить целостность нашего приложения и защитить данные пользователей. Мы применяем методы шифрования и используем Keychain для безопасного хранения конфиденциальных и учетных данных, гарантируя, что они останутся недоступными для неавторизованных лиц даже в случае компрометации устройства. Кроме того, мы тщательно разрабатываем конечные точки API и локальные механизмы хранения, чтобы свести к минимуму передачу и хранение данных.
Чтобы защититься от потенциальных угроз со стороны небезопасных устройств и модификаций во время выполнения, мы интегрируем в кодовую базу наших приложений передовые механизмы защиты и обнаружения в рантайме. Эти меры активно контролируют среду выполнения приложения, обнаруживая и реагируя на любые несанкционированные попытки вмешательства или использования приложения. Упреждая подобные риски, мы повышаем устойчивость нашей iOS-платформы, укрепляя доверие пользователей и обеспечивая конфиденциальность и целостность их данных.
Согласованность дизайна
Все компоненты пользовательского интерфейса разработаны с учетом высокой степени многократного использования в наших приложениях и размещаются в отдельных модулях для обеспечения единообразия визуального оформления приложения. Эти модули внедряются на всех платформах, для которых мы разрабатываем, обеспечивая одинаковый пользовательский интерфейс и UX. Мы называем этот подход системой дизайна. Мы разработали эту систему с учетом основных принципов атомарного дизайна.
Система дизайна служит инструментом экономии ресурсов, сокращая объем кода и время разработки. Разработчикам больше не нужно дублировать код или тратить время на повторное создание компонентов. Вместо этого они могут воспользоваться приложением Revolut Design System App, в котором представлены все существующие компоненты пользовательского интерфейса, что позволяет разработчикам легко выбрать и повторно использовать подходящие компоненты для своих функций.
Присоединяйтесь к Revolut
Хотите создавать финансовое приложение мирового класса для iOS?
Изучите возможности карьерного роста в Revolut и присоединяйтесь к команде самых талантливых разработчиков.