Материал Эйч · Опубликовано 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), масштабирование команды мобильного банка |
Обязательный минимум
Плюсом будет
Можешь назвать основные ключевые слова, применяемые при использовании 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).
Объясните отличия 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.
Как обеспечить сохранение объекта, связанного с Activity, в Koin?
scope для Activity/Fragment; getKoin().createScope; закрытие scope в onDestroy.
Совет: Для Dagger 2: Component vs Subcomponent, @Inject constructor, модули для Retrofit/OkHttp.
Принципы 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.Сложность: Архитектурная задача
Каркас ответа
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| Kotlin | объясняете inline/reified и отличие mutable/immutable коллекций |
| Android | рисуете lifecycle и знаете, как шарить ViewModel между фрагментами |
| Архитектура | сравниваете MVP/MVVM/MVI и связываете domain с repository |
| Стек вакансии | настраиваете Retrofit+OkHttp и DI-модуль без подсказок |
| Многопоточность | различаете volatile, atomic и корутинные диспетчеры |
В день собеседования