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

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

Открыть в Telegram

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

Больше
1 726
Подписчики
Нет данных24 часа
Нет данных7 дней
-930 день
Привлечение подписчиков
июль '26
июль '26
+1
в 0 каналах
июнь '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 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
12 июля0
11 июля0
10 июля0
09 июля0
08 июля0
07 июля0
06 июля0
05 июля0
04 июля0
03 июля0
02 июля+1
01 июля0
Посты канала
🤔 Как обнаружить самые затратные запросы? Обнаружение самых затратных запросов важно для оптимизации производительности базы данных. Затратные запросы могут потреблять больше ресурсов, чем необходимо, что приводит к увеличению времени выполнения, нагрузке на сервер и замедлению работы системы. Существует несколько подходов и инструментов для выявления таких запросов. 🚩Включение логирования медленных запросов (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

2
🤔Как определить, что у кода плохая организация? Плохая организация кода — это один из главных факторов, который делает поддержку и развитие проекта сложными. Определить, что код плохо организован, можно по следующим признакам: 🟠Отсутствие структуры - Файлы и каталоги разбросаны хаотично. - Код находится в одном огромном файле без логического разделения. - Нет четкой модулярности (всё смешано в одном месте). 🟠Дублирование кода - Один и тот же фрагмент кода повторяется в разных местах вместо вынесения в отдельные функции или классы. - При внесении изменений приходится исправлять одну и ту же логику в нескольких местах. 🟠Чрезмерная сложность - Функции или методы слишком длинные и делают слишком много. - Код трудно читать из-за вложенных конструкций (if, for, while и т. д.). - Используются сложные алгоритмы там, где можно было бы обойтись более простыми. 🟠Нарушение принципов SOLID - Один класс выполняет несколько задач (нарушение *Single Responsibility Principle*). - Сильная зависимость между модулями (нарушение *Dependency Inversion Principle*). - Проблемы с расширяемостью кода. 🟠Плохие наименования переменных, функций и классов - Используются непонятные или слишком короткие названия (a, x1, doSomething). - Название не отражает суть выполняемой операции. 🟠Отсутствие или избыточная документация - Если документации нет, код сложно понять. - Если документации слишком много, и она не актуальна, это также мешает. 🟠Сильная связанность (high coupling) - Компоненты сильно зависят друг от друга, что усложняет тестирование и внесение изменений. - Модули не могут использоваться независимо. 🟠Отсутствие тестов - Если код сложно протестировать, это признак плохой организации. - Нет юнит-тестов или они покрывают только тривиальные случаи. 🟠Отсутствие обработчиков ошибок - Ошибки не логируются, а просто подавляются (try...catch с пустым catch). - Ошибки обрабатываются хаотично. 🟠Проблемы с производительностью - Избыточное потребление памяти или процессорных ресурсов из-за неоптимальных алгоритмов. - Использование ненужных циклов, повторные вызовы функций. Ставь 👍 и 📚 @backendquiz
61
3
🤔 Почему 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
82
4
🤔 Взаимодействие с асинхронной коммуникацией в распределённых системах Позволяет компонентам обмениваться данными и выполнять задачи независимо друг от друга, не дожидаясь завершения операций. Асинхронное общение широко применяется в микросервисных архитектурах и других распределённых системах, так как повышает масштабируемость, гибкость и отказоустойчивость системы. 🚩Принципы и подходы 🟠Использование очередей сообщений и брокеров Очереди сообщений (например, RabbitMQ, Apache Kafka, Amazon SQS) помогают отправлять и получать сообщения асинхронно, обеспечивая буфер между отправителем и получателем. Брокеры сообщений сохраняют сообщения до тех пор, пока получатель не будет готов их обработать, что помогает управлять потоками данных и уравновешивать нагрузку. Такой подход позволяет отправителю отправить сообщение и сразу продолжить свою работу, не дожидаясь ответа, что повышает производительность системы. 🟠Паттерн «Издатель-подписчик» (Publish-Subscribe) В модели «издатель-подписчик» компоненты могут публиковать события, на которые подписаны другие компоненты, а брокер сообщений доставляет события всем подписчикам. Этот паттерн позволяет системе оставаться слабосвязанной, так как издатель не знает, сколько и какие конкретно сервисы получат событие. Такие системы часто применяются для уведомлений, регистрации событий, обработки данных и отправки уведомлений нескольким сервисам одновременно. 🟠Паттерн «Очередь задач» В очереди задач сообщения представляют собой задачи для выполнения, которые обрабатываются одним или несколькими исполнителями. Этот паттерн полезен для распределения нагрузки на сервисы, позволяя выполнять задачи асинхронно, когда они становятся доступны, и автоматически управлять потоками. Например, задача по отправке электронной почты может быть помещена в очередь и обработана отдельным рабочим процессом, что освобождает основной сервис от ожидания завершения отправки. 🚩Плюсы ➕Повышенная производительность и масштабируемость, так как сервисы могут продолжать работу без ожидания ответа. ➕Отказоустойчивость и стабильность за счёт независимости сервисов и использования брокеров сообщений. ➕Гибкость и низкая связанность компонентов, что позволяет легко модифицировать систему и добавлять новые сервисы. 🚩Минусы ➖Увеличенная сложность обработки сообщений и согласованности данных. ➖Возможные задержки доставки, повторные сообщения и необходимость работы с идемпотентностью. ➖Сложности с отладкой и мониторингом взаимодействий между сервисами. Ставь 👍 и 📚 @backendquiz
86
5
🤔 Что тебе известно о бинарном дереве? Это структура данных, в которой каждый узел имеет не более двух дочерних узлов. Эти дочерние узлы называются левым и правым дочерними узлами. В бинарном дереве может быть один или несколько уровней узлов, начиная с корневого узла, который является начальной точкой дерева. 🚩Основные термины 🟠Узел (Node) Основной элемент бинарного дерева, содержащий данные и ссылки на дочерние узлы. 🟠Корень (Root) Верхний узел дерева, не имеющий родительских узлов. 🟠Лист (Leaf) Узел, не имеющий дочерних узлов. 🟠Ветвь (Branch) Путь от корня к любому другому узлу. 🟠Высота дерева Максимальное количество уровней от корня до самого нижнего листа. 🟠Глубина узла Расстояние от корня до данного узла. 🚩Виды 🟠Полное бинарное дерево Все уровни, кроме, возможно, последнего, полностью заполнены, и все узлы последнего уровня выровнены влево. 🟠Совершенное бинарное дерево Все уровни полностью заполнены, и каждый узел имеет два дочерних узла, кроме листьев. 🟠Двоичное дерево поиска (Binary Search Tree, BST) Для каждого узла все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше значения узла. 🚩Основные операции 🟠Добавление узла (Insertion) Процесс вставки нового узла в дерево. В случае двоичного дерева поиска, новый узел вставляется в соответствующее место, чтобы сохранить порядок элементов. 🟠Удаление узла (Deletion) Процесс удаления узла из дерева. Может потребовать реорганизации дерева для поддержания его свойств. 🟠Поиск (Search) Процесс нахождения узла с определенным значением. В двоичном дереве поиска это осуществляется быстрее благодаря упорядоченности узлов. 🟠Обход дерева (Traversal) Процесс посещения всех узлов дерева в определенном порядке. Основные методы обхода: 🚩Применение 🟠Хранение отсортированных данных Бинарное дерево поиска позволяет эффективно хранить и извлекать отсортированные данные. 🟠Поисковые системы Использование деревьев для организации и поиска данных. 🟠Алгоритмы и структуры данных Базовая структура для многих алгоритмов, включая сортировки, балансировки и другие операции с данными. 🟠Компиляторы и интерпретаторы Используются для построения и обработки синтаксических деревьев при разборе кода. Ставь 👍 и 📚 @backendquiz
80
6
🤔 Какие существуют типы баз данных? Существуют различные типы баз данных, каждый из которых предназначен для определенных задач и сценариев использования. Основные типы баз данных включают: 🟠Реляционные базы данных (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
89
7
🤔 Что такое 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
72
8
🤔 Для чего используют redis в проектах? Это высокопроизводительная система управления базами данных, работающая в памяти (in-memory), которая поддерживает множество структур данных, таких как строки, списки, множества, хэш-таблицы и другие. Redis широко используется в современных проектах благодаря своей скорости и функциональности. 🚩Основные применения 🟠Кэширование данных Снижение нагрузки на базу данных: Кэширование часто запрашиваемых данных в Redis позволяет снизить нагрузку на основную базу данных и ускорить время ответа. Ускорение доступа к данным: Быстрое чтение данных из памяти обеспечивает низкую задержку и высокую производительность. 🟠Хранение сессий Управление сессиями пользователей: Redis часто используется для хранения сессионных данных пользователей в веб-приложениях благодаря своей скорости и поддержке автоматического удаления старых данных (TTL). 🟠Очереди задач и сообщений Асинхронные задачи: Redis используется для реализации очередей задач в таких системах, как Celery. Это позволяет распределять и выполнять задачи асинхронно и эффективно. Сообщения и события: Redis поддерживает механизм Pub/Sub для организации обмена сообщениями между различными частями приложения. 🟠Хранилище временных данных Счётчики и трекеры: Используется для хранения временных данных, таких как счётчики посещений, лайков, просмотров и других показателей, которые часто обновляются. Краткосрочные данные: Хранение временных данных, которые необходимы на короткий срок и могут быть удалены после их использования. 🟠Репликация и отказоустойчивость Репликация данных: Redis поддерживает мастеровую репликацию, что позволяет создавать копии данных на нескольких серверах для обеспечения отказоустойчивости и балансировки нагрузки. Снятие резервных копий: Redis поддерживает создание резервных копий данных, что обеспечивает восстановление в случае сбоев. 🟠Реализация сложных структур данных Работа с временными рядами: Redis позволяет эффективно управлять временными рядами данных, используя такие структуры, как списки и отсортированные множества. Графы и социальные сети: Использование структур данных Redis для реализации графов и сетей, что полезно в социальных сетях и рекомендательных системах. 🟠Функции блокировок Реализация распределённых блокировок: Redis позволяет создавать механизмы блокировок для управления доступом к ресурсам в распределённых системах. 🚩Примеры использования 🟠Веб-приложения Кэширование результатов запросов к базе данных. Хранение сессионных данных пользователей. Управление очередями задач для обработки данных в фоне. 🟠Мобильные приложения Кэширование API-запросов для уменьшения задержек. Хранение временных данных и метрик использования. 🟠Игровые приложения Хранение текущих состояний игр и информации о пользователях. Реализация лидеров и таблиц рекордов. 🟠Аналитические системы Кэширование результатов аналитических запросов. Управление счётчиками и метриками в реальном времени. Ставь 👍 и 📚 @backendquiz
81
9
🤔 Что такое 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
89
10
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» (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
11
🤔 Какие принципы программирования бывают? Программирование включает множество принципов, которые помогают разработчикам создавать эффективный, читаемый и поддерживаемый код. 🚩Принципы 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
82
12
🤔 Что такое операция 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
111
13
🤔 Как выбрать данные из двух таблиц без метода 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
111
14
🤔 Какая разница между аутентификацией и авторизацией? Аутентификация — это процесс проверки личности пользователя, чтобы убедиться, что он тот, за кого себя выдает (например, ввод логина и пароля). Авторизация — это процесс предоставления прав доступа к ресурсам после успешной аутентификации, определяющий, что пользователь может или не может делать в системе (например, доступ к определенным файлам или функциям). 🚩Аутентификация (Authentication) Она подтверждает, что пользователь является тем, за кого он себя выдает. 🟠Цель Убедиться, что пользователь действительно тот, кем он себя называет. 🟠Методы аутентификации Пароли: Пользователь вводит пароль, который проверяется на соответствие сохраненному в системе. Биометрические данные: Отпечатки пальцев, распознавание лица, голосовая идентификация. Токены: Аппаратные устройства или программные токены, генерирующие одноразовые коды. Сертификаты: Использование цифровых сертификатов для проверки подлинности. Многофакторная аутентификация (MFA): Комбинация нескольких методов (например, пароль + одноразовый код). 🟠Пример Вход в систему с помощью имени пользователя и пароля. 🚩Авторизация (Authorization) Она контролирует доступ к ресурсам и действиям на основе уровня доступа пользователя. 🟠Цель Определить, какие действия пользователю разрешено выполнять и к каким ресурсам он имеет доступ. 🟠Методы авторизации Ролевое управление доступом (RBAC): Назначение ролей пользователям, каждая из которых имеет определенные права доступа. Управление доступом на основе атрибутов (ABAC): Использование атрибутов (например, время дня, местоположение) для определения прав доступа. Списки контроля доступа (ACL): Определение конкретных прав доступа для каждого ресурса и пользователя. 🟠Пример После входа в систему (аутентификации) пользователь может иметь доступ только к определенным разделам или функциям приложения, в зависимости от его роли (авторизация). 🚩Основные различия 🟠Цель Аутентификация: Подтвердить личность пользователя. Авторизация: Определить, к каким ресурсам и действиям пользователь имеет доступ. 🟠Когда происходит Аутентификация: Первым шагом перед предоставлением доступа к системе. Авторизация: После аутентификации, для контроля доступа к ресурсам и действиям. 🟠Основные вопросы Аутентификация: Кто вы? Авторизация: Что вам разрешено делать? Ставь 👍 и 📚 @backendquiz
109
15
🤔 В чем суть принципа REST? Суть принципа REST (Representational State Transfer) заключается в том, чтобы предоставить простой, масштабируемый и гибкий способ взаимодействия между клиентом и сервером через веб. Основные принципы REST включают: 🟠Клиент-серверная архитектура Клиент и сервер разделены, что позволяет независимое развитие и масштабирование обеих сторон. Клиент делает запросы, а сервер обрабатывает их и возвращает ответы. 🟠Бесподсессионное взаимодействие (stateless) Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки. Сервер не сохраняет состояние между запросами. 🟠Кешируемость Ответы на запросы могут быть помечены как кешируемые или не кешируемые. Это позволяет клиентам сохранять копии ответов и уменьшать количество запросов к серверу. 🟠Единый интерфейс (Uniform Interface) Определяет единые методы взаимодействия с ресурсами: GET: Получение ресурса. POST: Создание нового ресурса. PUT: Обновление ресурса. DELETE: Удаление ресурса. 🟠Многоуровневая система Архитектура может быть построена из нескольких слоев, что повышает гибкость и возможность кэширования. 🟠Представление ресурсов (Representations) Ресурсы могут представляться в различных форматах (например, JSON, XML). Клиент и сервер договариваются о формате через заголовки HTTP. Ставь 👍 и 📚 @backendquiz
116
16
🤔 Что такое транзакция? Транзакция в контексте баз данных - это последовательность операций, выполняемых как единое целое. Она должна быть полностью выполнена или полностью отменена, чтобы обеспечить целостность и консистентность данных. Основные свойства транзакции определяются набором правил, известных как ACID: 🚩ACID свойства 🟠Atomicity (Атомарность): Транзакция либо выполняется полностью, либо не выполняется вовсе. Если происходит ошибка, все операции транзакции откатываются. Например, в банковской системе перевод денег между счетами требует списания суммы с одного счета и зачисления на другой. Если одна из операций не выполнится, другая также должна быть отменена. 🟠Consistency (Консистентность): После завершения транзакции данные должны оставаться в согласованном состоянии, соответствующем всем определенным правилам и ограничениям. В инвентарной системе при добавлении нового товара должна проверяться допустимость всех значений, таких как положительное количество и правильная категория. 🟠Isolation (Изоляция): Выполнение транзакций изолировано друг от друга, так что параллельные транзакции не влияют на промежуточные состояния друг друга. Если две транзакции пытаются изменить одни и те же данные, одна из них должна завершиться до того, как другая начнет свои изменения, чтобы избежать конфликтов. 🟠Durability (Долговечность): После завершения транзакции её результаты сохраняются даже в случае сбоя системы. Если транзакция по записи данных в базу данных завершилась успешно, данные останутся сохраненными даже после перезагрузки сервера. 🚩Этапы выполнения транзакции 1⃣начало выполнения транзакции. 2⃣Выполняются все необходимые операции (вставка, обновление, удаление и т.д.). 3⃣Если все операции выполнены успешно, изменения фиксируются. 4⃣Если произошла ошибка, все изменения отменяются, возвращая базу данных в исходное состояние. 🚩Применение транзакций 🟠Обеспечивают целостность операций перевода денежных средств. 🟠Гарантируют корректное обновление информации о заказах и инвентаре. 🟠Обеспечивают корректность резервирования мест или ресурсов. Ставь 👍 и 📚 @backendquiz
115
17
🤔 Что такое полиморфизм? Это один из фундаментальных принципов объектно-ориентированного программирования (ООП), который позволяет объектам разного типа обрабатывать данные по-разному, используя один и тот же интерфейс. Основная идея полиморфизма заключается в том, что метод или функция могут принимать объекты разных классов и корректно выполнять для них свою работу, не зная их конкретного типа заранее. 🚩Основные виды полиморфизма 🟠Полиморфизм подтипов (ад-хок полиморфизм) Это форма полиморфизма, при которой функция или метод могут быть применены к аргументам разных типов. В ООП это достигается через наследование и интерфейсы. Классический пример – это использование базового класса или интерфейса, когда конкретная реализация определяется в дочерних классах. Пример: метод draw() может быть определен в интерфейсе Shape, а конкретная реализация этого метода – в классах Circle, Square, Triangle. 🟠Параметрический полиморфизм (универсальный полиморфизм) Это форма полиморфизма, при которой функции или методы могут работать с любыми типами данных. Обычно это реализуется через использование обобщенных типов (generics). Например, в языке Java или C# можно создать класс или метод, который работает с любым типом данных, используя синтаксис шаблонов (generics). 🟠Полиморфизм времени выполнения (динамический полиморфизм) Это форма полиморфизма, при которой метод конкретного объекта выбирается во время выполнения программы. Обычно это достигается с помощью виртуальных функций и механизма позднего связывания (late binding). Пример: вызов метода move() у объекта, который может быть как автомобилем, так и самолетом. Виртуальная функция обеспечивает вызов правильной реализации метода в зависимости от реального типа объекта. 🚩Зачем нужен полиморфизм 🟠Упрощение кода и повышение его гибкости Полиморфизм позволяет писать более общий и абстрактный код. Вместо работы с конкретными типами, программист может работать с более абстрактными интерфейсами или базовыми классами, что упрощает расширение системы и поддержку кода. 🟠Повышение уровня абстракции Полиморфизм позволяет программистам думать о более высокоуровневых концепциях, не углубляясь в детали реализации конкретных классов. Это делает код более понятным и легким для восприятия. 🟠Поддержка принципа "открытости/закрытости" (Open/Closed Principle) Полиморфизм помогает следовать этому принципу, который гласит, что "программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для изменения". То есть, для добавления новых функциональностей не нужно изменять существующий код, достаточно создать новый подкласс или реализовать новый интерфейс. 🟠Снижение дублирования кода: Благодаря полиморфизму, можно избежать дублирования кода, создавая более общие решения и переиспользуя их в разных частях программы. Ставь 👍 и 📚 @backendquiz
106
18
🤔 Что такое чистый код? Это понятие в программировании, обозначающее код, который легко читать, понимать и поддерживать. Принципы чистого кода помогают разработчикам создавать качественные и устойчивые к изменениям программы. Вот основные характеристики и принципы чистого кода: 🚩Основные характеристики чистого кода 🟠Читаемость Код должен быть понятным и легким для чтения другими разработчиками. Имена переменных, функций и классов должны быть осмысленными и описательными. 🟠Простота Код должен быть простым и ясным, избегая излишней сложности. Это делает его более понятным и легким в поддержке. 🟠Последовательность Следование единому стилю кодирования и соглашениям по наименованию. Это упрощает чтение и понимание кода. 🟠Минимум избыточности Избегание дублирования кода, что способствует его упрощению и уменьшению ошибок. 🟠Модульность Разделение кода на независимые модули или компоненты, которые можно разрабатывать, тестировать и поддерживать отдельно. 🟠Тестируемость Код должен быть легким для тестирования. Хорошо написанный код обычно легко покрыть юнит-тестами. 🚩Принципы чистого кода 🟠Именование Имена переменных, функций и классов должны быть осмысленными и описывать их назначение. int age; // Понятно, что переменная хранит возраст 🟠Функции Функции должны быть короткими и выполнять одну задачу. void calculateAndPrintTotal() { int total = calculateTotal(); printTotal(total); } 🟠Комментарии Комментарии должны объяснять, почему был написан определенный код, а не что он делает. Хорошо написанный код должен быть самодокументируемым. // Calculate the total price including tax int totalPrice = calculateTotalPrice(); 🟠Форматирование Единый стиль форматирования делает код более читабельным. Используйте отступы, пробелы и пустые строки для улучшения структуры кода. if (isValid) { process(); } else { handleError(); } 🟠Обработка ошибок Обработка ошибок должна быть понятной и не загромождать основной код. try { processFile(file); } catch (IOException e) { logError(e); } 🟠Магические числа и строки Избегайте использования магических чисел и строк. Вместо этого используйте константы с осмысленными именами. static final int MAX_USERS = 100; Ставь 👍 и 📚 @backendquiz
105
19
🤔 Для чего можно использовать celery? Celery поддерживает различные брокеры сообщений, включая RabbitMQ и Redis, для управления очередями задач. 🚩Основные возможности 🟠Асинхронное выполнение задач Позволяет запускать длительные операции в фоновом режиме, освобождая основной поток выполнения приложения для других задач. 🟠Планирование задач Поддержка периодических и плановых заданий, что позволяет автоматизировать повторяющиеся процессы. 🟠Управление распределёнными системами Способен управлять задачами в распределенной системе, используя несколько рабочих узлов (workers) для параллельного выполнения задач. 🟠Масштабируемость Легко масштабируется, добавляя больше рабочих узлов для увеличения производительности. 🚩Основные задачи 🟠Фоновые задачи Отправка электронной почты: Асинхронная отправка писем для улучшения производительности веб-приложений. Обработка данных: Включает такие задачи, как анализ данных, обработка изображений или видео, преобразование форматов и другие ресурсоемкие операции. Взаимодействие с API: Выполнение запросов к внешним API, которое может быть долгим или неэффективным при синхронном выполнении. 🟠Периодические задачи Обновление данных: Регулярное обновление кэшей, индексов поиска или других данных в базе данных. Мониторинг и сбор метрик: Периодический сбор и обработка метрик для мониторинга состояния системы. Очистка данных: Периодическая очистка устаревших или временных данных из базы данных. 🟠Уведомления и оповещения Уведомления в реальном времени: Отправка уведомлений пользователям через различные каналы (email, SMS, push-уведомления). Событийное оповещение: Реагирование на события и триггеры, такие как изменения в базе данных или действия пользователя. 🟠Работа с большими данными и машинным обучением Параллельная обработка данных: Выполнение параллельных вычислений для обработки больших объемов данных. Машинное обучение: Асинхронное обучение моделей и выполнение предсказаний на больших наборах данных. 🟠Веб-скрейпинг и интеграция данных Веб-скрейпинг: Асинхронный сбор данных с веб-сайтов для агрегации или анализа. Интеграция данных: Асинхронная интеграция данных из различных источников и API. 🚩Примеры использования 🟠Веб-приложения Улучшение производительности веб-приложений за счет выполнения долгих операций в фоне. 🟠Электронная коммерция Обработка заказов, обновление статусов заказов и управление инвентарем в фоновом режиме. 🟠Социальные сети Обработка пользовательских данных, отправка уведомлений и обновление лент новостей. 🟠Научные исследования Выполнение сложных вычислений и обработка больших объемов данных в распределенной среде. Ставь 👍 и 📚 @backendquiz
109
20
Осталось 3 часа до конца акции: «Пожизненный PRO тариф — по цене 1 года» Поиск работы отнимает силы, время и веру в себя, но
Осталось 3 часа до конца акции: «Пожизненный PRO тариф — по цене 1 года» Поиск работы отнимает силы, время и веру в себя, но не у тех кто использует easyoffer PRO. Успей сделать самую выгодную инвестицию в развитие своей карьеры. Акция закончится уже сегодня 23 июня 23:59 по мск: 👉 https://easyoffer.ru/pro @backendquiz
29