Подготовка к собеседованию на 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 студия с пустым проектом неважно главное чтобы была функция Main но я
00:00:02 - 00:01:14
пока так скажу что будет происходить Ух ты я кстати не знал что хорошо сейчас создам пустой пустой проект и надо провода на то чтобы вот все ссылки там я буду скидывать тебе в личку в Telegram поэтому там разберёмся уже Всем привет ещё раз Меня зовут Семён я больше разработчик в компании кошелек Сейчас я его оставлю не то чтобы ну уже в активном поиске надо работать [музыка] собеседование мы сделаем небольшой такой вот небольшую пародию на то как выглядит собеседование и сегодня мы пройдем два из четырех
00:00:44 - 00:02:08
технических этапов небольших вопросов вот на которые не обязательно отвечать очень подробно можно встретить то что угодно известно по теме вот во второй части первого этапа будет небольшая задача а во второй части мы рассмотрим небольшие примеры кода и просто почитаем что не сделать там Я уже делал каждый там будет примерно 45 минут Надеюсь для начала хотелось бы узнать немножко про твой опыт Да я занимаюсь Android разработкой с 2015 года я делал и приложение для обучения английскому языку и навигационное приложение И банковские
00:01:45 - 00:03:27
приложения и заквашен сейчас я работаю в двух стартапах это адапте и avotrefi вода пте мы делаем сервис для для компании которые хотят зарабатывать на подписках в сторах вот я делаю Android sdk У нас два приложения одно из них анимирует фотографию под определенную песню Там выбираешь песню Она делает анимацию этой фотки Ты можешь там сохранить пошарить Вот Второе приложение у нас это Ламбада и там ты создаешь 3D Аватар из своих фоток и тоже под какую-то песню Только уже не липсинкаешь а танцуешь
00:02:48 - 00:04:18
интересно Скажи когда последний раз Ты проходил продакшн собеседование год назад как она выглядела Примерно вот это было кстати самое необычное мое собеседование потому что оно чуть ли не Единственное за последнее время где было не очень много вопросов Ну вот стандартные вопросы которые есть там основные компоненты Android жизненный цикл Activity вот там сразу все эти этапы пропустили и спрашивали конкретно про те штуки которые по идее должны были быть важны для того проекта куда меня брали работал ли я с
00:03:36 - 00:04:54
не помню кстати чем надо вспомнить а там Ну вот например был вопрос какие есть проблемы если в ресайтлер бьют там в списке низкие статические там фотографии например видео какие от этого могут быть проблемы тогда будет сейчас нужно возвращаться немножко обратно в теорию небольшой дисклеймер вопрос который будет звучать они никак не связаны с вопросами которые задают Авито Поэтому если будут глупые вопросы Извините пожалуйста Потому что вопрос который давали мне они довольно уникальные и сделать их аналог довольно сложно но
00:04:19 - 00:05:38
что-то приблизительное я постарался придумать поэтому мы будем работать по списку который явно не встретиться нормальном собеседовании [музыка] больших вопросов вот давайте начнем Вот первый вопрос собственно Для чего нам в Android необходимо университет манифест это штука которая и самой системе Android дает какую-то информацию и в том числе и в Google Play тоже какую-то информацию Потому что например если ты сделаешь Там юзас фича такой регламент на устройстве этой фичи нет то тебе просто поиск Google Play не выдаст это
00:05:02 - 00:06:49
приложение а так там указываются все штуки которые видны нарушить системе это основные компоненты Андроида это Перми шины тоже о чем-то говорят Google Play когда ты устанавливаешь приложение там Вот точно до того как появились фронтаем перемешины все перемешины автоматом тебе показывались в диалоге именно потому что они были в манифесте задекларированы система о них знала их показывали Ты принимал их сразу основные компоненты метадата тоже может быть То есть можно в манифест просто метадату какую-то
00:06:03 - 00:07:14
написать и потом кто-то ее будет парсить оттуда основные всякие там настройки типа Какие типа экранов поддерживаются тоже можно добавить но это не очень популярно уже [музыка] для проектов которых несколько модулей там может быть много Android манифестов как это делается есть манифест он может быть удачный он может быть неудачный в таком случае нужно делать что-то типа туз replace например вот Особенно эта проблема может быть если например у тебя там два разных но это просто пример у тебя два разных
00:06:40 - 00:07:56
сторонних СДК и у них разные там датабыкопрос например и вот их нужно толстый плейснуть и какой-то свой там смешанный вариант приложить самостоятельно бывают такие проблемы что просто автоматическими справляется и приходится как-то реализовывать эти вопросы да И при этом в Android Stories вкладочка манифест и у него всегда можно посмотреть То есть например не знаю допустим если тебе нужно делать приложения с биллингом но ты используешь биллинг то ты можешь свой манифест permission на биллинг не добавлять хотя перемеши на
00:07:23 - 00:08:38
биллинг нужен ты его можешь не добавлять потому что потому что он уже есть в манифесте биллинг лайбрери и он оттуда потянется автоматом ровно Как пермиши на овертайзен к ID если взять гугловскую библиотеку сопертазин Кади его тоже не надо добавлять потому что он тоже потянется автоматом Какие компоненты описывают Activity сервисы контент-провайдеры файл провайдеры как частный случай контент-провайдераст ресиверы перейдем Какие вообще есть способы передать информацию между двумяти Ну можно через intent
00:08:01 - 00:09:26
собственно Это самый простой способ там через intent extras можно не знаю через какие-нибудь не знаю например через Sharp VI Model через или через какие-то Нижние слои архитектуры То есть ты можешь просто там какой-нибудь Memory cash какие-то данные засунуть и новые активити просто по слоям до туда идет и заберет вот есть еще Activity залп там раньше этому метод переопределяли он активе через Out сейчас есть активити резал такие фрагмент ризал такие новые а если у нас вот одно приложение наши а
00:08:52 - 00:10:14
другое какое-то стороннее на телефоне нам надо получить доступ к его данным так Ну тут у нас Ну если это например речь идет о файлах то это у нас контент-провайдер может эти данные предоставлять вот а еще можно например есть допустим вот неявные интенты значит одно приложение в манифесте манифесте Да в манифесте прописывает интент фильтры другое приложение делает явная интенция определенным экшеном и туда также передаются экстрас который другое приложение обрабатывает Можно тебя остановиться в принципе
00:09:33 - 00:11:05
понятно всё давай тогда дальше средам Что обозначает Android разработки подход singing подходим Activity означает что у нас в приложении будет единственный Activity все остальное будет ну традиционно на фрагментах можно Не инфрагментов можно использовать какую-нибудь кондуктор например тоже не очень часто такой вариант тем не менее есть плюсы в том что Ну с разными Activity потенциально было бы больше Ну кстати да вот надо подумать на самом деле какие именно плюсы мне такой подход определенно больше нравится Я просто не
00:10:26 - 00:11:45
очень формулировал для себя какие именно у него плюсы не Ну раз ты спрашиваешь недостатки у него точно есть можно можно догадаться исходя из вопроса вот недостатки я точно наверное не придумаю так сходу мне кажется что он как бы во всем удобен может быть недостатком можно считать то что у фрагментов сложной жизненный цикл но мне кажется что это так с натяжкой потому что по-моему мне кажется что сейчас в основном много активити осталось только в каких-то легасе проектах которые уже несколько лет живут в том что появилось последние
00:11:17 - 00:12:35
пять лет там скорее всего все-таки уже сингл Activity подход как правило вот у меня такие ощущения сложились тогда дальше пойдем вот второй компонент который ты назвал это сервис Для чего нужен в отличие от Activity он нужен для бэкграунд задач Вот они Сейчас правда немножко немножко то есть они сейчас используются гораздо реже чем использовались раньше вот и очень часто вместо них советуют использовать Work Manager если есть такая возможность [музыка] когда ты хочешь чтобы задача Была выполнена Например тебе нужно чтобы
00:12:14 - 00:13:36
телефон был на зарядке или что был Интернет Или еще что-то вот и это в основном да это нужно не для срочных задач а для тех задач которые Мы просто хотим чтобы они в какой-то момент были выполнены нам не очень важно когда то есть условно а тут вот можно как раз подвизаться на то что вот у тебя есть Интернет ты там на зарядке может еще какой-то constraint И вот тогда в какой-то момент это все сработает То есть если нам надо будет так сказать сиюминутную работу запускать это больше к сервису менеджер это не
00:13:10 - 00:14:23
умеет Ну хороший вопрос на самом деле я по-моему не пробовал то есть Может быть умеет но не гарантирует я могу предположить но так точно сейчас не скажу Да если точно Вот еще про Work Manager вопрос Давай тогда переходить вообще что нам нужно сделать Android проекте чтобы начать рисовать какой-то В каком смысле что нужно сделать Ну прям с нуля вот у нас пустой проект что нам необходимо чтобы был юайт условно У нашего приложения Ну хорошо у нас пустой проект проще чем кажется как минимум как минимум нужно
00:13:55 - 00:15:26
создать Activity вот также помимо Activity Ну ладно давай я сейчас не буду про фрагменты Как бы мне кажется не очень важно в данном вопросе помимо активити но мы либо компост можем использовать либо xml разметку либо в ходе делать вещи я правда не знаю кто так делает чисто в коде не композа именно а просто если Там какой-то сложный вариант не встречал такие вещи Ну теоретически такая возможность тоже есть а Можем ли мы Ну ты сказал уже частично ответственность за вопрос рисовать как-то вообще без xml как еще можно
00:15:06 - 00:16:23
Ну вот есть компост вообще без xml есть просто Вью добавлять в Ну вот не знаю контент View например передать какой-то контейнер с него добавлять Окей Ладно хорошо давай тогда к View перейдем какой вообще жизненный цикл убью который отрисовывается по-моему он там тоже сложный на самом деле но в целом если его упрощать если там не знаю там он финиш инфоид наверное не будем брать или он опять что Windows давай возьмем три основных момента это у нас смажу я вот и дро а мы же это измерение собственно и передача чел дам
00:15:55 - 00:17:34
пожеланий Да сколько они должны занимать челды по моему возвращают Magic Spec Ну ладно я плохо помню эту тему Я сейчас как бы восстанавливаю потому что я помню там может быть взять лет мост и Файт вот потом у нас есть лоял пас где говорится о том уже Кто где расположен и кто в итоге Сколько места займет кому Сколько места можно дать потому что ты можешь запросить больше места чем тебе могут дать вот Android уже собственно отрисовка вот у нас еще есть два метода это не прожить не цикл это просто методы
00:17:04 - 00:18:22
которыми можно перерисовать это инвалидейт и Квест стоял отличаются они тем что инвалидейт нас возвращает только на уровень Дрон то есть настолько Он выполнится после инвалида это рекви стоял он весь путь пройдет из этих вот трех частей хорошо а вот если мы во Вью наши которые мы делаем мы хотим сделать какую-нибудь анимацию Какие способы для этого Android предоставляет различные аниматоры самый базовый этого или аниматор Там просто число меняется и ты из него уже как-то делаешь Какое должно быть значение у Property есть обжиг
00:17:43 - 00:19:17
аниматор он чуть умнее там конкретно нужно подвязываться на какие-то конкретные Property есть Property аниматор по моему он называется это вот тот который view.animate есть еще физик бейст анимешнс и вот из всех системных анимаций они по-моему единственные которые работают даже если в настройках включить эти анимации Ну да если в настройках включить анимации если у тебя энергосберегающий режим то эти вот дефолты Android анимации они перестают работать а физик Бейс работает Вот но он по-моему очень плохо
00:18:30 - 00:19:44
кастомизируется при этом то есть там реально прям физика которую ты не особо можно которую как-то влиять а если нам надо как-то анимировать переход между двумя экранами для этого нас до этого у нас есть транзишн [музыка] вообще как в Андроиде все работает на главном потоке Какие есть способы работаю вынести из главного потока и не заставлять приложение висеть можно просто создать трек можно использовать executor и можно использовать handler просимтаскивал Да я наверное не буду говорить я просто покажу что я
00:19:10 - 00:20:38
достаточно старый что я не помню но они уже все заде прикречены Ну и давай вот перейдем уже к тому Чем пользуется в общем-то все это у нас RX и крутин Давай немножко Вернемся обратно работу хендлер может короче вот есть хендлер есть лупер есть messageq мы это просто очередь сообщения лупер это условно говоря цикл который по этой очереди идет а хендлер он либо передает сообщение кладет сообщение в эту Очередь подвязывается к луперу Да и он либо дает сообщение в эту очередь либо принимает и выполняет рано был оттуда
00:20:06 - 00:21:26
на том которому лупер был подвязан тогда получается не совсем то есть Можем ли мы с помощью хендера сделать например запрос в сеть так Ну запастись на мы не Мы точно можем так запрос в сеть Ну в целом нам Наверное нам наверное ничего не мешает это сделать И потом просто в этой лямбде уже на юай хендере запустить результат знаешь способ создать свой хендер Трейд Ну там тоже под капотом лупер Само собой [музыка] а Давайте пойдем дальше потом вернемся к этому да про RX и про рутины там используется диспанчеры и шедоллеры как
00:21:04 - 00:22:47
вообще для чего они нужны но они собственно определяют где будет выполняться то или иное действие а мендиспанчеры естественно выполняет на Main потоке айодиспанчер выполняет на пуле потоков IO computtation computation и отличаются они тем что compitation нужен для CPU intensive задач и он ограничен собственно говоря он привязан к количеству доступных ядер процессора он условно говоря не ограничен в этом плане потому что потому что для себя Ну потому что одни задачки интенсив и там просто не нужно
00:22:35 - 00:23:58
делать слишком много потоков где просто инаут IO там можно разрастаться условно говоря до бесконечности условно естественно как Давай допустим как для корутин одновременно запустить два запроса в сеть и потом Свяжите их результат мы можем это сделать через корутину async которая возвращает defird Вот и потом просто дважды вызвать его ну на одном и на другом это можно сделать через Zip будет параллельно гарантировать Ну я его воспринимаю как параллельную штуку Видимо нет да раз такой вопрос задан видимо не будет
00:23:29 - 00:24:59
Хорошо давай дальше тогда у нас еще есть такой концепция как джекшн Для чего нужен Android приложение Ну и вообще он нужен для того чтобы вынести Ну чтобы провайдинг зависимости был где-то Извне чтобы мы просто чтобы наша сущности тот который мы пишем чтобы они зависимости просто получали Извне и ну собственно для этого То есть это во-первых для тестирования нам помогает во-вторых это просто разделение ответственности просто по сути а с какими приходилось фреймворкими работать для этого с дагером и с коином
00:24:32 - 00:25:58
с даггером больше они отличаются или они одно и тоже делают они отличаются про Коин там вообще холивары идут сервис локатор это или Di Но самое главное Проблема коэна в том что в нем очень легко упасть в фронтайме в дагере надо постараться чтобы убрать Фронтайм он как правило в компании упадет последние два вопроса буквально метод который имеет тело в него нужно в нем нужно прямо прописать Как именно должна создаться эта зависимость а баинсон нужен для кейсов когда мне проще на примере будет Допустим у нас
00:25:16 - 00:26:42
есть интерфейс май интерактор например и реализация мои интеракторы и у реализации моей трактор Intel инжектор-конструктор то есть в графе у нас это зависимость есть но Граф знает только про мои трактор Input и допустим есть какой-то класс который в качестве зависимости в Конструктор принимает Main трактор именно вот виде интерфейса прописано и тогда если баинс не сделать то у нас в компании упадет он скажет что не может найти зависимость мы можем сделать Байнс который приведет как раз реализацию к
00:26:07 - 00:27:26
определенному интерфейсу и вот если мы этот Байнс пропишем добавим с которой без тела если нотация Байнс и метод у которого возвращаемый тип будет более абстрактный интерфейс нашем случае а тип параметра будет конкретный момент трактор возле моего примера вот в таком случае Граф будет знать про зависимость типа mainteractor и все должно работать тоже возвращает какой-то интерфейс и теле описывается зачем почему они Зачем нужен ну [музыка] Байнс нужен когда мы делаем инжектор-конструктор тогда мы баинс
00:26:47 - 00:28:21
используем я поскорее наоборот спрашивал Зачем провайс Когда избавиться провайз когда избавиться нужен для того потому что мы не все не всеми зависимостями мы так напрямую можем управлять То есть если к нам что-то приходит из то тут только провайсом подойдет и последний вопрос есть еще аннотация компоненты компонент чем они отличаются а насколько я помню Саб компонент Саб компонент как-то расширяет компонент то есть по-моему усадка сапкомпонента насколько я помню доступны зависимости с компонента и что-то еще то что
00:27:40 - 00:29:04
недоступно компоненту вот ну я могу путать я вот эти штуки К сожалению как раз не использовал поэтому у меня тут какие-то остаточные знания ответили Сейчас я тебе скину ссылку Telegram можешь понять пожалуйста пройти и экран расширить со всеми чтобы все видели вот я скинул посмотри пожалуйста пришло так тогда Да все Все пришло пошали так скрин [музыка] так Ну а тут как-то можно по дефолту я шарю только тебе или всем то просто говоришь по шарик всем Я если честно не вижу такую овцу или он пошариться
00:28:30 - 00:30:01
правильно сразу так пошариться Наверное всё-таки всем Ну вот я пошарю тут видно у меня Да все видно скажите все видно в чате Напишите пожалуйста меня там аж трое на этом на этой доске вот собственно это код Авито это то с чем придется столкнуться на собеседованиях на двух четырех интервью сейчас я скопирую сюда небольшую задачу и нам надо подумать как ее можно решить задачу по типу задачи слиткода Когда у нас есть какой-то какая-то проблема И нам надо написать небольшой алгоритм суть задачу состоит том что на вход у
00:29:52 - 00:31:26
нас приходит какой-то лист название не важно абсолютно в нем находится целые числа нам нужно вернуть уникальное количество раз для примера чтобы было понятно начнем с простых примеров вот у нас есть лист в котором только единицы мы возвращаем True потому что там единица которая встречается один раз соответственно второй примерчик это у нас есть два два один двойка и единицы каждый встречается по два раза мы должны вернуть но и большой привет такой для которого будет работать у нас есть четыре пять
00:30:38 - 00:32:06
четыре десять четверки встречается три раза списке пятерки встречаются два раза десятки встречаются один раз эти все 321 не равны Значит мы возвращаем вот язык Я поставил котлин чтобы был автокомплит если у тебя есть еще какие-то вопросы по поводу этой задачи задавай вот на нашу цель написать во-первых подумать каким наверное подходом можно задачу решить и написать на этот подход уже так Ну давай давай Наверное сначала сделаем начальные штуки Да лист название морей так пусть будет так Рей это у нас есть целых чисел
00:31:31 - 00:33:08
комплект тут не до конца Как ни странно вот он мне скобочку не подставил intoon так лист с названием Ray А вернуть True если каждая цифра в нем встречается уникальное количество раз что мы можем сделать первое что приходит в голову это то что мы можем пройтись циклом и скажем сделать мапу intent где у нас ключ мы положим число а каждая цифра то есть не число до цифры числа неважно четверка 10 10 это отдельная единица Да здесь смысле что 10 это тоже как цифра в этом контексте распознается То есть это не один
00:32:41 - 00:34:27
каждое число хорошо Так что можно сделать то можно пройти в цикле и скажем положить в мапу Допустим мы вот кладем четверку и значение увеличиваем на 1 То есть у нас 4 ключа один в значение четверки будет два в значении так здесь у нас будут Велес и потом а так нам еще нужно понять что уникальное количество раз потом нам нужно понять что там уникальное количество раз сейчас будем думать Давай немножко тоже буду помогать какого возьмем третий наш предмет большой какому вида баба будет у нас В итоге
00:33:48 - 00:35:21
можете в этих комментах написать как она примерно выглядит так Ну давай так Допустим вот эти скобки кстати автокомплетится так тут у нас 43 если по моей логике эти вот у нас 52 а тут у нас 10.1 Вот такая у нас мало было бы Как нам узнать что все количество появление наших цифр уникально а можно конвертнуть можно взять вот эти values конвертнуть конвертнуть в сет и сравнить с Айза Окей звучит Как вариант можно проще сделать без сравнения с исходными ключами можно проще сделать так можно проще сделать
00:35:03 - 00:37:07
точнее без конвертации valueus без конвертации в хэш-сет может быть Вот я наверное Кстати может быть я зря к сайту привязался Но вот у сет есть по-моему пуд Вот и может быть он возвращает какой-то флаг положили мы встает В итоге или нет Вот я не помню Если честно возвращает флаг или нет о том успешно ли мы положили Потому что если в сайте уже лежит такой объект то второй раз он его не положит туда он просто у него не заменит вот видимо как-то по-другому надо Видимо это неважно твой подход тоже рабочий Давай
00:36:27 - 00:37:41
тогда попробуем его реализовать так то есть мы просто так Так теперь мы идем по рею так если у нас то есть если у нас ключа нет то он вернет нам нал то есть мы можем сделать от number то есть в этом случае у нас в июне пустое Так это у нас постфикс на инкременты Нам нужен префикс Да чтобы он сначала выполнился так или наверное так или можно наверное наверное вот так сделаем может быть даже без этого можно через вас один либо 0 То есть если у нас тут на мы кладем 0 если у нас тут не Нал мы к этому не надо
00:37:22 - 00:39:23
прибавляем 1 и Вот кладем его так значит мапу дома таким образом заполнили и видимо идем по моей первой идеи да что мы можем сделать Рэй сайт только вспомнить По моему это все-таки Property Access Intex тут То есть если уникальный то они равные да Рей сет сайз Видимо хоть как-то мы решили может быть тут есть смысл подумать как можно было бы лучше сделать наверняка можно выглядят довольно просто место тут Это скорее всего там надо будет использовать разница особо не будет Ну сайт точно один и тот же будет
00:40:17 - 00:41:59
Так давай посмотрим по логике для каждого винта из рея мы говорим что теперь поэтому тут не ноль тут один конечно же если не будет дальше смотрим даже без этого плюса можно было может быть можно было сделать вот так вот сейчас Вот и 0 А тут как надо же можно сделать мог бы стать прежде я был предположил еще поискать бак а тут нет Корнер кейс порно Нет давай сначала идем в коде а потом посмотрим так давай найдем бак входим без учета Корнер кейсов Да так вот Мы создали мапу а после например для примера номер два
00:41:33 - 00:43:22
который у нас 2211 У тебя все время будет возвращаться True а нет все время будет возвращаться false так 2211 но тут и должно возвращаться Да тут возвращается false все окей а для пример номер три у тебя тоже будет возвращаться Fall всегда Да так давай давай смотреть то есть мы положили так первый раз мы кладем четверку у нас получается один Том мы кладем пятерку получается один только кладем еще раз пятерку должно получиться два да четверку 3 не 4 тоже 2 там четверку 3 а потом десятку десятки там тоже нет
00:42:47 - 00:44:10
[музыка] так false будет говоришь да [музыка] что я не вижу мне кажется может мне конечно глаз замылен уже вот я пока не очень понимаю Давайте по поводу того как мы наполняем кошмаку проблем нет Так ну у нас получается у нас остается две части с объявлением наполнение и сравнение [музыка] так с объявлением и так понимаю тоже все хорошо так а вот видимо видимо притёр недавно надо что-то искать так [музыка] Так ну вот мой рейс взяли [музыка] либо поменял либо не поменял ты так если они равны если они равны то значит что все ли Что
00:43:34 - 00:45:30
значит один элемент не удалился все элементы были уникальные но давай так что с чем [музыка] Но количество элементов вы а Господи не раса из конечно же мэп точка вылез как-то так я не помню Кстати мне кажется нет Ну ладно не будем наверно Сейчас проверять может быть да Ну хорошо Может быть может быть действительно проперти Access там да да сейчас [музыка] тоже возможны проблемы будут возможно будут проблемы так [музыка] так Ой Господи а стоп вы стоп а нет вылез это кейс у нас сет был вылез наверно не сет такой
00:45:03 - 00:46:47
же должен быть Да поэтому тут сет у нас Окей поводу корни Корнер кейсов Я особо не могу придумать какие-то супер Корнер кейсы потому что вроде все должно быть нормально может посчитать сколько примерно займет алгоритмическая сложность этого алгоритм по памяти сколько она зайдет так Сначала мы проходимся по циклу по листу цикла проходимся заполняем мапу То есть как минимум как минимум у ATEN у нас уже в кармане по времени а после до после этого у нас лист конвертится в сет что возможно тоже то есть мы делаем один
00:46:24 - 00:48:20
проход а потом мы скорее всего делаем второй проход когда мы конвертим лист в сет но в любом случае по времени у нас тут о от так вот у нас тут по времени то есть до этого у нас был просто лист а потом мы сделали мапу из дополнительно выделили еще мы дополнительно выделяем еще мы дополнительно выделяем [музыка] память для valis как для отдельной коллекции и не закапываюсь слишком глубоко Ну если не слишком глубоко то кажется что тоже что тоже у ATM кажется с этой задачей все вот мы можем перейти
00:47:33 - 00:49:16
ко второй части либо знаете какие-то комментарии по этой будет Давай давай комментарий [музыка] В общем все правильно в плане Задача будет работать [музыка] есть короче еще вариант вместо того чтобы преобразовывать сайт и кидать туда-обратно потом сделать просто второй цикл итерации вот проитарироваться по вылью с и создать ваш сайт и потихоньку его наполняете вот как только мы пытаемся засунуть цифру которая уже присутствует мы возвращаем false либо в конце возвращаем просто но это тоже рабочие тут то есть это делается под
00:48:48 - 00:50:28
капотом с переводом с этой сравнением сайтов в худшем случае она и так и так будет тоже линейное время отрабатывать То есть тут никак не ускорить это вот по самой задачи еще можно было в принципе уточнить какие у нас приходят данные в плане что возможно ли что у нас пойдет нам в листе Но это горных есть их тут сразу включил такие вещи тоже надо прояснять потому что которые приводят задачи они не факт что всегда то есть они всегда супер позитивные вот если есть 22 на 11 тоже надо смотреть как это все работает
00:49:43 - 00:51:25
значение по сути он может не должен влиять на результат Я просто я может быть Почему не спросил Мне кажется что вот первое же предложение оно как-то выглядело как будто там нет никаких нал но наверное действительно надо было спросить вот на вход приходят ли под названием рейса из целых чисел да Но наверное да наверное надо было щелкнуть А вдруг там не только целые числа но ещё и например это так это просто То есть я не знаю как Avito оценивается даче на скрининга Ну это просто вещь [музыка] в остальном но уверенно довольно быстро
00:50:41 - 00:52:05
Ты предложил довольно простая тут тоже проверяется такой Я не знаю базовые знания именно решения алгоритмов по сути не сложно и не должна быть сложной по вопросам которые у нас звучали у меня в принципе тоже не знаю как оценивает Авито но нареканий у меня наверное не было ни по одному из вопросов кроме компоненты компонент но для меня это тоже особо там не страшный на собеседование наверное со мной ты его прошел вот как оценивает это Авито сколько можно ошибок сделать Я тоже к сожалению не знаю если говорить
00:51:30 - 00:52:53
по конкретным вопросам про передачу информации между активития там еще можно сказать в сторону контента и интерфейс мессенджер или как он называется А ты его часто встречал в реальной жизни мессенджеру прям свои практики да да На самом деле я работал с sdk которые ровно так и общалась с приложением основным то есть приложение предоставлялось ДК из ДК с помощью мессенджей дала то есть там была такая коммуникация Ну просто это я твоего ответа абсолютно достаточно Я просто накидываю Что еще можно сказать
00:52:16 - 00:53:47
по поводу плюсов Это зависит очень сильно проект от сложности там тоже Возможно это холиварная тема потому что нет так что он помогает у него появляется дополнительная нагрузка у тебя вся навигация в одном активите происходит тебе надо кучу всего мониторить чтобы тебя был правильный стоять приложение про Work Manager мы говорили там по моему в новой версии есть возможность поднимать эмитет задачи которые надо выполнить сейчас же и они тоже работают через Far Ground Service насколько я помню то есть сервисы уходят в принципе на
00:53:03 - 00:54:39
покой и менеджер должен заменить вообще всю эту систему и отложенный и работа которая надо сделать здесь сейчас вот то есть абстрагировать себя потом про выполнение асинхронной работы мы поговорили там была запиночка на хендере Там просто надо вспомнить вообще что за майндбупер что у нас ну как бы мои трек обладает лупером который на который как раз можно посылать сообщение сообщение тебе будут выполняться собственно мои потоки есть у нас класс специальный hender трек который тебе агрегирует во-первых создание нового
00:54:00 - 00:55:38
трейда а во-вторых создание на этот трейдера и на хендер в этот класс можно тоже посылать сообщение и делать какую-то работу синхронно главном и и бань справа Там наверное тоже важная вещь которую надо сказать про генерацию кода что Байнс генерирует гораздо меньше кода на при использовании проваливается два больше И это влияет В итоге на размер [музыка] Мне кажется успешно прошел первый скрининг в Авито если бы были там такие вопросы там были немножко не такие вопросы поэтому можем переходить дальше
00:54:50 - 00:56:30
Давай да спасибо большое за фидбэк там единственное про хендлер на хэндлер на Мейн лутере когда я говорил то что там на юаньхэндлере можно какой-то результатом вводить как раз Вот его имел ввиду так чтобы добавить вот так дальше ты можешь не уходить с этой доски сейчас я закину наше следующее задание это будет кусок кода твоя задача объяснить всем нам что этот код делает И что будет условно выводиться в консоль и мы пойдем от простого каким-то так тебя не обновилась еще нет я все еще вижу предыдущую задачу
00:55:47 - 00:57:29
Refresh наверное придется периодически рифрашиться потому что у Авито кот под иногда подтупливает сделал еще раз еще раз Хорошо ничего не происходит Я сейчас тебе скину другую ссылку скорее всего их уже помер сервис так попробую по этой ссылке пройти так ты еще не шаришь экран кейс так Джастин кейс так вот видно Да ты опять ничего не видишь да Да короче давай я буду тебе в телегу кидать просто кусок кода от его копируешь вставляй и хорошо видно всем так вообще никогда А сколько то есть тоже что-то написал Да туда Да
00:56:47 - 00:58:37
вот эти составляющие возьму да можно самостоятельно сделать так а у меня оно продублировалась Кто кто из нас должен кроить умножать можешь нажимать ты немножко продублировалась видишь где дали все что а все видно вот на 15 строке там где класс начинается заново ударился что на 15 строке так класс Кэт волны string при нити у нас Print name а на им равно Мурзик так Принт на им делает принтелен нейма Ага Ну пока что это выглядит как то что вы нити что-то упадет потому что у нас наем не был проинициализирован
00:58:10 - 01:00:03
она ему нас инициализируется после вызова принт нейма он пойдет в какой момент Я подозреваю что она упадет в А так Я подозреваю что она наверное Так тут надо понять у нас принимает ли принтелен нал то есть Может быть может быть он его как нал распознает Конечно все говорит такое тоже может быть но я так понимаю что это очередной пазл небольшой Это пазл да нет Я предполагаю что нет все-таки Мне кажется что там наверное какой-то там наверное все таки какой-то Exception у нас будет Exception то есть когда мы запустим Main
00:59:26 - 01:00:57
функцию у нас вы не YouTube так или [музыка] а может и нет кстати не если Принт если там все-таки ну с точки зрения живом это жена у нас наверное наверное на у нас это с точки зрения jvm если принтв принимает нал то может быть мало напечатается а почему может быть ситуации например что у нас компилятор скажет что мы пытаемся вызвать какую-то функцию и отпечатать ими до того как мы ее пронициализировали а почему компилятор нам не может это сказать да так имя до того как мы проинициализировали так
01:00:18 - 01:01:50
Надо подумать Подумать Что будет на самом деле Так ну Давай пойдем с другой стороны немножко чтобы было если бы у нас в инете было написано сначала принтола name а потом уже инициализация Так у нас так есть у нас у нас сейчас вызывается функция Если мы представим что мы сразу на месяц назовем А ты имеешь в виду что если бы на месте то линтер бы сказал типа Чувак ты что-то не то делаешь Да если мы выносим функцию то что-нибудь меняется Ну раз ты спрашиваешь Видимо да видимо да возможно ли интернета Ну знаешь как
01:01:52 - 01:03:10
вот есть там штуки где Например у тебя там не знаю нельзя Ну допустим в качестве там ключа для Лога нельзя скажем строку длиннее чем 24 символа например или там firebase и у них свой линтер и если ты эту строчку хардко ешь и там больше 24 символов то он тебе это подчеркнет А если ты эту строчку передаешь какой-то переменной то по моему он в этом месте не срабатывает может быть и здесь то тот же случайно в общем на самом деле тебя правильно ты тоже прозвучал следующую задачу потом в конце мы просто Вернемся
01:02:51 - 01:04:09
поговорим сейчас я скину второй это тоже будет небольшой пазлер можешь принципе все сразу скинуть на самом деле если тебе удобно чтобы спойлеры нет Давай А нет а ты думаешь меня время будет подумать Ну ладно вот собственно следующий я тебе скинул так тоже Перенеси его код чтобы все Да так класс да который ласкает так открыть Ром Тут где был который что собственно будет выведена У нас есть а Пятая строчка невозможно А почему Потому что конст может быть только с примитивами и со строками действительно
01:03:32 - 01:05:18
в остальном код будет нормально работать если мы представим что уберем просто конус все остальное так так то есть это у нас Мы статический про инициализировали кота который у нас имеет Edge name Ага и Ну кажется что кажется что допрос будет распечатан код Сэм которому 21 Давай тогда переходить к следующему немножко отформатирую Да скинул тебе следующую тоже приноси ее вкупаты и что он выйдет так а тест класс.тс значит тест класс а так тесто черного это у нас лямбда тест Господи одни сплошные лямбды так
01:04:46 - 01:06:36
класс точка тест то есть по сути вот этот компания у нас же вообще никак не интересует не работает [музыка] команд Flash тут не работает но поскольку у нас здесь мы создаем instance тест класса и на нем вызываем метод Test то в принципе все что в 20 все что ниже 25 строчки оно нас вообще не интересует вызовется у нас так что у нас это у нас лямбда тесты У нас есть лямбда теста вызывает [музыка] Ну я могу предположить что 12 и 17 строчка что нам просто не дадут их вместе иметь с такими именами скорее
01:06:08 - 01:07:50
всего там будет какой-нибудь name Clash потому что действительно ты можешь вызвать дадут Да потому что Ну действительно ты можешь вызвать либо этот тест либо этот тест в качестве так сейчас лямбда издалям то ты можешь инвок через скобки можешь да можно его через можно его через Да и Ну вот у меня была теория что он не должен дать это сделать то что кажется это было бы логичным но если он дает если он дает то возможно Там просто приоритет какой-то выставлен может быть Уфа она больше приоритет хорошая мысль
01:07:13 - 01:08:46
Да скорее всего так и будет [музыка] вообще чем отличается У нас вот эта лямбда тест и функция но функция теста функция а лямбда тест это New function 0 а по самой записи по самой записи где я если бы нас ладно это сложно сложно мой вопрос короче объяснить вот Окей хорошо приоритеты даются функции тест функция теста вызывается Давай дальше тогда функции есть так Ой ты имеешь то что нужно Я думал ты мне что-то новое конечно ты спрашиваешь Да вот у нас выводится мы выяснили что function Test строка вы видите чтобы
01:08:10 - 01:09:57
дальше происходить так function Test а дальше а вот тут тоже хороший вопрос потому что Я не уверен что можно вызвать этот тест Internal А я понял в чем прикол скорее всего сначала нужно сказать что фантаст Internal должен был быть в самом выше чем его вызов да а и тут у нас остается вопрос Будет ли подчеркнуто что он это не знает либо он возьмет вот этот Test Internal и видимо Видимо он не видит этот тест Internal который в двадцатой строчке но видит тест восьмой строчки Да в этом смысле возможно
01:09:39 - 01:10:59
так то есть мы Да мы примем function Test После этого мы принтим Property Test Internal как мне кажется Ну в общем да у меня теория заключается в том что 19 из 19 строчки нельзя вызвать двадцатую потому что они в правильном порядке но можно вызвать восьмую и он вызовет восьмую Вот я думаю так А вот еще компания обжиг откинул в самом начале там тоже есть такая же функция а да там тоже есть такая же функция но здесь-то она внутри из идет и по идее если бы вызывалась функция из компании новжекта тут наверное было бы
01:10:23 - 01:12:01
тест-класс Точка unturnal поскольку у нас нет статического импорта соответствующего Если бы у нас было соответствующее эстетический импорт можно было подумать но мне кажется что изнутри из лыса до этой функции можно добраться только через Ну вот через тест класс точка Вот тест Internal или или импортировать этот [музыка] то есть вызываться будет именно которая Property у нас с лямбой Я думаю что да и в итоге у нас будет function Test и Property Test Internal Я думаю что да Но если я не прав Я буду
01:11:19 - 01:12:52
рад об этом узнать услышать Окей поговорим об этом тоже в конце хотя давай не будем в конце то что мы будем удалять код давай сразу обсуждать про двадцатую строчку про функцию теста Internal все верно она объявлена в скобки функции но после вызова поэтому тест Internal ничего не знает про вот эту функцию на 20 строке функции с компанией ноутбук то можно вызвать из класса без всех дополнительных штук но она даст приоритет именно Property Test Internal То есть как только Мы удалим Property на восьмой строке у нас
01:12:06 - 01:13:29
подключиться сразу 30 вот в девятнадцатый будет вызываться 30 про то что мы придем в тест Да все верно как минимум потому что вот как у хашмака у нас есть ровно также будет работать тест мы можем Раскрой пожалуйста дома так вот так смотри Да если мы напишем класс.тест без скобочек это вот собственно будет Property но ссылка на проперти если мы должны его инвок отдельно через функцию и тогда если мы здесь напишем волк уже Вопрос не будет уже в Property Да это мы проперте Обращаемся в остальном Да все верно
01:12:48 - 01:14:26
[музыка] по предыдущей задаче там уже в чате ответ написали действительно компилятор ничего из-за того что мы уносим проблемную проблемный код функцию компилятор ничего не знает про эту проблему поэтому он просто выполнен эту функцию И как ты правильно сказал там будет нам значение и принтелен принимает нам и он просто выглядит в консоль тут все хорошо Да сейчас тебе скину следующий кусок кода Давай да Раз уж мы на базерах с лямдами У меня просто есть фан факт я не знаю может быть не все об этом знают
01:13:40 - 01:15:05
вот задним числом очевидный но для меня в какой-то момент это было Откровение если у нас допустим есть скажем класс написанный на Java у которого есть методы которые принимают какой тот или иной сам интерфейс и мы соответственно вызываем из котлинг класса где этот лесенер пишем виде вот такой вот лямбды вот допустим мы сделали соответствующий пытаемся ее засветить в качестве лисенора Сета потом убрать из remova то Внимание это будут на уровне Java разные объекты может быть кому-то интересно было может
01:14:25 - 01:15:55
кто-то не знал Ну вот если специально об этом не подумайте не пойти проверять то это мне кажется не очень очевидная штука потому что там это будет оборачиваться в обертку соответствующую вместе с ним поэтому лям тут конечно объявил один раз но с точки зрения Java это будут две разные штуки вот лестно добавил один а убирать будешь совсем другой и тот который надо будет не уберется вот как-то так смотри пожалуйста так вот Небольшая предыстория закинешь чтобы все видели в матке есть очень много способов
01:15:10 - 01:16:33
получить значение И сейчас мы еще разберемся как это происходит вот собственно перед нами есть вывод нескольких методов плюс вывод самой матки что собственно В каждой строчке будет если будем эти методы вызывать ох ну Окей Я если честно не видел раньше функцию Поэтому я буду гадать Если хочешь без проблем можешь открыть Android Studio сделать тоже простую хашмак с методом и прочитать ее назначение так Мы скорее всего не видел твой экран Да вы скорее всего не видите мой экран сейчас мне сделаю чтобы вы его
01:16:08 - 01:17:58
так как мне так возможности Надо убрать шаринг сделать заново и сейчас видно сейчас видно функции просто [музыка] посмотрим что все эти методы делают так я могу прям все с копипастить да да не запускать хорошо хорошо Я кстати если честно не помню чтобы у меня получалось именно из студии что-то такое запускать не Android Sky по-моему это в идее работает точно а вот работает ли это в студии По моему мне не получилось может я что-то делаю не так работает Работает еще из любого файла хорошо так так
01:17:06 - 01:18:32
на код предлагаю не смотреть документацию вот это то что наверное нужно Давай Да давай документа так без мапкет так вот если можешь можешь объяснить всем нам что тут нам пишут что этот неявный дефолт value используется когда у Когда в оригинальной maype нет value для данного ключа а и value получается через метод Map getfly Давай кстати посмотрим что это за метод является ли он не является Я думал что нет это не оператор фан значит квадратные скобки не про него OK так propertice когда Property делегированы в мапу
01:18:15 - 01:20:08
Когда в мапе уже есть неявный дефолт value а дефолт спиннеры Place Spider School Ну короче да все последующие дефолта заменяют предыдущие но у нас только один дефолт нас это помнит поэтому не очень интересует Так ну короче Исходя из этого мы сразу можем сказать что вот в девятой строчке у нас будет -1 потому что вот он наш дедвел это же тот где Да это тот Где твоя справа давай так -1 так вот первые два варианта это одно и то же потому что Гетто как раз тот самый оператор фан для вот этой штуки Да это оператор
01:19:40 - 01:21:20
а Но поскольку Гетто у нас недет value и там было написано что вы с дефолт распространяется только на get value то наверное можно предположить наверное можно предположить что что здесь будет на Ровно как и здесь а так Гетто дефолт не выглядит как штука которая внутри может вызывать то что ты можешь перейти если что могу перейти да а так могу перейти но gtk jdk sources и тут нет навигации то есть так тут нет навигации но может быть может быть мы можем смотреть а это на все котлин collections наверное
01:20:38 - 01:22:20
надо смотреть на уровне Java на уровне Java наверное смотреть а ну если на уровне джавы раз написано что в джуэме надо смотреть то наверное само собой Разумеется что никакого гетвейлера там не вызывается ответ будет у нас тут нас тут у нас будет 0 до единственное единственное я не до конца уверен что это везде в Андроиде вы срабатывала может быть он работает там условно говоря по-моему есть какие-то штуки в том числе у мамы которые по моему работают только с седьмого что ли Android именно те которые на уровне джавы А у
01:21:40 - 01:22:57
меня тут как раз минимальная версия давай не будет Давай не будем разговаривать хорошо а вот get oils get oils Я бы посмотрел но по логике Так у нас здесь единица посмотрим что у нас такой Get oils это Get ключа то есть Никит ключа либо Вот это лямбда то есть здесь у нас возвращается один а гетто пуд говорил это гет обычный Get это у нас Now если равно Now то в анстер мы записываем то что было в этой лям где кладем и возвращаем результат этой лямбды здесь у нас здесь у нас два в принтв мапе мапы
01:22:26 - 01:24:14
надо смотреть ту стринг надо смотреть какой там ту стринг Чтобы понимать что будет принтовая мапы а какой там ту стринг а никакого понятно Давайте скажу это string там переопределенный и он выводит именно контент мапы а он соответственно видимо на уровне джавы и ни о каком языке Java видимо не знает А ну да собственно в этом же и логично Да что вот у нас getfly это с дефолт экстеншн котлиновский и они соответственно Вот друг с другом как-то работать могут с а учитывая что мапа сама по себе в нашем
01:23:24 - 01:25:03
случае в живом реализацию очевидно что Да что тут у нас будет наверное вот так Окей хорошо все верно Да кроме последнего потому что метод ты там прям читал построчно и еще раз я то ты увидишь [музыка] так Ну смотри детки у нас очевидно на то что этого ключа у нас нет в дефолте У нас два в лямки у нас очевидно на то есть мы Да мы идем построчно мы заходим сюда вот эта штука возвращает двойку то есть Ансар это у нас двойка и в качестве результата мы жанр возвращаем Почему нет мы двойку и возвращаем
01:24:16 - 01:26:07
Ну да все правильно 362 строк игнорируешь пока что А я понял я понял я понял потому что в 13 строчке у нас уже не пустая мама вот в чем суть то есть в 13 строчки у нас будет ну словно говоря в 12 Это правильный ответ да это только 13 что у нас здесь будет как-то так допустим так допустим 2 вот так то что Мак у нас больше не пустая задача которую мы решали На прошлом методе не пришлось бы там делать кучу проверок ты все время там делаешь и получаешь либо получаешь значение или нет не так важно Ну короче где-то работа
01:25:21 - 01:26:59
сразу еще записывает значение по ключу Окей с этим тоже все Сейчас я последнюю задачу и будем закругляться так Вот это задача немножко посложнее Так а мы в студии остаемся Или мы пойдем в котлаб пойдем в каблук сейчас уже не надо будет документацию смотреть Так давай пойдем Давай пойдем так сейчас так так видно да Так это у нас да это у нас наша любимая карутины так супервайзер Job супервайзер Job значит что при ошибке в какой-то из крутин у нас все остальное не отменяется Ага ран блокинг 10000 а 10 тысяч 100 тысяч раз мы делаем
01:26:17 - 01:28:19
Крис тысячи раз мы запускаем скоуп ланч с синхронной секцией так вот у нас и сто тысяч раз мы делаем repeat синхронная секции так а в чем вопрос что будет напечатано что будет напечатано Да вот в девятой строке так Ну давай думать тут мы сто тысяч раз делаем лаунч так допустим у нас окно Видимо у нас Принт онлайн будет все-таки после всех Launcher или сейчас подумаем блокинг у нас блокирующий в том числе исходя из названия и наверное наверное лаунчере тоже блокируют и мы сначала их всех дожидаемся
01:27:57 - 01:29:48
я могу тупить Может быть я не прав Только сказать что в этом коде как минимум две проблемы в принципе не сложно Догадаться что не проблемного кода здесь бы не было минимум две проблемы так синхрона из тут вопрос в том азы is так This это у нас имя класса где мы это объявили точка коты очевидно Ну вернее не точка КТ который как название файлика kt.java То есть это у нас This и так что тут наверное не очень важно какой именно здесь Потому что у нас по сути у нас только одна критическая секция тут и
01:30:13 - 01:31:52
и именно этот момент ни с чем не конфликтует так Я подозреваю что синхронняясь внутри корутина не очень хорошо использовать Потому что потому что там есть свои там есть свой mitex и свой семафор И кстати у меня был кейс когда я заюза в семафор и где-то там в какой-то момент почему-то он тупо все блочил Хотя у меня как бы все работало Как говорится все проходило все было хорошо и спасло меня то что я потом вместо Java улетел кон Карен семафор взял кот line X крутин симмофор и вот с ним проблемы не
01:31:41 - 01:33:14
было без него там прям не то чтобы было даже там вообще энергию вот с другим семафором каких-то кейсах была НР вот рутиновским не было Вот вот так бывает то есть вместо синхронайст как минимум а было бы вы змеютекс есть такой extension вы змеютекс который как раз примерно это и делает концептуально Ну давай тогда концептуальность перепишем уберем неправильную часть Так ну а кстати Ой блин This Да я напутал про This я напутал прозраз Я обозвал что да это конечно не какое-то не статический Файлик КТ это
01:32:35 - 01:34:16
This того что у нас здесь в ресивере возвращая возвращаюсь что-то возвращается не знаешь там у нас возвращается по-моему тоже скоб кстати по-моему тоже сколп У нас там возвращается то есть мы крутинского приходится время так да там приходит корутин скоуп А и тут наверное надо было бы еще задаться вопросом а у нас коуп 1 То есть он же видимы он же наверное придет Да он же наверное Придет сюда в ресивере скоб насадил но в любом случае мы решили что Мы решили что что синхронность надо избавиться и никакого зыса в статическом утилитном
01:33:33 - 01:34:56
файлике Конечно же нет это я что-то затупил нелепо а в ресивере есть так то есть ну как минимум если мы так Шаг за шагом будем сейчас исправлять то это насыс 8 здесь мы только что сказали что это сколп вряд ли это правда что вряд ли у кого поесть функция А я кстати не помню кого она есть Она есть объект она немножко по-другому называется А ну давайте давай создадим Давай создадим you X равно видимо вот так да это будет через такое Да ты вызываешь мне так но функция называется визглок и выполняется
01:34:22 - 01:35:59
так OK пока промежуточный вариант рассматриваем такой Да Действительно это первый шаг к исправлению осталось только одна проблема вот что даже с таким сейчас видом с правильным использованием у нас все равно впринтован не выведется 100 тысяч не вывели а не выведется 100 тысяч потому что Ну как минимум как минимум для той операции которую мы здесь делаем кажется что не нужно делать никаких локов кажется что нужно сделать Atomic integer с инкремент and Get документ данном случае это абсолютно прав Это хороший способ синхронизации
01:35:34 - 01:37:17
гораздо легче Давай попробуем найти проблемы именно с этим кодом Да давай давай попробуем Я просто вот не все нюансы связанные с корутинами К сожалению помню поэтому я вот не очень понимаю Правда ли точно ли Ну вот эти вот скоб точка лаунч в ран блокинге в репите точно ли они будут вызваны последовательно скорее всего Нет скорее всего они вызовятся все и будут выполняться параллельно то есть и плюс плюс будет выполняться параллельно и скорее всего мы придем В принт ln до того как выполнятся все
01:36:33 - 01:38:01
лаунчи как нам сделать так чтобы мы вывели только после того как посчитаем сделаем все элементы так Сейчас подумаю Значит нам нужно нам нужно эту историю как-то заблочить то что заблочит нам надо подождать выполнение жобы надо подождать надо сделать Job Join Видимо да Да что-то Типа да так [музыка] надо подождать выполнение Джо б Единственное что нас все эти штуки Это же разные жопы а и а репит я не помню что возвращает но возможно ничего не возвращает он просто цикл запускает А вот он Крис возвращает жопу да
01:37:26 - 01:39:13
так и и нам нужно где-то на неё за джонницей очевидно да то есть видимо видимо мы можем так ну да Что это изменит в плане вызова функции Крис так а ну видим видимо следующий кризис будет только после выполнения предыдущей то есть Видимо у нас будет не очень конкаен здесь так но но Принт действительно выйдет 100 тысяч да но видимо это будет дольше Да и видимо в другом месте а так то есть здесь Мы создали 10 тысяч так было бы хорошо наверное в какой-то список их положить и потом через форевичах всех за Джонни да
01:39:02 - 01:40:54
так то есть [музыка] Ну ты в принципе ответил да то есть я думаю как это красиво в список положить создаешь список YouTube был лист Джоб Ой просто через это просто да я думал что может красиво это придумали нет хорошо так здесь мы кстати раз мы знаем колит и а или тут в конструкторе нельзя сразу передать или может быть Можно например не очень важно Да в принципе можно было бы сразу создать с фиксированным вообще не особо важно там главное дженерик указать что типы все остальное дженерик так от дженерик у нас
01:40:20 - 01:41:59
[музыка] так а стоп инкрис так инкрис Дань Крис возвращает жопу дальше правильно Крис То есть тут у нас Джобс вот так интересно да что это будет честно я не знаю какой будет результат мы находимся в ранг блокинг это крутим скоб у него есть метод по моему Join All и у него можно передать можем привести к рею и там варакс Поэтому типа этот оператор звездочка чтобы ну ладно Вот давай 3 поговорим Ты вот еще один способ назвал это сделать Atomic int Поможет ли нам в вот в нашем случае делать переменную
01:41:46 - 01:43:27
тайл между без атомика Да без этого никогда Ну а племенная была таял Я не вижу в этом смысла потому что у нас узелок это у нас синхронист блок по сути и у него те же гарантии публикации что и улатайл райта то есть кажется что нет смысла это делать как еще можно вот сейчас неважно синхронно это или не асинхронная как еще можно сделать так чтобы в конце выводилось 100 тысяч принтелен сто тысяч Ну как короче какие еще способы Ты знаешь чтобы все-таки гарантированно инструмент происходил так Ну вот то что я назвал про Atomic
01:42:51 - 01:44:40
Да что давай перечислим что у нас есть у нас вот есть 1 1 1 1 1 1 1 меня не слышно Алло не слышно нет так а я не слышу а сейчас скажи что-нибудь раз-раз-раз я себе я себе сейчас тоже услышал все есть отлично Я остановился на перечислении того что можно сказали Мы назвали а мы назвали значит синхронная секцию мы назвали Atomic Ну наверное еще мы можем сделать так чтобы вот эти вот инкризинхронно работали относительно друг друга это тоже будет работать синхронно как это сделать так Надо подумать что у нас есть из того что
01:43:59 - 01:45:57
у нас блокирует ланч здесь Я так понял нас не заблокируют а если мы так ран блокинг предлагаю к нему не прикасаться не прекращаться чисто чтобы скоп создать [музыка] я что-то не подумал что у меня уже есть созданный и забыл просто убрать Как сделать так чтобы эти инкременты выполнялись не параллельно друг другу а ну по-моему то что я здесь пытался слово Join написать изначально по моему как раз она так работало бы это да он был запускал асинхронно все инкременты но ждал выполнения каждого А как вообще
01:45:16 - 01:46:48
не запускать их асинхронно чтобы они просто параллельно выполнялись именно сама операции но не на основном потоке так чтобы они просто но в рамках корутин да то есть как бы у нас же еще есть execuder singlet Red Pool в котором тоже бы это все последовательно выполнялось вот в рамках паутины я сейчас Если в рамках корутин я сейчас наверно так сходу не вспомню может намекнуть как-нибудь Может быть я вспомнилось переставить чтобы все работало чуть иначе может быть может быть вместо ран блокинга мы могли бы лаунч поставить
01:46:09 - 01:47:36
здесь и внутри и внутри просто бы 10 тысяч раз вот эту штуку бы выполняли Может быть там да В том числе можно вообще это плавать поставить именно перед репетом и будет запускаться репит красиво лавочка как раздал делает что запускает отдельную картину и про сингл вторая все верно А какие есть еще способы синхронизации если уже говорили ютасов говорили выполнение потоки атомики поговорили Какие еще способы есть есть семафор в частности бинарный семафор который немножко похож на metax но отличаются
01:46:55 - 01:48:28
они тем что ньютокс захватывает и отпускать можно только на одном и том же потоке а семафор нет можно на разных То есть можно сделать если там не знаю какой-то колбек на другом потоке возвращается и нужно именно эту секцию сделать критической то просто делаешь семафор с количеством предметов 1 и все хорошо вот есть еще есть скандал Edge есть они похожи различаются они тем что один из них одноразовый когда он речь барьер можно переиспользовать по сути они все сводятся к одному что у нас есть какое-то количество
01:47:46 - 01:49:06
какое-то число У нас есть срабатывает обратный отчет и потоки ждут Как только что доходит до нуля то либо барьер обрывается либо и выполняется какая-то работа да да примерно так работает когда просто ждет блокирует пока не поступит сигнала а барьер ждет типа какие-то экзекуторы на вход чтобы они начали выполнять работы придет три потока Окей про коллекции мы еще не поговорили что у нас есть для работы с коллекциями в синхронной безопасности а есть давай коллекции макро сразу есть например кон Карен хашмаб
01:48:26 - 01:50:14
а есть всякие обертки для коллекции в Джаве что-то из серии collections синхрон Айс лист например вот есть копии он райт релиз есть подошло к концу тут задача Все верно да разгрызли И это будет уже более-менее работать будет все хорошо работать вот поэтому меня все в чате возникали вопросы по поводу того зачем такие вопросы спрашивать я хочу раз напомнить что я не могу спрашивать вопросы которые действительно звучали на собеседование они имеют смысл Но они примерно в этом же русле что надо понимать что происходит в коде
01:49:29 - 01:50:59
условно читать и помнить теорию который я сделал они действительно проверяют очень мало но помогает просто покопаться вот по фидбеку у тебя на третьем этапе дальше будет интереснее Спасибо и пиши Думаю на следующей неделе можем это все сделать все призываю ведущую незаменимую веселин Возвращайся Спасибо большое логическое мышление очень круто спасибо очень полезного интересного есть вопросы Давайте задавайте себе но если есть остановить наверное уже остаться
01:50:28 - 01:52:06