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
🤔 Что такое итератор?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
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
🤔 Проблемы при восстановлении работоспособности?

1. Недостаточная диагностика: отсутствие инструментов или данных для быстрого определения причины проблемы.
2. Зависимость от ручных процессов: отсутствие автоматизированных процедур восстановления может замедлить работу.
3. Недостаточная документация или неполные инструкции по восстановлению системы.
Эти факторы могут усложнить устранение неполадок и требуют проактивного подхода к подготовке.


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

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

🚩Принципы и подходы

🟠Использование очередей сообщений и брокеров
Очереди сообщений (например, RabbitMQ, Apache Kafka, Amazon SQS) помогают отправлять и получать сообщения асинхронно, обеспечивая буфер между отправителем и получателем. Брокеры сообщений сохраняют сообщения до тех пор, пока получатель не будет готов их обработать, что помогает управлять потоками данных и уравновешивать нагрузку. Такой подход позволяет отправителю отправить сообщение и сразу продолжить свою работу, не дожидаясь ответа, что повышает производительность системы.

🟠Паттерн «Издатель-подписчик» (Publish-Subscribe)
В модели «издатель-подписчик» компоненты могут публиковать события, на которые подписаны другие компоненты, а брокер сообщений доставляет события всем подписчикам. Этот паттерн позволяет системе оставаться слабосвязанной, так как издатель не знает, сколько и какие конкретно сервисы получат событие. Такие системы часто применяются для уведомлений, регистрации событий, обработки данных и отправки уведомлений нескольким сервисам одновременно.

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

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

🚩Минусы

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

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

SOLID — это акроним, обозначающий пять основных принципов объектно-ориентированного программирования и проектирования, направленных на создание более понятного, гибкого и поддерживаемого кода. Принципы включают: Single Responsibility (Принцип единственной ответственности), Open/Closed (Принцип открытости/закрытости), Liskov Substitution (Принцип подстановки Барбары Лисков), Interface Segregation (Принцип разделения интерфейса), и Dependency Inversion (Принцип инверсии зависимостей).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чём разница между сцеплением и связанностью?

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

🚩Отличия

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

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

🚩Пример

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

🚩 Сравнение

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

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

Паттерны проектирования — это проверенные решения типичных проблем, возникающих при проектировании программного обеспечения. Они делятся на три основные категории: порождающие (например, Singleton, Factory, Builder), структурные (например, Adapter, Decorator, Facade) и поведенческие (например, Observer, Strategy, Command).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Плюсы и минусы логики предметной области в хранимых процедурах

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

🚩Плюсы

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

Оптимизация и план выполнения
Современные СУБД могут кэшировать планы выполнения хранимых процедур, что снижает накладные расходы на компиляцию и оптимизацию запросов. Благодаря кэшированию повышается производительность повторных вызовов процедур, особенно в случаях обработки больших объёмов данных.

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

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

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

🚩Минусы

Сложность разработки и поддержки
Реализация бизнес-логики в хранимых процедурах может усложнить кодовую базу, так как SQL и процедурные языки базы данных, такие как PL/pgSQL или T-SQL, могут быть менее выразительными и сложными в поддержке. Такой код часто труднее тестировать, отлаживать и версионировать, чем код на языке высокого уровня, таком как Java или Python.

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

Ограниченная масштабируемость
Базы данных, хотя и мощные, могут столкнуться с ограничениями производительности при высокой нагрузке. В случае высокой нагрузки сервер приложений может масштабироваться горизонтально (добавлением серверов), а сервер базы данных — нет. Вложение большого объёма бизнес-логики в базу данных может привести к её перегрузке, ограничивая гибкость и масштабируемость приложения.

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

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

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

cherrypick — это команда Git, которая позволяет применить изменения из одного коммита в другой ветке без полного слияния веток.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤔 Почему goto — это зло?

Оператор goto считается "злом" в программировании, потому что его использование может значительно усложнить структуру и логику программы, делая код трудным для понимания, сопровождения и отладки.

🚩Проблемы

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

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

🟠Трудности с отладкой и тестированием
Логика с использованием goto труднее отлаживать, поскольку управление переходит в произвольные места. Это осложняет трассировку и отслеживание исполнения программы, делая выявление ошибок более трудоёмким. Внесение изменений также становится рискованным: даже малейшее изменение может привести к неожиданным ошибкам из-за непредсказуемого изменения порядка выполнения.

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

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

🚩Когда `goto` может быть оправдан

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

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

rebase переписывает историю, перемещая изменения на новую базу, а merge объединяет ветки, сохраняя все коммиты и их порядок.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2🎉1