Собес в Альфа-Банк · Android разработчик
Материал Эйч · Опубликовано 27 октября 2026
Обзор
Middle/Senior: Kotlin, архитектура мобильного банка, RxJava, Dagger, REST и качество UI
Фишка: Крупный цифровой банк с акцентом на собственную мобильную разработку, сильный IT-хаб и внутренние митапы; типичны вопросы из реальных Android-проектов банка (Koin scopes, корутины, паттерны).
| Этап | Длительность | Что проверяют |
|---|---|---|
| Скрининг / HR | 30–45 мин | Мотивация, опыт 4+ лет в Android, формат работы (удалёнка/гибрид), ожидания по доходу и KPI-премии |
| Техническое интервью | 60–90 мин | Kotlin, Android SDK, архитектура, RxJava/Dagger/Retrofit, SOLID, вопросы по прошлым проектам |
| Углублённое тех. / live coding | 60–90 мин | Задачи на Kotlin, жизненный цикл, многопоточность, разбор архитектурного кейса под финтех |
| Финал с тимлидом / команда | 45–60 мин | Культурный fit, процессы (git flow, code review), масштабирование команды мобильного банка |
Стек и темы
Обязательный минимум
- Kotlin (inline, reified, data class, sealed class)
- Activity/Fragment lifecycle, ViewModel, Navigation
- MVVM/MVI/MVP и Clean Architecture (слои UI — domain — data)
- RxJava 2 или корутины + Flow
- Dagger 2 / Hilt или Koin (scopes)
- Retrofit, OkHttp, REST/HTTP
- Material Design, производительность UI
- Git flow, unit/UI-тесты, code review
- SOLID, базовые паттерны (Adapter, Facade, Builder)
Плюсом будет
- Compose (если команда уже мигрирует)
- Опыт финтеха: безопасное хранение, certificate pinning
- Профилирование (Systrace, Memory Profiler)
- Публикации на Хабр / выступления (упоминается в оффере)
Kotlin
Можешь назвать основные ключевые слова, применяемые при использовании inline в коде?
inline, noinline, crossinline; вставка тела в место вызова, меньше overhead для лямбд.
Можно ли применить ключевое слово reified без использования inline?
Нет: reified только у inline-функций из-за type erasure на JVM.
Как можно реализовать паттерн Builder в Kotlin, избегая дополнительных классов?
DSL: apply {}, именованные аргументы, функция-расширение с лямбдой-конфигуратором.
Как реализованы внутренние структуры MutableList и ImmutableList?
Mutable — ArrayList/динамический массив; immutable — обёртки без мутаций, copy-on-write у некоторых коллекций.
Можно ли определить тип объекта без typeof?
is/as, when с smart cast, reified T, проверка интерфейса/поведения.
Ловушка: Путают inline только с производительностью — на собесе ждут знание noinline/crossinline для лямбд-параметров.
Фишка: В Альфа-Банк часто спрашивают связь возможностей Kotlin с паттернами (object singleton, data class, sealed для UI state).
Android SDK и жизненный цикл
Объясните отличия onStop и onPause в жизненном цикле Activity.
onPause — частично видима (диалог); onStop — не видима; что останавливать на каждом этапе.
Можно ли использовать одну ViewModel для обмена данными между двумя фрагментами при навигации?
Да, если owner — общая Activity или nav graph scope; не создавать новую VM на каждый фрагмент.
Как определить правильный Looper для Handler при обмене между фоном и UI?
Main: Looper.getMainLooper(); фон: HandlerThread + свой Looper.
Совет: Свяжите lifecycle с корутинами: lifecycleScope, viewModelScope, repeatOnLifecycle для Flow.
Архитектура и слои
Как связать слой бизнес-логики с уровнем данных?
Repository interface в domain; реализация в data; UseCase зависит от абстракции; DI.
Какие варианты Model-View паттернов использовали в проектах?
MVC/MVP/MVVM/MVI: кто держит state, однонаправленный поток, тестируемость Presenter/ViewModel.
В чём взаимосвязь Kotlin и паттернов проектирования?
object — Singleton; data class — Value Object; sealed — иерархия состояний; делегаты.
Фишка: В вакансии явно ждут масштабируемый код под «лучший мобильный банк» — готовьте пример модульности и переиспользуемых UI-компонентов.
Многопоточность
Можно ли volatile обеспечить thread-safety при совместной работе с переменной?
Только visibility, не атомарность составных операций; для счётчиков — Atomic* или mutex.
В каких случаях нужны атомарные операции или транзакции?
Составные обновления, БД-транзакции Room, race на shared state.
Какие факторы влияют на поведение DefaultDispatcher?
Пул ~ число ядер, work-stealing; не для блокирующего IO — Dispatchers.IO.
Ловушка: RxJava vs корутины: в стеке вакансии RxJava 2 — будьте готовы объяснить subscribeOn/observeOn и disposable.
DI: Dagger и Koin
Как обеспечить сохранение объекта, связанного с Activity, в Koin?
scope для Activity/Fragment; getKoin().createScope; закрытие scope в onDestroy.
Совет: Для Dagger 2: Component vs Subcomponent, @Inject constructor, модули для Retrofit/OkHttp.
Сеть и API
Принципы RESTful API и HTTP — что проверяют на собесе?
Методы, коды ответов, идемпотентность, кеширование, interceptors (auth, logging).
Совет: Retrofit + OkHttp: timeout, retry policy, обработка ошибок на уровне repository, не в UI.
Паттерны проектирования
Различие Adapter и Facade?
Adapter — совместимость интерфейсов; Facade — упрощённый вход в подсистему.
Различие Decorator и Facade?
Decorator — наслоение поведения на один объект; Facade — единая точка входа.
Задачи
Два указателя: пара с заданной суммой
Дан отсортированный массив целых и число target. Найдите индексы двух элементов, сумма которых равна target (ровно одно решение). Вернуть пары индексов.
fun twoSum(nums: IntArray, target: Int): IntArray {
var left = 0
var right = nums.size - 1
while (left < right) {
val sum = nums[left] + nums[right]
when {
sum == target -> return intArrayOf(left, right)
sum < target -> left++
else -> right--
}
}
return intArrayOf()
}Сложность: O(n) по времени, O(1) по памяти
LRU-кеш (концепт для Android)
Реализуйте LRU-кеш фиксированной ёмкости: get и put за O(1). Объясните, где это применимо в мобильном приложении.
LinkedHashMap с accessOrder=true или LinkedHashMap + HashMap узлов; при put сверх capacity удалить eldest. В Android — аналогия LruCache<K,V> для bitmap/ответов API.
Сложность: O(1) amortized для get/put
Поток UI-состояний
Опишите (или набросайте код) однонаправленный поток: UserAction → ViewModel → State → UI для экрана списка операций с loading/error/content.
sealed class UiState { Loading, Error(msg), Content(List<Item>) }; sealed class Action { Refresh, Retry }; ViewModel обрабатывает Action, эмитит State через StateFlow; Fragment collect с repeatOnLifecycle.Сложность: Архитектурная задача
System Design
- Спроектируйте модуль «история операций» в мобильном банке: офлайн-кеш, пагинация, pull-to-refresh, безопасность.
- Как организовать многофичевое Android-приложение (десятки команд): модули, общий network layer, feature flags?
- Обработка ошибок сети и повтор запросов без дублирования платежей (идемпотентность).
Каркас ответа
- Уточнить NFR: объём данных, SLA, офлайн, версии API
- Слои: UI → domain (use cases) → data (repository, local Room + remote Retrofit)
- Модель данных и кеш-стратегия (stale-while-revalidate)
- Навигация и границы модулей
- Безопасность: keystore, не логировать PAN/токены
- Наблюдаемость: crashlytics, метрики экранов
- Тесты: repository unit, ViewModel с fake repo
Поведенческое
- Расскажите о самой сложной архитектурной задаче в мобильном проекте и как вы её решили.
- Пример конфликта на code review: как договорились с коллегой?
- Как вы обеспечивали производительность и плавность UI под нагрузкой?
- Опыт внедрения новой технологии в существующий код (миграция, риски).
- Почему финтех / мобильный банк, а не продуктовая студия?
План подготовки
3 дня
- Повторить lifecycle Activity/Fragment и ViewModel scopes
- Пройти 15 вопросов Kotlin (inline, reified, collections)
- Разобрать одну задачу на два указателя и LRU на бумаге
- Освежить RxJava: цепочки, schedulers, CompositeDisposable
7 дней
- Схема Clean Architecture на примере экрана с API
- Dagger/Koin: нарисовать граф зависимостей для Retrofit+Repository
- 2 mock-интервью: архитектура + паттерны
- Material: списки, diff util, избегание лишних rebind
14 дней
- System design: история операций + офлайн
- Написать мини-модуль: repository + ViewModel + unit-тест
- Поведенческие истории в STAR (3 кейса)
- Прочитать про процессы Альфа-Банк IT (митапы, git flow) — для финала
| Блок | Готов, если... |
|---|---|
| Kotlin | объясняете inline/reified и отличие mutable/immutable коллекций |
| Android | рисуете lifecycle и знаете, как шарить ViewModel между фрагментами |
| Архитектура | сравниваете MVP/MVVM/MVI и связываете domain с repository |
| Стек вакансии | настраиваете Retrofit+OkHttp и DI-модуль без подсказок |
| Многопоточность | различаете volatile, atomic и корутинные диспетчеры |
В день собеседования
- Проверить стабильный интернет и IDE/заметки под рукой
- Иметь один чёткий пример «мобильный банк / финтех-подобный» проекта без NDA-деталей
- Заготовить вопросы команде: стек Compose, CI, метрики качества