Хеш-функция — это функция, которая принимает входные данные (ключ) и возвращает фиксированное число, называемое хешем (или хеш-значением). Основная цель хеш-функции — преобразовать произвольные данные в числовое значение определенного диапазона.
def simple_hash(key, table_size):
return len(key) % table_size
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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это технология, которая позволяет разработчикам взаимодействовать с реляционными базами данных, используя объектно-ориентированные парадигмы программирования. ORM автоматизирует преобразование данных между несовместимыми типами систем, таких как объекты в программном коде и таблицы в базе данных.
ORM позволяет разработчикам работать с базой данных через объекты, не написав SQL-код напрямую. Это упрощает разработку и делает код более читабельным и поддерживаемым.
Классы в приложении сопоставляются с таблицами в базе данных, а свойства классов — со столбцами таблиц. Это позволяет автоматически преобразовывать данные при сохранении и извлечении объектов.
ORM поддерживает управление отношениями между объектами, такими как "один-к-одному", "один-ко-многим" и "многие-ко-многим".
ORM может кешировать запросы и результаты для улучшения производительности.
ORM снижает количество ручного кода, необходимого для работы с базой данных, что ускоряет процесс разработки.
Код на ORM более понятен и легко поддерживается, поскольку использует объектно-ориентированные принципы.
ORM помогает избежать SQL-инъекций, так как запросы строятся с помощью методов и свойств классов.
Приложение, написанное с использованием ORM, легче адаптируется к различным реляционным базам данных, поскольку маппинг обеспечивает абстракцию от конкретных SQL-диалектов.
Java
.NET
Python
Python
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)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два ключевых свойства модульной архитектуры программного обеспечения, которые помогают оценить качество кода и архитектурных решений.
Описывает степень зависимости одного модуля от других. Высокое сцепление означает, что модули сильно зависят друг от друга, что затрудняет их изменение, тестирование и повторное использование, так как изменения в одном модуле требуют изменений в зависимых модулях. Идеально стремиться к слабому сцеплению, чтобы модули были максимально независимыми. Это позволяет изменять или заменять один модуль без необходимости изменения других.
Описывает, насколько тесно связанные и объединённые общей задачей элементы внутри одного модуля. Высокая связанность означает, что все функции и данные модуля логически связаны и выполняют одну задачу. Это упрощает понимание кода и делает модуль более автономным.Высокая связанность считается хорошей практикой, так как модуль с высокой связанностью проще в обслуживании, его легче изменить или заменить.
Представьте модуль, который управляет пользователями: если в модуле только функции для работы с пользователями (например, добавление и удаление), он обладает высокой связанностью, так как его функции направлены на одну задачу. Если модуль при этом минимально зависит от других частей системы, это говорит о слабом сцеплении.
Это желательные качества. Они помогают создать более гибкую и поддерживаемую систему.
Лучше, когда оно слабое, так как снижает зависимость между модулями.
Лучше, когда она высокая, так как все функции модуля работают на достижение одной цели.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это метод программирования, при котором функция вызывает саму себя для решения подзадачи, являющейся частью общей задачи. Такой подход применяется, когда проблему можно разделить на более мелкие аналогичные части.
При вызове рекурсивной функции создается новый контекст выполнения, в котором хранятся ее локальные переменные и текущий прогресс. Каждый новый вызов функции откладывается в стек вызовов, пока не будет достигнуто базовое условие (условие выхода), после чего начинается обратный процесс – возвращение значений и сворачивание стека.
например, обход деревьев (DFS) или графов.
например, алгоритм "разделяй и властвуй" (быстрая сортировка, сортировка слиянием).
вычисление факториала, чисел Фибоначчи, генерация перестановок.
например, в компиляторах для обработки синтаксических деревьев.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
MVC (Model-View-Controller) и MVP (Model-View-Presenter) – это архитектурные шаблоны, используемые в разработке программного обеспечения для разделения логики приложения на отдельные компоненты. Хотя обе архитектуры помогают улучшить структуру и поддерживаемость кода, между ними существуют важные различия.
Отвечает за управление данными и бизнес-логикой приложения. Она не знает о существовании View и Controller.
Отображает данные, полученные от Model, и отправляет пользовательский ввод в Controller.
Получает ввод от View, обновляет Model и выбирает, какое View должно быть обновлено.
Отвечает за управление данными и бизнес-логикой приложения.
Отображает данные и передает пользовательский ввод Presenter'у.
Получает ввод от View, обновляет Model и передает данные обратно в View для отображения.
В MVC View взаимодействует напрямую с Model. В MVP View взаимодействует только с Presenter, а Presenter уже работает с Model.
В MVC Model уведомляет View об изменениях напрямую. В MVP Model уведомляет Presenter, а Presenter обновляет View.
В MVC Controller отвечает за определение, какое View отображать. В MVP Presenter отвечает за всю логику взаимодействия между Model и View, а также за обновление View.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Да, в SQL есть диалекты. Это стандартный язык для управления реляционными базами данных, но каждая система управления базами данных (СУБД) может реализовывать его по-своему, добавляя собственные расширения и особенности. Эти вариации называются диалектами SQL.
хотя существуют стандарты SQL (например, SQL-92, SQL:1999, SQL:2003, SQL:2011 и другие), не все СУБД полностью их поддерживают. Вместо этого каждая СУБД адаптирует стандарт под свои нужды.
разработчики СУБД добавляют специфические функции и операторы, которые улучшают производительность и позволяют работать с данными эффективнее.
каждая СУБД может предлагать уникальные функции, такие как пользовательские типы данных, расширенные индексы, собственные функции аналитики и т. д.
имеет специфические функции, такие как
LIMIT для ограничения количества строк в запросе и специфичный синтаксис для UPSERT (INSERT ... ON DUPLICATE KEY UPDATE).поддерживает сложные типы данных, такие как JSON и массивы, а также расширенные функции работы с рекурсивными запросами.
включает процедурные расширения, такие как
DECLARE, BEGIN ... END, TRY ... CATCH и другие.содержит мощный встроенный язык программирования для написания хранимых процедур и триггеров.
минималистичный диалект, который не поддерживает некоторые сложные конструкции, но удобен для встраиваемых решений.
Если проект должен работать на разных СУБД, следует использовать стандартный SQL (ANSI SQL) или ORM (например, SQLAlchemy, Hibernate), который может адаптировать запросы под нужный диалект. При выборе конкретной СУБД важно изучить её специфические возможности и ограничения, так как переносимость SQL-кода между разными диалектами не всегда тривиальна.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Синглтон считается антипаттерном в некоторых случаях и для некоторых разработчиков, несмотря на его популярность, из-за множества потенциальных проблем, которые он может вызвать.
Синглтон представляет собой глобальное состояние, которое может изменяться из любого места в программе. Это приводит к трудностям в отслеживании и понимании изменений состояния, что усложняет отладку и тестирование.
Синглтон нарушает принцип единственной ответственности (SRP - Single Responsibility Principle), так как он сочетает в себе функциональность и управление своим экземпляром. Это также нарушает принцип инверсии зависимостей (DIP - Dependency Inversion Principle), так как клиенты напрямую зависят от конкретного класса.
Синглтоны усложняют написание модульных тестов, так как глобальное состояние сохраняется между тестами, что может приводить к непредсказуемому поведению. Мокинг (mocking) и подмена синглтона в тестах также становятся сложными задачами.
Использование синглтона создает жесткие зависимости между классами, что делает код менее гибким и увеличивает связность. Это затрудняет изменение и поддержку кода в будущем.
Синглтоны могут создавать проблемы в многопоточных приложениях. Обеспечение потокобезопасности требует дополнительных усилий, а ошибки в реализации могут привести к состояниям гонки и другим проблемам.
Синглтоны часто приводят к созданию легаси кода, который трудно модифицировать и расширять. В больших проектах синглтоны могут усложнять структуру кода и его поддержку.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Один из основных принципов объектно-ориентированного программирования (ООП), наряду с наследованием и полиморфизмом. Смысл инкапсуляции заключается в объединении данных и методов, работающих с этими данными, в одном объекте, а также в ограничении доступа к этим данным из внешнего мира.
В инкапсуляции данные (свойства) объекта скрываются от внешнего доступа и защищаются от некорректных изменений. Это достигается путем использования модификаторов доступа (например,
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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это распределённая система контроля версий, разработанная Линусом Торвальдсом в 2005 году. Она предназначена для отслеживания изменений в исходном коде во время разработки программного обеспечения. Git позволяет нескольким разработчикам работать над одним и тем же проектом одновременно, не опасаясь потерять работу или перезаписать изменения друг друга.
Это хранилище для проекта, в котором хранятся все файлы и история их изменений.
Зафиксированный снимок текущего состояния файлов в репозитории. Коммиты образуют историю изменений проекта.
Отдельная линия разработки. Ветви позволяют параллельно работать над разными функциями или исправлениями без вмешательства в основную кодовую базу.
Процесс объединения изменений из одной ветви в другую. Обычно используется для интеграции новых функций или исправлений из отдельных ветвей в основную ветвь.
Создание копии удалённого репозитория на локальной машине разработчика.
Создание копии чужого репозитория (обычно на платформе вроде GitHub) для внесения собственных изменений без воздействия на оригинальный проект.
Запрос на включение изменений из одной ветви в другую, часто используемый в коллаборативных платформах (например, GitHub, GitLab).
Удалённый репозиторий, который может быть связан с локальным репозиторием. Основные команды взаимодействуют с ним для синхронизации данных.
Создание нового локального репозитория.
Клонирование удалённого репозитория на локальную машину.
Добавление изменений в индекс (стадия подготовки к коммиту).
Создание коммита с заданным сообщением.
Проверка состояния файлов в рабочем каталоге и индексе.
Просмотр истории коммитов.
Управление ветвями (создание, просмотр, удаление).
Переключение между ветвями или возврат к определённому коммиту.
Слияние указанной ветки с текущей.
Получение изменений из удалённого репозитория и слияние с текущей веткой.
Отправка изменений из локального репозитория в удалённый.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это принцип проектирования и разработки, который предполагает, что системы и решения должны быть максимально простыми и избегать ненужной сложности. Этот принцип особенно важен в программировании и инженерии, так как помогает создавать более понятные, поддерживаемые и надежные системы.
Системы должны быть простыми в понимании и использовании. Чем проще система, тем меньше вероятность возникновения ошибок. Простота достигается за счет минимизации количества компонентов и взаимодействий между ними.
Код должен быть понятным и легко читаемым. Это облегчает его поддержку и модификацию. Использование понятных имен переменных, функций и классов, а также понятная структура кода способствуют ясности.
Компоненты или функциональность следует избегать. Если какой-то элемент системы не добавляет реальной ценности, его следует убрать. Это включает в себя как аппаратное, так и программное обеспечение.
Системы должны быть разбиты на небольшие, независимые модули, каждый из которых выполняет свою четко определенную задачу. Модульность помогает в тестировании, повторном использовании и поддержке кода.
При разработке функций или методов следует избегать создания слишком сложных алгоритмов, если можно использовать более простые и понятные решения. Использование стандартных библиотек и инструментов вместо написания собственного кода с нуля, когда это возможно.
В системной архитектуре следует избегать излишнего усложнения связей между компонентами системы. Использование простых и проверенных шаблонов проектирования вместо сложных и экспериментальных решений.
Документация должна быть простой и понятной, избегая излишне технических или сложных объяснений. Хорошо структурированная и лаконичная документация помогает пользователям и разработчикам быстрее понять систему.
Простые системы легче понимать и поддерживать, что снижает затраты на обучение и поддержку.
Чем проще система, тем меньше вероятность возникновения ошибок и проблем при её использовании.
Простые решения часто требуют меньше ресурсов и могут работать быстрее и эффективнее.
Простые и модульные системы легче масштабировать и расширять по мере необходимости.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
goto считается "злом" в программировании по ряду причин, связанных с читаемостью, поддерживаемостью и структурой кода. Давайте разберем основные причины, почему его избегают. Когда в коде используются операторы
goto, управление программой может перескакивать из одного места в другое, иногда даже обратно. Это делает код трудно читаемым и практически невозможным для быстрого понимания. Отладка кода с goto затруднена, так как выполнение может переходить в неожиданные участки программы, что усложняет поиск ошибок. Одним из ключевых достижений программирования стало структурное программирование, предложенное в 1960-х годах. Оно основывается на трех базовых конструкциях:
Последовательность (команды выполняются одна за другой),
Разветвление (
if-else, switch), Циклы (
for, while, do-while). Использование goto нарушает эту структуру, что приводит к так называемому "спагетти-коду", где невозможно понять, в каком порядке выполняются инструкции. Вместо
goto в большинстве случаев можно использовать: Циклы (
for, while, do-while) – для повторяющихся действий. Рекурсию – если нужна сложная логика выполнения.
Исключения (
try-catch) – для обработки ошибок, вместо goto для выхода из глубоко вложенных структур. Флаги и условные операторы – когда нужно контролировать выход из определенного блока кода.
Несмотря на его репутацию,
goto может быть полезен в низкоуровневом программировании, например: В коде на C для обработки ошибок (например, единый выход из функции в драйверах ОС).
В компиляхторах или интерпретаторах языков программирования.
В ASM-вставках, где
goto заменяется на jmp.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это высокопроизводительная система управления базами данных, работающая в памяти (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
Это структура данных, которая позволяет эффективно хранить и извлекать пары "ключ-значение". Она использует хеш-функцию для преобразования ключа в индекс массива, где хранится соответствующее значение.
Это функция, которая принимает ключ и возвращает индекс массива, где должно храниться значение. Хорошая хеш-функция должна равномерно распределять ключи по всему пространству индексов, чтобы минимизировать количество коллизий.
Это ситуации, когда два разных ключа хешируются в один и тот же индекс. Существуют различные методы разрешения коллизий:
Метод цепочек (chaining): В каждой ячейке массива хранится список (или другая структура данных), содержащий все значения, соответствующие этому индексу.
Открытая адресация (open addressing): При коллизии ищется другая свободная ячейка по определённому алгоритму (например, линейное пробирование, квадратичное пробирование или двойное хеширование).
Количество ячеек (бакетов) в массиве. Оптимальный размер зависит от количества ключей и используемой хеш-функции. Обычно размер выбирается простым числом для уменьшения вероятности коллизий.
Хеш-функция вычисляет индекс для ключа.
Если ячейка пуста, значение записывается в неё.
Если ячейка занята (коллизия), применяется выбранный метод разрешения коллизий.
Хеш-функция вычисляет индекс для ключа.
Проверяется ячейка по этому индексу.
Если ключи совпадают, возвращается значение.
Если ключи не совпадают (коллизия), применяется метод разрешения коллизий до нахождения нужного ключа или пустой ячейки (что означает отсутствие ключа).
Хеш-функция вычисляет индекс для ключа.
Элемент удаляется, после чего может потребоваться перемещение других элементов для предотвращения разрыва цепочек или нарушения последовательности в открытой адресации.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
XML (Extensible Markup Language) — это расширяемый язык разметки, используемый для представления структурированных данных в формате, который легко читается как человеком, так и машиной. XML разработан для хранения и обмена данными между различными системами и платформами.
XML позволяет создавать собственные теги, что делает его гибким для различных применений и доменов.
XML-документы легко читаются и понимаются человеком благодаря текстовому формату.
XML-документы имеют четкую иерархическую структуру, которая делает их удобными для хранения сложных данных.
XML является текстовым форматом, что делает его совместимым с любыми операционными системами и приложениями.
Опциональная часть, которая может содержать информацию о версии XML и кодировке документа.
<?xml version="1.0" encoding="UTF-8"?>
Каждый XML-документ должен иметь один корневой элемент, который содержит все остальные элементы.
<root>
<!-- Другие элементы -->
</root>
Основные строительные блоки XML-документа. Элементы могут содержать текст, другие элементы и атрибуты.
<book>
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
Дополнительные данные, связанные с элементами. Атрибуты задаются внутри открывающего тега.
<book genre="fiction">
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
Пример XML-документа
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1" genre="fiction">
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
<book id="2" genre="non-fiction">
<title>Learning XML</title>
<author>Jane Smith</author>
<year>2022</year>
</book>
</library>
XML используется для обмена данными между различными системами и приложениями, обеспечивая совместимость.
Пользователи могут создавать собственные теги и атрибуты, что делает XML пригодным для различных областей применения.
XML является стандартом, поддерживаемым многими технологиями и инструментами.
XML-документы могут быть проверены на соответствие определенной структуре с помощью схем XML Schema (XSD) или DTD (Document Type Definition).
XML может быть довольно объемным из-за избыточности тегов, что может привести к увеличению размера данных.
Обработка и парсинг XML-документов может быть сложным и требовать значительных вычислительных ресурсов по сравнению с другими форматами, такими как JSON.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.
Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Возвращает строки, где существует совпадение значений в обоих таблицах. Если нет совпадающих значений, строка не будет включена в результирующий набор.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;
Возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы. Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;
Возвращает только совпадающие строки. Если нет совпадений, строки не включаются в результат.
Возвращает все строки из левой таблицы. Включает совпадающие строки из правой таблицы. Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это методология управления проектами и одна из наиболее популярных реализаций Agile, предназначенная для гибкой разработки программного обеспечения. Scrum помогает командам работать более эффективно и адаптироваться к изменениям в требованиях и приоритетах. Основные концепции и элементы Scrum включают следующие компоненты:
Scrum разбивает работу над проектом на небольшие итерации, называемые спринтами. Каждый спринт обычно длится от одной до четырех недель и заканчивается созданием работающего инкремента продукта.
Команды в Scrum сами управляют своей работой и распределяют задачи между участниками без вмешательства извне.
В Scrum выделяются три основных роли:
Product Owner (Владелец продукта): отвечает за создание и управление бэклогом продукта, определение приоритетов и взаимодействие с заинтересованными сторонами.
Scrum Master: помогает команде следовать принципам Scrum, устраняет препятствия и обеспечивает эффективность работы команды.
Development Team (Команда разработки): непосредственно занимается созданием продукта, включает специалистов различных профилей, необходимых для выполнения задач.
список всех требований и функций, которые должны быть реализованы в продукте. Элементы бэклога приоритизируются владельцем продукта.
список задач, которые команда обязуется выполнить в текущем спринте. Эти задачи выбираются из бэклога продукта на основе приоритетов и возможностей команды.
фиксированный период времени, в течение которого команда работает над выполнением задач из бэклога спринта. В конце спринта команда демонстрирует результат своей работы.
ежедневные короткие встречи (обычно 15 минут), на которых команда обсуждает прогресс, планирует работу на день и выявляет препятствия.
встреча в конце каждого спринта, на которой команда демонстрирует результаты своей работы заинтересованным сторонам и получает обратную связь.
встреча после завершения спринта, на которой команда анализирует свою работу, обсуждает, что было хорошо, что можно улучшить, и разрабатывает план улучшений на следующий спринт.
Scrum позволяет быстро адаптироваться к изменяющимся требованиям и приоритетам.
Частые демонстрации результата и обратная связь обеспечивают высокую степень прозрачности процесса разработки.
Регулярные проверки и ретроспективы помогают команде постоянно улучшать качество продукта и процесса.
Scrum способствует более тесному взаимодействию между членами команды и заинтересованными сторонами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Асинхронные операции позволяют программам выполнять задачи в фоновом режиме, не блокируя основной поток выполнения. Это улучшает производительность и отзывчивость приложений.
HTTP-запросы: Асинхронные HTTP-запросы позволяют приложениям запрашивать данные у веб-серверов без блокировки пользовательского интерфейса. Например, загрузка данных из API, отправка форм и файлов. WebSockets: Поддержка двустороннего взаимодействия между клиентом и сервером в реальном времени. Это используется в чатах, онлайн-играх и других приложениях, где требуется мгновенная передача данных. API-вызовы: Асинхронные вызовы к внешним API позволяют продолжать выполнение других операций, не дожидаясь ответа от сервера.
Файловые операции: Асинхронное чтение и запись файлов позволяет обрабатывать большие объемы данных без блокировки основного потока выполнения. Работа с базами данных: Асинхронные запросы к базам данных уменьшают время ожидания и улучшают масштабируемость приложения.
Обработка задач в фоне: Выполнение длительных задач, таких как обработка изображений, видео, данных, без блокировки основного потока. Это позволяет улучшить пользовательский опыт, так как приложение остается отзывчивым. Периодические задания: Планирование и выполнение задач по расписанию, например, обновление данных, резервное копирование, мониторинг системы.
Асинхронные события: Обработка событий пользовательского интерфейса (например, нажатие кнопок, ввод данных) асинхронно для повышения отзывчивости приложений. Анимации и переходы: Асинхронное выполнение анимаций и переходов улучшает пользовательский опыт за счет плавности и непрерывности интерфейса.
Стриминг данных: Асинхронная обработка потоков данных в реальном времени, таких как видео, аудио, данные с датчиков. Это позволяет эффективно управлять непрерывными потоками информации. Реактивное программирование: Асинхронное реагирование на изменения данных и событий. Реактивные системы позволяют обрабатывать данные по мере их поступления, что особенно важно в приложениях, работающих с большим количеством данных.
Параллельные вычисления: Разделение больших задач на более мелкие части, которые выполняются параллельно. Это улучшает производительность при обработке больших объемов данных или выполнении сложных вычислений. Машинное обучение: Асинхронное обучение моделей и выполнение предсказаний позволяет эффективно использовать вычислительные ресурсы.
Асинхронная обработка пользовательских запросов, выполнение сетевых операций и взаимодействие с базами данных для повышения производительности и отзывчивости.
Асинхронные операции обеспечивают плавную работу интерфейса и эффективное использование ресурсов при выполнении сетевых запросов и операций ввода/вывода.
Асинхронное взаимодействие с серверами, обработка событий пользователя и управление игровыми объектами в реальном времени.
Параллельное выполнение вычислительных задач и обработка больших объемов данных для повышения эффективности исследований.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это один из основных принципов объектно-ориентированного программирования (ООП), который подразумевает скрытие внутренней реализации объекта и предоставление доступа к ней только через строго определенные методы или интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта.
Внутреннее состояние объекта (переменные и данные) скрыто от внешнего мира и доступно только через методы класса.
Класс предоставляет публичные методы для взаимодействия с его внутренним состоянием. Эти методы часто называют геттерами (для получения значений) и сеттерами (для установки значений).
Инкапсуляция позволяет контролировать как данные изменяются и обеспечивать их корректное состояние. Например, можно добавить проверки или ограничения в сеттеры.
Пример инкапсуляции на языке Python
class Person:
def __init__(self, name, age):
self._name = name # Внутреннее состояние
self._age = age
# Геттер для имени
def get_name(self):
return self._name
# Сеттер для имени
def set_name(self, name):
if isinstance(name, str) and name:
self._name = name
# Геттер для возраста
def get_age(self):
return self._age
# Сеттер для возраста
def set_age(self, age):
if isinstance(age, int) and 0 <= age <= 120:
self._age = age
# Использование класса
person = Person("Alice", 30)
print(person.get_name()) # Вывод: Alice
print(person.get_age()) # Вывод: 30
person.set_name("Bob")
person.set_age(35)
print(person.get_name()) # Вывод: Bob
print(person.get_age()) # Вывод: 35
# Попытка установить некорректное значение
person.set_age(-5) # Значение не изменится из-за проверки в сеттере
print(person.get_age()) # Вывод: 35
Скрытие внутреннего состояния объекта предотвращает его некорректное использование и изменение.
Инкапсуляция облегчает модификацию и поддержку кода, поскольку внутренние изменения объекта не влияют на внешний код, взаимодействующий с объектом.
Возможность изменения внутренней реализации объекта без изменения его интерфейса.
Возможность добавления логики проверки и валидации данных при их установке или изменении.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Это один из способов повторного использования кода в объектно-ориентированном программировании. Они представляют собой классы или функции, которые предоставляют методы для других классов, без необходимости быть основой для этих классов. Миксины позволяют «подмешивать» функциональность в другие классы, обеспечивая гибкость и модульность кода.
Миксины позволяют избежать дублирования кода путем инкапсуляции общих методов и свойств, которые могут быть использованы в различных классах.
В языках, поддерживающих множественное наследование (например, Python), миксины могут быть использованы как базовые классы для других классов, предоставляя дополнительные методы и свойства. Это позволяет создавать классы, комбинируя несколько миксинов для расширения функциональности.
В языках, где множественное наследование не поддерживается или нежелательно (например, в JavaScript), миксины могут быть применены через композицию, где функциональность миксина добавляется к целевому объекту или классу.
Миксины позволяют изолировать и инкапсулировать определенное поведение или функциональность, что упрощает тестирование и поддержку кода.
Миксины часто используются через множественное наследование.
class LoggableMixin:
def log(self, message):
print(f"Log: {message}")
class Database(LoggableMixin):
def save(self, data):
self.log("Saving data")
# Код для сохранения данных
db = Database()
db.save({"key": "value"})
Миксины могут быть применены через композицию.
const loggableMixin = {
log(message) {
console.log(`Log: ${message}`);
}
};
class Database {
save(data) {
this.log("Saving data");
// Код для сохранения данных
}
}
Object.assign(Database.prototype, loggableMixin);
const db = new Database();
db.save({ key: 'value' });Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
🎉 easyoffer 2.0 — релиз уже в этом месяце!
Вас ждут новые фичи, о которых мы ранее даже не упоминали. Они сделают путь к офферам ещё быстрее и эффективнее. Расскажу о них чуть позже 👀
В честь запуска мы готовим ограниченную акцию:
Первые 500 покупателей получат:
🚀 PRO тариф на 1 год с 50% скидкой
Что нужно сделать:
🔔 Подпишитесь на этот Telegram-канал, чтобы первыми узнать о старте релиза. Сообщение появится в нем раньше, чем где-либо еще — вы успеете попасть в число первых 500 и получить максимальную выгоду. 🎁 А еще только для подписчиков канала ценный бонус в подарок к PRO тарифу.
📅 Официальный запуск — уже совсем скоро.
Следите за новостями и не пропустите старт!
Вас ждут новые фичи, о которых мы ранее даже не упоминали. Они сделают путь к офферам ещё быстрее и эффективнее. Расскажу о них чуть позже 👀
В честь запуска мы готовим ограниченную акцию:
Первые 500 покупателей получат:
🚀 PRO тариф на 1 год с 50% скидкой
Что нужно сделать:
🔔 Подпишитесь на этот Telegram-канал, чтобы первыми узнать о старте релиза. Сообщение появится в нем раньше, чем где-либо еще — вы успеете попасть в число первых 500 и получить максимальную выгоду. 🎁 А еще только для подписчиков канала ценный бонус в подарок к PRO тарифу.
📅 Официальный запуск — уже совсем скоро.
Следите за новостями и не пропустите старт!
Это метод горизонтального разбиения базы данных на более мелкие, более управляемые сегменты, называемые шардов (shards). Каждый шард является независимой базой данных, содержащей подмножество всех данных. Шардирование используется для повышения производительности и масштабируемости базы данных, особенно при работе с большими объемами данных и высокими нагрузками.
Шардирование распределяет строки таблицы по нескольким базам данных, а не делит таблицы на части. Это позволяет уменьшить нагрузку на одну базу данных и распределить её между несколькими серверами.
Каждый шард является автономной базой данных и может находиться на отдельном сервере. Это позволяет шардированным системам эффективно масштабироваться, добавляя новые сервера для хранения и обработки данных.
Ключ шардирования (shard key) используется для определения, в каком шарде будут храниться данные. Выбор правильного ключа шардирования имеет решающее значение для равномерного распределения данных и нагрузки.
Шардирование позволяет горизонтально масштабировать базу данных, добавляя новые шардовые серверы по мере роста объема данных и нагрузки.
Распределение данных между несколькими серверами уменьшает нагрузку на каждый сервер, что может улучшить производительность запросов и операций записи.
Шардирование может повысить устойчивость системы к отказам, так как сбой одного шарда не влияет на доступность остальных.
Меньшие по объему базы данных (шарды) легче управлять, бэкапить и восстанавливать по сравнению с одной большой базой данных.
Настройка и управление шардированной базой данных сложнее, чем управление одной большой базой данных. Это требует дополнительного усилия для настройки и мониторинга.
Транзакции, охватывающие несколько шардов, становятся сложнее и могут требовать использования распределенных транзакционных механизмов, что может негативно сказаться на производительности.
Некоторые запросы, особенно те, которые требуют объединения данных из разных шардов, становятся сложнее и могут требовать дополнительной логики на уровне приложения.
Неправильный выбор ключа шардирования может привести к неравномерному распределению данных, где одни шарды перегружены, а другие остаются недозагруженными.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1