Подготовка к собеседованию на 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 каналы и чаты
Транскрипция видео:
Что ты нажал начать ви он он начался или ты просто посмотрел на эту кнопку Всё мы в эфире сейчас ждём покам канале Ассалам алейкум хаваш Ваалейкум ассалам Как твои дела Прекрасно Я же тебя вижу Что нового Да нормально вчера тут с тобой был в кафешке че я тебе рассказал какие вопросы будут А я тебе рассказал какие вопросы будут так ты же мне ответы уже все скинул кстати пока мы не начали можешь рассказать три способа как отцентровать ди Как познакомиться с девушкой что меня здесь написаного что пока у него перевёрнуто написано в
00:00:00 - 00:01:44
он мтх Да короче как фронтенд разработчик можешь нам рассказать три способа как отцентровать див типа с помощью CSS сначала нужно сделать ди Угу а потом текст текст там текст цент сделать это первый способ Да Наверно я не зна разработчик второй способ второй способ взять окно браузера и выровнить по центру монитора это всех Трей А то что ты сза лаку слаем мы плашку сделаем чтобы они монитор на половину экрана ставили е треть Я не знаю блин на третьем Надо подумать это уже не знаю Я знаю можно в
00:01:03 - 00:03:06
фигме нарисовать и вот эти стили которые он даёт там со всеми заданными ширина высотами их ставить Я знаю ещё лучший способ гениальный просто способ мы можем сказать дизайнеру чтобы он все экраны нам нарисовал И когда у человека экран будет там определённого размера мы будем картинку показывать этого сайта с конкретно отцентровать [музыка] у нас спрашивают Да ждал пока ты ответишь знаешь с такой и одновременно грусть такая да Дава у нас опытный PHP сколько ты Сато сделал Нарин Давай заголовок поменяем кринж
00:02:12 - 00:03:56
Собес не можешь сказать сколько примерно сайтов ты сделал на PHP прям которые запустили А я знаю минимум два Сата уже дела на которые пря запустили на про и все отлично Работают и даже ня слы во-первых скажи я тебя слышу Ты меня нет ты чуть-чуть подсад бы сечас нет включен нет а вот пишут Кстати у вас запуска Я не знаю что с этим делать не вроде сейчас нормально вроде сейчас нормально он же конечно не сл ему говорю всё нормально Я знаю Там скорее всего дальше это тоже будет продолжаться Тит Ну всё пять человек ещ ещё будем
00:03:19 - 00:04:57
ждать кого-то кто-то должен для меня тоже Сан этот видос удалим Ну что ты готов Нет не готов Я короче мы начинаем Так давай начинаем Давай хо Расскажи немного о себе Какой опыт тебя вобще есть как ты с ним познакомился что на нём делал вот интересные задачи может решал какие-нибудь понял Здравствуйте я фронтенд разработчик но иногда балуюсь по кду и занимаюсь тем что делаю что-то по разработке сайта в основном использую JavaScript tpt но когда-то был опыт рабо из ПХП когда-то был относительно приятный относительно
00:04:21 - 00:06:15
горкий опыт можно перебить с какими версиями Ты успел поработать скорее всего это 5п ише там в начале Да что ещё раз с какими версиями Ты успел поработать 5 и Да это по-моему с пятёрки где-то началось Я помню это было где-то 2000 2010 год девятый десятый год примерно когда сайты разрабатывал Я не знаю какая версия тогда была я знаю что это был PHP и он в принципе всегда был PHP по-моему это была где-то пятёрка скорее всего пятёрка вот а в основном разрабатывал скрипты сначала так просто там mysql не
00:05:35 - 00:06:58
mysql потом постепенно начал пытаться создавать как любой PHP девелопер а свой гениальный фреймворк То есть я такой типа блин я не хочу использовать эти движки я буду делать всё сам не зря же я классу учил Вот вот как-то так и ты написал свой фреймворк скажем так Франкенштейна какого-то сделал который темплейты умел рендерить которые какие-то там базовые вещи с myq [музыка] делал я самое худшее а контролер Да были тогда знал что то есть я не знал что такое контроллеры я видел что опытные разработчики применяют
00:06:16 - 00:07:57
контроллеры такой блин слово круто звучит буду тогда его использовать А ты тоже делал Ну что типа если с с вырезал из него адрес и по этому адресу уже направлял по определённым контроллера Блин Я такой фигнёй Раньше занимался А с какими фреймворка ты вообще сам работал именно с ными это у нас что было у нас равел потом селениум по-моему как так назывался был такой Ну такая упрощённая версия какая-то была лавела а а это люмен люмен люмен Да люмен люмен да Ну ещё один был Э короче это был подобие
00:07:13 - 00:08:53
ларавел но он прямо вообще такой очень-очень простой был А я думал что если я буду применять такие простенькие библиотеки мой сайт будет работать быстрее аэ в основном это применял м а так больше ничего давай тогда проверим насколько хорошо ты знаешь PHP какие там типы данных были какие были типы данных PHP в последний раз когда я его трогал А сейчас сильно изменился А сейчас он сильно изменился Да он на самом деле очень сильно изменился давно его уже не трогал А в последний раз там ну там были
00:08:11 - 00:09:37
стрин бу значения были Ну то есть ты говоришь мне рассказать базовые да какие-то да самые базовая Тепа который ты помнишь Ну string buon были а объекты Ну это не объекты по сути Ну скорее всего это ну это получается табли Ну не таблица А я не знаю как в PHP в PHP по-моему нету понятия объекта есть типа коллекция скорее всего это наверное нужно назвать а то есть вот это вот что там ещё ну функции что там ещё я не помню называется об массив ассоциативный массив Ну это что-то типа объекта Ну наверное это объект То есть я
00:08:54 - 00:10:26
понял Для меня не было понятия как объект Окей так тогда Следующий вопрос Ты вообще работал чуть-чуть знаешь в ЧМ отличие от ф от Статик селф - это когда мне а Статик - это когда происходит что-то статичное м нет а там зови отличается тем что что-то ну зависимость от контекста селф запускается изнутри класса Ну это про класс идёт реч да да изнутри класса где онде Ну по крайней мере я могу интерпретировать из ДСА Ну то что относительно знаю не только JS вообще в целом это Статик по-моему когда у класса есть какой-то статичный
00:09:42 - 00:11:31
метод который не требуется Ну он не требует то есть для его вызова не требуется создание экземпляра класса можно сразу же по классу самому обратиться к статично методу или самому свойству возможно тебе кажется из-за названия типа S Static А так это Ну опять же а в селфи метод запуска не в селфи метод условно метод запускается в классе в котором он определён а в статике в классе в котором он вызван Ну это речь когда идёт про наследование угу вот и кстати раз мы вспомнили это наследование Назови вот эти три принципа
00:10:40 - 00:12:04
Опа помнишь три принципа ооп или полиморфизм там наследование Вот это всё помнишь полиморфизм наследование Ну что-то помню понял Ну давай тогда насколько помнил ты именно самом PHP много всего забыл Тогда просто перейдём именно к общим вопросам которые тоже есть PHP не давай мне интересно просто мне на самом деле интересно сейчас вспомнить эти знания потому что я очень давно не ТЛ скоп Давай просто поверхностно хотя бы Понять насколько у меня плохо всё Да не ну не сказать что плохо Ну наверное Ну
00:11:22 - 00:12:45
то что я говорю полиморфизм там наследование это в любом типа ооп есть А в чём заключается смысл полиморфизма помнишь суть полиморфизма заключается в том что по-моему когда это что-то было по-моему связано с скорее всего это что-то было связано с наследованием от базового класса когда а блин ну это не помню кстати Ну помню что это связано было что-то с наследованием Ну да типа есть условно какой-нибудь абстрактный класс и есть два класса которые реализует абстрактный метод по-своему Ну условно это может быть там
00:12:06 - 00:13:19
у тебя может быть на сайте продукты в одном месте Ты просто вводишь название продукта а в другом месте Ну условно у них у класса есть абстрактный метод там generate Tile или Show Tile один класс его просто показывает а второй класс Может там ценой показать Ну то есть Разная реализация но один то есть по сути получается мы от базового класс наследуем какой-то другой класс и докембрий реализовать абстрактный метод вот у Угу понял В этом заключается суть этого Так что ты можешь сказать про Solid можешь расшифровать эти все
00:12:44 - 00:14:06
буквы Solid Solid это у нас получается Single responsibility Open CL barb interf aggregation и ну разделение интерфейсов и получается принцип инверсии зависимо сколько тамп рассказать каждый из них и подробно рассказать или можно просто хотя бы рассказать в целом Ну основная идея заключается То есть в принципе ответственность единственная ответственность заключается в том что класс или функция она должна выполнять только определённую задачу то есть нежно быть такого что например у нас есть корзина которая выполняет Ну получается
00:13:34 - 00:15:33
хранение товаров вычисление Ну это имею в виду бизнес логи описываю и оформление заказа у нас не должен быть один класс который и жнец и кузнец и наду игрец То есть если мы хотим такого сделать то это должно быть Три разных человека то есть жнец должен быть кузнец должен быть и на игрец если у нас ди игрец заболеет то мы будем знать почему наша вся работа сломалась а не разбираться Прямо во всех деталях типа в этом основная идея его что каждая часть должна выполнять свою определённую задачу понял Круто А
00:14:35 - 00:16:04
про что скажеш тут основная идея заключается в том что а если у нас например есть какой-то класс или какой-то интерфейс А кстати я сейчас по-моему этот момент могу сейчас перепутать с другим понятием а основная идея вот заключается в том что А мы должны если у нас есть какой-то один класс или интерфейс какой-то большой Аа мы должны его по-моему разбить на отдельные классы интерфейсы которые будут выполнять свою определённую задачу То есть если у нас например есть база данных который описывает какой-то
00:15:19 - 00:16:34
интерфейс там работа с базой данных и у нас есть какая-то другая база данных Ну не знаю там db которая заключает там свои определённые методы какую-то свою задачу то мы должны описать один основной класс или интерфейс и на основе его уже использовать мошны или там другой интерфейс И дописывать что это дописывать саму логи Ну да ты имеешь в виду описываешь интерфейс Ну условно какой-нибудь логгер он может там логировать в Реди Может логировать там файловый систему может логировать ну куда угодно и ты это
00:16:00 - 00:17:19
выносишь в интерфейс А ну а сама суть тогда этого внедрения зависимости в чём заключается Если у тебя есть интерфейсы но может быть разная реализация Ну то есть они должны получается зависеть от какого-то абстрактного класса то есть идея в том что то есть ну то есть у нас например есть какой-то базовый класс и вот эти вот другие классы которые наследуются от базового они не должны зависеть от каких-то определённых типа деталей или чего-то что не связано с главным классом все остальные детали уже описываются
00:16:40 - 00:17:56
отдельно в тех классах которые наследуются там не знаю как-то короче я не знаю как это объяснить немного другой другой теме даже Ну немного другое понятие типа depend injection нужен для того чтобы условно У тебя есть несколько реализаций но у тебя на проде Каширова что-то может редис А в локальной когда ты тестирует там разрабатывает у тебя каширу ется там в какие-нибудь файлики и чтобы переключаться между ними ты используешь интерфейсы и просто поменяешь реализацию Ну то есть как это выглядит у тебя условно есть
00:17:18 - 00:18:41
контейнер dependency injection контейнер а слева там как ключ Ну это грубо говоря объект слева ключ - это интерфейс твой а значение этого ключа - это реализация конкретного класса и вот так ты можешь их подменять вот в этом суть именно внедрение зависимости это не барбера лисков по-моему когда у нас есть главный класс есть класс наследуемый и при перестановке этих двух классов если они Не нарушают ну Не нарушают алгоритм выполнения по-моему Это не лиску ты чтото сказал не это другой Ты про принцип открытости
00:17:59 - 00:19:24
закрытости и то что там наследуемый класс должен Воть такие же типы это Ну это тоже есть солиде я имею в виду именно внедрение зависимостей в том что ты можешь подменять реализацию или условно Даже когда ты Ну как в лаве Ты можешь в контроле там заинжектить какой-нибудь поди го и ну инверсия зависимости типа в чём её суть именно Ну я же говорю что получается что у нас есть какой-то главный класс то есть какой-то абстрактный класс высокого уровня типа и он не должен зависеть от каких-то деталей каких-то
00:18:42 - 00:20:07
там не знаю там классов низкого уровня который там выполняет какую-то свою определённую задачу То есть он не должен быть привязан к деталям он должен выполнять какую-то базовую часть А все остальные уже наследуются от этого класса и выполняют уже какие-то возможно там свои детали Возможно не знаю мы тогда про разные эти принципы но опять же именно интерфейс нужны для того чтобы условно У тебя есть класс сервис Ну как это передашь конкретную реализацию репозитория ты передаёшь его интерфейс где описано методы
00:19:27 - 00:20:49
там и зависимости Ну описываешь там несколько классов которые реализуют этот интерфейс условно один класс может что-то писать читать из може опять же в зависимости от нужд запрашивать конкретную реализацию этого класса опять же это может у тебя храниться в каком-нибудь контейнере там и опять же твой класс когда вызывается ты туда передаёшь именно конкретную реализацию ты абстрагируясь так как у них один интерфейс вот так подменяется их типа реализация Ну давай тогда опустим этот момент и тогда начнём Ну я не знаю
00:20:13 - 00:21:42
поздно рано ли пере будет да а остальные не будем да не в целом там же ну самые часто используем это опять же Solid там ну responsibility injection мы часто используем вот эти Open CL Я не знаю ну там же и так когда ты пишешь код бывает понятно что этого нельзя допускать Ну что разные типы уже да тогда другие эти Ты знаешь паттерны связанные с частотой кода там получается когда у тебя есть какие-то знаю какое-то приложение Ты понимаешь что в какой-то момент повторяе один и тот же код это уже получается ты нарушаешь этот принцип и
00:21:11 - 00:22:45
лучше всего вынести повторяющийся код куда-то в отдельное место его переиспользовать заключается в этом вроде бы как да а это поцелуй смотря от кого когда тебе а принцип говорит что не надо типа делать слишком сложно ты конечно крутой программист но давай мы будем делать всё попроще немножко и если ты хочешь сделать какую-то приложу или какую-то сложную функцию Угу лучше сделать всё максимально простой и от этого уже отталкиваться смотреть Есть ли необходимость в том чтобы делать её сложнее начать лучше с простого понял
00:22:04 - 00:23:34
круто что-ты можешь сказать именно про паттерны проектирования какие там использовал Какие знаешь паттерны проектирования Ты можешь какой-то один привести пример чтобы я понимал Ну это midle цепочка зависимостей утебя может быть 100в а Всё я понял Скорее всего я Поня пате проектирования дело то есть в рове Я использовал их для того чтобы отлавливать именно Запрос который будет выполняться по-моему в основном использовал их при авторизации А что там ещё по-моему было по-моему dependency икше юзал для того чтобы в классах
00:22:57 - 00:24:30
внедрять какие-то другие классы или какие-то другие не знаю там сервисы или что-то такое угу Тоже вроде как один из паттернов М что там ещё может быть что там ещё может быть модель сохраняется Тебе нужно там условно что-то сделать там upd deled их помнишь как называет этот паттерн Ты про крут говоришь нене Не не условно в лавеле есть моделька сейчас все знакомые слова будут говорить ПХП смотри у тебя в лавеле есть моделька какая-нибудь и ты же можешь подписаться на её события там когда эта модель
00:23:46 - 00:25:03
создана Ну создана ретиро То есть это па тоже считается Да ты подписываешься на события их Как именно этот паттерн называется не помнишь бы дадада Ну да его по-моему тоже применял когда не только в PHP писал код честно говоря вот сечас конкретно вот паттерны есть какие-то паттерны возможно знаю но чтобы сейчас тебе их перечислить вот этот момент нет но какие-то скорее всего уверен что знаю понял тогда вот вспомните их сейчас перечислить ля с Ну да их на самом деле очень сложно вспоминать особенно Ну
00:24:29 - 00:26:00
когда ты пишешь код ты если ты уже много лет его пишешь Ты так или иначе какие-то паттерны придерживается Но даже не подозреваю этого Вот Угу А и что как у тебя с базой данных как у меня с базой данных угу С какими работал ещё А с какими Я в основном работаю с постгрес сом когда-то работал ССМ А ну с M db Угу и получается в основном сейчас работаю с постгрес что как тебе есть ответ от Ма есть небольшие отличия честно не смогу тебе сказать конкретно прям глобальные какие-то отличия которые вот сказать что вот это вот но по крайней
00:25:14 - 00:26:57
мере исходя из моего опыта Я знаю что в myq нельзя НКИ хранить например нет Типа данного J А в постгрес он есть и типа ты ну то есть можно хранить в виде строчки но потом ется конверти ты пря ти може данных [музыка] зать знае что-то про индексы Какие тип индексы есть для чего они нужны ну я знаю примерно что такое индексы поверхностно но типы Вот это для меня сечас было открытие имею в виду работу с сборкой каких-то там данных из таблицы то есть благодаря именно индексам мы можем например какие-то ну условно У нас очень много
00:26:07 - 00:27:56
данных и если бы мы не юзали бы индексы работа с данными в нашей таблице была бы значительно дольше и сложнее В случае если бы мы приняли бы индексы которые позволяют типа ускорить выборку этих данных из огромного объёма информации самой таблицы по-моему вот это вот а как они работают знаешь вообще нуно тот же по-моему в самой базе в самой таблице есть отдельная структура которая описывает Какие поля читаются типа Какие поля считаются типа уникальными и на основе по-моему этой структуры как бы база данных уже делает какую-то оную
00:27:10 - 00:28:36
выборку сейча нести фигню какую-то Ну я имею в виду условно ты делаешь запрос там ID равняется 50 типа как это работает то есть как типа база данных понимает что должен бы ну это индекс прямо по-своему называется ну или метод хранения этих индексов Я не знаю пробиты что-то слышал бинарное дерево Да вот ну как оно работает знаешь нет не помню то есть бинарное дерево по-моему он как-то типа Ну то есть скорее всего это какой-то определённый алгоритм который позволяет себе оптимизировать работу с структурой этих данных но конкретно как
00:27:57 - 00:29:29
не вспомню Ну условно есть Вот это Дерево там Ноль от него расходятся вот эти штуки и вот ну грубо говоря там по среднему значению так сказать е если ты говоришь там id50 то отсева там условно какая-то правая часть ты ищешь только в левой части А туда если ты попадаешь сразу же то ты возвращаешь значение если нет то ты отсева ещё данные А как дела То есть это типа благодаря индексам это происходит или как Да ну если ты навешивается вот этом бинарном дереве Ну условно У тебя миллион записей и когда
00:28:43 - 00:30:08
ты делаеш ID ра Тебе же не нужно смотреть там где больше 100 Да ты можешь это дерево отсечь дальше Ну вот в этом маленьком грубо говоря промежутке ищешь то что тебе нужно то есть это получается само база данных у него такой алгоритм есть который Да это на самом деле алгоритм которым даже мы там сортировки применяем если вни уся там 100% у ва были задачи Поти этого и типа такое было мало на самом де про индексы надо будет почитать обязательно я сейчас ещё чтото а а ты знаешь какая структура данных грубо говоря Ну сама по себе
00:29:25 - 00:30:59
индекс там можно очень быстро всё искать что это за структура Да я не знаю вот это вот я не знаю сразу лучше ответить типа шка где ты у тебя просто Круть значение кру значение как это логично да да подключишь Ну то есть получается ключ у тебя столбец а значение Это типа тип этого индекса не я имел в виду вообще в любом Даже если ты на жава скрипте бы это сделал бы у тебя там условно какие-то там 100.000 записей Ну вот ты так бы очень легко смог бы всё найти ты типа говоришь про формат данных в таблице ну короче ну сам формат да да
00:30:12 - 00:31:39
А всё понял понял Да понял Так теперь знаешь что-то про нормальные формы базе данных а нормальная форма Вот блин Самое обидное что я это читал месяца три-четыре назад когда думал сес всё что изучает а по-моему нормальная форма - это когда она структурирована если я не ошибаюсь вот сейчас я пытаюсь вспоминать Есть нормальная форма и ненормальная форма по-моему тоже есть и разница в том что как она нормали Зро То есть получается есть какая-то определённая структура которая описывает эту таблицу и по-моему это считается нормальной
00:30:56 - 00:32:21
формой То есть когда у не есть столбец значение типа что-то такое плюс порядок типа хранения данных условно У тебя есть таблица бук у него есть Ну там же где-то должен же быть автор лизация заключается в том что ты автор выносишь в отдельную таблицу А в букс там хранишь его айдини ну и там ещё несколько вещей которые Ну помогают тебе обеспечить вот эти нормальные формы там насколько я помню только три формы хорошо бы знать А дальше там уже с какими-то сложными данными если ты работаешь угу вот а это что касается нормальных форм
00:31:39 - 00:33:13
А как знаешь что-то там про выборку джоны Left Jo там есть что там ещё Join просто есть А В чём разница знаешь Left Jo по-моему получается Он исходя из описания левой таблицы то есть ну того что мы сказали ну то есть у нас например есть таблица продуктов У нас есть таблица юзеров если мы хотим привязать к таблице продуктов при сказать что к продуктам нужно привязать мы должны исходить из ID который описаны в таблице продуктов и обращаться к таблице users мы пишем Типа по-моему так не там про выборку Ну
00:32:24 - 00:34:05
в чём разница между условно и про это когда он прот и сверяет наличие с Ну исходя из этих дише которые мы укажем он делает наличие в первой и второй таблицы если нет он просто вернёт те которые смог найти то есть которые совпали на смотри условно У тебя есть 100 продуктов и есть 50 юзеров если ты делаешь Left Join сколько продуктов вернётся И сколько продукто вернутся в те продукты Но те продукты которые он не смог найти Ну точнее каких-то юе не смогут найти они вернутся с налом а в и вот in Блин вот это кстати не помню
00:33:18 - 00:34:44
это просто типа сколько продукто вернётся Как думаешь если там главная таблица - Это левая таблица вернутся все продукты условно 100 А если просто Join если просто Join то он вернёт он он в случае сном не вернёт все и не скажут типа вот там есть он Верт 10 е они СГ вет не то что мы хотели из списка продуктов столько количества продуктов сколько есть там условно этих юзеров Да ну типа сколько совпало Да по [музыка] совпадению [музыка] нело фу чтото чего б агрегатная функция агрегированные там знаю как агрегатор
00:34:05 - 00:35:56
новост сделать смотри сум Макс мин а всё понял А блин я понял какой тупой Значит так есть сам есть есть там Груп ГРУ это по-моему не агрегация по-моему агрегация г даже ну група используется вместе с этими штуками Ну условно ты делаешь каунт Ну я знаю что тако примерно теперь смотри то есть сам - это когда тебе например ну ты заш Окей сейчас нормально Угу Всё я могу говорить Ну ты сейчас пиксельный могу выключить камеру вот так сейчас нормально да то есть не отвечать да на вопрос или ты сам ответишь
00:35:04 - 00:36:38
[музыка] Короче всё про эти функции мы поняли Теперь что касается фильтрации данных где мы делаем фильтрацию Ну именно отсева ненужные данные в смысле я уже ответил про агрегацию Ну дами ма там что там ещё может быть там рабо надо Ну сейчас мы дом до этого е это этого блока выть г мы фильтруем данные и как мы фильтруем агрегированные данные уже Угу А я понял К чему ты ведёшь я понял фильтрация фильтрация ты имеешь в виду про V типа про вот это вот да А ну фильтрация в осном используется а чём разница Ну между Ты слышал что-то
00:35:56 - 00:37:46
провин Да вот в чём разница междун и в Вот кстати очень хороший вопрос я не знаю точного ответа Блин надо будет почитать но понятное дело когда идёт сравнение и Исходя из этого условия он уже вернёт тебе определённую Ну определённое количество данных выборку какую-то сделать н Если меня память не подводит но скорее всего я сейчас скажу фигню Это когда он ти пытается вернуть Блин ну не смогу сказать потому что я сейчас скажу банальную вещь типа он вернёт определённые совпадение каких-то данных Но это
00:36:52 - 00:38:19
фигня смотри Вер у нас используется Ну отработает момент запроса Угу условно ты запросил у тебя 100.000 записей и ты делаешь Вер он вернёт только там по твоим условиям только тысяча данных и у тебя есть там какой-нибудь кани агрегатная функция условно там 35 34 и вот через ты можешь ещё раз отфильтровать данные там условно где средняя оценка больше четырёх и разни их в том что в НГ ты уже забросил данные тысячи и уже их труе То есть получается мы именно благодар можем работать сре Да дада да А всё я понял я теперь понял
00:37:40 - 00:39:15
что-то я вспомнил вот Ага А про оптимизацию запросов что-то знаешь как ти оптимизацию базы данных или на сервере нет запросов условно у тебя Селект очень долго выполняется хотя у тебя там используется V там что-то но всё равно очень долго изза чего это может быть наверное индексы самое банальное что я сейчас могу сказать ээ благодаря им какая-то оптимизация Я думаю Происходит что там ещё может быть а команда которая тебе подскажет Какие индексы задействованы или не задействованы не знаешь не Вот
00:38:30 - 00:39:51
это не знаю Ну грубо говоря через ты можешь посмотреть что у тебя дёргается Что за условия что можно оптимизировать то есть всю информацию Запроси Ну сколько он выполняется там и опять же очень важная информация какие там по мо их вообще это ну наве ни индекс Аля нельзя наве индекс Ну на Какие данные условно в таблице скорее всего на текст типа да нет р можно грубо говоря Ну условно у тебя пол мужской женский Есть ли смысл какие-то типа ID там что-нибудь на такое ну да ну на пол нет смысла вешать потому
00:39:11 - 00:40:42
что там только два значения либо мужской либо женский тебе этот индекс по сути ничего не даст что если ты просто захочешь там получить определённый пол навер вот тогда давай закончим с базой данных Т Спрашивает Вы поспорили Я не знаю чему всё с ба данных закончили па судили смотри теперь важный момент ты делаешь условно какой-нибудь блок да и у тебя уже там тысячи посетителей в день м и у тебя на главной странице там долго выполняется запрос Ну понятное дело Он сам по себе долго выполняется ты его оптимизировали
00:40:03 - 00:41:25
что ты можешь сделать чтобы там он так и долго не выполнялся то что мы используем в этом случае ну самое очевидное - это каширование угу первое в голову приходит Сначала по возможности на уровне гинса потом на уровне самого фреймворка или языка а а потом можно применить что-то в виде редиса что-то в виде кедов там что-то такое вот давай на примере кэш это там хотя бы слово кэш смотри тогда да у тебя на главной странице там написано что ты ну разработано Так что ты круе да и ну этот блог у тебя написано Так что есть какой-то ключ Если
00:40:47 - 00:42:29
по этому ключу найдены данные ты их возвращаешь Если нет то кладёшь данные в кэш и потом возвращаешь в чём минус такого способа чего не хватает точнее этому способу если там вобще ты мог бы е раз повторить потому что не очень Поня вопрос а давай я хотя бы попытаюсь э ну Повтори ещё раз чтобы я понял Смотри я просто хотел пример накидать угу вот э Давай на Трой Коте я тебе скину ссылку Так сейчас я что-то напишу Он сгенерирует А так куда бы тебе его Отправить здесь есть чат да да давай его сюда его
00:41:38 - 00:43:14
отправлю [музыка] Да [музыка] условно У тебя есть код вот такого вида сес Ну это абстракт например это У тебя есть Ну название ша дальше есть если та меньше чем та какой-нибудь иш А ну вот да грубо говоря например вот на этом способе ты здесь данные а здесь если не нашлось точнее если нашлось то ты просто возвращаешь данные изю дела Чтоб люди видели мой экран Не видно чере Я вижу очень симпатичного парня но всё видно Хорошо я сейчас проверил на трансляции да да всё видно А ну ты Трай код видишь сам а Да вижу а
00:42:26 - 00:44:35
всё всё всё всё я просто тебя вижу Ага Да вот в чём минус вот этого кша учитывая что у тебя там параллельно Может на тысячи запросов идти что минус этого кша ну сейчас да по не чём минус этого способа Точнее не ша а способа а ну тут по крайней мере Минус Я уже вижу в функции Тай то есть скорее всего подвох в ней заключается что типа у нас нет какого-то определённого отдельного места где Ну по-моему есть кстати там Тай name я вижу а Ну скорее всего подозрение в функции Time что мы Подожди мы берём последнее время
00:44:07 - 00:45:47
получается последнее время когда кэш был сохран или что это а здесь внутри будет там получение Дан из кэша только там будет уже там дата Ну название ша здесь там по этому ключу находятся данные и возвращаются они Но вот Т даже не на это обращать внимание А в ЧМ именно сама проблема заключается сама проблема Ну по крайней мере в том что мы возвращаем один и тот же одну и Тоту же дату не одну и Тоту же даты мы возвращаем потому что если условно кэш найден то мы из кэша достаём нет Точнее если кэш не найден то мы сохраняем
00:45:00 - 00:46:19
данные в кэш и параллельно возвращаем дату в ином случае мы просто запрашиваем данные из кэша и возвращаем их То есть тут будет что-то Типа такого вот там опять же вот эта строка вернуть SM это равняется наша дата Ну ладно про гонку забыл про гонку засо что-то слышал Нет слышал По Как что-то там где-то но объяснить не смогу подозрение что гонка запросов это по-моему то то что связано с тем когда-то за сервер и какую актуальную информацию им всем вернуть то есть чтобы не было так что например все эти 10 запросов будут
00:45:41 - 00:47:30
типа получать какие-то свежие данные каждого для каждого запроса А вернуть какой-то какой-то одну информацию для всех запросов для того чтобы не нагружать типа сервак Ну в данном случае тут проблема в том что если будут 000 запросов параллельно идти грубо говоря там разница лишь миллисекундах то они все пойдут сюда и каждый попытается засунуть что-то в кэш и потом вернуть данные то есть грубо говоря оптимизации никакой нет Угу А как это ну оптимизировать ты условно можешь заблочить через мкэш Ну у мша Да
00:46:36 - 00:48:05
ну и уреди и Кэш это даже там на PHP простом это можно сделать ты можешь там А этот заблокировать этот запрос пока один его выполняет то есть э Тут нужно сделать грубо говоря так еск есть у него есть метод а и в этом методе а а ты можешь залочить что-то то есть ты говоришь что ты блокируешь это поле поэтому названию и другие остальные запросы смотрят сюда и видят что этим что-то Уже занят и а по сути у тебя только один запрос в этом случае сохранит что-то в кэш А другие запросы просто вытащит данные из
00:47:20 - 00:48:43
этого кэша вот это что касается гонки запросов Блин ну меня всё равно волнует вопрос который [музыка] Угу всё равно мне интересно знать типа то когда эти 100 запросов выполнится и хорошо первый запрос по-любому там же будет какой-то первый запрос он заб Ну типа создание новых кэв до того момента пока вот этот первый запрос не выполнит сохранение этого кша и остальные запрос будут обращаться к старому кшу Но грубо говоря заморозится заморозится но как если То есть как они заморозят ели эти запрос
00:48:02 - 00:49:43
с будет чего-то секундах но тем не менее даже если их два запроса одновременно выполнится то Вот мне интересно как сервер понимает что нужно остальные блочить Вот это мне хочется по чере грубо говоря если мы просто вот по этой штуке смотрели бы то он для за те же данные А в этом случае он как будто бы асинхронно смотрит создалось ли что-то если создалось то там блочит этот запрос пока он не выполнится А другие просто достают данные Ну грубо говоря так я не знаю как этот механизм изнутри реализован
00:48:55 - 00:50:23
Но вот это вот мне интересно понять как это происходит внутри Ну ладно это отдельная история Ну это ну это просто именно частая проблема про гонки запросов что несколько запросов могут делать одно и тоже то есть и по сути твой кэш он грубо говоря неэффективен в этом случает есть ещё тогда один момент уже не связанный с кэшем А представь у тебя Ну ты разрабатывает там мобильное приложение ну Яндекс такси какое-нибудь и что сделать так чтобы когда пользователь нажимает там условно два раза чтобы два раза не создавался один и
00:49:43 - 00:50:58
тот же заказ как это Ну понятное дело ты на фронтенде можешь там навесить Ну заблочить кнопку если он один раз уже нажал А если он обошёл твою систему и там через сторонний ну он подсмотрел Запрос который ты делаешь им выполнять 100 раз типа что в этом случае как как сделать так чтобы типа он не не создал типа большое количество продуктов Ну первое что мне приходит это сделать Ну опять же зависит от условия Ну ладно давай представим Так что он берёт один запрос с определёнными данными и отправляет там большое
00:50:20 - 00:51:34
количество запросов там с одними и теми же данными первое что м приходит голову это сделать уникальными какие-то колонки чтобы на уровне базы данных если в случае мы добавляем дубликат база данных нам гнула сказала что такая запись уже есть условно там на название навешать на что-нибудь ещё что прям уникализировать второе что мне приходит в голову чтобы не повторялись данные Ну ограничить количество выполняемых запросов То есть я не знаю Там какой-нибудь троттлинг поставить или что-то такое сделать чтобы понять что
00:51:00 - 00:52:23
человек превысил лимит выполнения запросов это второе Ну 10 запросов Там в любом случае сможет сделать Да здесь запрос сложно но я обычно этот процесс решаю с помощью вот уникальных типа ну ни задаю какому-то столбцу чтобы он на уровне этой базы данных как бы контролировал но я больше не знаю как ещё можно То есть если бы у нас например были бы разные данные и Он отправлял бы 100 запросов с разными данными Блин ну тут надо наверное что-то писать своё чтобы прямо отловить этот момент нет уже даже есть там
00:51:43 - 00:53:04
что ты слышал про транзакции там условно маке А я понял я понял что ты говоришь то есть создать одну транзакцию на создание какой-то записи и проверять что другие запросы Когда будут выполняться Была ли на эту запись создана транзакция Если была ну ты можешь залочить там условно даже же таблицу можешь залочить какой-нибудь какую-нибудь колонку даже не знаю И это значит что этим Уже какой-то запс занят это на уровне там какой-то базы данных Также можно навесить там те же самые ы кы можно сделать там через
00:52:23 - 00:53:37
рес Ну так как это быстро очень хранилище данных Ты можешь создать там какой-нибудь ключ и асинхронно сходит там своё хранилище достанет если опять же он найдёт такой ключ то этим запросом кто-то занят вот ну тут опять же тоже самое про Заку запросов То есть ты не даь пользователю делать какие-то Вот такие Веста мы заговорили про транзакции вернёмся немного SQL зачем они нужны Ну например вот для таких ситуаций не а или же понятное дело а чаще всего их для чего используют именно скорее всего Когда нужно Ну я сейчас могу ошибаться
00:53:00 - 00:54:27
но скорее всего когда тебе нужно какую-то пачку данных на сервак сохранить и типа в этом случае Ты создаёшь один раз транзакцию Угу и все данные которые тебе нужно запихивает их Ну можно и так а так по большей части они используются для сохранения целостности данных условно Если ты разрабатываете по кусочкам по кусочкам В смысле по кусочкам Ну типа ты говоришь Ты создаёшь один раз данный а потом по кусочкам дополняешь его или как не смотри ты делаешь банковский банковское приложение банковское А ты
00:53:46 - 00:55:13
делаешь перевод денег э одному человеку и от тебя грубо говоря к другому то есть что нужно сделать тебе нужно снять деньги со своего счёта а положить деньги на его счёт и в этом случае что может произойти на уровне когда ты снял деньги со своего счёта А может совершится какая-то ошибка деньги до него не дошли они с твоего счёта снялись Вот Угу а транзакция что нам позволяет сделать Она позволяет себя коммитить условно Ты создаёшь транзакцию оборачивается свой весь код перевод снятие денег со своего счёта
00:54:29 - 00:55:44
пополнение его счёта там ещё какие-то вещи Если всё прошло ОК ты комиш транзакцию если не дай бог ты оказался в блоке там ч Ты можешь просто откатить транзакцию и этой операции как будто бы и не бывало что-то помню такое вот это что касается транзакций в целом уже мне кажется даже засиделись У тебя есть чем дополнить наше собеседование Ну если у тебя есть ещё вопросы а я сейчас по списку прошёл всё вроде я все свои запросы задал кто-то Беня спрашивает почему мы не играем в к хочешь вопросы по кке
00:55:07 - 00:56:29
когда Ну так оптимизация проговорили про паттерны про каширование вроде всё на этом всё Ты отлично прошёл собеседование Я тебя поздравляю Ты принят нашу компанию мм с Тим людом Да спасибо Ну на самом деле я сейчас понял что есть А вот я ещё например для меня открытие было То есть я читал как бы знаешь типа поверхностно просто где-то там слово транзакция коты откаты читал но не углублялся в это думал ну Нафиг мне это нужно всё равно как бы я обхожусь на самом деле это интересная тема оказалась Что такое можно делать
00:55:48 - 00:57:18
надо будет почитать что я ещё понял я ещё понял что плохо шарю в вообще в этих индексах И вообще как что там устроено вот этот момент надо мне кажется тоже подтянуть что Какие ещё моменты были где вот ложился прям жёстко вот плохо отвечал Ну опять же ты же тендер ты тебе эти Нет давай забудем этот момент вот что где вот скажи вот какие моменты чтобы я просто знал Ну про полиморфизм тот же там про оп Наверное ты что-то забыл про эти скорее всего да да да Там прям данные конкретно у мне подзабыл да
00:56:38 - 00:58:05
и там эти Хеви всякие но ты грубо говоря знаешь как их использовать когда использовать но не знаешь наверное Зачем Наверное я не знаю как это объяснить Ты же 100% калвин я помню что я хенг применял да но вот Чтобы объяснить конкретно как и что он делает Да вот это вот момент тоже наверно стоит подтянуть Чтобы понимать в любом случае ты достойно прошёл наше испытание что мы взяли тебя свою компанию хотя бы куда-то меня взяли кстати Блин я сейчас должен буду на следующий созвон идти мне тоже Жена
00:57:21 - 00:58:38
звонит я жена да Поздравляю тебя что ты ме на свадьбу не пригласил Я что тебя приглашал всё Ладно не будем отопить э алхамдулиллах всё прошло отлично моло читать не будем нет может ты попрощаюсь Нет я оставляю это тебе нет Это ты должен сделать ты начал эту войну всё ладно Сегодня у нас было собеседование Мы про собе сли легендарного арчакова важа вы как видели Он отлично отвечал на наши вопросы кроме хенгаут E
00:58:05 - 00:59:19