Вопросы для собеседования Android-разработчика
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании Android-разработчика хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 192 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 12 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Что происходит при повороте экрана и как ты сохраняешь состояние экрана?
Что хотим услышать
- Activity пересоздаётся: onPause, onStop, onDestroy, новый onCreate
- ViewModel переживает поворот, хранится в ViewModelStore
- Небольшое состояние UI в SavedStateHandle или rememberSaveable
- View с id сохраняют своё состояние сами
- configChanges не лекарство, маскирует проблемы
- Отдельно проверяю смерть процесса
Если ответил, копните глубже
Расскажи, чем Kotlin отличается от Java и почему его выбирают для Android и бэкенда.
Что хотим услышать
- Null-safety в системе типов: NPE ловится при компиляции
- Меньше шаблонного кода: data class, свойства, вывод типов, именованные и дефолтные аргументы
- Функции расширения, лямбды и удобная stdlib для коллекций
- Корутины для асинхронного кода без колбэков
- Полная совместимость с Java: можно смешивать в одном проекте
- Выражения вместо операторов: if, when, try возвращают значения
Если ответил, копните глубже
Объясни, как ты оцениваешь временную и пространственную сложность своего решения на собесе.
Что хотим услышать
- Называет, что такое n (и m, если входов несколько)
- Считает циклы: вложенные перемножаются, последовательные складываются
- Помнит скрытые циклы: includes, indexOf, slice, sort, spread
- Отдельно оценивает память, включая стек рекурсии
- Сравнивает с ограничениями: при n до 10⁵ O(n²) уже не годится
Если ответил, копните глубже
arr.slice() внутри цикла?Объясни, что такое CORS и как он работает.
Что хотим услышать
- Same-origin policy: скрипт не может читать ответы другого origin (схема, хост, порт)
- CORS: сервер заголовками
Access-Control-Allow-*разрешает конкретным origin читать ответы - Проверяет браузер, сервер отвечает всегда; вне браузера CORS не действует
- Простые запросы уходят сразу, остальные после preflight OPTIONS
- С куками нужен
credentials: 'include',Allow-Credentials: trueи точный origin вместо*
Если ответил, копните глубже
Объясни, зачем фронтенд-проекту сборщик и что происходит с кодом от исходников до файлов в dist.
Что хотим услышать
- граф зависимостей от точки входа
- трансформация: TS, JSX, современный синтаксис, CSS
- резолв пакетов из node_modules
- склейка в чанки, минификация, tree shaking
- хеши в именах для долгого кеша
- dev-сервер с HMR и source maps
Если ответил, копните глубже
Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Расскажи, что такое ViewModel, как она работает и что в ней можно и нельзя хранить.
Что хотим услышать
- Держит состояние и логику экрана, переживает смену конфигурации
- Хранится в ViewModelStore владельца, onCleared при окончательном закрытии
- viewModelScope для корутин
- Нельзя ссылки на Activity, View, их Context
- Не переживает смерть процесса, для этого SavedStateHandle
- Наружу неизменяемый StateFlow, события методами
Если ответил, копните глубже
Расскажи, что такое data class, что генерирует компилятор и где можно ошибиться.
Что хотим услышать
- Генерирует equals, hashCode, toString, copy, componentN
- Только по свойствам первичного конструктора
- copy поверхностный
- Изменяемый data class опасен как ключ HashMap
- Ограничения: нельзя open, abstract, sealed, inner
Если ответил, копните глубже
Объясни подход к задаче «найти два числа с суммой target» и его сложность.
Что хотим услышать
- Сначала называет перебор O(n²) как базовое решение
- Идея: для x ищем дополнение target - x в Map
- Проверяет Map до вставки x, чтобы не взять один элемент дважды
- Сложность O(n) времени и O(n) памяти
- Упоминает краевые случаи: дубликаты, нет ответа
Если ответил, копните глубже
Чем отличаются GET и POST? Ответ «у POST есть тело» не засчитывается.
Что хотим услышать
- GET читает и безопасен, POST меняет состояние
- GET идемпотентен, POST нет: его нельзя молча повторять
- GET кешируется браузером и прокси, POST по умолчанию нет
- Параметры GET в URL: попадают в логи и историю, длина ограничена серверами
- GET можно добавить в закладки и prefetch, поэтому нельзя менять данные по GET
Если ответил, копните глубже
Зачем разработчику Docker Compose и как ты его используешь?
Что хотим услышать
- Поднять зависимости одной командой: база, Redis, очередь
- Одинаковые версии сервисов у всей команды и в CI
- Сервисы общаются по именам в общей сети
- Тома для данных базы, bind mount для кода
- healthcheck и depends_on с condition для порядка старта
Если ответил, копните глубже
Какие у вас слабые стороны?
Что хотим услышать
- Назвал реальную слабость, а не штамп
- Слабость не критична для роли
- Рассказал, что делает, чтобы её компенсировать
- Есть пример прогресса
- Коротко, без самобичевания
Если ответил, копните глубже
Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Расскажи, как в современном Android выполнять фоновую работу и какие ограничения вводила система.
Что хотим услышать
- Главный поток: ANR через 5 секунд, сеть и диск запрещены
- Корутины для работы, привязанной к экрану
- Android 8: ограничения фоновых сервисов
- Android 12 и 14: запрет запуска foreground из фона и обязательные типы
- WorkManager для отложенной гарантированной работы с ограничениями
- Doze и App Standby откладывают работу; точное время только AlarmManager
Если ответил, копните глубже
Расскажи, как работает by lazy, какие у него режимы и где его стоит и не стоит использовать.
Что хотим услышать
- Значение вычисляется при первом обращении и кешируется
- Только для
val - SYNCHRONIZED по умолчанию, PUBLICATION, NONE
- При исключении значение не запоминается
- Нельзя для объектов, зависящих от жизненного цикла view
Если ответил, копните глубже
lazy отличается от lateinit?NONE?lazy внутри?Объясни решение задачи «минимальное число монет для суммы» и его сложность. Почему тут не подходит жадность?
Что хотим услышать
- Показывает контрпример для жадности
- Формулирует состояние: dp[s] минимум монет для суммы s
- Переход: dp[s] = min(dp[s - c] + 1) по монетам
- База dp[0] = 0, остальные Infinity, недостижимо → -1
- O(S · k) времени, O(S) памяти
Если ответил, копните глубже
Чем отличаются сессии на куках и JWT? Что бы ты выбрал для обычного веб-приложения?
Что хотим услышать
- Сессия: id в куке, состояние на сервере (Redis/БД), отзыв мгновенный
- JWT: состояние в самом токене, проверка подписью без базы, сложно отозвать
- Для JWT нужна пара короткий access + отзываемый refresh
- Хранение: HttpOnly кука защищает от XSS, но нужна защита от CSRF (SameSite)
- Выбор по контексту: одно веб-приложение проще на сессиях, много сервисов и мобильные клиенты удобнее на токенах
Если ответил, копните глубже
Расскажите, как устроены слои в вашем мобильном приложении и зачем.
Что хотим услышать
- Presentation, domain, data и направление зависимостей внутрь
- Интерфейсы репозиториев в домене, реализации в data, связывание через DI
- Маппинг DTO и entity в доменные модели на границе
- Ошибки переводятся в доменные на границе data
- Use case только там, где есть логика или переиспользование
- Слои внутри фич, а не глобальные папки
Если ответил, копните глубже
Как бы ты построил CI/CD для веб-приложения с нуля?
Что хотим услышать
- На каждый PR: npm ci, линтер, типы, unit-тесты, сборка
- Быстрые проверки первыми, независимые джобы параллельно, кеш зависимостей
- Защита ветки main: мерж только с зелёным CI и ревью
- Сборка один раз, артефакт (образ) с версией продвигается по стендам
- Деплой на стенд автоматически, на прод с подтверждением или автоматически при хорошем покрытии
- План отката и миграции, совместимые с предыдущей версией
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Объясни, как работает рекомпозиция в Compose и как ты боролся с лишними рекомпозициями.
Что хотим услышать
- Рекомпозиция вызывается изменением прочитанного State
- Skipping: стабильные и равные параметры позволяют пропустить функцию
- Стабильность: неизменяемые классы, ImmutableList, @Immutable
- Чтение быстро меняющегося состояния в фазе layout или draw через лямбды модификаторов
- derivedStateOf и remember для вычислений, key в списках
- Диагностика: Layout Inspector, отчёты компилятора, проверка в release
Если ответил, копните глубже
Расскажи, как ты действуешь на алгоритмической секции с момента получения задачи до сдачи решения.
Что хотим услышать
- Уточняю условие и ограничения, по ним оцениваю нужную сложность
- Разбираю пример руками и проговариваю идею до кода
- Сначала простое решение, потом оптимизация
- Пишу с понятными именами и сразу думаю о типах и переполнении
- Прогоняю на примере и краевых случаях
- Называю итоговую сложность по времени и памяти
Если ответил, копните глубже
Объясни, как работает BFS, почему он находит кратчайший путь в графе без весов и какая у него сложность.
Что хотим услышать
- Очередь и пометка посещённых при добавлении
- Вершины обрабатываются в порядке неубывания расстояния
- Первое посещение вершины даёт кратчайшее расстояние
- O(V + E) времени и O(V) памяти
- Знает, что при весах нужен Дейкстра
Если ответил, копните глубже
Чем отличаются HTTP/1.1, HTTP/2 и HTTP/3? Какие проблемы решала каждая версия?
Что хотим услышать
- Семантика (методы, статусы, заголовки) одна, меняется транспорт
- HTTP/1.1: запросы по очереди в соединении, браузер держит около 6 соединений
- HTTP/2: бинарные фреймы, мультиплексирование, HPACK, одно соединение
- HTTP/2 упирается в head-of-line blocking TCP при потерях
- HTTP/3: QUIC поверх UDP, независимые потоки, TLS встроен, быстрее рукопожатие, миграция соединения
Если ответил, копните глубже
Расскажите, как вы строите CI/CD для мобильного приложения.
Что хотим услышать
- PR-пайплайн: сборка, линтеры, юнит-тесты, проверка размера
- Релизный пайплайн: версия, подпись, загрузка символов, публикация в тестовые треки
- Секреты и ключи подписи вне репозитория
- Ускорение: кеш сборки, разделение по модулям, параллельные задачи
- Раскатка: поэтапно, метрики, флаги, хотфиксы
- Ночные сборки: UI-тесты, полный регресс
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Опиши, какую архитектуру ты бы выбрал для нового приложения среднего размера и почему.
Что хотим услышать
- Слои UI, необязательный domain, data по гайду Android
- UDF: один UiState на экран, действия методами или sealed-интентами
- Единый источник правды: Room, сеть обновляет базу
- DI через Hilt, интерфейсы репозиториев
- Модули по фичам и core, по мере роста
- Use case только при реальной логике, без лишних мапперов
Если ответил, копните глубже
Как в Kotlin работает делегирование реализации интерфейса через by и когда ты его используешь?
Что хотим услышать
- Компилятор генерирует методы интерфейса, переадресующие делегату
- Переопределяются только нужные методы
- Композиция вместо наследования, работает с final-классами
- Делегат фиксируется при создании
- Делегат не видит переопределений обёртки: нет полиморфизма через this
Если ответил, копните глубже
Как бы ты сделал надёжный клиент WebSocket для чата, который переживает обрывы сети?
Что хотим услышать
- Реконнект с экспоненциальной задержкой и джиттером, сброс задержки после успеха
- Heartbeat: ping/pong с таймаутом, при пропуске закрыть и переподключиться
- Нумерация сообщений: после реконнекта клиент сообщает последний id, сервер досылает пропущенное
- Очередь исходящих сообщений с клиентскими id, идемпотентность на сервере против дублей
- Реакция на
online/offlineи видимость вкладки, повторная авторизация при истёкшем токене
Если ответил, копните глубже
Как вы решаете, какие ответы API кешировать, где и на сколько?
Что хотим услышать
- Классификация данных по свежести и цене устаревания
- Где хранить: память, диск, база, HTTP-кеш
- Стратегии чтения: cache first, network first, SWR
- Инвалидация: TTL, версии, события (push, действия пользователя)
- Персональные данные в скоупе сессии, очистка при выходе
- Метрики: hit rate, трафик, время до контента
Если ответил, копните глубже
Ты приходишь в проект без тестов. Как выстроишь стратегию тестирования?
Что хотим услышать
- начать с самого рискованного и ценного для бизнеса: оплата, вход, ключевые сценарии
- несколько e2e smoke-тестов на критичные пути
- unit-тесты на чистую логику: расчёты, форматирование, утилиты
- интеграционные тесты компонентов и API на новых и изменяемых местах
- тесты в CI как обязательная проверка PR
- регрессионный тест на каждый найденный баг, борьба с флаки
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Как ты решаешь, где хранить состояние: в composable, в state holder или во ViewModel?
Что хотим услышать
- Бизнес-данные и логика экрана во ViewModel, наружу StateFlow
- UI-элементы состояния в composable через remember/rememberSaveable
- Сложная UI-логика в классе state holder с remember-функцией
- Подъём до ближайшего общего предка
- Ввод пользователя должен пережить поворот и смерть процесса
- Один источник правды, без дублирования
Если ответил, копните глубже
Опиши, как на Flow сделать поиск по мере ввода: какие операторы и почему.
Что хотим услышать
- Источник: MutableStateFlow с текстом запроса
- debounce, чтобы не слать запрос на каждую букву
- filter по длине и distinctUntilChanged
- flatMapLatest отменяет устаревший запрос
- catch для ошибок, flowOn или main-safe репозиторий
- stateIn в ViewModel с WhileSubscribed
Если ответил, копните глубже
Первая загрузка сайта занимает 4 секунды у пользователей из регионов. Как бы ты искал, где теряется время, и что делал?
Что хотим услышать
- Измерить: Navigation Timing и RUM по этапам (DNS, connect, TLS, TTFB, загрузка, рендер), Lighthouse и WebPageTest
- Сеть: CDN ближе к пользователю, HTTP/2 или HTTP/3, preconnect к сторонним доменам
- Сервер: медленный TTFB → кеширование, отдача статики с CDN, 103 Early Hints
- Ресурсы: Brotli, меньше JS, code splitting, оптимизированные картинки с размерами
- Рендер: критический CSS, defer для скриптов, без блокирующих сторонних скриптов
Если ответил, копните глубже
Новый проект: MVP приложения за два месяца. Будете ли вы делать полноценную Clean Architecture?
Что хотим услышать
- Цена слоёв: шаблонный код, мапперы, скорость команды
- Минимум, который нужен всегда: границы на краях (сеть и база за интерфейсами), DI, тестируемые view model
- Domain-слой добавляется, когда появляется бизнес-логика
- Структура по фичам упрощает будущее разделение
- Решение фиксируется в ADR и пересматривается
Если ответил, копните глубже
Чем, по-вашему, резюме senior должно отличаться от резюме middle?
Что хотим услышать
- Акцент на масштаб и влияние, а не на список фич
- Метрики бизнес-эффекта
- Лидерство: менторинг, процессы, архитектурные решения
- Компактность: старый опыт свёрнут
- Понимание, что резюме под роль, а не под всё сразу
Если ответил, копните глубже
Как ты выбираешь скоуп для зависимости в Hilt? Какие ошибки со скоупами встречал?
Что хотим услышать
- Без скоупа новый экземпляр при каждом внедрении
- Скоуп для дорогих объектов и общего состояния
- Singleton для OkHttp, Retrofit, базы данных
- ViewModelScoped для состояния, общего внутри ViewModel
- Ошибки: всё Singleton, Activity-контекст в синглтоне
- Скоуп компонента не может зависеть от более короткоживущего
Если ответил, копните глубже
Задача для live coding
Количество островов на карте
Карта n × m из 1 (суша) и 0 (вода). Остров это группа клеток суши, связанных по сторонам (не по диагонали). Посчитай острова.
Ввод. n m (1 ≤ n, m ≤ 200), затем n строк по m символов.
Вывод. Число островов.
- Подсказка, если застрял: Каждый найденный остров «затопи» обходом.
- Подсказка, если застрял: Рекурсия на большой карте может переполнить стек.
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: Android-разработчик