Подготовка к собеседованию на DevOps
Менторы
Специалисты своей области, которые смогут помочь вам
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 каналы и чаты
Транскрипция видео:
в прошлом выпуске Всем привет Меня зовут Андрей Всем привет и начать можем с Linux тогда первый вопрос пиши пожалуйста этапы загрузки Linux Ну а какие бывают состояния процесса второй вопрос смотри нам приходит разработчик и говорит что у нас сервер лагает Вот как ты будешь проводить анализ прои Здравствуйте а яв и сегодня увидишь ПС инженера Я знаю тебе интересно поэтому наливай приятную для организма жидкость усаживаясь поудобнее погружаемся в мир собеседовани не забывай ставить лайки и писать
00:00:00 - 00:01:22
комментарии этим ты поможешь продвижении видео и сделаешь меня счастливым а Для начала я хочу сказать огромное спасибо за поддержку образовательного контента моих партнёров First vds если ты ищешь надёжный хостинг Обрати внимание на First vds это известный хостинг-провайдер который отличается надёжностью и низкими ценами у СТ vds есть как готовые тарифы так и настраиваемые конфигурации где можно докупить ресурс можно заказать высокопроизводительные сервера сервера с повышенной надёжностью и сервера с
00:00:41 - 00:01:46
большими дисками до 5.000 ГБ переходи по ссылке в описании ознакамливаться с предложениями там тебя ждёт двадцати пятипроцентный заказ А Андрей Ну давай тогда начнём с первого вопроса А раздел разработки в целом И начнём с протокола http что это за такой протокол и для чего он нужен HP Это протокол прикладного уровня которые используют приложение для обмена данными ой казна методы самые часто используемые это методы Get poch Delete там есть и другие но чаще всего обычно эти встречаются вот в практике по
00:01:13 - 00:03:04
крайней мере Угу хорошо какие коды ответа Ты знаешь Да есть неско семейств кодов ответа это п это обыч даже и нету это запрос в процессе если я ничего не путаю на практике я обычно их и не вижу ДСО коды ответа это успешные коды ответа они могут немножко различаться зависимости от от того что именно Мы хотим подчеркнуть это дирек о том запрос отправлен переправ Наго четырёх сотые коды ответа - это ошибки на стороне клиента то есть вот скорее всего если клиент что-то изменит в запросе будет шанс что запрос пройдёт
00:02:16 - 00:03:55
и в пятисотый - это ошибки на стороне сервера как правило это уже аварийные ситуации которые нужно отлавливать которых не должно возникать Вот но иногда бывает что это может быть связано тоже с каким-то вот неудачным запросом клиента просто который сервер не умеет обрабатывать клиент может сам поменяв запрос получить успешный ответ ну на какие например ты знаешь код ответа там чее или пятые Ну вот из пятих чаще встречаются собственно 500 Это внутренняя ошибка сервера как правило какое-нибудь необработанное исключение в которого
00:03:09 - 00:04:37
процесс на стране сервера у и не СГ вообще ничего Вторая ошибка обычно возникает на балансировке то есть это значит что балансировщик не смог Получить ответ от своего стрима также бывает 504 когда балансировщик не дождался ответа точнее случа 502 он получает ошибку от своего арима вот а в случае 504 он ждал ждал ждал так и не получил заны промежуток времени ответа не последовало среди семейства типовые 40 значит что клиент не предоставил учётные данные для аутентификации 403 означает что клиент
00:03:53 - 00:05:31
прошёл аутентификацию но не прошёл авторизацию то есть его права доступа кото для это ут запи став ресурсу 404 ресурс не найден то есть вот тот ресурс к которому обратился клиент он не существует либо на самом деле очень часто что к нему нет доступа то есть там скажем на Ну в крупных сервисах чтобы ну для целей безопасности мы не показываем клиенту то что это ресурс существует Но нет доступа для того чтобы не скажем раскрывать данные других клиентов потому что подбора лов можно попытаться узнать Вот какие у нас
00:04:50 - 00:06:16
есть Клиенты какие у них есть ресурсы и вот 44 позволяет тоже это дело закрыть Давайте остановимся ещё на методах потому что методы очень важны и расскажи Ну как бы хотя бы основные методы для чего они вообще нужны Так ну метод Get используется для получения информации то есть мы получаем в ответе кроме заголовков также и э тело ответа то есть мы получаем какую-то полезную информацию вот при в отличие от метода Get мы можем использовать также метод Head для того чтобы проверить доступность этого ресурса но не
00:05:33 - 00:06:58
загружать те то есть Скажем мы хотим проверить что у нас на сервере с артефактами лежит определённый архив И если мы проверяем вот доступно сейс метод Get мы вынуждены там скачивать весь большой архив чтобы это проверить а так мы можем делать запрос х убедиться что ответ 200 но не скачивать сам архив А Андрей Андрей прости А что скачивается в таком случае при методе что ты получаешь получаем в код ответа и статус запроса что он успешен и версию протокола по которой мы сделали запрос с помощью чего мы это получаем
00:06:16 - 00:07:42
Угу при помощи заголовков Нет нет это не заголовки не помню как правильно называется то есть там правильно называется да да зало ведь от слова Head заголовок не от слова голова поэтому дада да правильно также часто использу запрос пост он используется для того чтобы отправить данные на сервер для обработки то есть скажем у нас есть веб форма Мы в неё ввели данные дальше при помощи метода пост эти данные отсылаю на сервер и дальше там обрабатываются вот дальше уже если мы используем API Давай остановимся
00:06:58 - 00:08:38
чуть-чуть пост иге Чем отличается Ну именно в плане отправки данных в плане параметров в случает запроса параметры запроса находятся в адресной строке то есть мы в URL после знака вопрос в формате ключ равно значение имеем нашу строку запрос то скажем это удобно когда мы хотим дать ссылку на поисковую форму то есть мы посылаем коллеге ссылку с параметрами в адрес рки он её открывает и эти параметры подставляются уже в форму готовую для того чтобы получил такой же мы вот в случае же пост запроса все данные упаковываются в тело
00:07:50 - 00:09:22
запроса и Ну они таким образом не восстанавливаются как в случай гет запроса скажи такой ещё вопрос Вот мы гето можем на сервере что-то обновить Ну то есть это обязательно Мы только запрашиваем какой-то ресурс Или можем гето например что-то обновить или постом что-то запросить Ну ну я думаю что при желании мы можем написать логику веб-приложения потому что скажем если вот это Джанго приложение Ну или какое-нибудь приложение которое имеет раутио не мешает сказать что мы обрабатываем на данном ресурсе запрос
00:08:37 - 00:10:02
пост в этом контроллере А дальше пишем какую хотим бизнес логику там пишем базу данных делаем Что угодно то есть Это скорее конвенция которая позволяет при работе с API придерживаться определённых стандартов и уменьшать степень неожиданности от действий и и собственно вот в коды ответа - это то что нам помогает ээ работать с API и ээ с меньшими усилиями интегрироваться с другими сервисами и взаимодействовать с ними Ну хорошо я думаю по этой теме достаточно Да супер дальше тоже по поводу http Расскажи пожалуйста о версиях
00:09:22 - 00:10:53
http чем они друг от друга отличаются Какие ты знаешь так есть версия HP 1.0 2 из самых распространённых и чаще всего используется версия 1 потому что в отличие от версии 1.0 помню в ней поддерживается Суть в том что можно подключение передать неско скажем ЕС Мы открываем веб-страницу мы можем все данные получить за одну сессию без необходимости открывать сессии вот htp версии 2 он пом уже бинарный протокол и Он позволяет оптимальнее использовать в эту тему копа нерал когда-то об этом читал но на практике
00:10:07 - 00:11:52
обычно ставится либо 1 либо 2 того какие клиенты работают поддерживают ли они работу по 20 или нет Угу Вот поэтому если меня направити Дополните буду рад Да ты знаешь какие-нибудь преимущества http 2.0 перец о я вот прям по конкретики я сейчас сходу не отвечу А ну как минимум htp 2 он не блокирует соединение из-за этого он может это делать асинхронно предположим У тебя есть на ресурсе большое количество каких-то картинок и грубо говоря htp 1 и 1 он установит соединение tcp а затем спрашивает картиночка И ждёт пока эта картинка
00:11:04 - 00:13:04
загрузится пока он это ждёт Он открывает другое TP соединение запрашивает Другую картинку и так далее из-за этого появляется большое количество соединений это ты можешь посмотреть через de Tools если откроешь что-нибудь там с http1 http2 асинхронно он запрашивает например картинку сервера удалённого дальше так как он ожидает ответа удалённого сервера он делает запрос другую картиночка и так далее и из-за этого ему не нужно открывать много соединений tcp достаточно одного и из-за этого во-первых сеть то есть объём
00:12:13 - 00:13:35
данных передачи как бы в принципе тот же самый имеется в виду что меньше соединений и ускоряется вот это всё загрузка страницы как минимуму так Окей спасибо а ну и Если я правильно помню то за счёт того что данные бинарные можно повысить скорость передачи данных в сравнении с htp 1.1 да слышал ты что-то про http 3 и прокол к Я слышал что оно существует Но не читал и на практике тоже не сталкивался Окей окей давай тогда поговорим про https вот вообще как он в целом работает и как устанавливается https
00:12:53 - 00:14:30
соединение так https протокол - это http secured то есть в отличие от стандартного https в котором данные шлю открыто используется шифрование для шифрования используется сертификаты на стороне в сервера есть сертификат подписанный неким доверенным сертификационным сообще обществом и в клиент при подключении обращается к серверу запрашивает его публичный сертификат который может получить клиент клиент проверяет общество которое подписало этот сертификат является ли он Является ли это или этот удостоверяющий
00:13:44 - 00:15:16
центр доверенным проверяет данные в сертификате совпадает ли имя домена в сертификате с именем домена с которым клиент общается валиден ли сертификат если после всех проверок клиент убеждается что обладатель сертификата тот за кого себя выдаёт устанавливаются соединение икры передача данных хорошо А давай рассмотрим ситуацию что вот мы заходим на какой-то ресурс А это внутренний ресурс у нас там свой собственный центр сертификации Мы заходим на ресурс и у нас типа сертификат не может быть проверен у нас
00:14:35 - 00:16:01
красненькая там иконос всё плохо что мы можем в этом случае сделать ну э если это корпоративная сеть как правило в корпоративных сетях э корневой сертификат компании добавляется в на устройство в качестве доверенного и проблема постепенно решается то есть вот как это происходит есть это можно сделать на уровне веб-браузера если браузер Это позволяет мо сделать на уровне операционной системы также там если это контейнер илито тоже можем в вшить наш сертификат Добавить список тоже самое что сделать на уровне
00:15:17 - 00:16:51
системы после этого сам статус удостоверяющего центра становится доверенным и если все остальные условия выполняются то значок будет зелёным и ошибки не будет но если мы в корпоративной столкнулись с этой ошибкой можем посмотреть изза чего именно возникла ошибка может быть просто сертификат истёк и у кого-то не сработал алёрт и нужно срочно бежать чинить то есть проблема может быть банально что он истёк И это не не то что мы совсем в опасности а то что вот была ошибка А ну ладно ой сетевики накосячили Не ну
00:16:07 - 00:17:34
тут не сетевики тут обычно кто-то другой ки на других уровнях чаще работа Давай раше мы начали такую тему безопасности шифрования Давай такой общий вопрос Чем отличается симметричное и асимметричное шифрование при симметричном шифровании обе стороны при передаче данных могут трафик Как шифровать так и шифровать используя один и тот же ключ то есть скажем это вот какая-то вот кодовая фраза которую знает только клиент и сер то есть ну две стороны передачи скажем так при помощи неё они могут эти данные Как шифровать так и
00:16:50 - 00:18:18
шифровать при асинхронном асимметрично да При асимметрично подходе скажем на странице сервера есть публичный ключ и в приватный ключ то есть при помощи приватного ключа сервер может шифровать данные которые не может девать больше никто То есть клиент имея публичный сертификат может то есть Хорошо скажу более общем что кто-то имея публичный ключ или сертификат может данные зашифровать но не может шифровать тот кто имеет приватный ключ может эти данные шифровать и Ну это является показателем того что
00:17:33 - 00:19:13
данные по не защищённому каналу они падут не в те руки тот такого нету приватного включае не сможет получить к ним доступ Окей хорошо Переведи пожалуйста пример асимметричного шифрования Вот например RS или ДСА ключи которые используются При установлении ssh соединения мы как в клиенты имеем свой публичный S ключ и приватный S ключ дальше наш публичный ключ Мы можем с Кому угодно спокойно сообщать Это совершенно безопасно И если мы на стране сервера добавим публичный ключ клиента список доверенных для подключения для олного
00:18:29 - 00:19:56
пользователя то обладатель приватного ключа в этой паре ключей при открытии ssh сессии к указанному хосту с указанным пользователем ээ пройдёт аутентификацию и сможет подключиться к серверу потому что вот у него есть приватный ключ соответствующий публичному ключу который зарегистрирован на Хосте в списке доверенных О'кей а а каки Какой вид шифрования используется тогда при установке https соединения асимметричный потому что у сервера есть свой приватный ключ приватный сертификат который необходимо как секрет держать в
00:19:11 - 00:20:41
безопасном месте Угу но и всё асимметричное получается ну При установлении соединения происходит обмен ключами которые позволяют уже в рамках этого соединения А как это они обмениваются [музыка] ээ я точно в всех деталях это сейчас не назову но при при подключении в клиент пому шлёт серверу запрос используя публичную часть которую получил от сервера сервер ему отвечает используя приватную часть клиент проверяет что ВС хороо или могуть может быть проверяет сервер клие нуж удостоверяющие цент сертификате он
00:19:57 - 00:21:37
действительно принадлежит Ну цент нужны для того чтобы доказать что тот кто этот сертификат выпустил он действительно проверил что определённый хост принадлежит определённому пользова Ну клиенту адресу иб сам не занимался проверкой подлинность что вот мы доверяем этому удостов центру это проверку то скажем когда мы выпускаем сертификат для сервера через сторонний центр сертификации цент сертификации проверяет что домен который указан сертификате ОНТ клиенту посыла какой-нибудь запрос на сденм кодом
00:21:01 - 00:22:59
и получая ответ Скажем мы на веб-сервере добавляем для а CH правильно называется на онный ресурс определённую строку и удой центр обращается на этот хост на указанный ресурс владеет этим хостом и чтобы клиенту это было делать Не нужно мы просто верим на что вот этот центр доверен проверил по что если нам ничто не мешает выпустить свой сертификат подписать его самим и сказать что вот этот там домен telegram.org ведёт на мой сервер запрос на хост так сейчас ну если коротко просто для доверия да для доверия Суть в чём
00:22:02 - 00:23:59
что вот кто-то может подменить нам ДНС запись о том что домен который привыкли ходить скажем для проверки почты внезапно ведёт на другой сервер там тоже стоит веб-сервер который принимает запрос на этот до но него нету такого же сертификата как у настоящего он там подписан самим собой и окажется что э сервер недоверенный из-за того что подписан недоверенным сертификационным центром Давайте дальше да Угу Ну ладно закончим тогда с протоколом http htts пойдём чуть дальше по разделу разработки Давай поговорим о плюсах и
00:23:11 - 00:24:53
недостатках микросервисов и монолитов назови пожалуйста их для Монолита в Плюсы это скорость разработки на начальном этапе То есть когда мы ещё не знаем что мы делаем какой получается продукт как правило все начинают с Монолита чтобы не заниматься преждевременной оптимизацией то есть мы делаем сервис который решает бизнес задачу он проходит через цикл разработки лизи и продолжает дальше жить минус такого подхода в том что со временем когда система разрастается начинает работать больше разных команд
00:24:03 - 00:25:26
над этой системой может быть есть какие-то модули которым одним хочется дать доступ другим не мято коман свой модуль для этого нужно заново развёртывать новую версию всего Монолита и начинаются сложности с тем что то есть Вот какие недостатки у Монолита это разграничение доступа то это гит репозитории в гит репозитории проблематично разграничить доступ внутри этого репозитория вот второй про Нол Вот например как бы ты бы поступил У тебя есть да репозиторий с монолитом как бы ты повысил безопасность
00:24:47 - 00:26:13
разработки такого приложения безопасность путём разграничения доступа Ну нет просто как ты повысил бы безопасность разработки но ты сказал действительно что разграничить доступ будет тяжелее какой подход вопрос Что именно считать повысить безопасность То есть к приме что од команда лезла там в какую-то определённую часть кода Ну как вариант например можно было бы сделать ги модуль Ну это уже поется другой репозитории всё равно Но получается можно бы сделать модуль который выкачивает через отдельный Клон
00:25:29 - 00:26:48
и если туда не дать доступа то команда всё ра собрать не сможет без этого так не подойдёт там вариант который просто первый приходит на ум это просто за зашифровать часть репозитория Да по Почему почему нормальный как раз подход можно выделить в модуль а ээ люди которые будут это собирать Просто у них будет э доступ ко всему Ну то есть да в принципе для локальной разработки может быть если сделать архитектуру такою что без Саб модуля у тех у кого нет доступа оно локально соберётся и запустится то
00:26:13 - 00:27:30
да Ася там уже есть учётные данные доступ чтобы это всё собрать воедино да возможно Ну смотри ты ну в приложении есть такая штука То есть ты можешь скачать но не можешь запушить что-то то есть ты сможешь просто нужные модули нужные программные обеспечение скачать плюс плюс ещё у нас есть одна штука которы для чего нужны Но это всё же получается выходит за рамки одного репозитория скажем решается Наро то есть там можно в рамках одного Там просто нет такого поняти как репозитория там есть дерево самого ну
00:26:51 - 00:28:18
сейчас там есть репозиторий там скажем к бран и тран и в любой можно выкачать себе в рабочую копию любую часть этой ветки Ну имее не ветки а дерево репозитория и Например если у нас это ль структура репозитория у нас там скажем тра есть там проект 1 2 3 и мы можем настроить права на сервере так чтобы даже внутри проекта там на какую-то часть права доступа есть на какую-то нету то есть там это можно ограничить потому что там сервер занимается авторизацией че вот в гите обычно коробки на Я знаю нету
00:27:37 - 00:29:04
вот так нум к монолиту Да п мину собственно минус это разграничение доступа это проблема вторая проблема то что со временем единовременный выпуск новых версий и релизы для всего проекта которого становится проблемой что хочется как-то их разделять между собой плюс это может быть большое время сборки если это уже большой проект там он может собираться час и это тоже может быть проблемой плюс ели это гит репозиторий в котором оче часто работает много команд это будет много мжи в этот репозиторий люди будут не успевать подтягивать
00:28:21 - 00:29:54
свежие изменения там скажем у них ушёл реквест на ревю пока он лся туда уже успели в целевую ветку наплевать много изменений если там большие изменения то Придётся успеть их подтянуть свой код чтобы он влился в этот изн продукт состояния сно дождаться ревью и так можно очень долго страдать Ну хотя это может быть и в любом сервисе В зависимости от интенсивности разработки вот плюс ещё минус Монолита в том что сложнее использовать разные технологий для решения задач то есть скажем если выбран основной Инструмент
00:29:09 - 00:30:21
там фреймворк или язык программирования то добавление новых языков инструментов оно более сложно скажем в случае микросервисов мы можем разные микросервис писать на разных языках программирования И в фреймворка исть какой лучше подходит по решение конкретной задачи Ну с масштабированием могут быть также сложности Потому что если какая-то Ну вот какой-то модуль системы требует масштабирования в случае Монолита мы вынуждены масштабировать весь Монолит целиком есть все его экземпляры и может оказаться что больша сть его простаивают
00:29:47 - 00:31:08
какая-то одна и И за счёт этого нерационально расходуются ресурсы Да в плане Трабл шутинга в плане шутинга Нужно больше знаний о системе для того чтобы лать ошибку если ошибка не очевидная то есть как правило Конгом имы можем схо понять в ЧМ проблема восстанавливаем в память цепочку того как скажем вот данные которые мы прислали обрабатываются и выходят из приложения и чем больше и сложнее эта цепочка тем сложнее В траблшутинг А если например это Монолит кучей зависимостей и нам допустим надо его локально поднять чтобы проверить
00:30:28 - 00:32:05
гипотезу там более-менее безопасной обстановки это может быть сложнее потому что требуется больше усилий для того чтобы это сделать как правило в сравнени с микросервисов а ну как бы сетевые взаимодействия всё в этом вроде если учитывать Ну свы взаимодействует ту тут скорее бывает плюс Монолита что их может не быть Ну как плюс это может быть и минус то что иногда все взаимодействия Там могут быть внутри Монолита А я понял в чём идея В общем Суть в том что скажем если в случаев микросервисов Мы можем взять его
00:31:18 - 00:32:27
Как в чёрный ящик шлём на него конкретный запрос получаем конкретный ответ и отжим эту проблему то в случае Монолита Если всё это без сетевых запросов всё это внутри нам уже нужно ставить брейкпоинты или там добавлять логи то есть внутри кода приложения заниматься траблшутинг разнообразных взаимодействий То есть ты в микросервис иногда не можешь понять как бы Какой микросервис например отказал в монолите те у тебя Понятно что вот у тебя есть Монолит Угу ты в него послал запрос Ну ты его используешь как
00:31:54 - 00:33:02
чёрный ящик Ты знаешь что вот я послал запрос он мне должен отдать такой-то ответ Ты понимаешь где проблема приблизительно потом Ну если он хорошо задокументировано а в микросервисной архитектуре ты послал запрос там на одно приложение это приложение зависит от другого приложения шь это плохая микросервисная архитектура Но уж гу у нас не все архитекторы прямо которые продуманные вот и ты вот вот эту цепочку пока разгадаешь Ну как бы в это в этом минус как раз-таки микросервисной архитектуры в монолите у тебя всё одно а
00:32:37 - 00:33:46
в микросервис тебе нужно ещё понять какой микросервис отказал И что он ну на каком этапе запрос у тебе куда-то делся конечно это всё логи ется Но это надо организовывать О'кей ПС ещё вот если так вот посмотреть Ну вот из такой из практики Бывает такое что вот ну как бы в микросервисной архитектуре Иногда тяжело транзакционный например поддерживать то есть ну как бы актуальность данных если ты в нескольких системах если ты там попили например там я там взаимодействую ну один микросервис взаимодействует с одной системой второй
00:33:11 - 00:34:31
с другой и так далее вот и тебе надо вот это где-то хранить состояние Ну там какие-то задания дополнительные плюс микросервисная архитектура подразумевает ещ дополнительные какие-то очеред не очеред Вот это То есть она Ну как бы ведёт к разрастанию системы конечно у неё Ну как бы много плюсов и мы Ну как бы на эти плюсы Ну как бы этими плюсами оперируем и готовы вкладываться в масштабирование там добавление дополнительных сервисов зачем нам это ну когда можно в одном монолите это делать то есть ну когда
00:33:52 - 00:35:15
логики не так много Ну в общем вот так вот ладно Ну да потому что в случае микросервисов также разрастается вся вспомогательная инфраструктура то есть скажем если у нас один Монолит у нас нему один балансировщик один там балансировщик у нас ОБД там контроль его жизни А если у нас микросервисы на каж микросервис Скорее всего будет свой балансировщик ЕС их по несколько экземпляров чтобы не раскрывать детали их архитектуры и там же будут Да свои лки пощади как ты сказал тоже да самое ну как бы вот такой основной минус - это
00:34:37 - 00:35:47
сложность вот архитектурный Давайте дальше О'КЕЙ в целом мы тогда обсудили микросервисы уже так вместе все давайте дальше Скажи пожалуйста какие протоколы межсервисного взаимодействия Ты знаешь межсервисного межсервисного сейчас я пойму о чём именно речь один из них назвать ты дальше пой а ну имеется в виду стандарты взаимодействия Ага ещё есть R в Ja сервисах для вот об этом речь Да об этом речь да Ага значит случае это довольно взаимодействия в случае скажем Java rmi - это способ из одного скажем
00:35:12 - 00:37:18
микросервиса вызывать Java методы другого микросервиса там импортируют как зависимость и работая с ними но это не работает из коробки с другими языками програми там нужно допи чтобы это работало jpc - это разработка от Google правильно помню которая была призвана стандартизировать взаимодействие как раз между разными языками программирования и технологиями по аналогии с Java rmi Там могут быть сложность при использовании этого Когда уже скажем есть большая Java кодовая база и переехать на это сложно то есть для чего
00:36:33 - 00:37:48
всё это нужно для того чтобы э Когда у нас есть один сервис и ему нужно получить какие-то данные от другого мы Обращаемся к этому сервису и просим выполнить определённую функцию в случае если это API мы как правило шлём http запрос с указанием ресурс который нас интересует указываем метод и данные которые мы посылаем тому сервису и он уже их обрабатывает отвечает ответом и мы с этим как-то работаем в случае скажем jav нет необходимости переходить на у запросов на уров вызываем из другого сервиса и ими
00:37:10 - 00:38:47
пользуемся Это позволяет упростить взаимодействи то есть нам не нужно паковать данные скажем в J не нужно его отсылать не нужно потом принимать его парсить валидировать То есть там это идёт на уровне объектов языка программирования на котором сервис написан смотри Андрей мы да ты верх уровне описал вопрос заключался в том Какие протоколы Ты знаешь и Давай на каждом этом протоколе хотя бы обзор на его рассмотрим У угу можно начать с рест Угу Так значит я не в ту сторону отвечал Ну ты я так вот в общем смысле рассказал
00:38:00 - 00:39:22
зачем это нужно О'кей Хорошо давай теперь каждый раз смотрим Ну популярные имеется в виду не каждый Ну в чём в В чём специфика rest вообще в том что мы используем определённые конвен от того как строится посылается в запрос Какие используются методы Угу сейчас я может быть Не совсем точно знаю тему потому что я не считал спецификацией Да не нужно знаю об этом не теоретически А на уровне практики Ну ладно проста на самом деле ты уже говорил давай дальше например есть тако такой протокол называется SU
00:38:45 - 00:40:12
Угу Ты знаешь вообще в чём ну чем он вообще отличается верхней уровне от честно нет ни разу практике не сталкивался не слышал ну там используется не Джей соны а для передачи данных а xml и ну J они для передачи данных но можно и без них Да в су постоянно нужно использовать xml для любых сообщений они супе объёмные вот и он работает по принципу один запрос один ответ Вот Но это устаревший подход его вытеснил ста вот ну есть ещё более современные протоколы или как-то их ещё можно иначе назвать это например gql и jpc ты знаешь
00:39:34 - 00:41:16
что-нибудь про эти Вот про jpc Я слышал Вот пытался сказать что это примерно история серии что Java R но на практике с ним сталкивался А про Я слышал в контексте JS приложений тоже для взаимодействия сервисов То есть я слышал что такое есть но на практике не сталкивался и не смотрел Как это работает Угу Ну вот ты сказал что с сталкивался вот сталкивался в контекст того что была идея ээ перейти Ну с jav R на jpc в масштабах больше чем только jav сервисы но было принято решение остаться на jav Потому
00:40:25 - 00:42:02
что слишком сложно было всё мигрировать ну как я понимаю там была идея в том что можно для инструментов написанных на разных языках программирования использовать ход похожий на Java rmi Но для разных языков Угу Ну да наверно Я не сталкивался с jav rmi но смысл jpc - это бинарный протокол который работает поверх htp 2 вот он используется для кодирования декодирования информации используя протокол protocol buffers и то есть ты можешь описать проба это такой Файлик синтаксис Очень сильно похож на гоку или на си ну по моему
00:41:13 - 00:42:51
мнению Вот и дальше ты можешь эти файлы компилировать в Ну почти любой популярный язык программирования это описание как там сервисы будут взаимодействовать Там какой он ожидает получать какой набор данных и какой Отдавать вот такая штука называется websocket слышал ты про это что-то что за протокол я название слышал на практике опять-таки не сталкивался Но предположу что это способ при котором несколько сервисов общаются через сот на Хосте хотя ну если на одном Хосте задело Ну скорее всего это что-то для
00:42:04 - 00:43:46
вки меж серверного взаимодействия Ну наверное можно так назвать может быть это немножко отличается от того о чём мы сейчас говорили это возможно такой немножко отходящий вопрос но это протокол который используется часто в чатах смысл его работы что тебе нужно один раз установить websocket соединение с сервером и у вас оно постоянно держится то есть не нужно в постоянно туда-сюда там запрос ответ запрос ответ А во просто один раз его устанавливаешь как труба такая и по этой трубе Ага да понят да Ну вот например
00:42:56 - 00:44:16
зайдёшь на любой сайт там с чатом да ты же не обновляешь страничку Там Или там обязательно куда-то нажать чтобы получить данные они прямо буквально сразу приходят Угу Вот Угу О'кей А дальше тогда идём немножко чуть-чуть прямо буквально поговорим про гит такой общий вопрос Чем отличается Kit merge от git rebase в случае git rebase ну скажем вот у нас есть наш локальный ВМ состоянии кто-то что-то закатил пока Мы работали локально и в случае и при этом мы сделали комит у себя локально то есть мы свой комит не
00:43:36 - 00:45:07
запушил в orig свой Колу при пул локально добавит этот комит в цепочку коммитов роив и Мо локальный Коми случае он сольёт эти правки в новый комит по Как ты говоришь Ты можешь сказать что делает Я потерял То что ты говорил перестраивает цепочку коммитов так чтобы уместить там и сторонние коммиты и локальные [музыка] Ну ну да наверно так это выглядит хорошо влом Можно и так сказать У нас вот есть две ветки и мы вторую ветку создали там с мастера там разрабатывали разрабатывали мастер дальше шёл и мы хотим из ветки которую
00:44:21 - 00:46:21
мы создали вытащить только один комит и слить его например обратно в Мастер Как мы можем это сделать не сливая целиком ветку можем сделать в чепик этого комита нову ветку сде пик и через пол request или реквест смотря какой инструмент влить её в Мастер Ну с этим коммитом О'кей Ну смотри вот мы сделали мерч в Мастер с этим коммитом чере пик правильно но там у нас прот лёг и как нам откатиться но при этом чтобы не удалилась история имеется в виду как откатить изменения но удалять кот всё так да в гите для этого
00:45:38 - 00:47:18
есть есть команда которая откатывается изменения Коми но сам ко не удаляет в отличие от которая стирает Ну да В целом Да хорошо Ну по гиту у меня в принципе всё Давай перейдём Так что множ об этом поговорим я сю что это оче важно для девопса разбираться в языках программирования хотя бы для автоматизации чего-то Поэтому вот первый вопрос Какими могут быть ключи словарей в Python ключи словарей в Python име в виду Какие типы данных мы можем использовать для да чем они могут быть Ну как правило все используют
00:46:31 - 00:48:01
стройки Я честно не пробовал использовать целочисленные типы данных или что-то ещё то есть я на практике только строковые значения использовал в качестве ключей и не задумывался Что будет если туда подставить что-то другое Ну вот скажи пожалуйста мы можем ключ ключом словаря сделать например кортеж Это интересный вопрос я не задумался не пробовал позволит ли поэтому так сделать Угу И главное зачем Ну как зачем Ну смотри Представь что у нас есть Представь что у нас есть какая-нибудь зарплатные ведомости Мы
00:47:25 - 00:48:59
хотим в кортеже хранить там фо и дату рождения и вот у нас есть словарик там там Вася Пупкин такого-то года рождения получало столько денег у нас ну то есть У нас есть по явному ключу с помощью этого ключа можем явно характеризовать например какого-то человека и там какие-то данные хранить Вот например для этого так вот ну вот в таких ситуациях я обычно использую которые появились относительно недавно и Ну просто чтобы было проще сопровождать такой код и с этим жить Потому что если лють чтото меки ещ неожиданно то скажем
00:48:13 - 00:49:43
если мы получили не те ну не знаю насколько в этом действительно практический смысл и я не знаю насколько всё-таки это будет работать Я честно не проверял и не думал об этом Окей но на самом деле есть общий общее правило касаемо ключей что они должны быть Ну по большей части они долж быть вот неизменяемый тип данных но есть здесь одно но что на самом деле могут быть ещ те объекты которые имеют свойства хэширования то есть они могут быть широва у таких объектов должен быть иметь метод ш Вот и тогда их тоже можно
00:48:58 - 00:50:33
использовать Однако если их изменить Тош изменится и возможно будет ошибка при этом вот поэтому общее правило использовать мутабельные типы данных Окей э если мы говорим о изменяемых и неизменяемых типа данных Скажи мне пожалуйста какие есть Ну Приведи примеры неизменяемых и изменяемых типо в данных а имеется в виду сейчас Ну вот в кортеже мы не можем изменять значение других там списках сетах мы можем об этом вопрос в контексте пайтона конечно да Ага Так ну вот собственно Да вот кортеж он пому единственный неизменяемый тип
00:49:48 - 00:51:27
данных Python который могу вспомнить Ну смотри я только что сказал выше что ключами словаря могут быть неизменяемые ти данных ты сказал что ты используешь строки так вот строки - Это изменяемые или неизменяемые тип данных изменяемые то есть по такой логике в кортеж тоже может быть ключом словари какй он является неизменяемым типом данных строка неизменяемый тип данных Всё я понял то есть идея в том что раз мы задали кортеж то он будет гарантированно неизменяемым и словарь будет более стабильным если мы
00:50:44 - 00:52:01
используем в качестве ключа кортеж Да вообще А что имеется в виду под словом неизменяемых Ну смотри с одной стороны Мы можем взять строку то есть и скотинина пример Hello плюс строка World и у нас в перемен какую-нибудь А уже появится строка Hello world вроде изменилась правильно то есть мы к этой строке потом можем ещё что-то скон контини что-то добавить Она вроде изменилась Вот что значит в контексте неизменяемое То есть почему строка является неизменяемым типом данных потому что Python когда его хранит он
00:51:24 - 00:52:33
все использование этой строки отсылает на одну и ту же ячейку памяти Гни э строка То есть у нас там три переменных которые хранят строку hello по сути они все будут обращаться к одному и тому же коже чеки памяти Если я правильно помню Угу Ну ну при оптимизации хранения этого этих данных и если мы потом э строку меняем получаем другую строку H остаётся и содержит ссылки на остальные две переменные которые содержали Если я правильно помню окей Да что ты не можешь неизменяемость это такое свойство когда ты не можешь
00:51:59 - 00:53:20
одни и те же данные ссылку на одни и те же данные в памяти изменить и чтобы эта ссылка потом осталась там же то есть создаётся но новая ячейка памяти с обновленными данными и дальше уже перемен начинается с новы ку памяти а старая если больше че ничего не ссылается приходит gar Колек и уничтожает удаляет вот к другим неизменяемым типам данных относится N in FL То есть ты не можешь число изменить ты не можешь целочисленное или с плавающей точкой там Бул не можешь изменить Оно всегда с одну и тоже яй с
00:52:42 - 00:53:59
пам Нубо понят иде Я просто об этом честно не задумывался не сталкивался с этим окей а изменяемый соответственно Ну ты вроде уже назвал Да это список ты можешь выделить дальше туда добавлять и всё это будет скла на на один и тот же ячейку памяти там словарь И множество Да Окей хорошо дальше что такое AR и квар и как использовать это ССО который получает скрипт при запуске в нулевом элементе списка содержится имя скрипта А дальше уже те аргументы которые были Ему переданы То есть это может быть способ
00:53:21 - 00:55:02
для базового использования C без дополнительных а подождите здесь на другом речь вопрос про функции про функции и методы вс перепутал В общем А и кварк - это динамические это способ динамически передавать параметры функцию или метод не описывая их то есть квар это элементы ключ значения то есть скажем когда мы используем именованные параметры для вызова есть например у нас есть функция кото принимает паме и дальше когда мы вызываем такую функцию мы передаём СР А дальше можем Ну просто в виде значений можем передать их на и как
00:54:12 - 00:55:50
именованные как не именованные в пайне А дальше можем через запятую передать например то есть ещё какие-то переть параметр ключ значения и они все падут в несь в слова в общем структуру данных с которым мы можем уже их по необходимости доставать внутри внутри функции метода а Arc - это аналогичный инструмент для аргументов для для случаев когда уже Мы не используем позиционный аргумент то есть скажем у нас есть вот там два вот обязательных позиционных аргумента вот там src и dpf а дальше можно передать
00:55:07 - 00:56:23
что-то тоже как аргументы без использования именованных аргументов и тогда они попадут все уже в Да хорошо дальше если мы уже говорим про функции то что такое лямбда выражение В Python лямбда выражение - это по сути анонимная Функция которую можем определить в качестве строчки и использовать её вызывая как переменную с разным набором параметров как правило это применяется когда хотим нам не хватает обычного для того чтобы скажем обработать список каких-нибудь данных Мы можем написать функцию которая будет
00:55:47 - 00:57:29
вызвана в лямда выражении Для более глубокой обработки данного спи нужно профильтровать список например какому-то более сложному критерию или условию хорошо что такое это способ доопределить функцию каким-то определённым поведением думаю как покрасить если говорить по-простому то Да это обёртка при помощи которой мы можем окружить эту функцию КАТО дополнительными действиями скажем так то Как выглядит декоратор мы над именем функции ставим собаку и имя декоратор То есть например типовой декоратор
00:56:37 - 00:58:19
когда разрабатываем класс можем использовать декларатор проти над именем атрибута для того чтобы превратить Ну это этот атрибут уже проти и он будет выглядеть внешне Ну метод превратить в пропети та получается что мы можем обращаться к этому проперти как к атрибуту объекта то есть без круглых скобок в конце но по факту он будет работать как функция то есть он будет работать только на чтение но не будет позволять по молчанию записывать И при этом будет необходимость какую-то дополнительную логику про то скажем если
00:57:40 - 00:59:08
у нас есть объект ну скажем вот у нас есть там путь к какому-то вот есть библиотека ладно То есть когда нам нужно По какому-то условию что-то посчитать не просто отдать атрибут но не хочется писать метод Get этот атрибут можем использовать декоратор про для того чтобы добавить логику соответственно декораторы могут использоваться тоже в других пакетах там в зависимости от ситуации уже для того чтобы расширять функционал функций методов или изменять его Да всё так хорошо Давай дальше какие основные принцип объектного
00:58:24 - 01:00:02
программирования про инкапсуляции наследования полиморф давай так Окей Ты их назвал ещё какой-нибудь знаешь принцип Опа ляция наследование назвал или нет наследование назвал да раз полиморфизм наследование обычно выделять ещё один Да я понял что их четыре Да абстракция вот астрая абстракция А А ну да я давай поговорим давай начнём с инкапсуляции что это такое зачем это нужно инкапсуляция - это подход при котором мы реализацию данного метода скрываем внутри То есть у нас есть объект который по сути предоставляет интерфейс
00:59:15 - 01:01:16
пользования этим объектом скажем в кодовой базе и следуя инкапсуляции мы внутри в реализацию того как этот метод работает скрываем внутри и не даём возможность из не туда залезть вот ну окей да то есть они инкапсуляция заключение атрибутов и методов В классы и по необходимости их сокрытия да Если говорить о сокрытии то какие модификаторы доступа есть в Python Python есть два способа для сокрытия методов это одиночное подчеркивание и двойное подчёркивание В чём отличие одиночное подчёркивание оно показывает о
01:00:20 - 01:01:59
том что данный метод считается уже внутренним приватным методом класса но тем не менее оставляет возможность техниче возможность его вызвать скажем если мы там пишем юнитест или хотим что-то проверить Ну по крайней мере для разработчика сигнал то что если ты работаешь с этим классом пожалуйста Не используй этот метод в случае же данов подчёркивания уже этот метод просто так недоступен то есть там нужно намного сильнее извергом будем изворачиваться Но вот скажи например вот мы сейчас конечно дальше поговорим про наследование но
01:01:13 - 01:02:31
представим что у нас есть подк и так вот модификатор protected который с одним нижним подчёркиванием он будет доступен под классом например какой-то метод О я как-то об этом не задумывался не сталкивался с таким Обычно когда вот я писал на пайтоне классы с наследованием У меня обычно вот такие скрытые методы были уже где-то в конечных классах Ну в потомках Так что тут не знаю но интересный момент если это связано с наследованием то есть использование подчёркивания это связано это на самом деле связано да
01:01:53 - 01:03:11
и идея в том что Да protected они недоступны вне класса но доступны под классом а Private который с двумя подчёркивание он доступна только внутри класса кото в котором этот метод или атрибут написано то есть получается ЕС У нас у метода одно подчеркивание если мы работа Это с эпм этого метода мы его вызвать сможем но если мы наследуем от этого класса пото то объект потомка не сможет вызвать уже родителя с подчёркиванием с двумя подчерки не сможет с одним может как я сказал то есть с одним подчеркиванием под классом
01:02:32 - 01:04:00
доступен метод например А с двумя на самом деле как ты правильно сказал что на самом деле всё доступно и можно и то и то достать Если захочешь но так делать не надо то есть это не очень не строго например как там вот по-моему в Джаве строго да вот там е написано правильно невозможно и ВХ и в этом как его даже пале ну дае языки в Гош например Это вообще класс знаете как вш ва Пока нет нет Там если ты в пакете пишешь например [музыка] функцию с большой буквы она доступна вне пакета А если с маленькой буквы Э
01:03:16 - 01:04:48
начинается название то только доступно внутри одного пакета то есть там там вот так сделано Довольно интересно Ну ладно хорошо Давай пойдём тоже дальше а но пока на ещё в теме инкапсуляции вот что такое Get resetter рете это служебные методы которые позволяют э задавать значение атрибута и его зачитывать ну сейчас скажем если мы напишем выражение вот у нас есть экземпляр объект какого-то класса и мы потом для его атрибута пишем что там атрибут равен чему-то то при обработке этого значения будет вызван сеттер метод если мы
01:04:08 - 01:05:54
куда-то подставляем атрибут значение атрибута этого класса то будет вызван get get да А например у атрибута какого-нибудь может быть только г а сетера нет но Наско по по умолчанию технически они уже есть у каждого атрибута иначе было бы неудобно ими пользоваться то есть там не обязательно их писать Чтобы начать ими пользоваться я предполага что если мы его написали то мы его переопределить при помощи декларатор про там атрибут проти то мы уже не сможем просто так ему сделать сет у неня будет только
01:05:01 - 01:06:37
Get Окей ну да ну то есть смысл в том что у нас есть какая-то инкапсулированная защищённое сокрытое атрибут например да и мы уже напрямую не сможем его поменять ну там какой-нибудь не знаю там имя скажем чего-то там а и тры серы нужны для того чтобы работать с этими закрытыми атрибутами Угу Вот и если у тебя есть сокрытый атрибут и ты сеттер ты сделал гетер сеттер не указал ты не сможешь поменять ты можешь получить только значение А вот а Ну окей давай дальше пойдём по принципам вот что такое абстракция Если ты знаешь помнишь или
01:05:49 - 01:07:12
предположи абстракция это способ Ну я видимо внутри немножко это с инкапсуляции перемешивая Ну то есть сес абстракция это о том что вот мы скажем когда содам какой-то клас мы связ Ским объектом реального мира и наделяет свойствами и поведением то есть методами этот объект и это потом реализовано это об этом Ну в целом да да что это набор методов которые скрывают реализацию Да самих этих методов но да в Джаве например это по-моему есть такая понятие как Интерфейс Да Угу Вот это про это что вот у нас есть некая абстракция скажем
01:06:31 - 01:08:19
педаль газа да Что мы умеем вот с этим интерфейсом работать Но мы же не знаем когда там работает внутрянка то есть есть доступный интерфейс такой и вот мы с ним взаимодействуем и дальше Ну как по мне абстракция она также связана с полиморфизмом но абстракция сама идея это как раз-таки что набор что мы есть публичные методы и типа вот они доступны вот а а давай про наследование поговорим Ну это довольно просто наверное самый простой принцип Зачем он нужен принцип наследования заключается в том что мы можем создать новый класс
01:07:30 - 01:08:49
который получит от своего предка от которого он наследуется набор атрибутов и методов без необходимости их определять сво в ЧМ плюс на можем иметь некий базовый класс с часто используемыми методами и атрибутами и дальше мы уже в теории пишем какой-то маленький класс там только с методами атрибутами этого класса но при это имеем ВС функционал просто выше цепочки Угу Ну да да Окей тогда что такое полиморфизм последнее полиморфизм - Это разное поведение какой-либо опера операции в зависимости от того с какими
01:08:16 - 01:10:04
данными она работают то есть скажем оператор плюс Python при работе с целыми числами он вернёт сумму этих этих чисел если это строки то он к он их контини по сути вот оператор плюс яется является полиморфным и Ну да А если более такой простой пример если например э ну полиморфизм можно э сложить с абстракцией и наследованием то есть у нас есть некий класс родитель у него есть какой-то метод и что нам позволяет полиморфизм в таком случае сделать я име я име виду у наследоваться Например у нас есть класс животные А
01:09:13 - 01:10:42
дальше у нас есть подклассы кошка собака там лягушка Вот и у суперкласса животное есть метод издать звук Да а вот и соответственно у классов кошка собака и лягушка тоже может быть этот метод мы не обязаны создавать какой-то другой метод то есть там издать звук лягушки издать звук собаки или кошки мы просто внутри этих подклассов также переписываем метод издать звук и просто уже внутри этого метода логику меняем Вот и то есть у нас Томе ЕС в общем то что методов такой же поведение разное да да Ну ты в принципе тоже самое
01:10:02 - 01:11:42
сказал про несколько просо более сложно Я хотел этим самым ближе к коп Действительно это назвать потому что я скорее так вот скорее переопределение там метода или что-то в этом роде это ещё есть перегрузка это другое там когда можно для разных наборов данных один и тот же метод вызывает разными данными тоже полу разные поведения внутри Да ну окей по разработке всё такая часть большая закончена следующая часть она будет меньше она будет быстрее и она будет про devops Хотя я не разделяю разработку от девопса скажем
01:10:52 - 01:12:12
так
01:11:34 - 01:11:37