Экспертное собеседование на позицию Senior Android разработчика

YOUTUBE · 01.12.2025 09:33

Ключевые темы и таймкоды

Введение и представление участников

0:03
  • Приветствие и представление участников: Дима из компании Дзен Платформа и Миша Левченко из Яндекса.
  • Дима имеет большой опыт работы в различных компаниях, включая Революцию Квалити и Android Академию.
  • Миша известен своими выступлениями и опытом в разработке.

Формат собеседования

3:00
  • Дима объясняет формат собеседования: техническое интервью с вопросами по языку и платформе.
  • Вопросы будут касаться теории и опыта, без написания задач.
  • Цель собеседования - оценить опыт и знания Миши.

Первая часть собеседования

4:59
  • Первая часть включает вопросы о текущем проекте и обязанностях Миши.
  • Миша занимается разработкой Android-приложения для Яндекса и инфраструктурой вокруг него.
  • Он также занимается техническим планированием и улучшением проекта.

Опыт и технические решения

7:57
  • Миша имеет около семи лет опыта в разработке, начиная со студенческих проектов.
  • Он работал в Яндексе почти пять лет, пройдя путь от младшего разработчика до текущей должности.
  • В проекте активно внедряются новые фреймворки и подходы, такие как KAMUS и RxJava.

Команда и задачи

12:44
  • В команде Миши около десяти Android-разработчиков, разделенных на стримы.
  • Задачи распределяются между разработчиками в зависимости от их уровня и уровня проекта.
  • Разработка фич завершается после тестирования и проверки метрик.

Моделирование ситуации

15:43
  • Дима моделирует ситуацию, когда задача не вписывается в дедлайн.
  • Миша объясняет, что нужно разобраться в причинах задержки и оценить готовность задачи.
  • Важно понять, кто виноват и что нужно сделать для выполнения задачи в срок.

Проблемы с ресурсами и параллелизмом задач

17:40
  • Важно понять, чего не хватает для выполнения задачи.
  • Можно обратиться к руководителю для выделения дополнительных ресурсов.
  • Если задача не вписывается в текущие ресурсы, стоит рассмотреть её распараллеливание или удаление ненужных шагов.

Личный опыт и ошибки

19:37
  • Автор делится своим опытом работы над сложной задачей.
  • Важно понимать сроки и коммуникации, чтобы избежать проблем.
  • Автор старается избегать нереалистичных сроков и работать сверхурочно.

Первый этап собеседования

22:32
  • Цель этапа – познакомиться с кандидатом и оценить его соответствие команде.
  • Важно узнать, какие фреймворки использует кандидат и его опыт работы в команде.
  • Вопросы о факапах и выводах, сделанных после них, помогают понять, как кандидат справляется с трудностями.

Техническая часть собеседования

25:29
  • Переход к технической части собеседования, обсуждение объектно-ориентированного программирования.
  • Объяснение, что такое объекты и их данные и методы.
  • Введение в сборщик мусора и его работу в Java.

Сборщик мусора и его работа

27:27
  • Сборщик мусора освобождает память от объектов, которые больше не используются.
  • Объяснение, как сборщик мусора определяет, что объект больше не нужен.
  • Углубление в работу сборщика мусора и его алгоритмы.

Утечки памяти и их примеры

32:17
  • Объяснение, что такое утечки памяти и как они возникают.
  • Пример утечки памяти в Android-разработке.
  • Жизненный цикл компонентов Android и их влияние на утечку памяти.

Работа с коллекциями

34:11
  • Объяснение работы с коллекциями в Java.
  • Алгоритм очистки коллекций и его реализация.
  • Завершение обсуждения работы с коллекциями.

Garbage Collection в Android

35:10
  • В Android используется алгоритм Mark-Sweep для управления памятью.
  • Объекты перемещаются между поколениями памяти в зависимости от их срока жизни.
  • Фрагментация памяти решается дефрагментацией, чтобы объекты располагались компактно.

Метод hashCode

38:03
  • Метод hashCode используется для получения уникального идентификатора объекта.
  • В Java hashCode не учитывает поля класса, а использует только идентификатор объекта.
  • Хэш-код вычисляется лениво, что позволяет избежать коллизий при перемещении объектов.

HashMap

41:58
  • HashMap реализует интерфейс Map и работает на основе хэш-кодов ключей.
  • При коллизии хэш-кодов объекты с одинаковыми хэш-кодами помещаются в один и тот же bucket.
  • HashMap обеспечивает быстрое извлечение и вставку данных благодаря сбалансированной структуре.

Boxing и Unboxing

47:43
  • При создании объекта из примитивного типа происходит boxing, что приводит к созданию одинаковых объектов.
  • В Java сравнение объектов происходит по ссылке, что может привести к неожиданным результатам.
  • Пример из Telegram показывает, как boxing может создать проблемы.

Класс Date

49:40
  • Класс Date в Kotlin хранит данные и генерирует hashCode и toString на основе свойств.
  • Метод copy позволяет создать копию класса с измененными полями.
  • Наследование от Date не рекомендуется, лучше использовать композицию.

Unit Test

52:38
  • Unit Test в Kotlin использует тип Unit, который можно эмулировать как объект.
  • Unit Test аналогичен модульному тестированию в Java.
  • Unit Test позволяет проверять выполнение методов и классов в изолированных условиях.

Возвращаемые типы и Unit

53:38
  • В Java есть тип Unit, который означает, что функция завершилась нормально, но ничего не вернула.
  • Unit является подтипом любого типа и может быть подставлен везде, где требуется значение.
  • Unit удобен для ситуаций, когда функция не возвращает значение, но программа должна завершиться корректно.

Онлайн функции и их использование

57:32
  • Онлайн функции позволяют вставлять код вместо вызова функции.
  • Они могут быть помечены как кросс-онлайн, что позволяет вставлять код в объекты.
  • Онлайн функции полезны для создания псевдо-синтаксических конструкций и оптимизации кода.

Generic и онлайн функции

1:00:22
  • Generic в Java существует только на этапе компиляции и не влияет на байт-код.
  • Онлайн функции могут быть использованы для работы с generic, но могут нарушать инкрементальную компиляцию.
  • Виртуальная машина Java может оптимизировать функции, чтобы уменьшить накладные расходы на вызовы.

Ключевые слова и их использование

1:07:10
  • Ключевое слово object в Kotlin позволяет реализовать паттерн синглтон.
  • Ключевое слово let позволяет создавать анонимные объекты.
  • Ключевое слово lazy инициализирует объекты лениво, что полезно для реализации синглтона.

Основные компоненты Android

1:10:01
  • Основные компоненты Android: Activity, Service, BroadcastReceiver, ContentProvider.
  • ContentProvider инициализируется до Application, что позволяет использовать его для отлова ранней точки входа в приложение.
  • Контекст приложения имеет приоритет над контекстом активности, что влияет на отображение и запуск сервисов.

Приложения в фоне

1:12:57
  • Приложения в фоне могут быть убиты, если они не используются.
  • Сервисы могут иметь приоритет, но это зависит от производителя устройства.
  • Запущенные сервисы могут быть убиты, если устройство агрессивно экономит батарею.

Передача данных между Activity

1:13:55
  • Самый простой способ передать данные между Activity — использовать Intent.
  • Можно использовать Bundle для передачи примитивов, строк и объектов.
  • Объекты, реализующие интерфейс Serializable, могут быть переданы без проблем.

Сериализация и Parcelable

1:15:50
  • Сериализация объектов может быть медленной, особенно на старых устройствах.
  • Parcelable предлагает более оптимизированные методы для чтения и записи данных.
  • Parcelable может быть полезен для передачи данных между процессами.

Оптимизация передачи данных

1:18:46
  • Parcelable позволяет оптимизировать передачу данных, но разница в производительности минимальна.
  • Externalizable используется для стабильной передачи данных между устройствами.
  • Parcelable и Externalizable могут быть полезны для передачи данных по сети.

Передача объектов между Activity

1:20:41
  • При передаче объектов между Activity важно понимать, будет ли получен тот же объект.
  • В пределах одного процесса объекты могут быть переданы без изменений.
  • При передаче больших объектов, таких как изображения, лучше использовать ссылки на файлы.

Методы View

1:25:34
  • Основные методы View включают layout, invalidate, requestLayout и другие.
  • Layout позволяет изменить размеры и положение View.
  • Invalidate вызывает перерисовку View, что может быть полезно для обновления данных.

Программное изменение размера View

1:29:30
  • Для изменения размера View нужно изменить его layout params.
  • Родительские View могут накладывать ограничения на дочерние View.
  • Изменение layout params требует перерисовки View и может быть выполнено через requestLayout.

Введение в RecyclerView

1:31:26
  • RecyclerView пришел на замену ListView для оптимизации производительности.
  • ListView создавал много ненужных объектов, что приводило к проблемам с памятью.
  • RecyclerView минимизирует количество объектов в памяти, используя абстракцию holder.

Оптимизация ListView

1:34:22
  • ListView создавал много объектов, даже если на экране отображалось только 10 элементов.
  • Проблемы с производительностью можно было решить только через сложные оптимизации.
  • С тех пор ListView не используется активно.

Обновление списка элементов

1:35:20
  • При удалении или добавлении элементов в списке, адаптер должен обновляться.
  • Используется алгоритм кратчайшего пути для перемещения элементов.
  • Важно идентифицировать элементы списка для корректного обновления.

Эффективное отображение изменений

1:37:16
  • В списке с множеством элементов, таких как прогноз погоды, важно обновлять только измененные данные.
  • Использование callback для обновления только измененных частей списка.
  • Сравнение элементов по ссылке и контенту для оптимизации перерисовки.

Вопросы по Android и Kotlin

1:43:12
  • Важно знать языки Java и Kotlin для работы с Android SDK.
  • Понимание garbage collection и memory management необходимо для предотвращения утечек памяти.
  • Вопросы по ключевым структурам данных и решению коллизий.

Заключение и советы по собеседованию

1:46:07
  • Вопросы на собеседовании должны быть из разных сфер, важных для компании.
  • Важно быть готовым к вопросам по GC и memory management.
  • Рекомендуется проводить собеседование с двумя интервьюерами для объективности оценки.

Обсуждение знаний и ошибок

1:48:02
  • Обсуждение знаний о адаптерах, делегатах и делегатах.
  • В некоторых компаниях акцент делается на детальные знания, в других - на общие.
  • Оценка знаний как "смирный уровень" с допущением ошибок.

Ошибки и их исправление

1:49:00
  • Ошибки в понимании стека и кучи памяти.
  • Ошибки в понимании main класса и наследования.
  • Ошибки при передаче данных и использовании transient.

Проблемы с ListView и паттерном Beholder

1:51:55
  • Проблемы с ListView и паттерном Beholder.
  • Ошибки при использовании ListView и их последствия.
  • Преимущества использования паттерна Beholder.

Поддержка миграции и плюсы

1:53:53
  • Поддержка миграции в SerialView.
  • Плюсы и минусы использования SerialView.
  • Оценка ответов на вопросы и замечания по стилю ответов.

Вопросы к интервьюеру

1:56:50
  • Вопросы о процессах разработки и ответственности.
  • Вопросы о ролях в команде и культуре компании.
  • Вопросы о переработке и архитектуре.

Заключение и благодарности

1:58:47
  • Благодарности за интервью и обмен любезностями.
  • Призыв задавать вопросы в комментариях.
  • Завершение видео и прощание.