Backend
3.95K subscribers
36 photos
712 links
Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
🤔 Почему синглтон называют антипаттерном?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что знаешь о принципах программирования DRY?

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

🚩Аспекты

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

🚩Примеры применения

🟠Функции и методы
Вынос общих операций в функции или методы, которые затем можно вызывать в различных частях программы.
🟠Модули и библиотеки
Создание модулей или библиотек, которые содержат повторяющуюся логику и могут быть переиспользованы в различных проектах.
🟠Константы
Объявление констант вместо использования "магических чисел" или строковых литералов в нескольких местах кода.
🟠Шаблоны
Использование шаблонов в HTML, XML или других языках разметки для генерации повторяющихся структур.
🟠Конфигурационные файлы
Хранение конфигурационных данных в одном месте, а не встраивание их в код.

🚩Плюсы

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

🚩Примеры нарушений

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие существуют нормальные формы в SQL?

В SQL существуют различные нормальные формы для нормализации баз данных, включая:
- Первая нормальная форма (1NF): данные разбиваются на атомарные единицы.
- Вторая нормальная форма (2NF): таблица находится в 1NF и все не ключевые атрибуты полностью зависят от первичного ключа.
- Третья нормальная форма (3NF): таблица находится в 2NF и все его атрибуты не зависят друг от друга, кроме зависимости от первичного ключа.
- Нормальная форма Бойса-Кодда (BCNF), Четвертая (4NF) и Пятая (5NF) нормальные формы далее уменьшают избыточность данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Для чего подходят асинхронные операции?

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

🚩Методы

🟠Сетевое взаимодействие
HTTP-запросы: Асинхронные HTTP-запросы позволяют приложениям запрашивать данные у веб-серверов без блокировки пользовательского интерфейса. Например, загрузка данных из API, отправка форм и файлов. WebSockets: Поддержка двустороннего взаимодействия между клиентом и сервером в реальном времени. Это используется в чатах, онлайн-играх и других приложениях, где требуется мгновенная передача данных. API-вызовы: Асинхронные вызовы к внешним API позволяют продолжать выполнение других операций, не дожидаясь ответа от сервера.

🟠Ввод/вывод (I/O)
Файловые операции: Асинхронное чтение и запись файлов позволяет обрабатывать большие объемы данных без блокировки основного потока выполнения. Работа с базами данных: Асинхронные запросы к базам данных уменьшают время ожидания и улучшают масштабируемость приложения.

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

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

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

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👾2👍1
🤔 Чем отличаются LEFT JOIN от INNER JOIN?

INNER JOIN возвращает строки, где есть совпадения в обеих таблицах. LEFT JOIN возвращает все строки из левой таблицы и сопоставленные строки из правой таблицы; если совпадения нет, возвращает NULL для столбцов правой таблицы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Forwarded from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это.

HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям.

Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%.

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

Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием.

О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео
🤔 Для чего используют redis в проектах?

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

🚩Основные применения

🟠Кэширование данных
Снижение нагрузки на базу данных: Кэширование часто запрашиваемых данных в Redis позволяет снизить нагрузку на основную базу данных и ускорить время ответа. Ускорение доступа к данным: Быстрое чтение данных из памяти обеспечивает низкую задержку и высокую производительность.

🟠Хранение сессий
Управление сессиями пользователей: Redis часто используется для хранения сессионных данных пользователей в веб-приложениях благодаря своей скорости и поддержке автоматического удаления старых данных (TTL).

🟠Очереди задач и сообщений
Асинхронные задачи: Redis используется для реализации очередей задач в таких системах, как Celery. Это позволяет распределять и выполнять задачи асинхронно и эффективно. Сообщения и события: Redis поддерживает механизм Pub/Sub для организации обмена сообщениями между различными частями приложения.

🟠Хранилище временных данных
Счётчики и трекеры: Используется для хранения временных данных, таких как счётчики посещений, лайков, просмотров и других показателей, которые часто обновляются. Краткосрочные данные: Хранение временных данных, которые необходимы на короткий срок и могут быть удалены после их использования.

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

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

🟠Функции блокировок
Реализация распределённых блокировок: Redis позволяет создавать механизмы блокировок для управления доступом к ресурсам в распределённых системах.

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

🟠Веб-приложения
Кэширование результатов запросов к базе данных. Хранение сессионных данных пользователей. Управление очередями задач для обработки данных в фоне.

🟠Мобильные приложения
Кэширование API-запросов для уменьшения задержек. Хранение временных данных и метрик использования.

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

🟠Аналитические системы
Кэширование результатов аналитических запросов. Управление счётчиками и метриками в реальном времени.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что тебе известно о бинарном дереве?

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

🚩Основные термины

🟠Узел (Node)
Основной элемент бинарного дерева, содержащий данные и ссылки на дочерние узлы.
🟠Корень (Root)
Верхний узел дерева, не имеющий родительских узлов.
🟠Лист (Leaf)
Узел, не имеющий дочерних узлов.
🟠Ветвь (Branch)
Путь от корня к любому другому узлу.
🟠Высота дерева
Максимальное количество уровней от корня до самого нижнего листа.
🟠Глубина узла
Расстояние от корня до данного узла.

🚩Виды

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

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

🟠Добавление узла (Insertion)
Процесс вставки нового узла в дерево. В случае двоичного дерева поиска, новый узел вставляется в соответствующее место, чтобы сохранить порядок элементов.
🟠Удаление узла (Deletion)
Процесс удаления узла из дерева. Может потребовать реорганизации дерева для поддержания его свойств.
🟠Поиск (Search)
Процесс нахождения узла с определенным значением. В двоичном дереве поиска это осуществляется быстрее благодаря упорядоченности узлов.
🟠Обход дерева (Traversal)
Процесс посещения всех узлов дерева в определенном порядке. Основные методы обхода:

🚩Применение

🟠Хранение отсортированных данных
Бинарное дерево поиска позволяет эффективно хранить и извлекать отсортированные данные.
🟠Поисковые системы
Использование деревьев для организации и поиска данных.
🟠Алгоритмы и структуры данных
Базовая структура для многих алгоритмов, включая сортировки, балансировки и другие операции с данными.
🟠Компиляторы и интерпретаторы
Используются для построения и обработки синтаксических деревьев при разборе кода.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Что такое итератор?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Для чего можно использовать celery?

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

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

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

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

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

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое идемпотентность?

Идемпотентность — это свойство операции, при котором её повторное выполнение не изменяет результат. В веб-разработке это важно для обеспечения безопасности повторных запросов. Например, методы GET и DELETE считаются идемпотентными, так как повторные вызовы не влияют на состояние ресурса.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое HTTP и HTTPs?

HTTP (HyperText Transfer Protocol) — это протокол прикладного уровня для передачи гипертекста между клиентом (например, веб-браузером) и сервером. Он является основой для обмена данными в веб-пространстве и используется для передачи HTML-документов, изображений, видео и других ресурсов.

🚩Как работает HTTP

🟠Запрос-ответ
HTTP работает по модели запрос-ответ, где клиент отправляет запрос серверу, а сервер возвращает ответ. Запросы и ответы состоят из трех основных частей:
Стартовая строка: Определяет метод запроса (например, GET, POST) и URI (Uniform Resource Identifier).
Заголовки: Несут метаданные, такие как тип контента, длина контента, информация о сессии и т. д.
Тело: Содержит данные, отправляемые в запросе или ответе (например, данные формы, JSON).

🟠Методы HTTP
Основные методы включают:
GET: Запрашивает данные с сервера.
POST: Отправляет данные на сервер для создания или обновления ресурса.
PUT: Обновляет существующий ресурс.
DELETE: Удаляет ресурс.
HEAD: Запрашивает только заголовки без тела ответа.
OPTIONS: Запрашивает информацию о возможностях сервера для определенного ресурса.

🟠Статусы ответа
Сервер отвечает статусными кодами, которые показывают результат обработки запроса. Например:
200 OK: Запрос успешно обработан.
404 Not Found: Ресурс не найден.
500 Internal Server Error: Внутренняя ошибка сервера.

🚩HTTPS (HyperText Transfer Protocol Secure)

HTTPS (HyperText Transfer Protocol Secure) — это расширение HTTP, которое использует шифрование для защиты данных, передаваемых между клиентом и сервером. HTTPS обеспечивает конфиденциальность, целостность и аутентификацию данных.

🚩Как работает HTTPS

🟠Шифрование
HTTPS использует протоколы SSL (Secure Sockets Layer) или его более современную версию TLS (Transport Layer Security) для шифрования данных. Это предотвращает перехват и чтение данных третьими лицами.
🟠Аутентификация
Серверы, использующие HTTPS, имеют цифровые сертификаты, которые проверяются клиентом. Это гарантирует, что клиент общается с подлинным сервером, а не с мошенником.
🟠Целостность данных
Шифрование также обеспечивает целостность данных, предотвращая их изменение или подмену во время передачи.

🚩Как установить HTTPS

1⃣Получение сертификата
Для использования HTTPS владелец сайта должен получить цифровой сертификат от доверенного центра сертификации (CA).
2⃣Настройка сервера
Установите сертификат на сервере и настройте его для использования HTTPS.
3⃣Перенаправление трафика
Обеспечьте перенаправление HTTP-трафика на HTTPS для повышения безопасности.

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

Безопасность
Защищает данные от перехвата и изменения.
Доверие пользователей
Пользователи больше доверяют сайтам с HTTPS, что может повысить их активность и лояльность.
SEO
Поисковые системы, такие как Google, предпочитают сайты с HTTPS, что может улучшить их ранжирование в результатах поиска.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Из чего состоит ответ на сервере?

Ответ сервера состоит из статусного кода, заголовков и тела. Статусный код сообщает результат обработки запроса (успех, ошибка и т. д.). Заголовки содержат метаданные, а тело передает данные.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Почему возрастает интерес к функциональному программированию?

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

🚩Системы

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие HTTP методы могут быть?

Основные HTTP методы: GET, POST, PUT, DELETE, PATCH. GET используется для получения данных, POST — для создания, PUT и PATCH — для обновления, DELETE — для удаления. Существуют также методы OPTIONS и HEAD для вспомогательных задач.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Примеры систем CP, AP и CA?

В контексте CAP-теоремы(Consistency, Availability, Partition Tolerance) системы обычно делят на три группы: CP (Consistency + Partition Tolerance), AP (Availability + Partition Tolerance) и CA (Consistency + Availability).

🚩CP-системы (Consistency + Partition Tolerance)

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

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

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

🚩AP-системы (Availability + Partition Tolerance)

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

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

🟠DynamoDB (режим AP)
Поддерживает доступность и устойчивость к разделению сети, за счёт возможного отклонения в согласованности. DynamoDB был разработан Amazon для обеспечения высокой доступности даже в условиях сбоя сети.

🟠Riak
Распределённое хранилище, оптимизированное для доступности и устойчивости к разделениям сети. Оно допускает временные рассогласования данных, которые разрешаются позже.

🚩CA-системы (Consistency + Availability)

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Расскажи об отличиях MVC от MVP

MVC (Model-View-Controller) и MVP (Model-View-Presenter) — это архитектурные паттерны для разделения логики. В MVC контроллер обрабатывает логику и обновляет представление, а в MVP презентер выполняет аналогичную роль, но взаимодействие с представлением более тесное. MVP чаще используется в мобильной разработке, где логика взаимодействия с представлением более сложная.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
🤔 Что делает код хорошим?

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

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

🟠Поддерживаемость
Код должен легко поддаваться изменениям, чтобы можно было адаптировать его под новые требования или исправлять ошибки. Это достигается за счёт модульности, изолирования логики и избегания «жёсткого» связывания частей кода. Хорошая структура и стандартизация, такие как следование принципам SOLID или архитектурным шаблонам (например, MVC), делают код более устойчивым.

🟠 Простота
Хороший код решает задачи самым простым и прямым способом. Простой код легче читать, тестировать и отлаживать. Он избегает ненужных усложнений и излишних абстракций, но при этом остаётся гибким. Следование принципу KISS (Keep It Simple, Stupid) и принципу YAGNI (You Aren't Gonna Need It) помогает держать код простым.

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

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

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

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

🟠Соответствие стилю и стандартам
Код должен соответствовать общим стандартам стиля, принятым в проекте или языке. Это делает его единообразным и легко читаемым для других участников команды. Использование линтеров, форматтеров и следование общеотраслевым стандартам (например, PEP8 для Python) помогает поддерживать единый стиль.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Чем отличаются LEFT JOIN от INNER JOIN?

LEFT JOIN возвращает все строки из левой таблицы, включая те, для которых нет совпадений в правой таблице, заполняя отсутствующие данные значениями `NULL`.
INNER JOIN возвращает только строки, которые имеют совпадения в обеих таблицах.
Таким образом, LEFT JOIN сохраняет все данные левой таблицы, а INNER JOIN работает только с пересечением данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Обеспечение отказоустойчивости веб-приложения

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

🚩Методы

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

🟠Горизонтальное масштабирование и кластеризация
Развертывание приложения на нескольких серверах (в кластере) позволяет избежать единой точки отказа (SPOF — Single Point of Failure). Горизонтальное масштабирование даёт возможность добавлять дополнительные серверы при увеличении нагрузки, что повышает отказоустойчивость и общую производительность системы. Сервисы, такие как Kubernetes и Docker Swarm, упрощают управление и оркестрацию контейнеров в кластере, автоматизируя процесс развертывания, обновлений и балансировки нагрузки.

🟠Механизмы резервного копирования и репликации данных
Важные данные должны регулярно сохраняться в резервных копиях и реплицироваться на несколько узлов или в несколько дата-центров. Репликация базы данных (например, master-slave или master-master репликация) обеспечивает доступность данных, даже если один из узлов выходит из строя. Для обеспечения целостности данных реплики могут быть синхронными (обеспечивают актуальность данных на всех узлах, но добавляют задержку) или асинхронными (с меньшей задержкой, но возможностью устаревания данных).

🟠Кеширование и использование CDN
Использование кешей (Redis, Memcached) снижает нагрузку на базу данных и позволяет быстрее обрабатывать запросы, снижая риски сбоев из-за высокой нагрузки. Content Delivery Network (CDN) распределяет контент по серверам, находящимся близко к пользователю. Это снижает нагрузку на основной сервер и обеспечивает доступность контента в случае перегрузки или отказа в одном из центров обработки данных.

🟠Автоматическое восстановление и мониторинг системы
Настройка систем мониторинга (например, Prometheus, Grafana, New Relic) позволяет оперативно выявлять сбои и реагировать на проблемы. Системы автоматического восстановления могут перезапускать упавшие серверы или контейнеры. Например, инструменты оркестрации, такие как Kubernetes, могут автоматически восстанавливать неработающие контейнеры. Настройка системы оповещений для обнаружения потенциальных проблем (например, медленного ответа сервера) позволяет вовремя реагировать на них и предотвращать крупные сбои.

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM