Подготовка к собеседованию на 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 каналы и чаты
Транскрипция видео:
Всем большой привет А Добро пожаловать на фестиваль собеседований для мобильных разработчиков а Напишите пожалуйста накидайте реакции в комментарии если нас хорошо видно и слышно и поддержите сегодняшних участников А сегодня у нас будет Моко вое собеседование по Ду А впереди у нас где-то полтора часа эфира из которых первая часть - это собеседование где будет теория плюс практическая часть далее будет фидбэк от ментора и потом ответы на ваши вопросы поэтому не стесняйтесь задавайте вопросы в комментариях мы потом в конце на всё
00:00:13 - 00:01:18
ответим А сегодня у нас в партнёрстве международное оффлайн и онлайн сообщество кофе код А ребята регулярно организовывают встречи для мобильных разработчиков как в онлайн форматах так и и в оффлайне где люди собираются общаются делятся опытом и обмениваются классными знаниями поэтому Подписывайтесь ссылочка есть в описании и организатор этого стрима - это солвере крупнейший в реф матп менторов из it где мы помогаем ребятам строить свою карьеру быстрее и эффективнее с помощью занятий с ментора собеседование сегодня проводит
00:00:47 - 00:02:05
Виктор понк Android архитектор и ментор на солвере и с с нами также сегодня Илья это ученик который собственно будет проходить собеседование он подал заявку через сайт регистрации и сегодня к нам пришёл а также есть небольшой подарок для тех кто нас смотрит до конца недели действует промокод Mobile 20 который даёт вам скидку на первое занятие А с любым ментором по мобильной разработке и также вы можете приходить к Виктору вот А я тем временем передаю слово Виктору а зрителям Желаю приятного просмотра и
00:01:25 - 00:02:30
Илье удачи Спасибо Всем привет Илья Приветствую Как ты сегодня Как настроение всё отлично В принципе настрой боевой так сказать отлично Ну тогда Если не против мы начнём начну с таких общих вопросов Почему вообще ты решил заняться Android разработкой Что тебя сподвигло пой нать и может быть Кто был твоим наставником Ну в общем-то путь в it У меня достаточно долгий я занимался разработкой Telegram ботов на питоне с помощью фреймворка где-то около года до того как начал интересоваться Android разработкой
00:01:57 - 00:03:34
а сподвигло меня изучать её то что я начал ходить на дополнительные курсы в колледжа когда поступил на первый РС и с того момента всё собственно началось я начал изучать Android через примерно 8 месяцев вышел на первую работу Ну до этого делал свои проекты вышел на первую работу Это был достаточно перспективный крутой проект на композе с использованием на очень популярном на очень таком Молодёжном драйвом стеке на котором я проработал 3 меся Ну и собственно и сечас Я работаю в Компани Проектная фирма которая занимается
00:02:48 - 00:04:15
разработкой сайтов и мобильных приложений над клиентским приложением для сети магазинах одежды Угу а почему перестал работать на предыдущем месте на предыдущем месте у нас случилась такая ситуация что я остался последним разработчиком на проекте проекту порезали финансирование очень и собственно его закрыли других проектов по мобильной разработке на нативный Android не было и ну и именно в тот момент мне поступил офер от текущей фирмы где я работаю и я собственно так безболезненно бесшовное окей ой кстати сейчас хорошо
00:03:32 - 00:05:11
слышно видно или не очень хорошо о'кей Просто я Илью перестал видеть Так у нас кажется у Ильи проблема со связью мы сейчас постараемся всё уладить чтобы мы могли продолжить А наше сегодняшнее собеседование так да видимо неполадки со связью надеемся что сейчас вернётся к нам Илья и всё будет хорошо да да вот в чатике пишут то что Илью было плохо слышно О алло алло алло привет Так я немножечко Поша манил над интернетом и сейчас всё должно быть чуть более стабильно так На каком моменте я отключился А ещё моменти нужно перейти
00:04:30 - 00:05:58
по ссылке которую я кидала и мы подключим тебя снова на Стрим и вот а пока можете продолжать так на Всё окей скажи тогда когда будешь готов продолжать пока надо восстановить видео Угу пока что не вижу но но вроде мы тебе слышали поэтому должно быть всё хорошо с интернетом да я вижу риу в Зуме осталось только к сайту подключиться так подключился Ага супер тогда можем продолжать Я сейчас всё выведу и всех будет видно и слышно Угу О'кей Ну собственно говоря мы остановились на том что ты остался одним
00:05:50 - 00:07:25
Android разработчиком и проекту снизили финансирование закрыли и соответственно ты получил другой офер вот ну окей Ну собственно говоря Алло Алло Алло слышно меня к сожалению случается такое с интернетом если сейчас наху за ноутбуком то можно попробовать на мобильный интернет переключиться это может помочь Ну ничего страшного на собеседованиях в лайве такое бывает сейчас постараемся всё починить Да причём в Зуме картинка хорошая и да видно и слышно Илья отдай знак если ты нас слышишь а так мне Илья написала что он нас не
00:06:54 - 00:08:29
слышит может быть попробуешь переподключиться в Зум и мы постараемся всё вернуть потому что в Зуме картинка а он же до слышать а о Алло алло всё Я вас слышу почему-то наушники О'кей так и ещё напоминаю зайти по ссылке потому что там пока что видео не появилось Угу если будет комфортно Вы можете продолжить общаться пока Илья подключается потому что Звук есть картинка скоро появится я подключился Ага ждём так Оки ирия Ну тогда продолжим Угу Так ну собственно говоря можно вернуться к следующему вопросу это
00:08:43 - 00:10:20
ты упомянул что ты ходил на курсы по Андроиду в твоём учебном учреждении соответственно я правильно понимаю что твой первый наставник был оттуда Кто тебя собственно обучал Андроиду меня обучали двое тогдашних студентов нашего колледжа Но сейчас они уже тогда были на чем курсе у них были достаточно неплохие знания Аида и они помогли мне сделать первый шаг так сказать помогали рили и с помощью них я сделал своих несколько первых проектов А дальше уже сам начал обучаться так собственно я немного гляну
00:10:04 - 00:11:41
к той работе о которую ты ранее упоминал и там действительно достаточно интересная реализация и с использованием архитектура выглядит достаточно современно даже на текущем проекте очень похожее решение используется вот вопрос как ще за ильва и собственно Где ты учился вот этим подходом Вы имеете тестовое вы имеете в виду тестовое задание где камера и двери такой там Ага Так основной подход с использованием Ну это около MV на самом деле это обычный mvm но с небольшими улучшениями для компо я его подсмотрел у
00:11:01 - 00:12:49
своего наставника посчитал что он очень классный и перебрал к себе сейчас я его ну я его использовал на нескольких под проектов после того как сделал тестовое задание и сейчас использую на проекте над которым работаю сейчас Угу А ты можешь подробнее рассказать об этом подходе М не знаю точно есть ли у него название Ну так а а в каких терминах рассказать то есть как я его вижу Ну вообще про архитектуру как собственно ты видишь проектирование архитектуры Android приложения Ну в частности с использованием Jetpack comp
00:11:55 - 00:13:19
вот по организации кода То есть у тебя там есть какие-то определённые сущности определённый фреймворк вот ну собственно можешь это описать и с точки зрения идеологической То есть как это в абстрактном виде должно работать можешь описать с точки зрения кода То есть как тебе удобнее Ну я пожалуй луше пишу с точки зрения кода поскольку я пытался найти какие-то статей может быть какие-то материалы про Конкретно этот подход но к сожалению мне не удалось Вот потому рассказываю как я как я его вижу со
00:12:37 - 00:13:50
своей точки зрения ну э можно сказать UI слой в этом подходе он разделён на три составляющих э события которые происходят Ну на которые в модель каким-то образом должна дать отклик состояние экранчик и сайд эффекты которые появляются А после выполнения какой-нибудь функции А Угу угу по той же самой Угу подключился Так так ну собственно говоря да у тебя ещ использовался подход с кейсами в этом тестовом проекте вот можешь рассказать про кейс подробнее можно ещё раз вопросик у тебя использовались в этом
00:13:13 - 00:15:13
же проекте кейсы то есть подход с использованием кейсов можешь подробнее про них рассказать Алло так хорошо слышно да О'кей отлично А ну это базовая Клин архитектура вообще если интересно могу рассказать про то как я вижу Клин архитектуру в принципе но там там она разделена Так что это классический подход э Клин архитектуры Где в самом центре локко кольца так сказать находятся сущности над ними кейсы над ними репозитории и над ними уже UI слой веб и прочее в зависимости от того сколько определённый слой знает
00:14:40 - 00:16:10
о ни изле щем Ну это всё в принципе так а можно подробнее про связь репозиториев и кейсов Угу Ну а US Case представляет собой по сути какое-то событие которое пользователь ожидает под приложение можно сказать это User Story то [музыка] есть Нет я наверное не смогу рассказать Угу Ну такой вопрос правильно понимаю что ты относишь у кийс к доменному слою в этой модели вот а вопрос а интерфейс репозитория тогда к какому слою будет относиться интерфейс репозитория тоже к доменной а его реализация в уже более вышестоящего слой дайти Угу
00:15:35 - 00:17:37
угу То есть ты разделяешь на доменный и дата слой домен и дату и entation слой где собственно логика UI Угу И ты соответственно каждый слой технически делаешь в виде отдельного модуля да Угу Ну вот это вопрос Это ты эту получается реализацию посмотрел А как ты сказал у своих коллег старших студентов скорее всего Точно не скажу где я это подсмотрел скорее всего на тубе в туториала по чистой архитектуре от одного из YouTube учителей Ну модульная разбивка к архитектуры помогает в видимости слоёв то
00:17:02 - 00:18:37
есть директории в модуле то можно допустить такую ошибку что допустим дата знает о entation до знает о всех вообще и таким образом нарушается структура клино архитектуры а при моляри зации получается так что у тебя что домен не знает вообще ни о ком потому что в в нём не заложено то что он видит другие модули кроме себя то что дата видит только до а слой приложения видит вообще всё ну и плюс ещё это не знаю насколько это относится к маленьким проектом Но это ускоряет сборку Так что все модули собираются
00:17:57 - 00:19:24
параллельно нежели если бы они лежали в одном Угу Ну да В целом соглашусь Вот вопрос а при сборке требования к оперативной памяти Как меняется при использовании многомодульная пам вые под правильно пони Ну да скорее всего подсказать не смогу на самом деле достаточно сильно растёт То есть это как бы один эффектов что действительно скорость компиляции но оперативную память уйдёт в SW потом билды будут дольше идти Ну то есть как бы это может ускорить может и замедлить Вот то есть я видел такие случа когда
00:18:42 - 00:20:09
это ну серьёзно замедлялось на самом деле Ну так чтобы просто чтобы знал что не всегда это в одну сторону работает то есть уже требуется Для комфортной работы 32 Гб на больших проектах Ну большие Это имеется в виду там 100 п модулей потому что каждую фичу принято дробить Вот как ты сказал есть проектов у тебя будет получается сколько ты сказал четыре модуля ну четыре считая вот Ну получается так три-четыре модуля для больших проектов соответственно каждая фича будет разбиваться на такую структуру и
00:19:37 - 00:20:49
количество модулей возрастает значительно да на на Первом проекте над которым я работал была как раз таки разбивка на фи модуле и с точки зрения архитектуры там было всё насколько я помню Очень классно сделано Угу но проект э у меня на устройстве сборка его занимала порядка 8 минут на холодную э без кэше Ну это нормально Ну да я понимаю нормально даже даже на м3 маках большие проекты быстрее особо и не собираются на холодную Ну а так может и 25 минут собираться даже на устройствах вступление Какие ещ есть
00:20:14 - 00:21:55
преимущества Ну в таком архитектурном подходе то есть что ещё можно достичь каких бенефито при разработке имеете в виду кли архитектуру или много архитектуру ж всего много как следствие стихийно как ответ такому беспорядочно объектно ориентированному программированию чтобы его как-то упорядочить и структурировать могу сказать что она очень хорошо влияет на расширяемость продукта и выполняет один из принципов Solid а именно буковка о там Open CL когда допустим Ну проект можно сказать он очень он готов для расширения То есть
00:21:05 - 00:22:53
можно без труда без вреда для архитектуры добавить какую-то фичу при использовании кли архитектуры на самом деле архитектура Она вся Пролит и она не только относительно относительно всех остальных Буково этоже отно в лом соусь е Что даёт нам как Android разработчикам Ну такое немаловажное преимущество которое позволяет нам повысить качество качество продукта и упростить его [музыка] тестирование не очень понял вопрос можно чуть-чуть конкретнее Ну вот как раз вопрос связанный с тестированием прежде всего
00:22:07 - 00:23:34
то есть допустим обычно тестируется вручную всё тестировщика вот как им облегчить задачу Ну ручному тестировщику скорее всего никак не облегчить задачу А если речь идёт про модульное или инструментальное тестирование то у меня с с таким опыта нет у ну тесть рекомендую ознакомиться получить такой опыт как-нибудь Ну хотя бы на пед проектах попробовать Да я собираюсь Но как бы возможно из-за такой молодой беспечности не отдаю этому должного внимания потому что пока что проекты не настолько большие чтобы их нельзя было
00:22:57 - 00:24:32
вручную проверить От края до края там допустим за какие-нибудь полчаса в любом случае проекты растут хите с того что конечно реализации жа где-то в наружних слоях можно писать тесты для кода то есть прогонять его очень быстро в автоматическом режиме на Вот и плюс можно писать ные тесты и это подход позволяет нам легче писать всякие моки то есть допустим использовать мо сервер или МОК запросы которые соответственно позволяют без обращения кду тестировать ль какие-то там или любой другой формат данных из сетов что существенно упрощает
00:23:44 - 00:25:17
автоматизирован тестирование так как мы получаем стабильные тесты которые не падают из-за того чтобы к например упал и так далее То есть это очень очень полезная тема на самом при расширении хорошо работает то есть экономит всем время силы и поэтому Советую с этим вопросом ознакомиться вот тут есть соотвественно в резюме указаны навыки но не указаны MV Jetpack compose при этом Ну я считаю что это некоторое допущение потому что у тебя неплохой опыт может быть он не такой большой но тем не менее уже
00:24:35 - 00:25:57
достаточно скажем так уже достаточно уверенные знания рка MV и рка это стоит отразить в резюме чтобы Ну потенциальные работодатели это видели И могли сказать Ага Мы хотим сделать современное приложение допустим с Ну ну я думаю это будет полезно то есть немножко обновить резюме указать более современный потому что смотрел там указа Ну уже можно указывать допустим Пак comp А ну я как ты правильно сказал что есть сайд эффекты А попрос тогда связанны с эффектами А вообще чего они используются в jep comps
00:25:16 - 00:26:46
то есть что они нам помогают избежать какого дополнительных рекомпозиция Ну это такой быстрый ответ м Ну и всё в принципе ну допустим если Ну в компо есть такой замечательный конструкт как который позволяет безопасно для композиции запустить рутину там допустим для того чтобы обратиться к объём модельке запросить какие-то данные на при запуске Экранка наоборот получить какие-то данные э допустим и который позволяет выполнять какие-то операции при изменении ключа и очищать За собой следы Ну на самом деле последний я
00:26:11 - 00:28:12
не очень подробно расскажу поскольку такого полноценного опыта с ним не имел от допустим как мы раньше отслеживали и и вот с помощью подписаться на Ну соответственно потом будет безопасный отписка Потому что раньше Когда не было мы подписывались нак И отвали тоже на Ну допустим нас бы Като подписка на базу ещ на что-то допустим на старте подписывались и допустим отписывает вот он подпишется отпи сам уже ну мы можем допустим там просто слушать то есть нам допустим Не надо отписку нам просто надо понять когда он
00:27:14 - 00:28:48
сработает там допустим чтобы контент обновить Или допустим чтобы там камеру отключить ну к примеру у нас Android сворачиваем приложение и нам надо его ну остановить сканер потому что допустим на некоторых девайсах Он не останавливается сам то есть продолжает камеру использовать и запустим мы Не сворачиваем переходим там дальше по навигации камера используется Ну как бы для того чтобы с такими штуками бороться Это хорошо использовать эффекты Ну так поскольку ты упомянул Не использовал Ну вот так вот Ну на самом деле
00:28:14 - 00:29:31
для есть cycle Event Effect Вроде так он называется и доступен он в какой-то дополнительной библиотечка от самого андроидам уже не помню как она называется который позволяет без использования disposable эффекта отслеживать прямо э эффекты лайф сайкла как одно так и несколько Угу может быть в comp есть вот не смотрел был такой кейс Вот и использовалось использовалось такое решение вот Ну действительно Да может быть уже есть какие-то более Ну более специфические штуки но скорее всего они основаны на disable эффекте вот Хотя не
00:28:56 - 00:30:29
уверен Окей хорошо а помимо помимо сайд эффектов как вообще ещё можно уменьшить количество ре композиций количество реком можно Ну по крайней мере этом извест способы можно уменьшить тем что Ну на самом деле в этом в знания этого мне не приходилось применять ну самое базовое - это засунуть все переменные которые используются в композ функциях в для того чтобы они для того чтобы ремпо проходили более правильно то есть при изменении переменной рекомпозиция [музыка] типа не использовать больших картинок
00:29:41 - 00:31:24
чтобы не тормозили списки в принципе всё соглашусь соглашусь на самом деле е можно передавать допустим КАТО как ты допустим какие-то модели не один общий стет а допустим более маленькие стей В некоторых случаях хорошо может работать допустим ЕС экран крупный вот в этом случае получается будет перерисовывать не весь экран а только та часть которая в которой стейт поменялся то есть ЕС допустим в передавать сте то они это будет него пова он будет ре Композит только тех Чадов которые непосредственно на стейт
00:30:42 - 00:32:07
подписались Вот Но с другой стороны с MV Это не очень хорошо работает потому что MV у тебя один стейт на всё Ну то есть он как часть фреймворка является вот Ну тем не менее в каких-то случаях это может работать Ну не обязательно наверное уже Угу Ну это на самом деле такая двоякая ситуация когда у тебя есть один большой стейт э то тебе в каком-то в какой-то мере удобнее потому что у тебя есть допустим функция контент которая принимает у тебя один твой большой оди большой нежели там та же самая функция контент которая принимает
00:31:30 - 00:32:39
кучу поменьше Ну это полезно для ре композиции но плохо для читаемости кода как пом да Безусловно плюс ещ то его проще замокать скорее всего ну допустим чтобы превьюшку нарисовать или для чего-нибудь такого объект то можно писать тест который вызывает непосредственно с этим СТМ Ну и допустим проводит с ним какие-то операции Вот например Ну например нажатие на кнопки прочее вот ну безусловно не надо модель передавать в них надо передавать линеры Вот получается Может у нас а тест проверяет что нужные линеры допустим высь есть
00:32:04 - 00:33:31
пролито нори всё там стоит прошёл То есть это такие очень быстрые UI тесты которые в эмуляторе запускаются работают гораздо быстрее чем полный интеграционный тест Ну по сути тест для ЮА то есть как-то так вот есть фрево которые этим занимаются Окей говоря о комб да мы проговорили основные вещи вот можно допустим ещё поговорить о мофе немного То есть как мы их используем там Что интересного Есть Угу так Ну про модиф Я скорее всего только базовую информацию изложу то что это можно сказать общая для всех
00:32:53 - 00:34:23
composable функции фишка для изменения внешнего облика Да и не только внешнего но и внутреннего а comp функций с помощью него можно всячески кастомизировать компонент задавать ему размер цвет даже подключать навешивать какие-нибудь Драг ивенты типа Dr клика и так далее Все модификаторы принимаются в качестве функции расширений для базового класса И можно без труда в принципе создать собственный модификатор Ну а если мы допустим пишем функции которые которые Бут более-менее публичные какой там будет контракт для
00:33:41 - 00:35:14
мофе не очень понял вопрос Ну смотри допустим у нас есть у нас есть допустим кани котора там к нашему проекту относит к нашей дизайн системе вот у них соответственно для мофе должен быть какой-то контракт Ну в таком случае если речь идёт о общих компонентах то модификатор принимается в качестве аргумента для этой функции В некоторых случаях с какими-то уже дефолт значениями Если я правильно всё понял да да в принципе соглашусь Ну как правило дефолтным значением будет просто мофе вот ну можно что-нибудь добавить ЕС
00:34:45 - 00:35:58
систе вот в принципе соглашусь Да окей Окей собственно говоря если если говорить не то Как вообще у тебя с ко Андроидом Ну можно сказать уже с более leg подходом ско Андроидом имеете в виду U на Ну да да нака нах этом опыт построен на композе и все мои знания и фокус сосредоточен именно на НМ но всё же какие-то знания о хах остались более-менее такие базовые То есть я смогу рассказать что такое как его настроить как сделать адаптер но наверное не смогу рассказать как его можно оптимизировать в каком-нибудь
00:35:27 - 00:37:04
сложном проекте чтобы он не лагал у Ну в принципе в принципе не обязательно Ну не на самом деле оптимизация Rec - это полезная штука вот как бы хорошо что ты об этом упомянул вот Ну действительно там есть есть что оптимизировать но какие-то вещи будут проще какие-то наоборот сложнее Ну там В некоторых случаях там можно прямо каких-то чудес достичь Скорее всего он будет работать после всех оптимизаций побыстрее чем ко Ну так предположительно Ну в принципе не будем об этом Ну как бы ес если вдг воз
00:36:17 - 00:37:37
проблему Я думаю ты почитаешь найдёшь статьи оптимизация юх вот Ну я бы сказал главно просто дишни ну сам такое Первое правило просто айди ники чтобы были у всех уникальные у всех элементов Это уже как бы половину половину магии делает Ну впрочем это я думаю к композ тоже относится Окей угу угу да ты что-то хотел сказать Ну это справедливый для ли то что можно там сделать ключик в виде адики но скорее всего слабо повлияет на ф в лию чтобы был такой эффект как у это надо А ты про ковский ли Да я думал ты
00:36:57 - 00:38:25
про нативный андский вот ну е тоже можно слать бы всё можно о а по жизненному циклу Что расскажешь это как бы такая вещь которая вроде как выглядит почти как на фоне на самом деле нет На самом деле периоди е раз про что жизненный цикл А всего в принципе Аида а ну а несколько основных стай жиз и соответственно завершающие события это и вызывается когда вшка рисовые в нём как правило происходят какие-то процесс инициализации необходимых вещей переменных там допустим который используется в а Так ну и остальные как правило используются
00:37:52 - 00:39:58
для каких-нибудь вещей для того чтобы допустим Как вы сказали уже при случае с камерой останавливать Е возобновлять наоборот возобновлять останавливать прослушивание данных не куша батарейку зазря Ну и в принципе всё ну вызывается когда собственно пользователь видит на экране но пока не может с ней взаимодействовать и когда уже полностью готово для пользователя останавливающие эффекты они идут очеред то есть если выл но не закрыл полностью вызывается оп и если он полностью закрыл приложения если а завершилось методом ш
00:39:09 - 00:40:52
собственным либо если у Андройда не хватило памяти для чего-то то вызывается А если диалог скорее всего у нас многооконный режим и мы допустим на соседнее окно нажали А ну интересный вопрос Кстати я кстати углублялся в это Потому что много режи хср на всех устройствах А и поэтому не возникал надобности пока Ну не знаю декс режим на десятом Андроиде был там окошечки можно было открывать при подключении внешнего дисплея у Самсунгов поэтому как бы это не совсем новый 6 лет уже вот ну ну может проверить Кстати
00:40:08 - 00:42:02
как-нибудь нуно я думаю он пол будет вообще не очень залетела тема с многооконность но может быть где-нибудь где-нибудь надо будет когда-нибудь так Окей хорошо давай тогда поговорим немножко Переключи на на многопоточность вот что вообще Расскажешь про многопоточность Для чего нужна какие инструменты используешь ну лично я в управлени многопоточность использую исключительно так в общем плане многопоточность нужна для распределения ответственности по задачам базовый случай это сделать так чтобы У пользователя не лагал интерфейс
00:41:22 - 00:42:56
когда у него идёт допустим запись или чтение с базы данных запросы в сеть или какие-то другие процессы которые в принципе можно было бы вынести в фон фоновый режим в Джаве есть потоки треды которые которыми насколько я знаю пользовались на на самом Восходе многопоточности в Джаве в Андроиде потом появилась Java и потом как она эволюционировала в кон уже в современной форме которой котором Ну которой можно легко пользоваться и в принципе без труда на самом деле это всё независимые вещи Ну как под низом оно под низом Конечно
00:42:10 - 00:43:50
будет по-любому использовать потоки вот ну точнее пулы Вот рутины как бы Кати и это ну скажем так настройка рутина можно допустим на голых корутина делать без Фло вот зада Ну тоже самое что на потоках Ну или на тинах и [музыка] на вот допустим у нас есть последовательно каких-то действий Ну допустим делаем запрос а потом запрос б потом запрос C и соответственно Ну что-то там манипуляции с результатами проводим Вот это первый кейс второй кейс у Нати запросы должны выполниться параллельно но когда они выполня Все мы
00:43:02 - 00:44:40
должны какое-то действие провести только после того когда когда всё выполнило вот вопрос как это будем делать в первом случае они должны идти последовательно да Угу а имеется в виду реализация на котлин картинах как хочешь Хочешь на жа хочешь на потоках расскажи я пожалуй на рутина что ближе мне так ну при последовательном выполнении запросов можно сделать Ну как Колхозный вариант мне представляется Если вызывать через обычную функцию через н поочерёдно потому что эта функция запускает каротину которая блокирует
00:43:57 - 00:45:32
текущий поток и они собственно выполнятся очерёдности или в принципе в общем можно сде с э запросов какие-то манипуляции Если речь идёт про параллельное выполнение и отдачу результата в конце то в этом случае как мне кажется можно использовать либо FL либо Channel втн тинах Ну с мне более прозрачно так представляется то что три этих запроса поочерёдно отправляют в него значение и как только там достигается лимит э получают эти значения из какой-нибудь другой рутин и обрабатываются и уже дальше идут ну как-то выглядит немножко
00:44:47 - 00:46:26
Костыль хотелось бы немножко более стильное решение Ну я понимаю но операторы В смысле операторы ну через операторы уже есть операторы функциональные ну ага ну если рассматривать то можно сделать мм объединить и с этими данными уже что-то сделать ну можно только вопрос зачем стоит фу заче взя [аплодисменты] обычный не думаю что я смогу правильно ответить на самом деле мо хочешь Ну обычный допустим тебя ходит запрос в сеть это будет обычный Фло Ну можно комбайни обычный Фло тфу с комбайни они в принципе тоже с
00:45:40 - 00:47:22
комбайни но вопрос как то есть просто что они будут итить туда этот комбайн митт вот а потом они как будут итить они ну скажем так с обычными всё понятно То есть вот мы их заказали они допустим после комбайна три пришли и все вот они вот три до нас дойдут вот вообще говоря Ну как вариант можно с комбайни да можно Почему нет Вот Но если мы будем комбайни Ну вообще тут тут как бы логичнее звать то есть при параллельном звать логичнее вот а при последовательном логичнее тть Ну при комбайне они придут три По
00:47:03 - 00:48:22
отдельности в порядке выполнения Ну то есть если один запрос выполнится быстрее то функци будет пытаться обработать один уже полученный результат а два Будут дефолтные и получится какая-то каша Но если стои Flow то да так и получится Но если обычный ф тогда не получится потому что у них нет inal value Вот Но если при зипе то тогда можно исто Flow то есть они тогда Ну у них будет первый Кок они inal value запустят а потом следующим прилетит Zip уже Ну три три п так будет хотя нет он скорее всего будет а надо
00:47:46 - 00:49:10
посмотреть надо посмотреть по диаграммам там есть такие диаграм вот надо посмотреть как это будет работать поточнее Ну то есть он может либо допустим после каждого Мита из сети он может брать значение Ну то есть возьмёт допустим два из кэша один из сети потом прилетит в следующий онда воз вот это вот новы А из будет ное только что недавно обновился пом третий Прилетит сонно уже вот на третье обновление там уже будет ВС обв до конца как-то так будет при использовании вот при комбайне диаграм комба не скажу как
00:48:31 - 00:49:58
будет А если допустим последовательно надо то есть оператор таких те же самые операторы были но вообще они из хаскель пришли из языка ну не не то что из хаскель Но вообще из функциональных языков Просто хаскел это такой один из самых популярных и там вот они вот были очень активно Ну вот ну как бы использовать операторы А если допустим вот без Фло обойтись на корутина как будем делать Ну вот ты сказал через через ран блокинг на самом деле смысл делать ран блокин если Может просто три сопен функции вызвать Ну
00:49:13 - 00:50:25
синхронно Первую вторую Ну я рассматривал запуск этих операций через обычную функцию и поэтому предложил Если через х тоже не [музыка] знаю както к сожалению мне решение без не представляется н можно вызвать допустить Гука делать три этих вызова а потом сделать допустим общего какой-то структуры вот ну просто выть всё Вот а если допустим ты хочешь параллельно сделать То есть такие штуки как есть такая штука как этот Ну короче поищешь вот по анке анке запустить и через все получить Ну да ты можешь н на самом деле ты можешь НКИ все
00:49:53 - 00:51:52
запустить то есть запустить три через асин ты получишь Ну не прос Это если ты получишь обекта Если ты всё в синх запустишь А дальше ты можешь делать у них ну по мере необходимости допустим но они по факту тебя Бут параллельно выполня для каго ЕС надо пря что вот ВС сделать И после этого закончить то можно сделать как бы делаеш у тебя всн выполнится когда всё если не нужен результат Там тоже будет кажется не помню что будет Вот есть ещё этот есть там не помню как называе вот а Join All Вот точно Join да ты же
00:51:09 - 00:52:41
можешь нить Кару сины Ну мо можеш кстати параллельности последно Join Да Join All Ну короче Вот посмотри A All и Join All Угу На самом деле [музыка] Ага О'кей как-то Так я к этому собеседованию больше готовился по языку вопросы а ну до Ну многопоточность у меня тоже была в планах но я до неё не дошёл за время подготовки Ну давай тогда к языкам перейдём тем бо уже время идёт Ну тогда по языку Давай расскажи про экстен язык какой готовился джаву или котлин могу пове джаву не хочешь в принципе но я е знаю
00:52:01 - 00:53:35
так как выходить писал Давай тогда вот Расскажи про экшены Что такое Зачем оно как это работает наверное Как это работает я не расскажу но могу рассказать как используется функци делаются над каким-то типом То есть можно сказать расширяют пол операций которые мы над ней можем сделать И на самом де это очень удобно Для таких операций как объектов из одного типа в другой Ну например из типов слоя даты в тип домена Ну функции могут принимать дополнительные параметры помимо своего типа над которым они собственно вызваны
00:52:52 - 00:54:34
Ну и возвращать резуль как и обыч функции [музыка] можно обра будто быто выполнение на самом деле есть что это как бы вот Ну да в принципе О работает как на самом деле можно вызвать е допу статическая функция то есть создаёт статически Ну объект со статическим методом Первый параметр у него ресивер вот а дальше ти параметры которые Ты уже записываешь соответственно Ну да там создаётся скоуп соответственно скоуп Ну это как лямда который дёргает вот объекты у ну дёргает получается ресивера вот Ну в принципе всё то же
00:53:48 - 00:55:21
самое можно сделать в Джаве в Джаве можно вызвать это просто статика Ну то есть просто работает как статика как как тилка как обычная тилка Вот хорошо снами давай про делегаты поговорим вот хорошая тема Ага ну про делегат Я как раз изучал вчера но не факт что у меня всё сохранилось В общем котлин внёс такую возможность как получение и Ну не только получение на самом деле можно сделать перемену в качестве делегата от другой переменной Ну для этого в классе который вызывается нужно определить метод Get value который будет
00:54:47 - 00:56:23
по мере смены значения переменной отдавать собственно этому делегат А это значение для того чтобы оно динамически менялось а или принимать значение в качестве а value для установки самый распространенный наверное и самый простой делегат - это функция в ко которая инициализирует переменную при первом обращении так Ну наверно отры рассказал возможно вода интерес в целом пра сказал что ну по сути мы деру г То есть как допустим то есть они могут там чтото другое возвращать Гетеры серы вот ну здесь по сути тоже самое то есть мы гиру
00:55:35 - 00:57:16
тертер вот а как он там делегирует неважно то есть по сути можем допустим сделать делегат ферен преф И у нас он допустим будет на доставать по ключу из хранилища на сет писать по ключу вот при этом будет выглядеть как обычное поле Ну как-то так вот само достаточно удобная штука вот то есть не обязательно будет работать имен с переменными он может допустим Бау данных писать даже вть ходить прила Ну как-то так а мне допустим ещё интересно не про регаты для протей а которые дают нам вычисляемые проперти а
00:56:30 - 00:57:42
про делегаты для интерфейсов делегаты интерфейс Так ну я на самом деле про это не слышал Даже Ну я примерно понимаю воз не мо ошибочно то что вызывается метод какой-то из интерфейса и подтягивается его уже какая-то реализация потом в качестве результата Ну почти почти то есть допустим есть класс этот класс допустим реализует там несколько интерфейсов вот Ну допустим Ну допустим у тебя есть какая моделька и она вообще может быть у неё допустим есть интерфейс тоде диалог ебу кая подаде Календа не суть
00:57:06 - 00:58:46
вот у тебя получается эти интерфейс нито методы Ну например не знаю тамде там показать тост к примеру ты допустим реализацию этого интерфейса делаешь Ну где чтобы чере сдела как-нибудь сонно он там через контекст показывает тост всё вот и дальше ты получается вот эту реализацию кидаешь через модельку конструктор е и соответственно Ты когда интерфейс релизу там ну типа она Вот соответственно Таким образом у тебя получается множественное наследование Ну то есть ты можешь хо собрать там класс из маленьких кусочков можешь их
00:58:06 - 00:59:35
заинжектить и получается Они все мется ну все эти интерфейсы смер в один Класс вот у тебя получится множественно наследования от нескольких классов Но это при том работает достаточно чисто То есть это работает так как агрегация ну стоишь разниц что эмет твого через там поле Там точка сделает там что-то там прямо вот у себя получишь все эти методы а постойте Всё я кажется понял о чём идёт речь я это использовал на самом деле и по сей день использую себя в композе когда Ну базовый пример из моей жизни то что у
00:59:03 - 01:00:21
меня в функцию ко передаётся как бы уже реализация колка а получается она классом интерфейса и я через это двойно и то вызываю методы Ну если они ну при условии что они не принимают каких-то аргументов Ну это всё-таки ренс не делегат это метод Рен Вот делегат - это больше про множественное наследование То есть когда вот инжектится это это удобно Вот а с референсами Да тоже хорошие вещи часто используются кстати раз упомянул про референсы Вот расскажи немножко про это дело Ну про лямбды и про метод
00:59:44 - 01:01:04
референс [музыка] про Ну про лямбды то есть в общем смысле Угу Ну ну чуть-чуть поконкретнее Мне нужен вопрос Ну что это ну как бы лямда функция выше что это такое там Для чего используется Ну ладно А лямбду в котли можно записать в переменную передать в качестве аргумента функции можно её в этой функции вызвать которую мы передали в качестве аргумента в большин случаев используется как кок какой-то Ну или какая-нибудь функция трир А про функциональны фнн можно в а можно не вызывать эту функцию а только
01:00:24 - 01:02:31
передать функции аргументом которой она является ссылку на эту функцию и она уже вызове в классе где она функции где она собственно реализуется передаётся в эту функцию в качестве аргумента и таким образом избежать дополнительного вызова Угу А вот допустим говоря об оптимизация есть там такие штуки как Inline Cross Inline там такие штуки слышал про них да А ну inine функции а они непосредственно встраиваются в код а вызова этой функции при на этапе [музыка] компиляции при приме функцию есть модификаторы для
01:01:43 - 01:03:24
[музыка] неё сейчас попробую вспомнить она помечает что функцию не нужно ить Ну аргументы типа лямда пони функцию она тоже там за инлайт её вызов а Нола даёт знать что эту функцию не надо инлайт записать в поле можно сделать какой-нибудь нужный вызов а Крос онлайн уже на самом деле не помню Для чего Угу Ну ладно А как это у нас с дженериками связано что это хорошего даёт нам с дженериками при использовании Ну ин функцию Можно как любую другую функцию сделать дженерика И там есть такое очень хорошее ключевое
01:02:37 - 01:04:10
слово как при указании типа которое позволяет узнать информацию про это тип То есть если допустим при случае обычного дженерика Мы у типа можем получить только значение в случае с ти Мы можем получить всю информацию в классе А И это даёт нам М большой простор для действий в том плане что можно узнать и название этого класса и класс родителей А ну от которых этот класс наследуется поля Прай конструктора насколько я помню уж насчёт методов не скажу А Но много информации можно узнать А если без фай
01:03:35 - 01:05:07
то какой тип будет у дженерика если опять же речь идёт про ийн функции то а вообще в принципе ну не Inline функция вот просто вот без ref обычная generic функция genic клас какой тип будет jav м скорее всего any А если речь идёт про jav то object да И собственно методы object там будут над ним применяться можно в принципе в дженерики указать от какого класса должен наследоваться тип например от Ну а это в общем случае для котлина Допустим вот для коллекции ещё каких-то наверно не вспомню Чтобы наследовался Но это можно сделать
01:04:20 - 01:06:12
Ну а когда мы используем наследование в дженерика это называется вариантность В какие стороны может быть вариантность направлена ещё раз вопросик Ну вот то что ты говоришь что там может быть от там ещё чего-то это называется вариантность ну то есть у нас бывает ковариантность Контр риант и инвариантность у Так ну инвариантность - это когда можно получить только конкретный тип этого дженерика То есть получается функции уже подобно обычной функции Ну наверное пример не приведу [музыка] а а Контр вариантность - это когда можно
01:05:16 - 01:06:56
получить точнее когда можно указать Ну на самом деле я могу путаться понятия это когда можно указать что класс жене должен наследоваться от какого-то класса Ну когда должен наследоваться какого-то это ковариантность ну допустим что там какая-нибудь там панды котики вот Ну получается панды котики ко вариантные животному вот а допустим обк он Контр варианте всему вообще ну потому что всё остальное наследуется от от обк Угу Ну контур вариантность реже используется но она используется допустим в коллекциях то есть вот есть
01:06:16 - 01:07:43
Java коллекции и там это используется где-то там в поисках в шпа кстати знаешь как шп работает Ну как работает скорее всего не подскажу но могу базово рассказать что это это коллекция ключ значения Где в качестве ключа является хш значение ш хш сумма значения А время поиска какое время добавления время поиска м время добавления и поиска в хэш мапе константная Ну блин а в худшем случае если по Ну в худшем случае линейно подробнее наверное не скажу если О'кей А что надо сделать чтобы худший случай
01:07:00 - 01:08:56
настал Угу М Ну скорее всего Здесь вопрос не про расширение Если э ну допустим может быть даже и про расширение если допустим добавить туда 100.000 элементов возможно поиск ухудшится до линейного времени вместо констант нет проще у объектах функцию надо испортить чтобы она константу возвращала и будет сразу случае будет всегда Линейная Потому что при одинаковом Шкоде всё попадёт в лист Ну то есть шкод один всё будет попадать в один и тот же лист и будет туда записываться и оттуда будет искать линейным
01:07:59 - 01:09:17
поиском при условии попадания одинаковых объектов Да при условии любых объектов пото что у них хэш-функция будет у всех возвращать то есть там есть Бакет у Бакета соответственно его айдини - это шкод Вот соответственно если у нас у объекта находится Ну соответственно находится сначала шкод объекта по Шкоду ищется Бакет на функция Константа возвращает там нолик единичку там или какое-то число всё будет попадать в один Бакет А дальше он будет по Иу уже искать Поу клю Точнее не по объекту по Шкоду ключа то есть вот тип ключа
01:08:43 - 01:09:57
допустим это может быть не обязательно строка это может быть объект какой-то вот этого объекта может быть шпот констант Вот и всё как бы уже худший случай настал Ну по поводу 100 млн там конечно Бут коллизии Но их не очень много будет то есть их будет недостаточно скорее всего для худшего случая вот для худшего случая там надо будет что прямо сильно Ну на несколько порядков превзойти размерность Инта Ну или что там используется инже шкод ну как бы это сложно Сложно туда столько элементов отправить так Ну
01:09:21 - 01:10:29
ладно поэтому поговорили вот по А ещё хотел про силд классы кратко сик Чем отличается CL Ага нук - это тоже одно из нововведений Холина это условный контракт который позволяет записать туда на Ну наподобие с ямом Ну а нет вернусь к мыс про контракт это контракт позволяющий понять компиляторы и пользователю класса что все его Наследники будут только в пределах файла в большинстве случаев самого этого класса это полезно для того А что в отличие от е намо в янам можно записать какой-нибудь базовый
01:09:55 - 01:11:40
конструктор Ну что-то типа там передать строчки и потом получать доступ к этим двум строчкам но это не очень-то удобно а си классы можно записать объекты другие классы в том числе другие си классы А ну вот си интерфейс примерно то же самое винам тоже можно объекты записать в принципе Угу Ну теоретически Да но не ограничены примитивами можно при желании сил клас записать вина Ну как бы ничем не ограничены в конструктор конструктор да у них просто будет йт фиксированный то есть они будут на этапе компиляции
01:10:49 - 01:12:19
Вот какие есть такие есть записать можем что угодно конструктор просто конструктор вызывается приват вызывается только его кото пили поводу ограничения что сил CL все его должны быть дети в одном файле Ну вроде бы это работает в одном пакете или там в одном модуле Ну короче говоря это Нет там такого жёсткого ограничения чтобы прямо всё было в одном месте Вот и у него всё-таки прикол в другом у него прикол в том что он даёт нам возможность динамический стейт делать вот и он даёт нам возможность реализовать паттерн матчинг из
01:11:41 - 01:12:58
функциональных языков собственно за это мы силд классы и любим Ну допустим динамические стей передавать динамические списки там динамический UI то допустим там у него там есть там хидер есть там Бади есть там футер есть там такая-то плиточка такая-то плиточка такой-то элемент вот у каждого будет свой Независимый стейт а допустим рендерер U будет это всё рендерить в общем виде и допустим него можеть р там динг у силд класса вот такие вот нри допустим Error Ну просто может быть объектом там динг тоже
01:12:19 - 01:13:42
объектом А вот Access он уже будет данные нести ну которые нам фактически пришли Ну то есть это такая штука которая позволяет нам писать красивый динамический динамичный код вот за счёт с помощью использования паттерн Манга плюс ещё смарткат работают для него тоже хорошо лад Ну такой ещё вопрос как бы на фоне того что сикса не мощный механизм и можно допустим и нам по сути тот же самой реализовать на сил классах то есть с точки зрения синтаксиса будет то же самое как будто бы вот вопрос Почему всё-таки оставили и намли Зачем он нужен
01:13:01 - 01:14:17
на фоне такого для базовых перечислений потому что скорее всего если там допустим всего три типа каких-то все представля как обычные типы то есть их можно записать перечислением Ну это по сути перечисление помоему бессмысленно создавать отдельный под объекта вс-таки Да он Для каких-то более динамичных комплексных штук Ну как бы ну как бы в ЧМ Ну можно допустим сделать просто написать допустим в НМ допустим object а рядом object B Вот и получится тот же самый и нам ведь Ну как бы вот с точки зрения
01:13:42 - 01:15:15
синтаксиса его применения вообще не будет отличаться от Има Вот как вот допустим им класс в нём там А B вот также си клас object B Ну либо можно конструктор сделать допустим там object ну там конструкции или там какая-нибудь строка и допустим А ну object а и он там будет с это ну с с одной строкой там А там с другой строкой Ну как бы будет работать так же как и нам вот но всё-таки и намы ещё остались Угу Ну по Я при я в принципе выразил свою точку зрения как-то более глубоко на этот вопрос я посмотреть наверно не
01:14:38 - 01:15:54
смогу ну на самом деле потому что с инами и намы они проще с точки зрения ранта охеда как бы меньше объектов у них есть такие вещи как Ну сразу коллекция со всеми entry То есть у сил класса нет такой сил кла он не знает сколько у него точно наследников Вот и нам он 100% знает сколько у него эн то можно получить список перечисление всех можно сразу его сериализовать в строку можно его сериализовать число в порядковый номер можно взять entry по порядковому номеру по ке Ну с по строковому представлению
01:15:21 - 01:16:34
вот можно сразу ВН записать за счёт этого и нам просто удобнее Ну вот с точки зрения Вот таких вот простых перечислений в плане там работы и сериализации чела некоторые есть Ну с этим вот вещами которые присущие нават ниен что ты скажешь про хранение данных в Андроиде Ну для хранения данных есть встроенная не знаю как назвать утилита которая позволяет сохранять простые данные в Ну простые вплоть до там вплоть до Роки ну примитива так скажем только в данных приложения мо посложнее даже запихать можно
01:15:58 - 01:17:49
сериализовать Ну я видел то что то что обычные данные Андроидов селится в записываются распростра ке как я посмотрю чтобы если там допустим сохраняется не очень много данных чтобы не нести в проект какую-нибудь отдельную библиотеку типа рума для управления А всё отдать на Ну и Раз уж затронул есть да такая библиотека Ну на самом деле обт для бого взаимодействия это библиотека для управления реляционный баз данных то есть управление идёт посредством интерфейсов этот интерфейс реализуется в исходном коде То есть генерируются под
01:17:05 - 01:18:58
него сурсы а пользователю нужно лишь написать запрос вум лум Просто аннотацию то что нужно сделать в банах полезный вещь Просто если мы допустим не хотим шарить не хотим а хотим что-то своё можем такое сделать Ну тут нужно уточнить немножечко По какой причине мы не хотим по прине того что хотим чтото сво или есть чтото более не знаю хотим неструктурированные данные хранить хотим хранить картинки хотим какие-нибудь Джейсон хранить что-нибудь хотим хранить непонятный мм без использования дополнительных
01:18:16 - 01:19:49
библиотек или только рум не в чёт ну как как хочешь как ты видишь как бы ты это сделал Ну допустим для изображений Ну не очень хорошо картинки ни може конечно блом запихать вку но лучше не надо на самом деле Ну я в курсе что картинки ются но ядова глубоко вопрос качест строки потом когда нужно их оттуда вытаскивать И в bitm перекодировать А вдруг они бо ме Ну вот это вопрос да Потому что если картинка большая выходной получится тоже большой и есть вероятность уплыть просто за пределы одного ключа са лучше Лучше не стоит этим
01:19:07 - 01:20:59
заниматься То есть ты можешь в принципе хранить файлы как хочешь можешь сохранить файлы в песочнице приложения без ограничений А если не хочешь в песочнице А хочешь во внешней памяти то с ограничениями вот слышал там какие есть ограничения м по доступу к внешней памяти насколько я знаю приложение вообще не может получить Ну если речь идёт о директория конкретных которые в приложение может залезть это down это какие-то другие внутренние папочки То есть в принципе в некоторые приложения может залезть там Создать
01:20:25 - 01:21:39
какой-нибудь Файлик но в общем случае это работает с внутренним хранилищем и Да в принципе картинки можно кэшировать отдельными файлами просто создавая Файлик врем хранилище приложения записывается раскодируйте доступны для предложения без всяких ограничений То есть это есть Internal Data directory External Data directory Internal cash directory External cash directory вот собственно говоря вопрос больше про Вот это про вот эти штуки То есть я бы рекомендовал такие вещи кидать вш Вот соответственно юзер их может
01:21:02 - 01:22:33
видеть в любом файловом менеджере Ну кстати приложения могут получить доступ к файловой системе на самом деле вполне могут Вот то есть нет на это каких-то супе ограничений Кроме того что надо пермишен просить вот ну особый пермишен для доступа там для полного доступа к файловой системе Ну бы можно попросить вот луше не Т без необходимо ну без пермина обращаться И через Медиа вот можно в галерею кстати закинуть можно закинуть в галерею там е из галереи пори подтянуть То есть это тоже такой способ обращения к системе
01:22:02 - 01:23:11
без перминов Ну как бы допустим если мы из галереи хотим картинку получить Мы обычно вот получаем не саму картинку получаем ри ди по ри можно её систему попросить То есть это Не трет не требует есть в таких случаях Да ну бы зависит от того какие есть вот с этим с этим как-то так с сохранением данных вот Ну на самом деле можешь хранить как хочешь можешь хранить структурировано можешь не структурировано можешь какую-нибудь квель базу данных подтянуть там не знаю рум или cassandra Mobile там есть к
01:22:36 - 01:23:45
примеру Ну то есть как как как бы как хочешь как как бизнес задачи велит так можно делать ну основном используют рум потому что глова штука Ну вот допустим Рим не использует SQL Ну тоже популярная вещь была вот кое-где используется до сих пор даже тоже достаточно быстрая Ну как бы зависит всё-таки от сценариев от кейсов Так ладно у нас в принципе ну мы немножко позже начали Думаю уже может быть стоит переходить какому-то конгу к Задачка просто чтобы ну чтобы сделать это интервью более приближенным к настоящим вот неред
01:23:11 - 01:24:34
прот реша какие-то алгоритмические вещи Ну обычно обычно кидают какую-то шару с шар кодом Ну я постараюсь тебе дать такую простую задачку Ну вот ты должен сначала порассуждать как ты будешь решать Потом можешь её в принципе заходить то есть поделиться экраном и ну и соответственно показать как ты это делаешь Вот будет такая у нас есть массив отсортированных чисел это важно Вот массив отсортированных чисел и нам по сути нужно простое простое действие нам у нас есть Число Вот и нам нужно найти в этом
01:23:52 - 01:25:28
массиве данное число найти его индекс и вернуть этот индекс соответственно а в случае если А в случае если Этого числа Нет ну вернуть допустим Не знаю -1 или Ну ну что-нибудь такое Ну вот ну либо сикс делаешь допустим что там Окей и не окей вот если допустим чисел несколько то если чисел несколько Ты тоже можешь учесть это можешь допустим вернуть силс Там допустим там если в НМ там массив позициями данного числа и допустим там not Ну то есть как как-нибудь так вот такие варианты вот Ну соответственно
01:24:42 - 01:26:22
задача такая простая вот сначала те на порассуждать перед тем как поко и потом можешь это возможно он очень упрощает это то что для этой задачи которую вы указали есть мед массива который Ну или Икс но у нас массив ещё отсортированный ла Ну хорошо Допустим мы мы воспользуемся индексом вот он как бы будет работать хорошо если у на только один такой э у нас несколько Ну допустим вот я расширил задачу чтобы ну я хочу чтобы лист возвращался Хорошо давай хотя бы просто вот лист вернём и в нём список индексов
01:25:32 - 01:26:54
сонно или пустой лист Если такого нет элемента ну или вот все вот индекс Ну то есть чтобы уже вот ко сломался но пока допустим Ну это ладно Это можно сказать ограничение со звёздочкой вот Ну хорошо если допустим ты использу кае какие будут моно такого подхода а сть В смысле э алгоритмически временная сложность по вычислительной сложности и по памяти полагаю что так слышно Алло Так ну Алло Алло Да слышу тебя Алло Дада я слышу так О'КЕЙ в принципе Ну а так ну Я полагаю что сложность у файда будет линейной если
01:26:32 - 01:28:35
мы только его вызываем без какого-то внутреннего цикла Ну да скорее всего если нужно Если нужно найти в итерации то это N к по памяти скорее всего констант потому что у нас и не увеличивается у нас просто идт поиск ну да ну по сути остаётся потому что мы Сколько было столько осталось Ну да хорошо Ну допустим Как как реализовывать через понятно То есть ты просто делаешь там и всё как бы хорошо вот ну или и там вы Дава телу поду быстрее Ну вот Представь что у нас большие массивы вот очень большие и нам
01:28:06 - 01:29:48
прямо вот ну не очень не очень хорошо жить с фандом но зато массивы уже отсортированные Ага отсортированные по возрастанию или это неважно неважно По какому порядку они отсортированы как тебе удобнее будет так и отсортированы Ну мне приходит в голову только самое очевидное решение сейчас пока что на этом этапе сделать чный список и в этот список в цикле записывать найденные элементы точнее их индексы Но это будет медленно как Я полагаю в случае с большими коллекциями Ну список У нас отсортированный есть мы на входе как бы
01:28:57 - 01:30:26
идеальное решение чтобы оно М ну идеально нам бы хотелось иметь логарифмическую сложность и чтобы оно дополнительной памяти тоже не употребляла Нет не могу Наверное чего-то другого придумать чем полный перебор Ну смотри если мы допустим посмотрим на середину массива что мы там увидим [музыка] Ну в смысле какой-то элемент Вот а если мы этот какой-то элемент сравним с тем который мы ищем А сто Ну пришла такая тиче идейка можно в принципе весь массив который мы передаём наход каким-то образом превратить в шпу
01:29:52 - 01:31:43
и проходить искомое значение Ну так не получится Скорее всего Ну мы так просто много памяти дополнительной потратим И линейно будем массив ш мапу загонять что тоже не очень хорошо Угу Ну вот у меня Подсказка что посмотрим середину массива и что мы увидим что мы увидим если мы посравнить элементы середины массива с нашим исковым элементом а Мет ой элементы середины массива так на самом деле Ну возможно речь идёт про метод с двумя указателями когда от середины а нет Там сначала вроде идёт мы пока абстрагируйся от указателей
01:31:19 - 01:33:14
это просто математика Ну как бы смотри если в середине будет среднее число но искомое по сути может быть большим так и самым маленьким числом Ну вот смотри у нас допустим есть число есть у нас допустим число 50 А мы допустим седи и у нас вредине число 25 это значит я кажется понял А если речь идёт про массив только чисел Да а не других объек он отсортирован а Ну в таком случае всё гораздо легче мы идём в середину массива проверяем больше или меньше элемент из комова если больше то идём во вторую
01:32:45 - 01:34:32
половину массива если в меньшую и смотрим потом в середину уже обрезанного массива и ищем больше или меньше элемент и таким образом сужаем область поиска до самой минимальной и там уже ищ Ну на самом деле элемент сам найдётся по сути такими вот обрезками ну там он конечно не найдётся Вот ну как бы если если ОК можешь это походить как ты это будеь пенки так так так так на самом деле тут уже для меня задача Как найти середину массива точнее индекс середины Потому что если размер нечётный то какая-то страна будет ээ
01:33:43 - 01:35:28
превалировать на другой и они получатся неравными что А нам это важно Ну будут они равные неравные а Ну если это неважно то [музыка] а находим середину массива путём того что м делим его длину на два э и получается оказываемся в его середине мм Так ну Ну допустим Угу потом Ну мне легче было бы если бы я это сразу дил на самом деле Ну давай включай демонстрацию там надо девочке написать что мы е включаем Ага о Всё тогда хорошо м так так так так так или в этой платформе в Зуме видно [музыка] да Так а на
01:35:06 - 01:37:18
стриме Угу Хорошо Так ну из а Ита У нас есть и Да вообще мы так не вызовем ты можешь просто их задать Там сверху пока что Ну через вал Ага ну через листов ты через число какое-то Ну в таком случае я сделаю отдельную функцию Да которую буду вызывать из мейна Угу Так нам нужно вернуть э по сути список из индексов Да давай сначала с Инта начнём потому что уже как бы времени достаточно много вот и по список Ты может быть просто на словах расскажешь что будеш делать и этого будет достаточно так а нам
01:37:20 - 01:39:03
нужно [музыка] Так нам нужно во-первых сделать переменную которая будет означать размер массива она будет динамической поскольку мы будем измерять изменять её Каждый раз когда будем его обрезать инид чный список А чтобы мы могли Угу А можно без промежуточных списков мы не хотим лишнюю память тратить так если да в принципе это рациональное замечание Ну впрочем ты пока можешь начать как удобнее вот а после допустим Угу можно подойти к разработке итеративности [музыка] так а функции высшего порядка
01:38:50 - 01:40:41
Использовать можно подобные Ну пожалуйста UE нельзя ну это скорее этеншен а не функция высшего порядка Ну да не экшены можно мо можеш даже использовать там индекс вот эти но как бы в этом случае просто решение будет Не оптимальным ну если бы это было реальное интервью то я бы тебе посоветовал начать Сначала с find ИК А дальше уже Ну допустим прямо в мене написать там find идекс И всё И как бы вот решили задачу Вот ну как бы случае что если не успеешь ть ка что хоть какое-то решение есть вот но опять же это решение хоть какое-то то
01:40:41 - 01:42:14
есть мы его проговорили сейчас можно его не писать Вот всё-таки хотелось бы решение более адекватное вот специально дал задачу такую очень простую Ну в том плане что не требует там каких-то серьёзных серного времени Вот то есть мот было допустим какую-нибудь посложнее задачу но я таки не очень люблю потому что иногда бывает не приходит вот просто решение сидишь тупишь и не можешь её решить вот здесь как бы не должно быть каких-то супер проблем самом мовы хуже чем это Да я понимаю да Угу нам нужно получить индекс среднего значения
01:41:43 - 01:43:08
А так нува допустим над именами в принципе нет смысла заморачиваться Ну как я уже говорил тут сразу замечание уже ты уже прил к линейной сложности то есть вот когда это написал Ты уже линейную сложность мне выдаёшь вот А надо бы нам сложность нелинейную А надо бы логарифмическую то есть без использования внутренних переменных в цикле без использования циклов Ну точнее циклы конечно будут но не такой индек это уже сразу сразу он а мы же не хотим О ага ну сейчас сейчас по сути это будет ещё хуже чем find find индекс там
01:42:31 - 01:44:02
стандартный котлино ВСС А мы же хотим лучше Угу на самом деле не знаю как улучшить возможно через как-нибудь Но ты же программист Придумай Ну я программист я полезу в Google и узнаю как упростить того до но сейчас это же дела Ну как допустим надо цент Ну вот у тебя есть sze sze ну подели его на два вот уже будет центр индекс потом возьми допустим у инпута вот этот вот центр центр индекс Вот тебе будет цент value Ну как бы математика практически второго класса Ну это ну это Линейная Ну да Ну как линейно это константная
01:43:25 - 01:45:18
так а а сейчас вообще что нужно я не очень понимаю решить задачу или уже как-то мысленно улучшить её до лугана и решить это ну простое решение Мы уж как бы обсудили вот Ну мы же обсудили решение через бинарный поиск правильно Ну да Ну вот собственно говоря делаем решение через бинарный поиск ну О'кей вернёмся тогда это м а а зачем нам раунд он сразу уже инт м да Ну и по сути можно уже сущность обрати к немногу и убрать эту переменную в принципе допустим так Допустим мы получили центральное значение
01:45:09 - 01:46:56
списка текущее и нам нужно его сравнить с числом Ну во-первых вопрос зачем тебе вс-таки этот цикл Ну потому что без цикла здесь не обойтись ведь Ну не такого индекс это возможно не нужен вообще Ну ну ты вот сейчас будешь для каждого элемента находить серединку А зачем это делать [музыка] да Ну короче Убери forage индексе вот этот inp можешь оставить вот эту строчечку серединки А вот этот пока убрать цикл потом придумаешь как это обернуть нормально Ну я всё у меня нет догадок больше Ну мы же обсудили
01:46:39 - 01:48:17
алгоритм Ну да и он мне не видит бек Ну напиши какой-нибудь цикл не знаю бой ладно А можно я сдамся просто и не буду её делать Ну конечно нежелательно бы ну да напиши через через find Вот эту вот решение чтобы просто у нас решение было Ну вот то что ты в начале предлагал через котлино ский фй Ну вот обычное решение которое отн которое в одну строчку вот у нас бы для протокола решение Ну ладно я немножко про комментирую тут вот смотри что у нас тут получается вот у нас как бы тут требовалось реализовать
01:48:08 - 01:49:37
бинарный поиск то есть по сути Ну простая алгоритмическая задача вот ты как Как сказал мы находим центр массива вот мы находим элемент сравниваем если допустим элемент больше чем этот центр вот или он меньше там чем этот центр вот ну во-первых мы должны проверить что это центр у нас не совпал ли уже с началом с первым элементом или последним Потому что если он совпал с первым или с последним элементом Ну то если он условно говоря равен нулевому элементу или там N -1 элементу это значит надо выходить из цикла То есть можно сделать
01:50:10 - 01:51:25
допустим цикл Ну вида там while например и в условиях вайла что Ну вот этот вот индекс там не равен нулю и индекс не равен последнему потому что ну если мы пришли Вот до последнего или до нулевого элемента значит всё Мы весь весь массив проживали вот Ну соответственно Да там подойдёт цикл допустим while в этом решении вот как вариант Ну либо просто while Ну while прям хорошо подойдёт Ну типа делать то-то пока Ну вот пока вот этот средний индекс пока средний индекс у нас не равен нулю и пока он не равен N
01:50:45 - 01:51:57
- 1 вот ну где N - это получается длина массива вот N -1 потому что массив с нуля начинается вот последний элемент он как бы на одиничку меньше чем у него индекс чем чем N вот мы получается делаем ва вот находим серединку Вот Нам надо ещё отслеживать текущий офсет от него вот ну то есть куда мы идём вот ну и соответственно относительно этого офсета ну и плюс ещё плюс ещё это ну короче нам надо там делать несколько условий проверок вот и всё как бы будет решено Вот Но действительно там в этой задаче есть
01:51:23 - 01:52:28
кейс то есть Можно придумывать там разные инпуты которые допустим тесты провалят Вот и в этом случае Ну как бы да там на это всё надо учитывать вот поэтому у меня в целом рекомендация будет ну где-нибудь там зарегатся на каких-нибудь сайтах где есть такие задачки Ну допустим самый вот школьный вот мне нравится сайт он такой старый Ну мне прямо нравятся там задачи потому что они для разного уровня людей вот ну можно зарегаться на хаке ран или там на любых других ресурсах где такие задачки Есть Ну там порешать Вот потому что в любом
01:51:57 - 01:53:07
случае на собеседовани спрашивают и Ну как видишь это полезно То есть как бы вот критической ситуации когда немножко надо выйти за пределы фреймворка у нас соответственно можно вот так вот ну ну можно не потерять самообладание решить задачу вот ну и плюс то что ну то что у тебя было решение там с индексом колином но оно в принципе тоже пойдёт Ну то есть ЕС допустим ничего не получается вот просто делаем делаем рабочее решение и всё вот как бы ну говорим Ну так и так хотя бы оно работает хотя бы так
01:52:33 - 01:53:48
получилось Ну собственно говоря тренироваться именно вот на каких-то таких профильных ресурсах Ну потому что в любом случае это будет не бесполезно Вот соответственно Ну Также можно ознакомиться с какими-то общими знаниями там допустим патерно банды 4ка там го гов паттерны их там ой банды четырёх 40 паттернов там по соду тоже ну как бы это всегда будут спрашивать Вот Потом по таким вещам как многопоточность то есть Фло операторы как это всё четь как работать Да тоже рекомендую это всё повторить поиз учать вот смотреть как
01:53:10 - 01:54:29
работают разные операторы вот по хранению данных тоже по хранению данных по пермишен Да ознакомиться Какие Android вообще есть Мише но они не только на хранение данных на доступ в сеть на доступ к устройствам на доступ к файлам Вот Но в любом случае часто встречаются такие проблемы как допустим выть фай из Лере Изра для кше допустим есть уже готовые решения там от фреска от Пика там от глада у них как правило использу там так называемые кэши Ну можно какие-то Другие подключить как бы это всё уже обычно
01:53:57 - 01:55:11
решено Ну просто посмотреть как это люди решают вот как-то так Ну по поводу допустим изучения leg в принципе можно актив изум поза неплохие по жизненному циклу по знанию таких Ну общих особенностей фреймворка То есть я думаю этого будет даже достаточно Вот но в целом мне у меня впечатление сложилось хорошее То есть мне интервью понравилось бы действительно необходимые знания есть вот есть такие вещи Где стоит там немножко подкачаться немножко поучать прежде всего связано арими случае пригодится не обязательно
01:54:35 - 01:56:04
на в работе но хотя бы в собеседованиях но плюс в работе тоже полезно учитывать и иногда скажем так это выстреливает там какие-то нежные моменты Вот Но в работе допустим часто нужно работать с алгоритмами именно каких-то потоков данных то есть вот эти вот как раз операторы Ну операторы для Фло или там работа с корутина вот с какими-то такими сложными вещами которые периодически приводят просто к поломке приложения допустим на хорошем девайсе всё работает хорошо а на не очень хорошем девайсе всё ломается потому что
01:55:22 - 01:56:30
Ну у него там свои свои оптимизации внутренние Ну и допустим вот эти вот пайплайн ломаются то есть Надо чётко представлять как они работают И какая у нас очерёдность действий вот это как бы важно тоже у меня какой-то такой фидбек может быть если ко мне есть какие-то вопросы можно задать спасибо ну вопросов наверное нет я в принципе отследил для себя стороны которая нужно хорошенько проработать касательно кодинга Ключевая проблема здесь У меня скорее всего именно с рассуждением поскольку в одиночку Я бы скорее всего
01:55:56 - 01:57:24
смог реализовать это алгоритм скорее всего сфа э тем более ещё не настолько стрес как на реальном собеседовании касательно Ну вот много [музыка] поточне хватает ограниченного полу методов которые я использую в своей повседневной работе и как бы новые знания не слишком охотно запоминаются А ну по типу методов фу обычного по Ну комбайн опять же которые я очень не Часто использую так Ну и всё в принципе по операторам это как минимум интересно ну то есть реально это прикольно вот такие вот комбайны делать
01:56:42 - 01:58:23
Ну как комбайны не комбайны пайплайн вот комбайн это частный случай это вообще ну как бы какой-то такой этеншен вот а вообще ну функционально Вот именно оператор использ то есть мой любимый есть ста хорошо рабо бы надо прочитать как работат ну вот эти вот такие часто используемые вещи они там для разных задач немножко немножко отличаются вот использовать То есть это всё ну как бы это не очень сложно на самом деле немножко сложно для понимания Но если посидеть то это прямо интересно а на Лайф кодинг Действительно ты немножко
01:57:40 - 01:58:52
растерялся вот ну тут ну тут что можно сказать Ну немножко порешать такие задачки и Ну не стесняться то есть рассуждать потому что в любом случае интервьюер не кусается интервьюер ЕС инв как правило не всегда конечно как правило нет завалить может попросить там совет что-нибудь спросить вот порассуждать допустим задать какие-нибудь вопросы типа правильно я рассуждаю неправильно я рассуждаю вот ну там какие-нибудь рекомендации Там могут последовать какой-нибудь совет и это может помочь То есть просто главное не теряться и всё
01:58:30 - 01:59:43
будет хорошо Ну это даже вот не всегда задача не решённая не всегда это автоматически означает провал собеседования То есть если допустим рассуждения были здравые Ну и было видно ни Ну как правило это не страшно то есть это может ВС равно собеседование быть успешным Ну в общем тут по ладин в любом случае не теряться можно можешь не знаю там друга попросить кого-нибудь что вот он тебе там Каю задачку из накида ет Но желательно брать задачки такие которые ну реально нормальные допустим что вот есть
01:59:06 - 02:00:28
решение ВМ перебором хоро зада перебором А можно алгоритм можно да Но не очень бы хотелось Ну вот как Допустим даже с этой задач то есть вот полный перебор очевидно решение но е не очевидно там получ Что может быть ты не будеь работать реально работе над алгоритмами но ВС равно в какой-то момент Будет какая-то ситуация где Като проблему решать она непонятно как решается что-то сложное заходить вот а как заходить непонятно Ну и надо соответственно кому-то идти тоже накидывать идеи Там кто-нибудь тоже
01:59:52 - 02:01:09
будет те свои идеи накидывать как-нибудь так вместе их решить Вот то есть в работе Вот периодически случаются такие ве Ну сложные выходят неж За Ра на фреймворк как-то так всё спасибо
02:00:38 - 02:01:17