Как построить архитектуру большого iOS проекта с нуля
Что проверяют
Мыслите ли вы архитектурой приложения, а не паттерном экрана. Интервьюер ждёт модули, направление зависимостей, сборку и работу нескольких команд, название паттерна здесь вторично. Следом обычно спрашивают, как вы организуете навигацию между модулями и как не утонуть во времени сборки.
Как отвечать
Начните с входных данных: размер команды, минимальная версия iOS, офлайн-режим, требования к безопасности. От минимальной версии зависит, можно ли строить интерфейс на SwiftUI с @Observable (iOS 17 и новее). Дальше каркас:
- модули: локальные пакеты Swift Package Manager. Слой Core (сеть, хранилище, аналитика), дизайн-система, фичи. Фичи друг от друга не зависят и общаются через интерфейсные модули, чтобы правка в одной не пересобирала остальные;
- зависимости: внедрение через инициализатор и одна точка сборки графа (composition root), при желании контейнер вроде Swinject или Factory;
- навигация: координаторы или роутер, чтобы экран не знал, куда ведёт следующий шаг, а диплинки разбирались в одном месте;
- паттерн экрана: MVVM, TCA или VIPER, но один на весь проект и с понятным шаблоном;
- конкурентность:
async/await, акторы и языковой режим Swift 6 со строгими проверками с первого дня, пока кода мало; - проект: Tuist или XcodeGen, чтобы
.pbxprojне конфликтовал в каждом PR. Сторонние зависимости через SPM: CocoaPods в режиме поддержки, новый проект на нём не начинают; - качество: юнит-тесты на бизнес-логику, снапшот-тесты дизайн-системы, CI на каждый PR, фича-флаги и удалённая конфигурация.
Закончите тем, что архитектура растёт с проектом: на старте хватит нескольких модулей с правильными границами, дробить дальше можно, когда появится вторая команда.
Где спотыкаются
Отвечают «возьму VIPER» и на этом останавливаются. Это паттерн одного экрана, про модульность и зависимости он ничего не говорит.
Проектируют полсотни модулей на старте для приложения из пяти экранов. Накладные расходы съедают скорость команды раньше, чем архитектура начинает окупаться.
Забывают про время сборки и работу нескольких команд. Монолитный таргет на сотни тысяч строк собирается долго и конфликтует при каждом слиянии.