Подготовка к собеседованию на iOS Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
Всем привет решил сделать такой новый формат для моего Канала видео о том как я прохожу собеседование если это видео вам понравится то я постараюсь в будущем сделать больше таких видео о том как я прохожу собеседование это собеседование которое вы сейчас видите на экране собеседование на позицию Джонни ру плюс такой современный стек в основном меня не спрашивали и опыт работы требовался от одного года но прежде чем мы перейдем к самому собеседованию хотелось коротко сказать о том Почему навык прохождения собеседований А так
00:00:04 - 00:01:15
важен Наверное вы со мной Согласитесь что для того чтобы найти работу недостаточно просто научиться программировать пройти курсы понять основы языка Swift или там другого языка и все идти работать Нет нужно еще иметь разговаривать иметь показать что ты знаешь то есть просто коротко нужно иметь навык успешного прохождения собеседования это особенно актуально конечно же новеньким которые прошли но не только Да это актуально для всех программистов даже для тех кто уже сейчас имеет работу потому что все
00:00:40 - 00:01:41
меняется и рано или поздно Нужно будет искать новую работу Поэтому всегда очень важно следить за тем Хорошо ли прокачан нас навык прохождения собеседований и Согласитесь что это не так уж и просто может быть есть какие-то страхи особенно новеньких да что я чего-то еще не знаю а вдруг меня спросит то что я еще не знаю даже если у вас есть какая-то уже работа разработчикам все равно важно проходить собеседование чтобы Так держать руку на пульсе и знать вообще что требуется сейчас на рынке труда по данной
00:01:10 - 00:02:09
профессии Это не это очень важный навык и чем раньше вы начнете этот навык прокачивать тем лучше связи с этим я со своими друзьями решил запустить двухнедельный курс по тому как успешно проходить собеседование все желающие могут записаться на этот курс не только студенты школы То есть Вам не обязательно будет проходить обучение с первого модуля у меня в школе даже если вы мы отвечали самостоятельно или где-то на других курсах все равно можете записаться на эти курсы чтобы прокачать свой навык успешного прохождения
00:01:41 - 00:02:43
собеседований а курс будут вести опытные сеньоры разработчики которые ежедневно проводят собеседование и сами проходят собеседование они знают Какие сейчас задают вопросы и на этом курсе они расскажут вам обо всех подводных камнях которые было возможно ранее не знали более подробно о курсе я конечно расскажу чуть позже но если сказать коротко то на этом курсе будут разобраны 90 процентов самых распространенных вопросах которые встречаются на собеседовании И не только разобранные эти вопросы и ответы но и будут
00:02:11 - 00:03:08
разобраны таким образом Чтобы у вас было понимание того почему нужно отвечать так или иначе чтобы вы глубоко понимали тот или на вопрос и смогли свободно Отвечать на него и что не менее важно на этом курсе мы расскажем Как вести себя Если вам задали вопрос на который вы не знаете ответа или не уверены и здесь вот тоже очень важно правильно вести себя Потому что Частенько бывает такое что создает те вопросы к которому не подготовлены или возможно не знаем что на него ответить так если вам интересно
00:02:40 - 00:03:39
пишите мне в личку я запишу вас в Лист ожидания и когда Соберется группа то мы стартуем обучение Ну а теперь давайте перейдем к собеседованию собеседование которое сейчас вы видите оно состояло из двух частей первая часть это вопросы по теории не так много было вопросов и потом были вопросы нужно было ответить на некоторые практически вопросы по коду во время теоретической части Да когда мы будем вопросы Я конечно же лица показывать не буду и основной компании тоже я там в конце видео обрезал чтобы
00:03:09 - 00:04:05
не светить компанию и лицам и во время теоретической части на заднем фоне вы будете видеть как я пишу простенькое предложение и то что не связано с самим собеседованием во время Второй части когда там были вопросы практически на доске то доску Конечно я вам покажу чтобы даже видели что за практическую вопрос были собеседовании А по легенде Я представился начинающим Мидл разработчикам сказал что у меня год работы но как я уже сказал в конце вопросы основной компании Я вырезал еще одну когда вы будете смотреть
00:03:37 - 00:04:41
собеседование Пожалуйста проверьте подписаны на канал или нет Если не подписан то Подписывайтесь чтобы не пропустить следующие видео и пишите пожалуйста в комментариях проходите вы сейчас собеседование или нет Если проходили то напишите пожалуйста некоторые вопросы на которые вы не смогли ответить Если вы это сделаете то я вам Буду очень признателен Ну все Далее идет само собеседование да Я понял хорошо значит по собеседованию у нас будет разделение на две части Первая это теория Ну и там походим
00:04:10 - 00:05:16
немножко теории я проведу по коду там уже Артем подключиться Вот Ну и по ходу если у него будут вопросы тоже будут включаться в принципе можно уже приступить Так ну у меня сейчас интересует конкретно работы около года Может на ты хорошо сказал что опыт работы около года технологиями какими Да я также изучал конечно это несколькими проектами на одной работе понятно понятно хорошо давай тогда теории сразу не будем долго распыляться первый вопрос Подскажи отличия ссылочных типов и типов значения что это вообще такое для чего
00:05:23 - 00:07:17
мы их используем я понял получается ссылочные типы это референс тайп это можно отнести например такие типа данных как классы функциональные типы данных например функции замыкания вот новый тип который появился 5 актеры и можно даже наверное перечислить туда и интересные впечатления и главное отличие от типов значения от valuettab это получается структуры перечисления которые не интересны и такие вот тоже К ним относятся к этому значения такие основные типы как string в том что у солнечных типов передается
00:06:54 - 00:08:13
ссылка на значение а у типов значения передается само значение и в связи с этим когда мы меняем допустим значение ссылочных типах то если мы это изменяем значение в одной ссылочке то изменяется значение во всех других ссылок потому что ссылочных типах данных значение хранится в одном месте Просто у них есть доступ с разных источников разных ссылок Если же мы меняем значение они хранятся в куче они хранятся в куче и получается и доступ к ним также получается получить из любого места из любого места
00:07:37 - 00:08:57
программы типа значения это объект на ориентированное программирование Но получается зиждется На классах на наследовании и здесь как бы есть свои плюсы например один из плюсов то что мы получается наращиваем функциональность когда мы создаем подкласс и добавляем функциональность но связи с тем есть минусы потому что под классами получается наследуется все вся функциональность родительский класс это протокольное ориентированное программирование Это можно сказать что это более так сказать протокольно ориентированным
00:08:22 - 00:09:41
программированием потому что есть некоторые преимущества перед и он получается снова на какие инструменты используют протоколы расширение Ну и главным образом именно расширение протокол получается Если мы ВВП используем исследование то программирование используем интерфейсы протоколы для того чтобы передавать функциональность по умолчанию другим типом и здесь мы можем передавать функциональность сразу если мы например протоколов делаем какой-то функциональность по умолчанию то она уже по умолчанию будет доступна всем типом
00:09:28 - 00:10:48
который подписаны протокол и здесь что можем также делать композицию протоколов вот и что Нила Что например в Open не получится то есть там не получится наследоваться от нескольких классов вот ПВП То есть можно таскать подписаться под несколько протоколов и благодаря этому можно более гибкость сохранять программирование Следующий вопрос слышал что-нибудь Да конечно Солид это пять принципов программирования который писал Мартин здесь эти принципы созданы для того чтобы писать хорошо тестируемые модульный код который легко поддерживать
00:10:10 - 00:11:46
и изменять в будущем надежный код можно сказать и Если писать эти принципы то первый принцип это единая ответственности да то есть каждый эти данных он должен искать иметь только одну задачу иметь одну единственную зависимость это когда мы зависимость идет снизу вверх классы верхнего уровня они не а конкретики да от классов от по типов от классов нижнего например сможет привести какой-нибудь как это вообще в коде встречается что это такое так да Ну например если мы хотим контроллере допустим создать
00:11:04 - 00:12:27
экземпляр модельки то если мы сделали это бы обычным образом до создали бы модельки с помощью типа модели то тогда бы получается абстракция контроллер он тогда бы зависел бы от модельки до что получается не было Вот это вот инверсии зависимости не было поэтому Чтобы избежать чтобы классы верхнего уровня абстракция не зависела от конкретики от какой-то конкретной модели то мы сделаем что мы получается модельку подписываем под протокол какой-то протокол который тоже реализовать требований и уже когда мы
00:11:56 - 00:13:14
создаем экземпляры модельки то мы создаем это с помощью типа модели А с помощью типа протокола и так сказать по сути хорошо Какие например паттерны нарушать Да несколько паттернов есть Может это такие антибактерные это паттер Например синглтон одиночка до который например что делает он внутри себя представляет какую-то реализацию и также он еще создает экземпляр самого себя то здесь он по сути нарушает два принципа принцип единой ответственности да то есть потому что у него как минимум две задачи есть
00:12:35 - 00:13:52
да представить какую-то конкретную реализацию реализацию и создание экземпляра и также Вот как раз 5 принципа тоже нарушает инвестор зависимости потому что внутри себя он то есть на Верхнем уровне Да на уровне экстракции представляет какую-то конкретную конкретную реализацию То есть как бы не сохраняется гибкость поэтому так Но их несколько паттернов но можно привести паттерн Ну который считается антипаторным одиночка сингл Том Да потому что у него как бы можно сказать две ответственности он и дают реализацию
00:13:26 - 00:14:39
каких-то методов и А сам также внутри себя создает экземпляр самого же себя Да вот два получается две обязанности на себя берет и также нарушает последние 5 принцип который мы сейчас говорили до принципе зависимости потому что здесь он уже сам верхнем уровне предоставляет какую-то конкретную реализацию этого типа данных два принципа нарушает но также есть другие паттерны например не паттерна как бы способы программирования Когда например класс или протокол берет на себя слишком много ответственности да
00:14:15 - 00:15:28
Там слишком много всего там на него так сказать намешано тогда это тоже нарушает как раз принцип разделения интерфейса 4 Ну да это получается самый такой распространенный принцип драйв Don't repeat Yourself то есть не повторяйся сказать просто этот принцип сводится к тому чтобы избегать дублирования кода то есть там где-то возможно и здесь мы можем в принципе этого достичь если допустим будем какие-то делать универсальные допустим типы данных это можно сделать с помощью дженериков с помощью протоколов
00:14:53 - 00:16:07
чтобы не делать какую-то реализацию под Допустим все типы данных можно сделать какой-то общий интерфейс и потом уже который будет работать Для различных типов данных а есть также принцип This можно сказать что Дело это просто коротко то есть Ясно То есть он сводится к тому чтобы избегать излишне так сказать сложности и следить за тем чтобы читабельность года была высоком уровне да то есть следить за то чтобы это было насколько то лаконично просто так описано функциональность какая-то и еще принцип Какой можно здесь привести
00:15:42 - 00:17:08
который можно в качестве примера Это ягни получается на русский переводится как тебе это не понадобится или ты можешь обойтись без этого Потому что наперед не нужно представлять какую-то функциональность на данный момент она не требуется меру если мы говорим протокольные ориентирован программирование то там и предоставляем минимум так сказать требования для того или иного типа а потом уже при необходимости эти требования Россия Россия это автоматик Counting reference автоматически подсчет щелок
00:16:25 - 00:17:34
это получается способ Свифт следить за оптимизацией памяти да Раньше был манул Да ручной управление памяти сейчас это автоматически То есть как правило разработчики есть разработчики не заботятся об этом это делается автоматически том плане что когда мы создаем объект и Передаем этот объект ссылку на этот объект в разных местах то счетчик автоматически увеличивается на один если мы удаляем и уже не используем какой-то объект соответственно уменьшается на один и объект освобождается из памяти для повторного
00:17:17 - 00:18:28
использования освобождается для повторного исследования когда этот счетчик равен нулю освобождается это такой процесс автоматически работает Свифт поэтому но здесь я понял Да я понял здесь еще может произойти до здесь мы можем тоже следить за тем если использовать такие ключевые слова как Следующий вопрос который хотел спросить Хорошо отвечать это получается ключевые слова как оно то есть мы просто года когда используете после слова для того чтобы создавать слабые ссылки и когда мы используем эти ключевые слова то тогда
00:17:53 - 00:19:17
автоматически то есть Россия не увеличивая счетчик и тогда они создаются цикл сильных сил ссылок копиан райт Ну как мы говорили когда говорили про типы значения то мы там говорили о том что при копировании типов значения допустим структура то передается значение Колы так Создано для оптимизации так сказать производительности Да и копирование происходит только тогда когда мы изменяем какие-то большие типы данных например коллекция допустим это массивы там набора и словари и когда мы копируем не изменяем эту коллекцию которая
00:18:57 - 00:20:24
скопировали то здесь применяется плане что они ссылаются на один и тот же памяти То есть это как бы один же данные но копируются значение копируются когда мы изменяем то что скопировали вторую коллекцию повторюсь Это для того чтобы работает какая разница со структурами нет допустим массива массива и структуры разница между копирования массива и структуры обычно Но Разница есть вообще да есть разница там укол не применяется если мы говорим про обычную структуру то там сразу же передается значение и сразу
00:19:53 - 00:21:17
же передается И не зависит и хранится как независимая копия сразу же а если про большие коллекции допустим копирование сразу же не происходит как раз этот принцип опционал но просто там он может так сказать вакцина можем обернуть по сути любой тип данных допустим стриминг там был то есть это по сути способ сказать что какого-либо значения может не быть по сути мы можем представлять отыскать возможность Что делать если какого-либо значения нет здесь под капотом это работает Как перечисление То есть можно
00:20:43 - 00:22:04
сказать что это тип значения и под капотом это два кейса То есть это кейс но то есть отсутствует какой-либо значение и кейс есть какой-либо значение допустим если мы берем оборачиваем допустим обычное значение здесь мы можем смотреть такую возможность что значение допустим строки вообще может и не быть не то чтобы пустая строка То есть это строки вообще даже может не быть или не может быть какого-то значения типа и это Создано для того чтобы предоставить такую безопасную такой код и здесь у нас можно перечислить такие
00:21:32 - 00:22:47
четыре способа так сказать извлечения опционалов чтобы убедиться что значение точно есть и можем сказать его использовать для того чтобы работать дальше в программе хорошо знакомств с дженериками что это такое вообще можешь объяснить дженерики до или универсальные типы это такой мощный инструмент Swift который позволяет нам избегать дублирование кода потому что мы можем создавать универсальные типы данных например универсальные классы структуры там функции и так сказать представлять такую некоторую абстрактную
00:22:10 - 00:23:21
реализацию для разных типов данных и когда мы используем дженерики то на этапе компиляции когда мы Передаем допустим аргумент какого-либо типа данных компиляции уже понимается каким типом этом работаем И он уже как бы если бы там какой-то другой тип данных Передаем он уже понимает что это тип данных не соответствует тому когда мы передали раньше и есть по сути Мы работаем с конкретным типом и Как это работает со всеми другими типами то есть Можем допустим создать какой-то метод для допустим для допустим чтобы изменять местами
00:22:55 - 00:24:10
какие-то значения можем это сделать для типа string для типа int то есть и места менять значение и это будет работать Для различных типов допустим для типов дабы float без проблем это будет работать хорошо тогда тоже тему вопрос Скажи пожалуйста вот ты перечислил программирования какой именно позволяет соблюдать используя ну вот получается принцип драй то есть благодаря тому что мы используем дженерики здесь мы дублирование функциональность для каждого типа всё правильно к следующему тогда блоку
00:23:37 - 00:25:02
Расскажи пожалуйста мне что вообще собой представляете какие вы преимущества Я имею в виду был на связи почему дальше пользоваться Что дает в общем Расскажи был выпущено с для iOS 13 для 13 доступен и получается так сказать для создания интерфейса раньше устарела можно сказать и коротко то это можно создавать интерфейс пользовательский интерфейс намного быстрее и проще Это почему Потому что используется декларативный способ программирования программист он говорит что он хочет видеть Какое представление
00:24:29 - 00:26:00
где он хочет увидеть и как мы используем модификаторы для того чтобы какие-то корректировки носить А уже из коробки предоставляется реализацию того что мы так сказать задали ему там какие-то параметры и так сказать это работает очень быстро и для интерфейса мы все используют структуры Нет уже классов как крепит нет следовательности поэтому это не тот сложности есть наследовании поэтому это работает намного быстрее чем также что есть можно еще подметить что еще я перебил есть то есть когда мы пишем год сразу же отображается действие
00:25:15 - 00:26:41
кода уже на интерфейс предварительном просмотре то есть мы сразу можем видеть результат своей работы не запуская само сам симулятор само приложение и можно сказать что здесь еще я уже говорил да что просто да но здесь еще просто в том что мы представление можем как бы лето то есть друг на друга присоединять использовать композицию наращивать функциональность сложность и вставлять друг друга здесь это тоже очень просто и быстро работает и еще что я хотел сказать я очень хорошо реализовано работа с данными в том плане
00:26:00 - 00:27:11
что есть такая вот связь или дата бензинг получается Если мы следим за данными да то есть если данные изменяются то пользовательский Интерфейс Да Святая сразу же реагирует и интерфейс сразу же обновляется так четко ты рассказываешь Расскажи мне пожалуйста что такое это да да Я это смотрел Да тоже очень такая интересная штука это модификатор которая позволяет анимировать разницу между представлениями То есть если по сути для анимации Нужно раньше когда мы делали анимацию вообще тоже хотел сказать что отношения анимация
00:26:39 - 00:28:08
тоже занимается очень просто работать и быстро но там и следили раньше представляли какие-то данные подписывались анимировали разницу в данных какое-то значение и когда этому значения меняли Это анимировали здесь же мы по сути используем такое как бы булочку свойств как на Space создаем какой-то пространство потом используют геометрии эффект для того чтобы создать какой-то индификатор для представления и потом два представления да то есть и потом когда мы изменяем состояние то нужно это сделать
00:27:40 - 00:29:06
блоком кода виз Animation Animation то здесь автоматически коробки за нас делает анимацию вот этих представлений он разницу между представлениями анимирует по сути он может анимировать так сказать размер положения представления Вот это всё не мимимировать Но насколько я знаю он не анимирует цвет представления для того чтобы проще анимировать представление следующий вопрос [музыка] протокол для того чтобы можем создать свой тип данных подписавшись протокол до предоставлять какое-то значение по умолчанию и то как мы хотим сказать
00:28:26 - 00:29:54
собирать предпочтение значения вы дочерних представлениях и это позволяет если мы подписали протокол и реализуем с помощью модификаторы то можем так сказать в качестве ключа придавать тот свой тип данных который Мы создали в качестве ключа и можем сказать передавать значение из дочерних представлений родительским представлением родительском представлении эти значения использовать либо между соседним представлением данные передавать информацию переходи на доску Да все я внутри Александр не слышно тебя
00:29:28 - 00:30:56
тоже непонятно что надо написать функцию которая принимает массив И делать уникальные массив уже уникальных чисел я понял только если можешь рассуждать слух что ты делаешь зачем-то интересно ну первый день которая первый день который мне сейчас пришла это использовать сет для того чтобы избавиться от дубликатов Но если это не влияет если не важна последовательность или все-таки последовательность потом возвращаем также но здесь можно реализовать это с помощью цикла Флоры либо с помощью цикла for
00:31:06 - 00:32:43
Rich Например можно и получается Если у нас есть так в принципе что здесь можем А здесь забыл еще создать какой-то стоимости [музыка] у нас будет пустой так я в инициализирован у нас пустой и мы получается проверяем если нет значения здесь оператор логический оператор они используют если нету этого значения то тогда что мы делаем тогда мы в этот массив мы добавляем значение вот забыл передать аргумент так доллар 0 Безымянный параметры есть метод Каждый элемент и потом важно здесь не забыть вернуть
00:32:40 - 00:34:22
массив так Ну вот вроде бы все хорошо так Принт мульти Трейдинг [музыка] напишу получается первый у нас работает 18 строчка да то есть консоль увидим единицу потом мы до заходим вот в эту функцию у нас работает вот этот принтер 5 строчка значит значение двоечка значение двойка так потом этот у нас асинхронный код уже получается но тогда мы дальше идем вот этот Принт у нас работает так как это уже мне потока то есть синхронный поток тогда у нас работает Это 6 строчка и потом 20 строчка вниз функции
00:34:11 - 00:35:45
[музыка] и потом вот у нас уже синхронный код так Принт Принт Да вот восьмая строчка значит значение 3 сработает и консоли мы видим и потом мы заходим Так сейчас секундочку Так здесь у нас Мы насинка здесь у нас Main Мне кажется здесь у нас будет dedlock здесь у нас ошибочка будет потому что мы в асинхронном контексте вызываем асинхрон Мне кажется это Не сработает здесь насколько я знаю класс Он позволяет здесь мне кажется будет уже ошибка и мы не сможем это сделать так протокол P расширяем протокол с помощью
00:35:31 - 00:37:02
так представляем этот метод до по умолчанию а потом под структуру мы подписываем под протокол п и предоставляем собственную реализацию этого методам класс если мы инициализируем так и потом вызываем метод так здесь какой вы видите так если мы вызываем здесь класс C так здесь получается будет пром класс здесь так как здесь мы инициализируем как протокол То есть он ничего не знает о классе а структуре здесь тогда он выглядит консоль кажется я понял понял Так цикл for так Ну может казаться до печенья вперед
00:37:06 - 00:38:52
что может система изменяться Да чтобы происходит в цикле for захват значения вот массива то внутри цикла он так сказать не отслеживает вот изменения вот этого массива который мы здесь делаем поэтому можно сказать что значение 1 2 3 как бы не изменяем массив но хотя он здесь при каждой операции она здесь будет массив три раза будет изменяться но в цикле for мы не сможем так сказать в этой константе отследить эти изменения Поэтому вот эти три числа выйдет в конце
00:38:25 - 00:39:41