https://www.buymeacoffee.com/maxdzhan
Backend-разработка — это часть веб-разработки, которая касается серверной части веб-приложения. Сюда входит создание и управление серверной логикой, подключение приложения к базе данных, создание серверных API, реализация аутентификации и авторизации пользователей, а также обработка и ответ на запросы пользователей. Это часто предполагает использование таких языков программирования, как Python, Java, Ruby, PHP, JavaScript (Node.js) и .NET.
Backend-разработчик отвечает за разработку серверных компонентов веб-приложения:
- работу с базами данных;
- обработку запросов;
- создание серверных API, которые могут использоваться фронтэнд-разработчиками для извлечения и манипулирования данными;
- обеспечение масштабируемости систем, т.е. он должен убедиться, что серверная часть может обрабатывать большой объем трафика и является производительной;
- интегрирование внешних сервисов, такие как платежные шлюзы, очереди сообщений, облачные сервисы и т. д.
Интернет представляет собой глобальную сеть компьютеров, соединенных друг с другом и обменивающихся данными посредством стандартизированного набора протоколов.
Полезные ссылки:
- Википедия
- Как работает Интернет
- How does the Internet Work?
- The Internet Explained
- How Does the Internet Work?
- Introduction to Internet
- How does the Internet work?
- How the Internet Works in 5 Minutes
HTTP – это протокол прикладного уровня на основе TCP/IP
, который стандартизирует взаимодействие клиента и сервера друг с другом. Он определяет, как контент запрашивается и передается через Интернет.
Полезные ссылки:
- Википедия
- Everything you need to know about HTTP
- What is HTTP?
- Full HTTP Networking Course
- An overview of HTTP
- HTTP/3 From A To Z: Core Concepts
- HTTP/1 to HTTP/2 to HTTP/3
- HTTP Crash Course & Exploration
Веб-браузер – это программное приложение, которое позволяет пользователю получать доступ и отображать веб-страницы или другой онлайн-контент через свой графический пользовательский интерфейс.
Полезные ссылки:
Система доменных имен (DNS) – это телефонная книга Интернета. Пользователи получают доступ к информации в Интернете через доменные имена, например, nytimes.com или espn.com. Веб-браузеры, напротив, взаимодействуют через IP-адреса. DNS переводит доменные имена в IP-адреса, чтобы браузеры могли загружать интернет-ресурсы.
Полезные ссылки:
- Что такое DNS?
- What is DNS? | How DNS works
- How DNS works (comic)
- Understanding Domain names
- DNS and How does it Work?
- DNS Records
- Complete DNS mini-series
Доменное имя – это уникальный, легко запоминающийся адрес, используемый для доступа к веб-сайтам, таким как «google.com» и «facebook.com». Пользователи могут подключаться к веб-сайтам, используя доменные имена, благодаря системе DNS.
Полезные ссылки:
- Что такое доменные имена
- What is a Domain Name? | Domain name vs. URL
- A Beginners Guide to How Domain Names Work
Веб-хостинг – это онлайн-сервис, который выдаёт файлы вашего веб-сайта в Интернете. Таким образом, любой, кто имеет доступ к Интернету, имеет доступ к вашему сайту.
Полезные ссылки:
- Википедия
- What Is Web Hosting? Explained
- Different Types of Web Hosting Explained
- Where to Host a Fullstack Project on a Budget
- What is the difference between webpage, website, web server, and search engine?
- What is a web server?
HTML (HyperText Markup Language – «язык гипертекстовой разметки») – стандартизированный язык гипертекстовой разметки документов для просмотра веб-страниц в браузере. Веб-браузеры получают HTML документ от сервера по протоколам HTTP/HTTPS или открывают с локального диска, далее интерпретируют код в интерфейс, который будет отображаться на экране монитора.
Элементы HTML являются строительными блоками HTML страниц. С помощью HTML разные конструкции, изображения и другие объекты, такие как интерактивная веб-форма, могут быть встроены в отображаемую страницу. HTML предоставляет средства для создания заголовков, абзацев, списков, ссылок, цитат и других элементов. Элементы HTML выделяются тегами, записанными с использованием угловых скобок. Такие теги, как <img />
и <input />
, напрямую вводят контент на страницу. Другие теги, такие как <p>
, окружают и оформляют текст внутри себя и могут включать другие теги в качестве подэлементов. Браузеры не отображают HTML-теги, но используют их для интерпретации содержимого страницы.
Язык XHTML является более строгим вариантом HTML, он следует синтаксису XML и является приложением языка XML в области разметки гипертекста.
В HTML можно встроить программный код на языке программирования JavaScript, для управления поведением и содержанием веб-страниц. Также включение CSS в HTML позволяет задавать внешний вид и макет страницы.
Полезные ссылки:
CSS (Cascading Style Sheets – «каскадные таблицы стилей») – формальный язык декорирования и описания внешнего вида документа (веб-страницы), написанного с использованием языка разметки (чаще всего HTML или XHTML). Также может применяться к любым XML-документам, например, к SVG или XUL.
Полезные ссылки:
JavaScript – мультипарадигменный язык программирования. Поддерживает объектно-ориентированный, императивный и функциональный стили. Является реализацией спецификации ECMAScript (стандарт ECMA-262).
JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам.
Полезные ссылки:
Смотри также дорожную карту фронтенд разработчика
Операционная система – это программа, которая управляет ресурсами компьютера, особенно распределением этих ресурсов между другими программами. Примерами ресурсов могут быть центральный процессор (ЦП), память компьютера, хранилище файлов, устройства ввода/вывода (I/O) и сетевые подключения.
Полезные ссылки:
- What is an operating system?
- Operating System summary
- Operating Systems: Crash Course Computer Science #18
- Introduction to Operating System
Терминал (командная строка или консоль) позволяет нам выполнять и автоматизировать задачи на компьютере без использования графического пользовательского интерфейса.
Полезные ссылки:
- Terminal Usage
- Command line crash course
- Basic Terminal Usage – Cheat Sheet to make the command line EASY
Работать в терминале любому Backend-разработчику приходится практически ежедневно. Существует множество команд и утилит, которые могут помочь вам более эффективно выполнять свои задачи.
Лучший способ выучить эти команды – попрактиковаться с их использованием на своем компьютере/в локальной среде разработки. Обратите внимание на те, которые связаны с командами/утилитами Linux, являющейся наиболее распространенной ОС в отрасли.
Чтобы понять как работают эти команды, прочитайте соответствующие страницы документации и руководств по эксплуации, используя команду man, например, man grep
, man awk
и т. д.
Потратив определенное время на теорию и практику, вам станет намного проще использовать эти команды.
Полезные ссылки:
- Command line crash course
- 40 Basic Linux Commands
- A collection of modern/faster/saner alternatives to common unix commands
- Command Line Tutorial
- Commandline Challenge
- The 50 Most Popular Linux & Terminal Commands (with timestamps)
Операционная система – это основная программа на компьютере, которая управляет всеми другими приложениями. Она позволяет использовать браузеры, играть в игры, распечатывать документы, запускать любимую программу.
Полезные ссылки:
- What is an operating system?
- Operating System – Overview
- Operating System Concepts
- Operating System Basics
Управление процессами включает в себя различные задачи, такие как создание, диспетчеризация, завершение процессов и решение проблем, связанных с взаимной блокировкой. Процесс – это программа, исполняемая в настоящий момент. Он является важной частью современных операционных систем. ОС должна выделять ресурсы, которые позволяют процессам совместно использовать информацию и обмениваться ею. Она также защищает ресурсы каждого процесса друг от друга и обеспечивает их синхронизацию.
Полезные ссылки:
- Processes and Process Management
- Operating System: Process and Process Management
- Process Management in OS: PCB in Operating System
Поток выполнения – это наименьшая единица обработки, которая может быть выполнена в ОС. В большинстве современных операционных систем поток существует внутри процесса, то есть один процесс может содержать несколько потоков.
Многопоточность характеризуется одновременным выполнением нескольких потоков. Такое происходит в операционной системе, когда несколько потоков процессов выполняются одновременно. Эти потоки могут взаимодействовать друг с другом через общую память или передачу сообщений. Многопоточность приводит к совместному использованию ресурсов, что вызывает такие проблемы, как взаимоблокировки и нехватка ресурсов. Они решаются такими методами, как координация процессов, выделение памяти и планирование выполнения процессов, чтобы максимизировать пропускную способность.
Полезные ссылки:
- Threads And Concurrency
- What’s the Diff: Programs, Processes and Threads
- Concurrency in Operating System
- Intro to Processes & Threads
- Introduction to Concurrency
- Concurrency, Threading and Parallelism Explained
Термин "Память" можно определить как набор данных в определенном формате. Она используется для хранения команд и обработки данных. Память состоит из большого массива или группы байтов, каждый из которых имеет свой собственный адрес. Основной задачей компьютерной системы является выполнение программ. Эти программы вместе с информацией, к которой они обращаются, во время выполнения должны находиться в оперативной памяти. ЦП извлекает команды из памяти в соответствии со значением счетчика команд.
Для достижения определенной степени многозадачности и правильного использования памяти важно управление памятью. Существует несколько методов управления памятью, отражающих различные подходы, и эффективность каждого алгоритма зависит от ситуации.
Полезные ссылки:
- Memory Management
- Demystifying memory management in modern programming languages
- Memory Management in Operating System
Межпроцессное взаимодействие (IPC) относится конкретно к механизмам, которые предоставляет операционная система, позволяющим процессам управлять общими данными.
Полезные ссылки:
Одной из важных задач операционной системы является управление различными устройствами ввода-вывода, включая мышь, клавиатуру, сенсорную панель, дисковые и твердотельные накопители, адаптеры дисплея, USB-устройства, экраны с растровым отображением, светодиоды, аналого-цифровые преобразователи, коммутаторы, сетевые подключения, аудиовходы/выходы, принтеры и т. д.
Полезные ссылки:
POSIX (Portable Operating System Interface – переносимый интерфейс операционных систем) – это набор стандартов для обеспечения совместимости между операционными системами. В нём описываются утилиты, API и службы, которые совместимая ОС должна предоставлять программному обеспечению, что упрощает перенос программ из одной системы в другую.
Практический пример: в Unix-подобной операционной системе существует три стандартных потока, stdin
, stdout
и stderr
— это подключения ввода/вывода, с которыми вы, вероятно, столкнетесь при использовании терминала, поскольку они управляют потоком из стандартного ввода (stdin), стандартного вывода (stdout) и стандартной ошибки (stderr).
Таким образом, когда мы хотим взаимодействовать с любым из этих потоков (например, через процесс), API POSIX операционной системы позволяет упростить этот процесс — например, в библиотеке на языке C <unistd.h>
stdin, stderr и stdout определены как STDIN_FILENO
, STDERR_FILENO
и STDOUT_FILENO
.
POSIX также внедряет стандарт для кодов завершения программы, семантики файловой системы и нескольких других общепринятых API соглашений для утилит командной строки.
Полезные ссылки:
- Стандартные потоки
- Pipes
- POSIX standard by IEEE
- Summary of some POSIX implementations
- A guide to POSIX
Компьютерная сеть представляет собой связанные друг с другом вычислительные устройства, которые могут обмениваться данными и совместно использовать ресурсы. Устройства, входящие в сеть, используют систему правил (коммуникационные протоколы), для передачи информации с помощью физических или беспроводных технологий.
Полезные ссылки:
- Эндрю С. Таненбаум Современные операционные системы: [пер. с англ.]: Питер, 2011.
Главная область применения PHP – написание скриптов, работающих на стороне сервера; таким образом, PHP способен выполнять все то, что выполняет любая другая программа CGI, например, обрабатывать данные форм, генерировать динамические страницы или отсылать и принимать cookies.
PHP доступен для большинства операционных систем, включая Linux, многие модификации Unix (такие как HP-UX, Solaris и OpenBSD), Microsoft Windows, macOS, RISC OS и многие другие. Также в PHP включена поддержка большинства современных веб-серверов, таких как Apache, IIS и многих других. В принципе, подойдёт любой веб-сервер, способный использовать бинарный файл FastCGI PHP, например, lighttpd или nginx. PHP может работать в качестве модуля или функционировать в качестве процессора CGI.
Таким образом, выбирая PHP, вы получаете свободу выбора операционной системы и веб-сервера. Более того, у вас появляется выбор между использованием процедурного или объектно-ориентированного программирования (ООП) или же их сочетания.
Полезные ссылки:
Когда PHP обрабатывает файл, он ищет открывающие и закрывающие теги, такие как , которые указывают PHP, когда начинать и заканчивать обработку кода между ними. Подобный способ обработки позволяет PHP внедряться во все виды различных документов, так как всё, что находится вне пары открывающих и закрывающих тегов, будет проигнорировано парсером PHP.
Все, что находится вне пары открывающегося и закрывающегося тегов, игнорируется интерпретатором PHP, у которого есть возможность обрабатывать файлы со смешанным содержимым. Это позволяет PHP-коду быть встроенным в документы HTML, к примеру, для создания шаблонов.
Как в C или Perl, PHP требует окончания инструкций точкой запятой в конце каждой инструкции. Закрывающий тег блока PHP-кода автоматически применяет точку с запятой; т.е. нет необходимости ставить точку с запятой в конце последней строки блока с PHP-кодом. Закрывающий тег блока "поглотит" немедленно следующий за ним переход на новую строку, если таковой будет обнаружен.
PHP поддерживает комментарии в стиле 'C', 'C++' и оболочки Unix (стиль Perl). Однострочные комментарии идут только до конца строки или текущего блока PHP-кода, в зависимости от того, что идёт перед ними. Это означает, что HTML-код после // ... ?> или # ... ?> БУДЕТ напечатан: ?> завершает режим PHP и возвращает режим HTML, а // или # не могут повлиять на это. 'C'-комментарии заканчиваются при первой же обнаруженной последовательности */.
Полезные ссылки:
У каждого выражения в PHP один из следующих встроенных типов в зависимости от его значения:
- null
- bool
- int
- float (floating-point number)
- string
- array
- object
- callable
- resource
PHP – динамически типизированный язык, что означает, что по умолчанию нет необходимости указывать тип переменной, так как он будет определён во время выполнения. Однако можно статически типизировать некоторые аспекты языка, используя декларации типов.
Полезные ссылки:
Переменные в PHP представлены знаком доллара с последующим именем переменной. Имя переменной чувствительно к регистру.
Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчёркивания и состоять из букв, цифр и символов подчёркивания в любом количестве.
Константа – это идентификатор (имя) для простого значения. Как следует из названия, это значение не может измениться в ходе выполнения скрипта. Константы чувствительны к регистру. По принятому соглашению, имена констант всегда пишутся в верхнем регистре.
Полезные ссылки:
Выражения – это самые важные строительные элементы PHP. Почти всё, что вы пишете в PHP, является выражением. Самое простое и точное определение выражения — все что угодно, имеющее значение.
Оператором называется нечто, принимающее одно или более значений (или выражений), и вычисляющее новое значение (таким образом, вся конструкция может рассматриваться как выражение).
Операторы можно сгруппировать по количеству принимаемых ими значений. Унарные операторы принимают только одно значение, например, !
(оператор логического отрицания) или ++
(инкремент). Бинарные операторы принимают два значения; это, например, знакомые всем арифметические операторы +
(плюс) и -
(минус), большинство поддерживаемых в PHP операторов входят именно в эту категорию. Ну и, наконец, есть всего один тернарный оператор, ? :
, принимающий три значения, обычно его так и называют – тернарный оператор.
Полезные ссылки:
Все скрипты в PHP представляют собой набор различных выражений, которые выполняются последовательно. Выражения можно объединять в группы выражений при помощи операторных скобок {
и }
. Группы выражений используются в основном вместе с управляющими конструкциями языка PHP.
Управляющие конструкции языка – это наборы служебных слов, позволяющие изменять ход выполнения скрипта. Все конструкции можно условно разделить на конструкции бинарного выбора, множественного выбора, повторения и включения.
Конструкции бинарного (двойственного) выбора позволяют в зависимости от условия выполнить либо первое, либо второе действие. В PHP эти конструкции представлены ключевыми словами if
, else
, elseif
и endif
.
Конструкция множественного выбора представляет собой компактную форму записи длинных цепочек условий вида if...elseif...elseif......else
. В PHP такая конструкция носит название switch
.
Конструкции повторения (организации циклов) предназначены для многократного выполнения одних и тех же выражений. К этим конструкциям относятся while
, do-while
, for
и
foreach
.
Последняя группа конструкций – конструкции включения. Они предназначены для включения в текст скрипта каких-либо данных и кода, находящихся в другом файле. Всего существует четыре варианта: include
, include_once
, require
, require_once
.
Конструкции с приставкой _once
отличаются от прочих тем, что гарантируют однократное включение файла в рамках всех задействованых файлов. include_once
или require_once
предварительно проверят предыдущие включения, и если файл уже был подключен – повторно подключать его не будут. Отличие между include
и require
заключено в поведении при отсутсвующем файле для подключения. Если include
или inclide_once
не находят указанный файл, то выдают предупреждение для пользователя. А вот require
и require_once
генерируют ошибку и прекращают дальнейшее выполнение скрипта.
Полезные ссылки:
Функции представляют собой блок инструкций, которые многократно можно вызывать в различных частях программы. Функции позволяют разделять программуу на меньшие функциональные части.
Определение функции начинается с ключевого слова function
, за которым следует имя функции. Имя функции должно начинаться с алфавитного символа или подчеркивания, за которыми может следовать любое количество алфавитно-цифровых символов или символов подчеркивания.
После имени функции в скобках идет перечисление параметров. Даже если параметров у функции нет, то просто идут пустые скобки. Затем в фигурных скобках идет тело функции, содержащее набор инструкций.
Полезные ссылки:
PHP включает полноценную объектную модель. Некоторые из её особенностей: видимость, абстрактные и ненаследуемые (final
) классы и методы, а также магические методы, интерфейсы и клонирование.
PHP работает с объектами так же, как с ссылками или дескрипторами, это означает что каждая переменная содержит ссылку на объект, а не его копию.
Полезные ссылки:
Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса.
Пример статического метода и свойства.
<?php
class Foo {
// статическое свойство
static public $aStaticNumber = 0;
// статический метод
public static function aStaticMethod() {
// ...
}
}
?>
Поскольку доступ к статическому элементу осуществляется через класс, а не экземпляр объекта, вам не нужна переменная, которая ссылается на объект. Вместо этого используется имя класса, после которого указывается два двоеточия "::".
<?php
Foo::$aStaticNumber;
Foo::aStaticMethod();
?>
Статические элементы имеют ряд полезных особенностей:
- они доступны из любой точки сценария. Это означает, что можно вызывать функции, не передавая экземпляр класса от одного объекта другому или сохраняя экземпляр объекта в глобальной переменной.
- статическое свойство доступно каждому экземпляру объекта этого класса, поэтому можно определить значения, которые должны быть доступны всем объектам данного типа.
- позволяют не создавать экземпляр объекта ради вызова статической функции.
Полезные ссылки:
Классы, определенные как абстрактные, не могут быть созданы, и любой класс, который содержит по крайней мере один абстрактный метод, должен быть определен как абстрактный. Абстрактный метод не может иметь реализацию в абстрактном классе. Он объявляется, как обычный метод, но объявление заканчивается точкой с запятой, а не телом метода.
<?php
abstract class AbstractClass
{
/* Данный метод должен быть определён в дочернем классе */
abstract protected function getValue();
abstract protected function prefixValue($prefix);
/* Общий метод */
public function printOut() {
print $this->getValue() . "\n";
}
}
?>
Полезные ссылки:
Интерфейсы объектов позволяют создавать код, который указывает, какие методы должен реализовать класс, без необходимости определять, как эти методы обрабатываются.
Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова interface
вместо class
. Тела методов интерфейсов должны быть пустыми.
Для реализации интерфейса используется оператор implements
. Класс должен реализовать все методы, описанные в интерфейсе, иначе произойдет фатальная ошибка. При желании классы могут реализовывать более одного интерфейса, разделяя каждый интерфейс запятой.
<?php
// Объявим интерфейс 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Реализация интерфейса
// Это будет работать
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
?>
Все методы, определенные в интерфейсы должны быть объявлены как public
.
Интерфейс может содержать публичные методы (простые и статические), а также константы. Интерфейс НЕ может содержать любые свойства, непубличные методы и константы, методы с реализацией.
В РНР не поддерживается множественное наследование. Однако эту проблему можно решить с помощью интерфейсов. Другими словами, для каждого класса в РНР может существовать только один родительский класс. Тем не менее в каждом классе можно реализовать произвольное количество интерфейсов. При этом данный класс будет соответствовать типам всех тех интерфейсов, которые в нем реализованы.
Полезные ссылки:
Трейт – это механизм обеспечения повторного использования кода в языках с поддержкой только одиночного наследования, таких как PHP. Трейт предназначен для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику повторно использовать наборы методов свободно, в нескольких независимых классах и реализованных с использованием разных архитектур построения классов. Любое свойство (или метод), определенное в трейте, становится частью того класса, в который этот трейт включен. При этом трейт изменяет структуру этого класса, но не меняет его тип.
Пример использования трейта
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
В класс можно включить несколько трейтов. Для этого их нужно перечислить через запятую после ключевого слова use
.
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World';
}
}
class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
Как было сказано выше, трейты не позволяют изменить тип класса, в который были включены. Поэтому, если трейт используется сразу в нескольких классах, у вас не будет общего типа, который можно было бы указать в уточнениях для сигнатур методов. К счастью, трейты можно успешно использовать вместе с интерфейсами. Мы можем определить интерфейс с методами, которые затем реализуем в трейте, а затем указать, что в нужном нам классе реализуются методы этого интерфейса.
Устранение конфликтов имен с помощью ключевого слова insteadof
. Псевдонимы для переопределенных методов трейта
Если два трейта вставляют метод с одним и тем же именем, это приводит к фатальной ошибке в случае, если конфликт явно не разрешен.
Для разрешения конфликтов именования между трейтами, используемыми в одном и том же классе, необходимо использовать оператор insteadof
для того, чтобы точно выбрать один из конфликтующих методов.
Так как предыдущий оператор позволяет только исключать методы, оператор as
может быть использован для включения одного из конфликтующих методов под другим именем. Оператор as
не переименовывает метод и не влияет на какой-либо другой метод.
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>
На статические переменные можно ссылаться внутри методов трейта, но нельзя определить статические переменные в самом трейте. Тем не менее, трейт может описывать статические методы для демонстрации класса.
<?php
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}
class C1 {
use Counter;
}
class C2 {
use Counter;
}
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>
В трейтах можно объявлять абстрактные методы точно так же, как и в обычных классах. При использовании такого трейта в классе в нем должны быть реализованы все объявленные в трейте абстрактные методы.
<?php
trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
abstract public function getWorld();
}
class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
?>
Используя синтаксис оператора as
можно также настроить видимость метода в использующем трейт классе.
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
// Изменение видимости класса sayHello
class MyClass1 {
use HelloWorld { sayHello as protected; }
}
// Создание псевдонима метода с измененной видимостью
// видимость sayHello не изменилась
class MyClass2 {
use HelloWorld { sayHello as private myPrivateHello; }
}
?>
Аналогично тому, как классы могут использовать трейты, также и трейты могут использовать другие трейты.
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World!';
}
}
trait HelloWorld {
use Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
Трейты могут также определять свойства.
<?php
trait PropertiesTrait {
public $x = 1;
}
class PropertiesExample {
use PropertiesTrait;
}
$example = new PropertiesExample;
$example->x;
?>
Полезные ссылки:
Позднее статическое связывание может быть использовано для того, чтобы получить ссылку на вызываемый класс в контексте статического наследования. "Позднее связывание" отражает тот факт, что обращения через static::
не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться на основе информации в ходе исполнения.
Использование static::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Здесь действует позднее статическое связывание
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
Позднее статическое связывание может использоваться, чтобы избежать дублирования кода из родительсикх классов в дочерние.
abstract class DomainObject
{
public static function create ()
{
return new static ();
}
class User extends DomainObject ()
{
}
class Document extends DomainObject ()
{
}
print_r(Document::create());
Ключевое слово static
можно использовать не только для создания объектов. Так же, как и self
и parent
, его можно использовать как идентификатор для вызова статических методов даже из нестатического контекста.
abstract class DomainObject
{
private $group;
public function __construct()
{
$this->group = static::getGroup();
}
public static function create(): DomainObject
{
return new static();
}
public static function getGroup(): string
{
return "default";
}
}
class User extends DomainObject
{
}
class Document extends DomainObject
{
public static function getGroup(): string
{
return "document";
}
}
class SpreadSheet extends Document
{
}
print_r(User::create());
print_r(SpreadSheet::create());
Полезные ссылки:
Магические методы – это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определённые действия.
Полезные ссылки:
Наследование (англ. inheritance) — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
Агрегирование (англ. object aggregation, object composition), или, как его называли ранее, делегирование, в объектно-ориентированном программировании — методика создания нового класса из уже существующих классов путём их включения. Об агрегировании также часто говорят как об «отношении принадлежности» по принципу «у машины есть корпус, колёса и двигатель».
Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.
Композиция (агрегирование по значению) — более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.
Полезные ссылки:
Пространства имён в широком смысле – это один из способов инкапсуляции элементов.
В PHP пространства имён используются для решения двух проблем, с которыми сталкиваются авторы библиотек и приложений при создании повторно используемых элементов кода, таких как классы и функции:
- Конфликт имён между вашим кодом и внутренними классами/функциями/константами PHP или сторонними.
- Возможность создавать псевдонимы (или сокращения) для Ну_Очень_Длинных_Имён, чтобы облегчить первую проблему и улучшить читаемость исходного кода.
Полезные ссылки:
PHP сообщает об ошибках в ответ на некоторые внутренние ошибочные обстоятельства. Они могут быть использованы для уведомления о разных состояниях, а также могут выводиться на экран и записываться в логи по желанию.
Каждая ошибка, генерируемая PHP, обязательно содержит информацию о своём типе. В этом списке перечислены все типы ошибок, а также описания их поведений и провоцирующие их причины.
В PHP реализована модель исключений, аналогичная тем, что используются в других языках программирования. Исключение в PHP может быть выброшено (throw
) и поймано (catch
). Код может быть заключён в блок try
, чтобы облегчить обработку потенциальных исключений. У каждого блока try
должен быть как минимум один соответствующий блок catch
или finally
.
Если выброшено исключение, а в текущей области видимости функции нет блока catch
, исключение будет подниматься по стеку вызовов к вызывающей функции, пока не найдёт подходящий блок catch
. Все блоки finally
, которые встретятся на этом пути, будут выполнены. Если стек вызовов разворачивается до глобальной области видимости, не встречая подходящего блока catch
, программа завершается с неисправимой ошибкой, если не был установлен глобальный обработчик исключений.
Полезные ссылки:
Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов или сложностей, связанных с реализацией класса, реализующего интерфейс Iterator
.
Генератор позволяет вам писать код, использующий foreach
для перебора набора данных без необходимости создания массива в памяти, что может привести к превышению лимита памяти, либо потребует довольно много времени для его создания. Вместо этого, вы можете написать функцию-генератор, которая, по сути, является обычной функцией, за исключением того, что вместо возврата единственного значения, генератор может возвращать (yield
) столько раз, сколько необходимо для генерации значений, позволяющих перебрать исходный набор данных.
Полезные ссылки:
Стандартная библиотека PHP (SPL) – это набор интерфейсов и классов, предназначенных для решения стандартных задач.
SPL предоставляет ряд стандартных структур данных, итераторов для оббегания объектов, интерфейсов, стандартных исключений, некоторое количество классов для работы с файлами и предоставляет ряд функций, например spl_autoload_register()
.
Полезные ссылки:
SPL предоставляет набор стандартных структур данных. Они сгруппированы здесь по своей базовой реализации, которая обычно определяет их общую область применения.
Полезные ссылки:
- Структуры данных
- Двусвязные списки
- Стек
- Очередь
- Куча
- Очередь с приоритетом
- Массив фиксированной длины
- Отображение объектов в данные
Composer – это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении. Composer разработали и продолжают поддерживать два программиста Nils Adermann и Jordi Boggiano. Они начали разрабатывать Composer в апреле 2011, а первый релиз состоялся 1 марта 2012. Идея создания пакетных менеджеров уровня приложений не нова и его авторы вдохновлялись уже существовавшими на тот момент времени npm
для Node.js
и bundler
для Ruby
.
Composer работает через интерфейс командной строки и устанавливает зависимости (например библиотеки) для приложения. Он также позволяет пользователям устанавливать PHP-приложения, которые доступны на packagist.org, который является его основным репозиторием, где содержатся все доступные пакеты.
Команда require
добавляет новые пакеты в файл composer.json
из текущего каталога. Если файла не существует, он будет создан на лету.
После добавления/изменения зависимостей, они будут установлены или обновлены.
Если вы не хотите выбирать зависимости в интерактивном режиме, вы можете передать их команде.
php composer.phar require "vendor/package:2.*" vendor/package2:dev-master
Если вы не укажете пакет, Composer предложит вам выполнить поиск пакета и, получив результаты, предоставит список совпадений для затребованного.
Команда install
считывает файл composer.json
из текущего каталога, разрешает зависимости и устанавливает их в vendor
.
php composer.phar install
Если в текущем каталоге есть файл composer.lock
, он будет использовать конкретные версии оттуда, а не разрешать их. Это гарантирует, что все, кто использует библиотеку, получат одинаковые версии зависимостей.
Если файла composer.lock
нет, Composer создаст его после разрешения зависимостей.
Чтобы получить последние версии зависимостей и обновить файл composer.lock
, вы должны использовать команду update
. Эта команда также называется upgrade
, поскольку она делает то же самое, что и upgrade
, если сравнивать с apt-get
или подобными менеджерами пакетов.
php composer.phar update
Это разрешит все зависимости проекта и запишет конкретные версии в composer.lock
.
Если вы хотите обновить только несколько пакетов, а не все, вы можете перечислить их следующим образом:
php composer.phar update vendor/package vendor/package2
Вы также можете использовать символ звёздочки для одновременного обновления нескольких пакетов:
php composer.phar update "vendor/*"
Если вы хотите понизить версию пакета до определенной версии, не изменяя ваш composer.json, вы можете использовать --with
и указать ограничение версии:
php composer.phar update --with vendor/package:2.0.1
Обратите внимание, что при использовании показанной выше команды, будут обновлены все пакеты. Если вы хотите обновить только пакеты, для которых вы указали ограничения с помощью --with
, вы можете опустить --with
и вместо этого использовать:
php composer.phar update vendor/package:2.0.1 vendor/package2:3.0.*
Для пакетов, которые также находятся в вашем composer.json
, ограничение, вводимое Вами, должно быть подмножеством существующих ограничений.
Полезные ссылки:
Система управления пакетами – набор программного обеспечения, позволяющего управлять процессом установки, удаления, настройки и обновления различных компонентов программного обеспечения.
Использование на практике системы управления пакетами Composer позволяет автоматизировать не только процесс установки и обновления пакетов, но и дает возможность использовать одни и те же версии пакетов среди всех разработчиков.
Полезные ссылки:
Packagist – это хостинг PHP-пакетов. Это дефолтный хостинг Composer. Каждый месяц Composer используется для загрузки более 2 миллиардов пакетов. Packagist представляет собой один из крупнейших хостинговых сервисов в экосистеме PHP.
Полезные ссылки:
Благодаря появлению такого инструмента как Composer, появился универсальный инструмент автозагрузки. Теперь, чтобы написать свою библиотеку или приложение, нет необходимости писать свой автозагрузчик классов, и поэтому можно сосредоточиться на написании кода вашего приложения. Более того, появился универсальный инструмент подключение сторонних библиотек, если в этом есть необходимость.
Ранее написание автозагрузчика классов осуществлялось с помощью PHP функции spl_autoload_register
, и каждый сам организовывал структуру приложения в соответствии с придуманным им правилами. Для того, чтобы все разработчики придерживались предопределенных правил и не придумывали свои, сообщество PHP разработчиков написали рекомендации (стандарты) PSR-0 и PSR-4, которые позволят всем PHP программистам организовывать структуру таким образом, чтобы их приложение было проще понимать другим. В настоящий момент следует организовывать автозагрузку в соответствии с PSR-4, поскольку это более актуальный и рекомендуемый на данный момент способ организации структуры.
Полезные ссылки:
Базы данных широко применяются для структурирования и хранения информации. Таким образом, на практике базы данных применяют:
- для сохранения пользовательских данных, полученных с помощью форм;
- для проверки, существует ли конкретный аккаунт в системе, какие у него права доступа;
- для организации поиска по страницам сайта;
- для хранения комментариев;
- для хранения всевозможного контента (статей, изображений, медиафайлов) и многих других данных.
Но прежде, чем выполнить какую-нибудь операцию с записями, находящимися в БД, нужно сначала к этой БД подключиться.
Традиционно, язык программирования PHP поддерживает работу с такой базой данных, как MySQL. Для работы с базой данных MySQL в PHP встроены специальные функции, то есть необходимые возможности предусмотрены заранее. Эти функции позволяют:
- выполнять запросы и получать результаты;
- обрабатывать ошибки;
- читать и записывать данные;
При подключении к MySQL соответствующий сценарий исполняет запрос и показывает результат запроса. Но самое главное заключается в том, что для работы с СУБД MySQL разработчику не придется ничего специально устанавливать, так как все нужное будет сразу доступно и включено в стандартный пакет PHP.
Модуль PHP Data Objects
(PDO) определяет простой и согласованный интерфейс для доступа к базам данных в PHP. Каждый драйвер базы данных, в котором реализован этот интерфейс, может представить специфичную для базы данных функциональность в виде стандартных функций модуля. Но надо заметить, что сам по себе модуль PDO не позволяет манипулировать доступом к базе данных. Чтобы воспользоваться возможностями PDO, необходимо использовать соответствующий конкретной базе данных PDO драйвер.
PDO обеспечивает абстракцию доступу к данным, это значит, что вне зависимости от того, какая конкретная база данных используется, вы можете пользоваться одними и теми же функциями для выполнения запросов и выборки данных. PDO не абстрагирует саму базу данных, этот модуль не переписывает SQL-запросы и не эмулирует отсутствующий в СУБД функционал. Если нужно именно это, необходимо воспользоваться полноценной абстракцией базы данных.
Модуль PDO внедрён в PHP.
Полезные ссылки:
ORM (Object-Relation Mapping, объектно-реляционное отображение) – общее название для библиотек, позволяющих автоматически связать базу данных с кодом. Они стараются скрыть существование базы данных настолько, насколько это возможно. Взамен, программисту дают возможность оперировать данными в базе через специальный интерфейс. Вместо построения SQL-запросов, программист вызывает простые методы, а всю остальную работу берёт на себя ORM.
Полезные ссылки:
Doctrine – ORM для PHP 7.1+, который базируется на слое абстракции доступа к БД (DBAL). Одной из ключевых возможностей Doctrine является запись запросов к БД на собственном объектно-ориентированном диалекте SQL, называемом DQL (Doctrine Query Language) и базирующемся на идеях HQL (Hibernate Query Language).
Полезные ссылки:
Отладка – этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится:
- узнавать текущие значения переменных;
- выяснять, по какому пути выполнялась программа.
Существуют две взаимодополняющие технологии отладки:
-
Использование отладчиков – программ, которые включают в себя пользовательский интерфейс для пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.
-
Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода – на экран, принтер или в файл. Вывод отладочных сведений в файл называется логированием.
xDebug – средство профилирования и отладки PHP-скриптов. XDebug поставляется как расширение для PHP и работает по протоколу DBGp.
Полезные ссылки:
PHP расширение, которое необходимо установить на ваш веб-сервер для оптимальной удаленной отладки и профилирования с помощью Zend Studio.
Полезные ссылки:
Качество кода — это измерение того, насколько высока или низка ценность определенного набора кода, программы или программного обеспечения. Как правило, код является высококачественным, если строки кода легко интерпретируются и если разработчик задокументировал код. Качественный код часто отвечает следующим параметрам:
- Функциональный
- Последовательный
- Его легко понять
- Удовлетворяет потребностям клиентов
- Тестируемый
- Поддерживает многоразовое использование
- В нём отсутствуют ошибки и недочеты
- Безопасный
- Хорошо документированный
Cпецификация PSR-12 расширяет и заменяет руководство по стилю кодирования PSR-2 и требует соблюдения PSR-1, основного стандарта кодирования.
Как и PSR-2, цель данной рекомендации, уменьшить когнитивные разногласия при просмотре кода разных авторов. Это достигается путем перечисления общего набора правил и ожиданий о том, как форматировать код на PHP. Этот PSR стремится обеспечить набор способов, который может реализовать механизмы стиля кодирования. Проекты могут заявить о соблюдении, а разработчики могут легко устанавливать связь между различными проектами. Когда разные авторы работают над несколькими проектами, это помогает достичь одного набора стиля кодирования, который будет использоваться во всех этих проектах. Таким образом, преимущество этого руководства заключается не в самих правилах, а в совместном использовании этих правил.
PSR-2 был принят в 2012 году, и с тех пор в PHP был внесен ряд изменений, которые повлияли на рекомендации по стилю кодирования. В то время как PSR-2 полно отражает функциональность PHP, существовавшую на момент написания, новую функциональность можно интерпретировать по-разному. Таким образом, этот PSR стремится прояснить содержание PSR-2 в более современном контексте с доступными новыми функциональными возможностями и внести поправки в PSR-2.
Полезные ссылки:
PHP CodeSniffer состоит из двух скриптов; главный phpcs
размечает PHP, JavaScript, CSS файлы для обнаружения нарушений определенных стандартов кода. Второй скрипт phpcbf
автоматически исправляет ошибки в коде. CodeSniffer — это полезный инструмент разработчика, гарантирующий чистоту и последовательность кода.
Полезные ссылки:
Бесплатный с открытым исходным кодом инструмент статического анализа PHP приложений на наличие ошибок. Кроме того в его состав входит иснтрумент под названием Psalter, который может помочь вам исправить найденные ошибки.
Полезные ссылки:
Phan — статический анализатор для PHP. Phan предпочитает избегать ложных срабатываний и пытается доказать неправоту, а не правильность. Может требовать много памяти на больших проектах.
Полезные ссылки:
PHPStan фокусируется на поиске ошибок в вашем коде, фактически не запуская его. Он отлавливает целые классы ошибок ещё до того, как вы напишете тесты для кода. Он приближает PHP к компилируемым языкам в том смысле, что правильность каждой строки кода можно проверить до того, как вы запустите эту строку.
- можно анализировать не всю кодовую базу, а только часть;
- существует возможность писать плагины;
- настройки в формате neon;
- постепенно нарастающая сложность анализа.
Полезные ссылки:
Кэширование – это процесс хранения часто используемых данных во временном хранилище, называемом кешем. Цель кэширования — повысить производительность приложений и системы за счет сокращения времени, необходимого для доступа к данным. При запросе данных, хранящихся в кеше, система может извлечь данные из кеша вместо того, чтобы извлекать их из исходного источника, что может быть медленнее.
Цель PSR-6 – позволить разработчикам создавать библиотеки с поддержкой кэширования, которые можно интегрировать в существующие платформы и системы без необходимости специальной разработки. PSR-16 более простой подход направленный на создание стандартизированного оптимизированного интерфейса для часто встречающихся случаев. Он не зависит от PSR-6, но был разработан для максимально простой совместимости с PSR-6.
Полезные ссылки:
APCu – это хранилище «ключ-значение» в памяти для PHP. Ключи являются строками (string), а значения могут быть любыми переменными PHP. APCu поддерживает только кеширование переменных в пользовательском пространстве.
Полезные ссылки:
Когда нет возможности установить APCu или Redis, то кеш можно хранить в файловой системе. Считать информацию из файла и выполнить десериализацию часто бывает намного быстрее, чем выполнить громоздкий SELECT запрос с несколькими джойнами.
Полезные ссылки:
Тестирование — процесс исследования, испытания программного продукта, имеющий своей целью проверку соответствия между реальным поведением программы и её ожидаемым поведением на конечном наборе тестов, выбранных определённым образом.
PHPUnit – фреймворк для unit тестирования при разработке ПО на PHP. Является представителем семейства фреймворков XUnit на основе пакета SUnit, созданного Кентом Беком. PHPUnit разработан Себастьяном Бергманом.
Основная идея PHPUnit – чем раньше вы обнаружите ошибки в коде, тем быстрее вы сможете их исправить. Как и все фреймворки для unit тестирования PHPUnit использует assertions (утверждения) для проверки, что конкретный компонент ведёт себя как и ожидалось.
Полезные ссылки:
Codeception — это популярный фреймворк для тестирования веб-приложений. Он написан поверх PHPUnit и позволяет более элегантно писать тесты используя методологию BDD. BDD (behaviour-driven development) — это разработка, основанная на описании поведения, что облегчает написание и чтение кода тестов. Поддерживает приемочные, функциональные и unit тесты.
Полезные ссылки:
Behat — это фреймворк для тестирования, использующий методологию BDD. Behat был создан Константином Кудряшовым, а его разработка ведется на GitHub. Behat предназначен для облегчения общения между разработчиками, клиентами и другими заинтересованными сторонами в процессе разработки программного обеспечения.
Полезные ссылки:
Веб-фреймворк – фреймворк, предназначенный для создания динамических веб-сайтов, сетевых приложений, сервисов или ресурсов. Он упрощает разработку и избавляет от необходимости написания рутинного кода. Многие фреймворки упрощают доступ к базам данных, разработку интерфейса, и также уменьшают дублирование кода. Большая часть фреймворков веб-приложений реализует шаблон проектирования Model-View-Controller (MVC). Однако, также могут использоваться и другие шаблоны, например, Model-View-Presenter или Model-View-ViewModel.
Symfony – фреймворк с открытым исходным кодом, написанный на PHP.
Symfony обеспечивает быструю разработку и управление веб-приложениями, позволяет легко решать рутинные задачи веб-программиста. Работает только с PHP 5 и выше. Symfony бесплатен и публикуется под лицензией MIT. Проект спонсируется французской компанией SensioLabs.
Полезные ссылки:
Laravel – бесплатный веб-фреймворк с открытым кодом, предназначенный для разработки с использованием архитектурной модели MVC. Он выпущен под лицензией MIT. Исходный код проекта размещается на GitHub. Laravel был создан Taylor Otwell как более функциональная альтернатива CodeIgniter, который не предусматривал различные дополнительные функции.
Полезные ссылки:
Yii – объектно-ориентированный компонентный фреймворк, реализующий парадигму MVC. Фреймворк отлично документирован: документация есть ко всему и на нескольких языках (русский, украинский, английский, испанский и другие). Аналогично другим фреймворкам в Yii используются паттерны Dependency Injection (DI) и Service Locator. Yii выпущен под модифицированной лицензией BSD. Это означает, что можно использовать его бесплатно для разработки как открытых, так и проприетарных веб-приложений.
Полезные ссылки:
CakePHP — это фреймворк для создания веб-приложений, написанный на языке PHP и построенный на принципах открытого ПО. CakePHP реализует паттерн MVC. Публикуется под лицензией MIT.
Изначально создавался как клон популярного Ruby on Rails, и многие идеи были заимствованы именно оттуда:
- Своя файловая структура
- Поддержка множества плагинов
- Абстракция данных
- Поддержка множества СУБД (PostgreSQL, MySQL, SQLite)
Полезные ссылки:
Лог (log) — это хронологическая запись наиболее значимой информации о работе системы. Подобная фиксация событий дает представление и том, что происходило в системе, в какой именно момент, какой пользователь спровоцировал то или иное событие, какие ошибки возникли и т. д.
Логирование — это процесс формирования логов, а именно: фиксация и структурирование информации о работе системы в отдельные лог-файлы с возможностью быстрого доступа к ним в случае необходимости. Файлы содержат отчет обо всем, что происходило с системой: какие действия совершали конкретные пользователи, когда это происходило, как система реагировала на события и т.д.
В этом документе описывается общий интерфейс для библиотеки логирования.
Главная цель позволить библиотекам получать обьект Psr\Log\LoggerInterface и записывать в него логи простым и универсальным способом. Фреймворки и CMS могут расширить интерфейс для своих собственных целей, но должны оставаться совместимыми с этим документом.
Полезные ссылки:
Monolog — одна из популярных PHP-библиотек логирования, позволяющая передавать логи в файлы, сокеты, почтовые ящики, базы данных и различные веб-сервисы. Полный список обработчиков моно найти на GitHub. Эта библиотека реализует интерфейс PSR-3, чтобы обеспечить максимальную совместимость. Доступен из коробки в Symfony и Laravel и устанавливается с помощью плагинов в Yii и CakePHP.
Полезные ссылки:
Sentry — это ориентированная на разработчиков платформа для отслеживания ошибок и мониторинга производительности, которая помогает разработчикам понимать, что действительно важно, быстрее решать проблемы и постоянно узнавать что-то новое о своих приложениях. Поддерживает множество языков в том числе и PHP. Интеграция с Symfony и Laravel разрабатывается и поддерживается официальной командой Sentry, для Yii и CakePHP доступны плагины от членов сообщества Sentry.
Полезные ссылки:
Профилирование — это сбор характеристик программы во время ее выполнения. При профилировании замеряется время выполнения и количество вызовов отдельных функций и строк в коде программы. При помощи этого инструмента программист может найти наиболее медленные участки кода и провести их оптимизацию. Инструмент, используемый для анализа работы, называют профилировщиком или профайлером.
XHProf — PHP-расширение от Facebook. Это иерархический профайлер, который позволяет собирать такую статистику как время выполнения каждой функции, использование памяти, время ожидания, количество вызовов и многое другое. Это расширение доступно из репозитория PECL: http://pecl.php.net/package/xhprof.
Полезные ссылки:
Blackfire Profiler — это инструмент, который позволяет PHP-приложениям собирать данные о потребляемых ресурсах сервера, таких как память, процессорное время и операции ввода-вывода.
Полезные ссылки:
- Bouras Aristides S. PHP and Algorithmic Thinking for the Complete Beginner, 2nd Edition. — CreateSpace Independent Publishing Platform, 2020. — 1094 p.
- Engebreth G., Sahu S.K. PHP 8 Basics: For Programming and Web Development, Apress, 2023. — 335 p.
- Guleria Pratiyush. PHP: Beginner’s Practical Guide, BPB Publications, 2021 — 109 p.
- Learn PHP Basics of PHP Language, SrinivasIT.com., 2019. — 127 p.
- Lentzner Remy. Getting started with PHP & MySQL: Professional training, Remylent, 2021. — 110 p.
- Olsson M. PHP 8 Quick Scripting Reference. A Pocket Guide to PHP Web Scripting, 3rd ed. — Apress, 2020. — 188 p.
- Pratt Logan. PHP: Advanced Guide to Learn the Realms of PHP Programming, Amazon.com Services LLC, 2021. — 212 p.
- Sarabia R. Test-Driven Development with PHP 8: Build extensible, reliable, and maintainable enterprise-level applications using TDD and BDD with PHP, Birmingham: Packt Publishing, 2023. – 336 p.
- William Emma. PHP and MySQL: PHP Programming and MySQL For Beginners, Amazon.com Services LLC., 2020. — 146 p.
- Uzayr S. PHP: The Ultimate Guide, CRC Press, 2022. — 404 p.
- Лукьянов Михаил. PHP. Полное руководство и справочник функций, СПб.: Наука и Техника, 2020. — 432 с.
- Никсон Робин. Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript, CSS и HTML5, 6-е изд. — Пер. с англ. С. Черников. — СПБ.: Питер, 2023. — 832 с.: ил.
Системы контроля версий/исходного кода позволяют разработчикам отслеживать и контролировать изменения в коде с течением времени. Эти системы часто включают в себя возможность вносить атомарные изменения в код, осуществлять ветвление в определенных точек и сравнивать версий кода. Они позволяют определять кто, что, когда и почему были внесены изменения в код.
Полезные ссылки:
Git — это бесплатная распределенная система контроля версиями с открытым исходным кодом, предназначенная для быстрой и эффективной работы с любыми проектами, от небольших до очень крупных.
Полезные ссылки:
- Getting Started – About Version Control
- Git & GitHub Crash Course For Beginners
- Learn Git with Tutorials, News and Tips – Atlassian
- Git Cheat Sheet
Работая в команде, вам часто бывает необходим отдельный удаленный сервер для размещения вашего кода, чтобы другие члены могли получить к нему доступ, добавлять свои собственные ветки и создавать или просматривать пул-реквесты. Эти сервисы часто включают в себя механизмы для отслеживания ошибок, ревью кода и функционал для непрерывной интеграции. Наиболее популярными вариантами являются: GitHub, GitLab, BitBucket и AWS CodeCommit.
Полезные ссылки:
- Сравнение хостингов для проектов свободного программного обеспечения
- GitHub
- GitLab
- BitBucket
- How to choose the best source code repository
GitHub — это провайдер интернет-хостинга для разработки программного обеспечения и контроля версий с использованием Git. Он предоставляет весь Git функционал в плане распределенной системы контроля и управления исходным кодом, а также обладает рядом индивидуальных, своих собственных возможностей.
Полезные ссылки:
- GitHub Website
- GitHub Documentation
- How to Use Git in a Professional Dev Team
- What is GitHub?
- Git vs. GitHub: Whats the difference?
- Git and GitHub for Beginners
- Git and GitHub – CS50 Beyond 2019
GitLab — провайдер интернет-хостинга для разработки программного обеспечения и контроля версий с использованием Git. Он предоставляет весь Git функционал в плане распределенной системы контроля и управления исходным кодом плюс ряд только ему присущих возможностей.
Bitbucket — это сервис для размещения и хранения исходного кода на основе Git, который является альтернативой, разработанной Atlassian, другим продуктам, таким как GitHub, GitLab и т. д.
Bitbucket предлагает следующие варианты хостинга: Bitbucket Cloud (серверы Atlassian), Bitbucket Server (локально у клиента) или Bitbucket Data Center (группа серверов в локальной или облачной среде клиента).
Полезные ссылки:
- Bitbucket Website
- Getting started with Bitbucket
- Using Git with Bitbucket Cloud
- A brief overview of Bitbucket
- Bitbucket tutorial | How to use Bitbucket Cloud
- Bitbucket Tutorial | Bitbucket for Beginners
Реляционная база данных — это тип базы данных, которая хранит и предоставляет доступ к данным, связанным друг с другом. Реляционные базы данных хранят данные в виде набора таблиц. Связи между таблицами определяются с помощью внешних ключей. Внешний ключ — это уникальная ссылка из одной строки на другую строку в этой же или чаще всего другой таблице.
Полезные ссылки:
- Что такое реляционная база данных?
- Relational Databases
- 51 Years of Relational Databases
- Databases and SQL
- Intro To Relational Databases
- What is Relational Database
PostgreSQL или Postgres, представляет собой бесплатную систему управления реляционными базами данных с открытым исходным кодом, в которой особое внимание уделяется расширяемости и совместимости с SQL.
Полезные ссылки:
- PostgreSQL site
- Visit Dedicated PostgreSQL DBA Roadmap
- What is PostgreSQL
- Learn PostgreSQL – Full Tutorial for Beginners
- Learn PostgreSQL Tutorial – Full Course for Beginners
- Postgres tutorial for Beginners
MySQL — очень популярная система управления реляционными базами данных (RDBMS) с открытым исходным кодом. MySQL можно использовать как отдельный клиент или в сочетании с другими сервисами для подключения к базе данных. M в стеке LAMP означает MySQL; уже одно это должно дать представление о её распространенности.
Полезные ссылки:
MariaDB сервер — это ответвление MySQL сервера, разработанное сообществом. Основанная ключевыми членами оригинальной команды MySQL, MariaDB активно работает со сторонними разработчиками, чтобы создать стабильный, с наибольшими функциональными возможностями, с разумным подходом к лицензированию SQL-сервер с открытым исходным кодом в отрасли. MariaDB была создана с намерением стать более универсальной версией MySQL с возможностью замены налету с минимальными исправлениями.
Полезные ссылки:
- MariaDB site
- MariaDB vs MySQL
- W3Schools – MariaDB tutorial
- MariaDB Tutorial For Beginners in One Hour
MS SQL (или Microsoft SQL Server) — это разработанная Microsoft система управления реляционными базами данных (RDBMS). MS SQL использует язык запросов T-SQL (Transact-SQL) для взаимодействия с реляционными базами данных. Существует множество различных версий и редакций MS SQL.
Полезные ссылки:
Сервер базы данных Oracle, Oracle RDBMS или просто Oracle, является ведущей в мире системой управления реляционными базами данных, созданной корпорацией Oracle.
Полезные ссылки:
NoSQL базы данных предлагают хранить и извлекать данные иначе, чем «традиционные» реляционные базы данных. Базы данных NoSQL обычно больше ориентированы на горизонтальное масштабирование, согласованность в конечном счёте, скорость и гибкость и чаще всего используются для приложений с большим объёмом данных и потоковых приложений в реальном времени. NoSQL часто называют BASE (Basically Available (Базовая доступность), Soft-state (Неустойчивое состояние), Eventually consistent (Согласованность в конечном счёте)) системами и они являются противоположностью SQL/реляционным системам, где основопологающим является принцип ACID (Atomicity (Атомарность), Consistency (Согласованность), Isolation (Изоляция), Durability (Устойчивость)). Чаще всего в NoSQL используются следующие структуры для хранения данных: пара «ключ‑значение», «широкий столбец», граф и документ.
Полезные ссылки:
MongoDB — это кросс-платформенная, документоориентированная система управления базами данных с открытым исходным кодом. MongoDB относится к NoSQL системам управления базами данных и использует JSON-подобные документы с произвольной структурой. MongoDB разработана MongoDB Inc. и распространяется под лицензией Server Side Public License (SSPL).
Полезные ссылки:
- Документоориентированная СУБД
- MongoDB Википедия
- CouchDB Википедия
- MongoDB Website
- MongoDB Documentation
- MongoDB Online Sandbox
- Learning Path for MongoDB Developers
- Dynamo DB Docs
- Official Developers Guide
База данных с «широкими столбцами» (иногда называемая колоночной, столбчатой) похожа на реляционные БД. Как и реляционные, она хранит данные, в таблицах, строках и столбцах. Однако в отличие от реляционных баз данных здесь каждая строка может иметь разные названия и формат столбцов. Столбчатую БД можно считать двумерной базой данных типа «ключ-значение». Одной из таких СУБД является Apache Cassandra.
БД с «широкими столбцами» поддерживающими «семейства столбцов», также называют базами данных «семейства столбцов».
Замечание. Не путайте столбчатые БД с столбцовыми БД. Это два разных понятия!
Полезные ссылки:
- База данных с «широкими столбцами»
- Cassandra Википедия
- Apache Cassandra
- Apache Cassandra Database – Full Course for Beginners
- HBase Википедия
InfluxDB создавалась с нуля как специализированная база данных временных рядов, т. е. не была перепрофилирована в неё. Время было частью БД с самого начала. InfluxDB является частью комплексной платформы, которая поддерживает сбор, хранение, мониторинг, визуализацию и оповещение о данных временных рядов. Это гораздо больше, чем просто база данных временных рядов.
Полезные ссылки:
База данных реального времени в широком смысле определяется как хранилище данных, предназначенное для сбора, обработки и/или изменения входящей последовательности точек данных (т. е. потока данных) в реальном времени, как правило, сразу после создания данных.
Полезные ссылки:
Графовая база данных хранит узлы и отношения вместо таблиц или документов. Данные хранятся так, как если бы вы делали наброски идей на доске. Ваши данные хранятся не ограничиваясь заранее определенной моделью, что позволяет сильно расширить способы обработки и возможности их использования.
Полезные ссылки:
База данных «ключ-значение» (база данных KV) — это тип базы данных, в которой данные хранятся в виде набора пар «ключ-значение». В базе данных KV каждая часть данных идентифицируется уникальным ключом, а значением являются данные, связанные с этим ключом.
Базы данных KV предназначены для быстрого и эффективного хранения и извлечения данных, и они часто используются в приложениях, требующих высокой производительности и низкой задержки. Они особенно хорошо подходят для хранения больших объемов неструктурированных данных, таких как данные логов и профили пользователей.
Примерами популярных базы данных KV являются Redis, Memcached и LevelDB. Эти базы данных часто используются в сочетании с другими типами баз данных, такими как реляционные базы данных или документоориентированные базы данных, обеспечивая совершенное и масштабируемое решение для хранения данных.
Полезные ссылки:
Объектно-реляционное отображение (Object-Relational Mapping, ORM) — это технология, который позволяет вам запрашивать и манипулировать данными из базы данных, используя объектно-ориентированную концепцию. Говоря об ORM, большинство людей имеют в виду библиотеку, которая реализует технологию объектно-реляционного отображения, отсюда и фраза «ORM».
Полезные ссылки:
ACID — это четыре свойства систем управления реляционными базами данных, которые гарантируют надёжное выполнение транзакций. Это аббревиатура, обозначающая, что БД обладает следующими четырьмя свойствами: атомарность, согласованность, изоляция и устойчивость.
Полезные ссылки:
- Википедия
- What is ACID Compliant Database?
- What is ACID Compliance?: Atomicity, Consistency, Isolation
- ACID Explained: Atomic, Consistent, Isolated & Durable
Простыми словами, транзакция базы данных — это последовательность из нескольких операций, выполняемых в базе данных. При этом они являются единой логической единицей работы — выполняются полностью или не выполняются вовсе. Иначе говоря, никогда не бывает так, чтобы выполнялась только часть операций и были зафиксированы результаты.
Полезные ссылки:
Проблема с N+1 запросом возникает, когда ваш код выполняет N дополнительных операций для получения тех же данных, которые могли быть получены путём выполнения основного запроса
Полезные ссылки:
- What is the "N+1 selects problem" in ORM (Object-Relational Mapping)?
- Решение проблемы N+1 запроса без увеличения потребления памяти в Laravel
- In Detail Explanation of N+1 Problem
Нормализация базы данных — это процесс структурирования реляционной базы данных, который приводит её последовательно к так называемым нормальным формам, с целью уменьшения избыточности данных и улучшения целостности данных. Впервые она была предложена Эдгаром Ф. Коддом как часть его реляционной модели.
Нормализация приводит к организации столбцов (атрибутов) и таблиц (отношений) базы данных таким образом, чтобы их зависимости должным образом соблюдались благодаря ограничениям целостности базы данных. Это достигается путем применения некоторых формальных правил в процессе синтеза (создания новой структуры базы данных) или декомпозиции (улучшения структуры существующей базы данных).
Полезные ссылки:
- Википедия
- What is Normalization in DBMS (SQL)? 1NF, 2NF, 3NF, BCNF Database with Example
- Basic Concept of Database Normalization
Существует различные сбои, которые могут возникнуть в базе данных, в том числе:
- Конфликт при чтении: происходит, когда несколько клиентов или процессов пытаются одновременно прочитать данные из одного и того же места в базе данных, что может привести к задержкам или ошибкам.
- Конфликт при записи: происходит, когда несколько клиентов или процессов пытаются одновременно записать данные в одно и то же место в базе данных, что может привести к задержкам или ошибкам.
- «Неуправляемое стадо»: происходит, когда большое количество клиентов или процессов пытаются одновременно получить доступ к одному и тому же ресурсу, что может привести к исчерпанию ресурсов и снижению производительности.
- Каскад: происходит, когда сбой в одной части системы базы данных вызывает цепную реакцию, которая приводит к сбоям в других частях системы.
- Взаимная блокировка: происходит, когда две или более транзакций ждут друг друга, чтобы снять блокировку с ресурса, что приводит к их остановке.
- Повреждение: происходит, когда данные в базе данных повреждаются, что может привести к ошибкам или неожиданным результатам при чтении или записи в базу данных.
- Аппаратный сбой: происходит, когда аппаратные компоненты, такие как диски или память, выходят из строя, что может привести к потере или повреждению данных.
- Программный сбой: происходит, когда программные компоненты, такие как система управления базами данных или приложение, выходят из строя, что может привести к ошибкам или неожиданным результатам.
- Сбой сети: происходит, когда теряется сетевое соединение между базой данных и клиентом, что может привести к ошибкам или тайм-аутам при попытке доступа к базе данных.
- Атака типа «отказ в обслуживании» (DoS): происходит, когда злоумышленник пытается перегрузить базу данных запросами, что приводит к истощению ресурсов и снижению производительности.
Существует несколько способов собрать и проанализировать производительность базы данных:
- Мониторинг производительности системы. Вы можете использовать такие инструменты, как диспетчер задач Windows или команду top в Unix/Linux, для мониторинга производительности сервера базы данных. Эти инструменты позволяют увидеть общее использование ЦП, памяти и диска в системе, что может помочь выявить все проблемные места в потребляемых ресурсах.
- Используйте специальные инструменты для баз данных. Большинство систем управления базами данных (СУБД) имеют собственные инструменты для мониторинга производительности. Например, в Microsoft SQL Server существует SQL Server Management Studio (SSMS) и динамическое административное представление sys.dm_os_wait_stats, а в Oracle — Oracle Enterprise Manager и представление v$waitstat. Эти инструменты позволяют просматривать определенные показатели производительности, такие как количество времени, затраченное на ожидание при блокировках, или количество физических операций чтения и записи.
- Используйте сторонние инструменты: существует также несколько сторонних инструментов, которые могут помочь вам проанализировать производительность базы данных. Например, SolarWinds Database Performance Analyzer, Quest Software Foglight и Redgate SQL Monitor. Эти инструменты часто обеспечивают более глубокий анализ производительности и могут помочь вам выявить конкретные проблемы или узкие места.
- Анализ медленных запросов. Если у вас есть определенные запросы, которые выполняются медленно, вы можете использовать такие инструменты, как EXPLAIN PLAN или SHOW PLAN в MySQL или SQL Server, чтобы просмотреть план выполнения запроса и выявить возможные проблемы. Вы также можете использовать такие инструменты, как лог медленных запросов MySQL или SQL Server Profiler, для регистрации медленных запросов и их дальнейшего анализа.
- Мониторинг производительности приложения. Если у вас возникли проблемы с производительностью определенного приложения, использующего базу данных, вы можете использовать такие инструменты, как Application Insights или New Relic, для мониторинга производительности приложения и выявления любых проблем, которые могут быть связаны с базой данных.
Кроме того, ознакомьтесь с документацией базы данных, которую вы используете.
Индекс — это структура данных, создаваемая и задаваемая для существующей таблицы, которая по сути просматривает вашу таблицу и пытается проанализировать и обобщить данные, чтобы ускорить работу с ней.
Полезные ссылки:
- Википедия
- Что такое индексы базы данных (для начинающих)?
- An in-depth look at Database Indexing
- Database Indexing Explained
Репликация данных — это процесс, с помощью которого данные, находящиеся на физическом или виртуальном сервере (серверах) или облачном инстансе (основной инстанс), непрерывно реплицируются или копируются на вторичный сервер (серверы) или облачный инстанс (резервный инстанс). Компании реплицируют данные для поддержки высокой доступности, резервного копирования и/или аварийного восстановления.
Полезные ссылки:
Стратегия шардинга (сегментирования) — это метод разделения большого набора данных на более мелкие фрагменты (логический сегмент), в котором мы разносим эти фрагменты по разным машинам/узлам базы данных, чтобы распределить нагрузку трафика. Это хороший способ улучшения масштабируемости приложения. Многие базы данных поддерживают шардинг (сегментирование), но не все.
Полезные ссылки:
- Википедия
- System Design Interview Concepts – Database Sharding
- Database Sharding – System Design Interview Concept
- How sharding a database can make it faster
CAP — это акроним, расшифровывающийся как Consistency (согласованность данных), Availability (доступность) и Partition Tolerance (устойчивость к разделению). Согласно теореме CAP, любая распределенная система может гарантировать только два из трех свойств в любой момент времени. Невозможно обеспечить наличие всех трёх свойств одновременно.
Полезные ссылки:
- Википедия
- What is CAP Theorem?
- An Illustrated Proof of the CAP Theorem
- CAP Theorem and its applications in NoSQL Databases
- What is CAP Theorem?
REST, Representational State Transfer или «передача репрезентативного состояния» — это архитектурный стиль, определяющий стандарты между компьютерными системами в Интернете, что упрощает взаимодействие таких систем друг с другом.
Полезные ссылки:
- Representational State Transfer (REST)
- Википедия
- What is REST?
- What is a REST API?
- Roy Fieldings dissertation chapter, Representational State Transfer (REST)
- Learn REST: A RESTful Tutorial
JSON или JavaScript Object Notation — это формат кодирования, разработанный для устранения необходимости в специальном коде для каждого приложения, чтобы связываться с серверами, которые взаимодействуют определенным образом. JSON API модуль предоставляет реализацию для хранилищ и структур данных.
Полезные ссылки:
- Википедия
- A specification for building APIs in JSON
- JSON API Implementations
- JSON API: Explained in 4 minutes
Простой протокол доступа к объектам (SOAP, Simple Object Access Protocol) — это протокол обмена сообщениями для обмена информацией между системами и приложениями. Что касается интерфейсов прикладного программирования (API), SOAP API разрабатывается более структурированным и формализованным образом. Сообщения SOAP могут передаваться по различным протоколам более низкого уровня, включая, связанный с веб, протокол передачи гипертекста (HTTP).
Полезные ссылки:
gRPC — это высокопроизводительный универсальный RPC фреймворк с открытым исходным кодом.
RPC (Remote Procedure Call) означает удаленный вызов процедур, и продолжаются споры о том, что означает буква g. RPC — это протокол, который позволяет программе выполнять процедуру другой программы, расположенной на другом компьютере. Большим преимуществом является то, что разработчику не нужно писать код, отвечающий за детали удаленного взаимодействия. Удаленная процедура вызывается так же, как и любая другая функция. В то же время клиент и сервер могут быть написаны на разных языках.
Полезные ссылки:
GraphQL — это язык запросов и среда выполнения для API (интерфейсов прикладного программирования). Он предназначен для предоставления клиентам гибкого и эффективного способа запроса данных с серверов и часто используется в качестве альтернативы REST («передача репрезентативного состояния») API-интерфейсам.
Одной из основных особенностей GraphQL является возможность указывать именно те данные, которые необходимы, а не получать фиксированный набор данных от конечной точки. Это позволяет клиентам запрашивать только те данные, которые им нужны, и уменьшает объем данных, которые необходимо передать по сети.
GraphQL предоставляет способ определения структуры данных, возвращаемых сервером, что позволяет клиентам запрашивать данные предсказуемым и гибким способом. Это упрощает создание и поддержку клиентских приложений, зависящих от данных с сервера.
GraphQL широко используется в современных веб и мобильных приложениях; поддерживается большим и активным сообществом разработчиков.
Полезные ссылки:
HATEOAS — это акроним от Hypermedia As The Engine Of Application State. Это концепция, заключающаяся в том, что при отправке информации через RESTful API полученный документ должен содержать всё, что нужно клиенту для анализа и использования данных, т. е. ему не нужно связываться с какой-либо другой конечной точкой, явно не упомянутой в документе.
Полезные ссылки:
Спецификация OpenAPI (OpenAPI Specification, OAS) определяет стандартный, не зависящий от языка интерфейс для RESTful API, который позволяет людям и машинам обнаруживать и понимать возможности сервиса без доступа к исходному коду, документации или изучения сетевого трафика. При правильном определении потребитель может понимать и взаимодействовать с удаленным сервисом с минимальным количеством кода, реализующего логику.
Затем OpenAPI спецификация может использоваться инструментами создания документации для описания API, инструментами генерации кода для создания серверов и клиентов на различных языках программирования, инструментами тестирования, кроме того существует множество других вариантов применения.
Полезные ссылки:
- Знакомство со спецификациями OpenAPI и Swagger
- OpenAPI Specification Website
- Open API Live Editor
- Official training guide
- OpenAPI 3.0: How to Design and Document APIs with the Latest OpenAPI Specification 3.0
Процесс аутентификации API проверяет подлинность клиента, пытающегося установить соединение, используя протокол аутентификации. Протокол отправляет учетные данные от удаленного клиента, запрашивающего подключение к серверу удаленного доступа, в текстовом или зашифрованном виде. Затем сервер определяет, может ли он предоставить доступ к этому удаленному клиенту или нет.
Ниже представлен список распространенных способов аутентификации:
- JWT-аутентификация
- Аутентификация, используя токенов
- Аутентификация, используя сессии
- Базовая аутентификация
- OAuth — Open Authorization — открытый протокол (схема) авторизации
- SSO — Single Sign On — Технология единого входа
Полезные ссылки:
- Википедия
- User Authentication: Understanding the Basics & Top Tips
- An overview about authentication methods
- SSO – Single Sign On
- OAuth – Open Authorization
- JWT Authentication
- Token Based Authentication
- Session Based Authentication
- Basic Authentication
Cookies — это фрагменты данных, используемый для идентификации пользователя и его предпочтений. Браузер передаёт cookie на сервер каждый раз, когда запрашивается страница. Определенные cookies, такие как HTTP cookies, используются для выполнения аутентификации на основе cookie для сохранения сеанса для каждого пользователя.
Полезные ссылки:
OAuth расшифровывается как Open Authorization и является открытым стандартом авторизации. Он применяется для авторизации устройств, API, серверов и приложений с использованием токенов доступа, а не учетных данных пользователя, что также называют «безопасным делегированным доступом».
В самом простом своём варианте OAuth делегирует аутентификацию таким сервисам, как Facebook, Amazon, Twitter, и разрешает сторонним приложениям получать доступ к учетной записи пользователя без необходимости ввода логина и пароля.
Он в основном используется для REST/APIs и предоставляет доступ только к ограниченному объему пользовательских данных.
Полезные ссылки:
- Википедия
- Okta – What the Heck is OAuth
- DigitalOcean – An Introduction to OAuth 2
- What is OAuth really all about
- OAuth 2.0: An Overview
Исходя из названия «Базовая аутентификация», не следует путать базовую аутентификацию со стандартной аутентификацией по имени пользователя и паролю. Базовая аутентификация является частью спецификации HTTP, и более подробную информацию о ней можно найти в стандарте RFC7617.
Поскольку это часть спецификаций HTTP, все браузеры имеют встроенную поддержку «HTTP базовой аутентификации».
Полезные ссылки:
Аутентификация, используя токены — это протокол, который позволяет пользователям подтверждать свою личность и взамен получать уникальный токен доступа. В течение срока действия токена пользователи затем получают доступ к веб-сайту или приложению, для которого был выпущен токен, вместо того, чтобы повторно вводить учетные данные каждый раз, когда они переходят на веб-страницу, приложение или любой ресурс, защищенный тем же токеном.
Токены аутентификации работают так же как прокомпостированный билет в общественном транспорте. Пользователь сохраняет доступ до тех пор, пока токен остается валидным, действительным, действующим (пассажир может пользователься услугами общественного транспорта, не опасаясь встречи с контролёром, пока у него на руках прокомпостированный билет). Как только пользователь выходит из системы или закрывает приложение, токен становится недействительным (пассажир выходит из общественного транспорта, прокомпостированный билет нельзя использовать повторно, нужно покупать новый).
Аутентификация, используя токены, отличается от традиционных методов аутентификации на основе пароля или сервера. Токены предлагают дополнительный уровень безопасности, а администраторы имеют большую полноту контроля над каждым действием и транзакцией.
Но использование токенов требует некоторого ноу-хау при написании кода. Большинство разработчиков быстро осваивают методологии, но существует кривая обучения.
Полезные ссылки:
JWT сокращение от JSON Web Token — это открытый стандарт/методология шифрования с использованием токенов, который используется для безопасной передачи информации в виде JSON объекта. Клиенты и серверы используют JWT для безопасного обмена информацией, при этом JWT содержит закодированные JSON объекты и claims. JWT токены создавались таким образом, чтобы быть компактными, безопасными для использования в URL-адресах и идеально подходить в тех случаях, где используется SSO (Single Sign On — Технология единого входа).
Полезные ссылки:
- Википедия
- Про токены, JSON Web Tokens (JWT), аутентификацию и авторизацию
- LocalStorage vs Cookies: All You Need To Know About Storing JWT Tokens Securely in The Front-End
- The JWT Handbook by Sebastián E. Peyrott, Auth0 Inc.
- jwt.io Website
- Introduction to JSON Web Tokens
- What is JWT?
- What Is JWT and Why Should You Use JWT
- What is JWT? JSON Web Token Explained
OpenID — это протокол, который использует механизмы авторизации и аутентификации OAuth 2.0 и в настоящее время широко применяется многими провайдерами идентификационных данных в Интернете. Он решает проблему необходимости обмена личной информацией пользователя между множеством различных веб-сервисов (например, интернет-магазинами, форумами и т. д.).
Полезные ссылки:
- Википедия
- Official Website
- What is OpenID
- OAuth vs OpenID
- An Illustrated Guide to OAuth and OpenID Connect
SAML (Security Assertion Markup Language) расшифровывается как язык разметки декларации безопасности. Это стандарт на основе XML для обмена данными аутентификации и авторизации между сторонами, в частности между провайдером идентификационных данных (identity provider, IdP) и провайдером сервиса (service provider, SP). В системе на основе SAML пользователь запрашивает доступ к защищенному ресурсу. Провайдер сервиса просит провайдера идентификационных данных аутентифицировать пользователя и подтвердить, предоставлен ли ему доступ к ресурсу.
К преимуществам использования SAML относят следующие:
- Технология единого входа (SSO): пользователи могут один раз войти в IdP и получить доступ к нескольким провайдерам сервисов без необходимости повторной аутентификации.
- Улучшенная безопасность: провайдеру сервиса не требуется хранить пароли и учетные данные пользователей и управлять ими, что снижает потенциальные векторы атак.
- Повышенная эффективность: поскольку пользователям больше не нужно хранить несколько наборов учётных данных, управление доступом становится проще как для пользователя, так и для системных администраторов.
- Совместимость: SAML позволяет широкому спектру приложений работать вместе, независимо от используемых технологий или платформы.
В архитектуре SAML задействованы три основных компонента:
- Провайдер идентификационных данных (IdP): объект, который управляет идентификационными данными пользователей и аутентифицирует их, предоставляя токены безопасности, также называемые декларациями.
- Провайдер сервиса (SP): объект, который предоставляет сервис (например, веб-приложение или API) и полагается на поставщика идентификационных данных для аутентификации пользователей и предоставления/отказа в доступе к ресурсам.
- Пользователь/Выгодополучатель: конечный пользователь, которому требуется доступ к сервису, предоставляемый провайдером сервиса.
Процесс аутентификации SAML состоит из следующих шагов:
- Пользователь запрашивает доступ к защищенному ресурсу у провайдером сервиса.
- Если пользователь ещё не аутентифицирован, провайдер сервис генерирует и отправляет запрос аутентификации SAML провайдеру идентификационных данных.
- Провайдер идентификационных данных аутентифицирует пользователя (используя, например, имя пользователя и пароль, многофакторную аутентификацию или другой метод).
- Провайдер идентификационных данных создает ответ SAML, который включает в себя сведения о пользователе и декларирует, авторизован ли пользователь для получения доступа к запрошенному ресурсу.
- Ответ SAML отправляется обратно провайдеру сервиса, как правило, через веб-браузер пользователя или API клиент.
- Провайдер сервиса обрабатывает ответ SAML, извлекает необходимую информацию и предоставляет или запрещает доступ пользователю на основе декларации провайдера идентификационных данных.
С помощью SAML вы можете оптимизировать аутентификацию и авторизацию пользователей в различных приложениях и системах, повышая удобство работы пользователей и повышая общую безопасность бекэнда.
Полезные ссылки:
Кэширование — это метод хранения часто используемых данных или информации в локальной памяти в течение определенного периода времени. Таким образом, в следующий раз, когда клиент запрашивает ту же информацию, вместо извлечения информации из базы данных она выдаётся из локальной памяти. Основное преимущество кэширования заключается в том, что оно повышает производительность за счет снижения нагрузки, связанной с логикой обработки запроса.
Сервис сети доставки содержимого (Content Delivery Network (CDN)) предназначен для обеспечения высокой доступности и повышения производительности веб-сайтов. Это достигается за счет быстрой доставки ресурсов и содержимого веб-сайта, как правило, с помощью географически более близко расположенных серверов относительно клиентов, запрашивающих информацию. Все платные CDN (Amazon CloudFront, Akamai, CloudFlare и Fastly) предоставляют серверы по всему миру, которые можно использовать для этой цели. Отправка ресурсов и содержимого через CDN снижает нагрузку на хостинге веб-сайтов, обеспечивает дополнительный уровень кэширования для уменьшения возможных сбоев и может также повысить безопасность веб-сайта.
Полезные ссылки:
- Википедия
- CloudFlare – What is a CDN? | How do CDNs work?
- What is Cloud CDN?
- What is a Content Delivery Network (CDN)?
Помимо настройки правильных заголовков ответа и обработки заголовков запроса, существует множество разных моментов, которые вы могли бы улучшить на стороне сервера и приложения.
Первый подход к более быстрым ответам и экономии ресурсов — настройка кэш-сервера между приложением и клиентом.
Такие инструменты, как Varnish, Squid и nginx кэшируют изображения, скрипты и прочее содержимое, которое требуется пользователям.
Кэширование на стороне сервера временно сохраняет веб-файлы и данные на исходном сервере для последующего повторного использования.
Когда пользователь впервые запрашивает веб-страницу, проходит обычный процесс получения данных с сервера и создается или собирается веб-страница веб-сайта. После выполнения запроса и отправки ответа сервер копирует веб-страницу и сохраняет её в виде кеша.
В следующий раз, когда пользователь повторно посещает веб-сайт, он загружает уже сохраненную или кэшированную копию веб-страницы, что ускоряет его работу.
Полезные ссылки:
Redis — это хранилище структур данных в памяти с открытым исходным кодом (распространяемое под лицензией BSD), используемое в качестве базы данных, кеша, брокера сообщений и механизма потоковой передачи. В Redis реализованы такие структуры данных как строки, хэши, списки, наборы, отсортированные наборы с возможностью ограничения по диапазону, битовые карты, hyperloglogs, геопространственные индексы и потоки. Redis имеет встроенную поддержку репликации, Lua сценариев, алгоритмов кэширования, транзакций и различных режимов сохранения на диск, а также обеспечивает высокую доступность с помощью Redis Sentinel и автоматическое масштабирование с помощью Redis Cluster.
Полезные ссылки:
Memcached — это универсальная распределенная система кэширования в памяти. Он часто используется для ускорения динамических веб-сайтов, управляемых базами данных, путем кэширования данных и объектов в ОЗУ, чтобы уменьшить количество запросов к внешнему источнику данных (например, базу данных или API). Memcached — это бесплатное программное обеспечение с открытым исходным кодом, распространяемое под лицензией Revised BSD. Memcached можно запустить в Unix-подобных операционных системах (Linux и macOS) и в Microsoft Windows. Система требует наличия в ОС библиотеки libevent
.
API-интерфейсы Memcached предоставляют доступ к очень большой хеш-таблице, распределенной по нескольким машинам. Когда таблица заполнена, последующие вставки приводят к удалению старых данных, которые дольше всего не запрашивались (LRU). Приложения, использующие Memcached, обычно пытаются найти данные, требуемые для выполнения входящих запросов, в оперативной памяти, а в случае неудачи переходят к использованию более медленного резервного хранилища, такого как база данных.
Memcached не имеет внутреннего механизма для отслеживания промахов кэша, которые могут произойти. Однако некоторые сторонние утилиты предоставляют эту функциональность.
Полезные ссылки:
Кэширование на стороне клиента — это хранение сетевых данных в локальном кеше для повторного использования в будущем. После того, как приложение получает сетевые данные, оно сохраняет этот ресурс в локальном кэше. После кэширования ресурса браузер использует кэш при будущих запросах этого ресурса для повышения производительности.
Полезные ссылки:
Кэширование на уровне приложения сокращает время выполнения определённых операций. В качестве примера можно привести комплексные вычисления, запросы данных к другим сервисам или общие данные, используемые в одинаковых запросах.
Полезные ссылки:
Безопасность в сети относится к защитным мерам, принимаемым разработчиками для защиты веб-приложений от угроз, которые могут повлиять на его работу.
Полезные ссылки:
- Why HTTPS Matters
- Википедия – OWASP
- OWASP Web Application Security Testing Checklist
- OWASP Top 10 Security Risks
- OWASP Cheatsheets
- Content Security Policy (CSP)
Хеш-функция – функция, осуществляющая преобразование массива входных данных произвольной длины в выходную битовую строку фиксированной длины, выполняемое определённым алгоритмом. Преобразование, производимое хеш-функцией, называется хешированием. Основная идея используемых в данном случае функций — применение детерминированного алгоритма. Речь идет об алгоритмическом процессе, выдающем уникальный и предопределенный результат при получении входных данных. То есть при приеме одних и тех же входных данных будет создаваться та же самая строка фиксированной длины (использование одинакового ввода каждый раз приводит к одинаковому результату). Детерминизм — важное свойство этого алгоритма. И если во входных данных изменить хотя бы один символ, будет создан совершенно другой хеш.
Полезные ссылки:
MD5 (Message-Digest Algorithm 5) — это хеш-функция, которую в настоящее время не рекомендуется использовать из-за большого количества уязвимостей, связанных с ней. Она по-прежнему используется в качестве контрольной суммы для проверки целостности данных.
Полезные ссылки:
- Википедия
- Шифрование в MD5 больше не безопасно: интерактивный тест на реальный взлом вашего пароля
- What is MD5?
- Why is MD5 not safe?
SHA (Secure Hash Algorithms, алгоритмы криптографического хеширования) — это семейство криптографических хэш-функций, созданных Национальным институтом стандартов и технологий (NIST). В семейство входят:
- SHA-0: опубликован в 1993 году, это первый алгоритм в семействе. Вскоре после публикации его использование было прекращено из-за нераскрытого существенного недостатка.
- SHA-1: создан для замены SHA-0 и напоминает MD5, этот алгоритм считается небезопасным с 2010 года.
- SHA-2: это не алгоритм, а набор алгоритмов, наиболее популярными из которых являются SHA-256 и SHA-512. SHA-2 по-прежнему безопасен и широко используется.
- SHA-3: создан благодаря конкурсу на новую хеш-функцию, организованный Национальным институтом стандартов и технологий. Новейший член семейства. SHA-3 наиболее безопасен и не имеет тех же конструктивных недостатков, что и его собратья.
Полезные ссылки:
scrypt — это функция хэширования паролей (похожая на bcrypt). Разрабатывалась с целью усложнить аппаратные реализации путём увеличения количества ресурсов, требуемых для вычисления. Это затрудняет атаки методом полного перебора или «грубой силы». Scrypt в основном используется в качестве алгоритма доказательства выполненной работы (proof-of-work) в криптовалютах.
Полезные ссылки:
bcrypt — это функция хеширования паролей, которая доказала свою надежность и безопасность с момента её публикации в 1999 году. Она была реализована во всех наиболее часто используемых языках программирования.
Полезные ссылки:
Полезные ссылки:
HTTPS — это безопасный способ передачи данных между веб-сервером и браузером.
Связь через HTTPS начинается с этапа рукопожатия, во время которой сервер и клиент договариваются о том, как шифровать связь, в частности, они выбирают алгоритм шифрования и секретный ключ. После рукопожатия вся связь между сервером и клиентом будет зашифрована с использованием согласованного алгоритма и ключа.
На этапе рукопожатия используется особый тип криптографии, называемый асимметричной криптографией, для безопасной связи, даже если клиент и сервер ещё не согласовали секретный ключ. После фазы рукопожатия связь HTTPS шифруется с помощью симметричной криптографии, которая намного эффективнее, но требует, чтобы и клиент, и сервер знали секретный ключ.
Полезные ссылки:
- Почему протокол HTTPS так важен
- What is HTTPS?
- Why HTTPS Matters
- Enabling HTTPS on Your Servers
- How HTTPS works (comic)
- SSL, TLS, HTTP, HTTPS Explained
- HTTPS — Stories from the field
- HTTPS explained with carrier pigeons
Content Security Policy (CSP, политика защиты контента) — это стандарт компьютерной безопасности, введенный для предотвращения межсайтового скриптинга, кликджекинга и других атак путем внедрения кода, возникающих в результате выполнения вредоносного содержимого на веб-странице, которой доверяет пользователь.
Полезные ссылки:
Cross-Origin Resource Sharing (CORS, «совместное использование ресурсов между разными источниками») — это механизм, основанный на HTTP-заголовке, который позволяет серверу указывать любые источники (домен, схему или порт), кроме своего собственного, из которых браузер должен разрешать загрузку ресурсов.
Полезные ссылки:
- Cross-Origin Resource Sharing (CORS)
- Cross-Origin Resource Sharing
- CORS in 100 Seconds
- CORS in 6 minutes
Secure Sockets Layer (SSL, «слой защищённых сокетов») и Transport Layer Security (TLS, «протокол защиты транспортного уровня») — это криптографические протоколы, используемые для обеспечения безопасности интернет-коммуникаций. Эти протоколы шифруют данные, которые передаются через Интернет, поэтому любой, кто попытается перехватить пакеты, не сможет их интерпретировать. Одно из отличий, которое важно знать, заключается в том, что SSL в настоящее время признан устаревшим из-за проблем с безопасностью, и большинство современных веб-браузеров больше не поддерживают его. Но TLS по-прежнему безопасен и широко поддерживается, поэтому желательно использовать TLS.
Полезные ссылки:
- Подробное описание SSL/TLS и его криптографической системы
- Википедия – SSL/TLS
- Cloudflare – What is SSL?
Периодически OWASP составляет список TOP-10 самых распространенных векторов атак на современные веб-приложения.
Полезные ссылки:
Изучите материалы, связанные с безопасностью вашего сервера и о том, как его защитить. Вот о чём следует позаботиться в первую очередь:
- Используйте брандмауэр. Один из самых эффективных способов защитить сервер — использовать брандмауэр для блокировки всего ненужного входящего трафика. Для этого вы можете использовать
iptables
в Linux системах или аппаратный брандмауэр. - Закройте ненужные порты: обязательно закройте все порты, которые не нужны для правильной работы вашего сервера. Это уменьшит число возможных направлений атак на ваш сервер и затруднит получение злоумышленниками доступа.
- Используйте надежные пароли. Используйте длинные и сложные пароли для всех своих учетных записей и рассмотрите возможность использования диспетчера паролей для их безопасного хранения.
- Поддерживайте свою систему в актуальном состоянии. Обязательно обновляйте операционную систему и программное обеспечение, используя свежие патчи для исправления ошибок безопасности. Это поможет предотвратить использование уязвимостей злоумышленниками.
- Используйте SSL/TLS для передачи информации: используйте Secure Sockets Layer (SSL) или Transport Layer Security (TLS) для шифрования информации между вашим сервером и клиентскими устройствами. Это поможет защититься от атак типа «злоумышленник посередине» (man-in-the-middle attack) и других типов киберугроз.
- Используйте систему обнаружения несанкционированного проникновения (IDS): IDS отслеживает сетевой трафик и предупреждает вас о любых подозрительных действиях, что может помочь вам своевременно выявлять потенциальные угрозы и реагировать на них.
- Включите двухфакторную аутентификацию. Двухфакторная аутентификация добавляет дополнительный уровень безопасности вашим учетным записям, требуя второй формы аутентификации, такой как код, отправленный на ваш телефон, в дополнение к вашему паролю.
Также узнайте об OpenSSL, о создании собственной PKI, а также об управлении сертификатами, обновлениями и взаимной аутентификацией клиентов с помощью сертификатов x509.
Ключом к созданию программного обеспечения, отвечающего требованиям и не имеющего недочётов, является тестирование. Тестирование программного обеспечения помогает разработчикам понять, что они создают правильное программное обеспечение. Когда тесты запускаются как часть процесса разработки (часто с использованием инструментов непрерывной интеграции), они укрепляют доверие к написанному коду и предотвращают ухудшения качества кода.
Полезные ссылки:
Unit тестирование — это тестирование отдельных составляющих (модулей, функций/методов, подпрограмм и т. д.) программного обеспечения, чтобы убедиться в правильности их работы. Это низкоуровневое тестирование обеспечивает функциональную надежность небольших компонентов и снимает нагрузку с высокоуровневых тестов. Как правило, разработчик пишет эти тесты в процессе разработки, и они выполняются как автоматизированные тесты.
Полезные ссылки:
К интеграционному тестированию относится обширная категория тестов, в которых несколько программных модулей интегрируются и тестируются как группа. Оно предназначено для проверки взаимодействия между несколькими сервисами, ресурсами или модулями. Например, взаимодействие API с бэкенд сервисом или сервиса с базой данных.
Полезные ссылки:
- Википедия – Интеграционное тестирование
- Integration Testing
- How to Integrate and Test Your Tech Stack
- What is Integration Testing?
Функциональное тестирование — это проверка программного обеспечения на соответствие функциональным требованиям. Обычно это разновидность тестирования методом «чёрного ящика», при которой тестер не понимает исходный код; тестирование выполняется путем предоставления входных данных и сравнения ожидаемых/фактических результатов. Ему притипоставляется нефункциональное тестирование, которое включает тестирование производительности, нагрузки, масштабируемости и несанкционированного проникновения.
Полезные ссылки:
- Функциональное тестирование
- Non-functional testing
- What is Functional Testing?
- Functional Testing vs Non-Functional Testing
CI/CD (непрерывная интеграция/непрерывное доставка) — это практика автоматизации сборки, тестирования и развертывания приложений с основной целью раннего обнаружения проблем и более быстрого выпуска релизов в продакшен.
Полезные ссылки:
- CI/CD
- DevOps CI/CD Explained in 100 Seconds by Fireship
- Automate your Workflows with GitHub Actions
- What is CI/CD?
- A Primer: Continuous Integration and Continuous Delivery (CI/CD)
- 3 Ways to Use Automation in CI/CD Pipelines
- Articles about CI/CD
Непрерывная интеграция – это практика разработки программного обеспечения, при которой разработчики регулярно объединяют изменения программного кода в центральном репозитории, после чего автоматически выполняется сборка, тестирование и запуск. Понятие непрерывной интеграции чаще всего применяется к стадии сборки или интеграции процесса выпуска ПО и включает в себя как компонент автоматизации (например, сервис непрерывной интеграции или сборки), так и компонент культуры разработки (например, обучение частой интеграции). Главная задача непрерывной интеграции – быстрее находить и исправлять ошибки, улучшать качество ПО и сокращать временные затраты на проверку и выпуск новых обновлений ПО.
Полезные ссылки:
Непрерывная доставка – это практика разработки программного обеспечения, когда при любых изменениях в программном коде выполняется автоматическая сборка, тестирование и подготовка к окончательному выпуску. Непрерывная доставка является одним из основополагающих принципов разработки современных приложений, поскольку расширяет практику непрерывной интеграции за счет того, что все изменения кода после стадии сборки развертываются в тестовой и/или в продакшен среде. При правильном внедрении у разработчиков всегда будет готовый к развертыванию собранный экземпляр ПО, прошедший стандартизированную процедуру тестирования.
Полезные ссылки:
В этом разделе мы обсудим некоторые основные принципы разработки и проектирования, которым необходимо следовать при создании бэкенд части любого приложения. Эти принципы обеспечат эффективность, масштабируемость и удобство сопровождения бэкенда.
1. Разделение ответственности (SoC) Разделение ответственности — это фундаментальный принцип, согласно которому различные функции системы должны быть максимально независимыми. Этот подход улучшает удобство сопровождения и масштабируемость, позволяя разработчикам работать над отдельными компонентами, не влияя друг на друга. Разделите бэкенд на четко выраженные модули и уровни, такие как хранилище данных, бизнес-логика и сетевое взаимодействие.
2. Повторное использование Повторное использование — это возможность использовать компоненты, функции или модули в нескольких местах без дублирования кода. При разработке бэкенда ищите возможности повторного использования существующего кода. Используйте такие методы, как создание вспомогательных функций, абстрактных классов и интерфейсов, чтобы повысить возможность повторного использования и уменьшить дублирование.
3. Чем проще, тем лучше (KISS) Принцип KISS гласит, что чем проще система, тем легче ее понять, поддерживать и расширять. При проектировании бэкенда старайтесь максимально упростить архитектуру и код. Используйте четкие соглашения об именах и модульные структуры и избегайте чрезмерных технических усложнений и ненужной сложности.
4. Не повторяйтесь (DRY) Не дублируйте код или функции в вашем бэкенде. Дублирование может привести к несогласованности и проблемам сопровождения. Вместо этого сосредоточьтесь на создании повторно используемых компонентов, функций или модулей, которые можно использовать в разных частях бэкенда.
5. Масштабируемость Масштабируемая система — это система, которая может эффективно работать при увеличении числа пользователей, запросов или данных. Разрабатывая бэкенд с учетом масштабируемости, особое внимание уделите хранению данных, кэшированию, балансировке нагрузки и горизонтальному масштабированию (добавление дополнительных экземпляров бэкенд сервера).
6. Безопасность О безопасности всегда следует серьёзно заботиться при разработке любого приложения. Всегда следуйте лучшим практикам для предотвращения брешей в системе безопасности, таким как защита конфиденциальных данных, использование безопасных протоколов передачи информации (например, HTTPS), внедрение механизмов аутентификации и авторизации и проверка вводимых пользователем данных.
7. Тестирование Тестирование имеет решающее значение для обеспечения надежности и стабильной работы бэкенда. Внедрите комплексную стратегию тестирования, включающую unit тесты, интеграционные тесты и тесты производительности. Используйте инструменты автоматизированного тестирования и настройте конвейеры непрерывной интеграции (CI) и непрерывного развертывания (CD), чтобы упростить процесс тестирования и развертывания.
8. Документация Надлежащая документация помогает разработчикам понимать и поддерживать кодовую базу бэкенда. Напишите четкую и краткую документацию для своего кода, объясняющую цель, функциональность и способы его использования. Кроме того, используйте комментарии и принятые соглашения об именах, чтобы сделать сам код более читабельным и не требующим пояснений.
Следуя этим принципам разработки и проектирования, вы сможете создать эффективный, безопасный и удобный в сопровождении бэкенд для своих приложений.
Полезные ссылки:
- DesignPatternsPHP
- Паттерны проектирования
- Основные принципы проектирования программного обеспечения и виды архитектур приложений
Шаблоны проектирования — это типичные решения часто встречающихся проблем при проектировании программного обеспечения. Их можно разделить на три категории:
- Порождающие шаблоны для создания объектов
- Структурные шаблоны, обеспечивающие взаимосвязь между объектами
- Поведенческие шаблоны, помогающие определить, как объекты взаимодействуют
Полезные ссылки:
- Порождающие шаблоны проектирования
- Структурные шаблоны проектирования
- 2.1 Адаптер (Adapter/Wrapper)
- 2.2 Мост (Bridge)
- 2.3 Компоновщик (Composite)
- 2.4 Преобразователь Данных (Data Mapper)
- 2.5 Декоратор (Decorator)
- 2.6 Внедрение Зависимости (Dependency Injection)
- 2.7 Фасад (Facade)
- 2.8 Текучий Интерфейс (Fluent Interface)
- 2.9 Приспособленец (Flyweight)
- 2.10 Прокси (Proxy)
- 2.11 Реестр (Registry)
- Поведенческие шаблоны проектирования
- 3.1 Цепочка Обязанностей (Chain Of Responsibilities)
- 3.2 Команда (Command)
- 3.3 Итератор (Iterator)
- 3.4 Посредник (Mediator)
- 3.5 Хранитель (Memento)
- 3.6 Объект Null (Null Object)
- 3.7 Наблюдатель (Observer)
- 3.8 Спецификация (Specification)
- 3.9 Состояние (State)
- 3.10 Стратегия (Strategy)
- 3.11 Шаблонный Метод (Template Method)
- 3.12 Посетитель (Visitor)
- 4 Локатор Служб (Service Locator)
- 5 Хранилище (Repository)
- 6 Сущность-Атрибут-Значение (Entity–Attribute–Value)
- Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Паттерны объектно-ориентированного проектирования. – СПб.: Питер, 2020. – 448 с.: ил.
- Фаулер, Мартин. Шаблоны корпоративных приложений.: Пер. с англ. – М.: ООО "И. Д. Вильямс", 2016. – 544 с.: ил. – Парал. тит. англ.
- Мэтт Зандстра. PHP 8: объекты, шаблоны и методики программирования, 6-е издание, 2021.
Предметно-ориентированное проектирование (DDD) — это подход к разработке программного обеспечения, направленный на моделирование программного обеспечения в соответствии с предметной областью, основываясь на мнении экспертов в этой области.
С точки зрения объектно-ориентированного программирования это означает, что структура и язык программного кода (имена классов, методы классов, переменные классов) должны соответствовать предметной области. Например, если программное обеспечение обрабатывает запросы на кредитование, оно может иметь такие классы, как LoanApplication («Запрос на кредитование») и Customer («Клиент»), и такие методы, как AcceptOffer («Одобрить запрос») и Withdraw («Отказать в запросе»).
DDD связывает реализацию с эволюционирующейся моделью и преследует следующие цели:
- Сосредоточение внимания проекта на смысловом ядре (core domain) и логике предметной области;
- Заложение в основую сложных проектов модели предметной области;
- Инициирование творческого сотрудничества между техническими экспертами и экспертами в предметной области для итеративной доработки концептуальной модели, направленной на решение конкретных проблем предметной области.
Полезные ссылки:
- Betts Thomas (ed.), Domain-Driven Design in Practice, NY: InfoQ, 2018. – 36 p.
- Boyle M. Domain-Driven Design with Golang: Use Golang to create simple, maintainable systems to solve complex business problems, Birmingham: Packt Publishing, 2022. — 203 p.
- Brent Roose, LARAVEL BEYOND CRUD, 2020.
- Buenosvinos Carlos, Soronellas Christian, Akbary Keyvan. Domain-Driven Design in PHP, Packt Publishing, 2017. – 394 p.
- Chandrasekaran P., Krishnan K. Domain-Driven Design with Java – A Practitioner's Guide, Packt, 2022. – 302 p.
- DDD Europe, Domain-Driven Design: The First 15 Years, Leanpub.com, 2020. – 294 p.
- Griffin Jesse, Domain-Driven Laravel: Learn to Implement Domain-Driven Design Using Laravel, Apress Media LLC., 2020. — 621 p.
- Joo Martin. Domain-Driven Design with Laravel, Gumroad, 2022. – 259 р.
- Khononov Vlad Learning Domain-Driven Design: Aligning Software Architecture and Business Strategy, O’Reilly Media, Inc., 2021. — 340 p.
- Kumar A. Domain Driven Design with Spring Boot: Enterprise Application from scratch, 2018. — 268 p.
- Nair Vijay. Practical Domain-Driven Design in Enterprise Java: Using Jakarta EE, Eclipse MicroProfile, Spring Boot, and the Axon Framework, Apress, 2019. – 387 p.
- Percival H.J.W. et al. Architecture Patterns with Python Enabling Test-Driven Development, Domain-Driven Design, and Event-Driven Microservices, O'Reilly, 2020. – 292 p.
- Эванс Эрик. Предметно-ориентированное проектирование (DDD): структуризация сложных программных систем.: Пер. с англ. М.: ООО "И. Д. Вильямс", 2011. – 448 с.: ил. – Парал. тит. англ.
- Вервов Вон. Предметно-ориентированное проектирование: самое основное.:Пер. с англ. – СпВ.: ООО "Альфа-книга". 2017. – 160 с.: ил. – Парал. тит. англ.
- Вернов Вон. Реализация методов предметно-ориентированного проектирования.: Пер. с англ. – М.: ООО "И.Д. Вильямс", 2016. – 688 с.: ил. – Парал. тит. англ.
- Миллетт Скотт, Тьюн Ник. Предметно-ориентированное проектирование: Паттерны, принципы и методы, СПб.: Питер, 2017. — 832 с.: ил.
- Пример приложения с использованием DDD, Event Sourcing и CQRS на Symfony
Разработка через тестирование (TDD) — это процесс написания тестов на основе требований к программному обеспечению, которые не будут успешно пройдены до тех пор, пока не будет разработано программное обеспечение для удовлетворения этих требований. После прохождения этих тестов цикл повторяется для рефакторинга кода или разработки других функциональных возможностей/требований. Теоретически это гарантирует, что программное обеспечение будет написано с учетом требований наиболее простым из возможных способов и позволит избежать ошибок в коде.
Полезные ссылки:
SOLID — это аббревиатура пяти основных принципов проектирования в объектно‑ориентированном программировании — принцип единой ответственности, открытости/закрытости, подстановки Барбары Лисков, разделения интерфейсов и инверсии зависимостей.
Аббревиатура SOLID была предложена Робертом Мартином, автором нескольких книг, широко известных в сообществе разработчиков. Эти принципы позволяют строить на базе ООП масштабируемые и сопровождаемые программные продукты с понятной бизнес‑логикой.
Полезные ссылки:
Большая часть программных систем необосновано перегружена практически ненужными функциями, что ухудшает удобство их использование конечными пользователями, а также усложняет их поддержку и развитие разработчиками. Следование принципу «KISS» позволяет разрабатывать решения, которые просты в использовании и в сопровождении.
KISS («Чем проще, тем лучше») — это принцип проектирования и программирования, при котором простота системы декларируется в качестве основной цели или ценности. Есть два варианта расшифровки аббревиатуры: «Keep It Simple, Stupid» и более корректный «Keep It Short and Simple».
Также KISS имеет много общего c принципом разделения интерфейсов из пяти принципов SOLID, сформулированных Робертом Мартином.
Полезные ссылки:
Следование данному принципу заключается в том, что возможности, которые не описаны в требованиях к системе, просто не должны реализовываться. Это позволяет вести разработку, руководствуясь экономическими критериями — заказчик не должен оплачивать ненужные ему функции, а разработчики не должны тратить своё оплачиваемое время на реализацию того, что не требуется.
Основная проблема, которую решает принцип YAGNI (You Ain’t Gonna Need It, «Вам это никогда не понадобится») — это устранение тяги программистов к излишней абстракции, к экспериментам «из интереса» и к реализации функционала, который сейчас не нужен, но, по мнению разработчика, может либо вскоре понадобиться, либо просто будет полезен, хотя в реальности такого очень часто не происходит.
Любые «бонусные» возможности усложняют сопровождение, увеличивают вероятность ошибок и усложняют взаимодействие с продуктом, — между объёмом кодовой базы и описанными характеристиками есть прямая зависимость. Больше написанного кода — труднее сопровождать и выше вероятность появления «багов».
Полезные ссылки:
Следование принципу программирования «DRY» (Don’t Repeat Yourself, «Не повторяйтесь») позволяет добиться высокой сопровождаемости проекта, простоты внесения изменений и качественного тестирования.
Если код не дублируется, то для изменения логики достаточно внесения исправлений всего в одном месте и проще тестировать одну (пусть и более сложную) функцию, а не набор из десятков однотипных. Следование принципу DRY всегда приводит к декомпозиции сложных алгоритмов на простые функции. А декомпозиция сложных операций на более простые (и повторно используемые) значительно упрощает понимание программного кода. Повторное использование функций, вынесенных из сложных алгоритмов, позволяет сократить время разработки и тестирования новой функциональности.
Полезные ссылки:
CQRS или разделение ответственности на команды и запросы, определяет архитектурный шаблон, в котором основное внимание уделяется разделению подходов к операциям чтения и записи для хранилища данных. CQRS также можно использовать вместе с шаблоном Event Sourcing для сохранения состояния приложения в виде упорядоченной последовательности событий, что позволяет восстанавливать данные на любой момент времени.
Полезные ссылки:
Генерация событий, источники событий — это шаблон проектирования, в котором состояние системы представляется в виде последовательности событий, произошедших во времени. В системе с источником событий изменения состояния системы записываются как события и сохраняются в хранилище событий. Текущее состояние системы определяется путем воспроизведения событий из хранилища событий.
Одним из основных преимуществ источника событий является то, что он обеспечивает четкую и проверяемую историю всех изменений, которые произошли в системе. Это может быть полезно для отладки и отслеживания эволюции системы с течением времени.
Источники событий часто используются в сочетании с другими шаблонами, такими как разделение ответственности на команды и запросы (CQRS) и предметно-ориентированное проектирование, для создания масштабируемых и быстро реагирующих систем со сложной бизнес-логикой. Их также стоит использовать для создания систем, которые должны поддерживать функциональную возможность отмены/возврата или которые должны интегрироваться с внешними системами.
Полезные ссылки:
Архитектурный шаблон — это обобщённое, повторно используемое решение часто встречающейся проблемы в архитектуре программного обеспечения в заданном контексте. Архитектурные шаблоны решают различные проблемы разработки программного обеспечения, такие как ограничения производительности компьютерного оборудования, высокая степень доступности и минимизация бизнес-рисков.
Монолитная архитектура — это шаблон, в котором приложение обрабатывает запросы, реализует бизнес-логику, взаимодействует с базой данных и создает HTML для фронтенда. Проще говоря, это одно приложение, которое отвечает за выполнение нескольких задач. Его внутренние компоненты сильно связаны и развернуты как единое целое.
Полезные ссылки:
- Монолитная архитектура. Традиционный метод разработки приложений
- Pattern: Monolithic Architecture
- Monolithic Architecture – Advantages & Disadvantages
Микросервисная архитектура — это шаблон, в котором сильно связные, слабо связанные сервисы разрабатываются, обслуживаются и развертываются отдельно. Каждый компонент отвечает отдельную задачу, а в сочетании приложение выполняет общую бизнес-функцию.
Полезные ссылки:
- Microservices Guide
- Pattern: Microservice Architecture
- What is Microservices?
- Microservices 101
- Primer: Microservices Explained
- Articles about Microservices
- Bellemare A. Building Event-Driven Microservices: Leveraging Organizational Data at Scale, O’Reilly Media, 2020. – 324 p.
- Betts N. Microservices vs. Monoliths – The Reality Beyond the Hype, NY: InfoQ, 2017. – 65 p.
- Boner J. Reactive Microservices Architecture, O'Reilly Media, Inc., 2016. – 54 p.
- Bruce Morgan, Pereira Paulo. Microservices in Action, Manning Publications, 2019. — 395 p.
- Cambell Edward. Microservices Architecture, 2015. — 98 p.
- Carneiro Cloves, Schmelmer Tim. Microservices From Day One. Build robust and scalable software from the start, Apress, 2017. — 258 p.
- Davis Ashley. Bootstrapping Microservices with Docker, Kubernetes, and Terraform: A project-based guide, Manning Publications, 2021. — 442 p.
- Fowler Susan J. Production-Ready Microservices, O'Reilly, 2017. — 316 p.
- Garofolo Ethan. Practical Microservices: Build Event-Driven Architectures with Event Sourcing and CQRS, Pragmatic Bookshelf, 2020. — 292 p.
- Hunter II Thomas. Advanced Microservices: A Hands-on Approach to Microservice Infrastructure and Tooling, Apress, 2017. — 181 p.
- Indrasiri Kasun, Siriwardena Prabath. Microservices for the Enterprise: Designing, Developing, and Deploying, Apress, 2019. — 422 p.
- Meghan K.M. Microservices: Quick Book: A practical guide with examples using Spring Boot, Cloud Config, Cloud Bus, Cloud Security, Eureka, Hystrix, Axon with CQRS and Event Sourcing, Independently published, 2021. — 137 p.
- Mitra Ronnie, Nadareishvili Irakli. Microservices: Up and Running: A Step-by-Step Guide to Building a Microservice Architecture, O’Reilly Media, 2021. — 255 p.
- Murugesan Vikram, Microservices Deployment Cookbook, Packt Publishing, 2017. — 305 p.
- Nadareishvili Irakli, Mitra Ronnie, McLarty Matt, Amundsen Mike. Microservice Architecture: Aligning Principles, Practices, and Culture, O'Reilly, 2016. — 146 p.
- Newman Sam, Building Microservices, Designing Fine-Grained Systems, 2nd Edition. — O’Reilly Media, 2021. — 615 p.
- Ньюмен С. Создание микросервисов. — СПб.: Питер, 2016. — 304 с.: ил.
- Newman Sam, Monolith to Microservices, Evolutionary Patterns to Transform Your Monolith, O’Reilly Media, 2020. — 300 p.
- Ньюмен С. От монолита к микросервисам: Эволюционные шаблоны для трансформации монолитной системы, Пер. с англ. — СПб.: БЧВ-Петербург, 2021 — 272 с.: ил.
- Osman Paul, Microservices Development Cookbook: Design and build independently deployable, modular services, Packt Publishing, 2018. — 260 p.
- Parminder Singh Kocher. Microservices and Containers, Addison-Wesley Professional, 2018. — 304 p.
- Peralta J.H. Microservice APIs: Using Python, Flask, FastAPI, OpenAPI and more, Manning, 2023. — 411 p.
- Peralta Jose Haro. Microservice APIs: With examples in Python, Manning Publications Co., 2022. — 425 p.
- Richards M. Microservices vs. Service-Oriented Architecture, O’Reilly Media, 2016. — 55 p.
- Richards Mark. Microservices AntiPatterns and Pitfalls, O'Reilly, 2016. — 66 p.
- Richardson Chris. Microservices Patterns: With examples in Java, Manning Publications, 2019. — 520 p.
- Ричардсон Крис Микросервисы. Паттерны разработки и рефакторинга. — СПб.: Питер, 2019. — 544 с.: ил.
- Richardson Chris. Microservices. From Design to Deployment, San Francisco: NGINX, Inc., 2016 — 80 p.
- Rocha Hugo Filipe Oliveira. Practical Event-Driven Microservices Architecture, Apress Media LLC, 2022. — 457 p.
- Rodger Richard. The Tao of Microservices, Manning Publications, 2018. — 328 p.
- Sharma Rahul, Mathur Akshay. Traefik API Gateway for Microservices: With Java and Python Microservices Deployed in Kubernetes, Apress Media LLC., 2020. — 269 p.
- Sharma Sourabh, RV Rajesh, Gonzalez David. Microservices: Building Scalable Software, Packt Publishing, 2017. — 919 p.
- Sharma U.R. Practical Microservices: Take advantage of microservices capabilities to build a flexible and efficient system with Java, Packt Publishing, 2017. – 307 p.
- Siriwardena Prabath, Dias Nuwan. Microservices Security in Action, Manning, 2020. — 512 p.
- Stetson Chris. Microservices Reference Architecture, NGINX Inc., 2017. — 58 p.
- Surianarayanan Chellammal. Essentials of Microservices Architecture: Paradigms, Applications, and Techniques, Taylor & Francis Group, LLC., 2020. — 314 p.
- Thomas Betts (ed.) Microservices – Patterns and Practices, NY: InfoQ, 2020. — 42 p.
- Umesh Ram Sharma. Srivastava Anubhava. Practical Microservices, Packt Publishing, 2017. — 254 p.
- Vinicius Feitosa Pacheco, Microservice Patterns and Best Practices: Explore patterns like CQRS and event sourcing to create scalable, maintainable, and testable microservices, 2018.
- Wolff Eberhard. Microservices: A Practical Guide: Principles, Concepts, and Recipes, 2nd Edition. — CreateSpace Independent Publishing Platform, 2020. — 319 p.
- Wolff Eberhard. Microservices: Flexible Software Architecture, Addison-Wesley, 2016. — 432 p.
- Wrba Guillermo. Designing and Building Solid Microservice Ecosystems, 2021. — 631 p.
- Yanaga E. Migrating to Microservice Databases, O’Reilly Media, 2017.
- Zeev Avidan, Hans Otharsson. Accelerating the Digital Journey from Legacy Systems to Modern Microservices, OpenLegacy, 2018. — 98 p.
- Пример микросервисной архитектуры
- microservices.io
SOA или сервис-ориентированная архитектура, определяет способ повторного использования программных компонентов с помощью интерфейсов сервисов. Эти интерфейсы используют общепринятые стандарты передачи информации таким образом, что их можно быстро добавлять в новые приложения без необходимости каждый раз выполнять глубокую интеграцию.
Полезные ссылки:
- Сервис-ориентированная архитектура (SOA)
- Reference Architecture Foundation for Service Oriented Architecture
Бессерверная архитектура — это архитектура, в которой разработчик создает и запускает приложения без необходимости арендовать/покупать серверы или управлять ими. При облачных вычислениях/бессерверных технологиях серверы существуют, но управляются поставщиком облачных услуг. Ресурсы используются по мере необходимости, по запросу и часто с использованием автоматического масштабирования.
Полезные ссылки:
Service mesh — это сеть микросервисов, соединенных с помощью взаимосвязанных интеллектуальных прокси-серверов. Она используется для управления и защиты связи между микросервисами и предоставляет такие функции, как балансировка нагрузки, обнаружение сервисов и наблюдаемость.
В service mesh каждый микросервис обычно представляет собой экземпляр легковесного прозрачного прокси-сервера, называемого "envoy" («посланником»). Посланники управляют взаимодействием между микросервисами и предоставляют такие функции, как балансировка нагрузки, маршрутизация и безопасность.
Service mesh обычно реализуются с использованием шаблона sidecar, в котором посланники развертываются вместе с микросервисами, за которые они несут ответственность. Это позволяет отделить service mesh от микросервисов и упрощает управление и обновление.
Service mesh обычно используются в облачных архитектурах и часто управляются с помощью панели управления, которая отвечает за настройку и управление посланниками. Некоторыми популярными реализациями service mesh являются Istio и Linkerd.
Полезные ссылки:
«12-факторное приложение» — это методология создания масштабируемых и удобных в сопровождении приложений «программное обеспечение как услуга» (SaaS). Она основана на наборе лучших практик, которые авторы методологии определили как необходимые для создания современных облачных приложений.
Методология «12-факторного приложения» состоит из следующих принципов:
- Кодовая база: для приложения должна быть единая кодовая база с несколькими сценариями развертывания.
- Зависимости: приложение должно явно объявлять и изолировать свои зависимости.
- Конфигурация: приложение должно хранить конфигурацию в среде выполнения.
- Сторонние службы (Backing services): приложение должно рассматривать сторонние службы (backing services) как подключаемые ресурсы.
- Сборка, релиз, выполнение: стадии сборки, релиза и выполнения должны быть изолированы.
- Процессы: приложение должно выполняться как один или несколько процессов не сохраняющих внутреннее состояние (stateless).
- Привязка портов (Port binding): приложение должно предоставлять доступ к своим службам через привязку порта.
- Параллелизм: приложение должно масштабироваться за счет добавления дополнительных процессов, а не за счет добавления потоков.
- Утилизируемость (Disposability): приложение должно быть спроектировано таким образом, чтобы его можно было быстро запускать и останавливать.
- Паритет разработки/работы приложения: среды локальной разработки, промежуточного развёртывания (staging) и рабочего развёртывания (production) должны быть максимально похожими.
- Логи: приложение должно работать с логами как с потоками событий.
- Задачи администрирования: приложение должно запускать задачи администрирования/обслуживания как разовые процессы.
Методология «12-факторного приложения» широко используется разработчиками SaaS приложений и считается передовой практикой для создания облачных приложений, которые являются масштабируемыми, удобными в обслуживании и простыми в развертывании.
Полезные ссылки:
Гексагональная архитектура (Hexagonal Architecture, также известна как архитектура портов и адаптеров), разработанная Алистером Кокберном и описана Стивом Фриманом и Натом Прайсом в книге "Growing Object Oriented Software with Tests".
Гексагональная архитектура — это архитектурный шаблон, направленный на создание слабо связанных компонентов приложений. Компоненты подключаются к программной среде с помощью портов и адаптеров. Слабая связанность позволяет реализовать ещё одно преимущество — взаимозаменяемость компонент.
Полезные ссылки:
Чистая архитектура — это рекомендации по организации системной архитектуры. Они были предложены Робертом С. Мартином и основаны на ряде прежних архитектурных построений, таких как гексагональная архитектура, луковая архитектура и т. д.
Это одно из основных правил для создания программного обеспечения (ПО), удобного в тестировании и поддержке.
Полезные ссылки:
- Software Architecture: The Hard Parts: Modern Trade-Off Analyses for Distributed Architectures 1st Edition by Neal Ford, Mark Richards, Pramod Sadalage, Zhamak Dehghani, 2021.
- Fundamentals of Software Architecture: An Engineering Approach 1st Edition by Mark Richards, Neal Ford, 2020.
- Фаулер М. Рефакторинг: улучшение существующего кода. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 432 с, ил.
- Роберт Мартин, Чистый код: создание, анализ и рефакторинг. Библиотека программиста, 2019.
- Роберт Мартин, Чистая архитектура. Искусство разработки программного обеспечения. – СПб.: Питер, 2018. – 352 с.: ил.
- martinfowler.com
Поисковые системы являются неотъемлемой частью любого веб-приложения, ответственного за предоставление пользователям эффективных и релевантных результатов поиска. Они хранят и извлекают данные на основе уникальных индексов, которые обеспечивают быстрый и точный поиск. Для бэкэнд-разработчика крайне важно понимать функциональные возможности поисковых систем и способы их интеграции в ваше веб-приложение.
Существует два основных типа поисковых систем:
-
Полнотекстовые поисковые системы: они специально разработаны для поиска и анализа текстовых документов. Они могут эффективно индексировать большие объемы текста и предоставлять релевантные результаты на основе ключевых слов или фраз. Примерами популярных полнотекстовых поисковых систем являются Elasticsearch, Solr и Amazon CloudSearch.
-
Поисковый механизм баз данных: механизмы поиска в базах данных являются встроенными функциональными возможностями большинства баз данных. Они обеспечивают поиск в данных, хранящихся в базе данных. Примерами могут быть FULLTEXT поиск MySQL и Full-Text поиск PostgreSQL.
При работе с поисковыми системами важно понимать следующие ключевые идеи:
Индексирование: процесс анализа и хранения данных в оптимизированном формате для быстрого поиска и извлечения. Токенизация: разбиение текста на отдельные слова или термины (также называемые токенами) для эффективного индексирования и поиска. Запрос: действие по поиску проиндексированных данных путем задания определенного вопроса или запроса информации на основе ключевых слов или фраз. Оценка релевантности: оценка, присваиваемая каждому результату поиска, которая показывает, насколько близко он соответствует запросу, на основе алгоритмов и моделей релевантности.
Чтобы интегрировать поисковую систему в ваше веб-приложение, вы обычно выполняете следующие шаги:
Выбераете поисковую систему: определите поисковую систему, которая лучше всего соответствует потребностям вашего приложения, учитывая такие факторы, как масштабируемость, производительность и простота интеграции. Индексируйте свои данные: анализируйте и сохраняйте свои данные с помощью выбранной поисковой системы. Этот процесс может включать создание индекса, указание полей и определение того, как данные должны быть токенизированы и проанализированы. Реализуйте функции поиска: разработайте бекэнд код для обработки поисковых запросов, т. е. для отправки запросов в поисковую систему и анализа ответов. Кроме того, обязательно обрабатывайте вводимые пользователем данные, такие как ключевые слова, фразы и фильтры. Отображение результатов поиска. Разработайте фронтэнд вашего приложения, чтобы отображать результаты поиска в удобном для пользователя виде, включая разбиение на страницы, сортировку и фильтрацию.
Полезные ссылки:
Elasticsearch по своей сути является документоориентированной поисковой системой. Это документоориентированная база данных, которая позволяет вам ВСТАВЛЯТЬ, УДАЛИТЬ, ПОЛУЧАТЬ (INSERT, DELETE , RETRIEVE) и даже выполнять аналитику сохраненных записей. Но Elasticsearch отличается от любой другой базы данных общего назначения, с которой вы работали ранее. По сути, это поисковая система, предлагающая целый арсенал функций, которые вы можете использовать для извлечения хранящихся в ней данных в соответствии с вашими критериями поиска. И при этом очень быстро.
Полезные ссылки:
Solr обладает высокой надежностью, масштабируемостью и отказоустойчивостью, обеспечивая распределенное индексирование, репликацию и запросы с балансировкой нагрузки, автоматическое переключение при отказе и восстановление, централизованную настройку и многое другое. Solr отвечает за функции поиска и навигации многих крупнейших интернет-сайтов мира.
Полезные ссылки:
Брокеры сообщений — это технология передачи информации между приложениями, помогающая создать стандартный механизм интеграции для поддержки облачных, микросервисных, бессерверных и гибридных облачных архитектур. Двумя самыми известными брокерами сообщений являются RabbitMQ
и Apache Kafka
.
Полезные ссылки:
С десятками тысяч пользователей RabbitMQ является одним из самых популярных брокеров сообщений с открытым исходным кодом. RabbitMQ легковесен и прост в развертывании локально и в облаке. Он поддерживает несколько протоколов обмена сообщениями. RabbitMQ можно развернуть в распределенных и федеративных конфигурациях для удовлетворения требований касающихся масштабирования и высокой доступности.
Полезные ссылки:
Apache Kafka – это распределенная платформа потоковой передачи событий с открытым исходным кодом, используемая тысячами компаний для высокопроизводительных конвейеров данных, потоковой аналитики, интеграции данных и критически важных приложений.
Полезные ссылки:
Контейнеры и виртуальные машины — два самых популярных подхода к настройке программной инфраструктуры для вашей организации.
Полезные ссылки:
- Containerization vs. Virtualization: Everything you need to know
- Containerization or Virtualization – The Differences
Kubernetes — это платформа управления контейнерами с открытым исходным кодом и доминирующий продукт в этой сфере. Используя Kubernetes, команды могут развертывать образы на нескольких базовых хостах, определяя их желаемую доступность, логику развертывания и масштабирования с помощью YAML. Kubernetes был создан на основе Borg, внутренней платформы Google, используемой для предоставления и распределения вычислительных ресурсов (аналогично системам Autopilot и Aquaman Microsoft Azure).
Популярность Kubernetes сделала его одним из наиболее важных навыков для DevOps инженера и послужила толчком к созданию команд разработчиков для платформы во всей отрасли. Эти команды разработчиков для платформ часто существуют с единственной целью сделать Kubernetes доступным и удобным для использования их коллегами, занимающихся разработкой продуктов.
Полезные ссылки:
- Kubernetes Website
- Kubernetes Documentation
- Kubernetes Crash Course for Absolute Beginners
- Primer: How Kubernetes Came to Be, What It Is, and Why You Should Care
- Kubernetes: An Overview
Docker — это платформа для работы с контейнерными приложениями. Среди его функций — фоновый системный процесс и клиент для управления контейнерами и взаимодействия с ними, реестры для хранения образов и приложение для настольного ПК, объединяющее все эти функции.
Полезные ссылки:
- Docker — Википедия
- Docker Documentation
- What is Docker | AWS
- Complete Docker Course – From BEGINNER to PRO!
- Docker Tutorial
- Docker simplified in 55 seconds
- Дорожная карта для изучения Docker
Rocket (rkt) — является альтернативой Docker, разработанной компанией CoreOS с прицелом на соответствие строгим требованиям к безопасности и производительности.
Полезные ссылки:
- rkt — Википедия
- What is Rkt (Rocket) container technology? Should you use it?
- Docker vs Rkt (Rocket) – Which one to choose?
LXC — это аббревиатура, используемая для Linux контейнеров, которые представляют собой операционную систему, используемую для запуска нескольких систем Linux виртуально на контролируемом хосте через одно ядро Linux. LXC — это интерфейс пользовательского пространства для функций ограничений ядра Linux. Благодаря мощному API и простым инструментам пользователи Linux могут легко создавать системные контейнеры или контейнеры приложений и управлять ими.
Полезные ссылки:
- LXC — Википедия
- LXC Documentation
- What is LXC?
- Linux Container (LXC) Introduction
- Getting started with LXC containers
GraphQL — это язык запросов для API-интерфейсов и среда, в которой они выполняются. GraphQL позволяет детально и понятно описать данные в вашем API, даёт клиентам возможность запрашивать именно то, что им нужно, упрощает развитие API с течением времени и предоставляет мощные инструменты разработчика.
Полезные ссылки:
- GraphQL
- Introduction to GraphQL
- The Fullstack Tutorial for GraphQL
- GraphQL Tutorials
- GraphQL Course for Beginners
Apollo — это платформа для построения унифицированного графа, коммуникационного слоя, который помогает вам управлять потоком данных между вашими клиентами (такими как веб-приложения и нативные приложения) и бекэнд сервисами.
Полезные ссылки:
Relay — это JavaScript клиент, используемый в браузере для получения GraphQL данных. Это JavaScript среда, разработанная Facebook для управления и получения данных в React приложениях. Он создан с учетом масштабируемости для поддержки сложных приложений, таких как Facebook. Основная цель GraphQL и Relay — обеспечить мгновенное реакцию пользовательского интерфейса на действия пользователя.
Полезные ссылки:
Веб-сокеты представляют собой двустороннюю связь между серверами и клиентами, т. е. обе стороны взаимодействуют друг с другом и обмениваются данными одновременно. Этот протокол определяет полнодуплексную связь с нуля. Веб-сокеты на ещё один шаг приближают веб-браузеры к приложениям для настольного компьютера, предоставляя им богатые функциональные возможности.
Полезные ссылки:
- WebSocket — Википедия
- Пример использования
- Introduction to WebSockets
- A Beginners Guide to WebSockets
- Socket.io Library Bidirectional and low-latency communication for every platform
Server-Sent Events (SSE) – это технология, которая позволяет веб-серверу передавать данные клиенту в режиме реального времени. Она использует HTTP-соединение для отправки потока данных с сервера клиенту, и клиент может отслеживать эти события и предпринимать действия при их получении.
SSE полезен для приложений, требующих обновлений в режиме реального времени, таких как системы чатов, бегущие строки акций и каналы социальных сетей. Это простой и эффективный способ установить долговременное соединение между клиентом и сервером и он поддерживается большинством современных веб-браузеров.
Чтобы использовать SSE, клиент должен создать объект EventSource и указать URL-адрес скрипта на стороне сервера, который будет отправлять события. Затем сервер может отправлять события, записывая их в поток ответов, при этом соблюдая определенное форматирование.
Полезные ссылки:
Веб-серверы могут быть аппаратными, программными или комбинированными.
Аппаратный веб-сервер — это компьютер, на котором размещено программное обеспечение веб-сервера и файлы, формирующие веб-сайт (например, HTML-документы, изображения, таблицы стилей CSS и файлы JavaScript). Веб-сервер устанавливает соединение с Интернетом и осуществляет физический обмен данными с другими устройствами, подключенными к сети.
Программный веб-сервер имеет ряд программных компонентов, которые контролируют доступ онлайн-пользователей к размещенным файлам. Это как минимум HTTP-сервер. Программное обеспечение, которое имеет представление и понимает HTTP (протокол, который ваш браузер использует для просмотра веб-страниц) и URL-адреса (веб-адреса), назвается HTTP-сервером. Содержимое размещенных веб-сайтов отправляется на устройство конечного пользователя через HTTP-сервер, доступ к которому можно получить через доменные имена сайтов, которые он содержит.
По сути, HTTP-запрос выполняется браузером каждый раз, когда ему требуется файл, хранящийся на веб-сервере. Соответствующий (аппаратный) веб-сервер получает запрос, который затем принимается соответствующим (программным) HTTP-сервером, а он в свою очередь затем находит запрошенный контент и возвращает его браузеру по HTTP. Если сервер не может найти запрошенную страницу, он отвечает ошибкой 404.
Полезные ссылки:
NGINX — это мощный веб-сервер, использующий событийно-ориентированную архитектуру без потоков, которая позволяет ему превосходить в производительности Apache при правильной настройке. Он также может выполнять другие важные функции, такие как балансировка нагрузки, HTTP-кеширование или использование в качестве обратного прокси-сервера.
Полезные ссылки:
Apache — это бесплатный HTTP-сервер с открытым исходным кодом, доступный во многих операционных системах, но в основном используемый в дистрибутивах Linux. Это один из самых популярных вариантов для веб-разработчиков, поскольку, по оценке W3Techs, на его долю приходится более 30% всех веб-сайтов.
Полезные ссылки:
Веб-сервер Caddy — это расширяемый кроссплатформенный веб-сервер с открытым исходным кодом, написанный на Go. Он обладает несколькими действительно привлекательными функциональными возможностями, такими как автоматическая поддержка SSL/HTTPs и очень простой файл конфигурации.
Полезные ссылки:
Internet Information Services (IIS) для Windows® Server — это гибкий, безопасный и лёгкий в обращении веб-сервер для размещения чего-либо в Интернете.
Полезные ссылки:
Создание приложений с учётом масштабирования (общие темы, которые вы должны изучить и которые нужно иметь ввиду для обеспечения надежной работы приложения)
В общих чертах, масштабируемость — это способность системы справляться с растущей нагрузкой за счет добавления к ней ресурсов.
Программное обеспечение, разработаваемое с учетом масштабируемости, представляет собой систему, которая способна работать с более высокими рабочими нагрузками без каких-либо фундаментальных изменений в ней, но не дайте себя обмануть, в этом нет никакой магии. Достичь желаемой цели, не привлекая дополнительных ресурсов, можно только за счёт грамотного проектирования.
Чтобы система была масштабируемой, необходимо обратить внимание на следующие моменты, а именно:
- связность
- наблюдаемость
- эволюционируемость
- инфраструктура
Существует два основных способа создания инфраструктурой масштабируемой системы: использовать локальные ресурсы или использовать все инструменты, которые может предоставить вам провайдер облачных услуг.
Основным отличием локальных и облачных ресурсов будет ГИБКОСТЬ последних. Используя облачные провайдеры вам не нужно планировать заранее сколько и каких именно аппаратных ресурсов потребуется для реализации, вы можете модернизировать свою инфраструктуру в пару кликов, а с локальными ресурсами вам потребуется определенный уровень планирования.
Смотри также:
- Scalable Architecture: A Definition and How-To Guide
- Scaling Distributed Systems – Software Architecture Introduction
Стратегия миграции — это план перемещения данных из одного места в другое и важный этап любой миграции базы данных. Стратегия миграции данных должна включать план перемещения данных и действий с ними после их переноса в новое место.
Узнайте, как эффективно выполнять миграцию базы данных. В частности, многоэтапную миграция схем с нулевым временем простоя. Вместо того, чтобы вносить все изменения сразу (удалив весь старый код), делайте небольшие пошаговые изменения, чтобы старый код и новый код могли работать с базой данных одновременно. Затем удалите старый код и части схемы базы данных, которые больше не используются.
Полезные ссылки:
Этот раздел в основном относится к шаблонам облачного проектирования, которые помогают создавать масштабируемые решения. Ознакомьтесь с документацией Microsoft Cloud Design Patterns и этим видео, в котором рассказывается о шаблонах Throttling, Retry и Circuit Breaker.
Graceful degradation — это принцип проектирования, согласно которому система должна быть спроектирована так, чтобы продолжать функционировать, даже если некоторые из её компонентов или функций недоступны. В контексте веб-разработки под graceful degradation понимается способность веб-страницы или приложения продолжать работу, даже если браузер или устройство пользователя не поддерживает определенные функции или технологии.
Graceful degradation часто используется в качестве альтернативы progressive enhancement — принципу проектирования, который гласит, что система должна быть спроектирована так, чтобы использовать преимущества передовых функций и технологий, если они доступны.
Посетите следующие ресурсы, если хотите получить больше информации:
- Graceful degradation
- Graceful degradation
- What is Graceful Degradation & Why Does it Matter?
- Four Considerations When Designing Systems For Graceful Degradation
- The Art of Graceful Degradation
Throttling (регулирование нагрузки) — это шаблон проектирования, который используется для ограничения частоты, с которой может использоваться система или компонент. Он обычно используется в средах облачных вычислений для предотвращения чрезмерного использования ресурсов, таких как вычислительная мощность, пропускная способность сети или ёмкость хранилища.
Существует несколько способов реализации throttling в облачной среде:
-
Ограничение скорости: это подразумевает определение максимального количества запросов, которые могут быть сделаны к системе или компоненту в течение определенного периода времени.
-
Распределение ресурсов: это подразумевает выделение фиксированного количества ресурсов для системы или компонента, а затем ограничение использования этих ресурсов, если они превышены.
-
«Ведро» с токенами: это подразумевает использование «ведра» токенов (маркеров) для представления доступных ресурсов, а затем позволяет «потреблять» определенное количество токенов при каждом запросе. Когда ведро пустое, дополнительные запросы отклоняются до тех пор, пока не станет доступно больше токенов.
Throttling является важным аспектом облачного проектирования, поскольку он помогает обеспечить эффективное использование ресурсов, а также стабильность и доступность системы. Он часто используется в сочетании с другими шаблонами проектирования, такими как автоматическое масштабирование и балансировка нагрузки, для обеспечения масштабируемой и отказоустойчивой облачной среды.
Полезные ссылки:
- Web Api Security: DoS & DDoS attacks, Throttling, Scalability, WAF
- Throttling – AWS Well-Architected Framework
- Алгоритм текущего ведра
Backpressure — это шаблон проектирования, который используется для управления потоком данных через систему, особенно в ситуациях, когда скорость производства данных превышает скорость потребления данных. Он обычно используется в средах облачных вычислений для предотвращения перегрузки ресурсов и обеспечения своевременной и эффективной обработки данных.
Существует несколько способов реализации backpressure в облачной среде:
-
Буферизация: это подразумевает хранение входящих данных в буфере до тех пор, пока они не будут обработаны, что позволяет системе продолжать получать данные, даже если она временно не может их обработать.
-
Пакетная обработка: это подразумевает группировку входящих данных в пакеты и последовательную обработку пакетов, а не обработку каждого фрагмента данных по отдельности.
-
Управление потоком: подразумевает использование таких механизмов, как сигналы управления потоком или управление путём разбиения на окна, для регулирования скорости, с которой данные передаются между системами.
Backpressure — важный аспект облачного проектирования, поскольку он помогает обеспечить эффективную обработку данных, а также стабильность и доступность системы. Он часто используется в сочетании с другими шаблонами проектирования, такими как автоматическое масштабирование и балансировка нагрузки, для обеспечения масштабируемой и отказоустойчивой облачной среды.
Полезные ссылки:
Load Shifting (переключение нагрузки) – это шаблон проектирования, который используется для управления рабочей нагрузкой системы путем переноса нагрузки на разные компоненты или ресурсы в разное время. Он обычно используется в средах облачных вычислений для балансировки рабочей нагрузки системы и оптимизации использования ресурсов.
Существует несколько способов реализации перераспределения нагрузки в облачной среде:
-
Планирование (диспетчеризация): это подразумевает составление графика выполнения задач или рабочих нагрузок в определенное время или через определенные промежутки времени.
-
Балансировка нагрузки: это подразумевает распределение рабочей нагрузки системы между несколькими ресурсами, такими как серверы или контейнеры, для обеспечения сбалансированности рабочей нагрузки и эффективного использования ресурсов.
-
Автоматическое масштабирование: это подразумевает автоматическую подстройку количества ресурсов, доступных системе, в зависимости от рабочей нагрузки, позволяя системе масштабироваться вверх или вниз по мере необходимости.
Load Shifting — важный аспект облачного проектирования, поскольку он помогает обеспечить эффективное использование ресурсов, а также стабильность и доступность системы. Он часто используется в сочетании с другими шаблонами проектирования, такими как throttling и backpressure, для обеспечения масштабируемой и отказоустойчивой облачной среды.
Полезные ссылки:
Шаблон проектирования circuit breaker (предохранитель) — это способ защитить систему от сбоев или чрезмерной нагрузки путем временной остановки определенных операций, если считается, что система находится в неисправном или перегруженном состоянии. Он обычно используется в средах облачных вычислений для предотвращения каскадных сбоев и повышения отказоустойчивости и доступности системы.
Circuit breaker имеет три состояния: замкнут, разомкнут и полуоткрыт. В замкнутом состоянии автоматический выключатель позволяет выполнять операции в обычном режиме. Если в системе возникает сбой или она перегружается, circuit breaker переходит в разомкнутое состояние, и все последующие операции немедленно останавливаются. По истечении заданного периода времени circuit breaker переходит в полуоткрытое состояние, и разрешается выполнение небольшого количества операций. Если эти операции выполнены успешно, circuit breaker возвращается в замкнутое состояние; если при их выполнении возникают сбои, circuit breaker возвращается в разомкнутое состояние.
Шаблон проектирования circuit breaker полезен для защиты системы от сбоев или чрезмерной нагрузки, поскольку позволяет временно остановить определенные операции и позволить системе восстановиться. Он часто используется в сочетании с другими шаблонами проектирования, такими как retries (повторные попытки) и fallbacks (резервные копии), для обеспечения более надежной и отказоустойчивой облачной среды.
Полезные ссылки:
- Стратегии обработки ошибок: Circuit Breaker pattern
- Circuit Breaker – AWS Well-Architected Framework
- М. Нейгард Release it! Проектирование и дизайн ПО для тех, кому не всё равно. — СПб.: Питер, 2016. — 320 с.: ил. — (Серия «Библиотека программиста»).
- Reliability patterns
- Designing a Microservices Architecture for Failure
- Клеппман М. Высоконагруженные приложения. Программирование, масштабирование, поддержка. — СПб.: Питер, 2018. — 640 с.: ил. — (Серия «Бестселлеры O’Reilly»).
Горизонтальное масштабирование — это изменение количества ресурсов. Например, увеличение количества виртуальных машин, обрабатывающих сообщения в очереди. Вертикальное масштабирование — это изменение размера/мощности ресурса. Например, увеличение памяти или дискового пространства, доступного машине. Масштабирование может применяться к базам данных, облачным ресурсам и другим областям вычислений.
Полезные ссылки:
- Масштабируемость
- Horizontal vs Vertical Scaling
- Scaling In Databases
- System Design Basics: Horizontal vs. Vertical Scaling
- System Design 101
Создание приложения с учётом наблюдаемости (логирование метрик и других наблюдаемых параметров, которые могут помочь вам в отладке и решении проблем, когда что-то идет не так)
В области разработки программного обеспечения наблюдаемость — это мера понимания того насколько хорошо работает система и как сделать её лучше.
Что же делает систему «наблюдаемой»? Её способность создавать и собирать метрики, логи и трассировки, чтобы мы могли понять, что происходит под капотом, и быстрее выявлять проблемы и узкие места. Вы можете реализовать все эти функции самостоятельно, но существуют программы, которые могут помочь вам в этом, например Datadog, Sentry и CloudWatch.
Полезные ссылки:
- DataDog Docs
- AWS CloudWatch Docs
- Sentry Docs
- AWS re:Invent 2017: Improving Microservice and Serverless Observability with Monitor
- Observability and Instrumentation: What They Are and Why They Matter
Под инструментированием понимают измерение производительности продукта для диагностирования ошибок и записи информации, позволяющей отслеживать причины их возникновения. Инструментирование может быть двух типов: на основе исходного кода и на основе двоичного кода.
Мониторинг бэкэнда позволяет пользователю просматривать производительность инфраструктуры, то есть компонентов, которые запускают веб-приложение. К ним относятся HTTP-сервер, промежуточное ПО, база данных, сторонние службы API и многое другое.
Телеметрия — это процесс непрерывного сбора данных из разных компонентов приложения. Эти данные помогают командам инженеров устранять неполадки в сервисах и выявлять первопричины. Другими словами, данные телеметрии обеспечивают наблюдаемость для ваших распределенных приложений.
Ссылки на ресурсы:
Обратите внимание также на дорожную карту DevOps-а
Backend-веб-разработка — это часть веб-разработки, которая касается серверной части веб-приложения. Она включает в себя создание и управление логикой на стороне сервера, подключение приложения к базе данных, создание API на стороне сервера, аутентификацию и авторизацию пользователей, а также обработку запросов пользователей и ответы на них. Часто связана с использованием таких языков программирования, как Python, Java, Ruby, PHP, JavaScript (Node.js) и .NET.
Backend-разработчик отвечает за разработку серверных компонентов веб-приложения, т. е. за работу с базами данных, обработку запросов, создание серверных API-интерфейсов, которые могут использоваться Frontend разработчиками для получения данных и управления ими, обеспечивая масштабируемость систем, т. е. он должен убедиться, что Backend может обрабатывать большой объём трафика и работать, интегрируя внешние сервисы, такие как платежные шлюзы, очереди сообщений, облачные сервисы и т. д.
Если вы новичок и только приступили к обучению, вы можете начать с изучения языка Backend-программирования, например, PHP, Python, Ruby, Java, Go и т. д. Как только вы будете знать язык на базовом или среднее уровне, изучите менеджер пакетов для этого языка, как устанавливать и использовать внешние пакеты в своих приложениях. Выучите основы какой-либо реляционной базы данных, например, PostgreSQL и узнайте, как выполнять простые CRUD операции. При желании вы также можете выбрать и изучить веб-фреймворк для выбранного вами языка. Узнайте, как создать простой RESTful API и внедрить в него простую аутентификацию/авторизацию. Изучая все вышеперечисленное, не забудьте также о Git и GitHub.
Выполнив все приведенные выше рекомендации, вы можете начать откликаться на вакансии Backend-разработчика уровня intern/junior. Кроме того, посмотрите на дорожную карту Backend-разработчика выше, чтобы получить представление о том, что вам нужно ещё изучить и увидеть, чего вам ещё не хватает. Иметь высшее образование в области, связанной с компьютерными науками или смежной, не всегда обязательно, но необходима постоянная практика, создание портфолио и активный поиск стажировок или прохождение собеседований на должность intern/junior разработчика, чтобы начать и продвинуться по карьерной лестнице в качестве бэкэнд-разработчика.
Примечание: для закрепления полученных в ходе изучения знаний, придумывайте и создавайте различные проекты. Важно постоянно учиться, чтобы улучшать свои навыки и быть готовым к быстрому развитию технологий.
Время, необходимое для того, чтобы стать Backend-разработчиком, может варьироваться в зависимости от нескольких факторов, таких как темп вашего обучения, предыдущий опыт и количеству часов в день, которые вы можете посвятить обучению.
Если у вас уже есть опыт работы, связанный с компьютерными науками или смежной области, а также опыт программирования, вы сможете относительно быстро стать Backend-разработчиком, возможно, в течение нескольких месяцев. Однако, если у вас небольшой опыт или вообще его нет, может потребоваться больше времени, чтобы развить необходимые навыки и получить опыт, необходимый для того, чтобы стать знатоком в Backend-разработке. Это может занять от 6 месяцев до 2 лет.
Зарплата Backend-разработчика может варьироваться в зависимости от таких факторов, как местоположение, опыт и размер компании. Согласно данным Glassdoor, средняя базовая зарплата Backend-разработчика в США составляет около 92 000 долларов в год. Однако она может сильно отличаться в зависимости от местоположения: в самых высокооплачиваемых городах, таких как Сан-Франциско, Сиэтл и Нью-Йорк, средняя зарплата составляет от 120 000 до 135 000 долларов в год.
Стоит иметь в виду, что это всего лишь средние значения, и заработная плата может сильно различаться в зависимости от таких факторов, как уровень опыта, конкретные навыки и компания, в которой вы работаете. С большим опытом и конкретными навыками, относящимися к работе, на которую вы претендуете, вы можете рассчитывать на больший заработок.
Стоит изучить статьи, посвященные статистике изменения зарплат за последние годы, публикуемые на сайтах для поиска работы, чтобы получить общее представление о текущем состоянии рынка в вашей области в зависимости от уровня опыта. Также попробуйте связаться с опытными специалистами Backend-разработки и получить представление об их опыте работы и диапазонах заработной платы.
Эта дорожная карта содержит всё, с чем вы можете столкнуться, работая Backend-разработчиком. Вам может не понадобиться всё, что перечислено здесь, чтобы начать работать в отрасли; каждая работа уникальна, и чаще всего потребуется подмножество элементов дорожной карты. Однако знать свои слабые стороны тоже важно, поэтому вы можете использовать эту дорожную карту, чтобы получить представление о том, чего вам не хватает.
Если вы новичок и только начинаете, не пугайтесь, глядя на эту дорожную карту, а прочитайте ответ на вопрос "Как стать Backend-разработчиком?".
- Теория множеств
- Булева алгебра
- Теория графов