Подготовка к собеседованию на 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:02 - 00:01:21
анализом и всем таким поэтому если вы еще не подписались на пых то подписывайтесь и конечно на печку дайджест в общем валентин провел тестовое собеседование на камеру она получилась довольно прикольно интересно и мы решили вот провести и сегодняшний стрим мы открыли приём заявок на участие получили много откликов всем кто прислал большое спасибо и нам в части было из чего выбрать так мы нашли нашего сегодняшнего участника это патрик филь дашь патрик заманчиво у него выглядела резюме у него есть contribution a в доктрину в
00:00:43 - 00:01:58
концепции печки самарские стопы некоторые другие проекты поэтому я надеюсь у нас будет интересно собеседование добавим валентина полетим привет м примет всех приветствовать точнее никого не вижу но я рад что вы на слушаете вы с нами сегодня супер и у нас есть патрик привет привет привет привет коротко кино справила в общем-то в чате можно писать все что угодно если вы что-то интересно комментируйте буду выводить это на экран вы можете писать вопросы я буду отслеживать вопросы и какие-то самые интересные мы в конце
00:01:20 - 00:02:55
обязательно зададим патрику но если не будет интересного то не будем задавать в общем то наверное всё я вижу что у нас уже есть прилично людей подключилась всем большой привет я передаю слово валентину собственно будем приступать к основной части нашего сегодняшнего торжества собеседования то что это будет за да поехали до привет ещё раз всем привет патрик но давай немножко познакомимся расскажи как ты вообще познакомился спички почему-то до сих пор спички работаешь и в ответ в под 17 лет весом был посвящен
00:02:07 - 00:03:46
печка или нет познакомился я с печки практически в самом начале карьеры можно сказать она с этого начала началась моя первая работа была в 17 лет контент-менеджером и там печка использовался совсем сквозь то есть какие-то регулярке писались который на нем выполнялись но именно там впервые мне пришлось скажем так учить это было не не совсем добровольно мне просто начальник тот момент сказал что вот-вот надо дальше будучи в печке заинтересовался этим и подался уже в разработку сайтов соответственно
00:02:56 - 00:04:31
добавилось к печке и постепенно верстка frontend то есть таким можно сказать full стеком работал и продолжался это наверное все лет 9 10 то есть вот 1 9 10 лет моей карьеры это все разработка сайтов со временем сайт и усложнялись усложнялись cms ки и в итоге это все да усложнилась до вещей типа битрикса работал в том числе и на нем в свое время и где-то пять или шесть лет назад когда сложность проектов скажем так уже сильно я стала выше того что чем я владел на тот момент могло мне дать я понял что нужно какие-то
00:03:44 - 00:05:32
фундаментальные знания начать осваивать и начал изучать уже копы то есть не какие-то конкретные инструменты там фреймворке cms китам и прочее какие-то старался фундаментальные знания набрать понятно да а как ты думаешь вот теперь действительно умирает и вообще сколько лет она умирает уже сколько лет печки и я не считаю что он умирает по крайней мере в по моему опыту получилось так что по мере роста сложности задач совершенствовался и печки то есть у меня не было ни разу такого момента что у меня большие проблемы
00:04:38 - 00:06:22
из-за самого языка то есть как то вот он со временем все растет улучшается и по мере усложнения задачи не возникает с ним проблем хорошо а вот сколько лет печки такой на кругозор вопрос куклин самом печка да слушай но если я начинал на нем 15 лет назад то я думаю наверное лет двадцать ему точно есть тогда эта потом версии еще 4 как это следует стену мы точно есть но ему в этом году 25 исполнилось так что до почти но хорошо есть один вопрос по печке который я люблю задавать правда теперь последний раз его задам
00:05:32 - 00:07:06
потому что она ну вопрос открытый соответственно повторить мы не можем чем отличается команда composer and стол от composer апдейт ой точнее в композит composer он стал поставить зависимости в тех версиях в которых они указаны в лог файле соответственно composer апдейт обновит эти зависимости в рамках тех ограничений по версиям которые выставлены в composer часа и соответственно обновить лог-файл соответственно лог-файл мы к мите с репозиторием или нет если это какая-то библиотека туниками тим если это
00:06:19 - 00:07:44
приложение какой-то к мите я видел тебя в резюме написано что ты уже попробовал пички 8 там даже так написано копать это уже на нем программируешь у меня к тебе вопрос что ты вообще ждешь от печки 8 и что-то считаю что зря в него вошло вы какие-то фишки наоборот диссонанс как языке печки 8 я очень жду мне очень нравится в каком направлении сейчас идет работа над печки и считаю что восьмерка о своему влиянию в плане эргономики языка будет примерно сопоставима с тем какое влияние было 7 версии на
00:07:04 - 00:08:46
производительность feci которые лично я больше всего жду это атрибуты это микс 3 июня type микс наверное да union тайпа не так часто приходится использовать очень мне нравится конструктор property промоушен не знаю как красиво и соответственно сильно снизит количество бойлер plate а также не знаю приняли уже по моему еще не приняли но надеюсь что примут именованные property в ответ они против хотя сейчас как стоишь нормально я читал что многие против против основном майн тренеры популярных библиотек и основной
00:07:54 - 00:09:37
аргумент в том что в обещании обратной совместимости придется включать название перемен но я конечно не main тренер кнопка крупной библиотеки но и свои опыта если приходилось менять название переменной то либо оно изначально было не удачно выбрано либо и без изменения название произошло достаточно крупное изменение требований которые соответственно нужно отразить названиях переменных так и так был бы уже сломано обратно вместе а ну то есть я так понимаю нет ничего чем ты недоволен ла нам пишут больше хардкора
00:08:50 - 00:10:14
хардкор щас будет разогреваемся то то что мне изначально не нравилась она пока что голосование не проходило хорошо а ну вот мы начинаем переходить теперь к основной более технической части у меня есть написал тоже про функциональное программирование в режим aod у меня есть один вопрос такой довольно базовые какие функции называются чистыми ну надо вами с этого чистой функции то который при при одинаковом наборе входных параметров выдают всегда тот же самый результат то есть не зависит ни от чего
00:09:31 - 00:10:55
стороннего и соответственно не имеют каких-то side effect of хорошо она вот если мы возьмем такую функцию как time она является чистой нет так итератор каунт какой-нибудь который считает количество элементов в операторе [музыка] наверное нет потому что количество элементов может измениться в этом операторе ну вот еще 1 пример функция из край табал она я направляет может она тоже тоже не чистая потому что между двумя вызовем вызовами может произойти изменения прав на файл да хорошо тогда в общем по функциональному
00:10:16 - 00:12:08
программирование я думаю основное здесь мы уже покрыли это что может коснуться 5p дальше сразу перейдем к п значит ну давай с классики до что такое solid мне интересно по каждой букве услышать твои объяснение но своими словами формулировки точно но и с каким-то простейшим примером solid 1 буковкой s принцип единственной ответственности он говорит о том что у класса должна быть только одна причина для того чтобы его менять в качестве примера допустим класс который должен откуда-то какие-то данные прочитать составить какой-то
00:11:13 - 00:12:47
отчет где его в каком-то формате сохранить их нарушением этого принципа будет если мы все три функционал и то есть чтение из какого-то источника построения отчета и запись канта формате положим в 1 класс проблема здесь какие что сложно будет это все тестировать потому что слишком много всего в одном классе происходит вторая проблема в том что потрогав при изменении какого-то одного требования ну допустим нам нужно сохраняли в xml нужно теперь там не знаем в csv сохранить изменении какого-то одного требованиям и трогаем
00:11:59 - 00:13:16
этот класс и есть вероятность что мы сломаем что-то не связанное с текущей вот у меня здесь уточнение такое представь что ты но собственно как и всегда представляет даже не надо работаешь на проекте здесь какие-то временные прочие ограничения как этот принцип связан со стабильностью кода все-таки иногда приходится выбирать да там сильно декомпозировать классы на мельчайшие или все-таки вот в каком месте выбрать с прям туристки строго следовать этому принципу где нет нужно стараться предугадать в каких
00:12:39 - 00:13:54
местах кода могут часто меняться требования в тех местах где требования скорее всего вообще никогда меняться не будут можно так фанатично не соблюдать этот принцип хорошо давай так так следующий блок и переходим следующая буковка а это принцип открытости закрытости но punk lose он о том что класс должен быть открыт для модификации а для расширения до но закрыт для модификации на примере как это рассказать ну допустим как можно расширить поведение как так возможно наследованием соответственно как нам
00:13:16 - 00:14:56
случае наследования избежать каких-то возможных проблем какие могут быть проблемой допустим у нас все методы и property класса публичные или protected даже те которые мы не хотим на высветить может возникнуть проблема что кто-то придёт от наследуется начнет зависеть скажем так от этих методов в своем от наследова нам классику вызывать мы потом что-то в них ночном менять и у него тоже сломается то есть непонятные какие-то границы в рамках которых нужно облака на обратную совместимость и обеспечивать каким образом это все можно
00:14:06 - 00:15:33
решать место наследования например можно использовать композицию то есть класса делать финальным делать под него интерфейс и все его какие-то зависимости тоже делать на интерфейсах соответственно мы получим возможность расширять поведение но при этом у нас не будет необходимости лезть непосредственно менять код какой-то библиотеку давай тогда быстро [музыка] я между можно покороче принцип he make буква л это принцип постановки барбары лисков если не ошибаюсь он тоже в принципе права наследования и
00:14:50 - 00:16:31
сформулировать его можно таким образом что замена типа она его подтип не должна приводить к изменению поведения вот этого по типа как это можно обеспечить и какой пример можно привести допустим это связано с такими понятиями как вариант такого вариантности контур вариантности на уровне типов это можно обеспечить тем что допустим есть у нас в каком-то классе фундамент виде возвращается определенный тип то в нас вот наследова нам классе у нас этот метод должен возвращать соответственно либо тот же
00:15:40 - 00:17:13
тип либо его подтипа помимо типов еще не должно меняться поведение то есть на каком примере допустим нас базовый класс при вызове какого-то метода не кидает исключение вот наследова нам классе мы вот наследовал на метр и начинаем кидать исключений соответственно код который достаточно я думаю что да я думаю что остальные тоже знаешь предлагаю сразу перейти вот есть такие два понятия каплин кое-какие жим как то понимаешь в чем между ними разница и когда это важно и тогда каплин гекко хижина это это уже grasp
00:16:26 - 00:17:58
если я правильно помню все принципы из grasp а не помню на практике именно каплями какие же чаще всего приходится об этом думать капли нг это связанность зависимость между двумя какими-то единицами входят из допустим между двумя классами или двумя модулями связанность это внутри какой-то единицы кода то есть какой-то библиотеки или класса нужно добиваться стараться добиваться соответственно высокой связанности но низкой связанности высокая связанность английскими словами давай попробуем так прощупают
00:17:12 - 00:18:39
английскими словами это будет у нас laugh uplink и hayko хижин просто все по разному переводят сложно прощаем близкими оперировать окей а а как а вот вообще можно померить капли нг и что такое стабильность стабильный skoda стабильность пакета капли нг можно померить посмотрев на количество внешних зависимости то есть если какой-то модуль или класс взаимодействует с большим количеством других классов или модулей и в этих взаимодействиях низкий уровень абстракции то он сильно зависит от других модулей или классами а формула
00:17:58 - 00:19:25
стабильности в спорыш нет формул стабильности не вспомню я ее даже не знаю никогда не знал но формула стабильности она как раз позволяет оценить насколько пакет стабильно или это / где сверху у тебя как раз количество классов на которые данной класса на которых данный модуль опирается внизу значение плюс то сколько классов которые на этот пакет который пакет используют таким образом если это значение равно единице значит что-то крайне нестабильный пакет если близко к нулю приближается но как-то саровский
00:18:41 - 00:20:05
чистой интерфейс это наоборот это стабильные пакета но я думаю что да ты понимаешь о чем это давай поговорим про имут обильность заканчивая блока в.п. что есть ему табельный объект и вот например если в классе есть публичное свойство это как-то вообще означает что классы мутабельные линей мобильной и мутабельные класс это коту кадрового после его инстанцирован я нельзя изменить его состояние a state если у класса есть публичной property и речь про печки где нету каких-то readonly модификаторов тогда он мутабельным может
00:19:23 - 00:20:52
в любой момент у инстанцию поменять значение публичную property ему добили снаружи хорошо как в нынешнем печке можно гарантировать то что класс даже с публичным свойствам останется и мутабельным если такая возможность с публичным свойству есть наверняка какие-то методы для этого но если мне нужно ему табель настя не делаю просто классы с публичными свойствами на практике просто близки востоке дааа статическими анализатором пользуешься пользуюсь псалмам печки станом пользуюсь на всех приговор салма можно как-нибудь
00:20:07 - 00:21:31
гарантировать вам нужно псалмов sky аннотации да можно такое сделать названием youtube на весь объект нет почему пользуясь но с аннотацией псалма милта был очень часто возникает проблема что если этом классе используется какой-то сторонний код он постоянно начинает ругаться что вот сторонний козни нечистой функции там не мутабельные объекты и поэтому сколько раз я не пытался аннотациями вопрос решить все приходил к тому что слишком много ругани от пса моего чела нотации и делал просто реальный ему табельный объект а кстати
00:20:49 - 00:22:09
вот ты затронул сейчас да здесь довольно важно мне кажется границ провести имут обильность и чистота никак между собой связано и как это вообще связано в связанных том плане что не должно быть каких-то не должно быть каких-то сайт эффектов наверно при использовании мобильного объекта просто на самом деле ну вот как я себе это понимаю что в самыми некоторая ошибка здесь есть то есть там считается что ему табельный класс он как раз не должен использовать нечистый функция но по факту имут обильность она
00:21:29 - 00:22:48
про чисто хранения состояния то есть если грубо говоря данные внутри класса никак не поменялись в общем-то это не проблема то есть частота по идее ортогональной мат обильности и новыми так исторически сложилось что это в общем под одну крышу закинули есть и кита где как раз предлагаю разделить хоккей у нас следующий блок это ревью сейчас я скину ссылку ну романский нет всем нашим зрителям я скину в чат наш с тобой до нашел дан сейчас все могут открыть его романа верно может нам его транслировать какое-то время на экран
00:22:08 - 00:23:43
так и это же открою кудри выпечки открылась при надо у тебя нету все вот значит твоя задача просто сделать review все что ты видишь и тебе кажется странным неправильным прокомментировать так ну первое что мне кажется странным что в одном файле объявленная 2 класса но это не объясняет скажем так засчитывается окей так get users что это у нас такое это я так понимаю какая то да . и здесь аннотация псалмами это было противоречит методу сет user1 потому что он модифицирует тот же инстанс вместо этого он должен на клонировать
00:22:55 - 00:24:46
себя меня тюз клонированного объекта вот это property гп-7 хорошо наса здеся правильно еще что здесь и что ты еще так но на рим плиз но наверное здесь еще может быть проблемы с тем что user1 в псалме указом как но на empty list но если ты создашь просто не убит users to у тебя уже будет объект который нарушает этот вариант то есть здесь должен быть конструктор который требует не пустой массив взрыв хорошо а даже если без псалма в чем проблема с таким свойством и смотрем про печки 74 но как видим что привезли get use
00:24:00 - 00:25:47
radisson может начать ругаться что свойство инициировано инициализирована ok но тут еще есть нюанс может быть вот аргумент как раз взять usa радиста же прокомментирую сапсан мамка-то с аннотации в методе с эти узы райтис еще какая-то проблема но да вот печь питу акисы посмотреть на аргумент ну да здесь требуется у нас и рэй но массив у нас любой массив не является списком то есть нас usa родис анонсирован лист соответственно это должен быть не ассоциативный массив без пропуска включим да хорошо давай так так
00:25:03 - 00:26:43
следующему классу перейдем так get юзер хендлер так это это понимаю какой то команд хендлер наш команд по названию как тихо что эта команда или все таки нет это хендлер сейчас я попробую понять ну ладно да посмотри внимательно да и я тебя не тороплю первых это в глаза что в конструкторе мы ожидаем интерфейс в объявлении параметра дейта bass в классе у нас уже суть всем какой-то конкретной реализации да верно под названием дейта борис еще смущает что класс финальный но у него нету какого-то интерфейса то есть это
00:25:52 - 00:28:20
сильно зависит от того что этот класс делает но как правило файлов я ставлю на тех классах у которых есть какой-то интерфейс потому что ну и если есть малейшая вероятность что кому-то нужно будет как-то менять это поведение вот этого класса так файл public фанкшн и волк так здесь у нас передается какой-то объект я так понимаю содержащий спецификацию запроса на до этого рассматривалась понял и вызывается метод transaction или которая ожидает колбу т.к. это die in волк на 53 строке будет проблема с тем что хлор
00:27:07 - 00:29:10
объявлен как static но внутри него мы вызываем зыс верно так описано здесь будет ошибка вскоре как юзера диск так новый это же вроде вроде бы проблем не вижу на давай чуть-чуть подскажу вот в сигнатуре метод тебя ничего не смущает nature sound у нас возвращается генератор и трубу а но давай про это поговорим это как-то вообще чет нарушает если я правильно помню мне так много генераторами пользоваться не приходилось но если я все правильно помню то чтобы получить из этой болт генератор нужно что то делать по моему даже
00:28:20 - 00:30:44
добавляли какую-то какую-то функцию в одной из недавних версий печки что-то вроде создания генератора из это рабов могу ошибаться генераторами много не приходилось пользоваться но здесь на самом деле ничего зачитался комментариев ничего такого критично нет мне интересно вот внутри этого call back a нет какого-то нарушения контракта по листков то что нас внутри как бы генераторов сил возвращаемый тип стоит это рыба какая-то проблема с этим есть лисков но только что с тобой обсуждали ну вот нужно в том что что в контракте вот
00:29:33 - 00:31:22
этого дтп из интерфейса методе резалт может другой тип быть но нет допустим что метод резалт выдает нам там тоже итератор какой-нибудь я имею ввиду что вот на 52 строке у нас vitara был стоит на выхода написан 3 from это вызовет но yield у нас да я понял теперь о чем ты же у нас возвращает instant генератора генератор если я правильно помню то это частный случай интерфейса это работа есть это ну итератор как можно только в одну сторону крутить а и диавол у нас вроде может быть все что можно интегрировать включая
00:30:34 - 00:32:11
просто массив так это так и мы нарушаем здесь в итоге в итоге да наверно нарушаем все таки на самом деле ли не нарушаем потому что папа барбаре лисков мы можем возвращать более узкий тип чем тот который объявлен то есть мы здесь равно сохраняем контракт на выход на star балл отдаем генератор то есть мы не можем в об аргументах мы не можем сужать тип она выход можем нам главное подтип вернуть того который нас просит здесь конечно в идеально отгул на писается что возвращается генератор на 52 строке но
00:31:26 - 00:33:03
формально мы сейчас не нарушаем этот код от работает хорошо давай посмотрим на метод transaction али на самом деле в этом методе еще из проблем а вот про сигнатуру на давай хорошо останемся здесь на 49 строке есть какая-то проблема с на 49 строки еще раз в сигнатуре методы in волк она прямо которая вообще что-то выстрелит где-то но вот визуально ничего не смущается но смущают наверно то что у метода in волк печки не типизированным возвращаемое значение то есть у этого класса нету интерфейса в котором было бы прописано
00:32:16 - 00:33:47
что магический method in волк должен вернуть генератор и наверное если какой-то код работает с этими хендлера me to нету гарантий что у одного инвок вернет генератор другого что то другое но это на самом деле можно гарантировать при помощи псалма то есть это не проблема словно горами а если у нас есть массив тех же самых гендеров и мы можем проверить что все они имплементировать как бы является реализацией кола бал который возвращает генератор как мы помним класс в этом адвокат по сути call back
00:33:02 - 00:34:15
да здесь проблем не будет проблема на которую я хотел бы чтобы ты обратил внимание это то что тут написано файнал а класса так файлов нет смысла писать финальный метод финальном classen такая деталь она ушла осмотре последние три проблемы которую мы рассматривали их бы все отловил статический анализ поэтому очень давно уже не приходилось на review такие вещи глазами выискивать хорошо тогда давай посмотрим на метод transaction али и вот там есть проблема которая статический анализ не нашел рамаж пожалуйста перемотать
00:33:37 - 00:35:10
пониже чтобы метод транзак шнур вес был виден так он делает он соответственно открывает транзакцию блоке try catch выполняет колыбу после этого имейте транзакции возвращает результат если в ходе выполнения голову возникает какая-то ошибка то он делает rollback а вам наверное здесь проблема может возникнуть с тем что камень не находится внутри блока try catch то есть может возникнуть какая какой-то exception при вызове вы при вызове зыс да это близко мид наверное в этом проблему так допустим пока я других сложностей здесь нет не
00:34:23 - 00:36:39
вижу так хорошо а вот эта функция она является функцией генератора вот если подумать с точки зрения генератор что ты сказал верно да то есть действительно здесь комет вынесен вниз и на самом деле вот давай обратно вернемся вот в методике чем вообще не хватает даже и составить код в таком виде а вот из просто поправить не хватает наверное логирование этого эксепшен то есть мы просто его поймали и все и дальше ничего не делаем так вот дальше ничего не делаем логирование допустим но хотя у нас возможно а если не логирование нам в
00:35:56 - 00:37:20
принципе exception to перебросить новых совершенную перебросить новые к экшену и старой exception в него третьем параметрам засунуть хорошо принимается а теперь давай вот подумаем по поводу flow генератора я помню что ты говорил да что ты с генератором не так часто взаимодействовал вот какая здесь может быть проблема скажем на 7 из второй строке мы получаем результат операции которые по контракту нашей строке написано что она генератор возвращать и потом на 7 из 9 мы его просто возвращаем здесь может
00:36:39 - 00:37:58
быть какая-то проблема наверное не отвечу на этот вопрос значит здесь такой нюанс что если мы работаем с генератором и мы его передаем не через help from а вот как здесь просто возвращаем на генератор даже не начнет своего свою свою работу то есть call back который мы передали метод транзакция он вообще не будет выполнен никогда вот в рамках метода 67 и наша нашей строке и наши вот эта обёртка transaction алиана общаться не имеет потому что мы просто получим не запущенный генератор на себя сразу этим
00:37:19 - 00:38:34
на 79 и в общем в транзакцию то толком ничего не обернем потому что сам код начнет выполняться позже что там кто-то в комментариях сказал что это не практически вообще код я здесь не согласен давай рам подними пожалуйста чуть выше вот посмотрим вернемся на то место где транзак стали вызывается вот скажи для такого запроса имеет смысл вообще использовать генератор для чего псигенератор может использоваться в целом да и для здесь он может иметь смысл генератору в данном контексте может использоваться если запрос возвращает
00:38:03 - 00:39:26
какой-то большой ризал сет чтобы его сразу весь памятник грузить читать его соответственно подсистему результат хорошо а вот при условии того как сейчас организован запрос на пятьдесят пятой строке нас вообще спасет это от того что память , или нет это зависит от того какая реализация вот этого дтп из интерфейса resumed отрезал им самая что он просто этот запрос отправят в подвое и вернет результат но если под его возвращает сразу во все все строки из базы данных то это ничем не поможет у нас просто мы единый который так уже в
00:38:47 - 00:40:17
память о как можно бы решить эту проблему произошло переписав то как у нас идет чтение из базы данных чтобы при каждом вызове резал считалось из базы только одна следующая строка и соответственно юта будет проходить по этим строкам возвращать их в 1 и помещаю все сразу память хорошо а как именно это можно сделать в по крайней мере в тех обертках на надо по которым я пользуюсь доктрин of scam до боли там есть метод который позволяет так делать не все сразу обращаться в одной строке к уровню реализацию я ел я еду я точно
00:39:32 - 00:41:11
не расскажу на самом деле доктрина вский там ездит на статья про то как делать го 4 шанс да ты про это наверное и что-то можно по частям на самом деле он не решает проблем того что из базы в под его выгрузится все данные чтобы это реализовать нужно использовать курсор и в базе данных тогда резал сет будет выдаваться теме кусками которые ты попросят курсора возвращают куклу я не упомянула ее геминид и имел ввиду когда окей хорошо тут есть еще нюансы но в целом я думаю все понятно здесь мы тогда перейдём к
00:40:23 - 00:41:37
следующему разделу раз уж заговорили про базы данных пользовался ли ты после склеил и там как ты думаешь если сравнивать самострел какие отличия пользовался и очень люблю по сгрыз quelle что для меня самыми большими с плюсами по отношению к моей цели является первое это транзакционный детей то есть то что какая-то миграция которая меняет схему если она середине где-то упало то все предыдущие изменения откатиться нужно будет для того чтобы второй раз я запустить выяснять насколько она там выполнилась ее как то вручную это
00:41:00 - 00:42:31
отказывать второй момент который мне нравится это просто гораздо большая гибкость функционала что я часто использую например так называемые паршиво индексы частичные индексы когда мы индексируем какую-то колонку и например половина значения в ней на у и мы точно знаем что нам не нужно будет сделать запросов по этим значениям сад с можно построить частичный индекс который не будет включать себя так что еще мне в подгорске или нравится но ты знаешь на самом деле я думаю но я понял что какие-то ты отлично знаешь мы главной
00:41:46 - 00:43:19
передохнули pass a review и следующий вопрос и to get запрос нужно будет составить по задачу щас я тебе скину ссылку точно так же на кист роман открываю отправляешь всем остальным сейчас посмотрим то о чем наш нас александр макаров только что попросил какой-нибудь задачку polski так как я так понимаю у нас схема таблици до выбрать без джиннов и под запросов все департаменты в которых есть мужчины и все они поставили высокую оценку строго выше 5 я только сейчас понял что тебе надо будет как-то писать запрос поэтому мы
00:42:34 - 00:44:06
можем поступить так что ты его в принципе расскажешь как можно построить то что конкретная формулировка синтаксис не очень скорее делать скидок либо можно будет попробовать расшарить экран но как тебе удобнее ну попробую на словах да давай сейчас только еще раз да конечно съемом в чем задача заключается улыбаясь от комментария про сексизм я знал что он будет пойду грамм мужчина true это и ты тоже заметил ну так как здесь разговаривают трое мужчин и 3 и 4 прокомментировала чем вообще говоря то высокую оценку это это что это вылью
00:43:32 - 00:45:06
оценку до но если я правильно понял задачу то здесь будет select report найди у.р. gender true and value больше пяти как-то слишком простая может быть неправильно задачу понял да это не совсем правильное решение у нас тут какое то что это были вместе с департамент мнение не вот в задачу полностью написана на экране здесь я написано что не просто есть мужчины которые поставили высокую оценку а что все мужчины каждый мужчина в департамент так теперь понятно у нас к без джиннов и под запросов наверное
00:44:41 - 00:46:15
оконные функции это можно как то сделать но важно но я на практике оконные функции не применял я задача можно без решить но по крайней мере часть запроса все равно правильно назвал наша задача вот составить это условие при котором именно каждый мужчина внутри каждого выбранного департамента поставил оценку высокую подумай над этим то как нам эту характеристику при помощи скверы описать [музыка] хороший вопрос но немножко помогу тебе правил иначе долго вот смотри ну в принципе сабо нас была реальная
00:45:47 - 00:47:35
собеседование можно было бы дольше но мы поскольку в рамках streamer вот у нас есть уже отобранные департамент вернее отобранные мужики с конкретного департамента вот мы все фильтр наложили все как бы нам нас есть множество этих оценок как бы нам сказать что все они строго выше 5 вот одним выражением даже сейчас в отрыве от нас queen в принципе можно как-то это сформулировать даже скажем математическим языком историю множеств но математическим языком его я вряд ли смогут формулирует тому что у меня профильного образования нету но я
00:47:17 - 00:48:41
не иду вокруг а вы даже не обязательно прямо там через эпсилон-дельта а какая характеристика множество говорит о том что все оценки выше пяти или могу знаешь себя как элементы во множестве одинаковые если по множеству от цен вот смотри множество оценок если мы изобразим например на графике точки и представим себе оси по которой как раз эти оценки все пронумерованы и ты увидишь в нужном нам департаменте что все оценки точке выше пяти правильно смог это визуализировать до графики вот как эта характеристика называется хорошо
00:47:59 - 00:49:46
а как называется вот у нас есть точка которая окей при каком условии при каком условии это правило будет нарушена вот ну типа выше пяти если существует хотя бы одна точка которая что которую ниже печи так это . чем является в данном множестве среди всех остальных как так а с точки зрения чисел вот среди этих чисел она какая это единственно . которая ниже 5 не знаю как активен этот ведь ну она самая самая низкая самая маленькая значат так самая маленькая как еще математическим языком можно сказать минимальная
00:48:51 - 00:50:43
минимальная вот минимум эта функция которая нужна чтобы построить запрос часто я подумала немного ну верно программ от получится select департамент айди мин в или us is mine вылью у.р. gender true having мин вылью равняется больше четырех да да но тут правда строгого ешь 5 так что больше пяти там не может быть ли оценка больше пяти в принципе но больше пяти до heaven гомель вылью бишкеке да теперь правильно из получается этим запросам и должны оценить минимум в каждом по множестве и такое условие наложить переходим к
00:49:48 - 00:51:43
следующему блоку и он завершающий значит это вопросы по архитектуре ну что-то вокруг этого давай опять до чтобы расслабиться какие рынки ты используешь точнее какие типы р.м. ты знаешь и да как из них используешь на практике 2 детектив рекорд и data mapper использовала джоли другой active record это грубо говоря когда у нас класс в котором находятся данные сам себя умеет сохранять искать то есть у нас в одном мире его в одном классе совмещена и логика самого класса и логика работы с базы данных
00:51:02 - 00:52:36
data mapper это когда у нас есть отдельный класс есть отдельно века по работе с базой данных и какая-то спецификация по которой мы полученные из баз данных значениям этом на этот класс то есть как нам из из того что пришлось базы данных получить этот класс и наоборот как нам этот к сохранить базу даром хорошо как ты думаешь рынка на чтение нужно зависит от задачи зависит от задачи если это не нагружена и чтение то наверное не имеет смысл что-то другое тащить если в проекте уже история если это какое-то
00:51:49 - 00:53:19
сложное чтение там допустим какие-то отчеты строить надо или нам нет необходимости грузить сразу всю сущность в памяти для того чтобы что-то посчитать тогда можно напрямую обход айрин читать из базы до но то есть в принципе в общем случае можно всегда делать это и я еще раз довести на проекте используется та же доктрина и он не нагруженные на чтение то я бы не стал заморачиваться и в тех местах где допустим вытаскивается из базы данных сущность чтобы что-то от рендерить читайте голые массивы ты болван из базу
00:52:35 - 00:54:17
да если разница и так не будет я не совсем тогда понял твой мсс ты говоришь что когда особой нагрузки нету то надо использовать или не использовать может еще раз четко проговорить когда не сродни без разницы если я проекте используется допустим для записи да то заморачиваться и любой ценой делать чтение без о р м я считаю требование по производительности на члене но хорошо возможно мы чуть позже уточним этот вопрос не буду долго спрашивает что такое де де де и прочее это два sword уже все наслушались
00:53:24 - 00:54:58
сразу к делу что такое агрегат как-то себя понимаешь и с точки зрения как скажем концептуальное с точки зрения реализации тоже агрегат это какой-то это такая совокупность объектов которая которая четко очерченные границы и через эти границы происходят все взаимодействие с содержимым едва грига то есть допустим это какая-то сущность агрегат какой бы пример привести допустим есть у нас сущность объявление и это объявление имеет в своем составе еще какие-то еще какие-то элементы скажем так из которых она состоит есть
00:54:12 - 00:56:03
текст этого объявления кто это объявление написал и так далее и в случае если это будет агрегат то он взаимодействие с ним допустим будет строиться не потому принципу что мы за грига то достаем какую-то его часть что-то с ней делаем и кладём обратно во грига мы агрегатор сообщаем что мы хотим что мы хотим сделать он уже внутри себя делает все изменения хорошо а вот бывает такая проблема что начинает моделировать предметную область и получается гигантский агрегат с чем это связано почему так выходит как с этим бороться
00:55:15 - 00:56:32
как правильно разделять агрегат чтобы они оставались небольшими ну какой-то готовый рецепт в два предложения я наверное здесь не смогу убить ну четко понимать вот ты сказал объявления допустим у нас там есть объявление и какая-нибудь и много вложенных сущностей в рамках этого агрегата который ну как бы нарушение светится вот но выяснилось что это агрегат стал очень много в памяти занимать когда мы его и сбыт и получаем вот как каким вопросы нам надо задать себе чтобы это ребята распилить на 3-х мертва а разных
00:55:57 - 00:57:17
и по и чтобы их можно было доставать независимо друг от друга это самом деле отшествии связано с тем что такое агрегат более техническом плане к тому что я сказал я могу еще добавить что полноценный агрегат должен использовать доменные события то есть если у нас есть какой-то связанный код который должен как-то взаимодействовать этим агрегатом то вот это взаимодействие можно стоит на событиях то есть не обязательно для того чтобы в одном месте что-то сделать вытаскивать весь этот агрегат и передавать его событий достаточно
00:56:39 - 00:58:21
передать его до индификатор и в другом месте можно будет тогда обзываешь про как бы следующую часть а я вот говорю что например мы проектировали проектировали па-де-де новичков и уровень такой и у нас получился большой агрегат хотя она там по идее не должно быть то есть но ты знаешь рецепт как вот его поделить в чем может быть проблема в этом случае какое правило нору ну наверное я на этот вопрос не отвечу потому что настолько я в детей не углублялся чтобы прям на проектах агрегаты использовать главное
00:57:29 - 00:58:50
что я для себя почерпнул из девяти когда и начал с этим знакомиться и что для меня стала вот прям открытием что это практически вот первые несколько глав из той самой книге аванса право единый язык и про то что кот в принципе должно отражать в себе в первую очередь не какие-то технические требования к нему а должно отражать бизнес-задачи когда остальные под все эти паттерны и тактически и стратегически и я их тоже читал и может быть даже больше чем один раз но на практике пока на проектах вот прям
00:58:10 - 00:59:31
чтобы с агрегатами такого у меня еще не было практически вкратце отвечу на свой вопрос поскольку на стрим и все таки важно чтобы люди тоже понимали к чему это задавалась агрегат в первую очередь должен строиться вокруг бизнес инвариантов вокруг то есть это как раз мостик от того что ты сейчас сказал в целом процедите к тому как это реальный лимитируется агрегат это не группировка каких-то понятий по принципу что вот они там называются похожим образом нам кашу попадает в одну категорию это агрегат
00:58:52 - 01:00:06
это возможность гарантировать какой-то бизнес-правила какой-то января внутри транзакционных границы и как правило большие агрегаты появляются там где несколько инвариантов почему-то собирают в одном месте хотя их элементарно можно разделить по принципу что какие-то поля в этом инварианте не участвуют и они могут образовать совершенно спокойно отдельно агрегат со своим инвариантом и тогда мы сможем независимо что этот агрегат достать из памяти выполнить действие что другое независимо и система я станет гораздо быстрее ну хорошо ты
00:59:29 - 01:00:40
заговорил про события предметной области я учту что даты как быть идите пока активно не использовал но все таки вот допустим мы порождаем при помощи агрегат какие-то события предмет области чтобы дальше с ними делаем как мы вообще для чего они нужны что на базе них можно дальше делать этот механизм событий можно использовать как средство снижения зависимости между кодом выполняющим разные скажем так бизнес-задачи какие-то вещи например которые используются практически везде ну допустим то же самое логирование или то что не связано
01:00:05 - 01:01:44
с какими-то бизнес-задач им это позволяет отвязать этот код то есть агрегат объявляет какие существуют в рамках в рамках скажем так его бизнес-задач какие существуют события которые имеют какие-то значения для него эти события порождает и ему уже все равно кто и как на эти события и реагирует соответственно можно к этим событием привязать как и другой ход который какие-то бизнес задачи выполняет так и инфраструктурные корпуса тоже лагера а технически технически события что с ним происходит по 100 как
01:00:56 - 01:02:30
агрегат их но создал по сути инстанции событий в чертах он их внутри себя агрегат эти события накапливают и в какой-то момент он их освобождает соответственно момент важный вопрос как раз в момент и закрепления транзакции так хорошо но вот мы например события хотим отправить в очередь в какой там ребята пмк условной мы это как должна сделать до транзакции после после транзакции то есть это событие должно собой представлять уже свершившийся факт тем более если речь идет про какую-то очередь где принимающая сторона понятия
01:01:43 - 01:03:21
не имеет свершившийся факт это или нет но хорошо что если мы транзакцию например выполнили оса это у нас не ушли потому что рыба танки упал и события на самом деле были а по факту о них никто не узнал и какой от ларька который на них опиралась оказалось нарушены здесь нужно делать механизмы которые будут следить за этим то есть как минимум то что урабе танки упала не должно вызывать то что все все эти события безвозвратно потерями если они настолько ценны что от них какие-то какой-то код кадры бизнес задачи
01:02:31 - 01:03:48
выполнять зависит но к теоретически как бы ты предложил такую задачу решить я бы эти события складовку это persistent на и хранилище и те тот тот код который на эти событие реагирует должен после обработки этого события уведомлять что это обработка успешно произошла и событие больше вот относительно агрегата какой-то может быть хранилище что все у нас вот так гарантированно сохранялся ты имеешь ввиду какое хранилище какая база данных или просто концептуальной но концептуально скорее вот ты говоришь до
01:03:09 - 01:04:43
нас есть агрегат он там в одном хранилище лежит вкопан то мы хотим гарантировать что события неважно ушли они или не ушли они тоже обязательно где-то до остались вот куда их тогда надо положить чтобы мы могли гарантировать что здесь все произошло коррекция но если я правильно тебя понимаю тут и уже в сторону и event for single сейчас сейчас нет не обязательно я говорю про то когда агрегат может например быть реализован nevian серфингом а просто аурой моделью какой-то до которой хранится ну там при
01:03:58 - 01:05:03
помощи доктрины а события мы хотим отправить робби thank you но при этом мы хотим их не потерять вот на этом стрёмно в моменте после сохранения агрегата и и отправки в рыбе танки а ты предлагаешь сохранить события претворить в хранилище вот эти спрошу где оно должно находиться то что на другой хранили что тоже может не дать гарантии что доступно здесь на самом деле вопрос он не уходит куда-то далеко он но просто логически рассудить чтобы вот данные все сохранились одномоментно кануне действовать в том же в том лишь в той же
01:04:30 - 01:05:42
транзакции должны сохраняться которых сам агрегат сохраняется до все это просто сказал в хранилище я уточню в какой в то же самое потому что иначе бы другая транзакция окей на самом деле ну я вот по крайней мере в чате symfony слышал что некоторые ребята отправляются не после транзакции а прямо перед ее завершением когда вероятность того что она корректно очень высокая и уже ну вряд ли что-то пойдет не так либо если да мы хотим прям вот вообще передала житься на сто процентов то нам действительно сохранить в этой же
01:05:06 - 01:06:12
транзакции потом там при помощи хитрых механизмов это отправить и если у нас там rabbit упал когда он поднялся он должен прочитать то что он еще не успел отправить но и так далее это вообще отдельный разговор хорошо но вот events are seen кто упомянул как те кажется как то имеет смысл его используется в чем суть паттерна суть его в том что мы храним все изменения состояния в приложении в виде событий и соответствие что нам это дает нам это дает бесплатный сразу аудит по времени то есть мы можем посмотреть
01:05:38 - 01:06:58
каким было состояния приложения на любой момент времени в прошлом но возникает при этом проблема что каким-то образом нужно быстро читать текущее состояние приложения опасно для этого используется в проекции которые читают поток событий и какой-то на какой то момент времени слепок текущего состояния где-то сохраняя много раз хотелось попробовать ln surfing на практике даже вроде как были задачи где он бы хорошо себя показал мог пока к сожалению ни разу не удалось ok но то я думаю что мы все спросили
01:06:19 - 01:07:54
роман если ты хочешь озвучит какие-то вопросы из комментариев да пожалуйста я своей закончил рамки они срочное царство забыл включить микрофон у нас были интересные вопросы в чате ну например кем ты видишь себя через пять лет нашей компании готов ли ты к переработка а так же самую сложную и интересную задачу из своей практики ну предположим ты знаешь ответы на эти вопросы после один из последних вопросов последний вопрос ответ не интересно как сложно и интересно ну давай да какой еще раз вопрос расскажи про самую сложную и
01:07:08 - 01:09:03
интересную задачу из своей практики спичку сейчас я попробую что-нибудь вспомнить чтобы рассказать и при этом какой-нибудь людей не нарушить [музыка] интересных задач 2 наверно категория одна была интересная задача нас новых стартов где нужно было очень много разных данных связанных со со здоровым питанием с креативным содержимым продуктов содержательно собирать из большого количества источников и там были какие-то безумные формулы которые на основании всех этих цифр высчитывали насколько под продукт
01:08:08 - 01:09:43
болезненный человек но это была интересная задача на в продуктовом плане то есть не в плане программирования в плане программирования как потрахалась c random and инструментов куча i have a y и кучи рандом примерно так из последних интересных задач в области финансов и то системы по выявлению фродо там интересно было выстраивать абстракции то есть когда первый раз к этому проекту подошел я его запустил но очень быстро понял что эти абстракции которые я сделала не в этой сфере не работаю и вот в общей сложности было 2
01:09:05 - 01:10:48
или 3 нет и рации ходе которых основную часть я переписывал это очень интересно и на этом проекте я ощутил в полной мере насколько хорошо кормить с удобной хорошо иметь архитектуру которая позволяет применяющихся быстро требованиях быстро подстраиваться что флот это такая область это что-то одно отловил и люди тут же придумывают какой-то какой-то новый способ тебя обмануть понятно спасибо интересно давай вот про безопасность классный вопрос от саши макарова звучит он так как правильно обработать
01:09:56 - 01:11:23
статью юзеров блоге чтоб вывести ее на главной странице и как ее хранить что может пойти не так сохраните статьей узоры в том виде как он нам ее прислал со всеми со всеми эксцессами и прочими потому что мы никогда не знаем что мы потом захотим с этими данными сделать мы лучше всегда хранить в том виде в каком мы получили от юзера соответственно на выводе уже нужно применять все фильтры при выводе этих данных например как почистить экранировать html текста или что да видимо все что угодно тут может
01:10:40 - 01:12:17
быть и код все что хочешь при сохранении соответственно у нас какие могут быть проблемы с келли инъекции при сохранении нам нужно использовать подготовленные выражение то есть не клонировать как-то данные не фильтровать их используют подготовленный вражину при выводе соответственно же делать фильтрацию крайне отрицательно хотел и если если моя текущая компания смотрит этот т.е. работу еще даны кстати спасибо тебе огромное за просмотр они посмотрят было несколько вопросов про базы данных но мне кажется уже не
01:11:32 - 01:13:22
очень интересно них углубляться базы данных это момент высветился комментарий что люди которые много работают своём со временем тупеют и да это так я работает уже притупил ужас ходу про простейший запрос вызывать проблемы поэтому я рекомендую на чтение они используют тогда все баланс сохраняется круто ну давай кота к обратной связи во первых да спасибо тебе огромное что согласился потому что нужно быть очень смелым чтобы согласиться на интервью на 500 человек то всего пике было больше почесать да и это еще там куча комментаторов в
01:12:27 - 01:14:01
общем очень круто спасибо тебе даны вам тоже спасибо для my для меня это как ты правильно сказал выход какой-то из зоны комфорта и я считаю что это иногда полезно второй момент что очень редко получается интервьюировать действительно хороших интервьюеров и это тоже очень полезный опыт спасибо вам за него нет но моя обратная связь я могу даром или тысяч году да конечно говорю мы во-первых надо оговориться что мы искали на мидл сеня разработчика но это всегда очень такие странные грани что есть но что из другое и
01:13:20 - 01:15:01
в комментариях в чате к моему каналу ребята скале но вот пообещали такое а взяли какого-то супер крутого чувака ноте реально неплохой уровень и я думаю что но зависит от проекта но конечно но вида можно претендовать как раз или просто и так далее хотя еще был написано что свободно владеешь английским здесь у меня есть небольшая рекомендация некоторые слова ты произносишь на русский манер там это работ и been surfing это не проблема в целом но когда я например слышу да и понимаю что человек говорит что он хорошо знает английский
01:14:11 - 01:15:24
это вызывает диссонанс поэтому лучше все таки стараться английские слова мне кажется если ты произносишь их они аналоги кстати ты очень круто ты заменяешь некоторые слова на русские нативной и хорошо ты делаешь вот но там где с большим диски лучше наверное на правильно это к сожалению всегда так потому что умеешь знакомые нативные спикеры с ними я говорю по-английски чисто но очень часто бывает лечит и разговариваю по-русски начинаешь составлять близкий слова идеальная с лондонским акцентом то это будет тоже
01:14:48 - 01:16:06
очень многих отображается это гора нужно по поводу того что мы вообще обсуждали ну мне кажется с опытом какими-то вещами всегда есть тоже край да где какие то индивидуальные субъективные моменты которые я там может быть сам хочу услышать но не обязательно должен услышать все остальное на уровне общего вроде знаешь разбираешься review в целом тоже неплохо но тебе надо подтянуть и генераторы я знаю что во многих проектах они не используются но мы почему-то их очень много используем как раз от доставая
01:15:26 - 01:16:39
большие данные с энергетической системой там курсор и прочее довольно важная тема и дальше в коде тоже это должно обрабатываться правильно на тему генераторов в задачке были как раз вчера на канале собеседования прочие можно посмотреть как раз вопрос review по поводу базы данных но тут решили да то есть реально чем хорошо на чтение использовать чистый спирт что ты его не забываешь особенно если чтение хитры это вообще очень картера ну такой повседневные упражнение и на самом деле это удобнее чем использовать варим там
01:16:04 - 01:17:15
где она как бы не нужно по поводу архитектурных вопросов то но тут вопрос на как бы дети диета не масках но у штука но как поест и ты сказал что вы активно не спастись от искал что мы используем на всех проектах и не ответил на вопрос который задал было бы плохо а так учитывая что-то глубоко в него не погружаешься то в принципе наверное pazolini как будешь погружаться обрати внимание на то что я сказал ну и when sorting то же самое да не маст хэв вот концептуально знаешь знаю что это может это быть полезна как перейдешь уверен ты
01:16:39 - 01:17:52
выучишь вот во всем остальном круто спасибо большое у нас тоже такое переживательные момент потому что это первое собеседование онлайн вот но мне кажется что все получилось круто во многом благодаря тому что мы пытаясь переложи ца чтобы не взять джуна взяли очень достойного кандидата и все сложилось очень хорошо потому что candida тоже сильно влияет на такой план мероприятия также не верю но никуда да всем спасибо спасибо кто был в чате кто смотрел трансляцию было очень круто очень живо мы с валентином во-первых трансляция это
01:17:15 - 01:18:36
запись стрима будет доступна по этой же ссылке вы сможете пересмотреть любой момент мы с вами тина мы идем чтобы обдумать как делать следующие выпуски подписывайтесь на канал чтобы не пропустить их и на наши телеграм-канал тоже где мы будем закидывать формы для отправки заявок на участие в этом всем и может куда-то еще информация все всем спасибо всем пока пока счастливо
01:17:58 - 01:18:56