Подготовка к собеседованию на 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 разработчика наше интервьюеры сегодня Владислав из компании прикол Владислав Спасибо тебе огромное что поглотился поучаствовать в нашем ивенте это очень очень ценим это наш кандидат это Мурат Мурат Спасибо огромное поучаствовать быть нашим кандидатом это очень здорово Спасибо огромное собственно будет нас на позицию джунио Джуниор плюс наверное да Ну и не будем откладывать передаю слово Владиславу Всем привет значит первый вопрос Какой
00:00:04 - 00:01:16
бы я начал это чтобы разговориться узнать про твой опыт Мурат я хотел узнать какую ты последнюю может быть не последнюю Но вот какую-то из последних интересную делал фичу или какую-то проблему решал Вот расскажи примерно формате там до четырех минут трех что было интересно какие челленджи Окей когда я пришел вообще на проект ну во-первых всем привет привет Вот И вообще когда я пришел на проект Я первые жира Ну первый же своей задачей взял одну из проблем которая возникает с 12 Android Когда вы используете ваши
00:00:43 - 00:02:18
сервисы я не что-то делают какую-то работу в программ процессе и мне пришлось очень долго сидеть с тем чтобы вообще понятия что вообще происходит и как это пофиксить а и это та задача та проблема которая тянулась со мной в принципе самого начала я натянется до сих пор но сейчас Хотя понимаю как ее пофиксить вот мы ее фиксили там всякими хотфиксами потому что она занималась слишком много времени были другие задачи по типу трекетч но в конечном счете Мы решили что я на и так не фиксится она просто выходит какой-то другую ошибку Мы
00:01:31 - 00:02:46
решили хотя бы заблокировать и посмотреть что там вообще происходит а приселил следующее оказывается что при запуске приложения необходимо Ну вообще надо понимать что на чем я работал это Скажи для чего ты это вообще делал то есть в рамках какой фичи там может или задача Да конечно надо сказать что я работал я работаю сейчас принципе над проектом который предоставляет пользователям возможность такого кастомного аудиорекордера который совместим с часами на vrs Вот и понятно что вот там такая проблема очень актуальна сам
00:02:09 - 00:03:37
проект был написан в годах то 15 во всяком случае видео такие закомментированные строки в самом коде и самый главный вызов как мне показалось это именно архитектура потому что она Ну понятное дело тех кто Копится и переписывать такое ну довольно всем не хочется Вот и ввиду этого как раз таки появляются такие проблемы Вот нужно сказать вообще как связаны функционал получается что когда пользователь запускает приложение мы стартуем сервис какой-то и он проигрывает там какую-то запись потом мы хотим там свернуть наше
00:02:52 - 00:04:12
приложение но соответственно сервис нас продолжает работать он проигрывает какую-то какую-то дорожку Мы решили предложение закрыть а потом мы почему-то решили открыть наше приложение Ну по натив по нотификации или просто открыть его и чтобы но чтобы у нас отобразился экран что у нас идет запись Нам необходимо соответственно запустить сервис по крайней мере такая логика была реализована И вот в этот момент происходил краж он как уже выяснилось после после того как мы заблокировали и посмотрели он
00:03:32 - 00:04:53
происходил ровным счетом потому что вызов метода Start Service он не успевал воспроизвести в рамках 3-5 секунд и ввиду этого происходило краш система просто убивал наш сервис и убивала наше приложение как я выяснил Позже это происходило вероятнее всего из-за того что происходили некоторые операции которые оттягивали вот это вызов это сервис и в итоге происходил я еще заметил что я писал одно из свечей Мне необходимо было например локализовать ну в общем синхронизовать локальные файлы И для этого я прокатился по всем файлам нашей
00:04:12 - 00:05:30
директории Я заметил что этот крас начал происходить чаще когда это файл эту штуку и вот эти пазлики они сложились и вот в течение где-то 8 месяцев эта проблема она была но я не получалось устраниться какой-то промежуток времени но теперь понятно почему оно происходит и собственно довольно очевидное решение пройтись по коду и избавиться от всех моментов которые могут замедлять наш код на мой взгляд это самое интересное такая долгоживущая проблема с которой я работал все понятно хорошо у меня действительно тоже было похоже
00:04:51 - 00:05:56
проблема у инженеров всех уровней огромное количество времени Окей У меня еще есть одна разогревочная задача Вот это кодинг задача она достаточно простая вот посмотреть как бы в Real Time как ты напишешь код сейчас я быстренько ссылочку там есть тоже внутри вот этой платформе звонок но как звонок можно не подключаться я например могу пожарить экран здесь зашел Я на месте на месте Окей попробую написать что-нибудь все вижу тебе на каком языке удобно кот лежала давай писать на котлине Если что я свечу
00:05:34 - 00:07:33
сначала Окей тогда Смотри перед тобой задача тебя есть функция и у неё на вход Input 1 массив это отсортированный массив и второй отсортированный массив своя задача модифицировать твоя задача В общем слизь эти два массива то есть было 20 сортированных и должен получиться один по сути добавить все элементы из 2 1 Но таким образом чтобы он равно остался ребята пошарили сейчас я тогда быстренько прочитаю еще раз сам условия Да давай и приступлю к решению Сразу говорю чтобы ну примерно понимать как временные ограничения у нас на эту
00:07:37 - 00:09:36
задачу примерно 20 минут в идеале Окей То есть у меня дается на вход массив 1 массив 2 они оба отсортированы и необходимо их объединить У меня есть количество элементов в массиве и первым необходимо их объединить и сделать так чтобы они были соответственно образом [музыка] отсортированы также а Самый наверное простой способ который это можно сделать еще нюанс что тут еще описан который ты не упомянул на всякий случай скажу чтоб если что-то время не тратится на решение которое ведет не туда тут первый массив он ну то есть это
00:09:27 - 00:11:01
Java нативный массив который фиксированного размера Они тут сразу по размеру как первый плюс второй то есть у него как бы уже все эти ячейки есть В таком случае я могу сделать максимально Просто я могу контролировать сложить один другой отсортировать не то решение которое здесь требуется написать Скорее всего я не вижу здесь никаких ограничений которые в принципе могли бы нам предложить но попробуем придумать что-нибудь OK хорошо А какая сложность будет у решения которые ты предложил изначально
00:11:05 - 00:12:41
я думаю что там сначала нужно сконцентрировать это скорее всего Линейная а потом нужно их отсортировать если воспользоваться какой-нибудь сортировкой которая там предлагается водороде скорее всего там используется быстро сортировка которая скорее всего сортирует за логарифмическое время мне так кажется [музыка] Хорошо тогда давай оптимизированным решением чтобы оно было линейным ты верно сказал что если так сделать это будет хотелось бы просто Окей У нас есть уже место для этих элементов Значит мы можем
00:12:09 - 00:13:44
[музыка] за линейное что-то мне не приходит в голову то есть мне кажется что Линейная Ну попробую любой тогда сейчас можешь предложить которая пока что тебе быстрее зарядка [музыка] нас уже есть количество элементов должны пройтись Давай сначала попробуем написать придумать решение потом уже такой Окей У меня есть Мысль о том что ты можешь например комменты сделать Вот И там писать А мне кажется что я открываю массив через но открываем массив прохожусь по нему списку этому символ и я хотел бы сравнить
00:13:26 - 00:15:22
первый элемент с первым элементом нашего второго массива Возможно если они равны не подходит OK первый элемент он всегда будет наименьший значит я прохожусь по нашему первому и смотрю во втором массиве если мы находим элемент который равен нашему элементу текущему элементу в Первом массиве то мы его кладем рядом если нет то мы идем дальше в этом случае мы проходимся по обоим и такое ощущение как будто мы не используем наши преимущества которые нам дают У нас тут есть конкретно наши так сказать размеры Значит возможно нужно
00:14:54 - 00:16:32
подумать о том как использовать наши индексы в массивах то есть скорее всего Нам нужно взять условно говоря первый элемент по его индексу конкретно не проходясь по всему массиву а проходясь только по первым трем элементам и повторим элементом во втором массиве и получается просто увеличивает Наш первый массив элементами второго массива если увеличивать наш второй массив элементом первого массива переходит в линейную такое ощущение как будто бы [музыка] в принципе такое похожее решение требуется
00:15:50 - 00:17:15
попробуй только текстом описать хорошо текст нам писать как-то подробно или как-то понятно понятно Что такое открываем Окей я просто не очень представляю как именно это описывать текстом то есть Ну так вот как ты говорил мне так ну у нас есть первый массив мы проходимся по элементам списка нашего по элементам массива нашего по индексам то есть мы берем [музыка] [музыка] Окей давай тогда разберем Что такое ставим рядом Ну если у нас допустим первый элемент 1 в Первом массиве и во втором массиве у
00:16:52 - 00:18:35
нас первый элемент единичка то Ну они должны встать как бы друг за другом в таком случае мы сохраняем порядок для примера следующем напишу а как ты это сделаешь ну конкретно то есть я но в этом случае Необходимо взять индекс текущего мне придется тогда уже увеличивает время за время что если мы сначала положим все элементы первого но все элементы второго массива нет нет OK она придется двигать Как избежать этой операции чтобы нам не пришлось двигать элементы можем можем двигать их по индексам но по сути
00:18:20 - 00:20:00
Это вроде как уменьшает количество времени которое мы тратим это всю операцию возможно нужно воспользоваться тем чтобы у нас тем что я понял У нас есть массив получается второй можем элементы из первого массива положить 2 и то есть то есть мы идем находим первый элемент если он с элементом который находится в во втором массиве то мне кажется что мы должны взять например двойку заменить элемент двойки Ну то есть взять например тройку вместо тройки поставить двойку тройку переместить во второй массив и
00:19:50 - 00:21:30
идти дальше если мы следуем встречаем тройку то мы должны найти еще один элемент следующий элемент 0 Мы берем первый элемент соответственно из второго элемента из 2 массива и вставляем его рядом потому что он равен тройке Ну кажется так насколько было понятно мы если встречаем это то мы вот здесь тройку вернее говоря здесь остается двойкой здесь мы ставим двойку А эту тройку получается перемещаем перемещаем сюда вот и таким образом мы проходимся но так как они здесь отсортированы то условно Ну да
00:20:53 - 00:22:24
здесь единица сначала будет здесь будет получается тройка здесь будет двойка единицам отсюда убрали здесь будет [музыка] не понимаю то есть такой логике что мы должны использовать преимущество наших двух массивов и чтобы не перемещать элементы нашим первым массиве мы их просто перемещаем во второй массив в каком случае элементы Ну если у нас элементы получились они равны получается нужно каким-то образом сместить наши элементы чтобы не совершать эту длинную операцию мы просто перемещаем так как мы знаем по индексам
00:22:21 - 00:23:46
просто перемещаем в другой массив так как они отсортированы то мы можем об этом не беспокоиться а на Какое место мы перемещаем острый То есть у нас было 11 Да они равны если они равны Значит надо переместить оставить значит вот эту мы единичку то есть с индекса правого не перенесем в индекс слева потом снова а двоечку мы поставим сюда В общем заменить местами у нас будет так как они здесь нас будет тройка то мы должны будем перенести эти два элемента сюда [музыка] Окей окей у нас время подходит да Хорошо
00:23:11 - 00:24:55
тогда быстро вот Brainstorm как бы еще ты решил Ну например если можно еще доп массив создать такое Нам тоже Никто не запрещает если создавать пассив то мы можем сделать следующее У нас есть элементы первого массива нужно положить они отсортированы значит мы должны положить Если мы сравниваем сталкиваемся с тем что у нас элементы то мы можем положить эти элементы наш то есть элемент который нам мешает следующем можно положить массив И когда мы заменим этот элемент мы можем его достать и положить
00:24:44 - 00:26:22
и таким образом вроде как не понимаю ну то есть у нас есть доп массив И тогда уже тройка вот эта тройка а то есть мы столкнулись мы перенесли эту единицу сюда А эту двойку мы перенесли в доп массив здесь получается остался 0 [музыка] и в этом случае мы знаем что двойку У нас здесь и можем это как буфер получается Ну это на самом деле решение прям супер сложное выходит наверное так можно решить Но это задача уровня и Если видишь так и то вот если решение больше трех шагов сразу отбрасывается по крайней мере одно валютное решение у
00:25:47 - 00:27:33
нас было самое первое а понял Ну она слишком такая Да есть другие решения более оптимальные Вот Но это уже останется на потом так что можем пока завершить вот эту конкретную сессию с этим алгоритмом и перейти к следующему вопросу вот так у нас собеседование по Android у нас будет еще сейчас секция про язык Ты как сам ходишь на джавек Я большая часть времени пишу код на котле не Но если встречала то в принципе я не боюсь хорошо что тебе больше нравится что-то читаешь чем эти два языка отличаются по твоему
00:26:53 - 00:29:04
мнению в чем преимущество как каждого из них или недостатки главное преимущество в принципе которые меня привлекает в котлине это то что мне приходится писать меньше года с другой стороны если на котле не писать Ну используя все его сахарные фичи то можно написать такой сложный код который будет непонятен и это можно отнести к минусам Ну то есть нужен какой-то гайд-лайн который будет следовать разработчики вот что касается Java в принципе Java Ну удобный язык который Я использовал какое-то время Поначалу
00:28:20 - 00:29:41
и Вполне себе ходки и закрывают но кот он двигался быстрее и он как раз таки какой-то момент понял Ну сами разработчики языка поняли что они для Android форма дела довольно неплохое решение пользуется все радуются и они стали заводить которые полезны и касательно разработки тоже в том числе разработчики котлина пытались устранить все ошибки проблемы которые возникали а какие проблемы Они пытались основной проблемой является то что в Ну в Java часто встречались с ошибкой nopointer Exception это заменили но
00:29:01 - 00:30:29
исправили позволили исправить тем что в котле не добавили новый типы Вот и разработчик Входит ли не сам решает когда у него тип может быть Ну может хранить надо когда он его не может себя хранить и благодаря этому разработчики всегда принципе при разработке уже во время написания кода могут этому удостовериться использовать запасные операторы и как-то обращаться снова и был типами как принципе следует Хорошо давай тогда сходу перейдем на другие темы Давай для разогрева просто такие быстро вопросы позадаю там по
00:29:48 - 00:31:20
языкам Вот как раз у нас же собеседование такое примерно Junior уровень Ну и на этом уровне это самое важное что нужно знать в основном это свой язык его нужно хорошо знать Вот тогда вопрос Чем отличается интерфейс и абстрактный план отличается многими вещами основное то интерфейс реализует такую связь как относится абсолютно класс является Таким образом мы можем выносить какую-то общую логику нашего классов и наследовать наши классы в интерфейс мы выносим какую-то логику которую мы хотим интерфейс как Контракт
00:30:37 - 00:32:10
который говорит нам о том чтобы наши классы реализовывали эти методы тем не менее интерфейс также может иметь реализацию по умолчанию восьмой Потому что есть дефолт имперементейшен под капотом Вот который создает это все вот таким образом также абстрактный класс может иметь instance он может иметь может иметь может он может наследовать классы и быть унаследован Ну множеством исследований нет абстрактной интерфейс он не может насаждать классы соответственно Может им комментировать другие интерфейсы соответственно позволяет
00:31:24 - 00:32:56
инвестирование интерфейсов Вот [музыка] хорошо все достаточно Расскажи про компанию object котлин что это такое Для чего он и какой есть аналог статический переменные методы потому что после нет как таковой статики привычные один из реализации объектов всеми три разные Три разных значения компании методы которые будут статичными будут доступны по а когда мы короче Обращаемся к нашему классу а некий экземпляру и мы можем получить их по имени вот OK Хорошо тогда давай дальше Как устроена кошмак Хорошо тогда давай я буду говорить А
00:32:16 - 00:34:07
если что ты меня перебивай и там сдавать давай вот сейчас такая быстрая секция то есть в целом страсть меньше минуты описать что это для чего как внутри устроено хорошо хашмапа представляет из себя структуру ключ значения Она не относится коллекциям она относится к мапам соответственно ключом является строка а значением какой-либо ключом не может быть другой объект потому что ну теоретически кажется может Но насколько я понимаю это может привести к ошибкам и вроде как это не рекомендуется делать Нет
00:33:34 - 00:35:00
делаем постоянно а ну просто война Почему [музыка] какая-то ошибка может привести Ну стринга ну в общем string используется как ключ потому что принципе он безопасный и безопасно он не может быть изменен то есть он ему табельный и соответственно он безопасный для межпоточного взаимодействия он безопасный Ну потому что мы можем вычислить hashqad и быть уверенными что он не изменится согласен да А почему мы не можем тогда как ключ использовать другой ему табельный объект насколько я понимаю это может приводить
00:34:21 - 00:35:56
загрязнению кучи таким образом что этот объект будет просто [музыка] создаваться в нашей куче и храниться там могу ошибаться не это не так не так нет с любым и мутабельным объектом будет точно так же как со стрингой то есть никаких вот проблем с кучей не будет Ну в принципе все будет то же самое словно Ты можешь создать просто свой кастомный это класс двумя Вау полями которые не меняются и например и все будет работать не встречал такое Идем дальше Да давай тогда внутри устроена внутри кошма по себе хранит связанный
00:35:18 - 00:37:09
список Ну вернее говоря внутри у нее есть пакеты доступ получаем мы что такое понял выделенная память в куче сколько понял вот и когда Подожди подожди выделенная память куча что это такое Еще раз что это такое Что выделенная память кучу что это можешь подробнее описать Что такое выделенная память Ну место котором хранится хранится наш объект Ну то есть куча У нас есть куча которые которым хранится наши создаваемые объекты при разработке и когда мы выделяем место то есть ну какой-то ресурс Давай дальше
00:36:19 - 00:38:17
Окей и соответственно когда мы Ну когда мы хотим получить доступ к нашему объекту Ну к нашему бакету соответственно мы должны вычислить мы должны вычислить его индекс вот чтобы усилить его индекс мы должны получить хашку от ключа умножить его на побитого умножить его на N -1 где N является размером нашей кошмапы для того чтобы она не выходила за размеры соответственно наши копать Вот и когда мы найдем по индексу наш пакет мы должны положить него объект ноду ноты содержит себе ключ значение и кажется еще у нее есть еще ссылка на
00:37:42 - 00:39:13
следующий элемент соответственно мы проверяем пакет на наличие элементов если там элементов нет то мы кладем наш объект ноду и все Окей если там есть элементы то мы проверяем их но сравниваем их курсы если Они совпадают то мы просто обновляем эту ногу если Они совпадают то мы смотрим и проверяем Каждый элемент Хорошо все понятно тогда раз мы затронули тему имеют обилите изменяемых объектов Расскажи тогда в чем в этом смысл то есть какие это преимущества есть какие есть проблемы у объектов которые не ему табель
00:38:30 - 00:40:08
Ну вообще ему табельные объекты они в принципе поддерживают функциональный стиль программирования когда мы изменяем Ну то есть когда мы не изменяем сам объект А в общем-то Передаем объекты с функцией функцию например Таким образом мы делаем код более читаемым более в общем безопасным поддерживаем но тут возникает минусы Когда нам необходимо изменить например нашим дата классе условном Окей Пускай это не будет не дата класса любой другой объект мы хотим изменить в нем какой-нибудь одно поле в этом случае
00:39:20 - 00:40:25
нам придется создавать копию этого объекта изменять это поле и соответственно передавать уже Новый объект То есть это с одной стороны не очень удобно с другой стороны в принципе где-то это можно применять [музыка] Расскажи В чем заключается передача значения по ссылке по значению Я немножко не понял вопрос В чем заключается точнее в чем отличается точнее объект мы можем передавать по ссылке и по значению например в функции вот вопрос сходу например в Джаве Какие типы мы Передаем функцию когда мы их
00:39:54 - 00:41:21
Передаем функции они как по ссылке передаются Какие по значению по значению скорее всего нас передаются примитивные типа А по ссылке скорее всего классы Ну в общем самый классами класса этих оберток вот так как Я могу прямо сейчас сильно ошибиться Но вообще я так понимаю у нас хранится хранятся примитивные типы также хранятся ссылки на значение не примитивных типов ссылки на кучу Вот и соответственно Мне кажется поэтому мы Передаем по ссылке по значению Окей хорошо что ты использовал для многопоточности
00:40:48 - 00:42:35
Ну очень давно я пробовал RX Java Вот но потом у меня был переход на корутина То есть рычаго я пробовал совсем немного больше использовал картины помимо этого я знаю что используется принципе для переключения потоков есть также тьюторы Вот Хорошо тогда вот если ты работал с рутинами давай немного пройдемся вопрос В чем отличие горячих и холодных потоков отличие горячих лунных потоков заключается в том что когда мы используем холодные потоки то мы допустим хотим изменить Это холодный поток и мы выстраиваем цепочку с помощью
00:41:49 - 00:43:21
наших операторов модифицировать операторов модификаторов вот цепочку выстраивается таким образом что допустим Ну выстраивается почка и соответственно оператор сразу же возвращается Вот и эти значения Ну то есть эта цепочка она применится только тогда когда мы используем применим терминальный оператор такие как коллег Турист И так далее Вот соответственно горячие потоки работают таким образом что они не ожидают когда их будут слушать какие-то подписчики они просто выполняют эти операции Ну в общем сохраняют и передают значение
00:42:46 - 00:44:11
своим подписчикам и соответственно что касается этих [музыка] операторов модификаторов они очень применяются как мне кажется сразу Окей хорошо [музыка] как бы ты при помощи каких вот конструкций корутин Ты бы написал код который например делает параллельно выполняет два два запроса в сеть или без разницы куда и возвращает результат выполняет два запроса потом берет оба эти результаты складывает в один объект и отдает уже дальше Давай будем идти по порядку вот у нас как раз открыт сейчас whiteboard
00:43:31 - 00:45:35
то есть можешь написать псевдо кодом То есть тут от тебя не требуется сто процентов правильно знать название функции все такое просто примерно по схеме Как это работает я могу писать сюда Да то есть предположим что у нас есть какая-то функция пускай будет фан 1 она нам возвращает пускай будет string что тут происходит У нас есть функция 2 возвращает нам также string Мы хотим соответственно выполнить два параллельные запроса У нас есть какой-то крутим скоб неважно какой выполняем на него и что мы делаем мы хотим получить оба
00:44:38 - 00:46:20
результата выполнив наши запросы параллельно и сложив эти результаты Соответственно в этом случае мы можем сделать следующее мы можем вызвать потом мы хотим получить эти значения Мы хотим получить мы вызовем у мы вызовем здесь допустим запуска будет важно здесь будет два резонт Вот соответственно здесь мы вызовем Уфа на динозавт и ufan 2 result Ну ладно наверное нужно это две у нас строки Мы хотим их сложить в один объект вот поэтому они нам вернут нашу строку соответственно Значит мы хотим там
00:45:43 - 00:47:34
[музыка] что у нас будет строка [музыка] Давай тогда дальше вопрос многопоточность хорошо а вот смотрю у нас Представь есть такая функция Вот и такой код То есть тут по коментам можно понять что столько рутин запускается и тысячу раз выполняется действие какое-то какое действие У нас тут инкрементится вот это вот переменная как и собственно вопрос Какое какой диапазон числа который может быть выведен в консоль происходит следующее у нас вызывается стол корутин и повторяются они тысячу раз Вот соответственно
00:47:09 - 00:49:26
функция репетана просто повторит как я понимаю а она запустится корутином запустит столько рутин не сразу на последовательно выпустить выполнить вот эта операция внутри этой картины и она также повторит я также вызовет наш экшен экшен наш экшен где мы запускаем вот это Передаем туда запускаем соответственно я вижу что наши потоки они не синхронизированы Вот соответственно в этом случае так как мы запускаем столько рутин запускаем их по тысяче раз Я бы немножко подумал в плане того Окей если она запускается первая каротина
00:48:34 - 00:50:26
и она если мы запускаем ее через корутинскоп с маленькой буквы то он будет ожидать пока все корутины внутри него и завершат свое выполнение и не перейдет дальше соответственно репит он запустит нашу корутину она сделает Launch и выполнит наши действия так как кей у нас равен 1000 то есть ощущение как будто бы с первой же картины Мы постараемся выполнить тысячу наших операций и увеличим наш аккаунтер на тысячу Ну то есть должен запустить и выйти но так как так как у нас здесь внутри нет такого с маленькой буквы то
00:49:52 - 00:51:33
скорее всего он выполнит одно действие и пойдет дальше Ну то есть мне ощущение как будто бы здесь сотню То есть почему то есть у каждой картины всего лишь одно действие запустится один раз OK то есть мы запускаем одну корутину внутри этой картины мы пытаемся запустить 1000 действий с нашей картиной и выполнить экшен где мы увеличиваем наш аккаунтер так как это происходит внутри лаунчер то он запустит нашу корутину и выйдет из неё и такое ощущение как будто бы это все будет выполняться Следовательно Что значит
00:50:46 - 00:52:22
Ну то есть он выполнит и пойдет дальше а так как он дальше то он вернется крепит и запустит вторую так как есть у нас бы здесь уже вот этот вот этот то в этом Ну то есть то в этом случае есть ощущение как будто бы внутри этого ну внутри уже он дождался пока увеличился счетчик до 1000 Вот и в этом случае Только бы отпустил продолжение дал бы следующей картине вот так хорошо что тогда в итоге будет но в итоге я должен сказать что вы видите вот здесь правильно Да диапазон какой-то или точно все все я
00:51:48 - 00:53:24
понял диапазон Ну окей 1000 Карусель они запустится по Ну пускай это будет диапазон от 100 до 200 с погрешностями мне так кажется а почему именно такой диапазон у нас между 1000 то мне показалось как будто это не так много или это много не все нормально Просто я хочу понять Чем обусловлено именно этот ответ мне кажется что Мне кажется что лаунч запустит эту картину Она будет выполняться также запустите следующий крути на также будет выполняться эти картины будут выполняться они будут увеличивать
00:52:39 - 00:54:04
счетчик соответственно не синхронизировано и он не особо будет увеличиваться но где-то он будет увеличиваться то есть очень непонятное объяснение но мне кажется примерно такое Да все правильно только диапазон ты не совсем верно назвал Ну смотри у нас же 100 корутин каждая по тысячу десять то есть максимум будет 100 умножить на 1000 это если как бы нам повезет теории такое может быть она повезет и все эти счетчики будут инкрементированы в разное время поведет и они все будут одновременно и комментировать тогда худшее значение
00:53:46 - 00:55:09
будет собственно тысячи до 100 тысяч я понял следующий вопрос а ну мы не можем использовать какие-то примитивы из Java вот ну только concarn коллекции семафоры и синхронизаторы там доступные Локи Почему недоступны Я не знаю Почему недоступны То есть я не смотрел конкретно Почему я могу предположить что виду того что ну и сущность в блокировке Ну то есть я знаю что вы котлине есть своим ютексы вот я не очень понимаю как они работают под капотом но они работают примерно так же как и синхронизаторы
00:54:29 - 00:56:11
Но честно не знаю почему не работает на шее Ну то есть не работает именно примите выезжала вот помимо синхронизаторов есть этот мы можем синхронизировать с помощью каналов таким образом чтобы передавать соответственно Ну делать вызовы последовательными через каналы то есть каналы они будут выстраивать эту очередь также мы можем синхронизировать с помощью одного но последовательное выполнение Для этого нам нужно будет создать один корутинный поток скоб как-то скорее поток и на нем выполнить операции либо выполнить
00:55:39 - 00:57:07
операции на мои трейде Вот но вроде последний самый такой специфичный очень хорошо какой вот Давай это все можно Да давай у нас есть ограничения не больше двух строк можно хорошо как он будет работать а насколько я знаю что он будет дожидаться Пока выполнится соответственно это корутина И после этого он будет высвобождать ну то есть при попытке другая тема Достучаться до этого вызова блока кода она будет изучать ему что она еще приостановлена и возвращайся раньше чуть позже Окей еще варианты того какими еще
00:56:25 - 00:58:18
если если три строки Ну опять же создать новый называется В общем поток который будет он распараллели на несколько других потоков и на нем запустить [музыка] Окей ну еще один ты забыл Это в принципе да все правильно еще как этот itamic примитивы тоже работаю Да точно OK меня дальше чтобы немного сделать паузу после технических вопросов есть большой вопрос жизни на карьерный Дай пример когда у тебя была какая-то Карьерная цель какая она была И что с ней произошло то есть шел ты к ней выполнил вот или частично может
00:57:44 - 00:59:48
поставил себе какую-то карьерную цель [музыка] попасть на другой проект на другую работу вот Да ты хотел что-то спросить Да почему это важно то есть почему это было да то есть фокус В этом рассказе должен быть почему это важно да конечно важно Это было для меня по той причине что я понимал что на текущем месте работы я развиваюсь это круто но мне не хватает некоторых моментов которые я не могу восполнить по определенным причинам Вот то есть мне хотелось команду побольше мне хотелось обновить проект потому что
00:59:25 - 01:01:02
мне хотелось поработать над чем-то более сложным и лечить свои зарплатные ожидания в том числе и я могу продолжить с пути сколько это времени заняло чему я пришел да давай только можно еще такой небольшой совет вот добавляя Вот немного конкретики например от команду побольше А какая у тебя была тогда команда команда была такой что у нас Но у меня был Лид И я тоже вот и были и есть тестировщики и присоединились к последнее время автоматически тестировщики Ну тестировщики я хотел Ну я начинался готовиться к
01:00:19 - 01:01:53
собеседованиям порядка месяца трех у меня ничего не получалось я не знал с чего начать и как вообще учить изучать большое количество материала Вот и я пришел к своему какому-то идеалу я ну в общем если говорить точнее то не стоит составлять самому банк вопросов берите готовый банк вопросов и просто редактировать его под себя вы сильно сэкономите себе время вот и это что такое банк вопросов Ну есть например какие-то вопросы которые тебя будут спрашивать на собеседовании Я когда начинал их изучать Я сначала
01:01:15 - 01:02:47
чувствовал что очень круто потому что я закрываю пробелы которые я раньше не понимал например ты используешь штуки и Ты вроде их используешь они делают какую-то магию ты не понимаешь что вообще происходит Вот когда ты начинаешь изучать теорию ты закрываешь и ты начинаешь писать код лучше понимаешь что ты делаешь Вот и что касается банка вопросов Я имею ввиду что составлять их самому искать ответы вопросы это очень трудоемкий процесс потому что даже редактирование Вот это вался уже я по выверенному способу
01:02:01 - 01:03:18
порядка двух месяцев и могу сказать что лучше сразу смотрите мог собеседование и составлять хорошее резюме идите сразу собеседоваться так вы себе сэкономите большое количество времени вы знаете что актуально чтобы спрашивать этого не стоит бояться Ну и принципе сами собеседования Они вообще не страшно понял хорошо если вернуться к твоей цели то получается это сейчас твоя текущая цель которую ты делаешь Да да но я ее достиг вот я в принципе прошел какое-то количество собеседований их было немного потому что
01:02:41 - 01:04:11
так часто Ну то есть приглашение были такими частая было порядком 4 собеседований по большей части из них я не испытывал большие трудности потому что сказать по правде вопросы типовые мне хотелось чего-то посложнее Поэтому я решил что для этого мне подойдет Ну и в какой-то момент мне также Окей Спасибо за рассказ хорошо в принципе на этом можно нашему к интервью подвести концу Вот про конкретно Android я особо вопросов не задавал потому что у нас были вопросы про Java и это просто удлинило вот интересно услышать фидбэк от тебя хотя
01:03:30 - 01:05:12
бы рекомендации Возможно да хорошо сейчас будет Ну хорошо давай тогда начнем самого начала после мы начали с вопроса про челленджи задачу Вот первый пункт лучше всего рассказывать про задачу с продуктовой точки зрения потом уже углубляться в детали у тебя было наоборот всегда был такой вот ты начал Android 12 версия Это хорошо Но этим лучше заканчивать они начинают начинать лучше что мы делали там синхронизацию аудио рекордера с часами это сразу дает понять какую-то связь с реальным миром про что
01:04:36 - 01:06:22
вот еще я не совсем из рассказа понял про решенную проблему то есть решил ты ее в итоге или нет Вот это было непонятно и сразу же из этого следует что проблема должна быть обязательно решен если она как бы не решена лучше про другое что-то рассказать вот то есть такие вопросы это для себя возможность рассказать показать что ты как хорошо мысли что ты понимаешь как артикулировать свои мысли твой опыт Вот и то что ты умеешь более общих вещей переходить более узким ты не сможешь не техническим людям
01:05:38 - 01:07:35
рассказать про свои технические штуки потому что разработчиков часто с этим бывают проблемы Окей потом у нас был алгоритм тут в принципе простой просто нужно попрактиковаться Я понимаю что Многие считают что алгоритмы там не нужны вообще Но если типа не хочешь работать на галере всегда то нужно принимать правила игры Тебе не обязательно учить например алгоритмы до уровня Big тех и Google Вот но решать и задачи на лет коде это Маст хэв это просто обязательно второе это учиться писать псевдоход и
01:06:43 - 01:08:24
рассказывать решения без собственно какого-то конкретного языка программирования потому что писать код много сложнее и это замедляет мыслительный процесс и интервьюеру тоже будет намного сложнее тебя понимать Ну потому что когда человек пишет реальный код его сложнее читать человеку вот поэтому надо лучше писать псевдокот Как именно это делать могу тебе быстро показать вот смотри например как бы я подошел к решению этой задачи то есть да И вот например ты задачу может и не решил Но даже показать что ты умеешь
01:07:42 - 01:09:29
правильно мыслить презентовать свое решение это уже очень большой плюс я его только сейчас увидел но может быть и хорошо потому что [музыка] тогда короче потом прочитаю после В общем как лучше доносить вот сразу стоит взять какой-то пример вот конкретно текстом лучше писать как блоками То есть как ты пишешь в программировании блоками с отступами текст тоже можно человечески так структурировать Ну вот например возьмем решение это достаточно такая Типовая задача слияние двух отсортированных массивов то
01:08:41 - 01:10:34
можно решить при помощи двух индексов особенно если у нас уже есть какой-то счет 3 массив это очень сильно упрощает и тогда для простого решения Я бы создал стоимость тоже не оптимальное решение но лучше решить не оптимально чем никак создаем еще один массив потом [музыка] простудился из-за кондиционеров от кашлять получается мы можем в цикле Ну мы можем создать два указателя Pointer которые будут показывать нам индекс в первом и во втором массиве визуализировать это можно еще вот так мы будем смотреть элемент
01:09:52 - 01:11:47
Хмм если элементы у нас одинаковые потом и тогда берем оба элемента и кладем их следующий и инкрементье например и то и то если разные тогда берем меньше и кладем в новый массив и меньше Вот они одинаковые только то что можно то есть Так примерно хорошо показывать на данных которые у тебя есть как это происходит Вот и собственно Хмм Sorry ребята я сейчас отойду на пару минут а то Кашель замучил а можно пока поотвечать на вопросы конечно конечно спросил то что почему нельзя запихнуть все элементы в Один массив И
01:11:53 - 01:13:44
отсортировать его потому что там сложность логарифм а то что показывает сейчас интервью это Линейная сложность будет Да кстати подход тупой интерсдаван использует на канале У нас есть видосик один из крайних видос как раз мы там тупой разбирали и даже вот эту задачку слияние массивов то ли мы разбирали там пример был популярная задача задача нет ограничений Но если ты придумаешь очень быстро такое решение ну в Яндексе по крайней мере тебе будут его усложнять пока одну не будут видеть что у тебя прям
01:13:53 - 01:15:15
дым из ушей повалил он получается у нас за линейное время потому что мы работаем именно с индексами они проходимся по всему массиву нет подожди потому что сортировка минимальная занимает много Гриффин линейно Это потому что ну мы по всему массиву проходимся только один раз тогда кот Вот как он пишется примерно так то есть мы делаем [музыка] для первого массива и если элемент один равен элемент 2 то добавляем оба иначе элемент один меньше элемент 2 то меньше добавляем и его индекс также нужно обработать
01:14:39 - 01:16:42
если мы вышли за пределы это можно просто указать в принципе вот все такая вот Логика для псевдокота его намного проще писать Меньше времени уходит а по поводу языка и другой теории было все достаточно хорошо то есть видно что ты в этой стороне больше всего прокачался достаточно подробные были ответы Единственное что помнишь про concorency мы общались и ты начал говорить там про синхронизационные примитивы жало лучше лучше вообще не говори про то что не знаешь то есть понятно что у всех есть то что мы не
01:16:33 - 01:18:16
знаем но на интервью тебе просто об этом не надо говорить Ну ты просто сам завел вот в эту область в которой ты не знаешь Ты просто по крайней мере сам ее лучше не упоминай ты упоминает то что ты знаешь потому что я тебе может быть задавал бы вопросы которые тебе бы были известны которые были бы более простыми Но ты сам себя завел туда и показал что этого не знаешь я понял Да в принципе это все по фидбеку Спасибо Спасибо большое за принципе сам себе потому что он был очень нестандартный был очень много Ну по крайней мере было
01:17:41 - 01:19:12
больше чем обычно какого-то Лайф кодинга мне это очень понравилось Мне понравилось что это нестандартные вопросы потому что Честно сказать на каждом интервью ты такой типа но опять этот вопрос сейчас опять буду тоже самое рассказывать вот приходилось что-то придумывать думать и это очень круто вот что касается алгоритмической части да я не уделял время просто потому что ну слишком мало но это круто да это еще один повод начать с ней работать хорошо спасибо Спасибо большое ребята еще раз вам спасибо что пришел Спасибо
01:18:36 - 01:20:04
Давайте комментарии почитаю так задача же надо inplace нам с один Решить решение с догмативом выйдет очень грязно все верно [музыка] Ну во-первых решение сдох максимума но все равно можно и Place сделать условно Ну в общем да это как бы худшее решение Оно просто проще и если ничего типа не приходит Я просто хотел показать более простое решение чтобы не запариваться вот Ну и если ничего как бы хорошо в голову не приходит лучше делать что-то Вот Ну да конечно можно спрашивает что не понравилось Ну на
01:19:35 - 01:21:03
самом деле я уже впоследствии заметил что в некоторых вопросов мне стоило задавать уточняющие вопросы может например когда спросил про самые интересную задачу на самом деле я мог бы просто очень развернуто описать то что я делал исходя из моего там принципе как раз идет упорно подготовить части но вопрос был поставлен таким образом я не задал тучащих вопросов и поэтому я ответил так ответил Да да это как сказать Ну да важно задавать то есть на Интервью вам могут интервью и задавать очень размытые вопросы и это не
01:20:37 - 01:22:09
причина например интервью Это для вас причина раскрыть то что вы можете тоже с этим работать и спрашивать что вы имеете в виду Окей тут еще в комментах было немного про рутины чуть больше тысячи Ну да там принципе ответ я говорила 1000 не ста тысяч как правило точно не будет потому что все будет выполняться каждая картина в своем потоке выполняется тогда у меня все отлично Тогда всем
01:21:23 - 01:22:37