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

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

Відкрити в Telegram

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

Показати більше
1 706
Підписники
Немає даних24 години
-27 днів
-330 днів
Залучення підписників
вер '26
вересень '26
+11
в 0 каналах
серпень '26
+4
в 0 каналах
Get PRO
липень '26
+7
в 0 каналах
Get PRO
червень '26
+8
в 0 каналах
Get PRO
травень '26
+3
в 0 каналах
Get PRO
квітень '26
+3
в 0 каналах
Get PRO
березень '26
+3
в 0 каналах
Get PRO
лютий '26
+13
в 0 каналах
Get PRO
січень '26
+4
в 0 каналах
Get PRO
грудень '25
+7
в 0 каналах
Get PRO
листопад '25
+13
в 0 каналах
Get PRO
жовтень '25
+7
в 0 каналах
Get PRO
вересень '25
+4
в 0 каналах
Get PRO
серпень '25
+3
в 0 каналах
Get PRO
липень '25
+4
в 0 каналах
Get PRO
червень '25
+9
в 0 каналах
Get PRO
травень '25
+7
в 0 каналах
Get PRO
квітень '25
+9
в 0 каналах
Get PRO
березень '25
+13
в 0 каналах
Get PRO
лютий '25
+10
в 0 каналах
Get PRO
січень '25
+10
в 0 каналах
Get PRO
грудень '24
+1
в 0 каналах
Get PRO
листопад '24
+2
в 0 каналах
Get PRO
жовтень '24
+68
в 0 каналах
Get PRO
вересень '24
+8
в 0 каналах
Get PRO
серпень '24
+11
в 0 каналах
Get PRO
липень '24
+8
в 0 каналах
Get PRO
червень '24
+8
в 0 каналах
Get PRO
травень '24
+6
в 0 каналах
Get PRO
квітень '24
+11
в 0 каналах
Get PRO
березень '24
+25
в 13 каналах
Get PRO
лютий '24
+16
в 0 каналах
Get PRO
січень '24
+30
в 4 каналах
Get PRO
грудень '23
+31
в 3 каналах
Get PRO
листопад '23
+15
в 0 каналах
Get PRO
жовтень '23
+24
в 0 каналах
Get PRO
вересень '23
+41
в 0 каналах
Get PRO
серпень '23
+10
в 0 каналах
Get PRO
липень '23
+17
в 0 каналах
Get PRO
червень '23
+18
в 0 каналах
Get PRO
травень '23
+27
в 0 каналах
Get PRO
квітень '23
+12
в 0 каналах
Get PRO
березень '23
+12
в 0 каналах
Get PRO
лютий '23
+16
в 0 каналах
Get PRO
січень '23
+14
в 0 каналах
Get PRO
грудень '22
+13
в 0 каналах
Get PRO
листопад '22
+83
в 0 каналах
Get PRO
жовтень '22
+33
в 0 каналах
Get PRO
вересень '22
+26
в 0 каналах
Get PRO
серпень '22
+118
в 0 каналах
Get PRO
липень '22
+127
в 0 каналах
Get PRO
червень '22
+39
в 0 каналах
Get PRO
травень '22
+35
в 0 каналах
Get PRO
квітень '22
+35
в 0 каналах
Get PRO
березень '22
+6
в 0 каналах
Get PRO
лютий '22
+23
в 0 каналах
Get PRO
січень '22
+23
в 0 каналах
Get PRO
грудень '21
+24
в 0 каналах
Get PRO
листопад '21
+15
в 0 каналах
Get PRO
жовтень '21
+117
в 0 каналах
Get PRO
вересень '21
+100
в 0 каналах
Get PRO
серпень '21
+477
в 0 каналах
Get PRO
липень '21
+330
в 0 каналах
Get PRO
червень '21
+311
в 0 каналах
Get PRO
травень '21
+221
в 0 каналах
Get PRO
квітень '21
+203
в 0 каналах
Get PRO
березень '21
+101
в 0 каналах
Get PRO
лютий '21
+67
в 0 каналах
Get PRO
січень '21
+36
в 0 каналах
Get PRO
грудень '20
+1 942
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
30 вересня0
29 вересня0
28 вересня0
27 вересня0
26 вересня0
25 вересня0
24 вересня+1
23 вересня+1
22 вересня+2
21 вересня0
20 вересня+1
19 вересня0
18 вересня0
17 вересня0
16 вересня0
15 вересня+1
14 вересня0
13 вересня0
12 вересня0
11 вересня0
10 вересня0
09 вересня0
08 вересня+2
07 вересня0
06 вересня0
05 вересня+1
04 вересня+1
03 вересня+1
02 вересня0
01 вересня0
Дописи каналу
🤔 Что такое CGI? Это стандартный протокол для веб-серверов, который позволяет запускать внешние программы (скрипты) для генерации веб-страниц динамически. CGI скрипты могут быть написаны на различных языках программирования, таких как Perl, Python, PHP, C и других. Когда веб-сервер получает запрос на страницу, обрабатываемую CGI, он запускает соответствующий скрипт и передает ему данные запроса. 🚩Как работает 1⃣Запрос клиента: Клиент (например, веб-браузер) отправляет HTTP-запрос на веб-сервер. 2⃣Запуск CGI-скрипта: Веб-сервер определяет, что запрос предназначен для CGI-скрипта, и запускает его как отдельный процесс. 3⃣Передача данных: Веб-сервер передает данные запроса (например, параметры формы) в CGI-скрипт через стандартный ввод (stdin) и переменные окружения. 4⃣Выполнение скрипта: CGI-скрипт выполняет необходимые операции (например, доступ к базе данных) и генерирует HTML-страницу. 5⃣Ответ сервера: CGI-скрипт отправляет сгенерированную HTML-страницу обратно на веб-сервер через стандартный вывод (stdout), а сервер передает этот ответ клиенту. 🚩Плюсы ➕Простота и универсальность CGI прост в реализации и не требует сложной настройки. Поддерживает множество языков программирования, что делает его универсальным решением. ➕Совместимость CGI является стандартом и поддерживается практически всеми веб-серверами. ➕Изоляция процессов Каждый запрос запускает новый процесс, что обеспечивает изоляцию запросов и повышает безопасность. 🚩Минусы ➖Производительность Каждый запрос создает новый процесс, что может быть ресурсоемким и замедлять работу сервера при большом количестве запросов. Создание и завершение процессов занимает время, что увеличивает задержку ответа. ➖Масштабируемость Плохая производительность при высоких нагрузках делает CGI плохо подходящим для масштабируемых веб-приложений. Ограниченная возможность использования пула процессов для повышения эффективности. ➖Ограниченная функциональность Сложнее интегрироваться с современными технологиями и фреймворками. Отсутствие встроенных средств для работы с сессиями, аутентификацией и другими функциями современных веб-приложений. 🚩Современные альтернативы 🟠FastCGI Улучшенная версия CGI, которая повторно использует процессы для обработки нескольких запросов, что повышает производительность. 🟠Server-side scripting Языки и фреймворки, такие как PHP, ASP.NET, Node.js, Django, Ruby on Rails, которые интегрируются непосредственно с веб-серверами и обеспечивают высокую производительность. 🟠Web Server Gateway Interface (WSGI) Стандартный интерфейс для Python-приложений, позволяющий эффективную обработку запросов. 🟠Application Servers Серверы приложений, такие как Apache Tomcat, JBoss, которые предоставляют контейнеры для выполнения веб-приложений и управления ими. Ставь 👍 и 📚 @backendquiz

2
🤔 Примеры систем CP, AP и CA? В контексте CAP-теоремы(Consistency, Availability, Partition Tolerance) системы обычно делят на три группы: CP (Consistency + Partition Tolerance), AP (Availability + Partition Tolerance) и CA (Consistency + Availability). 🚩CP-системы (Consistency + Partition Tolerance) Системы, которые обеспечивают согласованность данных и устойчивость к разделению сети, но могут временно отказаться от доступности при возникновении сетевых сбоев. Такие системы при сетевом разделении блокируют часть данных или операций, чтобы сохранить согласованное состояние. 🟠HBase и MongoDB в режиме CP Оба эти хранилища данных поддерживают согласованность при сетевых сбоях, но могут ограничивать доступность данных, блокируя операции до восстановления связи. 🟠Zookeeper Система координации распределённых приложений, обеспечивающая согласованность, но жертвующая доступностью в случае сетевых проблем. Она часто используется для управления конфигурацией и синхронизацией данных. 🚩AP-системы (Availability + Partition Tolerance) Системы, которые фокусируются на доступности и устойчивости к разделению сети, но допускают временную неидеальную согласованность данных (например, данные могут быть не сразу синхронизированы между репликами). 🟠Cassandra Эта система обеспечивает доступность и устойчивость к разделению сети, но может допускать задержки в синхронизации данных между узлами. 🟠DynamoDB (режим AP) Поддерживает доступность и устойчивость к разделению сети, за счёт возможного отклонения в согласованности. DynamoDB был разработан Amazon для обеспечения высокой доступности даже в условиях сбоя сети. 🟠Riak Распределённое хранилище, оптимизированное для доступности и устойчивости к разделениям сети. Оно допускает временные рассогласования данных, которые разрешаются позже. 🚩CA-системы (Consistency + Availability) Системы, обеспечивающие согласованность и доступность данных, но не гарантирующие устойчивости к разделению сети. В реальных распределённых системах подобный подход встречается редко, так как любая сеть может столкнуться с разделением, что нарушит работу. 🟠Реляционные базы данных на одном сервере Например, PostgreSQL или MySQL в традиционной конфигурации, работающей на одном сервере без распределения данных. Они поддерживают согласованность и доступность, так как нет сетевого разделения. 🟠Системы кэширования в локальной сети Такие системы, как Redis, при отсутствии распределённой конфигурации и работе в пределах одного узла, могут обеспечить согласованность и доступность. Ставь 👍 и 📚 @backendquiz
60
3
🤔 Что такое инкапсуляция? Это один из основных принципов объектно-ориентированного программирования (ООП), который подразумевает скрытие внутренней реализации объекта и предоставление доступа к ней только через строго определенные методы или интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта. 🚩Основные аспекты инкапсуляции 🟠Скрытие данных Внутреннее состояние объекта (переменные и данные) скрыто от внешнего мира и доступно только через методы класса. 🟠Методы доступа Класс предоставляет публичные методы для взаимодействия с его внутренним состоянием. Эти методы часто называют геттерами (для получения значений) и сеттерами (для установки значений). 🟠Контроль над данными Инкапсуляция позволяет контролировать как данные изменяются и обеспечивать их корректное состояние. Например, можно добавить проверки или ограничения в сеттеры. Пример инкапсуляции на языке Python class Person: def __init__(self, name, age): self._name = name # Внутреннее состояние self._age = age # Геттер для имени def get_name(self): return self._name # Сеттер для имени def set_name(self, name): if isinstance(name, str) and name: self._name = name # Геттер для возраста def get_age(self): return self._age # Сеттер для возраста def set_age(self, age): if isinstance(age, int) and 0 @backendquiz
69
4
🤔 Что такое Docker Compose? Это инструмент, который позволяет определить и управлять многоконтейнерными Docker приложениями. С помощью Docker Compose можно описать конфигурацию всех сервисов вашего приложения в одном файле и затем легко запустить их вместе с помощью одной команды. 🚩Функции 🟠Определение многоконтейнерного приложения Docker Compose использует YAML-файл (docker-compose.yml) для описания всех контейнеров (сервисов), которые составляют ваше приложение. В этом файле можно указать образы, настройки сети, монтируемые тома и переменные окружения. 🟠Управление зависимостями Позволяет указать зависимости между сервисами, что обеспечивает правильный порядок запуска контейнеров. 🟠Запуск и остановка сервисов С помощью простой команды docker-compose up можно запустить все контейнеры, указанные в docker-compose.yml. Команда docker-compose down останавливает и удаляет все контейнеры, сети и тома, созданные up. 🟠Поддержка масштабирования Можно легко масштабировать сервисы (запускать несколько экземпляров одного контейнера) с помощью команды docker-compose up --scale. 🚩Пример использования docker-compose.yml для веб-приложения, состоящего из веб-сервера и базы данных: version: '3' services: web: image: nginx:latest ports: - "80:80" volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql volumes: db_data: 🚩Команды 🟠docker-compose up Создает и запускает все контейнеры, указанные в docker-compose.yml. 🟠docker-compose down Останавливает и удаляет все контейнеры, сети и тома, созданные docker-compose up. 🟠docker-compose ps Показывает статус запущенных контейнеров. 🟠docker-compose logs Выводит логи всех контейнеров. 🟠docker-compose exec [service] [command] Выполняет команду в запущенном контейнере. 🚩Плюсы ➕Упрощение разработки Легко настроить и запустить все необходимые сервисы для разработки. ➕Легкость в использовании Простота в управлении многоконтейнерными приложениями с помощью нескольких команд. ➕Унификация окружения Единый файл конфигурации для разработки, тестирования и производства, что снижает вероятность ошибок из-за различий в конфигурациях. ➕Масштабируемость Легко масштабировать отдельные сервисы приложения. Ставь 👍 и 📚 @backendquiz
69
5
🤔 Чем отличаются LEFT JOIN от INNER JOIN? Это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных. 🚩INNER JOIN Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Возвращает строки, где существует совпадение значений в обоих таблицах. Если нет совпадающих значений, строка не будет включена в результирующий набор. SELECT Employees.name, Departments.department_name FROM Employees INNER JOIN Departments ON Employees.department_id = Departments.id; 🚩LEFT JOIN Возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы. Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы. SELECT Employees.name, Departments.department_name FROM Employees LEFT JOIN Departments ON Employees.department_id = Departments.id; 🚩Сравнение 🟠INNER JOIN Возвращает только совпадающие строки. Если нет совпадений, строки не включаются в результат. 🟠LEFT JOIN Возвращает все строки из левой таблицы. Включает совпадающие строки из правой таблицы. Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями. Ставь 👍 и 📚 @backendquiz
91
6
🤔 Как работает браузер? Это программное обеспечение, которое позволяет пользователям просматривать и взаимодействовать с информацией в Интернете. Основные функции браузера включают получение, рендеринг и отображение веб-страниц, а также выполнение веб-приложений. 🚩Этапы работы 🟠Ввод URL и запрос к серверу Пользователь вводит URL (Uniform Resource Locator) в адресную строку браузера. Браузер определяет тип протокола (например, HTTP или HTTPS) и преобразует доменное имя в IP-адрес с помощью DNS (Domain Name System). Затем браузер отправляет HTTP-запрос к веб-серверу по указанному IP-адресу. 🟠Получение ответа от сервера Веб-сервер получает запрос и отправляет HTTP-ответ, который обычно содержит HTML-документ, CSS-стили, JavaScript-код и другие ресурсы, такие как изображения и видео. Ответ передается обратно браузеру. 🟠Анализ и построение DOM Браузер анализирует полученный HTML-документ и строит дерево DOM (Document Object Model), представляющее структуру страницы. Одновременно браузер загружает и обрабатывает связанные ресурсы (CSS, JavaScript, изображения). 🟠Применение CSS и построение CSSOM Браузер анализирует CSS-файлы и строит CSSOM (CSS Object Model), описывающую, как элементы должны отображаться. DOM и CSSOM объединяются для создания render tree, которая содержит видимые элементы страницы с их стилями. 🟠Рендеринг страницы Render tree используется для определения положения и внешнего вида элементов на экране. Браузер выполняет layout (разметку) элементов и отрисовывает их на экране. 🟠Выполнение JavaScript Браузер интерпретирует и выполняет JavaScript-код, который может изменять DOM и CSSOM. JavaScript может также взаимодействовать с сервером через AJAX-запросы для динамического обновления страницы без перезагрузки. 🟠Интерактивность Браузер обрабатывает взаимодействие пользователя с элементами страницы (клики, ввод текста и т.д.). Изменения, вызванные действиями пользователя или выполнением JavaScript, могут обновлять render tree и перерисовывать элементы. Ставь 👍 и 📚 @backendquiz
87
7
🤔 Что такое клиент серверная архитектура? Клиент-серверная архитектура — это модель взаимодействия в сетях, где задачи распределяются между поставщиками ресурсов или услуг, называемыми серверами, и потребителями, называемыми клиентами. Это одна из самых распространенных архитектурных моделей в разработке программного обеспечения и сетевых приложений. 🚩Основные компоненты клиент-серверной архитектуры 🟠Клиент Это программа или устройство, которое инициирует запросы к серверу для доступа к ресурсу или услуге. Отправка запросов к серверу. Получение и отображение данных или выполнения действий на основе ответа от сервера. 🟠Сервер Это программа или устройство, которое обрабатывает запросы от клиентов и предоставляет им необходимые ресурсы или услуги. Обработка запросов от клиентов. Управление доступом к ресурсам (например, базам данных, файлам, услугам). Возврат соответствующих данных или результатов выполнения запросов клиентам. 🚩Принцип работы клиент-серверной архитектуры 🟠Инициация запроса Клиент инициирует запрос к серверу. Это может быть запрос на получение данных, отправка данных для обработки, выполнение определенной задачи и т.д. 🟠Обработка запроса Сервер получает запрос и обрабатывает его. Это может включать выполнение операций над базой данных, запуск скриптов или программ, обработку данных и т.д. 🟠Ответ на запрос Сервер отправляет ответ клиенту. Ответ может содержать запрашиваемые данные, подтверждение успешного выполнения операции или сообщение об ошибке. 🟠Получение ответа Клиент получает ответ от сервера и использует его для выполнения дальнейших действий, таких как отображение данных пользователю, обработка данных и т.д. Ставь 👍 и 📚 @backendquiz
86
8
🤔 Что такое миксины? Это один из способов повторного использования кода в объектно-ориентированном программировании. Они представляют собой классы или функции, которые предоставляют методы для других классов, без необходимости быть основой для этих классов. Миксины позволяют «подмешивать» функциональность в другие классы, обеспечивая гибкость и модульность кода. 🚩Характеристики 🟠Повторное использование кода Миксины позволяют избежать дублирования кода путем инкапсуляции общих методов и свойств, которые могут быть использованы в различных классах. 🟠Множественное наследование В языках, поддерживающих множественное наследование (например, Python), миксины могут быть использованы как базовые классы для других классов, предоставляя дополнительные методы и свойства. Это позволяет создавать классы, комбинируя несколько миксинов для расширения функциональности. 🟠Композиция В языках, где множественное наследование не поддерживается или нежелательно (например, в JavaScript), миксины могут быть применены через композицию, где функциональность миксина добавляется к целевому объекту или классу. 🟠Изоляция поведения Миксины позволяют изолировать и инкапсулировать определенное поведение или функциональность, что упрощает тестирование и поддержку кода. 🚩Примеры использования 🟠Python Миксины часто используются через множественное наследование. class LoggableMixin: def log(self, message): print(f"Log: {message}") class Database(LoggableMixin): def save(self, data): self.log("Saving data") # Код для сохранения данных db = Database() db.save({"key": "value"}) 🟠JavaScript Миксины могут быть применены через композицию. const loggableMixin = { log(message) { console.log(`Log: ${message}`); } }; class Database { save(data) { this.log("Saving data"); // Код для сохранения данных } } Object.assign(Database.prototype, loggableMixin); const db = new Database(); db.save({ key: 'value' }); Ставь 👍 и 📚 @backendquiz
94
9
🤔 Как защитить куки от воровства и от подделки? 🟠Использование HTTPS Передача данных через HTTPS (SSL/TLS) обеспечивает шифрование данных между клиентом и сервером, что предотвращает их перехват и чтение третьими лицами. Настройте ваш веб-сервер для использования HTTPS, получив и установив SSL/TLS сертификат. 🟠Флаг Secure Куки передаются только по HTTPS-соединениям. Добавьте флаг Secure при установке куки. Set-Cookie: sessionId=abc123; Secure 🟠Флаг HttpOnly Куки недоступны через JavaScript, что предотвращает их кражу с помощью XSS (Cross-Site Scripting) атак. Добавьте флаг HttpOnly при установке куки. Set-Cookie: sessionId=abc123; HttpOnly 🟠Флаг SameSite Предотвращает отправку куки на другие сайты, что защищает от CSRF (Cross-Site Request Forgery) атак. Добавьте флаг SameSite при установке куки. Варианты включают Strict, Lax, и None. Set-Cookie: sessionId=abc123; SameSite=Strict 🟠Шифрование содержимого куки Делает данные бесполезными для злоумышленников, даже если они смогут украсть куки. Используйте серверные библиотеки для шифрования и дешифрования данных в куки перед отправкой и после получения. 🟠Подпись куки С помощью HMAC (Hash-based Message Authentication Code) позволяет проверить целостность и подлинность данных в куки. Используйте секретный ключ для генерации HMAC подписи и добавьте её к куки. import hmac import hashlib secret_key = b'secret' cookie_value = b'sessionId=abc123' signature = hmac.new(secret_key, cookie_value, hashlib.sha256).hexdigest() cookie = f'{cookie_value.decode()}; Signature={signature}' 🟠Защита от XSS атак Могут использоваться для кражи куки. Включает в себя валидацию и фильтрацию пользовательских вводов, использование Content Security Policy (CSP) и безопасное кодирование данных. Внедрите валидацию и фильтрацию вводов на стороне сервера, настройте CSP заголовки. Content-Security-Policy: script-src 'self' 🟠Регулярное обновление и истечение срока действия куки Значений куки и установка короткого срока действия уменьшает временное окно для атакующих. Устанавливайте короткий срок действия и обновляйте значение куки при каждой сессии. Set-Cookie: sessionId=abc123; Max-Age=3600 # 1 час Ставь 👍 и 📚 @backendquiz
96
10
🤔 Что такое SOLID? Это акроним, представляющий пять основных принципов объектно-ориентированного программирования и дизайна, которые помогают разработчикам создавать более понятный, гибкий и поддерживаемый код. Эти принципы были предложены Робертом Мартином (известным также как Uncle Bob) и являются основополагающими в области программной инженерии. 🟠Single Responsibility Principle (Принцип единственной ответственности) Этот принцип гласит, что у каждого класса должна быть только одна причина для изменения, то есть класс должен иметь только одну ответственность или задачу. Это помогает уменьшить сложность и повысить читаемость кода, делая его более управляемым и легким для поддержки. Когда класс выполняет лишь одну задачу, его легче тестировать и изменять без влияния на другие части системы. 🟠Open/Closed Principle (Принцип открытости/закрытости) Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации. Это означает, что поведение классов должно быть расширяемым без изменения их исходного кода. Для реализации этого принципа часто используются абстракции и интерфейсы, которые позволяют добавлять новые функции через наследование и полиморфизм, не нарушая существующий код. 🟠Liskov Substitution Principle (Принцип подстановки Барбары Лисков) Объекты подклассов должны быть заменяемы объектами суперклассов без нарушения правильности программы. Это означает, что если у нас есть базовый класс и его подкласс, то мы должны иметь возможность заменить экземпляры базового класса экземплярами подкласса без изменения желаемого поведения программы. Этот принцип поддерживает полиморфизм и гарантирует, что производные классы могут корректно взаимодействовать с остальным кодом. 🟠Interface Segregation Principle (Принцип разделения интерфейсов) Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип направлен на создание узкоспециализированных интерфейсов, которые являются специфичными для отдельных клиентов. Таким образом, классы, реализующие эти интерфейсы, не будут обязаны реализовывать методы, которые им не нужны. Это уменьшает сложность и улучшает управляемость кода, а также способствует гибкости и повторному использованию интерфейсов. 🟠Dependency Inversion Principle (Принцип инверсии зависимостей) Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба типа модулей должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимости высокоуровневого кода от низкоуровневых деталей, что позволяет легче изменять и тестировать систему. Реализация этого принципа часто включает использование инверсии управления (IoC) и внедрения зависимостей (DI), что способствует созданию более гибких и модульных архитектур. Ставь 👍 и 📚 @backendquiz
90
11
🤔 Что такое XML? XML (Extensible Markup Language) — это расширяемый язык разметки, используемый для представления структурированных данных в формате, который легко читается как человеком, так и машиной. XML разработан для хранения и обмена данными между различными системами и платформами. 🚩Основные характеристики 🟠Расширяемость XML позволяет создавать собственные теги, что делает его гибким для различных применений и доменов. 🟠Читаемость XML-документы легко читаются и понимаются человеком благодаря текстовому формату. 🟠Структурированность XML-документы имеют четкую иерархическую структуру, которая делает их удобными для хранения сложных данных. 🟠Платформенная независимость XML является текстовым форматом, что делает его совместимым с любыми операционными системами и приложениями. 🚩Структура XML-документа 🟠Пролог Опциональная часть, которая может содержать информацию о версии XML и кодировке документа. 🟠Корневой элемент Каждый XML-документ должен иметь один корневой элемент, который содержит все остальные элементы. 🟠Элементы (теги) Основные строительные блоки XML-документа. Элементы могут содержать текст, другие элементы и атрибуты. XML Basics John Doe 2023 🟠Атрибуты Дополнительные данные, связанные с элементами. Атрибуты задаются внутри открывающего тега. XML Basics John Doe 2023 Пример XML-документа XML Basics John Doe 2023 Learning XML Jane Smith 2022 🚩Плюсы и минусы ➕Интероперабельность XML используется для обмена данными между различными системами и приложениями, обеспечивая совместимость. ➕Гибкость Пользователи могут создавать собственные теги и атрибуты, что делает XML пригодным для различных областей применения. ➕Стандартизация XML является стандартом, поддерживаемым многими технологиями и инструментами. ➕Валидация XML-документы могут быть проверены на соответствие определенной структуре с помощью схем XML Schema (XSD) или DTD (Document Type Definition). ➖Объемность XML может быть довольно объемным из-за избыточности тегов, что может привести к увеличению размера данных. ➖Сложность парсинга Обработка и парсинг XML-документов может быть сложным и требовать значительных вычислительных ресурсов по сравнению с другими форматами, такими как JSON. Ставь 👍 и 📚 @backendquiz
67
12
🤔 Что такое идемпотентность? Идемпотентность — это свойство операции, при котором повторное выполнение этой операции приводит к тому же результату, что и однократное выполнение. Это понятие часто используется в контексте HTTP методов, API запросов и транзакций в системах с распределенной архитектурой. 🚩Основные аспекты идемпотентности 🟠Идемпотентные операции GET: Получение ресурса. Повторный запрос не изменяет состояние ресурса. PUT: Обновление или создание ресурса. Повторный запрос с одинаковыми данными приводит к одному и тому же состоянию ресурса. DELETE: Удаление ресурса. Повторный запрос удаляет ресурс, если он существует, или не изменяет состояние, если ресурс уже удален. 🟠Неидемпотентные операции POST: Создание нового ресурса. Повторный запрос приводит к созданию нового ресурса с новым идентификатором, что изменяет состояние системы. 🚩Примеры идемпотентности GET запрос GET /user/123 PUT запрос PUT /user/123 { "name": "John Doe", "age": 30 } Идемпотентная операция UPDATE users SET name = 'John Doe' WHERE id = 123; Неидемпотентная операция INSERT INTO users (name, age) VALUES ('John Doe', 30); 🚩Зачем нужна идемпотентность 🟠Повышение надежности Идемпотентные операции помогают в обеспечении надежности и устойчивости систем, особенно в условиях повторных запросов из-за сетевых сбоев или таймаутов. 🟠Упрощение обработки ошибок При сбоях в системе легче повторно выполнить идемпотентную операцию, не беспокоясь о непредвиденных изменениях состояния. 🟠Удобство разработки Идемпотентность упрощает разработку и тестирование, так как позволяет предсказуемо управлять состоянием системы при повторных запросах. Ставь 👍 и 📚 @backendquiz
91
13
🤔 Что такое cherrypick? Это команда в системе управления версиями Git, которая позволяет выбрать один или несколько конкретных коммитов из одной ветки и применить их в другую ветку. Это полезно, когда нужно перенести отдельные изменения без необходимости слияния целых веток. 🚩Основные аспекты cherry-pick 🟠Избирательное применение коммитов Позволяет выбрать конкретные изменения из истории одной ветки и перенести их в другую ветку. 🟠Избежание полного слияния В отличие от обычного слияния (merge), cherry-pick переносит только выбранные коммиты, а не всю историю изменений. 🚩Как использовать cherry-pick Основной синтаксис git cherry-pick 🚩Пример использования 🟠Переход на целевую ветку Переключитесь на ветку, в которую нужно перенести изменения. git checkout target-branch 🟠Применение коммита Используйте команду cherry-pick, чтобы применить нужный коммит. git cherry-pick a1b2c3d4 🟠Решение конфликтов (если они возникли) Если во время cherry-pick возникают конфликты, Git предложит их решить. Разрешите конфликты, затем завершите процесс: git add git cherry-pick --continue Предположим, у вас есть коммит с хешем a1b2c3d4 в ветке feature-branch, который вы хотите перенести в main-branch. git checkout main-branch git cherry-pick a1b2c3d4 🚩Когда использовать cherry-pick 🟠Перенос исправлений Когда нужно быстро перенести исправление из одной ветки в другую (например, багфикс из develop в release). 🟠Избирательное применение новых функций Когда нужно перенести конкретную функцию или изменение без переноса всей ветки. 🚩Ограничения и риски 🟠Конфликты Перенос коммитов может вызвать конфликты, особенно если изменяемые файлы были модифицированы в целевой ветке. 🟠Историческая чистота Частое использование cherry-pick может запутать историю изменений, так как один и тот же коммит будет существовать в нескольких ветках с разными хешами. Ставь 👍 и 📚 @backendquiz
121
14
🤔 Почему синглтон называют антипаттерном? Синглтон считается антипаттерном в некоторых случаях и для некоторых разработчиков, несмотря на его популярность, из-за множества потенциальных проблем, которые он может вызвать. 🟠Глобальное состояние Синглтон представляет собой глобальное состояние, которое может изменяться из любого места в программе. Это приводит к трудностям в отслеживании и понимании изменений состояния, что усложняет отладку и тестирование. 🟠Нарушение принципов ООП Синглтон нарушает принцип единственной ответственности (SRP - Single Responsibility Principle), так как он сочетает в себе функциональность и управление своим экземпляром. Это также нарушает принцип инверсии зависимостей (DIP - Dependency Inversion Principle), так как клиенты напрямую зависят от конкретного класса. 🟠Тестируемость Синглтоны усложняют написание модульных тестов, так как глобальное состояние сохраняется между тестами, что может приводить к непредсказуемому поведению. Мокинг (mocking) и подмена синглтона в тестах также становятся сложными задачами. 🟠Жесткие зависимости Использование синглтона создает жесткие зависимости между классами, что делает код менее гибким и увеличивает связность. Это затрудняет изменение и поддержку кода в будущем. 🟠Масштабируемость и многопоточность Синглтоны могут создавать проблемы в многопоточных приложениях. Обеспечение потокобезопасности требует дополнительных усилий, а ошибки в реализации могут привести к состояниям гонки и другим проблемам. 🟠Легаси код и сложность Синглтоны часто приводят к созданию легаси кода, который трудно модифицировать и расширять. В больших проектах синглтоны могут усложнять структуру кода и его поддержку. Ставь 👍 и 📚 @backendquiz
127
15
🤔 Что такое рекурсия? Это метод программирования, при котором функция вызывает саму себя для решения подзадачи, являющейся частью общей задачи. Такой подход применяется, когда проблему можно разделить на более мелкие аналогичные части. 🚩Как это работает? При вызове рекурсивной функции создается новый контекст выполнения, в котором хранятся ее локальные переменные и текущий прогресс. Каждый новый вызов функции откладывается в стек вызовов, пока не будет достигнуто базовое условие (условие выхода), после чего начинается обратный процесс – возвращение значений и сворачивание стека. 🚩Где используется рекурсия? 🟠Алгоритмы обхода структур данных например, обход деревьев (DFS) или графов. 🟠Разбиение задач например, алгоритм "разделяй и властвуй" (быстрая сортировка, сортировка слиянием). 🟠Работа с комбинаторикой вычисление факториала, чисел Фибоначчи, генерация перестановок. 🟠Парсинг и разбор выражений например, в компиляторах для обработки синтаксических деревьев. 🚩Плюсы ➕Позволяет писать лаконичный и выразительный код. ➕Упрощает реализацию некоторых алгоритмов, особенно работающих с деревьями и графами. ➕Естественно подходит для задач, решаемых методом "разделяй и властвуй". 🚩Минусы ➖Использует стек вызовов, что может привести к переполнению (Stack Overflow). ➖Часто менее эффективна, чем итерация, из-за накладных расходов на создание новых контекстов выполнения. ➖Может требовать оптимизации, например, через хвостовую рекурсию (tail recursion). Ставь 👍 и 📚 @backendquiz
129
16
🤔 Что в твоем понимании значит правильный код? Это код, который не только выполняет поставленные задачи, но и соответствует ряду критериев, обеспечивающих его качество, читаемость, сопровождение и эффективность. 🚩Характеристики 🟠Читаемость Переменные, функции, классы и другие сущности должны иметь понятные и описательные имена, которые отражают их назначение. Следование стандартам кодирования и стиля, включая правильное форматирование, отступы и использование комментариев. Использование комментариев для объяснения сложных или неочевидных частей кода, но не для очевидных вещей, которые можно понять из названий переменных и функций. 🟠Сопровождаемость Код должен быть разбит на модули, функции или классы с чётко определёнными задачами. Это упрощает его понимание, тестирование и изменение. Избегание дублирования кода через применение принципа DRY (Don't Repeat Yourself). Код должен быть легко тестируемым. Написание автоматических тестов для проверки корректности работы помогает предотвратить ошибки. 🟠Эффективность Код должен быть оптимизирован для выполнения задач с минимальными затратами ресурсов, таких как время выполнения и использование памяти. Использование эффективных алгоритмов и структур данных для обеспечения хорошей производительности, особенно на больших объемах данных. 🟠Надежность Код должен корректно обрабатывать ошибки и исключительные ситуации, предотвращая неожиданные сбои. Проверка входных данных для предотвращения некорректного поведения программы. 🟠Документированность Написание документации, описывающей основные компоненты системы, их взаимодействие и использование. Хорошо документированный код облегчает его понимание для других разработчиков. 🟠Применение принципов и паттернов проектирования Применение принципов SOLID для создания устойчивого, гибкого и масштабируемого кода. Использование проверенных решений для общих задач проектирования. 🚩Примеры Читаемость и сопровождаемость def calculate_area(radius): """Calculate the area of a circle given its radius.""" import math if radius < 0: raise ValueError("Radius cannot be negative") return math.pi * radius ** 2 Тестируемость def add(a, b): """Add two numbers and return the result.""" return a + b # Unit test for the add function def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0 assert add(0, 0) == 0 test_add() Ставь 👍 и 📚 @backendquiz
113
17
🤔 Назови четыре уровня изоляции транзакций? 🚩Уровни изоляции 🟠Read Uncommitted (Чтение незафиксированных данных) Транзакция может читать данные, измененные другой транзакцией, даже если та еще не зафиксирована. Грязные чтения, неповторимые чтения и фантомные чтения. Редко используется на практике из-за высокого риска неконсистентных данных. 🟠Read Committed (Чтение зафиксированных данных) Транзакция видит только те изменения, которые были зафиксированы другими транзакциями. Незафиксированные изменения не видны. Неповторимые чтения и фантомные чтения. Широко используется, обеспечивает баланс между производительностью и консистентностью данных. 🟠Repeatable Read (Повторяемое чтение) Гарантирует, что если транзакция повторно читает данные, она получит те же самые значения, даже если другие транзакции изменяют данные. Фантомные чтения. Используется, когда требуется более высокий уровень консистентности данных, но допускаются фантомные чтения. 🟠Serializable (Сериализуемый) Обеспечивает максимальный уровень изоляции. Транзакции выполняются так, как если бы они были сериализованы, то есть последовательно. Нет. Обеспечивает наивысшую консистентность данных, но может значительно снижать производительность из-за блокировок и задержек. 🚩Аномалии 🟠Грязное чтение (Dirty Read) Происходит, когда транзакция читает данные, измененные другой транзакцией, которая еще не зафиксирована. Уровень Read Uncommitted допускает эту аномалию. 🟠Неповторимое чтение (Non-repeatable Read) Происходит, когда транзакция читает те же данные несколько раз и получает разные значения из-за фиксации изменений другой транзакцией. Уровни Read Committed и выше предотвращают грязные чтения, но Read Committed допускает неповторимые чтения. 🟠Фантомное чтение (Phantom Read) Происходит, когда транзакция выполняет одно и то же запрос несколько раз и видит разные наборы строк из-за вставки, обновления или удаления данных другой транзакцией. Уровень Repeatable Read предотвращает неповторимые чтения, но допускает фантомные чтения. Уровень Serializable предотвращает все три аномалии. Ставь 👍 и 📚 @backendquiz
100
18
🤔 Что такое 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
97
19
🤔 В чем разница между Postgres и MySQL? Это реляционные системы управления базами данных (СУБД), но у них есть значительные различия, которые влияют на выбор той или иной системы в зависимости от проекта. 🟠Архитектура и модель хранения данных PostgreSQL — объектно-реляционная СУБД (ORDBMS), поддерживающая расширяемость, сложные структуры данных и расширенные функции. Она использует MVCC (Multiversion Concurrency Control) для обработки транзакций. MySQL — классическая реляционная СУБД (RDBMS). По умолчанию использует механизм хранения InnoDB, который поддерживает ACID, но менее гибок, чем у PostgreSQL. 🟠Язык SQL и расширенные функции PostgreSQL поддерживает более сложные SQL-конструкции, такие как CTE (Common Table Expressions), оконные функции, пользовательские типы данных и полнотекстовый поиск. MySQL менее гибок в плане сложных SQL-запросов, хотя в новых версиях поддержка CTE и оконных функций была добавлена. 🟠Производительность MySQL лучше работает на простых чтениях и небольших нагрузках, особенно в веб-приложениях, где важна скорость выполнения запросов. PostgreSQL более оптимизирован для сложных аналитических запросов, работы с большими объемами данных и параллельной обработки. 🟠Расширяемость PostgreSQL позволяет добавлять новые типы данных, операторы и даже писать пользовательские функции на различных языках (PL/pgSQL, Python, JavaScript и др.). MySQL менее гибок, хотя поддерживает хранимые процедуры и триггеры. 🟠Совместимость с ACID и репликация PostgreSQL полностью ACID-совместим, поддерживает сложные транзакции и строгую консистентность данных. MySQL тоже поддерживает ACID (через InnoDB), но раньше его главная фишка была в высокой скорости за счет возможного ослабления требований к консистентности. 🟠Масштабируемость и репликация MySQL традиционно использовался для масштабирования за счет мастер-слейв репликации и шардинга. PostgreSQL поддерживает логическую и потоковую репликацию, а также такие расширения, как Citus, позволяющие эффективно масштабировать базу данных горизонтально. 🟠Поддержка JSON и NoSQL-функций PostgreSQL изначально поддерживает JSONB, что делает его хорошим выбором для гибридных реляционно-документных решений. MySQL тоже поддерживает JSON, но его функциональность более ограничена. 🟠Сообщество и лицензия PostgreSQL — полностью open-source (лицензия PostgreSQL), активно развивается сообществом. MySQL принадлежит Oracle, и хотя есть open-source-версия, некоторые функции доступны только в коммерческих редакциях. Ставь 👍 и 📚 @backendquiz
105
20
🤔 Почему возрастает интерес к функциональному программированию (FP)? Интерес к функциональному программированию (Functional Programming) растёт из-за изменений в требованиях к разработке современных приложений, таких как потребность в масштабируемости, управлении сложностью и обработке больших данных. Функциональное программирование предлагает преимущества, которые позволяют решать эти задачи более эффективно. 🚩Основные причины роста интереса к FP 🟠Эффективная обработка многопоточности и параллелизма Функциональное программирование делает акцент на чистых функциях, которые не имеют побочных эффектов. Это упрощает разработку многопоточных приложений, поскольку отсутствует необходимость синхронизации общего состояния. Языки, такие как Scala, Clojure, и Haskell, предоставляют мощные инструменты для работы с параллелизмом и потоками данных, что важно в эпоху многоядерных процессоров. 🟠Масштабируемость и управление состоянием Современные распределённые системы требуют минимизации работы с изменяемым состоянием. FP, с его подходом к неизменяемым данным, позволяет избегать проблем, связанных с изменяемостью, таких как гонки данных или сложные состояния. 🟠Обработка больших данных Фреймворки, такие как Apache Spark и Apache Flink, используют концепции функционального программирования (например, операции над коллекциями, как map, filter, reduce) для работы с большими данными. Это делает FP особенно полезным для обработки потоков данных и анализа больших объёмов информации. 🟠Повышение читаемости и предсказуемости кода Код, написанный в функциональном стиле, становится легче для анализа и тестирования благодаря принципам: Чистые функции: результат функции зависит только от входных данных. Неизменяемость данных: данные не меняются после создания. Декларативный стиль: упор на то, что должно быть сделано, а не как. 🟠Популяризация функциональных возможностей в императивных языках Основные императивные языки программирования (Java, Python, JavaScript, C#) добавляют функциональные возможности, такие как лямбды, стримы и функции высшего порядка. Это делает функциональный стиль более доступным для широкой аудитории разработчиков. 🟠Повышение надёжности кода Исключение побочных эффектов уменьшает количество ошибок. Код становится проще для тестирования, так как функции можно протестировать в изоляции. Система типов в функциональных языках, таких как Haskell, гарантирует большую безопасность, что снижает вероятность ошибок в рантайме. 🟠Тенденции к модульности и повторному использованию кода FP способствует созданию более модульного кода. Композиция функций позволяет легко строить новые функциональности из существующих компонентов. 🟠Популярность в веб-разработке и мобильных приложениях Языки, такие как Elm, ReasonML, и фреймворки, например React (с концепцией функциональных компонентов), активно используют принципы функционального программирования. Это позволяет создавать приложения с минимальным количеством багов и высокой предсказуемостью поведения. Ставь 👍 и 📚 @backendquiz
95