Мобильный разработчик: натив (iOS / Android) vs Flutter, roadmap и вопросы с собеседований
Актуальный гид по мобильной разработке: сравнение Swift, Kotlin, Flutter и React Native. Архитектура MVVM, жизненный цикл экранов, утечки памяти и частые вопросы на интервью.
Мобильные приложения генерируют свыше 60% всего мирового интернет-трафика. Смартфон стал главным окном контакта пользователя с бизнесом: от банковских переводов и маркетплейсов до фитнес-трекеров и обучающих платформ.
В этой статье мы разберем ключевую дилемму начинающего мобильного разработчика (натив или кроссплатформа), структуру компетенций и 5 ключевых вопросов с технических собеседований.
Нативная разработка vs Кроссплатформа#
Выбор стека определяет архитектуру и рынок вакансий:
| Направление | Стек технологий | Сильные стороны | Когда выбирать |
|---|---|---|---|
| Нативный iOS | Swift, SwiftUI / UIKit, Combine | Идеальная интеграция с экосистемой Apple, максимальный FPS, прямой доступ к новейшим фичам iOS | Финтех, премиум-сегмент, игры, AR/ML |
| Нативный Android | Kotlin, Jetpack Compose, Coroutines | Огромная мировая база устройств, гибкость кастомизации ОС | Массовые сервисы, IoT, корпоративные устройства |
| Flutter (Dart) | Dart, Flutter Framework | Единый код для iOS и Android, собственный движок рендеринга Skia/Impeller, высокая скорость верстки | Стартапы, MVP, e-commerce, средний бизнес |
| React Native | TypeScript, React Native | Знакомый веб-разработчикам стек, быстрое переиспользование логики | Компании с сильной веб-командой |
Дорожная карта (Roadmap) мобильного разработчика#
Пошаговый план развития мобильного разработчика
Язык платформы и модель памяти
1-1.5 месяцаГлубокое освоение языка: Kotlin (Android) или Swift (iOS). Корутины, реактивные потоки Flow / Combine, опционалы и понимание ARC vs Сборщик мусора.
Современный декларативный UI
1 месяцСтандарт современной индустрии: Jetpack Compose для Android или SwiftUI для iOS. Рекомпозиция, стейт-менеджмент и кастомные жесты/анимации.
Архитектура приложения и DI
3-4 неделиПаттерны MVVM и MVI, чистая архитектура (Clean Architecture), многомодульность и внедрение зависимостей (Hilt, Koin, Swinject).
Работа с сетью, кэш и локальные БД
3-4 неделиOffline-First подход: работа с REST API / WebSocket через Ktor / Retrofit / URLSession, кэширование и реляционные базы Room (SQLite) или SwiftData / CoreData.
Тестирование, CI/CD и публикация в сторы
2-3 неделиНаписание юнит- и UI-тестов, автоматизация сборки с Fastlane, подпись сертификатов и дистрибуция в Google Play, App Store и RuStore.
1. Язык и модель памяти#
- Kotlin: Null-safety (
?,?:), корутины (CoroutineScope,Dispatchers), Flow. - Swift: Опционалы (
Optional), замыкания, структуры (struct, value type) vs классы (class, reference type), протоколы. - Управление памятью: ARC (Automatic Reference Counting) в iOS vs Garbage Collector в Android JVM.
2. Пользовательский интерфейс (Декларативный UI)#
- Jetpack Compose (Android) и SwiftUI (iOS) стали стандартом индустрии, вытеснив XML и Storyboard/XIB.
- Рекомпозиция, управление состоянием UI, кастомные анимации и жесты.
3. Архитектура и хранение данных#
- Паттерны: MVVM (Model-View-ViewModel), MVI (Model-View-Intent), Clean Architecture.
- Сеть и кэш: Ktor / Retrofit, сериализация JSON, Offline-First архитектура.
- Локальные БД: Room (Android), CoreData / SwiftData (iOS), Realm.
Топ-5 вопросов с собеседований по мобильной разработке#
1. В чем разница между ARC в Swift и Сборщиком мусора (GC) в Kotlin?#
Фундаментальный вопрос по модели работы с оперативной памятью:
- ARC (Automatic Reference Counting, iOS): Работает на этапе компиляции. Компилятор сам расставляет инструкции
retain(увеличить счетчик ссылок) иrelease(уменьшить). Память освобождается мгновенно, как только счетчик ссылок стал равен 0. Нет пауз в работе приложения (Stop-the-World). - Garbage Collector (GC, Android): Работает в рантайме. Специальный фоновый процесс периодически сканирует память, строит граф достижимости от корней (GC Roots) и удаляет недостижимые объекты. Способен сам разрешать циклические ссылки, но периодически тратит ресурсы процессора.
2. Что такое Retain Cycle (циклическая ссылка) и как её предотвратить?#
Возникает, когда два объекта удерживают сильные ссылки (strong) друг на друга. В результате счетчик ссылок никогда не станет нулевым, и возникает утечка памяти (Memory Leak).
class Author {
var book: Book?
}
class Book {
// ОШИБКА: сильная ссылка создает Retain Cycle
// var author: Author?
// ПРАВИЛЬНО: слабая ссылка не увеличивает счетчик
weak var author: Author?
}
- В Swift используют
weak(всегда опционал) илиunowned. - В Kotlin/Android утечки возникают при удержании контекста
Activityв статических переменных или долгоживущих синглтонах.
3. Жизненный цикл экрана (Activity в Android / UIViewController в iOS)#
На интервью проверяют, умеет ли разработчик корректно сохранять состояние при повороте экрана или сворачивании приложения:
- Android Activity:
onCreate()$\to$onStart()$\to$onResume()(экран активен) $\to$onPause()$\to$onStop()$\to$onDestroy(). - iOS UIViewController:
viewDidLoad()$\to$viewWillAppear()$\to$viewDidAppear()(экран виден) $\to$viewWillDisappear()$\to$viewDidDisappear().
Где лучше всего отменять сетевые запросы при уходе пользователя с экрана?
В Android — в ViewModel.onCleared() или onStop(). В iOS — в viewDidDisappear() или через отмену Combine Cancellable / async Task.
4. Паттерн MVVM: за что отвечает каждый слой?#
- Model: Данные и бизнес-логика (сущности базы данных, сетевые DTO, репозитории).
- View: Отображение интерфейса (Activity, Composable-функции, SwiftUI View). Не содержит бизнес-логики, только реагирует на изменение стейта.
- ViewModel: Связующее звено. Запрашивает данные из репозитория, преобразует их в удобное для отображения состояние (UI State) и отдает наружу через реактивный поток (
StateFlowв Android,@Published/@Observableв iOS). Переживает пересоздание экрана при повороте.
5. Что такое Offline-First подход?#
Offline-First — концепция архитектуры, при которой приложение всегда в первую очередь читает данные из локальной базы данных на устройстве (Single Source of Truth) и мгновенно показывает их пользователю.
Сетевой запрос выполняется параллельно в фоне:
- Пользователь открыл приложение $\to$ мгновенно отобразился кэш из Room/CoreData.
- Фоновый запрос забрал свежие данные с сервера $\to$ обновил локальную БД.
- UI реактивно обновился через подписку на изменения БД.
Резюме#
Мобильная разработка дает быстрый и наглядный результат своего труда: ваш код оказывается в руках миллионов людей в их смартфонах. Начните с базы одного языка (Kotlin или Swift) и проектирования надежной архитектуры без утечек памяти.
Прокачивай IT-скиллы с Capycodio
Не зубри теорию часами перед компьютером. Короткие 3-минутные интерактивные сессии прямо с телефона: по дороге, за кофе или перед сном.
Мы создаем интерактивный мобильный тренажер для разработчиков. Короткие сессии по 3-5 минут, чтобы держать базу и закрывать пробелы перед собеседованиями.