Подготовка к собеседованию на PHP 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 каналы и чаты
Транскрипция видео:
такс ну в принципе всё сейчас экран должен быть быть виден вот так сделаю а так всё видно да Дада Угу всё поехали а Представься поехали Итак привет меня зовут Даниил я разработчик на PHP вот в основном сейчас последние месяц ещё добыча по фронтенду в основном на viw угу вот опыт работы чуть больше года Вот и на данный момент ищу работу вот проживаю в Таиланде мне 25 лет супер в принципе на этом всё супер а над какими проектами ты условно работал ну что делал так ну получается я работал год в Дальневосточном Федеральном Университете
00:00:28 - 00:02:26
вот пришёл туда на должность стажёра вот 3 месяца был стажёром занимался написанием интеграционных тестов покрытием кодовой базы угу вот собственно все три месяца этим проза немалым решили повысить дни разработчика вот там я уже потихонечку начал делать задачи текущие то есть там мне дали один модуль я его хорошо изучил там начал делать потихонечку разнообразные простые фичи Фактори вход где-то в общем потихонечку втягиваться в работу вот проработал на должности разработчика полгода потом у меня повысили дамил
00:01:39 - 00:02:55
разработчика вот там уже уже задачи были ещё более ответственные с дедлайна там например написание а там для стороннего сервиса которому нужно Там информация Например у нас подключалась система для распознавания по лицу студентов вот я собственно говори писал для получения информации там подам Ну по студентам и по сотрудникам в университете Вот последняя самая интересная задача которую я делал это написание а для мобильного приложения обще у нас был сервис серс ком трудники и студенты могли оформлять разнообразные заявки вот
00:02:21 - 00:03:44
у нас была только у нас была только веб-версия и соответственно поступила задача сделать тоже самое только с мобильного приложения вот я занимался этой большой задачей около 2 месяцев вот в итоге успешно е выполнил вот ну и в дальнейшем я решил перебраться в Таиланд у собственно говоря я думал то что получится остаться на старом рабочем месте но там возникли проблемы бюрократического характера из-за чего спустя несколько месяцев мне пришлось попрощаться со старой командой вот ну и после этого соответственно я
00:03:03 - 00:04:15
потихонечку начал изучать рынок труда а искать какие-то варианты работы Вот решил перескочить на ell начал изучать lel походи делал тестовые задания потом постепенно начал изучать viw изучил View JS вот собственно Сейчас я на этом этапе Угу а продолжаю поиск работы В общем Угу а то есть Равель изучил но какие-то проекты я не делал даже там для себя что-то а ну получается что-то большое там для себя и не делал вот я решил то что будет хорошая практика и не делать какие-то бесполезные проекты а сразу пытаться
00:03:38 - 00:04:57
собеседовать сразу пытаться проходить тестовые задания и в общем-то У меня сейчас три тестовых задания сделаны на гитхабе лежат все они Повали Вот и два из них ещё и с viw Угу Ну а в целом как эти вот собеседования проходили Так ну получается я сейчас в ожидании ещё одного собеседование прошёл про сейчас я успел два технических собеседования вот собственно говоря одно по одному получил отказ во втором получил офер вот проработал там примерно неделю в общем мы как-то так получилось то что может быть Не сошлись характерами
00:04:18 - 00:05:31
может быть решили найти разработчика по опытнее именно на в общем вот ну там команда была маленькая получается по сути один человек в основном Вот в общем вот вот такой опыт у меня сейчас есть Понятно В общем ты сейчас таком в активном поиске дальше Да ну в целом Да в целом Да хорошо а то что вот ты до этого проработал когда тебя повышали там Дона потом Толо а нет ну не были были я там работал на2 в основном Вот но так получилось то что у нас Мы особо не соблюдали скажем так рекомендуемые фреймворка паттерны то
00:04:55 - 00:06:38
есть мы по сути у нас был такой самописный фреймворк на основе но мы сделали его пря по-своему то есть там у нас пря такой модульный Монолит был уже то есть чтото мы вяли отно много чего же там переделали вообще коне да В основном был но не было такого что я там прям всё делал досконально по тому как советует фреймворк то есть [музыка] Угу я так понимаю база данных какая-то типа My была Да была Угу А какой Примерно там объём данных был вот средним так объём данных ну вмещал в несколько гигабайт может быть десятков
00:05:47 - 00:07:00
габа то есть небольшой То есть у нас сотрудники плюс студенты это порядка знаю около несколько десятков тысяч в общем сотрудников п студентов угу вот активных пользователей м Сложно сказать сколько активных пользователей но наверное вот около может быть несколько тоже десятков тысяч активных пользователей в месяц просто дело в том что у нас в системе же остаются ещё и те студенты которые уже отучились то есть они тоже там есть но просто они были неактивные мы наверное наверное месяц это может быть сотни
00:06:23 - 00:07:27
тысяч запросов что-то около того Угу Ну и проектировал только ты или с тобой кто-то ещё был А ну вот по поводу проектирования Я прямо проектированием то есть у нас был основной проект Мовер плюс несколько маленьких проектов там по приёмке и ещё там большие вот э непосредственно прямо проектированием с нуля я не занимался То есть я пришёл на готовый проект уже и по большому счёту занимался больше факторингом и поддержкой существующего кода вот поэтому прямо вот с нуля проектированием я не занимался Угу Угу
00:06:55 - 00:08:05
Хорошо я понял Так ну О'КЕЙ в принципе мне понятно Давай теперь наверное по вопросам я буду показывать слайд там будет вопрос Ну соответственно Ну отвечай Как как можешь Угу давай поехали по первым слайду так сделаем а да какие виды архитектуры построения веб-приложения Ты знаешь Угу Так ну я так понял здесь идёт речь в частности mvc вот такой самый на слуху Если я правильно понял А ну вы Это ниже уро па да имеется в виду монолитно микросервис Да вот два основных понятия вот Ну вот собственно говоря знаю две
00:07:30 - 00:09:06
основных архитектуры построения приложений микросервисная и монолитная архитектура собственно суть состоит в том что когда у нас монолитная архитектура в частности у нас на моём втором рабочем месте Был Монолит модульный Монолит вот собственно суть в том что это одна кодовая база одна база данных всё поддержка ведётся команд с одной кодовой базой Угу соответственно деплой производится целиком если что-то изменялось то деплой происходит у всего приложения и нн и энда вот собственно говоря микросервисная архитектура подразумевает
00:08:18 - 00:09:41
в том что для каждого отдельного как бы сервиса есть отдельная кодовая база которая занимается отдельная команда отдельный depl Там должна быть отдельная база данных а есть Ну и соответствии с этим В чём как бы смысл да то что когда у нас модульный Монолит а основная суть в том что вы ну основная причина перети на мисе туры в том что у нас у Монолита есть порог того порог масштабируемости то есть выше которого то есть мы можем там масштабировать условно говоря а как-то вертикально масштабирование да
00:09:01 - 00:10:14
то есть сделать процессор там помощнее побольше оператива взять там и так далее Вот Но мы рано или поздно при такой архитектуре мся в потолок и наша Ну соответственно система будет не будет справляться и в таком случае приходит решение начинать пилить микросервисы распиливать этот Монолит как правило ну как правило всё начинается с Монолита и потом уже когда понимаю бизнес то что всё работает тогда как правило люди начинают думать об микросервисной архитектуры Ну и собственно говоря микросервисная
00:09:39 - 00:10:40
архитектура решает эти проблемы масштабируемости да то есть а каждое микро приложение своя база данных каждая команда отдельно занимается этим вот но у микро архитектуры есть свои проблемы в том как поддерживать там согласованность системы ность данных и Исходя из этого истекают свои решения там то что как как всё это надо жить как управлять всеми этими сервисами друг с другом как выстраивать общение между ними и так далее вот ну это кратко Как я вижу картину обрисовал наверное Ну да да согласен отлично давай
00:10:10 - 00:11:35
дальше Какие типы Да существует Ну получается у нас в основно отделе идёт на примитивные типы данных и не примитивные то есть примитивные типы данных относится bion а то есть Лего типа True false integer а flot string null м array массив Ну и не примитивное - это объект угу вот а как-то что ещё можно при присылать Ну основное отличие наверное можно так сказать в работе заключается в том что примитивы у нас передаются по значению а ну точнее не так А когда мы продаём примитив например функцию у нас внутри
00:10:51 - 00:12:33
Если мы меняем функцию и передали её без знака персан то передача происходит по значению а с объектами всё чуть-чуть интереснее там передаётся ссылка на объект Поэтому если мы меняем этот объект он будет то есть изменяться единственный объект в памяти Угу Вот это кратенько хорошо а Ray - это структура данных или нет Ray - это структура данных Да это можно к структуре отнести Ну то А ну по идее Да если по структура омивае то что какой-то тип данных может хранить другие данные то разного типа то можно
00:11:43 - 00:12:59
назвать её структурой данных Угу если ели в этом случа шо да Угу отлично идём дальше что такое интерфейсы вообще для чего они нужны Угу А ну в общем а интерфейсы - это некоторый тип данных который похож на класс но у него другое предназначение в общем суть интерфейса в системе - это задать некоторый контракт на основе которого от которого будет зависеть некоторый клиент вот и не вдаваться в подробности реализацию Вот соответственно Исходя из этого определения очевидно то что интерфейс не должен содержать конкретную реализацию
00:12:27 - 00:13:56
То есть он просто определяет сигнатуру методов Ну это кратенько как-то так у интерфейс мы можем наследовать несколько штук Да есть можем имплементировать Какое угодно количество интерфейсов Угу а обычные классы можем несколько штук А ну вообще в программировании есть такое но в PHP нет то есть есть некоторое как лайфхак это через трейты то есть мы можем некоторую функциональность наследовать Угу но по факту нет то есть если мы хотим наследовать несколько объектов то это придётся если мы рюкзак захотим сделать
00:13:14 - 00:14:37
то это Придётся делать вложенность объектов то есть этот наследует этот этот наследует этот то есть в глубину как бы но так чтобы несколько за раз нет Угу угу Отлично пойдём дальше Для чего нужен инкремент декремент а инкремент и декремент - это операции прибавления на единицу и убавление на единицу Угу хорошо мы можем инкремент не на единицу А на больше ни разу такого не встречал и не стал бы этого делать может быть как-то можно Но насколько я знаю Нет пошли дальше что такое рекурсия рекурсия - это по большому
00:13:56 - 00:15:31
счёту вызов функции самой себя в теле этой функции у в ЧМ в целом есть опасность рекурсии опасность рер том что ЕС мы не определим базовый случай выхода из рекурсии то мы можем случайно создать бесконечную рекурсию и у нас будет переполнение стека ну и вообще даже если даже если это не случилось мы можем и скрип работает то мы можем этого не заметить и у нас будет пожирать там какая-то функция случайно там очень много памяти то есть вообще кур решить задачу через цикл всё-таки решать через цикл Угу понят Ну да то
00:14:45 - 00:16:03
есть через итерацию Лучше ходить Ну да да Через итера хорошо дальше какие модификаторы видимости есть Ну в PHP Ага ну основные три типа Public protected Private соответственно если мы определяем метод или свойства как priv то доступ к не может получить только непосредственно данный класс если Протек то данный класс плюс его дети вот если па то любой клиент отличном дальше что такое абстрактный класс чем он отличается от интерфейса Ну функционально отключается тем что в нём можно определять Ну то
00:15:34 - 00:16:53
есть в нём Также можно определять абстрактные методы для того чтобы вынудить наследников его имплементировать Вот Но в абстрактных классах можно определить тело функции Вот и из практики могу сказать то что я применял абстрактные класс чаще всего тогда когда есть некоторые обекты которые очень сильно похожи друг с другом Вот И там буквально чем они отличаются это какой-то конкретны может быть какими-то конкретными данными которые мы там определяем классах наследниках Вот соответственно мы сво абстрактном мы эти прокт свойства
00:16:14 - 00:17:36
можем использовать в какой-то логике Но тут надо быть как бы аккуратным нежелательно вообще плодить дополнительно слои абстракции только если это прямо необходимо и Ну бывает такое что это очень удобно Для того чтобы прямо очень сильно снизить повторяю повторение одного и того же Угу Вот Но вообще как бы желательно Чем меньше у слоёв абстракции тем лучше Угу хорошо так Ну про трейд в принципе ты уже сказал а есть Что добавить ещё А есть что добавить по поводу практики у меня в команде у нас было правило не
00:17:00 - 00:18:12
создавать трейты вот ну и вообще получается то что как я понимаю в чём смысл то что по сути Трейд он как бы нарушает инкапсуляции То есть можно если с рейтами В общем можно на протачивать какой-то переменной А ты об этом там в этом классе можешь не знать и что-то с ней сделать как-то изменить её название и так далее То есть надо быть аккуратно с трейда и чаще всего я стараюсь их избегать только используя Трейд фреймворка Угу Ну как-то так угу рейтов может быть несколько Ну условно да да подключено можно можно подключить
00:17:36 - 00:18:52
сколько угодно трейтор Угу Угу хорошо Давай такую более практическую задачку как реализует паттерн проектирования стратегия пример кода так код надо Да ты можешь сначала рассказать потом я тебе дам доступы просто экран расшарить Угу Ну в общем А у нас из практики можно сказать то что у нас была допустим гло кода где мы применяем принимали решение о том каким способом мы применяем того принимаем того или иного студента там на платной основе либо на либо он бюджетник и так далее да Вот то есть смысл этой
00:18:15 - 00:19:41
Стратегии в том что у нас есть некоторый клиент вот э и к нему приходит например какой-то объект с каким-то интерфейсом Аа и всё что нужно клиенту - это получить какие-то данные от этого конкретного объекта но о знает какой именно это объект Вот и соответственно каждая отдельная стратегия имплементировать этот интерфейс и реализует какую-то свою внутреннюю логику Угу Сможешь показать пример кода а Давайте попробуем Надо что-то придумывать так да экран расшарить прямо в нём писать Ага а ничего если я буду в шторм Я просто уже
00:18:59 - 00:20:23
открыл без разницы просто лишь бы было видно где-то это видно да Угу Так теперь давайте подумаем А сейчас первое что в голову приходит Это какой-то пример там про геометрические фигуры там условно говоря у нас есть там Это наверно слишком просто не знаю Давай знаешь по типу с архивами вот есть у нас R архив ЗП архив там тар архив вот Как реализовать логику что нам нужно условно разархивировать но то есть у них у каждого логика разархивация своя Ой так Допустим у нас есть некоторый интерфейс архиватор
00:19:42 - 00:21:25
Угу но у него есть публичный метод А ну лато у нас нет допустим буде [музыка] и у нас есть некоторый класс ZIP архиватор а ZIP архиватор Ну получается правильно назвать STR но я не уверен насколько это обязательно Ну не обязательно сейчас допустим архиватор архиватор о нам редактор подсвечивает то что нужно вать метод Так ну и там некоторая логика как рар Да [музыка] угу ну и соответственно тоже оет некоторый метод Zip ну и соответственно есть некоторый класс клиент Ну некоторый метод process что
00:20:45 - 00:22:37
нам сейчас неважно Угу Вот и допустим у нас в системе через dependency injection установлен А определение то что мы в системе везде используем архиватор интерфейс Ну и допустим если мы имеем в виду Раль то мы можем в зависимостях прямо указать архиватор и соответственно Аа dependency injection Котей ваки нам поставит тот архиватор который мы указали в сервис провайдере Угу Ну и мы соответственно нам нужно вызвать некоторый метод этого архиватор Ну мы просто вызываем его с каким-то ну здесь надо передать навер какой-то там
00:22:18 - 00:23:47
файл Сейчас я поменяю немножко интерфейс наш чтобы это было чуть-чуть больше похоже на правду вот ну и соответственно он берёт этот архиватор Угу undip Ну и мы передаём с на некоторый файл Ну собственно говоря Наверное вы на этом всё да да да Да засчитывается окей давай теперь дальше пойдём так ты тогда Останови экран Да так сейчас секунду а а сверху стоп Так теперь поехали дальше Следующий вопрос по сингл тону для чего вообще нужен паттен в ЧМ его преимущество вот ну пример приводить ты можешь просто в
00:23:04 - 00:24:39
целом а какой-то пример из практики привести Ну наверное что в E2 что в RL самый типичный Tone - это экземпляр приложения да то есть у нас есть единственный экземпляр в рамках котором мы работаем то есть смысл сингл тона вообще в том чтобы создавать чтобы в системе был единственный объект и мы были в этом уверены а реализуется это часто там через какие-то какой-то статический метод который должен вернуть экземпляр данного объекта и когда мы его первый раз вызываем он себе там в приватные свойство кладёт экземпляр
00:24:00 - 00:25:08
создаёт е и кладёт в сле последующие разы он просто берёт экземпляр из этого свойства Угу Почему Нам нужен именно один экземпляр почему это так критично А ну получается то что в этом Эле лежит много различных настроек приложения там настройка для подключения к базе данных Там и так далее а и соответственно мы там можем в настройках как-то именно на этот конкретный объект воздействовать какие-то там Ну опять же да что-то настроить что-то изменить и соответственно нам нужно быть уверенным в том что по
00:24:35 - 00:25:49
следующие разы эти настройки же будут работать Угу а с точки зрения там производительности нам это даёшь что-нибудь ну получается что не нужно каждый раз поладить Новый объект наверное это хорошо производительно то есть мы просто берём из памяти готовый Угу Угу Да всё верно погнали дальше Угу Так по поводу mysql А в чём отличие основное primary K UN K А ну получается primary Kate то мы используем а всегда а для идентификации какой-то строчки да уних то есть мы можем как бы идентифицировать эту строчку по этому столбцу вот а UN мы
00:25:12 - 00:26:41
используем Когда у нас есть некоторая есть необходимость чтобы Да был Уникальны то есть Угу то есть мы в принципе просто концептуально немножко другая разница но с точки зрения там эффективности работы базы данных Я не думаю что есть какая-то огромная разница вот единственно разве что когда мы используем например автоинкремент идентификатор то индексы работают на этом идентифика чем какими-то ными строками А так наверное концептуально не сложно сказать в чём ещё отличие при моке может содержать нуль
00:25:59 - 00:27:21
значения не должен Угу просто в этом как-то смысла нет да UN можно с Я думаю что тоже я думаю что тоже нет в этом просто смысла нет но может быть или может содержать единственно потому что ну но не уверенно Угу Ну условно приправи как правило их не делают на лабу как правило они мот на лабу эти стопы Угу Ну в целом могу сказать что primary K не должен содержать а unik имеет право содержать нуль значения То есть это ну считается нормальным А ещё такой момент при Макей а он может быть составным то есть
00:26:40 - 00:28:07
несколько столбцов содержать а Ну вообще получается Я думаю что да не так часто я это использовал насколько я знаю такое возможно вот я знаю просто ещё то что это не поддерживает насколько я знаю но вообще в базе данных такое может быть и вроде бы даже это считается хорошей практикой использовать так называемые естественные ключи если у нас есть действительно по факту хорошо идентифицирующие там данные условно говоря какое-нибудь там Мар даже Ну например КАД адрес да то есть это естественный как бы
00:27:24 - 00:28:44
[музыка] идентификатор А вот ещё есть у нас внешние ключи они вот для чего вообще нужны ну внешние ключи разные несколько предназначений одно из главных предназначений это поддержание Косино ба данных есть когда мы дела миграцию мы можем задать что вот у нас есть такой-то такая-то ссылка на другую таблицу внешнего ключа и там а соответственно когда мы обозначаем этот внешний ключ мы не сможем Создать запись в случае если эта ссылка ведёт никуда и таким образом поддерживается консистентность базы данных Вот Но также
00:28:06 - 00:29:34
а также когда мы делаем внешний ключ Это позволяет нам делать эффективные йн запросы Угу насколько я помню насколько я помню когда мы делаем внешний ключ база данных индексируют эти Столбцы также у Вот хорошо а внение ключе могут нам помогать удалять данные в связанных таблицах да да то есть когда мы там пишем миграцию можем обозначить Как реагировать на изменение целевой таблицы либо запрещать либо ка то есть там в настройка есть ка update Это значит что мы каскадным способом То есть просто меняем если там снился
00:28:49 - 00:30:33
идентификатор Del это мы то есть мы Эта таблица не даст удалиться той записи и ка и ещё один вро а нет вроде бы всё да либо запретить либо а либо то есть просто если удалиться то проставить Да всё верно Поехали дальше тогда в чём разница между получается можно применять посчитали вычислили там какую-то условно среднюю зарплату по отделам и вот эту среднюю зарплату мы можем применять в качестве аргумента в н блоке А в V такое нельзя проделать Угу ещё есть что-нибудь мне что-то в голову не приходит
00:29:41 - 00:31:32
угу Там ещё одна небольшая особенность не помню ну ладно просто помять у себя потом ещё можешь почитать Давай дальше Поехали Вот такая вот практическая Задачка Представь что у тебя есть очень тяжёлый SQ запрос он выполняется каждую минуту его нельзя уже никак оптимизировать а запрос у нас инициируется с клиентской стороны То есть ни в коем случае нельзя его Ну там допустить чтобы там пользователь ждал там слишком долго больше одной минуты Вот то есть ты можешь эти данные зашивать там На какое время тебе
00:30:54 - 00:32:16
необходимо Вот Но если представить ситуацию что через там условно 5 минут мы весь кэш сбрасываем и одновременно сразу десятки пользователей инициирует данный запрос который сразу же летят в базу соответственно это создаёт во-первых кую нагрузку и Время ожидания тоже сильно увеличится как бы ты решал такую задачу ну я думаю одно из решений раз нам критично Да чтобы эти данные были 24 на 7 всегда доступные вот а кнеш он как бы нам не даёт такой не даёт такого качества то есть конечно может обнулиться как здесь уже
00:31:38 - 00:33:04
сказано А ну я не знаю возможно стоит а создавать ещё одну таблицу в которой А это ну как бы которая будет по сути это же запрос в готовом виде мм то есть по сути просто переложить это хранение США на базу данных первое что в голову приходит Угу Это нам даст преимущество Ну или же воспользоваться опять же Да просто воспользоваться какой-нибудь мого db условный То есть концептуально это сделать всё то же самое а но просто чтобы это хранилось не в оперативной памяти а на диске Вот Угу Ну и по поводу редис
00:32:24 - 00:33:52
насколько я знаю он может и вообще сохранять на диск данные то есть Может быть стоит в эту сторону пойти того что просто есть возможность всё-таки избежать вот этого падения кэша вообще Угу Ну то есть в принципе мы используем дис просто как для кэша угу угу а как это обновлять как это ну вот что делать в проекте как это выглядит Хм наверное немножко вопрос не понял ну Уточняй если Угу А как это должно выглядеть в проекте пространстве то есть что ты будешь писать условно это какой-то будет там Ты контроллер
00:33:15 - 00:34:52
напишешь да какой-то или что это будет как это будет там происходить на уровне кода что ты будешь добавлять в проект какие файлы [музыка] Угу Ну получается Если мы так это интересно вопрос а ну может быть я не знаю насколько это хорошо будет может быть если у нас случилась такая ситуация и мы понимаем то что вот-вот этот кэш сработает и нам для нас критичная производительность базы данных Да не знаю Если возможность как-то пользователям подождать может быть какую-то ошибку чуть-чуть Подождите там на сервере
00:34:31 - 00:36:05
происходит обновление или что-то такое то есть мы-то знаем то что вот вот этот хш обновиться и дальше Всё будет хорошо а в таком случае соответственно мы можем сделать если мы видим то что в коде некотором может быть контроллере или там сервис то что мы вот например сначала пошли в кэш он на вернул нал А то мы пошли в базу данных и может быть ну и соответственно не идём мы один раз пошли в базу данных может быть сделали да какой-то сигнал Ну то есть какое-то обозначение чтобы все следующие запросы
00:35:59 - 00:37:13
которые идут в базу чтобы они опять не шли обновлять этот кэш Да а соответственно тоже отправляли это сообщение пользователю Вот соответственно нужно где-то вот может быть в этом же кэше в новом создать какое-то новое значение о том э производится ли сейчас обновление данного конкретного кэша или нет то есть это будет намного быстрее работать Мы с первого же запроса положим и все следующие запросы будут об этом знать Вот Угу и соответственно и когда уже все если сонно когда кэш уже будет готов Аа тогда
00:36:40 - 00:37:52
запросы уже будут начнут проходить и браться из кэша м [музыка] Угу хорошо а когда мы делаем запрос То есть ты говоришь чтобы клиент подождал пока это там может обновиться мы это делаем когда Как асинхронно как мы это Ну получается здесь а имеется в виду как мы сообщаем клиенту да о том что Подождите ну да то на страни идее по идее взаимодействие с клиентом Не подразумевал как правило асинхронность то есть одно дело когда мы там можем отправить по почте да Но наверное данном конкретном случае можно сказать о том Ну синхронно
00:37:17 - 00:38:47
вернуть клиенту запрос о том что сейчас происходит обновление базы Подождите пару минут условно говоря Вот то есть делать здесь синхронно Я не вижу особого смысла то есть условно если допустим какая-то большая страница Да у нас есть ну скажем клиент какой-то туристический портал допустим где он заходит там допустим у него есть несколько разделов и вот один из разделов как раз таки вот этот вот тяжёлый запрос Ну то есть один из блоков в разделе выполняет тяжёлый запрос получается мы клиенту не показываем
00:38:07 - 00:39:18
вообще ничего он ждёт пока вот этот запрос выполнится то есть мы просто перед ним там условно белую страницу показываем больше че ну здесь уже Тогда вопрос про р интерфейс Юр Friendly Интерфейс Да о том чтобы клиент понимал что вообще происходит а соответственно если у нас условно А есть какой-то Single page Application например ну или даже нет можем сделать некоторое ожидание то что Подождите данные грузятся ещё лучше если это будет в процентах там условно нарисовать ему чтобы человек понимал том
00:38:42 - 00:39:54
что это не просто залагало да то что процесс идёт Вот и соответственно А ну в данном случае даёт вопрос о том что нужно как-то клиентском Ну клиентскому приложению Сообщить о том что всё хорошо И что он может забрать данные и тут уже вопрос как это реализовывать либо через Полин либо через webs а угу То есть это уже конкретная реализация можно сделать и так и так наверное более там правильно с точки зрения производительности сделать через websocket вот через через там есть специально для этого бродкастинг то есть
00:39:18 - 00:40:26
там подписаться на некоторый канал который сообщит мо смотрите обновился можно можно забирать данные например Угу угу вот наверное как-то так так хорошо ещё есть какие-то варианты пока наверное в голову не приходит Угу М наверное не отвечу на ещё один вариант можно долго сидеть Я думаю лучше пойти дальше можем мы использовать какое-нибудь консольное приложение консольно приложений Да ну консольное приложение подразумевает ручную работу как бы а ну вот в Лавали же там же есть консольные утилит да Ну конечно
00:39:53 - 00:41:20
консольные команды есть контроллер Да вот Мы это как-то можем использовать для решения задачи Ну если например мы увидели Так ну вот получается ситуация такова что условно говоря кэш вот обрубили А ну просто тогда дело в том что насколько я понимаю если это кон приложение это значит обозначает какую-то реакцию там разработчика условного на уже случившиеся факт какой-то проблемы и вот он использует конное приложение сам руками идёт и что-то там исправляет то есть проблема уже случилась а то есть консольные приложения
00:41:14 - 00:42:34
они или же или же Да я понял я понял ты ведёшь либо же это будет некоторый как это господи называется на сервере там допустим ежеминутные какой-то скрипт будет выполняться крон Господи да то есть он будет следить за тем чтобы к всегда был здоров чтобы он все обнов его Неди то здесь иметь у нас нету кэша и все пользователи выж куда-то идти Да хороший вариант засчитывается Ладно погнали дальше Давай Что такое про вертикальный горизонтальное масштабирование база данных Ага Ну получается вертикальное
00:42:00 - 00:43:34
масштабирование это мы там побольше процессоров побольше оперативной памяти на серве положили и всё стало лучше работать вот а горизонтально масштабирование данных это уже интереснее а это сложно сложнее вот это там это у нас имеется в виду там про Господи как называется шардинг а базы данных А ну то есть а соответственно мы можем сделать репликацию базы данных например Когда у нас есть условно говоря несколько нот есть кощеем только операции ид которые още топера Вот соответственно мы можем разделять часть запросов туда часть
00:42:48 - 00:44:28
запросов туда ну и соответственно синхронизировать состояние от мастера кдам вот здесь же у этого же подхода ещ есть плюс безотказности работы что если мастер Пада собственно говоря я вот сейчас не знаю путаюсь в понятиях или нет это про то что мы можем одну табличку условно говоря разделять на несколько табличек а но это это не про наверно одну табличку на несколько это про парти О партицирование господи да другое ну то есть дасть Можем также данных в которых условно говоря в одной базе данных лежат данные там с
00:43:38 - 00:45:09
такой-то там по алфавиту например буква первая половина алфавита во второй базе Да вторая половина алфавита условно говоря Вот Угу Ну наверное тко ответил на вопрос хорошо Да да да идём дальше что такое репликация вообще для чего она нужна Ну только что упоминал Можно чучуть повторить то есть ция по сути это создание копии базы данных у неё у этого несколько есть предназначений это распределение нагрузки То есть как я уже сказал в Мастер ноду мы условно говоря делаем й операции в сду мы делаем только операции
00:44:31 - 00:45:55
а соответственно плюс в том что у нас снижается нагрузка то есть мы можем масштабироваться плюс в том что у нас есть безотказность работы то что мы можем если мастернода упала можем сделать э слей ноду мастернод и временно вот Ну соответственно это происходит не без Ну это достаётся нам не бесплатно то есть минус в том что у нас сложно поддерживать согласованность базы данных вот есть даже такой принцип А я не помню как он по мучному называется но смысл в том что когда мы работаем с базами данных У нас есть несколько вещей три
00:45:16 - 00:46:27
там три элемента консистентность базы данных скорость ответа а консистентность скорость ответа и ещё ещё один пункт забыл В общем Суть в том что мы не можем поддерживать все три нам Всегда приходится выбирать два то есть условно Когда у нас есть одна база данных нам А Ну и масштабирование масштабирование конечно То есть когда у нас есть одна база данных Нам её соответственно это не масштабируемая Вещь Вот но у нас есть быстрый ответ и у нас есть согласованность соответственно Когда у нас распределённая база данных у нас Мы
00:45:51 - 00:46:57
можем [музыка] сохранить например А согласованность масштабируемость у нас ственно есть но тогда скорость ответа будет страдать и всегда в общем надо выбирать два из трёх в зависимости от задачи Угу Да вот хорошо идём дальше что такое сфинкс эластик для чего они нужны Ой вот здесь я наверное не отвечу Не использовал сразу скажу не работал Угу ну посмотри Почитай это по сути такие поисковые движки они поверх ма SQ там ну условно SQL базы встают позволяет гораздо быстрее искать то есть они как бы ради этого написаны Ладно Далее по
00:46:25 - 00:48:02
поводу rabit MQ знаешь ли Угу А да rit MQ - это у нас рокер очередей вот у нас он использовался А ну собственно говоря это такой способ например Когда у нас есть огромная нагрузка мы можем и сервер может не справиться мы можем все задачи поставить в очередь друг за другом и потихонечку их потихонечку их одну за другой выполнить вот одно из выполнений - это вот работа с больших нагрузках большими нагрузками а другое направление - это Например какие-то тяжеловесные задачи Когда нам нужно делать допустим
00:47:12 - 00:48:23
пользователь делает какой-то запрос выполнение тяжёлые работы чтобы его не задерживать и не делать в синхронном виде вот ну там не условно у нас там использовалась отправка почты условно говоря какой-то вот мы возвращаем моментальный вопрос и отправляем ДБУ в rit соответственно этот потом подхватывает и выполняет её вот но также rit насколько я знаю используется в в качестве в событийной архитектуре вот собственно через него можно транслировать события в микросервисной архитектуре вот которые будет считывать
00:47:48 - 00:48:59
разны микросервисы Ну на этом на этом выстраивать в общем взаимодействие Угу хорошо Да так ну в принципе задачи на этом закончились а ну как бы моё резюме такое что в целом У тебя очень хорошая база Ты довольно уверенно отвечал на все вопросы и я если честно ну каких-то проблем здесь не вижу возможно А ну условно там местами тебе где-то практики побольше необходимо там ну там условно в лавели или вот даже вот поработать с такими движками Сфинкс ластик а просто вообще понять для чего они нужны Потому что часто бывают такие
00:48:25 - 00:49:55
вопросы вот именно про такие движки Там могут спрашивать и какие-то задачи тоже давать ну с этими движками вот и ну лично я не вижу что у тебя будут какие-то проблемы прям с какими-то там прохождением собеседований а моя рекомендация только больше практиковаться наверное разного разного рода задачки брать и соответственно порешать их как можно больше ну в рамках какого-то более менее реалистичного сценария как минимум для себя Ну да я хотел добавить то что я столкнулся с такой проблемой да то что вот я даже делаю тестовое задание и
00:49:10 - 00:50:35
вроде как сделаю делаю его Да чтобы самому ещё и прокачаться Ну и заодно увеличить вероятность некоторого оффера Вот Но как правило даже в тестовых заданиях вот такие сложные вещи там кэндо ские как правило их нет как правило это всё заканчивается на каком-то Круз простом То есть ты там не не можешь условно говоря на этом прямо прокачаться вот и не все и далеко не все тебе отдадут ещё обратную связь потому что я вот сделал недавно задание вроде бы как СТК приложение там тайм трекер вроде бы сделал всё хорошо вот мне
00:49:54 - 00:50:53
сказали Извините вы нам не подходите сказал Почему я как бы в ответ тишина то есть обучиться на этом сложно и поэтому чтобы такие сложные вещи изучить это нужен да какой-то человек который тебе там условно даст какое-то задание сложно ты выполнишь он даст тебе обратную связь его по э этим штукам да да Ну да в идеале какого-то там условно ментора как сейчас говорят все который с этим работал и ну в на тестовых заданиях обучаться смыс большого нету как правило тестовые они а а ну я бы сказал Да но это какой-то прям
00:50:24 - 00:51:49
минимальный такой уровень тебе даётся то есть там нет задачи прям проверить все все Твои навыки все твои знания во-первых как правило эти тестовые их даже Ну я знаю ребят кто они даже не проверяют то есть они дают тестовое там что-то сделали им показали и они говорят мне такая лень лень смотреть весь этот код всё это читать то есть они как бы говорят Ну давай что-нибудь напишу там типа нет или да ну то есть там не стоит надеяться что прям сидят реально проверяют твой код Ну какой-то количество Возможно есть
00:51:07 - 00:52:22
но по-хорошему как бы большинство разработчиков не особо любят кого-то собеседовать не особо любят давать тестовые потом их ещё и проверять то есть Зачем это надо Когда можно заняться чем-то другим Вот Но поскольку там какие-то возлагают на них обязанности по там ихней должности то им как бы приходится это делать Вот поэтому здесь да В любом случае Конечно бы лучше условно там ментора какого-то найти чтобы действительно практические задачи Он дал Ну такие настоящие как минимум там своей практике говорит что
00:51:44 - 00:53:03
вот у нас была такая задача Мы вот это вот использовали давай-ка теперь вот ты тоже это реализуй То есть это уже будет более-менее понятно как бы это единственный вариант Как по мне где можно Ну действительно прокачаться нормально вот а так в принципе я думаю что у тебя каких-то больших пробелов я там не заметил м вот поэтому тут ээ Ну во-первых продолжать собеседование так или иначе эти проходить Вот я думаю что в целом ты Я думаю спокойно найдёшь сейчас там какую-то интересны какой-то интересный офер Вот Но в дополнений как
00:52:26 - 00:53:56
бы если ты вот эти вот все штуки будешь знать плюсом то конечно у тебя как количество пунктов пройти куда-то Оно увеличивается Вот и в целом те общий обм нка для тебя такой более большой более доступный Вот но Ну вот это мои рекомендации в принципе у меня вопросов нету у тебя что-то осталось ещё Да нет вроде бы всё прошло легко у на одном дыхании классно Супер всё было приятно пообщаться Я надеюсь все кто это смотрит им тоже Интересно так что всё увидимся Всё Всем пока хорошо спасибо всем пока пока
00:53:12 - 00:54:56