Реальное iOS собеседование в Yandex / Мобильный разработчик

Подготовка к собеседованию на iOS Developer

Транскрипция видео:

  • Всем привет давайте определимся что у нас нормально со звуком и с видео и как только мы определимся что у нас нормально со звуком и с видео мы с вами пойдём собственно к нашей сегодняшней теме которая настолько животрепещущий что-нибудь в чатик Напишите там всё видно слышно передавайте привет маме и так далее У меня сегодня очень холодно снег Как вы видите за спиной но сегодня у нас будет жарко всё всё ок Окей А Всем привет ещё раз сегодня у нас будет демо собеседование Чуть позже я расскажу про

    00:00:03 - 00:01:18

  • наших гостей Ну вернее про гостей на моём канале но там естественно будет один кандидат один собеседуем сказать что я где я в горах я это Сочи сзади Вы что не видите вон там ну тут как бы всё пона там вот Питер рядом в общем всяческое Короче ладно давайте перейдём непосредственно к объявлениям первое объявление Как вы могли заметить по картиночки на превьюшки да Или как вы могли заметить по описанию и так далее мы Ну вернее я в данном случае разыгрываю станцию У меня есть станция Я хочу её разыграть разы разыгрывать будем

    00:00:50 - 00:02:11

  • следующим образом в общем Любой кто Любой кто хочет получить Яндекс станцию себе вернее не любой а один человек только получит Да ну вот кто хочет побороться за это право проходим полочке в описании находим там ссылку на мой Telegram канал заходим туда там будет последний пост который я написал давайте сейчас Даже вам покажу как это всё выглядит так shen окно Telegram Вот так это выглядит то есть вот этот вот пост который у нас там внизу самый последний под ним Вы оставляете решение то есть у нас будут

    00:01:34 - 00:02:49

  • задачки да для нашего кандидата А вы оставляете свои варианты решений пожалуйста не спамить просто оставляйте свои варианты решения под этим постом прямо в комментариях в конце я и ещё там один человек мне поможет мы выберем человека который победит и к нему приедет замечательная Яндекс станция Где бы он не находился в пределах Российской Федерации вот Ну давайте собственно переходить к нашему основному событию то есть про конкурс Я думаю всё понятно естественно всё это будет записано всё это будет выложено на мой канал Ну то

    00:02:11 - 00:03:10

  • есть это потом тоже можно будет посмотреть но уже нельзя Конечно будет поучаствовать в розыгрыше Ну и плюс эмоции естественно будут не те а соответственно Давайте переходить к нашему основному блюдо так сказать основное блюдо у нас сегодня собеседование немножечко про собеседование давайте мы послушаем от тех кто его будет проводить поэтому я добавляю к нам так сказать на сцену Никиту Курина который у нас замечательный хороший парень занимается беговыми лыжами 40 собеседований в этом году уже провёл А в свободное время

    00:02:41 - 00:03:48

  • пилит из DK для для рекламы в Яндексе Всё правильно сказал Да всё правильно Всем привет Да расскажи в двух словах вообще что сегодня будет происходить в плане Ну какое собеседование Сегодня мы проведём первое собеседование котором встречают кандидатов Яндекс плюс код на котором пытаются оценить способности кандидата что от него ждать в дальнейшем м как бы Цель этого собеседования не выставить точный грейд а просто посмотреть на что ва кандидат что он умеет решать задачи и что он в принципе готов проходить следующие этапы отлично

    00:03:14 - 00:04:22

  • а проходить на следующие этапы у нас будет второй человек которого зовут Денис Супрун это кандидат от народа свободный так сказать вольный художник и евангелист Авроры Да Денис привет Всем привет да да да всё правильно ты как готов уже к прохождению Ну насколько это возможно насколько это возможно всё посмотрел В том числе и твоё видео на канале посмотрел где ты сам проводил собеседование по iOS посмотрел собеседование пример собеседования по iOS на Янк Weekend Off или как-то так оно называлось вот летом

    00:03:48 - 00:05:09

  • выложенное ещё там видосов посмотрел хабор почитал Ну посмотрим что получится Окей отлично А тогда я сейчас добавлю Вот эту вот замечательную досочка видимо где мы всё это И начнём делать А я пока временно отключусь но я где-то буду тут рядом Так что если что я вернусь и буду отвечать ребятам в чатике ну и соответственно смотреть за вашими решениями Напоминаю что решение писать в телеграме Вот Ну а я соответственно отдаю Вам слово удачи всем Как говорится в этом мероприяти Да Кажется наше собеседование

    00:04:29 - 00:05:36

  • сегодняшнее будет немного не похоже на то которое ты мог видеть с летнего кендо оффера Ну посмотрим как пойдёт уже первый сюрприз Да что мы сегодня будем делать мы будем решать задачи нала кодинг и параллельно говорить о каких-то связанных вещах это будет происходить на платформе Яндекс Inter это блокнот с какой-то подсветкой синтаксиса без возможности автокомп и запуска кода стоит сразу же оговориться то что мы не ожидаем то что ты помнишь все сигнатуры все методы всегда можно у меня спросить Или можно договориться чтобы Мы понимали

    00:05:04 - 00:06:20

  • что твоя функция должна делать Вот всё Угу можем наверное приступать в принципе Дава зайдём зайдём издалека давай поговорим Что такое вообще коллекции Какие коллекции есть в свифте и чем они отличаются коллекции в Ох ну смотри коллекция - это класс который Ну ладно окей в свифте коллекция - это не класс Это скорее value Type да Ну тем не менее коллекция - это Такая сущность которая может хранить в себе другие сущности и организовывает их внутри по определённому правилу соответственно либо доступ к ним будет

    00:05:40 - 00:07:01

  • организован по определённому правилу либо хранение их будет организовано по определённому правилу Ну и так далее чем они отличаются от коллекции в objective C Я честно говоря этим вопросом не интересовался но накидку могу предположить что отличаются тем что в objective C Я думаю в коллекции это референс типа ссылочные вот мне так почему-то кажется а в свифте коллекции - это ну типы значения они там специально хитрым образом устроены Ну в общем мне кажется основно от в этом хорошо вот а давай предположим а

    00:06:22 - 00:07:48

  • зачем Apple вообще сделала коллекцию СМИ и что такое вообще в принципе ну смотри на мой взгляд Apple сделала коллекции типами это очень умное решение ладно окей Шаг в сторону ссылочные типы и типы значения Да у в любой пром в оперативной памяти и соответственно у нас есть там несколько областей памяти есть к это быстрая память которая там в процессоре находится есть куча которая собственно говоря Ну в оперативке крутится соответственно доступ к куче медленнее чем доступ к стеку поэтому Ну нужны

    00:07:05 - 00:08:35

  • механизмы Как оптимизировать процессы обращения к памяти Да потому что ну от этого очень многое зависит зависит быстродействие программы соответственно решение запихнуть коллекции в А да соответственно два типа значит два типа памяти и соответственно есть в свифте У нас есть ссылочные типы и есть типы значения так вот типы значения по умолчанию всегда инстанцию Ну создаются на стеке и соответственно доступ к ним будет быстрее чем доступ к ссылочных типам которые по умолчанию создаются в Вот вот

    00:07:52 - 00:09:15

  • так хорошо а Всегда ли правда что лоцируется на ке а рефрен провоцируется на хи Ох ну насколько я понимаю это не совсем так и это определяется на этапе компиляции Ну то есть конкретно если мы говорим о массивах то есть ну как если у нас какой-то очень простой пример Да там просто функцию пишем и в ней там какие-то небольшие объекты Ну небольшие ссылочные или небольшие ю типы создаём просто в теле функции то как бы оно всё вот так будет работать как я сказал но в случае с массивами конечно оно будет не так насколько я

    00:08:32 - 00:10:05

  • понимаю ну не только массивы а коллекции в целом там под капотом очень много чего происходит и в зависимости от того а Какой это массив Ну допустим смотри если мы создаём массив в глобальном спейсе Да в программе И это статический Ну константный массив просто и всё как бы мы задали массив с какими-то значениями насколько я понимаю он будет на стеке просто потому что на этапе компиляции можно определить его размер и соответственно задать необходимый размер стека и всего что требуется для приложения а соответственно если Ну у

    00:09:19 - 00:10:43

  • нас Внутри там происходят какие-то динамические операции то например то коллекции в свифте Ну стандартные там массив множество Словарь Они все динамические соответственно если мы поначалу запихивают то оно всё имеется в виду ю типы в давай пока ограничимся массив и какие-то типы Да если Мы в массив добавляем ю типы динамические сами лью типы маленькие то видимо Ну до какого-то определённого момента оно всё будет находиться на стейке но в определённый момент когда будет превышен некий доступный порог Я так понимаю в массиве происходит

    00:10:02 - 00:11:36

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

    00:10:49 - 00:12:15

  • и всё с другой стороны это минус потому что ну если ты пишешь какое-то высокопроизводительное приложение в котором Ну тебе принципиально чтобы всё оставалось на стеке то насколько я знаю возможно ты меня поправишь нет какого-то механизма чтобы определить вот этот момент когда всё там перенесено в кучу или я о нём не знаю и как бы это проблема Ну вот так вот Я считаю возможно я ВТО Ну да мы за компилятор гарантировать не можем где он решит лоцирование в свифте Ну получается строки Это коллекции Вот потому что строки в свифте

    00:11:33 - 00:12:56

  • реализованы через коллекции И это тоже val тип Ну тип значения честно говоря не уверен что ещё у нас есть Ну я так Нет я ещё не назову возможно можно что-то подумать насчёт Ну дата типа но тут я могу ошибиться возможно дата тоже до определённого момента возможно дату можно расценивать как коллекцию Но я честно говоря вот знаю только строки ещ что это Коле Мы немножко поговорили по теории Давай перейдём к задаче к первой наше и я хочу напомнить зрителям то что решение можно скидывать к задаче чтобы иметь

    00:12:36 - 00:14:00

  • возможность выиграть станцию А задача на будет такая у нас есть какая-то последовательность и мы хотим её группировать словарь то есть что нужно сделать нужно выбрать какой-то протокол стандартный и написать к нему расширение пба который будет ковать функтор который является однозначным отображением значения элементов ключ результирующего словаря вот Предлагаю сначала выбрать протокол который мы будем расширять и потом написать функцию которая вот может такое делать я привёл два примера сгруппировать почётно или сгруппировать

    00:13:21 - 00:14:32

  • строки по количеству букв в нём в них [музыка] Ну наверное так отображается там да что я печатаю да конечно так я могу там наверное ошибиться с этим как там указывается Женек Ну грубо говоря это должно быть соответственно у нас первый второй пример - это массивы соответственно Да у нас условно должно быть [музыка] Вот так я тут не уверен за этот собственно говоря элемен страшного я либо подскажу либо об условимся что он именно так и называется Да Вот соответственно [музыка] не знаю так получается как-то так ну

    00:13:55 - 00:15:53

  • условно да как-то так А сейчас подожди Да сейчас я потом [музыка] подправки есть так так и теперь так как это у нас массив Так значит Ну вот грубо говоря функция должна быть такая то есть у нас массив некоторого некоторых элементов мы определяем функцию в которую передаётся блок этот блок должен принимать параметр Т собственно которого у нас является массив возвращать int а соответственно сама функция должна возвращать словарь А даже не так то есть сама функция должна извини Я тея рву пожалуйста

    00:15:13 - 00:16:54

  • закрой пожалуйста Telegram то зрителей слышны твоё уведомление Да спасибо Так значит смотри а тут у нас должна возвращать словарь в котором ключ - это int а значение - это массив Т так вроде пока что всё правильно [музыка] соответственно тут мы создаём этот наш результирующий словарь Ну в общем вот так по-моему так создаём результирующий словарь дальше мы можем так как это у нас массив мы можем просто вызвать for [музыка] блок собственно говоря элемент равно элемент и возвращаем Сейчас подожди я подумаю чели

    00:16:48 - 00:18:52

  • я [музыка] не м для каждого блок имя элемента возвращает ключ а не неправильно Конечно неправильно так сейчас данно у вложени элементов с этим ключом поэтому не так так сейчас If соответственно я отвечу на комментарии из чата на самом деле эта задача не искусственно выдумана до какого-то времени в свифте не было конструктора у словаря гнг и такую штуку приходилось писать руками вот совсем недавно появилась такая возможность сделать поэтому почему бы и не написать её руками Подтверждаю или приходилось Ну

    00:18:23 - 00:20:22

  • какой-нибудь пакет ставить с кучей удобных функций так значит так если у нас да вот так получается если у нас в словаре под этим ключом Можно даже вот так сделать чтобы удобнее было значит смотри если у нас в этом словаре под этим ключом уже есть массив то соответственно равно Так это у нас по-моему там есть этот нельзя вызвать потому что это у нас но по-моему там есть не очень оптимально но в общем Сейчас вот так да а Короче если нет то получается Ну [музыка] соответственно там в общем массив опять же на память не помню ну

    00:19:47 - 00:21:56

  • вот так да то есть получается смотри метод вызываем создаём результирующий словарь так как у нас получается что ну у нас же по умолчанию Мы же не обсуждаем что там ну ну ну словарь Option и так далее да из условия видно что словарь должен быть просто если как бы мы не можем группировать значит будет пустой словарь соответственно мы его всё равно создам и всё равно возвращаем дальше мы проходим по всему массиву из каждого значения массива образуем ключ через блок вот этот если в условном словаре уже есть массив по этому ключу

    00:21:30 - 00:23:01

  • то мы к этому массиву добавляем новое значение в конец и записываем его в словарь Если такого значения нет то а то мы соответственно просто создам новый массив и записываем его по ключу О получается вот так да хорошо действительно на конкретных примерах с какими-то агре ками этот код работает Ну согласись было бы грустно если бы мы написали метод г который умеет мапить словари который ключи инты Дава я добавлю ещё один пример и попытаемся генерализованной секундочку вот такой вот Угу то есть подразумевается что мы хотим

    00:22:14 - 00:23:41

  • сделать функцию одну функцию которая сможет работать со всеми тремя этими случаями Ну вообще с любым количеством случае чтобы бы а какой-то я понял Так ну тогда э так сейчас давай немножечко переименую тогда подразумевается что Ну допустим давай так мы будем считать что у нас Ke value Да [музыка] соответственно мы соответственно блок должен принимать val а возвращать и ключом может быть что угодно здесь соответственно массив ой словарь у которого в качестве ключа тип в качестве значения так что

    00:23:16 - 00:25:26

  • блок А И вот здесь нам надо получается тоже [музыка] заменить Ну получается вот так сейчас можно я подумаю если я ничего не пропустил скажи когда можно вмешиваться дадада Сейчас секунду так блок ние возвращает некоторого чение а возвращает ключ так тут ключ тут мавт блок возвращает ключ Ну да получается вроде так у Хорошо давай у нас ещё есть для в этой задаче обсудить два момента которые хочется у вот мы здесь используем словарь а под капотом словарь это какая структура данных о Хороший вопрос

    00:24:30 - 00:26:23

  • А ну я думаю что под капотом словарь это наверное массив наверное Или я не прав тогда работает Ну да Ну значит под капотом словаря там множество получается потому что не я ты не так наверное понял мой вопрос какая-то структура данных вот как она работает а ты об этом Ну смотри словарь - это структура данных в которой Ну смотри у нас есть как это словарь - это структура данных которая обеспечивает соответствие между двумя множествами множествами первое множество - это множество ключей Каждый элемент

    00:25:45 - 00:27:20

  • будет уникален множество Я имею в виду как общий термин не как структура данных Да множество ключей причём каждый ключ уникален они не могут повторяться и второе множество - это множество значений причём там значения могут повторяться как бы ну уникальность не обязательна вот как бы словарь об этом Угу а вот если я конкретней задам вопрос словарь это хэш таблица или красно-чёрное дерево под капотом А ты об этом я думаю хэш таблица честно не интересовался ни разу Да действительно словари это хш таблица

    00:26:45 - 00:28:18

  • и вот Исходя из этого Всё я понял Исходя из этого вот словарь у нас должен реализовать протокол hashable А какие какие ограничения накладывают протокол Да должно быть вот так Ну не совсем так а там к как оно на свифте пишется там ВК Ну в общем я так это оставлю а протокол hashable накладывает ограничение что э Тип который реализует hashable должен в себе содержать аэ метод хш собственно говоря по-моему типа int там правда по-моему в новом свифте там что-то поменяли там как-то хэш теперь по-другому реализуется что в

    00:27:31 - 00:29:23

  • общем Да в старом соте это функция это вычисляемое свойство ш а сейчас это функция com вот это не все ограничения которые накладывает есть ещё одно а по-моему он ещё этот equitable должен реализовывать то есть Ну чтобы мы могли однозначно сравнивать элементы определять равенство элементов хорош Рим про Вторую проблему этого кода сри ты определил дженерики на уровне Ну согласись как-то грустно расширять Словарь чтобы каждый раз когда ты его объявляете нужно было Указать тип функции Да как О вот так в при

    00:28:27 - 00:30:12

  • имом пото давай пока оставим так и вернёмся к вопросу про А зачем всё-таки equitable Ух бы и посмотрим на такую задачку Угу А что здесь выведется Так Сейчас минутку я подумаю Угу а здесь выведется Хай Почему Потому что ну здесь хэш неправильно [музыка] реализован Угу хорошо а вот вернёмся вки к equitable А почему мы здесь equitable не реализуем никак А ну да блин дадада ну здесь нужен да И в этом проверять Ну как это функция равно короче в ней нужно [музыка] проверять значение а у левой правой Ну на самом деле её можно

    00:29:24 - 00:31:35

  • реализовать Но для такой простой структу ком сам справи нари этих знаний то что у нас есть какой-то стрёмный хэш который постоянно возвращает константу и функция равно равно определена то действительно наха до сих пор будет выводиться Нет Нет там тогда будет ну л получается потому что этого значения Нет а как называется такая ситуация когда в хэш таблице по одинаковому шу несколько значений лежит Ну какая-нибудь там хэш коллизия Да это хэш коллизия А знаешь ли какие-нибудь методы борьбы с коллизия

    00:30:50 - 00:32:27

  • О нет не знаю Окей Хорошо тогда давай оставим этот блок с написанием груба и перейдём к следующему Расскажи пожалуйста а что вообще происходит в системе когда мы таем на экран там обрабатывает тач куда он проходит как он проходит Так ну если я правильно понимаю вопрос Да у нас есть как это основное Run loop приложение Да который крутится в U который крутится в главном потоке да этот главный поток соответственно отвечает за отрисовку пользовательского интерфейса вот когда мы Тапа по экрану соответственно Ну мы должны Мы же

    00:31:37 - 00:33:33

  • не в абстрактном каком-то пространстве таем Да у нас там нарисованы какие-то вьюшки соответственно опять же если я правильно понимаю вопрос Да у нас есть например там vie Controller если мы говорим о UI Kit Да у нас есть vie контролер у vie контроллера есть внутри иерархия вьюк соответственно в этой иерархии У нас есть например кнопка Да соответственно мы Тапа на кнопку срабатывает Test recn Я не совсем понимаю сове Да мы просто абстрактно обсуждаем А что вообще происходит подвод зада Да соответственно срабатывает

    00:32:46 - 00:34:20

  • [музыка] и Ну получается да Я вот тут не уверен но наверное Ну правильно Да если T recn срабатывает он там установлен уже значит в главном же потоке вызывается там соответствующий или что мы там му вязали там мы вызываем какую-то обработку и ну выполнение идёт дальше Угу хорошо а вот ты говоришь что у нас есть иерархия ВГ А как система понимает А в какую ВХ тач попал Ну у нас у ВХ во-первых У нас у есть да то есть бы вертикальный это во-вторых у нас ну в случае сложных интеракции каких-то мы можем

    00:33:39 - 00:35:26

  • определять там какое-то очень запутанно API нуно Я помню что оно там есть то есть мы можем определять допустим у нас есть вха там zorder 1 над ней zorder 2 ну как бы вха одна внутри другой находится Да и между этими вми можно чере механизм делегатов деды в зависимости от того куда соответственно получает события О ну события в событии содержится как это координаты собственно говоря самого тача и был там это можно там определённое поведение прописать там куда какой тач пропускать куда не пропускать Угу хорошо А знаешь ли ты про

    00:34:35 - 00:36:21

  • такой механизм ую хит тестинг ещё раз тестинг есть функция хитте А в смысле у этих у там на уровне этих геометрических примитивов по-моему да что можно проверять Типа если у нас есть вха и у нас есть координаты тача то мы можем вот с помощью функции тест определить происходит ли этот тач внутри этого прямоугольника поему както такн вообще механизм прост он говорит активирую задачу обработать это тач и если может то он возвращает какой-то из дочерних в вот я предлагаю тебе реализовать этот механизм

    00:35:39 - 00:37:29

  • но он у нас понятное дело не будет такой како он у нас будет супер простой Мы даже не будем никак использовать ивен Мы просто хотим понять в какую вху попал наш по из дочерних ВХ есть этот хи тест мы его вызываем и говорим а может ли какая-то из Саб юх или сама вха обработать этот поит попал ли он в неё угу угу а Денис ещё можешь пожалуйста чуть увеличить шрифт зрители просят Угу отлично Спасибо большое нормально да Так а Ну сейчас я Можно так чуть-чуть по Да давай хочешь можем вообще сначала поговорить как мы это будем делать Ну

    00:36:39 - 00:38:17

  • окей как бы по сути своей по сути своей да нам Ну в хе есть там поле subv да то есть как бы мы можем взять Sub Прим так Ну пока о там внутренней проходке Мы наверно говорить Я пока не уверен что есть смысл может быть это разве что м каким-нибудь можно развернуть но мне кажется настолько глубоко пока копать не стоит Да соответственно у нас есть и Гру говоря в Frame потому что ame у нас содержит не только размеры но и координаты Да в отличие от Bounce соответственно мы берём масив Sub делаем Map в

    00:37:37 - 00:39:31

  • Frame даже наверное лучше через через а ну да давай я тебе немножко подскажу ты заговорил про координаты есть такой стандартный метод конверт он может переводить поит из одной системы в другую про него говорю Да проблема в том что я бы про этот метод знаю но каждый раз как им приходится пользоваться знае заново учишься он как-то всегда по-другому работает Ну давай обусловил что он просто переводит из системы риан Родительское в юхи в дочернюю Ну хорошо ладно если так обусловил всё то хорошо Тогда

    00:38:50 - 00:40:39

  • тогда сейчас из родительской вюи в дочернюю Да сейчас можно чуть-чуть пошу конечно пока ты пишешь я напомню зрителям что вторая задача решение которое тоже можно скидывать в комментарии который тоже будет учитываться в розыгрыше как-то так соответственно Тут ещё вот как-то так Так теперь [музыка] соответственно S convert Point View View так Таким образом мы получаем для каждого subview точку как бы касания в координатах этого subview правильно Да вот и сейчас а нет не так сечас секунду так Ну я вот это поставлю так

    00:39:48 - 00:42:02

  • сказать дежурна это успокоение души дежурное это поставлю Потом если что обсудим ещё Так значит мы получаем для каждой в юхи [музыка] А координаты касания в системе координат этой [музыка] вьюхин А вообще тут конечно лучше было бы фром пользоваться Мне кажется Ну да потому что сечас ИК Вот так это нам не нужно получатся [музыка] Ну предположим что у нас есть функция она по-моему может даже и есть да и я тебе с нею подскажу говорит по приходи работать пою я на память это [музыка] всё Т мы не ожидаем что ты знаешь все

    00:41:42 - 00:44:13

  • функции ты проговаривает хочешь сделать я тебе подсказываю какой есть и Мне кажется она даже не Бул возвращала там что-то ещё или это в другом Ну ладно Бул и Бул и фрейм уберём по что нам фрейм не нужен просто вот так вот хорошо subview А ну и нам тогда индекс не нужен тоже получается так Return subview А здесь получается у нас New Ну получается как-то так Угу хорошо сейчас поговорим подробнее я тебе скину пример вот наша вха а которой мы написали расширение и звёздочка - Это куда попал тач Угу А что мы в таком

    00:43:44 - 00:45:38

  • случае вернём а я понял я понял в чём ошибка я понял на что ты намекаешь получается Здесь Ну в таком случае моя функция вернёт А должна вернуть не л а соответственно нам нужно сделать ещё если у нас вот эта проверка прошла И мы ничего Нерли нам сде получается Я насколько помню что если у нас на ВХ вызван тест то Point уже в координатах этой вхи правильно Да да Значит соответственно кове нам не нужен и Том Вот так и получается вот так то есть если у нас ни в одной из собью тача не было мы проверяем ещё был

    00:44:51 - 00:46:47

  • ли тач в себе Если был то да а если нет то ну как бы нет Я думаю хорошо Ну это работа для Пока ещё даже не работает но будем говорить Что мы умеем смотреть попадаем или мы в совсем примитивном леау А если у нас у будут свои то мы к ним даже то мы вем не ту вху которая может я понял Ну тогда надо наверное сделать - Так давай вот так сделаем letv Map [музыка] Ну что-то мне только кажется это дико не оптимально Но это просто первое что в голову пришло то есть смотри у нас есть VI у которого есть subv это массив у

    00:46:19 - 00:48:24

  • каждого subv тоже может быть свои это тоже это тоже будут массивы массив массивов разворачиваем с помощью FL Map плоский массив И там уже начинаем проверять Да Казалось бы Идея хорошая но мы теперь умеем смотреть на уровень себя сах и сах сах а глубже мы не умеем А вот ты о чём а да ты предлагаешь мне что-то рекурсивное написать видимо Ну можно рекурсивно можно там бфс но лучше рекурсивно так ну ладно Дай я подумаю минутку Ну конечно говори там помощь нуж или вмешиваться Т почитаю рядышком функцию

    00:47:48 - 00:49:46

  • набросаем пойму что она должна делать Угу я я просто по образованию физик поэтому у меня профессиональная деформация мне сразу надо начинать так сказать что-то делать а потом я уже смотрю по обстановке [музыка] м так соответственно мы пытаемся построить некоторую рекурсивную функцию которая в том числе будет вызывать и сама себя так сейчас [музыка] а сейчас это я пока ой господи Сейчас я пока эти аргументы сюда [музыка] добавлю так и получается она должна ещё принимать View View UI View так сейчас я так это немножко думаю то

    00:48:58 - 00:51:05

  • есть по сути своей нам нужна рекурсивная функция которая будет вызывать сама себя соответственно чтобы саму себя вызывать ей надо ещё в качестве аргумента вызывать ещё в Юху на которой она будет вызывать сама себя получается и получается в случае когда э Вью станет л точнее Нет в случае когда эта в Юха станет не Нил работа функции завершится А сейчас я объясню А до тех пор мне пока так кажется а до тех пор пока это в Юха Нил она либо продолжает себя копать вглубь либо завершает выполнение Вот пока что

    00:50:28 - 00:52:09

  • так это в моей голове выглядит Ну да мы пытаемся написать Обход в глубину пока мы можем сконвертируйте [музыка] от ФТ мапа мы отказываемся потому что мы всё равно будем обходить теперь с рекурсией Да так от фпа мы отказываемся значит так мы берём саху получаем поит в координатах этой Сахи и если Point в этой саю то нам нужно вызвать нашу рекурсивную функцию чтобы так сказать Так у нас [музыка] Con Event View Sub viw и теперь смотри так пока вот Мы здесь находимся получается Если у нас эта функция в итоге вернёт какую-то в

    00:51:24 - 00:53:25

  • Юху If LED Sub subview Короче я уж простите то мы соответственно её и вернём viw А если рекурсивная функция вернёт то получается что tch у нас не в subview а именно в самом не в Sub subv а именно в самом как бы вот этом subv так и теперь сама рекурсивная функция так сама рекурсивная функция получается Здесь нам нужно сделать типа как-то вот так вот сейчас секунду АС нет здесь не Ну правильно же правильно Да не Option В смысле так VI subv так только не Self А теперь VI Да вот так так если содержит точку то

    00:53:13 - 00:55:50

  • проверяем содержит ли Это это и вы точка выхода из рекурсии вроде бы вот так гу сейчас да яс Приму до конца так чтоб всё более-менее было Ну так оно всё в экран не влазит Угу я поэтому пришлось переключиться с вкладки стрима на вкладку интервью сейчас мы проходим се по всем нашим сахам смотрим конверти нашу точку если у нас впала точка в нашу саху то мы пытаемся рекурсивно а не сейчас не так не так не так неправильно ошибка вот здесь точка выхода получается вот здесь сейчас если я не ошибся я просто

    00:55:15 - 00:57:02

  • блин ну я рекурсию в голове 100лет не компилировать сказать то что у тебя Вот этот и ничего не делает Потому что ты в Ветке Эс а нет собью и собью сечас пока Я разбираюсь с рекурсией чтобы занять как-то наших зрителей а рассуждай пожалуйста а когда нам вообще не имеет смысла вызывать тест у в юх когда мы точно знаем что она её не может обработать тач Да дада да сейчас это если ну вот получается что если Sub не давай не говорить вообще без Sub вот просто вот нас у нас есть вха в неё пришёл тест и когда мы можем сказать

    00:56:32 - 00:58:00

  • явно то что вообще Э вха не При каких условиях не может обработать как минимум это стоит проверять первое что Ну я так сказать рекурсию 100 лет не писал тут сейчас если сама рекурсия работает правильно давай с этим определимся Я просто предпочитаю сначала найти на решение а потом его Я просто тоже подумал что во-первых можно исключить вюи у которых выключено взаимодействие Ну да это как бы первое что приходит в голову а ну точку мы в любом случае проверяем но да как бы Давай это оставим как улучшение Да хорошо сейчас дай мне

    00:57:38 - 00:59:09

  • минуту пожалуйста да да дада да нутри курсы у нас не работают Давай разбираться на примерах почему она у нас не работает в какой-то момент мы прона воз всё точ не даже так вот сейчас скажу так я переключился на Стрим чтобы видеть куда смотришь ты а то я сам тебя вообще не вижу только в код смотрю Так ты давай я тебе буду показывать курсор ку да смотрю мы берём в д вой строчке проверяем то что мы то что наша вообще штука попала в нас если она попала мы пытаемся найти самую глубокую собью которую может

    00:58:38 - 01:00:37

  • обработать Иначе мы возвращаем себя Да пока всё звучит здраво так если не попало то возвращаем Нил Да в принципе ВС справедливо хорошо но ВС рано нас не совсем корректно работат Давай представим ситуацию то что у нас в юх все Сахи имеют одинаковый размер и полностью накладываются на родительскую Вью то есть они идут Как тарелки друг на друга какую вернём с максимальным Ну вообще честно говоря это уже тут опять же насколько глубоко Мы хотим копать получается Если мы игнорируем что через или там у пере определены тесты там или

    01:00:06 - 01:01:44

  • вот это всё по умолчанию мы должны просто возвращать ту которая больше с максимальным А вообще когда мы вызываем В каком порядке они кладутся в Sub какой там а не подожди подожди должна возвращать то есть смотри если у нас все ВГ на друга положены да точа [музыка] мы должны возвращать ту у которой максимальный и при этом включено то есть вот мы должны возвращать два условия и давай вопросу а ты проходишь се сначала то есть ты самой глубокой в юхи у них всех одинаковый размер то есть они все могут

    01:00:58 - 01:02:41

  • обработать тач и ты вернёшь самую глубокую Ну да получается я что-то об этом не подумал получается в обратном порядке надо так Ну не знаю тогда тут А сейчас А вот это вообще нам поди Вот это вообще не нужно Да это от про от флэта осталось получается нам нужно во-первых рест делать да Или как там оно в общем Угу Ну можно как бы я понимаю что ре это как бы не добавляет скорости можно написать for loop с индексами идти там в обратном порядке Ну вот для простоты как бы да мы идм обт поряд чтобы соблюдать

    01:02:01 - 01:03:28

  • сейчас так Ой куда это я так здесь тоже мы идём в обратном порядке и теперь надо проверить везде надо проверять на User interaction enabled так subw сейчас If subview is [музыка] помоему так оно как-то там называется Давай короче просто вот так сделаем просто пропускаем эту вху потому что получается Если User interaction у ВХ отключён то по умолчанию всех её Sub тоже отключён Если только там не определён специальный это tabure recognizer там с исключающими этими прямоугольниками как бы если мы хотим

    01:02:57 - 01:05:00

  • это рассмотреть то давай следующим этапом пока Рена Давай мы не будем рассматривать мы них вообще забили Мы просто хотим понять Вообще точку попадает или нет в Юху которая на экране Так значит из User interaction если оно fse то мы выходим здесь здесь subw subw и получается вот так получается что мы пропускаем все Те у кого нет у кого выключено взаимодействие с пользователем и плюс смотрим Сахи в обратном порядке чтобы соблюсти zorder Угу Все Сахи и Сахих господи мы смотрим в обратном порядке да

    01:04:21 - 01:06:00

  • только А на корневую ВХ мы не посмотрели выключен ли у неё да Да да это вот здесь должно быть так и and вот так хорошо а вот такой вопрос А если у нас у Короне из то вообще можеш хоть одна обработать этот Тач тут Да тут ты меня поймал я поторопился так сейчас If If из нужно я скопирую Просто я поторопился так дальше проверяем всех если у Нет е то Ну получается вот так давай ещё код устави в порядке в покое трогать просто поговорим про улучшение это задачи Юха не может обработать тач но у неё нет например этот как его

    01:05:19 - 01:07:33

  • зовут Нет рекогнайз ну мы на них забили мы на них абсолютно забили вообще пофиг нам на них мы Тим просто понять что точка там может туда попасть или нет в эту вху ну Вью Может быть я не знаю за пределами активного окна например ну если у нас большой экран сл viw Да Угу и вха находится за пределами активного окна то как Ну про это бы нам Point Исай сказал попадаем или нет Ну да вот а она же может быть скрыта а ты имеешь в виду Да Она может быть скрытая ещё она может быть прозрачная Нет ну то что она прозрачное

    01:07:15 - 01:08:57

  • это что ты имеешь в виду прозрачное Ну Альфа но так и Ну ты в неё просто нажать не можешь Ну ты можешь в неё случайно нажать как скрытый кол странно было бы ну ой Аль как раньше делали когда популярная тема почему-то была что вот у тебя экран клавиатура и на корневую вьюхин Да если то да согласен хорошо а вот есть такое свойство Clip to boun А за что он отвечает А так лип to Bounce отвечает за то чтобы Господи как же это по-русски объяснить а если вха выходит за границы своей области леау то Clip to Bounce как бы её Ну

    01:08:11 - 01:10:26

  • обрезает к доступной области леау Я не знаю насколько я понятно сказал то что хотел сказать давай жда Нате будет работать или [музыка] нет честно говоря это зависит Ну сейчас давай порассуждаем да В данный момент мы проверяем это исключительно через функцию Point так то есть если то есть поведение нашего в рамках будет работа с тем как это обрабатывает метод Point Insight вот в моём понимании сейчас Угу соответственно если он Я честно не помню потому что блин Ну редко работаешь с этим API если он считает что да то да

    01:09:40 - 01:11:40

  • Если нет то нет но мне так кажется что он будет считать как нет то есть если смотри если у нас Clip to Bounce то хитте вне границ не будет проходить если клип то тест вне границ наверно будет проходить вот я так думаю ну честно не знаю просто гадаю Мне кажется было логично чтобы оно было вот так Ну вообще зависит на нашу реализацию хите Ну в целом какой-то более-менее рабочий метод тесты мы реализовали он даже работает без Гест когда Изра Ну это да поэтому предлагаю на этом остановиться и закончить наше интервью

    01:10:42 - 01:12:31

  • на вот этих двух за датчиках потому что час уже Подошёл к концу тебя не слышно точно должно быть слышно я говорю что час уже давно Подошёл к концу на самом деле на самом деле интересно было бы услышать фидбек от обоих из вас Ну грубо говоря с небольшим разбором допустим может быть что Денису можно было лучше сделать Денису тоже Дениса было бы интересы вю очере было бы интересно услыша в целом Денис очень с первого вопроса пытался лезть в какие-то кишки которые я хотел услышать банальный ответ Денис там уже с Ю тайми рефрен тайпа лез

    01:11:44 - 01:13:13

  • в процессор вот второе конечно ожидалось что вообще в принципе когда решаются эти задачи Они показывают способность кандидата мыслить на разный грейд и вот как человек пишет код тоже являет на разный грейд и чем чище и больше возможностей из стандартной библиотеки ко использует это показывают Его навыки продакшн кода вот несмотря на первую задачу вот на вторую хотелось бы е почище проверку на User interaction en вообще во все места куда только можно Ну согласись Денис мы поставили получили соломку под все места

    01:12:36 - 01:14:30

  • вот в теория Ну мы постарались затронуть много тем из которых можно было вычленить глубину знаний что Денис знает с чем он сталкивался с чем нет во время кода тоже можно было сделать выводы чем Денис постоянно пользуются А чем не пользуются какой-то вот такой если фидбек не вдаваться в подробности Какую бы я оценку поставил вот я рассказал на что я смотрел во время этого собеседования Да ладно Никита не это не щади старика Давай скажи ВС как есть я готов же была цель не сказать как есть а просто показать на что смотрят

    01:13:38 - 01:15:20

  • интервьюеры во время собеседования Какие задачи есть Ну я в чате читал что всем казалось что задачи орона от реальности или то что они никак не показывают навыки Айса Возможно это правда но во время того как мы рассуждали и писали задачи мы покрыли достаточно много теоретических вопросов а само решение задачи показало как может абстрактно мыслить и решать какие-то задачи то есть кажется обойти в юхи э вполне возможная Задача В реальной работе э и определить ский тест Ну понятное дело что с этим никто не часто

    01:14:30 - 01:15:46

  • сталкиваются но ээ А эта задача показала то что э Денис способен подойти к какой-то абстрактной задаче и найти решение посмотреть на краевые случаи допустим с тем же то что мы вс-таки задумались то что А когда вха в принципе не должна рассматривать чи вот как-то так то есть достаточно много информации о кандидате можно было достать из решения даже таких абстрактных задач Окей но а вот смотри вопрос который мне на самом деле интересен я всегда слышу Ну что мы грубо говоря проверяем этими задачами Да

    01:15:08 - 01:16:34

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

    01:15:51 - 01:17:12

  • тест должен работать Денис сам вполне Подошёл к задаче и начал кодить я к коду Практически не прикасался за исключением того что я подсказывал ему функции какие-то которые я и не рассчитывал то что он вспомнит То есть он говорил что он хочет сделать чтобы не затягивать процесс я подсказал что есть такая функция то есть вполне можно было за Джуниора сойду короче ну это определят знаешь следующее собеседование Как говорится а Денис у тебя Какие впечатления учитывая что ты давно достаточно не проходил Собес и скажем

    01:16:31 - 01:17:52

  • так насколько я понимаю не так часто проходил Собес условно назовём их алгоритмически Ну я не знаю какое название подобрать тут смотри да я как бы последний раз на собеседовании именно собеседовании был типа там 10 лет назад Ну примерно на скидку и оно закончилось плохо Вот это из того что я помню опять же последние там последнее успешное собеседование типа знаешь приходишь в компанию Ну тогда я был совсем там джун джун и всё закончилось тем что я соседова на And ме тестовую задачу на Андроиде я написал

    01:17:12 - 01:18:41

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

    01:17:56 - 01:19:09

  • это как экзамен Хотя я я вижу у Никиты потенциал как бы если бы он хотел бы меня уничтожить он бы меня тут развалил бы вообще без проблем там есть как бы куда копать но я опять же понимаю и претензии а допустим вот людей из чата что непонятно Ну типа что эти задачи проверяют и со своей стороны я тоже могу сказать что вот ну в повседневной практике Если тебе нужен groupby ты ставишь пакет да я тут как бы Ну опять же Кито ты сам это в чате отвечал хит тесты у меня были ситуации вот когда UI надо сделать так что там вот как бы

    01:18:38 - 01:20:04

  • работает вот совсем не так как оно из т и там ты городишь короче три слоя геров связывает внутри начинаешь опять же вот эти точки конвертировать между хами всё как бы всё это было блин это такая редкость ста я хол сказать справедливости ради там вот момент был кожен ко между фрейм и Bounce Да отличия то есть ну грубо говоря то есть я согласен с Никитой что ты по ходу опирается на некоторые знания про UI фреймворк правда вот почему-то вы ну коллекции наверное да UI Ну вот короче последня на UI сосредоточилась а то есть какие Ну на

    01:19:21 - 01:20:46

  • базе каких-то знаний э это наверное можно сообразить другое дело что возможно если бы я это делал за час я бы конечно тоже не сделал то есть часа для меня слишком мало в этом в этом смысле опять же да я если делал бы то опять же Ты запускаешь смотришь там что лагает не лагает поставил там миллисекунды посчитал ещё в голове подумал Ну в общем Ну в любом понимаешь Я просто сейчас как это подведу итог небольшой со своей стороны Я просто тоже собеседовать людей и я могу сказать что собеседование - это адски тяжело то есть

    01:20:11 - 01:21:23

  • к нам в команду приходили люди я их собеседования они все проходят одинаково ну По моим ощущениям при этом один человек приходит в проект садится и начинает просто нормально всё делать что он может А если человек не может что-то делать он мне просто пишет и говорит Денис я не знаю как это сделать Ну там обычно это касается каких-то либо какого-то безумного ЮА либо там архитектуру как-то между экранами раскидать знаешь вот такие вопросы Обычно вот а другой ты вот тоже собеседуем он абсолютно нормальный в

    01:20:46 - 01:21:52

  • общении Он садится делать задачи и никогда не жалуется на то что задача какая-то сложная он не понимает как её делать зато потом ты открываешь реквест и понимаешь что человек просто поломал тебе как бы там ну там 5% кодовой базы просто выкинул всю архитектуру что ты сделал Там и так далее у человека нет какого-то элементарного понимания что ну как бы вот код написан Вот так и нужно вот как-то в этих границах работать поэтому Блин я не знаю с моей точки зрения опыт был очень интересным я СДО пообщался Я тем более готовился

    01:21:19 - 01:22:29

  • пересмотрел всё что только можно было пересмотреть даже порешал задачки на Яндекс контест вчера их решал позавчера тоже напряг мозги конечно блин Ну опять же все задачи Абсолютно нехарактерные для того что ты встречаешь в реальной жизни Ну вчера на контесте мне одна задача более-менее реальная попалась но при этом я подсознательно понимаю как бы что люди пытаются проверить они пытаются проверить как ты вообще думаешь И думаешь ли ты вообще я могу добавить в том что у Яндекса есть практика Бут кампо для

    01:21:55 - 01:23:09

  • разработчиков и ты не знаешь в какую команду ты попадёшь а допустим Если бы мы собеседовать конкретную позицию в конкретную команду можно было бы упаривание с точки зрения того что я не знаю куда ты попадёшь дальше на собеседование какому человеку какой команде Мне нужно проверить что у тебя есть знания по платформе И что ты умеешь самое главное программировать и думать как это делать если бы вот ты пришёл и сказал ну я йойки та не знаю я даже думать не хочу Давайте следующий задачу то это был бы какой-то флаг Ну согласись

    01:22:32 - 01:23:34

  • или если бы я начал тебя мучить Swift ЮА а ты идёшь в команду СДК мобильный рекламы где вообще в принципе практически и нет то тоже было бы странно А зачем я у тебя это спрашиваю если ты в работе с этим сталкиваться не будешь Ну Swift U Ты б меня быстро завалил бы вообще я в Swift U вообще вот чуть поэтому я вы рекламировали что прол много собеседовани ноте Я даю достаточно редко Ну и просто почему-то возникло Я думал Какие задачи дать и пытался дать то На чём мы можем абстрактно поговорить обо всём то есть заметили то что мы

    01:23:04 - 01:24:13

  • могли ещё дальше про фреймы про бан поговорить могли про много чего проговорить решая тест там тем которые покрыть можно Куча и вот поэтому как мне кажется задача действительно хорошая в том чтобы мыли только часть решать и достаточно много чего покрыть Ну тут Да не на самом деле задача про хите была интересная при том что как бы опять же вот если в чате мне чат не видно просто если в чате пишут что задачи не применимые на практике я не согласен То есть как раз-таки наоборот обе задачи groupby раньше

    01:23:39 - 01:24:45

  • реально не было только сейчас в стандартной библиотеке появилось я Я прекрасно понял зачем Никита спросил у нас в проекте там ну Большой проект там это просто зависимостью добавлено это раз то есть это реальность таки Ну это бывает Нужно А про хитте Да в чистом виде хитте для Вью Я никогда не пере определял но при этом мыслить вот на все эти там converted Point и так далее приходится когда там если у тебя несколько TG рекогнайз и какие-то сложные дела ты делаешь на UI это иногда используется и плюс опять же пришлось

    01:24:12 - 01:25:17

  • задействовать рекурсию Я вообще удивлён что я Ну достаточно быстро смог её написать последний раз не помню вообще когда рекурсией пользовался Вот и Ну не знаю мне самому было интересно я получил удовольствие Да я знаю надеюсь что все остальные тоже получили удовольствие у нас ещё один человек который сегодня однозначно получит удовольствие которому я так сказать от сердца оторву Яндекс станцию Вот и мы в общем После долгих обсуждений решений было Честно скажу не сильно много могло бы быть больше

    01:24:44 - 01:25:56

  • поэтому как бы Ну видать Как сказать Яндекс уже настолько популярен что Яндекс станции есть в каждом доме у меня так их вообще две есть вот главное Не называйте дочку Алисой потому что вы потом замучает Вот что я могу сказать А так вот собственно мы посовещались и пришли к выводу что победителем у нас стал Ярослав Фоменко А я с тобой свяжусь в телегра Я не знаю смотришь ты нас или нет Если смотришь то напиши в чат хотя бы там по радус типа Ура Я выиграл там всё такое у него прикольное решение Объясню почему его решение потому что ну

    01:25:22 - 01:26:37

  • как бы само по себе решение во-первых рабочее там есть некоторые нерабочие решения во-вторых А вот он нас смотрит Да Классно а во-вторых он заморочился на тесты То есть он написал прям с осер Тами Ну в общем прям заморочился человек и действительно достаточно быстро это сделал Запомни его Алексей его надо было звать на Стрим Да не всё нормально прошло вот ему соответственно Да ему я напишу и мы с ним свяжемся Ну в смысле я с ним свяжусь мы это я и мой помощник Вот мы с ним свяжемся и отправим ему соответственно

    01:26:00 - 01:27:26

  • станцию ребят Вам спасибо огромное на самом деле Пишите в комментариях и к этому видео и на стриме и в телеграме Как вам такой формат Ну типа Надо ли такие форматы проводить е Ну соответственно если будет много желающих то и проведём соответственно ещ если будет 10.000 лайков Я ещ готов прийти на Android Да у нас Денис стати он такой в этом плане и на Android и на на пишет в общем на всм прям прямо кайфанул от э я сидел Ещё сам думал параллельно как это всё сделать получше Вот а поэтому увидимся с вами в следующих

    01:26:44 - 01:28:06

  • видео ну всем хорошего вечера наверное и пока Всем пока Всем счастливо

    01:27:33 - 01:27:48

Менторы

Специалисты своей области, которые смогут помочь вам

  • Нигма Нурия
    Нигма Нурия

    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

© 2024 HireGuru. Сделано в Санкт-Петербурге с hireguru.ru