Backend @easy_backend Channel on Telegram

Backend

@easy_backend


Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Backend (Russian)

Добро пожаловать в канал "Backend"! Если вы являетесь Backend программистом или хотите погрузиться в мир создания серверной части приложений, то это место для вас. Здесь вы сможете общаться с коллегами, делиться опытом и узнавать о последних трендах в разработке. Наше комьюнити охватывает различные языки программирования, такие как Python, Java, Golang, PHP, C#, C/C++ и область DevOps.

Помимо общения, в канале вы также найдете полезные материалы, статьи, и обновления из мира Backend разработки. Мы стремимся создать активное пространство, где каждый участник может найти что-то полезное для себя.

Не упустите шанс быть в курсе всех новостей и трендов Backend разработки. Присоединяйтесь к нам прямо сейчас!

Дополнительная информация:
Сайт: [easyoffer.ru](https://easyoffer.ru)
Для размещения рекламы обращайтесь сюда: [@easyoffer_adv](https://t.me/easyoffer_adv)

Backend

07 Feb, 16:10


🤔 Что такое CGI? Плюсы, минусы?

Это технология для обработки запросов и генерации динамических веб-страниц через скрипты на сервере.
Плюсы:
1. Простота реализации.
2. Независимость от языка программирования (поддерживаются Python, Perl и др.).
3. Легкость интеграции с сервером.
Минусы:
1. Медлительность: для каждого запроса создается новый процесс.
2. Высокая нагрузка на сервер при большом количестве запросов.
3. Устаревший подход, заменен современными технологиями (FastCGI, PHP, Node.js).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

07 Feb, 09:10


🤔 В чем разница между 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-версия, некоторые функции доступны только в коммерческих редакциях.

Ставь 👍 и забирай 📚 Базу знаний

Backend

06 Feb, 16:10


🤔 В чем основные принципы инкапсуляции?

1. Сокрытие деталей реализации:
- Внешний интерфейс предоставляет доступ к функциям объекта, скрывая его внутреннюю логику.
2. Контроль доступа:
- Использование модификаторов доступа (private, protected, public) для ограничения работы с атрибутами и методами.
3. Упрощение взаимодействия:
- Инкапсуляция позволяет пользователям работать с объектами через простой и понятный интерфейс, не вникая в детали их работы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

06 Feb, 09:10


🤔 Что такое SOLID?

Это акроним, представляющий пять основных принципов объектно-ориентированного программирования и дизайна, которые помогают разработчикам создавать более понятный, гибкий и поддерживаемый код. Эти принципы были предложены Робертом Мартином (известным также как Uncle Bob) и являются основополагающими в области программной инженерии.

🟠Single Responsibility Principle (Принцип единственной ответственности)
Этот принцип гласит, что у каждого класса должна быть только одна причина для изменения, то есть класс должен иметь только одну ответственность или задачу. Это помогает уменьшить сложность и повысить читаемость кода, делая его более управляемым и легким для поддержки. Когда класс выполняет лишь одну задачу, его легче тестировать и изменять без влияния на другие части системы.

🟠Open/Closed Principle (Принцип открытости/закрытости)
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации. Это означает, что поведение классов должно быть расширяемым без изменения их исходного кода. Для реализации этого принципа часто используются абстракции и интерфейсы, которые позволяют добавлять новые функции через наследование и полиморфизм, не нарушая существующий код.

🟠Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
Объекты подклассов должны быть заменяемы объектами суперклассов без нарушения правильности программы. Это означает, что если у нас есть базовый класс и его подкласс, то мы должны иметь возможность заменить экземпляры базового класса экземплярами подкласса без изменения желаемого поведения программы. Этот принцип поддерживает полиморфизм и гарантирует, что производные классы могут корректно взаимодействовать с остальным кодом.

🟠Interface Segregation Principle (Принцип разделения интерфейсов)
Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип направлен на создание узкоспециализированных интерфейсов, которые являются специфичными для отдельных клиентов. Таким образом, классы, реализующие эти интерфейсы, не будут обязаны реализовывать методы, которые им не нужны. Это уменьшает сложность и улучшает управляемость кода, а также способствует гибкости и повторному использованию интерфейсов.

🟠Dependency Inversion Principle (Принцип инверсии зависимостей)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба типа модулей должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимости высокоуровневого кода от низкоуровневых деталей, что позволяет легче изменять и тестировать систему. Реализация этого принципа часто включает использование инверсии управления (IoC) и внедрения зависимостей (DI), что способствует созданию более гибких и модульных архитектур.

Ставь 👍 и забирай 📚 Базу знаний

Backend

05 Feb, 16:10


🤔 В чем разница между SQLite и Express SQL?

1. SQLite:
- Это встроенная реляционная база данных, которая хранит все данные в одном файле.
- Легковесная, не требует серверного ПО, отлично подходит для небольших проектов.
- Поддерживает стандартный SQL, но ограничена в функциональности (например, не поддерживает масштабируемость и сложные запросы).
2. Express SQL:
- Это не база данных, а фреймворк (Express.js) в Node.js, который может взаимодействовать с SQL-базами (например, MySQL, PostgreSQL).
- Используется для создания серверной логики, предоставляющей доступ к базам данных через API.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

05 Feb, 09:10


🤔 Что такое 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 способствует более тесному взаимодействию между членами команды и заинтересованными сторонами.

Ставь 👍 и забирай 📚 Базу знаний

Backend

04 Feb, 16:10


🤔 Что такое модульное программирование?

Это метод разработки, при котором приложение делится на независимые модули (компоненты), каждый из которых выполняет конкретную задачу.
Преимущества:
1. Упрощение поддержки и тестирования.
2. Повышение повторного использования кода.
3. Уменьшение связности между компонентами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

04 Feb, 09:10


🤔 Почему синглтон называют антипаттерном?

Синглтон считается антипаттерном в некоторых случаях и для некоторых разработчиков, несмотря на его популярность, из-за множества потенциальных проблем, которые он может вызвать.

🟠Глобальное состояние
Синглтон представляет собой глобальное состояние, которое может изменяться из любого места в программе. Это приводит к трудностям в отслеживании и понимании изменений состояния, что усложняет отладку и тестирование.

🟠Нарушение принципов ООП
Синглтон нарушает принцип единственной ответственности (SRP - Single Responsibility Principle), так как он сочетает в себе функциональность и управление своим экземпляром. Это также нарушает принцип инверсии зависимостей (DIP - Dependency Inversion Principle), так как клиенты напрямую зависят от конкретного класса.

🟠Тестируемость
Синглтоны усложняют написание модульных тестов, так как глобальное состояние сохраняется между тестами, что может приводить к непредсказуемому поведению. Мокинг (mocking) и подмена синглтона в тестах также становятся сложными задачами.

🟠Жесткие зависимости
Использование синглтона создает жесткие зависимости между классами, что делает код менее гибким и увеличивает связность. Это затрудняет изменение и поддержку кода в будущем.

🟠Масштабируемость и многопоточность
Синглтоны могут создавать проблемы в многопоточных приложениях. Обеспечение потокобезопасности требует дополнительных усилий, а ошибки в реализации могут привести к состояниям гонки и другим проблемам.

🟠Легаси код и сложность
Синглтоны часто приводят к созданию легаси кода, который трудно модифицировать и расширять. В больших проектах синглтоны могут усложнять структуру кода и его поддержку.

Ставь 👍 и забирай 📚 Базу знаний

Backend

03 Feb, 16:10


🤔 Какая разница между аутентификацией и авторизацией?

1. Аутентификация:
- Процесс проверки личности пользователя (например, с помощью логина и пароля).
- Отвечает на вопрос: "Кто вы?"
2. Авторизация:
- Процесс определения прав доступа пользователя к ресурсам.
- Отвечает на вопрос: "Что вам разрешено делать?"


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

03 Feb, 09:10


🤔 Что такое транзакция?

Транзакция в контексте баз данных - это последовательность операций, выполняемых как единое целое. Она должна быть полностью выполнена или полностью отменена, чтобы обеспечить целостность и консистентность данных. Основные свойства транзакции определяются набором правил, известных как ACID:

🚩ACID свойства

🟠Atomicity (Атомарность):
Транзакция либо выполняется полностью, либо не выполняется вовсе. Если происходит ошибка, все операции транзакции откатываются. Например, в банковской системе перевод денег между счетами требует списания суммы с одного счета и зачисления на другой. Если одна из операций не выполнится, другая также должна быть отменена.

🟠Consistency (Консистентность):
После завершения транзакции данные должны оставаться в согласованном состоянии, соответствующем всем определенным правилам и ограничениям. В инвентарной системе при добавлении нового товара должна проверяться допустимость всех значений, таких как положительное количество и правильная категория.

🟠Isolation (Изоляция):
Выполнение транзакций изолировано друг от друга, так что параллельные транзакции не влияют на промежуточные состояния друг друга. Если две транзакции пытаются изменить одни и те же данные, одна из них должна завершиться до того, как другая начнет свои изменения, чтобы избежать конфликтов.

🟠Durability (Долговечность):
После завершения транзакции её результаты сохраняются даже в случае сбоя системы. Если транзакция по записи данных в базу данных завершилась успешно, данные останутся сохраненными даже после перезагрузки сервера.

🚩Этапы выполнения транзакции

1⃣начало выполнения транзакции.
2⃣Выполняются все необходимые операции (вставка, обновление, удаление и т.д.).
3⃣Если все операции выполнены успешно, изменения фиксируются.
4⃣Если произошла ошибка, все изменения отменяются, возвращая базу данных в исходное состояние.

🚩Применение транзакций

🟠Обеспечивают целостность операций перевода денежных средств.
🟠Гарантируют корректное обновление информации о заказах и инвентаре.
🟠Обеспечивают корректность резервирования мест или ресурсов.

Ставь 👍 и забирай 📚 Базу знаний

Backend

02 Feb, 16:10


🤔 Какие блокировки бывают в Postgres?

1. Row-level locks: блокируют отдельные строки (например, SELECT FOR UPDATE).
2. Table-level locks: блокируют всю таблицу на различные операции (ACCESS SHARE, ROW EXCLUSIVE, EXCLUSIVE и т.д.).
3. Advisory locks: пользовательские блокировки, задаваемые вручную для синхронизации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

02 Feb, 09:10


🤔 Из чего состоит ответ на сервере?

Ответ на сервере, особенно в контексте HTTP, состоит из нескольких ключевых компонентов. Эти компоненты обеспечивают клиенту информацию о результате запроса, статусе обработки, а также предоставляют сами данные, если это необходимо. Основные части ответа включают:

🟠Стартовая линия (Status Line)
Стартовая линия содержит информацию о статусе ответа и состоит из следующих частей:
Версия протокола HTTP: Например, HTTP/1.1.
Код состояния (Status Code): Числовой код, который указывает результат обработки запроса. Примеры включают 200 (OK), 404 (Not Found), 500 (Internal Server Error).
Причинная фраза (Reason Phrase): Человеко-читаемое описание статуса. Например, OK, Not Found, Internal Server Error.
HTTP/1.1 200 OK


🟠Заголовки (Headers)
Заголовки предоставляют метаданные о ответе. Они состоят из пар "ключ-значение" и могут включать:
Date: Дата и время отправки ответа.
Content-Type: Тип содержимого ответа (например, text/html, application/json).
Content-Length: Размер тела ответа в байтах.
Server: Информация о сервере, отправившем ответ.
Set-Cookie: Установка cookies.
Content-Type: application/json
Content-Length: 85
Server: Apache/2.4.1 (Unix)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly


🟠Тело ответа (Body)
Тело ответа содержит данные, которые сервер отправляет клиенту. Формат и содержание тела зависят от типа ответа и могут включать:
HTML-страницы
JSON-объекты
XML-данные
Файлы (например, изображения, документы)
{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}


Пример полного HTTP-ответа
HTTP/1.1 200 OK
Date: Tue, 27 Jul 2024 12:28:53 GMT
Content-Type: application/json
Content-Length: 85
Server: Apache/2.4.1 (Unix)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly

{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}


Ставь 👍 и забирай 📚 Базу знаний

Backend

01 Feb, 16:10


🤔 Что такое блокировки (локи) в БД?

Это механизм, предотвращающий одновременный доступ к данным в БД разными транзакциями. Это необходимо для обеспечения целостности данных, синхронизации операций и предотвращения конфликтов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

01 Feb, 09:10


🤔 Что такое git ?

Это распределённая система контроля версий, разработанная Линусом Торвальдсом в 2005 году. Она предназначена для отслеживания изменений в исходном коде во время разработки программного обеспечения. Git позволяет нескольким разработчикам работать над одним и тем же проектом одновременно, не опасаясь потерять работу или перезаписать изменения друг друга.

🚩Основные понятия и функции

🟠Репозиторий (Repository)
Это хранилище для проекта, в котором хранятся все файлы и история их изменений.

🟠Коммит (Commit)
Зафиксированный снимок текущего состояния файлов в репозитории. Коммиты образуют историю изменений проекта.

🟠Ветвь (Branch)
Отдельная линия разработки. Ветви позволяют параллельно работать над разными функциями или исправлениями без вмешательства в основную кодовую базу.

🟠Слияние (Merge)
Процесс объединения изменений из одной ветви в другую. Обычно используется для интеграции новых функций или исправлений из отдельных ветвей в основную ветвь.

🟠Клон (Clone)
Создание копии удалённого репозитория на локальной машине разработчика.

🟠Форк (Fork)
Создание копии чужого репозитория (обычно на платформе вроде GitHub) для внесения собственных изменений без воздействия на оригинальный проект.

🟠Запрос на слияние (Pull Request или Merge Request)
Запрос на включение изменений из одной ветви в другую, часто используемый в коллаборативных платформах (например, GitHub, GitLab).

🟠Ремот (Remote)
Удалённый репозиторий, который может быть связан с локальным репозиторием. Основные команды взаимодействуют с ним для синхронизации данных.

🚩Основные команды

🟠git init
Создание нового локального репозитория.
🟠git clone [URL]
Клонирование удалённого репозитория на локальную машину.
🟠git add [файл/папка]
Добавление изменений в индекс (стадия подготовки к коммиту).
🟠git commit -m "Сообщение"
Создание коммита с заданным сообщением.
🟠git status
Проверка состояния файлов в рабочем каталоге и индексе.
🟠git log
Просмотр истории коммитов.
🟠git branch
Управление ветвями (создание, просмотр, удаление).
🟠git checkout [ветка/коммит]
Переключение между ветвями или возврат к определённому коммиту.
🟠git merge [ветка]
Слияние указанной ветки с текущей.
🟠git pull
Получение изменений из удалённого репозитория и слияние с текущей веткой.
🟠git push
Отправка изменений из локального репозитория в удалённый.

Ставь 👍 и забирай 📚 Базу знаний

Backend

31 Jan, 16:10


🤔 Каким образом можно найти "медленный запрос" и проанализировать его в PostgreSQL?

1. Включить логирование медленных запросов: настроить log_min_duration_statement.
2. Использовать расширение pg_stat_statements для анализа часто выполняемых запросов.
3. Применить EXPLAIN или EXPLAIN ANALYZE, чтобы изучить план выполнения запроса.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

31 Jan, 09:10


🤔 Чем отличаются 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 значениями.

Ставь 👍 и забирай 📚 Базу знаний

Backend

30 Jan, 16:10


🤔 Как выбрать данные из двух таблиц без метода JOIN()?

Данные из двух таблиц можно выбрать, используя подзапросы, которые работают через фильтрацию или вложенные операции.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

30 Jan, 09:10


🤔 Что такое IP?

IP (Internet Protocol) — это основной протокол сетевого уровня, который используется для передачи данных через интернет и другие сети. IP отвечает за маршрутизацию и адресацию пакетов данных, обеспечивая их доставку от отправителя к получателю.

🚩Основные аспекты IP:

Адресация: IP адресация обеспечивает уникальные адреса для устройств в сети, что позволяет им взаимодействовать друг с другом. Существует две версии IP адресации:
🟠Использует 32-битные адреса, что позволяет создать около 4,3 миллиарда уникальных адресов.
🟠Пример IPv4 адреса: 192.168.0.1
🟠IPv6 (Internet Protocol version 6):
🟠Использует 128-битные адреса, что позволяет создать около 340 ундециллионов (3,4×10^38) уникальных адресов.
🟠Пример IPv6 адреса: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

Маршрутизация: IP отвечает за определение пути для передачи пакетов от источника к назначению через сеть, включая множество промежуточных маршрутизаторов. Это позволяет передавать данные через различные сети и соединения.

Фрагментация и сборка: IP может разделять большие пакеты данных на более мелкие фрагменты, чтобы они могли быть переданы через сети с различными ограничениями по размеру пакетов. Получатель затем собирает фрагменты обратно в исходный пакет.

Пакетная передача: IP передает данные в виде пакетов. Каждый пакет содержит заголовок с информацией об адресации и маршрутизации, а также полезную нагрузку с передаваемыми данными.

🚩Основные функции IP:

🟠Адресация устройств: IP предоставляет уникальные адреса для каждого устройства в сети, что позволяет им идентифицировать и находить друг друга.
🟠Маршрутизация пакетов: IP определяет маршрут для пакетов данных через различные сети и маршрутизаторы до их конечного назначения.
🟠Фрагментация и сборка: IP разбивает большие пакеты на более мелкие фрагменты для передачи через сеть и собирает их обратно у получателя.
🟠Проверка целостности: IP включает контрольные суммы для проверки целостности заголовка пакета, но не обеспечивает контроль целостности данных.

🚩Преимущества IP

🟠Универсальность
IP является стандартным протоколом для передачи данных в интернете и поддерживается всеми сетевыми устройствами.
🟠Гибкость
IP может передавать данные через различные типы сетей и соединений.
🟠Масштабируемость
IPv6 предоставляет практически неограниченное количество адресов для подключения новых устройств к сети.

🚩Недостатки IP

🟠Безопасность
IP сам по себе не предоставляет механизмов для шифрования или аутентификации данных, что делает его уязвимым для атак.
🟠Отсутствие гарантии доставки: IP не гарантирует доставку пакетов, их последовательность или целостность данных, полагаясь на протоколы более высокого уровня, такие как TCP, для обеспечения надежности.

🚩Взаимодействие с другими протоколами

IP работает в комбинации с другими протоколами, чтобы обеспечить полное взаимодействие в сети:
🟠TCP (Transmission Control Protocol): Работает поверх IP и обеспечивает надежную передачу данных, проверку ошибок и управление потоком.
🟠UDP (User Datagram Protocol): Также работает поверх IP, но не обеспечивает надежность, что делает его подходящим для приложений, требующих высокой скорости и низкой задержки, таких как потоковая передача и игры.
🟠ICMP (Internet Control Message Protocol): Используется для передачи диагностических и управляющих сообщений, таких как запросы ping.

Ставь 👍 и забирай 📚 Базу знаний

Backend

29 Jan, 16:10


🤔 Как с помощью одного запроса можно выбрать данные из двух таблиц?

Данные можно объединить через операции объединения, такие как слияние данных двух таблиц или выбор всех строк из обеих.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

29 Jan, 09:10


🤔 Как выбрать данные из двух таблиц без метода 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);


Ставь 👍 и забирай 📚 Базу знаний

Backend

27 Jan, 09:10


🤔 Какие существуют нормальные формы в SQL?

Это процесс организации данных для минимизации избыточности и избегания аномалий при внесении данных. Нормальные формы (NF) — это набор правил, которые помогают в нормализации баз данных.

🟠Первая нормальная форма (1NF)
Таблица находится в 1NF, если: Все столбцы содержат атомарные значения, то есть каждое значение в столбце неделимо. Все строки уникальны, нет повторяющихся строк.
Пример: Если у вас есть таблица с заказами, и каждый заказ может содержать несколько продуктов, вместо хранения всех продуктов в одном столбце, нужно разбить их на отдельные строки.

🟠Вторая нормальная форма (2NF)
Таблица находится во 2NF, если: Она находится в 1NF. Все неключевые столбцы полностью зависят от всего первичного ключа, а не от его части.
Пример
Если в таблице "Заказы" у вас есть составной ключ (OrderID, ProductID), то столбцы, зависящие только от OrderID (например, OrderDate), должны быть вынесены в отдельную таблицу.

🟠Третья нормальная форма (3NF)
Таблица находится в 3NF, если: Она находится во 2NF. Все неключевые столбцы зависят только от первичного ключа, а не от других неключевых столбцов.
Пример
Если в таблице "Сотрудники" у вас есть столбцы EmployeeID, DepartmentID и DepartmentName, нужно вынести DepartmentName в отдельную таблицу "Департаменты", чтобы избежать зависимости между неключевыми столбцами.

🟠Бойс-Кодд нормальная форма (BCNF)
Таблица находится в BCNF, если: Она находится в 3NF. Для каждой функциональной зависимости X -> Y, X является суперключом.
Пример:
Если в таблице "Курс" есть зависимости (Professor, Course) -> Room и Room -> Capacity, необходимо реструктурировать таблицу так, чтобы не было зависимостей, где детерминанты не являются суперключами.

🟠Четвертая нормальная форма (4NF)
Таблица находится в 4NF, если: Она находится в BCNF. В ней нет многозначных зависимостей (Multivalued Dependencies).
Пример:
Если студент может записаться на несколько курсов и участвовать в нескольких клубах, то эти зависимости должны быть вынесены в отдельные таблицы.

🟠Пятая нормальная форма (5NF)
Таблица находится в 5NF, если: Она находится в 4NF. В ней нет соединительных зависимостей (Join Dependencies), которые нельзя разделить без потери данных.
Пример:
Если у вас есть сложные зависимости между несколькими таблицами, то нужно убедиться, что все соединения этих таблиц могут быть разложены обратно без потери информации.

🟠Доменино-ключевая нормальная форма (DKNF)
Таблица находится в DKNF, если: Все ограничения и зависимости выражаются только через домены и ключи таблицы, и отсутствуют аномалии при вставке, обновлении или удалении данных.

Ставь 👍 и забирай 📚 Базу знаний

Backend

26 Jan, 16:10


🤔 Какие связи с моделями в БД есть?

1. One-to-One (Один к одному): связь между двумя таблицами, где каждой записи из одной таблицы соответствует одна запись из другой.
2. One-to-Many (Один ко многим): связь, где одна запись связана с несколькими записями из другой таблицы.
3. Many-to-Many (Многие ко многим): связь между таблицами через промежуточную таблицу.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

26 Jan, 09:10


🤔 Что такое http?

то протокол прикладного уровня, который является основой передачи данных в Интернете. Он был разработан для передачи гипертекста и других типов медиа между клиентами и серверами. Основные функции HTTP включают инициализацию соединения, запрос ресурсов и получение ответов от сервера.

🚩Основные компоненты HTTP:

🟠Клиент и сервер
HTTP работает по модели клиент-сервер. Клиент, например, веб-браузер, инициирует запросы к серверу, который предоставляет доступ к запрашиваемым ресурсам.

🟠URI (Uniform Resource Identifier)
Используется для идентификации ресурсов. Наиболее распространенным типом URI является URL (Uniform Resource Locator).

🟠Методы HTTP
Определяют действия, которые клиент хочет выполнить над ресурсом. Основные методы включают:
GET: Запрос данных с сервера.
POST: Отправка данных на сервер для обработки.
PUT: Обновление ресурса на сервере.
DELETE: Удаление ресурса с сервера.

🟠Статус-коды
Серверы возвращают клиентам статус-коды, чтобы сообщить о результате обработки запроса. Например, 200 (OK) означает успешное выполнение запроса, а 404 (Not Found) — что ресурс не найден.

🟠Заголовки HTTP
Несут метаданные о запросе или ответе, такие как тип содержимого (Content-Type), длина содержимого (Content-Length), информация об авторизации и так далее.

🟠Сообщения HTTP
Состоят из запроса от клиента и ответа от сервера, каждый из которых включает стартовую строку, заголовки и тело сообщения.

🚩Как это используется:

🟠Веб-серфинг
Каждый раз, когда пользователь вводит URL в адресной строке браузера или нажимает на ссылку, браузер отправляет HTTP-запрос к серверу, который возвращает HTML-страницу.

🟠API
HTTP широко используется для взаимодействия между различными системами через RESTful API. Программы могут отправлять HTTP-запросы для получения данных или выполнения действий на удаленных серверах.

🟠Мобильные приложения
Большинство мобильных приложений взаимодействуют с серверными частями через HTTP, запрашивая и отправляя данные, которые отображаются пользователю.

🟠Загрузка файлов
HTTP используется для скачивания файлов из Интернета.

Ставь 👍 и забирай 📚 Базу знаний

Backend

25 Jan, 16:10


🤔 Есть ли диалекты в SQL?

Да, SQL имеет диалекты, зависящие от используемой базы данных:
- MySQL: LIMIT для ограничения результатов.
- PostgreSQL: поддержка RETURNING и продвинутых функций работы с JSON.
- SQL Server: использует TOP вместо LIMIT.
- SQLite: минималистичный и поддерживает только базовые функции.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

25 Jan, 09:10


🤔 Какие есть уровни изоляции транзакций ?

Уровни изоляции транзакций определяют степень видимости изменений, сделанных одной транзакцией, для других параллельно выполняющихся транзакций. Они помогают контролировать влияние транзакций друг на друга и управляют различными типами аномалий, такими как "грязное" чтение, неповторяющееся чтение и фантомные чтения. В стандарте SQL-92 определены четыре уровня изоляции транзакций:

🚩Read Uncommitted (Чтение неподтвержденных данных)

Транзакция может видеть изменения, сделанные другими транзакциями, даже если эти изменения еще не были зафиксированы (не подтверждены).

🟠Грязное чтение (Dirty Read)
Транзакция может прочитать данные, которые были изменены другой транзакцией, но не были зафиксированы.

🟠Неповторяющееся чтение (Non-repeatable Read)
Транзакция может видеть разные значения данных при повторном чтении, если другая транзакция изменила эти данные и зафиксировала изменения.

🟠Фантомные чтения (Phantom Read)
Транзакция может видеть новые строки, добавленные другой транзакцией, при повторном выполнении запроса.

🚩Read Committed (Чтение подтвержденных данных)

Транзакция может видеть только изменения, которые были зафиксированы другими транзакциями. Неподтвержденные изменения не видны.

🟠Неповторяющееся чтение (Non-repeatable Read)
Транзакция может видеть разные значения данных при повторном чтении, если другая транзакция изменила и зафиксировала эти данные.
🟠Фантомные чтения (Phantom Read)
Транзакция может видеть новые строки, добавленные другой транзакцией, при повторном выполнении запроса.

🚩Repeatable Read (Повторяемое чтение)

Транзакция гарантирует, что если она прочитала данные в начале транзакции, эти данные останутся неизменными до конца транзакции. Транзакция не видит изменения данных, сделанные другими транзакциями после начала текущей транзакции.
Фантомные чтения (Phantom Read): Транзакция может видеть новые строки, добавленные другой транзакцией, при повторном выполнении запроса.

🚩Serializable (Сериализуемость)

Транзакция выполняется так, как если бы она была единственной, работающей в системе. Другие транзакции не могут добавлять, изменять или удалять данные, пока текущая транзакция не завершится. Это самый строгий уровень изоляции. Все аномалии (грязное чтение, неповторяющееся чтение, фантомные чтения) предотвращаются.

-- Установка уровня изоляции
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;


Пример на Java (использование JDBC)
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);


Ставь 👍 и забирай 📚 Базу знаний

Backend

24 Jan, 16:10


🤔 Как можно заблокировать конкретные поля в Postgres?

1. Использовать права доступа (GRANT и REVOKE) для ограничения прав на уровне столбцов.
2. Применить триггеры для контроля операций INSERT и UPDATE.
3. Настроить вьюхи (VIEW) для скрытия определённых столбцов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

24 Jan, 09:10


🤔 Что знаешь о хеш функции?

Хеш-функция — это функция, которая принимает входные данные (ключ) и возвращает фиксированное число, называемое хешем (или хеш-значением). Основная цель хеш-функции — преобразовать произвольные данные в числовое значение определенного диапазона.

🚩Основные свойства хеш-функции:

🟠 Детерминированность: Хеш-функция всегда должна возвращать одно и то же хеш-значение для одного и того же входного значения.
🟠Равномерное распределение: Хорошая хеш-функция должна равномерно распределять хеш-значения по всему диапазону, чтобы минимизировать количество коллизий.
🟠Быстрота вычисления: Хеш-функция должна быть достаточно быстрой, чтобы не замедлять общую производительность алгоритмов, которые её используют.
🟠Минимизация коллизий: Коллизия возникает, когда два разных входных значения дают одно и то же хеш-значение. Хорошая хеш-функция должна минимизировать вероятность таких случаев.

🚩Применение хеш-функций:

🟠Хеш-таблицы: Используются для вычисления индекса массива, где будет храниться значение, связанное с ключом. Это позволяет быстро выполнять операции вставки, удаления и поиска.
🟠Криптография: Криптографические хеш-функции (например, SHA-256, MD5) используются для обеспечения целостности данных, создания цифровых подписей и безопасного хранения паролей.
🟠Контроль целостности данных: Хеш-функции применяются для проверки целостности данных при передаче или хранении, позволяя выявлять ошибки или изменения в данных.
🟠Генерация уникальных идентификаторов: Хеш-функции используются для генерации уникальных идентификаторов (например, UUID), основываясь на входных данных.

🚩Примеры хеш-функций

🟠Простая хеш-функция: Эта функция возвращает остаток от деления длины ключа на размер таблицы. Она проста, но не обеспечивает равномерное распределение.
def simple_hash(key, table_size):
return len(key) % table_size


🟠Хеш-функция для строк (например, DJB2):
def djb2_hash(key):
hash_value = 5381
for char in key:
hash_value = ((hash_value << 5) + hash_value) + ord(char) # hash_value * 33 + ord(char)
return hash_value


🚩Методы разрешения коллизий

🟠Метод цепочек (chaining): В каждой ячейке массива хранится список значений, которые хешируются в один и тот же индекс.
🟠Открытая адресация (open addressing): При коллизии ищется другая свободная ячейка по определённому алгоритму (например, линейное пробирование, квадратичное пробирование или двойное хеширование).

Ставь 👍 и забирай 📚 Базу знаний

Backend

23 Jan, 16:10


🤔 Для чего используют Redis в проектах?

Redis используется как in-memory хранилище данных, обеспечивающее высокую скорость доступа.
1. Применяется для кэширования, управления сессиями, очередей сообщений и анализа данных.
2. Поддерживает сложные структуры данных (например, списки, множества, хэши).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

23 Jan, 09:10


🤔 Расскажи про уровни изоляции ?

Уровни изоляции транзакций в SQL определяют, как взаимодействуют параллельные транзакции и какие аномалии данных они предотвращают.

🟠Read Uncommitted
Видит изменения, даже если они не зафиксированы. Аномалии: грязное чтение.
🟠Read Committed
Видит только зафиксированные изменения. Аномалии: неповторяющееся чтение.
🟠Repeatable Read
Сохраняет консистентность чтения данных в пределах одной транзакции. Аномалии: фантомные чтения.
🟠Serializable
Полная изоляция транзакций, как если бы они выполнялись последовательно. Аномалии: никаких.

Ставь 👍 и забирай 📚 Базу знаний

Backend

22 Jan, 16:10


🤔 Что значит правильный код?

Правильный код — это читаемый, поддерживаемый и надёжный код, соответствующий стандартам разработки.
1. Он решает задачу эффективно, минимизируя использование ресурсов.
2. Код должен быть модульным, тестируемым и легко расширяемым.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

22 Jan, 09:10


🤔 Что такое MVVM?

Это архитектурный шаблон, который разделяет приложение на три части: Model (данные и логика), View (интерфейс) и ViewModel (связь между Model и View).

🚩Пример

Model
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}


ViewModel
public class UserViewModel : INotifyPropertyChanged
{
private ObservableCollection<User> _users;
public ObservableCollection<User> Users
{
get { return _users; }
set
{
_users = value;
OnPropertyChanged(nameof(Users));
}
}

public UserViewModel()
{
Users = new ObservableCollection<User>
{
new User { Name = "John Doe", Age = 30 },
new User { Name = "Jane Doe", Age = 25 }
};
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}


View (XAML)
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Users}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>


Код за View (Code-behind)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new UserViewModel();
}
}


Ставь 👍 и забирай 📚 Базу знаний

Backend

21 Jan, 16:10


🤔 Что известно о принципах программирования DRY?

Это принцип, предполагающий минимизацию дублирования кода.
1. Код, повторяющийся в нескольких местах, должен быть вынесен в одну общую функцию или модуль.
2. Применение DRY улучшает читаемость, тестируемость и уменьшает вероятность ошибок.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

21 Jan, 09:10


🤔 Что такое CD (Continuous Delivery / Continuous Deployment)?

Это практика автоматизации и оптимизации процессов доставки приложений и их обновлений в рабочую среду. Она является частью DevOps-подхода и тесно связана с CI (Continuous Integration).

🚩Два основных значения CD

🟠Continuous Delivery (Непрерывная доставка)
Continuous Delivery подразумевает автоматизацию процессов сборки, тестирования и подготовки приложения к выпуску в продакшн. Однако процесс развертывания остаётся ручным, чтобы команда могла контролировать его выполнение. Ключевые особенности:
Автоматическое развертывание приложения в тестовые и предрелизные среды.
Возможность развернуть приложение в продакшн в любой момент с минимальными усилиями.
Финальное решение о развертывании принимает человек.
Цель: Быть готовым к безопасному и быстрому выпуску обновлений в любой момент.
Пример использования:
В интернет-магазине обновление функционала сначала разворачивается в тестовой среде. После успешной проверки QA-командой или бизнес-менеджером приложение вручную переносится в продакшн.

🟠Continuous Deployment (Непрерывное развертывание)
Continuous Deployment идёт дальше Continuous Delivery, автоматически развертывая обновления в продакшн после успешного прохождения всех тестов. Процесс полностью автоматизирован и исключает ручное вмешательство. Ключевые особенности:
Абсолютная автоматизация — каждый подтверждённый код (коммит) автоматически попадает в продакшн.
Постоянный выпуск обновлений, минимизирующий разницу между разработкой и рабочей средой.
Цель: Сократить время доставки функционала и исправлений до продакшна, обеспечивая быстрые релизы.
Пример использования:
В приложении социальной сети любые изменения (например, исправление ошибки или добавление нового поста) автоматически проходят через CI/CD pipeline и попадают в продакшн.

🚩Ключевые элементы CD

🟠CI/CD Pipeline
Автоматизированный процесс, включающий сборку, тестирование, развертывание.

🟠Тестирование
Юнит-тесты.
Интеграционные тесты.
Нагрузочные тесты.
Проверка безопасности.

🟠Оркестрация и управление
Использование инструментов (Jenkins, GitLab CI/CD, CircleCI, GitHub Actions). Контейнеризация (Docker, Kubernetes).

🟠Мониторинг
Автоматическое отслеживание работоспособности приложений (Prometheus, Grafana).

🚩Плюсы

Скорость
Ускоряет доставку новых функций и исправлений.
Качество
Раннее выявление ошибок благодаря автоматическим тестам.
Прозрачность
Процесс развертывания становится понятным для всей команды.
Гибкость
Возможность быстро реагировать на изменения требований.

Ставь 👍 и забирай 📚 Базу знаний

Backend

20 Jan, 16:10


🤔 Для чего подходят асинхронные операции?

Асинхронные операции позволяют выполнять задачи без блокировки основного потока.
1. Они полезны для работы с сетевыми запросами, ввода/вывода и долгих вычислений.
2. Асинхронность повышает производительность и отзывчивость приложения.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

20 Jan, 09:10


🤔 Какие принципы программирования бывают?

Программирование включает множество принципов, которые помогают разработчикам создавать эффективный, читаемый и поддерживаемый код.

🚩Принципы 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 для автоматизации процессов разработки.

Ставь 👍 и забирай 📚 Базу знаний

Backend

19 Jan, 16:10


🤔 Что известно о бинарном дереве?

Это структура данных, где каждый узел имеет не более двух потомков (левый и правый).
1. Оно используется для эффективного поиска, вставки и удаления элементов.
2. Частные случаи: бинарное дерево поиска (BST) и сбалансированное дерево (например, AVL, красно-чёрное дерево).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

19 Jan, 09:10


🤔 Основные HTTP-методы

HTTP-методы (или глаголы) определяют тип действия, которое клиент хочет выполнить с ресурсом на сервере.

🟠GET
Назначение: Получение данных с сервера. Используется для чтения информации, не изменяя состояние сервера. Безопасный и идемпотентный метод (выполнение одного и того же запроса несколько раз даёт одинаковый результат).
Запрос страницы или API-ресурса
GET /users/123


🟠POST
Назначение: Создание нового ресурса или выполнение действий на сервере. Может изменять состояние сервера (например, добавлять новые данные). Не идемпотентен (повторный запрос создаёт новый ресурс или дублирует операцию).
Создание нового пользователя
POST /users


🟠PUT
Назначение: Полное обновление ресурса на сервере. Идемпотентен (повторный запрос с одинаковыми данными не изменяет результат).
Обновление профиля пользователя:
PUT /users/123


🟠PATCH
Назначение: Частичное обновление ресурса. Обновляет только указанные поля, не затрагивая остальные. Не всегда идемпотентен (зависит от реализации).
Обновление только имени пользователя
PATCH /users/123


🟠DELETE
Назначение: Удаление ресурса с сервера. Идемпотентен (повторный запрос удаления того же ресурса не вызывает ошибку).
Удаление пользователя
DELETE /users/123


🟠HEAD
Назначение: Получение метаинформации о ресурсе без передачи его содержимого. Аналогичен GET, но сервер возвращает только заголовки ответа. Полезен для проверки существования ресурса или его свойств (например, размера).
HEAD /users/123


🟠OPTIONS
Назначение: Запрос информации о поддерживаемых сервером методах или возможностях ресурса. Используется, например, в CORS для проверки, какие методы доступны для клиента.
OPTIONS /users


🟠TRACE
Назначение: Диагностика и отладка соединения между клиентом и сервером. Возвращает запрос клиента в теле ответа, позволяя понять, какие изменения произошли на пути от клиента до сервера. Редко используется из-за риска безопасности.
TRACE /users/123


🟠CONNECT
Назначение: Установка туннеля для защищённого соединения (например, через прокси). Чаще всего используется для создания HTTPS-соединений.
CONNECT www.example.com:443


Ставь 👍 и забирай 📚 Базу знаний

Backend

18 Jan, 16:10


🤔 Для чего можно использовать Celery?

Это фреймворк для выполнения асинхронных задач и управления очередями.
1. Используется для выполнения фоновых задач, таких как отправка писем или обработка данных.
2. Поддерживает распределённую архитектуру, масштабируемость и повторное выполнение задач.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

18 Jan, 09:10


🤔 Что такое BigO notation?

Big O notation (О-большое) - это математическая нотация, используемая в информатике для описания производительности алгоритма. Она выражает, как время выполнения или потребление памяти алгоритма растет по мере увеличения размера входных данных. Big O notation фокусируется на худшем случае, что помогает оценить наихудший сценарий для работы алгоритма.

🚩Основные концепции Big O notation

🟠Асимптотический анализ:
Big O notation используется для описания асимптотического поведения алгоритмов, то есть их поведения при приближении размера входных данных к бесконечности. Основное внимание уделяется ведущим слагаемым и игнорированию констант и менее значимых слагаемых, поскольку они имеют меньшее влияние на производительность при больших размерах входных данных.

🟠Оценка худшего случая:
Big O notation показывает наихудший возможный сценарий выполнения алгоритма, обеспечивая надежные гарантии его производительности.

🚩Основные классы сложности

🟠O(1) - Константная сложность:
Время выполнения не зависит от размера входных данных. Доступ к элементу массива по индексу.
🟠O(log n) - Логарифмическая сложность:
Время выполнения увеличивается логарифмически с увеличением размера входных данных. Бинарный поиск.
🟠O(n) - Линейная сложность:
Время выполнения растет линейно с увеличением размера входных данных. Линейный поиск.
🟠O(n log n) - Линейно-логарифмическая сложность:
Время выполнения растет линейно с логарифмическим множителем. Быстрая сортировка, сортировка слиянием.
🟠 O(n^2) - Квадратичная сложность:
Время выполнения растет пропорционально квадрату размера входных данных. Сортировка пузырьком, сортировка вставками.
🟠O(2^n) - Экспоненциальная сложность:
Время выполнения удваивается с каждым добавлением нового элемента. Решение задачи о коммивояжере полным перебором.
🟠O(n!) - Факториальная сложность:
Время выполнения растет факториально с увеличением размера входных данных. Полный перебор всех возможных перестановок.

🚩Примеры использования

1⃣Поиск и сортировка:
Анализ эффективности различных алгоритмов сортировки (например, быстрая сортировка vs. сортировка пузырьком).
2⃣Анализ алгоритмов и структур данных:
Оценка времени доступа, вставки и удаления в различных структурах данных (например, массивы, списки, деревья).
3⃣Оптимизация программ:
Помощь в выборе наиболее эффективных алгоритмов и структур данных для решения конкретных задач.

Ставь 👍 и забирай 📚 Базу знаний

Backend

17 Jan, 16:10


🤔 Что такое HTTP и HTTPS?

1. HTTP (HyperText Transfer Protocol): протокол передачи данных между клиентом и сервером без шифрования.
2. HTTPS: защищённая версия HTTP, использующая SSL/TLS для шифрования данных.
3. HTTPS обеспечивает безопасность, конфиденциальность и подлинность.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

14 Jan, 16:10


🤔 Что такое виртуальное окружение

Виртуальное окружение изолирует зависимости проекта, чтобы избежать конфликтов между библиотеками разных приложений.
1. В Python это достигается через venv или virtualenv.
2. Обеспечивает независимость пакетов и версий, необходимых для конкретного проекта.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

14 Jan, 09:10


🤔 Для чего можно использовать celery?

Celery поддерживает различные брокеры сообщений, включая RabbitMQ и Redis, для управления очередями задач.

🚩Основные возможности

🟠Асинхронное выполнение задач
Позволяет запускать длительные операции в фоновом режиме, освобождая основной поток выполнения приложения для других задач.
🟠Планирование задач
Поддержка периодических и плановых заданий, что позволяет автоматизировать повторяющиеся процессы.
🟠Управление распределёнными системами
Способен управлять задачами в распределенной системе, используя несколько рабочих узлов (workers) для параллельного выполнения задач.
🟠Масштабируемость
Легко масштабируется, добавляя больше рабочих узлов для увеличения производительности.

🚩Основные задачи

🟠Фоновые задачи
Отправка электронной почты: Асинхронная отправка писем для улучшения производительности веб-приложений.
Обработка данных: Включает такие задачи, как анализ данных, обработка изображений или видео, преобразование форматов и другие ресурсоемкие операции.
Взаимодействие с API: Выполнение запросов к внешним API, которое может быть долгим или неэффективным при синхронном выполнении.

🟠Периодические задачи
Обновление данных: Регулярное обновление кэшей, индексов поиска или других данных в базе данных.
Мониторинг и сбор метрик: Периодический сбор и обработка метрик для мониторинга состояния системы.
Очистка данных: Периодическая очистка устаревших или временных данных из базы данных.

🟠Уведомления и оповещения
Уведомления в реальном времени: Отправка уведомлений пользователям через различные каналы (email, SMS, push-уведомления).
Событийное оповещение: Реагирование на события и триггеры, такие как изменения в базе данных или действия пользователя.

🟠Работа с большими данными и машинным обучением
Параллельная обработка данных: Выполнение параллельных вычислений для обработки больших объемов данных.
Машинное обучение: Асинхронное обучение моделей и выполнение предсказаний на больших наборах данных.

🟠Веб-скрейпинг и интеграция данных
Веб-скрейпинг: Асинхронный сбор данных с веб-сайтов для агрегации или анализа.
Интеграция данных: Асинхронная интеграция данных из различных источников и API.

🚩Примеры использования

🟠Веб-приложения
Улучшение производительности веб-приложений за счет выполнения долгих операций в фоне.
🟠Электронная коммерция
Обработка заказов, обновление статусов заказов и управление инвентарем в фоновом режиме.
🟠Социальные сети
Обработка пользовательских данных, отправка уведомлений и обновление лент новостей.
🟠Научные исследования
Выполнение сложных вычислений и обработка больших объемов данных в распределенной среде.

Ставь 👍 и забирай 📚 Базу знаний

Backend

13 Jan, 16:10


🤔 Что такое Docker Compose

Это инструмент для управления многоконтейнерными приложениями.
1. Использует файл docker-compose.yml для описания конфигурации сервисов, сетей и томов.
2. Упрощает запуск и координацию нескольких контейнеров в одной системе.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

13 Jan, 09:10


🤔 Как "под капотом" работает аннотация transactional ?

🟠Создание прокси
Spring обнаруживает @Transactional и создает прокси для класса или метода.
🟠Перехват вызова
Прокси перехватывает вызов метода, аннотированного @Transactional.
🟠Начало транзакции
Прокси делегирует управление TransactionInterceptor, который начинает транзакцию через PlatformTransactionManager.
🟠Выполнение метода
Исходный метод выполняется.
🟠Фиксация или откат транзакции
Если метод завершился успешно, транзакция фиксируется (commit). Если метод выбросил исключение, транзакция откатывается (rollback).

Ставь 👍 и забирай 📚 Базу знаний

Backend

12 Jan, 16:10


🤔 Что известно про нормализацию

Это процесс организации данных в БД для уменьшения избыточности и улучшения целостности.
1. Делится на формы: 1NF, 2NF, 3NF и др., каждая из которых убирает определённые типы дублирования данных.
2. Помогает уменьшить объём хранимой информации и улучшить производительность запросов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

12 Jan, 09:10


🤔 Какие есть паттерны в объектном проектировании?

🟠Порождающие паттерны
Обеспечивает создание единственного экземпляра класса.
Factory Method: Создает объекты через вызов метод, без указания конкретного класса.
Abstract Factory: Создает семейства связанных объектов без указания их конкретных классов.
Builder: Шаг за шагом создает сложный объект.
Prototype: Создает объекты через клонирование существующих экземпляров.

🟠Структурные паттерны
Adapter: Преобразует интерфейс класса в другой интерфейс, ожидаемый клиентами.
Bridge: Разделяет абстракцию и реализацию, позволяя изменять их независимо.
Composite: Организует объекты в древовидные структуры для представления иерархий.
Decorator: Динамически добавляет новые обязанности объектам.
Facade: Предоставляет унифицированный интерфейс к набору интерфейсов подсистемы.
Flyweight: Поддерживает большое количество мелких объектов, разделяя их состояние.
Proxy: Представляет суррогатный объект, который контролирует доступ к другому объекту.

🟠Поведенческие паттерны
Chain of Responsibility: Передает запрос по цепочке обработчиков.
Command: Инкапсулирует запрос как объект.
Interpreter: Определяет грамматику для языка и интерпретатор для предложений этого языка.
Iterator: Предоставляет способ последовательного доступа ко всем элементам коллекции.
Mediator: Обеспечивает взаимодействие множества объектов, избегая их прямых ссылок друг на друга.
Memento: Сохраняет и восстанавливает внутреннее состояние объекта.
Observer: Оповещает зависимые объекты о изменениях состояния.
State: Позволяет объекту изменять свое поведение при изменении внутреннего состояния.
Strategy: Определяет семейство алгоритмов, инкапсулирует их и делает их взаимозаменяемыми.
Template Method: Определяет скелет алгоритма в методе, оставляя реализацию шагов подклассам.
Visitor: Позволяет добавлять новые операции к объектам, не изменяя их классы.

Ставь 👍 и забирай 📚 Базу знаний

Backend

11 Jan, 16:10


🤔 В чем разница между Postgres и MySQL

1. Postgres: поддерживает расширенные функции, такие как JSONB, сложные индексы, транзакции с ACID и CTE.
2. MySQL: быстрее на простых запросах, но ограничен в функциях для сложных операций.
3. Postgres больше подходит для аналитики, а MySQL — для высокопроизводительных веб-приложений.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

11 Jan, 09:10


🤔 Что происходит в конце спринта?

В конце спринта в гибких методологиях разработки (например, Scrum) проводится серия мероприятий и активностей, направленных на подведение итогов работы команды, оценку достигнутого результата и планирование улучшений. Эти процессы обеспечивают прозрачность, оценку эффективности и подготовку к следующему спринту.

🚩Основные события в конце спринта

🟠Завершение задач спринта
Все задачи, включённые в спринт, должны быть либо выполнены, либо перенесены с соответствующими комментариями. Завершённые задачи проверяются на соответствие критериям "готовности" (Definition of Done, DoD). Если задачи не выполнены, они возвращаются в бэклог продукта для повторной оценки в будущем.

🟠Демонстрация инкремента (Sprint Review)
Показать заинтересованным сторонам результат работы команды. Команда демонстрирует готовый продукт или его обновления. Обсуждаются выполненные задачи, изменения в продукте и обратная связь от заказчиков или других участников. Результат: обновление бэклога продукта с учётом новой информации.

🟠Ретроспектива спринта (Sprint Retrospective)
Цель: анализировать, что прошло хорошо, что можно улучшить и какие действия предпринять в будущем. Участники обсуждают положительные моменты, трудности и проблемы, возникшие в процессе работы. Генерируются идеи для улучшения, которые затем внедряются в следующих спринтах. Используются форматы для выявления проблем, такие как "Start, Stop, Continue" или "Что было хорошо, что плохо, что можно улучшить".

🟠Обновление метрик
Обновление burndown chart, velocity chart или других метрик, используемых для отслеживания прогресса. Анализ выполнения целей спринта (например, процент выполненных задач). Уроки, извлечённые из анализа метрик, учитываются при планировании будущих спринтов.

🚩Итоговые действия перед началом нового спринта

🟠Рефайнмент бэклога продукта
С учётом новых идей, задач и обратной связи обновляется приоритет задач.
🟠Подготовка к планированию следующего спринта (Sprint Planning)
Команда и Product Owner готовятся к обсуждению целей нового спринта.
🟠Документирование
Фиксация результатов спринта, включая завершённые задачи, обратную связь и итоги ретроспективы.

Ставь 👍 и забирай 📚 Базу знаний

Backend

10 Jan, 16:10


🤔 Что такое CD

Это практика автоматической доставки изменений в продакшен или на тестовые серверы.
1. Continuous Delivery: подготовка изменений для выпуска, но развёртывание требует ручного подтверждения.
2. Continuous Deployment: изменения автоматически разворачиваются после успешного прохождения тестов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

10 Jan, 09:10


🤔 Что такое Agile?

Это подход к разработке программного обеспечения, который фокусируется на гибкости, сотрудничестве и быстрой адаптации к изменениям. Agile основывается на следующих принципах и ценностях:

🚩Основные принципы

🟠Индивидуумы и взаимодействия важнее процессов и инструментов
Акцент на командную работу и эффективное общение.

🟠Работающее программное обеспечение важнее исчерпывающей документации
Быстрая поставка работающих продуктов с минимально необходимой документацией.

🟠Сотрудничество с заказчиком важнее согласования условий контракта
Постоянное взаимодействие с заказчиком для удовлетворения его потребностей.

🟠Готовность к изменениям важнее следования первоначальному плану
Гибкость в адаптации к изменениям требований и условий.

🚩Основные методологии

🟠Scrum
Итеративный процесс с фиксированными временными промежутками, называемыми спринтами. Роли: Product Owner, Scrum Master, Команда разработки. Артефакты: Product Backlog, Sprint Backlog, Инкремент. Встречи: Планирование спринта, Ежедневные стендап-совещания, Обзор спринта, Ретроспектива.

🟠Kanban
Визуализация процесса работы с помощью доски Kanban. Ограничение незавершенной работы (Work In Progress, WIP). Постоянное улучшение и адаптация.

🟠Extreme Programming (XP)
Практики: Парное программирование, Частые релизы, Непрерывная интеграция, Тестирование.

🟠Lean
Сокращение избыточности и увеличение ценности для клиента.- Принципы: Устранение потерь, Увеличение потока, Улучшение качества.

🚩Плюсы

Быстрая адаптация к изменениям
Возможность быстро реагировать на изменения требований или условий рынка.
Улучшенное качество продукта
Постоянное тестирование и интеграция.
Повышенная вовлеченность команды
Активное участие всех членов команды в процессе разработки.
Удовлетворенность клиентов
Постоянное взаимодействие с заказчиками и предоставление им ценности на каждом этапе разработки.

Ставь 👍 и забирай 📚 Базу знаний

Backend

10 Jan, 07:14


🧠 Machine Learning — авторский канал, где собрана вся база по ИИ и машинному обучению.

Senior разработчик AI-алгоритмов и автономных агентов, разбирает гайды, редкую литературу и код топовых моделей машинного обучения и искусственного интеллекта.

В 2025 году ИИ выйдет на совершенно новый уровень тот, кто не успеет за прогрессом - отстанет, а кто разберется - сорвет куш.

Стоит
подписаться: t.me/ai_machinelearning_big_data

Backend

09 Jan, 16:10


🤔 Что такое шардирование?

Это процесс разделения больших наборов данных на более мелкие части (шарды) для распределённого хранения и обработки.
1. Каждый шард хранит часть данных, и они могут находиться на разных серверах.
2. Это повышает масштабируемость и производительность базы данных.
3. Сложность шардирования заключается в управлении распределением данных и маршрутизации запросов к нужным шардам.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

09 Jan, 12:56


📊 Реклама в сети телеграм каналов easyoffer
✈️ Для заказа пишите @easyoffer_adv

easyoffer
Backend

Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты

Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты

Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты

Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты

Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты

C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты

C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты

Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты

DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты

PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты

Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты

Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты

📊 Реклама в сети телеграм каналов easyoffer
✈️ Для заказа пишите @easyoffer_adv

Backend

09 Jan, 09:10


🤔 Что такое транзакция в БД ?

Это последовательность одной или нескольких операций над базой данных, которая выполняется как единое целое. Транзакции обеспечивают, что все операции в рамках транзакции либо успешно выполняются, либо полностью отменяются, что гарантирует целостность данных.

🚩Основные свойства транзакций (ACID)

🟠Atomicity (Атомарность)
Транзакция должна быть либо выполнена полностью, либо не выполнена вовсе. Если какая-то часть транзакции не удается, вся транзакция откатывается (roll back) к исходному состоянию.

🟠Consistency (Согласованность)
Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что после завершения транзакции все правила целостности данных должны быть соблюдены.

🟠Isolation (Изоляция)
Результаты выполнения транзакции не должны быть видны другим параллельно выполняющимся транзакциям до тех пор, пока данная транзакция не завершится. Это предотвращает влияние одной транзакции на другую.

🟠Durability (Устойчивость)
После успешного завершения транзакции (коммита) ее результаты должны быть зафиксированы в базе данных и сохранены, даже если произойдет сбой системы.

🚩Пример работы с транзакциями

На SQL
BEGIN TRANSACTION;

-- Пример операций внутри транзакции
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- Если все операции прошли успешно
COMMIT;

-- Если произошла ошибка
ROLLBACK;


Пример на Java (использование JDBC)
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "user", "password");
connection.setAutoCommit(false); // Начало транзакции

// Пример операций внутри транзакции
PreparedStatement pstmt1 = connection.prepareStatement("UPDATE accounts SET balance = balance - 100 WHERE account_id = ?");
pstmt1.setInt(1, 1);
pstmt1.executeUpdate();

PreparedStatement pstmt2 = connection.prepareStatement("UPDATE accounts SET balance = balance + 100 WHERE account_id = ?");
pstmt2.setInt(1, 2);
pstmt2.executeUpdate();

connection.commit(); // Коммит транзакции
} catch (SQLException e) {
if (connection != null) {
try {
connection.rollback(); // Откат транзакции при ошибке
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}


Ставь 👍 и забирай 📚 Базу знаний

Backend

08 Jan, 16:10


🤔 Какие минусы есть у индекса?

1. Повышенные затраты на запись: Индексы замедляют операции вставки, удаления и обновления, так как требуется обновлять индекс вместе с данными.
2. Использование памяти: Индексы занимают дополнительное пространство на диске и в оперативной памяти.
3. Сложность управления: Неоптимальное использование индексов может привести к ухудшению производительности запросов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

08 Jan, 09:10


🤔 Что такое SOAP?

Это протокол для обмена структурированными сообщениями в распределённых вычислительных средах. Он основан на XML и используется для передачи данных между различными приложениями через сеть, часто по протоколу HTTP или SMTP.

🚩Основные характеристики

🟠Протокол на основе XML
SOAP сообщения формируются в формате XML, что обеспечивает независимость от платформы и языка программирования.

🟠Стандартизованное сообщение
SOAP сообщение состоит из обязательных и необязательных элементов:
Envelope: Определяет начало и конец сообщения.
Header: Опциональный элемент, содержащий метаинформацию о сообщении.
Body: Основное содержимое сообщения, включающее данные и команды.
Fault: Опциональный элемент для обработки ошибок.

🟠Транспортные протоколы
Чаще всего используется с HTTP/HTTPS, но может работать и с другими протоколами, такими как SMTP.

🟠Расширяемость
SOAP легко расширяется, позволяя добавлять дополнительные функциональные возможности через заголовки и другие элементы.

🟠Независимость от платформы и языка
SOAP может быть использован в любой среде и на любом языке программирования, что обеспечивает высокую совместимость между различными системами.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="http://example.com/">
<soapenv:Header/>
<soapenv:Body>
<example:getExampleRequest>
<example:parameter1>Value1</example:parameter1>
<example:parameter2>Value2</example:parameter2>
</example:getExampleRequest>
</soapenv:Body>
</soapenv:Envelope>


🚩Плюсы

Независимость от платформы и языка
SOAP может взаимодействовать с любыми системами, поддерживающими XML и HTTP/SMTP.
Строгое соблюдение стандартов
SOAP основывается на строгих стандартах, что обеспечивает надежность и предсказуемость взаимодействия.
Расширяемость
Легко адаптируется для специфических потребностей через расширения и заголовки.
Встроенная обработка ошибок
Использует элемент Fault для детальной обработки и передачи ошибок.
Поддержка сложных операций
Подходит для сложных операций и распределённых транзакций.

🚩Минусы

Сложность
SOAP-сообщения могут быть сложными и громоздкими из-за использования XML.
Производительность
Использование XML увеличивает объем передаваемых данных, что может снизить производительность.
Оверхед
Требует дополнительных ресурсов для обработки и передачи XML-сообщений.

Ставь 👍 и забирай 📚 Базу знаний

Backend

07 Jan, 16:10


🤔 Что такое Big O notation?

Это способ описания времени выполнения или использования памяти алгоритмом в зависимости от размера входных данных.
• Например: O(1) (константное время), O(n) (линейное), O(log n) (логарифмическое).
Она помогает оценить эффективность алгоритмов и выбрать оптимальный для задачи.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

07 Jan, 09:10


🤔 Как работают индексы?

Индексы являются ключевым механизмом для улучшения производительности запросов в базах данных. Они позволяют значительно ускорить операции поиска и выборки данных, снижая необходимость полного сканирования таблицы. Вот как работают индексы и для чего они нужны.

🚩Основные принципы работы индексов

🟠Структура данных
Индексы организованы в специализированные структуры данных, такие как B-деревья, B+-деревья или хеш-таблицы. Эти структуры оптимизированы для быстрого поиска, вставки и удаления данных.

🟠Создание индексов
Когда создается индекс на один или несколько столбцов таблицы, база данных строит структуру данных, которая хранит значения этих столбцов в отсортированном виде, вместе с указателями на соответствующие строки таблицы. Это позволяет базе данных быстро находить нужные строки по значению индекса.

🟠Поиск по индексу
При выполнении запроса, который включает условия поиска по индексируемым столбцам, база данных может использовать индекс для быстрого нахождения строк. Вместо полного сканирования таблицы, база данных проходит по дереву индекса и быстро находит нужные строки.

🟠Поддержание индексов
Когда данные в таблице обновляются (добавляются новые строки, изменяются или удаляются существующие), индексы также должны обновляться. Это может привести к дополнительным затратам на время вставки и обновления данных, так как требуется поддерживать актуальность структуры индекса.

🟠Выбор индексов
Правильный выбор индексов важен для оптимальной производительности. Индексы следует создавать на столбцах, которые часто используются в условиях поиска, соединениях и сортировках. Избыточные индексы могут увеличивать объем хранения и снижать производительность операций вставки и обновления.

🚩Виды индексов

🟠Первичный ключ (Primary Key)
Это уникальный индекс, который не допускает дубликатов и обычно используется для идентификации строк в таблице.

🟠Уникальный индекс (Unique Index)
Обеспечивает уникальность значений в индексируемом столбце, но допускает одно или несколько NULL значений.

🟠Обычный индекс (Non-Unique Index)
Используется для ускорения поиска и может содержать дублирующиеся значения.

🟠Составной индекс (Composite Index)
Индекс, созданный на нескольких столбцах. Полезен, когда запросы часто включают условия на несколько столбцов одновременно.

🟠Кластерный индекс (Clustered Index)
Определяет физический порядок хранения строк в таблице. У таблицы может быть только один кластерный индекс, так как строки могут быть отсортированы только одним способом.

🚩Примеры использования индексов

🟠Поиск и выборка данных
Запросы типа SELECT * FROM users WHERE age > 30 значительно ускоряются, если столбец age индексирован.

🟠Сортировка данных
Запросы типа SELECT * FROM users ORDER BY name будут быстрее, если столбец name индексирован.

🟠Соединение таблиц
Запросы, которые соединяют несколько таблиц по индексируемым столбцам, выполняются быстрее, так как индексы облегчают поиск соответствующих строк.

Ставь 👍 и забирай 📚 Базу знаний

Backend

06 Jan, 16:10


🤔 Что известно о принципах программирования KISS?

Это принцип проектирования, направленный на упрощение кода.
1. Программы должны быть простыми, минималистичными и легко читаемыми.
2. Усложнения должны быть введены только в случае необходимости.
3. Упрощение структуры и логики снижает вероятность ошибок и упрощает сопровождение.
Этот принцип помогает создавать более надёжный и поддерживаемый код.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

06 Jan, 09:10


🤔 Проблемы при восстановлении работоспособности системы?

Восстановление работоспособности системы после сбоя — это процесс возвращения её в стабильное состояние, при котором она может продолжать выполнение своих функций. Однако, этот процесс может быть сложным из-за множества потенциальных проблем, возникающих на этапах диагностики, исправления и восстановления.

🟠Идентификация причины сбоя
Выявление корневой причины (root cause) может быть затруднено в сложных распределённых системах. Ложные сигналы и ошибки усложняют диагностику.
Сбой вызван внешним API, но он маскируется внутренними проблемами. Непредсказуемые сбои в сети.
Использование инструментов для логирования и мониторинга (например, ELK Stack, Prometheus). Внедрение распределённого трейсинга (Jaeger, Zipkin).

🟠Потеря данных
Если данные не были надёжно сохранены, сбой может привести к их потере или неконсистентности.
Запрос был частично обработан перед сбоем. Утеря транзакции из-за недоступности базы данных.
Использовать механизмы журналирования (write-ahead logging). Реализовать стратегии резервного копирования и восстановления (backup & restore). Использовать идемпотентные операции для повторного выполнения.

🟠Недостаточная автоматизация восстановления
Ручное восстановление занимает больше времени и подвержено ошибкам.
Сложная последовательность действий для перезапуска зависимых сервисов. Зависимость от человеческого фактора при переключении на резервные системы.
Автоматизировать восстановление с помощью оркестрации (Kubernetes, Ansible). Внедрить механизмы самовосстановления (self-healing systems).

🟠Каскадные отказы
Сбой одного компонента может вызвать отказ других, связанных с ним, компонентов.
Перегрузка базы данных приводит к сбою приложений, зависящих от неё. Потеря сетевого соединения между узлами вызывает массовую недоступность сервисов.
Внедрение изоляции между компонентами (например, с использованием Circuit Breaker). Использование очередей сообщений для асинхронной обработки.

🟠Конфликтующие версии системы
Во время восстановления разные узлы системы могут использовать несовместимые версии программного обеспечения или данных.
Некорректная миграция базы данных. Разные версии микросервисов вызывают ошибки при взаимодействии.
Использовать механизм версионирования API и схем данных. Внедрять "blue-green" или "canary" деплойменты.

🟠Ручные ошибки
Операторы могут допустить ошибки при восстановлении системы, особенно в стрессовых условиях.
Неправильный ввод команд, ведущий к удалению данных. Неполное восстановление конфигурации после сбоя. Разрабатывать чёткую документацию и сценарии действий при сбоях. Использовать инфраструктуру как код (IaC) для автоматизации настройки среды.

🟠Долгое время восстановления (RTO)
Система может быть недоступна слишком долго, что приводит к значительным убыткам.
Затянувшийся процесс восстановления базы данных. Задержки из-за необходимости ручного вмешательства. Оптимизировать процессы резервного копирования и восстановления. Использовать резервные копии с минимальными задержками (например, репликация данных в режиме реального времени).

🟠Консистентность данных
После восстановления состояние данных может быть неконсистентным между компонентами.
Пользователь видит устаревшие данные после переключения на резервный сервер. Несогласованные транзакции в распределённых базах данных. Использовать механизмы консенсуса (например, Raft, Paxos). Внедрить стратегии "eventual consistency" для распределённых систем.

Ставь 👍 и забирай 📚 Базу знаний

Backend

05 Jan, 16:10


🤔 Что такое интерполяция?

Это способ подстановки значений переменных в строку.
• В JavaScript используются шаблонные строки с синтаксисом ${expression}.
• В CSS, например, в препроцессорах (Sass), интерполяция позволяет динамически подставлять значения в свойства.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

05 Jan, 09:10


🤔 Как протестировать отказоустойчивость системы?

Отказоустойчивость системы — это её способность продолжать работать в случае отказа компонентов. Тестирование отказоустойчивости (resilience testing) направлено на проверку того, как система ведёт себя при сбоях, выявление уязвимостей и подтверждение эффективности мер по их устранению.

🚩Основные подходы к тестированию отказоустойчивости

🟠Инъекция отказов (Failure Injection Testing)
Этот метод предполагает преднамеренное внесение сбоев в систему, чтобы проверить её реакцию. Используются инструменты или ручные действия для моделирования отказов.
Недоступность узла.
Потеря сети или задержка.
Перегрузка памяти или процессора.

🟠Тестирование высокой нагрузки (Stress Testing)
Моделируется нагрузка, превышающая обычный рабочий уровень, чтобы выявить, какие компоненты начинают отказывать под давлением.
Увеличение количества запросов к API.
Снижение доступных системных ресурсов (памяти, дисковое пространство).

🟠Тестирование восстановления (Recovery Testing)
Проверяется, насколько быстро и корректно система может восстановиться после сбоя.
Перезапуск сервисов.
Переключение на резервные копии данных.

🟠Тестирование с изоляцией (Chaos Engineering)
Моделируются случайные сбои в производственной среде или её имитации для изучения поведения системы.
Chaos Monkey от Netflix.

🚩Что тестировать для отказоустойчивости?

🟠Сетевые сбои
Потеря соединения между сервисами.
Высокая задержка (latency).
Нестабильность сети (пакеты теряются, приходят с ошибками).

🟠Сбой аппаратного обеспечения
Отключение сервера или узла кластера.
Отказ жёсткого диска.
Уменьшение доступной памяти.

🟠Сбои программного обеспечения
Непредвиденные исключения в коде.
Утечки памяти.
Перегрузка из-за неэффективных алгоритмов.

🟠Перегрузка системы
Всплеск количества пользователей.
Увеличение объёма входящих данных (например, в API или БД).

🟠Проблемы с внешними зависимостями
Недоступность внешних API или сервисов.
Непредсказуемое поведение внешних систем (например, возвращают неверные данные).

🚩Методы проведения тестов

🟠Симуляция отказов вручную
Выключение серверов. Уменьшение доступной памяти или процессорных ресурсов. Отключение или замедление сети.

🟠Использование инструментов для тестирования отказов
Chaos Monkey: Генерация случайных сбоев в продакшене.
Gremlin: Моделирование различных видов отказов (сети, ресурсов, зависимостей).
Toxiproxy: Симуляция проблем с сетевым соединением (задержки, потеря пакетов).
Fault Injection Tool (FIT): Моделирование аппаратных и программных сбоев.

🟠Эмуляция перегрузки
Использование инструментов для нагрузочного тестирования, таких как JMeter или Locust, для увеличения нагрузки до критических значений.

🟠Тестирование сценариев восстановления
Ручное или автоматическое выключение сервисов и проверка работы механизмов восстановления (например, перезапусков через Orchestrator типа Kubernetes).

🚩Ключевые показатели эффективности отказоустойчивости

🟠Время простоя
Как долго система остаётся недоступной после сбоя?
🟠Время восстановления (Recovery Time Objective, RTO)
За сколько времени система восстанавливает свою работоспособность?
🟠Потеря данных (Data Loss)
Какой объём данных теряется при сбоях?
🟠Стабильность после восстановления
Система возвращается в нормальное состояние или остаётся уязвимой?

🚩Советы по тестированию отказоустойчивости

🟠Тестировать на всех уровнях
От отдельных компонентов до всей системы.
🟠Автоматизировать тесты
Регулярное выполнение сценариев отказа.
🟠Начинать с изолированной среды
Минимизировать риски в продакшене.
🟠Проводить тесты в реальных условиях
Только в зрелой системе для точных результатов.
🟠Документировать результаты
Для анализа и улучшения системы.

Ставь 👍 и забирай 📚 Базу знаний

Backend

04 Jan, 16:10


🤔 Что такое миксины?

Это механизм повторного использования кода, который позволяет "вмешивать" функции или свойства в классы или объекты.
• В CSS миксины добавляют группы стилей, которые можно переиспользовать.
• В JavaScript миксины реализуются через передачу методов или функционала между объектами.
Миксины помогают избегать дублирования кода и добавлять новые возможности.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

04 Jan, 09:10


🤔 Основные подводные камни при удалённом вызове процедур (RPC)

Удалённый вызов процедур (Remote Procedure Call, RPC) используется для взаимодействия между компонентами распределённой системы, позволяя одной системе вызывать функции, реализованные в другой. Несмотря на удобство, RPC имеет несколько подводных камней, связанных с особенностями распределённых систем, сетевых взаимодействий и управления состоянием.

🟠Сетевая ненадёжность
В отличие от локальных вызовов, удалённые вызовы зависят от сети, которая может быть ненадёжной. Пакеты могут теряться, задерживаться или приходить в неправильном порядке. Вызовы могут завершаться с таймаутами или зависать. Сложность восстановления после сетевых сбоев. Использовать повторные попытки (retries) с экспоненциальной задержкой. Проектировать системы, способные выдерживать временные сбои.

🟠Задержки (latency)
RPC неизбежно добавляет задержку из-за времени передачи данных по сети и сериализации/десериализации сообщений. Снижение производительности системы при большом количестве вызовов. Минимизировать количество RPC-вызовов, объединяя данные в пакеты. Использовать кеширование на стороне клиента.

🟠Сериализация/Десериализация данных
Передача данных между системами требует их преобразования в формат, понятный обеим сторонам (например, JSON, Protobuf). Потери производительности из-за дополнительной обработки. Потенциальные ошибки преобразования из-за несовместимости форматов. Использовать оптимальные протоколы сериализации (например, Protobuf быстрее и компактнее, чем JSON). Тестировать совместимость форматов при изменении контрактов.

🟠Совместимость API
Изменение интерфейса RPC-сервиса (например, добавление новых параметров) может нарушить работу существующих клиентов. Поломка системы из-за несовместимости старых клиентов с новым API. Применять версионирование API. Использовать backward-compatible изменения (например, добавление необязательных полей).

🟠Отсутствие атомарности
RPC вызывает функции в удалённой системе, где их выполнение не является атомарным (например, если соединение разорвано). Частичное выполнение операций, что может привести к неконсистентности данных. Использовать механизмы транзакций, например, с помощью паттерна Saga для распределённых систем.

🟠Тайм-ауты и управление сбоем
Клиенты не могут точно знать, завершился ли удалённый вызов, если произошёл тайм-аут. Клиент может повторить запрос, что приведёт к дублированию операций. Использовать идемпотентные операции (вызовы, результат которых одинаков независимо от числа выполнений). Определять чёткие тайм-ауты и возвращать клиенту информацию о статусе.

🟠Сложность отладки
Отладка RPC сложнее из-за распределённого характера системы. Сложно отслеживать вызовы, возникающие между сервисами. Затруднён поиск причин ошибок. Использовать распределённые трейсинг-системы, такие как Jaeger или Zipkin.

🟠Безопасность
RPC вызывает удалённые функции, которые могут быть атакованы злоумышленниками. Утечка данных, несанкционированное выполнение операций. Использовать шифрование (например, TLS). Применять аутентификацию и авторизацию (например, с использованием OAuth или JWT).

🟠Проблемы масштабирования
С ростом нагрузки увеличивается количество RPC-вызовов, что может перегружать сервис. Замедление или отказ системы. Использовать балансировку нагрузки. Проектировать системы с учётом горизонтального масштабирования.

🟠Сильная связанность компонентов
RPC может сделать систему слишком связанной, так как компоненты напрямую зависят от вызовов друг друга. Усложнение изменений и тестирования. Применять более слабую связанность, например, через событийно-ориентированную архитектуру или очереди сообщений.

Ставь 👍 и забирай 📚 Базу знаний

Backend

03 Jan, 16:10


🤔 Как работает браузер?

1. Обработка запроса: браузер отправляет HTTP-запрос к серверу, чтобы получить HTML-страницу.
2. Парсинг HTML: полученный код анализируется, создаётся DOM-дерево, которое описывает структуру страницы.
3. Загрузка ресурсов: CSS, JavaScript, изображения загружаются асинхронно. CSS формирует CSSOM (модель стилей), объединяясь с DOM.
4. Рендеринг: DOM и CSSOM объединяются в Render Tree, и браузер отображает страницу, выполняя раскладку и отрисовку.
5. JavaScript: выполняется на этапе рендеринга или после загрузки страницы, обновляя DOM.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

03 Jan, 09:10


🤔 Почему событийно-ориентированная архитектура улучшает масштабируемость?

Событийно-ориентированная архитектура (event-driven architecture, EDA) улучшает масштабируемость за счет асинхронного и независимого взаимодействия между компонентами системы. Основной принцип EDA — использование событий в качестве триггеров для выполнения задач, что устраняет прямую зависимость между инициатором события и его обработчиками. Это позволяет системе более гибко реагировать на рост нагрузки и распределять её между различными частями системы.

🚩Основные причины улучшения масштабируемости в EDA

🟠Асинхронность взаимодействия
В событийно-ориентированной архитектуре компоненты взаимодействуют через обмен сообщениями (событиями) без необходимости ожидания ответа. Это снижает блокировки, позволяет эффективно использовать ресурсы и масштабировать каждый компонент независимо. Если пользователь инициирует действие, например, загрузку файла, событие записывается в очередь. Обработка события выполняется в отдельном потоке или сервисе, что позволяет обрабатывать множество запросов одновременно.

🟠Разделение ответственности
EDA строится на слабой связанности компонентов: каждый сервис отвечает только за обработку определённых событий. Компоненты могут масштабироваться автономно, без влияния на другие части системы. Если в системе интернет-магазина одновременно увеличивается количество заказов и запросов аналитики, можно масштабировать сервис обработки заказов независимо от аналитического сервиса.

🟠Использование очередей и брокеров сообщений
События отправляются в очереди сообщений или брокеры (Kafka, RabbitMQ, AWS SNS/SQS), которые выступают посредниками между производителями и потребителями событий. Это позволяет сглаживать пики нагрузки и временно сохранять события до их обработки, что улучшает масштабируемость. Если нагрузка на обработку увеличивается, можно просто добавить больше обработчиков событий, не изменяя остальную часть системы.

🟠Поддержка горизонтального масштабирования
Сервисы, реагирующие на события, могут быть легко клонированы (горизонтально масштабированы), чтобы увеличить пропускную способность системы. Видеохостинг может масштабировать сервисы обработки видео, чтобы справляться с увеличением количества загрузок.

🟠События как единицы данных
В EDA события — это четко определённые сообщения, которые передают состояние системы. Это упрощает добавление новых компонентов без изменения существующих. Новые компоненты могут подписываться на события и обрабатывать их, не нарушая текущую логику системы. Аналитическая система может быть подключена для обработки событий о действиях пользователей без необходимости вмешательства в код основной системы.

🟠Гибкость при высокой нагрузке
При внезапных всплесках трафика (например, во время распродаж) EDA позволяет накапливать события в очередях до тех пор, пока они не будут обработаны. Это снижает риск отказа системы под нагрузкой. Если сервис обработки платежей перегружен, события транзакций могут временно оставаться в очереди, чтобы быть обработанными позже.

🟠Интеграция с распределёнными системами
EDA хорошо подходит для распределённых систем, так как её архитектура учитывает разнородность компонентов. Каждый компонент работает автономно, что облегчает их масштабирование и развёртывание в различных средах.

Ставь 👍 и забирай 📚 Базу знаний

Backend

02 Jan, 16:10


🤔 Какие JOIN бывают?

1. INNER JOIN: возвращает строки, совпадающие в обеих таблицах.
2. LEFT JOIN: возвращает все строки из левой таблицы и совпадающие строки из правой.
3. RIGHT JOIN: возвращает все строки из правой таблицы и совпадающие строки из левой.
4. FULL OUTER JOIN: объединяет все строки из обеих таблиц, заполняя несоответствия NULL.
5. CROSS JOIN: возвращает декартово произведение строк двух таблиц.
6. SELF JOIN: соединяет таблицу саму с собой.


Ставь 👍 и забирай 📚 Базу знаний

Backend

02 Jan, 09:10


🤔 Почему родные и сторонние куки обрабатываются по-разному?

Различия в обработке родных (first-party) и сторонних (third-party) куки обусловлены соображениями безопасности, конфиденциальности и контекста использования. Эти различия возникают из-за того, что родные куки создаются и используются непосредственно сайтом, который пользователь посещает, в то время как сторонние куки обычно принадлежат и используются другими доменами (например, рекламными сетями), которые интегрированы в сайт.

🟠Родные куки (First-Party Cookies)
Родные куки создаются доменом, который пользователь непосредственно посещает. Они используются для хранения информации, связанной с сессией пользователя или предпочтениями.
Авторизация пользователя.
Сохранение настроек сайта, таких как язык или тема оформления.
Хранение данных о товарах в корзине интернет-магазина.
Они считаются менее рискованными с точки зрения безопасности и конфиденциальности. Доступ к этим кукам имеет только сайт, который их установил. По умолчанию браузеры предоставляют полный доступ к родным кукам.

🟠Сторонние куки (Third-Party Cookies)
Сторонние куки устанавливаются другим доменом, отличным от того, который пользователь посещает. Обычно это происходит через интеграцию внешних сервисов, таких как рекламные сети, аналитические платформы или социальные виджеты.
Таргетированная реклама.
Аналитика кросс-доменного поведения пользователей.
Ретаргетинг.
Считаются более уязвимыми с точки зрения конфиденциальности, так как позволяют сторонним организациям отслеживать поведение пользователей на множестве сайтов.
Современные браузеры ограничивают или блокируют доступ к сторонним кукам:
Safari (Intelligent Tracking Prevention) и Firefox (Enhanced Tracking Protection) автоматически блокируют сторонние куки.
Google Chrome также планирует отказаться от сторонних куков, заменяя их на Privacy Sandbox.

🟠Причины разного подхода к обработке
a) Защита конфиденциальности
Сторонние куки используются для отслеживания пользователей на разных сайтах, что может нарушать их приватность. Регуляции, такие как GDPR и CCPA, требуют строгого контроля над сбором персональных данных.

b) Минимизация рисков безопасности
Сторонние куки могут быть использованы злоумышленниками для атак (например, CSRF). Ограничение доступа к таким кукам снижает эти риски.

c) Пользовательский контроль
Современные браузеры предоставляют пользователям больше контроля над тем, какие куки они принимают. Ограничение сторонних куков снижает вероятность нежелательной активности со стороны третьих лиц.

d) Регуляторные требования:
Правовые нормы требуют информировать пользователей о сборе данных и получать их согласие. Разные подходы к обработке куков помогают соблюдать эти требования.

🟠Техническая реализация различий
Родные куки доступны только для домена, который их установил, и передаются только в рамках запросов к этому домену. Сторонние куки могут использоваться только если браузер явно разрешает это, либо если сервер настроен для совместимости с современными политиками (например, SameSite=None; Secure).

Ставь 👍 и забирай 📚 Базу знаний

Backend

01 Jan, 16:10


🤔 Что такое транзакция?

Это последовательность операций с базой данных, которые выполняются как единое целое. Она должна соответствовать свойствам ACID: атомарность, согласованность, изолированность и долговечность. Транзакции позволяют обеспечить целостность данных даже в случае сбоев.

Ставь 👍 и забирай 📚 Базу знаний

Backend

01 Jan, 09:10


🤔 Что такое Request/Reply и Publish/Subscribe?

Это два разных подхода к обмену сообщениями между компонентами распределённых систем. Они различаются архитектурными принципами, целями и способами взаимодействия между отправителями и получателями.

🚩Request/Reply (Запрос/Ответ)

Это коммуникационная модель, при которой один компонент системы отправляет запрос другому компоненту и ожидает ответа.

🟠Синхронность
Обычно предполагает синхронное взаимодействие, где отправитель блокируется до получения ответа.
🟠Точечное взаимодействие
Один запрос адресован одному конкретному получателю.
🟠Идентификация корреляции
Для обработки ответа отправитель использует корреляционный идентификатор, чтобы сопоставить его с исходным запросом.

🚩Плюсы и минусы

Простая реализация.
Подходит для задач, где требуется немедленный результат (например, запрос данных из базы).
Уязвимость к задержкам (если один из компонентов медленный, это замедляет всю систему).
Меньшая масштабируемость из-за зависимости от синхронности.

🚩Publish/Subscribe (Публикация/Подписка)

Это асинхронная модель взаимодействия, в которой один компонент публикует сообщения, а другие компоненты, подписанные на эти сообщения, получают их.

🟠Асинхронность
Публикация сообщений и их получение подписчиками происходят независимо.
🟠Множественные подписчики
Сообщение может быть отправлено нескольким подписчикам одновременно.
🟠Темы или каналы
Публикация осуществляется в рамках определённых тем или каналов, а подписчики получают только интересующие их сообщения.

🚩Плюсы и минусы

Высокая масштабируемость.
Уменьшение связности компонентов (компоненты не знают друг о друге напрямую).
Асинхронность, позволяющая более эффективно использовать ресурсы.
Сложнее отлаживать из-за асинхронного характера.
Отсутствие гарантий доставки сообщений без дополнительных механизмов (в зависимости от реализации).

Ставь 👍 и забирай 📚 Базу знаний

Backend

31 Dec, 16:10


🤔 Что такое Docker?

Это платформа для контейнеризации, позволяющая запускать приложения в изолированных контейнерах. Контейнеры включают всё необходимое для работы приложения: код, библиотеки и зависимости. Это обеспечивает лёгкость развертывания, масштабируемость и консистентность среды выполнения.


Ставь 👍 и забирай 📚 Базу знаний

Backend

31 Dec, 09:10


🤔 Почему значение null считается ошибкой?

Значение null считается ошибкой в программировании, потому что оно часто приводит к непредсказуемым ошибкам, сложным для отладки и устранения. Его использование стало настолько проблематичным, что создатель null — Тони Хоар — назвал его "миллиардной ошибкой" из-за огромного количества проблем и уязвимостей, которые оно вызвало.

🚩Почему `null` считается ошибкой?

🟠Проблема отсутствия значения
null используется для обозначения "отсутствия значения", но сама по себе идея "пустоты" вводит двусмысленность в код. Например: "Отсутствует ли значение из-за ошибки, или это нормальное поведение?".

🟠Ошибки времени выполнения (NullPointerException)
Попытка вызвать метод или обратиться к полю объекта, который равен null, приводит к исключению, например, NullPointerException в Java или TypeError в JavaScript. Эти ошибки сложно предсказать на этапе компиляции и они часто приводят к сбоям программы.

String name = null;
int length = name.length(); // NullPointerException


🟠Затруднённая отладка
null-ошибки часто проявляются в непредсказуемых местах, что делает их сложными для поиска. Программисты тратят много времени на отладку, чтобы понять, откуда возникло null.

🟠Повышенная вероятность ошибок
Каждый раз, когда переменная может быть null, программист должен явно проверять её наличие перед использованием. Это делает код многословным и менее читаемым. Плохой код
if (user != null && user.getAddress() != null) {
String city = user.getAddress().getCity();
}


🟠Нарушение семантики типов
null не соответствует типу, который описывает переменную. Например, если переменная типа String равна null, то фактически в ней нет строки. Это нарушает типобезопасность и вносит неявное поведение в программу.

🟠Неопределённость и ошибки логики
Часто null используется для обозначения нескольких состояний одновременно: "значение не инициализировано", "значение отсутствует" или "ошибка при получении данных". Это приводит к логическим ошибкам и двусмысленности.

🟠Проблемы в многопоточных приложениях
Если несколько потоков работают с общим объектом, и один из них устанавливает его в null, то другие потоки могут столкнуться с ошибками времени выполнения.

🟠Усложнение кода
Из-за потенциального наличия null разработчики должны добавлять дополнительные проверки, чтобы избежать ошибок. Это делает код менее чистым и увеличивает вероятность пропустить проверку.

🚩Альтернативы значению null

🟠Optional-объекты
В Java, Kotlin и других языках существуют Optional (или аналоги), которые явно представляют "наличие или отсутствие значения". Это заставляет разработчика явно обрабатывать "пустое" состояние.
Optional<String> name = Optional.ofNullable(user.getName());
name.ifPresent(System.out::println);


🟠Монады (Maybe/Option)
В функциональных языках (Haskell, Scala) используются монады Maybe/Option, которые безопасно обрабатывают отсутствие значения.

🟠Инициализация значений по умолчанию
Вместо использования null можно задавать значения по умолчанию, например, пустую строку "" или 0 для чисел.

🟠Null Object Pattern
Это шаблон проектирования, где вместо null используется специальный "пустой объект", который имеет предсказуемое поведение. Например, вместо null можно вернуть объект с "пустыми" методами.
class NullUser extends User {
@Override
public String getName() {
return "Unknown User";
}
}


🟠Языки с безопасной обработкой
ength = 

В Kotlin и Swift типы разделяются на nullable и non-nullable. Компилятор заставляет разработчика обрабатывать потенциальный null.
val name: String? = null // nullable
println(name?.length) // Безопасный вызов


Ставь 👍 и забирай 📚 Базу знаний

Backend

30 Dec, 16:10


🤔 Какие типы HTTP запросов знаешь? В чём их отличия?

1. GET: запрашивает данные с сервера, без изменения.
2. POST: отправляет данные на сервер для создания ресурса.
3. PUT: обновляет или заменяет данные, может создать новый ресурс.
4. DELETE: удаляет ресурс на сервере.
5. PATCH: частично обновляет ресурс.
6. OPTIONS: возвращает информацию о доступных методах для ресурса.


Ставь 👍 и забирай 📚 Базу знаний

Backend

30 Dec, 09:10


🤔 В чём разница между параллелизмом и многопоточностью?

Это два разных, но связанных понятия, которые часто используются в контексте выполнения задач в программировании. Хотя они кажутся схожими, их цели, принципы и области применения различаются.

🚩Определения

🟠Параллелизм (Parallelism)
Это одновременное выполнение нескольких задач или частей задачи на нескольких процессорных ядрах или машинах. Он предполагает физический параллельный запуск операций. Например, выполнение двух разных операций одновременно на двух ядрах процессора. Параллелизм направлен на повышение производительности программы за счёт разделения работы.

🟠Многопоточность (Multithreading)
Это техника, при которой одна программа делится на несколько потоков, выполняющихся псевдопараллельно (по очереди или параллельно, в зависимости от количества ядер процессора). Потоки работают в рамках одного процесса и делят общую память. Многопоточность позволяет эффективно использовать ресурсы процессора при переключении между задачами. Она часто используется для работы с I/O-операциями, где потоки могут ожидать данных и не блокировать выполнение программы.

🚩Детальное сравнение

🟠Физическое vs логическое выполнение
Параллелизм использует физическую многозадачность, когда задачи выполняются одновременно на разных ядрах процессора или разных машинах. Многопоточность может использовать псевдопараллельность: потоки переключаются на одном ядре процессора (с использованием планировщика ОС) или действительно работают параллельно на нескольких ядрах.

🟠Использование ресурсов
В параллелизме ресурсы распределяются между несколькими задачами (например, вычисления на CPU). В многопоточности потоки могут совместно использовать общую память и другие ресурсы одного процесса.

🟠Типы задач
Параллелизм: задачи, которые можно разделить на независимые подзадачи, работающие одновременно (например, обработка данных в больших системах или рендеринг видео). Многопоточность: задачи, которые включают ожидание ввода/вывода или требуют выполнения нескольких задач внутри одного приложения (например, интерфейс пользователя и фоновый процесс).

🟠Пример на практике
Параллелизм: Видеокодирование, где каждый кадр обрабатывается на разных ядрах процессора одновременно. Многопоточность: Веб-сервер, который обрабатывает несколько запросов пользователей одновременно, используя потоки.

🚩Параллелизм и многопоточность вместе

Многопоточность может использоваться для достижения параллелизма при наличии нескольких процессорных ядер. Например: Если у программы несколько потоков и у компьютера два ядра, то операционная система может распределить потоки на разные ядра, что создаст параллельное выполнение. Если же у процессора одно ядро, потоки будут псевдопараллельными, так как процессор будет быстро переключаться между ними.

🚩Примеры из жизни

🟠Параллелизм
Несколько поваров готовят разные блюда на отдельных кухонных станциях одновременно. Распределённые вычисления: Большая задача разбивается и выполняется на нескольких серверах.
🟠Многопоточность
Один человек (процессор) делает несколько задач поочерёдно: ставит суп вариться, затем режет салат, затем проверяет суп. Псевдопараллельность: Даже если задачи не выполняются одновременно, переключение между ними создаёт иллюзию многозадачности.

Ставь 👍 и забирай 📚 Базу знаний

Backend

29 Dec, 16:10


🤔 Какие есть коды ответов HTTP?

1. 1xx (Информационные): уведомления о процессе запроса (например, 100 Continue).
2. 2xx (Успех): успешное выполнение запроса (например, 200 OK, 201 Created).
3. 3xx (Перенаправления): требуется дополнительное действие клиента (например, 301 Moved Permanently, 302 Found).
4. 4xx (Ошибки клиента): проблемы с запросом (например, 400 Bad Request, 401 Unauthorized, 404 Not Found).
5. 5xx (Ошибки сервера): проблемы на стороне сервера (например, 500 Internal Server Error, 503 Service Unavailable).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

29 Dec, 09:10


🤔 Что такое переполнение стека?

Это ошибка, возникающая, когда программа исчерпывает доступное пространство стека из-за чрезмерного количества вызовов функций или выделения данных на стеке. Это приводит к сбою программы, так как система не может выделить дополнительную память для новых вызовов.

🚩Что такое стек?

Это структура данных, работающая по принципу LIFO (*Last In, First Out*, последним пришёл — первым вышел). В контексте программного исполнения стек используется для хранения:
🟠Адресов возврата
Функций при их вызовах.
🟠Локальных переменных
И параметров функции.
🟠Информации о контексте выполнения
Программы.

🚩Причины переполнения стека

🟠Бесконечная рекурсия
Если функция вызывает саму себя бесконечное количество раз без условия завершения, стек будет наполняться до тех пор, пока не исчерпает выделенную память. Функция рекурсивно вызывает саму себя без выхода.

🟠Глубокая рекурсия
Даже если рекурсия корректно завершится, но глубина рекурсивных вызовов слишком велика, доступный размер стека может быть исчерпан.

🟠Выделение больших локальных переменных
Стек ограничен по размеру, поэтому выделение больших структур или массивов в локальной области функции может быстро исчерпать стек. Пример: создание большого массива как локальной переменной внутри функции.

🟠Ошибка в циклических вызовах
Две или более функции могут бесконечно вызывать друг друга, что приводит к быстрому переполнению стека.

🚩Признаки и последствия переполнения стека

🟠Ошибка времени выполнения
В большинстве языков программирования возникает ошибка StackOverflowError или подобная. В C/C++ это может привести к сегментационному сбою (*segmentation fault*). В Java, Python и других языках будет выброшено исключение о переполнении стека.

🟠Сбой программы
Программа аварийно завершает работу из-за невозможности выделить дополнительное пространство для стека.

🟠Отсутствие видимых симптомов
В некоторых системах переполнение стека может привести к непредсказуемому поведению программы, включая повреждение данных или утечку памяти.

🚩Как избежать переполнения стека?

🟠Использование правильной рекурсии
Убедитесь, что рекурсивные функции имеют условие завершения (базовый случай). Для глубокой рекурсии можно использовать хвостовую рекурсию, которая оптимизируется компилятором в некоторых языках.

🟠Использование циклов вместо рекурсии
Если возможно, заменяйте рекурсивные вызовы итеративными циклами, чтобы избежать глубокого стека вызовов.

🟠Динамическое выделение памяти
Для больших структур данных используйте кучу (heap) вместо стека для выделения памяти, так как она имеет больший объём доступного пространства.

🟠Контроль размера стека
В некоторых языках можно увеличить размер стека через настройки среды выполнения или компилятора. Например: В C/C++ можно задать размер стека с помощью опций компиляции. В Java размер стека можно увеличить с помощью параметра -Xss.

🟠Анализ кода
Используйте анализаторы статического кода и профилировщики, чтобы найти функции, вызывающие избыточную глубину стека.

🟠Оптимизация локальных переменных
Старайтесь избегать больших локальных переменных или структур, выделяя их в куче.

Ставь 👍 и забирай 📚 Базу знаний

Backend

28 Dec, 16:10


🤔 Что такое "Сложность алгоритма"?

Это характеристика, показывающая, как изменяются ресурсы (время или память), необходимые для выполнения алгоритма, в зависимости от размера входных данных.
• Временная сложность измеряет количество операций (например, O(n), O(log n)).
• Пространственная сложность измеряет объём памяти, необходимый для выполнения алгоритма.
Сложность позволяет сравнивать эффективность алгоритмов.

Ставь 👍 и забирай 📚 Базу знаний

Backend

28 Dec, 09:10


🤔 Плюсы и минусы изменяемых и неизменяемых значений?

Это два разных подхода к хранению и обработке данных в программировании. Каждый из них имеет свои плюсы и минусы в зависимости от задачи, контекста и используемого языка программирования.

🚩Определения

🟠Изменяемые значения (Mutable)
Это значения или структуры данных, которые могут быть изменены после их создания. Например, массивы, списки и словари в Python или объекты в Java.
🟠Неизменяемые значения (Immutable)
Это значения или структуры данных, которые не могут быть изменены после их создания. Любое изменение приводит к созданию нового объекта. Примеры: строки (string) и кортежи в Python, объекты String в Java, или const в некоторых языках программирования.

🚩Плюсы и минусы изменяемых

Эффективное использование памяти
Поскольку изменяемые объекты обновляются "на месте", нет необходимости создавать новые копии объекта, что экономит память.

Быстродействие
Изменение значений в уже существующих объектах часто происходит быстрее, чем создание нового объекта, особенно для больших структур данных.

Гибкость
Изменяемые объекты более гибкие и удобные для задач, которые требуют частых модификаций, таких как добавление или удаление элементов.

Простота записи
Код с изменяемыми объектами часто выглядит проще и чище для операций обновления значений.

Неожиданное поведение (побочные эффекты)
При передаче изменяемых объектов между функциями или частями программы их изменение в одном месте может непредсказуемо повлиять на другие части кода.

Сложность отладки
Из-за изменения значений "на месте" сложнее отследить, где именно произошло изменение объекта.

Проблемы в многопоточных программах
Одновременные изменения одного и того же объекта в разных потоках могут привести к состояниям гонки (race conditions) и другим багам. Это требует дополнительной синхронизации.

Усложнение тестирования
Тестировать функции, которые работают с изменяемыми значениями, сложнее, поскольку их поведение может зависеть от текущего состояния объекта.

🚩Плюсы и минусы неизменяемых

Безопасность и предсказуемость
Неизменяемые значения гарантируют, что данные не изменятся после создания. Это снижает вероятность непредсказуемых ошибок и упрощает отладку.

Потокобезопасность (Thread Safety)
Неизменяемые объекты безопасны для многопоточного программирования, так как их состояние не может быть изменено после создания. Это устраняет проблемы синхронизации.

Упрощение тестирования и отладки
Поскольку неизменяемые объекты всегда остаются в одном и том же состоянии, функции, которые их используют, становятся более детерминированными и проще в тестировании.

История изменений и откаты
Благодаря неизменяемости можно сохранять "снимки" состояния программы, что полезно для версирования данных, откатов и реализации undo/redo функциональности.

Оптимизация в компиляторах и кэшировании
Неизменяемые объекты могут кэшироваться и повторно использоваться компилятором или средой выполнения, что повышает производительность.

Накладные расходы по памяти
При каждом изменении неизменяемого объекта создаётся новая копия, что может привести к большому расходу памяти, особенно при работе с большими данными.

Снижение производительности
Создание нового объекта и копирование данных занимает дополнительное время, что может быть медленнее по сравнению с изменяемыми значениями.

Неудобство для частых изменений
Неизменяемые структуры данных плохо подходят для задач, которые требуют частых и мелких модификаций, например, динамических списков или больших матриц.

Усложнение кода
Код, работающий с неизменяемыми объектами, может выглядеть более громоздким из-за необходимости создания новых копий при каждом изменении.

Ставь 👍 и забирай 📚 Базу знаний

Backend

27 Dec, 16:10


🤔 Что такое Git-flow?

Это стратегия работы с ветками в Git, которая организует разработку и релизы. Она включает в себя основные ветки: main (или master), develop и временные ветки для новых функций (feature), исправлений (hotfix), релизов (release). Git-flow упрощает управление разработкой, параллельной работой и релизным циклом.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

27 Dec, 09:10


🤔 Что такое структуры с высоким сцеплением?

Это структуры или модули в программном обеспечении, которые сильно зависят друг от друга. Высокое сцепление означает, что изменение в одном модуле требует изменений в связанных с ним модулях, что делает систему менее гибкой, сложной для сопровождения и расширения.

🚩Что такое сцепление (Coupling)?

Это мера степени зависимости одного модуля или компонента системы от другого. Оно описывает, насколько сильно модули связаны между собой и насколько один модуль знает о деталях работы другого.

🟠Низкое сцепление (Low Coupling)
Модули независимы друг от друга и взаимодействуют через чётко определённые интерфейсы.
🟠Высокое сцепление (High Coupling)
Модули тесно связаны и сильно зависят друг от друга, что делает их взаимозависимыми.

🚩Признаки структур с высоким сцеплением

🟠Жёсткая зависимость между модулями
Изменение в одном модуле требует изменения в других модулях.
🟠Отсутствие абстракций
Один модуль напрямую использует внутренние детали реализации другого модуля.
🟠Невозможность независимого тестирования
Из-за сильных зависимостей сложно тестировать модули изолированно.
🟠Трудности в расширении и поддержке
Внесение изменений становится дорогостоящим и трудоёмким.
🟠Дублирование логики
При отсутствии чётких интерфейсов часто приходится дублировать код в нескольких местах.

🚩Проблемы высоко сцепленных структур
🟠Сложность внесения изменений
При изменении одного компонента другие компоненты, которые зависят от него, также должны быть изменены или протестированы. Например, если модуль A напрямую вызывает функции из модуля B и структура модуля B меняется, то модуль A сломается.

🟠Снижение гибкости системы
Высокое сцепление затрудняет рефакторинг и добавление новых функций, так как изменения могут привести к каскадным ошибкам в связанных модулях.

🟠Сложность тестирования
Невозможно протестировать отдельные модули из-за их зависимости от других частей системы. Это приводит к сложным и ненадёжным тестам.

🟠Повышенная вероятность ошибок
Системы с высоким сцеплением более подвержены ошибкам из-за множества зависимостей. Изменение одного модуля может вызвать неожиданные проблемы в другом.

🟠Сложность масштабирования
Система с высоким сцеплением хуже адаптируется к изменяющимся требованиям и сложнее масштабируется, так как изменения требуют больше времени и ресурсов.

🚩Примеры высокого сцепления

🟠Жёсткая зависимость между классами
Если один класс напрямую создаёт экземпляры других классов или вызывает их методы, это ведёт к высокому сцеплению. Например, если класс OrderProcessor напрямую вызывает методы DatabaseManager и PaymentGateway, то изменения в их логике повлияют на OrderProcessor.

🟠Отсутствие интерфейсов или абстракций
Если модули взаимодействуют напрямую, а не через интерфейсы или абстрактные классы, это приводит к жёсткой привязке к конкретной реализации.

🟠Модуль, использующий глобальные переменные
Если несколько модулей обращаются к одним и тем же глобальным данным, это создаёт сильную зависимость между ними.

🚩Как снизить сцепление (добиться Low Coupling)?

🟠Использование абстракций
Внедряйте интерфейсы или абстрактные классы вместо конкретных реализаций, чтобы модули могли взаимодействовать через них.

🟠Dependency Injection (DI)
Внедрение зависимостей позволяет передавать зависимости в модуль извне, что уменьшает их прямую связь.

🟠Слои и модули
Разделите систему на логические слои (например, слой представления, бизнес-логики и данных), чтобы минимизировать связи между ними.

🟠Использование паттернов проектирования
Паттерны, такие как Adapter, Facade, Mediator и Observer, помогают уменьшить прямую зависимость между компонентами.

🟠Разделение ответственности (SRP)
Каждый модуль должен отвечать только за одну задачу. Это делает их более независимыми.

🟠Изоляция и тестирование
Создавайте модули так, чтобы их можно было тестировать изолированно, не завися от других компонентов системы.

Ставь 👍 и забирай 📚 Базу знаний

Backend

26 Dec, 16:10


🤔 Что такое HTTP?

Это протокол для передачи данных в интернете. Он используется для обмена информацией между клиентами (например, браузерами) и серверами. HTTP работает по принципу запрос-ответ: клиент отправляет запрос, сервер возвращает ответ, содержащий данные (например, HTML, JSON).

Ставь 👍 и забирай 📚 Базу знаний

Backend

26 Dec, 09:10


🤔 Какие недостатки есть у одностраничных приложений?

Это веб-приложения, где основная страница загружается один раз, а последующие взаимодействия с пользователем обрабатываются динамически без полной перезагрузки страницы. Хотя SPA имеют ряд преимуществ, таких как улучшенный пользовательский опыт и высокая скорость отклика, у них также есть существенные недостатки, которые стоит учитывать при разработке.

🚩Основные недостатки одностраничных приложений

🟠Проблемы с SEO (поисковой оптимизацией)
Поисковые системы изначально плохо индексируют контент, который загружается динамически через JavaScript, так как страницы не содержат готового HTML-контента при первоначальной загрузке. Хотя поисковые роботы совершенствуются и могут обрабатывать JavaScript (например, Googlebot), это не всегда гарантирует корректную индексацию. Для решения этой проблемы разработчики используют Server-Side Rendering (SSR) или статическую генерацию страниц.

🟠Долгая первоначальная загрузка (Initial Load)
В SPA большая часть ресурсов приложения (HTML, CSS, JavaScript) загружается сразу при первом открытии страницы. Если приложение имеет много функционала и зависимости, это может привести к увеличению времени загрузки и ухудшению пользовательского опыта на медленных сетях.

🟠Повышенная сложность разработки
SPA требует сложной архитектуры и более глубокого понимания работы фронтенда. Разработка включает управление состоянием приложения (например, с использованием Redux, Vuex) и маршрутизацией (например, React Router или Vue Router). Также необходимо реализовать оптимизацию производительности и кэширование данных для улучшения пользовательского опыта.

🟠Проблемы с безопасностью
SPA более уязвимы для XSS-атак (межсайтовый скриптинг), так как большинство данных и логики обрабатывается на стороне клиента. JavaScript-код пользователя виден в браузере, что может предоставить злоумышленнику больше возможностей для анализа и атак. Необходимы дополнительные меры безопасности, такие как CSP (Content Security Policy), шифрование данных и защита от XSS.

🟠Неудобство для пользователей с отключённым JavaScript
Если JavaScript отключен в браузере пользователя, SPA не будет работать вообще, так как весь функционал зависит от клиентского выполнения JavaScript. Важно учитывать это при разработке приложений, критичных для доступности.

🟠Проблемы с навигацией и историей браузера
В SPA страницы не перезагружаются при переходах между разделами, что может привести к некорректной работе кнопок «Назад» и «Вперёд» в браузере. Для решения этой проблемы необходимо использовать исторический API браузера (History API) и соответствующие маршрутизаторы.

🟠Высокая нагрузка на клиентские устройства
SPA перекладывает часть вычислений на браузер пользователя, который должен обрабатывать большой объём JavaScript-кода. На слабых устройствах (мобильных телефонах, старых ПК) это может привести к медленной производительности и зависаниям.

🟠Проблемы с кэшированием
В традиционных многостраничных приложениях браузер кэширует статические ресурсы (HTML, CSS, JS), что снижает нагрузку на сервер. В SPA динамическая загрузка данных через API может привести к проблемам с кэшированием, если не реализовать это правильно.

🟠Отсутствие прогрессивного улучшения (Progressive Enhancement)
В SPA сложнее поддерживать устаревшие браузеры или устройства с низкой производительностью. Если JavaScript работает некорректно, приложение может полностью выйти из строя.

🟠Повышенная зависимость от API
SPA обычно активно взаимодействуют с сервером через API (например, REST или GraphQL). Если API недоступно или работает с ошибками, приложение теряет часть функционала или становится бесполезным. Необходимо внедрять обработку ошибок и механизмы кэширования данных на клиенте.

Ставь 👍 и забирай 📚 Базу знаний

Backend

25 Dec, 09:10


🤔 Как управлять версиями API?

Это процесс контроля изменений и обновлений API, чтобы обеспечить стабильность работы существующих клиентов (пользователей API) и возможность внедрения новых функций. Правильное управление версиями помогает избежать неожиданных сбоев у потребителей API при обновлении или изменении его структуры.

🚩Почему управление версиями API важно?

🟠Стабильность
Обновления API не должны нарушать работу клиентов, которые используют старые версии.
🟠Совместимость
Новые функции могут сосуществовать с существующим функционалом.
🟠Эволюция
Позволяет вносить улучшения в API без ущерба для текущих пользователей.
🟠Контроль
Разработчики API могут чётко сообщать, какая версия поддерживается, а какая устарела.

🚩Подходы к управлению версиями API

🟠Версионирование через URL (URI-based Versioning)
Версия API указывается как часть URL.
https://api.example.com/v1/users
https://api.example.com/v2/users

Плюсы и минусы
Простота и очевидность для клиентов API.
Разные версии могут существовать параллельно.
Может привести к дублированию кода на сервере.
URL становятся менее "чистыми".

🟠Версионирование через заголовки (Header Versioning)
Версия передаётся в HTTP-заголовке запроса.
GET /users  
Accept: application/vnd.example.v1+json

Плюсы и минусы
URL остаются чистыми.
Позволяет более гибко управлять форматами ответов.
Требует явного указания заголовков.
Может быть менее очевидным для клиентов.

🟠Версионирование через параметр запроса (Query Parameter Versioning)
Версия указывается в качестве параметра запроса.
https://api.example.com/users?version=1
https://api.example.com/users?version=2


Плюсы и минусы
Простота реализации.
Легко управлять параметрами запроса.
Может запутать клиентов, если параметры запроса используются для других целей.
Не является общепринятым стандартом.

🟠Версионирование через медиатип (Media Type Versioning)
Версия API определяется через тип содержимого (Content-Type) или заголовок Accept.
GET /users  
Accept: application/json; version=1


Плюсы и минусы
Хорошая интеграция с REST API.
Поддерживает эволюцию API без изменения URL.
Сложнее реализовать и понимать клиентам.

🚩Как выбирать подход к версионированию?

🟠URL-версионирование
Подходит для большинства API, когда изменения значительны и нужны отдельные версии.
🟠Заголовки или медиатипы
Подходят для больших корпоративных систем или случаев, когда нужно сохранить чистый URL.
🟠Query-параметры
Подойдут для небольших проектов или временного тестирования новых версий.

🚩Стратегии управления версиями API

🟠Семантическое версионирование (Semantic Versioning)
Следует правилам MAJOR.MINOR.PATCH (например, v1.2.3):
MAJOR: Несовместимые изменения, ломающие существующий код.
MINOR: Добавление новой функциональности, совместимое с предыдущими версиями.
PATCH: Исправления ошибок и мелкие изменения.

🟠Поддержка устаревших версий
Чётко указывайте, как долго старые версии будут поддерживаться. Устаревшие версии нужно документировать и постепенно выводить из эксплуатации.

🟠Документация и коммуникация
Обновления версий API должны сопровождаться подробной документацией. Информируйте пользователей о предстоящих изменениях и сроках вывода старых версий.

🟠Обратная совместимость
По возможности изменения должны быть обратно совместимыми, чтобы клиенты не сталкивались с неожиданными ошибками.

🚩Рекомендации для управления версиями API
Всегда начинайте с v1 в URL или заголовках. Документируйте все изменения при выпуске новой версии. Устанавливайте сроки поддержки устаревших версий. Используйте семантическое версионирование для отслеживания изменений. Оповещайте пользователей API о планируемых обновлениях заранее. Тестируйте старые и новые версии API на совместимость.

Ставь 👍 и забирай 📚 Базу знаний

Backend

24 Dec, 16:10


🤔 Что такое индексы?

Индексы в базах данных — это структуры данных, которые улучшают скорость операций поиска/выборки данных за счет предоставления быстрых путей к данным в таблицах. Индексы часто создаются для ускорения поиска по ключевым столбцам и могут существенно увеличить производительность запросов.

Ставь 👍 и забирай 📚 Базу знаний

Backend

24 Dec, 09:10


🤔 Почему index массива часто начинается с нуля?

Индекс массива часто начинается с нуля по историческим и практическим причинам, связанным с архитектурой компьютеров и принципами работы с памятью. Это поведение стало стандартом в большинстве языков программирования (например, C, C++, Java, Python).

🚩Основные причины

🟠Простота адресации в памяти
Массивы хранятся в памяти как последовательные ячейки, и для доступа к элементу массива используется смещение от начального адреса.
Если массив начинается с индекса 0, то адрес элемента вычисляется по формуле:
\text{Адрес элемента} = \text{Базовый адрес} + (\text{индекс} \times \text{размер элемента})

Например, для первого элемента массива (индекс 0):
\text{Адрес} = \text{Базовый адрес} + (0 \times \text{размер элемента}) = \text{Базовый адрес}


🟠Эффективность работы на уровне машинного кода
Процессоры и память работают с указателями и смещениями. Начало массива (индекс 0) соответствует базовому адресу, а следующие элементы смещаются на размер данных. Это соответствует базовой логике работы процессора и требует меньше вычислений.

🟠Историческое наследие
Индексация с нуля пришла из языка C и более ранних языков, таких как Assembly. Язык C, созданный в 1970-х годах, получил широкое распространение, и многие современные языки программирования унаследовали его подход. Например, в C указатель на массив указывает на первый элемент (index 0), а доступ к элементам происходит через арифметику указателей.

🟠Удобство работы с указателями
В языках низкого уровня (например, C) массив и указатель на его начало практически эквивалентны. Индексация с нуля позволяет упростить арифметику указателей: Если ptr — указатель на начало массива, то ptr + i указывает на i-й элемент массива, где i = 0 указывает на первый элемент.

🟠Математическая логика
В математике и теории множеств индексы и последовательности часто начинаются с 0. Например: Вектор длиной n имеет n элементов, и их индексы обычно лежат в диапазоне [0, n-1].

🚩Почему не с единицы?

Хотя индексация с 1 может быть интуитивно понятной для некоторых людей (особенно не программистов), она требует дополнительных вычислений при адресации. Для индекса 1 формула смещения будет
\text{Адрес элемента} = \text{Базовый адрес} + ((\text{индекс} - 1) \times \text{размер элемента})


Ставь 👍 и забирай 📚 Базу знаний

Backend

23 Dec, 16:10


🤔 В чем разница между Scrum и Kanban?

Scrum — это методология Agile с фиксированными спринтами и определёнными ролями (Scrum Master, Product Owner). Kanban — это гибкий подход, где работа организована на доске с карточками, и нет строгих временных рамок. Scrum ориентирован на итерации, а Kanban — на постоянный поток задач.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

Backend

23 Dec, 09:10


🤔 Что такое замыкание и для чего оно полезно?

Это функция, которая захватывает и сохраняет своё лексическое окружение (контекст), даже после того как выполнение функции завершено. Замыкание позволяет функции получить доступ к переменным, которые были определены в её внешней области видимости.

🚩Как это работает?

Когда функция определена внутри другой функции, внутренняя функция имеет доступ ко всем переменным внешней функции благодаря лексическому окружению. Даже после завершения работы внешней функции, это окружение остаётся "живым" для внутренней функции, и она может использовать и изменять эти переменные.

🚩Основные характеристики замыканий

🟠Захват переменных внешней функции
Внутренняя функция "запоминает" переменные, которые существовали во внешней функции в момент её создания.

🟠Доступ к закрытым данным
Замыкания позволяют скрывать данные и предоставлять к ним доступ только через определённые функции.

🟠Сохранение состояния
Замыкание "помнит" значение переменных между вызовами функции, что позволяет реализовать счётчики, кэши и другие конструкции.

🟠Функции высшего порядка
Замыкания часто используются в функциональном программировании, где функции могут возвращать другие функции или принимать их в качестве аргументов.

🚩Для чего замыкания полезны?

🟠Инкапсуляция данных
Замыкания позволяют скрывать переменные и предоставлять доступ к ним только через определённые функции. Это помогает защитить данные от случайного изменения и улучшает безопасность кода.

🟠Сохранение состояния между вызовами
Замыкания могут "запоминать" значение переменных между вызовами функции. Например, можно создать счётчик, который хранит своё состояние.

🟠Фабрики функций
Замыкания используются для создания функций с определённым поведением. Например, можно создать функции, которые зависят от некоторых заранее заданных параметров.

🟠Колбэки и асинхронное программирование
В языках с поддержкой асинхронного программирования замыкания используются для передачи функций-обработчиков (колбэков), которые сохраняют доступ к переменным из своей области видимости.

🟠Функции-генераторы и ленивые вычисления
Замыкания могут быть полезны для создания функций, которые выполняют вычисления только по требованию.

🚩Примеры использования

🟠Счётчик
Создание функции, которая инкрементирует и возвращает число при каждом вызове. Переменная-счётчик хранится в замыкании и остаётся доступной для внутренней функции.

🟠Фабрики функций
Создание функций с "преднастроенными" параметрами. Например, функция, возвращающая умножение числа на фиксированный множитель.

🟠Обработчики событий
В веб-разработке замыкания используются для сохранения контекста переменных при обработке событий (например, при клике по кнопке).

🟠Мемоизация
Хранение результатов вычислений в замыкании для оптимизации производительности.

Ставь 👍 и забирай 📚 Базу знаний

Backend

22 Dec, 16:10


🤔 В чём разница между SQL и NoSQL?

SQL (Structured Query Language) — это язык запросов для работы с реляционными базами данных, которые организуют данные в таблицах. NoSQL — это общий термин для баз данных, которые не используют табличную модель и часто оптимизированы для работы с большими объемами распределенных данных. Основные различия включают модели данных, схемы, масштабируемость, и консистентность.

Ставь 👍 и забирай 📚 Базу знаний

Backend

22 Dec, 09:10


🤔 Пример кода, создающего утечку памяти?

Происходит, когда программа выделяет память для объектов, но не освобождает её, даже когда эти объекты больше не нужны. Это особенно критично в языках, где управление памятью ложится на разработчика, например, в C или C++. Однако утечки памяти могут возникать и в языках с автоматической сборкой мусора (GC), таких как Python или Java, если есть "живые" ссылки на ненужные объекты.

🚩Пример утечки памяти в C++

В функции memoryLeakExample() память для переменной ptr выделяется динамически с помощью new. Однако память не освобождается с помощью delete, когда указатель выходит из области видимости. При многократном вызове этой функции программа будет терять память с каждым вызовом, что приведёт к утечке и потенциальному исчерпанию ресурсов.
#include <iostream>

void memoryLeakExample() {
int* ptr = new int(5); // Динамическое выделение памяти
std::cout << "Выделена память по адресу: " << ptr << " со значением: " << *ptr << std::endl;
// Здесь мы забываем освободить память
} // Утечка памяти: указатель ptr выходит из области видимости, а память не освобождается.

int main() {
for (int i = 0; i < 1000000; ++i) {
memoryLeakExample(); // Функция вызывается многократно
}
return 0;
}


🚩Пример утечки памяти в Python
Даже в языках с сборщиком мусора (как в Python), утечки памяти могут происходить из-за сильных ссылок, которые препятствуют сборке мусора.
class LeakyClass:
def __init__(self):
self.data = [0] * 10**6 # Занимаем большой объём памяти

def memory_leak_example():
leaks = [] # Список хранит ссылки на объекты
while True:
leaks.append(LeakyClass()) # Объекты добавляются, но не удаляются

memory_leak_example()


Ставь 👍 и забирай 📚 Базу знаний

Backend

21 Dec, 16:10


🤔 Что такое индексы?

Индексы в базах данных — это структуры данных, которые улучшают скорость операций поиска/выборки данных за счет предоставления быстрых путей к данным в таблицах. Индексы часто создаются для ускорения поиска по ключевым столбцам и могут существенно увеличить производительность запросов.

Ставь 👍 и забирай 📚 Базу знаний