wiki/work/template/interview.md

187 lines
34 KiB
Markdown

# Общая информация.
* Интервьюер: Ведущий разработчик, Воронин Дмитрий Дмитриевич, 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