Backend
Відкрити в Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Показати більше3 762
Підписники
-124 години
-27 днів
-4030 днів
Архів дописів
3 762
🤔 Что такое cherrypick?
Это команда в системе управления версиями Git, которая позволяет выбрать один или несколько конкретных коммитов из одной ветки и применить их в другую ветку. Это полезно, когда нужно перенести отдельные изменения без необходимости слияния целых веток.
🚩Основные аспекты cherry-pick
🟠Избирательное применение коммитов
Позволяет выбрать конкретные изменения из истории одной ветки и перенести их в другую ветку.
🟠Избежание полного слияния
В отличие от обычного слияния (merge), cherry-pick переносит только выбранные коммиты, а не всю историю изменений.
🚩Как использовать cherry-pick
Основной синтаксис
git cherry-pick <commit_hash>
🚩Пример использования
🟠Переход на целевую ветку
Переключитесь на ветку, в которую нужно перенести изменения.
git checkout target-branch
🟠Применение коммита
Используйте команду cherry-pick, чтобы применить нужный коммит.
git cherry-pick a1b2c3d4
🟠Решение конфликтов (если они возникли)
Если во время cherry-pick возникают конфликты, Git предложит их решить. Разрешите конфликты, затем завершите процесс:
git add <resolved_files>
git cherry-pick --continue
Предположим, у вас есть коммит с хешем a1b2c3d4 в ветке feature-branch, который вы хотите перенести в main-branch.
git checkout main-branch
git cherry-pick a1b2c3d4
🚩Когда использовать cherry-pick
🟠Перенос исправлений
Когда нужно быстро перенести исправление из одной ветки в другую (например, багфикс из develop в release).
🟠Избирательное применение новых функций
Когда нужно перенести конкретную функцию или изменение без переноса всей ветки.
🚩Ограничения и риски
🟠Конфликты
Перенос коммитов может вызвать конфликты, особенно если изменяемые файлы были модифицированы в целевой ветке.
🟠Историческая чистота
Частое использование cherry-pick может запутать историю изменений, так как один и тот же коммит будет существовать в нескольких ветках с разными хешами.
Ставь 👍 и забирай 📚 Базу знаний3 762
🤔 Почему синглтон называют антипаттерном?
Синглтон считается антипаттерном в некоторых случаях и для некоторых разработчиков, несмотря на его популярность, из-за множества потенциальных проблем, которые он может вызвать.
🟠Глобальное состояние
Синглтон представляет собой глобальное состояние, которое может изменяться из любого места в программе. Это приводит к трудностям в отслеживании и понимании изменений состояния, что усложняет отладку и тестирование.
🟠Нарушение принципов ООП
Синглтон нарушает принцип единственной ответственности (SRP - Single Responsibility Principle), так как он сочетает в себе функциональность и управление своим экземпляром. Это также нарушает принцип инверсии зависимостей (DIP - Dependency Inversion Principle), так как клиенты напрямую зависят от конкретного класса.
🟠Тестируемость
Синглтоны усложняют написание модульных тестов, так как глобальное состояние сохраняется между тестами, что может приводить к непредсказуемому поведению. Мокинг (mocking) и подмена синглтона в тестах также становятся сложными задачами.
🟠Жесткие зависимости
Использование синглтона создает жесткие зависимости между классами, что делает код менее гибким и увеличивает связность. Это затрудняет изменение и поддержку кода в будущем.
🟠Масштабируемость и многопоточность
Синглтоны могут создавать проблемы в многопоточных приложениях. Обеспечение потокобезопасности требует дополнительных усилий, а ошибки в реализации могут привести к состояниям гонки и другим проблемам.
🟠Легаси код и сложность
Синглтоны часто приводят к созданию легаси кода, который трудно модифицировать и расширять. В больших проектах синглтоны могут усложнять структуру кода и его поддержку.
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 Что такое рекурсия?
Это метод программирования, при котором функция вызывает саму себя для решения подзадачи, являющейся частью общей задачи. Такой подход применяется, когда проблему можно разделить на более мелкие аналогичные части.
🚩Как это работает?
При вызове рекурсивной функции создается новый контекст выполнения, в котором хранятся ее локальные переменные и текущий прогресс. Каждый новый вызов функции откладывается в стек вызовов, пока не будет достигнуто базовое условие (условие выхода), после чего начинается обратный процесс – возвращение значений и сворачивание стека.
🚩Где используется рекурсия?
🟠Алгоритмы обхода структур данных
например, обход деревьев (DFS) или графов.
🟠Разбиение задач
например, алгоритм "разделяй и властвуй" (быстрая сортировка, сортировка слиянием).
🟠Работа с комбинаторикой
вычисление факториала, чисел Фибоначчи, генерация перестановок.
🟠Парсинг и разбор выражений
например, в компиляторах для обработки синтаксических деревьев.
🚩Плюсы
➕Позволяет писать лаконичный и выразительный код.
➕Упрощает реализацию некоторых алгоритмов, особенно работающих с деревьями и графами.
➕Естественно подходит для задач, решаемых методом "разделяй и властвуй".
🚩Минусы
➖Использует стек вызовов, что может привести к переполнению (Stack Overflow).
➖Часто менее эффективна, чем итерация, из-за накладных расходов на создание новых контекстов выполнения.
➖Может требовать оптимизации, например, через хвостовую рекурсию (tail recursion).
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 Что в твоем понимании значит правильный код?
Это код, который не только выполняет поставленные задачи, но и соответствует ряду критериев, обеспечивающих его качество, читаемость, сопровождение и эффективность.
🚩Характеристики
🟠Читаемость
Переменные, функции, классы и другие сущности должны иметь понятные и описательные имена, которые отражают их назначение. Следование стандартам кодирования и стиля, включая правильное форматирование, отступы и использование комментариев. Использование комментариев для объяснения сложных или неочевидных частей кода, но не для очевидных вещей, которые можно понять из названий переменных и функций.
🟠Сопровождаемость
Код должен быть разбит на модули, функции или классы с чётко определёнными задачами. Это упрощает его понимание, тестирование и изменение. Избегание дублирования кода через применение принципа DRY (Don't Repeat Yourself). Код должен быть легко тестируемым. Написание автоматических тестов для проверки корректности работы помогает предотвратить ошибки.
🟠Эффективность
Код должен быть оптимизирован для выполнения задач с минимальными затратами ресурсов, таких как время выполнения и использование памяти. Использование эффективных алгоритмов и структур данных для обеспечения хорошей производительности, особенно на больших объемах данных.
🟠Надежность
Код должен корректно обрабатывать ошибки и исключительные ситуации, предотвращая неожиданные сбои. Проверка входных данных для предотвращения некорректного поведения программы.
🟠Документированность
Написание документации, описывающей основные компоненты системы, их взаимодействие и использование. Хорошо документированный код облегчает его понимание для других разработчиков.
🟠Применение принципов и паттернов проектирования
Применение принципов SOLID для создания устойчивого, гибкого и масштабируемого кода. Использование проверенных решений для общих задач проектирования.
🚩Примеры
Читаемость и сопровождаемость
def calculate_area(radius):
"""Calculate the area of a circle given its radius."""
import math
if radius < 0:
raise ValueError("Radius cannot be negative")
return math.pi * radius ** 2
Тестируемость
def add(a, b):
"""Add two numbers and return the result."""
return a + b
# Unit test for the add function
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
assert add(0, 0) == 0
test_add()
Ставь 👍 и забирай 📚 Базу знаний3 762
🤔 Назови четыре уровня изоляции транзакций?
🚩Уровни изоляции
🟠Read Uncommitted (Чтение незафиксированных данных)
Транзакция может читать данные, измененные другой транзакцией, даже если та еще не зафиксирована. Грязные чтения, неповторимые чтения и фантомные чтения. Редко используется на практике из-за высокого риска неконсистентных данных.
🟠Read Committed (Чтение зафиксированных данных)
Транзакция видит только те изменения, которые были зафиксированы другими транзакциями. Незафиксированные изменения не видны. Неповторимые чтения и фантомные чтения. Широко используется, обеспечивает баланс между производительностью и консистентностью данных.
🟠Repeatable Read (Повторяемое чтение)
Гарантирует, что если транзакция повторно читает данные, она получит те же самые значения, даже если другие транзакции изменяют данные. Фантомные чтения. Используется, когда требуется более высокий уровень консистентности данных, но допускаются фантомные чтения.
🟠Serializable (Сериализуемый)
Обеспечивает максимальный уровень изоляции. Транзакции выполняются так, как если бы они были сериализованы, то есть последовательно. Нет. Обеспечивает наивысшую консистентность данных, но может значительно снижать производительность из-за блокировок и задержек.
🚩Аномалии
🟠Грязное чтение (Dirty Read)
Происходит, когда транзакция читает данные, измененные другой транзакцией, которая еще не зафиксирована. Уровень Read Uncommitted допускает эту аномалию.
🟠Неповторимое чтение (Non-repeatable Read)
Происходит, когда транзакция читает те же данные несколько раз и получает разные значения из-за фиксации изменений другой транзакцией. Уровни Read Committed и выше предотвращают грязные чтения, но Read Committed допускает неповторимые чтения.
🟠Фантомное чтение (Phantom Read)
Происходит, когда транзакция выполняет одно и то же запрос несколько раз и видит разные наборы строк из-за вставки, обновления или удаления данных другой транзакцией. Уровень Repeatable Read предотвращает неповторимые чтения, но допускает фантомные чтения. Уровень Serializable предотвращает все три аномалии.
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 Что такое 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 способствует более тесному взаимодействию между членами команды и заинтересованными сторонами.
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 В чем разница между 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-версия, некоторые функции доступны только в коммерческих редакциях.
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 Почему возрастает интерес к функциональному программированию (FP)?
Интерес к функциональному программированию (Functional Programming) растёт из-за изменений в требованиях к разработке современных приложений, таких как потребность в масштабируемости, управлении сложностью и обработке больших данных. Функциональное программирование предлагает преимущества, которые позволяют решать эти задачи более эффективно.
🚩Основные причины роста интереса к FP
🟠Эффективная обработка многопоточности и параллелизма
Функциональное программирование делает акцент на чистых функциях, которые не имеют побочных эффектов. Это упрощает разработку многопоточных приложений, поскольку отсутствует необходимость синхронизации общего состояния. Языки, такие как Scala, Clojure, и Haskell, предоставляют мощные инструменты для работы с параллелизмом и потоками данных, что важно в эпоху многоядерных процессоров.
🟠Масштабируемость и управление состоянием
Современные распределённые системы требуют минимизации работы с изменяемым состоянием. FP, с его подходом к неизменяемым данным, позволяет избегать проблем, связанных с изменяемостью, таких как гонки данных или сложные состояния.
🟠Обработка больших данных
Фреймворки, такие как Apache Spark и Apache Flink, используют концепции функционального программирования (например, операции над коллекциями, как
map, filter, reduce) для работы с большими данными. Это делает FP особенно полезным для обработки потоков данных и анализа больших объёмов информации.
🟠Повышение читаемости и предсказуемости кода
Код, написанный в функциональном стиле, становится легче для анализа и тестирования благодаря принципам:
Чистые функции: результат функции зависит только от входных данных.
Неизменяемость данных: данные не меняются после создания.
Декларативный стиль: упор на то, что должно быть сделано, а не как.
🟠Популяризация функциональных возможностей в императивных языках
Основные императивные языки программирования (Java, Python, JavaScript, C#) добавляют функциональные возможности, такие как лямбды, стримы и функции высшего порядка. Это делает функциональный стиль более доступным для широкой аудитории разработчиков.
🟠Повышение надёжности кода
Исключение побочных эффектов уменьшает количество ошибок. Код становится проще для тестирования, так как функции можно протестировать в изоляции. Система типов в функциональных языках, таких как Haskell, гарантирует большую безопасность, что снижает вероятность ошибок в рантайме.
🟠Тенденции к модульности и повторному использованию кода
FP способствует созданию более модульного кода. Композиция функций позволяет легко строить новые функциональности из существующих компонентов.
🟠Популярность в веб-разработке и мобильных приложениях
Языки, такие как Elm, ReasonML, и фреймворки, например React (с концепцией функциональных компонентов), активно используют принципы функционального программирования. Это позволяет создавать приложения с минимальным количеством багов и высокой предсказуемостью поведения.
Ставь 👍 и забирай 📚 Базу знаний3 762
🤔 В чём смысл инкапсуляции?
Один из основных принципов объектно-ориентированного программирования (ООП), наряду с наследованием и полиморфизмом. Смысл инкапсуляции заключается в объединении данных и методов, работающих с этими данными, в одном объекте, а также в ограничении доступа к этим данным из внешнего мира.
🚩Основные аспекты инкапсуляции
🟠Сокрытие данных
В инкапсуляции данные (свойства) объекта скрываются от внешнего доступа и защищаются от некорректных изменений. Это достигается путем использования модификаторов доступа (например,
private, protected, public).
🟠Контролируемый доступ
Вместо прямого доступа к данным, предоставляются методы (геттеры и сеттеры) для чтения и изменения значений свойств. Это позволяет контролировать, каким образом данные могут быть изменены или получены.
🟠Защита целостности данных
Инкапсуляция помогает защитить внутреннее состояние объекта от некорректных или неожиданных изменений, обеспечивая целостность данных и уменьшая вероятность ошибок.
🚩Примеры инкапсуляции
На Java
public class Person {
private String name;
private int age;
// Конструктор
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Геттер для имени
public String getName() {
return name;
}
// Сеттер для имени
public void setName(String name) {
this.name = name;
}
// Геттер для возраста
public int getAge() {
return age;
}
// Сеттер для возраста
public void setAge(int age) {
if (age > 0) {
this.age = age;
} else {
System.out.println("Возраст должен быть положительным числом.");
}
}
}
На Python
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
# Геттер для имени
@property
def name(self):
return self._name
# Сеттер для имени
@name.setter
def name(self, name):
self._name = name
# Геттер для возраста
@property
def age(self):
return self._age
# Сеттер для возраста
@age.setter
def age(self, age):
if age > 0:
self._age = age
else:
print("Возраст должен быть положительным числом.")
# Пример использования
person = Person("John", 30)
print(person.name) # John
person.age = -5 # Возраст должен быть положительным числом.
print(person.age) # 30
Ставь 👍 и забирай 📚 Базу знаний3 762
🤔 Что такое ORM?
Это технология, которая позволяет разработчикам взаимодействовать с реляционными базами данных, используя объектно-ориентированные парадигмы программирования. ORM автоматизирует преобразование данных между несовместимыми типами систем, таких как объекты в программном коде и таблицы в базе данных.
🚩Основные особенности ORM
🟠Абстракция базы данных
ORM позволяет разработчикам работать с базой данных через объекты, не написав SQL-код напрямую. Это упрощает разработку и делает код более читабельным и поддерживаемым.
🟠Маппинг классов и таблиц
Классы в приложении сопоставляются с таблицами в базе данных, а свойства классов — со столбцами таблиц. Это позволяет автоматически преобразовывать данные при сохранении и извлечении объектов.
🟠Автоматическое управление связями
ORM поддерживает управление отношениями между объектами, такими как "один-к-одному", "один-ко-многим" и "многие-ко-многим".
🟠Кэширование и оптимизация запросов
ORM может кешировать запросы и результаты для улучшения производительности.
🚩Плюсы
➕Скорость разработки
ORM снижает количество ручного кода, необходимого для работы с базой данных, что ускоряет процесс разработки.
➕Поддерживаемость
Код на ORM более понятен и легко поддерживается, поскольку использует объектно-ориентированные принципы.
➕Безопасность
ORM помогает избежать SQL-инъекций, так как запросы строятся с помощью методов и свойств классов.
➕Портативность
Приложение, написанное с использованием ORM, легче адаптируется к различным реляционным базам данных, поскольку маппинг обеспечивает абстракцию от конкретных SQL-диалектов.
🚩Популярные библиотеки и фреймворки ORM
🟠Hibernate
Java
🟠Entity Framework
.NET
🟠Django ORM
Python
🟠SQLAlchemy
Python
🟠ActiveRecord
Ruby on Rails
🚩Примеры
Модель
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
birth_date = models.DateField()
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
Создание записи
author = Author(name='J.K. Rowling', birth_date='1965-07-31')
author.save()
book = Book(title='Harry Potter and the Philosopher\'s Stone', author=author)
book.save()
Извлечение данных
books = Book.objects.filter(author__name='J.K. Rowling')
for book in books:
print(book.title)
Ставь 👍 и забирай 📚 Базу знаний3 762
🤔 Какая разница у протоколов http и https ?
Основное различие между протоколами HTTP (HyperText Transfer Protocol) и HTTPS (HyperText Transfer Protocol Secure) заключается в уровне безопасности, который они обеспечивают при передаче данных между клиентом (например, веб-браузером) и сервером.
🚩Основные различия
🟠Шифрование
HTTP: Данные передаются в открытом виде, что делает их уязвимыми для перехвата и чтения злоумышленниками.
HTTPS: Данные передаются в зашифрованном виде с использованием SSL/TLS (Secure Sockets Layer/Transport Layer Security). Это обеспечивает защиту данных от перехвата и несанкционированного доступа.
🟠Аутентификация
HTTP: Отсутствует механизм аутентификации, что затрудняет проверку подлинности веб-сайта.
HTTPS: Использует сертификаты SSL/TLS, которые удостоверяют подлинность веб-сайта, подтверждая, что соединение установлено с тем сервером, с которым намеревался связаться пользователь.
🟠Интегритет данных
HTTP: Данные могут быть изменены или повреждены во время передачи, и это не будет обнаружено.
HTTPS: Гарантирует целостность данных, так как любые изменения данных при передаче будут обнаружены, и соединение будет разорвано.
🟠Порт
HTTP: Использует порт 80 по умолчанию.
HTTPS: Использует порт 443 по умолчанию.
🚩Плюсы
➕Безопасность
Обеспечивает защиту конфиденциальной информации, такой как логины, пароли, номера кредитных карт.
➕Доверие пользователей
Пользователи склонны больше доверять веб-сайтам, использующим HTTPS, так как это указывает на то, что сайт заботится о безопасности данных.
➕SEO
Поисковые системы, такие как Google, предпочитают сайты, использующие HTTPS, и ранжируют их выше по сравнению с сайтами, использующими HTTP.
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 Что такое блокировки (локи) в БД?
Блокировки (локи) в базе данных - это механизмы, которые управляют доступом к данным, чтобы обеспечить их целостность и предотвратить конфликты при одновременном доступе нескольких транзакций.
🚩Основные типы
🟠Блокировки уровня таблицы (Table-Level Locks):
ACCESS SHARE: Позволяет чтение данных, блокирует команды, изменяющие таблицу.
ROW SHARE: Применяется для команд SELECT FOR UPDATE и SELECT FOR SHARE.
ROW EXCLUSIVE: Используется при вставке, обновлении или удалении строк.
SHARE UPDATE EXCLUSIVE: Используется для команд VACUUM.
SHARE: Обеспечивает видимость текущего состояния данных (ANALYZE).
SHARE ROW EXCLUSIVE: Используется для операций, требующих более строгого контроля (CREATE INDEX CONCURRENTLY).
EXCLUSIVE: Требуется для команд, изменяющих структуру таблицы (ALTER TABLE).
ACCESS EXCLUSIVE: Блокирует все команды, включая SELECT (DROP TABLE, ALTER TABLE).
🟠Блокировки уровня строки (Row-Level Locks):
SELECT FOR UPDATE: Блокирует строки для изменения.
SELECT FOR NO KEY UPDATE: Похоже на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять SELECT FOR SHARE и SELECT FOR KEY SHARE.
SELECT FOR SHARE: Блокирует строки для чтения.
SELECT FOR KEY SHARE: Похоже на SELECT FOR SHARE, но позволяет другим транзакциям выполнять SELECT FOR NO KEY UPDATE и SELECT FOR UPDATE.
🟠Консультативные блокировки (Advisory Locks):
Устанавливаются вручную для синхронизации произвольных ресурсов.
pg_advisory_lock: Устанавливает консультативную блокировку.
pg_advisory_unlock: Снимает консультативную блокировку.
pg_try_advisory_lock: Пытается установить консультативную блокировку без ожидания.
🚩Основные цели
🟠Предотвращение гонок (race conditions):
Обеспечивают корректность данных при одновременном доступе нескольких транзакций.
🟠Изоляция транзакций:
Выполнение каждой транзакции в изолированном контексте.
🟠Защита целостности данных:
Предотвращение одновременного изменения данных, что может привести к их несогласованности.
🚩Примеры использования
🟠Интернет-магазин:
Блокировки могут предотвращать одновременное изменение состояния товара.
🟠Банковские операции:
При переводе средств используются блокировки для предотвращения одновременного списания или зачисления.
🟠Редактирование данных:
При одновременном редактировании одной записи несколькими пользователями.
🚩Проблемы, связанные с блокировками
🟠Дедлоки (Deadlocks):
Ситуация, когда транзакции блокируют друг друга, ожидая освобождения ресурсов.
🟠Гранулярность блокировок:
Блокировки высокой гранулярности могут снижать производительность.
Ставь 👍 и забирай 📚 Базу знаний
3 762
🤔 Как "под капотом" работает аннотация transactional ?
🟠Создание прокси
Spring обнаруживает
@Transactional и создает прокси для класса или метода.
🟠Перехват вызова
Прокси перехватывает вызов метода, аннотированного @Transactional.
🟠Начало транзакции
Прокси делегирует управление TransactionInterceptor, который начинает транзакцию через PlatformTransactionManager.
🟠Выполнение метода
Исходный метод выполняется.
🟠Фиксация или откат транзакции
Если метод завершился успешно, транзакция фиксируется (commit). Если метод выбросил исключение, транзакция откатывается (rollback).
Ставь 👍 и забирай 📚 Базу знаний3 762
🤔 Что знаешь о хеш функции?
Хеш-функция — это функция, которая принимает входные данные (ключ) и возвращает фиксированное число, называемое хешем (или хеш-значением). Основная цель хеш-функции — преобразовать произвольные данные в числовое значение определенного диапазона.
🚩Основные свойства хеш-функции:
🟠 Детерминированность: Хеш-функция всегда должна возвращать одно и то же хеш-значение для одного и того же входного значения.
🟠Равномерное распределение: Хорошая хеш-функция должна равномерно распределять хеш-значения по всему диапазону, чтобы минимизировать количество коллизий.
🟠Быстрота вычисления: Хеш-функция должна быть достаточно быстрой, чтобы не замедлять общую производительность алгоритмов, которые её используют.
🟠Минимизация коллизий: Коллизия возникает, когда два разных входных значения дают одно и то же хеш-значение. Хорошая хеш-функция должна минимизировать вероятность таких случаев.
🚩Применение хеш-функций:
🟠Хеш-таблицы: Используются для вычисления индекса массива, где будет храниться значение, связанное с ключом. Это позволяет быстро выполнять операции вставки, удаления и поиска.
🟠Криптография: Криптографические хеш-функции (например, 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): При коллизии ищется другая свободная ячейка по определённому алгоритму (например, линейное пробирование, квадратичное пробирование или двойное хеширование).
Ставь 👍 и забирай 📚 Базу знаний3 762
🚨60 минут
Пожизненный PRO-доступ на easyoffer (подготовка к IT-собесам + поиск оффера) по цене одного года закрывается прямо сейчас. Один платёж — доступ навсегда.
Последнее напоминание 👇
👉 https://easyoffer.ru/pro
3 762
⚠️ 3 часа до конца акции.
Последний шанс забрать пожизненный PRO на easyoffer по цене одного года. Это полный доступ к подготовке к собесам и инструментам поиска работы (вопросы с реальных интервью, ответы сеньоров, автоотклики, тренажёры) — один раз и навсегда, вместо ежегодной оплаты.
В полночь цена возвращается к обычной.
👉 https://easyoffer.ru/pro
3 762
🤔 Из чего состоит запрос на сервере?
Запрос на сервере состоит из нескольких ключевых компонентов, которые обеспечивают передачу данных и инструкций от клиента к серверу.
🟠Стартовая линия (Request Line)
Метод: Определяет тип запроса и действия, которые должен выполнить сервер. Основные методы включают:
GET: Запрос на получение данных с сервера.
POST: Отправка данных на сервер для обработки (например, форма).
PUT: Замена существующего ресурса на сервере.
DELETE: Удаление ресурса с сервера.
PATCH: Частичное обновление ресурса.
URI (Uniform Resource Identifier): Указывает путь к ресурсу на сервере.
Версия протокола HTTP: Определяет используемую версию HTTP, например, HTTP/1.1.
🟠Заголовки (Headers)
Метаданные, которые предоставляют дополнительную информацию о запросе. Примеры заголовков:
Host: Указывает имя хоста и, возможно, номер порта сервера (например, www.example.com).
User-Agent: Информация о клиентском приложении, совершающем запрос (например, браузер).
Accept: Типы данных, которые клиент готов принять (например, text/html, application/json).
Content-Type: Тип данных, передаваемых в теле запроса (например, application/json для JSON данных).
Authorization: Информация для аутентификации, если запрос требует авторизации.
🟠Тело запроса (Body)
Содержит данные, отправляемые на сервер. Тело запроса используется в методах POST, PUT, PATCH для передачи данных, таких как формы, файлы или JSON-объекты. Для методов GET и DELETE тело запроса обычно не используется.
🚩Зачем нужны эти компоненты
🟠Метод и URI
Метод определяет действие, которое клиент хочет выполнить, а URI указывает конкретный ресурс, к которому это действие применяется. Это основа понимания сервером того, что именно клиент запрашивает.
🟠Заголовки
Заголовки предоставляют контекст и дополнительную информацию, необходимую для корректной обработки запроса. Они могут содержать данные о клиенте, указывать формат передаваемых данных, управлять кэшированием и аутентификацией.
🟠Тело запроса
Тело запроса содержит основное содержание, которое клиент хочет передать на сервер. Например, данные формы, JSON-объекты или файлы. Без тела запроса невозможно передать на сервер данные, которые необходимо обработать.
POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=John+Doe&age=30
Ставь 👍 и забирай 📚 Базу знаний3 762
⏳ Ребята, сегодня заканчивается акция, о которой стоит знать, если вы в поиске работы или планируете сменить её в ближайший год.
easyoffer — это платформа для подготовки к IT-собесам и поиска оффера. Внутри:
– база реальных вопросов и live-coding задач с собесов (с частотой их встречаемости)
– эталонные ответы от Senior-разработчиков
– 1100+ записей настоящих интервью (Сбер, Яндекс, Авито, WB, OZON, МТС)
– автоотклики на hh, генератор резюме под вакансию, тренажёры собеседований
Сегодня пожизненный PRO-доступ продаётся по цене одного года — платишь один раз и пользуешься всем этим всю жизнь, включая будущие фичи. С завтрашнего дня — только обычная годовая подписка.
👉 https://easyoffer.ru/pro
3 762
🤔 Что делает код хорошим?
Это код, который легко читать, понимать, поддерживать и расширять. Он эффективно решает поставленные задачи и соответствует требованиям качества, которые важны для конкретного проекта и команды.
🟠 Читаемость
Код должен быть понятным для других разработчиков, даже если они не знакомы с проектом. Использование осмысленных имён для переменных, функций и классов, а также наличие чётких комментариев помогают быстрее понять логику программы. Читаемый код снижает риск ошибок при поддержке и улучшении, упрощает ревью и обучение новых участников команды.
🟠Поддерживаемость
Код должен легко поддаваться изменениям, чтобы можно было адаптировать его под новые требования или исправлять ошибки. Это достигается за счёт модульности, изолирования логики и избегания «жёсткого» связывания частей кода. Хорошая структура и стандартизация, такие как следование принципам SOLID или архитектурным шаблонам (например, MVC), делают код более устойчивым.
🟠 Простота
Хороший код решает задачи самым простым и прямым способом. Простой код легче читать, тестировать и отлаживать. Он избегает ненужных усложнений и излишних абстракций, но при этом остаётся гибким. Следование принципу KISS (Keep It Simple, Stupid) и принципу YAGNI (You Aren't Gonna Need It) помогает держать код простым.
🟠Эффективность
Код должен быть оптимизирован для выполнения задачи без избыточного потребления ресурсов, таких как время выполнения и память. Хотя преждевременная оптимизация нежелательна, хороший код учитывает производительность и избегает явных узких мест. Понимание алгоритмов и структур данных помогает писать эффективный и быстрый код.
🟠 Тестируемость
Хороший код легко тестировать. Это означает, что его можно покрыть модульными, интеграционными и системными тестами. Тестируемость обеспечивается за счёт слабого сцепления и высокой связанности, а также соблюдения принципов инверсии зависимостей. Код, который легко тестировать, позволяет быстрее находить и исправлять ошибки, что повышает общую надёжность.
🟠 Гибкость и расширяемость
Хороший код легко адаптируется к изменяющимся требованиям. Новые функции можно добавлять без значительных изменений существующей логики. Это достигается благодаря слабому сцеплению и высокой связанности, применению шаблонов проектирования и принципов SOLID.
🟠Документированность
Хотя код должен быть самодокументируемым, иногда необходимы комментарии и документация, чтобы объяснить сложную логику, архитектурные решения или нюансы реализации. Хорошая документация помогает быстрее разобраться в коде и понять его использование.
🟠Соответствие стилю и стандартам
Код должен соответствовать общим стандартам стиля, принятым в проекте или языке. Это делает его единообразным и легко читаемым для других участников команды. Использование линтеров, форматтеров и следование общеотраслевым стандартам (например, PEP8 для Python) помогает поддерживать единый стиль.
Ставь 👍 и забирай 📚 Базу знаний
3 762
Пожизненный PRO — по цене одного года.
Покупаешь один раз — пользуешься всю жизнь:
👉 https://easyoffer.ru/pro
🚀 PRO-доступ закроет 99% проблем на пути к офферу:
1. 1100+ записей реальных собеседований (включая топы: Сбер, Авито, Яндекс, WB, OZON, МТС). Видите всё изнутри: как спрашивают, как отвечают сильные кандидаты и на каких ошибках проваливаются 80%.
2. База live-coding задач и вопросов с реальных собесов — с уникальной системой вероятности их встречи. Готовитесь не вслепую, а точечно по темам, которые спрашивают чаще всего.
3. Эталонные ответы от Senior-разработчиков. Никакой воды и догадок — только чёткие структурированные решения, за которые дают «зелёный свет» к офферу.
4. Полный доступ ко всем грейдам и профессиям. Junior вы или Senior, тестировщик, разработчик или проджект — вы получаете ВСЕ материалы easyoffer без ограничений. Безлимитно, Все, Навсегда.
5. База 400+ тестовых заданий. Прокачивайте навыки на реальных задачах — тех самых, что дают перед собесом.
6. Автоотклики на hh.ru — пока вы спите, резюме уходит рекрутерам автоматически. Экономия сотен часов ручного кликанья.
7. Аналитика ТОП-требований из вакансий. Парсим рынок и показываем, какие скиллы сейчас в цене. Апгрейдите резюме точечно и проходите ATS-фильтры (они отсеивают до 75% резюме ещё до рекрутера).
8. Генератор резюме и CV под каждую вакансию. Забудьте про «универсальное» резюме — нейросеть адаптирует ваш опыт под конкретную позицию за минуту и повышает шансы на приглашение в разы.
9. Тренажёры подготовки к собеседованию:
«Реальное собеседование» — сценарий вопросов из настоящих интервью. «Проработка вопросов» — флеш-карточки по методике интервальных повторений (как Anki)
10. 🔥 Самое важное: все будущие фичи
Вы платите один раз, а продукт растёт всю жизнь. Каждое обновление, каждый новый инструмент, каждая фича, которая появится за все годы проекта, автоматически падает вам в подписку без доплат. Вы фиксируете цену года, а получаете продукт, который через пару лет будет стоить в разы дороже
⭐️ Это уникальная акция пока сайт в режиме Beta.
Успей ей воспользоваться⏳ Завтра последний день.
👉 https://easyoffer.ru/pro
