А ты готов? Или как удачно пройти собеседование на позицию Android developer

Шпаргалка для разработчиков, которым предстоит пройти собеседование на позицию Android developer.

Статья состоит из трёх частей.

В первой части под названием «ПОДГОТОВКА» вы обнаружите информацию о процессе подготовки к собеседованию, во второй – «ВОПРОСЫ» – я расскажу о вопросах и задачах, с которыми сама столкнулась в процессе прохождения собеседований, а в третьем разделе, называющемся «СОВЕТЫ», вы сможете найти общие эдвайсы о том, к чему готовиться и чего ожидать. Надеюсь, статья будет полезной. Начнём.

P.S. Советы в разделе «ПОДГОТОВКА» являются лишь рекомендациями. Если для вас это неактуально ,  просто переходите к пункту 2  – «ВОПРОСЫ».

Часть первая: «ПОДГОТОВКА»

  1. Сколько требуется времени на подготовку? Мой ответ: 1-2 недели. Этого вполне достаточно. Конечно, если вы не метите в "Google". Тогда сроки однозначно увеличиваются.
  2. Надо ли иметь хорошее «портфолио»? Да! Можно обойтись и без аккаунта на GitHub, но, судя по опыту, pet-projects могут спасти от скучных тестовых заданий. К тому же, так вы быстрее попадете на техническое собеседование.
  3. С чего начать готовиться? Составьте список вопросов, которые задавали на собеседованиях другим Android разработчикам (см. часть вторую «ВОПРОСЫ»). Обязательно прочитайте требования к «интересным» вакансиям. Если найдете там «Custom View», то вызубрите этапы создания этих несчастных вьюх. Спросят 100%.
  4. Берёте небольшой блокнот (такой, чтобы было удобно носить с собой) и пишете вопрос из списка подготовленных, а ниже – ответ («Что такое Observable?» – Это асинхронный паттерн проектирования, в котором данные представлены в виде потока событий»). Пишете от руки! Поверьте, это очень важно для лучшего запоминания материала!
  5. Теперь у вас есть готовый блокнот с основными вопросами и ответами. Затем все по схеме: встали с утра, собрались, сели в метро, открыли блокнот и начали читать, читать, читать. По такой же схеме едем обратно.
  6. Просто читаем? Нет! Прочитали вопрос, прикрыли блокнот и своими словами попытались сформулировать ответ. Забыли? Снова открываем блокнот, читаем ответ, закрываем, отвечаем. Так пока не запомним.
  7. Вот вы прочитали вопрос, сформулировали ответ, и вроде бы всё хорошо. Добавьте к этому анализ! Прокрутите в голове свой ответ. Найдите термины, информацию, которая может подвигнуть вашего «экзаменатора» задать дополнительные вопросы. И обязательно выпишите ответы на них!

Приведу пример из личного опыта:

  • Экзаменатор: «Чем отличается Flowable от Observable?»
  • Я: «Flowable поддерживает backpressure с помощью стратегий, а Observable – нет»
  • Экзаменатор: «А что за стратегии?»
  • Я: «Зачем я это сказала…»

Либо говорите чётко без лишних терминов, либо умело этим пользуйтесь. Тогда есть шанс направить "экзаменатора" в нужное вам русло :) то, где вы чувствуете себя уверенно.

8. Забегая вперед, скажу, что после собеседования (или во время) лучше записать вопросы, на которые не ответили. Пишите в копилочку-блокнот и позднее обязательно письменно отвечайте. Пополняем базу знаний, так сказать.

9. Так как вам наверняка попадется как минимуму 1 задачка , прочитайте книгу «Карьера Программиста» Г. Лакмана Макдауэлла. Ознакомьтесь хотя бы с подходами к решению классических алгоритмических задач.

Переходим ко второй части.

Часть вторая: «ВОПРОСЫ»

Здесь я просто перечислю вопросы. Думаю, ответы вы найдете и без меня :)

Java:

  1. Модификаторы доступа Java (в порядке от private до public);
  2. Реализация «кучи» (где хранятся объекты);
  3. Где и как используются методы equals() and hashcode();
  4. Что будет, если не переопределить метод hashcode()?
  5. Реализация HashMap.
  6. Как разрешается коллизия в HashMap (метод цепочек или открытая адресация);
  7. Виды исключений в Java;
  8. Виды коллекций Java (перечисляете всё, что знаете);
  9. Типы ссылок Java и где используются;
  10. Способы синхронизации Java;
  11. Volatile  –  что это?
  12. StringBuilder vs String;
  13. Назовите синхронизированную версию HashMap (Hashtable, но устарела);
  14. Реализация ArrayList в Java (на базе массива).
  15. Модификатор final в Java  –  где используется и что даёт

Kotlin:

  1. MutableList vs List;
  2. Kotlin features (что такого классного в Kotlin?);
  3. Data class  –  в чём преимущество?
  4. Модификатор open в Kotlin  –  где используется и что даёт?
  5. Модификатор object в Kotlin  – где используется и что даёт?
  6. Что такое sealed class?

RxJava:

  1. «Hot» vs «cold» observable; 
  2. Операторы: mapflatMapconcatMapswitchMap  –  для чего и в чем отличия?
  3. Операторы: fromjust  –  для чего и в чем отличия?
  4. Операторы: doOnNext, …Error и так далее  –  для чего?
  5. Observable vs Flowable;
  6. Flowable: стратегии работы с backpressure;
  7. SingleCompletableMaybe –  случаи использования;
  8. Операторы: defergroupBydebouncecombineLatestwithLatestFrommergeconcatzi, switchOnNext  –  как работают?
  9. Операторы: observeOn()subscribeOn()  –  как работают?
  10. Типы Subjects;
  11. Типы Processors;
  12. Виды Schedulers;
  13. Как работает связка операторов publish и connect;

Android:

  1. Launch Modes for activity (standart, singleTop, singleTask, singleInstance);
  2. Intent flags для запуска activity (FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP, FLAG_ACTIVITY_CLEAR_TOP);
  3. Что такое ContentProvider?
  4. Типы сервисов (запущенный, привязанный, IntentService), их отличия и жизненные циклы;
  5. HandlerLooperMessageQueue  –  как это всё работает вместе;
  6. Планировщики задач;
  7. Serializable vs Parcelable;
  8. Виды Intent;
  9. addOnBackStackChangeListener  –  что это и для чего?
  10. Dialog vs DialogFragment  –  отличия;
  11. Реализация Custom View и Custom ViewGroup. Отличия в реализациях;
  12. MVCMVPMVVMMVI  –  рассказать общие принципы;
  13. Clean architecture  –  рассказать общие принципы;
  14. MVP vs MVVM (отличия);
  15. Dagger 2 (модули, компоненты, сабкомпоненты, скоупы, binds vs provides, named);
  16. Doze Mode  –  что это?
  17. LiveData (value vs postValue, active() vs onInactive(), MediatorLiveData);
  18. ViewModel  –  рассказать общие принципы;
  19. Room  –  рассказать общие принципы;
  20. Moxy  –  рассказать общие принципы;
  21. Realm  –  рассказать общие принципы;
  22. Метод invalidate() in view  –  как работает?
  23. ValueAnimatorObjectAnimator  –  рассказать общие принципы;
  24. Paging library  –  виды пагинации;
  25. Zygote  –  что это и как работает?
  26. Bundle – что туда можно положить?
  27. Spannable  –  для чего используется?
  28. Context activity vs application context;
  29. Что прописываем в манифесте?
  30. SetRetainInstance in fragment  –  что даёт?
  31. AsyncTask  –  для чего нужен и какие имеет недостатки?

General:

  1. Thread pool vs creating your own threads;
  2. Принципы ООП;
  3. SOLID;
  4. Паттерны проектирования (статья на все времена);
  5. POST vs GET запросы;
  6. Lru Cache – рассказать общие принципы;
  7. Сложность алгоритмов  –  определение и виды;
  8. Git flow  –  рассказать общие принципы;
  9. Сложности вставки и поиска в ArrayList, LinkedList, HasMap;
  10. Виды сортировок  –  просто перечислить;
  11. Принципы функционального программирования.

ЗАДАЧИ:

  1. Просто перевернуть строку («мама мыла раму» -> «раму мыла мама»);
  2. Найти в массиве два числа сумма (разница) которых равна заданному;
  3. Дается цепочку вызовов observeOn(), subscribeOn() вперемешку с другими операторами. Надо определить в каком потоке будет вызываться каждый оператор (была почти на каждом собеседовании!!!).
  4. Могут дать сложный UI и спросить, как нужно его верстать;
  5. Могут дать задачу типа «миниприложение», и надо будет рассказать, как нужно делить по слоям (отсылка Cleanarchitecture);
  6. Могут дать задачу типа «миниприложение» на модульность, и надо будет рассказать, как нужно делить на модули.

Поехали дальше.

Часть третья: «СОВЕТЫ»

  1. Будьте готовы к курьезным случаям и не злитесь на бедных эйчаров, а помогайте им:)

Пример из личного опыта:

  • 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. В конце концов просто слушайте свое сердце! Задайте себе вопрос: «Захочу ли я приходить в эту компанию каждый день?»;

Ну вот и всё! Всем спасибо за внимание!

Успехов! :)

Какие советы показались тебе наиболее полезными?

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ