А ты готов? Или как удачно пройти собеседование на позицию Android developer
Шпаргалка для разработчиков, которым предстоит пройти собеседование на позицию Android developer.
Статья состоит из трёх частей.
В первой части под названием «ПОДГОТОВКА» вы обнаружите информацию о процессе подготовки к собеседованию, во второй – «ВОПРОСЫ» – я расскажу о вопросах и задачах, с которыми сама столкнулась в процессе прохождения собеседований, а в третьем разделе, называющемся «СОВЕТЫ», вы сможете найти общие эдвайсы о том, к чему готовиться и чего ожидать. Надеюсь, статья будет полезной. Начнём.
P.S. Советы в разделе «ПОДГОТОВКА» являются лишь рекомендациями. Если для вас это неактуально , просто переходите к пункту 2 – «ВОПРОСЫ».
Часть первая: «ПОДГОТОВКА»
- Сколько требуется времени на подготовку? Мой ответ: 1-2 недели. Этого вполне достаточно. Конечно, если вы не метите в "Google". Тогда сроки однозначно увеличиваются.
- Надо ли иметь хорошее «портфолио»? Да! Можно обойтись и без аккаунта на GitHub, но, судя по опыту, pet-projects могут спасти от скучных тестовых заданий. К тому же, так вы быстрее попадете на техническое собеседование.
- С чего начать готовиться? Составьте список вопросов, которые задавали на собеседованиях другим Android разработчикам (см. часть вторую «ВОПРОСЫ»). Обязательно прочитайте требования к «интересным» вакансиям. Если найдете там «Custom View», то вызубрите этапы создания этих несчастных вьюх. Спросят 100%.
- Берёте небольшой блокнот (такой, чтобы было удобно носить с собой) и пишете вопрос из списка подготовленных, а ниже – ответ («Что такое Observable?» – Это асинхронный паттерн проектирования, в котором данные представлены в виде потока событий»). Пишете от руки! Поверьте, это очень важно для лучшего запоминания материала!
- Теперь у вас есть готовый блокнот с основными вопросами и ответами. Затем все по схеме: встали с утра, собрались, сели в метро, открыли блокнот и начали читать, читать, читать. По такой же схеме едем обратно.
- Просто читаем? Нет! Прочитали вопрос, прикрыли блокнот и своими словами попытались сформулировать ответ. Забыли? Снова открываем блокнот, читаем ответ, закрываем, отвечаем. Так пока не запомним.
- Вот вы прочитали вопрос, сформулировали ответ, и вроде бы всё хорошо. Добавьте к этому анализ! Прокрутите в голове свой ответ. Найдите термины, информацию, которая может подвигнуть вашего «экзаменатора» задать дополнительные вопросы. И обязательно выпишите ответы на них!
Приведу пример из личного опыта:
- Экзаменатор: «Чем отличается Flowable от Observable?»
- Я: «Flowable поддерживает backpressure с помощью стратегий, а Observable – нет»
- Экзаменатор: «А что за стратегии?»
- Я: «Зачем я это сказала…»
Либо говорите чётко без лишних терминов, либо умело этим пользуйтесь. Тогда есть шанс направить "экзаменатора" в нужное вам русло :) то, где вы чувствуете себя уверенно.
8. Забегая вперед, скажу, что после собеседования (или во время) лучше записать вопросы, на которые не ответили. Пишите в копилочку-блокнот и позднее обязательно письменно отвечайте. Пополняем базу знаний, так сказать.
9. Так как вам наверняка попадется как минимуму 1 задачка , прочитайте книгу «Карьера Программиста» Г. Лакмана Макдауэлла. Ознакомьтесь хотя бы с подходами к решению классических алгоритмических задач.
Переходим ко второй части.
Часть вторая: «ВОПРОСЫ»
Здесь я просто перечислю вопросы. Думаю, ответы вы найдете и без меня :)
Java:
- Модификаторы доступа Java (в порядке от private до public);
- Реализация «кучи» (где хранятся объекты);
- Где и как используются методы
equals()
andhashcode()
; - Что будет, если не переопределить метод
hashcode()
? - Реализация HashMap.
- Как разрешается коллизия в HashMap (метод цепочек или открытая адресация);
- Виды исключений в Java;
- Виды коллекций Java (перечисляете всё, что знаете);
- Типы ссылок Java и где используются;
- Способы синхронизации Java;
- Volatile – что это?
- StringBuilder vs String;
- Назовите синхронизированную версию HashMap (Hashtable, но устарела);
- Реализация ArrayList в Java (на базе массива).
- Модификатор final в Java – где используется и что даёт
Kotlin:
- MutableList vs List;
- Kotlin features (что такого классного в Kotlin?);
- Data class – в чём преимущество?
- Модификатор open в Kotlin – где используется и что даёт?
- Модификатор object в Kotlin – где используется и что даёт?
- Что такое sealed class?
RxJava:
- «Hot» vs «cold» observable;
- Операторы: map, flatMap, concatMap, switchMap – для чего и в чем отличия?
- Операторы: from, just – для чего и в чем отличия?
- Операторы: doOn…Next, …Error и так далее – для чего?
- Observable vs Flowable;
- Flowable: стратегии работы с backpressure;
- Single, Completable, Maybe – случаи использования;
- Операторы: defer, groupBy, debounce, combineLatest, withLatestFrom, merge, concat, zi, switchOnNext – как работают?
- Операторы:
observeOn()
,subscribeOn()
– как работают? - Типы Subjects;
- Типы Processors;
- Виды Schedulers;
- Как работает связка операторов publish и connect;
Android:
- Launch Modes for activity (standart, singleTop, singleTask, singleInstance);
- Intent flags для запуска activity (
FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP, FLAG_ACTIVITY_CLEAR_TOP
); - Что такое ContentProvider?
- Типы сервисов (запущенный, привязанный, IntentService), их отличия и жизненные циклы;
- Handler, Looper, MessageQueue – как это всё работает вместе;
- Планировщики задач;
- Serializable vs Parcelable;
- Виды Intent;
- addOnBackStackChangeListener – что это и для чего?
- Dialog vs DialogFragment – отличия;
- Реализация Custom View и Custom ViewGroup. Отличия в реализациях;
- MVC, MVP, MVVM, MVI – рассказать общие принципы;
- Clean architecture – рассказать общие принципы;
- MVP vs MVVM (отличия);
- Dagger 2 (модули, компоненты, сабкомпоненты, скоупы, binds vs provides, named);
- Doze Mode – что это?
- LiveData (value vs postValue, active() vs onInactive(), MediatorLiveData);
- ViewModel – рассказать общие принципы;
- Room – рассказать общие принципы;
- Moxy – рассказать общие принципы;
- Realm – рассказать общие принципы;
- Метод
invalidate()
in view – как работает? - ValueAnimator, ObjectAnimator – рассказать общие принципы;
- Paging library – виды пагинации;
- Zygote – что это и как работает?
- Bundle – что туда можно положить?
- Spannable – для чего используется?
- Context activity vs application context;
- Что прописываем в манифесте?
- SetRetainInstance in fragment – что даёт?
- AsyncTask – для чего нужен и какие имеет недостатки?
General:
- Thread pool vs creating your own threads;
- Принципы ООП;
- SOLID;
- Паттерны проектирования (статья на все времена);
- POST vs GET запросы;
- Lru Cache – рассказать общие принципы;
- Сложность алгоритмов – определение и виды;
- Git flow – рассказать общие принципы;
- Сложности вставки и поиска в ArrayList, LinkedList, HasMap;
- Виды сортировок – просто перечислить;
- Принципы функционального программирования.
ЗАДАЧИ:
- Просто перевернуть строку («мама мыла раму» -> «раму мыла мама»);
- Найти в массиве два числа сумма (разница) которых равна заданному;
- Дается цепочку вызовов
observeOn()
,subscribeOn()
вперемешку с другими операторами. Надо определить в каком потоке будет вызываться каждый оператор (была почти на каждом собеседовании!!!). - Могут дать сложный UI и спросить, как нужно его верстать;
- Могут дать задачу типа «миниприложение», и надо будет рассказать, как нужно делить по слоям (отсылка Cleanarchitecture);
- Могут дать задачу типа «миниприложение» на модульность, и надо будет рассказать, как нужно делить на модули.
Поехали дальше.
Часть третья: «СОВЕТЫ»
- Будьте готовы к курьезным случаям и не злитесь на бедных эйчаров, а помогайте им:)
Пример из личного опыта:
- HR: «Добрый день! Я ищу Android developerа в проект заказчика. У них всё на Java. Интересно?»
- Я: «Добрый день! А на Kotlin не планируется переходить?»
- HR: «Я узнаю и перезвоню»
- Я: «Окей»
- *через некоторое время перезванивает*
- HR: «К сожалению, переход на Kotlin не планируется. У них все на «нативе» написано.»
- *Я подозреваю что-то неладное*
- Я: «В смысле на ReactNative?»
- HR: «Да»
- Я: «Может, вам нужен JavaScript?»
- HR: «Java… JavaScript… А это не одно и то же?
Занавес.
Я подробно объяснила разницу в терминах, и мы закончили разговор на позитивной ноте :)
2. Если вам грубят на собеседовании , уходите! Я пару раз сталкивалась с откровенной грубостью и не терпела такого отношения к себе. Не тратьте свое драгоценное время на нехороших людей!
3. Затягивают сроки с фидбеками – ищите другую компанию. Скорее всего, вам назначили статус «on hold». И, даже пройдя все этапы, вы вряд ли получите оффер.
4. Если ЗП обещают от 200 000 руб., то в большинстве случаев она оказывается размером до 200 000, при этом до вычета налогов. Уточняйте зарплатную вилку!
5. Выполняйте тестовое задание только тогда, когда оно полезно вам. Не сталкивались с многомодульными архитектурами, а задание выпало именно на эту тематику? Обязательно сделайте! И попросите фидбек. А если снова «ответ запроса в апишку отобразите в списке…», даже не беритесь!
6. Выучите, как «Отче наш», HashMap, flatMap, SOLID!!!!!
7. Разминайтесь на «простых» компаниях, а потом переходите к «куда хочу»;
8. Обязательно осмотрите рабочее место, спросите, как трекают рабочее время и какое железо дают!
9. В конце концов просто слушайте свое сердце! Задайте себе вопрос: «Захочу ли я приходить в эту компанию каждый день?»;
Ну вот и всё! Всем спасибо за внимание!
Успехов! :)