wiki/work/template/interview.md

34 KiB

Общая информация.

  • Интервьюер: Ведущий разработчик, Воронин Дмитрий Дмитриевич, dd.voronin@fsight.ru
  • Респондент:
  • Дата:
  • Продолжительность:

Предисловие.

Опросник создавался с уклоном на знание базовых компонентов без дополнительных библиотек. Такой подход позволяет реалистичнее оценить опыт работы непосредственно с платформой Android, а не умение копировать чужой код для библиотек. Эта необходимость подкрепляется тем, что в Android технологии сменяются безумно быстро. Например, с появлением Android Compose целый стэк работы с Fragment стал неактуален, при этом базовое понимание работы View и Canvas осталось актуально даже после столь масштабной миграции.

Junior.

Основы Android.

  • Перечислить основные компоненты Android-приложения. Activity - то, с чем взаимодействует пользователь; Сервис - точка входа для фоновой работы приложения; Broadcast Receiver - получение intent приложением (файл из внешнего приложения, например); Content provider - общие данные приложений (например, список контактов в телефоне).
  • Рассказать про структуру проекта приложения. Модуль - коллекция исходников; манифест - содержит основную информацию о приложении; java/kotlin - исходный код приложения; res - ресурсы приложения (картинки, строки, layouts); libs - приватные (локальные) библиотеки; build - временные файлы сборки; jni - нативный код (C/C++); assets - файлы, которые попадут в apk "как есть"; test - файлы тестов; build.gradle - конфигурация сборки проекта. Разделяются на конфигурации модуля и проекта; *gen - файлы, генерируемые студией.
  • Что такое Context? По своей сути context - контейнер зависимостей фреймворка Android. Простыми словами - это интерфейс для взаимодействия с системой.
  • Рассказать про жизненный цикл Activity? onCreate() - создание activity. onPause() - когда пользователь больше не может взаимодействовать с активностью, но она ещё видна (системный pop-up, например). onStop() - activity больше не видна (ушла в фон, приложение свернули). onStart() - activity "возродилась", но пользователь пока не может с ней взаимодействовать. onRestart() - вызывается перед onStart(). onResume() - пользователь снова может взаимодействовать с activity. onDestroy() - уничтожение activiy, выполнение не гарантировано.

Основы Java.

  • Основные методы Object или Any? toString() - преобразование объекта в строку; hashCode() - хэш-код (Integer) объекта; equals() - сравнение объекта с другим объектом.
  • Как работает try, catch, finally? Try выполняет блок кода и в случае ошибки (exception) вызывает блок кода catch. Finally выполняется после try и catch в любом случае.

Язык.

  • Чем отличается val от var (final для Java)? Val константа, var переменная.

View.

  • Что такое View? Базовый класс того, что рисуется на экране.
  • Отличие FrameLayout от LinearLayout (Box от Row/Column)? FrameLayout (Box) располагает объекты относительно своей общей системы координат, а LinearLayout (Row и Column друг за другом).
  • Как работает RecuclerView (LazyColumn)? Т.к. создание View достаточно дорогое удовольствие, он выделяет необходимое кол-во View для отображения на экране с небольшим запасом и переиспользует их, когда старые View пропадают из видимости и подгружаются новые. Важно помнить, что View не инициализируются повторно и без ручного сброса/перезаписи значений пользователю могут быть показаны данные от старой View.
  • Чем отличается Toast от Dialog?

Intent.

  • Как отправить пользователя в другое приложение? Через intent.
  • Что такое intent? Объект-сообщение для запроса действия от другого компонента приложения.

Мультимедиа.

  • Что такое bitmap? Изображение в самой простой форме - массив пикселей.
  • Как работать с большими bitmap? Bitmap перед декодированием стоит уменьшить до требуемого к рисованию размера.
  • Отличие растровых изображений от векторных? Растровые изображения представляют собой массив пикселей, тогда как векторные изображения строятся из примитивов (круги, линии итд).

Хранение данных.

  • Как хранить данные между запусками приложения? Записывать на файловую систему.
  • Какие форматы хранения используются в Android? Достаточно: Shared Preference, база данных, файл.

Общие знания.

  • Основные принципы OOP (object-oriented programming)? Полиморфизм, наследование, инкапсуляция (можно также абстракция).
  • Полиморфизм: что такое перегрузка и переопределение метода? Перегрузка - методы с одинаковым названием и различными параметрами. Переопределение - изменение реализации метода родителя.
  • Зачем нужны интерфейсы (или контракты)? Реализация одного из принципов SOLID, позволяет не зависеть от конкретной реализации.
  • Отличие абстрактного класса от интерфейса? Абстрактный класс может иметь частичную реализацию, интерфейс нет. Также объект может наследоваться только от одного абстрактного класса и от множества интерфейсов.
  • Отличие между ArrayList и LinkedList? ArrayList - реализация интерфейса List на массивах. Ссылка на каждый элемент хранится в Array (массиве). Такая реализация удачна, когда мы знаем кол-во данных и не собираемся их добавлять или удалять; LinlkedList - каждый элемент списка хранит ссылку на следующий и предыдущий элемент. Таким образом, в сравнении с ArrayList мы получаем быстрое добавление и удаление элементов из списка, но более медленное получение элемента по индексу.
  • Отличие стэка и очереди? Стэк работает по принципу FILO - первый зашёл, последний вышел. А очередь по принципу FIFO - первый зашёл, первый вышел.
  • Как записать десятичное число 5 в двоичной системе? 101.
  • Как будет работать бинарный поиск на отсортированном массиве целых чисел? Сравнивается с центральным значением, тем самым сокращая размер массива в два раза на каждом шаге.
  • Зачем уходить в фоновую обработку, а не писать всю логику в главном потоке? В главном потоке рисуется интерфейс, поэтому выполнение логики в главном процессе будет означать сильные зависания со стороны интерфейса и, в конечном счёте, ANR.
  • Зачем нужны nullable для примитивов? Например, Integer, который может быть null? Какие минусы у такого подхода? Null в данном случае означает отсутствие значения. Без null сложно дифференцировать, когда значение действительно равно, например, -1 или 0, а когда это флаг отсутствия значения. Из минусов - требование выполнения unboxing для JVM - доп. операции, которые влияют на производительность.
  • Что такое git и зачем нужен? Зачем нужны бранчи? Git - система контроля версий. Нужен для управления версиями проекта, в частности, с возможностью фиксировать конкретное состояние проекта; бранчи нужны для параллельной работы над одним проектом.

Middle.

Основы Android.

  • Что такое класс Application? Является точкой входа в приложение. Метод onCreate() в классе приложения вызывается при создании приложения (в отличии onCreate() внутри активности, который вызывается при старте активности). Также содержит методы onConfigurationChange() - изменение конфигурации системы (поворот экрана, смена языка, DPI итд). onLowMemory() - при нехватке памяти (доп вопрос - есть ли в Android OOM killer?). Сам класс Application наследуется от ContextWrapper, что также позволяет переопределить методы работы с ApplicationContext. Класс необходимо указать в манифесте.
  • Чем отличается ApplicationContext и ActivityContext? ApplicationContext является context глобального scope приложения и не имеет знаний о текущем Activity (интерфейсе) и существует на протяжении жизненного цикла всего приложения. ActivityContext является context текущего графического интерфейса пользователя и существует на протяжении жизненного цикла самой Activity.
  • Что использовать для фоновой работы за пределами Activity? WorkManager.
  • Что такое утечка памяти? Пример? Утечка памяти - невозможность утилизировать ненужный объект из-за внешней ссылки. Например, ссылка на activity в статичной переменной.
  • Как реализованы строки? Строка - массив символов. Immutable (неизменяемая), а причина - массивы immutable из-за того, как работает память.
  • Разве методы, например, substring(), не редактируют строку? Возвращают новую с изменениями.
  • Как можно эффективно построить строку в разных частях кода? Через StringBuilder().
  • Что такое сериализация? Пример? Сериализация - преобразование объекта в строку (обратный процесс - десериализация). Пример - JSON, XML.
  • Что означает transient в сериализации? Исключает объект из сериализации.
  • Что такое NDK и как он работает? NDK позволяет использовать код C++ через JNI (Java Native Interface).
  • Отличие Unit тестов от Instrumented тестов? Unit тесты выполняются без привязки к системе Android (без доступа к ресурсам системы). Instrumented тесты выполняются непосредственно на устройстве.
  • Что такое Gradle? Система сборки.
  • Что такое ADB? ADB (android development bridge) - инструмент разработчика для работы с системой через CLI. Позволяет, например, получить shell-доступ к устройству.

Язык.

  • Что такое init блок в классе? Вызывается при создании класса.
  • Что такое анонимный класс? Буквально класс без имени. В Kotlin обозначается ключевым словом object.
  • Что такое finalize метод? По своей сути - деструктор. Вызывается перед тем, как объект будет удалён сборщиком мусора.
  • Что такое companoin object? Статичный подкласс.
  • Применение методов let(), apply()? Let() для операций над nullable типами, если они окажутся не null. Apply() для применения модификаций над объектом.

Многопоточная работа.

  • Что означает synchronized? Метод или блок кода может выполняться только из одного потока одновременно. Остальные ждут.
  • Что означает volatile? Отключает кэширование в процессоре. Означает, что переменная может меняться из одного (!) потока при этом актуально читаться из всех остальных потоков.

Coroutines.

  • Отличие корутин от классического Thread? Корутины пишутся последовательно.
  • Отличие lauch() и async()? Launch() по принципу запустил и забыл. Async() позволяет увести в фон выполнение и при необходимости получить значение в await().
  • Что такое Scope? Пул выполнения корутин.
  • Что такое Context? Тип пула (или его thread), например, главный (UI), IO или Default.

Архитектуры.

  • Отличие MVC, MVP, MVVM? Зачем нужно разделение бизнес-лоигки? MVC (model, view, controller) интегрирует бизнес-логику и графический интерфейс в одном месте - в controller; MVP (model view presenter) - бизнес-логика отделена от графического интерфейса; MVVM (model, view, viewmodel) - аналогично MVP, но в данном случае viewmodel отвязана от view при помощи data-binding, что позволяет переиспользовать viewmodel без использования контракта.
  • Описать паттерн репозитория? Репозиторий - единая точка входа для моделей приложения. Позволяет отделить логику преобразования моделей бэкенда в модели приложения.
  • Что такое DI (dependency injection) и зачем нужен? Внедрение зависимостей. Позволяет классам не зависеть от реализации и не создавать объекты зависимостей самостоятельно. Так, можно подменить реализацию интерфейса для всего приложения в одном месте.
  • Что такое REST сервис? API без понятия сессии. Аутентификация происходит при каждом запросе.

View.

  • Как работает механизм рисования? Метод View.onDraw() вызывается на каждый кадр и рисует примитивы (круги, линии итд) на canvas.
  • Где находится начало координат для рисования? Левый верхний угол.
  • Цепочка вызовов для рисования View на экран? onMeasure() - вычисление размера View; onLayout() - вычисление размера children (для ViewGroup); onDraw() - рисование кадра View.
  • Что такое DP и чем отличается от PX? Что такое SP? Px - количество реальных пикселей на экране. Dp (density-independent pixels) - относительное кол-во пикселей от плотности экрана. Sp (scale-independent pixels) - то же, что и dp, но также подвергнуто модификатору настроек размера шрифта системы.

Intent.

  • Отличие explicit/implicit (явный/неявный) intent? Explicit intent (явный) нужен для запуска конкретного компонента. Implicit intent (неявный) позволяет системе самой определить компонент для запуска.

Мультимедиа.

  • Что влияет на размер изображения? Разрешение, кол-во цветов, компрессия (png, jpeg).

Хранение данных.

  • Что такое ORM (object-relational model)? Модель преобразования между реляционной и объектной моделями.
  • Какие есть виды хранилищ в Android? Internal storage - внутри /data/data, защищено системой. External storage - общее хранилище /sdcard.

Разрешения.

  • Виды разрешений? Normal - те, что не несут угрозы данным пользователя. Например, доступ в Интернет; signature - права, которые предоставляются и доступны приложениям с одинаковой подписью. Например, BIND_ACCESSIBILITY_SERVICE или кастомные разрешения; dangerous - разрешения, которые так или иначе используют чувствительные данные, например, данные пользователя. К примеру - чтение контактов; special - особые разрешения, как WRITE_SETTINGS.

Шифрование.

  • Принципиальное отличие симметричного шифрования от ассиметричного? В симметричном шифровании используется один ключ, а в ассиметричном используется пара ключей: публичный и приватный.
  • Что такое Android Keystore? Системное хранилище ключей. При наличии физического устройства, хранение ключей и выполнение операций шифрования выполняются изолированно на нём.

Общие знания.

  • Что такое Big O notation? Система для обозначения циклической комплексности. Например, O(1) (читается "О от константы") означает, что скорость работы не зависит от числа объектов. O(n) (читается "О от эн") - скорость работы зависит от числа объектов линейно, O(n^2) (читается "О от эн в квадрате") - квадратичная зависимость.
  • Какая циклическая сложность (скорость) будет у методов get() для ArrayList, LinkedList и HashMap? ArrayList - O(1), LinkedList - O(n), HashMap - O(1) в лучшем случае при соблюдении уникальности hashCode().
  • Как работает HashMap? Данные попадают в HashTable, по своей сути - двумерный массив. Элементы распределяются по Bucket (первое измерение) при помощи hashCode() и попадают во второе измерение с применением equals() над каждым элементом в Bucket.
  • Принципы при переопределении hashCode() и equals()? Объекты с положительным equals() должны иметь одинаковый hashCode().
  • Сколько состояний у checkbox? Три: без ответа (null), положительный и отрицательный.
  • Что такое garbage collection (сборка мусора) и как она работает? Автоматический процесс по освобождению выделенной памяти. Если на участок памяти нет ссылок - память освобождается.
  • Что такое git rebase? Возможность "ребазироваться", т.е. как-либо модифицировать дерево коммитов. Например, чтобы объединить несколько комитов или переименовать сообщение комита.
  • Что такое iterator()? Позволяет производить операции над каждым элементом коллекции. Цикл for-each на самом деле использует iterator().

Senior.

Основы Android.

  • Что такое Looper и Handler? Looper используется для решения вопроса асинхронной работы процесса в Android. Он обрабатывает последовательно каждый поступающий к нему Message в MessageQueue и отправляет его в Handler для обработки. Таким образом возможна асинхронная работа в одном процессе.
  • Что такое RenderScript? Используется для многопроцессорной обработки данных на CPU, GPU или иных процессорах.
  • В чём отличие JVM (Java Virtual Machine), DVM (Dalvik Virtual Machine) и ART (Android Runtime)? JVM это общий термин виртуальной машины Java. DVM - реализация JVM для Android с дополнительным DEX компилятором.
  • Отличие компиляторов JIT (just in time) и AOT (ahead of time)? Плюсы и минусы AOT компилятора? JIT компилятор обрабатывает приложение при его выполнении, а AOT заранее компилирует приложение и хранит dex файлы на файловой системе. Плюсы AOT: быстрее runtime, меньше энергопотребление. Минусы AOT: дольше установка и больше расход места на файловой системе.
  • Что такое AAPT? Формат упаковки ресурсов в бинарный формат, оптимизированный для системы Android.
  • Что такое StrictMode? Возможность отладки низкого уровня, например, регистрация событий доступа в сеть или на файловую систему.
  • Что такое proguard? Позволяет вырезать неиспользуемые ресурсы и код из конечного приложения.
  • Что такое multidex? Виртуальная машина Android ограничивает число методов для одного dex файла 16 битами (~65 тысяч). Если у нас больше методов - используется multidex для создания нескольких dex файлов.
  • Что такое AAP (Android app bundle)? Позволяет уменьшить размер apk файла. Достигается при помощи разделения ресурсов для различных устройств. Например, apk для различных архитектур при использовании NDK или apk с ресурсами для телефонов, планшетов итд. Таким образом получаются несколько APK файлов меньшего размера для конкретных устройств.

Activity.

  • В какой ситуации в Activity будет вызван только onDestroy() без onPause() и onStop()? Когда в onCreate() вызывается метод Activity.finish().

Язык.

  • Что такое рефлексия? Возможность узнавать информацию о классе при выполнении. Медленная.

Архитектуры.

  • Виды кэшей TTL и LRU? TTL (time to live) кэш удаляется после определённого периода времени. LRU (least-recently used) кэш удаляется после превышения определённого кол-ва версий кэша.
  • Отличие write-throug и write-back кэшей? Write-through записывает данные сразу в кэш и на исходную память. Write-back записывает данные в исходную память только при необходимости.
  • Отличие HTTP Request, HTTP Long-polling и WebSocket? HTTP Request посылает запрос и закрывается, подходит для разового обмена данными. HTTP Long-polling проверяет наличие новых данных при помощи периодических HTTP запросов. WebSocket получает новые данные по постоянно открытому каналу.

View.

  • Как оптимизировать процесс рисования в View.onDraw()? Оставить только базовые операции, вынести выделение памяти и инициализации на уровень View.
  • Когда стоит использовать SurfaceView? Когда вычисление кадра занимает слишком много времени или перерисовка выполняется слишком часто и это становится заметно пользователю. Все View рендерятся в Main Thread, тогда как SurfaceView в отдельном. Например, нативные игры используют SurfaceView по этой причине. SurfaceView использует два буфера: один для отображения и один для рисования. Также он не поддерживает hardware acceleration.
  • Как определить, когда видна программная клавиатура, а когда скрыта? Вычислить разницу между размером activity и размером экрана.

Intent.

  • Что такое sticky intent? Используются для коммуникации между функцией и сервисом. Такой intent остаётся после завершения broadcast, позволяя наблюдателям быстро получать актуальное значение без необходимости повторной регистрации на событие.

Разрешения.

  • Что такое appops? Вторичная система разрешений в системе. Пользователь напрямую не может с ними взаимодействовать, но может разработчик через adb. Например, VIBRATE.

Ресурсы.

  • Какими будут отличия от использования хорошего покрытия HSPA (3G) и плохого сигнала LTE (4G)? Плохое покрытие сигнала значительно снижает время жизни батареи.
  • Основные потребители электроэнергии устройства? Экран и радио, процессор.
  • Как минимизировать энергопотребление приложения? Кэшировать данные, избегать wake-lock без необходимости, группировать фоновые интернет запросы, различная логика для Wi-Fi и Mobile Data, использовать GPS только когда необходимо.

Процессы.

  • Можно ли запустить приложение в нескольких процессах? Как? Можно. Нужно указать алиас процесса в манифесте для activity или service.

Уведомления.

  • Можно ли создать свою систему уведомлений в Android без GCM? Да, приложение само выполняет запросы в сеть через сервис и создаёт уведомление.

Шифрование.

  • Основные компоненты шифрования? Cipher - aes, rsa итд, mode - xts, cbc итд, размер мастер-ключа, хэш-сумма ключа (sha), число итераций.

Общие знания.

  • Что такое IDL (Interface Description Language) и для чего нужен? Это термин, обозначающий возможность коммуникации между различными компонентами ПО. Например, между разными языками программирования (java и c++) или различными приложениями (как в случае с AIDL - Android IDL).
  • Что такое обфускация и минификация? Обфускация позволяет усложнить процесс реверса приложения. минификация уменьшает конечный размер файлов при помощи различных техник, например, удаления лишних пробелов из ресурсов.
  • Какие могут быть проблемы отслеживания пользователя по цветам из Material You? Несколько примеров: 1. пользователь может сменить обои. 2. одни обои могут быть у разных пользователей. 3. привязка к конкретному устройству.

Результат технической части собеседования.

Автор.

Составитель вопросов и описаний: Ведущий разработчик, Воронин Дмитрий Дмитриевич, dd.voronin@fsight.ru