Подготовка к собеседованию на Android Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
[музыка] данное видео из нашего нового курса android профессиональный уровень в этом курсе вы изучите такие темы как инъекция зависимостей через dagger к рутины чистую архитектуру и многое другое и сможете подготовиться к собеседованию на должность junior android разработчика ссылка на полный курс находится в описании к этому видео по промо коду дев колибри вы получите максимальную скидку и для вас стоимость курса составит менее двух тысяч рублей подробности в описании всем привет сегодня вас ждет
00:00:00 - 00:01:07
собеседование по всему пройденному материалу причем я буду задавать вопрос и не только по теме android но также по языкам java и котлин точно так же как это будет на реальном собеседование проходите на будет в уже привычном для вас формате я буду задавать вопрос и давать несколько секунд чтобы вы поставили видео на паузу и ответили на вопрос самостоятельно я вам рекомендую отвечать вслух чтобы на настоящем интервью вы чувствовали себя спокойно чтобы вам было интереснее я взял список вопросов из реального собеседования
00:00:36 - 00:01:48
которая проходила недавно в одной крупной компании кандидата беседовал себя на должность middle android разработчика вопросы на должность junior примерно такие же но возможно будут немного отличаться поэтому если вы сможете ответить на большинство из них то я думаю проблем с устройством у вас возникнуть не должно еще раз обращаю ваше внимание что я не буду задавать абсолютно все вопросы по всем темам в этом случае видео затянулось бы на несколько часов вместо этого я взял вопросы из реального собеседования где затрагиваются
00:01:12 - 00:02:21
практически все темы но не слишком глубоко некоторые вопросы которые мы еще не проходили я пометил звездочкой это вопросы которые были на собеседовании но у junior разработчиков их скорее всего не спросит а если вы будете знать на них ответы это вам только плюс итак наше собеседование будет состоять из нескольких частей сначала я задам вопросы по языкам котлин и java затем будут вопросы по системе android дальше по архитектуре android приложений и покрути нам если вы готовы то давайте приступим первый вопрос
00:01:46 - 00:03:03
перечислите модификаторы доступа java и котлин в java и to provide public protected и pudge правит модификатор доступа по умолчанию обычно просят объяснить что это за модификаторы доступа и так модификатор правит обозначает доступность метода или переменной внутри класса public обозначает доступен абсолютно везде protected обозначает доступен внутри класса и внутри его наследников и модификатор пэйдж правит модификатор по умолчанию обозначает что данный член класса доступен внутри одного пакета
00:02:24 - 00:03:43
модификаторы доступа в котлин три из них точно такие же это проявит паблик и протектор они действуют одинаково java и котлин 4 модификатор это internal он отличается от ph правит тем что член класса помеченный модификатором internal будет доступен внутри одного модуля если в вашем приложении несколько модулей и какой-то модуль должен быть независим от другого то его члены класса или сами классы вы можете помечать модификатором internal вопрос следующий этот вопрос со звездочкой поскольку мы эти вопросы не
00:03:09 - 00:04:27
рассматривали но если вы будете знать ответ на этот вопрос то это вам только плюс что произойдет если из java кода обратиться к internal полю котлин как вы должны знать java и котлин это оба языка которые работают на живым java виртуальная машина код на java преобразуется в бойкот и код на код линии также преобразуется в байт-код это один и тот же байт код и по этой причине в одном проекте может существовать код как на java так не накоплен и по этой же причине если в одном проекте какой-то код написан на котле не там и из java кода
00:03:48 - 00:05:03
можем к нему обращаться и поэтому нужно понимать каким образом будет происходить взаимодействия этих двух языков в одном проекте в данном случае если поле помечена как internal то оно обозначает доступность внутри одного модуля в java такого модификатор нет и поэтому в генерировано байт коде у этого поля должен быть установлен какой-либо модификатор из тех что есть java это паблик правит protected или дефолт модификатор правит у него установлен не может быть поскольку в одном модуле в котлин если поле помечена как internal
00:04:30 - 00:05:36
то другие классы могут также к нему обращаться по этой же причине у него не может быть установлен protected поскольку обращаться к нему можно не только из наследников у него не может быть пэйдж проявит поскольку одном модуле может быть сколько угодно пакетов поэтому остается только модификатор public соответственно если в после не в каком-то модуле вы пометили поле как internal ожидая что из другого модуля к нему доступа не будет то если это другой модуль написан на java то он без проблем обратиться к этому полю если вы на этот
00:05:04 - 00:06:02
вопрос не ответили то ничего страшного этот материал мы пока не проходили просто знайте что очень полезно создать проект в котором будут классы как на java так и накоплен и смотреть как будет происходить взаимодействия этих классов различных модификаторов и так далее переходим к следующему вопросу зачем нужны методы и кварц их хэшкод метод и глав позволяет сравнивать объекты по значениям их полей метод хэш-код представляет собой числовое представление объекта и используется в хэш-таблицах надеюсь тут пояснять нечего не нужно
00:05:33 - 00:06:45
этот материал вы должны уже хорошо знать какие существуют правила для методов и кварц и хэш-код первое правило переопределил эклз переопределить и хэш-код второе если хэш-коды объектов равные то и объекты точно разные и третье если хоть коды объектов равны то это не значит что объекты тоже равны хэш-коды могут просто совпасть это называется к лизе как устроена память в java память java делится на две составляющие это стек и куча кучу еще называют хип и все примитивные типы и ссылки на объекты хранятся в
00:06:13 - 00:07:41
стеке а объекты хранятся в куча какой объем памяти у стыка и у кучи объем памяти стека один мегабайт объем памяти кучи ограничен размером оперативной памяти устройства снова вопрос со звездочкой если в приложение создано несколько потоков то изменится ли от этого объем памяти стыка и кучи если вы не знаете ответ на этот вопрос то просто подумайте какой размер у стыка какой размер у кучи и может ли он по меняться от того что были созданы потоки и правильный ответ что для каждого потока будет создан свой собственный стек также
00:07:09 - 00:08:26
размером 1 мегабайт то есть сколько у вас потоков столько и стыков по одному мегабайту каждый при этом куча будет использоваться общие и объемы и памяти не изменится это можно понять из того что объем куча представляет собой оперативную память и от того что вы создали несколько потоков объём оперативной памяти увеличится не может и также вы должны понимать что из двух разных потоков можно работать с одним и тем же объектом это значит что у потоков есть доступ к куче которая общая для всех потоков
00:08:01 - 00:09:07
как сборщик мусора понимает что объект можно уничтожить если на объект нет ссылок из т.к. то объект будет уничтожен что такое файнал и fine life и чем они отличаются ключевое слово финал имеет несколько предназначений если файнал указанного класса то это значит что от класса нельзя наследоваться если файл указан у метода значит этот метод нельзя переопределять если файл ул указано у переменной то значит это константа ей нельзя присвоить новое значение a fine life это метод он вызывается при уничтожении объекта
00:08:36 - 00:09:52
опишите иерархию коллекций java на вершине иерархии интерфейс это рыбу он нужен для того чтобы коллекция можно было перебирать в цикле for each ниже идет и фейс kollection от которого наследуется лист и сет и отдельно лишит интерфейс map основные реализации лист это реалист и linkit лист основные реализации сет это hashed трясет и линьки трэш сет основные реализации map флешмоб 3 map и linkit haш миp коллекция linkit лист также реализует интерфейс у очередь как реализовано хранение объектов в кэш
00:09:22 - 00:10:45
бэк сначала вычисляется крышку от ключа затем на основе хэш-кода ключа вычисляется номер позиции элемента и затем если по этой позиции в массиве ничего нет то новый объект добавляются туда а если там занято то происходит коллизия и здесь вас могут спросить каким образом различаются коллизии флешмоб и так далее вы это должны знать назовите основные отличия коллекции сет и лист во-первых сет не позволяет хранить дубликаты одинаковые объекты во вторых сет не позволяет обращаться к элементам по их индексом
00:10:07 - 00:11:24
в третьих элементы в коллекциях лист хранятся в порядке добавления а порядок элементов в коллекциях сет может быть равным зависимости от конкретной реализации к примеру в кэш сет элементы хранятся беспорядочно в linked headset в порядке добавления в трясет все элементы отсортированы и последнее отличие от что в коллекциях сет быстрее работают методы и move и контент что такое сериализация сериализация это процесс преобразования объектов в набор байтов здесь вас могут спросить каким образом происходит
00:10:57 - 00:12:06
сериализация чем отличается интерфейса serial ози бу и парс лейбл и тому подобное вы это также должны знать и еще один вопрос после реализации объект какого-то вашего класса необходимости реализовать но одно из его полей неси реализуемо как быть пример такого поведения если в вашем классе есть поле и это поле представляет собой экземпляр класса из какой-то библиотеки вы не можете залезть в библиотеку и добавить интерфейс serial избу оси реализовать ваш клад как то нужно каким образом вы можете поступить
00:11:36 - 00:12:51
если какое-то из полейте реализовать невозможно то можно пометить его ключевым словом transient в этом случае данное поле не будет участвовать процессе реализации и при 10 реализации этому полю будет присвоен назначение но что такое дата классы в котлин это классы данных мы также говорили о них как о классах позже например это может быть юзер класс мэсседж dog и так далее просто класс какими-то полями гитарами и секторами особенности дата классов что у них переопределены методы эклз и хэш-код метод tostring и метод
00:12:18 - 00:13:36
копи также у него переопределены оператор компонент н который участвует в процессе реструктуризации когда из объекта можно получить набор и его полей третья особенность от этих классов нельзя наследоваться и 4 дата классы обязаны содержать не пустой первичный конструктор поскольку именно на основе полей первичного конструктора и перри определяются методы и класс хэш-код и так далее следующий вопрос что такое seat классы в котлин send классы позволяют создать ограниченную иерархию классов во время
00:13:02 - 00:14:22
компиляции известны все прямые наследники этих классов это очень удобно использовать в качестве стоит на презентацию слоя в одном из последних уроков мы как раз разбирали такой вариант когда мы можем в конструкцию в.н. передать объект seat класса и там проверить всех наследников если стоит например является классом р то мы показываем ошибку если прогрессом то отображаем прогресс и так далее теперь вопросы которые касаются android перечислите основные компоненты android системы основные компоненты android системы
00:13:45 - 00:15:01
которые должны быть зарегистрированы в манифесте это activity сервисы брут каст ресиверы и контент-провайдера какие вы знаете виды сервисов у нас был большой раздел по сервисам где мы разобрали все основные виды это обычные сервисы foreground сервисы intentservice джобс сервис их объединение job intentservice alarm manager и work менеджер work менеджер я пометил звездочкой поскольку это не сервис но под капотом он использует сервис и и вообще он используется для планирования выполнения задач в фоне поэтому имеет
00:14:30 - 00:15:44
смысл указать его что вы вообще знаете о его существовании и умеете с ним работать назовите жизненный цикл сервисов он у них очень простой это метод oncreate создание сервиса метод onstart команд сервер выполняют работу и метод ondestroy сервер уничтожается назовите отличие intentservice а от обычного сервиса работа в обычном сервисе по умолчанию выполняется на главном потоке работа в intentservice выполняется в фоновом потоке в обычном сервисе нужно переопределить метод onstart команд а в int n сервисе onhandleintent
00:15:09 - 00:16:27
и если прилетает несколько задач то в обычном сервисе они все начнут выполняться сразу of intern сервисе будет создаваться очередь зачем в сервисах нужен метод онлайн если на какой-то сервис нужно подписаться и получать от него какие-то данные на экране то для этого можно вызвать метод баян сервис в этот момент будет вызван метод он боинг который должен вернуть реализацию интерфейса и бендер назовите жизненный цикл activity это метод oncreate activity создана но еще не видимо метод onstart activity
00:15:53 - 00:17:09
видимо но еще не обладает фокусом метод он режим activity видимо и обладает фокусом метод он пауз activity потеряла фокус метод onstop activity перестала быть видимой и метод ondestroy activity уничтожен назовите жизненный цикл фрагмента сначала идет метод он attach фрагмент прикрепляется к activity затем метод oncreate фрагмент создается затем метод oncreateview процесс когда из макета создается view затем вызывается он в you created когда в ее создана и с ней можно работать дальше идут методы которые повторяют
00:16:43 - 00:18:04
методы activity это он старт фрагмент стал видимым но не обладает фокусом и он режим фрагмент видим и обладает фокусом дальше идут методы он пауз он стоп такие же как у activity затем он дестрой view когда view которая находится на фрагменте в уничтожается затем метод он дестрой уничтожается сам фрагмент и затем он detach фрагмент открепляется от activity как можно организовать взаимодействия activity и фрагмента здесь у вас может быть несколько вариантов ответов во первых мы можем создать интерфейс
00:17:31 - 00:18:45
переменная этого интерфейсного типа должно быть объявлено внутри фрагмента а в activity этот интерфейс должен быть реализован внутри метода он attach можно activity привести к интерфейс нам у типу и работать с ней второй вариант через view model activity как передать параметры во фрагмент при помощи объекта банду и метода сет аргумент почему нельзя передавать параметры в конструктор фрагменты потому что при пересоздание фрагмента будет вызван его конструктор без параметров если такого конструктора нет
00:18:14 - 00:19:25
то приложение упадет а если есть то переданные ранее параметры не сохраняться что такое бродкаст ресивер бродкаст ресивер это один из компонентов android системы который позволяет подписываться на различные сообщения например поступил телефонный звонок или батарея разряжена и так далее можно ли отправить свое бродкаст сообщения ответ да можно для этого нужно вызвать метод сен-барт каст который есть у контекста зачем нужен контент провайдер он нужен для организации доступа к данным из других приложений
00:18:58 - 00:20:15
в качестве примера можно указать приложение контакты куда занесены все данные номера телефонов имена и так далее а другие приложения могут этим пользоваться например в банковском приложений вы можете выбрать контакт которому хотите перевести деньги в данном случае для доступа к данным используется контент-провайдер можно ли в android для организации многопоточного кода использовать close thread и какие могут быть с этим проблемы ответ на вопрос можно ли использовать да можно но проблемы могут возникнуть во
00:19:51 - 00:21:04
первых что важно понимать это что работать свою можно только из главного потока любое обращение к view не из главного потока закончится крашен поэтому для работы с элементами придется использовать класс хэндлер и вторая проблема которая может возникнуть что жизненный цикл потока может отличаться от жизненного цикла экрана на котором выполняется работа это может спровоцировать утечки памяти теперь вопросы по картинам первый вопрос что такое soft and функции со спин функция эта функция которая может приостановить свое выполнение до
00:20:35 - 00:21:46
завершения какой-то долгой операции а затем возобновить его благодаря этому поток на котором была вызвана с функция не будет заблокирован здесь я указал в скобках что это при корректной реализации если вы создадите какую-то блокирующую функцию и просто пометить ее модификатором suspend то она будет блокировать поток самого слова suspend никакой пользы при этом не принесет это нужно понимать ее вас это могут спросить каким образом обеспечивается возможность приостановки выполнения suspend функции
00:21:16 - 00:22:27
под капотом s pen функции используют программирование с калмыками и стоит машину здесь вас могут попросить развернуть этот ответ и если вы вдруг пропустили раздел по картинам то обязательно его посмотрите особенно первую часть где мы разбираем каким образом работается vpn функции когда одна и та же функция запускается сначала состоянием один затем состоянием 2 состоянием три и так далее это очень важно понимать поскольку короткий ответ может не устроить интервьюеров и вас попросят объяснить более подробно
00:21:55 - 00:23:04
что представляет собой картин контекст картин контекст это несколько составляющих картины объектом job dispatcher каротин name эксепшен хендлер какие бывают dispatcher и здесь в ответе я расписал подробно какой пул потоков используются если вы не смотрели мой курс по java и не знаете что такое пул потоков то я советую посмотреть а до тех пор их упоминать не стоит поскольку в этом случае вы можете запутаться при ответе и так dispatcher а я предназначен для выполнения операции чтения и записи например когда вы
00:22:31 - 00:23:48
работаете с интернетом или базой данных в этом случае используется кэш straight pull при этом максимальное количество созданных потоков будет равно 64 дальше идет dispatcher сын дефолт он предназначен для выполнения сложных операций и здесь используется фикс от red bull где количество потоков равно количеству ядер в процессоре но минимум два дальше идет dispatcher main это главный поток дальше dispatcher с main и меняет мы его они рассматривали но на самом деле в нем ничего сложно это тот же самый главный поток просто код
00:23:18 - 00:24:28
внутри этой картины начнет выполняться немедленно в отличие от простого dispatcher в main можете написать у себя это в коде и посмотреть в чем будет отличие например вызвать какую-то картину dispatcher с main а после вызова вывести в лог какое-то сообщение в случаев main сообщение в лог может быть выведена раньше чем выполнится картина о случаев main и меняет сначала выполнится то что внутри картина а потом будет выведено сообщение блок и последний dispatcher который называется on content при этом работа будет выполняться на том
00:23:53 - 00:25:05
потоке на котором будет вызван этот код в чем сходство и различия методов ланч и и sing мы их ещё называли картине builder оба метода является картин builder ами они создают картину и запускают ее на выполнение при этом метод ланч и возвращает объект job а метод и sing возвращает наследника job которая называется десерт из которого можно получить какой-то результат путем вызова и weight обычный job не позволяет получить результат выполнения картины и также у них имеются отличия при исключительных ситуациях случай если
00:24:28 - 00:25:39
внутри картины была брошена исключение она будет про брошена вверх по иерархии в обоих случаях при этом случаев ланч это исключение нужно обязательно обработать в exception handling а в случае с и sing она будет упаковано в объекта десерт и в exception хендлер не попадет теперь вопросы которые касаются архитектуре приложений расскажите про чистую архитектуру что это и для чего она нужна здесь нужно понимать что вопрос может быть раскрыт очень подробно я написал довольно коротко принципа чистой архитектурой говорят о том как лучше
00:25:11 - 00:26:27
строить систему чтобы оно было легко расширяем а и тестируем согласно этим принципам ваша система то есть код приложения должна быть разделена на осла и data domain и презентация где domain слой определяет бизнес-логику приложения является самым независимым слоем в свою очередь дата слой определяет работу с данными интернет база данных и так далее а презентация слой отвечает за взаимодействие с пользователем отображение данных и реакция на действия пользователя клик по кнопке ввод текста и так далее
00:25:53 - 00:27:10
если domain слой не зависит от других слоев то есть если он самый независимый слой то как он взаимодействует с data flash благодаря инверсии зависимостей в domain слой лежит интерфейсы репозитория в которой взаимодействуют с кейсы а реализация этого репозитория лежит куда-то слоя перечислите принципы solid здесь я также ответил очень коротко скорее всего вас попросят раскрыть каждый из этих принципов сейчас я на это тратить время не буду вы можете посмотреть отдельные уроки по каждому из принципов очень важно понимать за что
00:26:33 - 00:27:49
каждый из них отвечает и знать хотя бы по одному примеру для каждого принципа итак первый принцип это синглы responsibility принципе единственной ответственности если коротко то класса должна быть строго определенная ответственность и она должна быть только одна не должно быть никаких год объектов которые делают абсолютно все второй принцип открытости закрытости говорит о том что программной сущности классы модуля и функции должны быть открыты для расширения и закрыты для модификаций следующий принцип постановки барбары
00:27:20 - 00:28:27
лисков говорит о том как строить иерархию наследования что если у вас какая-то функция зависит от базового класса то она должна корректно работать с любым его наследником дальше идет принцип разделение интерфейсов интерфейс y экшн он говорит о том что если у вас есть какой-то интерфейс с множество методов то его лучше разделить на несколько небольших интерфейсов потому что бывают случаи когда вам нужно использовать только один или два метода из какого-то интерфейса а при этом приходится переопределять абсолютно все
00:27:54 - 00:29:00
методы которых может быть очень много один из примеров это текст watcher в java чаще всего там используется только один метод он текст change a переопределяют нужно три метода до того как текст был в меню во время изменения текста и после того как текст был изменен это нарушение принципа разделения интерфейсов поскольку мы начинаем зависеть от тех методов которые не используем и последний принцип это dependency in version принцип инверсии зависимостей он говорит о том что систему нужно строить так чтобы классно
00:28:27 - 00:29:35
на зависели от абстракций они от реализации яркий принцип это чистая архитектура где у нас из кейса зависят от интерфейса репозитория а его реализации лежит в дата слой если бы мы зависели сразу от реализации интерфейса то нас домой слой зависел бы от do the floor но благодаря тому что мы зависим от абстракции которая лежит дома in слое мы развернули направлении зависимостей и теперь у нас дату слой зависит от domains rf что представляет собой имве паттерны и чем отличаются mvp от mvvm этот вопрос со звездочкой поскольку не
00:29:01 - 00:30:13
все из вас проходили паттерна mvp и знают что это к тому же баттон mvp уже устаревает и знать его не обязательно но если вы сможете ответить на этот вопрос то это очень хорошо но при этом что такое паттерн м.м. вы должны знать в паттерне м г н или м впм это модуль она представляет собой бизнес-логику приложения в это view она представляет собой видимую часть приложения с которой взаимодействует пользователь activity или фрагменты а сами паттерны mvp и mvvm определяют архитектуру презентация как будет
00:29:39 - 00:30:52
происходить взаимодействия модуль и view при этом у mvp и мвм есть отличия случае с mvp у нас третий элемент это презентер является посредником между модуль и view и у них происходит двухстороннее общение президента имеет ссылку на view через интерфейс и view имеет ссылку на презент рвы может сообщать о каких-то событиях презенты ru а брезента может говорить view что нужно сделать случае с mvvm в you модель является посредником между модуль и view при этом две модели не хранить ссылку на view view как и в
00:30:19 - 00:31:33
случае с mvp сообщает о каких-то событиях в модели при этом она же подписываться на объекты life дэвида или flow и каким-то образом реагирует на изменения в этих объектах все на этом я думаю достаточно как я уже говорил мы не будем разбирать абсолютно все вопросы по всем темам сейчас мы взяли в качестве примера настоящие собеседование на должность middle разработчика и возможно для вас будет приятным моментом кандидат на эту должность ответил примерно на 90 процентов вопросов и успешно устроился
00:30:56 - 00:32:04
на работу поэтому если вы можете ответить на большинство вопросов которые здесь были то смело подавайте режиме и ходите на собеседовании презентация с вопросами и ответами я прикреплю после этого урока сохраните ее к себе на компьютер и желательно добавлять в эту же презентацию какие-то новые вопросы и ответы которые вы увидите этих вопросов очень много как в данном курсе по android так и в курсе по java и в курсе по котлин впоследствии вы по этой презентации сможете готовиться к собеседованию на
00:31:30 - 00:32:36
этом все увидимся в следующем уроке
00:32:02 - 00:32:07