uz
Feedback
BackendQuiz - задачи с собеседований по бэкенду

BackendQuiz - задачи с собеседований по бэкенду

Kanalga Telegram’da o‘tish

Задачки на алгоритмы, на понимание HTTP и сетевого стека вцелом, так же базы данных и хранилища. Подойдет как для начинающих так и для опытных. Языки и технологии: Java, PHP, Ruby, Javascript, SQL Контакт: @cyberJohnny

Ko'proq ko'rsatish
1 723
Obunachilar
Ma'lumot yo'q24 soatlar
-27 kunlar
-1130 kunlar
Obunachilarni jalb qilish
Iyul '26
Iyul '26
+2
0 kanalda
Iyun '26
+8
0 kanalda
Get PRO
May '26
+3
0 kanalda
Get PRO
Aprel '26
+3
0 kanalda
Get PRO
Mart '26
+3
0 kanalda
Get PRO
Fevral '26
+13
0 kanalda
Get PRO
Yanvar '26
+4
0 kanalda
Get PRO
Dekabr '25
+7
0 kanalda
Get PRO
Noyabr '25
+13
0 kanalda
Get PRO
Oktabr '25
+7
0 kanalda
Get PRO
Sentabr '25
+4
0 kanalda
Get PRO
Avgust '25
+3
0 kanalda
Get PRO
Iyul '25
+4
0 kanalda
Get PRO
Iyun '25
+9
0 kanalda
Get PRO
May '25
+7
0 kanalda
Get PRO
Aprel '25
+9
0 kanalda
Get PRO
Mart '25
+13
0 kanalda
Get PRO
Fevral '25
+10
0 kanalda
Get PRO
Yanvar '25
+10
0 kanalda
Get PRO
Dekabr '24
+1
0 kanalda
Get PRO
Noyabr '24
+2
0 kanalda
Get PRO
Oktabr '24
+68
0 kanalda
Get PRO
Sentabr '24
+8
0 kanalda
Get PRO
Avgust '24
+11
0 kanalda
Get PRO
Iyul '24
+8
0 kanalda
Get PRO
Iyun '24
+8
0 kanalda
Get PRO
May '24
+6
0 kanalda
Get PRO
Aprel '24
+11
0 kanalda
Get PRO
Mart '24
+25
13 kanalda
Get PRO
Fevral '24
+16
0 kanalda
Get PRO
Yanvar '24
+30
4 kanalda
Get PRO
Dekabr '23
+31
3 kanalda
Get PRO
Noyabr '23
+15
0 kanalda
Get PRO
Oktabr '23
+24
0 kanalda
Get PRO
Sentabr '23
+41
0 kanalda
Get PRO
Avgust '23
+10
0 kanalda
Get PRO
Iyul '23
+17
0 kanalda
Get PRO
Iyun '23
+18
0 kanalda
Get PRO
May '23
+27
0 kanalda
Get PRO
Aprel '23
+12
0 kanalda
Get PRO
Mart '23
+12
0 kanalda
Get PRO
Fevral '23
+16
0 kanalda
Get PRO
Yanvar '23
+14
0 kanalda
Get PRO
Dekabr '22
+13
0 kanalda
Get PRO
Noyabr '22
+83
0 kanalda
Get PRO
Oktabr '22
+33
0 kanalda
Get PRO
Sentabr '22
+26
0 kanalda
Get PRO
Avgust '22
+118
0 kanalda
Get PRO
Iyul '22
+127
0 kanalda
Get PRO
Iyun '22
+39
0 kanalda
Get PRO
May '22
+35
0 kanalda
Get PRO
Aprel '22
+35
0 kanalda
Get PRO
Mart '22
+6
0 kanalda
Get PRO
Fevral '22
+23
0 kanalda
Get PRO
Yanvar '22
+23
0 kanalda
Get PRO
Dekabr '21
+24
0 kanalda
Get PRO
Noyabr '21
+15
0 kanalda
Get PRO
Oktabr '21
+117
0 kanalda
Get PRO
Sentabr '21
+100
0 kanalda
Get PRO
Avgust '21
+477
0 kanalda
Get PRO
Iyul '21
+330
0 kanalda
Get PRO
Iyun '21
+311
0 kanalda
Get PRO
May '21
+221
0 kanalda
Get PRO
Aprel '21
+203
0 kanalda
Get PRO
Mart '21
+101
0 kanalda
Get PRO
Fevral '21
+67
0 kanalda
Get PRO
Yanvar '21
+36
0 kanalda
Get PRO
Dekabr '20
+1 942
0 kanalda
Sana
Obunachilarni jalb qilish
Esdaliklar
Kanallar
17 Iyul0
16 Iyul0
15 Iyul0
14 Iyul+1
13 Iyul0
12 Iyul0
11 Iyul0
10 Iyul0
09 Iyul0
08 Iyul0
07 Iyul0
06 Iyul0
05 Iyul0
04 Iyul0
03 Iyul0
02 Iyul+1
01 Iyul0
Kanal postlari
🤔 В чем разница char и varchar в SQL ? Это два типа данных в SQL, которые используются для хранения строковых данных. Основные различия между ними касаются способа хранения данных и управления памятью. 🚩`CHAR` (Fixed-length Character Data) 🟠Фиксированная длина CHAR(n) хранит строки фиксированной длины n. Если строка короче, она дополняется пробелами до указанной длины. 🟠Использование памяти Использует фиксированное количество памяти, равное указанной длине n, независимо от фактической длины строки. 🟠Производительность Может быть быстрее в некоторых случаях, так как длина строк фиксирована и известна заранее, что упрощает управление памятью. 🟠Пример использования Подходит для хранения данных, которые всегда имеют одинаковую длину, например, коды стран, идентификаторы и т.д. CREATE TABLE example ( fixed_char CHAR(10) ); 🚩`VARCHAR` (Variable-length Character Data) 🟠Переменная длина VARCHAR(n) хранит строки переменной длины, где n — это максимальная длина строки. Реальная длина строки определяется по количеству символов в ней. 🟠Использование памяти Использует только столько памяти, сколько необходимо для хранения фактической длины строки, плюс дополнительные байты для хранения информации о длине строки. 🟠Производительность Может быть менее эффективным в некоторых случаях по сравнению с CHAR, так как длина строки не фиксирована и требует дополнительной обработки для управления памятью. 🟠Пример использования Подходит для хранения данных, длина которых может варьироваться, например, имена, адреса, описания и т.д. CREATE TABLE example ( variable_char VARCHAR(50) ); Ставь 👍 и 📚 @backendquiz

2
🤔 Что такое rest api? Это архитектурный стиль для создания веб-сервисов, который использует стандартные HTTP методы и принципы для взаимодействия между клиентом и сервером. REST API предоставляет набор операций для создания, чтения, обновления и удаления ресурсов, представленных в виде URL. 🚩Основные принципы REST API 🟠Клиент-серверная архитектура Клиент и сервер отделены друг от друга. Клиент запрашивает ресурсы, сервер обрабатывает запросы и возвращает ресурсы или статус операции. 🟠Бесподсессионное взаимодействие (stateless) Каждое взаимодействие между клиентом и сервером независимое. Сервер не хранит состояние клиента между запросами. Вся необходимая информация для выполнения запроса должна быть предоставлена в каждом запросе. 🟠Кеширование Ответы сервера могут быть кешированы клиентом или промежуточными звеньями (прокси-серверами) для повышения производительности и снижения нагрузки на сервер. 🟠Единый интерфейс (Uniform Interface) Универсальный интерфейс упрощает взаимодействие между клиентом и сервером. Основные методы HTTP (GET, POST, PUT, DELETE) используются для выполнения операций с ресурсами. 🟠Многоуровневая система REST API может быть организован в виде многоуровневой системы, где компоненты выполняют разные задачи (например, балансировка нагрузки, кеширование, защита и т.д.). 🟠Представление ресурсов (Representations) Ресурсы представляются в виде различных форматов (обычно JSON или XML). Клиент и сервер могут договариваться о формате данных через заголовки HTTP (например, Content-Type и Accept). 🚩Основные методы HTTP в REST API 🟠GET Извлечение данных с сервера. Например, получение информации о пользователе. 🟠POST Отправка данных на сервер для создания нового ресурса. Например, создание новой учетной записи пользователя. 🟠PUT Обновление существующего ресурса на сервере. Например, обновление информации о пользователе. 🟠DELETE Удаление ресурса с сервера. Например, удаление учетной записи пользователя. 🟠PATCH Частичное обновление ресурса на сервере. Например, изменение только email пользователя. 🚩Примеры запроса и ответа Запрос на создание нового пользователя (POST /users) POST /users HTTP/1.1 Host: example.com Content-Type: application/json { "name": "John Doe", "email": "john.doe@example.com" } Ответ на успешное создание пользователя HTTP/1.1 201 Created Content-Type: application/json { "id": 1, "name": "John Doe", "email": "john.doe@example.com" } Ставь 👍 и 📚 @backendquiz
66
3
🤔 Принципы разделения ответственности (MVC, MVVM и другие)? Принципы разделения ответственности (Separation of Concerns, SoC) предполагают разделение логики программы на отдельные части, каждая из которых выполняет строго определённую функцию. Это позволяет сделать код более структурированным, гибким и легче сопровождаемым. Популярные паттерны проектирования, основанные на разделении ответственности, включают MVC, MVP, MVVM и другие. Они применяются в разработке приложений для чёткого разграничения пользовательского интерфейса, бизнес-логики и работы с данными. 🚩MVC (Model-View-Controller) 🟠Model (Модель) Хранит данные и логику их обработки. Отвечает за взаимодействие с базой данных или другими источниками данных. Уведомляет представление об изменениях данных. 🟠View (Представление) Отображает данные пользователю. Реагирует на обновления данных от модели. Не содержит логики обработки данных. 🟠Controller (Контроллер) Обрабатывает пользовательский ввод (например, нажатия кнопок, ввод текста). Вызывает соответствующие методы модели и обновляет представление. 🚩Плюсы и минусы ➕Хорошее разделение обязанностей. ➕Легче тестировать отдельные компоненты. ➖При большом приложении контроллер может стать перегруженным. 🚩MVP (Model-View-Presenter) 🟠Model (Модель) Работает с данными и бизнес-логикой. 🟠View (Представление) Интерфейс пользователя. Не содержит логики, только вызывает методы презентера. 🟠Presenter (Презентер) Посредник между моделью и представлением. Получает данные из модели и передаёт их в представление. Не знает деталей реализации интерфейса (только абстракция). Плюсы и минусы ➕Более чёткое разделение обязанностей по сравнению с MVC. ➕Упрощённое тестирование. ➖Возможен рост сложности презентера. 🚩MVVM (Model-View-ViewModel) 🟠Model (Модель) Управляет данными и бизнес-логикой. 🟠View (Представление) Отображает данные и предоставляет интерфейс для взаимодействия. 🟠ViewModel Посредник между моделью и представлением. Содержит логику преобразования данных для представления. Часто использует привязку данных (data binding), что позволяет автоматически обновлять UI при изменении данных. Плюсы и минусы ➕Простота взаимодействия между представлением и данными. ➕Легко тестировать ViewModel. ➖Возможна сложность с реализацией привязки данных. 🚩Flux/Redux 🟠Store (Хранилище) Централизованное состояние приложения. 🟠View (Представление) Компоненты, которые отображают состояние. 🟠Actions (Действия) Описывают, какие изменения должны произойти в состоянии. 🟠Reducers (Редьюсеры) Функции, описывающие, как изменяется состояние на основе действий. Плюсы и минусы ➕Прогнозируемость состояния. ➕Централизованное управление состоянием. ➖Дополнительная сложность при реализации. 🚩Чем полезны принципы разделения ответственности 🟠Упрощение тестирования можно тестировать компоненты независимо друг от друга. 🟠Повышение читаемости код проще понять и сопровождать. 🟠Повторное использование кода компоненты можно использовать в других частях приложения. 🟠Гибкость в разработке команда может работать над разными частями параллельно. Ставь 👍 и 📚 @backendquiz
61
4
🤔 Что такое модульное программирование? Это подход к разработке программного обеспечения, при котором приложение разбивается на независимые, взаимосвязанные части, называемые модулями. Каждый модуль отвечает за выполнение определенной функции или набора функций, что делает программу более структурированной, управляемой и легко поддерживаемой. 🚩Характеристики 🟠Инкапсуляция Каждый модуль скрывает свою внутреннюю реализацию и предоставляет четко определенный интерфейс для взаимодействия с другими модулями. Это уменьшает зависимость между модулями и улучшает устойчивость к изменениям. 🟠Разделение ответственности Принцип единственной ответственности применяется к модулям, что означает, что каждый модуль отвечает за выполнение одной конкретной задачи или группы тесно связанных задач. 🟠Повторное использование Модули могут быть повторно использованы в других частях программы или в других проектах, что уменьшает дублирование кода и облегчает его поддержку. 🟠Управляемость и масштабируемость Разделение программы на модули облегчает управление проектом и его масштабирование. Изменения в одном модуле обычно не требуют изменений в других модулях, что ускоряет разработку и тестирование. 🚩Плюсы ➕Упрощенная отладка и тестирование Так как модули изолированы друг от друга, их можно тестировать и отлаживать независимо. Это облегчает нахождение и исправление ошибок. ➕Повышенная читаемость и поддерживаемость кода Разделение кода на небольшие, управляемые части улучшает его структуру и упрощает понимание и поддержку. ➕Ускорение разработки Разные команды могут работать над разными модулями параллельно, что ускоряет процесс разработки. ➕Легкость вносить изменения и улучшения Изменения в одном модуле не оказывают значительного влияния на другие модули, что облегчает внедрение новых функций и улучшений. 🚩Примеры применения 🟠Функциональные библиотеки Модули могут быть оформлены как библиотеки функций, которые предоставляют определенные функциональные возможности, например, работа с файлами, обработка строк или взаимодействие с базами данных. 🟠Классы и объекты в ООП В объектно-ориентированном программировании классы и объекты можно рассматривать как модули, инкапсулирующие данные и методы. 🟠Модули и пакеты в языках программирования Многие языки программирования поддерживают концепцию модулей и пакетов, например, модули в Python, пакеты в Java и модули в ECMAScript (JavaScript). На Python # file: math_operations.py def add(a, b): return a + b def subtract(a, b): return a - b # file: main.py import math_operations x = 10 y = 5 print("Addition:", math_operations.add(x, y)) print("Subtraction:", math_operations.subtract(x, y)) На JavaScript // file: mathOperations.js export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; } // file: main.js import { add, subtract } from './mathOperations.js'; const x = 10; const y = 5; console.log('Addition:', add(x, y)); console.log('Subtraction:', subtract(x, y)); Ставь 👍 и 📚 @backendquiz
65
5
🤔 Что такое CD (Continuous Delivery / Continuous Deployment)? Это практика автоматизации и оптимизации процессов доставки приложений и их обновлений в рабочую среду. Она является частью DevOps-подхода и тесно связана с CI (Continuous Integration). 🚩Два основных значения CD 🟠Continuous Delivery (Непрерывная доставка) Continuous Delivery подразумевает автоматизацию процессов сборки, тестирования и подготовки приложения к выпуску в продакшн. Однако процесс развертывания остаётся ручным, чтобы команда могла контролировать его выполнение. Ключевые особенности: Автоматическое развертывание приложения в тестовые и предрелизные среды. Возможность развернуть приложение в продакшн в любой момент с минимальными усилиями. Финальное решение о развертывании принимает человек. Цель: Быть готовым к безопасному и быстрому выпуску обновлений в любой момент. Пример использования: В интернет-магазине обновление функционала сначала разворачивается в тестовой среде. После успешной проверки QA-командой или бизнес-менеджером приложение вручную переносится в продакшн. 🟠Continuous Deployment (Непрерывное развертывание) Continuous Deployment идёт дальше Continuous Delivery, автоматически развертывая обновления в продакшн после успешного прохождения всех тестов. Процесс полностью автоматизирован и исключает ручное вмешательство. Ключевые особенности: Абсолютная автоматизация — каждый подтверждённый код (коммит) автоматически попадает в продакшн. Постоянный выпуск обновлений, минимизирующий разницу между разработкой и рабочей средой. Цель: Сократить время доставки функционала и исправлений до продакшна, обеспечивая быстрые релизы. Пример использования: В приложении социальной сети любые изменения (например, исправление ошибки или добавление нового поста) автоматически проходят через CI/CD pipeline и попадают в продакшн. 🚩Ключевые элементы CD 🟠CI/CD Pipeline Автоматизированный процесс, включающий сборку, тестирование, развертывание. 🟠Тестирование Юнит-тесты. Интеграционные тесты. Нагрузочные тесты. Проверка безопасности. 🟠Оркестрация и управление Использование инструментов (Jenkins, GitLab CI/CD, CircleCI, GitHub Actions). Контейнеризация (Docker, Kubernetes). 🟠Мониторинг Автоматическое отслеживание работоспособности приложений (Prometheus, Grafana). 🚩Плюсы ➕Скорость Ускоряет доставку новых функций и исправлений. ➕Качество Раннее выявление ошибок благодаря автоматическим тестам. ➕Прозрачность Процесс развертывания становится понятным для всей команды. ➕Гибкость Возможность быстро реагировать на изменения требований. Ставь 👍 и 📚 @backendquiz
75
6
🤔 Как обнаружить самые затратные запросы? Обнаружение самых затратных запросов важно для оптимизации производительности базы данных. Затратные запросы могут потреблять больше ресурсов, чем необходимо, что приводит к увеличению времени выполнения, нагрузке на сервер и замедлению работы системы. Существует несколько подходов и инструментов для выявления таких запросов. 🚩Включение логирования медленных запросов (Slow Query Logging) Многие системы управления базами данных (СУБД) поддерживают логирование запросов, выполнение которых занимает больше определённого времени. 🟠MySQL Используйте slow_query_log. Активировать лог: SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; -- Время выполнения в секундах 🟠PostgreSQL Включите log_min_duration_statement. SET log_min_duration_statement = 1000; -- Логировать запросы, выполняющиеся более 1 секунды 🚩Использование EXPLAIN или ANALYZE Эти команды дают подробный план выполнения запросов, показывая, как база данных интерпретирует их. MySQL EXPLAIN SELECT * FROM orders WHERE status = 'pending'; PostgreSQL EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE status = 'pending'; 🚩Использование системных представлений и мониторинга запросов 🟠MySQL Используйте таблицу performance_schema для анализа запросов. SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY SUM_TIMER_WAIT DESC LIMIT 10; 🟠PostgreSQL Используйте расширение pg_stat_statements. CREATE EXTENSION pg_stat_statements; Получите информацию SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10; 🚩Мониторинг с использованием внешних инструментов 🟠New Relic Проводит анализ SQL-запросов, показывая самые медленные. 🟠Datadog Позволяет отслеживать производительность запросов в реальном времени. 🟠SolarWinds DPA (Database Performance Analyzer) Специализированный инструмент для анализа производительности баз данных. 🚩Оптимизация индексов 🟠MySQL SELECT * FROM sys.schema_unused_indexes; 🟠PostgreSQL Проверьте в плане выполнения запросов (EXPLAIN), используются ли индексы. 🚩Нагрузочное тестирование (Load Testing) Используйте нагрузочные тесты, чтобы выявить запросы, создающие "бутылочные горлышки": 🟠Apache JMeter Симулирует многопоточную нагрузку на базу данных. 🟠Gatling Анализирует производительность системы под высокой нагрузкой. 🚩Анализ трассировки запросов Включите трассировку (например, в MySQL — SHOW PROFILE): SET profiling = 1; SELECT * FROM orders WHERE status = 'pending'; SHOW PROFILE FOR QUERY 1; Ставь 👍 и 📚 @backendquiz
79
7
🤔Как определить, что у кода плохая организация? Плохая организация кода — это один из главных факторов, который делает поддержку и развитие проекта сложными. Определить, что код плохо организован, можно по следующим признакам: 🟠Отсутствие структуры - Файлы и каталоги разбросаны хаотично. - Код находится в одном огромном файле без логического разделения. - Нет четкой модулярности (всё смешано в одном месте). 🟠Дублирование кода - Один и тот же фрагмент кода повторяется в разных местах вместо вынесения в отдельные функции или классы. - При внесении изменений приходится исправлять одну и ту же логику в нескольких местах. 🟠Чрезмерная сложность - Функции или методы слишком длинные и делают слишком много. - Код трудно читать из-за вложенных конструкций (if, for, while и т. д.). - Используются сложные алгоритмы там, где можно было бы обойтись более простыми. 🟠Нарушение принципов SOLID - Один класс выполняет несколько задач (нарушение *Single Responsibility Principle*). - Сильная зависимость между модулями (нарушение *Dependency Inversion Principle*). - Проблемы с расширяемостью кода. 🟠Плохие наименования переменных, функций и классов - Используются непонятные или слишком короткие названия (a, x1, doSomething). - Название не отражает суть выполняемой операции. 🟠Отсутствие или избыточная документация - Если документации нет, код сложно понять. - Если документации слишком много, и она не актуальна, это также мешает. 🟠Сильная связанность (high coupling) - Компоненты сильно зависят друг от друга, что усложняет тестирование и внесение изменений. - Модули не могут использоваться независимо. 🟠Отсутствие тестов - Если код сложно протестировать, это признак плохой организации. - Нет юнит-тестов или они покрывают только тривиальные случаи. 🟠Отсутствие обработчиков ошибок - Ошибки не логируются, а просто подавляются (try...catch с пустым catch). - Ошибки обрабатываются хаотично. 🟠Проблемы с производительностью - Избыточное потребление памяти или процессорных ресурсов из-за неоптимальных алгоритмов. - Использование ненужных циклов, повторные вызовы функций. Ставь 👍 и 📚 @backendquiz
85
8
🤔 Почему goto — это зло? goto считается "злом" в программировании по ряду причин, связанных с читаемостью, поддерживаемостью и структурой кода. Давайте разберем основные причины, почему его избегают. 🟠Сложность чтения и отладки Когда в коде используются операторы goto, управление программой может перескакивать из одного места в другое, иногда даже обратно. Это делает код трудно читаемым и практически невозможным для быстрого понимания. Отладка кода с goto затруднена, так как выполнение может переходить в неожиданные участки программы, что усложняет поиск ошибок. 🟠Разрушение структурного программирования Одним из ключевых достижений программирования стало структурное программирование, предложенное в 1960-х годах. Оно основывается на трех базовых конструкциях: Последовательность (команды выполняются одна за другой), Разветвление (if-else, switch), Циклы (for, while, do-while). Использование goto нарушает эту структуру, что приводит к так называемому "спагетти-коду", где невозможно понять, в каком порядке выполняются инструкции. 🟠Альтернативы `goto` Вместо goto в большинстве случаев можно использовать: Циклы (for, while, do-while) – для повторяющихся действий. Рекурсию – если нужна сложная логика выполнения. Исключения (try-catch) – для обработки ошибок, вместо goto для выхода из глубоко вложенных структур. Флаги и условные операторы – когда нужно контролировать выход из определенного блока кода. 🟠Когда `goto` все же оправдан? Несмотря на его репутацию, goto может быть полезен в низкоуровневом программировании, например: В коде на C для обработки ошибок (например, единый выход из функции в драйверах ОС). В компиляхторах или интерпретаторах языков программирования. В ASM-вставках, где goto заменяется на jmp. Ставь 👍 и 📚 @backendquiz
98
9
🤔 Взаимодействие с асинхронной коммуникацией в распределённых системах Позволяет компонентам обмениваться данными и выполнять задачи независимо друг от друга, не дожидаясь завершения операций. Асинхронное общение широко применяется в микросервисных архитектурах и других распределённых системах, так как повышает масштабируемость, гибкость и отказоустойчивость системы. 🚩Принципы и подходы 🟠Использование очередей сообщений и брокеров Очереди сообщений (например, RabbitMQ, Apache Kafka, Amazon SQS) помогают отправлять и получать сообщения асинхронно, обеспечивая буфер между отправителем и получателем. Брокеры сообщений сохраняют сообщения до тех пор, пока получатель не будет готов их обработать, что помогает управлять потоками данных и уравновешивать нагрузку. Такой подход позволяет отправителю отправить сообщение и сразу продолжить свою работу, не дожидаясь ответа, что повышает производительность системы. 🟠Паттерн «Издатель-подписчик» (Publish-Subscribe) В модели «издатель-подписчик» компоненты могут публиковать события, на которые подписаны другие компоненты, а брокер сообщений доставляет события всем подписчикам. Этот паттерн позволяет системе оставаться слабосвязанной, так как издатель не знает, сколько и какие конкретно сервисы получат событие. Такие системы часто применяются для уведомлений, регистрации событий, обработки данных и отправки уведомлений нескольким сервисам одновременно. 🟠Паттерн «Очередь задач» В очереди задач сообщения представляют собой задачи для выполнения, которые обрабатываются одним или несколькими исполнителями. Этот паттерн полезен для распределения нагрузки на сервисы, позволяя выполнять задачи асинхронно, когда они становятся доступны, и автоматически управлять потоками. Например, задача по отправке электронной почты может быть помещена в очередь и обработана отдельным рабочим процессом, что освобождает основной сервис от ожидания завершения отправки. 🚩Плюсы ➕Повышенная производительность и масштабируемость, так как сервисы могут продолжать работу без ожидания ответа. ➕Отказоустойчивость и стабильность за счёт независимости сервисов и использования брокеров сообщений. ➕Гибкость и низкая связанность компонентов, что позволяет легко модифицировать систему и добавлять новые сервисы. 🚩Минусы ➖Увеличенная сложность обработки сообщений и согласованности данных. ➖Возможные задержки доставки, повторные сообщения и необходимость работы с идемпотентностью. ➖Сложности с отладкой и мониторингом взаимодействий между сервисами. Ставь 👍 и 📚 @backendquiz
101
10
🤔 Что тебе известно о бинарном дереве? Это структура данных, в которой каждый узел имеет не более двух дочерних узлов. Эти дочерние узлы называются левым и правым дочерними узлами. В бинарном дереве может быть один или несколько уровней узлов, начиная с корневого узла, который является начальной точкой дерева. 🚩Основные термины 🟠Узел (Node) Основной элемент бинарного дерева, содержащий данные и ссылки на дочерние узлы. 🟠Корень (Root) Верхний узел дерева, не имеющий родительских узлов. 🟠Лист (Leaf) Узел, не имеющий дочерних узлов. 🟠Ветвь (Branch) Путь от корня к любому другому узлу. 🟠Высота дерева Максимальное количество уровней от корня до самого нижнего листа. 🟠Глубина узла Расстояние от корня до данного узла. 🚩Виды 🟠Полное бинарное дерево Все уровни, кроме, возможно, последнего, полностью заполнены, и все узлы последнего уровня выровнены влево. 🟠Совершенное бинарное дерево Все уровни полностью заполнены, и каждый узел имеет два дочерних узла, кроме листьев. 🟠Двоичное дерево поиска (Binary Search Tree, BST) Для каждого узла все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше значения узла. 🚩Основные операции 🟠Добавление узла (Insertion) Процесс вставки нового узла в дерево. В случае двоичного дерева поиска, новый узел вставляется в соответствующее место, чтобы сохранить порядок элементов. 🟠Удаление узла (Deletion) Процесс удаления узла из дерева. Может потребовать реорганизации дерева для поддержания его свойств. 🟠Поиск (Search) Процесс нахождения узла с определенным значением. В двоичном дереве поиска это осуществляется быстрее благодаря упорядоченности узлов. 🟠Обход дерева (Traversal) Процесс посещения всех узлов дерева в определенном порядке. Основные методы обхода: 🚩Применение 🟠Хранение отсортированных данных Бинарное дерево поиска позволяет эффективно хранить и извлекать отсортированные данные. 🟠Поисковые системы Использование деревьев для организации и поиска данных. 🟠Алгоритмы и структуры данных Базовая структура для многих алгоритмов, включая сортировки, балансировки и другие операции с данными. 🟠Компиляторы и интерпретаторы Используются для построения и обработки синтаксических деревьев при разборе кода. Ставь 👍 и 📚 @backendquiz
92
11
🤔 Какие существуют типы баз данных? Существуют различные типы баз данных, каждый из которых предназначен для определенных задач и сценариев использования. Основные типы баз данных включают: 🟠Реляционные базы данных (RDBMS) Организуют данные в таблицы с заранее определенными схемами. Используют SQL для управления данными. MySQL, PostgreSQL, Oracle, Microsoft SQL Server. 🟠Документные базы данных (Document-Oriented) Хранят данные в виде документов (обычно в формате JSON или BSON), что позволяет хранить сложные и гибкие структуры данных. MongoDB, CouchDB. 🟠Колонковые базы данных (Columnar) Хранят данные столбцами вместо строк, что оптимизирует производительность для операций чтения и агрегации. Apache Cassandra, HBase. 🟠Ключ-значение базы данных (Key-Value) Хранят данные в виде пар "ключ-значение", что позволяет быстрое извлечение данных по ключу. Redis, Riak, Amazon DynamoDB. 🟠Графовые базы данных (Graph) Оптимизированы для хранения и обработки графовых структур, таких как узлы, ребра и свойства, что удобно для социальных сетей, рекомендательных систем и др. Neo4j, ArangoDB, Amazon Neptune. 🟠Базы данных временных рядов (Time Series) Специализируются на хранении и анализе временных рядов данных, таких как метрики, события или показания датчиков. InfluxDB, TimescaleDB. 🟠Базы данных на основе объектов (Object-Oriented) Хранят данные в виде объектов, как в объектно-ориентированном программировании, что позволяет хранить более сложные структуры данных. db4o, ObjectDB. 🟠Многомодельные базы данных (Multi-Model) Поддерживают несколько типов моделей данных (например, реляционные, документные, графовые) в рамках одной базы данных. ArangoDB, OrientDB. 🟠Базы данных, ориентированные на массивы (Array) Оптимизированы для работы с большими массивами данных, часто используемыми в научных вычислениях и аналитике. SciDB, Rasdaman. 🟠Распределенные базы данных (Distributed) Распределяют данные по нескольким узлам или серверам, обеспечивая масштабируемость и отказоустойчивость. Google Spanner, CockroachDB. Ставь 👍 и 📚 @backendquiz
99
12
🤔 Что такое Scrum? Это методология управления проектами и одна из наиболее популярных реализаций Agile, предназначенная для гибкой разработки программного обеспечения. Scrum помогает командам работать более эффективно и адаптироваться к изменениям в требованиях и приоритетах. Основные концепции и элементы Scrum включают следующие компоненты: 🚩Основные концепции 🟠Инкрементная и итеративная разработка Scrum разбивает работу над проектом на небольшие итерации, называемые спринтами. Каждый спринт обычно длится от одной до четырех недель и заканчивается созданием работающего инкремента продукта. 🟠Самоорганизующиеся команды Команды в Scrum сами управляют своей работой и распределяют задачи между участниками без вмешательства извне. 🟠Роли в Scrum В Scrum выделяются три основных роли: Product Owner (Владелец продукта): отвечает за создание и управление бэклогом продукта, определение приоритетов и взаимодействие с заинтересованными сторонами. Scrum Master: помогает команде следовать принципам Scrum, устраняет препятствия и обеспечивает эффективность работы команды. Development Team (Команда разработки): непосредственно занимается созданием продукта, включает специалистов различных профилей, необходимых для выполнения задач. 🚩Основные элементы 🟠Product Backlog (Бэклог продукта) список всех требований и функций, которые должны быть реализованы в продукте. Элементы бэклога приоритизируются владельцем продукта. 🟠Sprint Backlog (Бэклог спринта) список задач, которые команда обязуется выполнить в текущем спринте. Эти задачи выбираются из бэклога продукта на основе приоритетов и возможностей команды. 🟠Sprint (Спринт) фиксированный период времени, в течение которого команда работает над выполнением задач из бэклога спринта. В конце спринта команда демонстрирует результат своей работы. 🟠Daily Scrum (Ежедневный скрам) ежедневные короткие встречи (обычно 15 минут), на которых команда обсуждает прогресс, планирует работу на день и выявляет препятствия. 🟠Sprint Review (Обзор спринта) встреча в конце каждого спринта, на которой команда демонстрирует результаты своей работы заинтересованным сторонам и получает обратную связь. 🟠Sprint Retrospective (Ретроспектива спринта) встреча после завершения спринта, на которой команда анализирует свою работу, обсуждает, что было хорошо, что можно улучшить, и разрабатывает план улучшений на следующий спринт. 🚩Плюсы ➕Гибкость Scrum позволяет быстро адаптироваться к изменяющимся требованиям и приоритетам. ➕Прозрачность Частые демонстрации результата и обратная связь обеспечивают высокую степень прозрачности процесса разработки. ➕Повышение качества Регулярные проверки и ретроспективы помогают команде постоянно улучшать качество продукта и процесса. ➕Улучшение взаимодействия Scrum способствует более тесному взаимодействию между членами команды и заинтересованными сторонами. Ставь 👍 и 📚 @backendquiz
80
13
🤔 Для чего используют redis в проектах? Это высокопроизводительная система управления базами данных, работающая в памяти (in-memory), которая поддерживает множество структур данных, таких как строки, списки, множества, хэш-таблицы и другие. Redis широко используется в современных проектах благодаря своей скорости и функциональности. 🚩Основные применения 🟠Кэширование данных Снижение нагрузки на базу данных: Кэширование часто запрашиваемых данных в Redis позволяет снизить нагрузку на основную базу данных и ускорить время ответа. Ускорение доступа к данным: Быстрое чтение данных из памяти обеспечивает низкую задержку и высокую производительность. 🟠Хранение сессий Управление сессиями пользователей: Redis часто используется для хранения сессионных данных пользователей в веб-приложениях благодаря своей скорости и поддержке автоматического удаления старых данных (TTL). 🟠Очереди задач и сообщений Асинхронные задачи: Redis используется для реализации очередей задач в таких системах, как Celery. Это позволяет распределять и выполнять задачи асинхронно и эффективно. Сообщения и события: Redis поддерживает механизм Pub/Sub для организации обмена сообщениями между различными частями приложения. 🟠Хранилище временных данных Счётчики и трекеры: Используется для хранения временных данных, таких как счётчики посещений, лайков, просмотров и других показателей, которые часто обновляются. Краткосрочные данные: Хранение временных данных, которые необходимы на короткий срок и могут быть удалены после их использования. 🟠Репликация и отказоустойчивость Репликация данных: Redis поддерживает мастеровую репликацию, что позволяет создавать копии данных на нескольких серверах для обеспечения отказоустойчивости и балансировки нагрузки. Снятие резервных копий: Redis поддерживает создание резервных копий данных, что обеспечивает восстановление в случае сбоев. 🟠Реализация сложных структур данных Работа с временными рядами: Redis позволяет эффективно управлять временными рядами данных, используя такие структуры, как списки и отсортированные множества. Графы и социальные сети: Использование структур данных Redis для реализации графов и сетей, что полезно в социальных сетях и рекомендательных системах. 🟠Функции блокировок Реализация распределённых блокировок: Redis позволяет создавать механизмы блокировок для управления доступом к ресурсам в распределённых системах. 🚩Примеры использования 🟠Веб-приложения Кэширование результатов запросов к базе данных. Хранение сессионных данных пользователей. Управление очередями задач для обработки данных в фоне. 🟠Мобильные приложения Кэширование API-запросов для уменьшения задержек. Хранение временных данных и метрик использования. 🟠Игровые приложения Хранение текущих состояний игр и информации о пользователях. Реализация лидеров и таблиц рекордов. 🟠Аналитические системы Кэширование результатов аналитических запросов. Управление счётчиками и метриками в реальном времени. Ставь 👍 и 📚 @backendquiz
94
14
🤔 Что такое Web Sockets (веб сокет)? WebSockets (веб-сокеты) — это коммуникационный протокол, предоставляющий возможность устанавливать постоянное, двустороннее соединение между клиентом (обычно веб-браузером) и сервером через один TCP-соединение. Это позволяет обмениваться данными в реальном времени с минимальной задержкой и без необходимости повторного открытия соединения для каждого обмена сообщениями, как это происходит в традиционных HTTP-соединениях. 🚩Основные характеристики WebSockets: 🟠Двусторонняя коммуникация: WebSockets поддерживают полноценную двустороннюю (или full-duplex) коммуникацию, что позволяет как клиенту, так и серверу отправлять данные в любое время без необходимости инициирования запроса. 🟠Постоянное соединение: После установления WebSocket-соединение остается открытым, что значительно уменьшает задержки, связанные с установлением новых соединений, характерных для HTTP-запросов. 🟠Меньший накладной расход: WebSockets используют меньше заголовков по сравнению с HTTP-запросами, что делает передачу данных более эффективной и менее затратной по времени и ресурсам. 🟠Протокол: WebSocket протокол стандартизирован в RFC 6455 и поддерживается большинством современных веб-браузеров. Соединение начинается с обычного HTTP-запроса, который затем "обновляется" до WebSocket-соединения через HTTP-заголовок Upgrade. 🚩Как работает WebSocket: 🟠Установление соединения: Клиент отправляет HTTP-запрос с заголовком Upgrade: websocket на сервер, указывая на желание перейти к протоколу WebSocket. Сервер отвечает подтверждением, если поддерживает WebSockets, и соединение устанавливается. 🟠Передача данных: После установления соединения клиент и сервер могут обмениваться данными в обе стороны по мере необходимости. Сообщения передаются как фреймы (frames), которые могут содержать текстовые или бинарные данные. 🟠Закрытие соединения: Соединение может быть закрыто любой стороной в любой момент времени с отправкой соответствующего фрейма закрытия. 🚩Применения WebSocket: 🟠Реальное время: Приложения, требующие обновлений в реальном времени, такие как чаты, системы обмена сообщениями, онлайн-игры, торги на биржах. 🟠Потоковая передача данных: Веб-сокеты идеально подходят для приложений, передающих данные в реальном времени, таких как спортивные трансляции или финансовые данные. 🟠Уведомления и оповещения: Приложения, отправляющие мгновенные уведомления пользователям, например, социальные сети или системы мониторинга. 🟠Коллаборативные инструменты: Инструменты для совместной работы, такие как совместное редактирование документов или доски с заметками. Преимущества WebSocket: 🟠Эффективность: Меньший накладной расход и постоянное соединение делают WebSockets более эффективными для приложений, требующих частого обмена данными. 🟠Скорость: WebSockets обеспечивают более низкую задержку, что делает их идеальными для приложений, работающих в реальном времени. 🟠Простота использования: WebSockets имеют простой API, который легко интегрируется с современными веб-приложениями. Ставь 👍 и 📚 @backendquiz
102
15
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» (https://t.me/+YO0b8YOwbEM
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» (https://t.me/+YO0b8YOwbEM5ZWFi) стал главным каналом для тех, кто использует нейросети на уровне разработки, автоматизации и опенсорса, а не просто балуется в чатах. Здесь собирают только то, что реально экономит человеко-часы и работает в проде. 🎓 Готовые ИИ-сервисы, промпты и ИИ-агенты для автоматизации рутины (https://t.me/+YO0b8YOwbEM5ZWFi) 📚 Разборы полезных ИИ-инструментов, локальных LLM и опенсорс-репозиториев (https://t.me/+YO0b8YOwbEM5ZWFi) 🛠 Практические кейсы, гайды по деплою моделей и интеграции ИИ в пайплайны (https://t.me/+YO0b8YOwbEM5ZWFi) ⚡️ Технические ИТ-новости без маркетинговой воды и душных отчетов (https://t.me/+YO0b8YOwbEM5ZWFi) Обучение и прокачка в реальном времени: работа с API (Claude, GPT), локалки (Ollama, vLLM), автоматизация кода, опенсорс-утилиты, AI-агенты и др. Ценишь время и работаешь с ИИ, подпишись: @clucai (https://t.me/+YO0b8YOwbEM5ZWFi) @backendquiz
1
16
🤔 Какие принципы программирования бывают? Программирование включает множество принципов, которые помогают разработчикам создавать эффективный, читаемый и поддерживаемый код. 🚩Принципы SOLID 🟠Single Responsibility Principle (SRP) Каждый класс должен иметь одну единственную ответственность. Пример: Класс Invoice должен обрабатывать только логику, связанную с инвойсами, а не управление базой данных или пользовательский интерфейс. 🟠Open/Closed Principle (OCP) Классы должны быть открыты для расширения, но закрыты для модификации. Пример: Добавление нового типа фигуры без изменения существующего кода классов фигур. 🟠Liskov Substitution Principle (LSP) Объекты базового класса должны быть заменяемыми объектами подклассов без изменения правильности программы. Пример: Если класс Bird имеет метод fly, то подкласс Penguin не должен его нарушать. 🟠Interface Segregation Principle (ISP) Клиенты не должны быть вынуждены зависеть от интерфейсов, которые они не используют. Пример: Разделение крупного интерфейса на несколько специфичных интерфейсов. 🟠Dependency Inversion Principle (DIP) Модули верхнего уровня не должны зависеть от модулей нижнего уровня; оба должны зависеть от абстракций. Пример: Использование интерфейсов для взаимодействия между классами вместо конкретных реализаций. 🚩Другие важные принципы 🟠DRY (Don't Repeat Yourself) Избегайте дублирования кода, вынеся повторяющиеся части в отдельные функции или классы. Пример: Использование функций для повторяющихся блоков кода. 🟠KISS (Keep It Simple, Stupid) Держите код простым и избегайте сложных решений, когда более простое решение будет работать. Пример: Не используйте сложные алгоритмы там, где достаточно простого цикла. 🟠YAGNI (You Ain't Gonna Need It) Не реализовывайте функциональность, которая не нужна прямо сейчас. Пример: Добавляйте новые функции только тогда, когда в них есть необходимость. 🟠Separation of Concerns Разделяйте разные аспекты программы, чтобы каждый модуль решал отдельную задачу. Пример: Отдельные модули для бизнес-логики, пользовательского интерфейса и доступа к данным. 🟠Law of Demeter (LoD) Объект должен общаться только с непосредственными "друзьями" и не тянуть цепочку вызовов. Пример: Использование методов класса без вызова методов через несколько объектов. 🟠Fail Fast Ошибки должны быть выявлены как можно раньше. Пример: Проверка входных данных на валидность в начале функции. 🟠Composition over Inheritance Предпочтение композиции перед наследованием для достижения гибкости. Пример: Использование объектов других классов для расширения функциональности вместо создания подклассов. 🚩Принципы в Agile 🟠Customer Collaboration over Contract Negotiation Сотрудничество с заказчиком важнее согласования условий контракта. Пример: Регулярные встречи с заказчиком для обсуждения прогресса и изменений. 🟠Responding to Change over Following a Plan Готовность к изменениям важнее следования плану. Пример: Внедрение новых требований, даже если они появились на поздних стадиях разработки. 🚩Принципы в DevOps 🟠Infrastructure as Code Управление инфраструктурой с помощью кода и автоматизации. Пример: Использование Terraform или Ansible для развертывания серверов. 🟠Continuous Integration/Continuous Deployment (CI/CD) Автоматизация сборки, тестирования и развертывания приложений. Пример: Использование Jenkins или GitHub Actions для автоматизации процессов разработки. Ставь 👍 и 📚 @backendquiz
93
17
🤔 Что такое операция GROUP BY ? Это конструкция SQL, используемая для группировки строк в таблице на основе значений одного или нескольких столбцов. Она часто используется в сочетании с агрегатными функциями (такими как COUNT, SUM, AVG, MAX, MIN), чтобы выполнять вычисления для каждой группы в результате запроса. 🚩Основные аспекты `GROUP BY` 🟠Группировка данных Операция GROUP BY группирует строки, имеющие одинаковые значения в указанных столбцах, в одну группу. 🟠Агрегатные функции В сочетании с GROUP BY часто используются агрегатные функции для выполнения вычислений на уровне групп, а не отдельных строк. SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1; Ставь 👍 и 📚 @backendquiz
124
18
🤔 Как выбрать данные из двух таблиц без метода join()? Для выбора данных из двух таблиц без использования метода JOIN можно использовать подзапросы. Подзапросы позволяют выполнять вложенные запросы, где результат одного запроса используется в другом запросе. 🟠Использование подзапросов в `SELECT` Вы можете использовать подзапрос в операторе SELECT, чтобы извлечь данные из одной таблицы, используя значения из другой таблицы. SELECT o.order_id, o.order_date, (SELECT c.customer_name FROM customers c WHERE c.customer_id = o.customer_id) AS customer_name FROM orders o; 🟠Использование подзапросов в `WHERE` Вы можете использовать подзапрос в операторе WHERE, чтобы фильтровать данные на основе условий из другой таблицы. SELECT o.order_id, o.order_date FROM orders o WHERE o.customer_id IN (SELECT c.customer_id FROM customers c WHERE c.city = 'New York'); 🟠Использование подзапросов в `FROM` Вы можете использовать подзапрос в операторе FROM, чтобы создать временную таблицу и затем выбрать данные из нее. SELECT c.customer_name, latest_orders.order_id, latest_orders.order_date FROM customers c, (SELECT o.customer_id, o.order_id, o.order_date FROM orders o WHERE o.order_date = (SELECT MAX(order_date) FROM orders o2 WHERE o2.customer_id = o.customer_id) ) AS latest_orders WHERE c.customer_id = latest_orders.customer_id; 🟠Использование подзапросов с агрегатными функциями Подзапросы могут быть полезны при использовании агрегатных функций для получения обобщенной информации из одной таблицы, связанной с другой таблицей. SELECT c.customer_name, (SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.customer_id) AS total_orders FROM customers c; 🟠Использование подзапросов с операторами EXISTS Оператор EXISTS проверяет наличие строк в подзапросе и возвращает TRUE, если подзапрос возвращает хотя бы одну строку. SELECT c.customer_name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id); Ставь 👍 и 📚 @backendquiz
127
19
🤔 Какая разница между аутентификацией и авторизацией? Аутентификация — это процесс проверки личности пользователя, чтобы убедиться, что он тот, за кого себя выдает (например, ввод логина и пароля). Авторизация — это процесс предоставления прав доступа к ресурсам после успешной аутентификации, определяющий, что пользователь может или не может делать в системе (например, доступ к определенным файлам или функциям). 🚩Аутентификация (Authentication) Она подтверждает, что пользователь является тем, за кого он себя выдает. 🟠Цель Убедиться, что пользователь действительно тот, кем он себя называет. 🟠Методы аутентификации Пароли: Пользователь вводит пароль, который проверяется на соответствие сохраненному в системе. Биометрические данные: Отпечатки пальцев, распознавание лица, голосовая идентификация. Токены: Аппаратные устройства или программные токены, генерирующие одноразовые коды. Сертификаты: Использование цифровых сертификатов для проверки подлинности. Многофакторная аутентификация (MFA): Комбинация нескольких методов (например, пароль + одноразовый код). 🟠Пример Вход в систему с помощью имени пользователя и пароля. 🚩Авторизация (Authorization) Она контролирует доступ к ресурсам и действиям на основе уровня доступа пользователя. 🟠Цель Определить, какие действия пользователю разрешено выполнять и к каким ресурсам он имеет доступ. 🟠Методы авторизации Ролевое управление доступом (RBAC): Назначение ролей пользователям, каждая из которых имеет определенные права доступа. Управление доступом на основе атрибутов (ABAC): Использование атрибутов (например, время дня, местоположение) для определения прав доступа. Списки контроля доступа (ACL): Определение конкретных прав доступа для каждого ресурса и пользователя. 🟠Пример После входа в систему (аутентификации) пользователь может иметь доступ только к определенным разделам или функциям приложения, в зависимости от его роли (авторизация). 🚩Основные различия 🟠Цель Аутентификация: Подтвердить личность пользователя. Авторизация: Определить, к каким ресурсам и действиям пользователь имеет доступ. 🟠Когда происходит Аутентификация: Первым шагом перед предоставлением доступа к системе. Авторизация: После аутентификации, для контроля доступа к ресурсам и действиям. 🟠Основные вопросы Аутентификация: Кто вы? Авторизация: Что вам разрешено делать? Ставь 👍 и 📚 @backendquiz
116
20
🤔 В чем суть принципа REST? Суть принципа REST (Representational State Transfer) заключается в том, чтобы предоставить простой, масштабируемый и гибкий способ взаимодействия между клиентом и сервером через веб. Основные принципы REST включают: 🟠Клиент-серверная архитектура Клиент и сервер разделены, что позволяет независимое развитие и масштабирование обеих сторон. Клиент делает запросы, а сервер обрабатывает их и возвращает ответы. 🟠Бесподсессионное взаимодействие (stateless) Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки. Сервер не сохраняет состояние между запросами. 🟠Кешируемость Ответы на запросы могут быть помечены как кешируемые или не кешируемые. Это позволяет клиентам сохранять копии ответов и уменьшать количество запросов к серверу. 🟠Единый интерфейс (Uniform Interface) Определяет единые методы взаимодействия с ресурсами: GET: Получение ресурса. POST: Создание нового ресурса. PUT: Обновление ресурса. DELETE: Удаление ресурса. 🟠Многоуровневая система Архитектура может быть построена из нескольких слоев, что повышает гибкость и возможность кэширования. 🟠Представление ресурсов (Representations) Ресурсы могут представляться в различных форматах (например, JSON, XML). Клиент и сервер договариваются о формате через заголовки HTTP. Ставь 👍 и 📚 @backendquiz
118