ym104432846
Вставьте ссылку на видео из Youtube, Rutube, VK видео
Задайте вопрос по видео
Что вас интересует?
00:00:11
Презентация компании и вакансии:
  • Компания "Гудка" занимается разработкой коммерческого ПО с использованием математики для крупного и среднего бизнеса.
  • Основные направления деятельности включают прогнозирование, оптимизацию и работу с большими объемами данных.
  • Вакансия открыта для senior-разработчика платформы, требуется опыт работы с .NET 6, PostreSQL, MongoDB, Redis, Angular, Docker и Kubernetes.
  • Важны навыки работы с базами данных, понимание принципов низкоуровневой оптимизации запросов и инфраструктуры.
00:15:34
Описание текущих проектов кандидата:
  • Кандидат ранее работал в проекте рекламной платформы и биллинга в компании "Билайн".
  • Рекламная платформа позволяла клиентам формировать и запускать SMS-рекламные кампании.
  • Биллинг отслеживал статус платежей, отображал балансы и принимал платежи через СБП.
  • Были проблемы с производительностью и масштабированием, включая задержки при обработке массовых рассылок и сбои при очистке архивных данных.
00:28:12
Решение технических задач кандидатом:
  • Кандидат успешно справился с задачей написания алгоритма для определения високосного года.
  • Затем успешно реализовал алгоритм очереди с использованием двух стеков.
  • Показал хорошее знание методов оптимизации и структур данных.
01:09:40
Опыт работы с базами данных:
  • Кандидат обладает опытом работы с большими объемами данных, оптимизацией запросов и использованием индексов.
  • Знает различия между кластерными и некластерными индексами, а также принципы их применения.
  • Имеет представление о процессе выполнения SQL-запросов и использовании индексов под капотом.
01:32:52
Использование ORM и взаимодействие с базой данных:
  • В компании активно используется Entity Framework Core для генерации классов и взаимодействия с базой данных.
  • Генерируемые запросы могут требовать ручной коррекции для повышения производительности.
01:35:54
Критерии выбора новой работы:
  • Кандидат ищет интересные проекты с разнообразными задачами, возможностью профессионального роста и развития новых навыков.
  • Предпочитает удаленную работу и гибкий график.
01:38:21
Заключительная беседа и договоренности:
  • Обсуждаются детали возможного трудоустройства, включая формат работы и сроки принятия решения.
0: Да, добрый день да Александр приветствую добрый день. Так hr ждать не будем я думаю нас троих хватит. Меня зовут можт Эльдар 100 компании гудка.
1: И Павел Сёмин это наш тимлид команды платформы, куда мы как раз-таки ищем сильного разработчика.
2: Я так понимаю, уже немного о компании рассказали, да? То есть есть понимание, да?
3: Ага, так, я сейчас в 2 словах, для того, чтобы чуть чуть, может быть, именно с технической точки зрения там прояснить, компания в целом занимается различными, ну, разработкой коммерческого по, в основу которого входит математика.
4: Которая там решает задачи для большого, ну, крупного и среднего бизнеса в плане планирования, прогнозирования, оптимизации и так далее. Работа с большим количеством данных. Это обычно происходит для крупных компаний. И вот раньше, если мы
5: Делали, как мы для каждой компании заказную разработку, просто с нуля осуществляли того решения, которое нужно, то сейчас стараемся это делать как вендоры, то есть некий продукт коробочный. Вот дальше его уже кастомизируем под
6: Иного заказчика. И это у нас структура состоит из, назовём так, 3 частей. 1 это платформа базовый кор продукт, куда, собственно говоря, мы сейчас и собеседуется. Следующий, это уже продукт.
7: С точки зрения какого-то бизнес value, будь то планирование поставок, ну, цепей поставок, либо планирование и там расчет маркетинговых акций, ну и так далее, там разное количество
8: То есть это уже прям на базе платформы реализованный продукт, который закрывает бизнес потребность какую-то заказчика, но мы у абстрактного заказчика и дальше идёт уже конкретное внедрение. То есть это кастомизация, проект. Если, другими словами говорить, то когда под конкретного заказчика с учётом всех его
9: Индивидуальных потребностей. Мы коробочное решение модернизируем, кастомизируем и внедряем. Вот сейчас мы говорим о именно платформе стек у нас, ну давайте я лучше, наверное, да.
10: Самое дальше просто да, давай расскажу. У нас как бы на серверной стороне используется дотнет 6 версии в планах перехода на 8 баз данных post эскуэль для хране.
11: Основного объёма данных, ну также есть mongodb и redis с базой. Работаем через anti фреймворк. Серверная часть получается асп. Ну то есть.
12: Набор сервисов на кор клиентская часть написана на ангуларе, разворачивается в докере локально у заказчика обычно в кубернете как-то.
13: Так. Угу. Понятно. Угу. Какие у нас, наверное, специфики, все-таки расскажу. Если в платформе именно рассматривать, то тут, наверное, база данных, работа с базой данных.
14: Не предполагается много фронтенда нету вообще. Ну то есть для разработчиков бэкенда нету фронтенда вообще никакого. У нас чёткое разделение. Не утки. У нас, у нас отдельно фронтендщики, отдельно беники, у нас 3 на текущий момент фронтендера.
15: Вот есть, которые свою функцию отдельно закрывают по бэкэнду. Соответственно, если с базой активно в платформе не нужно заниматься, потому что специфики уже по базам данных и большая, так скажем, часть разра.
16: Вотки внутри базы данных хранимых процедур, если нужно или на бэкенде, написание каких-то больших конструкций из запросов и так далее. Это вот в продуктах уже конкретно бизнесовых. Вот, но платформа, будучи именно
17: Тавтология может быть платформой для этих вещей, в она должна определённые вещи, в том числе и по инфраструктуре, как фреймворк, выдавать максимально корректно работающие. То есть она даёт возможность получать те или иные объекты из базы данных, и она должна это делать. Ну,
18: Быстро, то есть выдавать сущность, причём если там она составная, там с джоинами на другие вещи, она тоже должна эти элементы подцеплять, вытаскивать, то есть повторять, если так грубо можно сказать, функцию anti, немного расширяя её
19: Определёнными нашими вещами. Вот, не замедляя, соответственно, не ухудшая работу. Это можно только сделать, если понимать, как работает база данных, как работает, работать с базой данных. Вот, и написал правильный, так скажем, код.
20: В этой части ядро, вот здесь экспертиза нужна. Дальше у нас внутри платформы осуществляются те иные бизнес процессы. То есть платформа, что это такое? Это некая такая лоукод система. Некоторые её называют no кодом. В таких можно бросаться помидорами, потому что мы так не план.
21: Это лоукод. Соответственно, какие задачи ты закрываешь? 1, это визуальные формы стандартные. У нас в большинстве продуктов львиная часть визуальных форм, она стандартная, это и табличные представления, те или иные, где
22: Какие-то манипуляции делать, какие-то кнопочки понажимать и может быть пару графиков ещё вывести. Это все постоянно с нуля писать не нужно, надо сделать какой-то цмс, условно говоря, движок, который вот раз, раз и натыкал обычный пользователь визуальный. Вот, вот.
23: Задачи сейчас платформа закрывает дальше 1 дело это визуально настроить, другое дело. Потом с этими данными надо работать, как-то операции производить. Вот платформа это тоже позволяет. То есть создаются динамические сущности, есть конструктор, в общем этих всех вещей.
24: Все это мапится на объекты в базе данных и осуществляются обычный код операции. Вот есть механизм, как это делается. Вот платформа эти вещи закрывает. И помимо этого, то есть мы теперь визуальную форму настроили с данными манипуляции. Делать можем.
25: Теперь бы ещё добавить какие-то бизнесовые составляющие, какие-то процессы. Вот. И уже, по сути дела приложение можно строить. Вот собственно говоря этим мы занимаемся. Есть движок бизнес процессов, у нас называется Эльза, которую мы используем
26: На базе эльзы мы строим свои так называемые бизнес процессы или внутри мы их называем ееще ворфлоу. Вот эти вот ворфлоу оо, внутри тоже может состоять из нескольких кусочков, так называемых активити. Или в наших терминах. Это кубики вот из этих Кубиков кубики разные.
27: Бывает может быть какие-то уже скомпилированные кусочки. Вот соответственно, они просто на вход что-то принимают, на выходе что-то выдают и все, что внутри творится, мы не знаем чёрный ящик. Вот, а есть вещи, которые позволяют внутри самому что-то задавать, это конфигурируемые такие кубики, типа
28: Роковой Кубиков, я имею ввиду, либо там дотнет Кубиков совских, либо apple, либо python, ну и так далее. Вот где человек может откуда-то данные достать, с ними что-то сделать.
29: Самостоятельно. Вот. И дальше закинуть и дальше какие-то кубики подсоединить. Вот у нас зачастую так делают с математическими кубиками, что-то подготавливают в виде данных на вход. Соответственно, это может быть там разные запросы в базу. Эти вот запросы готовятся.
30: Как ребятами, потому что специфика там баз данных у разных продуктов, она разная. Вот, а математики делают абстрактный какой-нибудь метод, который там рассчитывает, не знаю, там прогноз спроса какого-то, соответственно, какие данные ты ему на входе подашь?
31: От ритейла, от производства или от тяжёлой промышленности. Ну пока неизвестно. От этого специфика данных может отличаться. Вот скриптами это дело на for могу подать какими-то дальше. Потом математика посчитала, и на выходе уже сохранили таким вот образом. Вот.
32: Вот. War ihr. 1 дело, конечно, можно программировать, так скажем, руками, то есть строить, конфигурировать. Вот. Но помимо все-таки этой возможности есть ещё другая, которой тоже сейчас часто пользуются, это более такая тонкая разработка.
33: Назовём так, воло наши, это где разработчики берут и средством там кода программируют вот такие кубики после разработки эти кубики, ну, эти воло целиком, они превращаются в полноценный однотипные системе.
34: Которые руками натыкали, но просто создание их идёт в дотнет коде. Соответственно, некоторые из этих Кубиков отдельных, они представляют из себя чёрные ящики, скомпилированные код которых вот как раз-таки в дотнете разрабатывается ребятами. И там мы тоже очень много возможностей.
35: Как платформа, как работать с теми или иными вещами. И вот здесь вот надо вот эту вот часть очень хорошо и тонко понимать, как декомпиляция происходит, как работа с типами различными. Ну там прям очень хорошо.
36: Такая детская, такая очень глубокая работа происходит на выходе. Соответственно, очень много там плюшек даётся вплоть до каких-то распараллеливания. То есть у нас в этом плане архитектура, она с 1
37: Вроде как трехзвенный, можно сказать, монолит, но мы определённые вещи, которые нам нужно, мы, беря немножко от сервисной архитектуры плюшки, можем выносить в отдельные сервисы и масштабировать соответственно, распараллеливает тем самым ещё и
38: Нагрузку какую-то или там сами расчёты у нас бывает там тяжёлый расчет автозаказов для федеральной сети, там большой объём данных, там терабайты обрабатываются, естественно они все ночью обрабатываются, днём ты уже утром ты получаешь результаты
39: Если это в 1 поток на 1, так скажем, воркере считать это будет долго. Мы не успели. Естественно, это мы распределили там на 10 машин, соответственно, на каждой машинке ещё по 2, 3 воркера. И итого у нас там 16 или там 24 каких-то процесса запущено.
40: Они все считают, разбивая данные на независимые пачки, которые можно обсчитать. Ну, в общем, там целая такая логика, вот это все делается. И вот за счёт того, что мы как раз-таки, а это все один и тот же во запускается, вот мы просто умеем его
41: Правильно распараллеливать, ну и всякие такие вот вещи давать вот поддержание возможности вот этой вот чудо машинки, так скажем. Вот. И это тоже задача бэкэнд разработчика, соответственно, разработчики бэкэнд с другой, с других команд продуктовых, они
42: Они зачастую, как потребители, приносят новые хотелки. Вот что ещё поддержать то-то, то, то или вот у меня не работает эта штука. Давайте посмотрим, там, показать им, что ты, возможно, там что-то определил, не то или мы работаем только с такими-то типами, а ты дал такой-то сложный объект.
43: Который у нас не поддерживается. Договаривались, какой конвенции, что если ты будешь называть так, то так, то-то я это смогу преобразовать в то то-то, ну вот такие вот вещи. И таких вот разных задачек много. Вот их все необходимо сделать здесь вот хорошие знания нужн.
44: Так, по этой части, паш, ещё, может, дополнишь? Я пока собираюсь. Да нет, ты достаточно подробно рассказал. Мне кажется, тут что-то добавить.
45: Не стоит. Угу. Ну и в целом, если мы говорим про разработку в платформе, это прям чисто продуктовая разработка, не проектная. Угу. Соответственно, 1 из целей создания продукта, помимо тех, которые я назвал, это иметь, отчужда.
46: Продукт, то есть чтобы другая команда, вплоть до внешней, могла без нас все это дело конфигурировать. А это определённые требования к процессу разработки самой платформы как продукта, что код должен быть именно универсальные методы какие-то
47: Интерфейсы, они должны поддерживаться и так далее. Ну то есть вот возможность внедряться откуда-то, то есть интегрироваться как сама платформа с чем-то, так и кто-то извне должен с платформой интегрироваться, куча таких вот вещей, чтобы это не ломало там саму систему.
48: Таких вот базовых, наверное, для продукта с целью отчуждаемости требований. Вот это то, что мы делаем, куда нам нужен разработчик и какие от него компетенции нужны. Мы ищем сейчас
49: Прям сеньорито хорошего, опытного разработчика.
50: Мы имеем ввиду, что понятно. У него помимо карт Скилов, которые должны быть на хорошем уровне, вот у него и должны быть ещё софт скиллы хорошие. То есть это все равно командная разработка. У нас там платформе 10, 11 человек. Приблизительно, вот, чтобы вы понимали,
51: Нужно будет взаимодействовать с продуктом, с тимлидом, вот тем самым Пашей, с системными аналитиками, 2 там 3, возможно, и с фронтент разработчиком тоже договариваться о каких-то вещах, если вдруг у кого-то сложности возникают в разработке, понимании,
52: Какие-то вещи сложно сделать, легче вынести на фронт и наоборот. Угу. Вот. Ну и тестировщикам, соответственно, они тоже иногда свои требования в разработку втыкают, потому что нам потом это дело тестировать. Говорит, сделайте это вот так, потому что нам потом удобнее на это дело. Ты писат.
53: Ну и так далее. А если разработчику без разницы, он может сделать и так, и так вот, он, соответственно, тоже подстраивается в этой части. Вот, если есть такая возможность, и, естественно, 2, наверное, момента, которые мы обязательно ценим в сеньоритах, так скажем, разработчиков, где
54: Ярлык, сеньор, бросаем это самостоятельность. Ну то есть самоорганизовался, сам понял по задаче, что необходимо и как сделать. И 2, это инициативность. То есть, если видишь, что можно сделать лучше, то человека он об этом
55: Болит и сидит и молча не понимает. Просто лапки кверху, а сроки идут. Угу.
56: Понятно.
57: Вопросы, наверное, больше по платформе. То есть, я так понимаю, вот эта платформа plus продукт, и она устанавливается на, ну, на компьютер заказчика нет, давайте так. Или плат?
58: Это уже внутри, на компьютере, сейчас на компьютере. Нет, давай так, наши клиенты это, ну, крупный бизнес и все решения, которые мы разрабатываем, они, естественно, на серверах. Ну, то есть, в контуре заказчика. Да, да. У
59: Пользователи всего лишь только тонкий клиент в виде веб странички. Ну то есть single page application. Вот, и он в нём работает. Соответственно, есть серверная часть приложений. Ваш бэкэнд, по сути дела, и есть базы данных. Ну то есть я
60: Имею ввиду, что вот, и платформа, и продукт, они в виде контейнеров, да, сервисов находятся в контуре у заказчика. Да, конечно, у нас все решения платформы, продукты, фронтендов, часть бэкендовая часть, ещё какие-то сторонние, все это.
61: Разворачивается в контейнере Токер дальше разворачивается среди виртуализации у заказчика. Будь то традиционно, что мы Любим, это кубернет. Либо есть исключения, там, опеншифты, докеры и так далее. Угу. Да, понятно.
62: Для внутренней разработки мы используем в основном там докеры. Если ты локально хочешь что-то отдебажить, запускаешь в докере эту историю. Да, я думаю, понятно.
63: Так, если по, тогда, паш, наверное, тебе слово передам. Да, да, смотрите, мы про нас рассказали. Давайте теперь в обратную сторону расскажите, пожалуйста, о себе кратко. Да, на прошлом месте работы в билайне было 2 проекта. 1 проект.
64: Это рекламная платформа легаси. Такой проект, которому уже много лет из себя представляет платформу. Не лучше сервис буду называть, который направлен на то, чтобы заказчик мог, ну, это
65: Интернет сайт, то есть это не устанавливается там на серверах. Это просто интернет сайт, куда заказчик может войти, сформировать смску, сформировать таргеты на какие, кто будет эту смску рекламную принимать рекламные.
66: Рассылки и, соответственно, запустить рекламную рассылку. 2 проект это биллинг для этой же платформы, для этого, для этого сервиса. Ну собственно
67: Представляется проверку статуса платежей, отображение балансов, приём СБП, платежей и подобное общаются. Ну, в целом это монолиты.
68: Между собой они общаются по http.
69: Что там ещё? А, ну, билинг был написан на 6 дотнете мск плюс фреймворк. Там постепенно перебирались на посре, а этот рекламная платформа, это
70: Для для рассылки смсок на дотнет 3, который перевели на 7.
71: На что ещё акцентировать внимание?
72: А я похожие штуки писал, а расскажите, какие проблемы у вас были проблемы, были торификации, потому что клиенты, ну вот есть так называемый сегмент, кото сегмент из себя представляет набор
73: Номеров, которые формируются, ну, выбираются по интересам, либо по интересам, либо по демографии, либо по комбинации этого всего. И зачастую клиенты сначала собрали 1 сегмент, потом они на основе этого
74: Сегмента хотят другой сегмент собрать, потом 3 сегмент на основе вот этого 2 и вот так рекурсивно, рекурсивно набирается сегменты, и с течением времени это все становилось колом и не мог собраться новый сегмент.
75: Когда там слишком большая вложенность была, это вот 1 из проблем была, которую к концу года уже планировали решить, потому что там надо было переписать достаточно много. Ну там проблема из за рекурсивного подхода.
76: Были проблемы из за масштабирования, потому что иногда, когда запускались крупные рекламные рассылки, консьюмер, который непосредственно обрабатывал эти смски, сильно запаздывал, потому
77: Что есть временной диапазон, в который надо уложиться.
78: Но иногда вместо, ну, допустимого часового опоздания, иногда это доходило до полутора часов.
79: Проблемы там разные были проблемы, проблемы клиентские. Там, когда неправильно записывалась база данных, текст СМС, текст смски, когда там эмоджи сохра присутствовал в тексте.
80: Date a. Отправка смсок. У вас как была реализована отправка смсок. Это был сторонний модуль, то есть конкретно этот сервис, он занимался непосредственно формированием текста смски. То есть это могли присутствовать шаблоны там.
81: В какое расписание отправлять юридическая информация для отдельных категорий клиентов непосредственно самой рассылкой занимался сторонний билайновский сервис, который, на который мы почти не
82: То есть мы занимались непосредственно самим формированием и отправки этого шаблона в сервис консьюмер, чтобы он отправлял смски. Угу. Если вот брать те задачи, которыми мы занимались в билайне,
83: Какая задача является там, не знаю, вашим самым большим успехом, чем вы там гордитесь. Была ли такая как-то, наверное, все не вспомнишь. Может быть нет. Ну я ж не прошу все какую-нибудь
84: Может быть, вот последняя задача, которую я в конце января начале февраля закончил, это вот реализация приёма по системе быстрых платежей.
85: То есть это я написал, то есть оно стабильно работало, было написано в спешке, почти без документации, то есть просто системный аналитик показал в постмане, какие запросы надо отправить и со словами.
86: Нужно, чтобы оно работало через 2 недели, через 2 недели это все работало, и клиенты уже могли пополнять свой баланс через СБП.
87: Слушайте, ну это круто, хорошо. А какая самая большая? Ну не знаю, неудача или, может быть, что-то такое. Ну да, бывает там, не знаю, какие-то неудачные вещи.
88: Однажды ночью положил продуктовую базу у этого сервиса.
89: А как такое произошло? Надо было удалять пачками, там просто у нас в базе ещё хранились архивные данные по каким-то сущностям, изменениям и появилась задача на то, чтобы это все, ну, очистить.
90: То есть написали скрипт очистки его, видимо, когда-то там ночью запускали, да, он запустился, и в итоге лог транзакции раздулся, и все, все встало. Ну, это, к счастью, это ночью было в октябре месяце.
91: Там не было никаких. Ну вот это то, что запомнилось, можно сказать, хорошо. А самое интересное то, какие выводы из этого сделали, то, что нужно удалять пачками, а не разом удалять миллиард.
92: Сущностей.
93: Угу, хорошо. Но это, кстати, вот интересный опыт. Я думаю, у многих такой, такой был в карьере, предположим, не такой, но схожий. Давайте поговорим про команду, в которой вы сейчас
94: Работаете или вы же до сих пор работаете в билайне, правильно? Нет, я уволился в апреле месяце по команде, там вот. Ну то есть было 2 параллельных проекта, то есть на 1, ну, не то, что я был конкретно, постоянно на
95: Проекте только выделен, это там иногда 90 на 10, иногда там 50 на 50 Шёл в зависимости от того, где более необходимы ресурсы для выполнения задач и по команде на рекламном сервисе, ну, который занимался
96: Смсками. Это было 3 бэкенда, 3 фронтенда, 2 системных аналитика и россыпь тестеров касательно билинга. Это был системный аналитик и бэкендер. Я
97: О чем ещё упомянуть, какие инструменты используете?
98: Там у нас использовался гитлаб. Ну, кубер использовался для деплоя с дженкинсом. А почему дженкинс отдельно, если есть функционал в гитлабе соответствующий?
99: Да, уже особенности билайна. Там так получилось, что у билайна есть своя девопс структура. Ну, я в неё не лез просто как бы, ну, как, как это было. И мы наша роль, как нашего, ну, в принципе, айти отдела.
100: Который в принципе является потребителем айти услуг билайна дают нам gitlab дают нам пространство в этом гитлабе и мы просто им пользуемся, но не сильно его настраиваем то есть там чуть чуть можно было настраивать ну вот видимо в билайне решили что
101: Больше инструментов нужно ещё больше. Угу. Скажите, а почему ушли? Наверное, мне надоел проект? Наверное, надоела поддержка и просто захотелось отдохнуть летом.
102: И как успешно отдохнули? Хорошо. Скажите, а что ищите?
103: Наверное, интересный проект, где есть какой-нибудь хайлоуд, потому что, ну, в тех задачах, где я был относительно, он иногда присутствовал, но в целом, я бы не сказал, что там было прям много и
104: И некоторые вещи были сделаны неоптимально, которые не стреляли только из за того, что они часто, ну, не использовались под высокой нагрузкой. Вот хочется скорее, вот как-то больше хай.
105: Поводу вернуться или
106: Как-то вот в эту сторону. А, hello, в вашем понимании это что? Ну не знаю, там какой объём баз приблизительно или там, не знаю какое количество запросов. Ну вот например в биллинге это было вот всего в
107: В районе 20 запросов в минуту. Вот хотелось бы что-то хотя бы, если 100 запросов в минуту
108: Хотя бы.
109: Ну, потому что 20 запросов в минуту, сами понимаете, что это как бы, ну, не сильно много.
110: Ну смотря какие каких запросов, если запрос тяжёлый может быть и много ну это понятно, там достаточно тривиальные были запросы обратиться к бд, вытащить json там или что-то с ним, или записать json или там выставить счёт не СБП, а обычный.
111: Ну, может это моё субъективное, но я там не чувствовал как-то сильно такого.
112: Halo да, как? Ну и в принципе, как шар разработчик развиваться хорошо, с этим понятно. А вот как бы чего точно не хотите.
113: Наверное, вот когда нет понимания, к чему вообще, к чему мы движемся, какая конечная цель того, что мы делаем, потому что бывало такое зачастую, что, ну, де,
114: Задачу делаешь, делаешь и, ну, походу она уже умерла, то есть, как бы, хотел бизнес, но уже не хочет бизнес. Вот, че то делаем, делаем куда-то развиваемся. А вот, ну, касательно продукта, но вот конечной целью особо
115: Нет, рудмап есть, но переписываются.
116: Ну то есть какой-то, какого-то фидбэка от руководства вообще, в принципе, куда двигается, двигаемся и с продуктом, и. Угу. Что-то ещё, да, наверное, нет.
117: Окей.
118: Давайте мы попишем какой-нибудь код. Как вам предложение. Давайте я ссылку пришлю в чатик.
119: Попробуйте открыть открывается нет.
120: Сейчас открою.
121: Да, открылось. А напишите че-нибудь проверить. Работает, не работает. О, красота. Я вас вижу. Давайте с какой-нибудь простенькой задачки начнём.
122: Так, родная.
123: It условия, если что, задавайте вопросы. Угу.
124: Наверное, понятно.
125: Я просто не помню, как на високосном будет в переводе на английский, поэтому лип. Угу.
126: Так.
127: Ну, не оптимальный код, я просто пишу. Не, а давайте мы начнём с любого кода. Окей, если
128: Если он равен.
129: Hack собесов точка ком. Собес станет пустяком.
130: Сейчас я че то задумался. Сейчас.
131: Давайте я немножко подскажу. Вот ваш, ваш 1 подход был более перспективный.
132: Сейчас я вернусь к 1 подходу.
133: Теперь он завис.
134: Попробуйте f5 нажать, я думаю, она отвиснет.
135: Да. Так, сейчас вернёмся к
136: Открывать новую вкладку.
137: Нет, может, новый код шарта начнём?
138: Не очень дружит с контрол зет. Хорошо, давайте.
139: Нет, смотрите, я нажал, f5, у меня обновилась страничка, и тоже это, это недолго просуществовало. Хорошо, давайте я сделаю новый, мне не трудно.
140: Держите ссылочку, но постараемся контрол зет больше не жать.
141: Так.
142: Так, если у нас делится, если у нас 400 с нулевым остатком, но если номер года кратен 100, то невысокосный, если
143: Видно экран. Правильно? Да, конечно, если он кратен сотне 0 тонный, это правильно.
144: Так, ой.
145: Хотя.
146: Не, наверное, вот эта ветка 2, весь 2 if не нужен. Ну, сначала в него зайдём. Сейчас, сейчас все, все, все верно. Сейчас с этим ифом вложенным нет, вы верно говорите? То есть, если число кратное,
147: Четырехста, то есть она делится нацело на 400. Очевидно, что она нацело делится и на 100. Так теперь если
148: Невысокосный.
149: К примеру.
150: Да, похоже на правду. Можно, конечно, попытаться ещё свернуть условия. Угу. Сейчас можно сейчас.
151: Ну, например, смотрите, давайте так. What Лёгкая оптимизация, как можно упростить строчки с 19 по 23?
152: Прям очень, очень прямолинейная вещь, да, то есть, если return your разделить на 4 равно
153: Ну вот такое можно, то есть если он високосный, тогда ну выполнится это сравнение тру, и тогда оно вернёт true.
154: Да, окей, давайте тогда с 21 по 26 удалим, чтобы получить финальный вариант.
155: Я тут боюсь выделять по клавишам. Так, дальше, да, вот как это можно все или не знаю, а это сделает.
156: Код более читаемый, как вы думаете, я думаю, можно было бы вызвать стандартную функцию не со стандартными функциями, не интересно более читаемым.
157: Я думаю, не совсем, то есть тут понятно ну в какую ветку, из какой ветки у нас выйдет true false. Если мы будем писать тесты, то у нас, наверное, только в прошлой студии.
158: Ну, грубо говоря, вот когда у нас в студии пишем тесты, там подсвечивается, в какие ветки у нас покрыты тестами. Угу. Такое есть. А тут это может быть, не совсем очевидно. Ну, то есть, если мы вот сольём вот, вот эти 2 условия, первые 2 ифа, то мы можем
159: Пропустить проверку какого-либо кейса. Хорошо, я согласен с этим аргументом. Давайте представим, что мы работаем в команде, где кругом сплошные олимпиадники по программированию, и они говорят, это можно сделать.
160: 1 строчкой. Вот на ревью вам такое написали, я там будет несколько тернарных операторов, по всей видимости, я примерно понимаю, как код должен выглядеть. А давайте попробуем написать. Ну просто вот я понимаю.
161: Просто на работе это было, не видел часто. Угу. Сейчас.
162: Давайте старый вариант оставим, не будем его удалять. Мне кажется, можно свернуть в 1 условие. Можно просто это настолько все выглядит, когда ты читаешь. Особенно утром в понедельник. Так?
163: Ну, допустим.
164: Так, если оно, если мне кажется, тернарные операторы здесь без надобности, ну то есть можно воспользоваться прям правилами булевской логики.
165: Попробовать вот эти вот это вот нет, это, это я понял. Ну давайте, может быть, даже без них, без них сейчас.
166: Ну вот вы начали с самого простого условия и правильно сделали. То есть, если год кратен 400, то метод у нас что должен вернуть?
167: Если он красен 400, то верни true правильно, соответственно, вот это условие мы уже написали надо сцепить его каким-то образом со следующими проверками.
168: Допустим.
169: То есть, если инвертируем это условие.
170: Хотя, наверное, нам и не надо его инвертировать, хотя нет, надо.
171: Может быть лучше не на 100 проверить сначала на что-то другое. Какие у нас ещё есть варианты там по поводу 4? Сейчас тогда нет, нет, вот, вот этот вот или тут был к месту, мне кажется.
172: Сейчас, сейчас, сейчас.
173: Значит, мы проверяем на 400 и на 4.
174: Так, значит, это условие всегда выполнится, когда у нас есть високосный год?
175: И, наверное, здесь тогда нужно и и вот условия со 100, а здесь ли нужно, давайте внимательно условия прочитаем.
176: Его в начало переместить? Нет, ну смотрите, вот если номер года кратен 4, то он високосный, кроме случая, когда он при этом же кратен, 100.
177: Вот у вас правая часть проверки, где вы проверили, что год кратен 4. Туда надо добавить ещё 1 проверку, что он при этом не кратен 100. И мне кажется, вы получите уже финальный вариант.
178: Или это надо инвертировать, это передер, что или надо инвертировать передер эту историю?
179: Нет, мне кажется, все хорошо. Ну, в реальности мы бы написали какие-нибудь тесты и проверили бы это, юни тестами, но, мне кажется, наши воображаемые олимпиадники были бы довольны таким решением, то есть просто
180: Я вот, ну, как бы, минутка самооправдания, просто я бы, наверное, ну, написал, ну, сначала я остановился бы вот на этом варианте, написал бы тесты, и потом я бы вот начал бы вот этим заниматься, чтобы, когда у меня были тесты, понимать, что оно вот не это.
181: Не сломалось по пути, потому что это, ну, сходу тяжело написать. Если. Слушайте, а вы, ну, с чем на практике работали при написании юнит Тестов энн юнит н юнит используете, а какие-нибудь вспомогательны?
182: Инструменты есть в библиотеке, фреймворке. Ну, мог. Классическая, там шутли, ну, для, в качестве осерта, для, для проверки.
183: А расскажите, для чего надо использовать? Мог? Мог. Нам позволяет изолировать функционал. И более важно. Он позволяет нам симулировать поведение какого
184: Либо класса, то есть, если нам нужно проверить, что сервис там, ну, допустим, сервис возвращает айдишник, то нам не нужно обязательно, ну, поднимать всю инфрастру.
185: Структуру с базой данных и прочее. А мы можем замокать этот интерфейс, чтобы он нам возвращал конкретный айдишник. То есть мы можем таким образом проверить поведение в разных кейсах.
186: Хорошо. Вот, кстати, про разные кейсы. Смотрите, мы напишем юнит тест. У нас есть как же это по-русски то называется system under тест? Ну то есть кусочек тестируемого функционала.
187: С точки зрения вот этой практики модульного тестирования, какие есть результаты работы тестируемого функционала, то есть что мы можем проверять
188: В смысле, какие сайт эффекты можно приложить или о чем? Нет? Почему не сайт эффекты? Вот у нас есть какой-то маленький кусочек нашей системы, которую мы изолировали от окружающих зависимостей с помощью, как вы сказали, мокка.
189: Мы проверяем, как она работает. Ну то есть корректно она работает или некорректно. То есть мы делаем вызов и проверяем результат этого вызова есть 3.
190: Как бы Чистых варианта, ну и соответственно, какие-то смешанные комбинации того, что является результатом работы системы тестируемой. Ну давайте я подскажу 1, если мы вызываем какой-то метод, он нам возвращает значение
191: Это самый простой случай. Мы вызвали метод, передав какие-то параметры, получили возвращаемое значение. И. Угу. Проверяем. Ну, сверяем его с тем, которое ожидается. 2 оставшихся варианта.
192: Это какие видео и задачи с реальных собеседований на сайте хак собесов, точка ком. Хватит гадать, что вас ждёт. Ну, это переходите и получите преимущество перед другими кандидатами прямо сейчас.
193: Я просто, наверное, как сказать, ну, не сталкивался именно с тем, чтобы, ну, по какой-то методике писать. То есть, есть просто вот стандартный, как бы, ну, подход это. Угу. Рейнж, акт аирт. И вот мы подготавливаем, мы
194: Делаем какое-то действие, там с методом, там, с конструктором неважно. И проверяем, что у нас появилось в качестве возврата значения, что у нас, какие там, допустим, методы дёрнулись у переданных зави,
195: А вот так академически, что у нас должно именно вот 3 вариа, что у нас должно 3 удовлетвориться, я, наверное, сейчас не смогу подсказать. Окей, хорошо, смотрите, давайте представим, что сказать, если там как-то вот наведёте, но я сейчас не смог
196: Могу, наверное, это как-то предположить, да, я могу сказать, это изменение состояния тестируемого объекта, внутреннее состояние. Угу. И 3, это вызов этим объектам внешних зависимостей. То есть вот они как
197: По мере нарастания сложности проверки таким образом растут. Давайте представим, что я, молодой начинающий разработчик, пришёл к вам за советом, говорю, посоветуйте мне, пожалуйста, книжку.
198: Тестирование чего вы мне посоветуете?
199: А может, не книжку, не знаю, что посоветуете, пускай почитает по
200: Направлению тест девелопмент кента Бека, правильно, кента Бека.
201: Кажется, да. А вы читали сами чуть чуть. А в чем там фишка? В том, что, ну, прям фундаментальная или там нет? Вот я не знаю, какая-то, как сейчас попробую сформулировать.
202: Он наглядно показывает суть метода test driving девелопмент но вот на каком примере он показывает.
203: На каком примере он показывает, да, там прям очень, очень элегантно. Не, сейчас не смогу сказать конкретно, на каком примере он это показывает. Окей. Хорошо, давайте ещё 1 задачку решим. Угу. Туда же.
204: Оставляя, да? Ага.
205: Так, главное, чтоб нет, теперь у меня снова сломалось. Подождите.
206: Видимо, он очень не любит горячие клавиши. Ну да.
207: Видите ли, вы код, да, смотрите, задачка такого плана у нас. Нам нужно сделать очередь стандартную очередь, которая реализует 2 операции. Можно
208: Поставить Элемент в хвост очереди и извлечь его из головы.
209: В очереди, в очереди. Да, да, да. То есть очередь работает по принципу. 1 пришёл, 1 вышел, как в поликлинике, но правда, в поликлинике бывает, что ты
210: Пришёл и уже к врачу так и не вышел.
211: В чем особенность этой задачи нужно сделать очередь, опираясь на 2 стека то есть у вас есть 2 стека с типичными операциями, которые там есть пуш поп там try поп, я их там.
212: Снизу перечислил. Вы можете использовать другие, то есть там какие, какие, какие хотите, какие считаете нужным и сделать 2 операции. Очереди. 1 ставит элемент в конец очереди, 2 извлекает из головы.
213: Задача интересная с точки зрения подумать, покрутить разные варианты.
214: Да, сейчас.
215: Ну, стек у нас стандартный, то есть мы как положили сверху, так мы только сверху и сможем извлечь.
216: Ну, а как ещё stack работает, я просто уточняю, мало ли, может, есть какие-то ещё требования? Нет, нет, это даже стандартный стек из стандартных дотнетовский коллекций. Угу.
217: Можно предположить как
218: Мы же class её тоже можем редактировать, правильно? Да. Смотрите, вот сверху класс, ет, the cure, и нам нужно написать прямо там 2 метода, да, смотрите, нижележащие имеет стек, это в своей, ну,
219: Да, да, да, да. Вот смотрите, 2 метода. 1 метод mq с 9 по 12 строчку, он сейчас написан, вот его нужно реализовать. И, соответственно, метод де que, который извлекает элемент из очереди с 21.
220: По 24. Угу. Вот.
221: Так, ну можно начать с малого.
222: Так ставим её в очередь.
223: Так, то есть, ну, для примера, допустим, зашёл у нас человек.
224: Он попал у нас в 1 стек, мы его ставим в эту очередь, ну, в стек, я имею ввиду, на 11 строке.
225: Пришла очередь ему попасть к врачу.
226: Просто их тут несколько.
227: Ну, просто для примера, что вот из себя может представлять. А покажите, где вершина на всякий случай, чтобы я понимал вас. Угу. Сейчас. То есть, вот 1, вот 1 пришёл 1, 3 пришёл, вот последним.
228: Как? Ну, пускай это будет в вершина. Ну нет, ну вершина же это мы кладём на вершину стек и снимаем с вершины. То есть, получается у вас на вершине троечка, на вершине троечки, ну, 1 туда.
229: Stack 1 пришёл 1. Ну хорошо, да, хорошо. После этого мы хотим, чтобы у нас 1 зашёл в эту, ну, 1 вышел, 1 зашёл, 1 вышел.
230: Мы должны проверить, что
231: Так, а.
232: Я не помню точно, какие методы есть, поэтому я в целом, вы можете посмотреть не буду. Хорошо. Ну, в целом никто не мешает считать, что нет. У стека есть свойства, показывающие количество
233: Нет, это не противоречит теории, в принципе, к тому же это все равно, а должен это быть.
234: Он себе это реализует так, если у него только 1, тогда мы, соответственно, возвращаем только ретан. Так, а какой там поп?
235: Если.
236: Если стек, а я пока не оптимально пишу без этих трапов и прочее, потом к этому вернусь стейк аккаунт.
237: Count, равно нулю возвращаем. Ничего. Так, я думаю, тут лучше выбрасывать исключение. Инвалид, оперейшен эксепшн. Кстати, это в 21 строчке написано.
238: Ну да, я б потом бы это, посмотрел бы на это обязательно сейчас.
239: Теперь получается, если у нас
240: В стеке, а больше 1 значения, что у нас должно произойти, мы должны
241: Извлечь.
242: Все записи из стека, а?
243: Сейчас я подумаю.
244: Так, здесь у нас появляется единица, я перепишу сейчас код, мне просто надо подумать. Да, да, я вас не тороплю.
245: После этого так.
246: Так, примерно понятно.
247: Стек б.
248: Push. Стек. А поп. Угу.
249: И теперь.
250: Должно, вот такая, должно так работать.
251: Или это нужно ещё в программе, че то тут, ну, в мейне написать не зачем, в мейне не надо. Это просто. Угу. Для примера. Ну, примерно понятно, да, что вот я хотел примерно примерно понятно.
252: Мне кажется, тут есть пространство для оптимизации. Ошибка. Ну и пространство, как это можно сделать? Наверное, есть. Лучше давайте попробуем про это поговорить.
253: Смотрите, вот после того, как вы написали вот эти вот циклы с 30 по 40 строчки. Угу. Вот этот вот кусочек с 24 по 28 строку on разве?
254: Ещё нужен.
255: С 34 по, с 24 вот эти вот проверка количества элементов, если это 1 элемент, если не 1.
256: В принципе.
257: Нет, не, ну вот этот, наверное, нужен вот 28.
258: Вы имеете в виду вот этот 1, вот этот if с 24 по 27, правильно? Да, да. Весь вот этот, о, я просто писал, как, как, не, не, ok, смотрите, вот мы получили какое-то решение, давайте его немножко покрутим.
259: Вот этот кусок. Давайте его прям прям удалим, чтобы он нам не мешался.
260: Так теперь с elsa.
261: Угу. На 24 строчку, да, сейчас.
262: Так, мне кажется, что и вот эта проверка, на которой у вас сейчас стоит курсор 24, она не нужна.
263: Потому что, потому что в 30 строке, ну вот смотрите, штатные методы стека, которые вы использовали, это методы, метод поп, то есть метод, извлекающий элемент с вершины стека, а он уже, он выбрасывает, да.
264: Operation эксепшен в случае, если элемента нет. То есть давайте представим, что у нас пришла коллекция с нулевым, Коли не так, что мы вызвали метод дикью в пуст.
265: Очереди, что при этом произойдёт. Расскажите, пожалуйста, представим, что 24 строчке вот этого проверки нету.
266: Получается. Ну вот этот метод, он, ну, никак не выполнится. Угу. А, ну и на поп он тогда должен упасть, да, выбросит исключение, то есть.
267: Демонстрирует штатное поведение. Соответственно, 24 строку тоже можно убрать. Угу. Я просто со стеком не часто работал.
268: Поэтому я такой не совсем хак собесов, точка ком. А смотрите, там снизу написано, какие основные методы у него есть. Да, просто не знал, что он вернёт. Ну, возбудится.
269: Когда нет, ну, когда в стеке нет этих стек пустой. Угу. Хорошо. Давайте посмотрим вот те методы, которые снизу я написал. Попробуем с ними притянуть. Нет, просто адаптировать у вас решении.
270: Более менее правильно. Мне кажется, за исключением 1 момента. Угу. Так.
271: Вот смотрите о, имеется в виду как во вот давайте попробуем 1 из циклов. Ну, начнём с 1 цикла использовать там метод try поп, мы же, по сути что делаем, мы берём вот в вашем решении и извлекаем
272: Все элементы из 1 стека, точнее не так. Перекладываем все элементы из стека, а в stack б, да, пока элементы в стеке, а не кончатся, давайте элементы в стеке, а пока не останется 1 элемент в стеке, а потому что я
273: Я перебрасываю вот все записи стека, а, и оставляю только 1, который и возвращаю. Угу. Окей, тогда, наверное, решение даже ошибки не содержит. Тут я не внимательно посмотрел. Я вот просто вот внизу вот написал, что вот. Угу.
274: Вот, как вот оно будет выглядеть. То есть сначала вот у меня есть 3, 2, 1. То есть 1, 1 пришёл 1 в стек, записал. Угу. После этого я в стеке б, в цикле перебрасываю вот это запись вот в 2 и 3. Вот.
275: Стек б переношу. Появляется вот 1, на который вот в 28 строке, это вот единица из стека, а я её беру, и потом я стек, а возвращаю в положение, которое у меня было до, ну, до начала, вот всего.
276: Хорошо, окей.
277: Давайте попробуем. Хотя, ладно, давайте не будем пробовать в целом ваше решение. Понятно. Скажите, это единственное решение или есть ещё какое-то?
278: Я вот прям сейчас сходу не смогу сказать, что это не единственное решение. Если я подумаю, там, я, я потом подумаю над тем, как это можно сделать нормально. Ну, после, нет, подожди, оно, оно сделано нормально, как, как переписать его, чтобы оно был
279: Как более быструю работу или что? Не, нет, нет, нет. Вот вы использовали подход, когда при постановке в очередь вы сразу добавляете элемент в 1 из стеков. Правильно? Да.
280: А при, при извлечении перекладываете, угу. Со стека на стек и потом как бы возвращаете обратно, да, можно ли сделать наоборот?
281: Чтобы при добавлении элемента в конец очереди мы вот всю эту возню со стеками делали напри, а извлечение элемента было быстрым.
282: Можно сделать, да, просто это надо. Угу. Будет инвертировать этот подход, но его, ну, там, получается, это, это зеркальная история. Да, это можно так хорошо. Эльдар, скажи.
283: У тебя есть вопросы?
284: Так, ну окей, да, слышно, погонял я немножко, наверное, у, потрогаю, погоняю под знаком, да, вам чуть чуть?
285: Не особо чуть чуть, наверное, больше. Угу. Ну, будем, значит, разговаривать с точки зрения. У нас в целом, в компании сначала, в 1 очередь, была экспертиза, и последние, получается, 21 года где-то начали переходить.
286: На. Угу. В принципе, то и то нормально, хорошо. Чем занимались запросы, писал иногда хранимки, Миграция.
287: Угу. А вот эти вот, которые запросы, ну то есть какой сложностью они были, не знаю, приходилось ли заниматься оптимизацией. То есть вообще какие операции были? Иногда, очень редко приходилось заниматься.
288: Оптимизацией. Ну, не часто по сложности запросов. Ну, несколько джоинов вложено, запрос, то есть сложные запросы не писали. Ну, что мы понимаем под сложными запросами, когда там есть ситиэй, вот это, ну,
289: Что просто может быть, я не совсем понимаю вопрос сложности для кого-то 2 джоина это уже сложно. Ну, сейчас, допустим, для нас, что это сложно, так как мы работаем с большим объёмом данных. В 1 очередь запросы входят в таблицы, в которых очень много
290: Данных, мы их очень быстро забираем и над ними обработки разные делаем, так как, естественно, мы не храним сами показатели, показатели очень часто на лету рассчитываем, потому что сами данные могут поменяться. Вот агрегаты мы какие-то пересчитываем, бывает так, но очень часто на момент
291: Нужно ещё какие-то данные успеть обсчитать. То есть всякие агрегации могут быть группировки, имею ввиду вот какие-то рекурсивные вычисления с помощью тех же самых
292: Угу. Бывает так, что мы достаточно по большому объёму разных таблиц ходим. То есть собираются данные, там, не знаю, из 8 или там из 12 таблиц, каждая из которых хранит где-то там.
293: Миллиарды записей. Угу. Миллиарды. Вот. И там выборкой мы при этом обследуем в каждой из них, ну, по меньшей мере, там, по 500000000 прорабатываем. Угу. Соответственно, в 1 запрос.
294: Иногда просто тяжело собрать, то есть в использовать. Приятно, что за нас там эксперт пишет, но собрать такой 1 эскэль не получается. То есть надо как-то разбить на разные предвычисления, как-то поэтапно.
295: То, что нам нужно вот такие вот вещи делаем, с индексом играемся очень много, по разному. То есть у нас индекс вот есть ребята, которые, не знаю, там разных запросов, допустим, 50 в системе, которая там в какую-то таблицу большую входит, они берут и 50.
296: Втыкают. Мы, естественно, делаем где-то 4, 5 индексов всего лишь вот потому что вот эти вот 50 нас убивают, когда мы начинаем помимо читать ещё что-то делать, допустим, записывать, удалять, редактировать. Вот там тож.
297: То есть мы понимаем, как эти индексы работают, что на что поменять. Вот почему мы используем здесь составное, здесь вообще не используем индекс, например, в некоторых случаях, когда и как мы это делаем. Вот, вот это для нас это сложный вопрос. Допустим, контекст верхнего уровня.
298: Контекст нижнего прокидываем для того, чтобы выборки по запросах ускорить. Угу. Это более менее, так скажем, средней руки. Пока ещё сложности я сейчас назвал. Угу. Понятно. Вот этими всем.
299: Я думаю, в какой-то мере, да, в какой-то мере.
300: Ну, то есть понимание индексов, что, как сказать, вот если опять-таки вернуться к индексам, что стоит все-таки отталкиваться от того, когда строить, какие индексы, где их применять, зависит от того, как мы используем
301: Ну, какие запросы у нас применяются в базе данных? Какая динамика это использования таблиц. А индексы, вы сами понимаете, да, для чего они нужны? Что такое индекс, да? Угу. Мы так, чем отличается там, кластерные от неё кластерного?
302: Ну или касторовый его. Ну да, кластерный, он можно создать 1 из за того, что он меняет в себе, ну, меняет не в себе, а меняет физически расположение записей в таблице, а не кластерный он, ну,
303: Больше 1 можно создать, поскольку это скорее указатель на, ну, на строчки в таблице, грубо говоря. Ну да, тогда вопрос такой. А первичный ключ праймери, который. Угу. И кластер.
304: Индекс это одно и то же. И получается, ну, чаще всего это одно и то же чаще всего. Ну, это значит, что бывают случаи, когда нет, да, ну, можно, ну, мне так кажется, что можно
305: Создать первичный ключ без кластерного индекса.
306: А можно создать так, чтобы в таблице был и первичный индекс, и кластерный, но чтобы кластерный и первичный были совершенно разными.
307: Давайте я пока остановлюсь на ответе нет.
308: Угу. Ты знаешь, что такое первичный ключ? Можно сказать, что это ключ, который уникально идентифицирует строку в таблице. То есть, смотри, нам нужно сделать
309: Тогда индекс в зависимости от того, что это такое и для чего. То есть, если у вас есть ограничения на заказ.
310: Сейчас я подумаю. Ну, тоже, наверное.
311: Если тоже, значит, тогда это одно и то же. Я сейчас просто, если. Угу. Ну, кластерный индекс все-таки здравоохранения в начале, вы очень правильно ответили, что поэтому бывает 2 потом, что они влият на её расположение и так далее.
312: Это, по сути дела, сортировка данных. То есть как они будут, где располагаться. Угу. Соответственно, означает, что именно кластерный, он чисто только за порядок. Угу.
313: Значит, можно создать 2 записи.
314: Который будет в кассовом индексе присутствовать, который просто 1 следом за другим будет находиться. Но за уникальность классный индекс не отвечает. А первичный ключ, вы правильно сказали? Это набор значений, который
315: В таблице уникальный.
316: Отсюда, собственно говоря, означает, что может быть ситуация, когда на таблице есть кластерный индекс, есть первичный, что это совершенно разные у. Смотри, короче, смотри, если
317: Понятно, бывают ли случаи, когда, ну вы оптимизируете запрос какой-то, вы сами его написали, сами причём написали. То есть вы все знаете о таблицах, на которые из которых вы select делаете, так скажем.
318: Вместе с джоином. Там у вас селект и джоин есть. И вот так получилось, что там и структуру знаете, и индексы все необходимые есть. Угу. Но запрос ваш в плане запросто, вы смотрите, не использует индекс, который вы создали у 2 таблицы, которую вы джойните.
319: И вот для вас всегда ли это норма, или это всегда не норма, или как бывает, бывает так, что иногда это норма, иногда это не норма, и от чего это зависит?
320: Допустим, там 2 поля. И вот Ровно по этим 2 полям у вас есть индекс, а я написал запрос, который никогда не использовал. Вы написали запрос, который вот вы заметили, сделали селект, план, запрос. Смотрите, а там не используется ваш индекс.
321: Именно по Ровно этим 2 полям, которые в этот входят. А индекс у меня 1 на 2 поля, да? Ну, оддо, ну, может быть, я просто перепутал очерёдность этих. Вот вы прям абсолютно верно все написали. Вы специально прям
322: Создавали индекс под этот запрос.
323: Хороший вопрос.
324: Не, я просто, наверное, с таким не сталкивался. Угу. Так, тогда вопрос такой, к примеру, используется ваш индекс, как тогда, под капотом вообще, какие действия совершает и сервер, когда вы, к примеру, сейчас ещё проще.
325: 1 таблица, в ней есть 1 поле id, допустим, оно же первичный ключ, оно же входит в кластерный индекс. И вот, собственно говоря, по нему у вас есть индекс и вы теперь пытаетесь данные взять.
326: Из этой таблицы. Угу. Каким? О, хотя с этим, пардон, здесь я, наверное, слишком облегчил задачу забудем. У вас есть другой на другое поле, на котором у вас есть index. Ровно.
327: По этому индексу пытаетесь найти запись, то есть делаете селект, звёздочка, допустим, Фром, ваша таблица. Where именно ваше поле, которое в индекс входит равно какому-то значению в этом, в этой таблице, к примеру, все поля, точнее, все за
328: Все уникальны, по этому полю уже обеспечено все вы делаете равно и какое-то значение, допустим там 8. И вот вам данные показываются вот под капотом, как это происходит, что сначала происходит, что потом
329: Мы внутри индекса проверяем, какие, ну, получается, какие записи этого индекса удовлетворяют этому предикату.
330: Прям под капотом, там как со страничками это все, ну, ещё до страничек ещё пока вот индекс сначала, наверное, как-то ваш планировщик, вот путём там, определения статистики, ну.
331: Смотря на статистику, посмотря на, собственно говоря, поля, на условия, из какой из каких объектов это делает, читает, понимает, что он может использовать индекс.
332: По этому полю, потому что это поле используется в таблице. И вот он решил взять вот этот индекс, к примеру, он взял его дальше, потом в этом индексе по значению он пытается сделать поиск. Если это там биты, он там начинает пополам делить, то ещё
333: Пополам делить, ну и так далее, и так далее и доходит до вашего значения.
334: Да, в индексе находит потом, что происходит?
335: Ну, он ищет, ну, странички указывает вот эти записи в индексе, кто-то есть в индексе, что хранится, ну, указать вот, на, на что, ну, на страничке.
336: Ну, ну, где на страничке. Угу. Указатель на сами строки, получается, на сами строки, записи из первичной таблицы, на которые, собственно, навешаны, да. Так, потом что происходит? Значит, мы берём значение вот этого указателя.
337: Нему начинаем идти идти. Берём, собственно говоря, данные из таблицы, эти записи и берём остальные колонки. Ну то есть значение остальных колонок, которые в индекс не входят и так вытаскиваем. Правильно? Да, нет.
338: Если это вот так происходит, тогда вот, возвращаясь к моему предыдущему вопросу, ситуация, когда вы написали запрос, где вроде должен ваш индекс использоваться, а он не используется, ничто не, это не натолкнуло, индекс не перестроен.
339: Допустим, вы его перестроили, прям вот только что перестроили, а все равно не используется, что у тебя там. Ну, вы сейчас же сказали, что смотрите, у вас сам по себе вывод данных.
340: Поиск данных, когда селект, звёздочка, там какая таблица, ваши условия, оно происходит не просто, что сразу же данные забрались. Мы сначала пошли в индекс, взяли в индексе запись, нашли по ней указатели, указатели на основные записи, потом эти записи ещё поиска.
341: Нашли и забрали по этому показателю, то есть сколько паразитных вот этих вот действий лишних. Но если по статистике планировщик ваш понимает, что получить данные перебором просто по таблице,
342: Быстрее, чем ходить вот так вот в индекс, а потом ещё по нему, по указателю идти в основную таблицу, то он в таком случае ваш индекс использовать не будет, потому что оптимальнее будет сканить всю таблицу, если таблица небольшая.
343: Что необязательно использовать индекс, потому что операция будет по времени быстрее. Я поняла. Вот в этом весь смысл. Окей, рекурсии, как решаете, допустим,
344: Вы этим занимаетесь. Ну, вы, вы пишите рекурсивные эти, ну, у вас там прям сильно рекурсивные эти есть, смотрите, не сильно. Я просто смотрю, насколько у вас навыки. Моя задача посмотреть на
345: У нас есть задача, к примеру, календарь заполнить. Угу. Календарь могут заполнять за какой-то период. В календаре есть 1065 дней в году за какой-то период. Соответственно, мы заполняем несколько лет, к примеру, календаря, нам и нужно вычислить какие-то поля, допустим, по каждой дате.
346: Узнать, что, какой день недели, вот номер в квартале, ну и так далее, и так далее. То есть поля вот эти вот заполнить для того, чтобы их потом где-то на календарь джоне вытаскивать нужные нам данные, соответственно, вот просто знаем, знаете такие операции или нет.
347: Использовали, не использовали, хорошо использовал. Но, ну, это, помните такие вещи. Да, да. Вот, собственно говоря, там это дело используется. Оконные функции исполь.
348: Да, для пейджинга это иногда использовал. Какие, к примеру,
349: Over просто смотрите я эту штуку вообще то есть я пошёл аналитику та ну он не для пейджин использовался, лак использовал.
350: Угу. Рядом с ним ещё сосед лид, да? Угу.
351: Ранг использовался. Угу. И, наверное, ролл намбер ещё использовался, да, вот его я использовал для этого, для пейджинга. Угу. Хорошо. Так.
352: Джоины, ну есть стандартные, мы все знаем, есть inner join, left outer join, right, outer join full join, да, вот это auto и какие-то наверное ещё есть способы присоединения таблиц какие-то какие?
353: Можно после from перечислить таблицу. Так, ну это аналог чего будет? Это будет аналог джоина. Угу. Ну то есть это опять джоин, да? А что ещё?
354: Вопрос в том, как нам, какие ещё бывают, а какие ещё бывают джоины сейчас? Угу.
355: Ну, способ присоединения, да, способы присоединения сейчас.
356: Вот я несколько перечислил, может быть ещё какие-то, знаете.
357: Допустим, когда вам надо, да, произведение получить значения 1 или 2 таблицы.
358: 1 на другое перемножить.
359: Вот вы уже сказали, что вы, в принципе, 2 таблицу перечислить вам по факту из 1 и со 2 выдастся данные. Угу.
360: Вот. Или ещё можно такой кросс Джой да, такой есть ага. А вот если все-таки с контекстом поиграться. То есть есть такие, наверное, вещи, как cross play и out play пользовались?
361: Да, он нужен для того, чтобы представить, как сказать, под запрос, как таблицу, как это сформулировать то? Ну то есть вот мы как бы пишем оператор кросспла.
362: В нём запрос мы можем использовать результат вот этого, вот этого cross play, внутри этого запроса как, как табличное значение чем отличается от джоина обычного?
363: Тем, что он, как сказать то?
364: Вы же жене тоже можете написать скобочка внутри под запрос, и потом к нему, к результату то сделать, если не ошибаюсь, джойн, он должен, ну, чаще всего он сопоставляется с, ну, между ключами, а кросспла может не сопоставляться, да, ла.
365: Ну в общем, тогда я не знаю как, как это, ну как раз-таки там с контекстом очень хорошо дело обстоит, что можно аналог того же джоина или Лев джоина ну out я имею ввиду, но можно ещё и контекст пробрасывать внутрь.
366: Просто это будет аналог join ауто аналог там auto джоин. Угу. Окей, хорошо. Ну я просто почему спрашиваю, этим вам конкретно меньше предстоит, просто насколько вы хорошо знаете вот эти вот особенности и то, как потом
367: Если вдруг какие-то функции вам нужно с точки зрения продукта в платформе базово написать, насколько вы эти вещи как бы знаете, либо здесь нужна будет помощь. Так, окей, окей. Допустим, вот у вас есть база, да?
368: Там есть таблица какая-то, где уже несколько миллиардов записей есть. Теперь и так получилось, что у вас в дотнете появилась на руках коллекция из 2000000 экземпляров не сильно сложного большого класса аналогов, собственно говоря, вашей этой таблиц.
369: Которые в базе данных, то есть евка 1 в 1 прям все подходит. Наименование, типы сопоставляются ям, все хорошо. И вот вам надо теперь из дотнета в базу положить эту коллекцию. Причём вы, у вас условие, что аппаратных каких-то инфраструк
370: Ограничений у вас нет никаких. Сеть безумная, скорость диска прям шикарная. Никаких у вас блокировок никаких нет, только вы работаете, и в этой таблице уже есть несколько записей, но точно нету тех данных, которые
371: Вашей коллекции, а в вашей коллекции данные не повторяются. Задача вот положить быстро данные, то есть за буквально там 10, может быть, там 15 секунд. Обычно, если впрямую, то это делается там больше 30 минут. Что мешает это сделать быстро и как это
372: Обойти и сделать быстро.
373: Обычно, точнее, это делается долго или быстро. А как сделать быстро? Что мешает? Через что мешает? Угу.
374: Ну, то, что пытаемся, наверное, построчно делать. Ну, инверт в эту таблицу, может быть, это может помешать. И что вот если делаем построчно, что мешает, тогда почему я построчно не могу быстро записать?
375: Не, ну можете записать, значит, будет долго. Нет, а я вопрос как раз и задаю. А что мешает тогда это сделать быстро? То есть, почему долго происходит? Наверное, потому что постоянно появляется.
376: Ну то, что на каждую запись приходится ответ от бд ждать. Ну при принят обработан запрос, не обработан запрос. Так ещё что может быть?
377: Допустим, вам необходимо реализовать вот над таблицей операцию такую быстрой вставки, допустим, из экселя вам загружают, я не знаю, там, 600000 строк. Угу.
378: Да, и 2000000 на самом деле тоже могут там интом, если не ошибаюсь, ограничено количество строк в экселе. Вот вам пытаются или даже вот такой вот большой отдать. Если вы будете грузить там 30 минут, то пользователь, конечно, издевать станет, он хочет быстро, причём он там причесали.
379: Данные очень хорошо. Вот они хорошие, чистые. И вот он, типа, быстро ожидал, что это загрузится. А у вас как-то очень долго вот как сделать быстро, ну может сделать какой-то бач инверт этих записей, бак, ну да, бак инсерт.
380: Почему балк помогает, почему обычная не знаю там и взять update рейндж либо эд рейндж и коллекцию эту всю не плюнуть туда.
381: Ну е есть такое add range, да, либо update рейндж ну потому что earth будет там следить за контекстом, за тем, чтобы эти объекты создать в памяти.
382: Очистить это все, следить за тем, чтобы они все были обновлены там, то есть её мешает нам.
383: Ну, в том контексте, который вы хотите использовать. Ну, через update рейон может помешать. Нет, допустим, забыл про, решил написать через дунет.
384: Ну, можно через банк инверт это делать.
385: Я просто не понимаю, что конкретно вот в моём, ну почему, ну, здесь может помешать. Ну, почему медленно? Потому что когда мы работаем с записями на каждую из вот этих вот операций у вас будет пересчитываться индекс. Возможно, какие-то констрейнты будут отрабатывать в базе самой, то есть не до вашего ещё.
386: И это все занимает время обновление статистики. Ну, то есть блок транзакции все это занимает время. Вы сказали, банк, ну да, эта операция как раз позволяет вставлять, но делать все вот эти поразительные операции 1 раз на вставку. Угу. Они
387: Несколько раз, соответственно, это ускоряет, потом эти все они отработают, конечно, потому что база следит за консистентностью, но 1 раз они последовательно после каждой записи, поэтому это и быстрее происходит. Угу.
388: Окей, может быть есть вопросы мои закончились, наверное, я хотел бы все-таки вернуться к этой, ну, платформе, ну и продуктам просто не совсем понимаю, вот контекст, вот, вот используется ли entity фреймворк, используется ли, ну и где вот эти запросы, вот, то есть, как вот
389: Ну, код пишется конкретно, вот касательно базы, то есть, то есть, как вот мы с ней работаем, то есть у нас какой-то или, ну, много, большая часть пишется екой, вот помимо евки, если не ошибаюсь.
390: Да, кажется, используется библиотечка или какая, точно не помнишь? Нет, так сходу не скажу, но используется её достаточно активно. И причём довольно, довольно хитро в платформе. То есть мы, ну, по
391: Платформа это как бы вот инструмент для построения проектов. Мы приходим к заказчику, у заказчика есть уже какая-то своя база данных, в которой лежат там их накопленные за многие годы данные и в платформе.
392: Можно настроить соответствие сущностей таблицам в этой базе данных, настроить поля, и она автоматически генерирует.
393: По интерфейсам классы для работы с этими сущностями, в общем, ну, её используется, да, да, да. Ну, опять, чтобы его использовать, потому что это все-таки у нас в 1 очередь делает свои все-таки Зада.
394: Вначале пишет, нам надо понимать, что все вот эти вот запросы будут правильно написаны. А для этого надо знать специфику базы данных для того, чтобы даже вот эти дао, объекты, которые мы в дотнете написали, чтобы они правильно, потом ярко использовались.
395: А запросы вы пишите никем не, ну он же генерирует запросы. О, нет. Да, да, да. Но мы смотрим потом на него и если нужно его пытаемся корректировать, помогать ему, потому что если он будет стандартно там генерить,
396: В предыдущих версиях там 2 3 версии назад бывало так, что он оборачивал ещё 1 select на котором ещё свой ордер бай бросал дополнительный хотя ты его не хотел угу. И это прям вызывало пересортировку всего объёма данных и это до.
397: Долго, особенно, если ты топ 50 просто хочешь получить. Угу. И он сначала отсортирует тебе, а уже потом сделает топ 50. И это долго. Я думаю, я, соответственно, ему немножко помогать приходится в этой ситуации, но это помогать приходится тогда.
398: Когда мы знаем, что можно помочь. Угу. Я думаю, я вижу вопросов ещё, может, есть какие-то вопросы? Я думаю, нет. Угу. Для себя. Александр, вы какую вот сейчас работу ищете? Я
399: В билайне работали, я так понимаю, в билайне вы устали, я там читал, да? Ну, от переработок, от того, что однотипный проект, да, был от него развиваться в эту сторону, да, и этот
400: Компания, то есть на новом месте вы для себя ищите просто, чтобы был интересный проект и именно задачи чисто дотнета или что-то ещё в компании ищете. То есть, отбирая там из 5 или из 10 компаний, на что вы в 1 очередь там смотрите.
401: Наверное, насколько интересен проект, насколько он, что в нём интересного можно мне лично почерпнуть? Ну, то есть, например, как с базами данных сегодня было, сегодня, я много что узнал. И, то есть означает, что если вы взялись за проект и, к примеру, там квартал поработали,
402: И поняли, что вот этот квартал у вас в основном были задачи 1 и того же характера, то следующий квартал вы не будете работать. Ну, ну, вы решите, что вам это не интересно, и пойдёте искать другое, что значит 1 и того же характера. А я вот и
403: Хочу это узнать. То есть вот если у вас сейчас на текущий момент критерием того, что вот ушли от текущего проекта, что задачи по нему были однотипны, не знаю, там вы стандартно там занимались тем, что писали для каждого из из таблицы,
404: Какие-то DAU классы и обработчик под них или писали интерфейсы под для получения какой-то коллекции в api каком-то и вот стандартные там с 4 или там пятью этими рест апишками, методами и вот у вас
405: Больше чем это как бы работы не было или что ну что-то такое однотипное не понятно, но у меня там было много чем и другим заниматься, то есть там же не только пишешь там только rest методы и там json править, там нужно тарификацию было править, там нужно было править кодировку.
406: Который, когда у нас записывается, там, там были разнообразные задачи. Вот Александр, я же поэтому и пытаюсь получить информацию. То есть, что вот там это то, что вы сейчас говорите, вы много чем занимались, там не понравилось, и вы решили новое место поискать, и что ищете в новом. Вот.
407: Что должно быть, чтобы задачи, которые интересный проект и разнообразные задачи, если это возможно. Угу. Окей. Хорошо. То, что мы вот вам рассказали, какие у нас, какой у нас проект, какие у нас задачи, куда мы целимся, какой нам
408: Разработчик нужен. Какие специфики имеются? Это вам как бы импонирует или больше не импонирует? Я думаю, да, это интересно.
409: Этим заниматься. Понял? В случае там положительного решения, насколько быстро вы готовы подключиться? Я понимаю, что вы с той компании уже ушли, но, может быть, есть какие-то планы на ближайшее время или ещё что-то подключиться, ну то есть
410: Имеете ввиду выйти на работу, да? Ну a1 подключение, оно как будет? То есть это несколько месяцев надо ходить в офис или это удалённая работа? То есть, смотрите, у нас, у нас в этом плане гибрид на усмотрение самого сотрудника. То есть у нас нету обяза.
411: Посещение офиса. Угу. Хотите, придите. Вот есть свободное место. Сели, поработали. Хотите из дома, работайте из дома. Угу. Хотите, чтобы ваше место, где вы находитесь, было в рф, в рф. Хотите быть за границей? Будьте за границей. Неважно где. Главное, чтобы вы выполнили свою.
412: Работу. Угу. Качественный срок, я думаю, в течение нескольких дней.
413: Ну, то есть меня интересует удалёнка, ну, в течение нескольких дней.
414: Угу, понял. Вы как сами на текущий момент, я так понимаю, в активном поиске у вас есть какой-то, не знаю, там срок, до какого момента вы рассматриваете предложение? Нет, нет такого срока, что прям вот до, до
415: 15 августа. Ну, бывает так, что ребята себе поставили вот за 2 недели хочу найти, и вот какие будут предложения за 2 недели и уже после дальше не буду продлевать вот из тех, кто за 2 недели обратился, из тех, и выберу. Если pt как интересно, то да, я не буду дальше искать, что
416: Понял?
417: Хорошо, тогда у меня тоже вопросов нет.