15 неотъемлемых вопросов любого интервью по Android


Оглавление (нажмите, чтобы открыть):

Мое второе собеседование на должность Junior

Всем привет!
Когда я готовился к первому собеседованию, мне очень интересно было почитать разнообразные темы о том, что спрашивают у Джуниоров. Их находил крайне мало, и, вот, по окончанию, хотел бы поделиться опытом, что спрашивали у меня.
Свое первое собеседование я благополучно завалил — с адским рвениям готовил все эти Intents, взаимодействия между Activity, обработка кликов, нажатий, построение UI и т.д.
А там меня ошарашили тем, что начали лепить кучу вопросов по чистой Джаве)) Я раньше писал на C/C++, и с Java работал, как с Си-совместимым языком, т.е. особо не углублялся.
Короче, погнали в тот раз спрашивать про нюансы List-Set-Map, потоки, обмен данными между потоками, синхронизируемыми функциями и вообще о безопасном совместном использовании данных. Ни одного вопроса чисто по Андроид)) Короче, я благополучно слил собеседование. Учитывая, видно, мой трехлетний предыдущий опыт на С/С++ мне с печальным видом предложили «попробовать две недели поработать, а там посмотрим». Я отказался, т.к. в тот момент уходить с текущей работы на такое туманное предложение не очень хотел.

После этой истории я купил «Философию Java» Эккеля, и переделал вручную почти все примеры из книги, выяснив параллельно, что и с ООП в принципе у меня большая беда. И, вот, через несколько месяцев решил попробовать еще раз, но уже параллельно на две позиции — iOS и Андроид, т.к. волей случая стал обладателем яблочного компа (ну и как тут не попробовать что-то пописать)) ).

Хотел бы просто перечислить, что у меня спрашивали, может кому-то для примера пригодится:
1. Первым вопросом были основы ООП — понятие класса, объекта, абстракции данных, наследования, полиморфизма. С просьбой привести примеры из жизни основываясь на базовых принципах ООП. По этим темам гоняли довольно детально (спасибо Эккелю)) ).
2. Спросили о самой платформе Андроид — на чем базируется, о dex-файлах, Dalvik.
3. Что такое Activity, как вызвать Activity, передача данных между Activity.
4. Намерения, где используются.
5. Что такое Сервис.
6. Жизненный цикл Activity, как сохранять состояние.
7. Рассказать про Manifest.
8. Я в резюме написал, что знаком с SQL — спросили самые основы SQLite, как создать базу данных (одобрили мой рассказ о DBHelper).
9. Вкратце, общее понятие о поставщиках контента и Broadcast recievers.
10. Как бы я в общих чертах реализовал бы аналог приложения «Календарь».
11. Вопросы о классе Object, какие его основные методы.
12. Классический вопрос о List-Set-Map, разновидности.
13. Различие «==» и «isEqual()»
14. Класс Thread, AsyncTask.

В завершение дали три задачки:
Написать рекурсивную функцию вычисления факториала, и пару функций на использование тернарных операторов и работой с перебором элементов массива.

Если кому-то интересно о прохождении собеседование на Junior’a по iOS — в соответствующем разделе на форуме я описал и этот фрагмент собеседования.
Надеюсь, эта тема хоть немного пригодится идущим на первое собеседование.

23.08.2013, 18:08

Собеседование Android Junior
Доброго времени и суток! Живу в провинциальном городке и таких вакансий у нас мало. Через дня 3.

Собеседование сбертех android junior — чего ждать?
Значит есть вакансия, Android Разработчик (Стажер), предполагаемая обучение 3 месяца бесплатное а.

Как проходит собеседование на Junior Android Developer
Здраствуйте! Кто уже проходил собеседование на позицию Junior Android Developer, расскажите.

Мое первое собеседование на позицию Junior
Всем привет! Когда я готовился к первому собеседованию, мне очень интересно было почитать.

собеседование на должность програм.1С-Стажер
В вакансиях пишут,что требуется знание любого языка программирования 1)какими знаниями языка надо.

Andro > Автор: ivanessence

Вопросы по основным элементам, из которых состоит приложение на Android.

1. Назовите основные компоненты Android приложение

Основными компонентами приложения Android являются:
Activity
Service
Broadcast receiver
Content provider
Все компоненты Также некоторые относят к ним Intent, но на официальном сайте по разработке на Android он отсутствует.

2. Что такое Activity?

Это компонент приложения, который представляет собой экран, с которым пользователи могут взаимодействовать для выполнения каких-либо действий, например набрать номер телефона, сделать фото, отправить письмо или просмотреть карту. Каждой Activity присваивается окно для прорисовки соответствующего пользовательского интерфейса.

3. Опишите жизненный цикл Activity

Жизненный цикл представляет собой последовательность методов, которые вызываются в определенной последовательности во время создания/уничтожения/приостановки Activity.

onCreate()
Необходимо обязательно реализовать, поскольку система вызывает его при создании Activity. Важно именно здесь вызвать метод setContentView() для определения пользовательского интерфейса. Вызывается первым, во время создания Activity. Вызывается один раз, после чего наше Activity переходит в состояние Created. В данном методе мы инициализируем интерфейс нашего Activity, а также выполняем некоторую базовую логику, которая необходима нам для корректной работы Activity, например, создаём список с какими-либо данными. Также, в качестве аргумента метода onCreate нам передаётся объект Bundle, который содержит в себе информацию, которая была предварительно сохранена, во время пересоздания Activity.
onStart()
Переводит нашу Activity в состояние Started, после чего Activity становится видно для пользователя. Метод может использоваться для какой-либо логики, которая взаимодействует с UI.
onResume()
Наше Activity переходит на передний план приложения (foreground) изменяя своё состояние на Resumed. После вызова данного метода, пользователь может взаимодействовать с Activity. В данном состоянии Activity остается до тех пор, пока не потеряет фокус, это может произойти, например, при переходе на другую Activity, либо при входящем телефонном звонке.
onPause()
Наше Activity теряет фокус, больше не видно для пользователя и выходит из состояния foreground. При этом Activity не уничтожается и продолжает существовать. В этом методе, например, мы можем приостановить логику связанную с GPS навигацией, чтобы минимизировать расход батареи.
onStop()
Состояние Activity изменяется на Stopped. Вызывается, когда Activity не видно пользователю, например, при переходе на другой экран или при сворачивании приложения, а также при подготовке к полному уничтожению нашей Activity. системой.
onDestroy()
Метод вызывается непосредственно перед уничтожением нашей Activity, например, после вызова метода finish(), или переходе на предыдущую Activity, путём нажатия кнопки “назад”.
Если активность завершается, onDestroy() – это последний метод жизненного цикла, который вызывает Activity. Если onDestroy() вызывается в результате изменения конфигурации, система немедленно создает новый экземпляр активности вызывает onCreate() в новом экземпляре и новой конфигурации.
Метод onDestroy() должен освобождать все ресурсы нашей Activity.

При повороте экрана система полностью пересоздаёт экземпляр Activity. Для того, что сохранить какие-либо пользовательские данные и затем восстановить их в нашей Activity, используются следующие методы:

– onSaveInstanceState()
Данный метод вызывается перед тем, как Activity будет уничтожена. Параметром метода является Bundle, в который мы будем складывать необходимые для сохранения данные. Рекомендуется сохранять данным способом информацию, объём которой не превышает 1 мегабайт, в случае превышения лимита мы получим ошибку TransactionTooLargeException.
– onRestoreInstanceState()
Вызывается после метода onStart(). В данный метод мы получим наш Bundle, в котором была сохранена информация.

Стоит заметить, что Bundle с сохранёнными данными мы также получаем в методе onCreate(), но данную ситуацию нужно отдельно обрабатывать, чтобы не получить NullPointerException.

4. Что такое Service?

Служба — это компонент android-приложения без видимого интерфейса, который работает в фоновом режиме. Служба обязательно должна быть объявлена в файле AndroidManifest.

Service запускается в главном потоке приложения, поэтому если необходимо обработать в нём какую либо тяжёлую логику, необходимо создавать в нём новый поток.

Service может работать в нескольких режимах:
– Foreground Service
Сервис запущенный в данном режиме имеет высокий приоритет и не будет уничтожен системой, в случае нехватки памяти. Такой Service связывается с Notification, которое будет отображаться в статус баре. Запускается при помощи метода startForeground().
– Background Service
Работает в стандартном режиме, в фоне, в основном потоке приложения. Запускается при помощи метода startService().
– Bound Service
Service запущенный в данном режиме привязывается к какому-либо клиенту, например к Activity, и работает по принципу клиент-сервер. Service может быть привязан к нескольким клиентам, при этом система уничтожит сервис в случае, если все клиенты связанные с ним были уничтожены. Запускается при помощи метода bindService().

5. Опишите Broadcast receiver?

Приёмник широковещательных сообщений — это компонент для получения сообщений (Intent) и реагирования на них. Сообщения отправляются при помощи метода sendBroadcast(). Для обработки широковещательных сообщений необходимо создать объект IntentFilter и связать его с Broadcast receiver:

Либо зарегистрировать его в манифесте при помощи тега .

BroadcastReceiver можно динамически зарегистрировать с помощью метода registerReceiver(), или статически создать его в тэге в файле AndroidManifest приложения. Запускается в главном потоке приложения.

6. Способ применения ContentProvider?

Поставщик содержимого представляет собой оболочку над базой данных приложения. Если наше приложение использует базу данных SQLite, то только оно имеет к ней доступ. Поставщик содержимого применяется лишь в тех случаях, когда необходимо использовать данные совместно с другими приложениями, работающими на устройстве. Запускается в главном потоке приложения, поэтому для обработки запросов к базе данных, необходимо использовать другой поток. Например при помощи ContentProvider мы можем получить контакты из записной книги телефона или SMS.

7. Что такое ContentResolver?

ContentResolver необходим для выполнения запросов к ContentProvider другого приложения. ContentResolver включает в себя методы CRUD (create, retrieve, update, delete) для запросов и транзакций. Объекту ContentResolver необходимо передать путь URI, в котором указано, к какому объекту ContentProvider необходимо обращаться.

Сборник тестов: 1500 вопросов и ответов на знание Andro >

Книга содержит 30 тестов по 50 вопросов с ответами на знание Android. Книга предназначена для подготовки к экзаменам и собеседованиям.

Оглавление

Приведённый ознакомительный фрагмент книги Сборник тестов: 1500 вопросов и ответов на знание Android (Тимур Машнин) предоставлен нашим книжным партнёром — компанией ЛитРес.

© Тимур Машнин, 2015

Создано в интеллектуальной издательской системе Ridero.ru

Платформа Андроид основывается на операционной системе:

Архитектура платформы Андроид состоит из:

Приложений, фреймворка приложений, библиотек, среды выполнения Андроид, ядра Linux.

Приложений, библиотек, фреймворка библиотек, среды выполнения Андроид, ядра Linux.

Приложений, телефонного менеджера, библиотек, среды выполнения Андроид.

Приложений, телефонного менеджера, библиотек, ядра Linux.

Телефонного менеджера, библиотек, среды выполнения Андроид, ядра Linux.

Базовая единица графического интерфейса приложения Андроид это:

Ничего из ниже перечисленного.

Интерактивные элементы экрана.

Layout и Drawing.

View и Viewgroups.

Как называется Java виртуальная машина платформы Андроид:

Forth Virtual Machine

Juke Virtual Machine

Parrot Virtual Machine

Что представляет собой формат APK?

Андроид файл контента.

Андроид файл данных.

Андроид файл пакета.

Андроид файл ресурсов.

Ничего из выше перечисленного.

Файлы ресурсов Layout должны размещаться в папке:

В каталоге assets данные размещаются в формате:

Пустой процесс не должен иметь:

Активных компонентов приложения.

Инструмент bmgr используется для:

Получения резервной копии приложения.

Уничтожения архивных данных для конкретного приложения.

Все выше перечисленное.

Какие утверждения верны относительно сервисов и потоков?

Сервис запускается в отдельном потоке.

Для потока можно создать несколько экземпляров, а для сервиса нет.

Сервис не может использовать потоки для выполнения задач.

В чем разница между сервисом и асинхронной задачей?

AsyncTask зависит от контекста Activity, из которой был запущен, а сервис нет.

И AsyncTask и сервис выполняются в UI thread.

И AsyncTask и сервис имеют доступ к UI thread.

В чем разница между потоком и асинхронной задачей?

AsyncTask имеет доступ к UI потоку, а поток нет. Для доступа потока к UI потоку может использоваться класс Handler.

AsyncTask представляет общий фреймворк потоков.

И AsyncTask и потоки предназначены для выполнения длительных задач.

Запускается при вызове foreground ().

Может или нет обеспечивать уведомление в панель статуса.

Уведомление не может быть убрано, пока сервис не остановится или не перестанет быть foreground.

A1, A2, A3 и A4 являются активностями, которые были вызваны, используя намерения. При том Backstack A1-A4-A2 – A3. Активность A4 вызывает A2 с помощью флага намерения FLAG_ACTIVITY_NO_HISTORY. Когда будет вызван метод finish () активности A3, какая активность останется работающей?

A1, A2, A3 и A4 являются активностями, которые были вызваны, используя намерения. При том Backstack A1-A2-A4 – A3. Активность A2 вызывает A4 с помощью флага намерения FLAG_ACTIVITY_CLEAR_TOP. Когда будет вызван метод finish () активности A3, какая активность останется работающей?

A1, A2, A3 и A4 являются активностями, которые были вызваны, используя намерения. При том Backstack A1-A2-A3-A4. Активность A3 вызывает A4 без флага намерения. Когда будет вызван метод finish () активности A4, какая активность останется работающей?

Плюс (+) в выражении andro >

Определить в качестве идентификатора ресурса

Создать новый идентификатор и добавить к ресурсам

XML-парсер должен разобрать ID строку

Если вы хотите, чтобы система запускала сервис на неопределенный срок, перезапуская его при уничтожении, тогда используйте:

Android система использует намерения, чтобы:

Широковещать системные намерения.

Широковещать пользовательские намерения.

Вызывать другие приложения из вашего приложения

Уведомление «Экран гаснет» это пример:

Если вы попытаетесь получить доступ к столбцу таблицы, который не существует, тогда будет исключение:

Максимальное количество адресов, возвращаемых методом getFromLocationName () может быть:

Методы startForeground () и stopForeground () были введены в API level:

Проверка наличия аудио эффектов осуществляется с помощью метода:

Приложения, требующие фильтрации по размеру экрана, могут использовать атрибуты:

Какое утверждение ложно относительно метода onBind ():

Вызывается, когда другой компонент хочет связываться со службой.

Вызов метода startService () приводит к вызову метода onBind ().

Если вы не хотите, чтобы связывание затем вернуло NULL.

Если вы хотите, чтобы связывание затем вернуло объект Ibinder

Платформа Android лицензирована:

Кто владеет платформой Android?

Open Handset Alliance

Какой была основная бизнес мотивация Google для поддержки Android?

Чтобы выровнять игровое поле для мобильных устройств.


Чтобы конкурировать с iPhone.

Монополизировать рынок мобильных приложений для целей лицензирования.

Чтобы позволить Google больше рекламировать.

Какой первый телефон был выпущен на Android OS?

С точки зрения производителя мобильных устройств, какие преимущества у Android?

Помимо некоторых специфических драйверов, Android обеспечивает все, чтобы устройство работало.

Android обеспечивает лучшую работу устройства.

Android позволяет устройствам конкурировать с iPhone от Apple.

Android позволяет пользователям создавать приложения для получения доходов.

Какой факт является забавным о запуске Android?

Платформу хотели назвать НЛО.

Первая версия Android была выпущена без наличия телефона на рынке.

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

Android хотели сделать с закрытым кодом, чтобы сделать больше денег для компании.

Когда была создана Open Handset Alliance?

Устройство с установленной операционной системой Android необходимо для разработки приложений для Android.

Android старается _____ низкоуровневые компоненты, такие как программный стек, с интерфейсами, так чтобы кодом конкретного производителя можно было легко управлять.

Google лицензирует некоторые проприетарные приложения.

Какая часть платформы Android с открытым исходным кодом?

Низкоуровневые модули Linux.

Все эти ответы. Весь стек платформы с открытым исходным кодом.

Когда Google купил Android?

Релизам Android начиная с 1.5 давались прозвища происходящие из?

Нечто что начинается с w/ «A».

Что не является названием версии Andriod?

Android не делает какие-либо предположения о размере экрана, разрешении или микросхемах устройства.

Какая версия Android имела самую большую долю рынка в январе 2011?

Какая часть кода, используемая Android не является открытой?

Платформа Android собрана на основе Java Micro Edition (J2ME).

Какая из перечисленных не является нативной библиотекой Android?

Android базируется на Linux из следующих соображений:

Все выше перечисленное.

Какая операционная система используется как основа Android стека?

В каком году стартовала разработка на виртуальной машине Dalvik?

Какая разница между распространением приложений для Android устройств и приложений для других устройств?

Приложения распространяются только Apple App Store.

Приложения распространяются множеством поставщиков с различными политиками приложений.

Приложения распространяются множеством поставщиков с одной и той же политикой приложений.

Приложения распространяются только Android Market.

При разработке для Android OS, Java byte код компилируется в:

Dalvik application код

Dalvik byte код

Оглавление

Приведённый ознакомительный фрагмент книги Сборник тестов: 1500 вопросов и ответов на знание Android (Тимур Машнин) предоставлен нашим книжным партнёром — компанией ЛитРес.

Как подготовиться к собеседованию (Andro >

Ни для кого не секрет, что на собеседованиях нас спрашивают о всяком таком, чего в работе и не встретишь. А ещё нас валят странными вопросами, пытаются запутать и т.д. и т.п. Лично я решил устроиться android-разработчиком на работу. Опыт работы только в тестировании, а вот в разработке под android опыт кое-какой есть. Но есть и замешательство, непонятно, что могут спрашивать на собеседовании, чего от меня ждут?

Если знаете, подскажите, какие темы лучше всего повторить? Может, есть какие-то уже существующие списки вопросов? Бдует здорово, если поможете найти какие-нибудь тестовые задания.

  • Вопрос задан более трёх лет назад
  • 14498 просмотров

Людей которые себя позиционируют junior разработчиками, но вместе с этим имеют опыт работы в другой сфере, часто проверяют на способность работы программистом в целом, а выбранная специализация(android, frontend, backend) уже второстепенно. Про тестеров могут возникнуть вопросы вроде «Может быть он хотел стать программистом, но не смог никуда устроится и стал тестером».

Так что я бы на вашем месте готовился к вопросам по Java(коллекции, GC, ООП, работа с памятью и тд), вопросам по основным алгоритмам и структурам данных. И если вы идете в серьезную компанию, а не стартап какой попало, то я бы на вашем месте готовился усердно, т.к. вашими конкурентами будут 20-22-х летние студенты или выпускники, которые последние несколько лет учили все выше перечисленное ежедневно, и еще, наверняка, у них не пустой GitHub/StackOverflow и они гарантированно как минимум год готовы будут работать за опыт, что в вашем случае еще не факт.

Если вы покажете себя как потенциально хороший программист, то вам простят не 100% знание Android’а.

Задачи Яндекса на должность Andro > Задать вопрос

Есть 3 задачки для прохождения собеседования в Yandex на должность Android Developer. После выполнения этих 3 заданий мне сообщили, что я не выполнил ни одного задания верно, хотелось бы услышать от вас, где у меня ошибки.

Задача 1: Какие объекты доступны для сборщика мусора на момент вызова System.gc() и почему?

Мой ответ: Массив new A[2] из строки A[] mas = new A[2] будет очищен, так как мы выполняем функцию, которая зануляет этот массив ( mas = null ). Также будет очищен объект new A(«a2») , так как мы теряем на него ссылку в строке a2 = a1 , соответственно он ссылается уже на объект new A(«a1») . А далее мы зануляем массив, как я писал выше, поэтому больше никто не ссылается на на объект new A[2] .

Задача 2: Перечислите все проблемы, которые вы видите в данном коде:

Мой ответ: Я написал, что использование byte[] в качестве ключа HashMap недопустимо, так как у byte[] метод Hashcode() реализован на алгоритме Park-Miller RNG. Hashcode() у byte[] реализован так же, как и у Object , точно так же метод equals() будет работать, как у Object и будет сравнивать ссылки на объект, а не само содержание объектов (как обычно людям кажется), соответственно на основании этого я написал, что данная коллекция будет работать некорректно.

Далее я написал, что также все строки кода, в которых выполняется добавление данных в коллекцию или удаление не имеет смысла, так как мы используем в качестве ключа byte[] .

Далее я написал, что код:

слишком растянут и имеют лишние строки, которые повторяются далее.

Задача 3: Есть две задачи: Task 1 и Task 2. Стек Activity для Task 1: A,B,C,D . Стек Activity для Task 2: X,Y,Z .

После выполнения указанного действия для всех пунктов в ответе необходимо указать:

Как будет выглядеть стек Activity для задач. Например, Task 1: A,B,C,D; Task 2: X,Y,Z ;

Историю того, как будут изменяться стеки при нажатии кнопки BACK , пока не возвратимся в Home screen. Например: A,B,C,D — back -> A,B,C — back -> A,B — back -> A — back -> Home screen ;

а) У всех Activity установлен launchMode=»standard» . В текущий момент отображается Activity Z. Из Activity Z отправляется Intent на открытие Activity D.

б) У всех Activity установлен launchMode=»standard» , но только у Activity D установлен launchMode=»singleTop» . В текущий момент отображается Activity Z. Из Activity Z отправляется Intent на открытие Activity D.

в) У всех Activity установлен launchMode=»standard» , но только у Activity D установлен launchMode=»singleTask» . В текущий момент отображается Activity Z. Из Activity Z отправляется Intent на открытие Activity D.

Мой ответ: При ответе в их форме я в конце прокомментировал мои действия, здесь не будут, просто дам ссылку на описание режимов Activity, там есть таблица в середине с полным описанием.

а) Task 1: A,B,C,D; Task 2: X,Y,Z,D;

б) A,B,C,D — back -> A,B,C — back -> A,B — back -> A — back -> Home screen ; X,Y,Z,D — back -> X,Y,Z — back -> X,Y — back -> X — back -> Home screen ;

а) Task 1: A,B,C,D; Task 2: X,Y,Z,D;

б) A,B,C,D — back -> A,B,C — back -> A,B — back -> A — back -> Home screen ; X,Y,Z,D — back -> X,Y,Z — back -> X,Y — back -> X — back -> Home screen ;

а) Task 1: A,B,C,D; Task 2: X,Y,Z;

Мастер Йода рекомендует:  Виды популярных архитектур процессоров

б) A,B,C,D — back -> A,B,C — back -> A,B — back -> A — back -> Home screen ; X,Y,Z — back -> X,Y — back -> X — back -> Home screen ;

Я также искал в просторах интернета ответы на эти задачи, кроме 3, и нашёл пару ссылок, на первую задачу отвечают, что сборщик мусора отчистит ноль объектов; а я ответил, что два: массив и объект. Я не совсем понял, почему это так? Почему зануление массива не влияет на сам массив, почему он всё равно существует?

По поводу второй задачи были споры, что коллекция не является потокобезопасной; никто не писал по поводу ключа в качестве byte[] . Но как из их задачи вообще можно понять, что они там хотят сделать? Там же нету дополнений, что всё выполняется в несколько потоков. Так-то я в курсе, что коллекция не потокобезопасна, и для этого есть специальные реализации синхронизированных коллекций.

Прошу от вас конструктивных ответов, так как у меня завязался спор с сотрудником из Yandex, и мы договорились, что пусть более компетентные люди с большим опытом попробуют дать ответ на эти задачи и растолкуют мне мои недочёты. Если я был прав хотя бы в одном из ответов, то по этому вопросу будет непосредственное разбирательство внутри их компании; а я на 99% уверен, что 3 задачу я решил верно, и там варианты ответа не такие размазанные, как во 2 задаче, где каждый может найти свою неточность или огрех.

Заранее благодарю за ответы, ибо для меня это дело принципа!

4 ответа 4

За 3-ю задачу говорить не буду, т.к. android не занимаюсь.

В первой задаче ответ действительно неверный. Изучайте Java. В том числе смотрите про передачу параметров в Java.

По второй задаче ответ во-первых далеко неполный (можно час обсуждать проблемы в этом коде, без преувеличений). Очевидно, что в коде представлен кэш. Попробуйте подумать о том, как он будет использоваться в клиентском коде. Какими вообще свойствами обладают кэши. Во-вторых, та часть ответа, которую вы представили на тему hashCode верна, но не всегда. Посмотрите на то, какие есть варианты реализации hashCode в JVM.

Более развернутый ответ давать не собираюсь, т.к. считаю подобное поведение некорректным по отношению к Яндексу и другим соискателям.

Во второй задаче помимо использования byte[] в качестве ключей (в конкретном коде может это и не проблема, сравнивать ключи по ссылке иногда может быть нормально) серьёзная проблема — это ламерская реализация double-checked locking. Запись в HashMap охраняется локом, но первое чтение — нет. В результате поведение может быть неспецифицированным. Возможно что угодно — произвольное исключение, неверный результат или даже зацикливание с полным подвисанием потока. DCL можно применять с volatile-переменной, которую вы контролируете (и то осторожно, там есть тонкости с публикацией объекта), но со структурой данных, которую вы не контролируете — ни в коем случае.

В данном случае надо не мучать киску, а использовать ConcurrentHashMap . Если хочется вычислять значение не более одного раза для каждого ключа и Java-8 использовать нельзя, то можно сделать ConcurrentHashMap > и реализацию вроде:

Примерно такая идея. Так у вас для каждого ключа вычисляется значение единожды, и при этом решается ещё одна проблема: при вычислении значения для одного ключа работа с остальными не блокируется.

В Java-8 то же самое гораздо проще:

Правда оно вроде как блокирует целый node, а не одну запись, но в node нечасто бывает больше одной записи.

Соответственно ваш ответ по второй задаче в корне неверен в том смысле, что вы даже понятие DCL не упомянули.

По трейтьей задаче. Сначала надо понять как получили два таска, т.е. что это вообще такое (допускаю, что вы об это прекрасно знаете, но для ясности опишем).

Запускаем с home screen’а активити: A, из которого переходим в B, дальше в C, и D. Жмем home. Запускаем с home screen’а активити X, из него Y, и него Z.

Пример. Есть приложение sms и приложение dialer и в том и другом можно вызвать активти списка контактов. И вот в sms открыли список контактов и в dialer’е собираемся открыть тот же список контактов. Дальше варианты:

a) Мы находимся в task 2, у которого стек XYZ. Переходим в D и теперь задача узнать какие стеки будут у каждого из task’ов. task1 так и останется ABCD. task2 станет XYZD. В standard mode Активити D создастся и добавится в стек task2, не влияя никак на task1. В результате последовательного нажатия back:

Task1=ABCD, Task2=XYZD ->
Task1=ABCD, Task2=XYZ ->
Task1=ABCD, Task2=XY ->
Task1=ABCD, Task2=X ->
Task1=ABCD, Task2 завершится (стек пустой) перейдем в home screen.

для примера это будет выглядеть так, что каждое и sms и dialer работают со своим экземпляром списка контактов и стек у каждого из них будет свой.

b) singleTop для активити D в данном случае ничем не отличается от standard. Эти режимы относятся к одному task’у и отличия standard от singleTop лишь в том, что если бы мы потом запустили активити D в том же таске и она была бы на вершине стека, новый экземпляр не создавался бы, а сработало бы onNewIntent для существующей активти. Например, такой вариант запуска активти применяется при реализации поиска. Короче говоря результат будет таким же как и в первом пункте.

пример естественно будет тот же.

c) режим singleTask для D говорит о том, что активити D запускается только в одном таске. Следовательно, при запуске D из Z произойдет смена таска на первый, далее нажимаем back, как только мы выйдем из стека таска 1, вернемся в таск 2 и будем выходить из него. При этом возврат на главный экран произойдет только в конце, т.е. когда оба таска опустеют.

Task1=ABCD, Task2=XYZ (D уже запущена в таске 1) ->
Task1=ABC, Task2=XYZ ->
Task1=AB, Task2=XYZ ->
Task1=A, Task2=XYZ ->
Task1= , Task2=XYZ ->
Task1= , Task2=XY ->
Task1= , Task2=X ->
home screen.

по примеру. если бы список контактов был singleTask (хоть это и бред), то зайдя в sms добравшись до списка, вернулись на домашний экран, открыли dialer, опять открыли список контактов, нажали back и оказались в sms 8-() жмем back, окзаываемся в dialer’е 8-()

Трудоустройство Andro >

В последнем нашем подкасте мы, совместно с профессиональным рекрутером, поговорили про то, как устроиться на работу, как прийти и пройти собеседование, о чем лучше не писать в резюме и многом другом.

Денис: Как все устроено на рынке мобильной разработки? Что у нас в России с количеством мобильных разработчиков и соотношением iOS и Android? Насыщен ли рынок мобильными разработчиками?

Евгения: Мы актуализировали специально к этому выпуску свои данные. Если смотреть глобально, всего разработчиков в России около 200 тысяч. Если смотреть на мобильную разработку в целом (iOS и Android), то это в районе 11 тысяч человек на всю Россию. Это, действительно, не очень много. И если смотреть именно большую разбивку по направлениям, то Android сейчас в России занимается примерно 7,5 тысяч человек. И примерно 5 тысяч iOS-разработчиков.

Важно понимать, что это наша оценка снизу. Мы считаем квалифицированных специалистов, которые уже готовы выйти куда-то работать и писать код, то есть интернатуру мы не берем. Но тут, в принципе, можно, интересно посмотреть на цифры по регионам.

Из этих 11 тысяч человек большая часть приходится на Москву. В Москве мобильных разработчиков в районе 45% от общего количества. На втором месте по региону стоит Петербург, здесь где-то 25%. И уже дальше, в порядке убывания, регионы идут – Новосибирск, Казань и Нижний Новгород. Это самые лидеры. Все остальные уже равномерно размазаны. Томск, Омск, Пермь. Все наши любимые города.

Денис: Расскажи про компании. Ведь это же как раз потенциальные работодатели.

Евгения: С компаниями, если именно с глобальной точки зрения смотреть, все делится на два больших направления. Во-первых, это крупные технологические, продуктовые или финтех компании.

Во-вторую уже идут аутсорс разработки и студии.

Если выделять поток работодателей по количеству команд, которые представлены, то тут однозначно лидируют все наши крупняки, которых мы знаем. Это и Яндекс, и Mail, и СберТех, и Тинькофф, и Рамблер. По аутсорсу больше видны EPAM, Redmadrobot, Agora, Hyperboloid. То есть тоже все знакомые компании.

Денис: Продукты больше платят, чем аутсорсеры своим ребятам или зарплаты на одном уровне?

Евгения: Смотря какие. Мы еще хотели с тобой сегодня подробно обсудить тему зарплат, но забегая вперед честно скажу, что у всех разные денежные составляющие. Понятно, что если ты работаешь на аутсорс, тем более если это не российские заказчики, то, скорее всего, на сегодняшний день зарплата у тебя будет больше. Но если смотреть на перспективу в 2-3 года, то продуктовые компании выигрывают так или иначе — со своим всем соцпакетам и по тому, как у них зарплаты устроены.


Денис: Давай пока поговорим про оплату по уровням разработчиков. Сколько же в Москве, Питере и регионах зарабатывают разработчики?

Евгения: Я готовила цифры по Москве, именно по «вилкам», потому что регионы уже зависят от уровня жизни. Соответственно, говорить буду про цифры, которые получают сейчас на руки.

Джуны в мобильный разработке получают потолок в районе 110 на руки. То есть это где-то совсем наверху, когда ты очень способный, и ты уже практически в мидлы перескакиваешь.

Мидлы в Москве по верхней границе где-то до 160 на руки.

Соответственно, сеньоры уже где-то до 230.

И тим-лиды до 280 потолок.

Но это такая, очень «средняя температура по больнице». Понятно, что есть компании, которые платят выше рынка, и есть компании, которые, может быть, платят чуть ниже рынка, хотя их уже практически не осталось. Это средние цифры.

Денис: А куда деваются такие компании? Они закрываются или приходится им платить выше, иначе невозможно нанять?

Евгения: Выравниваются, подстраиваются, так или иначе, потому что рынок-то греется, перегревается, и в какой-то момент ты уже за одну идею работать не пойдешь.

Денис: Зато многие сидят на старых местах и говорят: «Ну, и что, что мало платят, зато я здесь всех знаю».

Евгения: Но это уже другое. Это уже про индексацию зарплаты. Если у тебя работодатель не индексирует зарплату уже несколько лет, это плохо. Ты уже получаешь ниже рынка, и нужно смотреть, идти разговаривать на эту тему, что, чуваки, давайте как-то в более рабочее русло переходить.

У меня был в анамнезе Android-разработчик, который пришел и сказал, что ему 4 года не повышали заработную плату. За 4 года Android-разработка ушла вперед такими семимильными шагами, что я вообще не понимаю, как он сидел тогда за свою зарплату, которая у него была 4 года назад.

Денис: Я хочу дать ребятам маленький совет.

Запомните слово «перформанс-ревью». Когда вы придете к начальству говорить о деньгах, говорите не о том, что надо пересмотреть зарплату. Это выглядит неловко. Надо говорить «Давайте посмотрим мою производительность» — это звучит гораздо приятнее. И вот на основе производительности уже нужно делать выводы.

Многие, кстати, неуверенны в себе. Они хорошие ребята, они хорошо делают — но есть комплекс, что где-то на свете есть гораздо круче ребята, которые знают больше, и поэтому ничего, что мне платят не так много. Но все равно не бойтесь говорить: «Давайте устроим перформанс-ревью». Это и вам в плюс всегда. Вы будете знать, что каждые полгода у вас есть проверка, которая будет показывать, насколько хорошо вы работаете. И на основе этого, можно сделать выводы – стоит ли вам повышать зарплату или нет. И вы тоже этими выводами сможете оперировать.

Второй наш раздел, о котором мы сегодня хотим поговорить – это, собственно, процесс трудоустройства. Давай поговорим о собеседованиях в крупных компаниях и стартапах. В чем основное отличие?

Евгения: Основное отличие все-таки в требованиях и в том, что спрашивают. То есть со стартапами – это совсем непредсказуемая история. С одной стороны, вы можете нарваться на выходцев из крупных IT-компаний, которым не давали спуска на собеседовании, и которые под копирку привыкли у всех входящих спрашивать алгоритмы. Но в целом стартапы больше все-таки ориентируются на тот опыт, который у вас уже был, то есть больше на практику – что вы уже реализовывали, что вы уже умеете, в чем вы уже навострились, и можно ли вас быстро подключить к тем задачам, которые есть, потому что все горит, и нужно делать. Плюс еще, действительно, смотрят на то, сколько у вас гибкости, то есть сможете ли вы быстро влиться в развитие проекта.

С крупными компаниями все довольно стандартно. Им нужно, чтобы вы знали и хорошо разбирались с теорией – это алгоритмы, структуры данных, платформы, код на листочке и все, что мы “очень любим делать”. Ну, в кавычках, конечно.

Денис: А вообще крупные компании хантят просто разработчиков, software engineers? Или они все-таки редко когда так делают, и в большинстве своем, если человек хорошо знает Android, то они его берут на Android?

Евгения: Если смотреть на глобальный мировой рынок – в мире есть команды в крупных компаниях, в которых разработчики такие универсальные солдаты, которые действительно software engineers. И они могут и бэк, и под мобилу, и под фронт, и вот куда их ни посади, они смогут примерно все написать.

У нас же все-таки больше специфики. И если мы понимаем, что нам нужен мобильный разработчик, мы и будем брать мобильного разработчика, с бэкграундом мобильного разработчика.

Многие компании готовы действительно переучивать. Например, сейчас есть ребята, которые были ксамаринщиками, но они хотят перейти, например, в iOS или в Android. У них хорошая теоретическая база, они прекрасно пишут код на C#. Но это очень редкие истории. Обычно все-таки работодатели хотят, чтобы у вас уже был опыт, и чтобы вы подтверждали свою квалификацию, подтверждали финансовые ожидания своими навыками. Хотят, чтобы вы, так или иначе, имели опыт и понимали, что как работает.

Александр: Я довольно часто смотрю резюме, потому что занимаюсь постоянно наймом. И когда ты видишь, что в резюме Xamarin или другие кроссплатформенные фреймворки, то это часто очень демотивирует. То есть я даже могу посоветовать, наверное, не указывать это в первую очередь. Например, если вы еще и гуру Xamarin, кроме того, что хорошо шарите в Android, то, наверное, лучше его немного придержать. Или рассказать об этом на непосредственном собеседовании, когда вас позовут и вы уже докажете свою квалификацию, потому что, к сожалению, так часто получается, что когда человек занимается и тем, и другим, когда у него очень-очень много баззвордов написано, то на самом деле он не знает ничего нормально. Но это у меня такое ощущение сложилось, по тому, насколько я с кандидатами общался.

Евгения: Я могу только поддержать. И здесь многих действительно Xamarin и кроссплатформенность будут отталкивать, потому что на рынке очень много сейчас нативной разработки, и на нее идет основная упор. В целом ребята, которые сейчас кроссплатформенные разработчики, ксамаринщики, я их вижу очень редко. Я вижу в основном уже таких ребят, у которых эта история в прошлом, но у них действительно не всегда хорошая бывает настоящая нативная база. Они могут хорошо разбираться в платформе, они очень хорошо пишут код на C#, как правило, но как только ты начинаешь копать в Java или в Objective-C, или в Swift, или во что-то еще, то у них начинаются очень большие пробелы, с которыми не всегда готовы мириться текущие команды.

Денис: Человек определился с компанией, или его пригласили. У него есть собеседование в аутсорс-компанию, и есть в продуктовую компанию. Какая разница в собеседовании в аутсорс и в продукт будет?

Евгения: На мой взгляд, здесь разница именно в подходах – ребята из продуктовой разработки ждут, что ты в продуктах ориентируешься, что тебе не все равно на твоих пользователей, ты действительно болеешь за продукт, ты трясешься над всем фидбэком, ты постоянно думаешь, как улучшить свой продукт, ты начинаешь уже тоже постепенно смотреть на приложение со стороны бизнеса и со стороны того, как оно развивается.

В аутсорсе все-таки немножко более отстраненное отношение. И там очень важна скорость. И очень часто в аутсорсе бывают тестовые задания, чтобы посмотреть, насколько быстро ты справляешься с задачей, и как вообще ты работаешь в формате дедлайнов, когда тебе сегодня в 11 прислали, а завтра, чтобы к вечеру оно уже было. Смотрят, на какие вещи ты обращаешь внимание, какие вопросы задаешь. То есть здесь, скорее, аутсорс хочет скорости, много скорости. И частая смена проектов, тоже это нужно учитывать, и ребят к этому готовить.

Александр: Можно посоветовать, если вы собеседуетесь в продукт, то у вас могут спросить обязательно: «Что в нашем продукте не так? Что вы считаете нужным улучшить?» и т.д. Если вы идете собеседоваться в продуктовую компанию, то обязательно посмотрите их приложения, сервисы.

Денис: Да, обязательно попробуйте приложения и продукты перед тем, как идти, однозначно. Это правда. Мы до этого обсуждали кроссплатформенный Xamarin. А можно еще пару слов про React Native? Мне кажется, если у человека опыт React Native, то нужно понять — он вообще больше web-разработчик, фронтенд, или он все-таки больше из мира мобильного, с мобильным бэкграундом, потому что если у него опыт React Native, то, скорее всего, это выходец из web.

Евгения: Да, все так. Здесь я даже мало что смогу добавить. У рынка очень большой запрос на нативную разработку, пока что без React Native. То есть да, он появляется, но пока что объемы сравнительно небольшие

Мы, рекрутеры, смотрим и не всегда бывает понятно. React Native для нас пока что еще это про фронтенд история, не про мобилку.

Александр: Я ребят попросил, что бы они выбрали, какие баззворды чаще всего встречаются для Android-разработчика. И вот, как ни странно, в них нет ни Flutter, ни React Native. В основном это всякие RX, Java, Android, Git.

Евгения: Я сегодня посмотрела: Flutter на LinkedIn в России сейчас у шести человек написан, на Хедхантере у других тоже у шести человек написан. Вакансий с Flutter вообще ни одной еще нет. Технология новая, оно и понятно. Так что кажется, что это такие действительно очень редкие технологии, которых на рынке практически еще нет.

Денис: Я еще хотел сказать про кроссплатформенные приложения.

Когда мы смотрим человека с React Native, то ощущения примерно такие же, как и с Xamarin — лучше постесняться. И вообще любой нативщик считает любую кроссплатоформу чем-то за гранью добра и зла. Поэтому отношение у тех, кто собеседует, к кроссплатформе не самое благоприятное. Имейте это в виду. Возможно, часто это необъективно. Но если не хотите добавить лишнюю отрицательную оценку, то лучше не пишите об этом.

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

Евгения: Давай брать глобальную историю все-таки. Здесь разные абсолютно подходы могут быть. Понятно, что пункт номер один для всех ребят, которые хотят попробовать поработать не с рынком СНГ – это английский на уровне Fluent. Вот однозначно это самый первый скил, который будут проверять, и нужно много уметь разговаривать на английском, и разговаривать хорошо. Нужно для себя принять, что это в России ты можешь быть звездой, и тебя может знать каждый второй разработчик, и ты можешь быть супер классным. Но когда ты выходишь за пределы СНГ, ты встаешь уже в соревнование с немножко другим потоком людей, и таких как ты там довольно много. Поэтому рекруты того же самого, например, Google, все равно будут обращать внимание на ключевые вещи.

Это и образование, чтобы был ВУЗ, который входит в топ-100 мировых. И предыдущие компании. Не все компании захотят с вами разговаривать, если они никогда раньше не видели продуктов этой компании за пределами России. Вы можете делать бесконечно прекрасный продукт в какой-нибудь компании «Цветочки» в какой-нибудь Перми. Если про этих «Цветочки» никто нигде не знает за пределами России, то, скорее всего, многие компании даже не заходят с вами разговаривать, потому что для них нужно понимать, что у вас, грубо говоря, мозги на месте. В компаниях, условно, типа Яндекса, есть хорошая школа разработки, и всю дурь из всех уже выбили к тому моменту, как ребята оттуда собираются уходить.

Если для вас было тяжело проходить все секции по алгоритмам в некоторых наших русских компаниях, то здесь с этим нужно просто смириться, потому что это будет базовый пункт, с которым вы столкнетесь в большинстве крупных компаний на глобальном рынке. Алгоритмы, структуры данных, умение писать код без ошибок – здесь можно это все помножить просто на десять…

Денис: Я должен тоже немножко добавить.

Ребята, не бойтесь ничего. Женя вас чуть-чуть напугала, что Fluent английский должен быть. Я все-таки, как уехавший и общающийся с большим количеством ребят, которые уехали, могу добавить, что язык – да, очень важен, но даже если вы плохо разговариваете, но вы топ-кодер, решаете задачи на лету, у вас очень сильное резюме, вы работали в каком-то очень крутом проекте, с какой-то очень узкой, но очень важной потенциальному работодателю технологией, даже без языка вас заберут.

Заберут и будут с вами на пальцах общаться через Google Translate, потому что вы нужны, потому что таких, как вы, нету.

Если вы более заурядны, по вашей собственной оценке, то, конечно, делайте акцент на язык и решайте задачи. Практически все за рубежом, даже маленькие компании, больше спрашивают задачи. Да и в России тоже уже стали достаточно много спрашивать задач алгоритмических. Поэтому алгоритмы – наше все. Покупайте книжки по подготовке. Не бойтесь этих задачек. А, может быть, вы уже в ВУЗе много занимались, вы – олимпиадник. И это тоже вам очень сильно на руку. Но и это, опять же, не обязательно. Как карта ляжет. Возможно, вы супер просто без английского и без алгоритмов попадете в какой-нибудь блокчейн-стартап “Что-то там LLC” там на Кипре. И будете с русскими общаться, никогда не пересекаясь с иностранцами, но живя за границей. Такое вполне вероятно и с более дальними странами.

Мастер Йода рекомендует:  Wolfram открыла доступ к своему репозиторию нейронных сетей

А сейчас давай поговорим про ожидания работодателей на разные позиции, на разные грейды. Во-первых, расскажи про грейды. Они такие же классические или какие-то особенные у каких-то компаний? И что там за ожидания?

Евгения: В ожиданиях все довольно очевидно, в грейдах тоже формально все так и бьется: джуны, мидлы, сеньоры, лиды — и стандартная сетка пошла. Другой вопрос, что все компании по-своему строят систему грейдов. Во многом все грейды построены на костяке сотрудников, который у них работал на момент, когда эти грейды строились, и условно, взяли команду, поняли, что вот это у нас сеньоры, это мидлы, это джуны, и всех входящих уже оценивают именно по этой системе. Нормальная ситуация, когда ты приходишь в одну компанию Х, и тебя там оценивают на такого хорошего мидла, который практически уже перешел в сеньоры. А для другой компании по знаниям, по опыту ты хороший уверенный джун, но не более того. Это нормально. Универсальных каких-то грейдов на рынке нет, но есть глобальное понимание, что компании хотят, и что они ждут от тех, кто к ним приходит.

То есть понятно, что от джунов все хотят видеть какую-то базу. Так или иначе, в разных компаниях представление базы, оно примерно одинаковое – как получить данные с сервера и сохранить их на устройстве, то есть какие-то совсем банальные вещи, плюс еще какое-то базовое знание алгоритмов, структур данных.

Понятно, что когда работодатель берет джуна, это значит, что у них есть мидл, который будет за этим джуном очень много следить. Либо это будет вся команда, либо один единственный человек, но вот с этим джуном будут отчасти за ручку ходить и следить, как он что делает.

С мидлами уже еще посложнее — понятно, что у мидлов тоже должна быть эта хорошая теоретическая база. Она должна сохраняться, она никуда не будет деваться. И дальше уже хотят видеть опыт проектов, которые уже закончены, примеры кода. Да, у него, может не будет какого-то опыта в других частях, но уже какую-то одну тему он изучил, и изучил хорошо. И человек уже более-менее умеет командную работу. Его все равно нужно будет ревьюить, направлять, но он уже потребует гораздо меньше трудозатрат, чем джуниор-специалист. Его можно посадить, он будет работать, что-то делать.

А с сеньорами, соответственно, все вышеперечисленное, но при этом очень много самостоятельности и умение уже писать приложения с нуля, так или иначе, чтобы в опыте это уже было, и плюс уже множество «шишек», которые человек набил за время своего опыта. Потому что сеньоры – это, как правило, ребята, которые в разработке от трех лет, а то и больше. И понятно, что они сталкивались с очень многими проектами, с очень разными заказчиками, структурами и всем остальным. Им есть что рассказать. И они спокойно приходят на проекты, они уже видят, какая там архитектура, они понимают, что делать. И, по сути дела, ты им даешь задачу, и можно дальше уже не мучиться вообще, в принципе.

От лидов бизнес уже хочет какой-то опыт менторства джунов хотя бы (если мы говорим о лидах, которые без опыта работы, то есть это такие хорошие сеньоры, которые хотят уже лидами стать). Либо это уже уверенные лиды, у которых были команды в подчинении, хотя бы от трех человек, если это совсем маленькое что-то. Тут ребята много смотрят на понимание бизнеса, умение работать с продуктовым направлением и с продуктовыми аналитиками, и с продакт-менеджерами и т.д… И умение договариваться с бизнесом, и понимание вообще, как продукт строится, какие бизнес-процессы, куда что идет.

Денис: Тут еще нужно отметить то, что лид – это не то, чтобы прям ступенька над сеньором. Некоторые ребята не хотят это делать или не умеют. И это нормально вполне.

То есть они становятся хорошими техническими экспертами. А вот лид – это просто немножко шаг в сторону, шаг к управлению. Еще хочу отметить то, мидлы как раз должны знать теоретическую базу полностью, наверное, и у них должен быть хороший опыт. То есть мидл, по сути – это такая боевая единица, и она обычно в компаниях составляет основную силу такую вот пробивную. А сеньоры – это уже когда он может что-то доресечить, что-то куда-то закопаться. Вот так, наверно, я бы разграничивал.

Евгения: Еще важно же понимать, что мидл мидлу рознь, есть ребята, которые только, грубо говоря, начинающие мидлы, кто-то – законченный. И здесь я просто больше имела в виду ситуации, когда, ну, бывает такое, что человек сидел, три года одно приложение делал. Он действительно хороший мидл, но он еще не все умеет, не все знает. И это тоже нормально. То есть он боевая единица, но ему тоже нужно где-то качаться, еще в каких-то областях расти.

Александр: Нужно отметить: у мидлов часто есть такой синдром сеньоров, то есть часто сеньоры считают себя мидлами, а мидлы – наоборот, сеньорами. Когда они приходят на собеседование — это типичная ситуация. Человек сидел три года, занимался своим проектом. И вот он вроде все делает, все фичи, которые ему приходят, он их реализует довольно быстро. Он приходит на собеседование, и при этом не подготовился, потому что он считает: «Я уже сеньор». И при этом у него, получается, такая не очень хорошая теоретическая база, и он очень сильно валится. Поэтому, если вы чувствуете себя таким мидлом, почти сеньором, то перед собеседованием обязательно повторите теорию, потому что могут неплохо завалить.

Евгения: Здесь соглашусь. Я действительно встречаю очень много ребят, которые валятся на каких-то элементарных базовых вещах. Причем очень странно. У ребят очень богатый уже опыт реализации чего-то, но при этом, действительно, на всех собеседованиях очень хорошо копают в теоретическую базу. И, в принципе, я и говорила, что начиная с джунов нужна хорошая теоретическая база. Ее спрашивают на всем протяжении вашего карьерного пути. То есть ее ни в коем случае нельзя забывать, ее нужно качать, и очень много качать.

Денис: Да. Послушайте наш выпуск про то, что нужно знать интернет-разработчикам на собеседованиях. У нас тоже было, по-моему, даже два выпуска «Что нужно знать новичкам?». Там прям мы все пункты обходили.

Дальше у нас подготовка к интервью. Мы уже проговорили, что нужно порешать задачки, повторить теоретическую базу, попросить товарища, чтобы он вас пособеседовал, коллегу по профессии. Потому что ничего нет лучше интервью. Особенно если вы на английском интервью готовите, попросите русскоговорящего товарища по-английски вас погонять. А если есть иностранец, то это вообще идеально. И это очень сильно поможет. И вы сразу с ним пройдете и посмотрите, что было не так, что так. А если запишете и посмотрите, вообще придете к совершенству потом на реальном собеседовании. Что вы еще, Жена, Саша, добавите?

Александр: Я еще посоветую перед тем, как идти в компанию своей мечты, куда вы там хотите пойти, сходите на какое-нибудь пробное собеседование. Вы сходите, и вам сразу же подсветят какие-нибудь там слабые места. Не так, что вы готовились полгода, год и пошли потом на собеседование. Нет. Но делайте такой итерационный процесс. Сначала пойдите вот в компанию, в которую вы никогда не пойдете, или с малой долей вероятности пойдете. А вот уже потом только вот в компанию мечты.

Денис: Да. Может быть, вы еще потом в эту компанию работать пойдете. Она окажется не такой уж и плохой. А компания вашей мечты вам откажет или вам не понравится. Вообще будьте осторожны со словами «компания мечты», потому что вы начнете ее бояться, бояться идти в нее собеседоваться и думать, что там все идеально, приукрашивать, а все остальные компании – недооценивать И как раз вот собеседование в других компаниях в качестве подготовки откроет вам глаза на многое.

Евгения: Я тут, скорее, добавлю именно, что когда будете прогоняться по техническим вопросам, не забудьте еще о себе хорошо, бодро кому-нибудь рассказать. Сначала подготовить, соответственно, какой-то self-speech о себе, о своем опыте. Он не должен быть большим, краткий, но его хорошо лучше оттренировать заранее, проговорить пару раз перед зеркалом, предварительно написав еще к тому же (это вообще в идеале). И потом уже дальше рассказать маме, еще лучше – бабушке, которая вообще не понимает в том, чем вы занимаетесь.

Александр: Еще лучше – коту.

Евгения: Пятилетнему ребенку. Ну, с котом сложно. Он не будет тебя спрашивать о том вообще «Что? Какой дагер? Чего происходит вообще?». Там не будет такого. Лучше всего найти небезразличных родственников. И плюс еще, действительно, возможно, стоит куда-то сходить, потренироваться, потому что с компанией мечты сложно. Но здесь еще хочется понимать, что можно, конечно, прийти в какой-нибудь сомнительный непонятный проект пособеседоваться, но это будет совершенно другого уровня вопросы.

В каком-то плане вас это расслабит, и вы уже не будете так сильно бояться собеседоваться. Но с другой стороны, если компания мечты спрашивает по полной, то компания уровня мидл и ниже просто вам не так сильно пробелы устранит.

Крупняки, как правило, пишут о себе, что они вообще спрашивают на собеседованиях, разбирают задачки, еще что-то делают. Стоит почитать и еще спросить у тех, кто недавно туда ходил собеседоваться, не изменилось ли что-то, за полгода. Может быть что-то устарело.

Александр: А еще можете прямо смело спросить: «Что мне нужно знать вообще на собеседовании?». Может, даже сработает. Если бы меня спросили «Саша, что нужно, чтобы попасть в Хедхантер?», я бы сказал: «Изучите вот то, то, то». Это никакой не секрет, что я буду спрашивать. Главное, чтобы человек в этом ориентировался, и когда я копну в глубину, тоже все это понимал.

Евгения: Еще не нужно бояться. Иногда бывает, что ты говоришь человеку: «Тебе, чтобы хорошо пройти, нужно знать вот это, вот это и вот это». Человек уходит, на следующий день возвращается и говорит: «Нет. Спасибо. Давайте через полгода. Я немножко не могу». Он начинает бояться. И тут все-таки я бы сказала: не бойтесь пробовать. Большинство компаний понимает, что ставить крест на разработчиках, если кто-то с первого раза не прошел интервью, это вообще плохая история. Есть ребята, которые в некоторые компании заходят с четвертого раза просто потому, что, наконец, научились нормально отвечать на вопросы.

Денис: А есть какая-то средняя статистика, через сколько компании готовы рассмотреть того же кандидата повторно, если он подготовился и стал более уверенным?

Александр: Ты знаешь, в среднем, наверно, полгода-год.

Евгения: Тут есть ремарка одна большая. Можно ходить куда угодно раз в год. Каждый год мы с ребятами ходим в баню… Сколько угодно. Но если у вас за этот год ничего не изменилось, вы не отработали все те вопросы, которые у вас спрашивали… Условно, если вы хотите через полгода снова вернуться в компанию Х — подумайте, вы на те же вопросы, на которых вы завалились, ответите или нет? Если нет, лучше не идти. Как рекрутер могу сказать: мы смотрим еще на то, что произошло за эти последние полгода. Мы действительно спрашиваем: «А что ты делал, чтобы подтянуться?». Мы смотрим, перешел ли человек в какую-то другую компанию. То есть год назад он у нас был, за этот год он сменил место работы. Мы прекрасно знаем, какие на новом месте разработчики. Бывают ситуации, что человек вроде бы перешел в другую компанию, и вроде там ничего, но ты знаешь, как там устроено, и для тебя у него не появилось ответов на старые вопросы. То есть то, что он сменил место работы, на него никак особо не повлияло, на его знания.

Если он действительно пошел, поучился, попроходил курсы на Coursera, поступил в школу Яндексовую, еще что-то сделал — да, скорее всего у него база сдвинулась с мертвой точки. Если он, условно, был в регионе, а сейчас вышел в СберТех, в Москву переехал, то, скорее всего, тоже что-то изменилось. Если за год ничего кардинально не менялось, он просто решил попробовать еще раз, скорее всего это провальная будет попытка.

Денис: Это правда. Женя, а у тебя есть какой-то чек-лист для подготовки к собеседованию?

Евгения: Зависит от компании. Как правило, универсального чек-листа нет, они слишком индивидуальны. Есть понятная база, алгоритмы, структуры данных, платформы, какие-то направляюще вещи по тому, что там внутри спрашивают. Но по сути, действительно, в каждой компании все по-разному. Есть компании, которые просто элементарно так спрашивают технические вопросы, проверят, что ты шаришь и соображаешь, а дальше начнут копать в мотивацию и в то, что ты знаешь о компании. И здесь получается, что нужно готовить их к этому моменту много.

Денис: Тут надо сказать, что в интернете очень много чек-листов – что нужно знать там по платформе, например. Если мы говорим про Android, то откройте эти листы и посмотрите. А дальше уже ваш скилл будет определяться глубиной знаний по каждой из тем.

Евгения: Тут я честно даю всем совет — обратитесь к рекрутеру, либо к кому-то из знакомых, кто работает в компании, спросите, что спрашивают на интервью, и как они проходят. И по этой информации уже готовьтесь. Многие компании вообще, в принципе, пишут в открытую, что они спрашивают, к чему именно готовиться, какие аспекты повторять. Пользуйтесь этим.

Александр: Поход на собеседование – это, в принципе, такая же проектная деятельность. Сначала вы в ней не очень хорошо разбираетесь, а со временем начинаете шарить лучше. Поэтому не бойтесь ходить просто на собеседования, это отличная подготовка боем. Но при этом, если вы ничего не знаете, ничего не повторяли, то можно неплохо опозориться.

Вопросы, которые могут задать разработчику мобильных приложений на собеседовании.

Рост популярности мобильных приложений увеличивает потребность в разработчиках на разнообразных платформах. Компании ищут кандидатов на должность со знанием, по крайней мере, одного (но обычно больше) языка разработки мобильных приложений, таких как, Objective C и Xcode для iPhone , Java для Android , HTML , CSS и Java для Blackberry , C # и . NET для Windows mobile , и C / C + + для Palm .

На интервью будьте готовы к следующим вопросам:

Вы когда-нибудь разрабатывали приложение, которое в настоящее время существует в iTunes или Android маркете?

Продемонстрировать ваш опыт самым достоверным способом можно с помощью вашего собственного приложения на одном из мобильных store . Если вы это сделаете, то это прямое доказательство, что вы знаете не только разработку мобильных приложений, но и процесс добавления в iTunes или другие онлайн магазины.

Расскажите о приложениях, над которым вы работали последнее время, и степени вашей вовлеченности в этот процесс.

Даже если вы разработали всего лишь одно приложение, вам надо рассказать о задачах, которые вы выполняли в предыдущих проектах. Объясните свою роль в данном процессе разработки, включая различные прикладные платформы, над которыми вы работали, методологии, управление данными, алгоритмы итд.

В чем заключается важность пользовательского интерфейса ( UI ) в разработке мобильных приложении?

Подобные вопросы: Расскажите, как вы проектируете пользовательские интерфейсы ( UI ) для мобильных приложений.

Пользовательский интерфейс является ключевым компонентом успешных мобильных приложений, следовательно, ожидайте множество вопросов в этой области.

Чтобы работать исключительно хорошо, разработчик должен понимать пользователя и создавать великолепный интерфейс.

Уточняющий вопрос: Расскажите, как вы разрабатываете и проектируете мобильное приложение, чтобы оно было удобным и интуитивно понятным в использовании.

Расскажите о своем опыте миграции (портирования) мобильных приложений на другие платформы.

Подобный вопрос: Как вы пишете мобильные приложения для различных размеров экрана?

Разработчики мобильных приложений должны знать не только различные языки для мобильных платформ, но, а также, и как портировать приложение на различные платформы.

Продемонстрируйте, как вы будете проектировать определенное приложение.

Некоторые интервьюеры просят кандидатов схематически изобразить или обрисовать в общих чертах, как они собираются проектировать определенное приложение. Обычно просят придумать один или два экрана и набросать их на бумаге, чтобы понять процесс мышления и сообразительность.

Как вы гарантируете безопасность данных на мобильном телефоне?

Подобные вопросы: Когда вы создаете такие приложения, например мобильный банк , как вы гарантируете защиту данных, если человек потеряет телефон?

Вы должны быть готовы поговорить об общей безопасности для мобильных устройств, например, шифрование данных, аутентификация подлинности и другие способы, с помощью которых вы будете защищать конфиденциальную информацию.

Работа с памятью в мобильном приложении

Подобные вопросы: Как вы идентифицируете утечку памяти в мобильном приложении? Когда приложение читает данные и хранит их в памяти? Как долго и почему?

Взаимодействие мобильных приложений с «железом» мобильных устройств?

Подобные вопросы: Как вы захватываете звук с микрофона? Как вы работаете с GPS ? Как вы взаимодействуете с мобильной камерой?

Анимация для мобильных устройств, используя анимированный GIF ?

Каково фундаментальное понятие анимации для мобильных приложений?

Как вы пишете приложения для различных размеров экрана?

Как вы заставляете ваше приложение взаимодействовать с «облачной базой данных» (cloud database)?

Как вы осуществляете связь между SSL- сервером и мобильным приложением?

Разрабатывая мобильное приложение, как вы его тестируете?

Интересные и сложные вопросы по Andro > android, собеседование

Может кто здесь сможет подсказать действительно интересные вопросы, которые можно задать сильному кандидату на знание Android-разработки?

Терпеть не могу всякий шлак, вроде «цикл жизни Activity». Эти вопросы в реальности показывают только то, что кандидат зазубрил соответствующий документ. Поэтому хочется задавать действительно интересные и необычные вопросы на подумать, поразмышлять и, при этом, связанные со спецификой Android и java для него.

Перемещено mono из talks

Как увеличить время работы от батареи.

1) Оторвать экран
2) оторвать радиомодули
3) не включать
4) увеличить ёмкость батареи
5) изменить единицы измерения времени

И ещё сотни и сотни других очевидных вариантов:)

Зачем были введены фрагменты и почему нельзя было обойтись Custom View?

Как это всё сделать программно?


Уверен, что выключить подсветку экрана или обесточить радиомодули можно и программно 🙂
Ладно, не мешаю — мне всё равно по теме сказать нечего.

Ситуация: заведен будильник в AlarmManager’е, потребовалось его отменить. На первый взгляд не проблема: вызываем у соответствующего PendingIntent’а cancel. Будильник не отменяется. Кто виноват и что делать?

Есть сервис в отдельном процессе, использующий нативную библиотеку. Сервис биндится к активити с флагом BIND_AUTO_CREATE. В библиотеке происходит сегфолт, процесс падает, активити получает onServiceDisconnected. Сервис поднимается (AUTO_CREATE же), снова сегфолт. Сервис больше не поднимается (несмотря на AUTO_CREATE). Кто виноват и что делать? Как убрать диалоговое окно «приложение упало» чтобы не нервировать пользователя ненужной информацией (да, библиотека падучая, и с этим ничего не сделать).

И более общий вопрос: расскажите о нелогичностях и подводных камнях в Андроид-разработке которые вам встречались?

14 шаблонов, которые помогут ответить на любой вопрос по коду на собеседовании

Разработчики проводят недели, анализируя сотни вопросов для интервью на сайтах вроде LeetCode. Одна из наиболее распространённых причин беспокойства перед интервью: достаточно ли я прорешал практических заданий? Мог ли я сделать больше?

Вот почему я стараюсь помочь разработчикам понять шаблоны, лежащие в основе каждого вопроса. Если вы поймёте эти 14 шаблонов, то сможете использовать их для решения множества задач. Я расскажу, как определить подходящий шаблон, и дам несколько примеров для каждого. Но это всё довольно поверхностно — я настоятельно рекомендую изучить Grokking the Coding Interview: Patterns for Coding Questions для пояснений, примеров и практики.

Предполагается, что вы разбираетесь в структурах данных. Если нет, ознакомьтесь с этими курсами повышения квалификации по структурам данных или загляните в наш раздел по алгоритмам и структурам данных.

14 шаблонов, которые мы рассмотрим сегодня:

  1. Скользящее окно.
  2. Два Указателя или Итератора.
  3. Быстрые и медленные Указатели или Итераторы.
  4. Слияние интервалов.
  5. Циклическая сортировка.
  6. Разворот связанного списка.
  7. Дерево BFS.
  8. Дерево DFS.
  9. Две кучи.
  10. Подмножества.
  11. Модифицированный бинарный поиск.
  12. Топ К-элементов.
  13. K-way слияние.
  14. Топологическая сортировка.

1. Скользящее окно

Шаблон скользящего окна используется для выполнения операции с определённым размером окна данного массива или связанного списка, например для поиска самого длинного подмассива, содержащего все 1. Скользящие окна начинаются с 1-го элемента, продолжают смещаться вправо на один элемент и регулируют длину окна в соответствии с задачей, которую вы решаете. В некоторых случаях размер окна остаётся постоянным, а в других — увеличивается или уменьшается.

Как определить, когда использовать шаблон скользящего окна:

  • входные данные задачи — это линейная структура данных, например связанный список, массив или строка;
  • нужно найти самую длинную/короткую подстроку, подмассив или желаемое значение.

Задачи, для которых подойдёт шаблон скользящего окна:

  • максимальная сумма подмассива размера «K» (лёгкий);
  • самая длинная подстрока с различными «K» символами (средний);
  • анаграммы строки (сложный).

2. Два Указателя или Итератора

Это шаблон, в котором два указателя перебирают структуру данных в тандеме, пока один или оба указателя не достигнут определённого условия. Два указателя часто полезны при поиске пар в отсортированном массиве или связанном списке. Например, когда нужно сравнить каждый элемент массива с другими его элементами.

С одним указателем пришлось бы постоянно возвращаться назад через массив, чтобы найти ответ. Так же, как и с одним итератором, это неэффективно для временной и пространственной сложности — концепции, называемой асимптотическим анализом. Хотя решение в лоб с одним указателем будет работать, его сложность — около O (n²). Во многих случаях два указателя помогут найти решение с лучшей временной и пространственной сложностью.

Как определить, что подойдёт шаблон двух указателей:

  • вы имеете дело с отсортированными массивами (или связанными списками), и вам необходимо найти набор элементов, которые удовлетворяют определённым ограничениям;
  • набор элементов в массиве представляет собой пару, триплет или даже подмассив.
Мастер Йода рекомендует:  Как дела у Go и так ли популярен Python, как кажется — тренды языков программирования

Задачи, для которых подойдёт шаблон двух указателей:

  • возведение в квадрат отсортированного массива (лёгкий);
  • триплеты, суммирующие до нуля (средний);
  • сравнение строк, содержащих пробелы (средний).

3. Быстрые и медленные указатели

Подход быстрого и медленного указателя, также известный как алгоритм зайца и черепахи, использует два указателя, которые перемещаются по массиву (или последовательности / связному списку) с разными скоростями. Этот подход полезен при работе с циклически связанными списками или массивами.

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

Как определить, когда использовать шаблон быстрого и медленного указателя:

  • задача касается цикла в связанном списке или массиве;
  • нужно узнать положение определённого элемента или общую длину связанного списка.

Когда использовать его вместо двух указателей?

  • В некоторых случаях не следует использовать шаблон Двух указателей, например в одном списке, где вы не можете двигаться в обратном направлении. Использовать этот шаблон нужно, когда вы пытаетесь определить, является ли связанный список палиндромом.

Задачи, для которых подойдёт шаблон быстрого и медленного указателей:

  • цикл связанного списка (лёгкий);
  • является ли связанный список палиндромом (средний);
  • цикл в круговом массиве (сложный).

4. Слияние интервалов

Эффективный метод работы с пересекающимися интервалами. В большинстве задач, связанных с интервалами, нужно либо найти пересекающиеся интервалы, либо совместить интервалы, если они пересекаются. Шаблон работает так:

Для двух интервалов («a» и «b»), есть два способа, которыми эти интервалы могут быть связаны друг с другом:

Понимание этих шести случаев позволит решить широкий спектр задач — от вставки интервалов до оптимизации слияний интервалов.

Как определить, что подойдёт шаблон слияния интервалов?

  • нужно составить список только с взаимоисключающими интервалами;
  • вы слышите термин «пересекающиеся интервалы».

Задачи, для которых подойдёт шаблон слияния интервалов:

  • пересечение интервалов (средний);
  • максимальная нагрузка на процессор (сложный).

5. Циклическая сортировка

Интересный подход для решения задач, которые связаны с массивами, содержащими числа в заданном диапазоне. Шаблон циклической сортировки выполняет итерацию по массиву по одному числу за раз, и если текущее число, которое вы перебираете, не соответствует правильному индексу, вы меняете его местами с числом по правильному индексу. Можете попытаться поместить число, с которым мы поменяли текущее число, в правильный индекс, но это приведет к сложности O (n²), поэтому больше подойдёт метод циклической сортировки.

Как определить, когда использовать шаблон циклической сортировки:

  • в задачах с использованием отсортированного массива с числами в заданном диапазоне;
  • если нужно найти отсутствующее/дублированное/наименьшее число в отсортированном/повёрнутом массиве.

Задачи, для которых подойдёт шаблон циклической сортировки:

  • найти недостающий номер (лёгкий);
  • найти наименьшее недостающее положительное число (средний).

6. Разворот связанного списка

Вас могут попросить инвертировать связи между набором узлов связанного списка. Часто это нужно сделать на месте, то есть используя существующие объекты узла и не используя дополнительную память.

Шаблон меняет местами только один узел, начиная с одной переменной (current), указывающей на головной элемент связанного списка, а другая переменная (previous) будет указывать на предыдущий узел, который вы обработали. Шаг за шагом вы развернёте узел, наведя его на предыдущий, прежде чем перейти к следующему узлу. Кроме того, вы обновите переменную previous, чтобы всегда указывать на предыдущий узел, который вы обработали.

Как определить, когда использовать шаблон разворот связанного списка:

  • если вас попросили развернуть связанный список без использования дополнительной памяти.

Задачи, для которых подойдёт шаблон разворот связанного списка:

  • перевернуть подсписок (средний);
  • перевернуть каждый K-элемент подсписка (средний).

7. Дерево BFS

Этот шаблон основан на методе поиска в ширину (BFS) для обхода дерева и использует очередь для отслеживания всех узлов уровня перед переходом на следующий уровень. Любая задача, связанная с обходом дерева в поэтапном порядке, может быть эффективно решена с помощью этого подхода.

Дерево BFS работает, помещая корневой узел в очередь, а затем непрерывно повторяясь, пока очередь не станет пустой. Для каждой итерации мы удаляем узел в начале очереди и «посещаем» этот узел. После удаления каждого узла из очереди мы также вставляем все его дочерние элементы в очередь.

Как определить, когда использовать шаблон дерево BFS:

  • вас просят обойти дерево поэтапно (или поуровнево).

Задачи, для которых подойдёт шаблон дерево BFS:

  • поуровневый обход двоичного дерева (лёгкий);
  • зигзагообразный обход (средний).

8. Дерево DFS

Дерево DFS основано на методе поиска в глубину (DFS) для обхода дерева.

Можете использовать рекурсию (или стек для итеративного подхода), чтобы отслеживать все предыдущие (родительские) узлы при обходе.

Дерево DFS работает начиная с корня дерева. Если узел не является листом, нужно сделать две вещи:

  1. Решить, обрабатывать ли текущий узел сейчас (прямой обход), между обработкой двух дочерних элементов (центрированный обход) или после обработки обоих дочерних элементов (обратный обход).
  2. Сделать два рекурсивных вызова для обоих потомков текущего узла, чтобы обработать их.

Как определить, когда использовать шаблон дерево DFS:

  • вас просят совершить прямой, центрированный или обратный обход дерева;
  • требуется найти что-то, где узел ближе к листу.

Задачи, для которых подойдёт шаблон дерево BFS:

  • сумма номеров путей (средний);
  • все пути для суммы (средний).

9. Две кучи

Во многих задачах дан набор элементов, которые можно разделить на две части. Чтобы решить задачу, нужно знать наименьший элемент в одной части и наибольший в другой.

Этот шаблон использует две кучи: Min Heap, чтобы найти самый маленький элемент, и Max Heap, чтобы найти самый большой. Шаблон работает, сохраняя первую половину чисел в Max Heap, потому что вы ищите наибольшее число в первой половине. Затем вы сохраняете вторую половину чисел в Min Heap, так как хотите найти наименьшее число во второй половине. В любой момент медиана текущего списка чисел может быть вычислена из верхнего элемента двух куч.

Как определить, когда использовать шаблон две кучи:

  • приоритетные очереди, планирование;
  • нужно найти самые маленькие / самые большие / медианные элементы набора;
  • иногда полезен в задачах с бинарной структурой данных.

Задачи, для которых подойдёт шаблон две кучи:

  • найти медиану потока чисел (средний).

10. Подмножества

Огромное количество задач на собеседовании связано с перестановками и комбинациями заданного набора элементов. Шаблон подмножества описывает эффективный метод поиска в ширину (BFS) для их решения.

Шаблон выглядит так:

Дан набор из [1, 5, 3].

  1. Начните с пустого набора: [[]].
  2. Добавьте первое число (1) ко всем существующим подмножествам, чтобы создать новые подмножества: [[], [1]].
  3. Добавьте второе число (5) ко всем существующим подмножествам: [[], [1], [5], [1,5]].
  4. Добавьте третье число (3) ко всем существующим подмножествам: [[], [1], [5], [1,5], [3], [1,3], [5,3], [1, 5,3]].

Наглядное представление шаблона подмножества:

Как определить, когда использовать шаблон подмножества:

  • нужно найти комбинации или перестановки заданного набора.

Задачи, для которых подойдёт шаблон подмножества:

  • подмножества с дубликатами (лёгкий);
  • перестановки строк при изменении регистра (средний).

11. Модифицированный бинарный поиск

Когда вам дают отсортированный массив, связанный список или матрицу и просят найти определённый элемент, лучшим алгоритмом будет бинарный поиск. Этот шаблон описывает эффективный способ решения всех задач, связанных с бинарным поиском.

Для набора по возрастанию шаблоны выглядят так:

    Сначала найдите середину начала и конца. Простой способ найти середину был бы: m > arr [m >Наглядное представление шаблона модифицированный бинарный поиск:

Задачи, для которых подойдёт шаблон модифицированный бинарный поиск:


  • Бинарный поиск, не зависящий от порядка (лёгкий);
  • Поиск в отсортированном бесконечном массиве (средний).

12. Топ К-элементов

Любая задача, в которой требуется найти самые большие / самые маленькие / частые K-элементы среди данного набора, подпадает под этот шаблон.

Лучшая структура данных для отслеживания K-элементов — куча. Этот шаблон будет использовать кучу для решения задач, связанных с K-элементами одновременно из набора заданных элементов. Шаблон выглядит так:

  1. Вставьте K-элементы в Min-heap или Max-heap в зависимости от задачи.
  2. Выполните итерации по оставшимся числам и, если найдёте число, которое больше, чем у вас в куче, удалите это число и вставьте большее.

Нет необходимости в алгоритме сортировки, потому что куча будет отслеживать элементы для вас.

Как определить, когда использовать шаблон Топ К-элементов:

  • если нужно найти самые большие / самые маленькие / частые K-элементы в данном наборе;
  • если нужно отсортировать массив, чтобы найти верный элемент.

Задачи, для которых подойдёт шаблон Топ К-элементов:

  • топ K-номеров (лёгкий);
  • топ K-частых номеров (средний).

13. K-Way слияние

K-way слияние поможет решить задачи, связанные с набором отсортированных массивов.

Когда вам дают отсортированные K-массивы, вы можете использовать кучу для эффективного выполнения отсортированного обхода всех элементов всех массивов. Можете поместить наименьший элемент каждого массива в Min Heap, чтобы получить общий минимум. После этого поместите следующий элемент из того же массива в кучу. Затем повторите, чтобы сделать отсортированный обход всех элементов.

Шаблон выглядит так:

  1. Вставьте первый элемент каждого массива в Min Heap.
  2. Извлеките самый маленький (большой) элемент из кучи и добавьте в объединённый список.
  3. После удаления наименьшего элемента из кучи вставьте следующий элемент из того же списка в кучу.
  4. Повторите шаги 2 и 3, чтобы заполнить объединённый список в отсортированном порядке.

Как определить, когда использовать шаблон K-Way слияние:

  • задача состоит из отсортированных массивов, списков или матрицы;
  • требуется объединить отсортированные списки или найти самый маленький элемент в отсортированном списке.

Задачи, для которых подойдёт шаблон K-Way слияние:

  • слияние K-сортированных списков (средний);
  • K-пары с самыми большими суммами (сложный).

14. Топологическая сортировка

Топологическая сортировка используется для нахождения линейного порядка элементов, которые зависят друг от друга. Например, если событие «Б» зависит от события «A», то «A» предшествует «Б» в топологическом порядке.

Этот шаблон — простой способ понять методику выполнения топологической сортировки набора элементов.

Шаблон работает так:

  1. Инициализация.
    1. Храните график в списках смежности, используя HashMap.
    2. Для нахождения всех источников используйте HashMap, чтобы сохранить количество степеней.
  2. Постройте график и найдите степени всех вершин.
    1. Постройте график из входных данных и заполните хэш-карту степенями.
  3. Найдите все источники.
    1. Все вершины с «0» степенями будут источниками и будут храниться в очереди.
  4. Сортировка.
    1. Для каждого источника сделайте следующее:
      • добавьте его в отсортированный список,
      • получите все дочерние элементы из графа,
      • уменьшите степень каждого дочернего элемента на 1,
      • если степень дочернего элемента становится «0», добавьте её в очередь источников.
    2. Повторяйте, пока исходная очередь не станет пустой.

Как определить, когда следует использовать шаблон Топологической сортировки?

  • задача связана с графами, которые не имеют направленных циклов;
  • нужно обновить все объекты в отсортированном порядке;
  • есть класс объектов, которые следуют определённому порядку.

Задачи, для которых подойдёт шаблон Топологической сортировки:

  • планирование задач (средний);
  • минимальная высота дерева (сложный).

Интервью по компетенциям (поведенческое интервью по модели STAR)

Надоело спрашивать, почему кандидат уволился с предыдущего места работы? А вот вам интервью по компетенциям — последовательно, по четырем группам вопросов и с примерами.

Вопрос подбора «правильных» людей, думаю, будет стоять всегда — независимо от экономической ситуации, популярности удаленной работы и фриланса, IT-революций в рабочих процессах, эффективности обучения и развития в организациях. Ведь ставки очень высоки: сможет ли человек достойно справляться с задачами на новом месте работы? Можно ли провести собеседование и ответить на этот вопрос уверенно или остается лишь играть в русскую рулетку и надеяться на успешность понравившегося кандидата?

Разные виды интервью и ответы на эти вопросы дают по-разному:

    В ходе биографического интервью рекрутер уточняет, где кандидат работал раньше, какой круг задач решал и почему меняет работу. В итоге — понимает, как можно мотивировать кандидата и какой заинтересованности в конкретной работе от него ждать.

Во время метапрограммного интервью рекрутер пытается определить, какие личностные модели поведения (метапрограммы) свойственны соискателю: стремление или избегание, погруженность в процесс или нацеленность на результат и так далее; и на основании этого полагает, пригоден ли человек к определенному виду деятельности. Похожие задачи решает интервью по психологическим особенностям.

В кейс-интервью (англ. case — случай) кандидат ставится в гипотетическую рабочую ситуацию. Ему предлагается рассказать, как бы он действовал в описанных обстоятельствах. Такое интервью выявляет в первую очередь качество знаний и профессиональный кругозор кандидата.

  • При поведенческом интервью (behavioral interview, BI, бихевиоральное интервью) рекрутер спрашивает кандидата не о гипотетических проблемах, а о реальных, которые кандидат решал в своей работе. Такой метод выявляет то, как кандидат справляется с определенными рабочими задачами. Иногда поведенческое интервью также называют интервью по компетенциям.
  • Поведенческое интервью применимо для кандидатов из любой сферы деятельности. В ходе интервью рекрутер собирает полные поведенческие примеры (ППП) из опыта кандидата. Из каждого такого становятся ясны:

    • Ситуация, с которой кандидат столкнулся (situation);
    • Задача, которая стояла перед ним (task);
    • Действия, предпринятые кандидатом (action);
    • Результат, итог ситуации (result).

    Эти компоненты легко запомнить по аббревиатуре STARSituation, Task, Action, Result.

    Примечание. Существует похожая модель PARLA, сфокусированная на развитии:

    • Problem — проблема, сложность;
    • Actio№ — предпринятые действия;
    • Result — результат;
    • Learned — полученный урок, сделанные выводы;
    • Applied — как впоследствии применялся этот опыт.

    Как правило, достаточно получить по 2–3 полных поведенческих примера (ППП) для каждой интересующей компетенции, тогда картина опыта выходит более-менее ясной. Чтобы собрать валидные ППП и сделать вывод о компетенциях кандидатов, важно учитывать некоторые тонкости. Для каждой группы вопросов они свои.

    Вопросы о ситуации (S) — «Расскажите о ситуации, в которой…»

    Четко определите, опыт решения каких задач вам интересен.

    Иногда можно отталкиваться от списка компетенций, но этого, как правило, недостаточно.

    Например, если необходимо оценить компетенцию «Привлечение клиентов» при подборе менеджера по корпоративным продажам. То ответ на вопрос «расскажите, как вы привлекли нового клиента» может оказаться недостаточно информативным. Отвечая на подобные «свободные» вопросы, кандидат называет первые вспомнившиеся примеры, содержательности которых может попросту не хватить для оценки.

    О более интересных ситуациях можно услышать, если задавать вот такие вопросы:

    • Расскажите о самом крупном потенциальном клиенте, с которым вы вели переговоры.
    • Расскажите о самых сложных переговорах с потенциальным клиентом.
    • Привлеченные вами клиенты. Какой случай вы считаете самым выдающимся за последние полгода?
    • Ваша самая большая неудача в привлечении новых клиентов за последние шесть месяцев.

    Когда мы спрашиваем о самом большом достижении в этой компетенции, то оцениваем нынешний «потолок» кандидата, ведь у кого-то самый золотой клиент имеет годовые обороты 100 тыс. рублей, а у другого — 10 миллионов.

    Спрашивая о сложностях, трудностях и неудачах, мы узнаем, что кандидат делает для разрешения таких ситуаций, оцениваем широту его инструментария, умение им пользоваться.

    Наиболее полные достоверные примеры приходятся на последние 3–6 месяцев. Более ранние мозг привычно «архивирует», отбрасывая детали (которые нам-то очень нужны).

    Примеры S-вопросов для некоторых компетенций:

    Управление людьми Наем • Расскажите, как вы искали работника, которого наняли последним.
    • Расскажите о ситуации, в которой вам было сложнее всего найти нужного специалиста. Обучение на рабочем месте • Расскажите о ситуации, в которой вы обучали подчиненного какому-либо навыку. Почему такая потребность возникла?
    • Вспомните самый сложный за последние полгода случай, связанный с обучением ваших подчиненных на рабочем месте.
    • Расскажите о случае, вспоминая который вы можете гордиться тем, как обучили вашего подчиненного. Мотивация • Вспомните случай, когда вам нужно было добиться от сотрудника большей отдачи.
    • Ваш подчиненный потерял интерес к работе. Расскажите об этом. Оперативное руководство • Вспомните ситуацию, когда необходимо было в кратчайшие сроки организовать выполнение каких-либо работ.
    • Вспомните, как вы столкнулись с серьезной проблемой при постановке задач подчиненным.
    • Вспомните, когда вам пришлось менять режим контроля над выполнением задач. Делегирование • Приведите пример ситуации, когда вы делегировали свою обязанность вашему подчиненному. Личная эффективность Расстановка приоритетов • Вспомните, как на вас свалилось сразу несколько крупных задач и пришлось решать, какие из них делать в первую очередь. Расскажите об этом.
    • Вспомните случай, когда вам было непросто решить, каким из двух важных вопросов заняться. Принятие решений • Самое сложное решение, которое вы приняли на работе за последние полгода.
    • Какое из ваших решений за последние полгода было самым креативным?
    • Приведите пример ситуации, когда вы приняли ошибочное решение. Продажи Переговоры об условиях • Вспомните ситуацию, в которой вы наиболее активно торговались.
    • Вспомните случай, когда клиент активнее всего просил скидку или отсрочку. Холодные звонки • Вспомните, как вам нужно было договориться о встрече с незнакомым человеком из незнакомой компании.
    • Каким своим холодным звонком вы гордитесь больше всего? Коммуникации Командная работа • Вспомните, как вам нужно было кооперироваться с коллегами для решения общей задачи.
    • Когда вам было сложнее всего работать в команде? Конфликтные ситуации • Какая ситуация при общении стала для вас наиболее эмоционально напряженной?
    • Вспомните, как вы общались с агрессивно настроенным собеседником.

    Очень важно, чтобы мы получали от кандидата описание конкретного поведенческого примера, а не общую информацию в духе «у меня часто были такие ситуации; и самое главное, чтобы…».

    Иной раз на этапе S-опроса мы сталкиваемся с тем, что кандидат не может привести нужный пример.

    Тогда можно пару раз задать вопрос иначе. Если и это не дает результата, то у кандидата нет опыта разрешения таких ситуаций.

    Кандидат приводит примеры «не из той оперы»: спрашиваем про делегирование, а кандидат рассказывает об обычной постановке задач подчиненным. В этом случае нужно разъяснить задаваемые вопросы и убедиться, что кандидат правильно понимает, о каких ситуациях мы спрашиваем. Тогда он может либо привести подходящие примеры, либо подтвердить, что не сталкивался с подобными ситуациями и не имеет опыта их разрешения.

    Вопросы о задаче (T) — «Какая задача перед вами стояла?»

    Без знания задачи, которая стояла перед кандидатом в конкретной ситуации, бывает сложно оценить адекватность его действий. К примеру, кандидат сообщает: «клиент попросил 14 дней отсрочки, и я предложил ее, если клиент согласится заказывать у нас также газонокосилки на 200 [тысяч] ежемесячно, и его это устроило». Если задачей кандидата было расширение ассортимента, то это плюс в его переговорные компетенции, а если задача состояла в снижении отсрочек — то минус.

    Кроме того, без знания задачи невозможно оценить успешность решения проблемы.

    T-вопросы ставятся в трех основных формулировках:

    1. Какая задача стояла перед вами?
    2. Какую задачу вы бы поставили себе в этой ситуации?
    3. Что было для вас главным в этой ситуации? [Чего вам было важнее всего добиться?]

    Вопросы второго и третьего вида хороши, когда обсуждаются действия кандидата, которые он предпринял для решения проблемы самостоятельно (без указания руководства).

    Вопросы о действиях (A) — «Что вы сделали?»

    Конкретные действия кандидата — это, пожалуй, самая содержательная и интересная часть его рассказа. Здесь нужно понять, как именно кандидат решает задачи, о которых мы узнали из T-вопросов. Для создания полной картины рекрутер должен задавать уточняющие вопросы, раскрывающие практический опыт кандидата, например:

    • Что именно вы сделали?
    • С какими трудностями вы столкнулись?
    • Что именно вы сказали?

    Эта часть интервью требует от рекрутера умения возвращать обсуждение в нужное русло, придерживаться формата.

    Отклонения в интервью А-вопросы для уточнения Нужный формат
    Неконкретное описание действий:
    «Я убедил клиента»
    • Что именно вы сказали?
    • Как аргументировали?
    Описание конкретных действий кандидата:
    «Я рассказал клиенту, как облегчит его заграничный отдых карта Gold»
    Обобщение:
    «Я в таких ситуациях всегда стараюсь найти доводы, чтобы убедить клиента»
    • Какие доводы вы нашли в конкретном случае?
    • Что вы сказали клиенту?
    Кандидат рассказывает о «мы»-опыте:
    «Мы поговорили с клиентом, рассказали ему о преимуществах карты Gold для путешествий, и он согласился»
    • Что лично вы сделали?
    • Что сделали именно вы, а не ваши коллеги?

    A-вопросы будут слегка различаться в зависимости от типа компетенций, например:

    Коммуникативные:

    • ведение переговоров,
    • публичные выступления,
    • мотивирование,
    • постановка задач,
    • работа с жалобами,
    • работа на совещании,
    • деловая переписка.

    Интеллектуальные:

    • принятие решений,
    • расстановка приоритетов,
    • анализ информации.
    Типы компетенций Типичные A-вопросы
    • Что вы сказали?
    • Как он отреагировал? Что вы сделали после этого?
    • Как вы это объяснили?
    • Какие доводы вы привели?
    • Что вы сделали, чтобы настроить собеседника на спокойный разговор?
    • Как вы принимали решение?
    • Как вы собирали информацию?
    • Какие еще были варианты?
    • Что вы учитывали?
    • Какие параметры вы сравнивали? Как?

    Вопросы о результате (R) — «Чем все закончилось?»

    Итак, поведенческий пример почти собран, нам известна исходная ситуация, задача и подробные действия кандидата. Осталось понять, насколько последние были успешны, удалось ли кандидату выполнить свою задачу. Это стоит делать аккуратно: если кандидат заподозрит, что мы оцениваем успешность, то может дать необъективный ответ, чтобы произвести хорошее впечатление.

    Поэтому лучше задавать непрямые R-вопросы:

    • Чем все закончилось?
    • На этом все закончилось?

    Если ответ кандидата — общий, в духе «все получилось», то можно уточнить:

    • Какими были итоговые договоренности?
    • В какой момент все было готово?
    • Что именно сказал после этого клиент/ руководитель/ коллега?

    Подведение итогов интервью

    В итоге поведенческого интервью с кандидатом мы должны уверенно ответить на вопрос: Есть ли у кандидата достаточный успешный опыт в разрешении ситуаций, похожих на те, которые его ожидают при работе у нас?

    Полученные данные, чтобы облегчить их анализ, можно свести, например, в такую таблицу:

    Компетенция Ситуации из опыта кандидата Методы, которыми владеет кандидат
    частота какие ситуации разнообразие методов как именно
    Мотивирование подчиненных ++ • Мотивация на ответственную работу без систематического контроля + • Аргументирует перспективами карьерного роста.
    Оперативное руководство удаленными подчиненными +++ • Постановка и корректировка задач на оперативках
    • Постановка индивидуальных задач
    ++ • Проверяет понимание с помощью «протокола собрания».
    • Совместно с подчиненными составляет план действий при постановке трудных задач.
    • Учитывает уровень готовности.
    Делегирование + • Делегировалось наставничество над новичками + • Выбор наставника был во многом случайным.
    • Задачи ставились по SMART.
    • Передача полномочий не проводилась.

    На основании таких таблиц удобно выделять плюсы, минусы, возможности и ограничения кандидатов, связанные с работой на определенной позиции.

    Примечание. Поведенческое интервью широко применяется и при оценке уже работающего персонала. Такая оценка может использоваться для грейдирования, определения кандидатов на продвижение, а также для построения планов обучения и развития.

    Добавить комментарий