<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Андрей</title><author><name>Андрей</name></author><id>https://teletype.in/atom/shmarou</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/shmarou?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/shmarou?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-30T16:13:17.078Z</updated><entry><id>shmarou:rq2rf0MjMeN</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/rq2rf0MjMeN?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>Приоритезация </title><published>2024-06-22T16:07:20.891Z</published><updated>2024-06-22T16:09:23.893Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/18/78/1878be62-d7b1-42ab-b695-962aab920f02.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/559/e9e/eed/559e9eeed2a0d94848f9fe27be84ad92.jpg&quot;&gt;11 мин</summary><content type="html">
  &lt;h1 id=&quot;irx8&quot;&gt;Приоритизация бэклога. Зачем нужны фреймворки и как работать по ICE — опыт менеджера с 5-летним стажем&lt;/h1&gt;
  &lt;p id=&quot;apIR&quot;&gt;11 мин&lt;/p&gt;
  &lt;p id=&quot;rzxc&quot;&gt;9.3K&lt;a href=&quot;https://habr.com/ru/hubs/dev_management/&quot; target=&quot;_blank&quot;&gt;Управление разработкой*&lt;/a&gt;&lt;a href=&quot;https://habr.com/ru/hubs/pm/&quot; target=&quot;_blank&quot;&gt;Управление проектами*&lt;/a&gt;&lt;a href=&quot;https://habr.com/ru/hubs/productpm/&quot; target=&quot;_blank&quot;&gt;Управление продуктом*&lt;/a&gt;&lt;a href=&quot;https://habr.com/ru/technotext/2022/&quot; target=&quot;_blank&quot;&gt;Технотекст 2022&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;MJ90&quot;&gt;На собеседованиях продакт-менеджеров, продакт-оунеров и скрам-мастеров любят спрашивать про фреймворки приоритизации и опыт работы с ними. Но реальной практики в этой области в статьях на Хабре изложено не так много — в тех текстах, которые попадались мне в последнее время, не хватает глубины именно для ICE.&lt;/p&gt;
  &lt;p id=&quot;nGb0&quot;&gt;Постараюсь восполнить этот пробел. Расскажу, как посчитать ICE в деньгах или баллах, как снизить предвзятость оценки и с чего начать, когда у вас за спиной нет команды аналитиков, нацеленных только на расчет фич. Под конец поговорим о том, как все-таки заставить приоритизацию работать и вылавливать из массы запланированных фич те самые низко висящие фрукты, которые дадут большой профит.&lt;/p&gt;
  &lt;figure id=&quot;F16W&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/559/e9e/eed/559e9eeed2a0d94848f9fe27be84ad92.jpg&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Mw4d&quot;&gt;Привет,&lt;/p&gt;
  &lt;p id=&quot;fuj6&quot;&gt;Я — Дима, был продакт-менеджером в QIWI и криптостартапе, а сейчас работаю в Gett. Но рассказ о своем опыте построю в отрыве от конкретной компании, поскольку успешно применял этот подход в разных командах.&lt;/p&gt;
  &lt;p id=&quot;pZJ0&quot;&gt;Приоритизация бэклога — одна из базовых задач продакт-менеджеров. Зачем она нужна — понятно: нельзя сделать все фичи сразу. Когда объем ожидаемых доработок и их срочность больше ресурсов команды разработки, приходится выбирать, что делать в первую очередь.&lt;/p&gt;
  &lt;h3 id=&quot;hVHE&quot;&gt;Когда не обойтись без фреймворка приоритизации&lt;/h3&gt;
  &lt;p id=&quot;4FAR&quot;&gt;В стартапах ранней стадии чаще всего фреймворки приоритизации не используются. Команда занята проверкой гипотез, поиском целевого сегмента клиентов, изучает его потребности и тестирует базовое решение (продукт) — ищет product-market fit. Проверка гипотез в большинстве случаев не требует разработки — ручные продажи, лендинги, чаты, no code — любимые инструменты стартаперов. То есть разработчиков может не быть совсем или они могут разрабатывать ядро продукта из минимального набора необходимых компонентов.&lt;/p&gt;
  &lt;p id=&quot;g623&quot;&gt;Когда у продукта появляется основной функционал, растет количество клиентов, сегментов и стран, возникает необходимость приоритизировать фичи, в том числе разрабатываемые разными командами. И здесь без договоренности о том, как именно расставлять приоритеты — то есть без фреймворка — уже не обойтись.&lt;/p&gt;
  &lt;p id=&quot;E6ic&quot;&gt;Во фреймворках приоритизации используют понятие «скоринг» — это оценка задач по заранее определенным критериям. После скоринга у задачи появляется показатель (score), по которому разные таски можно ранжировать с точки зрения очередности разработки.&lt;/p&gt;
  &lt;p id=&quot;9cqr&quot;&gt;Благодаря скорингу фичей получается:&lt;/p&gt;
  &lt;ul id=&quot;msAD&quot;&gt;
    &lt;li id=&quot;CDBJ&quot;&gt;снизить предвзятость оценки конкретного продакт-менеджера;&lt;/li&gt;
    &lt;li id=&quot;y992&quot;&gt;пересчитывать скоринг после изменений входящих параметров, например, при запуске аналогичной фичи у конкурентов или при появлении более простого способа решения потребности клиента;&lt;/li&gt;
    &lt;li id=&quot;n0Ih&quot;&gt;организовать сквозную приоритизацию внутри компании, когда есть разные команды и кросс-командные фичи.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;UvOy&quot;&gt;Распаковываем RICE и ICE&lt;/h3&gt;
  &lt;p id=&quot;VE9O&quot;&gt;Существует как минимум &lt;a href=&quot;https://theproductmanager.com/topics/feature-prioritization/&quot; target=&quot;_blank&quot;&gt;15 фреймворков&lt;/a&gt; приоритизации задач — модель Кано, взвешенная оценка, MoSCoW и другие. Среди самых популярных методов скоринга фичей выделяют RICE и ICE. Первую популяризировал предприниматель Шон Эллис в книге &lt;a href=&quot;https://www.litres.ru/morgan-braun/vzryvnoy-rost-kak-sovremennye-bystrorastuschie-kompanii-sover/&quot; target=&quot;_blank&quot;&gt;«Взрывной рост» (Growth Hacking)&lt;/a&gt; в 2017 году, потом уже в 2018 ветеран Google и Microsoft Итамар Гилад &lt;a href=&quot;https://itamargilad.com/ice-ebook/&quot; target=&quot;_blank&quot;&gt;разобрал&lt;/a&gt; работу фреймворка ICE.&lt;/p&gt;
  &lt;h3 id=&quot;y1az&quot;&gt;RICE&lt;/h3&gt;
  &lt;p id=&quot;ja9T&quot;&gt;Свое название методика получила по первым буквам входящих в расчет компонент:&lt;/p&gt;
  &lt;ul id=&quot;hd3c&quot;&gt;
    &lt;li id=&quot;eyDD&quot;&gt;Reach (охват) — какое количество клиентов будет охвачено.&lt;/li&gt;
    &lt;li id=&quot;391p&quot;&gt;Impact (эффект) — насколько фича повлияет на ключевой показатель (увеличит выручку, снизит расходы или регуляторные риски).&lt;/li&gt;
    &lt;li id=&quot;x1b5&quot;&gt;Confidence (уверенность) — насколько мы уверены, что фичи достигнет ожидаемого эффекта.&lt;/li&gt;
    &lt;li id=&quot;ouyH&quot;&gt;Effort (усилия) — сколько времени потребуется, чтобы сделать фичу.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Yk40&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/db0/037/f22/db0037f2298f1adfb34d2c9a987c3b23.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;KwTv&quot;&gt;ICE&lt;/h3&gt;
  &lt;p id=&quot;lfKp&quot;&gt;ICE — это вариация RICE, где отдельно не выделяют R (Reach), считая его компонентом I (Impact). Это имеет смысл с точки зрения бизнеса. Например, если фича затрагивает небольшой процент наиболее лояльных пользователей, Reach (охват) будет низким, тогда как Impact (влияние) будет больши́м.&lt;/p&gt;
  &lt;p id=&quot;XRR6&quot;&gt;Дальше я буду говорить только про ICE.&lt;/p&gt;
  &lt;p id=&quot;kj9J&quot;&gt;Чаще всего используют одну из двух трактовок ICE — «классическую» или «финансовую».&lt;/p&gt;
  &lt;p id=&quot;XVD8&quot;&gt;Классический ICE измеряется в условных единицах и лучше подходит для быстрого скоринга и ранжирования.&lt;/p&gt;
  &lt;ul id=&quot;KMIm&quot;&gt;
    &lt;li id=&quot;2OHO&quot;&gt;Impact (влияние) включает в себя сразу и количество охваченных клиентов, и выгоду от фичи. Как правило, для быстрой оценки Impact оценивается в баллах по шкале от 1 до 10.&lt;/li&gt;
    &lt;li id=&quot;1ZUp&quot;&gt;Confidence остается тем же, что и в RICE. Измеряется по шкале от 1 до 10 или в процентах.&lt;/li&gt;
    &lt;li id=&quot;6vUs&quot;&gt;Effort меняется на Ease — простоту реализации, по сути, обратное значение от усилий. Effort можно считать в человеко-днях, story points, T-shirts (S, M, L, XL) или аналогично Impact разбить на 10 интервалов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;pcUR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/8bf/679/73b/8bf67973b8220f94babf1af69ae6edbc.png&quot; width=&quot;1516&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;u7t1&quot;&gt;Поясню, как работает «быстрый» ICE, на примере абстрактной фичи, отправляющей некоторые системные сообщения не по SMS, а через push в мобильное приложение:&lt;/p&gt;
  &lt;ul id=&quot;JfLR&quot;&gt;
    &lt;li id=&quot;zwLG&quot;&gt;это фича средняя по эффекту на бизнес — на 5 из 10;&lt;/li&gt;
    &lt;li id=&quot;tQdL&quot;&gt;выше среднего по сложности разработки — на 8 из 10;&lt;/li&gt;
    &lt;li id=&quot;uqGv&quot;&gt;уверенность почти 100%, но что-то может пойти не так, поэтому 80%.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;TVfH&quot;&gt;Impact (5) × Confidence (80%) / Effort (7) = 0,57 условной единицы оценки.&lt;/p&gt;
  &lt;p id=&quot;GHi7&quot;&gt;Очень часто классического ICE недостаточно, например, если нужно не просто приоритизировать фичи внутри команды, но и выбрать между собственной разработкой, покупкой вендорского решения или «ручным бэкендом» операционной команды.&lt;/p&gt;
  &lt;p id=&quot;ZQ0X&quot;&gt;Для таких случаев подходит более точный вариант — финансовый ICE — подсчет выгоды от вложения денег в разработку фичи или, как говорят финансисты, profit &amp;amp; loss (PnL): дословно «прибыль и убытки». Финансовый вариант сложнее для расчета, но зато оперирует понятными для руководства измерениями — затратами и экономическим эффектом в деньгах.&lt;/p&gt;
  &lt;figure id=&quot;obAl&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/80e/597/082/80e5970827ec774f48d0106eafe174a4.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ghul&quot;&gt;В этом случае:&lt;/p&gt;
  &lt;ul id=&quot;Rgch&quot;&gt;
    &lt;li id=&quot;7GVt&quot;&gt;Impact считается в долларах или рублях;&lt;/li&gt;
    &lt;li id=&quot;n1ug&quot;&gt;Confidence, как и раньше, в процентах от никакой 0% до абсолютной уверенности 100% в успехе фичи;&lt;/li&gt;
    &lt;li id=&quot;GCeS&quot;&gt;Effort в стоимости разработки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;PNTh&quot;&gt;А оценка нашей фичи из примера будет такова:&lt;/p&gt;
  &lt;ul id=&quot;5xXT&quot;&gt;
    &lt;li id=&quot;DKBg&quot;&gt;охват 100 тыс. пользователей; считаем экономию для каждого: частота 10 сообщений в год, стоимость одного сообщения 2 рубля через SMS, push — 0.5 рублей с учетом поддержки этого канала;&lt;/li&gt;
    &lt;li id=&quot;UjwI&quot;&gt;Confidence — тот же, 80%;&lt;/li&gt;
    &lt;li id=&quot;bs4V&quot;&gt;20 дней разработки = 700 тыс. руб.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;COvb&quot;&gt;Impact (100 тыс. пользователей × 10 сообщений в год × (2 — 0.5) руб. экономии) × 80% — 700 тыс. руб. = 500 тыс. руб.&lt;/p&gt;
  &lt;h3 id=&quot;sg6z&quot;&gt;Достоинства и недостатки ICE скоринга&lt;/h3&gt;
  &lt;p id=&quot;c7l9&quot;&gt;Подход ICE часто критикуют (например, &lt;a href=&quot;https://habr.com/ru/post/526432/&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;):&lt;/p&gt;
  &lt;ol id=&quot;y4us&quot;&gt;
    &lt;li id=&quot;Cqsc&quot;&gt;За субъективность. Разные люди оценивают по-разному или оценки меняются во времени.&lt;/li&gt;
    &lt;li id=&quot;w7Yr&quot;&gt;За манипулирование. Команда может попробовать хакнуть ICE и протащить любимую фичу вперед нужной.&lt;/li&gt;
    &lt;li id=&quot;VHqO&quot;&gt;За излишнюю простоту. ICE в условных единицах не покажешь инвестору.&lt;/li&gt;
    &lt;li id=&quot;LJfb&quot;&gt;За сложность. Если оценивать в деньгах, нужны усилия аналитиков и компетенции в построении финансовых моделей.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Mr5J&quot;&gt;Обсудим аргументы в защиту ICE, разобрав каждый из компонентов скоринга.&lt;/p&gt;
  &lt;h3 id=&quot;bk9L&quot;&gt;Impact&lt;/h3&gt;
  &lt;p id=&quot;CQgy&quot;&gt;Субъективная оценка хороша, когда продакту с тимлидом разработки нужно за один час отскорить десять фичей. Но давайте разберем, как относительно недорого снизить эту субъективность.&lt;/p&gt;
  &lt;p id=&quot;VJxA&quot;&gt;Чтобы не углубляться в юнит-экономику, тонкости расчета lifetime value, разберем простой пример: вы продакт внутреннего продукта службы поддержки клиентов. Ваша фича — внедрение чат-бота в личном кабинете клиента для снижения нагрузки на телефонную поддержку.&lt;/p&gt;
  &lt;p id=&quot;1Loz&quot;&gt;Хороший продакт знает, какие данные чаще всего используются в расчетах, и сможет прикинуть эффект самостоятельно, но для более сложных случаев чаще всего обращаются к аналитикам или надевают их шляпу.&lt;/p&gt;
  &lt;p id=&quot;0K0P&quot;&gt;Какие данные могут пригодиться для расчета?&lt;/p&gt;
  &lt;ul id=&quot;CtnB&quot;&gt;
    &lt;li id=&quot;1CM3&quot;&gt;кол-во клиентов;&lt;/li&gt;
    &lt;li id=&quot;M6XA&quot;&gt;% клиентов с обращениями в саппорт;&lt;/li&gt;
    &lt;li id=&quot;7Xb3&quot;&gt;среднее количество обращений в саппорт за год;&lt;/li&gt;
    &lt;li id=&quot;wrlU&quot;&gt;стоимость обработки обращений в чате и по телефону;&lt;/li&gt;
    &lt;li id=&quot;1Yar&quot;&gt;доля обращений в чат среди всех обращений;&lt;/li&gt;
    &lt;li id=&quot;ZxrB&quot;&gt;% автоматизации однотипных обращений в чат;&lt;/li&gt;
    &lt;li id=&quot;P0I2&quot;&gt;стоимость обращения недовольного клиента, который пожалуется аккаунт менеджеру или даже генеральному директору.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;lRNk&quot;&gt;Допустим, эти данные есть — что дальше?&lt;/p&gt;
  &lt;p id=&quot;VjNu&quot;&gt;Нужно рассчитать &lt;strong&gt;бизнес-кейс&lt;/strong&gt; — экономический эффект по максимально простой формуле.&lt;/p&gt;
  &lt;p id=&quot;FvPV&quot;&gt;Для нашего примера бизнес-кейс можно подсчитать так:&lt;/p&gt;
  &lt;ul id=&quot;Rm7d&quot;&gt;
    &lt;li id=&quot;yZ9P&quot;&gt;100 тыс. пользователей × 10% доля тех, кто обращается в саппорт × 5 обращений в год × 30% доля обращений в чат × 50% потенциал автоматизации × 50 рублей экономии на звонках — 50000 руб. за внедрение внешнего решения — 15000 чатов × 1 руб. выплаты вендору = 310 тыс. руб.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Efxu&quot;&gt;Если вы используете внешний API, его лучше учесть именно в экономическом эффекте вместе с платежами партнерам за внедрение. Затраты вашей команды на интеграцию нужно относить к Effort (усилиям).&lt;/p&gt;
  &lt;p id=&quot;gdBE&quot;&gt;Конечно, точность оценки отдельных компонент бизнес-кейса невысока. А еще мы могли забыть что-то учесть. Но зато вся логика на виду и это основное преимущество подхода. Более точную оценку, например, по потенциалу автоматизации, можно потом подставить в формулу и быстро пересчитать ICE.&lt;/p&gt;
  &lt;p id=&quot;qzAV&quot;&gt;Чтобы получить более точную, хотя и консервативную оценку, считайте Impact не на всех клиентов, а на конкретный сегмент или даже тематику обращений в саппорт, с которыми вы знакомы лучше всего. Например, если 50% обращений по статусу заказа, давайте оценим потенциал автоматизации через чат-бот только по этой тематике. Возможно, эффект будет настолько больши́м, что кратно окупит разработку.&lt;/p&gt;
  &lt;h3 id=&quot;l18w&quot;&gt;Confidence&lt;/h3&gt;
  &lt;p id=&quot;OB8P&quot;&gt;Чтобы рассчитать уверенность или веру в успех, нужно провалидировать фичу. Это хлеб с маслом для продакта и тема отдельной статьи. Но не стоит полагаться только на свое мнение (или оценку автора идеи фичи).&lt;/p&gt;
  &lt;p id=&quot;kVev&quot;&gt;Я обычно применял &lt;a href=&quot;https://itamargilad.com/the-tool-that-will-help-you-choose-better-product-ideas/&quot; target=&quot;_blank&quot;&gt;метод Confidence-meter от Итамара Гилада&lt;/a&gt;, где мнение одного или нескольких коллег дает в лучшем случае 20% уверенности, а полноценная проверка гипотез через интервью, MVP и А/Б-тесты повышает Confidence до 60–95%. 100% по Гиладу не бывает никогда.&lt;/p&gt;
  &lt;p id=&quot;C5Dl&quot;&gt;Мой совет на этапе оценки уверенности — максимально отключить самоуверенность и сфокусироваться на «накоплении» Confidence с помощью подходящих способов валидации того, что проблема существует, а ваша фича решает эту проблему достаточно эффективно.&lt;/p&gt;
  &lt;h3 id=&quot;pvBK&quot;&gt;Effort и его рост&lt;/h3&gt;
  &lt;p id=&quot;JAGZ&quot;&gt;Перейдем к оценке усилий и трудозатрат.&lt;/p&gt;
  &lt;p id=&quot;93Gr&quot;&gt;Здесь я вижу две проблемы.&lt;/p&gt;
  &lt;p id=&quot;KPBA&quot;&gt;Первая — сложность оценки effort до подготовки полных требований к продукту, а вторая — технический долг.&lt;/p&gt;
  &lt;p id=&quot;Nn8V&quot;&gt;Как правило, оценка сложности занижена.&lt;/p&gt;
  &lt;p id=&quot;lqdK&quot;&gt;Ниже пример из моего опыта, когда после предварительной оценки окончательная вырастала на 36–100%, в среднем на 63%. Причина простая: предварительная оценка хорошо описывала известную сложность, то есть была консервативной («не менее, чем...») и оптимистичной («вроде это несложно»).&lt;/p&gt;
  &lt;p id=&quot;iR7z&quot;&gt;&lt;strong&gt;Effort (high-level)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;wU77&quot;&gt;&lt;strong&gt;Effort (after grooming)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;7k3p&quot;&gt;&lt;strong&gt;Effort difference&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Fz7Y&quot;&gt;Group budgets&lt;/p&gt;
  &lt;p id=&quot;QQ3H&quot;&gt;40&lt;/p&gt;
  &lt;p id=&quot;bQHq&quot;&gt;70&lt;/p&gt;
  &lt;p id=&quot;UmLd&quot;&gt;75%&lt;/p&gt;
  &lt;p id=&quot;eZFR&quot;&gt;3DS add card flow&lt;/p&gt;
  &lt;p id=&quot;GHDy&quot;&gt;15&lt;/p&gt;
  &lt;p id=&quot;Mcwb&quot;&gt;22&lt;/p&gt;
  &lt;p id=&quot;a5t5&quot;&gt;47%&lt;/p&gt;
  &lt;p id=&quot;cJG0&quot;&gt;API credentials&lt;/p&gt;
  &lt;p id=&quot;70th&quot;&gt;25&lt;/p&gt;
  &lt;p id=&quot;2p2X&quot;&gt;48&lt;/p&gt;
  &lt;p id=&quot;TRov&quot;&gt;92%&lt;/p&gt;
  &lt;p id=&quot;0FzC&quot;&gt;Invite statuses&lt;/p&gt;
  &lt;p id=&quot;uFN7&quot;&gt;15&lt;/p&gt;
  &lt;p id=&quot;Qcb1&quot;&gt;23&lt;/p&gt;
  &lt;p id=&quot;wHHN&quot;&gt;53%&lt;/p&gt;
  &lt;p id=&quot;Oveu&quot;&gt;Reports columns customisation&lt;/p&gt;
  &lt;p id=&quot;cyot&quot;&gt;14&lt;/p&gt;
  &lt;p id=&quot;0gGi&quot;&gt;19&lt;/p&gt;
  &lt;p id=&quot;IkXg&quot;&gt;36%&lt;/p&gt;
  &lt;p id=&quot;9Z4j&quot;&gt;Booker assignment&lt;/p&gt;
  &lt;p id=&quot;lol3&quot;&gt;15&lt;/p&gt;
  &lt;p id=&quot;XU7l&quot;&gt;27&lt;/p&gt;
  &lt;p id=&quot;33Rs&quot;&gt;80%&lt;/p&gt;
  &lt;p id=&quot;TMfc&quot;&gt;Automatic limit for Client X&lt;/p&gt;
  &lt;p id=&quot;1X3T&quot;&gt;15&lt;/p&gt;
  &lt;p id=&quot;64R1&quot;&gt;30&lt;/p&gt;
  &lt;p id=&quot;67QK&quot;&gt;100%&lt;/p&gt;
  &lt;p id=&quot;ySaB&quot;&gt;Subscriptions&lt;/p&gt;
  &lt;p id=&quot;yezI&quot;&gt;50&lt;/p&gt;
  &lt;p id=&quot;uD7z&quot;&gt;70&lt;/p&gt;
  &lt;p id=&quot;8yCu&quot;&gt;40%&lt;/p&gt;
  &lt;p id=&quot;iIKE&quot;&gt;Total&lt;/p&gt;
  &lt;p id=&quot;Frjw&quot;&gt;189&lt;/p&gt;
  &lt;p id=&quot;n7XV&quot;&gt;309&lt;/p&gt;
  &lt;p id=&quot;AQcm&quot;&gt;63%&lt;/p&gt;
  &lt;p id=&quot;cz5z&quot;&gt;Я выхожу из ситуации просто — учитываю рост трудозатрат с обнаружением сложности и увеличиваю первоначальную оценку на 63% (этот коэффициент получен эмпирическим путем и работает для моей команды).&lt;/p&gt;
  &lt;h3 id=&quot;6sd1&quot;&gt;Вишенка на торте — калькулятор стоимости человеко-дня&lt;/h3&gt;
  &lt;p id=&quot;trf5&quot;&gt;Очень классно, если в вашей компании есть оговоренная стоимость одного человеко-дня разработки, рассчитанная финансистами по всем правилам. Однако, если этого нет, но хочется понять, чем отличается зарплата на руки и стоимость дня для бизнеса, можно попробовать посчитать.&lt;/p&gt;
  &lt;p id=&quot;HYke&quot;&gt;Я не нашел годного расчета, поэтому запилил свой &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1PNcxJZBsMW74yCz1eiY4MWmMEKb43Z-gUlfXg77t_70/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;Калькулятор стоимости 1 дня разработки&lt;/a&gt;:&lt;/p&gt;
  &lt;ul id=&quot;36fB&quot;&gt;
    &lt;li id=&quot;NP93&quot;&gt;200 тыс. руб. на руки получает в среднем разработчик в Москве согласно &lt;a href=&quot;https://habr.com/ru/article/679698/&quot; target=&quot;_blank&quot;&gt;исследованию Хабра&lt;/a&gt;, то есть примерно &lt;strong&gt;10 тыс. руб.&lt;/strong&gt; за рабочий день.&lt;/li&gt;
    &lt;li id=&quot;WnlJ&quot;&gt;Со всеми налогами и накладными издержками один день разработки обходится для компании:&lt;/li&gt;
    &lt;ul id=&quot;TxWX&quot;&gt;
      &lt;li id=&quot;HV4p&quot;&gt;&lt;strong&gt;39 тыс. руб.&lt;/strong&gt; для аккредитованной IT-компании;&lt;/li&gt;
      &lt;li id=&quot;orVa&quot;&gt;&lt;strong&gt;45 тыс. руб.&lt;/strong&gt; для обычной компании без налоговых льгот.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ISgu&quot;&gt;Средняя фича может стоить &lt;strong&gt;1 млн руб.&lt;/strong&gt; для компании, так что надо быть уверенным, стоит ее делать или нет. Здесь логично разместить рекламу аутсорс-разработки (становится понятно, почему даже компании с сильной in-house командой привлекают внешнюю помощь).&lt;/p&gt;
  &lt;h3 id=&quot;ILR1&quot;&gt;Трудозатраты: взгляд разработчика&lt;/h3&gt;
  &lt;p id=&quot;a57p&quot;&gt;В калькуляторе выше вы видели 20% времени, заложенных на технический долг. Это обычная практика. Мой коллега — тимлид — согласился пояснить, почему это так.&lt;/p&gt;
  &lt;p id=&quot;Xk8v&quot;&gt;Слово Стасу:&lt;/p&gt;
  &lt;ul id=&quot;bgKw&quot;&gt;
    &lt;li id=&quot;d50k&quot;&gt;&lt;em&gt;Откуда к нам приходят фичи? Компания ставит цели, договаривается с командами о приоритетных направлениях, формулирует OKR. Для выполнения OKR придумываются гипотезы, часть из них попадает в разработку.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;6Q2h&quot;&gt;&lt;em&gt;Задачи приходят к нам в виде эпиков — улучшений продукта, которые можно сделать за один-максимум два спринта. Я слежу за тем, чтобы эпики не превышали 15–20 стори поинтов и предлагаю продакту фазировать улучшения. С помощью дробления повышается и точность оценки трудозатрат, и сокращаются сроки релизов.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;pkFY&quot;&gt;&lt;em&gt;Основной конфликт: продакт хочет фичи, разработчики не хотят продуктовый долг.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;EY91&quot;&gt;&lt;em&gt;Продакт хочет, чтобы фичи делались дешево, потом стоимость владения не увеличивалась.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;adts&quot;&gt;&lt;em&gt;Чтобы разрешить этот конфликт, мы договорились, что 20% трудозатрат отдаем на погашение тех долга. Этот резерв распределяет команда разработки.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;zf4B&quot;&gt;&lt;em&gt;Сменятся поколения продактов и разработчиков, но нужно отдавать старые долги.&lt;/em&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;nKfz&quot;&gt;Что нужно, чтобы приоритизация заработала&lt;/h3&gt;
  &lt;ol id=&quot;30uZ&quot;&gt;
    &lt;li id=&quot;Bsqr&quot;&gt;Сначала стратегия, потом фичи.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;1tJs&quot;&gt;ICE не дает ответ на вопрос, как компании победить конкурентов или что нужно делать в ближайшее время. Если просто приоритизировать все запросы на фичи — это:&lt;/p&gt;
  &lt;ul id=&quot;bf1L&quot;&gt;
    &lt;li id=&quot;aGrf&quot;&gt;займет много времени;&lt;/li&gt;
    &lt;li id=&quot;2zLA&quot;&gt;может расфокусировать команду.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1kAC&quot;&gt;На мой взгляд, это одна из главных проблем, на которых может сломаться приоритизация. Что можно сделать: пройти обратным путем — от фичи к цели компании, как об этом говорил Стас в первом пункте.&lt;/p&gt;
  &lt;ol id=&quot;nImN&quot;&gt;
    &lt;li id=&quot;t8TF&quot;&gt;Договоритесь в компании о единой методологии оценки.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;rbb1&quot;&gt;Вторая преграда для внедрения ICE или другой методологии — приоритизация должна быть сквозной, то есть единой для всех команд, которые тесно работают друг с другом. Это одна из задач директора по продуктам (Chief Product Officer) — придумать одинаковые правила игры.&lt;/p&gt;
  &lt;ol id=&quot;onUc&quot;&gt;
    &lt;li id=&quot;4ikk&quot;&gt;Приоритизируйте крупные фичи, затем всё остальное.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;1g5n&quot;&gt;Дальше поделюсь базовой рекомендацией от Стивена Кови — планируй сначала крупные и важные дела. Сначала большие камни, потом галька, затем песок.&lt;/p&gt;
  &lt;p id=&quot;SzdH&quot;&gt;Допустим, команда может за месяц сделать одну-две крупных фичи, а три уже нет. Тогда в нашу емкость с ресурсами нужно положить сначала две крупных фичи, потом три средних, остальное отдать мелким фичам. Если заполнять в противоположном порядке, может не хватить места для крупного и важного.&lt;/p&gt;
  &lt;figure id=&quot;A8y6&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/d0f/f38/a19/d0ff38a19f3865e18de0dc1fe55a8f8e.png&quot; width=&quot;1024&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;zXtw&quot;&gt;
    &lt;li id=&quot;1ruH&quot;&gt;Используйте инструменты для фиксирования и автоматического обновления ICE.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Yl1i&quot;&gt;В Jira и другом ПО для приоритизации есть возможность добавлять ICE-score к каждой задаче. По моему опыту еще лучше дополнительно разложить ICE на impact, confidence и effort и сделать один слайд (1-pager) для руководства, чтобы более широкому кругу, а не только команде разработки, было понятно, как компания тратит деньги и что получит взамен.&lt;/p&gt;
  &lt;h3 id=&quot;JSOv&quot;&gt;Заключение&lt;/h3&gt;
  &lt;p id=&quot;R2gK&quot;&gt;Подведем итог,&lt;/p&gt;
  &lt;ol id=&quot;xPKg&quot;&gt;
    &lt;li id=&quot;DT24&quot;&gt;Используйте ICE вместо RICE (Impact может включать в себя Reach).&lt;/li&gt;
    &lt;li id=&quot;w1k3&quot;&gt;Как расшифровывать E — решать вам. Это ease (сложность реализации) или величина обратно пропорциональная — effort (усилия).&lt;/li&gt;
    &lt;li id=&quot;6iQO&quot;&gt;Быстрый ICE в условных единицах подходит для скоринга 100 задач. Если надо выбирать из 20 — посчитайте ICE в деньгах.&lt;/li&gt;
    &lt;li id=&quot;zjJJ&quot;&gt;Бизнес-кейс — фундамент для оценки эффекта (Impact). Постарайтесь, чтобы ваша формула для экономического эффекта была простой и проверяемой. Компоненты для формулы держите под рукой.&lt;/li&gt;
    &lt;li id=&quot;CqIm&quot;&gt;Уверенность (Confidence) не должна строиться только на харизме автора идеи, идеи нужно проверять, чтобы сделать Confidence ближе к 100% — интервью с клиентами хорошо, тестовый запуск еще лучше.&lt;/li&gt;
    &lt;li id=&quot;TF9j&quot;&gt;Трудозатраты (Effort) можно считать в человеко-днях или story points. Заложите рост оценки усилий на разработку по мере углубления в требования по фиче.&lt;/li&gt;
    &lt;li id=&quot;MCHZ&quot;&gt;За человеко-день разработчик получит на руки 10 тыс. руб., а компании этот день обойдется в 39 тыс. руб. из-за налогов, бенефитов и накладных расходов. Не забывайте про деньги, когда загружайте in-house разработку, и нанимайте аутсорсеров для отдельных задач.&lt;/li&gt;
    &lt;li id=&quot;EssG&quot;&gt;Effort генерит технический долг. Договоритесь с разработчиками о его размере и способах погашения.&lt;/li&gt;
    &lt;li id=&quot;H80b&quot;&gt;Чтобы приоритизация прижилась в компании:&lt;/li&gt;
    &lt;ol id=&quot;PBen&quot;&gt;
      &lt;li id=&quot;o1ZE&quot;&gt;Приоритизируйте задачи, связанные со стратегическим выбором компании. Проверяйте цепочку от фичи к целям компании.&lt;/li&gt;
      &lt;li id=&quot;xkig&quot;&gt;Договоритесь со всеми смежными командами о единой методологии приоритизации.&lt;/li&gt;
      &lt;li id=&quot;RN9o&quot;&gt;Приоритизируйте по Стивену Кови — сначала внутри списка крупных задач, потом переходите к средним и небольшим.&lt;/li&gt;
      &lt;li id=&quot;xtqx&quot;&gt;Упрощайте расчет ICE через трекеры задач.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;RQmb&quot;&gt;Если хотите обсудить продакт-менеджмент, приоритизацию, добавляйтесь в &lt;a href=&quot;https://www.linkedin.com/in/dmitry-garmashev-19653852&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; или пишите в личку в &lt;a href=&quot;https://t.me/dima_g&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;BBSP&quot;&gt;Теги:&lt;/p&gt;
  &lt;ul id=&quot;7ez7&quot;&gt;
    &lt;li id=&quot;DlPN&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B1%D1%8D%D0%BA%D0%BB%D0%BE%D0%B3%D0%BE%D0%BC]&quot; target=&quot;_blank&quot;&gt;управление бэклогом&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;kvZ3&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F]&quot; target=&quot;_blank&quot;&gt;приоритизация&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;dSzd&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[rice]&quot; target=&quot;_blank&quot;&gt;rice&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;YlWL&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[ice]&quot; target=&quot;_blank&quot;&gt;ice&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;vNxs&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8]&quot; target=&quot;_blank&quot;&gt;стоимость разработки&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;AfwG&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA%D0%BE-%D1%87%D0%B0%D1%81]&quot; target=&quot;_blank&quot;&gt;человеко-час&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cIgg&quot;&gt;Хабы:&lt;/p&gt;
  &lt;ul id=&quot;aWzk&quot;&gt;
    &lt;li id=&quot;OUcp&quot;&gt;&lt;a href=&quot;https://habr.com/ru/hubs/dev_management/&quot; target=&quot;_blank&quot;&gt;Управление разработкой&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;SyQu&quot;&gt;&lt;a href=&quot;https://habr.com/ru/hubs/pm/&quot; target=&quot;_blank&quot;&gt;Управление проектами&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;sUss&quot;&gt;&lt;a href=&quot;https://habr.com/ru/hubs/productpm/&quot; target=&quot;_blank&quot;&gt;Управление продуктом&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cJD5&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;lVHc&quot;&gt;Источник: &lt;a href=&quot;https://habr.com/ru/articles/698962/&quot; target=&quot;_blank&quot;&gt;Приоритизация бэклога. Зачем нужны фреймворки и как работать по ICE — опыт менеджера с 5-летним стажем / Хабр (habr.com)&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>shmarou:sysDesign</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/sysDesign?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>System design</title><published>2024-06-21T16:13:30.621Z</published><updated>2024-06-21T16:13:30.621Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/d8/aa/d8aaa4cb-c743-48b1-8add-77379148d7cc.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://habrastorage.org/r/w1560/webt/t2/9c/zj/t29czj6ljgkbqewzm7qawa1xl3s.png&quot;&gt;В шпаргалке на высоком уровне рассматриваются такие вещи, как протоколы коммуникации, DevOps, CI/CD, архитектурные паттерны, базы данных, кэширование, микросервисы (и монолиты), платежные системы, Git, облачные сервисы etc. Особую ценность представляют диаграммы — рекомендую уделить им пристальное внимание. Полагаю, шпаргалка будет интересна всем, кто хоть как-то связан с разработкой программного обеспечения и, прежде всего, веб-приложений. Буду признателен за помощь в уточнении/исправлении понятий, терминологии, логики/алгоритмов работы систем (в рамках того, что по этому поводу содержится в оригинале), а также в обнаружении очепяток.</summary><content type="html">
  &lt;p id=&quot;BspZ&quot;&gt;В шпаргалке на высоком уровне рассматриваются такие вещи, как протоколы коммуникации, DevOps, CI/CD, архитектурные паттерны, базы данных, кэширование, микросервисы (и монолиты), платежные системы, Git, облачные сервисы etc. Особую ценность представляют диаграммы — рекомендую уделить им пристальное внимание. Полагаю, шпаргалка будет интересна всем, кто хоть как-то связан с разработкой программного обеспечения и, прежде всего, веб-приложений. Буду признателен за помощь в уточнении/исправлении понятий, терминологии, логики/алгоритмов работы систем (в рамках того, что по этому поводу содержится в оригинале), а также в обнаружении очепяток.&lt;/p&gt;
  &lt;p id=&quot;CdFO&quot;&gt;Выражаю благодарность &lt;a href=&quot;https://t.me/Anna_Neva&quot; target=&quot;_blank&quot;&gt;Анне Неустроевой&lt;/a&gt; за помощь в редактировании материала.&lt;/p&gt;
  &lt;p id=&quot;UmGv&quot;&gt;Возможно, &lt;a href=&quot;https://my-js.org/docs/cheatsheet/system-design-101&quot; target=&quot;_blank&quot;&gt;немного другой формат шпаргалки&lt;/a&gt; покажется вам более удобным.&lt;/p&gt;
  &lt;p id=&quot;vILH&quot;&gt;&lt;a href=&quot;https://my-js.org/assets/files/system_design-89ea3329b17dd21409f625db90073fb4.pdf&quot; target=&quot;_blank&quot;&gt;System Design (сборник на английском языке).&lt;/a&gt;&lt;/p&gt;
  &lt;ul id=&quot;IBMq&quot;&gt;
    &lt;li id=&quot;NWQY&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B&quot; target=&quot;_blank&quot;&gt;Протоколы&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;7yVL&quot;&gt;
      &lt;li id=&quot;mBB3&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#rest-%D0%B8-graphql&quot; target=&quot;_blank&quot;&gt;REST и GraphQL&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;bmyW&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#grpc&quot; target=&quot;_blank&quot;&gt;gRPC&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;18fG&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#webhook&quot; target=&quot;_blank&quot;&gt;Webhook&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;8gnh&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C-api&quot; target=&quot;_blank&quot;&gt;Производительность API&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;SnNu&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#http-10---http-11---http-20---http-30-quic&quot; target=&quot;_blank&quot;&gt;HTTP 1.0 -&amp;gt; HTTP 1.1 -&amp;gt; HTTP 2.0 -&amp;gt; HTTP 3.0 (QUIC)&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;Yfbs&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#soap-rest-graphql-%D0%B8-rpc&quot; target=&quot;_blank&quot;&gt;SOAP, REST, GraphQL и RPC&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;JXjE&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%81%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0-%D0%BA%D0%BE%D0%B4-%D0%B8-%D1%81%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0-api&quot; target=&quot;_blank&quot;&gt;Сначала код и сначала API&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;NmII&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BA%D0%BE%D0%B4%D1%8B-%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D0%BE%D0%B2-http&quot; target=&quot;_blank&quot;&gt;Коды статусов HTTP&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;tV3A&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%88%D0%BB%D1%8E%D0%B7-api&quot; target=&quot;_blank&quot;&gt;Шлюз API&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;xToP&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5-%D0%B8-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B5-api&quot; target=&quot;_blank&quot;&gt;Эффективное и безопасное API&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;JX3W&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B8%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-tcpip&quot; target=&quot;_blank&quot;&gt;Инкапсуляция TCP/IP&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;fUEa&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-nginx-%D0%BD%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%8E%D1%82-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8&quot; target=&quot;_blank&quot;&gt;Почему NGINX называют &amp;quot;обратным&amp;quot; прокси?&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;hI2Q&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B-%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8-%D0%BD%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8&quot; target=&quot;_blank&quot;&gt;Алгоритмы балансировки нагрузки&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;FLpZ&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#url-uri-%D0%B8-urn&quot; target=&quot;_blank&quot;&gt;URL, URI и URN&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;wy9x&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#cicd&quot; target=&quot;_blank&quot;&gt;CI/CD&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;qtqt&quot;&gt;
      &lt;li id=&quot;Avlj&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#cicd-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%8B%D0%BC%D0%B8-%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D0%BC%D0%B8&quot; target=&quot;_blank&quot;&gt;CI/CD простыми словами&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;OICh&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%81%D1%82%D0%B5%D0%BA-netflix-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80-cicd&quot; target=&quot;_blank&quot;&gt;Технический стек Netflix (конвейер CI/CD)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;t3Rr&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B&quot; target=&quot;_blank&quot;&gt;Архитектурные паттерны&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;YOia&quot;&gt;
      &lt;li id=&quot;1yRj&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#mvc-mvp-mvvm-mvvm-c-%D0%B8-viper&quot; target=&quot;_blank&quot;&gt;MVC, MVP, MVVM, MVVM-C и VIPER&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;H2Td&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#18-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D1%85-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D1%85-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;18 основных архитектурных паттернов&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;VT8G&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&quot; target=&quot;_blank&quot;&gt;База данных&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;mCZv&quot;&gt;
      &lt;li id=&quot;dmuN&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#8-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%83%D0%BB%D1%83%D1%87%D1%88%D0%B0%D1%8E%D1%89%D0%B8%D1%85-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83-%D0%B1%D0%B0%D0%B7-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&quot; target=&quot;_blank&quot;&gt;8 структур данных, улучшающих работу баз данных&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;D70t&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%8E%D1%82%D1%81%D1%8F-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8-sql-%D0%B2-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&quot; target=&quot;_blank&quot;&gt;Выполнение инструкции SQL в базе данных&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;SoHO&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0-cap&quot; target=&quot;_blank&quot;&gt;Теорема CAP&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;Y2om&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%82%D0%B8%D0%BF%D1%8B-%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8-%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&quot; target=&quot;_blank&quot;&gt;Типы памяти и хранилищ данных&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;ki9a&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-sql&quot; target=&quot;_blank&quot;&gt;Визуализация запроса SQL&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;LBsT&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%8F%D0%B7%D1%8B%D0%BA-sql&quot; target=&quot;_blank&quot;&gt;Язык SQL&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;l9BZ&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BA%D1%8D%D1%88&quot; target=&quot;_blank&quot;&gt;Кэш&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;7F23&quot;&gt;
      &lt;li id=&quot;CEBG&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&quot; target=&quot;_blank&quot;&gt;Кэширование данных&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;BVV5&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B-%D0%B2%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D0%B9-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-redis&quot; target=&quot;_blank&quot;&gt;Причины высокой производительности Redis&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;IAmZ&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-redis&quot; target=&quot;_blank&quot;&gt;Случаи использования Redis&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;3AR6&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D0%B8-%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F&quot; target=&quot;_blank&quot;&gt;Стратегии кэширования&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;qHUx&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BD%D0%B0%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0&quot; target=&quot;_blank&quot;&gt;Микросервисная архитектура&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;LrKY&quot;&gt;
      &lt;li id=&quot;oX4y&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%82%D0%B8%D0%BF%D0%B8%D1%87%D0%BD%D0%B0%D1%8F-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BD%D0%B0%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0&quot; target=&quot;_blank&quot;&gt;Типичная микросервисная архитектура&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;I5RA&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;Лучшие практики микросервисов&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;4Eg4&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%82%D0%B8%D0%BF%D0%B8%D1%87%D0%BD%D1%8B%D0%B9-%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%81%D1%82%D0%B5%D0%BA-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;Типичный технический стек микросервисов&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;lUt8&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B-%D0%B2%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D0%B9-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-kafka&quot; target=&quot;_blank&quot;&gt;Причины высокой производительности Kafka&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;Bczi&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%BD%D1%8B%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&quot; target=&quot;_blank&quot;&gt;Платежные системы&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;yFaq&quot;&gt;
      &lt;li id=&quot;AXzY&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BA%D1%80%D0%B5%D0%B4%D0%B8%D1%82%D0%BD%D1%83%D1%8E-%D0%BA%D0%B0%D1%80%D1%82%D1%83-%D0%BD%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%8E%D1%82-%D1%81%D0%B0%D0%BC%D1%8B%D0%BC-%D0%B2%D1%8B%D0%B3%D0%BE%D0%B4%D0%BD%D1%8B%D0%BC-%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%BC-%D0%B1%D0%B0%D0%BD%D0%BA%D0%B0-%D0%BA%D0%B0%D0%BA-visamastercard-%D0%B4%D0%B5%D0%BB%D0%B0%D1%8E%D1%82-%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8&quot; target=&quot;_blank&quot;&gt;Почему кредитную карту называют &amp;quot;самым выгодным продуктом банка&amp;quot;? Как VISA/Mastercard делают деньги?&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;KWPF&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-visa&quot; target=&quot;_blank&quot;&gt;Принцип работы VISA&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;HWc4&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#devops&quot; target=&quot;_blank&quot;&gt;DevOps&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;sW7a&quot;&gt;
      &lt;li id=&quot;84Xx&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#devops-sre-%D0%B8-platform-engineering&quot; target=&quot;_blank&quot;&gt;DevOps, SRE и Platform Engineering&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;TVg0&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-kubernetes&quot; target=&quot;_blank&quot;&gt;Что такое Kubernetes?&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;CoC4&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#docker-%D0%B8-kubernetes&quot; target=&quot;_blank&quot;&gt;Docker и Kubernetes&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;iJPb&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-docker&quot; target=&quot;_blank&quot;&gt;Принцип работы Docker&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;tEoG&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#git&quot; target=&quot;_blank&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;YQne&quot;&gt;
      &lt;li id=&quot;Dwa5&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4-git&quot; target=&quot;_blank&quot;&gt;Принцип работы команд Git&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;B3Ue&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-git&quot; target=&quot;_blank&quot;&gt;Принцип работы Git&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;7y0q&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#git-merge-%D0%B8-git-rebase&quot; target=&quot;_blank&quot;&gt;Git merge и git rebase&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;LNhL&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BE%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D1%8B%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B&quot; target=&quot;_blank&quot;&gt;Облачные сервисы&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;xtWr&quot;&gt;
      &lt;li id=&quot;fPy3&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5-%D0%BE%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D1%8B%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-%D0%BF%D0%BE-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8E-%D0%BD%D0%B0-2023-%D0%B3%D0%BE%D0%B4&quot; target=&quot;_blank&quot;&gt;Популярные облачные сервисы по состоянию на 2023 год&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;DW5k&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BE%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D0%B0%D1%8F-%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C&quot; target=&quot;_blank&quot;&gt;Облачная нативность&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;ioMI&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-%D0%BF%D0%BE%D0%B2%D1%8B%D1%88%D0%B0%D1%8E%D1%89%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8&quot; target=&quot;_blank&quot;&gt;Инструменты, повышающие продуктивность разработки&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;zYl9&quot;&gt;
      &lt;li id=&quot;ITFM&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-json&quot; target=&quot;_blank&quot;&gt;Визуализация файлов JSON&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;cSYR&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%B4%D0%B0-%D0%B2-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5-%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&quot; target=&quot;_blank&quot;&gt;Автоматические преобразование кода в архитектурные диаграммы&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;5nLX&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#linux&quot; target=&quot;_blank&quot;&gt;Linux&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;5eLx&quot;&gt;
      &lt;li id=&quot;ynZG&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-linux&quot; target=&quot;_blank&quot;&gt;Файловая система Linux&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;6RCu&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#18-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D1%85-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4-linux&quot; target=&quot;_blank&quot;&gt;18 основных команд Linux&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;BvbF&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C&quot; target=&quot;_blank&quot;&gt;Безопасность&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;uHMb&quot;&gt;
      &lt;li id=&quot;UrR4&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-https&quot; target=&quot;_blank&quot;&gt;Принцип работы HTTPS&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;qaIp&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#oauth-20-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%8B%D0%BC%D0%B8-%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D0%BC%D0%B8&quot; target=&quot;_blank&quot;&gt;OAuth 2.0 простыми словами&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;gO2s&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#4-%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5-%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D1%85-%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%BE%D0%B2-%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8&quot; target=&quot;_blank&quot;&gt;4 наиболее распространенных механизмов аутентификации&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;W2SW&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%81%D0%B5%D1%81%D1%81%D0%B8%D1%8F-%D0%BA%D1%83%D0%BA%D0%B8-jwt-sso-%D0%B8-oauth&quot; target=&quot;_blank&quot;&gt;Сессия, куки, JWT, SSO и OAuth&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;10pB&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%B9-%D0%B2-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B8-%D0%B8%D1%85-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8F&quot; target=&quot;_blank&quot;&gt;Безопасное хранение паролей в базе данных и их валидация&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;uewR&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#jwt-json-web-token-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%8B%D0%BC%D0%B8-%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D0%BC%D0%B8&quot; target=&quot;_blank&quot;&gt;JWT (JSON Web Token) простыми словами&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;0XE9&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-google-authenticator-%D0%B8-%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D1%85-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2-%D0%B4%D0%B2%D1%83%D1%85%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B9-%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8&quot; target=&quot;_blank&quot;&gt;Принцип работы Google Authenticator и других типов двухфакторной аутентификации&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;qySM&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&quot; target=&quot;_blank&quot;&gt;Реальные системы&lt;/a&gt;&lt;/li&gt;
    &lt;ul id=&quot;iIoS&quot;&gt;
      &lt;li id=&quot;0wcL&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%81%D1%82%D0%B5%D0%BA-netflix&quot; target=&quot;_blank&quot;&gt;Технический стек Netflix&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;FM4h&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-twitter-%D0%BF%D0%BE-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8E-%D0%BD%D0%B0-2022-%D0%B3%D0%BE%D0%B4&quot; target=&quot;_blank&quot;&gt;Архитектура Twitter по состоянию на 2022 год&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;7GqG&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D1%8D%D0%B2%D0%BE%D0%BB%D1%8E%D1%86%D0%B8%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B-airbnb-%D0%B2-%D1%82%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D1%85-15-%D0%BB%D0%B5%D1%82&quot; target=&quot;_blank&quot;&gt;Эволюция архитектуры Airbnb в течение последних 15 лет&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;uGsl&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BC%D0%BE%D0%BD%D0%BE%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9-%D0%B8-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8&quot; target=&quot;_blank&quot;&gt;Монорепозиторий и микрорепозитории&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;bTkj&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-stack-overflow&quot; target=&quot;_blank&quot;&gt;Архитектура Stack Overflow&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;q4Wn&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-amazon-prime-video-monitoring-%D0%BF%D0%B5%D1%80%D0%B5%D1%88%D0%B5%D0%BB-%D1%81-%D0%B1%D0%B5%D1%81%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D0%B9-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%BD%D0%B0-%D0%BC%D0%BE%D0%BD%D0%BE%D0%BB%D0%B8%D1%82-%D0%BA%D0%B0%D0%BA-%D1%8D%D1%82%D0%BE-%D0%BC%D0%BE%D0%B6%D0%B5%D1%82-%D1%81%D1%8D%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B8%D1%82%D1%8C-90-%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&quot; target=&quot;_blank&quot;&gt;Почему Amazon Prime Video Monitoring перешел с бессерверной архитектуры на монолит? Как это может сэкономить 90% стоимости?&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;NfHN&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BA%D0%B0%D0%BA-disney-hotstar-%D1%83%D0%B4%D0%B0%D0%BB%D0%BE%D1%81%D1%8C-%D1%81%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C-5-%D0%BC%D0%B8%D0%BB%D0%BB%D0%B8%D0%B0%D1%80%D0%B4%D0%BE%D0%B2-%D1%81%D0%BC%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-%D0%B2%D0%BE-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D1%82%D1%83%D1%80%D0%BD%D0%B8%D1%80%D0%B0&quot; target=&quot;_blank&quot;&gt;Как Disney Hotstar удалось собрать 5 миллиардов смайлов во время турнира?&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;qmkp&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BA%D0%B0%D0%BA-discord-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82-%D1%82%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D0%BE%D0%BD%D1%8B-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9&quot; target=&quot;_blank&quot;&gt;Как Discord хранит триллионы сообщений?&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;xM6N&quot;&gt;&lt;a href=&quot;https://habr.com/ru/articles/770564/#%D0%BA%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%82-%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D0%B5-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-youtube-tiktok-live-%D0%B8%D0%BB%D0%B8-twitch&quot; target=&quot;_blank&quot;&gt;Как работают прямые видеотрансляции на YouTube, TikTok Live или Twitch?&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;protokoly&quot;&gt;Протоколы&lt;/h2&gt;
  &lt;p id=&quot;fvl2&quot;&gt;Архитектура (дизайн) определяет, как разные компоненты приложения взаимодействуют друг с другом. Она обеспечивает эффективность, надежность и легкость интеграции с другими системами путем предоставления стандартного подхода к проектированию и разработке API. Наиболее популярными архитектурами являются следующие:&lt;/p&gt;
  &lt;figure id=&quot;TmkZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/t2/9c/zj/t29czj6ljgkbqewzm7qawa1xl3s.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;A88P&quot;&gt;
    &lt;li id=&quot;Ui8H&quot;&gt;SOAP:&lt;/li&gt;
    &lt;ul id=&quot;JmvS&quot;&gt;
      &lt;li id=&quot;oHCW&quot;&gt;зрелый, всесторонний, основанный на XML&lt;/li&gt;
      &lt;li id=&quot;BsNj&quot;&gt;хорошо подходит для корпоративных приложений&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;ThX5&quot;&gt;REST:&lt;/li&gt;
    &lt;ul id=&quot;wFeH&quot;&gt;
      &lt;li id=&quot;k4fn&quot;&gt;популярный, легкий в реализации, основанный на методах HTTP&lt;/li&gt;
      &lt;li id=&quot;77H3&quot;&gt;хорошо подходит для веб-сервисов&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;uSNV&quot;&gt;GraphQL:&lt;/li&gt;
    &lt;ul id=&quot;Sec3&quot;&gt;
      &lt;li id=&quot;577G&quot;&gt;язык запросов (query language), позволяющий запрашивать данные избирательно (частично)&lt;/li&gt;
      &lt;li id=&quot;vuk1&quot;&gt;меньше нагрузка на сеть, более быстрые ответы от сервера&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;odZG&quot;&gt;gRPC:&lt;/li&gt;
    &lt;ul id=&quot;Murh&quot;&gt;
      &lt;li id=&quot;CVCG&quot;&gt;современный, высокопроизводительный, основанный на буферах протоколов (protocol buffers)&lt;/li&gt;
      &lt;li id=&quot;VTZk&quot;&gt;хорошо подходит для микросервисов&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;MN8g&quot;&gt;WebSocket:&lt;/li&gt;
    &lt;ul id=&quot;SQv5&quot;&gt;
      &lt;li id=&quot;DgUw&quot;&gt;двусторонний, позволяет обмениваться данными в реальном времени, соединение остается открытым&lt;/li&gt;
      &lt;li id=&quot;9ySD&quot;&gt;хорошо подходит для обмена данными небольшого размера&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;hUVo&quot;&gt;Webhook:&lt;/li&gt;
    &lt;ul id=&quot;hhiN&quot;&gt;
      &lt;li id=&quot;hOax&quot;&gt;основанный на событиях и коллбэках HTTP, асинхронный&lt;/li&gt;
      &lt;li id=&quot;dT9Y&quot;&gt;хорошо подходит для систем уведомлений&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;rest-i-graphql&quot;&gt;REST и GraphQL&lt;/h3&gt;
  &lt;p id=&quot;b6ij&quot;&gt;Сравнение REST и GraphQL:&lt;/p&gt;
  &lt;figure id=&quot;0Ks9&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/sq/8y/ze/sq8yzec4_5mu51icf2rsofbabg4.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;KHvP&quot;&gt;
    &lt;li id=&quot;JqVC&quot;&gt;GraphQL – это язык запросов для API, разработанный Meta. Он предоставляет полное описание данных в API и позволяет клиенту запрашивать только то, что ему нужно&lt;/li&gt;
    &lt;li id=&quot;t9su&quot;&gt;сервер GraphQL является посредником между клиентом и сервером. GraphQL может агрегировать несколько запросов REST в один запрос (и request, и query в переводе на русский означают &amp;quot;запрос&amp;quot;). Сервер GraphQL организует ресурсы в граф (отсюда и название)&lt;/li&gt;
    &lt;li id=&quot;Udxq&quot;&gt;GraphQL поддерживает запросы, мутации (модификация ресурсов) и подписки (получение уведомлений о модификациях)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;grpc&quot;&gt;gRPC&lt;/h3&gt;
  &lt;figure id=&quot;R8en&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/on/gx/-o/ongx-olsle7xhmbtzoc4uhhrcbk.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;D1Ki&quot;&gt;RPC (Remote Procedure Call – удаленный вызов процедур) называется &amp;quot;удаленным&amp;quot;, поскольку обеспечивает взаимодействие между удаленными сервисами, когда они находятся на разных серверах в микросервисной архитектуре. С точки зрения пользователя это выглядит, как вызов локальной функции.&lt;/p&gt;
  &lt;p id=&quot;u9i1&quot;&gt;На диаграмме представлен поток данных (flow) gRPC:&lt;/p&gt;
  &lt;ol id=&quot;hgHI&quot;&gt;
    &lt;li id=&quot;oKTh&quot;&gt;Клиент отправляет REST-запрос. Тело запроса (request body) содержит данные в формате JSON (как правило).&lt;br /&gt;2-4. Сервис заказов (order service) (клиент gRPC) получает запрос, преобразует его и отправляет запрос RPC сервису оплаты (payment service) (сервер gRPC). gRPC кодирует данные клиента в двоичный формат и отправляет их в низкоуровневый транспортный слой (transport layer).&lt;/li&gt;
    &lt;li id=&quot;9EK4&quot;&gt;gRPC отправляет пакеты данных (data packages) по сети с помощью HTTP2. Благодаря двоичной кодировке и сетевым оптимизациям gRPC может быть до 5 раз быстрее JSON.&lt;br /&gt;6-8. Сервис оплаты получает пакеты данных по сети, декодирует их и вызывает серверное приложение.&lt;br /&gt;9-11. Результат, полученный от серверного приложения, кодируется и отправляется в транспортный слой.&lt;br /&gt;12-14. Сервис заказов получает пакеты данных, декодирует их и отправляет результат клиентскому приложению.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;webhook&quot;&gt;Webhook&lt;/h3&gt;
  &lt;p id=&quot;FYLQ&quot;&gt;Сравнение Polling (опроса) и Webhook:&lt;/p&gt;
  &lt;figure id=&quot;NdF0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/hr/qi/10/hrqi10qvdmfbcp8p05iga3qqfnc.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;lFJq&quot;&gt;Предположим, что у нас есть электронный магазин. Клиенты отправляют заказы в сервис заказов через шлюз API (API Gateway), а сервис заказов обращается к сервису оплаты для выполнения денежных транзакций. Сервис оплаты, в свою очередь, обращается к внешнему провайдеру сервиса оплаты (Payment Service Provider, PSP) для завершения транзакции.&lt;/p&gt;
  &lt;p id=&quot;SK2C&quot;&gt;Существует 2 способа взаимодействия с внешним PSP.&lt;/p&gt;
  &lt;h4 id=&quot;1-korotkiy-opros&quot;&gt;1. Короткий опрос&lt;/h4&gt;
  &lt;p id=&quot;0Cg1&quot;&gt;После отправки платежного запроса PSP, сервис оплаты продолжает опрашивать PSP о статусе платежа (путем периодической отправки запросов) до тех пор, пока PSP не сообщит о завершении операции.&lt;/p&gt;
  &lt;p id=&quot;YHOJ&quot;&gt;Короткий опрос имеет следующие недостатки:&lt;/p&gt;
  &lt;ul id=&quot;Wxfn&quot;&gt;
    &lt;li id=&quot;qA5b&quot;&gt;постоянные запросы статуса расходуют ресурсы сервиса оплаты&lt;/li&gt;
    &lt;li id=&quot;FyaF&quot;&gt;внешний сервис взаимодействует напрямую с сервисом оплаты, что создает уязвимости безопасности&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;2-veb-huki&quot;&gt;2. Веб-хуки&lt;/h4&gt;
  &lt;p id=&quot;KJBj&quot;&gt;Веб-хук регистрируется во внешнем сервисе. Мы как бы просим внешний сервис сообщить нам об изменениях по запросу по указанному URL. После выполнения операции, PSP отправляет запрос HTTP для обновления статуса платежа.&lt;/p&gt;
  &lt;p id=&quot;1lpJ&quot;&gt;Ресурсы сервиса оплаты больше не расходуются на опрос.&lt;/p&gt;
  &lt;p id=&quot;gXRq&quot;&gt;Веб-хуки часто называют реверсивными (reverse) API или push-API, поскольку сервер отправляет запрос HTTP клиенту, а не наоборот.&lt;/p&gt;
  &lt;p id=&quot;HD3o&quot;&gt;При использовании веб-хуков следует уделять пристальное внимание следующим вещам:&lt;/p&gt;
  &lt;ul id=&quot;mhyc&quot;&gt;
    &lt;li id=&quot;BiKs&quot;&gt;API должно быть правильно спроектировано для взаимодействия с внешним сервисом&lt;/li&gt;
    &lt;li id=&quot;tauu&quot;&gt;в шлюзе API должны быть установлены определенные правила безопасности&lt;/li&gt;
    &lt;li id=&quot;ONA7&quot;&gt;во внешнем сервисе следует регистрировать правильный URL&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;proizvoditelnost-api&quot;&gt;Производительность API&lt;/h3&gt;
  &lt;p id=&quot;BrS7&quot;&gt;5 распространенных способов улучшения производительности API:&lt;/p&gt;
  &lt;figure id=&quot;3URp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/2h/bq/9f/2hbq9fdi9cf4ybqqoy8jgrc0uik.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;P8hJ&quot;&gt;&lt;em&gt;Пагинация&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;xMtu&quot;&gt;Эту оптимизацию применяют в случае большого объема данных. Результат отправляется клиенту по частям (чанкам — chunks) для улучшения отзывчивости сервиса.&lt;/p&gt;
  &lt;p id=&quot;Ebo5&quot;&gt;&lt;em&gt;Асинхронное логирование&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;HHor&quot;&gt;Синхронное логирование работает с диском при каждом вызове и может замедлить систему. Асинхронное логирование отправляет логи в буфер без блокировки (lock-free buffer) и сразу возвращается. Логи записываются на диск с определенной периодичностью. Это существенно снижает нагрузку на ввод/вывод.&lt;/p&gt;
  &lt;p id=&quot;aJt1&quot;&gt;&lt;em&gt;Кэширование&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;wNV5&quot;&gt;Мы можем сохранять часто запрашиваемые данные в кэше и возвращать их клиентам без повторного обращения к базе данных. Доступ к данным, хранящемся в памяти Redis, например, гораздо быстрее, чем доступ к БД.&lt;/p&gt;
  &lt;p id=&quot;kkbz&quot;&gt;&lt;em&gt;Сжатие полезной нагрузки&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;B32V&quot;&gt;Запросы и ответы могут сжиматься с помощью GZIP и других алгоритмов сжатия. Чем меньше размер данных, тем быстрее они передаются по сети. Таким образом, сжатие ускоряет загрузку и скачивание данных.&lt;/p&gt;
  &lt;p id=&quot;sUFv&quot;&gt;&lt;em&gt;Пул подключений&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;MZ3y&quot;&gt;При доступе к ресурсам нам часто приходится загружать данные из БД. Открытие нового подключения к БД – дорогая операция, с точки зрения производительности, поэтому для доступа к БД следует использовать пул открытых (набор существующих) подключений (connection pool). Пул подключений отвечает за управление жизненным циклом соединений.&lt;/p&gt;
  &lt;h3 id=&quot;http-10---http-11---http-20---http-30-quic&quot;&gt;HTTP 1.0 -&amp;gt; HTTP 1.1 -&amp;gt; HTTP 2.0 -&amp;gt; HTTP 3.0 (QUIC)&lt;/h3&gt;
  &lt;figure id=&quot;UuBk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/3j/sd/_k/3jsd_kck37koj9ictcporbzeh30.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;W1lm&quot;&gt;
    &lt;li id=&quot;IKVd&quot;&gt;HTTP 1.0 был завершен и полностью задокументирован в 1996. Каждый запрос к серверу требует отдельного соединения TCP&lt;/li&gt;
    &lt;li id=&quot;XEgo&quot;&gt;HTTP 1.1 был опубликован в 1997. TCP-соединение может оставаться открытым для повторного использования (постоянное подключение), но проблема блокировки HOL (head-of-line) остается. Блокировка HOL означает, что когда исчерпан лимит параллельных запросов, новые запросы ждут завершения предыдущих&lt;/li&gt;
    &lt;li id=&quot;bu6Y&quot;&gt;HTTP 2.0 был опубликован в 2015. Он решает проблему HOL путем мультиплексирования запросов на уровне приложения (application layer), но HOL остается на транспортном уровне (transport layer, например, TCP). Как видно на диаграмме, HTTP 2.0 представил концепцию &amp;quot;потоков&amp;quot; (streams) HTTP — абстракция, позволяющая разным запросам HTTP использовать одно соединение TCP. Потоки могут отправляться в разном порядке&lt;/li&gt;
    &lt;li id=&quot;0Mef&quot;&gt;первый черновик HTTP 3.0 был опубликован в 2020. В качестве нижележащего транспортного протокола вместо TCP в нем используется QUIC, что решает проблему HOL в транспортном слое&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;SkRe&quot;&gt;QUIC основан на UDP. Он обеспечивает первоклассную поддержку потоков в транспортном слое. Потоки QUIC используют одно соединение QUIC, поэтому не требуется затрат на рукопожатия (handshakes) и холодные запуски для создания новых соединений. Потоки QUIC доставляются независимо, поэтому в большинстве случаев потеря пакетов в одном потоке не влияет на пакеты в другом потоке.&lt;/p&gt;
  &lt;h3 id=&quot;soap-rest-graphql-i-rpc&quot;&gt;SOAP, REST, GraphQL и RPC&lt;/h3&gt;
  &lt;p id=&quot;L7vv&quot;&gt;Существуют разные архитектурные стили API, каждый со своими паттернами и стандартами обмена данными:&lt;/p&gt;
  &lt;figure id=&quot;SBe7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/gk/7u/w9/gk7uw9b5sgh4b2odmmjw_zfuwg4.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;snachala-kod-i-snachala-api&quot;&gt;Сначала код и сначала API&lt;/h3&gt;
  &lt;p id=&quot;iD4F&quot;&gt;Разница между подходами к разработке &amp;quot;Сначала код&amp;quot; и &amp;quot;Сначала API&amp;quot; (Code First, API First):&lt;/p&gt;
  &lt;figure id=&quot;ekPe&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/r-/yj/g6/r-yjg6yszrln67kywzvbdasaguy.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;GVYN&quot;&gt;
    &lt;li id=&quot;KEso&quot;&gt;Микросервисы повышают сложность системы. Разные функции системы обслуживаются отдельными сервисами. Хотя такая архитектура облегчает разделение обязанностей, реализация взаимодействия между сервисами является дополнительным вызовом.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;SNeW&quot;&gt;При написании кода следует помнить о сложности системы и аккуратно определять границы (зоны ответственности) сервисов.&lt;/p&gt;
  &lt;ul id=&quot;x39N&quot;&gt;
    &lt;li id=&quot;H7ko&quot;&gt;Отдельные команды разработчиков должны говорить на одном языке. Каждая команда отвечает только за свои компоненты и сервисы. Рекомендуется заранее проектировать дизайн API на уровне организации.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Asf3&quot;&gt;Для валидации дизайна API перед написанием кода можно использовать фиктивные запросы и ответы.&lt;/p&gt;
  &lt;ul id=&quot;HMig&quot;&gt;
    &lt;li id=&quot;Jxxp&quot;&gt;В целом, микросервисная архитектура повышает качество ПО и продуктивность разработчиков. Грамотно спроектированное API позволяет быстрее запускать проект и делает процесс разработки более плавным.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ERjL&quot;&gt;Улучшается опыт разработки, поскольку разработчики могут сосредоточиться на реализации функционала вместо того, чтобы постоянно заниматься настройкой и интеграцией.&lt;/p&gt;
  &lt;p id=&quot;BEQF&quot;&gt;Снижается вероятность возникновения неприятных сюрпризов на последних этапах жизненного цикла проекта.&lt;/p&gt;
  &lt;p id=&quot;ROr5&quot;&gt;Наличие спроектированного API позволяет писать тесты, не дожидаясь разработки. Отсюда один шаг к разработке на основе тестов (Test Driven Design, TDD).&lt;/p&gt;
  &lt;h3 id=&quot;kody-statusov-http&quot;&gt;Коды статусов HTTP&lt;/h3&gt;
  &lt;figure id=&quot;ifKE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ri/6c/-m/ri6c-m5xyyy4iuv-s20rmalfv0o.jpeg&quot; width=&quot;1206&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CYQf&quot;&gt;Коды ответов(статусов) HTTP делятся на 5 категорий:&lt;/p&gt;
  &lt;ol id=&quot;TYis&quot;&gt;
    &lt;li id=&quot;Qw7y&quot;&gt;Информационные (100-199).&lt;/li&gt;
    &lt;li id=&quot;tAj5&quot;&gt;Коды успеха (200-299).&lt;/li&gt;
    &lt;li id=&quot;8857&quot;&gt;Коды перенаправления (300-399).&lt;/li&gt;
    &lt;li id=&quot;voeZ&quot;&gt;Коды ошибок на стороне клиента (400-499).&lt;/li&gt;
    &lt;li id=&quot;KDr0&quot;&gt;Коды ошибок на стороне сервера (500-599).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;03VK&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/HTTP/Status&quot; target=&quot;_blank&quot;&gt;Коды ответов HTTP на MDN.&lt;/a&gt;&lt;/p&gt;
  &lt;h3 id=&quot;shlyuz-api&quot;&gt;Шлюз API&lt;/h3&gt;
  &lt;figure id=&quot;yklR&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ds/dm/vz/dsdmvzc4koavtab9wct7gowce-e.jpeg&quot; width=&quot;1502&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;OOHO&quot;&gt;
    &lt;li id=&quot;yMrJ&quot;&gt;Клиент отправляет запрос HTTP в шлюз API (API Gateway).&lt;/li&gt;
    &lt;li id=&quot;Q2nH&quot;&gt;Шлюз разбирает (парсит) и проверяет атрибуты запроса.&lt;/li&gt;
    &lt;li id=&quot;5gHa&quot;&gt;Шлюз выполняет проверки по белому/черному списку ресурсов.&lt;/li&gt;
    &lt;li id=&quot;urKb&quot;&gt;Шлюз обращается к провайдеру идентификации (поставщику удостоверений – Identity Provider) для аутентификации и авторизации.&lt;/li&gt;
    &lt;li id=&quot;FJ0k&quot;&gt;К запросу применяются правила ограничения частоты запросов (rate limit). При превышении лимита запрос отклоняется.&lt;br /&gt;6 и 7. После выполнения проверок шлюз определяет сервис, совпадающий с путем роута (route path).&lt;/li&gt;
    &lt;li id=&quot;qWuk&quot;&gt;Шлюз преобразует запрос в подходящий протокол и передает его серверным микросервисам.&lt;br /&gt;9-12. Шлюз отвечает за обработку ошибок, а также провалов, связанных с тем, что решение проблемы требует больше времени (разрыв цепочки — circuit break). Для логирования и мониторинга здесь также может использоваться стек ELK (Elastic-Logstash-Kibana). Здесь же можно реализовать кэширование данных.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;effektivnoe-i-bezopasnoe-api&quot;&gt;Эффективное и безопасное API&lt;/h3&gt;
  &lt;p id=&quot;ctgr&quot;&gt;Типичные проекты/схемы API на примере корзины товаров:&lt;/p&gt;
  &lt;figure id=&quot;X07b&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/xa/qk/ib/xaqkibo7e2x5-fxbdctpc2v8hac.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;X0L9&quot;&gt;&lt;em&gt;Обратите внимание&lt;/em&gt;, что дизайн API – это не только дизайн URL. Необходимо правильно выбирать названия ресурсов, идентификаторы и паттерны путей (path patterns). Также важно устанавливать правильные заголовки HTTP и эффективные правила ограничения частоты запросов (rate limit).&lt;/p&gt;
  &lt;h3 id=&quot;inkapsulyaciya-tcpip&quot;&gt;Инкапсуляция TCP/IP&lt;/h3&gt;
  &lt;p id=&quot;EzxI&quot;&gt;Как данные передаются по сети? Почему в сетевой модели OSI (Open Systems Interconnection – взаимосвязь открытых систем) так много уровней?&lt;/p&gt;
  &lt;figure id=&quot;ajch&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/fd/i_/sh/fdi_sh3v0knr3x3mnht93f8ckny.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;lRCs&quot;&gt;На диаграмме показано, как данные инкапсулируются и распаковываются при передаче по сети.&lt;/p&gt;
  &lt;ol id=&quot;cOD7&quot;&gt;
    &lt;li id=&quot;OXEm&quot;&gt;Когда устройства А передает данные устройству Б по протоколу HTTP, сначала на уровне приложения (application layer) в запрос добавляется заголовок HTTP.&lt;/li&gt;
    &lt;li id=&quot;TmIB&quot;&gt;Затем к данным добавляются заголовки TCP или UDP. Они инкапсулируются в сегменты TCP на транспортном уровне (transport layer). Заголовок содержит порт источника (source port), порт назначения (destination port) и номер последовательности (sequential number).&lt;/li&gt;
    &lt;li id=&quot;qkw9&quot;&gt;Затем на сетевом уровне (network layer) добавляется заголовок IP. Он содержит адреса IP источника/назначения.&lt;/li&gt;
    &lt;li id=&quot;nag1&quot;&gt;На уровне связи данных (data link layer) в датаграмму (datagram) IP добавляется заголовок MAC с MAC-адресами источника и получателя.&lt;/li&gt;
    &lt;li id=&quot;aI5z&quot;&gt;Инкапсулированные кадры (фреймы – frames) попадают на физический уровень (physical layer) и передаются по сети в двоичном виде.&lt;br /&gt;6-10. При получении битов по сети устройство Б выполняет процесс распаковки, обратный процессу инкапсуляции. Заголовки удаляются слой за слоем, после чего устройство Б может читать данные.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;UCyb&quot;&gt;У каждого уровня своя задача. Каждый уровень извлекает инструкции из соответствующего заголовка, что избавляет от необходимости владеть полной информацией о данных.&lt;/p&gt;
  &lt;h3 id=&quot;pochemu-nginx-nazyvayut-obratnym-proksi&quot;&gt;Почему NGINX называют &amp;quot;обратным&amp;quot; прокси?&lt;/h3&gt;
  &lt;p id=&quot;x2Ts&quot;&gt;Разница между прямым (forward) и обратным (reverse) прокси:&lt;/p&gt;
  &lt;figure id=&quot;00tR&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/mk/ei/if/mkeiif2xx-yz5ylysr7ym-x6chc.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;JZWp&quot;&gt;Прямой прокси – это сервер, находящийся между пользователем и Интернетом.&lt;/p&gt;
  &lt;p id=&quot;GtFp&quot;&gt;Прямой прокси обычно используется для:&lt;/p&gt;
  &lt;ol id=&quot;APLS&quot;&gt;
    &lt;li id=&quot;qzy3&quot;&gt;Защиты клиентов.&lt;/li&gt;
    &lt;li id=&quot;iU0R&quot;&gt;Преодоления ограничений браузера.&lt;/li&gt;
    &lt;li id=&quot;wnuR&quot;&gt;Блокировки доступа к определенным ресурсам.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;5Rdk&quot;&gt;Обратный прокси – это сервер, принимающий запросы от клиента, передающий их веб-серверу и возвращающий результат клиенту после обработки запроса сервером.&lt;/p&gt;
  &lt;p id=&quot;noly&quot;&gt;Обратный прокси хорошо подходит для:&lt;/p&gt;
  &lt;ol id=&quot;q9K9&quot;&gt;
    &lt;li id=&quot;HC3u&quot;&gt;Защиты сервера.&lt;/li&gt;
    &lt;li id=&quot;GYOX&quot;&gt;Балансировки нагрузки.&lt;/li&gt;
    &lt;li id=&quot;ZflX&quot;&gt;Кэширования статических ресурсов.&lt;/li&gt;
    &lt;li id=&quot;qEYP&quot;&gt;Кодирования и декодирования подключений SSL.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;algoritmy-balansirovki-nagruzki&quot;&gt;Алгоритмы балансировки нагрузки&lt;/h3&gt;
  &lt;p id=&quot;5nwj&quot;&gt;6 наиболее распространенных алгоритмов балансировки нагрузки:&lt;/p&gt;
  &lt;figure id=&quot;Yhcm&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/rt/sv/2r/rtsv2rjqxdzpfetxgz07ip3mjxg.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;WTn7&quot;&gt;&lt;em&gt;Статические алгоритмы&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;cQaH&quot;&gt;
    &lt;li id=&quot;4dR4&quot;&gt;Циклический (round robin) – запросы клиента передаются разным экземплярам сервиса по порядку. Как правило, сервисы не владеют состоянием (stateless).&lt;/li&gt;
    &lt;li id=&quot;EjCT&quot;&gt;Липкий (sticky) циклический – улучшение циклического алгоритма. Если первый запрос Алисы передается сервису А, последующие запросы Алисы также передаются этому сервису.&lt;/li&gt;
    &lt;li id=&quot;JlbX&quot;&gt;Взвешенный (weighted) циклический – администратор присваивает веса каждому сервису. Чем больше вес, тем больше запросов может обработать сервис.&lt;/li&gt;
    &lt;li id=&quot;nUz8&quot;&gt;Хэш – данный алгоритм применяется функцию хэширования к IP или URL входящего запроса. Хэш определяет сервис, которому передается запрос.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;agqu&quot;&gt;&lt;em&gt;Динамические алгоритмы&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;zAQB&quot;&gt;
    &lt;li id=&quot;Fxxh&quot;&gt;Наименьшее количество соединений (least connections) – новый запрос передается экземпляру с наименьшим количеством параллельных подключений.&lt;/li&gt;
    &lt;li id=&quot;A8MM&quot;&gt;Наименьшее время ответа (least response time) – новый запрос передается экземпляру с наименьшим временем ответа.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;url-uri-i-urn&quot;&gt;URL, URI и URN&lt;/h3&gt;
  &lt;p id=&quot;lkj4&quot;&gt;Сравнение URL, URI и URN:&lt;/p&gt;
  &lt;figure id=&quot;elkK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/_e/3g/rz/_e3grzgrv1faez4feg06lcpx0ba.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kaJN&quot;&gt;&lt;em&gt;URI&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;EDMw&quot;&gt;URI расшифровывается как Uniform Resource Identifier (единый идентификатор ресурса). Он определяет логический или физический ресурс в вебе. URL и URN являются подтипами URI. URL определяет локацию (местонахождения) ресурса, а URN — название ресурса.&lt;/p&gt;
  &lt;p id=&quot;mG48&quot;&gt;URI состоит из следующих частей:&lt;/p&gt;
  &lt;figure id=&quot;XgT0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/files/373/2b3/3fd/3732b33fd43043049c18e3c108bc9d1a.jpg&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qn4W&quot;&gt;&lt;em&gt;URL&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;uH3G&quot;&gt;URL расшифровывается как Uniform Resource Locator (единый указатель ресурсов) и является ключевой концепцией HTTP. Он представляет собой уникальный адрес ресурса в вебе. URL может использоваться с другими протоколами, такими как FTP и JDBC.&lt;/p&gt;
  &lt;p id=&quot;qpFx&quot;&gt;&lt;em&gt;URN&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;Zfla&quot;&gt;URN расшифровывается как Uniform Resource Name (единое имя ресурса). URN не могут использоваться для локализации ресурса. Простым примером является сочетание пространства имен (namespace) и специфичной для него строки.&lt;/p&gt;
  &lt;p id=&quot;0wkd&quot;&gt;&lt;a href=&quot;https://www.w3.org/TR/uri-clarification/&quot; target=&quot;_blank&quot;&gt;URIs, URLs, and URNs: Clarifications and Recommendations 1.0.&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;cicd&quot;&gt;CI/CD&lt;/h2&gt;
  &lt;h3 id=&quot;cicd-prostymi-slovami&quot;&gt;CI/CD простыми словами&lt;/h3&gt;
  &lt;figure id=&quot;uHqS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ya/-5/tj/ya-5tj1flkr-dpclgns3b3orjqg.jpeg&quot; width=&quot;1374&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LQzX&quot;&gt;&lt;em&gt;SDLC с CI/CD&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;E9cW&quot;&gt;SDLC (software development life cycle – процесс разработки ПО) состоит из нескольких основных этапов: разработка, тестирование, деплой и поддержка. CI/CD автоматизирует и интегрирует эти этапы для обеспечения более быстрых и надежных релизов.&lt;/p&gt;
  &lt;p id=&quot;5KqQ&quot;&gt;Отправка (&amp;quot;пуш&amp;quot;) кода в репозиторий запускает сборку и тесты. Запускаются тесты непрерывной цепочки (End-to-end, e2e) для валидации кода. Если тестирование проходит успешно, код автоматически разворачивается в стейдже/продакшне. В противном случае, код возвращается на доработку. Эта автоматизация обеспечивает получение быстрой обратной связи разработчиками и снижает риск попадания багов в продакшн.&lt;/p&gt;
  &lt;p id=&quot;CzJB&quot;&gt;&lt;em&gt;Разница между CI и CD&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;L4Ub&quot;&gt;Continuous Integration (CI) (непрерывная интеграция) автоматизирует процессы сборки, тестирования и объединения (&amp;quot;мержа&amp;quot;). Она запускает тесты при каждой фиксации (&amp;quot;коммите&amp;quot;) кода для обнаружения проблем с интеграцией на ранних стадиях. Это способствует частой фиксации кода и быстрой обратной связи.&lt;/p&gt;
  &lt;p id=&quot;SzB7&quot;&gt;Continuous Delivery (CD) (непрерывная доставка) автоматизирует процессы релиза, такой как изменение инфраструктуры и деплой. Она обеспечивает надежность релизов в любое время с помощью автоматизированного конвейера. CD может также включать необходимость ручного тестирования и подтверждения (&amp;quot;апрува&amp;quot;) перед деплоем в продакшн.&lt;/p&gt;
  &lt;p id=&quot;zut3&quot;&gt;&lt;em&gt;Конвейер CI/CD&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;fMA8&quot;&gt;Типичный конвейер (pipeline) CI/CD состоит из нескольких этапов:&lt;/p&gt;
  &lt;ul id=&quot;gJ2w&quot;&gt;
    &lt;li id=&quot;Bwpj&quot;&gt;разработчик фиксирует изменения в коде&lt;/li&gt;
    &lt;li id=&quot;24kk&quot;&gt;сервер CI регистрирует изменения и запускает сборку&lt;/li&gt;
    &lt;li id=&quot;xRu9&quot;&gt;код компилируется и тестируется (юнит-тесты, интеграционные тесты etc.)&lt;/li&gt;
    &lt;li id=&quot;fk73&quot;&gt;отчет о тестировании отправляется разработчику&lt;/li&gt;
    &lt;li id=&quot;5aZ6&quot;&gt;при успешном тестировании артефакты разворачиваются в промежуточной среде (стейдж)&lt;/li&gt;
    &lt;li id=&quot;GNMQ&quot;&gt;перед релизом могут запускаться дополнительные тесты&lt;/li&gt;
    &lt;li id=&quot;aQmD&quot;&gt;система CD разворачивает утвержденные изменения в продакшне&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;tehnicheskiy-stek-netflix-konveyer-cicd&quot;&gt;Технический стек Netflix (конвейер CI/CD)&lt;/h3&gt;
  &lt;figure id=&quot;Rz0N&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/0p/7n/d9/0p7nd93881kcemoyjkpxzexcy5q.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d3Oj&quot;&gt;Планирование: инженеры Netflix используют JIRA для планирования и Confluence для документации.&lt;/p&gt;
  &lt;p id=&quot;YHpj&quot;&gt;Написание кода: основным серверным языком является Java, другие языки используются для разных целей по мере необходимости.&lt;/p&gt;
  &lt;p id=&quot;Uum3&quot;&gt;Сборка: для сборки в основном используется Gradle, для поддержки разных случаев разработаны специальные плагины Gradle.&lt;/p&gt;
  &lt;p id=&quot;CnXr&quot;&gt;Упаковка: пакет и зависимости помещаются в Amazon Machine Image (AMI) для релиза.&lt;/p&gt;
  &lt;p id=&quot;Lmq5&quot;&gt;Тестирование: подчеркивает направленность культуры продакшна на создание инструментов хаоса.&lt;/p&gt;
  &lt;p id=&quot;EkNd&quot;&gt;Деплой: Netflix использует собственный Spinnaker для деплоя.&lt;/p&gt;
  &lt;p id=&quot;Q4Es&quot;&gt;Мониторинг: метрики мониторинга аккумулируются в Atlas, а для обнаружения аномалий используется Kayenta.&lt;/p&gt;
  &lt;p id=&quot;HJef&quot;&gt;Отчет об инциденте: инциденты сортируются по приоритету, для обработки инцидентов используется PagerDuty.&lt;/p&gt;
  &lt;h2 id=&quot;arhitekturnye-patterny&quot;&gt;Архитектурные паттерны&lt;/h2&gt;
  &lt;h3 id=&quot;mvc-mvp-mvvm-mvvm-c-i-viper&quot;&gt;MVC, MVP, MVVM, MVVM-C и VIPER&lt;/h3&gt;
  &lt;figure id=&quot;FGs1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ki/os/b7/kiosb7t-9djohdyeq_xamkyt1pu.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;99BN&quot;&gt;
    &lt;li id=&quot;flQw&quot;&gt;MVC, самый старый паттерн, появился почти 50 лет назад&lt;/li&gt;
    &lt;li id=&quot;M3yW&quot;&gt;каждый паттерн имеет &amp;quot;view&amp;quot; (V), отвечающий за отображение содержимого и обработку пользовательского ввода&lt;/li&gt;
    &lt;li id=&quot;o56X&quot;&gt;большинство паттернов включает &amp;quot;model&amp;quot; (M) для управления данными&lt;/li&gt;
    &lt;li id=&quot;Lyb2&quot;&gt;&amp;quot;controller&amp;quot;, &amp;quot;presenter&amp;quot; и &amp;quot;view-model&amp;quot; являются посредниками между слоем отображения и моделью&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;18-osnovnyh-arhitekturnyh-patternov&quot;&gt;18 основных архитектурных паттернов&lt;/h3&gt;
  &lt;p id=&quot;gBZC&quot;&gt;Паттерны – это многократно используемые решения распространенных проблем дизайна, обеспечивающие более плавный и эффективный процесс разработки. Они являются проектами/схемами для разработки лучших структур ПО. Наиболее популярными паттернами являются следующие:&lt;/p&gt;
  &lt;figure id=&quot;IpdO&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/xd/kb/qy/xdkbqy_bh5n8rudo3twowft6huc.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;UMmZ&quot;&gt;
    &lt;li id=&quot;8S5n&quot;&gt;Abstract Factory (абстрактная фабрика): создатель семьи – создает группы связанных элементов&lt;/li&gt;
    &lt;li id=&quot;wJ84&quot;&gt;Builder (строитель): мастер лего – создает объекты поэтапно, разделяет создание и отображение&lt;/li&gt;
    &lt;li id=&quot;KCVQ&quot;&gt;Prototype (прототип): создатель клонов – создает копии полностью готовых объектов&lt;/li&gt;
    &lt;li id=&quot;CITL&quot;&gt;Singleton (одиночка): единственный и неповторимый – специальный класс, который может иметь только один экземпляр&lt;/li&gt;
    &lt;li id=&quot;HyOe&quot;&gt;Adapter (адаптер): универсальный плагин – соединяет вещи с разными интерфейсами&lt;/li&gt;
    &lt;li id=&quot;4MAp&quot;&gt;Bridge (мост): подключатель функций – связывает объекты с функциями&lt;/li&gt;
    &lt;li id=&quot;06y0&quot;&gt;Composite (композитор): строитель деревьев – формирует древовидные структуры из простых и сложных частей&lt;/li&gt;
    &lt;li id=&quot;3fo1&quot;&gt;Decorator (декоратор): настройщик – добавляет возможности в объекты без изменения их ядра&lt;/li&gt;
    &lt;li id=&quot;wDnZ&quot;&gt;Facade (фасад): единый центр обслуживания – представляет целую систему с помощью одного простого интерфейса&lt;/li&gt;
    &lt;li id=&quot;29mt&quot;&gt;Flyweight (легковес): хранитель пространства – эффективно распределяет небольшие повторно используемые элементы&lt;/li&gt;
    &lt;li id=&quot;C5cQ&quot;&gt;Proxy (прокси): запасной актер – представляет другой объект, управляет доступом к нему или выполнение операций с ним&lt;/li&gt;
    &lt;li id=&quot;4iWZ&quot;&gt;Chain of Responsibility (цепочка ответственности): эстафета запроса – запрос обрабатывается цепочкой объектов&lt;/li&gt;
    &lt;li id=&quot;9O6V&quot;&gt;Command (команда): обертка задачи – преобразует запрос в объект, готовый к выполнению операции&lt;/li&gt;
    &lt;li id=&quot;Y174&quot;&gt;Iterator (итератор): исследователь коллекций – предоставляет доступ к коллекции элементов по одному&lt;/li&gt;
    &lt;li id=&quot;MBxr&quot;&gt;Mediator (посредник): коммуникационный хаб – упрощает взаимодействие между разными классами&lt;/li&gt;
    &lt;li id=&quot;mcu5&quot;&gt;Memento (запоминатель): капсула времени – сохраняет и восстанавливает состояние объекта&lt;/li&gt;
    &lt;li id=&quot;TAqr&quot;&gt;Observer (наблюдатель): издатель новостей – уведомляет классы об изменениях других объектов&lt;/li&gt;
    &lt;li id=&quot;GapL&quot;&gt;Visitor (посетитель): умелый гость – добавляет новые операции в класс без его модификации&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;baza-dannyh&quot;&gt;База данных&lt;/h2&gt;
  &lt;figure id=&quot;dAgN&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/tz/0g/zt/tz0gztnjyfl8aucwrcjdlcmhdoi.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RAYx&quot;&gt;Выбор правильной БД для проекта – задача не из простых. Изучение огромного количества возможностей БД, рассчитанных на решение конкретных задач, может быстро утомить.&lt;/p&gt;
  &lt;p id=&quot;hC30&quot;&gt;Надеемся, что наша диаграмма, как минимум, облегчит начало вашего пути в этом направлении.&lt;/p&gt;
  &lt;h3 id=&quot;8-struktur-dannyh-uluchshayuschih-rabotu-baz-dannyh&quot;&gt;8 структур данных, улучшающих работу баз данных&lt;/h3&gt;
  &lt;p id=&quot;cFoc&quot;&gt;Ответ на этот вопрос зависит от того, как БД используется. Индексы данных могут храниться в памяти или на диске. Форматы данных могут быть разными: числа, строки, географические координаты etc. Система может часто читаться или писаться (write-heavy, read-heavy). Все эти факторы влияют на выбор формата индексов БД.&lt;/p&gt;
  &lt;figure id=&quot;aN3P&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/n9/hm/jm/n9hmjmb3-ev6xidv9czlatnjjgk.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uEy1&quot;&gt;Наиболее популярные структуры данных, использующиеся для индексации:&lt;/p&gt;
  &lt;ul id=&quot;6F4X&quot;&gt;
    &lt;li id=&quot;9hJc&quot;&gt;Skiplist: индексы хранятся в памяти. Используется в Redis&lt;/li&gt;
    &lt;li id=&quot;pfEr&quot;&gt;Hash index (хэшированный индекс): популярная реализация структуры данных &amp;quot;Карта&amp;quot; (или &amp;quot;Коллекция&amp;quot;) (map)&lt;/li&gt;
    &lt;li id=&quot;TFjy&quot;&gt;SSTable: иммутабельная (неизменяемая) реализация &amp;quot;Карты&amp;quot;, хранящаяся на диске&lt;/li&gt;
    &lt;li id=&quot;3Y1i&quot;&gt;LSM дерево: Skiplist + SSTable. Хорошо подходит для частой записи&lt;/li&gt;
    &lt;li id=&quot;cFhQ&quot;&gt;B-дерево: индексы хранятся на диске. Согласованная производительность чтения/записи&lt;/li&gt;
    &lt;li id=&quot;AM5A&quot;&gt;Inverted index (инвертированный индекс): хорошо подходит для индексации документов. Используется в Lucene&lt;/li&gt;
    &lt;li id=&quot;qPpB&quot;&gt;Suffix tree (суффиксное дерево): хорошо подходит для поиска строковых паттернов (string patterns)&lt;/li&gt;
    &lt;li id=&quot;gCoz&quot;&gt;R-дерево: разнонаправленный поиск, такой как поиск ближайшего соседа&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;vypolnenie-instrukcii-sql-v-baze-dannyh&quot;&gt;Выполнение инструкции SQL в базе данных&lt;/h3&gt;
  &lt;p id=&quot;q66E&quot;&gt;Разные БД имеют разную архитектуру. Некоторые общие подходы:&lt;/p&gt;
  &lt;figure id=&quot;nOuW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/qi/jo/_r/qijo_rd9x3y0vr_qxpxiav6fnze.jpeg&quot; width=&quot;1358&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;O3CA&quot;&gt;
    &lt;li id=&quot;erwF&quot;&gt;Инструкция SQL отправляется в БД через транспортный протокол (например, TCP).&lt;/li&gt;
    &lt;li id=&quot;czjk&quot;&gt;Инструкция передается парсеру команды (command parser), который выполняет ее синтаксический и семантический анализ и генерирует дерево запроса (query tree).&lt;/li&gt;
    &lt;li id=&quot;hYAZ&quot;&gt;Дерево запроса передается оптимизатору (optimizer). Оптимизатор создает план выполнения (execution plan).&lt;/li&gt;
    &lt;li id=&quot;s7JK&quot;&gt;План выполнения передается исполнителю (executor). Исполнитель извлекает данные для выполнения.&lt;/li&gt;
    &lt;li id=&quot;pJ8J&quot;&gt;Методы доступа (access methods) предоставляют логику получения данных, необходимых для выполнения, извлечения данных из движка хранилища (storage engine).&lt;/li&gt;
    &lt;li id=&quot;MTGc&quot;&gt;Методы доступа определяют, является ли инструкция доступной только для чтения. Если да (SELECT), инструкция передается менеджеру буфера (buffer manager) для дальнейшей обработки. Менеджер буфера ищет данные в кэше или файлах.&lt;/li&gt;
    &lt;li id=&quot;QTgV&quot;&gt;Если инструкцией является UPDATE или INSERT, она передается менеджеру транзакций (transaction manager) для дальнейшей обработки.&lt;/li&gt;
    &lt;li id=&quot;yaR3&quot;&gt;В ходе транзакции данные блокируются (lock mode). За это отвечает менеджер блокировки (lock manager). Блокировка обеспечивает соответствие транзакции принципам ACID.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;teorema-cap&quot;&gt;Теорема CAP&lt;/h3&gt;
  &lt;p id=&quot;nOOy&quot;&gt;Теорема CAP является одним из самых известных терминов в компьютерной науке, но разные разработчики понимают ее по-разному.&lt;/p&gt;
  &lt;figure id=&quot;OJar&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/mh/qg/7f/mhqg7fh8mazkyklpulopsoqnzja.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gPM4&quot;&gt;Теорема CAP утверждает, что распределенная система не может одновременно соответствовать всем трем критериям.&lt;/p&gt;
  &lt;p id=&quot;SKgF&quot;&gt;Consistency (согласованность): все клиенты видят одни и те же данные, независимо от того, к какому узлу (node) они подключены.&lt;/p&gt;
  &lt;p id=&quot;J2gR&quot;&gt;Availability (доступность): любой клиент, запросивший данные, получает ответ, даже если какие-то узлы вышли из строя.&lt;/p&gt;
  &lt;p id=&quot;IrY7&quot;&gt;Partition Tolerance (устойчивость к разделению): разделение означает нарушение коммуникации между двумя узлами. Устойчивость означает, что система продолжает работать, несмотря на разделения.&lt;/p&gt;
  &lt;p id=&quot;HdYy&quot;&gt;Формулировка &amp;quot;2 из 3&amp;quot; может быть полезной, но также может вводить в заблуждение.&lt;/p&gt;
  &lt;ol id=&quot;FkFH&quot;&gt;
    &lt;li id=&quot;ZQlI&quot;&gt;Выбор базы данных – нелегкая задача. В данном случае нельзя опираться только на теорему CAP. Например, компании не выбирают Cassandra для приложений чата просто потому, что Cassandra является системой AP. Однако Cassandra имеет характеристики, которые делают ее неплохим выбором для хранения сообщений (см. историю Discord в конце).&lt;/li&gt;
    &lt;li id=&quot;U5Iw&quot;&gt;CAP ограничивает лишь небольшую часть возможностей: идеальная доступность и согласованность при наличии разделения, которое встречается довольно редко.&lt;/li&gt;
    &lt;li id=&quot;L7Pb&quot;&gt;Теорема утверждает, что возможна 100% доступность и согласованность. На самом деле, речь чаще всего идет о выборе между задержкой и согласованностью при отсутствии сетевого разделения. См. теорему PACELC.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Ujcy&quot;&gt;&lt;em&gt;Является ли теорема CAP полезной?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;RYSt&quot;&gt;Я думаю, что да, поскольку она открывает дискуссию о компромиссах, но это лишь часть всей истории. При выборе БД нам необходимо погружаться в детали с точки зрения функционала приложения.&lt;/p&gt;
  &lt;h3 id=&quot;tipy-pamyati-i-hranilisch-dannyh&quot;&gt;Типы памяти и хранилищ данных&lt;/h3&gt;
  &lt;figure id=&quot;sY9x&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ai/bz/sk/aibzskhsbzyz7ha7oskfts3ywno.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;vizualizaciya-zaprosa-sql&quot;&gt;Визуализация запроса SQL&lt;/h3&gt;
  &lt;figure id=&quot;58n8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ie/3b/-a/ie3b-aq2wyb1hcl9o5ctj-kp1l4.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3DM1&quot;&gt;Инструкции SQL выполняются БД следующим образом:&lt;/p&gt;
  &lt;ul id=&quot;t4nj&quot;&gt;
    &lt;li id=&quot;zvHI&quot;&gt;разбор инструкции и ее валидация&lt;/li&gt;
    &lt;li id=&quot;ZRcL&quot;&gt;преобразование SQL во внутренний формат, такой как реляционная алгебра (relational algebra)&lt;/li&gt;
    &lt;li id=&quot;oQwn&quot;&gt;оптимизация внутреннего представления и создания плана выполнения (execution plan) на основе индексации&lt;/li&gt;
    &lt;li id=&quot;Kx1V&quot;&gt;выполнение плана и возвращение результата&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;CcGy&quot;&gt;Выполнение инструкции SQL является сложным процессом, включающем множество соображений, таких как:&lt;/p&gt;
  &lt;ul id=&quot;npP5&quot;&gt;
    &lt;li id=&quot;c7Ai&quot;&gt;использование индексов и кэшей&lt;/li&gt;
    &lt;li id=&quot;nlNz&quot;&gt;порядок объединения таблиц&lt;/li&gt;
    &lt;li id=&quot;gf2p&quot;&gt;управление конкурентностью&lt;/li&gt;
    &lt;li id=&quot;rZfX&quot;&gt;управление транзакциями&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;yazyk-sql&quot;&gt;Язык SQL&lt;/h3&gt;
  &lt;p id=&quot;5h3E&quot;&gt;SQL (Structured Query Language – язык структурированных запросов) был стандартизирован в 1986. В течение следующих 40 лет он стал доминирующим языком для систем управления реляционными базами данных. Последний стандарт называется ANSI SQL 2016.&lt;/p&gt;
  &lt;figure id=&quot;3yeb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/lg/-e/pv/lg-epvecbay3z4yq33jhdb1ml5o.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Z3fO&quot;&gt;SQL включает в себя 5 основных компонентов:&lt;/p&gt;
  &lt;ul id=&quot;FgZ2&quot;&gt;
    &lt;li id=&quot;kVSU&quot;&gt;DDL: data definition language (язык определения данных) — CREATE, ALTER, DROP&lt;/li&gt;
    &lt;li id=&quot;wHjp&quot;&gt;DQL: data query language (язык запроса данных) — SELECT&lt;/li&gt;
    &lt;li id=&quot;wFx0&quot;&gt;DML: data manipulation language (язык манипуляции данными) — INSERT, UPDATE, DELETE&lt;/li&gt;
    &lt;li id=&quot;lwXn&quot;&gt;DCL: data control language (язык управления данными) — GRANT, INVOKE&lt;/li&gt;
    &lt;li id=&quot;Rgig&quot;&gt;TCL: transaction control language (язык управления транзакциями) — COMMIT, ROLLBACK&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;3Dle&quot;&gt;Разработчик бэкенда должен хорошо знать все эти компоненты. Аналитик данных может ограничиться DQL. Все зависит от того, чем вы занимаетесь.&lt;/p&gt;
  &lt;h2 id=&quot;kesh&quot;&gt;Кэш&lt;/h2&gt;
  &lt;h3 id=&quot;keshirovanie-dannyh&quot;&gt;Кэширование данных&lt;/h3&gt;
  &lt;p id=&quot;DtgL&quot;&gt;Кэширование данных в типичной архитектуре:&lt;/p&gt;
  &lt;figure id=&quot;3xTs&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/pp/yq/ed/ppyqeduwe6s82tqtdhtfe2j8p_e.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ZqBr&quot;&gt;Кэширование данных выполняется на нескольких уровнях:&lt;/p&gt;
  &lt;ol id=&quot;LNLZ&quot;&gt;
    &lt;li id=&quot;zRpT&quot;&gt;Клиентские приложения: ответы HTTP могут кэшироваться браузером. Мы запрашиваем данные по HTTP в первый раз, данные возвращаются с политикой истечения срока действия (expiry policy) в заголовке HTTP. Мы запрашиваем данные повторно, клиентское приложение пытается извлечь данные из кэша браузера.&lt;/li&gt;
    &lt;li id=&quot;tuYN&quot;&gt;CDN (Content Delivery Network – сеть доставки контента): CDN кэшируют статические веб-ресурсы. Клиенты могут извлекать данные из ближайшего узла CDN.&lt;/li&gt;
    &lt;li id=&quot;jU6U&quot;&gt;Балансировщик нагрузки (Load Balancer): балансировщик нагрузки также может кэшировать данные.&lt;/li&gt;
    &lt;li id=&quot;AQTo&quot;&gt;Брокер сообщений (Message Broker): брокер сначала записывает сообщения на диск, потребители извлекают их по необходимости. Данные кэшируются в кластерах Kafka, например, в течение времени, определяемого политикой удержания (retention policy).&lt;/li&gt;
    &lt;li id=&quot;w8Ju&quot;&gt;Сервисы: в сервисах существуют разные уровни кэша. Если данные не кэшированы в кэше CPU, сервис пытается извлечь данные из памяти. Иногда имеется второй слой кэша с хранением данных на диске.&lt;/li&gt;
    &lt;li id=&quot;HxqX&quot;&gt;Распределенный кэш (Distributed Cache): Redis, например, хранит в памяти пары ключ-значение для различных сервисов. Операции чтения/записи в Redis выполняются значительно быстрее по сравнению с базой данных.&lt;/li&gt;
    &lt;li id=&quot;lnms&quot;&gt;Полнотекстовый поиск (Full-text Search): Elastic, например, хорошо подходит для поиска документов или отчетов (логов). Поисковый движок выполняет индексацию копии данных.&lt;/li&gt;
    &lt;li id=&quot;gDxf&quot;&gt;БД: в БД существуют разные уровни кэша:&lt;/li&gt;
    &lt;ul id=&quot;jvvU&quot;&gt;
      &lt;li id=&quot;ZQCY&quot;&gt;WAL (Write-ahead Log – журнал упреждающей записи) – данные записываются в WAL перед построением B-дерева&lt;/li&gt;
      &lt;li id=&quot;In1Y&quot;&gt;Bufferpool – область памяти, выделяемая для кэширования результатов запросов&lt;/li&gt;
      &lt;li id=&quot;qAOg&quot;&gt;материализованное представление (Materialized View) – предварительное вычисление результатов запросов и их сохранение в таблицах БД для повышения производительности&lt;/li&gt;
      &lt;li id=&quot;bwXc&quot;&gt;журнал транзакций (Transaction Log) – фиксация всех транзакций и обновлений БД&lt;/li&gt;
      &lt;li id=&quot;yN3z&quot;&gt;журнал репликации (Replication Log) – фиксация состояния репликации кластера БД&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;prichiny-vysokoy-proizvoditelnosti-redis&quot;&gt;Причины высокой производительности Redis&lt;/h3&gt;
  &lt;figure id=&quot;O5JP&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/g3/yw/8p/g3yw8p8nmodlz2yedp27q6kwykq.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;ZKHW&quot;&gt;
    &lt;li id=&quot;GbsC&quot;&gt;Redis – это хранилище данных, основанное на RAM. Доступ к оперативной памяти как минимум в 1000 раз быстрее доступа к диску.&lt;/li&gt;
    &lt;li id=&quot;HKNN&quot;&gt;Для повышения эффективности выполнения запросов в Redis используется мультиплексирование ввода/вывода и однопоточный цикл выполнения.&lt;/li&gt;
    &lt;li id=&quot;XN0S&quot;&gt;В Redis используется несколько эффективных низкоуровневых структур данных.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;2OP3&quot;&gt;Другим популярным решением для хранения данных в памяти является Memcached.&lt;/p&gt;
  &lt;h3 id=&quot;sluchai-ispolzovaniya-redis&quot;&gt;Случаи использования Redis&lt;/h3&gt;
  &lt;figure id=&quot;xqvH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/qc/mf/1-/qcmf1-qkprvrk84j0iujyvgjbe4.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PYw7&quot;&gt;Redis может использоваться не только для кэширования.&lt;/p&gt;
  &lt;ul id=&quot;S7In&quot;&gt;
    &lt;li id=&quot;SZq7&quot;&gt;Сессии – распределение сессии пользователя между разными сервисами&lt;/li&gt;
    &lt;li id=&quot;YlgQ&quot;&gt;кэш — кэширование объектов или страниц&lt;/li&gt;
    &lt;li id=&quot;eF6d&quot;&gt;распределенная блокировка (Distributed Lock) – строка Redis может использоваться для блокировки распределенных сервисов&lt;/li&gt;
    &lt;li id=&quot;jitX&quot;&gt;счетчик – подсчет количества лайков или чтений статьи&lt;/li&gt;
    &lt;li id=&quot;LCwf&quot;&gt;ограничение частоты запросов (Rate Limit) – ограничение частоты запросов на основе IP пользователя&lt;/li&gt;
    &lt;li id=&quot;2cC4&quot;&gt;генератор глобальных идентификаторов&lt;/li&gt;
    &lt;li id=&quot;wRgp&quot;&gt;корзина товаров – хэш Redis может использоваться для представления пар ключ-значение в корзине товаров&lt;/li&gt;
    &lt;li id=&quot;jFy5&quot;&gt;вычисление вовлеченности пользователя (User Retention) – Bitmap может использоваться для представления ежедневного входа пользователя в систему и его вовлеченности&lt;/li&gt;
    &lt;li id=&quot;lGux&quot;&gt;очередь сообщений (Message Queue)&lt;/li&gt;
    &lt;li id=&quot;dEiC&quot;&gt;ранжирование–- для сортировки статей может использоваться ZSet&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;strategii-keshirovaniya&quot;&gt;Стратегии кэширования&lt;/h3&gt;
  &lt;p id=&quot;hAUL&quot;&gt;Проектирование крупномасштабных систем обычно предполагает правильных выбор стратегии кэширования. Топ-5 самых популярных стратегий:&lt;/p&gt;
  &lt;figure id=&quot;YK8S&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/gm/d7/yw/gmd7ywfsixqc_zwx2rvdqxjivto.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;mikroservisnaya-arhitektura&quot;&gt;Микросервисная архитектура&lt;/h2&gt;
  &lt;h3 id=&quot;tipichnaya-mikroservisnaya-arhitektura&quot;&gt;Типичная микросервисная архитектура&lt;/h3&gt;
  &lt;figure id=&quot;pre9&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ua/7c/hd/ua7chd70eqa8dtboho0mn4uomym.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8RND&quot;&gt;Типичная микросервисная архитектура состоит из следующих частей:&lt;/p&gt;
  &lt;ul id=&quot;67lZ&quot;&gt;
    &lt;li id=&quot;nynC&quot;&gt;балансировщик нагрузки (Load Balancer) – распределяет входящий трафик между сервисами&lt;/li&gt;
    &lt;li id=&quot;i97P&quot;&gt;CDN (Content Delivery Network — сеть доставки контента) – группа географически распределенных серверов, содержащих статический контент для быстрой доставки. Клиенты сначала запрашивают данные из CDN и только после этого обращаются непосредственно к сервису&lt;/li&gt;
    &lt;li id=&quot;GCAj&quot;&gt;шлюз API (API Gateway) – обрабатывает входящие запросы и передает их соответствующим сервисам. Он общается с провайдером идентификации (Identity Provider – поставщик удостоверений) и другими службами&lt;/li&gt;
    &lt;li id=&quot;fqfq&quot;&gt;провайдер идентификации – обработка аутентификации и авторизации пользователей&lt;/li&gt;
    &lt;li id=&quot;gkvo&quot;&gt;реестр служб (Service Registry) – отвечает за регистрацию микросервисов для использования другими компонентами системы, такими как шлюз API&lt;/li&gt;
    &lt;li id=&quot;BhKU&quot;&gt;управление — мониторинг сервисов&lt;/li&gt;
    &lt;li id=&quot;YFrw&quot;&gt;микросервисы – проектируются и разворачиваются в разных доменах (domains). У каждого домена своя база данных. Шлюз API общается с микросервисами через REST или другие протоколы, микросервисы одного домена общаются между собой через RPC&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;2pxk&quot;&gt;&lt;em&gt;Преимущества микросервисов&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;jGDS&quot;&gt;
    &lt;li id=&quot;26yH&quot;&gt;могут быстро проектироваться, разворачиваться и масштабироваться горизонтально&lt;/li&gt;
    &lt;li id=&quot;CFUj&quot;&gt;каждый домен может независимо поддерживаться отдельной командой&lt;/li&gt;
    &lt;li id=&quot;w7h0&quot;&gt;бизнес-требования могут кастомизироваться под каждый домен и, как следствие, лучше поддерживаться&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;luchshie-praktiki-mikroservisov&quot;&gt;Лучшие практики микросервисов&lt;/h3&gt;
  &lt;p id=&quot;fwtB&quot;&gt;9 лучших практик разработки микросервисов:&lt;/p&gt;
  &lt;figure id=&quot;XOFG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/-s/q_/ai/-sq_aiykgi98bnxjcgqt41fa7to.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;Ye6K&quot;&gt;
    &lt;li id=&quot;t96R&quot;&gt;У каждого микросервиса должно быть свое хранилище данных.&lt;/li&gt;
    &lt;li id=&quot;iRsM&quot;&gt;Код каждого сервиса должен быть примерно на одном уровне завершенности.&lt;/li&gt;
    &lt;li id=&quot;fiRF&quot;&gt;Каждый сервис должен собираться независимо от других.&lt;/li&gt;
    &lt;li id=&quot;Ntbu&quot;&gt;У каждого сервиса должно быть своя зона ответственности.&lt;/li&gt;
    &lt;li id=&quot;N9Yb&quot;&gt;Сервисы должны разворачиваться с помощью контейнеров.&lt;/li&gt;
    &lt;li id=&quot;KVUq&quot;&gt;Сервисы не должны хранить состояние (должны быть stateless).&lt;/li&gt;
    &lt;li id=&quot;Zp7P&quot;&gt;Должен применяться доменно-ориентированный дизайн.&lt;/li&gt;
    &lt;li id=&quot;JGXM&quot;&gt;Микрофронтенды.&lt;/li&gt;
    &lt;li id=&quot;tQxb&quot;&gt;Окрестрация сервисов.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;tipichnyy-tehnicheskiy-stek-mikroservisov&quot;&gt;Типичный технический стек микросервисов&lt;/h3&gt;
  &lt;figure id=&quot;a1ml&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/pt/oa/ro/ptoarofjedikjj9smtdmfvqouyg.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;IVIR&quot;&gt;&lt;em&gt;Препродакшн&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;bCkA&quot;&gt;
    &lt;li id=&quot;6fMB&quot;&gt;Определение API – определение коммуникации между фронтендом и бэкендом. Для этого может использоваться Postman или OpenAPI.&lt;/li&gt;
    &lt;li id=&quot;fKfp&quot;&gt;разработка – для разработки фронтенда чаще всего используется React, для разработки бэкенда — Python/PHP/Java/GO etc. Шлюз API (API Gateway) конфигурируется в соответствии с определением API.&lt;/li&gt;
    &lt;li id=&quot;2sPQ&quot;&gt;непрерывная интеграция (Continuous Integration, CI) – для автоматизированного тестирования часто используется JUnit и Jenkins. Код упаковывается в образ Docker и разворачивается в виде микросервисов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;QQ6P&quot;&gt;&lt;em&gt;Продакшн&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;fnrz&quot;&gt;
    &lt;li id=&quot;zR2m&quot;&gt;Для балансировки нагрузки часто используется Nginx. Cloudflare предоставляет CDN (Content Delivery Network — сеть доставки контента)&lt;/li&gt;
    &lt;li id=&quot;Atmg&quot;&gt;шлюз API&lt;/li&gt;
    &lt;li id=&quot;Kusq&quot;&gt;облачная инфраструктура — микросервисы разворачиваются в облаке: AWS, Microsoft Azure, Google GCP etc. Для кэширования данных чаще всего используется Redis, для полнотекстового поиска – Elastic Search&lt;/li&gt;
    &lt;li id=&quot;IF5o&quot;&gt;взаимодействие между сервисами -–для этого используются брокеры сообщений (Message Broker) вроде Kafka или RPC&lt;/li&gt;
    &lt;li id=&quot;sJuT&quot;&gt;хранение данных – реляционные, нереляционные базы данных, облачные хранилища etc.&lt;/li&gt;
    &lt;li id=&quot;NsIT&quot;&gt;управление и мониторинг — для управления микросервисами используются такие инструменты, как Prometheus, Elastic Stack, Kubernetes etc.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;prichiny-vysokoy-proizvoditelnosti-kafka&quot;&gt;Причины высокой производительности Kafka&lt;/h3&gt;
  &lt;p id=&quot;ybJq&quot;&gt;На производительность Kafka влияет множество архитектурных решений. 2 основных:&lt;/p&gt;
  &lt;figure id=&quot;deWf&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/e-/as/qc/e-asqcsi91s9nwjnxhg9tajiyci.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;OU1o&quot;&gt;
    &lt;li id=&quot;Xqm3&quot;&gt;Последовательный ввод/вывод (Sequential IO).&lt;/li&gt;
    &lt;li id=&quot;LVhX&quot;&gt;Принцип нулевого копирования (Zero Copy Principle).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Pfa5&quot;&gt;Диаграмма иллюстрирует, как данные передаются между производителем (producer) и потребителем (consumer), а также что означает принцип нулевого копирования.&lt;/p&gt;
  &lt;p id=&quot;9JAx&quot;&gt;1.1-1.3. Производитель записывает данные на диск.&lt;/p&gt;
  &lt;ol id=&quot;g1O1&quot;&gt;
    &lt;li id=&quot;f0QQ&quot;&gt;Потребитель читает данные без нулевого копирования.&lt;br /&gt;2.1. Данные загружаются с диска в кэш операционной системы.&lt;br /&gt;2.2. Данные копируются из кэша ОС в приложение Kafka.&lt;br /&gt;2.3. Приложение Kafka копирует данные в буфер сокета (socket buffer).&lt;br /&gt;2.4. Данные копируются из буфера сокета на сетевую карту.&lt;br /&gt;2.5. Сетевая карта отправляет данные потребителю.&lt;/li&gt;
    &lt;li id=&quot;ywAO&quot;&gt;Потребитель читает данные с нулевым копированием.&lt;br /&gt;3.1. Данные загружаются с диска в кэш ОС.&lt;br /&gt;3.2. Кэш ОС копируется сразу на сетевую карту с помощью команды &lt;code&gt;sendfile()&lt;/code&gt;.&lt;br /&gt;3.3. Сетевая карта отправляет данные потребителю.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ouBx&quot;&gt;Нулевое копирование — это сохранение нескольких копий данных в контекстах приложения и ядра (kernel).&lt;/p&gt;
  &lt;h2 id=&quot;platezhnye-sistemy&quot;&gt;Платежные системы&lt;/h2&gt;
  &lt;figure id=&quot;wrSX&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/pn/n8/pq/pnn8pqz-dxnnu8rjnkzmbamls94.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;pochemu-kreditnuyu-kartu-nazyvayut-samym-vygodnym-produktom-banka-kak-visamastercard-delayut-dengi&quot;&gt;Почему кредитную карту называют &amp;quot;самым выгодным продуктом банка&amp;quot;? Как VISA/Mastercard делают деньги?&lt;/h3&gt;
  &lt;p id=&quot;7dM4&quot;&gt;Экономическая составляющая оплаты товара с помощью кредитной карты:&lt;/p&gt;
  &lt;figure id=&quot;1M1x&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/b5/w1/g6/b5w1g6qq56kzft7sorhnuy5kbjq.jpeg&quot; width=&quot;1510&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;wsXS&quot;&gt;
    &lt;li id=&quot;V0ZF&quot;&gt;Держатель карты платит 100$ за товар.&lt;/li&gt;
    &lt;li id=&quot;8gP1&quot;&gt;Продавец получает более высокие продажи и должен компенсировать банку-эмитенту (банку, выпустившему карту) и карточной сети (card network) расходы на обеспечение сервиса оплаты. Банк-эквайер (банк, которому принадлежит платежный терминал) устанавливает продавцу комиссию, которая называется &amp;quot;комиссией за скидку продавца&amp;quot; (merchant discount fee).&lt;br /&gt;3-4. Эквайер удерживает 0,25$ в качестве эквайринговой наценки (acquiring markup) и 1,75$ выплачиваются эмитенту в качестве комиссии за обмен (interchange fee). Комиссия за скидку продавца должна покрывать комиссию за обмен. Комиссия за обмен устанавливается карточной сетью, поскольку согласование эквайером комиссии с каждым продавцом было бы неэффективным.&lt;/li&gt;
    &lt;li id=&quot;DkYV&quot;&gt;Карточная сеть согласовывает сетевые оценки и комиссии с каждым банком, который оплачивает расходы сети каждый месяц. Например, VISA взимает оценку 0,11% плюс 0,0195$ за каждую операцию.&lt;/li&gt;
    &lt;li id=&quot;iB1L&quot;&gt;Держатель карты платит банку-эмитенту за его услуги.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul id=&quot;trXR&quot;&gt;
    &lt;li id=&quot;tdOZ&quot;&gt;Эмитент платит продавцу, даже если держатель карты не платит эмитенту&lt;/li&gt;
    &lt;li id=&quot;oIi0&quot;&gt;эмитент платит продавцу перед тем, как держатель карты платит эмитенту&lt;/li&gt;
    &lt;li id=&quot;3WLy&quot;&gt;эмитент несет другие операциональные расходы, такие как управление аккаунтами потребителей, предоставление инструкций, обнаружение мошенничества, управление рисками, клиринг и расчеты etc.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;princip-raboty-visa&quot;&gt;Принцип работы VISA&lt;/h3&gt;
  &lt;figure id=&quot;NKt9&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/k7/kc/sb/k7kcsbliomhbnmzdqmn6ro_gzu8.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8Bkg&quot;&gt;VISA, Mastercard и American Express выступают в роли карточных сетей (card networks) для клиринга и расчета средств. Банк-эквайер и банк-эмитент могут быть (и часто являются) разными банками. Если бы банки выполняли транзакции одну за другой без посредника, каждый банк должен был бы устанавливать транзакцию с другими банками. Это неэффективно.&lt;/p&gt;
  &lt;p id=&quot;cfq7&quot;&gt;На диаграмме показана роль VISA в процессе оплаты с помощью кредитной карты. Этот процесс на самом деле состоит из двух процессов. Когда пользователь использует карту, запускается процесс авторизации. Когда продавец хочет получить деньги в конце дня происходит процесс захвата и расчетов (capture and settlement).&lt;/p&gt;
  &lt;p id=&quot;1ucN&quot;&gt;&lt;em&gt;Авторизация&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;dkDz&quot;&gt;
    &lt;li id=&quot;kIkd&quot;&gt;Эмитент предоставляет карту потребителю.&lt;/li&gt;
    &lt;li id=&quot;eChh&quot;&gt;Держатель карты хочет совершить покупку и прикладывает карту к торговому (Point of Sale, POS) терминалу в магазине.&lt;/li&gt;
    &lt;li id=&quot;tZwS&quot;&gt;POS отправляет транзакцию эквайеру, которому принадлежит терминал.&lt;br /&gt;3 и 4. Эквайер отправляет транзакцию в карточную сеть, которая также называется карточной схемой (card scheme). Сеть отправляет транзакцию эмитенту для подтверждения.&lt;br /&gt;4.1, 4.2 и 4.3. Эмитент замораживает деньги при подтверждении транзакции. Подтверждение или отказ отправляются эквайеру, а также – в терминал.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;zOUx&quot;&gt;&lt;em&gt;Захват и расчеты&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;yftr&quot;&gt;1 и 2. Продавец хочет получить деньги в конце дня, он нажимает &amp;quot;захват&amp;quot; (capture) на терминале. Транзакции отправляются эквайеру группой (batch). Эквайер отправляет группу в карточную сеть.&lt;/p&gt;
  &lt;ol id=&quot;iPAz&quot;&gt;
    &lt;li id=&quot;QSgz&quot;&gt;Сеть выполняет клиринг для транзакций от разных эквайеров и рассылает файлы разным эмитентам. Клиринг — это процесс, при котором учитываются взаимозачетные транзакции, поэтому общее количество транзакций уменьшается. Сеть берет на себя бремя общения с каждым банком и получает взамен комиссию за обслуживание (service fee).&lt;/li&gt;
    &lt;li id=&quot;Vxtk&quot;&gt;Эмитенты подтверждают корректность клиринговых файлов и переводят деньги эквайерам.&lt;/li&gt;
    &lt;li id=&quot;lRub&quot;&gt;Эквайер переводит деньги в банк продавца.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;devops&quot;&gt;DevOps&lt;/h2&gt;
  &lt;h3 id=&quot;devops-sre-i-platform-engineering&quot;&gt;DevOps, SRE и Platform Engineering&lt;/h3&gt;
  &lt;figure id=&quot;D60d&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/sa/t6/rh/sat6rhhvsnpnxt1ee-grxycwd5y.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Bome&quot;&gt;Концепция DevOps была представлена в 2009 Patrick Debois и Andrew Shafer на конференции &amp;quot;Agile&amp;quot;. Они стремились сократить разрыв между разработкой ПО и его эксплуатацией, продвигая культуру сотрудничества и общую ответственность за весь жизненный цикл разработки ПО.&lt;/p&gt;
  &lt;p id=&quot;NH3c&quot;&gt;Концепция SRE, или Site Reliability Engineering (проектирование надежности объекта), была впервые разработана компанией Google в начале 2000-х для решения операционных задач управления крупномасштабными и сложными системами. Google разработала методы и инструменты SRE, такие как система управления кластерами Borg и система мониторинга Monarch, чтобы повысить надежность и эффективность своих сервисов.&lt;/p&gt;
  &lt;p id=&quot;9aMy&quot;&gt;Platform Engineering (разработка платформ) — это более новая концепция, основанная на SRE. Считается, что это расширение практик DevOps и SRE с упором на предоставление комплексной платформы для разработки продуктов, которая поддерживает всю бизнес-логику.&lt;/p&gt;
  &lt;p id=&quot;fpqG&quot;&gt;Все эти концепции связаны с тенденцией улучшения совместной работы, автоматизации и эффективности разработки и эксплуатации ПО.&lt;/p&gt;
  &lt;h3 id=&quot;chto-takoe-kubernetes&quot;&gt;Что такое Kubernetes?&lt;/h3&gt;
  &lt;p id=&quot;Rq29&quot;&gt;Kubernetes (K8s) – это система оркестрации контейнеров. Она используется для деплоя и управления контейнерами. Ее дизайн во многом вдохновлен Borg – внутренней системой Google.&lt;/p&gt;
  &lt;figure id=&quot;tX9B&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/rn/mk/0u/rnmk0uljq7wgadnnrn-nvmxw13a.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FRk7&quot;&gt;Кластер (cluster) K8s состоит из набора рабочих машин (worker machines), называющихся узлами (nodes), которые запускают контейнеризованные приложения. Каждый кластер имеет хотя бы один рабочий узел.&lt;/p&gt;
  &lt;p id=&quot;NFCw&quot;&gt;На рабочих узлах размещаются модули (pods), которые являются компонентами рабочей нагрузки приложения. Контрольный уровень (control plane) управляет рабочими узлами и модулями в кластере. В продакшне уровень управления обычно работает на нескольких компьютерах, а в кластере, как правило, работает несколько узлов, что обеспечивает отказоустойчивость и высокую доступность.&lt;/p&gt;
  &lt;p id=&quot;siPj&quot;&gt;&lt;em&gt;Компоненты уровня управления&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;j5bJ&quot;&gt;
    &lt;li id=&quot;hOSL&quot;&gt;Сервер API – общается со всеми компонентами кластера. Все операции над модулями выполняются через него.&lt;/li&gt;
    &lt;li id=&quot;ed6d&quot;&gt;Планировщик (Scheduler) — следит за полезной нагрузкой модулей и загружает создаваемые модули.&lt;/li&gt;
    &lt;li id=&quot;Y5LY&quot;&gt;Менеджер контроллеров (Controller Manager) – запускает контроллеры, включая Node Controller, Job Controller, EndpointSlice Controller и ServiceAccount Controller.&lt;/li&gt;
    &lt;li id=&quot;003p&quot;&gt;Etcd – хранилище ключ-значение, используемое в качестве резервного хранилища данных всех кластеров.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;nIsL&quot;&gt;&lt;em&gt;Узлы&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;eeV3&quot;&gt;
    &lt;li id=&quot;ODjy&quot;&gt;Модули. Модуль – это группа контейнеров и наименьшая единица, которой оперирует K8s. Модули имеют один IP-адрес, применяемый ко всем контейнерам модуля.&lt;/li&gt;
    &lt;li id=&quot;GqpM&quot;&gt;Kubelet – агент, запускающийся на каждом узле кластера. Он обеспечивает запуск контейнеров в модуле.&lt;/li&gt;
    &lt;li id=&quot;Jd6D&quot;&gt;Kube Proxy – сетевой прокси, запускающийся в каждом узле кластера. Он перенаправляет трафик, приходящий в узел из сервиса. Он перенаправляет запросы для обработки в нужные контейнеры.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;docker-i-kubernetes&quot;&gt;Docker и Kubernetes&lt;/h3&gt;
  &lt;figure id=&quot;nO8i&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/vv/cv/f_/vvcvf_-er7fizqbzqqeerodaqza.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9LQ0&quot;&gt;&lt;em&gt;Что такое Docker?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;e81e&quot;&gt;Docker – это опенсорсная платформа, позволяющая упаковывать, распределять и запускать приложения в изолированных контейнерах. Она фокусируется на контейнеризации, предоставлении легковесных окружений, инкапсулирующих приложения и их зависимости.&lt;/p&gt;
  &lt;p id=&quot;m7yc&quot;&gt;&lt;em&gt;Что такое Kubernetes?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;k2jN&quot;&gt;Kubernetes, часто именуемый K8s, – это опенсорсная платформа для оркестрации контейнеров. Она предоставляет фреймворк для автоматизации деплоя, масштабирования и управления контейнеризованными приложениями посредством кластера узлов.&lt;/p&gt;
  &lt;p id=&quot;LtNC&quot;&gt;&lt;em&gt;Отличия&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;LQqk&quot;&gt;Docker действует на уровне отдельных контейнеров на одном хосте операционной системы. Мы должны вручную управлять каждым хостом, устанавливать сети, политики безопасности и хранилище для нескольких связанных контейнеров, что может представлять некоторую сложность.&lt;/p&gt;
  &lt;p id=&quot;oHZu&quot;&gt;Kubernetes действует на уровне кластера. Он управляет несколькими контейнеризованными приложениями через несколько хостов, обеспечивая автоматизацию таких задач, как балансировка нагрузки, масштабирование и обеспечение ожидаемого состояния приложений.&lt;/p&gt;
  &lt;p id=&quot;3HD9&quot;&gt;Если быть кратким, то Docker фокусируется на контейнеризации и запуске контейнеров на отдельных хостах, а Kubernetes специализируется на управлении и оркестрации контейнеров в масштабе посредством кластера хостов.&lt;/p&gt;
  &lt;h3 id=&quot;princip-raboty-docker&quot;&gt;Принцип работы Docker&lt;/h3&gt;
  &lt;p id=&quot;bqQC&quot;&gt;На следующей диаграмме представлена архитектура Docker и то, что происходит при выполнении команд &lt;code&gt;docker build&lt;/code&gt;, &lt;code&gt;docker pull&lt;/code&gt; и &lt;code&gt;docker run&lt;/code&gt;:&lt;/p&gt;
  &lt;figure id=&quot;H840&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/fc/gq/rf/fcgqrf4sf3w1pyle2araj0pjzny.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hJUw&quot;&gt;Архитектура Docker включает в себя 3 основных компонента:&lt;/p&gt;
  &lt;ul id=&quot;E9dj&quot;&gt;
    &lt;li id=&quot;dKMM&quot;&gt;клиент (client) – клиент общается с демоном (daemon)&lt;/li&gt;
    &lt;li id=&quot;uJeC&quot;&gt;хост (host) – демон регистрирует запросы API и управляет объектами, такими как образы (images), контейнеры, сети и тома (volumes)&lt;/li&gt;
    &lt;li id=&quot;YwTH&quot;&gt;реестр (registry) – место хранения образов. DockerHub — публичный/открытый реестр образов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;O8TH&quot;&gt;В качестве примера рассмотрим процесс выполнения команды &lt;code&gt;docker run&lt;/code&gt;:&lt;/p&gt;
  &lt;ol id=&quot;52pY&quot;&gt;
    &lt;li id=&quot;EUWb&quot;&gt;Из реестра извлекается соответствующий образ.&lt;/li&gt;
    &lt;li id=&quot;A0G5&quot;&gt;Создается контейнер.&lt;/li&gt;
    &lt;li id=&quot;w7qx&quot;&gt;Контейнеру выделяется область файловой системы для чтения/записи.&lt;/li&gt;
    &lt;li id=&quot;maTw&quot;&gt;Создается сетевой интерфейс, контейнер подключается к дефолтной сети.&lt;/li&gt;
    &lt;li id=&quot;fE4b&quot;&gt;Контейнер запускается.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;git&quot;&gt;Git&lt;/h2&gt;
  &lt;h3 id=&quot;princip-raboty-komand-git&quot;&gt;Принцип работы команд Git&lt;/h3&gt;
  &lt;p id=&quot;J0cT&quot;&gt;Важно, где хранится наш код. Обычно предполагается, что он хранится либо на удаленном сервере, таком как Github, либо на нашей локальной машине. Но это не совсем так. Git поддерживает 3 локальных хранилища на нашей машине, так что наш код может быть обнаружен в 4 местах:&lt;/p&gt;
  &lt;figure id=&quot;9rCM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/si/gy/aa/sigyaakzpqnjb6axethhkfyrhx4.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;y007&quot;&gt;
    &lt;li id=&quot;djdC&quot;&gt;Рабочая директория (working directory) – место редактирования файлов&lt;/li&gt;
    &lt;li id=&quot;eViV&quot;&gt;промежуточная область (staging area) – временная локация для хранения файлов до следующей фиксации (commit)&lt;/li&gt;
    &lt;li id=&quot;eXYD&quot;&gt;локальный репозиторий – содержит зафиксированный код&lt;/li&gt;
    &lt;li id=&quot;4OXq&quot;&gt;удаленный репозиторий – удаленный сервер, на котором хранится код&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Zg0p&quot;&gt;Большинство команд Git осуществляет перемещение кода из одной локации в другую.&lt;/p&gt;
  &lt;h3 id=&quot;princip-raboty-git&quot;&gt;Принцип работы Git&lt;/h3&gt;
  &lt;figure id=&quot;xjyy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/1x/zh/lb/1xzhlbvmox_xuxo3qk34ge6yio8.jpeg&quot; width=&quot;1320&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;itU0&quot;&gt;Git – это распределенная система контроля версий.&lt;/p&gt;
  &lt;p id=&quot;ky6m&quot;&gt;Каждый разработчик поддерживает локальную копию основного репозитория, редактирует и фиксирует (commit) локальную копию.&lt;/p&gt;
  &lt;p id=&quot;yRdm&quot;&gt;Фиксация является очень быстрой, поскольку эта операция не затрагивает удаленный репозиторий.&lt;/p&gt;
  &lt;p id=&quot;gFpt&quot;&gt;Если с удаленным репозиторием что-то случилось, файлы могут быть восстановлены из локальных репозиториев.&lt;/p&gt;
  &lt;h3 id=&quot;git-merge-i-git-rebase&quot;&gt;Git merge и git rebase&lt;/h3&gt;
  &lt;p id=&quot;j69M&quot;&gt;Разница между командами &lt;code&gt;git merge&lt;/code&gt; и &lt;code&gt;git rebase&lt;/code&gt;:&lt;/p&gt;
  &lt;figure id=&quot;ygij&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/b1/80/qw/b180qwfvwas3qus-xgwcgblczyi.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FywM&quot;&gt;Когда мы вливаем (merge) изменения из одной ветки (branch) в другую, мы можем использовать &lt;code&gt;git merge&lt;/code&gt; или &lt;code&gt;git rebase&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;u933&quot;&gt;&lt;em&gt;Merge&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;vc8D&quot;&gt;Данная команда создает новый коммит G в основной (main) ветке. G содержит историю как основной, так и функциональной (feature) ветки.&lt;/p&gt;
  &lt;p id=&quot;evNz&quot;&gt;Merge является недеструктивным (non-destructive) – ни основная, ни функциональная ветка не модифицируются.&lt;/p&gt;
  &lt;p id=&quot;RYzo&quot;&gt;&lt;em&gt;Rebase&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;qikW&quot;&gt;Rebase перемещает историю функциональной ветки в начало (head) основной ветки. Это приводит к созданию новых коммитов E, F и G для каждого коммита функциональной ветки.&lt;/p&gt;
  &lt;p id=&quot;wPCw&quot;&gt;Преимуществом &lt;code&gt;rebase&lt;/code&gt; является линейная история фиксации изменений (коммитов).&lt;/p&gt;
  &lt;p id=&quot;9mYm&quot;&gt;&lt;code&gt;Rebase&lt;/code&gt; может быть опасным при нарушении &amp;quot;золотого правила rebase&amp;quot;, которое гласит &amp;quot;никогда не используй rebase для публичных веток&amp;quot;.&lt;/p&gt;
  &lt;h2 id=&quot;oblachnye-servisy&quot;&gt;Облачные сервисы&lt;/h2&gt;
  &lt;h3 id=&quot;populyarnye-oblachnye-servisy-po-sostoyaniyu-na-2023-god&quot;&gt;Популярные облачные сервисы по состоянию на 2023 год&lt;/h3&gt;
  &lt;figure id=&quot;RdWH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/ld/nk/sa/ldnksafg6p9a0nujoesleoimlrm.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;oblachnaya-nativnost&quot;&gt;Облачная нативность&lt;/h3&gt;
  &lt;p id=&quot;lHL6&quot;&gt;Диаграмма показывает эволюцию архитектуры и процессов с 1980-х:&lt;/p&gt;
  &lt;figure id=&quot;ZOww&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/vj/-k/in/vj-kinpnipmsr_zex-7cqjvnn60.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FDjD&quot;&gt;Организации могут создавать и запускать масштабируемые приложения в публичных, приватных и гибридных облаках с помощью нативных облачных (cloud native) технологий.&lt;/p&gt;
  &lt;p id=&quot;NTqT&quot;&gt;Это означает, что приложения проектируются под возможности облака, что делает их устойчивыми к нагрузке и легкомасштабируемыми.&lt;/p&gt;
  &lt;p id=&quot;31AA&quot;&gt;Облачная нативность включает 4 аспекта:&lt;/p&gt;
  &lt;ol id=&quot;QnxA&quot;&gt;
    &lt;li id=&quot;9eCt&quot;&gt;Процесс разработки – эволюционировал от водопада (waterfall) до Agile и DevOps.&lt;/li&gt;
    &lt;li id=&quot;GvMT&quot;&gt;Архитектура приложения – архитектура эволюционировала от монолитов к микросервисам. Каждый сервис является небольшим, адаптируемым к ограниченным ресурсам облачных контейнеров.&lt;/li&gt;
    &lt;li id=&quot;zYKQ&quot;&gt;Деплой – сначала приложения разворачивались на физических серверах. В 2000-х приложения нечувствительные к задержке стали разворачиваться на виртуальных серверах. Облачная нативность позволяет упаковывать приложения в образы Docker и разворачивать их в контейнерах.&lt;/li&gt;
    &lt;li id=&quot;V1RD&quot;&gt;Инфраструктура приложения – приложения массово разворачиваются в облачной инфраструктуре вместо локальных серверов.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;instrumenty-povyshayuschie-produktivnost-razrabotki&quot;&gt;Инструменты, повышающие продуктивность разработки&lt;/h2&gt;
  &lt;h3 id=&quot;vizualizaciya-faylov-json&quot;&gt;Визуализация файлов JSON&lt;/h3&gt;
  &lt;p id=&quot;P1RO&quot;&gt;Файлы JSON, содержащие вложенные структуры, сложно читать.&lt;/p&gt;
  &lt;p id=&quot;bqSA&quot;&gt;JsonCrack генерирует граф данных на основе файла JSON, что сильно облегчает изучение его структуры.&lt;/p&gt;
  &lt;p id=&quot;o7r9&quot;&gt;Сгенерированные диаграммы можно скачивать в виде изображений.&lt;/p&gt;
  &lt;figure id=&quot;PbQ4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/c7/wo/8e/c7wo8ed-pzthy7vfuc-46xnkosc.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;avtomaticheskie-preobrazovanie-koda-v-arhitekturnye-diagrammy&quot;&gt;Автоматические преобразование кода в архитектурные диаграммы&lt;/h3&gt;
  &lt;figure id=&quot;VRaZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/z7/rw/do/z7rwdo8akb5rvx33q_evjo9vn4o.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;X9dh&quot;&gt;Возможности Diagrams:&lt;/p&gt;
  &lt;ul id=&quot;ibCm&quot;&gt;
    &lt;li id=&quot;8Y3n&quot;&gt;визуализация архитектуры облачной системы с помощью Python&lt;/li&gt;
    &lt;li id=&quot;PIc9&quot;&gt;рендеринг диаграмм в Jupiter Notebook&lt;/li&gt;
    &lt;li id=&quot;PV5I&quot;&gt;инструменты проектирования не требуются&lt;/li&gt;
    &lt;li id=&quot;orkV&quot;&gt;поддерживаются следующие провайдеры: AWS, Azure, GCP, Kubernetes, Alibaba Cloud, Oracle Cloud etc.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;linux&quot;&gt;Linux&lt;/h2&gt;
  &lt;h3 id=&quot;faylovaya-sistema-linux&quot;&gt;Файловая система Linux&lt;/h3&gt;
  &lt;figure id=&quot;HGQI&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/8t/ks/pm/8tkspmzqtmhqraax2w_zhwt8fi8.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ea8j&quot;&gt;Файловая система Linux раньше напоминала неорганизованный город, где люди строили свои дома там, где им заблагорассудится. Однако в 1994 был введен стандарт иерархии файловой системы (Filesystem Hierarchy Standard, FHS) Linux.&lt;/p&gt;
  &lt;p id=&quot;cBOf&quot;&gt;Внедряя такой стандарт, как FHS, ПО может обеспечить единообразную структуру в разных дистрибутивах Linux. Тем не менее, не все дистрибутивы Linux строго придерживаются этого стандарта. Они часто включают уникальные элементы или рассчитаны на удовлетворение конкретных потребностей. Начните с изучения названного стандарта. Используйте такие команды, как &lt;code&gt;cd&lt;/code&gt; для навигации и &lt;code&gt;ls&lt;/code&gt; для просмотра содержимого каталога. Представьте файловую систему в виде дерева, которое начинается с корня (root, /). Со временем это станет для вас второй натурой, превратив вас в опытного администратора Linux.&lt;/p&gt;
  &lt;h3 id=&quot;18-osnovnyh-komand-linux&quot;&gt;18 основных команд Linux&lt;/h3&gt;
  &lt;p id=&quot;kBnu&quot;&gt;Команды Linux – это инструкции для взаимодействия с операционной системой. Они помогают управлять файлами, директориями, системными процессами и другими аспектами системы. Для эффективной работы с основанными на Linux системами необходимо уверенно владеть этими командами.&lt;/p&gt;
  &lt;p id=&quot;AuvF&quot;&gt;Популярные команды Linux:&lt;/p&gt;
  &lt;figure id=&quot;bHMc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/i-/o-/bg/i-o-bgqzvqkzselh9bbgrwyyerq.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;yOgF&quot;&gt;
    &lt;li id=&quot;eQcF&quot;&gt;&lt;code&gt;ls&lt;/code&gt; – показывает список файлов и директорий&lt;/li&gt;
    &lt;li id=&quot;QdUR&quot;&gt;&lt;code&gt;cd&lt;/code&gt; – меняет текущую директорию&lt;/li&gt;
    &lt;li id=&quot;AgcU&quot;&gt;&lt;code&gt;mkdir&lt;/code&gt; – создаёт директорию&lt;/li&gt;
    &lt;li id=&quot;sUk4&quot;&gt;&lt;code&gt;rm&lt;/code&gt; – удаляет файлы или директории&lt;/li&gt;
    &lt;li id=&quot;dgrS&quot;&gt;&lt;code&gt;cp&lt;/code&gt; – копирует файлы или директории&lt;/li&gt;
    &lt;li id=&quot;GbU4&quot;&gt;&lt;code&gt;mv&lt;/code&gt; – перемещает или переименовывает файлы или директории&lt;/li&gt;
    &lt;li id=&quot;55KO&quot;&gt;&lt;code&gt;chmod&lt;/code&gt; – меняет разрешения файла или директории&lt;/li&gt;
    &lt;li id=&quot;u4y4&quot;&gt;&lt;code&gt;grep&lt;/code&gt; – ищет паттерн в файлах&lt;/li&gt;
    &lt;li id=&quot;C890&quot;&gt;&lt;code&gt;find&lt;/code&gt; – ищет файлы или директории&lt;/li&gt;
    &lt;li id=&quot;UxiO&quot;&gt;&lt;code&gt;tar&lt;/code&gt; – управляет архивными файлами Tarball&lt;/li&gt;
    &lt;li id=&quot;qcHO&quot;&gt;&lt;code&gt;vi&lt;/code&gt; – редактирует файлы с помощью текстовых редакторов&lt;/li&gt;
    &lt;li id=&quot;t5ba&quot;&gt;&lt;code&gt;cat&lt;/code&gt; – показывает содержимое файлов&lt;/li&gt;
    &lt;li id=&quot;zYHu&quot;&gt;&lt;code&gt;top&lt;/code&gt; – показывает процессы и используемые ресурсы&lt;/li&gt;
    &lt;li id=&quot;1F7x&quot;&gt;&lt;code&gt;ps&lt;/code&gt; – показывают информацию о процессе&lt;/li&gt;
    &lt;li id=&quot;DCNB&quot;&gt;&lt;code&gt;kill&lt;/code&gt; – завершает процесс с помощью сигнала&lt;/li&gt;
    &lt;li id=&quot;bcYN&quot;&gt;&lt;code&gt;du&lt;/code&gt; – вычисляет используемое пространство файла&lt;/li&gt;
    &lt;li id=&quot;7mnJ&quot;&gt;&lt;code&gt;ifconfig&lt;/code&gt; – настраивает сетевые интерфейсы&lt;/li&gt;
    &lt;li id=&quot;4LM3&quot;&gt;&lt;code&gt;ping&lt;/code&gt; – тестирует соединение между хостами&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;bezopasnost&quot;&gt;Безопасность&lt;/h2&gt;
  &lt;h3 id=&quot;princip-raboty-https&quot;&gt;Принцип работы HTTPS&lt;/h3&gt;
  &lt;p id=&quot;5Qnb&quot;&gt;Hypertext Transfer Protocol Secure (безопасный протокол передачи гипертекста, HTTPS) – это расширение Hypertext Transfer Protocol (протокола передачи гипертекста, HTTP). HTTPS передает зашифрованные данные с помощью Transport Layer Security (безопасность транспортного уровня, TLS). Если данные будут перехвачены, все, что получит злоумышленник, — это двоичный код.&lt;/p&gt;
  &lt;figure id=&quot;xjeM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/b2/6d/_u/b26d_uwsyb2bmmdq3btbwe75vok.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ykqh&quot;&gt;&lt;em&gt;Как шифруются и расшифровываются данные?&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;w5Ru&quot;&gt;
    &lt;li id=&quot;bzbe&quot;&gt;Клиент и сервер устанавливают соединение TCP.&lt;/li&gt;
    &lt;li id=&quot;rtka&quot;&gt;Клиент отправляет серверу приветствие (client hello). Сообщение содержит необходимые алгоритмы шифрования (наборы шифров – cipher suites) и последнюю поддерживаемую версию TLS. Сервер отвечает приветствием (server hello), сообщающим, поддерживает ли он данные алгоритмы и версию TLS. Затем сервер отправляет клиенту сертификат SSL. Сертификат содержит открытый ключ, название хоста, дату истечения срока действия etc. Клиент валидирует сертификат.&lt;/li&gt;
    &lt;li id=&quot;tp0l&quot;&gt;После проверки сертификата SSL клиент генерирует ключ сессии (session key) и шифрует его с помощью открытого ключа. Сервер получает зашифрованный ключ и расшифровывает его с помощью закрытого ключа.&lt;/li&gt;
    &lt;li id=&quot;UqOm&quot;&gt;Теперь, когда клиент и сервер имеют один и тот же ключ сессии (симметричное шифрование), данные могут передаются по защищенному двунаправленному каналу.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;gAly&quot;&gt;&lt;em&gt;Почему HTTPS переключается на симметричное шифрование при передаче данных?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;6Zlg&quot;&gt;На это существует 2 основные причины:&lt;/p&gt;
  &lt;ol id=&quot;fYjo&quot;&gt;
    &lt;li id=&quot;ylGO&quot;&gt;Безопасность – асимметричное шифрование работает только в одном направлении. Это означает, что любой сможет расшифровать данные, передаваемые сервером клиенту, с помощью открытого ключа.&lt;/li&gt;
    &lt;li id=&quot;L44p&quot;&gt;Экономия ресурсов сервера: асимметричное шифрование добавляет много расходов на вычисления. Оно не подходит для передачи данных в длительных сеансах.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;oauth-20-prostymi-slovami&quot;&gt;OAuth 2.0 простыми словами&lt;/h3&gt;
  &lt;p id=&quot;IA8h&quot;&gt;OAuth 2.0 — это мощная и безопасная платформа, которая позволяет приложениям безопасно взаимодействовать друг с другом от имени пользователей без передачи их конфиденциальных учетных данных:&lt;/p&gt;
  &lt;figure id=&quot;oLe4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/6_/fk/d9/6_fkd9gsjj7l7ksx9700e8rk7ze.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SYNH&quot;&gt;Сущностями, участвующими в OAuth, являются пользователь, сервер и поставщик удостоверений/провайдер идентификации (Identity Provider, IDP).&lt;/p&gt;
  &lt;p id=&quot;D5Gi&quot;&gt;&lt;em&gt;Токен OAuth&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;xHhh&quot;&gt;При использовании OAuth мы получаем токен OAuth, который представляет нашу личность и разрешения (permissions). Этот токен может делать несколько важных вещей:&lt;/p&gt;
  &lt;ul id=&quot;lPCD&quot;&gt;
    &lt;li id=&quot;r1yT&quot;&gt;Single Sign-On (единый вход, SSO) – токен OAuth позволяет войти в несколько служб или приложений, используя всего один логин, что делает жизнь проще и безопаснее&lt;/li&gt;
    &lt;li id=&quot;G2am&quot;&gt;авторизация в разных системах – токен OAuth позволяет распределять права авторизации или доступа в разных системах, поэтому нам не нужно выполнять вход в каждую систему по-отдельности&lt;/li&gt;
    &lt;li id=&quot;M13Z&quot;&gt;доступ к профилю пользователя – приложения с токеном OAuth могут получить доступ к определенным частям профиля пользователя согласно предоставленным разрешениям.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;K8pa&quot;&gt;OAuth 2.0 предназначен для обеспечения безопасности данных пользователя, а также обеспечения бесперебойной и легкой работы с различными приложениями и сервисами.&lt;/p&gt;
  &lt;h3 id=&quot;4-naibolee-rasprostranennyh-mehanizmov-autentifikacii&quot;&gt;4 наиболее распространенных механизмов аутентификации&lt;/h3&gt;
  &lt;figure id=&quot;w8tM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/g1/dm/im/g1dmimvfomyaqfmyzkt4q6vfsni.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;nWzs&quot;&gt;
    &lt;li id=&quot;saLH&quot;&gt;Ключи SSH – криптографические ключи, которые используются для безопасного доступа к удаленным системам и серверам.&lt;/li&gt;
    &lt;li id=&quot;iLzu&quot;&gt;Токены OAuth – токены, предоставляющие ограниченный доступ к пользовательским данным сторонним приложениям.&lt;/li&gt;
    &lt;li id=&quot;AuRH&quot;&gt;Сертификаты SSL – цифровые сертификаты, которые обеспечивают безопасную и зашифрованную связь между серверами и клиентами.&lt;/li&gt;
    &lt;li id=&quot;UeFB&quot;&gt;Реквизиты для входа (credentials) – информация, предоставленная пользователем, которая используется для проверки и предоставления доступа к различным системам и сервисам.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;sessiya-kuki-jwt-sso-i-oauth&quot;&gt;Сессия, куки, JWT, SSO и OAuth&lt;/h3&gt;
  &lt;p id=&quot;yBu1&quot;&gt;Все эти термины относятся к управлению идентификацией пользователей. При посещении сайта мы указываем, кто мы (идентификация). Наша личность проверяется (аутентификация), и нам предоставляются определенные разрешения (авторизация). На сегодняшний день существует множество решений и этот список продолжает расти.&lt;/p&gt;
  &lt;figure id=&quot;X7hZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/gb/gm/zk/gbgmzkyp3mqgh3zcoa1540n44ok.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;lbWo&quot;&gt;
    &lt;li id=&quot;fkyN&quot;&gt;WWW-аутентификация – самый простой метод. Браузер запрашивает имя пользователя и пароль. Из-за невозможности контролировать жизненный цикл авторизации сегодня этот способ используется редко&lt;/li&gt;
    &lt;li id=&quot;reh0&quot;&gt;контроль жизненного цикла авторизации выполняется с помощью файлов куки (cookie), содержащих данные сессии. Сервер поддерживает хранилище сессий, а браузер сохраняет идентификатор сессии. Файлы куки обычно не подходят для мобильных приложений&lt;/li&gt;
    &lt;li id=&quot;1Es2&quot;&gt;для решения проблемы совместимости можно использовать токены. Клиент отправляет токен на сервер, а сервер проверяет его. Недостатком является то, что токен необходимо шифровать и расшифровывать, что может занимать много времени&lt;/li&gt;
    &lt;li id=&quot;OSIQ&quot;&gt;JWT (JSON Web Token) – это стандартный способ представления токенов. Такие токены можно проверить и им можно доверять, поскольку они содержат цифровую подпись. Поскольку JWT содержит подпись, нет необходимости сохранять информацию о сессии на стороне сервера&lt;/li&gt;
    &lt;li id=&quot;OJEy&quot;&gt;SSO (Single Sign-On – единый вход) позволяет войти в систему один раз для авторизации на нескольких сайтах. Для хранения межсайтовой информации в нем используется CAS (Central Authentication Service — центральная служба аутентификации)&lt;/li&gt;
    &lt;li id=&quot;8ZEB&quot;&gt;OAuth позволяет предоставлять доступ к определенной части наших учетных данных сторонним приложениям&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;bezopasnoe-hranenie-paroley-v-baze-dannyh-i-ih-validaciya&quot;&gt;Безопасное хранение паролей в базе данных и их валидация&lt;/h3&gt;
  &lt;figure id=&quot;2hyn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/vv/ay/hw/vvayhwge4ux1fe5w5z_s_a1uewk.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wRAx&quot;&gt;&lt;em&gt;Плохие практики&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;uM7w&quot;&gt;
    &lt;li id=&quot;nRKn&quot;&gt;хранение паролей в виде обычного текста – плохая идея, поскольку любой, у кого есть внутренний доступ, может их увидеть&lt;/li&gt;
    &lt;li id=&quot;MjTZ&quot;&gt;непосредственное хранения хэшей паролей является недостаточным с точки зрения безопасности, поскольку оно подвержено атакам с предварительными вычислениями (precomputation attacks), таким как радужные таблицы (rainbow tables)&lt;/li&gt;
    &lt;li id=&quot;U7ke&quot;&gt;для смягчения атаки с предварительным вычислением при хэшировании паролей используется соль (salt)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HZQ0&quot;&gt;&lt;em&gt;Соль&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;apgH&quot;&gt;Согласно рекомендациям OWASP, &amp;quot;соль – это уникальная, случайно сгенерированная строка, которая добавляется к каждому паролю в процессе хэширования&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;nM8e&quot;&gt;&lt;em&gt;Хранение пароля и соли&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;fh4o&quot;&gt;
    &lt;li id=&quot;S5YE&quot;&gt;Результат хэширования должен быть уникальным для каждого пароля.&lt;/li&gt;
    &lt;li id=&quot;4kAt&quot;&gt;В БД записывается результат выполнения функции &lt;code&gt;hash(password + salt)&lt;/code&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;AGmn&quot;&gt;&lt;em&gt;Валидация пароля&lt;/em&gt;&lt;/p&gt;
  &lt;ol id=&quot;VxT1&quot;&gt;
    &lt;li id=&quot;1Ysn&quot;&gt;Клиент вводит пароль.&lt;/li&gt;
    &lt;li id=&quot;pTKo&quot;&gt;Система извлекает соль из БД.&lt;/li&gt;
    &lt;li id=&quot;E40d&quot;&gt;Система добавляет соль к паролю и хэширует его. Получаем хэшированное значение H1.&lt;/li&gt;
    &lt;li id=&quot;L5rW&quot;&gt;Система сравнивает H1 и H2, где H2 — это хэш, хранящийся в БД. Если H1 и H2 совпадают, введенный пользователем пароль является валидным.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;jwt-json-web-token-prostymi-slovami&quot;&gt;JWT (JSON Web Token) простыми словами&lt;/h3&gt;
  &lt;figure id=&quot;MmWz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/mc/87/jp/mc87jpfjcjjijdne33io_f5kvho.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bIsK&quot;&gt;Представьте, что у нас есть специальная коробка под названием JWT. Внутри этой коробки лежит три вещи: заголовок (header), полезная нагрузка (payload) и подпись (signature).&lt;/p&gt;
  &lt;p id=&quot;A6Rc&quot;&gt;Заголовок похож на этикетку на внешней стороне коробки. Он сообщает нам, что это за тип коробки и как она защищена. Обычно он записывается в виде JSON, который представляет собой всего лишь способ организации информации с помощью фигурных скобок ({}) и двоеточий (:).&lt;/p&gt;
  &lt;p id=&quot;c33Q&quot;&gt;Полезная нагрузка – фактическое сообщение или информация, которую мы хотим отправить. Это может быть наше имя, возраст или любые другие данные, которыми мы хотим поделиться. Он также записывается в формате JSON, поэтому его легко понять и с ним легко работать.&lt;/p&gt;
  &lt;p id=&quot;r0QW&quot;&gt;Подпись – это то, что делает JWT безопасным. Это как особая печать, известная только отправителю. Подпись создается с использованием секретного кода (пароля). Подпись гарантирует, что никто не может изменить содержимое JWT без ведома отправителя.&lt;/p&gt;
  &lt;p id=&quot;ACfe&quot;&gt;При отправке JWT на сервер, мы помещаем в поле заголовок, полезную нагрузку и подпись. Затем мы отправляем его на сервер. Сервер читает заголовок и полезную нагрузку, чтобы понять, кто мы и что хотим сделать.&lt;/p&gt;
  &lt;h3 id=&quot;princip-raboty-google-authenticator-i-drugih-tipov-dvuhfaktornoy-autentifikacii&quot;&gt;Принцип работы Google Authenticator и других типов двухфакторной аутентификации&lt;/h3&gt;
  &lt;p id=&quot;EhYS&quot;&gt;Google Authenticator используется для входа в учетную запись, когда включена двухфакторная аутентификация.&lt;/p&gt;
  &lt;p id=&quot;38Si&quot;&gt;Google Authenticator – это программный аутентификатор, реализующий службу двухэтапной проверки.&lt;/p&gt;
  &lt;figure id=&quot;jRxb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/8s/ty/-6/8sty-6ea7uiiaqgreunjn2yldbm.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nU1s&quot;&gt;Данный процесс состоит из 2 этапов:&lt;/p&gt;
  &lt;ol id=&quot;AHJe&quot;&gt;
    &lt;li id=&quot;jkvd&quot;&gt;Пользователь включает двухэтапную аутентификацию Google.&lt;/li&gt;
    &lt;li id=&quot;6w61&quot;&gt;Пользователь использует аутентификатор для входа в систему etc.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;EysN&quot;&gt;&lt;em&gt;Стадия 1&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;MtZM&quot;&gt;1 и 2. Боб открывает веб-страницу, чтобы включить двухэтапную проверку. Страница запрашивает секретный ключ. Служба аутентификации генерирует секретный ключ для Боба и сохраняет его в базе данных.&lt;/p&gt;
  &lt;ol id=&quot;67P8&quot;&gt;
    &lt;li id=&quot;b4oc&quot;&gt;Служба аутентификации возвращает URI клиенту. URI состоит из эмитента ключа (key issuer), имени пользователя и секретного ключа. URI отображается в виде QR-кода на странице.&lt;/li&gt;
    &lt;li id=&quot;chVN&quot;&gt;Боб использует Google Authenticator для сканирования сгенерированного QR-кода. Секретный ключ записывается в аутентификатор.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;0Y0y&quot;&gt;&lt;em&gt;Стадия 2&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;HSAp&quot;&gt;1 и 2. Боб хочет войти на сайт с двухэтапной проверкой Google. Для этого ему нужен пароль. Каждые 30 секунд Google Authenticator генерирует шестизначный пароль, используя алгоритм TOTP (Time-based One Time Password – одноразовый пароль на основе времени). Боб использует пароль для входа на сайт.&lt;br /&gt;3 и 4. Клиент отправляет пароль, введенный Бобом, на сервер для аутентификации. Служба аутентификации считывает секретный ключ из базы данных и генерирует шестизначный пароль, используя тот же алгоритм TOTP, что и клиент.&lt;/p&gt;
  &lt;ol id=&quot;cu6B&quot;&gt;
    &lt;li id=&quot;hLrL&quot;&gt;Служба аутентификации сравнивает два пароля, сгенерированные клиентом и сервером, и возвращает результат сравнения клиенту. Боб может продолжить процесс входа в систему, только при совпадении паролей.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ONTU&quot;&gt;&lt;em&gt;Может ли другое лицо получить секретный ключ?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;uMKR&quot;&gt;Секретный ключ должен передаваться по протоколу HTTPS. Клиент-аутентификатор и БД сохраняют секретный ключ, поэтому он должен быть зашифрован.&lt;/p&gt;
  &lt;p id=&quot;M5aN&quot;&gt;&lt;em&gt;Может ли хакер угадать шестизначный пароль?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;1vRy&quot;&gt;Очень маловероятно. Пароль состоит из 6 цифр, поэтому сгенерированный пароль имеет 1 000 000 потенциальных комбинаций. Плюс пароль меняется каждые 30 секунд. Если хакеры хотят угадать пароль за 30 секунд, им необходимо вводить 30 000 комбинаций в секунду.&lt;/p&gt;
  &lt;h2 id=&quot;realnye-sistemy&quot;&gt;Реальные системы&lt;/h2&gt;
  &lt;h3 id=&quot;tehnicheskiy-stek-netflix&quot;&gt;Технический стек Netflix&lt;/h3&gt;
  &lt;p id=&quot;jXkv&quot;&gt;Диаграмма основана на исследованиях многих инженерных блогов Netflix и проектов с открытым исходным кодом.&lt;/p&gt;
  &lt;figure id=&quot;joL8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/8u/xl/1w/8uxl1wdl--gh5uozglkfcw9l2hq.png&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CH9w&quot;&gt;Для разработки нативных мобильных приложений используется Swift и Kotlin, для разработки веб-приложений – React.&lt;/p&gt;
  &lt;p id=&quot;Rbb6&quot;&gt;Для взаимодействия клиента и сервера используется GraphQL.&lt;/p&gt;
  &lt;p id=&quot;4P3T&quot;&gt;Для разработки сервисов бэкенда используется ZUUL, Eureka, фреймворк Spring Boot и другие технологии.&lt;/p&gt;
  &lt;p id=&quot;JKTU&quot;&gt;В качестве БД используются EV Cache, Cassandra, CockroachDB и другие.&lt;/p&gt;
  &lt;p id=&quot;PQ6v&quot;&gt;Для сообщений и потоковой передачи данных используются Apache Kafka и Fink.&lt;/p&gt;
  &lt;p id=&quot;wBud&quot;&gt;В качестве хранилища видео используются S3 и Open Connect.&lt;/p&gt;
  &lt;p id=&quot;JvY7&quot;&gt;Для обработки данных используются Flink и Spark. Данные визуализируются с помощью Tableau. Для обработки структурированной информации хранилища данных используется Redshift.&lt;/p&gt;
  &lt;p id=&quot;jPla&quot;&gt;Для процессов, связанных с CI/CD, используются такие инструменты, как JIRA, Confluence, PagerDuty, Jenkins, Gradle, Chaos Monkey, Spinnaker, Atlas и другие.&lt;/p&gt;
  &lt;h3 id=&quot;arhitektura-twitter-po-sostoyaniyu-na-2022-god&quot;&gt;Архитектура Twitter по состоянию на 2022 год&lt;/h3&gt;
  &lt;p id=&quot;FICr&quot;&gt;Это настоящая архитектура Твиттера. Она опубликована Илоном Маском и перерисована нами для лучшей читабельности.&lt;/p&gt;
  &lt;figure id=&quot;XH1P&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/8l/5f/ib/8l5fibw3z3advnkj5ue7gv4tpru.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;evolyuciya-arhitektury-airbnb-v-techenie-poslednih-15-let&quot;&gt;Эволюция архитектуры Airbnb в течение последних 15 лет&lt;/h3&gt;
  &lt;p id=&quot;vyjj&quot;&gt;Архитектура Airbnb прошла через 3 основных стадии:&lt;/p&gt;
  &lt;figure id=&quot;lpNv&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/k5/o1/gw/k5o1gw9jptrbevldfyzvubvebfy.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qURF&quot;&gt;&lt;em&gt;Монолит (2008-2017)&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;VWz0&quot;&gt;Airbnb начинался как простая торговая площадка для гостиниц и гостей. Она была разработана с помощью Ruby on Rails в виде монолита.&lt;/p&gt;
  &lt;p id=&quot;gstJ&quot;&gt;Недостатки:&lt;/p&gt;
  &lt;ul id=&quot;HskU&quot;&gt;
    &lt;li id=&quot;S5Pw&quot;&gt;отсутствие постоянной команды разработчиков + бесхозный код&lt;/li&gt;
    &lt;li id=&quot;80HQ&quot;&gt;медленный деплой&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;htFB&quot;&gt;&lt;em&gt;Микросервисы (2017-2020)&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;MpYp&quot;&gt;Ключевые сервисы:&lt;/p&gt;
  &lt;ul id=&quot;t6M5&quot;&gt;
    &lt;li id=&quot;H4v7&quot;&gt;сервис получения данных&lt;/li&gt;
    &lt;li id=&quot;zdqR&quot;&gt;сервис бизнес-логики&lt;/li&gt;
    &lt;li id=&quot;fgG7&quot;&gt;сервис рабочих процессов&lt;/li&gt;
    &lt;li id=&quot;ausm&quot;&gt;сервис агрегации UI (User Interface — пользовательский интерфейс)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;k8pl&quot;&gt;Каждый сервис разрабатывается и поддерживается отдельной командой.&lt;/p&gt;
  &lt;p id=&quot;eTPY&quot;&gt;Недостатки:&lt;/p&gt;
  &lt;ul id=&quot;09lj&quot;&gt;
    &lt;li id=&quot;wCVo&quot;&gt;сотнями сервисов и зависимостей сложно управлять&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Uxj0&quot;&gt;&lt;em&gt;Микро- и макросервисы (2020-настоящее время)&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;Ia0m&quot;&gt;Гибридная модель микро- и макросервисов фокусируется на унификации API.&lt;/p&gt;
  &lt;h3 id=&quot;monorepozitoriy-i-mikrorepozitorii&quot;&gt;Монорепозиторий и микрорепозитории&lt;/h3&gt;
  &lt;p id=&quot;108y&quot;&gt;Что лучше? Почему разные компании выбирают разные варианты?&lt;/p&gt;
  &lt;figure id=&quot;59mw&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/nx/4q/f-/nx4qf-aqle18dnrws57fkksqtbk.jpeg&quot; width=&quot;1334&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TPXj&quot;&gt;Концепция монорепозитория не нова; Linux и Windows были разработаны с использованием этой концепции. Чтобы улучшить масштабируемость и скорость сборки, Google разработал специальную внутреннюю цепочку инструментов и строгие стандарты качества кодирования, чтобы обеспечить единообразие разработки и деплоя.&lt;/p&gt;
  &lt;p id=&quot;scnR&quot;&gt;Amazon и Netflix являются основными представителями философии микросервисов. При таком подходе код сервиса естественным образом разделяется на отдельные репозитории. Он масштабируется быстрее, но в дальнейшем могут возникнуть проблемы с управлением многочисленными сервисами.&lt;/p&gt;
  &lt;p id=&quot;jSZp&quot;&gt;В монорепозитории каждый сервис представляет собой директорию, и каждая директория имеет конфигурацию BUILD и контроль разрешений OWNERS. Каждый участник сервиса несет ответственность за свою директорию.&lt;/p&gt;
  &lt;p id=&quot;MA3Q&quot;&gt;С другой стороны, в микрорепозитории каждый сервис отвечает за свой репозиторий, при этом конфигурация сборки и разрешений обычно устанавливаются для всего репозитория.&lt;/p&gt;
  &lt;p id=&quot;zsM3&quot;&gt;В монорепозитории зависимости распределяются по всей кодовой базе, поэтому при обновлении версии любой зависимости обновляется версия всего кода.&lt;/p&gt;
  &lt;p id=&quot;ZdiE&quot;&gt;В микрорепозитории зависимости являются уникальными для каждого репозитория. Версии зависимостей обновляются в соответствии с графиками сервисов.&lt;/p&gt;
  &lt;p id=&quot;OYsL&quot;&gt;В монорепозитории есть стандарт регистрации. Процесс проверки кода Google известен тем, что устанавливает высокую планку, обеспечивая единый стандарт качества для монорепозитория, независимо от сервиса.&lt;/p&gt;
  &lt;p id=&quot;Kkjm&quot;&gt;Микрорепозиторий может либо использовать собственный стандарт, либо принять общий стандарт, включив в него лучшие практики. Для сервиса он может масштабироваться быстрее, но качество кода может быть немного другим. Для управления микросервисами инженеры Google разработали Bazel, а Meta – Buck. Среди инструментов с открытым исходным кодом можно называть Nix, Lerna и другие.&lt;/p&gt;
  &lt;p id=&quot;5wTK&quot;&gt;С годами у микросервисов появилось больше поддерживаемых инструментов, включая Maven и Gradle для Java, NPM для NodeJS, CMake для C/C++ и другие.&lt;/p&gt;
  &lt;h3 id=&quot;arhitektura-stack-overflow&quot;&gt;Архитектура Stack Overflow&lt;/h3&gt;
  &lt;p id=&quot;9oBh&quot;&gt;Какая архитектура реализована в Stack Overflow?&lt;/p&gt;
  &lt;p id=&quot;BUmD&quot;&gt;Если ваш ответ – локальные серверы и монолит, вы, скорее всего, провалите собеседование, но именно так оно и устроено!&lt;/p&gt;
  &lt;figure id=&quot;Eyt8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/zd/vf/yz/zdvfyzbwo2iffabvb8z1hhmhooi.jpeg&quot; width=&quot;1266&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TXg5&quot;&gt;&lt;em&gt;Ожидание&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;9Ybs&quot;&gt;
    &lt;li id=&quot;sZfs&quot;&gt;Для разделения системы на небольшие компоненты используются микросервисы&lt;/li&gt;
    &lt;li id=&quot;oXWa&quot;&gt;у каждого сервиса своя база данных, активно используется кэш&lt;/li&gt;
    &lt;li id=&quot;9a6g&quot;&gt;сервисы сегментированы (sharded)&lt;/li&gt;
    &lt;li id=&quot;wiqW&quot;&gt;сервисы взаимодействуют друг с другом асинхронно через очереди сообщений&lt;/li&gt;
    &lt;li id=&quot;IeQS&quot;&gt;сервисы реализованы с использованием источников событий (Event Sourcing) с CQRS&lt;/li&gt;
    &lt;li id=&quot;a8cH&quot;&gt;широко используются распределенные системы, такие как итоговая согласованность (eventual consistency), теорема CAP etc.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;SIPW&quot;&gt;&lt;em&gt;Реальность&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;jqRW&quot;&gt;Stack Overflow обрабатывает весь трафик с помощью всего 9 локальных веб-серверов, и это монолит! Никакие облачные решения в нём не используются.&lt;/p&gt;
  &lt;h3 id=&quot;pochemu-amazon-prime-video-monitoring-pereshel-s-besservernoy-arhitektury-na-monolit-kak-eto-mozhet-sekonomit-90-stoimosti&quot;&gt;Почему Amazon Prime Video Monitoring перешел с бессерверной архитектуры на монолит? Как это может сэкономить 90% стоимости?&lt;/h3&gt;
  &lt;p id=&quot;Tcua&quot;&gt;Сравнение архитектуры до и после перехода:&lt;/p&gt;
  &lt;figure id=&quot;NGDK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/en/dz/yn/endzynotj9eogrnmf9qdsypuc9w.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uWaE&quot;&gt;&lt;em&gt;Что такое служба видеомониторинга Amazon Prime?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;l1ze&quot;&gt;Сервису Prime Video необходимо следить за качеством тысяч прямых трансляций. Инструмент мониторинга автоматически анализирует потоки данных в режиме реального времени и выявляет проблемы с качеством, такие как повреждение блоков (block corruption), зависание видео и проблемы с синхронизацией. Это важный процесс для удовлетворения клиентов.&lt;/p&gt;
  &lt;p id=&quot;bPwk&quot;&gt;Мониторинг состоит из 3 компонентов: медиаконвертер, детектор дефектов и сервис уведомлений в реальном времени.&lt;/p&gt;
  &lt;p id=&quot;mNBE&quot;&gt;&lt;em&gt;Недостатки старой архитектуры&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;PYaT&quot;&gt;Старая архитектура была основана на Amazon Lambda, который позволял быстро создавать сервисы. Однако использование архитектуры в больших масштабах было нерентабельным. Две самые дорогостоящие операции:&lt;/p&gt;
  &lt;ol id=&quot;CAue&quot;&gt;
    &lt;li id=&quot;htDV&quot;&gt;Рабочий процесс оркестрации – пошаговые функции (step functions) AWS взимают с пользователей плату за переходы состояний, а оркестрация выполняет несколько переходов состояний каждую секунду.&lt;/li&gt;
    &lt;li id=&quot;dP2c&quot;&gt;Передача данных между распределенными компонентами — промежуточные данные хранятся в Amazon S3, чтобы их можно было загрузить на следующем этапе. Чем больше объем данных, тем дороже загрузка.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ZtWO&quot;&gt;&lt;em&gt;Монолит экономит 90% стоимости&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;4kzV&quot;&gt;Монолитная архитектура предназначена для решения проблем стоимости. Компонентов по-прежнему 3, но медиаконвертер и детектор дефектов развертываются в одном процессе, что экономит затраты на передачу данных по сети. Удивительно, но изменение архитектуры привело к экономии средств на 90%!&lt;/p&gt;
  &lt;p id=&quot;oaCC&quot;&gt;Это интересный и уникальный пример, поскольку микросервисы сегодня являются популярным и модным выбором в техноиндустрии. Разделение компонентов на распределенные микросервисы сопряжено с дополнительными расходами.&lt;/p&gt;
  &lt;p id=&quot;rYNU&quot;&gt;Технический директор Amazon Вернер Фогельс сказал следующее: &amp;quot;Создание эволюционирующих программных систем – это стратегия, а не религия. Поэтому необходимо периодически непредвзято пересматривать архитектуру системы&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;8zAy&quot;&gt;Бывший вице-президент Amazon по устойчивому развитию Адриан Кокрофт: &amp;quot;Команда Prime Video следовала по пути, который я называю &amp;quot;Сначала бессерверные&amp;quot;… Я не сторонник только бессерверных технологий&amp;quot;.&lt;/p&gt;
  &lt;h3 id=&quot;kak-disney-hotstar-udalos-sobrat-5-milliardov-smaylov-vo-vremya-turnira&quot;&gt;Как Disney Hotstar удалось собрать 5 миллиардов смайлов во время турнира?&lt;/h3&gt;
  &lt;figure id=&quot;A8sS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/_a/-c/6p/_a-c6p3xi5bhamzic5e0c8kipds.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;pRwj&quot;&gt;
    &lt;li id=&quot;7mAm&quot;&gt;Клиенты отправляют смайлы через стандартные HTTP-запросы. Вы можете думать о Golang Service как о типичном веб-сервере. Golang выбран потому, что он хорошо поддерживает параллелизм. Потоки в Golang легкие.&lt;/li&gt;
    &lt;li id=&quot;lbzu&quot;&gt;Поскольку объем данных очень велик, в качестве буфера используется Kafka (брокер сообщений).&lt;/li&gt;
    &lt;li id=&quot;InTw&quot;&gt;Смайлы агрегируются службой потоковой обработки под названием Spark. Он собирает данные каждые 2 секунды (интервал настраивается). В зависимости от интервала приходится идти на некоторые компромиссы. Более короткий интервал означает, что смайлы доставляются другим клиентам быстрее, но это также означает, что требуется больше вычислительных ресурсов.&lt;/li&gt;
    &lt;li id=&quot;YTh5&quot;&gt;Агрегированные данные записываются в другой Kafka.&lt;/li&gt;
    &lt;li id=&quot;paCd&quot;&gt;Потребители PubSub (издатель/подписчик) извлекают агрегированные смайлы из Kafka.&lt;/li&gt;
    &lt;li id=&quot;Slvj&quot;&gt;Смайлы доставляются клиентам в режиме реального времени через инфраструктуру PubSub. Инфраструктура PubSub интересна. Hotstar рассмотрела следующие протоколы: Socketio, NATS, MQTT и gRPC и остановилась на MQTT.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Z9pK&quot;&gt;Похожий подход к архитектуре применяется LinkedIn, который обрабатывает миллион лайков в секунду.&lt;/p&gt;
  &lt;h3 id=&quot;kak-discord-hranit-trilliony-soobscheniy&quot;&gt;Как Discord хранит триллионы сообщений?&lt;/h3&gt;
  &lt;p id=&quot;q84i&quot;&gt;Эволюция хранения сообщений в Discord:&lt;/p&gt;
  &lt;figure id=&quot;mZVu&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/vy/9x/nj/vy9xnjplkqphrfrv453btrlll2s.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jM57&quot;&gt;MongoDB ➡️ Cassandra ➡️ ScyllaDB.&lt;/p&gt;
  &lt;p id=&quot;S9zP&quot;&gt;В 2015 первая версия Discord была построена на основе одной реплики MongoDB. Примерно в ноябре 2015 MongoDB хранила 100 миллионов сообщений, и оперативная память больше не вмещала данные и индексы. Задержка стала непредсказуемой. Возникла необходимость переместить хранение сообщений в другую базу данных. Была выбрана Cassandra.&lt;/p&gt;
  &lt;p id=&quot;cKeP&quot;&gt;В 2017 у Discord было 12 узлов (nodes) Cassandra, на которых хранились миллиарды сообщений.&lt;/p&gt;
  &lt;p id=&quot;7E6i&quot;&gt;На начало 2022 было 177 узлов с триллионами сообщений. На этом этапе задержка стала непредсказуемой, а выполнение операций по техническому обслуживанию стало слишком дорогим.&lt;/p&gt;
  &lt;p id=&quot;Q7RX&quot;&gt;Причин возникновения такой ситуации несколько:&lt;/p&gt;
  &lt;ul id=&quot;gQc0&quot;&gt;
    &lt;li id=&quot;0561&quot;&gt;Cassandra использует дерево LSM для внутренней структуры данных. Чтение обходится дороже, чем запись. На сервере с сотнями пользователей может выполняться множество одновременных операций чтения, что приводит к образованию горячих точек&lt;/li&gt;
    &lt;li id=&quot;PQ2h&quot;&gt;обслуживание кластеров, например сжатие SSTables, влияет на производительность&lt;/li&gt;
    &lt;li id=&quot;xozv&quot;&gt;паузы в сборке мусора могут приводить к значительным скачкам задержки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;gPUW&quot;&gt;ScyllaDB – это база данных, совместимая с Cassandra, написанная на C++. Discord изменил свою архитектуру, включив в нее монолитный API, сервис данных, написанный на Rust, и ScyllaDB в качестве основного хранилища данных.&lt;/p&gt;
  &lt;p id=&quot;t5D8&quot;&gt;Задержка чтения p99 в ScyllaDB составляет 15 мс по сравнению с 40-125 мс в Cassandra. Задержка записи p99 составляет 5 мс по сравнению с 5-70 мс в Cassandra.&lt;/p&gt;
  &lt;h3 id=&quot;kak-rabotayut-pryamye-videotranslyacii-na-youtube-tiktok-live-ili-twitch&quot;&gt;Как работают прямые видеотрансляции на YouTube, TikTok Live или Twitch?&lt;/h3&gt;
  &lt;p id=&quot;syWP&quot;&gt;Прямая трансляция отличается от обычной потоковой передачи данных, поскольку видеоконтент отправляется по сети в режиме реального времени, обычно с задержкой всего в несколько секунд.&lt;/p&gt;
  &lt;p id=&quot;FiFJ&quot;&gt;Вот что делает это возможным:&lt;/p&gt;
  &lt;figure id=&quot;6Zlx&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/webt/qo/zj/1q/qozj1q2l_pgokkaei2xba9githw.jpeg&quot; width=&quot;1560&quot; /&gt;
  &lt;/figure&gt;
  &lt;ol id=&quot;PDhi&quot;&gt;
    &lt;li id=&quot;Oq0N&quot;&gt;Необработанные (raw) видеоданные захватываются микрофоном и камерой. Данные передаются на сервер.&lt;/li&gt;
    &lt;li id=&quot;L6JN&quot;&gt;Видеоданные сжимаются и кодируются. Например, алгоритм сжатия разделяет фон и другие элементы видео. После сжатия видео кодируется в соответствии со стандартами, такими как H.264. Это сильно уменьшает размер видеоданных.&lt;/li&gt;
    &lt;li id=&quot;KjZ0&quot;&gt;Закодированные данные делятся на мелкие части (чанки — chunks), обычно длиной в несколько секунд, поэтому для их загрузки или потоковой передачи требуется гораздо меньше времени.&lt;/li&gt;
    &lt;li id=&quot;eqjx&quot;&gt;Сегментированные данные отправляются на сервер потоковой передачи (streaming server). Сервер потоковой передачи должен поддерживать различные устройства и условия сети. Это называется &amp;quot;адаптивной потоковой передачей битрейта&amp;quot; (Adaptive Bitrate Streaming). Это означает, что на шагах 2 и 3 необходимо создать несколько файлов с разным битрейтом.&lt;/li&gt;
    &lt;li id=&quot;zCez&quot;&gt;Данные потоковой передачи в реальном времени передаются на пограничные серверы (edge servers), поддерживаемые CDN (Content Delivery Network – сеть доставки контента). Миллионы зрителей могут смотреть видео с ближайшего пограничного сервера. CDN значительно снижает задержку времени передачи данных.&lt;/li&gt;
    &lt;li id=&quot;3vrd&quot;&gt;Устройства зрителей декодируют и распаковывают видеоданные и воспроизводят видео в плеере.&lt;br /&gt;7 и 8. Если видео необходимо сохранить для повторного воспроизведения, закодированные данные отправляются в хранилище, откуда впоследствии извлекаются без обращения к CDN.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;mVSH&quot;&gt;Стандартные протоколы для прямой трансляции:&lt;/p&gt;
  &lt;ul id=&quot;7x4k&quot;&gt;
    &lt;li id=&quot;87Oc&quot;&gt;RTMP (Real-Time Messaging Protocol – протокол обмена сообщениями в реальном времени) – изначально был разработан Macromedia для передачи данных между Flash-плеером и сервером. Теперь он используется для потоковой передачи видеоданных через Интернет. Обратите внимание, что приложения для видеоконференций, такие как Skype, используют протокол RTC (Real-Time Communication – связь в реальном времени) для снижения задержки.&lt;/li&gt;
    &lt;li id=&quot;iq6j&quot;&gt;HLS (HTTP Live Streaming — прямая трансляция по HTTP) — этот протокол требует кодировки данных в H.264 или H.265. Устройства Apple поддерживают только это протокол&lt;/li&gt;
    &lt;li id=&quot;6wIN&quot;&gt;DASH (Dynamic Adaptive Streaming over HTTP – динамическая адаптивная потоковая передача данных через HTTP)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;gx5I&quot;&gt;И HLS, и DASH поддерживают потоковую передачу с адаптивным битрейтом.&lt;/p&gt;
  &lt;p id=&quot;L1s2&quot;&gt;Теги:&lt;/p&gt;
  &lt;ul id=&quot;kMDE&quot;&gt;
    &lt;li id=&quot;8STT&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[devops]&quot; target=&quot;_blank&quot;&gt;devops&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;jNyH&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD]&quot; target=&quot;_blank&quot;&gt;дизайн&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;aXaP&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0]&quot; target=&quot;_blank&quot;&gt;архитектура&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;1VSd&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0]&quot; target=&quot;_blank&quot;&gt;система&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;Nn1G&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[architecture]&quot; target=&quot;_blank&quot;&gt;architecture&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;4SUe&quot;&gt;&lt;a href=&quot;https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=[system]&quot; target=&quot;_blank&quot;&gt;system&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;vgZf&quot;&gt;Хабы:&lt;/p&gt;
  &lt;ul id=&quot;3Lfc&quot;&gt;
    &lt;li id=&quot;tza7&quot;&gt;&lt;a href=&quot;https://habr.com/ru/hubs/analysis_design/&quot; target=&quot;_blank&quot;&gt;Анализ и проектирование систем&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;rl8A&quot;&gt;&lt;a href=&quot;https://habr.com/ru/hubs/devops/&quot; target=&quot;_blank&quot;&gt;DevOps&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;eUQI&quot;&gt;&lt;a href=&quot;https://habr.com/ru/hubs/design/&quot; target=&quot;_blank&quot;&gt;Дизайн&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;jLN6&quot;&gt;Оригинальная ссылка: &lt;a href=&quot;https://habr.com/ru/articles/770564/&quot; target=&quot;_blank&quot;&gt;System Design 101 / Хабр (habr.com)&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>shmarou:2Y8STTp7yBU</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/2Y8STTp7yBU?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>SQL</title><published>2024-06-13T12:59:19.344Z</published><updated>2024-06-13T12:59:19.344Z</updated><summary type="html">Оглавление</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;gtZf&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/exam&quot; target=&quot;_blank&quot;&gt;Оглавление&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;PyfL&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;rIHx&quot; data-align=&quot;center&quot;&gt;DDL (Data Definition Language)&lt;/h3&gt;
  &lt;p id=&quot;OGce&quot;&gt;&lt;strong&gt;CREATE&lt;/strong&gt;: Создаёт новые таблицы, базы данных, индексы и другие объекты базы данных&lt;/p&gt;
  &lt;p id=&quot;Xz8M&quot;&gt;&lt;strong&gt;ALTER&lt;/strong&gt;: Изменяет структуру существующих таблиц, например, добавляет новые столбцы, изменяет тип данных столбца, удаляет столбцы и т.д.&lt;/p&gt;
  &lt;p id=&quot;poiC&quot;&gt;&lt;strong&gt;DROP&lt;/strong&gt;: Удаляет существующие объекты базы данных&lt;/p&gt;
  &lt;p id=&quot;4QBx&quot;&gt;&lt;strong&gt;TRUNCATE&lt;/strong&gt;: Удаляет все записи из таблицы, не удаляя саму таблицу&lt;/p&gt;
  &lt;h3 id=&quot;MOfJ&quot; data-align=&quot;center&quot;&gt;DML (Data Manipulation Language) &lt;/h3&gt;
  &lt;p id=&quot;HoOb&quot;&gt;SELECT&lt;br /&gt;INSERT&lt;br /&gt;UPDATE&lt;br /&gt;JOIN&lt;br /&gt;&lt;/p&gt;
  &lt;h3 id=&quot;MK6U&quot; data-align=&quot;center&quot;&gt;DCL (Data Control Language)&lt;/h3&gt;
  &lt;p id=&quot;4cBF&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;mo19&quot; data-align=&quot;center&quot;&gt;TCL (Transaction Control Language)&lt;/h3&gt;

</content></entry><entry><id>shmarou:art-oop</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/art-oop?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>Объектно-ориентированное программирование</title><published>2024-04-21T16:13:23.378Z</published><updated>2024-04-22T06:01:53.263Z</updated><category term="system-analysis" label="System Analysis"></category><summary type="html">В своё время мне было непросто освоить объектно-ориентированное программирование (ООП). Я изучал различные источники, но, возможно, они были слишком сложны, или мне не хватало смекалки и специального образования — так что я уловил лишь основные черты ООП.</summary><content type="html">
  &lt;p id=&quot;Wz0v&quot;&gt;В своё время мне было непросто освоить объектно-ориентированное программирование (ООП). Я изучал различные источники, но, возможно, они были слишком сложны, или мне не хватало смекалки и специального образования — так что я уловил лишь основные черты ООП.&lt;/p&gt;
  &lt;p id=&quot;zkeq&quot;&gt;Когда я, наконец, разобрался в этой теме, мне показалось, что ООП в действительности не такое уж сложное направление. Всё дело в том, чтобы объяснить его правильно и просто, человеческим языком. &lt;/p&gt;
  &lt;p id=&quot;0yf5&quot;&gt;&lt;em&gt;&lt;strong&gt;Эта статья — попытка рассказать о объектно-ориентированном программировании доступно, для тех, кто не имеет специализированного образования.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;vctb&quot;&gt;Было бы предсказуемо начать обсуждение с принципов объектно-ориентированного программирования, таких как:&lt;/p&gt;
  &lt;ol id=&quot;noih&quot;&gt;
    &lt;li id=&quot;Sbps&quot;&gt;Абстракция&lt;/li&gt;
    &lt;li id=&quot;CdwV&quot;&gt;Инкапсуляция&lt;/li&gt;
    &lt;li id=&quot;FGtM&quot;&gt;Полиморфизм&lt;/li&gt;
    &lt;li id=&quot;xdrV&quot;&gt;Наследование&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;wHZ8&quot;&gt;Однако я начну с классов и экземпляров классов, а также всего, что к ним относится (например, &lt;em&gt;объектов&lt;/em&gt;). Это объясняется тем, что все четыре принципа в большей степени относятся именно к классам. Примеры, которые я буду приводить, также будут показаны в контексте использования классов.&lt;/p&gt;
  &lt;h2 id=&quot;BUBU&quot; data-align=&quot;center&quot;&gt;Классы в ООП&lt;/h2&gt;
  &lt;p id=&quot;mtnS&quot;&gt;Класс и экземпляр класса — это два фундаментальных понятия в объектно-ориентированном программировании, и понимание их различий важно для работы с ООП.&lt;/p&gt;
  &lt;h3 id=&quot;yWP6&quot;&gt;Что такое класс?&lt;/h3&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;6nD0&quot;&gt;&lt;strong&gt;Класс&lt;/strong&gt; — это как чертеж или шаблон, который описывает, как объекты должны быть созданы. &lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;NRor&quot;&gt;Класс определяет свойства (атрибуты) и поведение (методы) будущих объектов. Классы предоставляют структуру и определяют, как объект будет выглядеть и действовать, но сами по себе не содержат данных или состояния.&lt;/p&gt;
  &lt;blockquote id=&quot;tgtr&quot;&gt;Когда говорится, что &amp;quot;&lt;em&gt;&lt;u&gt;классы сами по себе не содержат данных или состояния&lt;/u&gt;&lt;/em&gt;&amp;quot;, это означает, что класс — это всего лишь шаблон или чертёж, который описывает, какие свойства (атрибуты) и действия (методы) должны быть у объектов, созданных на его основе, но он не хранит конкретные значения этих свойств.&lt;/blockquote&gt;
  &lt;p id=&quot;OCjN&quot;&gt;Думаю, текст выше может быть немного непонятным, поэтому давайте рассмотрим это на очень простом примере:&lt;/p&gt;
  &lt;p id=&quot;UARU&quot;&gt;Представим, что класс — это как кулинарный рецепт для блюда. Рецепт описывает, какие ингредиенты вам понадобятся и что вам нужно делать, чтобы приготовить блюдо. Однако сам рецепт не содержит ингредиентов — это просто инструкции. То есть, рецепт сам по себе не имеет никакого вкуса и не может быть съеден.&lt;/p&gt;
  &lt;ul id=&quot;LDns&quot;&gt;
    &lt;li id=&quot;rKYk&quot;&gt;&lt;strong&gt;Класс&lt;/strong&gt; в программировании аналогичен кулинарному рецепту. Он говорит, какие данные &lt;em&gt;(ингредиенты)&lt;/em&gt; и методы &lt;em&gt;(инструкции по приготовлению)&lt;/em&gt; должен иметь объект &lt;em&gt;(блюдо)&lt;/em&gt;, но не содержит реальных данных.&lt;/li&gt;
    &lt;li id=&quot;Wy6h&quot;&gt;&lt;strong&gt;Объект&lt;/strong&gt; — это конкретное блюдо, приготовленное по рецепту. Каждый объект &lt;em&gt;(блюдо)&lt;/em&gt; будет содержать реальные данные &lt;em&gt;(ингредиенты, такие как мука, сахар, яйца)&lt;/em&gt; и его состояние может меняться &lt;em&gt;(например, сырое тесто превращается в выпеченный пирог)&lt;/em&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;erf1&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;По другому объект в ООП часто называют &amp;quot;Экземпляр класса&amp;quot;&lt;/strong&gt;&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Jxwf&quot;&gt;И снова пример, чтобы было понятно:&lt;/p&gt;
  &lt;ul id=&quot;x6LE&quot;&gt;
    &lt;li id=&quot;n62u&quot;&gt;Если у вас есть класс &lt;code&gt;Car&lt;/code&gt;, который определяет, что у автомобиля должны быть такие свойства, как &lt;strong&gt;марка&lt;/strong&gt;, &lt;strong&gt;модель&lt;/strong&gt; и &lt;strong&gt;цвет&lt;/strong&gt;, и методы, например, &lt;code&gt;start()&lt;/code&gt; и &lt;code&gt;stop()&lt;/code&gt;, то когда вы создаёте конкретный автомобиль из этого класса, например, красный Ford Mustang, вы создаёте объект или экземпляр класса &lt;code&gt;Car&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;apOW&quot;&gt;Этот объект (&lt;code&gt;Car&lt;/code&gt;) будет иметь конкретные значения для своих свойств &lt;br /&gt;&lt;em&gt;марка: Ford, &lt;br /&gt;модель: Mustang, &lt;br /&gt;цвет: красный &lt;/em&gt;&lt;br /&gt;и сможет выполнять действия, &lt;em&gt;определённые методами класса&lt;/em&gt; (запускаться и останавливаться. Ну, или что вы еще определите при создании класса &lt;code&gt;Car&lt;/code&gt; ).&lt;/p&gt;
  &lt;p id=&quot;MmrX&quot;&gt;Тем, кому интересно, как создание класса выглядит в коде Python, пример ниже:&lt;/p&gt;
  &lt;pre id=&quot;cMLz&quot; data-lang=&quot;python&quot;&gt;class Car: # создаем класс Автомобиль
    def __init__(self, color, brand):
        self.color = color  # цвет автомобиля
        self.brand = brand  # марка автомобиля

    def drive(self):
        print(f&amp;quot;The {self.color} {self.brand} is driving.&amp;quot;)
&lt;/pre&gt;
  &lt;p id=&quot;uhkh&quot;&gt;А вот код на Python для создания экземпляра класса на основе определенного выше класса &lt;code&gt;Car:&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;nHqn&quot; data-lang=&quot;python&quot;&gt;# Создание объекта класса Car
my_mustang = Car(&amp;quot;red&amp;quot;, &amp;quot;Ford Mustang&amp;quot;)

# Теперь можно вызвать метод drive, чтобы &amp;quot;поездить&amp;quot; на машине
my_mustang.drive()
&lt;/pre&gt;
  &lt;ul id=&quot;YAgu&quot;&gt;
    &lt;li id=&quot;Efsy&quot;&gt;&lt;code&gt;my_mustang&lt;/code&gt; это переменная, которая хранит ссылку на новый объект класса &lt;code&gt;Car&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;GuUP&quot;&gt;&lt;code&gt;Car(&amp;quot;red&amp;quot;, &amp;quot;Ford Mustang&amp;quot;)&lt;/code&gt; создает новый экземпляр класса &lt;code&gt;Car&lt;/code&gt; с цветом &amp;quot;red&amp;quot; и маркой &amp;quot;Ford Mustang&amp;quot;.&lt;/li&gt;
    &lt;li id=&quot;RNPD&quot;&gt;Вызов &lt;code&gt;my_mustang.drive()&lt;/code&gt; запустит выполнение метода &lt;code&gt;drive&lt;/code&gt;, который определен в классе &lt;code&gt;Car&lt;/code&gt;, и выведет сообщение &amp;quot;The red Ford Mustang is driving.&amp;quot;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dJPG&quot;&gt;В диаграмме классов UML это будет выглядет вот так:&lt;/p&gt;
  &lt;figure id=&quot;jRjF&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/26/c3/26c39ae2-8891-4129-9579-b32c038c2906.png&quot; width=&quot;206&quot; /&gt;
    &lt;figcaption&gt;Класс Car и созданный от него объек. Связь - ассоциация.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;E2Tn&quot;&gt;Существует еще одно понятие класса - Абстрактный класс, которое я сейчас разберу и мы вернемся к принципам ООП. &lt;/p&gt;
  &lt;p id=&quot;EIi3&quot;&gt;По большому счету, абстрактный класс  - это такой же простой класс, однако он &lt;u&gt;&lt;strong&gt;не предназначен для создания экземпляров&lt;/strong&gt;&lt;/u&gt; напрямую. &lt;/p&gt;
  &lt;p id=&quot;Cfaa&quot;&gt;Вместо этого он предоставляет базовый шаблон для других классов с определением методов, которые должны быть реализованы в классах-наследниках. &lt;br /&gt;&lt;br /&gt;Абстрактные классы часто содержат один или несколько абстрактных методов, которые не имеют реализации в самом абстрактном классе, но должны быть определены в его подклассах.&lt;/p&gt;
  &lt;blockquote id=&quot;2xKk&quot;&gt;Например: &lt;br /&gt;Рассмотрим &amp;quot;Транспортное средство&amp;quot; как абстрактный класс. &lt;br /&gt;Один из обязательных абстрактных методов — это &amp;quot;запустить двигатель&amp;quot;. Разные виды транспортных средств, такие как &amp;quot;Автомобиль&amp;quot; и &amp;quot;Мотоцикл&amp;quot;, будут реализовывать этот метод по-разному. &lt;br /&gt;Например, запуск двигателя автомобиля может включать проверку систем безопасности и электроники, тогда как для мотоцикла этот процесс может быть более прямым и простым.&lt;/blockquote&gt;
  &lt;p id=&quot;YJiD&quot;&gt;Ниже диаграмма классов, которая показывает абстрактный класс Vehicle, наследуемые подклассы Car и Motorcycle, и объет класса Car - Toyota, и объект класса Motorcycle - HarleyDavidson.&lt;/p&gt;
  &lt;figure id=&quot;hUuz&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/ae/c1ae867e-1558-4e1a-8c51-f51abf2a1044.png&quot; width=&quot;327&quot; /&gt;
    &lt;figcaption&gt;Диаграмма классов.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AQri&quot;&gt;Кстати, в этом примере образования подклассов от абстракного класса мы познакомились с одним из принципов ООП - наследованием. &lt;br /&gt;А теперь подробнее.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;j0yl&quot; data-align=&quot;center&quot;&gt;Наследование&lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;YZYf&quot;&gt;Наследование в программировании — это когда один класс берет свойства и функциональность от другого класса, и может добавлять или изменять их.&lt;br /&gt;Снова примеры:&lt;br /&gt;&lt;strong&gt;Автомобили:&lt;/strong&gt; &lt;br /&gt;Представь, что у нас есть базовый класс &amp;quot;Автомобиль&amp;quot;, который имеет свойства как &amp;quot;скорость&amp;quot;, &amp;quot;цвет&amp;quot; и &amp;quot;количество колес&amp;quot;. Теперь, если мы хотим создать спортивный автомобиль, мы просто &amp;quot;наследуем&amp;quot; все эти свойства от базового автомобиля и добавляем новые характеристики, например, &amp;quot;спойлер&amp;quot; или &amp;quot;турбонаддув&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;K8EP&quot;&gt;&lt;strong&gt;Животные: &lt;br /&gt;&lt;/strong&gt;Если у нас есть базовый класс &amp;quot;Животное&amp;quot; с свойствами &amp;quot;еда&amp;quot;, &amp;quot;способы передвижения&amp;quot;, и &amp;quot;окрас&amp;quot;, мы можем создать подкласс &amp;quot;Птица&amp;quot;, который наследует все эти свойства и добавляет новые, как &amp;quot;летает&amp;quot; или &amp;quot;имеет перья&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;87wt&quot;&gt;&lt;strong&gt;Смартфоны:&lt;/strong&gt; &lt;br /&gt;Допустим, у нас есть базовый класс &amp;quot;Смартфон&amp;quot; с функциями &amp;quot;звонить&amp;quot;, &amp;quot;принимать сообщения&amp;quot; и &amp;quot;серфить интернет&amp;quot;. Теперь, если мы хотим создать &amp;quot;Игровой смартфон&amp;quot;, мы можем наследовать все эти функции и добавить новые, такие как &amp;quot;высокая производительность&amp;quot; или &amp;quot;специализированные игровые кнопки&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;E9gw&quot;&gt;&lt;strong&gt;Сладости: &lt;br /&gt;&lt;/strong&gt;У нас есть базовый класс &amp;quot;Сладость&amp;quot; с характеристиками &amp;quot;вкус&amp;quot;, &amp;quot;цвет&amp;quot; и &amp;quot;форма&amp;quot;. Мы можем создать подкласс &amp;quot;Конфета&amp;quot;, который наследует эти характеристики и добавляет новые, например, &amp;quot;жевательная&amp;quot; или &amp;quot;с начинкой&amp;quot;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;13dM&quot; data-align=&quot;center&quot;&gt;Абстракция&lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;O1Yi&quot;&gt;&lt;em&gt;&lt;strong&gt;Абстракция в программировании&lt;/strong&gt; — это способ упростить сложные системы, выделяя важнейшие характеристики объекта и исключая те, которые не касаются текущего контекста.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;bBTj&quot;&gt;Тут можно вспомнить создание &lt;em&gt;абстрактного класса&lt;/em&gt;, про который говорилось выше, а можно посмотреть на примеры ниже:&lt;/p&gt;
  &lt;p id=&quot;kKOy&quot;&gt;В системе оплаты, например в интернет-магазине, абстракция может использоваться для упрощения процесса оплаты. &lt;br /&gt;Вместо того чтобы каждый раз подробно описывать процесс взаимодействия с различными платежными системами (кредитные карты, электронные деньги, банковские переводы и т.д.), вы можете создать абстрактный класс &amp;quot;Оплата&amp;quot;, который будет иметь общий метод &amp;quot;произвести оплату&amp;quot;. &lt;br /&gt;Конкретные классы (подклассы от абстрактного класса &amp;quot;Оплата&amp;quot;), такие как &amp;quot;ОплатаКартой&amp;quot; или &amp;quot;ЭлектронныеДеньги&amp;quot;, будут реализовывать этот метод по-разному, но пользователь интерфейса системы будет работать с этими методами через общий интерфейс, не вдаваясь в детали каждой платежной системы.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;OV1a&quot; data-align=&quot;center&quot;&gt;Полиморфизм&lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;VAVD&quot;&gt;&lt;em&gt;&lt;strong&gt;Полиморфизм в программировании&lt;/strong&gt;&lt;/em&gt; — это принцип объектно-ориентированного программирования, который позволяет объектам разных типов обрабатываться как объекты одного типа. &lt;br /&gt;Другими словами, это способность одного и того же метода работать по-разному в зависимости от того, к какому объекту он применяется.&lt;br /&gt;Например, если мы определим метод &amp;quot;говорить&amp;quot; для класса &amp;quot;animal&amp;quot;, то при реализации этого методами экземпляром класса &amp;quot;тигр&amp;quot;, мы получим рычание, а в случае класса &amp;quot;кот&amp;quot; - мяукание. &lt;/p&gt;
  &lt;p id=&quot;xqON&quot;&gt;Это наверное самый простой принцип для понимания. &lt;br /&gt;Однако еще одна ремарка, чтобы не перепутать абстракцию и полиморфизм:&lt;/p&gt;
  &lt;blockquote id=&quot;3zGd&quot;&gt;&lt;em&gt;Абстракция — это когда ты определяешь общую функцию для всех (например, &amp;quot;говорить&amp;quot;), а полиморфизм — это когда каждый объект (в нашем случае, каждое животное) реализует эту функцию по-своему.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;sULK&quot; data-align=&quot;center&quot;&gt;Инкапсуляция&lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;HEgm&quot;&gt;Еще один простой принцип ООП.&lt;/p&gt;
  &lt;p id=&quot;YNSq&quot;&gt;&lt;em&gt;&lt;strong&gt;Инкапсуляция&lt;/strong&gt; &lt;/em&gt;— это принцип сокрытия деталей реализации. Представьте, что вы используете телевизор. Вам не нужно знать, как он устроен внутри, чтобы пользоваться его функциями. Все сложности скрыты внутри устройства. Это позволяет также позволяет защитить данные от неправильного использования и упростить взаимодействие с объектом.&lt;/p&gt;
  &lt;p id=&quot;YvWY&quot;&gt;&lt;strong&gt;Другой пример:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;nqQX&quot;&gt;Представим, что у тебя есть коробка с игрушками. Ты хочешь, чтобы кто-то мог играть с игрушками, но только если он знает правила, как этими игрушками пользоваться. Ты не хочешь, чтобы кто-то взял твою любимую игрушку и сломал её. Поэтому ты ставишь замок на коробку и раздаешь ключи только тем друзьям, которым доверяешь и которые знают правила.&lt;/p&gt;
  &lt;p id=&quot;ymZb&quot;&gt;В программировании это значит, что код устроен так, что сохраняет важные данные (как твои игрушки) в безопасности и позволяет к ним доступ через специальные функции или методы (это как ключи к коробке), которые знают, как правильно с этими данными обращаться, чтобы ничего не сломать. Это помогает сделать программу удобной для использования и безопасной от ошибок.&lt;/p&gt;
  &lt;h3 id=&quot;SoYa&quot;&gt;Пример инкапсуляции в банковском проекте:&lt;/h3&gt;
  &lt;p id=&quot;PCvR&quot;&gt;У каждого клиента есть банковский счет, и связанная с ним информация, такая как баланс счета, номер счета и история транзакций. Эти данные чувствительны и должны быть защищены от несанкционированного доступа.&lt;/p&gt;
  &lt;ul id=&quot;6NyL&quot;&gt;
    &lt;li id=&quot;N7BH&quot;&gt;&lt;strong&gt;Банковский счет (класс)&lt;/strong&gt;: Это класс в нашей программе, который хранит все детали счета клиента. Атрибуты (свойства) класса, такие как баланс счета и номер счета, делаются приватными. Это означает, что они не могут быть изменены напрямую извне класса; они могут быть доступны только через методы (функции) этого класса.&lt;/li&gt;
    &lt;li id=&quot;KLnS&quot;&gt;&lt;strong&gt;Публичные методы&lt;/strong&gt;: Чтобы взаимодействовать с данными счета, мы предоставляем публичные методы, такие как &lt;code&gt;получитьБаланс()&lt;/code&gt;, &lt;code&gt;внестиДеньги(сумма)&lt;/code&gt; и &lt;code&gt;снятьДеньги(сумма)&lt;/code&gt;. Эти методы управляют данными безопасно, обеспечивая, например, что не будет снято больше денег, чем есть на счету.&lt;/li&gt;
    &lt;li id=&quot;Kc0t&quot;&gt;&lt;strong&gt;Приватные методы&lt;/strong&gt;: Могут быть и приватные методы, например, для внутренних расчетов или для проверки условий перед выполнением транзакции. Эти методы не доступны извне класса, что повышает безопасность.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dpRp&quot;&gt;Таким образом, благодаря инкапсуляции, все важные данные и методы обработки этих данных находятся внутри класса &lt;code&gt;&lt;strong&gt;Банковский счет&lt;/strong&gt;&lt;/code&gt;. Это предотвращает случайное или недобросовестное изменение состояния счета и помогает поддерживать целостность данных. Это также упрощает обслуживание программы, так как изменения в одной части программы менее вероятно повлияют на другие части.&lt;/p&gt;
  &lt;p id=&quot;u2Fz&quot;&gt;Другими словами инкапсуляция -  это возможность устанавливать приватность аттрибутов т.е. скрывать детали реализации класса от внешних пользователей этого класса. Это помогает упростить использование класса, так как пользователь класса фокусируется только на предоставленном интерфейсе, а не на внутреннем устройстве.&lt;/p&gt;
  &lt;p id=&quot;xjLw&quot;&gt;На этом все. Надеюсь, у меня получилось. &lt;/p&gt;

</content></entry><entry><id>shmarou:XnjW-yiH2sM</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/XnjW-yiH2sM?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>Personas</title><published>2024-03-03T16:39:07.172Z</published><updated>2024-03-03T16:43:27.180Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/09/e2/09e221da-8bc4-4b7a-9669-491a17deb61d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/28/92/2892061c-8bbf-47ad-ab5c-4698db9ebac1.png&quot;&gt;A user persona is a semi-fictional character based on your current (or ideal) customer.</summary><content type="html">
  &lt;p id=&quot;0uJc&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/exam&quot; target=&quot;_blank&quot;&gt;Оглавление&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;8Yl5&quot;&gt;A user persona is a semi-fictional character based on your current (or ideal) customer. &lt;/p&gt;
  &lt;figure id=&quot;Sd2Z&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/28/92/2892061c-8bbf-47ad-ab5c-4698db9ebac1.png&quot; width=&quot;990&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xTOH&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/JUmQJ5-QHOj&quot; target=&quot;_blank&quot;&gt;CJM &lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;k47U&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/cjm&quot; target=&quot;_blank&quot;&gt;CJM 2&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>shmarou:NHMA15sNdi4</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/NHMA15sNdi4?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>Stakeholders</title><published>2024-03-03T16:03:18.131Z</published><updated>2024-03-03T16:24:41.830Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f8/e1/f8e1e77b-f5eb-458f-9857-cf9a76afa695.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/6d/1e/6d1e66c0-382d-44fc-8b99-8b2a2603104a.png&quot;&gt;Typical key stakeholders in a project</summary><content type="html">
  &lt;h3 id=&quot;typical-key-stakeholders-in-a-project&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/exam&quot; target=&quot;_blank&quot;&gt;Оглавление&lt;/a&gt;&lt;/h3&gt;
  &lt;p id=&quot;V5UK&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;JFXv&quot;&gt;Typical key stakeholders in a project&lt;/p&gt;
  &lt;p id=&quot;JS7o&quot;&gt;Some of the typical key project stakeholders you&amp;#x27;ll find in a project include:&lt;/p&gt;
  &lt;ul id=&quot;sJp8&quot;&gt;
    &lt;li id=&quot;PfLH&quot;&gt;&lt;strong&gt;Customers:&lt;/strong&gt; The direct user of a product or service, often both internal and external to the company executing the project&lt;/li&gt;
    &lt;li id=&quot;TfCT&quot;&gt;&lt;strong&gt;Project manager:&lt;/strong&gt; The project&amp;#x27;s leader&lt;/li&gt;
    &lt;li id=&quot;4Yfo&quot;&gt;&lt;strong&gt;Project team members:&lt;/strong&gt; The group executing the project under the project manager&amp;#x27;s leadership&lt;/li&gt;
    &lt;li id=&quot;NFfi&quot;&gt;&lt;strong&gt;Project sponsor:&lt;/strong&gt; The project&amp;#x27;s financier&lt;/li&gt;
    &lt;li id=&quot;8CSD&quot;&gt;&lt;strong&gt;Steering committee:&lt;/strong&gt; An advisory group providing guidance on key decisions, which includes the sponsor, executives, and key stakeholders from the organization&lt;/li&gt;
    &lt;li id=&quot;xJQX&quot;&gt;&lt;strong&gt;Executives:&lt;/strong&gt; The top management in the company executing the project; those who direct the organization&amp;#x27;s strategy&lt;/li&gt;
    &lt;li id=&quot;L8VZ&quot;&gt;&lt;strong&gt;Resource managers:&lt;/strong&gt; Other managers who control resources needed for executing the project&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VGHa&quot;&gt;There are many more examples of project stakeholders, including: sellers/suppliers, contractors, owners, government agencies, media outlets, and even society at large.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;FEgQ&quot; data-align=&quot;center&quot;&gt;What is a Stakeholder Engagement Plan?&lt;/h2&gt;
    &lt;p id=&quot;TulP&quot; data-align=&quot;center&quot;&gt;A stakeholder engagement plan is a formal document which outlines the plan to communicate with stakeholders who hold interest or potential interest in a project. A stakeholder engagement plan identifies potential stakeholders, their interest levels, power and influence and is continuingly updated to meet stakeholder needs.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;What-is-covered-in-a-stakeholder-management-plan&quot; data-align=&quot;center&quot;&gt;What is covered in a stakeholder management plan?&lt;/h2&gt;
  &lt;p id=&quot;awHU&quot;&gt;The primary components of a stakeholder management plan are:&lt;/p&gt;
  &lt;ol id=&quot;VFBP&quot;&gt;
    &lt;li id=&quot;39vH&quot;&gt;&lt;strong&gt;Prioritization of stakeholders:&lt;/strong&gt; Rank stakeholders based on their ability to influence your project and how much they care about its outcome.&lt;/li&gt;
    &lt;li id=&quot;Ysmt&quot;&gt;&lt;strong&gt;Stakeholder expectations:&lt;/strong&gt; You cannot manage expectations if you don’t know what they are. You must document everything, including how they prefer to communicate and what they want to be involved with.&lt;/li&gt;
    &lt;li id=&quot;UQDT&quot;&gt;&lt;strong&gt;Communication rules:&lt;/strong&gt; The plan should outline the level, frequency, and type of communication with each stakeholder as well as who on the team is their point of contact.&lt;/li&gt;
    &lt;li id=&quot;vsVR&quot;&gt;&lt;strong&gt;Action plans:&lt;/strong&gt; This is the meat of your plan — It’s where you outline how you will manage stakeholder involvement and what steps to take to ensure expectations are met.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;Top-tips-for-how-creating-a-stakeholder-management-plan&quot;&gt;Top tips for how creating a stakeholder management plan&lt;/h2&gt;
  &lt;p id=&quot;ujBj&quot;&gt;Here are eight tips for how to create the perfect stakeholder management plan:&lt;/p&gt;
  &lt;ol id=&quot;m2ZV&quot;&gt;
    &lt;li id=&quot;y2CU&quot;&gt;&lt;strong&gt;Use a template:&lt;/strong&gt; A &lt;a href=&quot;https://www.wrike.com/templates/communication-plan-template/&quot; target=&quot;_blank&quot;&gt;stakeholder management template guide&lt;/a&gt; or a &lt;a href=&quot;https://www.wrike.com/templates/raci-template/&quot; target=&quot;_blank&quot;&gt;pre-built RACI template&lt;/a&gt; will save you time creating your plan, ensure no information fields are overlooked, and create consistency, as every stakeholder plan in your company will look the same.&lt;/li&gt;
    &lt;li id=&quot;dh9H&quot;&gt;&lt;strong&gt;Start early: &lt;/strong&gt;Key stakeholders can influence your project before it’s even off the ground. Identifying and involving stakeholders early can make all the difference to their level of engagement and your success.&lt;/li&gt;
    &lt;li id=&quot;7Tfy&quot;&gt;&lt;strong&gt;Update regularly:&lt;/strong&gt; Stakeholders change throughout your project. Some may leave positions while others may join. Plus, their level of engagement and expectations may evolve as time goes on. Review your plan at least monthly to ensure it’s up-to-date.&lt;/li&gt;
    &lt;li id=&quot;dPxF&quot;&gt;&lt;strong&gt;Ensure transparency:&lt;/strong&gt; Transparency builds trust, and when you have your stakeholders’ trust, you’re much more likely to have their cooperation and support. When creating your communication guidelines in your plan, keep in mind that open, frequent, two-way communication creates project transparency.&lt;/li&gt;
    &lt;li id=&quot;5WEN&quot;&gt;&lt;strong&gt;Make priority clear:&lt;/strong&gt; Including a grid or matrix of stakeholders based on interest and influence can help you quickly see and understand where to focus your efforts.&lt;/li&gt;
    &lt;li id=&quot;zSO7&quot;&gt;&lt;strong&gt;Be concise:&lt;/strong&gt; For your plan to be successful, you need to get to the root of what people care about and document it in concise, easy-to-understand terms that anyone who reads it can grasp.&lt;/li&gt;
    &lt;li id=&quot;i1xS&quot;&gt;&lt;strong&gt;Plan for conflict:&lt;/strong&gt; You will inevitably have stakeholders with conflicting needs. Be proactive about how you will resolve issues and document this approach in your plan so that everyone is aware of it beforehand.&lt;/li&gt;
    &lt;li id=&quot;CI2R&quot;&gt;&lt;strong&gt;Publish it:&lt;/strong&gt; Your &lt;a href=&quot;https://www.wrike.com/templates/communication-plan-template/&quot; target=&quot;_blank&quot;&gt;stakeholder management plan&lt;/a&gt; shouldn’t be a secret. Store it somewhere accessible and share it with stakeholders. Not only does this increase transparency, but it also helps ensure no stakeholders or key factors were overlooked.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;levels-stakeholder&quot;&gt;5 Levels of Stakeholder Engagement&lt;/h2&gt;
  &lt;p id=&quot;I4sP&quot;&gt;&lt;/p&gt;
  &lt;ol id=&quot;nJb6&quot;&gt;
    &lt;li id=&quot;BX7a&quot;&gt;&lt;strong&gt;Unaware –&lt;/strong&gt; Not aware of the project and the impacts of the project&lt;/li&gt;
    &lt;li id=&quot;PXDQ&quot;&gt;&lt;strong&gt;Resistant –&lt;/strong&gt; Aware of the project and resistant to change&lt;/li&gt;
    &lt;li id=&quot;5Zxb&quot;&gt;&lt;strong&gt;Neutral –&lt;/strong&gt; Aware of the project and neither supports or resists&lt;/li&gt;
    &lt;li id=&quot;k6ZE&quot;&gt;&lt;strong&gt;Supportive –&lt;/strong&gt; Aware of the project and supportive of change           &lt;/li&gt;
    &lt;li id=&quot;UySb&quot;&gt;&lt;strong&gt;Leading –&lt;/strong&gt; Aware of the project and impact and actively engaged in ensuring the project is a success&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;nzVq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6d/1e/6d1e66c0-382d-44fc-8b99-8b2a2603104a.png&quot; width=&quot;1073&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;ty43&quot;&gt;Класификация стейкхолдеров:&lt;br /&gt;&lt;/h3&gt;
  &lt;figure id=&quot;R6r2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/af/2d/af2d208a-4209-4b8f-9468-d56da8ef2f4b.png&quot; width=&quot;1120&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;N6VC&quot;&gt;&lt;a href=&quot;http://requirements.ru/lections_16#162&quot; target=&quot;_blank&quot;&gt;http://requirements.ru/lections_16#162&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>shmarou:JUmQJ5-QHOj</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/JUmQJ5-QHOj?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>Customer Journey Map- главный инструмент проектировщика услуг</title><published>2024-02-25T17:37:32.566Z</published><updated>2024-02-25T17:37:32.566Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/13/42/13427fc6-3682-4ff1-a8f8-425fb00a8bcc.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*1FYD6W3afwnTtcRBuHnugQ.png&quot;&gt;Когда меня просят спроектировать пользовательский интерфейс для некоего веб-сайта, я сразу задаю вопрос — нужно ли также спроектировать интерфейс для мобильных устройств и, как правило, получаю утвердительный ответ. Дело в том, что современные сайты и программы, которые можно назвать цифровыми продуктами, являются, как правило частью большой услуги. И чем дальше, тем больше цифровых продуктов (веб-сайтов, приложений) будет вовлечено во взаимодействие c пользователем.</summary><content type="html">
  &lt;h1 id=&quot;7b94&quot;&gt;Введение&lt;/h1&gt;
  &lt;p id=&quot;7603&quot;&gt;Когда меня просят спроектировать пользовательский интерфейс для некоего веб-сайта, я сразу задаю вопрос — нужно ли также спроектировать интерфейс для мобильных устройств и, как правило, получаю утвердительный ответ. Дело в том, что современные сайты и программы, которые можно назвать цифровыми продуктами, являются, как правило частью большой услуги. И чем дальше, тем больше цифровых продуктов (веб-сайтов, приложений) будет вовлечено во взаимодействие c пользователем.&lt;/p&gt;
  &lt;p id=&quot;5900&quot;&gt;Приведу пример популярной услуги — прослушивание музыки. Я слушаю музыку на персональном компьютере под управлением OS X, на смартфоне (iOS), и на Apple TV. Компания Apple довольно хорошо продумала процесс потребления музыки: я могу купить альбом на своем iPhone, а затем могу этот альбом прослушать на Apple TV, к которому у меня подключены большие колонки. Однако, я не могу начать слушать некую композицию на iPhone, а затем продолжить прослушивание на Apple TV — для этого мне приходится искать нужный альбом в меню Apple TV, эту процедуру простой не назовешь. То есть, в компании Apple никто не озаботился такой возможностью и не реализовал её. При этом, как дизайнер iPhone, так и дизайнер Apple TV хорошо сделали свою работу. Функционал, который мне нужен находится на границе двух устройств и, непонятно, кто должен отвечать за проектирование таких связок.&lt;/p&gt;
  &lt;p id=&quot;72d0&quot;&gt;Данный пример показывает, что в наше время недостаточно продумывать в деталях пользовательский интерфейс одного цифрового продукта в отрыве от взаимодействия с другими продуктами, с которыми они находятся в единой инфраструктуре. Нужен такой инструмент, который позволяет выявлять проблемы на стыках, а также позволяет проектировать связки между продуктами. Как обычно потребность спровоцировала создание новой чудесной методики, которая называется «Customer Journey Map».&lt;/p&gt;
  &lt;p id=&quot;9acb&quot;&gt;Customer Journey Map это, пожалуй, лучший инструмент User Experience, за последние 10 лет (после персонажей).&lt;/p&gt;
  &lt;h1 id=&quot;aa36&quot;&gt;Что такое услуга?&lt;/h1&gt;
  &lt;p id=&quot;7947&quot;&gt;Что такое услуга? Для любителей строгих определений приведу цитату из ГОСТ-9000-2008:&lt;/p&gt;
  &lt;blockquote id=&quot;2x2D&quot;&gt;Услуга — результат, по меньшей мере, одного действия, обязательно осуществленного при взаимодействии поставщика и потребителя, и, как правило, нематериальна.&lt;/blockquote&gt;
  &lt;p id=&quot;11c9&quot;&gt;Давайте запомним слово «результат» — это то, что наиболее важно для любого потребителя.&lt;/p&gt;
  &lt;p id=&quot;0f6b&quot;&gt;Как я уже сообщал, современные потребители взаимодействуют с мобильными устройствами, веб-браузерами, людьми, средами и пространствами и так далее. Каждый акт взаимодействия потребителя с услугой называется «точка контакта».&lt;br /&gt;Точки контакта могут быть не только цифровые, но и аналоговые или офлайновые.&lt;/p&gt;
  &lt;p id=&quot;e756&quot;&gt;Возьмем, например, современный банк. Какие точки контакта здесь мы можем выделить?&lt;/p&gt;
  &lt;ol id=&quot;tIlc&quot;&gt;
    &lt;li id=&quot;b680&quot;&gt;веб-сайт банка;&lt;/li&gt;
    &lt;li id=&quot;ef6e&quot;&gt;веб-сервис «клиент-банк», где пользователь может осуществлять операции со своим счетом и банковскими картами;&lt;/li&gt;
    &lt;li id=&quot;6245&quot;&gt;мобильное приложение «клиент-банк»;&lt;/li&gt;
    &lt;li id=&quot;27b3&quot;&gt;физическое отделение банка, которое также можно считать продуктом. Точно также как и в случае веб-сайтов, внутри банковского отделения существует своя система навигации.&lt;br /&gt;Предположим вы пришли в банк с некоторой целью и еще не очень хорошо знакомы с правилами его работы. Если навигация была спроектирована неудачно, то вам может быть непонятно, к кому конкретно обращаться для решения вашей проблемы. Вам приходится обращаться к девушке на ресепшен, к которой может быть отдельная очередь клиентов.&lt;br /&gt;Этим примером я хотел проиллюстрировать простую мысль, что банковские отделения можно и нужно проектировать аналогично веб-сайтам.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h1 id=&quot;2904&quot;&gt;Что такое Customer Journey Map?&lt;/h1&gt;
  &lt;p id=&quot;aa33&quot;&gt;Итак, что такое Customer Journey Map (для сокращения далее просто CJM)?&lt;/p&gt;
  &lt;blockquote id=&quot;B2U2&quot;&gt;CJM это ориентированный граф, на который с помощью точек контакта отображается путь потребителя предоставляемой услуги. CJM фиксирует подробности взаимодействия с услугой.&lt;/blockquote&gt;
  &lt;p id=&quot;a67e&quot;&gt;То есть, CJM отображает, как именно потребитель взаимодействует с услугой — какие точки взаимодействия существуют, через какие каналы осуществляется взаимодействие (веб, мобильное приложение, офлайновая точка присутствия и так далее), а также, что происходит внутри каждой точки контакта.&lt;/p&gt;
  &lt;p id=&quot;ddd4&quot;&gt;Вот примеры типичных CJM (пока обращайте внимание только на внешнюю сторону диаграммы):&lt;/p&gt;
  &lt;figure id=&quot;Ec1W&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*1FYD6W3afwnTtcRBuHnugQ.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://customerexperienceplanning.com/&quot; target=&quot;_blank&quot;&gt;customerexperienceplanning.com&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;8tgU&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*5Xo57DkRkmS-cPXIt85Few.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://www.thebridge.nl/&quot; target=&quot;_blank&quot;&gt;thebridge.nl&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dcad&quot;&gt;Давайте посмотрим на упрощенный пример CJM:&lt;/p&gt;
  &lt;figure id=&quot;VsM3&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:696/1*uLnRTiRy8uddF6QtkFJV-Q.png&quot; width=&quot;557&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://desonance.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Mel Edwards, 2011&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;f257&quot;&gt;Вы видите трех представителей, каждый из которых олицетворяет свою группу потребителей. В процессе потребления услуги (достижения цели) им приходится взаимодействовать с разными продуктами. В каждой точке происходит акт обслуживания с некоторым уровнем качества:&lt;/p&gt;
  &lt;figure id=&quot;CO2d&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:699/1*4bfYvMCaw743-t8GI1Vztw.png&quot; width=&quot;559&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://desonance.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Mel Edwards, 2011&lt;/a&gt; &amp;amp; Alexey Kopylov, 2013&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;c38c&quot;&gt;Общее впечатление от услуги, как правило, зависит от качества обслуживания во всех точках контакта. Действует принцип слабого звена — одно неудачное взаимодействие бросает тень на всю услугу. Поэтому очень важно, чтобы каждая точка взаимодействия была отработана с максимальным качеством.&lt;/p&gt;
  &lt;p id=&quot;cf26&quot;&gt;Однако бывает так, что все точки взаимодействия реализованы просто на отлично, а проблемы скрываются на границах перехода от одной точки к другой. То есть, может получиться так, что все работники компании обслуживают клиентов хорошо, а часть потребителей все равно не доходит до своей цели:&lt;/p&gt;
  &lt;figure id=&quot;VVwE&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:696/1*0tBYKlgJQvxuBGASftaOzg.png&quot; width=&quot;557&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://desonance.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Mel Edwards, 2011&lt;/a&gt; &amp;amp; Alexey Kopylov, 2013&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d888&quot;&gt;Давайте проиллюстрирую это простым примером: многие интернет магазины требуют пройти процедуру регистрации и, зачастую, имеется такой шаг, как подтверждение регистрации специальной по ссылке, которая приходит на ваш почтовый ящик (это нужно, чтобы доказать, что регистрируется живой человек, а не робот). В этом случае повышается вероятность, что пользователь не сможет пройти этот шаг: возможно письмо со ссылкой попало в спам, возможно пользователь ошибся и вместо gmail.com ввел gmail.ru или другой несуществующий адрес, возможно он вообще забыл, что нужно было подтвердить регистрацию. В известных мне примерах потери пользователей на этом шаге достигали 70%!&lt;/p&gt;
  &lt;p id=&quot;319e&quot;&gt;Каким образом мы могли бы снизить эти барьеры? Например, можно контролировать, что именно вводит пользователь в качестве email’а и предлагать исправлять явно ошибочные адреса. Далее, если пользователь не кликнул в течение нескольких дней на ссылку из email сообщения, то можно повторно выслать ему письмо со ссылкой. Но самое лучшее, конечно, вообще отказаться от этого шага — использовать другие методы защиты от роботов!&lt;/p&gt;
  &lt;p id=&quot;93db&quot;&gt;Вообще нужно всегда реализовывать систему так, чтобы любая точка контакта мотивировала потребителя перейти на следующий шаг (принцип &lt;em&gt;«толкай»&lt;/em&gt;), а следующая точка тянула потребителя из предыдущей точки контакта (операция &lt;em&gt;«тяни»&lt;/em&gt;). Принцип «тяни-толкай» способствует более гладкому взаимодействию потребителя с услугой.&lt;/p&gt;
  &lt;p id=&quot;4582&quot;&gt;Вспомним пример с прослушиванием музыки. На самом деле у Apple есть способ обеспечивающий переход от прослушивания на iPhone к прослушиванию на Apple TV, а именно технология AirPlay. Однако не все потребители знают о волшебной технологии и поэтому не могут ею воспользоваться. Есть правило, что функционал который пользователи не могут найти для них как бы не существует. Можно было бы так реализовать принцип «тяни-толкай»: как только пользователь оказывается в зоне, где доступен Apple TV, то сразу получает сообщение (не прерывающее прослушивание), что он может включить аудиосистему (подключенную к Apple TV) и продолжить прослушивание уже на ней. И наоборот, как только пользователь включает ТВ, он видит сообщение, какая композиция проигрывается на iPhone и что нужно сделать, чтобы перенаправить звук на аудиосистему (нажатием на одну кнопку).&lt;/p&gt;
  &lt;p id=&quot;865b&quot;&gt;Итак, CJM позволяет поставить под контроль процесс проектирования услуг, которые реализованы с помощью различных интерактивных продуктов, а также наглядно визуализировать сам процесс исполнения услуги.&lt;/p&gt;
  &lt;h1 id=&quot;2e1e&quot;&gt;Задачи, решаемые CJM&lt;/h1&gt;
  &lt;p id=&quot;1180&quot;&gt;Перечислю все задачи, которые решает CJM:&lt;/p&gt;
  &lt;ol id=&quot;00yr&quot;&gt;
    &lt;li id=&quot;d92c&quot;&gt;Создание непрерывного UX на протяжении всего потребления услуги.&lt;br /&gt;Вспомните вышеупомянутый «тяни-толкай».&lt;/li&gt;
    &lt;li id=&quot;8a47&quot;&gt;Увеличение конверсии потребителей.&lt;br /&gt;За счет снижения барьеров, а также за счет уменьшения потерь при переходе от точки контакта к точке контакта, до цели доходит больше потребителей.&lt;/li&gt;
    &lt;li id=&quot;9146&quot;&gt;Повышение лояльности потребителей.&lt;br /&gt;Retention rate — количество возвращающихся потребителей растет, если мы спроектировали и реализовали услугу без барьеров.&lt;/li&gt;
    &lt;li id=&quot;d6e5&quot;&gt;Повышение ответственности специалистов компании.&lt;br /&gt;У каждой точки взаимодействия есть свои ответственные работники со стороны компании. После того, как мы нанесли все точки взаимодействия на карту, все работники в компании могут видеть, кто и за что отвечает и как справляется со своими обязанностями (если настроим KPI для каждой точки). Это само по себе повышает уровень ответственности.&lt;/li&gt;
    &lt;li id=&quot;5260&quot;&gt;Ускорение разработки многоканальных услуг и продуктов и повышение качества разработки.&lt;br /&gt;За счет того, что все стороны, участвующие в разработке, более полно видят как осуществляется услуга, а также видят все потенциальные слабые места услуги и могут вовремя вмешаться в их разработку.&lt;/li&gt;
    &lt;li id=&quot;2eb8&quot;&gt;Создание новых захватывающих взаимодействий.&lt;br /&gt;Появляется возможность придумать и реализовывать новые инновационные возможности (вспомните пример про продолжение прослушивания аудиозаписи при переходе от одного устройства к другому).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;e529&quot;&gt;Все выглядит замечательно, но каким образом создавать CJM?&lt;/p&gt;
  &lt;h1 id=&quot;272e&quot;&gt;Создаем CJM, пошаговая инструкция&lt;/h1&gt;
  &lt;h2 id=&quot;aafa&quot;&gt;Шаг №1. Идентифицируем все точки контакта и каналы взаимодействия&lt;/h2&gt;
  &lt;p id=&quot;5706&quot;&gt;Наносим на карту все точки взаимодействия некоего типичного потребителя с услугой. Не забываем ничего! Может сложиться так, что есть скрытые точки взаимодействия, о которых вы не догадывались. Например, вы можете выяснить, что некоторые проблемы потребители решают неофициальным способом — с помощью социальных сетей (что бывает нередко). То есть, кто-то из работников компании связывается с потребителем напрямую внутри социальной сети и помогает тому добиться своей цели. Надо запротоколировать все, в том числе такие точки взаимодействия!&lt;/p&gt;
  &lt;p id=&quot;afd5&quot;&gt;Чтобы ничего не пропустить, используйте методику тайного покупателя, то есть, сами пройдитесь по всем шагам типичного потребителя услуги. Можете также найти внешнюю компанию, которая профессионально выявит все точки взаимодействия с привлечением большого количества респондентов.&lt;/p&gt;
  &lt;p id=&quot;6890&quot;&gt;Запомните, что для одной целевой группы (или для одного персонажа, если вы используете методику персонажей) рисуется одна CJM диаграмма!&lt;/p&gt;
  &lt;p id=&quot;6214&quot;&gt;Далее — важно для каждой точки определить все возможные каналы взаимодействия. То есть, определить с помощью каких устройств осуществляются взаимодействия, например это могут быть веб-браузеры, мобильные приложения, телефонные звонки, звонки по skype, email, социальные сети. Не забываете про офлайновые каналы — посещение офисов, встречи с курьерами, встречи с агентами и так далее. Опять же могут вскрыться неожиданные для вас каналы, например, вы можете узнать, что огромное количество потребителей заходит с мобильных устройств. И может оказаться так, что дизайн вашего сайта не учитывает этот канал взаимодействия.&lt;/p&gt;
  &lt;p id=&quot;e04b&quot;&gt;Графически CJM может иметь различный вид — диаграмм может быть линейной, если характер взаимодействия с потребителями также является линейным:&lt;/p&gt;
  &lt;figure id=&quot;px2o&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*srYm3ESF2sdHDFRwh_xipg.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://desonance.wordpress.com/&quot; target=&quot;_blank&quot;&gt;desonance.wordpress.com&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;865c&quot;&gt;Может быть разветвленный, если у потребителей имеются множественные альтернативные сценарии взаимодействия:&lt;/p&gt;
  &lt;figure id=&quot;VVUN&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*ULMRjeXqQa7P4nHoDeOPOg.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Alexey Kopylov, 2013&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cbfc&quot;&gt;Может иметь временной вид — годится для отображения взаимодействия с услугой в течение суток:&lt;/p&gt;
  &lt;figure id=&quot;v1v3&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*5mf9BBBFHUXyfbP5CwovHA.jpeg&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://customerexperienceplanning.com/&quot; target=&quot;_blank&quot;&gt;customerexperienceplanning.com&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;b54e&quot;&gt;Мы можем сделать несколько CJM диаграмм для различных групп потребителей и для различных целей.&lt;/p&gt;
  &lt;h2 id=&quot;3ccb&quot;&gt;Шаг №2. Описываем точки контакта&lt;/h2&gt;
  &lt;p id=&quot;a791&quot;&gt;Теперь каждую точку контакта и каждый канал необходимо описать.&lt;/p&gt;
  &lt;p id=&quot;b9f4&quot;&gt;Вот типичная информация, которую мы должны зафиксировать:&lt;/p&gt;
  &lt;ol id=&quot;BKjM&quot;&gt;
    &lt;li id=&quot;4f19&quot;&gt;Канал взаимодействия&lt;br /&gt;У точек может быть несколько каналов, перечисляем все каналы.&lt;/li&gt;
    &lt;li id=&quot;6294&quot;&gt;Целевое действие, сценарий, критерии успеха&lt;br /&gt;Описываем, чего потребитель хочет добиться при данном взаимодействии. Также описываем как проистекает идеальный сценарий взаимодействия, а также, что нужно делать, если у потребителя возникли проблемы. Описываем конкретные критерии успеха прохождения сценария — это нам необходимо для сбора статистики качества прохождения каждой точки контакта.&lt;/li&gt;
    &lt;li id=&quot;a367&quot;&gt;Степень критичности точки/канала&lt;br /&gt;Помогает концентрироваться на самых критичных точках.&lt;/li&gt;
    &lt;li id=&quot;01e2&quot;&gt;Барьеры&lt;br /&gt;Перечисляем все проблемы, с которыми могут столкнуться потребители внутри данной точки взаимодействия.&lt;/li&gt;
    &lt;li id=&quot;85c4&quot;&gt;Способы снижения барьеров&lt;br /&gt;Для каждого барьера определяем контрмеры, которые мы должны реализовать при оптимизации услуги. Например, как в моем примере подтверждения регистрации, мы можем контролировать, какие email’ы вводит потребитель и предлагать исправлять ошибки в написании адреса.&lt;/li&gt;
    &lt;li id=&quot;3426&quot;&gt;Конверсия и ROI оптимизации&lt;br /&gt;Считаем количество пришедших в данную точку потребителей к количеству успешно достигших следующей точки взаимодействия. Идеально, если все потребители пришли к следующей точке (коэффициент = 1.0). Это главный KPI точки взаимодействия и работника компании, который это взаимодействие реализует. Конверсия позволит вам посчитать экономический эффект от снижения того или иного барьера. Например, вы можете рассчитать, что снижение барьера внутри некоторой точки контакта приведет повышению конверсии на 20%. Прослеживая эти 20% далее по цепочке CJM и дойдя до момента, когда потребитель приносит деньги, вы сможете довольно точно определить, сколько денег принесет оптимизация данной точки. Если при этом вы еще оцените затраты на снижение барьера, то у вас появляется значение коэффициента ROI (возврат от инвестиций). Имея значение ROI вам будет довольно легко доказать топ-менеджерам выгоду такой оптимизации.&lt;/li&gt;
    &lt;li id=&quot;8237&quot;&gt;Другие KPI (например retention rate, время на контакт и так далее)&lt;br /&gt;Мы можем придумать большое количество KPI, которые более полно характеризуют качество услуги в данной точке.&lt;/li&gt;
    &lt;li id=&quot;1027&quot;&gt;Психоэмоционально состояние, степень фрустрации и стресса&lt;br /&gt;Эти данные мы можем получить просматривая жалобы потребителей или же с помощью качественных методов исследования (интервью, полевые наблюдения). Как и степень критичности точки контакта данная информация помогает сконцентрироваться на самых важных точках осуществления услуги.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;blockquote id=&quot;NhzO&quot;&gt;&lt;strong&gt;Важный совет&lt;/strong&gt;При описании точек контакта используйте лексику потребителей, а не вашу профессиональную.&lt;/blockquote&gt;
  &lt;p id=&quot;600c&quot;&gt;Ниже на рисунке примеры описания точек взаимодействия. Я картировал программу лояльности одной нефтяной компании.&lt;/p&gt;
  &lt;figure id=&quot;xYJt&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*O7dow_kQsWnMJ4k-E_avCQ.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Alexey Kopylov, 2013&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;gnFU&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*AZyjKSsHiPv5cHdWdCE1XQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;f91b&quot;&gt;Шаг №3. Находим кто и за что отвечает внутри компании&lt;/h2&gt;
  &lt;p id=&quot;104b&quot;&gt;Для каждой точки и канала добавляем имя специалиста или группы специалистов, от действия которых зависит успешность взаимодействия с потребителем.&lt;/p&gt;
  &lt;p id=&quot;3b02&quot;&gt;В зависимости от уровня развития компании эта задача может быть очень простой, а может быть, наоборот, очень сложной. Чем непрозрачнее компания, тем сложнее собирать подобные данные.&lt;br /&gt;Ситуация усугубляется, когда сотрудники узнают, что вы собираетесь зафиксировать KPI качества их работы. Часть сотрудников может начать саботировать процесс сбора KPI, просто не будут давать вам нужных данных. Сперва необходимо убедить всех сотрудников в том, что фиксация KPI будет способствовать повышению качество услуги, что, в свою очередь будет способствовать продвижению по карьерной лестнице. Но, как правило, всегда найдется пара паршивых овец, которые будут препятствовать повышению прозрачности — и для преодоления такого сопротивления вам потребуется поддержка со стороны высшего руководства.&lt;/p&gt;
  &lt;blockquote id=&quot;OieF&quot;&gt;&lt;strong&gt;Внимание, этический вопрос!&lt;/strong&gt;&lt;br /&gt;Не все работают строго по рабочим инструкциям. Некоторые сотрудники могут для повышения эффективности их обходить. В таком случае анонимизируйте источники вашей информации насколько, насколько это возможно.&lt;/blockquote&gt;
  &lt;h2 id=&quot;2d62&quot;&gt;Шаг №4. Оптимизируем самые критические точки/каналы&lt;/h2&gt;
  &lt;p id=&quot;fa9a&quot;&gt;Берем самые критические точки взаимодействия и снижаем барьеры внутри этих точек.&lt;/p&gt;
  &lt;p id=&quot;df92&quot;&gt;Возьмем пример с нефтяной компанией — барьер №2 шага №3:&lt;/p&gt;
  &lt;figure id=&quot;4Lom&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*lE8LHNkrc0gp4HoBFh404Q.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4d59&quot;&gt;Данный барьер можно снизить за счет грамотной подачи информации в виде последовательности действий (с помощью графики похожей на комиксы). Только нужно помнить, что любая оптимизация должна быть проверена после реализации — действительно ли новая версия точки контакта работает лучше предыдущей?&lt;/p&gt;
  &lt;p id=&quot;5e5f&quot;&gt;Также продумайте, смогли ли вы реализовать принцип «тяни-толкай» для мотивации потребителей при продвижении по CJM?&lt;/p&gt;
  &lt;p id=&quot;d5d0&quot;&gt;Более радикальный способ оптимизации — убирать ненужные точки взаимодействия. На рисунке ниже видна схема CJM до оптимизации и после оптимизации. В правой схеме были убраны лишние уровни иерархии и, цепочка взаимодействия в целом стала более короткой.&lt;/p&gt;
  &lt;figure id=&quot;9NKK&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*9Z4kQYMMy1RgtNizyqhA6g.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Alexey Kopylov, 2013&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6d88&quot;&gt;При оптимизации также можно использовать методику &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B9&quot; target=&quot;_blank&quot;&gt;теории ограничений Э. Голдратта&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;5e02&quot;&gt;Шаг №5. Берем под контроль процесс оптимизации&lt;/h2&gt;
  &lt;p id=&quot;dcd6&quot;&gt;Ставим процесс оптимизации регулярным. После исправления самых критичных точек взаимодействия мы начинаем последовательно оптимизировать менее критичные точки. При этом налаживаем регулярный сбор KPI (включая конверсию). Все изменения в UX услуги и продуктов постоянно сверяем с KPI.&lt;/p&gt;
  &lt;p id=&quot;f976&quot;&gt;Таким образом мы последовательно повышаем качество услуги и зарабатываем авторитет внутри компании. Важно начать с самого критичного, в этом случае вам будет легче получить одобрение и бюджет на остальные улучшения услуги. Сразу браться за все дорого и долго и есть риск концентрации на несущественных проблемах.&lt;/p&gt;
  &lt;h1 id=&quot;c3cc&quot;&gt;Инструменты для создания CJM&lt;/h1&gt;
  &lt;p id=&quot;4d3c&quot;&gt;Я перепробовал много разных инструментов, хочу поделиться своим опытом.&lt;/p&gt;
  &lt;h2 id=&quot;3e2e&quot;&gt;Post-It листочки&lt;/h2&gt;
  &lt;p id=&quot;f584&quot;&gt;Используйте Post-It листочки для начала работы над CJM, для мозговых штурмов, для построения гипотез и фиксации предварительных результатов. Листочки способствуют групповой работе и являются, наверное, самым дешевым инструментом и самым быстрым способом фиксации CJM.&lt;/p&gt;
  &lt;figure id=&quot;2l01&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:646/1*Xwtw5yBYiiAurCiHYbrrEg.jpeg&quot; width=&quot;517&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;b9a5&quot;&gt;Красивые схемы&lt;/h2&gt;
  &lt;p id=&quot;6e46&quot;&gt;На продвинутом этапе вы можете в Adobe Photoshop или Illustrator нарисовать сексуальную схему, на которой все точки контакта поданы максимально вкусно. Такие схемы годны для презентации различным топ-менеджерам для получения дополнительного финансирования. Однако эти схемы статичны и неудобны для развития, на них отсутствует большая часть описательной информации. Не злоупотребляйте такими схемами!&lt;/p&gt;
  &lt;figure id=&quot;vbA4&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:638/1*XK0dRax2-3dFbSqT4g0XCA.png&quot; width=&quot;510&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;63c3&quot;&gt;Excel + схемы&lt;/h2&gt;
  &lt;p id=&quot;a028&quot;&gt;Сейчас я работаю, используя два инструмента: Flying Logic для прорисовки диаграммы и Excel (или Google Docs) для ввода информации по каждой точке контакта. Flying Logic довольно хорошо подходит для таких диаграмм, так как изначально был сделан для построения схем теории ограничений, которая довольно хорошо сопрягается с CJM. Недостаток этого способа — приходится постоянно синхронизировать диаграмму и таблицу для того, чтобы информация была актуальной.&lt;/p&gt;
  &lt;figure id=&quot;wJW7&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:706/1*OtpOh6OGcq0E4aBtGvdJGQ.png&quot; width=&quot;565&quot; /&gt;
    &lt;figcaption&gt;Alexey Kopylov, 2013&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;96f4&quot;&gt;Веб сервис &lt;a href=&quot;http://www.touchpointdashboard.com/&quot; target=&quot;_blank&quot;&gt;Touchpoint Dashboard&lt;/a&gt;&lt;/h2&gt;
  &lt;p id=&quot;d838&quot;&gt;Это единственный известный мне веб-сервис, который специально разработан для работы с CJM. Вы можете не только фиксировать CJM, но и создавать кросс-таблицы типа важность/простота реализации/эффект или время исправления/стоимость исправления/эффект. Такие кросс-таблицы помогут вам определиться с порядком оптимизации услуги.&lt;/p&gt;
  &lt;figure id=&quot;Mn4e&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*p9XaFlLSRb46FxP4DH_7yQ.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://touchpointdashboard.com/&quot; target=&quot;_blank&quot;&gt;touchpointdashboard.com&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9b71&quot;&gt;Выглядит все это весьма симпатично, однако, стоимость сервиса выглядит так (в месяц):&lt;/p&gt;
  &lt;figure id=&quot;gzKk&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*K3rrA-qUUblTcCKU6SceAA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;http://touchpointdashboard.com/&quot; target=&quot;_blank&quot;&gt;touchpointdashboard.com&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4d89&quot;&gt;То есть:&lt;/p&gt;
  &lt;ul id=&quot;l5TX&quot;&gt;
    &lt;li id=&quot;bbe5&quot;&gt;$175 за 1 пользователя&lt;/li&gt;
    &lt;li id=&quot;857f&quot;&gt;$625 за 5&lt;/li&gt;
    &lt;li id=&quot;ae2b&quot;&gt;$950 за 10&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;229d&quot;&gt;На мой взгляд это пока еще слишком дорого для большинства команд — ждем появления конкурента, уверен, после этого стоимость снизится.&lt;/p&gt;
  &lt;h1 id=&quot;7a9d&quot;&gt;Итоги&lt;/h1&gt;
  &lt;p id=&quot;7309&quot;&gt;Напоследок кратко перечислю выгоды от применения CJM при перепроектировании услуги:&lt;/p&gt;
  &lt;ul id=&quot;jKBK&quot;&gt;
    &lt;li id=&quot;4cf0&quot;&gt;CJM позволяет распространить знания о реальном положении дел с потребителями в вашей компании.&lt;/li&gt;
    &lt;li id=&quot;5fb7&quot;&gt;Помогает обратить внимание топ-менеджеров на вопиющие факты или потенциальные возможности для роста.&lt;/li&gt;
    &lt;li id=&quot;91f2&quot;&gt;Помогает рассчитать ROI оптимизации CJM.&lt;/li&gt;
    &lt;li id=&quot;8878&quot;&gt;Способствует разработатке стратегию развития услуги и продуктов, которые в нее входят.&lt;/li&gt;
    &lt;li id=&quot;1317&quot;&gt;Улучшает коммуникации внутри компании.&lt;/li&gt;
    &lt;li id=&quot;280b&quot;&gt;Повышает уровень подготовки персонала (выходим за рамки чистого UX).&lt;/li&gt;
    &lt;li id=&quot;9c00&quot;&gt;Улучшает организационную культуру вашей компании.&lt;/li&gt;
    &lt;li id=&quot;ebc6&quot;&gt;Самое главное: повышает качество услуги, что способствует лояльности ваших потребителей!&lt;br /&gt;&lt;br /&gt;Оригинал статьи: &lt;a href=&quot;https://copylove.medium.com/customer-journey-map-8a5ac61d6b5e&quot; target=&quot;_blank&quot;&gt;https://copylove.medium.com/customer-journey-map-8a5ac61d6b5e&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>shmarou:fzH5sZeSiLm</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/fzH5sZeSiLm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>System Analysis</title><published>2024-01-17T09:47:17.973Z</published><updated>2024-07-07T12:16:37.331Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a9/ce/a9ce5796-15f0-4937-986d-2b18b2b221c1.png"></media:thumbnail><category term="system-analysis" label="System Analysis"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/82/7b/827b49c9-6dcf-4220-ab52-4546ce5c7dcd.png&quot;&gt;Содержание основное
Оглавление подготовка к экзамену</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5sEa&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/main&quot; target=&quot;_blank&quot;&gt;Содержание основное&lt;br /&gt;&lt;/a&gt;&lt;a href=&quot;https://teletype.in/@shmarou/exam&quot; target=&quot;_blank&quot;&gt;Оглавление подготовка к экзамену&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;hjwi&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GyLv&quot;&gt;Based on Andersenlab matrix&lt;/p&gt;
  &lt;ol id=&quot;h6Ws&quot;&gt;
    &lt;li id=&quot;Pthq&quot;&gt;&lt;a href=&quot;#MSSA&quot;&gt;Application types&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;pxs1&quot;&gt;&lt;a href=&quot;#KAwy&quot;&gt;Operating systems&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;7Wqu&quot;&gt;OOP&lt;/li&gt;
    &lt;li id=&quot;1DkL&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/sysDesign&quot; target=&quot;_blank&quot;&gt;System design&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;7NJh&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/pEyC5tGuc-5&quot; target=&quot;_blank&quot;&gt;Rest Integrations&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;tb0l&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;qSjW&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;jAL6&quot;&gt;Application types&lt;/h2&gt;
  &lt;p id=&quot;q8h3&quot;&gt;Need to know:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ol id=&quot;l760&quot;&gt;
      &lt;li id=&quot;zPoq&quot;&gt;Knows types of software Knows the differences between each type of software Knows when and where each type of software is used.&lt;/li&gt;
      &lt;li id=&quot;BAFv&quot;&gt;Provides thick and thin client examples Knows all the advantages of each type of software.&lt;/li&gt;
      &lt;li id=&quot;4DRj&quot;&gt;Knows the peculiarities of the implementation of each type of software. &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/section&gt;
  &lt;p id=&quot;NM7K&quot;&gt;Resources:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;RhRF&quot;&gt;1. Types guide &lt;a href=&quot;https://www.coderus.com/software-101-a-complete-guide-to-the-different-types-of-software/&quot; target=&quot;_blank&quot;&gt;https://www.coderus.com/software-101-a-complete-guide-to-the-different-types-of-software/&lt;/a&gt; &lt;/p&gt;
    &lt;p id=&quot;1HWv&quot;&gt;2. Types &lt;a href=&quot;https://clevertap.com/blog/types-of-mobile-apps/&quot; target=&quot;_blank&quot;&gt;https://clevertap.com/blog/types-of-mobile-apps/&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;MSSA&quot;&gt;Main types: &lt;u&gt;webapps, mobile apps, desktop apps.&lt;/u&gt;&lt;br /&gt;Далее можно дробить на: &lt;br /&gt;&lt;/p&gt;
  &lt;ul id=&quot;658T&quot;&gt;
    &lt;li id=&quot;Illn&quot;&gt;Application Software (Прикладное: Word, субд, медиа, почта и т.д.)&lt;/li&gt;
    &lt;li id=&quot;9JN1&quot;&gt;System Software (Windows, iOS, Linux, Android, Windows phone, Apple&amp;#x27;s iOS и т.д.)&lt;/li&gt;
    &lt;li id=&quot;Nk3y&quot;&gt;Firmware (Firmware is software that’s stored on a computer’s motherboard or chipset.)&lt;/li&gt;
    &lt;li id=&quot;OrnH&quot;&gt;Programming Software (IDEs, Gitlab, Github, Visual Studio etc)&lt;/li&gt;
    &lt;li id=&quot;19bT&quot;&gt;Driver Software (Driver software communicates with hardware and control devices and peripherals attached to a computer. Examples: graphic, network card, mouse, keyborad)&lt;/li&gt;
    &lt;li id=&quot;NdAZ&quot;&gt;Freeware &lt;br /&gt;&lt;em&gt;Freeware sounds like free software or open-source software but there’s a difference. Freeware software&lt;strong&gt; does not expose or share its source code.&lt;/strong&gt; Yet the software owner &lt;strong&gt;does not charge others to use it&lt;/strong&gt;. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;Freeware licences vary as to what the software can be used for and who can share it. &lt;br /&gt;Some developers only allow their freeware for private or personal use. Businesses need a paid licence or get written permission.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;rLaR&quot;&gt;Shareware&lt;br /&gt;&lt;em&gt;Like freeware, shareware &lt;strong&gt;is free to use&lt;/strong&gt; and share with others, but onl&lt;strong&gt;y for a short time.&lt;/strong&gt; It acts as an evaluation. You can try some or all of the features before committing to a purchase.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;uQtn&quot;&gt;Open Source Software&lt;br /&gt;&lt;em&gt;Open source means you can explore the actual code that the app was written in. (Linux)&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;oJJY&quot;&gt;Closed Source Software&lt;br /&gt;&lt;em&gt;Most applications are closed source in that they do not expose the original code. Licences are stringent. No unauthorised copying or cracking is allowed. The app can be commercial or private but it requires payment of some kind to use.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;v5Pd&quot;&gt;Utility Software&lt;br /&gt;&lt;em&gt;Utility software is designed to analyse and optimise a device.&lt;/em&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VSqZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;nEkN&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Мобильные приложение&lt;/strong&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ul id=&quot;gZC9&quot;&gt;
      &lt;li id=&quot;gerl&quot;&gt;&lt;strong&gt;Native apps&lt;/strong&gt; are created for one specific platform or operating system.&lt;/li&gt;
      &lt;li id=&quot;m8bv&quot;&gt;&lt;strong&gt;Web apps&lt;/strong&gt; are responsive versions of websites that can work on any mobile device or OS because they’re delivered using a mobile browser.&lt;/li&gt;
      &lt;li id=&quot;3txi&quot;&gt;&lt;strong&gt;Hybrid apps&lt;/strong&gt; are combinations of both native and web apps, but wrapped within a native app, giving it the ability to have its own icon or be downloaded from an app store.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;gK7t&quot; data-align=&quot;center&quot;&gt;Native:&lt;/h2&gt;
  &lt;figure id=&quot;Y7TU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/82/7b/827b49c9-6dcf-4220-ab52-4546ce5c7dcd.png&quot; width=&quot;1431&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NLkp&quot;&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Because of their singular focus, native apps have the advantage of being &lt;strong&gt;faster and more reliable&lt;/strong&gt; in terms of performance. They’re generally &lt;strong&gt;more efficient with the device’s resources&lt;/strong&gt; than other types of mobile apps. Native apps utilize &lt;strong&gt;the native device UI&lt;/strong&gt;, giving users a more &lt;a href=&quot;https://clevertap.com/blog/customer-experience-optimization/&quot; target=&quot;_blank&quot;&gt;optimized customer experience&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Supv&quot;&gt;And because native apps connect with the device’s hardware directly, they have access to a broad choice of device features like Bluetooth, phonebook contacts, camera roll, NFC, and more.&lt;/p&gt;
  &lt;p id=&quot;xbiP&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;: However, the problem with native apps lies in the fact that if you start developing them, you &lt;strong&gt;have to duplicate efforts fo&lt;/strong&gt;r each of the different platforms. The code you create for one platform cannot be reused on another. This drives up costs. Not to mention the effort needed &lt;strong&gt;to maintain and update the codebase for each version.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;8ofY&quot;&gt;And then, every time there’s an update to the app, the user has to download the new file and reinstall it. This also means that native apps do take up precious space in the device’s storage.&lt;/p&gt;
  &lt;h2 id=&quot;P5eX&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Web apps:&lt;/strong&gt;&lt;/h2&gt;
  &lt;figure id=&quot;j9Io&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/60/e3/60e36583-cd11-4b5a-b29d-233b3de30e33.png&quot; width=&quot;1431&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;D8G4&quot;&gt;They’re actually responsive websites that adapt its user interface to the device the user is on. In fact, when you come across the option to “install” a web app, it often simply bookmarks the website URL on your device.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;V1aK&quot;&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Because it’s web-based, there is&lt;strong&gt; no need to customize to a platform or OS&lt;/strong&gt;. This cuts down on development costs.&lt;br /&gt;Plus, there’s &lt;strong&gt;nothing to download&lt;/strong&gt;. They won’t take up space on your device memory like a native app, making maintenance easier – just push the update live over the web. Users don’t need to download the update at the app store.&lt;/p&gt;
  &lt;p id=&quot;pTdr&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;: But this is also pertinent: web apps are &lt;strong&gt;entirely dependent&lt;/strong&gt; on the browser used on the device. There will be functionalities available within one browser and not available on another, possibly giving users varying experiences.&lt;br /&gt;And because they’re shells for websites, they &lt;strong&gt;won’t completely work offline&lt;/strong&gt;. Even if they have an offline mode, the device will still need an internet connection to back up the data on your device, offer up any new data, or refresh what’s on screen.&lt;br /&gt;(google maps, Twitter lite, etc)&lt;/p&gt;
  &lt;h2 id=&quot;FWJS&quot; data-align=&quot;center&quot;&gt;Hybrid&lt;/h2&gt;
  &lt;figure id=&quot;GOUq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/08/78/0878f86d-0789-4c87-9761-5e89394684b2.png&quot; width=&quot;1431&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;6ba6&quot; data-align=&quot;center&quot;&gt;These are web apps that look and feel like native apps. They might have a home screen app icon, responsive design, fast performance, even be able to function offline, but they’re really web apps made to look native.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Srjq&quot;&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Building a hybrid app is much quicker and more economical than a native app. As such, a hybrid app can be the minimum viable product – a way to prove the viability of building a native app. They also load rapidly, are ideal for usage in countries with slower internet connections, and give users a consistent user experience. Finally, because they use a single code base, there is much less code to maintain.&lt;/p&gt;
  &lt;p id=&quot;uj0q&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Hybrid apps might lack in power and speed, which are hallmarks of native apps.&lt;/p&gt;
  &lt;blockquote id=&quot;VXO2&quot;&gt;&lt;em&gt;Гибридное приложение – это вид мобильного приложения, которое сочетает в себе элементы нативных и веб-приложений. Оно разработано с использованием веб-технологий (например, HTML, CSS, JavaScript), но упаковано таким образом, чтобы работать как нативное приложение на мобильном устройстве. Это позволяет ему взаимодействовать с нативными функциями устройства, такими как камера, датчики, сохраненные данные и т.д.&lt;br /&gt;Вот несколько примеров гибридных приложений:&lt;br /&gt;&lt;strong&gt;Instagram&lt;/strong&gt;: Одно из самых популярных гибридных приложений, использующее веб-технологии для обеспечения плавного пользовательского опыта.&lt;br /&gt;&lt;strong&gt;Uber&lt;/strong&gt;: Приложение Uber для пользователей является гибридным, что обеспечивает быструю и эффективную работу на разных платформах.&lt;br /&gt;&lt;strong&gt;Twitter&lt;/strong&gt;: Это еще один пример гибридного приложения, которое обеспечивает высокую производительность и плавность интерфейса.&lt;br /&gt;&lt;strong&gt;Gmail&lt;/strong&gt;: Gmail также использует гибридный подход, чтобы предоставить пользователям удобный и функциональный интерфейс.&lt;br /&gt;&lt;br /&gt;Гибридные приложения популярны благодаря их способности работать на различных платформах с относительно меньшими затратами на разработку по сравнению с нативными приложениями. Однако они могут быть менее производительными в некоторых случаях и иметь ограничения в доступе к некоторым функциям устройств.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h2 id=&quot;typesofmobileapps:howtochoosejustone&quot;&gt;Types of Mobile Apps: How to Choose Just One&lt;/h2&gt;
  &lt;figure id=&quot;GI7B&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d3/e6/d3e66e51-16d5-42a0-81cb-5a61fc0ba9a0.png&quot; width=&quot;1431&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;HFyA&quot;&gt;How to find flaws in the selected type of software:&lt;/h2&gt;
  &lt;ol id=&quot;LmHc&quot;&gt;
    &lt;li id=&quot;zmSY&quot;&gt;&lt;strong&gt;Тестирование Производительности&lt;/strong&gt;: Это включает в себя нагрузочное тестирование и стресс-тестирование для проверки, как приложение справляется с большими объемами трафика и давлением.&lt;/li&gt;
    &lt;li id=&quot;HGe3&quot;&gt;&lt;strong&gt;Тестирование Уязвимостей&lt;/strong&gt;: Особенно важно для веб-приложений и гибридных приложений, которые могут быть подвержены веб-специфическим угрозам, таким как XSS (Cross-Site Scripting), CSRF (Cross-Site Request Forgery) и SQL-инъекции.&lt;/li&gt;
    &lt;li id=&quot;qmcV&quot;&gt;&lt;strong&gt;Юзабилити Тестирование (Тестирование Удобства Использования)&lt;/strong&gt;: Проверка на интуитивно понятный и удобный пользовательский интерфейс, особенно важно для мобильных приложений, где ограничен размер экрана.&lt;/li&gt;
    &lt;li id=&quot;kwrD&quot;&gt;&lt;strong&gt;Тестирование Совместимости&lt;/strong&gt;: Особенно важно для гибридных и веб-приложений, чтобы убедиться, что они работают корректно на различных устройствах, браузерах и операционных системах.&lt;/li&gt;
    &lt;li id=&quot;kfkq&quot;&gt;&lt;strong&gt;Тестирование Безопасности&lt;/strong&gt;: Включает в себя проверку на утечки данных, неправильное управление доступом, и другие потенциальные уязвимости безопасности.&lt;/li&gt;
    &lt;li id=&quot;7kHX&quot;&gt;&lt;strong&gt;Код Ревью&lt;/strong&gt;: Анализ исходного кода на предмет потенциальных уязвимостей, плохих практик программирования и неэффективного использования ресурсов.&lt;/li&gt;
    &lt;li id=&quot;WWDL&quot;&gt;&lt;strong&gt;Автоматизированное Тестирование&lt;/strong&gt;: Использование инструментов для автоматического тестирования кода и интерфейса может помочь в обнаружении ошибок, которые могли быть упущены в ручном тестировании.&lt;/li&gt;
    &lt;li id=&quot;6Ijg&quot;&gt;&lt;strong&gt;Пользовательское Тестирование&lt;/strong&gt;: Получение обратной связи от реальных пользователей может выявить проблемы, которые не были замечены разработчиками и тестировщиками.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;B0FS&quot;&gt;&lt;a href=&quot;#GyLv&quot;&gt;Вверх&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;KAwy&quot;&gt;Operating systems&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ol id=&quot;PtHI&quot;&gt;
      &lt;li id=&quot;J9f1&quot;&gt;Knows types of OS Knows the general characteristics of each type of OS&lt;/li&gt;
      &lt;li id=&quot;NOkA&quot;&gt;Knowledge of virtualization tools Knowledge of mobile application emulators&lt;/li&gt;
      &lt;li id=&quot;tY8q&quot;&gt;Able to run a virtual machine Able to run a mobile application on a work computer&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/section&gt;
  &lt;p id=&quot;2O4C&quot;&gt;Resources:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;vPdW&quot;&gt;1. Operation systems &lt;a href=&quot;https://www.geeksforgeeks.org/types-of-operating-systems/&quot; target=&quot;_blank&quot;&gt;https://www.geeksforgeeks.org/types-of-operating-systems/&lt;/a&gt; &lt;br /&gt;2. File system &lt;a href=&quot;https://en.wikipedia.org/wiki/File_system&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/File_system&lt;/a&gt; &lt;br /&gt;3. Virtual machine &lt;a href=&quot;https://www.vmware.com/topics/glossary/content/virtual-machine.html&quot; target=&quot;_blank&quot;&gt;https://www.vmware.com/topics/glossary/content/virtual-machine.html&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Nyui&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Operating System is a type of software that works as an interface between the system program and the hardware.&lt;/strong&gt;&lt;/p&gt;
  &lt;h3 id=&quot;X8oL&quot;&gt;1. &lt;strong&gt;Десктопные операционные системы&lt;/strong&gt;:&lt;/h3&gt;
  &lt;ul id=&quot;5Y3p&quot;&gt;
    &lt;li id=&quot;mDK2&quot;&gt;&lt;strong&gt;Windows&lt;/strong&gt;: Одна из самых популярных ОС в мире, разработанная Microsoft. Используется на персональных компьютерах, ноутбуках.&lt;/li&gt;
    &lt;li id=&quot;pzvQ&quot;&gt;&lt;strong&gt;macOS&lt;/strong&gt;: Разработана Apple Inc. и используется на компьютерах Mac. Известна своей удобной и интуитивно понятной интерфейсной системой.&lt;/li&gt;
    &lt;li id=&quot;b2RE&quot;&gt;&lt;strong&gt;Linux&lt;/strong&gt;: Это семейство открытых и бесплатных операционных систем на базе ядра Linux. Существует множество дистрибутивов Linux, таких как Ubuntu, Fedora, Debian, которые подходят для разных типов пользователей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;swhZ&quot;&gt;2. &lt;strong&gt;Мобильные операционные системы&lt;/strong&gt;:&lt;/h3&gt;
  &lt;ul id=&quot;fWdB&quot;&gt;
    &lt;li id=&quot;qQ2K&quot;&gt;&lt;strong&gt;Android&lt;/strong&gt;: Разработана Google и является самой популярной мобильной ОС в мире. Используется на множестве устройств от различных производителей.&lt;/li&gt;
    &lt;li id=&quot;gRS8&quot;&gt;&lt;strong&gt;iOS&lt;/strong&gt;: Операционная система от Apple, используемая на iPhone, iPad и iPod Touch.&lt;/li&gt;
    &lt;li id=&quot;UHvy&quot;&gt;&lt;strong&gt;HarmonyOS&lt;/strong&gt;: Разработана китайской компанией Huawei для использования на различных устройствах, включая смартфоны, планшеты и умные домашние устройства.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;ILXI&quot;&gt;3. &lt;strong&gt;Операционные системы для серверов&lt;/strong&gt;:&lt;/h3&gt;
  &lt;ul id=&quot;EPm5&quot;&gt;
    &lt;li id=&quot;ktBL&quot;&gt;&lt;strong&gt;Windows Server&lt;/strong&gt;: Версия Windows, оптимизированная для серверов.&lt;/li&gt;
    &lt;li id=&quot;VgOg&quot;&gt;&lt;strong&gt;Ubuntu Server&lt;/strong&gt;, &lt;strong&gt;CentOS&lt;/strong&gt;, &lt;strong&gt;Red Hat Enterprise Linux (RHEL)&lt;/strong&gt;: Популярные дистрибутивы Linux, используемые на серверах.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;Y3Cx&quot;&gt;4. &lt;strong&gt;Встроенные операционные системы&lt;/strong&gt;:&lt;/h3&gt;
  &lt;ul id=&quot;lrkE&quot;&gt;
    &lt;li id=&quot;IPNh&quot;&gt;&lt;strong&gt;RTOS (Real-Time Operating System)&lt;/strong&gt;: Операционные системы реального времени, используемые во встроенных системах, где требуются быстрые и предсказуемые времена реакции. Примеры включают FreeRTOS и VxWorks.&lt;/li&gt;
    &lt;li id=&quot;mgQY&quot;&gt;&lt;strong&gt;Embedded Linux&lt;/strong&gt;: Версия Linux, оптимизированная для встроенных систем.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;plfB&quot;&gt;5. &lt;strong&gt;Специализированные и нишевые ОС&lt;/strong&gt;:&lt;/h3&gt;
  &lt;ul id=&quot;hHB9&quot;&gt;
    &lt;li id=&quot;tnRE&quot;&gt;&lt;strong&gt;Chrome OS&lt;/strong&gt;: Разработана Google и используется в ноутбуках Chromebook. Основана на веб-приложениях и интеграции с сервисами Google.&lt;/li&gt;
    &lt;li id=&quot;K3D5&quot;&gt;&lt;strong&gt;Tizen&lt;/strong&gt;: ОС, разработанная Linux Foundation и поддерживаемая Samsung, для использования во всем, от смарт-часов и телевизоров до смартфонов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;D7Hg&quot;&gt;Types of Operating Systems&lt;/p&gt;
  &lt;ul id=&quot;w1pt&quot;&gt;
    &lt;li id=&quot;viNp&quot;&gt;&lt;strong&gt;Batch Operating System: &lt;/strong&gt;A &lt;a href=&quot;https://www.geeksforgeeks.org/batch-processing-operating-system/&quot; target=&quot;_blank&quot;&gt;Batch Operating System&lt;/a&gt; is a type of operating system that does not interact with the computer directly. There is an operator who takes similar jobs having the same requirements and groups them into batches.&lt;/li&gt;
    &lt;li id=&quot;0tnW&quot;&gt;&lt;strong&gt;Time-sharing Operating System: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/time-sharing-operating-system/&quot; target=&quot;_blank&quot;&gt;Time-sharing Operating System&lt;/a&gt; is a type of operating system that allows many users to share computer resources (maximum utilization of the resources).&lt;/li&gt;
    &lt;li id=&quot;8NZL&quot;&gt;&lt;strong&gt;Distributed Operating System: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/what-is-a-distributed-system/&quot; target=&quot;_blank&quot;&gt;Distributed Operating System&lt;/a&gt; is a type of operating system that manages a group of different computers and makes appear to be a single computer. These operating systems are designed to operate on a network of computers. They allow multiple users to access shared resources and communicate with each other over the network. Examples include Microsoft Windows Server and various distributions of Linux designed for servers.&lt;/li&gt;
    &lt;li id=&quot;GsT6&quot;&gt;&lt;strong&gt;Network Operating System: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/what-is-a-network-operating-system/&quot; target=&quot;_blank&quot;&gt;Network Operating System&lt;/a&gt; is a type of operating system that runs on a server and provides the capability to manage data, users, groups, security, applications, and other networking functions.&lt;/li&gt;
    &lt;li id=&quot;GvP6&quot;&gt;&lt;strong&gt;Real-time Operating System: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/real-time-operating-system-rtos/&quot; target=&quot;_blank&quot;&gt;Real-time Operating System&lt;/a&gt; is a type of operating system that serves a real-time system and the time interval required to process and respond to inputs is very small. These operating systems are designed to respond to events in real time. They are used in applications that require quick and deterministic responses, such as embedded systems, industrial control systems, and robotics.&lt;/li&gt;
    &lt;li id=&quot;Gq2M&quot;&gt;&lt;strong&gt;Multiprocessing Operating System: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/introduction-of-multiprocessor-and-multicomputer/&quot; target=&quot;_blank&quot;&gt;Multiprocessor Operating Systems&lt;/a&gt; are used in operating systems to boost the performance of multiple CPUs within a single computer system. Multiple CPUs are linked together so that a job can be divided and executed more quickly.&lt;/li&gt;
    &lt;li id=&quot;hqX0&quot;&gt;&lt;strong&gt;Single-User Operating Systems:&lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/single-user-operating-system/&quot; target=&quot;_blank&quot;&gt; Single-User Operating Systems&lt;/a&gt; are designed to support a single user at a time. Examples include Microsoft Windows for personal computers and Apple macOS.&lt;/li&gt;
    &lt;li id=&quot;Ib6d&quot;&gt;&lt;strong&gt;Multi-User Operating Systems: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/multi-user-operating-system/&quot; target=&quot;_blank&quot;&gt;Multi-User Operating Systems&lt;/a&gt; are designed to support multiple users simultaneously. Examples include Linux and Unix.&lt;/li&gt;
    &lt;li id=&quot;z75A&quot;&gt;&lt;strong&gt;Embedded Operating Systems: &lt;/strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/embedded-real-time-system/&quot; target=&quot;_blank&quot;&gt;Embedded Operating Systems&lt;/a&gt;are designed to run on devices with limited resources, such as smartphones, wearable devices, and household appliances. Examples include Google’s Android and Apple’s iOS.&lt;/li&gt;
    &lt;li id=&quot;fgsT&quot;&gt;&lt;strong&gt;Cluster Operating Systems:&lt;/strong&gt; Cluster Operating Systems are designed to run on a group of computers, or a cluster, to work together as a single system. They are used for high-performance computing and for applications that require high availability and reliability. Examples include Rocks Cluster Distribution and OpenMPI.&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>shmarou:VNHjLRA-hxZ</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/VNHjLRA-hxZ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>SQL</title><published>2023-12-26T18:05:37.217Z</published><updated>2024-01-02T16:05:18.154Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a6/f0/a6f0ac25-3289-4cb8-baa3-0793e635c608.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/8b/c5/8bc5ce72-db2b-44a6-98ce-f62e2fdf4c26.png&quot;&gt;Оглавление</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;luis&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/content&quot; target=&quot;_blank&quot;&gt;Оглавление&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;ol id=&quot;5YKT&quot;&gt;
    &lt;li id=&quot;oGuQ&quot;&gt;Основные понятия реляционных баз данных&lt;/li&gt;
    &lt;li id=&quot;FJp6&quot;&gt;&lt;a href=&quot;#vsAr&quot;&gt;Отношение, реляционная модель&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;uOYX&quot;&gt;&lt;a href=&quot;#y0WF&quot;&gt;Создание таблицы&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;7Xue&quot;&gt;&lt;a href=&quot;#K63i&quot;&gt;Вставка записи в таблицу&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;hsgJ&quot;&gt;&lt;a href=&quot;#jF6I&quot;&gt;Выборка данных, вычисляемые столбцы, математические функции IF&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;425W&quot;&gt;&lt;a href=&quot;#Q6Zh&quot;&gt;Выборка данных, операторы BETWEEN, IN&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;XA9O&quot;&gt;&lt;a href=&quot;#HVc3&quot;&gt;Выборка данных с сортировкой ORDER BY&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;34gn&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/VNHjLRA-hxZ#jsXx&quot; target=&quot;_blank&quot;&gt;Выборка данных, оператор LIKE&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;46W2&quot;&gt;&lt;a href=&quot;#zDK1&quot;&gt;Выбор уникальных элементов столбца DISTINCT и GROUP BY&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;6M2D&quot;&gt;&lt;a href=&quot;#9hSD&quot;&gt;Выборка данных, групповые функции SUM и COUNT&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;uWk4&quot;&gt;&lt;a href=&quot;#dkUn&quot;&gt;Выборка данных, групповые функции MIN, MAX и AVG&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;TMaO&quot;&gt;&lt;a href=&quot;#2IyX&quot;&gt;Вычисления по таблице целиком&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;9FHD&quot;&gt;&lt;a href=&quot;#AIfn&quot;&gt;Выборка данных по условию, групповые функции&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;nhI8&quot;&gt;&lt;a href=&quot;#7kIn&quot;&gt;Выборка данных по условию, групповые функции, WHERE и HAVING&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;blockquote id=&quot;XQ4b&quot;&gt;&lt;/blockquote&gt;
  &lt;h2 id=&quot;ZRhr&quot;&gt;Основные понятия реляционных баз данных&lt;/h2&gt;
  &lt;p id=&quot;PlEM&quot;&gt;Реляционная модель была разработана в конце 1960-х годов Е.Ф.Коддом . Она определяет способ представления данных (структуру данных), методы защиты данных (целостность данных), и операции, которые можно выполнять с данными (манипулирование данными). Эта модель лежит в основе всех реляционных баз данных до настоящего времени.&lt;/p&gt;
  &lt;p id=&quot;nWLc&quot;&gt;&lt;strong&gt;Основные принципы реляционных баз данных:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;3s6a&quot;&gt;
    &lt;li id=&quot;tCYs&quot;&gt;все данные на концептуальном уровне представляются в виде объектов, заданных в виде строк и столбцов, называемых отношением, более распространенное название – таблица;&lt;/li&gt;
    &lt;li id=&quot;JjHa&quot;&gt;в пересечение строки и столбца таблицы можно занести только одно значение;&lt;/li&gt;
    &lt;li id=&quot;avkG&quot;&gt;все операции выполняются над целыми отношениями и результатом этих операций является отношение.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;T3PO&quot;&gt;Пример отношения:&lt;/p&gt;
  &lt;figure id=&quot;MjEx&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8b/c5/8bc5ce72-db2b-44a6-98ce-f62e2fdf4c26.png&quot; width=&quot;663&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0NCV&quot;&gt;На примере таблицы &lt;strong&gt;Сотрудник&lt;/strong&gt; рассмотрим &lt;strong&gt;терминологию реляционных баз данных:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;SqtH&quot;&gt;
    &lt;li id=&quot;yif7&quot;&gt;&lt;em&gt;&lt;strong&gt;отношение&lt;/strong&gt;&lt;/em&gt; – это структура данных целиком, набор записей (в обычном понимании – таблица) , в примере –это &lt;code&gt;&lt;strong&gt;Сотрудник&lt;/strong&gt;&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;nB3O&quot;&gt;&lt;em&gt;&lt;strong&gt;кортеж&lt;/strong&gt; &lt;/em&gt;– это каждая строка , содержащая данные (более распространенный термин – запись ), например, &amp;lt;00&lt;em&gt;1, Борин С.А, 234-01-23, программист&lt;/em&gt;&amp;gt;, все кортежи в отношении должны быть различны;&lt;/li&gt;
    &lt;li id=&quot;AeKj&quot;&gt;&lt;em&gt;&lt;strong&gt;мощность&lt;/strong&gt; &lt;/em&gt;– число кортежей в таблице (проще говоря, число записей), в данном случае 3, мощность отношения может быть любой (от 0 до бесконечности), порядок следования кортежей - неважен;&lt;/li&gt;
    &lt;li id=&quot;oqkV&quot;&gt;&lt;em&gt;&lt;strong&gt;атрибут&lt;/strong&gt;&lt;/em&gt; – это столбец в таблице (более распространенный термин – поле ), в примере – &lt;code&gt;&lt;strong&gt;Табельный номер, Фамилия И.О., Телефон, Должность&lt;/strong&gt;&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;JspH&quot;&gt;&lt;em&gt;&lt;strong&gt;размерность&lt;/strong&gt;&lt;/em&gt; – это число атрибутов в таблице, в данном случае – 4;&lt;/li&gt;
    &lt;li id=&quot;PnCx&quot;&gt;размерность отношения должна быть больше 0, порядок следования атрибутов существенен;&lt;/li&gt;
    &lt;li id=&quot;2jYC&quot;&gt;&lt;em&gt; &lt;strong&gt;домен атрибута&lt;/strong&gt; &lt;/em&gt;– это допустимые значения (неповторяющиеся), которые можно занести в поле , например для атрибута &lt;code&gt;&lt;strong&gt;Должность&lt;/strong&gt;&lt;/code&gt; домен – {инженер, программист}.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;vsAr&quot;&gt;Отношение, реляционная модель&lt;/h2&gt;
  &lt;p id=&quot;FIXb&quot;&gt;База данных, в том числе и реляционная, используется для формального описания некоторой предметной области реального мира, например, склада, учебного процесса и пр. Обязательным этапом перед созданием базы данных является ее проектирование (этот процесс разбирается в следующих модулях).&lt;/p&gt;
  &lt;p id=&quot;idbW&quot;&gt;В первом модуле будем рассматривать простейшие предметные области, информацию о которых можно описать в виде одной таблицы. Каждая такая таблица ассоциируется с неким информационным объектом или событием реального мира – человеком, документом, посещением и т.д.&lt;/p&gt;
  &lt;p id=&quot;4ujw&quot;&gt;&lt;strong&gt;Пример.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;GFH7&quot;&gt;Рассмотрим некоторый склад, на котором хранятся книги. Известно название книги, ее автор, количество экземпляров на складе и ее цена.&lt;/p&gt;
  &lt;p id=&quot;UHDK&quot;&gt;Всю эту информацию можно представить в виде таблицы, состоящей из 4 столбцов (приведено только 4 записи, на самом деле их значительно больше):&lt;/p&gt;
  &lt;figure id=&quot;zxv6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2e/42/2e428877-4bd1-46f8-b33e-6d754d186c5c.png&quot; width=&quot;545&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uHqO&quot;&gt;Перед созданием таблицы в базе данных необходимо описать ее структуру. Для этого выполняется следующая последовательность шагов:&lt;/p&gt;
  &lt;p id=&quot;NrxS&quot;&gt;1. Дать таблице имя, пусть она будет называться &lt;code&gt;&lt;strong&gt;book&lt;/strong&gt;&lt;/code&gt;, вот некоторые &lt;em&gt;&lt;strong&gt;правила для выбора имен таблиц&lt;/strong&gt;&lt;/em&gt;:&lt;/p&gt;
  &lt;ul id=&quot;6f6o&quot;&gt;
    &lt;li id=&quot;MSv9&quot;&gt;может включать английские буквы, цифры и знак подчеркивания, должно начинаться с буквы;&lt;/li&gt;
    &lt;li id=&quot;2hpx&quot;&gt;имя должно быть уникальным в пределах базы данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;C460&quot;&gt;Также &lt;strong&gt;рекомендуется&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;abms&quot;&gt;
    &lt;li id=&quot;46QK&quot;&gt;чтобы имя было существительным в единственном числе;&lt;/li&gt;
    &lt;li id=&quot;stRI&quot;&gt;имя должно быть понятным и соответствовать тому объекту, который оно описывает;&lt;/li&gt;
    &lt;li id=&quot;GuFL&quot;&gt;имя должно быть как можно короче, максимум до 10 символов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;w4av&quot;&gt;&lt;strong&gt;Важно.&lt;/strong&gt; Имена таблиц являются регистрозависимыми из-за операционной системы на которой работает &lt;strong&gt;stepik&lt;/strong&gt;, то есть имя &lt;code&gt;&lt;strong&gt;book&lt;/strong&gt;&lt;/code&gt; и &lt;code&gt;&lt;strong&gt;Book&lt;/strong&gt;&lt;/code&gt; – разные имена. Рекомендуется для записи имен таблиц использовать только строчные (маленькие) буквы.&lt;/p&gt;
  &lt;p id=&quot;dfBW&quot;&gt;2. Определить структуру таблицы, из каких атрибутов(столбцов, полей) она будет состоять, в нашем случае это:&lt;/p&gt;
  &lt;ul id=&quot;fLL0&quot;&gt;
    &lt;li id=&quot;WqNy&quot;&gt;&lt;strong&gt;&lt;code&gt;title&lt;/code&gt;&lt;/strong&gt; – поле для хранения названия книги;&lt;/li&gt;
    &lt;li id=&quot;hCVj&quot;&gt;&lt;code&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/code&gt; – поле с фамилией автора книги ;&lt;/li&gt;
    &lt;li id=&quot;FOnp&quot;&gt;&lt;code&gt;&lt;strong&gt;priсe&lt;/strong&gt;&lt;/code&gt; – цена книги;&lt;/li&gt;
    &lt;li id=&quot;0JTb&quot;&gt;&lt;code&gt;&lt;strong&gt;amount&lt;/strong&gt;&lt;/code&gt; – количество книг.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fny9&quot;&gt;&lt;strong&gt;&lt;em&gt;Правила по выбору имени поля информационного объекта:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;wkKG&quot;&gt;
    &lt;li id=&quot;WsWG&quot;&gt;может включать английские буквы, цифры и знак подчеркивания, должно начинаться с буквы;&lt;/li&gt;
    &lt;li id=&quot;fkjv&quot;&gt;имя поля должно быть уникальным в пределах таблицы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;yeuC&quot;&gt;&lt;strong&gt;&lt;em&gt;Рекомендации по выбору имени поля информационного объекта:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;YcTB&quot;&gt;
    &lt;li id=&quot;SD9e&quot;&gt;имя должно быть понятным и соответствовать тем данным, которые хранятся в поле;&lt;/li&gt;
    &lt;li id=&quot;ph1g&quot;&gt;имя может состоять из нескольких слов, тогда слова разделяются подчеркиванием, после подчеркивания слово пишется с маленькой буквы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;rIjK&quot;&gt;3. Включить ключевое поле &lt;code&gt;&lt;strong&gt;book_id&lt;/strong&gt;,&lt;/code&gt; которое является ОБЯЗАТЕЛЬНЫМ ЭЛЕМЕНТОМ каждой реляционной таблицы. Ключевое поле является уникальным для каждой записи, однозначно определяет запись и в дальнейшем будет использоваться для связей с другими таблицами.&lt;/p&gt;
  &lt;p id=&quot;kkFq&quot;&gt;&lt;strong&gt;&lt;em&gt;Рекомендации по именованию ключевых полей:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;eABa&quot;&gt;
    &lt;li id=&quot;S51y&quot;&gt;имя должно состоять из двух частей: начинаться с названия таблицы, которой поле принадлежит, затем через подчеркивание необходимо указать &lt;code&gt;&lt;strong&gt;id.&lt;/strong&gt;&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;UJPl&quot;&gt;Таким образом, наша таблица&lt;code&gt;&lt;strong&gt;book&lt;/strong&gt;&lt;/code&gt;будет выглядеть следующим образом:&lt;/p&gt;
  &lt;figure id=&quot;agSo&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f1/5f/f15fe905-a140-438d-8d33-735e723fddf2.png&quot; width=&quot;565&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;y0WF&quot;&gt;Создание таблицы&lt;/h2&gt;
  &lt;p id=&quot;65rM&quot;&gt;Для создания таблицы используется SQL-запрос. В нем указывается какая таблица создается, из каких атрибутов(полей) она состоит и какой тип данных имеет каждое поле, при необходимости указывается описание полей (ключевое поле и т.д.). Его структура :&lt;/p&gt;
  &lt;ul id=&quot;yPzt&quot;&gt;
    &lt;li id=&quot;3GlG&quot;&gt;ключевые слова : &lt;code&gt;CREATE TABLE&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;UX7Q&quot;&gt;имя создаваемой таблицы;&lt;/li&gt;
    &lt;li id=&quot;OPMG&quot;&gt;открывающая круглая скобка «(»;&lt;/li&gt;
    &lt;li id=&quot;bFoW&quot;&gt;название поля и его описание, которое включает тип поля и другие необязательные характеристики;&lt;/li&gt;
    &lt;li id=&quot;r7it&quot;&gt;запятая;&lt;/li&gt;
    &lt;li id=&quot;Bs31&quot;&gt;название поля и его описание;&lt;/li&gt;
    &lt;li id=&quot;UW5l&quot;&gt;...&lt;/li&gt;
    &lt;li id=&quot;EeOJ&quot;&gt;закрывающая скобка «)».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;UZWs&quot;&gt;&lt;strong&gt;Пример. &lt;/strong&gt;Создадим таблицу &lt;code&gt;&lt;strong&gt;genre&lt;/strong&gt;&lt;/code&gt; следующей структуры:&lt;/p&gt;
  &lt;figure id=&quot;Vt8o&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5e/97/5e979af4-96d4-4270-90db-3663806b91a7.png&quot; width=&quot;1039&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;O60k&quot;&gt;Созданная таблица - пустая.&lt;/p&gt;
  &lt;p id=&quot;FhZd&quot;&gt;&lt;em&gt;&lt;strong&gt;Рекомендации по записи SQL запроса&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;Y1Hr&quot;&gt;
    &lt;li id=&quot;BMvI&quot;&gt;Ключевые слова: SQL не является регистрозависимым языком (CREATE и &lt;code&gt;create&lt;/code&gt; - одно и тоже ключевое слово).&lt;/li&gt;
    &lt;li id=&quot;oQwU&quot;&gt;Ключевые слова SQL и типы данных рекомендуется записывать прописными (большими) буквами.&lt;/li&gt;
    &lt;li id=&quot;9WdW&quot;&gt;Имена таблиц и полей - строчными (маленькими) буквами.&lt;/li&gt;
    &lt;li id=&quot;WGfO&quot;&gt;SQL-запрос можно писать на нескольких строках.&lt;/li&gt;
    &lt;li id=&quot;1GeC&quot;&gt;В конце SQL-запроса ставится точка с запятой (хотя если Вы пишете один запрос, это необязательно).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;K63i&quot;&gt;Вставка записи в таблицу&lt;/h2&gt;
  &lt;p id=&quot;A8oz&quot;&gt;Для занесения новой записи в таблицу используется SQL запрос, в котором указывается в какую таблицу, в какие поля заносить новые значения. Структура запроса:&lt;/p&gt;
  &lt;ul id=&quot;L9eq&quot;&gt;
    &lt;li id=&quot;DHOS&quot;&gt;ключевые слова &lt;code&gt;INSERT INTO&lt;/code&gt; (ключевое слово &lt;code&gt;INTO &lt;/code&gt;можно пропустить);&lt;/li&gt;
    &lt;li id=&quot;tOGM&quot;&gt;имя таблицы, в которую добавляется запись;&lt;/li&gt;
    &lt;li id=&quot;QXFD&quot;&gt;открывающая круглая скобка «(»;&lt;/li&gt;
    &lt;li id=&quot;VpYJ&quot;&gt;список полей через запятую, в которые следует занести новые данные;&lt;/li&gt;
    &lt;li id=&quot;Rc7M&quot;&gt;закрывающая скобка «)»;&lt;/li&gt;
    &lt;li id=&quot;yi2B&quot;&gt;ключевое слово &lt;code&gt;VALUES&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;icTm&quot;&gt;открывающая круглая скобка «(»;&lt;/li&gt;
    &lt;li id=&quot;tdLV&quot;&gt;список значений через запятую, которые заносятся в соответствующие поля, при этом текстовые значения заключаются в кавычки, числовые значения записываются без кавычек, в качестве разделителя целой и дробной части используется точка;&lt;/li&gt;
    &lt;li id=&quot;cgxy&quot;&gt;закрывающая скобка «)».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;f7qo&quot;&gt;&lt;strong&gt;Пример.&lt;/strong&gt; В &lt;code&gt;&lt;strong&gt;таблицу&lt;/strong&gt;&lt;/code&gt;, состоящую из двух столбцов добавим новую строку, при этом в &lt;code&gt;&lt;strong&gt;поле1&lt;/strong&gt;&lt;/code&gt; заносится&lt;code&gt;&lt;strong&gt; значение1&lt;/strong&gt;&lt;/code&gt;, в &lt;code&gt;&lt;strong&gt;поле2&lt;/strong&gt;&lt;/code&gt; - &lt;code&gt;&lt;strong&gt;значение2&lt;/strong&gt;&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;yXqT&quot; data-lang=&quot;sql&quot;&gt;INSERT INTO таблица(поле1, поле2) 
VALUES (значение1, значение2);&lt;/pre&gt;
  &lt;p id=&quot;lYwU&quot;&gt;В результате выполнения запроса новая запись заносится в конец обновляемой таблицы.&lt;/p&gt;
  &lt;p id=&quot;cFlV&quot;&gt;При составлении списка полей и списка значений необходимо учитывать следующее:&lt;/p&gt;
  &lt;ol id=&quot;kmcG&quot;&gt;
    &lt;li id=&quot;1pLN&quot;&gt;количество полей и количество значений в списках должны совпадать;&lt;/li&gt;
    &lt;li id=&quot;G71o&quot;&gt;должно существовать прямое соответствие между позицией одного и того же элемента в обоих списках, поэтому первый элемент списка значений должен относиться к первому столбцу в списке столбцов, второй – ко второму столбцу и т.д.;&lt;/li&gt;
    &lt;li id=&quot;6Fen&quot;&gt;типы данных элементов в списке значений должны быть совместимы с типами данных соответствующих столбцов таблицы ( целое число можно занести в поле типа DECIMAL, обратная операция - недопустима);&lt;/li&gt;
    &lt;li id=&quot;DX91&quot;&gt;новые значения нельзя добавлять в поля, описанные как &lt;code&gt;PRIMARY KEY AUTO_INCREMENT&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;JlHI&quot;&gt;рекомендуется заполнять все поля записи, если же поле пропущено, значение этого поля зависит от установленных по умолчанию значений, если значения не установлены - на данной платформе вставляется пустое значение (&lt;code&gt;&lt;strong&gt;NULL&lt;/strong&gt;&lt;/code&gt;).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;8cEi&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;SCvS&quot;&gt;Вставим новую запись в таблицу &lt;code&gt;&lt;strong&gt;genre&lt;/strong&gt;&lt;/code&gt;, созданную на предыдущем шаге ( в первых двух строках показана структура таблицы, далее - ее содержимое):&lt;/p&gt;
  &lt;figure id=&quot;wqLZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/98/bc/98bc760a-5d64-48ca-b3a0-3333a4833668.png&quot; width=&quot;346&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ccjZ&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;EBpT&quot; data-lang=&quot;sql&quot;&gt;INSERT INTO genre (name_genre) VALUES (&amp;#x27;Роман&amp;#x27;);&lt;/pre&gt;
  &lt;h2 id=&quot;aWCW&quot;&gt;Задание&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;rUWb&quot;&gt;Занесите новую строку в таблицу&lt;strong&gt;&lt;code&gt; book&lt;/code&gt;&lt;/strong&gt; (текстовые значения (тип &lt;code&gt;&lt;strong&gt;VARCHAR&lt;/strong&gt;&lt;/code&gt;) заключать либо в двойные, либо в одинарные кавычки):&lt;br /&gt;&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;p id=&quot;q55L&quot;&gt;Решение:&lt;/p&gt;
  &lt;pre id=&quot;I7Sm&quot; data-lang=&quot;sql&quot;&gt;INSERT book (title,author,price,amount)
VALUES (&amp;#x27;Мастер и Маргарита&amp;#x27;, &amp;#x27;Булгаков М.А.&amp;#x27;, 670.99,3);
SELECT * from book&lt;/pre&gt;
  &lt;figure id=&quot;6tip&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/5f/ab5f0290-1a63-4f42-96a7-b57983599da4.png&quot; width=&quot;602&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;P4SX&quot;&gt;Решение для нескольких строк:&lt;/p&gt;
  &lt;pre id=&quot;k8GP&quot; data-lang=&quot;sql&quot;&gt;INSERT book (title, author, price, amount)
VALUES (&amp;#x27;Белая гвардия&amp;#x27;, &amp;#x27;Булгаков М.А.&amp;#x27;,540.50,5);
INSERT book (title, author, price, amount)
VALUES (&amp;#x27;Идиот&amp;#x27;, &amp;#x27;Достоевский Ф.М.&amp;#x27;, 460.00,10);
INSERT book (title, author, price, amount)
VALUES(&amp;#x27;Братья Карамазовы&amp;#x27;, &amp;#x27;Достоевский Ф.М.&amp;#x27;,799.01,2);
&lt;/pre&gt;
  &lt;figure id=&quot;aGX4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d3/17/d317bdc2-847b-4f2e-ade0-9951a6e6c300.png&quot; width=&quot;568&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;jF6I&quot;&gt;Выборка данных, вычисляемые столбцы, математические функции IF&lt;/h2&gt;
  &lt;figure id=&quot;ABRt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/eb/c1eb5c95-b3b2-497b-a1c4-4e5172065837.png&quot; width=&quot;838&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CI4m&quot;&gt;В SQL реализована возможность заносить в поле значение в зависимости от условия. Для этого используется функция &lt;code&gt;IF()&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;0pWg&quot; data-lang=&quot;sql&quot;&gt;IF(логическое_выражение, выражение_1, выражение_2)&lt;/pre&gt;
  &lt;p id=&quot;TiFu&quot;&gt;Функция вычисляет &lt;code&gt;логическое_выражение,&lt;/code&gt; если оно истина – в поле заносится значение &lt;code&gt;выражения_1&lt;/code&gt;, в противном случае – значение &lt;code&gt;выражения_2. &lt;/code&gt;Все три параметра &lt;code&gt;IF() &lt;/code&gt;являются обязательными.&lt;/p&gt;
  &lt;p id=&quot;V3E9&quot;&gt;Допускается использование вложенных функций, вместо &lt;code&gt;выражения_1&lt;/code&gt; или &lt;code&gt;выражения_2&lt;/code&gt; может стоять новая функция &lt;code&gt;&lt;strong&gt;IF&lt;/strong&gt;&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;dYxc&quot;&gt;&lt;strong&gt;Пример &lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;bBRJ&quot;&gt;Для каждой книги из таблицы &lt;code&gt;&lt;strong&gt;book&lt;/strong&gt;&lt;/code&gt; установим скидку следующим образом: если количество книг меньше 4, то скидка будет составлять 50% от цены, в противном случае 30%.&lt;/p&gt;
  &lt;p id=&quot;upuU&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;B9sD&quot; data-lang=&quot;sql&quot;&gt;SELECT title, amount, price, 
    IF(amount&amp;lt;4, price*0.5, price*0.7) AS sale
FROM book;&lt;/pre&gt;
  &lt;p id=&quot;YKsi&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;t9VQ&quot; data-lang=&quot;sql&quot;&gt;+-----------------------+--------+--------+---------+
| title                 | amount | price  | sale    |
+-----------------------+--------+--------+---------+
| Мастер и Маргарита    | 3      | 670.99 | 335.495 |
| Белая гвардия         | 5      | 540.50 | 378.350 |
| Идиот                 | 10     | 460.00 | 322.000 |
| Братья Карамазовы     | 2      | 799.01 | 399.505 |
| Стихотворения и поэмы | 15     | 650.00 | 455.000 |
+-----------------------+--------+--------+---------+&lt;/pre&gt;
  &lt;p id=&quot;Fa1Z&quot;&gt;Цена по скидке должна отображаться с двумя знаками после запятой, добавим в запрос округление:&lt;/p&gt;
  &lt;pre id=&quot;7Gts&quot; data-lang=&quot;sql&quot;&gt;SELECT title, amount, price, 
    ROUND(IF(amount&amp;lt;4, price*0.5, price*0.7),2) AS sale
FROM book;&lt;/pre&gt;
  &lt;p id=&quot;kXZX&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;URNT&quot; data-lang=&quot;sql&quot;&gt;+-----------------------+--------+--------+--------+
| title                 | amount | price  | sale   |
+-----------------------+--------+--------+--------+
| Мастер и Маргарита    | 3      | 670.99 | 335.50 |
| Белая гвардия         | 5      | 540.50 | 378.35 |
| Идиот                 | 10     | 460.00 | 322.00 |
| Братья Карамазовы     | 2      | 799.01 | 399.51 |
| Стихотворения и поэмы | 15     | 650.00 | 455.00 |
+-----------------------+--------+--------+--------+&lt;/pre&gt;
  &lt;p id=&quot;VF3G&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Z1yz&quot;&gt;Усложним вычисление скидки в зависимости от количества книг. Если количество книг меньше 4 – то скидка 50%, меньше 11 – 30%, в остальных случаях – 10%. И еще укажем какая именно скидка на каждую книгу.&lt;/p&gt;
  &lt;p id=&quot;Pwh0&quot;&gt;Запрос:&lt;/p&gt;
  &lt;pre id=&quot;zuhv&quot; data-lang=&quot;sql&quot;&gt;SELECT title, amount, price,
    ROUND(IF(amount &amp;lt; 4, price * 0.5, IF(amount &amp;lt; 11, price * 0.7, price * 0.9)), 2) AS sale,
    IF(amount &amp;lt; 4, &amp;#x27;скидка 50%&amp;#x27;, IF(amount &amp;lt; 11, &amp;#x27;скидка 30%&amp;#x27;, &amp;#x27;скидка 10%&amp;#x27;)) AS Ваша_скидка
FROM book;&lt;/pre&gt;
  &lt;p id=&quot;sG2S&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;e9hR&quot; data-lang=&quot;sql&quot;&gt;+-----------------------+--------+--------+--------+-------------+
| title                 | amount | price  | sale   | Ваша_скидка |
+-----------------------+--------+--------+--------+-------------+
| Мастер и Маргарита    | 3      | 670.99 | 335.50 | скидка 50%  |
| Белая гвардия         | 5      | 540.50 | 378.35 | скидка 30%  |
| Идиот                 | 10     | 460.00 | 322.00 | скидка 30%  |
| Братья Карамазовы     | 2      | 799.01 | 399.51 | скидка 50%  |
| Стихотворения и поэмы | 15     | 650.00 | 585.00 | скидка 10%  |
+-----------------------+--------+--------+--------+-------------+&lt;/pre&gt;
  &lt;h2 id=&quot;JJGT&quot;&gt;&lt;strong&gt;Задание&lt;/strong&gt;&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;Tcn8&quot;&gt;При анализе продаж книг выяснилось, что наибольшей популярностью пользуются книги Михаила Булгакова, на втором месте книги Сергея Есенина. Исходя из этого решили поднять цену книг Булгакова на 10%, а цену книг Есенина - на 5%. Написать запрос, куда включить автора, название книги и новую цену, последний столбец назвать &lt;code&gt;&lt;strong&gt;new_price&lt;/strong&gt;&lt;/code&gt;. Значение округлить до двух знаков после запятой.&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;p id=&quot;VQI9&quot;&gt;Исходная таблица:&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;WTWk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a7/37/a7373dce-8b25-4e3d-b3b3-0816f5c8d4c2.png&quot; width=&quot;516&quot; /&gt;
  &lt;/figure&gt;
  &lt;pre id=&quot;xYcI&quot; data-lang=&quot;sql&quot;&gt;Решение:
SELECT
    author,
    title,
    CASE
        WHEN author = &amp;#x27;Булгаков М.А.&amp;#x27; THEN ROUND(price * 1.10, 2)
        WHEN author = &amp;#x27;Есенин С.А.&amp;#x27; THEN ROUND(price * 1.05, 2)
        ELSE price
    END AS new_price
FROM
    book;&lt;/pre&gt;
  &lt;p id=&quot;7838&quot;&gt;Результат:&lt;/p&gt;
  &lt;figure id=&quot;boP0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/42/d242d676-9b8e-4a82-8ba8-30e66faf9154.png&quot; width=&quot;462&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Q6Zh&quot;&gt;Выборка данных, операторы BETWEEN, IN&lt;/h2&gt;
  &lt;p id=&quot;IW3c&quot;&gt;Логическое выражение после ключевого слова &lt;code&gt;WHERE&lt;/code&gt; может включать операторы &lt;strong&gt;&lt;code&gt;BETWEEN&lt;/code&gt;&lt;/strong&gt; и &lt;strong&gt;&lt;code&gt;IN&lt;/code&gt;&lt;/strong&gt;. Приоритет у этих операторов такой же как у операторов сравнения, то есть они выполняются раньше, чем &lt;code&gt;&lt;strong&gt;NOT&lt;/strong&gt;&lt;/code&gt;, &lt;code&gt;&lt;strong&gt;AND&lt;/strong&gt;,&lt;/code&gt; &lt;code&gt;&lt;strong&gt;OR&lt;/strong&gt;&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;YrxO&quot;&gt;Оператор &lt;code&gt;BETWEEN&lt;/code&gt; позволяет отобрать данные, относящиеся к некоторому интервалу, включая его границы.&lt;/p&gt;
  &lt;p id=&quot;YvX4&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;uOB5&quot;&gt;Выбрать названия и количества тех книг, количество которых от 5 до 14 включительно.&lt;/p&gt;
  &lt;p id=&quot;EoP0&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;S8TX&quot; data-lang=&quot;sql&quot;&gt;SELECT title, amount 
FROM book
WHERE amount BETWEEN 5 AND 14;&lt;/pre&gt;
  &lt;p id=&quot;Pptg&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;DPmb&quot; data-lang=&quot;sql&quot;&gt;+---------------+--------+
| title         | amount |
+---------------+--------+
| Белая гвардия | 5      |
| Идиот         | 10     |
+---------------+--------+&lt;/pre&gt;
  &lt;p id=&quot;Ddj4&quot;&gt;Этот запрос можно реализовать по-другому, результат будет точно такой же.&lt;/p&gt;
  &lt;pre id=&quot;kZDY&quot; data-lang=&quot;sql&quot;&gt;SELECT title, amount 
FROM book
WHERE amount &amp;gt;= 5 AND amount &amp;lt;=14;&lt;/pre&gt;
  &lt;p id=&quot;qVzp&quot;&gt;Оператор &lt;code&gt;IN&lt;/code&gt; позволяет выбрать данные, соответствующие значениям из списка.&lt;/p&gt;
  &lt;p id=&quot;Qi04&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Vus8&quot;&gt;Выбрать названия и цены книг, написанных Булгаковым или Достоевским.&lt;/p&gt;
  &lt;p id=&quot;U0F9&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;BoGh&quot; data-lang=&quot;sql&quot;&gt;SELECT title, price 
FROM book
WHERE author IN (&amp;#x27;Булгаков М.А.&amp;#x27;, &amp;#x27;Достоевский Ф.М.&amp;#x27;);&lt;/pre&gt;
  &lt;p id=&quot;uHKT&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;Yxhg&quot; data-lang=&quot;sql&quot;&gt;+--------------------+--------+
| title              | price  |
+--------------------+--------+
| Мастер и Маргарита | 670.99 |
| Белая гвардия      | 540.50 |
| Идиот              | 460.00 |
| Братья Карамазовы  | 799.01 |
+--------------------+--------+&lt;/pre&gt;
  &lt;p id=&quot;iuEL&quot;&gt;Этот запрос можно реализовать по-другому, результат будет точно такой же.&lt;/p&gt;
  &lt;pre id=&quot;csFJ&quot; data-lang=&quot;sql&quot;&gt;SELECT title, price 
FROM book
WHERE author = &amp;#x27;Булгаков М.А.&amp;#x27; OR author = &amp;#x27;Достоевский Ф.М.&amp;#x27;;&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;HVc3&quot;&gt;Выборка данных с сортировкой ORDER BY&lt;/h2&gt;
  &lt;p id=&quot;jo2v&quot;&gt;При выборке можно указывать столбец или несколько столбцов, по которым необходимо отсортировать отобранные строки. Для этого используются ключевые слова &lt;code&gt;ORDER BY&lt;/code&gt;, после которых задаются имена столбцов. При этом строки сортируются по первому столбцу, если указан второй столбец, сортировка осуществляется только для тех строк, у которых значения первого столбца одинаковы. По умолчанию &lt;code&gt;ORDER BY&lt;/code&gt; выполняет сортировку по возрастанию. Чтобы управлять направлением сортировки вручную, после имени столбца указывается ключевое слово &lt;code&gt;ASC&lt;/code&gt; (по возрастанию) или &lt;code&gt;DESC&lt;/code&gt; (по убыванию).&lt;/p&gt;
  &lt;p id=&quot;GeCZ&quot;&gt;Столбцы после ключевого слова &lt;code&gt;ORDER BY&lt;/code&gt; можно задавать:&lt;/p&gt;
  &lt;ul id=&quot;HHMR&quot;&gt;
    &lt;li id=&quot;yBHt&quot;&gt;названием столбца;&lt;/li&gt;
    &lt;li id=&quot;fwDs&quot;&gt;номером столбца;&lt;/li&gt;
    &lt;li id=&quot;5iv5&quot;&gt;именем столбца (указанным после &lt;code&gt;AS&lt;/code&gt;).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Dofz&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;UKFd&quot;&gt;Вывести название, автора и цены книг. Информацию отсортировать по названиям книг в алфавитном порядке.&lt;/p&gt;
  &lt;p id=&quot;gjSh&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;3WoX&quot; data-lang=&quot;sql&quot;&gt;SELECT title, author, price
FROM book
ORDER BY title;&lt;/pre&gt;
  &lt;p id=&quot;7tNY&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;oJSB&quot; data-lang=&quot;sql&quot;&gt;+-----------------------+------------------+--------+
| title                 | author           | price  |
+-----------------------+------------------+--------+
| Белая гвардия         | Булгаков М.А.    | 540.50 |
| Братья Карамазовы     | Достоевский Ф.М. | 799.01 |
| Идиот                 | Достоевский Ф.М. | 460.00 |
| Мастер и Маргарита    | Булгаков М.А.    | 670.99 |
| Стихотворения и поэмы | Есенин С.А.      | 650.00 |
+-----------------------+------------------+--------+&lt;/pre&gt;
  &lt;p id=&quot;xqua&quot;&gt;Аналогичный результат получится при использовании запроса:&lt;/p&gt;
  &lt;pre id=&quot;O4Iu&quot; data-lang=&quot;sql&quot;&gt;SELECT title, author, price
FROM book
ORDER BY 1;&lt;/pre&gt;
  &lt;p id=&quot;6x9K&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;R5nF&quot;&gt;Вывести автора, название и количество книг, в отсортированном в алфавитном порядке по автору и по убыванию количества, для тех книг, цены которых меньше 750 рублей.&lt;/p&gt;
  &lt;p id=&quot;hX5Y&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;agBX&quot; data-lang=&quot;sql&quot;&gt;SELECT author, title, amount AS Количество
FROM book
WHERE price &amp;lt; 750
ORDER BY author, amount DESC;&lt;/pre&gt;
  &lt;p id=&quot;xvAy&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;bFYL&quot; data-lang=&quot;sql&quot;&gt;+------------------+-----------------------+------------+
| author           | title                 | Количество |
+------------------+-----------------------+------------+
| Булгаков М.А.    | Белая гвардия         | 5          |
| Булгаков М.А.    | Мастер и Маргарита    | 3          |
| Достоевский Ф.М. | Идиот                 | 10         |
| Есенин С.А.      | Стихотворения и поэмы | 15         |
+------------------+-----------------------+------------+&lt;/pre&gt;
  &lt;p id=&quot;KN5h&quot;&gt;Можно использовать другие варианты записи запроса:&lt;/p&gt;
  &lt;pre id=&quot;pa5d&quot; data-lang=&quot;sql&quot;&gt;SELECT author, title, amount AS Количество
FROM book
WHERE price &amp;lt; 750
ORDER BY author, Количество DESC;&lt;/pre&gt;
  &lt;pre id=&quot;7lap&quot; data-lang=&quot;sql&quot;&gt;SELECT author, title, amount AS Количество
FROM book
WHERE price &amp;lt; 750
ORDER BY 1, 3 DESC;&lt;/pre&gt;
  &lt;p id=&quot;ptwE&quot;&gt;&lt;strong&gt;Важно! &lt;/strong&gt;Если названия столбцов заключены в кавычки, то при использовании их в сортировке, необходимо записывать их БЕЗ КАВЫЧЕК.&lt;/p&gt;
  &lt;h2 id=&quot;ryLS&quot;&gt;&lt;strong&gt;Задание&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;PJ3F&quot;&gt;Вывести автора и название книг, количество которых принадлежит интервалу от 2 до 14 (включая границы). Информацию отсортировать сначала по авторам (в обратном алфавитном порядке), а затем по названиям книг (по алфавиту).&lt;/p&gt;
  &lt;p id=&quot;3aWI&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;bw8P&quot; data-lang=&quot;sql&quot;&gt;+------------------+--------------------+
| author           | title              |
+------------------+--------------------+
| Достоевский Ф.М. | Братья Карамазовы  |
| Достоевский Ф.М. | Идиот              |
| Булгаков М.А.    | Белая гвардия      |
| Булгаков М.А.    | Мастер и Маргарита |
+------------------+--------------------+&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;jsXx&quot;&gt;Выборка данных, оператор LIKE&lt;/h2&gt;
  &lt;p id=&quot;Lxbc&quot;&gt;Оператор &lt;code&gt;LIKE&lt;/code&gt; используется для сравнения строк. В отличие от операторов отношения равно (&lt;strong&gt;=&lt;/strong&gt;) и не равно (&lt;strong&gt;&amp;lt;&amp;gt;&lt;/strong&gt;), &lt;code&gt;LIKE&lt;/code&gt; позволяет сравнивать строки не на полное совпадение (не совпадение), а в соответствии с шаблоном. Шаблон может включать &lt;strong&gt;обычные символы&lt;/strong&gt; и &lt;strong&gt;символы-шаблоны&lt;/strong&gt;. При сравнении с шаблоном, его обычные символы должны в точности совпадать с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки.&lt;/p&gt;
  &lt;figure id=&quot;dH12&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a9/4c/a94c7fa7-3793-4775-9e10-ef588051b5ed.png&quot; width=&quot;1030&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BaOl&quot;&gt;&lt;strong&gt;Пример 1&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;S6ty&quot;&gt;Вывести названия книг, начинающихся с буквы «&lt;em&gt;Б&lt;/em&gt;».&lt;/p&gt;
  &lt;p id=&quot;BII3&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;3eU1&quot; data-lang=&quot;sql&quot;&gt;SELECT title 
FROM book
WHERE title LIKE &amp;#x27;Б%&amp;#x27;;
/* эквивалентное условие 
title LIKE &amp;#x27;б%&amp;#x27;
*/&lt;/pre&gt;
  &lt;p id=&quot;q4NG&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;Qs5u&quot; data-lang=&quot;sql&quot;&gt;+-------------------+
| title             |
+-------------------+
| Белая гвардия     |
| Братья Карамазовы |
+-------------------+&lt;/pre&gt;
  &lt;p id=&quot;nrSQ&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;0qDK&quot;&gt;&lt;strong&gt;Пример 2&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;rZcd&quot;&gt;Вывести название книг, состоящих ровно из 5 букв.&lt;/p&gt;
  &lt;p id=&quot;Frg9&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;b5Pb&quot; data-lang=&quot;sql&quot;&gt;SELECT title FROM book 
WHERE title LIKE &amp;quot;_____&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;Zj1M&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;caaJ&quot; data-lang=&quot;sql&quot;&gt;+-------+
| title |
+-------+
| Идиот |
| Поэмы |
+-------+&lt;/pre&gt;
  &lt;p id=&quot;QUbV&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;H220&quot;&gt;&lt;strong&gt;Пример 3&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;m00r&quot;&gt;Вывести книги, название которых длиннее 5 символов:&lt;/p&gt;
  &lt;p id=&quot;nu6Z&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;P901&quot; data-lang=&quot;sql&quot;&gt;SELECT title FROM book 
WHERE title LIKE &amp;quot;______%&amp;quot;;
/* эквивалентные условия 
title LIKE &amp;quot;%______&amp;quot;
title LIKE &amp;quot;%______%&amp;quot;
*/
&lt;/pre&gt;
  &lt;p id=&quot;zjrU&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;LHu9&quot; data-lang=&quot;sql&quot;&gt;+-----------------------+
| title                 |
+-----------------------+
| Мастер и Маргарита    |
| Белая гвардия         |
| Братья Карамазовы     |
| Стихотворения и поэмы |
| Дети полуночи         |
| Лирика                |
| Капитанская дочка     |
+-----------------------+&lt;/pre&gt;
  &lt;p id=&quot;01iJ&quot;&gt;&lt;strong&gt;Пояснение &lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;afHG&quot;&gt;&lt;strong&gt;Пример 4&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;35L7&quot;&gt;Вывести названия книг, которые содержат букву &lt;strong&gt;&amp;quot;и&amp;quot;&lt;/strong&gt; как отдельное слово, если считать, что слова в названии отделяются друг от друга пробелами и не содержат знаков препинания.&lt;/p&gt;
  &lt;p id=&quot;3pON&quot;&gt;&lt;em&gt; Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;YOX7&quot; data-lang=&quot;sql&quot;&gt;SELECT title FROM book 
WHERE   title LIKE &amp;quot;_% и _%&amp;quot; /*отбирает слово И внутри названия */
    OR title LIKE &amp;quot;и _%&amp;quot; /*отбирает слово И в начале названия */
    OR title LIKE &amp;quot;_% и&amp;quot; /*отбирает слово И в конце названия */
    OR title LIKE &amp;quot;и&amp;quot; /* отбирает название, состоящее из одного слова И */

&lt;/pre&gt;
  &lt;p id=&quot;aNSl&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;TAep&quot; data-lang=&quot;sql&quot;&gt;+-----------------------+
| title                 |
+-----------------------+
| Мастер и Маргарита    |
| Стихотворения и поэмы |
+-----------------------+&lt;/pre&gt;
  &lt;p id=&quot;VNTU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;aU9Z&quot;&gt;&lt;strong&gt;Пример 5&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;xqzl&quot;&gt;Вывести названия книг, которые состоят ровно из одного слова, если считать, что слова в названии отделяются друг от друга пробелами .&lt;/p&gt;
  &lt;p id=&quot;IFfQ&quot;&gt;&lt;em&gt; Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;dfsD&quot; data-lang=&quot;sql&quot;&gt;SELECT title FROM book 
WHERE title NOT LIKE &amp;quot;% %&amp;quot;;    
&lt;/pre&gt;
  &lt;p id=&quot;NYbn&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;6e47&quot; data-lang=&quot;sql&quot;&gt;+--------+
| title  |
+--------+
| Идиот  |
| Лирика |
| Поэмы  |
+--------+&lt;/pre&gt;
  &lt;h2 id=&quot;pUWV&quot;&gt;Задание&lt;/h2&gt;
  &lt;p id=&quot;m0zx&quot;&gt;Вывести название и автора тех книг, название которых состоит из двух и более слов, а инициалы автора содержат букву «С». Считать, что в названии слова отделяются друг от друга пробелами и не содержат знаков препинания, между фамилией автора и инициалами обязателен пробел, инициалы записываются без пробела в формате: буква, точка, буква, точка. Информацию отсортировать по названию книги в алфавитном порядке.&lt;/p&gt;
  &lt;p id=&quot;UE5d&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;lScY&quot;&gt;+-----------------------+-------------+
| title                 | author      |
+-----------------------+-------------+
| Капитанская дочка     | Пушкин А.С. |
| Стихотворения и поэмы | Есенин С.А. |
+-----------------------+-------------+&lt;/pre&gt;
  &lt;p id=&quot;FA6G&quot;&gt;Решение:&lt;/p&gt;
  &lt;pre id=&quot;c5bm&quot; data-lang=&quot;sql&quot;&gt;SELECT title, author
FROM book
WHERE title LIKE &amp;#x27;_% %&amp;#x27;
    AND (author LIKE &amp;#x27;% С.%&amp;#x27; OR author LIKE &amp;quot;%С.%&amp;quot;) 
ORDER BY title ASC;&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;zDK1&quot;&gt;Выбор уникальных элементов столбца DISTINCT и GROUP BY&lt;/h2&gt;
  &lt;p id=&quot;DKuW&quot;&gt;Чтобы отобрать уникальные элементы некоторого столбца используется ключевое слово &lt;code&gt;DISTINCT&lt;/code&gt;, которое размещается сразу после &lt;code&gt;SELECT&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;DDnw&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;NqSC&quot;&gt;Выбрать различных авторов, книги которых хранятся в таблице&lt;code&gt;&lt;strong&gt; book&lt;/strong&gt;&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;uTpb&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;nBFG&quot; data-lang=&quot;sql&quot;&gt;SELECT DISTINCT author
FROM book;&lt;/pre&gt;
  &lt;p id=&quot;uzsj&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;ERiK&quot; data-lang=&quot;sql&quot;&gt;+------------------+
| author           |
+------------------+
| Булгаков М.А.    |
| Достоевский Ф.М. |
| Есенин С.А.      |
+------------------+&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;ALUz&quot;&gt;Другой способ – использование оператора &lt;code&gt;GROUP BY&lt;/code&gt;, который группирует данные при выборке, имеющие одинаковые значения в некотором столбце. Столбец, по которому осуществляется группировка, указывается после &lt;code&gt;GROUP BY&lt;/code&gt; .&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;22IN&quot;&gt;С помощью &lt;code&gt;GROUP BY&lt;/code&gt; можно выбрать уникальные элементы столбца, по которому осуществляется группировка. Результат будет точно такой же как при использовании &lt;code&gt;DISTINCT&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;2gDX&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;TAVb&quot; data-lang=&quot;sql&quot;&gt;SELECT  author
FROM book
GROUP BY author;&lt;/pre&gt;
  &lt;p id=&quot;hcJt&quot;&gt;Т.е. запрос&lt;/p&gt;
  &lt;pre id=&quot;APMO&quot; data-lang=&quot;sql&quot;&gt;select title,Count(title)
 from book
 group by author
 &lt;/pre&gt;
  &lt;p id=&quot;Dzcz&quot;&gt;Запрос &lt;code&gt;SELECT COUNT(title) FROM book GROUP BY author&lt;/code&gt; будет подсчитывать &lt;strong&gt;&lt;u&gt;количество записей в столбце &lt;/u&gt;&lt;code&gt;title&lt;/code&gt;&lt;u&gt; для каждого уникального автора&lt;/u&gt;&lt;/strong&gt; в таблице &lt;code&gt;book&lt;/code&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;9hSD&quot;&gt;Выборка данных, групповые функции SUM и COUNT&lt;/h2&gt;
  &lt;p id=&quot;Hvuc&quot;&gt;При группировке над элементами столбца, входящими в группу можно выполнить различные действия, например, просуммировать их или найти количество элементов в группе.&lt;/p&gt;
  &lt;p id=&quot;6u1f&quot;&gt;Подробно рассмотрим, как осуществляется группировка данных по некоторому столбцу и вычисления над группой на следующем примере:&lt;/p&gt;
  &lt;pre id=&quot;RnBM&quot;&gt;SELECT author, sum(amount), count(amount)
FROM book
GROUP BY author;&lt;/pre&gt;
  &lt;p id=&quot;L7YL&quot;&gt;1. В таблице &lt;code&gt;&lt;strong&gt;book&lt;/strong&gt;&lt;/code&gt; определяются строки, в которых в столбце &lt;code&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/code&gt; одинаковые значения:&lt;/p&gt;
  &lt;figure id=&quot;XwTn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9d/d3/9dd3c9ac-3f01-4419-b1d0-40b6cef212db.png&quot; width=&quot;599&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rlX5&quot;&gt;Получили 3 различные группы:&lt;/p&gt;
  &lt;ul id=&quot;qksP&quot;&gt;
    &lt;li id=&quot;b5Ju&quot;&gt;&lt;strong&gt;группа I&lt;/strong&gt; объединяет две записи, у которых в столбце &lt;code&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/code&gt; значение Булгаков М.А.;&lt;/li&gt;
    &lt;li id=&quot;Ljsd&quot;&gt;&lt;strong&gt;группа II&lt;/strong&gt; объединяет три записи, у которых в столбце &lt;code&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/code&gt; значение Достоевский Ф.М.;&lt;/li&gt;
    &lt;li id=&quot;CuhD&quot;&gt;&lt;strong&gt;группа III&lt;/strong&gt; объединяет одну запись, у которой в столбце &lt;code&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/code&gt; значение Есенин С.А.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;4VIN&quot;&gt;2. Вместо каждой группы в результирующий запрос включается одна запись. Запись как минимум включает значение столбца, по которому осуществляется группировка (в нашем случае это &lt;code&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/code&gt;):&lt;/p&gt;
  &lt;figure id=&quot;aUta&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/09/e2/09e2316c-76f5-4a41-98c2-5a205de28b18.png&quot; width=&quot;592&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7kfI&quot;&gt;3. Дальше можно выполнить вычисления над элементами КАЖДОЙ группы в отдельности, например, посчитать общее количество экземпляров книг каждого автора. Для этого используется групповая функция &lt;code&gt;SUM()&lt;/code&gt;, а в скобках указывается столбец, по которому нужно выполнить суммирование ( в нашем случае &lt;code&gt;&lt;strong&gt;amount&lt;/strong&gt;&lt;/code&gt;):&lt;/p&gt;
  &lt;figure id=&quot;sGET&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/11/8a/118a5d3e-ad23-418c-88d9-e75fea7b1952.png&quot; width=&quot;755&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;a2At&quot;&gt;4. Также можно посчитать, сколько записей относится к группе. Для этого используется функция &lt;code&gt;COUNT()&lt;/code&gt;, в скобках можно указать ЛЮБОЙ столбец из группы, если группа не содержит пустых значений (ниже приведен пример, в котором показано, как работает &lt;code&gt;&lt;strong&gt;COUNT()&lt;/strong&gt;&lt;/code&gt;, если в группе есть пустые значения):&lt;/p&gt;
  &lt;figure id=&quot;xLxP&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/65/bd/65bd9dfd-d5db-4e72-967d-f906a4054b79.png&quot; width=&quot;756&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ERZ7&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;WtGW&quot;&gt;Посчитать, сколько экземпляров книг каждого автора хранится на складе.&lt;/p&gt;
  &lt;p id=&quot;En1g&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;2Wh7&quot; data-lang=&quot;sql&quot;&gt;SELECT author, SUM(amount)
FROM book
GROUP BY author;&lt;/pre&gt;
  &lt;p id=&quot;yLza&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;3XDN&quot; data-lang=&quot;sql&quot;&gt;+------------------+-------------+
| author           | SUM(amount) |
+------------------+-------------+
| Булгаков М.А.    | 8           |
| Достоевский Ф.М. | 23          |
| Есенин С.А.      | 15          |
+------------------+-------------+&lt;/pre&gt;
  &lt;p id=&quot;zNIc&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;U1ET&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;FbOV&quot;&gt;Посчитать, сколько различных книг каждого автора хранится на складе.&lt;/p&gt;
  &lt;p id=&quot;P6ni&quot;&gt;Только для этого примера в таблицу&lt;code&gt;&lt;strong&gt; book&lt;/strong&gt;&lt;/code&gt; добавлена запись с пустыми значениями в столбцах &lt;code&gt;&lt;strong&gt;amount&lt;/strong&gt;&lt;/code&gt; и &lt;code&gt;&lt;strong&gt;price&lt;/strong&gt;&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;z3PW&quot; data-lang=&quot;sql&quot;&gt;+---------+-----------------------+------------------+--------+--------+
| book_id | title                 | author           | price  | amount |
+---------+-----------------------+------------------+--------+--------+
| 1       | Мастер и Маргарита    | Булгаков М.А.    | 670.99 | 3      |
| 2       | Белая гвардия         | Булгаков М.А.    | 540.50 | 5      |
| 3       | Идиот                 | Достоевский Ф.М. | 460.00 | 10     |
| 4       | Братья Карамазовы     | Достоевский Ф.М. | 799.01 | 3      |
| 5       | Игрок                 | Достоевский Ф.М. | 480.50 | 10     |
| 6       | Стихотворения и поэмы | Есенин С.А.      | 650.00 | 15     |
| 7       | Черный человек        | Есенин С.А.      | Null   | Null   |
+---------+-----------------------+------------------+--------+--------+&lt;/pre&gt;
  &lt;p id=&quot;Hwrh&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;A5ej&quot; data-lang=&quot;sql&quot;&gt;/* чтобы проверить запрос, добавьте в таблицу строку */
INSERT INTO book (title, author, price, amount) VALUES (&amp;#x27;Черный человек&amp;#x27;,&amp;#x27;Есенин С.А.&amp;#x27;, Null, Null);

SELECT author, COUNT(author), COUNT(amount), COUNT(*)
FROM book
GROUP BY author;&lt;/pre&gt;
  &lt;p id=&quot;WPf2&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;Jrwd&quot; data-lang=&quot;sql&quot;&gt;+------------------+---------------+---------------+----------+
| author           | COUNT(author) | COUNT(amount) | COUNT(*) |
+------------------+---------------+---------------+----------+
| Булгаков М.А.    | 2             | 2             | 2        |
| Достоевский Ф.М. | 3             | 3             | 3        |
| Есенин С.А.      | 2             | 1             | 2        |
+------------------+---------------+---------------+----------+&lt;/pre&gt;
  &lt;p id=&quot;HlIy&quot;&gt;Из таблицы с результатами запроса видно, что функцию &lt;code&gt;&lt;strong&gt;COUNT()&lt;/strong&gt;&lt;/code&gt; можно применять к любому столбцу, в том числе можно использовать и &lt;code&gt;&lt;strong&gt;*&lt;/strong&gt;&lt;/code&gt;, если таблица не содержит пустых значений. Если же в столбцах есть значения &lt;code&gt;&lt;strong&gt;Null&lt;/strong&gt;&lt;/code&gt;, (для группы по автору Есенин в нашем примере), то&lt;/p&gt;
  &lt;ul id=&quot;mEpi&quot;&gt;
    &lt;li id=&quot;6Il5&quot;&gt;&lt;code&gt;&lt;strong&gt;COUNT(*) &lt;/strong&gt;&lt;/code&gt;— подсчитывает все записи, относящиеся к группе, в том числе и со значением &lt;code&gt;&lt;strong&gt;NULL&lt;/strong&gt;&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;FMO6&quot;&gt;&lt;code&gt;&lt;strong&gt;COUNT(имя_столбца)&lt;/strong&gt;&lt;/code&gt; — возвращает количество записей конкретного столбца (только &lt;code&gt;&lt;strong&gt;NOT NULL&lt;/strong&gt;&lt;/code&gt;), относящихся к группе.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;Rs7A&quot;&gt;Задание&lt;/h2&gt;
  &lt;blockquote id=&quot;NgFZ&quot;&gt;Посчитать, количество различных книг и количество экземпляров книг каждого автора , хранящихся на складе. Столбцы назвать &lt;code&gt;&lt;strong&gt;Автор,&lt;/strong&gt; &lt;strong&gt;Различных_книг&lt;/strong&gt;&lt;/code&gt; и&lt;strong&gt; &lt;code&gt;Количество_экземпляров&lt;/code&gt;&lt;/strong&gt; соответственно.&lt;/blockquote&gt;
  &lt;p id=&quot;3SxX&quot;&gt;Исходная таблица:&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;HdqA&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/ff/39/ff390285-3ab5-48a7-9ae6-f8d23e0ca366.png&quot; width=&quot;642&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9i0u&quot;&gt;Решение:&lt;/p&gt;
  &lt;pre id=&quot;GrdM&quot; data-lang=&quot;sql&quot;&gt;SELECT 
    author AS Автор, 
    COUNT(title) AS Различных_книг, 
    SUM(amount) AS Количество_экземпляров
FROM 
    book
GROUP BY 
    author;&lt;/pre&gt;
  &lt;p id=&quot;m1Dg&quot;&gt;Результат:&lt;/p&gt;
  &lt;figure id=&quot;8izE&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3e/85/3e8595da-65d0-4ed3-9e50-b010153368b0.png&quot; width=&quot;766&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;dkUn&quot;&gt;Выборка данных, групповые функции MIN, MAX и AVG&lt;/h2&gt;
  &lt;p id=&quot;v425&quot;&gt;К групповым функциям SQL относятся: &lt;code&gt;MIN()&lt;/code&gt;, &lt;code&gt;MAX()&lt;/code&gt; и &lt;code&gt;AVG()&lt;/code&gt;, которые вычисляют минимальное, максимальное и среднее значение элементов столбца, относящихся к группе.&lt;/p&gt;
  &lt;p id=&quot;4DvJ&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;sYi0&quot;&gt;Вывести минимальную цену книги каждого автора&lt;/p&gt;
  &lt;p id=&quot;us3i&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;3YEJ&quot; data-lang=&quot;sql&quot;&gt;SELECT author, MIN(price) AS min_price
FROM book
GROUP BY author;&lt;/pre&gt;
  &lt;p id=&quot;lFyJ&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;m8fH&quot; data-lang=&quot;sql&quot;&gt;+------------------+-----------+
| author           | min_price |
+------------------+-----------+
| Булгаков М.А.    | 540.50    |
| Достоевский Ф.М. | 460.00    |
| Есенин С.А.      | 650.00    |
+------------------+-----------+&lt;/pre&gt;
  &lt;h2 id=&quot;UFuz&quot;&gt;Задание&lt;/h2&gt;
  &lt;p id=&quot;uHFK&quot;&gt;Вывести фамилию и инициалы автора, минимальную, максимальную и среднюю цену книг каждого автора . Вычисляемые столбцы назвать &lt;strong&gt;Минимальная_цена, Максимальная_цена&lt;/strong&gt; и&lt;strong&gt; Средняя_цена&lt;/strong&gt; соответственно.&lt;/p&gt;
  &lt;pre id=&quot;8zyv&quot; data-lang=&quot;sql&quot;&gt;SELECT author, 
    MIN(price) AS Минимальная_цена,
    MAX(price) AS Максимальная_цена,
    AVG(price) AS Средняя_цена
FROM book
GROUP BY author&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;2IyX&quot;&gt;Вычисления по таблице целиком&lt;/h2&gt;
  &lt;p id=&quot;wIGY&quot;&gt;Групповые функции позволяют вычислять итоговые значения по всей таблице. Например, можно посчитать общее количество книг на складе, вычислить суммарную стоимость и пр. Для этого после ключевого слова &lt;code&gt;SELECT&lt;/code&gt; указывается групповая функция для выражения или имени столбца, а ключевые слова &lt;code&gt;GROUP BY&lt;/code&gt; опускаются.&lt;/p&gt;
  &lt;p id=&quot;uYCj&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;diBu&quot;&gt;Посчитать количество экземпляров книг на складе.&lt;/p&gt;
  &lt;p id=&quot;OTXz&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;5Sbi&quot; data-lang=&quot;sql&quot;&gt;SELECT SUM(amount) AS Количество
FROM book;&lt;/pre&gt;
  &lt;p id=&quot;3Q5a&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;ZFfN&quot; data-lang=&quot;sql&quot;&gt;+------------+
| Количество |
+------------+
| 46         |
+------------+ &lt;/pre&gt;
  &lt;p id=&quot;0IWc&quot;&gt;Результатом таких запросов является единственная строка с вычисленными по таблице значениями.&lt;/p&gt;
  &lt;p id=&quot;pBg4&quot;&gt;&lt;strong&gt; Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;5P00&quot;&gt;Посчитать общее количество экземпляров книг на складе и их стоимость .&lt;/p&gt;
  &lt;p id=&quot;5Z2I&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;mava&quot; data-lang=&quot;sql&quot;&gt;SELECT SUM(amount) AS Количество, 
    SUM(price * amount) AS Стоимость
FROM book;&lt;/pre&gt;
  &lt;p id=&quot;sAUF&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;kaZn&quot; data-lang=&quot;sql&quot;&gt;+------------+-----------+
| Количество | Стоимость |
+------------+-----------+
| 46         | 26267.50  |
+------------+-----------+
&lt;/pre&gt;
  &lt;h2 id=&quot;6GQu&quot;&gt;Задание&lt;/h2&gt;
  &lt;p id=&quot;jBvM&quot;&gt;Вывести цену самой дешевой книги, цену самой дорогой и среднюю цену уникальных книг на складе. Названия столбцов &lt;strong&gt;Минимальная_цена, Максимальная_цена, Средняя_цена&lt;/strong&gt; соответственно. Среднюю цену округлить до двух знаков после запятой.&lt;/p&gt;
  &lt;p id=&quot;4K6e&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;. В задании нужно посчитать среднюю цену уникальных книг на складе, а не среднюю цену всех экземпляров книг.&lt;/p&gt;
  &lt;p id=&quot;WoNU&quot;&gt;Решение:&lt;/p&gt;
  &lt;pre id=&quot;svYx&quot; data-lang=&quot;sql&quot;&gt;select 
MIN(price) as Минимальная_цена,
MAX(price) as Максимальная_цена,
ROUND(AVG(price),2) as Средняя_цена
from book&lt;/pre&gt;
  &lt;figure id=&quot;Yk2B&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/66/a3/66a3800a-d89e-40cd-af32-e720e3c126d2.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;AIfn&quot;&gt;Выборка данных по условию, групповые функции&lt;/h2&gt;
  &lt;p id=&quot;fRDW&quot;&gt;В запросы с групповыми функциями можно включать условие отбора строк, которое в обычных запросах записывается после &lt;code&gt;WHERE&lt;/code&gt;. В запросах с групповыми функциями вместо &lt;code&gt;WHERE&lt;/code&gt; используется ключевое слово &lt;code&gt;HAVING&lt;/code&gt; , которое размещается после оператора &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;pOg1&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;cILh&quot;&gt;Найти минимальную и максимальную цену книг всех авторов, общая стоимость книг которых больше 5000.&lt;/p&gt;
  &lt;p id=&quot;rrMI&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;4mjo&quot; data-lang=&quot;sql&quot;&gt;SELECT author,
    MIN(price) AS Минимальная_цена, 
    MAX(price) AS Максимальная_цена
FROM book
GROUP BY author
HAVING SUM(price * amount) &amp;gt; 5000; &lt;/pre&gt;
  &lt;p id=&quot;OzhS&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;i32S&quot; data-lang=&quot;sql&quot;&gt;+------------------+------------------+-------------------+
| author           | Минимальная_цена | Максимальная_цена |
+------------------+------------------+-------------------+
| Достоевский Ф.М. | 460.00           | 799.01            |
| Есенин С.А.      | 650.00           | 650.00            |
+------------------+------------------+-------------------+&lt;/pre&gt;
  &lt;p id=&quot;JhL7&quot;&gt;Также в запросах с группировкой можно сортировать данные.&lt;/p&gt;
  &lt;p id=&quot;2kdY&quot;&gt;&lt;strong&gt; Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;zdIQ&quot;&gt;Найти минимальную и максимальную цену книг всех авторов, общая стоимость книг которых больше 5000. Результат вывести по убыванию минимальной цены.&lt;/p&gt;
  &lt;p id=&quot;ivkI&quot;&gt;&lt;em&gt;Запрос:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;q2r2&quot; data-lang=&quot;sql&quot;&gt;SELECT author,
    MIN(price) AS Минимальная_цена, 
    MAX(price) AS Максимальная_цена
FROM book
GROUP BY author
HAVING SUM(price * amount) &amp;gt; 5000 
ORDER BY Минимальная_цена DESC;&lt;/pre&gt;
  &lt;p id=&quot;hBtD&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;QOsq&quot; data-lang=&quot;sql&quot;&gt;+------------------+------------------+-------------------+
| author           | Минимальная_цена | Максимальная_цена |
+------------------+------------------+-------------------+
| Есенин С.А.      | 650.00           | 650.00            |
| Достоевский Ф.М. | 460.00           | 799.01            |
+------------------+------------------+-------------------+&lt;/pre&gt;
  &lt;p id=&quot;JVcl&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;fZuH&quot;&gt;Задание&lt;/h2&gt;
  &lt;blockquote id=&quot;xjuG&quot;&gt;Вычислить среднюю цену и суммарную стоимость тех книг, количество экземпляров которых принадлежит интервалу от 5 до 14, включительно. Столбцы назвать &lt;code&gt;&lt;strong&gt;Средняя_цена&lt;/strong&gt;&lt;/code&gt; и &lt;code&gt;&lt;strong&gt;Стоимость&lt;/strong&gt;&lt;/code&gt;, значения округлить до 2-х знаков после запятой.&lt;/blockquote&gt;
  &lt;pre id=&quot;QiiB&quot; data-lang=&quot;sql&quot;&gt;Решение:
SELECT 
    ROUND(AVG(price),2) as Средняя_цена,
    ROUND(SUM(price*amount),2) as Стоимость
from book
where amount between 5 and 14&lt;/pre&gt;
  &lt;figure id=&quot;fkTI&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/e4/c0e449df-bd9d-45a5-be6e-c883328aab41.png&quot; width=&quot;299&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ka38&quot;&gt;Основа таблицы:&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;JGAJ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/72/32/72328631-2903-48fb-8799-0508dacc2336.png&quot; width=&quot;656&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7kIn&quot;&gt;Выборка данных по условию, групповые функции, WHERE и HAVING&lt;/h2&gt;
  &lt;p id=&quot;cyJc&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;TAo1&quot;&gt;&lt;code&gt;WHERE&lt;/code&gt; и &lt;code&gt;HAVING&lt;/code&gt; могут использоваться в одном запросе. При этом необходимо учитывать &lt;strong&gt;порядок выполнения SQL запроса на выборку на СЕРВЕРЕ&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;SLPG&quot;&gt;
    &lt;li id=&quot;tetB&quot;&gt;FROM&lt;/li&gt;
    &lt;li id=&quot;5Jwv&quot;&gt;WHERE&lt;/li&gt;
    &lt;li id=&quot;4vnm&quot;&gt;GROUP BY&lt;/li&gt;
    &lt;li id=&quot;P6ri&quot;&gt;HAVING&lt;/li&gt;
    &lt;li id=&quot;M3ly&quot;&gt;SELECT&lt;/li&gt;
    &lt;li id=&quot;y02T&quot;&gt;ORDER BY&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;9Xmj&quot;&gt;Сначала определяется таблица, из которой выбираются данные (&lt;code&gt;FROM&lt;/code&gt;), затем из этой таблицы отбираются записи в соответствии с условием &lt;code&gt;WHERE&lt;/code&gt;, выбранные данные агрегируются (&lt;code&gt;GROUP BY&lt;/code&gt;), из агрегированных записей выбираются те, которые удовлетворяют условию после &lt;code&gt;HAVING&lt;/code&gt;. Потом формируются данные результирующей выборки, как это указано после &lt;code&gt;SELECT&lt;/code&gt; ( вычисляются выражения, присваиваются имена и пр. ). Результирующая выборка сортируется, как указано после &lt;code&gt;ORDER BY&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;eKPX&quot;&gt;&lt;strong&gt;Важно!&lt;/strong&gt; Порядок ВЫПОЛНЕНИЯ запросов - это не порядок ЗАПИСИ ключевых слов в запросе на выборку. Порядок записи (синтаксис запроса) остается таким же, как рассматривался ранее в курсе. Порядок ВЫПОЛНЕНИЯ нужен для того, чтобы понять, почему, например, в &lt;code&gt;&lt;strong&gt;WHERE&lt;/strong&gt;&lt;/code&gt; нельзя использовать имена выражений из &lt;code&gt;&lt;strong&gt;SELECT&lt;/strong&gt;&lt;/code&gt;. Просто &lt;code&gt;&lt;strong&gt;SELECT&lt;/strong&gt;&lt;/code&gt; выполняется компилятором позже, чем &lt;code&gt;&lt;strong&gt;WHERE&lt;/strong&gt;&lt;/code&gt;, поэтому ему неизвестно, какое там выражение написано.&lt;/p&gt;
  &lt;p id=&quot;4K8R&quot;&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;HaXs&quot;&gt;Вывести максимальную и минимальную цену книг каждого автора, кроме Есенина, количество экземпляров книг которого больше 10.&lt;/p&gt;
  &lt;pre id=&quot;dwa1&quot; data-lang=&quot;sql&quot;&gt;SELECT author,
    MIN(price) AS Минимальная_цена,
    MAX(price) AS Максимальная_цена
FROM book
WHERE author &amp;lt;&amp;gt; &amp;#x27;Есенин С.А.&amp;#x27;
GROUP BY author
HAVING SUM(amount) &amp;gt; 10;&lt;/pre&gt;
  &lt;p id=&quot;btOO&quot;&gt;&lt;em&gt;Результат:&lt;/em&gt;&lt;/p&gt;
  &lt;pre id=&quot;ktJ0&quot; data-lang=&quot;sql&quot;&gt;+------------------+------------------+-------------------+
| author           | Минимальная_цена | Максимальная_цена |
+------------------+------------------+-------------------+
| Достоевский Ф.М. | 460.00           | 799.01            |
+------------------+------------------+-------------------+&lt;/pre&gt;
  &lt;p id=&quot;kUlN&quot;&gt;Другим способом решения примера является запрос:&lt;/p&gt;
  &lt;pre id=&quot;kggZ&quot; data-lang=&quot;sql&quot;&gt;SELECT author,
    MIN(price) AS Минимальная_цена,
    MAX(price) AS Максимальная_цена
FROM book
GROUP BY author
HAVING SUM(amount) &amp;gt; 10 AND author &amp;lt;&amp;gt; &amp;#x27;Есенин С.А.&amp;#x27;;&lt;/pre&gt;
  &lt;p id=&quot;yPy7&quot;&gt;Не смотря на то что результат будет одинаковым, так делать &lt;strong&gt;не рекомендуется&lt;/strong&gt;. «Потому что как написано - запрос сначала выбирает всех авторов, потом выводит данные, рассчитывая минимальное и максимальное значение цены для каждого, и только после всего убирает Есенина. Можно убрать Есенина в данном случае раньше и не использовать ресурсы базы для расчета его минимального и максимального значения, как это сделано в первом варианте. На небольшой базе быстродействия не ощутить, но если выполнять такое на продуктивной, то второй вариант значительно проигрывает...»&lt;/p&gt;
  &lt;h2 id=&quot;gG4L&quot;&gt;&lt;strong&gt;Задание&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;LvLu&quot;&gt;Посчитать стоимость всех экземпляров каждого автора без учета книг «Идиот» и «Белая гвардия». В результат включить только тех авторов, у которых суммарная стоимость книг (без учета книг «Идиот» и «Белая гвардия») более 5000 руб. Вычисляемый столбец назвать &lt;code&gt;&lt;strong&gt;Стоимость&lt;/strong&gt;&lt;/code&gt;. Результат отсортировать по убыванию стоимости.&lt;/p&gt;
  &lt;pre id=&quot;mERr&quot; data-lang=&quot;sql&quot;&gt;select 
    author,
    SUM(price*amount) as Стоимость
from book
where title&amp;lt;&amp;gt;&amp;quot;Идиот&amp;quot; and title&amp;lt;&amp;gt;&amp;quot;Белая гвардия&amp;quot;
group by author
having Стоимость &amp;gt; 5000
order by author desc&lt;/pre&gt;

</content></entry><entry><id>shmarou:3fc3U8rfJMm</id><link rel="alternate" type="text/html" href="https://teletype.in/@shmarou/3fc3U8rfJMm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=shmarou"></link><title>Роль и задачи QA. Основные артефакты QA</title><published>2023-12-12T12:22:16.845Z</published><updated>2024-03-03T17:31:31.843Z</updated><summary type="html">Оглавление</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;10ub&quot;&gt;&lt;a href=&quot;https://teletype.in/@shmarou/ax1VCTYNLTw&quot; target=&quot;_blank&quot;&gt;Оглавление&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;ol id=&quot;2zcE&quot;&gt;
    &lt;li id=&quot;zO1P&quot;&gt;&lt;a href=&quot;#Pt6D&quot;&gt;Основные задачи QA&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;ujNN&quot;&gt;&lt;a href=&quot;#8XN2&quot;&gt;Артефакты&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;sQ5a&quot;&gt;&lt;a href=&quot;#CFKA&quot;&gt;Виды тестирования&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;8Viw&quot;&gt;&lt;a href=&quot;#ssgU&quot;&gt;Типы багов&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;q8vJ&quot;&gt;&lt;a href=&quot;#lECl&quot;&gt;Техники тестов&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;W71H&quot;&gt;QA (Quality Assurance, Обеспечение Качества) является неотъемлемой частью процесса разработки программного обеспечения и других продуктов. QA необходим по следующим причинам:&lt;/p&gt;
  &lt;h3 id=&quot;zDyZ&quot;&gt;1. &lt;strong&gt;Гарантия Качества Продукта:&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;seQh&quot;&gt;
    &lt;li id=&quot;xIrV&quot;&gt;&lt;strong&gt;Предотвращение Дефектов:&lt;/strong&gt; QA помогает выявлять и устранять ошибки на ранних этапах разработки, что снижает стоимость их исправления в будущем.&lt;/li&gt;
    &lt;li id=&quot;iuR9&quot;&gt;&lt;strong&gt;Соответствие Стандартам:&lt;/strong&gt; Обеспечивает, что продукт соответствует заранее определенным стандартам качества и требованиям пользователя.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;89XT&quot;&gt;2. &lt;strong&gt;Удовлетворенность Клиента:&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;s3y9&quot;&gt;
    &lt;li id=&quot;op2p&quot;&gt;QA уделяет особое внимание соответствию продукта ожиданиям и потребностям клиентов, что повышает их удовлетворенность и лояльность.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;aUbK&quot;&gt;3. &lt;strong&gt;Надежность и Безопасность:&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;T5G0&quot;&gt;
    &lt;li id=&quot;z99V&quot;&gt;QA проверяет, что продукт надежен и безопасен в использовании, что особенно важно в чувствительных к безопасности отраслях.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;Pt6D&quot;&gt;Основные Задачи QA:&lt;/h3&gt;
  &lt;ol id=&quot;Fz8M&quot;&gt;
    &lt;li id=&quot;M62B&quot;&gt;&lt;strong&gt;Разработка и Поддержка Тестовых Сценариев:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;bQyp&quot;&gt;
      &lt;li id=&quot;57G0&quot;&gt;Создание детальных тестовых планов и сценариев для проверки функциональности продукта.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;zgW9&quot;&gt;&lt;strong&gt;Тестирование Продукта:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;Bv5N&quot;&gt;
      &lt;li id=&quot;PdZV&quot;&gt;Выполнение различных видов тестирования, таких как функциональное, регрессионное, нагрузочное и безопасности.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;dJOL&quot;&gt;&lt;strong&gt;Анализ и Документирование Результатов:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;wDIR&quot;&gt;
      &lt;li id=&quot;mHHa&quot;&gt;Анализ результатов тестов для выявления ошибок и документирование их для команды разработчиков.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;5tIx&quot;&gt;&lt;strong&gt;Сотрудничество с Разработчиками:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;ShX2&quot;&gt;
      &lt;li id=&quot;WleU&quot;&gt;Тесное взаимодействие с разработчиками для обеспечения понимания и быстрого устранения найденных проблем.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;T2wV&quot;&gt;&lt;strong&gt;Управление Рисками:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;J6Of&quot;&gt;
      &lt;li id=&quot;2Axw&quot;&gt;Оценка потенциальных рисков качества продукта и разработка стратегий для их минимизации.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;L0Yg&quot;&gt;&lt;strong&gt;Поддержка Процесса Непрерывного Улучшения:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;mSJQ&quot;&gt;
      &lt;li id=&quot;dMxs&quot;&gt;Участие в анализе процессов разработки и предложения улучшений для повышения качества продукта.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;P25T&quot;&gt;&lt;strong&gt;Обеспечение Соблюдения Норм и Стандартов:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;vVw1&quot;&gt;
      &lt;li id=&quot;femj&quot;&gt;Гарантия того, что продукт соответствует всем необходимым стандартам и нормативным требованиям.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;9lJ9&quot;&gt;QA играет ключевую роль в обеспечении высокого качества продукта, повышая его конкурентоспособность и доверие клиентов. Это не только про тестирование, но и о проактивном участии в процессе разработки для предотвращения возникновения проблем на всех этапах создания продукта.&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;8XN2&quot; data-align=&quot;center&quot;&gt;Основные артефакты QA (Quality Assurance, Обеспечения Качества) включают в себя следующие документы и материалы:&lt;/h3&gt;
  &lt;h3 id=&quot;eUMr&quot;&gt;1. &lt;strong&gt;Тестовый План (Test Plan)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;jdDF&quot;&gt;
    &lt;li id=&quot;ZZnb&quot;&gt;Описывает стратегию, подход, ресурсы и планирование тестирования. Включает в себя цели тестирования, область тестирования, роли и ответственности, а также критерии начала и завершения тестирования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;Uy3D&quot;&gt;2. &lt;strong&gt;Тестовые Сценарии (Test Cases)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;nySM&quot;&gt;
    &lt;li id=&quot;UY3B&quot;&gt;Детально описанные процедуры тестирования, предназначенные для проверки определенных функций или возможностей продукта. Они содержат условия, шаги для выполнения и ожидаемые результаты.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;AmQ6&quot;&gt;3. &lt;strong&gt;Тестовые Сценарии (Test Scripts)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;GiTE&quot;&gt;
    &lt;li id=&quot;UYtB&quot;&gt;Автоматизированные или ручные сценарии, используемые для выполнения тестов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;M0rZ&quot;&gt;4. &lt;strong&gt;Тестовые Данные (Test Data)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;0BQF&quot;&gt;
    &lt;li id=&quot;E7ii&quot;&gt;Данные, используемые в тестировании для проверки функциональности и производительности продукта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;otx8&quot;&gt;5. &lt;strong&gt;Чек-листы (Checklists)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;clme&quot;&gt;
    &lt;li id=&quot;lh4H&quot;&gt;Списки для быстрой проверки основных функций и характеристик продукта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;7rhl&quot;&gt;6. &lt;strong&gt;Отчеты о Дефектах (Defect Reports)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;a3Gr&quot;&gt;
    &lt;li id=&quot;IIYk&quot;&gt;Документы, описывающие обнаруженные в процессе тестирования дефекты, их серьезность, условия возникновения и возможные последствия.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;LJFd&quot;&gt;7. &lt;strong&gt;Отчеты о Тестировании (Test Reports)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;2D7U&quot;&gt;
    &lt;li id=&quot;H3Ho&quot;&gt;Сводные отчеты, отображающие результаты тестирования, включая количество выполненных тестов, обнаруженные дефекты и общее состояние качества продукта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;H0Kc&quot;&gt;8. &lt;strong&gt;Матрица Трассируемости Требований (Requirements Traceability Matrix)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;i25h&quot;&gt;
    &lt;li id=&quot;52fb&quot;&gt;Таблица, связывающая требования с соответствующими тестовыми сценариями, что обеспечивает полное покрытие требований тестированием.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;uFr0&quot;&gt;9. &lt;strong&gt;Документы Стратегии и Методологии Тестирования&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;HRSX&quot;&gt;
    &lt;li id=&quot;YSbG&quot;&gt;Описывают подходы, методы и инструменты, используемые для тестирования, включая процессы автоматизации тестирования, если таковые используются.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;9nhY&quot;&gt;Эти артефакты помогают QA-специалистам систематизировать процесс тестирования, обеспечивать его прозрачность и повышать эффективность обнаружения и устранения дефектов.&lt;/blockquote&gt;
  &lt;p id=&quot;omGc&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;CFKA&quot; data-align=&quot;center&quot;&gt;Виды тестирования&lt;/h3&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;E6PE&quot;&gt;1. &lt;strong&gt;Функциональное Тестирование (Functional Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;hpqJ&quot;&gt;
    &lt;li id=&quot;mjKg&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Проверка функциональности продукта, чтобы убедиться, что он работает в соответствии с требованиями.&lt;/li&gt;
    &lt;li id=&quot;ylhp&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Тестирование пользовательских интерфейсов, API, баз данных, безопасности, клиент-серверных приложений.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;oi0e&quot;&gt;2. &lt;strong&gt;Регрессионное Тестирование (Regression Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;SChy&quot;&gt;
    &lt;li id=&quot;oFZG&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Убедиться, что новые изменения в коде не привели к возникновению ошибок в уже проверенных частях программы.&lt;/li&gt;
    &lt;li id=&quot;hKKw&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Повторное выполнение функциональных и нефункциональных тестов для обеспечения стабильности продукта после изменений.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;dn6u&quot;&gt;3. &lt;strong&gt;Нагрузочное Тестирование (Load Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;Kt30&quot;&gt;
    &lt;li id=&quot;ds2V&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Оценка способности системы или компонента обрабатывать предполагаемую нагрузку.&lt;/li&gt;
    &lt;li id=&quot;3taQ&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Тестирование производительности при различных уровнях нагрузки, проверка времени отклика, пропускной способности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;STLg&quot;&gt;4. &lt;strong&gt;Тестирование Безопасности (Security Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;SULl&quot;&gt;
    &lt;li id=&quot;tDc7&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Выявление уязвимостей в программе, которые могут привести к потере данных, несанкционированному доступу и другим угрозам.&lt;/li&gt;
    &lt;li id=&quot;GCUK&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Проверка на SQL-инъекции, тестирование на проникновение, проверка шифрования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;yhR1&quot;&gt;5. &lt;strong&gt;Юзабилити Тестирование (Usability Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;B4XU&quot;&gt;
    &lt;li id=&quot;1dAX&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Убедиться, что продукт удобен для пользователя, интуитивно понятен и эффективен.&lt;/li&gt;
    &lt;li id=&quot;2p1I&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Оценка навигации, читаемости, скорости работы интерфейса.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;V7kT&quot;&gt;6. &lt;strong&gt;Тестирование Совместимости (Compatibility Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;Pro5&quot;&gt;
    &lt;li id=&quot;ziq9&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Проверка работы продукта в различных окружениях, на разных устройствах, браузерах и операционных системах.&lt;/li&gt;
    &lt;li id=&quot;uE3L&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Тестирование на различных версиях ОС, в разных браузерах.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;1IT9&quot;&gt;7. &lt;strong&gt;Интеграционное Тестирование (Integration Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;YxHC&quot;&gt;
    &lt;li id=&quot;Nui8&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Проверка взаимодействия между различными модулями или сервисами в системе.&lt;/li&gt;
    &lt;li id=&quot;84Gx&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Тестирование API, клиент-серверных взаимодействий.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;xv30&quot;&gt;8. &lt;strong&gt;Юнит-Тестирование (Unit Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;hPRh&quot;&gt;
    &lt;li id=&quot;3cA8&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Проверка отдельных модулей или компонентов программы для убеждения в их корректной работе.&lt;/li&gt;
    &lt;li id=&quot;PLKH&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Тестирование отдельных функций, классов, методов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;9JOs&quot;&gt;9. &lt;strong&gt;Тестирование Производительности (Performance Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;1hek&quot;&gt;
    &lt;li id=&quot;KJte&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Оценка скорости, масштабируемости и стабильности системы под нагрузкой.&lt;/li&gt;
    &lt;li id=&quot;1wzv&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Тестирование отклика при высокой нагрузке, стресс-тестирование.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;GyRl&quot;&gt;10. &lt;strong&gt;Эксплораторное Тестирование (Exploratory Testing)&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;NRbW&quot;&gt;
    &lt;li id=&quot;fG7U&quot;&gt;&lt;strong&gt;Цель:&lt;/strong&gt; Исследование системы, обнаружение неочевидных ошибок.&lt;/li&gt;
    &lt;li id=&quot;1LHz&quot;&gt;&lt;strong&gt;Примеры:&lt;/strong&gt; Неструктурированное тестирование, при котором тестировщик одновременно изучает систему и проектирует тесты.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;ssgU&quot; data-align=&quot;center&quot;&gt;Типы Дефектов (Багов):&lt;/h3&gt;
  &lt;/section&gt;
  &lt;ol id=&quot;fYHT&quot;&gt;
    &lt;li id=&quot;gqOi&quot;&gt;&lt;strong&gt;Функциональные Дефекты:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;HsVC&quot;&gt;
      &lt;li id=&quot;2eJb&quot;&gt;Проблемы, связанные с функциональностью продукта. Пример: неверно работающая кнопка в интерфейсе.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;VGT9&quot;&gt;&lt;strong&gt;Логические Дефекты:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;5r2W&quot;&gt;
      &lt;li id=&quot;JGXc&quot;&gt;Ошибки в бизнес-логике или алгоритмах. Пример: неправильный расчет в финансовой системе.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;qv9B&quot;&gt;&lt;strong&gt;Ошибки Интерфейса:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;hSSR&quot;&gt;
      &lt;li id=&quot;JhRm&quot;&gt;Проблемы в визуальном отображении и взаимодействии пользователя с системой. Пример: неправильное расположение элементов на странице.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;Arme&quot;&gt;&lt;strong&gt;Ошибки Совместимости:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;KCua&quot;&gt;
      &lt;li id=&quot;dW4F&quot;&gt;Проблемы, возникающие при использовании продукта на различных платформах или устройствах. Пример: сайт, который не отображается корректно в определенном браузере.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;KWIO&quot;&gt;&lt;strong&gt;Производительности:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;IbjC&quot;&gt;
      &lt;li id=&quot;t6AL&quot;&gt;Проблемы, связанные с производительностью системы. Пример: долгое время загрузки приложения.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;AKwB&quot;&gt;&lt;strong&gt;Безопасности:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;KY1h&quot;&gt;
      &lt;li id=&quot;7fnQ&quot;&gt;Уязвимости, которые могут привести к несанкционированному доступу или утечке данных. Пример: SQL-инъекция.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;JiqB&quot;&gt;&lt;strong&gt;Ошибки Установки:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;62EW&quot;&gt;
      &lt;li id=&quot;AbZc&quot;&gt;Проблемы, возникающие во время установки или настройки программы. Пример: ошибка установщика.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;y8Xb&quot;&gt;&lt;strong&gt;Ошибки Конфигурации:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;6Spf&quot;&gt;
      &lt;li id=&quot;CBc3&quot;&gt;Неправильная настройка параметров системы. Пример: неправильные настройки сервера.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;oqTE&quot;&gt;&lt;strong&gt;Ошибки Интеграции:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;ivQ8&quot;&gt;
      &lt;li id=&quot;tZjO&quot;&gt;Проблемы во взаимодействии между разными компонентами или системами. Пример: сбой в API-взаимодействии.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;AIP7&quot;&gt;&lt;strong&gt;Ошибки Пользовательского Опыта:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;nToI&quot;&gt;
      &lt;li id=&quot;0Rjj&quot;&gt;Проблемы, затрудняющие использование продукта конечными пользователями. Пример: запутанный пользовательский интерфейс.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;lECl&quot; data-align=&quot;center&quot;&gt;Техники тестов&lt;/h3&gt;
  &lt;/section&gt;
  &lt;ol id=&quot;49lR&quot;&gt;
    &lt;li id=&quot;eeNO&quot;&gt;&lt;strong&gt;Эквивалентные классы&lt;/strong&gt;: Эта техника разбивает входные данные на группы, где каждая группа представляет эквивалентный класс входных данных. Затем для каждого класса выполняются тесты.&lt;/li&gt;
    &lt;li id=&quot;rQHG&quot;&gt;&lt;strong&gt;Граничные значения&lt;/strong&gt;: Эта техника фокусируется на граничных значениях входных данных, таких как минимальные и максимальные значения, а также значения, близкие к ним. Тестирование на граничных значениях может выявить ошибки, связанные с обработкой крайних ситуаций.&lt;/li&gt;
    &lt;li id=&quot;KKQP&quot;&gt;&lt;strong&gt;Парные комбинации &lt;/strong&gt;(Pairwise Testing): Это методика, которая помогает снизить количество тестов, путем тестирования всех возможных комбинаций пар входных данных, таким образом экономя время и ресурсы.&lt;/li&gt;
    &lt;li id=&quot;6fJn&quot;&gt;Т&lt;strong&gt;аблицы принятия решений &lt;/strong&gt;(Decision Tables): Этот метод используется для моделирования различных вариантов поведения системы на основе разных комбинаций входных условий.&lt;/li&gt;
    &lt;li id=&quot;LFNZ&quot;&gt;&lt;strong&gt;Тестирование состояний&lt;/strong&gt; (State Transition Testing): Эта техника подходит для систем, имеющих разные состояния, и она направлена на проверку переходов между этими состояниями.&lt;/li&gt;
    &lt;li id=&quot;2r04&quot;&gt;&lt;strong&gt;Тестирование методом &amp;quot;Черного ящика&amp;quot;&lt;/strong&gt; (Black Box Testing): При этом методе тестировщик сосредотачивается на функциональности системы без знания внутренней реализации. Это позволяет тестировать систему с точки зрения пользователя.&lt;/li&gt;
    &lt;li id=&quot;JWQq&quot;&gt;&lt;strong&gt;Тестирование методом &amp;quot;Белого ящика&amp;quot;&lt;/strong&gt; (White Box Testing): Здесь тестировщик имеет доступ к внутренней структуре кода и тестирует его на основе логики и структуры программы.&lt;/li&gt;
    &lt;li id=&quot;fKWb&quot;&gt;&lt;strong&gt;Тестирование с использованием техники &amp;quot;Пути выполнения&amp;quot; &lt;/strong&gt;(Path Testing): Этот метод фокусируется на проверке всех возможных путей выполнения программы.&lt;/li&gt;
    &lt;li id=&quot;jvSy&quot;&gt;&lt;strong&gt;По убыванию степени важности тестируемых функций &lt;/strong&gt;(по уровню функционального тестирования):&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul id=&quot;bhf1&quot;&gt;
    &lt;li id=&quot;tQah&quot;&gt;&lt;strong&gt;Дымовое тестирование&lt;/strong&gt; (smoke) — проверка самой важной, самой ключевой функциональности, неработоспособность которой делает бессмысленной саму идею использования приложения.&lt;/li&gt;
    &lt;li id=&quot;AoEu&quot;&gt;Тестирование критического пути — проверка функциональности, используемой типичными пользователями в типичной повседневной деятельности.&lt;/li&gt;
    &lt;li id=&quot;e8nX&quot;&gt;Расширенное тестирование — проверка всей (остальной) функциональности, заявленной в требованиях.&lt;/li&gt;
  &lt;/ul&gt;

</content></entry></feed>