- Вопросы и задачи с собеседований на Android разработчика
- Вопросы
- Архитектура, паттерны
- Android
- Прочее
- Алгоритмические задачки
- Code challenge
- 1) Приложение, отображающее список сообщений
- 2) Приложение с картой и поиском
- 3) Приложение, отображающее список квартир.
- 4) Выбор машины
- 5) Список разных данных
- 18 вопросов для собеседования с Android разработчиком
- Хотите нанять разработчика Android? Если вы сами не являетесь разработчиком Android, или если вы предприниматель или основатель стартапа, который впервые решает заняться подбором ит персонала, знать, о чем спросить, может быть проблемой.
Вопросы и задачи с собеседований на Android разработчика
В прошлом посте я подробно описал процесс поиска работы в Берлине. В течение этого процесса я сталкивался с вопросами, алгоритмическими задачками и Code challenge. В этом посте я распишу свой опыт в этом деле.
Вопросы
После каждого интервью я записывал вопросы, которые удалось вспомнить. Привожу полный список. Ответы не даю, потому что не знаю, правильно ли я отвечал.
Архитектура, паттерны
- Какие паттерны знаете?
- Считаете ли вы Singleton антипаттерном?
- Опишите принципы MVP. Какие еще есть похожие MV*, в чем разница между ними?
- Объясните принцип DI
- Объясните принципы SOLID
- Объясните принципы Clean Architecture
Android
- Как можно выявить проблемы в скорости UI и устранить их?
- Какие проблемы были с использованием Dagger?
- Приходилось ли использовать Guard?
- Что такое multidex?
- Приходилось ли сталкиваться с миграцией с Dalvik на новую технологию ART?
- Начиная с какой версии пишете под Android? Какие были сложности с разницей версий?
- Асинхронные механизмы загрузки в Android
- В чем отличие AsyncTask от Thread?
- Минусы AsyncTask
- Опишите, что такое Activity
- Чем Fagment отличается от Activity?
- Разница между Service и IntentService. Пример использования Service.
- Зачем нужен Headless fragment (без View и с setReatinInstance = true)? Приходилось ли использовать?
- Какие новшества были в последней версии Android?
- Как определяете, какой layout надо использовать для смартфона, а какой для планшета?
- Как в коде определите: планшет это или смартфон?
- Пример использования BroadcastReceiver
- Опишите LifeCycle Activity
- Отличия Serializable и Parcelable
- Контракт hashcode и equals
- Виды коллекций в Java: List, Set, Queue, Stack
- Разница между ArrayList и LinkedList. В каком случае что лучше использовать?
- Принцип работы HashMap и HashSet
- Что такое Generic?
- Когда используем bounded type: «T extends Class» и «T super Class»? Каковы их ограничения.
- Отличия Abstract от Interface, когда какой лучше использовать?
- Разница между pull и fetch
- Разница между merge and rebase
Прочее
- Минусы использования сторонних библиотек
- Что вы будете делать, если ваше решение не совпадает с решением коллег или лида?
- Какие свои качества работы в команде вы можете описать?
- Если бы вы могли вернуться на 3-4 года назад, что бы вы изучали?
- У вас есть команда, какие правила вы установите, чтобы писать тесты?
- Какую книгу вы можете посоветовать? Необязательно про программирование.
- Ваша жена не против релокации?
Алгоритмические задачки
В процессе интервью вам могут дать небольшие алгоритмические задачки, чтобы посмотреть на ваш уровень знания алгоритмов. Может быть и так, что все интервью состоит из одной или нескольких таких задач.
- Реализация merge сортировки из двух списков
- Реверс массива
- Из «abaaeba» получить (a: 4, b:2, e:1)
- Реализация Set с помощью List (методы int count, boolean add, boolean remove)
- Калькулятор, который парсит строки типа «1+2», «1 + 2 * 3 + 4» и возвращает вычисленное значение. Из операторов могут встречаться только + и *.
- Написать Reentrant блокировку
- Посмотреть код, где несколько потоков меняют одну Integer переменную. Сказать, какое значение получится в итоге. Предложить варианты исправления.
Code challenge
Задание, которое вы должны сделать, чтобы показать уровень своего кода и архитектурного мышления. Обычно вам присылают его по почте и дают несколько дней на выполнение.
Я убрал реальные адреса серверов из ссылок, чтобы не палить конторы.
1) Приложение, отображающее список сообщений
На сервере есть json файлы. До них можно добраться по ссылке: https:// /endpoint/
Каждый файл — это json массив из 50 сообщений. Сообщение содержит поля id, time и text.
Приложение должно загрузить сообщения с сервера и показать их в списке.
Юзер может удалить сообщение. Предпочтительно — свайпом, но можно и долгим нажатием.
При реализации можете добавлять фичи, чтобы показать свой уровень. Приветствуется чистый и тестируемый код.
- постраничная подгрузка при скролле
- кэширование, чтобы приложение при старте показывало ранее загруженные сообщения
- некоторые сообщения в поле text вместо текста содержат ссылку на картинку, хорошо бы подгрузить и показать эту картинку
Срок выполнения — 5 дней. Про тесты ничего не сказано.
Я от себя добавил:
- action mode, чтобы удалять сообщения
- Retry кнопку, если была ошибка при загрузке данных
- отдельный экран для просмотра сообщения из списка. Переход на экран был с анимацией Activity Transition. Картинка показывалась сначала из кэша в плохом качестве (как в списке), а затем грузилась полная версия.
2) Приложение с картой и поиском
Приложение должно найти и показать на карте 5 объектов, ближайших к вашей текущей локации.
Пример запроса: https:// /places/search?at=52.5311%2C13.3847&q=restaurant
В at передаем координаты своего местоположения, а в q — поисковый запрос. Результат приходит в json формате.
Результаты надо показать на карте. Можно использовать Google Maps. Но у этой компании было свое SDK для отображения карты, и я изучил и использовал его. Тем самым показал, что быстро могу разобраться в новом для себя SDK. При этом я заметил несколько вещей, которые можно было улучшить/исправить в SDK и на последующем собеседовании рассказал об этом.
Приоритет — качество. Про тесты ничего не сказано. Срок выполнения — неделя.
3) Приложение, отображающее список квартир.
По запросу на сервер приходит такой ответ:
items — список квартир. Для каждой квартиры указаны название, цена, локация, фото.
Необходимо в списке отобразить все полученные items. Каждая квартира должна показать первое из доступных фото, заголовок, цену и адрес. Примерный макет layout прилагался, но можно и что-то свое придумать.
Каждая квартира в списке может быть добавлена в избранное. Т.е. надо в layout квартиры добавить какую-то метку (например, звездочку), которая будет кликабельна и отобразит статус: в избранном или нет. Информация о том, что квартира добавлена в избранное, должна храниться локально. Т.е. после перезапуска приложения вы должны видеть, какие квартиры были отмечены
В приложении должен быть экран с картой, которая отображает локации всех квартир из списка.
Про тесты ничего не сказано. Срок выполнения — 5 дней.
Я все сделал и добавил несколько фич:
- поддержка альбомной ориентации. В этом случае слева отображался список, а справа — карта.
- нажатие на иконку в action bar покажет/скроет карту
- нажатие на квартиру в списке центрирует ее на карту
- и наоборот, нажатие на маркер квартиры на карте проскроллит список до этой квартиры
4) Выбор машины
Необходимо сделать что-то типа визарда для выбора автомобиля. На первом экране выбирается производитель (марка), на втором — модель, на третьем — год.
Соответственно, на сервере есть три метода, которые вам необходимо вызывать для получения этих данных.
— первый возвращает список производителей (id, name).
— второй принимает выбранный id из первого и возвращает список моделей этого производителя (name)
— третий метод принимает id из первого методы и name из второго и возвращает годы выпуска.
Первые два метода поддерживают постраничную подгрузку — у них есть параметры page и pageSize, и они возвращают totalPageCount.
Каждый экран должен отображать результаты выбора предыдущих экранов. Четвертый экран должен показать все, что в итоге было выбрано на предыдущих трех.
- минимальный API — 16
- постраничная загрузка на первом и втором экранах. Размер страницы — 15
- идеально, если переход между экранами будет с анимацией
- сделайте разные layout для четных и нечетных строк списка
- поворот экрана должен работать без проблем
Опционально: на втором экране вместо постраничной загрузки грузите все сразу и добавьте текстовый фильтр по названию модели.
Вся работа по идее должна занять 5-6 часов, но они там понимают, что у вас есть дела/работа и вам дают неделю. Тесты писать необязательно, но если напишете, это будет большим плюсом.
5) Список разных данных
Надо собрать данные с двух разных API и отобразить их в одном списке.
1) Получить 50 репозиториев указанного юзера на github, используя GraphQL (https://developer.github.com/v4/)
2) Получить 50 фото с поиска Flickr. Там обычный json или xml (https://www.flickr.com/services/api/flickr.photos.search.html)
Вывести эти результаты в одном списке, чередуя друг с другом (репозиторий, картинка, репозиторий, картинка, . ).
Изначально экран не должен отображать данные. Есть только кнопка Load, по нажатию на которую начинается загрузка. Последующие нажатия на кнопку должны перезапускать загрузку.
Github данные должны отображаться просто как имя репозитория. Flickr данные должны отображаться как картинка. Нажатие на любой пункт списка должен перезапускать загрузку данных.
Можно писать на Kotlin. Про тесты ничего не сказано. Срок выполнения — 2 рабочих дня.
В этом задании для меня новым было GraphQL. Пришлось повозиться, пока нормально данные с гитхаба пошли. Времени на всякие плюшки в итоге не хватило.
Для всех этих заданий я делал тесты. В качестве архитектуры использовал MVP, а в двух последних еще и Clean Architecture. По возможности старался сделать чуть больше, чем надо, и добавлял какие-то навороты и удобства. Но уложиться в срок и сделать все качественно и красиво — всегда было приоритетом.
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
18 вопросов для собеседования с Android разработчиком
Хотите нанять разработчика Android? Если вы сами не являетесь разработчиком Android, или если вы предприниматель или основатель стартапа, который впервые решает заняться подбором ит персонала, знать, о чем спросить, может быть проблемой.
Разработчики Android несут ответственность за разработку и улучшение мобильных приложений на платформе Android. Во время собеседования вы можете сосредоточиться на портфолио ваших кандидатов и прошлом опыте, чтобы определить тех, кто может повысить ценность вашей компании, внедряя инновационные идеи. Вы также можете использовать эти вопросы вместе с заданием, чтобы проверить способность кандидатов писать функциональный код и разрабатывать удобные для пользователя приложения.
Мы поделимся 18 вопросами и ответами на собеседование по Android, которые станут для вашего кандидата хорошей проверкой, а также получим полезное представление об их отношении к разработке Android.
18 вопросов для собеседования с Android разработчиком
1. В чем разница между неявным и явным намерением?
Явное намерение , где вы сообщаете систему, активность или компонент системы, который следует использовать , чтобы реагировать на это намерение. Неявные намерения позволяют вам объявить действие, которое вы хотите выполнить; Затем система Android проверит, какие компоненты зарегистрированы для обработки этого действия.
Здесь вы ищете понимание того, когда следует использовать каждый тип намерения, поскольку в подавляющем большинстве случаев вы будете использовать явные намерения для запуска компонентов в собственном приложении, в то время как неявные намерения чаще всего используются для связи с компоненты из сторонних приложений.
2. Когда следует использовать фрагмент, а не действие?
Это все еще очень обсуждаемая тема, но код, используемый для создания Activity, существенно более сложен, чем код, используемый для создания фрагмента. Старое действие должно быть уничтожено, приостановлено или остановлено, а новое действие должно быть создано. Разработчик должен признать, что лучше всего использовать Activity только тогда, когда вам нужно поменять местами весь экран, и использовать фрагменты повсюду.
Бонусные баллы, если разработчик Android упоминает любой из следующих вариантов использования, в которых вы почти всегда будете использовать фрагмент, а не действие:
- Когда вы работаете с компонентами пользовательского интерфейса или поведением, которое вы собираетесь использовать в нескольких Activity.
- Когда вы используете один из методов навигации, которые тесно связаны с фрагментами, например, прокрутки.
- Когда вашим пользователям будет полезно видеть два разных макета рядом.
- Когда у вас есть данные, которые должны сохраняться при перезапусках Activity (т.е. вам нужно использовать сохраненные фрагменты).
3. Вы заменяете один фрагмент другим — как обеспечить, чтобы пользователь мог вернуться к предыдущему фрагменту, нажав кнопку «Назад»?
Этот вопрос дает представление о том, как разработчик приложения понимает жизненный цикл динамических фрагментов, а также транзакций фрагментов и обратного стека.
Если кнопка «Назад» вернет пользователя к предыдущему фрагменту, тогда вам нужно будет сохранять каждую транзакцию фрагмента в задний стек, вызывая эту транзакцию addToBackStack()перед вами commit().
Разработчик определенно не должен предлагать создавать кнопку «Назад» специально для управления перемещением между фрагментами, но бонусные баллы, если они упоминают, что вы никогда не должны пытаться зафиксировать FragmentTransaction после вызова onSaveInstanceState(), так как это может привести к исключению.
4. Как бы вы могли создать многопоточное приложение для Android без использования класса Thread?
Если вам нужно только переопределить run()метод, а не другие методы Thread, вам следует реализовать Runnable.
В частности, на смотровой для андроида разработчика , демонстрирующего понимание того, что вы должны только расширить из класса , когда вам нужно изменить некоторые из его функциональных возможностей .
5. Что такое пул потоков? И действительно ли это более эффективно, чем использование нескольких отдельных потоков?
ThreadPool состоит из очереди задач и группы рабочих потоков, что позволяет ему запускать несколько параллельных экземпляров задачи.
Здесь вы оцениваете понимание разработчиком приложения того, как многопоточность может улучшить производительность приложения, а также как она может отрицательно повлиять на производительность при неправильном использовании.
Использование ThreadPool более эффективно, чем ожидание выполнения нескольких операций в одном потоке, но оно также помогает избежать значительных накладных расходов на создание и уничтожение потока каждый раз, когда вам требуется рабочий поток.
6. Какая связь между жизненным циклом AsyncTask и жизненным циклом Activity? К каким проблемам это может привести и как их избежать?
AsyncTask не связан с жизненным циклом деятельности , который его содержит. Если Activity уничтожается и создается новый экземпляр Activity, AsyncTask не будет уничтожен. Это может привести к ряду проблем, но основные из них, о которых должен знать разработчик Android:
После завершения AsyncTask он попытается обновить предыдущий экземпляр Activity, что приведет к исключению IllegalArgumentException.
Поскольку AsyncTask поддерживает ссылку на предыдущий экземпляр Activity, это Activity не будет собираться мусором, что приведет к утечке памяти.
Решение состоит в том, чтобы избегать использования AsyncTasks для длительных фоновых задач.
7. Как бы вы могли получить доступ к данным в ContentProvider?
Для начала убедитесь, что у вашего приложения Android есть необходимые разрешения на чтение. Затем получите доступ к объекту ContentResolver, вызвав getContentResolver()объект Context и получив данные, создав запрос с использованием ContentResolver.query().
ContentResolver.query()Метод возвращает курсор, так что вы можете получить данные из каждого столбца с использованием методов управления курсором.
Доступ к данным — одна из задач, которая, скорее всего, заблокирует основной поток, поэтому разработчик должен подчеркнуть важность выполнения запросов к данным в отдельном потоке.
8. В чем разница между Serializable и Parcelable?
Serializable — это стандартный интерфейс Java, который легко интегрировать в ваше приложение, поскольку он не требует никаких методов. Несмотря на простоту реализации, Serializable использует API отражения Java, что делает его медленным процессом, создающим множество временных объектов.
Parcelable оптимизирован для Android, поэтому он быстрее, чем Serializable. Он также полностью настраивается, поэтому вы можете четко указать процесс сериализации, что приведет к уменьшению количества мусорных объектов.
Хотя разработчик может признать, что реализация Parcelable требует дополнительной работы, преимущества в производительности означают, что им следует рекомендовать использовать Parcelable вместо сериализации, где это возможно.
9. Что такое адаптер?
Здесь вы проверяете, понимает ли разработчик Android, что вам нужен дополнительный компонент для подключения AdapterView (например, ListView или GridView) к внешнему источнику данных. Адаптер действует как этот мост, а также отвечает за преобразование каждой записи данных в представление, которое затем можно добавить в AdapterView.
10. Что такое ошибка приложения «Не отвечает» (ANR) и как предотвратить ее появление в своем приложении?
Этот вопрос проверяет, знает ли разработчик о золотом правиле многопоточности в Android: никогда не выполняйте длительные или интенсивные операции с основным потоком.
Диалоговое окно ANR появляется, если ваш пользовательский интерфейс не отвечает более 5 секунд, обычно из-за того, что вы заблокировали основной поток. Чтобы избежать ошибок ANR, вам следует перенести как можно больше работы из основного потока.
11. Опишите процесс создания пользовательских представлений.
Это сложная тема, поэтому вам нужен только общий обзор необходимых шагов. Однако разработчик должен прояснить, что вы всегда должны создавать подкласс View, который больше всего похож на настраиваемый компонент, который вы хотите создать — очень редко вы расширяете класс View.
После расширения класса вам необходимо выполнить следующие шаги:
- Создайте файл res / values / attrs.xml и объявите атрибуты, которые вы хотите использовать в своем пользовательском представлении.
- В своем классе View добавьте метод конструктора, создайте экземпляр объекта Paint и получите свои настраиваемые атрибуты.
- Заменить либо onSizeChanged()или onMeasure().
- Нарисуйте свой вид, переопределив onDraw().
12. Что такое BuildType в Gradle? И для чего это можно использовать?
Типы сборки определяют свойства, которые Gradle использует при создании и упаковке вашего Android-приложения.
Этот вопрос позволяет вам проверить, может ли разработчик различать разновидности продукта, варианты сборки и типы сборки, поскольку это очень похожие концепции, которые часто вызывают путаницу:
Тип сборки определяет, как создается модуль, например, запускается ли ProGuard.
Аромат продукта определяет, что создается , например, какие ресурсы включены в сборку.
Gradle создает вариант сборки для всех возможных комбинаций вкусов и типов сборки вашего проекта.
13. В чем основное различие между ListView и RecyclerView?
Между ListView и RecyclerView есть много различий , но разработчик Android должен знать, в частности, следующее:
- Шаблон ViewHolder не является обязательным в ListView, но он встроен в RecyclerView.
- ListView поддерживает только вертикальную прокрутку, но RecyclerView не ограничивается списками с вертикальной прокруткой.
14. Кратко опишите некоторые способы оптимизации использования представления.
Существует несколько методов, но наиболее эффективными являются следующие:
- Проверка на чрезмерную перегрузку : установите приложение на устройство Android, а затем включите параметр «Обзор отладки графического процессора».
- Сглаживание иерархии представлений : проверьте иерархию представлений с помощью инструмента Android Studio «Просмотр иерархии».
- Измерение времени, необходимого каждому представлению для выполнения этапов измерения, макета и рисования. Вы также можете использовать Hierarchy Viewer, чтобы определить любые части конвейера рендеринга, которые необходимо оптимизировать.
15. Для чего обычно используется Handler?
Вы используете Handler для связи между потоками, чаще всего для передачи действия из фонового потока в основной поток Android.
Этот вопрос позволяет вам проверить, понимает ли разработчик еще одну фундаментальную концепцию многопоточности в Android: вы не можете обновлять пользовательский интерфейс из любого потока, кроме основного.
16. Какие шаги необходимы для создания связанной службы с помощью языка определения интерфейса Android (AIDL)?
Определите интерфейс AIDL в файле .aidl.
Сохраните этот файл в каталоге src / приложения, в котором размещается Activity, и любого другого приложения, которое необходимо привязать к этой службе — последнее особенно важно и часто игнорируется.
Создайте свое приложение. Инструменты Android SDK затем сгенерируют файл интерфейса IBinder в вашем каталоге gen.
Реализуйте этот интерфейс, расширив сгенерированный интерфейс Binder и реализовав методы, унаследованные от файла .aidl.
Расширьте Service и переопределите, onBind()чтобы вернуть вашу реализацию класса-заглушки.
17. В чем разница между onCreate () и onStart ()?
Метод onCreate () вызывается один раз в течение жизненного цикла Activity, либо при запуске приложения, либо когда Activity было уничтожено, а затем воссоздано, например, во время изменения конфигурации.
Метод onStart () вызывается всякий раз, когда Activity становится видимым для пользователя, обычно после onCreate()или onRestart().
18. Когда можно использовать FrameLayout?
Здесь вы хотите понять, что вы всегда должны использовать максимально простой макет для того, чего вы хотите достичь, поскольку FrameLayouts предназначены для содержания одного элемента, что делает их эффективным выбором, когда вам нужно отображать одно представление.
Если вы добавляете несколько представлений в FrameLayout, они складываются друг над другом, поэтому FrameLayouts также полезны, если вам нужны перекрывающиеся представления, например, если вы реализуете наложение или элемент HUD.
Завершите собеседование с разработчиками Android
Технические собеседования и просмотры являются важной частью найма разработчика приложения, будь то разработчик Android, разработчик iOS или любой разработчик мобильных приложений, знакомый с созданием приложений для обеих операционных систем. С помощью этих вопросов для собеседования вы сможете должным образом проверить технические навыки ваших кандидатов в разработке Android, даже если вы не знакомы с этой технологией.
Источник