Собеседование Flashcards

Вопросы по PHP, SQL, методологиям и т.д.

1
Q

Типы данных в PHP

A

Скалярные типы:
* int (целочисленное значение)
* bool (логический тип true/false)
* float (число с плавающей точкой)
* string (строка)

Смешанные типы:
* array (массив)
* object (объект)

Специальные типы:
* null
* resource (перемення, хранящая ссылку на внешний ресурс. например: соединение с БД, работа с файлами fopen(), fgets(), fclose())

Псевдотипы:
* never (возвращаемое значение, которое указывает, что функция прекратила работу без возврата значения)
* void (возвращаемое значение, которое указывает, что функция ничего не возвращает)
* mixed (любой тип)
* callable (функции или метод, который можно вызвать. Например, array_map(callable, array))
* iterable (массив или объект, поддерживающий итерацию. используется в функциях и методах, которые могут обрабатывать различные коллекции данных (массивы или итераторы. Пример: цикл foreach)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Плюсы строгой типизации

A
  • раннее обнаружение ошибок (нахождение ошибок на ранних этапах разработки, когда типы данных не соответствуют ожиданиям)
  • улучшение читаемости и поддерживаемости кода (более предсказуемый код)
  • инструменты статического анализа помогают проверять код и предотвращать ошибки до выполнения (Psalm, PHPStan)
  • явное поведение функций
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Минусы строгой типизации

A
  • меньшая гибкость (отключение атоматического приведения типов)
  • сложность при интеграции с библиотеками и API, не использующими строгую типизацию
  • дополнительные проверки валидации и приведения типов
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Какая типизация используется в PHP?

A

В PHP используется динамическая слабая типизация
Динамическая - не требует явного указания типа при объявлении переменной
Слабая - присутствует автоматическое приведение типов

Можно включить строгую типизацию для функций и методов, используя declare(strict_types=1). В этом режиме PHP требует, чтобы передаваемые значения строго соответствовали указанным типам данных и не пытался автоматически их преобразовать.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Приведение типов данных в PHP

A

В PHP типы данных могут приводиться явно ($i = (int) $a) или неявно (автоматически)

В любом из случаев можно столкнуться с ошибкой (например: при попытке перевести объект/массив/ресурс к скалярному типу)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Лучшие практики именования переменных

A
  • понятные и осмысленные имена
  • единый стиль именования (camelCase/snake_case)
  • избегать общих имён (data, object)
  • использовать имена, отражающие тип данных ($is/can/has.. для bool, $..Count для int)
  • использование множественных чисел для массивов и коллекций

Переменные начинаются с $, имя которой начинается с буквы или символа подчёркивания _. Имена могут содержать только буквы, цифры и подчёркивания

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Области видимости переменных

A
  • Глобальная (переменные вне функций, классов или методов имеют глобальную область видимости или объявленная с помощью global $a)
  • Локальная (переменные объявленные внутри функций, видны и доступны только внутри функции)
  • Статическая область видимости (объявляются внутри функции, сохраняют своё значение между вызовами функции)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Области видимости при описании классов

A
  • public (свойство доступно как внутри класса, так и вне его)
  • private (свойство доступно только внутри класса)
  • protected (свойство доступно внутри класса и в его дочерних классах)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Константы и их использование в PHP

A

Константы используются для хранения значений, которые не должны изменяться (настройка конфигураций, магические числа/строки)
Константы объявляются с помощью const NAME = VALUE, define("NAME", value)

Константы, объявленные с помощью define(), доступны глобально, независимо от области видимости (даже внутри функций и методов классов).

Магические константы:
__LINE__ — номер текущей строки в файле.
__FILE__ — полный путь и имя текущего файла.
__DIR__ — директория текущего файла.
__FUNCTION__ — имя текущей функции.
__CLASS__ — имя текущего класса.
__TRAIT__ — имя текущего трейта.
__METHOD__ — имя текущего метода класса.
__NAMESPACE__ — текущее пространство имен.

PHP 8.3 и более поздние версии поддерживают объявление типа для констант PHP Class

Преимущества: неизменяемое значение, глобальная доступность,

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Статические свойства

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Абстрактный класс

A

Класс, от которого нельзя создать объект. Предназначен для того, чтобы другие классы его наследовали.
Абстрактный класс может содержать как абстрактные методы, так и методы с реализацией. Наследники должны реализовать абстрактные методы
Может содержать свойства

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Интерфейс

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Разница между абстрактным классом и интерфейсом

A
  • Абстрактный класс может содержать реализацию методов, а интерфейс нет
  • Абстрактный класс может содержать свойства
  • Класс может наследовать только 1 абстрактный класс, но может реализовывать несколько интерфейсов
  • В абстрактном классе методы имеют разный уровень доступа (public/private/protected), все методы интерфейса должныть быть public
  • Абстрактный класс может иметь конструктор

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое трейт в PHP?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое функция и когда она используется?

A

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Конструктор и деструктор

A

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Особенности переопределения родительских методов

A

Переопределение родительских методов (также называемое override) — это процесс, при котором метод, определённый в родительском классе, переопределяется в дочернем классе с целью изменения или дополнения его поведения.

При переопределении метода дочерний класс может вызвать оригинальную версию метода из родительского класса с помощью ключевого слова parent

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

Метод в родительском классе может быть помечен как final, что запрещает его переопределение в дочерних классах.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Исключения и преимущества их использования

A

Исключения в PHP — это механизм обработки ошибок и исключительных ситуаций, который позволяет прервать нормальный ход выполнения программы и перейти к коду, который может корректно обработать возникшую проблему
Исключение создается с помощью ключевого слова throw
Преимущества использования исключений
- Чёткое разделение логики и обработки ошибок
- Гибкость обработки ошибок
- Прерывание выполнения
- Поддержка сложных иерархий ошибок

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что такое сессия?
Чем отличается сессия от куки?
Как происходит связывание пользователя на сайте с сессией на сервере?

A

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

Отличие от куки:
- сессия хранится на сервере, а куки на клиенте
- сессия ограничена объёмом доступной памяти на сервере, куки обычно ограничены 4 Kb
- т.к. сессия хранится на сервере клиент не имеет к ней прямого доступа, тогда как куки могут быть доступны через JS или другие инструменты
- сессия живёт пока пользователь не закроет браузер или не истечёт срок хранения на сервере, кука хранится указанное время

Связывание пользователя с сессией на сервере происходит через идентификатор сессии (Session ID), который сервер создаёт при первом запросе пользователя и отправляет браузеру. Обычно этот идентификатор передаётся в куке или в URL, если куки отключены.

session_start();
// Запись данных в сессию
$_SESSION[‘username’] = “JohnDoe”;
$_SESSION[‘email’] = “john@example.com”;

// Получение данных из сессии
$_SESSION[‘username’];

// Очистка всех переменных сессии
session_unset();
// Уничтожение сессии
session_destroy();

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Cookies: для чего, как и где использовать?

A

Cookies — это небольшие файлы данных, которые веб-сервер передаёт и сохраняет на компьютере пользователя через браузер. Они используются для хранения информации между запросами от клиента к серверу, что помогает поддерживать состояние сеансов, настраивать пользовательский интерфейс, а также сохранять персональные настройки.
- Поддержка сессий
- Хранение настроек (язык, тема, размер шрифта)
- Отслеживание действий
- Персонализация контента (показ товаров, которые уже просматривали)

// Создаём cookie с именем “user”, значением “John” и сроком действия 1 день
setcookie(“user”, “John”, time() + 86400, “/”);
// Читаем куки
$_COOKIE[“user”]
// Для удаления cookie нужно установить его срок действия в прошлое
setcookie(“user”, “”, time() - 3600, “/”);

Кука передаётся с сервера в браузер пользователя через HTTP-заголовок Set-Cookie в ответе на запрос.

Каждая кука привязывается к определённому домену. Это означает, что браузер отправит куку только при запросах к указанному домену (или его поддоменам, если это разрешено).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

PDO (модуль для работы с базой данных)

A

PDO (PHP Data Objects) — это абстрактный слой для работы с базами данных в PHP, который предоставляет единый интерфейс для взаимодействия с различными СУБД (системами управления базами данных), такими как MySQL, PostgreSQL, SQLite, MS SQL, и другие. Благодаря PDO, можно использовать одну и ту же кодовую базу для работы с разными базами данных, просто изменив настройки подключения.

  • поддержка множества БД
  • защита от SQL-инъекций

В Laravel ORM использует PDO для работы с БД на низком уровне

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Для чего используется класс \DateTime?
В чем отличие \DateTime от \DateTimeImmutable?

A

Класс \DateTime в PHP используется для работы с датой и временем. Он позволяет создавать, изменять и форматировать объекты даты и времени, а также выполнять различные манипуляции с ними, такие как добавление или вычитание интервалов времени, сравнение дат, и так далее.

\DateTimeImmutable работает аналогично \DateTime, но с одной ключевой разницей: он неизменяемый. Это значит, что любые изменения даты или времени возвращают новый объект, а сам исходный объект остаётся неизменным.

Отличия:
- DateTime изменяемый объект (меняется исходный объект), DateTimeImmutable неизменяемый (после изменения создаётся новй объект)
- DateTime: может привести к непреднамеренным изменениям, если объект передаётся по ссылке и изменяется в разных частях программы
- DateTimeImmutable может быть менее производительным в некоторых случаях, так как при каждом изменении создаётся новый объект

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

curl

A

В PHP для выполнения HTTP-запросов, таких как GET и POST, часто используется расширение cURL. Оно позволяет взаимодействовать с API и обрабатывать ответы.

Отличие отправки POST JSON от POST FORM в заголовке:
- ‘Content-Type: application/json’
- ‘Content-Type: application/x-www-form-urlencoded’

GuzzleHttp в Laravel связан с cURL, поскольку Guzzle использует cURL как один из механизмов для выполнения HTTP-запросов. Однако Guzzle — это более высокоуровневая библиотека, которая предоставляет удобный API для работы с HTTP-запросами и скрывает низкоуровневые детали работы с cURL.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Функции для работы с JSON

A

json_encode() используется для преобразования PHP-массивов и объектов в строку JSON

json_decode() используется для преобразования строки JSON обратно в массив или объект PHP

json_last_error() возвращает код последней ошибки, возникшей при выполнении функций json_encode() или json_decode()

json_last_error_msg() возвращает текстовое описание последней ошибки, произошедшей при работе с JSON

Флаги json_encode:
- JSON_PRETTY_PRINT Форматирует JSON с отступами и переводами строк для удобства чтения.
- JSON_UNESCAPED_SLASHES Отключает экранирование косых черт (слешей) в строках
- JSON_UNESCAPED_UNICODE Отключает экранирование символов Unicode. Полезно для сохранения символов кириллицы и других алфавитов
- JSON_NUMERIC_CHECK Преобразует строковые значения, содержащие числа, в числа
- JSON_FORCE_OBJECT Преобразует массивы с числовыми ключами в объекты JSON (в обычных условиях они преобразуются в массивы).

Флаги json_decode:
- JSON_BIGINT_AS_STRING Преобразует большие целые числа (которые превышают пределы допустимых чисел PHP) в строки вместо их обрезания
- JSON_OBJECT_AS_ARRAY Преобразует объекты JSON в ассоциативные массивы

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Composer

A

Composer — это инструмент для управления зависимостями в PHP. Он помогает устанавливать, обновлять и контролировать версии библиотек, которые необходимы для проекта

composer.json — это конфигурационный файл, в котором описываются зависимости проекта, скрипты, автозагрузка и другая информация, необходимая для работы с Composer. Этот файл содержит указания, какие библиотеки нужны для проекта и в каких диапазонах версий.

composer.lock — это файл, в котором фиксируются точные версии библиотек, которые были установлены при последнем запуске команды composer install или composer update.

Команда composer require используется для добавления новой зависимости в проект.
Команда composer update обновляет зависимости до последних доступных версий в соответствии с требованиями, указанными в composer.json.
composer install устанавливает зависимости, используя информацию из файла composer.lock

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

PSR-1: Basic Coding Standart

A

Стандарт для высокого уровня технической совместимости между общими кодами PHP

  • Файлы ДОЛЖНЫ использовать только теги <?phpи <?=
  • Файлы ДОЛЖНЫ либо объявлять символы (классы, функции, константы и т. д.) , либо вызывать побочные эффекты (например, генерировать вывод, изменять настройки .ini и т. д.), но НЕ ДОЛЖНЫ делать и то, и другое.
  • Пространства имен и классы ДОЛЖНЫ следовать «автозагрузочному»
  • Имена классов ДОЛЖНЫ быть объявлены в StudlyCaps.
  • Константы класса ДОЛЖНЫ быть объявлены в верхнем регистре с разделителями-подчеркиваниями.
  • Имена методов ДОЛЖНЫ быть объявлены в camelCase.
  • PHP-код ДОЛЖЕН использовать только UTF-8 без BOM
  • Каждый класс находится в отдельном файле и находится в пространстве имен как минимум одного уровня: имени поставщика верхнего уровня
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

PSR-4: Autoloader

A

Этот PSR описывает спецификацию для автозагрузки классов из путей к файлам.
- Полностью определенное имя класса ДОЛЖНО иметь имя пространства имен верхнего уровня, также известное как «пространство имен поставщика»
- Полное имя класса МОЖЕТ иметь одно или несколько имен подпространств имен
- Полностью определенное имя класса ДОЛЖНО иметь конечное имя класса
- Буквенные символы в полном имени класса МОГУТ быть любой комбинацией строчных и заглавных букв.
- Все имена классов ДОЛЖНЫ указываться с учетом регистра.
- Имя конечного класса соответствует имени файла, заканчивающемуся на .php. Имя файла ДОЛЖНО соответствовать регистру имени конечного класса

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

PSR-12: Extended Coding Style

A

Цель этой спецификации — уменьшить когнитивное трение при сканировании кода разных авторов
- Закрывающий ?>тег ДОЛЖЕН быть опущен в файлах, содержащих только PHP.
- Каждая инструкция (выражение) должна заканчиваться точкой с запятой и находиться на своей строке
- Объявление пространства имен должно следовать сразу за тегом <?php, за которым может следовать пустая строка.
- Импорт классов через use должен быть отделен одной пустой строкой после объявления пространства имен
- Для отступов используется 4 пробела. Табуляции (tabs) не допускаются

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Что такое фреймворк?

A

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

Популярные PHP-фреймворки:
- Symfony
- Laravel
- Yii
- Zend / Laminas

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Какие задачи решает фреймворк?

A
  • Структурирование кода: Фреймворки предоставляют четкую организацию кода (обычно через MVC — Model-View-Controller), что упрощает поддержку и расширение приложений
  • Управление маршрутами: Фреймворки помогают легко настроить маршрутизацию URL к нужным контроллерам.
  • Работа с базой данных: С помощью ORM (Object-Relational Mapping) системы, фреймворки упрощают взаимодействие с базами данных, предоставляя абстракции над SQL-запросами.
  • Безопасность: Многие фреймворки предоставляют встроенные механизмы защиты от XSS, CSRF, SQL-инъекций и других атак
  • Аутентификация и авторизация: Упрощение процессов управления доступом к различным частям приложения через готовые библиотеки и механизмы.
  • Масштабируемость: Фреймворки помогают создавать легко масштабируемые приложения за счет своей архитектуры.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Преимущества и недостатки фреймворка перед самописным решение

A

Преимущества:
- Экономия времени и усилий
- Стандартизация: Фреймворки следуют стандартам разработки, что делает код более читабельным и поддерживаемым другими разработчиками
- Безопасность: Многие фреймворки включают встроенные решения для обеспечения безопасности, что снижает вероятность ошибок и уязвимостей
- Тестирование: Встроенные или легко подключаемые инструменты для тестирования кода
- Масштабируемость и гибкость: Фреймворки предоставляют инструменты для создания гибких и легко масштабируемых приложений

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Что такое MVC?

A

MVC (Model-View-Controller) — это шаблон проектирования, который разделяет приложение на три взаимосвязанных компонента:
- Модель отвечает за работу с данными и бизнес логикой, взаимодействует с базой данных, хранит правила обработки данных
- Представление отвечает за отображение данных пользователю, не содержит бизнес-логики и только выводит данные, получаемые от контроллера
- Контроллер связывает модель и представление, обрабатывает запросы пользователя, вызывает соответсвующие методы модели, содержит логику маршрутизации

Бизнес-логику следует хранить в Модели (Model). Это связано с тем, что модель отвечает за работу с данными, правилами их обработки и их взаимодействие с другими частями системы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

PHPUnit/Codeception
Общее представление о модульном тестировании

A

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

Цель:
- проверка логики
- изоляция (тестирование каждого модуля в изоляции от остальных)
- раннее выявление ошибок

PHPUnit — это один из самых популярных инструментов для модульного тестирования в PHP. Он предоставляет средства для создания тестов, проверки результатов, формирования отчетов и интеграции с CI/CD процессами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Подходы модульного тестирования и расположение данного вида тестирования в пирамиде

A

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

Подходы к модульному тестированию:
- изоляция компонентов (тест проверяет одну функциональность)
- повторяемость и независимость (одинаковые результаты при каждом запуске независимо от порядка выполнения)
- минимизация логики в тестах
- покрытие пограничных случаев

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

Что такое клиент-серверная архитектура?

A

Клиент-серверная архитектура — это модель взаимодействия, при которой задачи распределены между двумя основными участниками:
- Клиент: это устройство или программа, которая отправляет запросы серверу для получения данных или выполнения действий.
- Сервер: это программа или устройство, которое обрабатывает запросы клиентов, выполняет действия и возвращает данные или результаты.

Характеристики:
- Разделение обязанностей
- Централизация (сервер централизует логику)
- Множественные клиенты
- Протоколы (HTTP, HTTPS, FTP, SMTP)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

Моудльная архитектура
Что такое модуль?

A

Модульная архитектура — это принцип проектирования, при котором система разделена на отдельные независимые части, называемые модулями. Каждый модуль отвечает за выполнение конкретной функции или задачи и имеет четкие границы. Модули взаимодействуют друг с другом через заранее определенные интерфейсы.

Преимущества:
- Простота поддержки
- Повторное использование кода
- Тестируемость (каждый модуль тестируется отдельно)
- Масштабируемость (легко добавлять новые модули или обновлять существующие, не изменяя всю систему)

Недостатки:
- Сложность разработки интерфейсов между модулями
- Увеличение количества кода
- Перегрузка зависимостями (некоторые модули могут зависить от большого числа других модулей)
- Накладные расходы на коммуникацию
- Дополнительное тестирование взаимодействия между модулями

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Модульная архитектура. Что значит протекание логики?

A

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

Почему это плохо:
- Нарушение изоляции (данные одного модуля могут изменяться другим, что скажется на работе всей системы)
- Сложность поддержки
- Увеличение связности
- Трудности тестирования

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

Что такое реляционная БД. Части БД

A

Реляционная база данных (РБД) — это тип базы данных, в которой данные организованы в виде связанных между собой таблиц. Данные в этих таблицах хранятся в строках и столбцах.

Примеры реляционных баз данных: MySQL, PostgreSQL, Oracle, Microsoft SQL Server.

Таблица (англ. Table) — это структура в реляционной базе данных, которая хранит данные в виде строк и столбцов. Каждая таблица содержит информацию о каком-либо объекте или сущности, например, о пользователях, заказах или продуктах

Поле (англ. Column или Field) — это столбец в таблице, который определяет тип данных, хранящихся в данном столбце.

Запись (англ. Row или Record) — это строка в таблице, представляющая собой набор связанных данных о конкретной сущности

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

Отношения данных, первичные ключи

A

Отношения данных — это связи между таблицами в реляционной базе данных. Основные типы отношений:

  • Один к одному (1 записи из таблицы_1 соответствует 1 запись из таблицы_2)
  • Один ко многим (1 записи из таблицы_1 соответствует несколько записей из таблицы_2)
  • Многие ко многим (нескольким записям из таблицы_1 соответсвует несколько записей из таблицы_2. Такие связи реализуются через промежуточные таблицы)

Первичный ключ (Primary Key) — это уникальный идентификатор каждой записи в таблице. Значение первичного ключа должно быть уникальным и не может быть NULL. Этот ключ используется для того, чтобы однозначно идентифицировать каждую строку в таблице.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Целостность данных в БД. Что такое целостность, её виды и возможности обеспечения целостности

A

Целостность данных — это принцип, обеспечивающий корректность, полноту и надежность данных в базе данных.

Основные типы целостности:
- Целостность сущностей (каждая запись уникально идентифицирована)
- Ссылочная целостность (значение внешнего ключа в одной таблице должно соответсвовать значению первичного ключа в другой таблице или быть NULL)
- Целостность данных на уровне ограничений (уникальность, проверка формата, пустые значения)

Обеспечение целостности в MySQL:
- Ограничения, первичные и внешние ключи, уникальность, проверка формата, разрешение/запрет хранить null значения
- Использование транзакций
- Триггеры — это процедуры, которые автоматически выполняются при определенных событиях (например, при вставке, обновлении или удалении записей)
- Индексы могут быть использованы для повышения производительности запросов и обеспечения быстрого поиска, что может также косвенно помочь поддерживать целостность данных

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Нормальные формы БД

A

Нормализация базы данных — это процесс структурирования данных в реляционных базах данных для минимизации избыточности и обеспечения целостности данных.

  1. Первая нормальная форма: все столбцы содержат атомарные (неделимые) значения. Каждое поле содержит 1 значение и не может содержать множества значений, все данные в одной колонке могут быть только одного типа, каждая запись в таблице должна однозначно отличаться от других записей
  2. Вторая нормальная форма: у каждой записи в базе данных должен быть первичный ключ. Нужно удалить избыточные данные из таблицы, которая применяется к нескольким строкам и разместить их в отдельных таблицах
  3. Третья нормальная форма: необходимо чтобы в таблице отсутствовали неключевые столбцы, которые зависят от других неключевых столбцов.
  4. Бойс-Коддова нормальная форма (расширенная 3NF): Ключевые атрибуты составного ключа не должны зависеть от неключевых атрибутов.
  5. Четвёртая нормальная форма: заключается в том, чтобы в таблицах отсутствовали нетривиальные многозначные зависимости
  6. Пятая нормальная форма
  7. Шестая нормальная форма
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
41
Q

MySQL SELECT UNION

A

Команда UNION используется для объединения результатов двух или более SQL-запросов в один набор данных. При этом запросы должны иметь одинаковое количество столбцов и совместимые типы данных.
По умолчанию UNION исключает дубликаты из объединенного результата. Если нужно сохранить дубликаты, используется команда UNION ALL.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
42
Q

MySQL
LEFT JOIN
RIGHT JOIN
INNER JOIN
Отличие разных типов join

A
  1. INNER JOIN
    Назначение:
    Соединяет строки двух таблиц, возвращая только те записи, у которых есть совпадение по ключевому полю (условие соединения). Если запись в одной из таблиц не имеет соответствующей записи в другой таблице, она не будет включена в результат
  2. LEFT JOIN (или LEFT OUTER JOIN)
    Назначение:
    Возвращает все строки из левой таблицы (первой в запросе) и совпадающие строки из правой таблицы. Если для строки из левой таблицы нет соответствующей строки в правой таблице, значения из правой таблицы будут NULL.
  3. RIGHT JOIN (или RIGHT OUTER JOIN)
    Назначение:
    Возвращает все строки из правой таблицы (второй в запросе) и совпадающие строки из левой таблицы. Если для строки из правой таблицы нет соответствующей строки в левой таблице, значения из левой таблицы будут NULL
  4. CROSS JOIN
    возвращает все записи из обеих таблиц
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
43
Q

MySQL INSERT. Как обеспечить безопасную вставку записей?

A
  • Использовать подготовленные выражения (например: передавать данные через параметры)
  • Использование экранирования данных: Если подготовленные выражения не используются, можно применить функцию mysqli_real_escape_string() для экранирования специальных символов, таких как кавычки.
  • Валидация и фильтрация данных: Перед тем как вставлять данные в базу, необходимо проверять их корректность.
  • Использование транзакций: Если необходимо выполнить несколько связанных запросов (например, при вставке в несколько таблиц), рекомендуется использовать транзакции
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
43
Q

MySQL типы данных. Какие существуют?

A

Числовые типы:
- INT (TINYINT, SMALLINT, MEDIUMINT, BIGINT) -целые числа
- FLOAT, DOUBLE- числа с плавающей точкой
- DECIMAL - числа с фиксированной точностью

Строковые типы:
- CHAR - строка фиксированной длинны
- VARCHAR - строка переменной длинны
- TEXT (TINYTEXT, MEDIUMTEXT, LONGTEXT) - большие текстовые блоки

Дата и время:
- DATE - дата
- TIME - время
- DATETIME - дата и время
- TIMESTAMP - метка времени
- YEAR - год в виде 4 цифр

Бинарные типы:
- BINARY(n), VARBINARY(n) – бинарные строки фиксированной и переменной длины
- BLOB – большие бинарные объекты (например, файлы, изображения)

Другие типы:
- ENUM – строковый тип данных с фиксированным набором значений.
- SET – множество строковых значений
- JSON

Пространственные типы данных:
- GEOMETRY - Пространственное значение любого типа
- POINT - Точка (пара координат XY)
- LINESTRING - Кривая (одно или несколько POINT-значений)
- POLYGON - Многоугольник

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

MySQL типы данных. Как влияют на использование памяти?

A
  • Чем больше INT, тем больше паяти нужно для хранения числа (TINYINT - 1b, SMALLINT - 2b, …BIGINT - 8b)
  • DOUBLE точнее FLOAT в 2 раза и они занимают 8 байт и 4 байта соответственно. FLOAT и DOUBLE занимают меньше места по сравнению с DECIMAL, но могут допускать погрешности в вычислениях
  • DATE, TIME используют 3 байта, DATETIME - 8 байт, а TIMESTAMP - 4
  • CHAR всегда занимает фиксированное количество памяти, даже если строка короче, чем максимальная длина. Это может привести к перерасходу памяти
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

MySQL функции для работы со строками

A
  1. Конкатенация (Объединение строк). CONCAT(str1, str2, …): Объединяет две или более строки в одну
  2. Извлечение подстрок SUBSTRING(str, pos, len): Возвращает подстроку, начиная с позиции pos длиной len
  3. LEFT(str, len): Возвращает len символов с начала строки
  4. RIGHT(str, len): Возвращает len символов с конца строки
  5. INSTR(str, substr): Возвращает позицию первой найденной подстроки в строке, или 0, если подстрока не найдена.
  6. REPLACE(str, from_str, to_str): Заменяет все вхождения подстроки from_str в строке на to_str
  7. LOWER(str): Преобразует строку в нижний регистр.
  8. TRIM([remstr FROM] str): Удаляет пробелы или символы remstr с обоих концов строки
  9. LPAD(str, len, padstr): Дополняет строку str до длины len, добавляя символы padstr слева
  10. LENGTH(str): Возвращает длину строки в байтах (не символах)
  11. CHAR_LENGTH(str): Возвращает количество символов в строке
  12. STRCMP(str1, str2): Сравнивает две строки. Возвращает 0, если строки равны, -1, если str1 меньше, чем str2, и 1 в противном случае
  13. REVERSE(str): Возвращает строку в обратном порядке
  14. HEX(str): Преобразует строку в шестнадцатеричный формат
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

MySQL функции для работы с числами

A
  1. ABS(x): Возвращает абсолютное значение числа x
  2. MOD(x, y): Возвращает остаток от деления числа x на y
  3. DIV: Целочисленное деление, возвращает результат деления без остатка
  4. ROUND(x, d): Округляет число x до d знаков после запятой. Если d не указан, округляет до целого числа
  5. SIN(x), COS(x), TAN(X)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
45
Q

Redis. Что такое и где применять?

A

Redis (Remote Dictionary Server) — это высокопроизводительное хранилище данных в оперативной памяти, которое используется как база данных, кэш и брокер сообщений

Применение Redis:
- Кэширование данных: Redis часто используется для кэширования данных, так как хранение данных в оперативной памяти позволяет ускорить доступ к часто используемым данным.
- Сессии и авторизация: Веб-приложения могут использовать Redis для хранения пользовательских сессий.
- Очереди задач: Redis может использоваться для организации очередей задач (например, в фоновом режиме), что упрощает асинхронную обработку задач в приложениях
- Pub/Sub (Публикация/Подписка): Redis может быть использован для реализации систем обмена сообщениями
- Хранилище для временных данных: Redis часто используется для хранения временных данных, таких как одноразовые токены доступа или временные результаты вычислений

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
45
Q

MySQL функции для работы с датами и временем

A
  1. NOW(): Возвращает текущую дату и время.
  2. CURDATE(): Возвращает текущую дату (без времени)
  3. DATE(expr): Извлекает только дату из значения expr
  4. DATE_FORMAT(date, format): Форматирует дату в соответствии с указанным форматом
  5. DATE_ADD(date, INTERVAL expr unit): Добавляет к дате определенный интервал времени
  6. DATE_SUB(date, INTERVAL expr unit): Вычитает из даты определенный интервал времени
  7. DATEDIFF(date1, date2): Возвращает количество дней между двумя датами
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
46
Q

Общие принципы протоколов HTTP и HTTPS

A

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

  • Клиент-серверная архитектура: HTTP работает по модели “запрос-ответ”. Клиент (обычно браузер) посылает запрос на сервер, а сервер отвечает нужными данными.
  • Протокол без состояния: HTTP не сохраняет информацию о предыдущих запросах. Каждый запрос обрабатывается независимо от других
  • Методы запросов GET, POST, PUT, DELETE, PATCH
  • Заголовки: HTTP использует заголовки для передачи информации о запросах и ответах, например, тип контента, кодировка, длина сообщения и т.д

В отличие от HTTP, HTTPS:
- HTTPS использует шифрование для защиты данных во время передачи
- Сервер HTTPS использует сертификаты, чтобы удостоверить свою подлинность. Когда браузер получает сертификат, он проверяет его с помощью центра сертификации (CA), чтобы убедиться в подлинности сервера
- Перед началом передачи данных устанавливается защищённое соединение с использованием протоколов SSL/TLS, которое шифрует все данные. Только отправитель и получатель могут дешифровать передаваемую информацию

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
47
Q

Централизованная и децентрализованной VCS

A

Система контроля версий (VCS - Version Control System) — это инструмент, который помогает отслеживать изменения в исходном коде и других файлах проекта с течением времени.

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
48
Q

Принципы REST API

A
  • Клиент-серверная архитектура: Разделение клиента и сервера. Клиент отвечает за пользовательский интерфейс и взаимодействие с пользователем, сервер управляет данными и бизнес-логикой
  • Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки. Сервер не сохраняет состояние между запросами
  • Ответы сервера должны быть маркированы как кэшируемые или некэшируемые. Это позволяет снизить нагрузку на сервер, если кэшируемые данные могут быть повторно использованы
  • REST API следует концепции единообразного интерфейса, что упрощает взаимодействие с сервисом. Включает такие аспекты, как четкое разграничение ресурсов и их представлений
  • Каждый ресурс в системе идентифицируется через уникальный URI
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
49
Q

SQL Injection. Как проявляется, как защитится

A

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

Как защититься от SQL-инъекций:
- Использование подготовленных выражений
- Использование ORM (Object-Relational Mapping)
- Экранирование данных
- Проверка и фильтрация данных: Необходимо проверять и фильтровать пользовательский ввод, чтобы убедиться, что он соответствует ожидаемому формату
- Минимизация прав доступа к базе данных
- Использование веб-фаерволов

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
50
Q

Qitflow

A

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

Главные ветки:
- master (или main): Эта ветка содержит стабильный код
- develop: Ветка, содержащая последний интегрированный код с новыми функциями

Вспомогательные ветки:
- Feature ветки (feature/): Используются для разработки новых функций (feature). Эти ветки создаются от ветки develop и по завершении сливаются обратно в develop
- Release ветки (release/
): Создаются, когда команда готовится к выпуску новой версии программного обеспечения
- Hotfix ветки (hotfix/*): Предназначены для срочных исправлений критических ошибок в продакшн-коде

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
50
Q

XSS - Межсайтовый скриптинг. Как проявляется, как защитится

A

XSS (Cross-Site Scripting), или межсайтовый скриптинг, — это уязвимость веб-приложений, позволяющая злоумышленнику внедрять вредоносные скрипты в веб-страницы, которые затем отображаются другим пользователям. Это может привести к кражам сессий, доступу к конфиденциальной информации, а также другим нежелательным действиям на стороне клиента.

Как проявляется:
- Встраивание скриптов в веб-страницы
- Отображение данных, полученных от других пользователей

Защита:
- Экранирование данных
- Использование Content Security Policy (CSP): CSP позволяет ограничить источники, из которых может загружаться контент, включая скрипты
- Проверка и валидация данных
- Избегайте вставки пользовательского ввода в HTML без экранирования

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
51
Q

Что значит передача переменных по ссылке и по значению?
Как осуществляется передача объектов?

A

Когда переменная передается по значению, функция получает копию значения этой переменной. Изменения, сделанные внутри функции, не влияют на оригинальную переменную.

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

В PHP все объекты передаются по ссылке.

51
Q

Как вызвать функцию через переменную?
Синтаксис стрелочной функции
Что такое анонимная функция?

A

Чтобы вызвать функцию через переменную, вы можете присвоить имя функции переменной и затем вызвать ее, используя круглые скобки
$functionName = ‘sayHello’;
echo $functionName();

Стрелочные функции (или лямбда-функции) — это сокращенная запись для анонимных функций в PHP, введенная в версии 7.4. Они позволяют определять функции без необходимости использования ключевого слова function. Стрелочные функции также автоматически захватывают переменные из области видимости
$function = fn($arg1, $arg2) => $arg1 + $arg2;

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

52
Q

Классы. Магические методы

A

Магические методы — это специальные методы, которые начинаются с двойного подчеркивания (__) и вызываются автоматически при выполнении определенных действий с объектом

__construct()
Вызывается автоматически при создании объекта. Это конструктор, который можно использовать для инициализации свойств объекта

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

__get($property)
Вызывается при попытке доступа к недоступному или несуществующему свойству объекта

__set($property, $value)
Вызывается при попытке присвоить значение недоступному или несуществующему свойству объекта

__call($name, $arguments)
Вызывается при попытке вызвать несуществующий или недоступный метод объекта

__callStatic($name, $arguments)
Вызывается при попытке вызвать несуществующий или недоступный статический метод класса

__toString()
Вызывается, когда объект пытаются использовать как строку

__invoke()
Вызывается, когда объект пытаются использовать как функцию

__clone()
Вызывается при клонировании объекта, позволяет контролировать процесс копирования

52
Q

Классы
Ключевое слово final
Клонирование объектов
Сравнение объектов

A

Ключевое слово final в PHP используется для предотвращения наследования классов или переопределения методов в подклассах. Когда класс или метод объявлен как final, это означает, что он не может быть унаследован или переопределён

В PHP для клонирования объектов используется ключевое слово clone. По умолчанию, при клонировании объекта создаётся копия всех его свойств

Сравнение объектов
Оператор == (сравнение значений):
Этот оператор сравнивает объекты по их свойствам. Два объекта считаются равными, если их свойства совпадают, даже если это разные экземпляры классов

Оператор === (сравнение ссылок на объекты):
Этот оператор проверяет, являются ли два объекта одним и тем же экземпляром (то есть, находятся ли они в одной области памяти)

53
Q

Ошибки
Какие уровни существуют?
Какие существуют способы установки уровня?

A
  • E_ERROR: Фатальная ошибка, которая приводит к остановке выполнения скрипта.
  • E_WARNING: Предупреждение о нефатальной ошибке. Скрипт продолжит выполнение, но может возникнуть неожиданное поведение.
  • E_PARSE: Ошибка синтаксиса во время компиляции. Такие ошибки обычно обнаруживаются еще до запуска скрипта.
  • E_NOTICE: Сообщение о том, что что-то может быть не так, но это не приводит к остановке выполнения скрипта (например, использование переменной, которая не была инициализирована).
  • E_STRICT: Уведомления, которые советуют применять правильные и стандартизированные методы программирования.
  • E_DEPRECATED: Сообщение о том, что функция или метод устарели и могут быть удалены в будущих версиях PHP.
  • E_USER_ERROR: Фатальная ошибка, созданная пользователем с помощью функции trigger_error().
  • E_USER_WARNING: Предупреждение, созданное пользователем.
  • E_USER_NOTICE: Сообщение, созданное пользователем

Основные уровни ошибок:
- E_ALL: Включает все типы ошибок
- E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING: Эти типы ошибок возникают во время запуска PHP или во время компиляции
- 0 - отключение всех сообщений об ошибках

Способы установки уровня ошибок
- error_reporting(E_ALL);
- Установка уровня через файл конфигурации php.ini
- ini_set(‘error_reporting’, E_ALL)
- Установка ошибок в Apache или Nginx

54
Q

Генераторы
Назначение и отличие от обычного перебора коллекции данных
Синтаксис
Когда имеет смысл использовать генератор?

A

Генераторы в PHP — это специальная функция, которая позволяет создавать итераторы (объекты, которые можно перебирать), не загружая всю коллекцию данных в память сразу. Вместо этого они «лениво» генерируют значения по мере необходимости, что делает их очень эффективными для работы с большими объемами данных

Назначение и отличия: Эффективное использование памяти (при переборе коллекции все данные загружаются сразу же, генератор же может может возвращать данные по одному элементу за раз)

Имеет смысл использовать:
- работа с большими данными
- ленивые вычисления

55
Q

Как записать прочитать/записать файл построчно?
Как записать прочитать/записать файл целиком?

A

Для построчного чтения файла в PHP можно использовать функцию fgets(), которая считывает файл по одной строке

Для записи файла построчно можно использовать функцию fwrite(), которая записывает данные в открытый файл

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

Для записи данных в файл целиком можно использовать функцию file_put_contents()

56
Q

Паттерны проектирования. Паттерн стратегия

A

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

Паттерн “Стратегия” — это поведенческий паттерн, который позволяет определить семейство схожих алгоритмов (или стратегий) и вынести их в отдельные классы. Это позволяет изменять алгоритм во время выполнения программы.

Когда использовать:
- Когда нужно выполнять разные действия в зависимости от состояния объекта.
- Когда имеется несколько схожих алгоритмов, которые можно переключать во время выполнения программы.
- Когда нужно избежать большого количества условных операторов (например, if-else или switch).

Примеры:
- интерфейс TaxStrategy с функцией расчёта нлога. Классы EuropeTax, RussiaTax, USATax и класс TaxCalculator, который принимает в конструкторе TaxStrategy
- Выбор способа сортировки

56
Q

Паттерны проектирования. Паттерн фабрика

A

Паттерн “Фабрика” — это порождающий паттерн, который определяет интерфейс для создания объектов, но позволяет подклассам решать, какой именно объект создавать. Основная идея — делегировать создание объектов отдельному классу или методу

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

Примеры:
- Создание автомобилей. Интерфейс Car, классы Sedan, Audi. Класс CarFactory, принимающий на входе тип и возвращающий соответствующий класс машины
- Создание подключения к базе данных
- Создание уведомлений

57
Q

KISS (Keep It Simple, Stupid / Будь проще)

A

Принцип KISS (Keep It Simple, Stupid) — это один из фундаментальных принципов программирования и проектирования систем, который рекомендует делать вещи как можно проще, без ненужных усложнений. Основная идея этого принципа заключается в том, что проще писать и поддерживать код, когда он не перегружен сложными конструкциями и излишней логикой.

Аспекты:
- Простота (код должен быть простым и понятным)
- Минимизация (не следует добавлять код, который не требуется для выполнения поставленной задачи)
- Читаемость
- Удобство сопровождения

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

58
Q

DRY (Don’t Repeat Yourself / Не повторяйтесь)

A

Принцип DRY (Don’t Repeat Yourself / Не повторяйтесь) — это один из ключевых принципов разработки программного обеспечения, направленный на устранение дублирования кода. Его суть заключается в том, что одна и та же логика или данные должны быть представлены в коде только один раз, а не повторяться в нескольких местах

58
Q

YAGNI (You Aren’t Gonna Need It / Вам это не понадобится)

A

Принцип YAGNI (You Aren’t Gonna Need It / Вам это не понадобится) — это концепция разработки программного обеспечения, которая гласит, что не следует добавлять функциональность или код, которые не являются необходимыми для текущей задачи. Часто разработчики стремятся предусмотреть возможные будущие изменения или расширения, но YAGNI напоминает, что это приводит к усложнению системы без реальной пользы

Пример соблюдения YAGNI:
Представим, что вы разрабатываете систему, и на текущем этапе требуется функция для отправки уведомлений по электронной почте. По принципу YAGNI, вы просто реализуете отправку email, не пытаясь предусмотреть поддержку других типов уведомлений, таких как SMS или push-уведомления, если эти требования не актуальны

59
Q

BDUF (Big Design Up Front / Глобальное проектирование прежде всего)

A

BDUF (Big Design Up Front / Глобальное проектирование прежде всего) — это подход к разработке программного обеспечения, в котором большая часть проектирования и планирования системы выполняется до начала ее непосредственной разработки. В этом подходе акцент делается на тщательное и детальное планирование архитектуры и всех аспектов системы перед написанием кода.

Преимущества:
- Чёткое видение преокта
- Уменьшение риска незавершённости
- Лёгкость в оценке сроков
- Фиксирвоанные требования
- Меньше изменений во время разработки

Недостатки:
- Отсутствие гибкости
- Высокая стоимость изменений
- Риск неправильного проектирования
- Длительное начало проекта

60
Q

APO (Avoid Premature Optimization / Избегайте преждевременной оптимизации)

A

APO (Avoid Premature Optimization / Избегайте преждевременной оптимизации) — это принцип разработки программного обеспечения, который предостерегает от оптимизации кода и систем до того, как это станет действительно необходимым. Суть этого принципа заключается в том, что разработчики должны сначала сосредоточиться на создании работающего решения, а затем по мере необходимости оптимизировать его для повышения производительности

60
Q

SOLID

A

S - Single Responsibility Principle (Принцип единственной ответственности):
Каждый класс должен иметь одну и только одну причину для изменения, то есть выполнять только одну задачу или функцию

O - Open/Closed Principle (Принцип открытости/закрытости):
Сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации.
Это позволяет добавлять новую функциональность, не изменяя существующий код

L - Liskov Substitution Principle (Принцип подстановки Лисков):
Объекты подтипов должны быть заменяемы объектами суперкласса без изменения правильности программы

I - Interface Segregation Principle (Принцип разделения интерфейса):
Клиенты не должны зависеть от интерфейсов, которые они не используют. Лучше иметь несколько специализированных интерфейсов, чем один общий

D - Dependency Inversion Principle (Принцип инверсии зависимостей):
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций (интерфейсов или абстрактных классов).
Абстракции не должны зависеть от деталей, детали должны зависеть от абстракций

60
Q

PSR-6: Caching Interface
Что такое Cache Pool?
Что такое Cache Item?
Какие данные можно хранить в кэше?
На основе чего формируется cacheKey?

A

PSR-6 определяет стандарт интерфейсов для кэширования в PHP. Он включает в себя набор рекомендаций, позволяющих разработчикам использовать кэширование в приложениях, обеспечивая совместимость между различными библиотеками и фреймворками

Pool представляет собой набор элементов в системе кэширования. Pool — это логический репозиторий всех элементов, которые он содержит. Все кэшируемые элементы извлекаются из Pool как объект Item, и все взаимодействие со всей вселенной кэшированных объектов происходит через Pool.

Элемент представляет собой отдельную пару ключ/значение в пределах пула. Ключ является основным уникальным идентификатором элемента и ДОЛЖЕН быть неизменяемым. Значение МОЖЕТ быть изменено в любое время.

Кэш может хранить простые данные, массивы, объекты, сериализованные данные, JSON

cacheKey должен быть уникальным. Можно использовать префиксы чтобы сгруппировать кэшируемые данные

60
Q

MySQL транзакции. Что такое: Когда использовать? Чем опасны длительные транзакции?

A

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

Используются для:
- комплексных операций
- обеспечения целостности
- критические операции
- консистентность при многопользовательском доступе

Длительные транзакции опасны:
- блокировками (удержание блокировки на таблицах или строках, что приводит к блокировке других транзакций)
- снижение производительности
- использование ресурсов памяти и увеличение нагрузки на сервер
- увеличение вероятности ошибки
- проблемы с изоляцией

60
Q

Что такое нереляционная БД?
Приведи пример когда нереляционная БД подойдет лучше чем реляционная?

A

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

Типы нереляционных БД:
- Документные БД (MongoDB, CouchDB)
- Ключ-значение (Redis)
- Графовые (ArangoDB)
- Колонковые (Apache Cassandra)

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

60
Q

Знания о следующих встроенных интерфейсах, классах:
Traversable
Iterator
IteratorAggregate
Throwable
ArrayAccess
Serializable
Closure
Generator

A

Traversable
Интерфейс, который не может быть реализован напрямую. Он служит основой для других интерфейсов, таких как Iterator и IteratorAggregate, чтобы обозначить, что объект может быть перебран с помощью конструкций foreach

Iterator
Позволяет объекту быть перебираемым с помощью конструкции foreach. Он требует реализации нескольких методов, которые позволяют управлять курсором, доступом к элементам и их перебором (current, key, next, rewind, valid)

IteratorAggregate
Позволяет классу возвращать внешний итератор, используя метод getIterator(). Он полезен, когда нужно предоставить собственный способ перебора элементов, не реализуя все методы Iterator

Throwable
Интерфейс, который реализуют все исключения и ошибки в PHP (с версии 7.0). Он позволяет использовать единый механизм для обработки исключений и ошибок

ArrayAccess
Интерфейс позволяет объектам вести себя как массивы, предоставляя доступ к элементам с помощью квадратных скобок

Serializable
Интерфейс позволяет объектам определять, как они должны сериализоваться и десериализоваться, что полезно для сохранения состояния объектов

Closure
Класс, который представляет анонимные функции (замыкания) в PHP

60
Q

PSR-3: Logger Interface

A

PSR-3: Logger Interface — это стандарт, разработанный PHP-FIG (PHP Framework Interop Group), который определяет общий интерфейс для логирования в PHP-приложениях. Он позволяет создавать совместимые с различными библиотеками логирования компоненты и обеспечивает единообразие в подходах к логированию

Логгер:
Интерфейс определяет методы для различных уровней логирования. Каждый уровень соответствует определённой серьёзности события

Уровни логирования:
emergency: система полностью недоступна.
alert: необходимо немедленное действие.
critical: критическая ошибка, препятствующая нормальной работе.
error: ошибка, требующая внимания, но не критическая.
warning: предупреждение о потенциальной проблеме.
notice: важное сообщение, которое не является ошибкой.
info: информационное сообщение, которое может быть полезным.
debug: сообщения, полезные для отладки

61
Q

Composer. Оптимизация autoload

A

Для повышения производительности в продакшн-окружении можно оптимизировать автозагрузку классов с помощью Composer. Оптимизация позволяет сгенерировать единый файл, который содержит всю информацию о классах

–no-dev
Эта команда не только оптимизирует автозагрузку, но и исключает установку пакетов, которые нужны только для разработки

–classmap-authoritative
Этот параметр запрещает динамическое сканирование файлов и использует только заранее сгенерированную карту классов.

62
Q

Что такое байт код?

A

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

63
Q

Что такое ReflectionObject и как можно использовать?

A

ReflectionObject — это класс в PHP, который является частью библиотеки Reflection API. Reflection позволяет динамически анализировать и изменять поведение классов, объектов, методов и свойств программы во время выполнения

Позволяет получить методы и свойства объектов, вызывать приватные свойства методов, изменять значение свойств

64
Q

Библиотека SPL Структуры данных: стек, очередь, список, дерево, граф

A

Библиотека SPL (Standard PHP Library) предоставляет различные структуры данных и инструменты, которые облегчают работу с общими задачами программирования. Среди них структуры данных, такие как стек, очередь и список, которые позволяют организовывать и манипулировать данными определённым образом

Стек — это структура данных, которая работает по принципу LIFO (Last In, First Out), что означает, что последний добавленный элемент извлекается первым

Очередь — это структура данных, работающая по принципу FIFO (First In, First Out), что означает, что первый добавленный элемент извлекается первым

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

Дерево (Tree): — иерархическая структура данных, где каждый узел имеет родителя и может иметь несколько потомков

Граф — множество узлов (вершин), соединенных рёбрами (ребра могут быть направленными или ненаправленными)

64
Q

Что такое Handlers в Guzzle?
Что такое Middleware в Guzzle?
Как добавить Middleware?

A

Handlers в Guzzle — это ядро системы выполнения запросов. Каждый HTTP-запрос, созданный с помощью Guzzle, в конечном итоге проходит через handler, который отвечает за выполнение самого запроса и возврат результата

Middleware — это слои, которые “оборачивают” запросы и ответы, позволяя вмешиваться в обработку на любом этапе

$loggingMiddleware = Middleware::tap();
$stack = HandlerStack::create();
$stack->push($loggingMiddleware); // Добавляем middleware в стек
$client = new Client([‘handler’ => $stack]);
$response = $client->get(‘https://api.example.com/data’);

65
Q

Паттерны проектирования, классификация

A

Паттерны проектирования — это повторяющиеся решения общих задач в программировании.

Классификация паттернов:
- Порождающие (создание объектов)
- Структурные (организация классов и объектов)
- Поведенческие (взаимодействие между объектами и классами)

Порождающие
- Singleton (Одиночка)
Гарантирует, что у класса будет только один экземпляр, и предоставляет глобальную точку доступа к нему
- Factory Method (Фабричный метод)
Определяет интерфейс для создания объектов, но оставляет подклассам решение о том, какой класс инстанцировать
- Abstract Factory (Абстрактная фабрика)
Предоставляет интерфейс для создания семейств взаимосвязанных объектов, не специфицируя конкретные классы
- Prototype: Создает новые объекты путем копирования существующих объектов (прототипов)

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

Поведенческие паттерны:
- Observer (Наблюдатель)
Определяет зависимость “один ко многим” между объектами таким образом, что при изменении состояния одного объекта все зависимые объекты уведомляются и обновляются автоматически

  • Strategy (Стратегия)
    Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Стратегия позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
65
Q

Что такое гексагональная архитектура?
Какие плюсы/минусы?

A

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

Домен (Core) — центральная часть, содержащая бизнес-логику. Она не должна зависеть от внешних компонентов (БД, API и т.д.).
Порты (Ports) — интерфейсы или абстракции, через которые внешние системы могут взаимодействовать с бизнес-логикой. Порты представляют входные и выходные точки для коммуникации с доменом.
Адаптеры (Adapters) — реализуют порты и служат “переводчиками” между бизнес-логикой и внешними системами. Это может быть, например, адаптер для базы данных, который превращает запросы из бизнес-логики в SQL-запросы.
Внешние системы — базы данных, API, пользовательские интерфейсы, фреймворки и любые другие инфраструктурные компоненты

Плюсы:
- Чистая бизнес-логика
- Легкость тестирования
- Гибкость и масштабируемость
- Разделение ответственности

Минусы:
- Повышенная сложность
- Требуется строгая организация кода
- Увеличение количества классов

66
Q

Какие “классические” алгоритмы знаешь?

A

Поиск: Линейный поиск, бинарный поиск
Сортировка: Пузырьковая сортировка, Быстрая сортировка

66
Q

MySQL
Что такое временная таблица?
В каких случаях может пригодиться?

A

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

Когда могут пригодиться временные таблицы?
- Обработка промежуточных данных
- Оптимизация сложных запросов: Временные таблицы могут помочь разбить сложные запросы на несколько шагов, уменьшая нагрузку на СУБД
- Работа с отчетами: В случаях, когда нужно собрать данные для временного анализа или построения отчетов
- Агрегирование данных: Иногда для промежуточного хранения агрегированных данных полезно создать временную таблицу, особенно если результаты могут использоваться в нескольких запросах

66
Q

MySQL конкурентные запросы/блокировки

A

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

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

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

Проблемы с блокировками
- Deadlock (взаимная блокировка): Ситуация, когда две или более транзакции блокируют друг друга
- Starvation (голодание): Состояние, когда транзакция не может получить доступ к необходимым ресурсам из-за постоянных блокировок другими транзакциями. Это может произойти, если есть другие транзакции, которые всегда выполняются раньше, чем текущая

67
Q

MySQL
Индексы
Виды, назначение и использование

A

Индексы в MySQL (как и в других СУБД) — это специальные структуры данных, которые ускоряют операции поиска, фильтрации, сортировки и соединения таблиц. Индексы работают аналогично указателям в книге: они помогают быстрее найти нужные данные, без необходимости полного сканирования таблицы. В базах данных индекс хранит ссылки на строки таблицы в отсортированном порядке по значению индексируемого столбца или столбцов, что позволяет быстро найти строки с определёнными значениями

Типы индексов в MySQL
- Обычный (B-Tree) индекс:
Это самый распространенный тип индекса, основанный на B-дереве. Он эффективен для поиска точных значений и диапазонов
- Уникальный индекс
- Индекс на несколько столбцов
- Полнотекстовый (FULLTEXT) индекс
- Индекс для полей с пространственными данными (координаты)
- Индекс на основе хеширования

67
Q

PostgresQL
Общее представление (когда использовать, отличия от mysql)

A

PostgreSQL — это объектно-реляционная база данных с открытым исходным кодом, которая отличается высокой надежностью, масштабируемостью и соответствием стандартам SQL

Когда использовать PostgreSQL:
- Требования к сложным запросам и транзакциям
- Работа с геопространственными данными: PostgreSQL имеет расширение PostGIS для работы с геоданными, что делает его идеальным выбором для ГИС-систем
- Производительность в многопользовательских системах: PostgreSQL хорошо масштабируется и поддерживает параллельные операции, что делает его хорошим выбором для высоконагруженных систем

Отличия:
- PostgreSQL лучше обрабатывает сложные и ресурсоемкие операции
- PostgreSQL предлагает более продвинутые и гибкие решения для больших и распределенных систем
- PostgreSQL предлагает гораздо более широкий набор типов данных, включая поддержку массивов, hstore (ключ-значение), JSON, XML и даже пользовательские типы данных
- PostgreSQL поддерживает параллельные запросы, что улучшает производительность при работе с большими объемами данных

68
Q

MySQL
Способы определения медленных запросов
Анализ запроса EXPLAIN
Способы оптимизации

A

Способ определения
- MySQL предоставляет встроенную возможность записи медленных запросов в специальный журнал (slow query log)
- Утилита mysqldumpslow анализирует файл журнала медленных запросов и группирует результаты для выявления наиболее частых или долгих запросов
- Команда EXPLAIN позволяет получить информацию о том, как MySQL выполняет запросы, что помогает в их оптимизации

Способы оптимизации:
- Добавление индексов
- Оптимизация соединений (JOIN)
- Избегание полного сканирования таблиц
- Использование LIMIT
- Иногда подзапросы можно заменить на JOIN или объединение нескольких запросов, что улучшает производительность
- Если данные не меняются часто, используйте кэширование запросов с помощью MySQL Query Cache
- Указывайте только необходимые поля для выборки данных

69
Q

git cherry-pick

A

git cherry-pick — это команда в Git, которая позволяет вам применить изменения из одного или нескольких коммитов в другую ветку

git cherry-pick <commit-hash></commit-hash>

69
Q

Git merge и git rebase. Отличия и применение

A

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

Отличия:
- merge создаёт точку слияния, оставляя историю изменений разветвлённой, а rebase делает историю без разветвлений
- rebase изменяет история коммитов, переписывая её

70
Q

Для чего можно использовать git stash?
Как использовать?

A

Git Stash — это команда в Git, позволяющая временно сохранять изменения в рабочем каталоге, не фиксируя их в коммите. Это удобно, когда вам нужно переключиться на другую ветку или выполнить другую задачу, но вы не хотите или не можете зафиксировать текущие изменения.

71
Q

oauth. Теоретическое представление

A

OAuth (Open Authorization) — это протокол авторизации, который позволяет сторонним приложениям получать ограниченный доступ к защищённым ресурсам на сервере без необходимости передачи учётных данных пользователя (таких как имя пользователя и пароль)

Вместо передачи пароля пользователя, OAuth использует токены доступа, которые представляют собой уникальные идентификаторы, позволяющие клиенту получить доступ к ресурсам

Access Token: Токен, который предоставляет клиенту доступ к ресурсам в определённый период времени.
Refresh Token: Токен, который позволяет клиенту получить новый access token, когда старый истекает

72
Q

MongoDB
Общее представление (когда использовать, отличия от mysql)

A

MongoDB — это нереляционная (NoSQL) база данных, которая хранит данные в формате JSON-подобных документов

Когда использовать MongoDB:
- Когда данные не имеют строгой структуры
- Для хранения больших объемов данных
- Когда требуется хранить документы с вложенными данными или списками (например, в системах управления контентом).
- Когда необходимо легко масштабировать базу данных на несколько серверов

Отличия от MySQL:
- Структура данных (MongoDB данные хранятся в виде документов (JSON), а в MySQL — в таблицах)
- MySQL использует строгие схемы данных (таблицы, поля), а MongoDB не требует схемы — документы могут иметь разные поля
- MongoDB легко масштабируется горизонтально (sharding), в то время как MySQL лучше подходит для вертикального масштабирования
- MySQL использует язык запросов SQL, MongoDB — собственный язык запросов, работающий с документами

73
Q

OpenId. Теоретическое представление

A

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

Идентификатор OpenID: Это URL-адрес или URI, который служит уникальным идентификатором для пользователя. Пользователь регистрируется у провайдера OpenID и получает свой идентификатор, который затем может использовать для аутентификации на других сайтах.
Провайдер OpenID: Это сервис, который хранит учётные данные пользователя и обрабатывает аутентификацию. Популярные провайдеры OpenID включают Google, Yahoo и другие.
Клиенты OpenID: Это веб-сайты или приложения, которые поддерживают OpenID и могут принимать аутентификацию через него

74
Q

SOAP. Теоретическое представление

A

SOAP (Simple Object Access Protocol) — это протокол обмена сообщениями, который используется для передачи структурированных данных в распределённых средах, таких как веб-сервисы. Он основан на XML и позволяет различным приложениям, работающим на разных платформах и языках программирования, взаимодействовать друг с другом.

75
Q

JWT. Теоретическое представление

A

JWT (JSON Web Token) — это стандарт (RFC 7519), который определяет компактный и автономный способ безопасной передачи информации между сторонами в виде JSON-объекта.

  1. Пользовательский вход (логин). Сервер: Проверяет учетные данные (например, сравнивает с данными в базе данных). Если учетные данные корректны, сервер генерирует JWT. JWT обычно содержит информацию о пользователе, например, его ID и роли, а также дату истечения токена
  2. Сервер создает подпись токена с помощью секретного ключа, чтобы предотвратить подделку.
  3. Сервер отправляет токен обратно пользователю в ответе
  4. После получения токена пользователь может использовать его для доступа к защищённым маршрутам
76
Q

Twelve-Factor App

A

Twelve-Factor App — это методология для разработки современных веб-приложений, которая позволяет создавать легко управляемые, масштабируемые и портативные приложения

  1. Codebase
    Один кодовой базы для одного приложения, которая может храниться в системе контроля версий (например, Git).
    Разные среды (разработка, тестирование, продакшн) могут использовать разные ветки, но всегда ссылаются на одну кодовую базу
  2. Dependencies
    Явно указывайте все зависимости приложения в явном файле конфигурации (например, composer.json для PHP, requirements.txt для Python).
    Используйте менеджеры пакетов, чтобы управлять зависимостями
  3. Config
    Храните конфигурацию отдельно от кода, используя переменные окружения (например, переменные окружения, доступные через $_ENV в PHP или os.environ в Python).
  4. Backing Services
    Считайте все сторонние сервисы (например, базы данных, кэш, API) как «бэкенд-сервисы», которые могут быть подключены через конфигурацию
  5. Build, Release, Run
    Разделяйте процесс сборки, релиза и выполнения приложения
  6. Processes
    Приложение должно состоять из одного или нескольких независимых процессов
  7. Port Binding
    Приложение должно быть самодостаточным и должно «выходить» на определенный порт
  8. Concurrency
    Используйте масштабирование через процессы (например, воркеры) для обработки нагрузки
  9. Dev/Prod Parity
    Сведите к минимуму разницу между средами разработки и продакшна
  10. Disposability
    Процессы должны быстро запускаться и завершаться, чтобы облегчить управление и масштабирование
  11. Logs
    Приложение должно вести логи как поток событий (streams), которые могут быть агрегированы и обработаны
  12. Admin Processes
    Операционные задачи (например, миграции базы данных, отладка) должны выполняться как одноразовые админ-процессы
76
Q

Сервисно ориентированная архитектура. Понимание принципов (плюсы, минусы, когда применять)

A

Сервисно-ориентированная архитектура (СОА, или SOA — Service-Oriented Architecture) — это архитектурный подход к разработке программного обеспечения, который позволяет строить приложения как набор независимых, взаимодействующих сервисов. Каждый сервис реализует определенную бизнес-функциональность и может быть использован различными клиентами или другими сервисами через стандартизированные интерфейсы

Плюсы СОА
- Масштабируемость: Возможность легко масштабировать отдельные сервисы
- Гибкость: Легкость в изменениях и доработках
- Повторное использование: Сервисы могут использоваться в разных приложениях
- Упрощение разработки: Команды могут работать параллельно
- Интероперабельность: Возможность интеграции с разными технологиями

Минусы СОА
- Сложность
- Задержки: Взаимодействие между сервисами по сети может привести к задержкам по сравнению с монолитными приложениями.
- Тестирование: Тестирование может быть сложнее, поскольку необходимо проверять взаимодействие между сервисами.
- Управление зависимостями: Необходимость управлять зависимостями и версиями сервисов может усложнять процесс развертывания.
- Мониторинг и отладка: Отсутствие централизованного контроля за всеми сервисами может усложнить мониторинг и отладку

76
Q

Отказоустойчивость
Общее представление
Способы достижения в приложении

A

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

Основные принципы отказоустойчивости
- Избыточность (Redundancy): Использование дублирующих компонентов или систем, чтобы в случае отказа одного из них другой мог продолжить работу
- Изоляция отказов (Fault Isolation): Локализация проблем в системе таким образом, чтобы отказ одного компонента не приводил к сбою всей системы
- Автоматическое восстановление (Auto Recovery)
- Мониторинг и оповещения: Постоянное отслеживание состояния системы для обнаружения сбоев и предупреждения о потенциальных проблемах до их критического проявления
- Балансировка нагрузки

Способы достижения:
- Кластеризация: Объединение серверов в кластеры. В случае сбоя одного узла его работу берут на себя другие узлы кластера
- Резервное копирование (Backup)
- Репликация данных: Автоматическое дублирование данных на нескольких серверах или в разных географических зонах
- Балансировка нагрузки
- Кэширование (Cache)

77
Q

Что такое CAP теорема?
Какое практическое применение этих знаний ты видишь?

A

CAP теорема (теорема Брюера) — это теоретический принцип, описывающий ограничения, с которыми сталкиваются распределенные системы при обеспечении их доступности, консистентности данных и отказоустойчивости в условиях сетевых разделений. Теорема утверждает, что в любой распределенной системе невозможно одновременно достичь всех трёх следующих свойств:

Consistency (Консистентность): Все узлы системы видят одни и те же данные в одно и то же время
Availability (Доступность): Каждый запрос получает либо успешный ответ (с данными), либо сообщение об ошибке
Partition Tolerance (Толерантность к разделению): Система продолжает функционировать, даже если некоторые узлы или сети не могут взаимодействовать друг с другом

77
Q

Сборщик мусора в PHP
Принципы работы
Использование для оптимизации

A

Сборщик мусора (Garbage Collector, GC) в PHP — это механизм, который автоматически управляет памятью, освобождая объекты и данные, которые больше не используются в программе. Это позволяет избежать утечек памяти и оптимизировать использование ресурсов, особенно в долгоживущих скриптах и веб-приложениях

Принцип работы:
- Подсчёт ссылок (когда счётчик ссылок достигает нуля, память автоматически освобождается)
- Циклический сборщик мусора ( Это ситуации, когда объекты ссылаются друг на друга, создавая циклы. PHP 5.3 и более поздние версии внедрили циклический сборщик мусора. Он периодически проверяет объекты и ищет циклические зависимости)

77
Q

Статический анализатор кода

A

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

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

Существующие решения:
- PHPStan (анализ типизации)
- Psalm (аннотация типов, работа с phpdoc)
- Phan (проверка типов и синтаксических ошибок)
- PHP_CodeSniffer (проверка на соответствие стандартам PSR)

77
Q

В чём отличие static и self

A

self используется для обращения к текущему классу, в котором оно определено. Оно всегда ссылается на тот класс, в котором вызвано, независимо от того, был ли этот метод унаследован в дочернем классе

static используется для динамической ссылки на класс, который фактически вызвал метод, даже если этот метод был унаследован от родительского класса
В отличие от self, static учитывает класс, через который был вызван метод, и позволяет получать правильные результаты в контексте наследования

77
Q

Генераторы, декораторы, иттераторы

A

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

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

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

77
Q

Принцип ACID

A

Атомарность (Atomicity): Выполняется полностью или не выполняется вовсе. Если какая-либо часть транзакции не может быть завершена, то все её действия откатываются (отменяются), и система возвращается к состоянию, которое было до начала транзакции.

Согласованность (Consistency): Переводит базу данных из одного согласованного состояния в другое. Это означает, что все правила целостности данных соблюдаются.

Изолированность (Isolation): Не видит промежуточных состояний других транзакций. Это предотвращает возможные проблемы, такие как “грязное чтение” или “неповторяемое чтение”.

Долговечность (Durability): После ее завершения (commit) её результаты сохраняются в базе данных независимо от последующих сбоев системы.

77
Q

Что такое middleware?

A

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

Может выполнять различные задачи, такие как:
- Аутентификация и авторизация
- Логирование
- Обработка ошибок: централизованная обработка исключений и ошибок.
- Преобразование данных: например, парсинг JSON или XML входящих в запросах или ответах.
- Управление сессиями
- Кэширование

77
Q

Отличие HTTP первой версии от второй

A
  • HTTP/1.1 является текстовым протоколом, HTTP/2 использует бинарный формат
  • HTTP/1.1 позволяет отправлять один запрос за раз по каждому TCP-соединению, что может привести к блокировке головы очереди, когда для получения следующего ответа необходимо дождаться завершения предыдущего, HTTP/2 поддерживает мультиплексирование запросов и ответов, позволяя одновременно отправлять несколько запросов и получать ответы через одно TCP-соединение без блокировки головы очереди
  • HTTP/1.1 отправляет заголовки запросов и ответов в несжатом виде, HTTP/2 вводит механизм сжатия заголовков
77
Q

Принципы ООП

A
  1. Инкапсуляция
    Сокрытие деталей реализации объекта от внешнего мира и доступ к его состоянию только через определённые методы. Это помогает защитить внутреннее состояние объекта от непреднамеренных изменений
  2. Наследование
    Позволяет создавать новый класс на основе существующего, наследуя его свойства и методы. Это обеспечивает иерархическую организацию классов и повторное использование кода, позволяя разработчикам расширять и модифицировать существующую функциональность без ее дублирования
  3. Полиморфизм
    Это способность объектов с одинаковыми интерфейсами предоставлять различную реализацию для одного и того же метода. Это позволяет программам использовать объекты различных типов общим образом, выбирая подходящую реализацию в зависимости от контекста выполнения
  4. Абстракция
    Позволяет концентрироваться на важных атрибутах объекта, игнорируя несущественные детали. Это достигается за счет создания классов, которые представляют абстрактные понятия и характеристики объектов реального мира. Абстракция служит основой для инкапсуляции, наследования и полиморфизма
77
Q

Что происходит, если в приложении выбрасывается исключение

A
  1. Прерывание обычного потока выполнения
  2. Поиск обработчика исключений
  3. Выполнение обработчика исключения
  4. Если для исключения не найден подходящий обработчик, программа завершается аварийно
78
Q

Теория паттерна “Декоратор”

A

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

Часто в разработке возникает необходимость модифицировать или расширить поведение объектов без изменения их исходного кода

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

Пример:
интерфейс для текстового комопнента
~~~
interface TextComponent {
public function operation(): string;
}
~~~

Компонент для текста:
~~~
class SimpleText implements TextComponent {
private $text;
public function operation(): string {
return $this->text;
}
}
~~~

Создаём декоратор:
~~~
abstract class TextDecorator implements TextComponent {
protected TextComponent $component;

public function operation(): string {
    return $this->component->operation();
} } ~~~

Создаём декоратры
~~~
class HtmlDecorator extends TextDecorator {
public function operation(): string {
return “<p>” . parent::operation() . “</p>”;
}
}

class EncryptDecorator extends TextDecorator {
public function operation(): string {
return base64_encode(parent::operation());
}
}
```

Вызываем цепочку декораторов
~~~
$text = new SimpleText(“Hello, World!”);
$decoratedText = new EncryptDecorator(new HtmlDecorator($text));
$decoratedText->operation();
~~~

79
Q

Недостатки индексов в БД

A
  • Замедление операций записи: Вставка, обновление и удаление данных становятся медленнее, так как индексы нужно постоянно обновлять. Чем больше индексов у таблицы, тем сильнее замедляются эти операции
  • Для хранения индексов требуется дополнительная память, что может быть проблемой для систем с ограниченными ресурсами
80
Q

Правила формирования составных индексов

A

Составные индексы полезны для ускорения сложных запросов, которые фильтруют данные или выполняют сортировку по нескольким полям
- Порядок полей важен: В составном индексе порядок полей должен соответствовать частоте их использования в условиях фильтрации запросов. Индекс должен начинаться с поля, которое чаще всего используется в операторах WHERE
- Самые селективные поля первыми: Если возможно, первым должно идти поле с наибольшей селективностью — то есть, поле, которое отфильтровывает максимальное количество записей
- Поля, по которым выполняются точные совпадения (например, =), должны находиться ближе к началу индекса
- Поля, по которым применяются диапазонные фильтры (например, BETWEEN, >, <), стоит размещать последними
- Избегайте индексации больших полей
- Если запросы в приложении сильно различаются по типу фильтров и условий сортировки, может быть полезно создавать несколько индексов для различных комбинаций столбцов

81
Q

Что такое репликация и атомарность?

A

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

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

82
Q

Как работает DNS?

A

DNS (Domain Name System) — это система, которая переводит доменные имена в IP-адреса, понятные компьютерам и сетям
Основные компоненты DNS:
- Доменное имя
- IP-адрес
- DNS-серверы — это серверы, которые хранят информацию о доменных именах и их соответствующих IP-адресах

Когда вы вводите доменное имя в браузере, процесс состоит из нескольких шагов:
1. Кэширование
Прежде чем начать полный процесс запроса, DNS-клиент (компьютер пользователя или браузер) проверяет, нет ли уже нужного IP-адреса в локальном кэше. Если адрес найден в кэше, запрос завершится без необходимости обращения к DNS-серверам
2. Запрос к DNS-резолверу
Если в кэше нет записи, компьютер отправляет запрос к DNS-резолверу — это локальный DNS-сервер, предоставляемый интернет-провайдером. Резолвер занимается поиском нужного IP-адреса для домена, обрабатывая запрос от имени клиента
3. Запрос к корневым DNS-серверам
Если резолвер не имеет записи в своем кэше, он направляет запрос на один из корневых DNS-серверов. Корневые серверы не знают конечного IP-адреса, но они могут указать на серверы верхнего уровня доменов
4. Запрос к TLD-серверу
Резолвер отправляет запрос к TLD-серверу (например, для .com). Этот сервер знает, на каком сервере находятся данные для конкретного домена второго уровня, и указывает на авторитативный DNS-сервер для домена.
Например, TLD-сервер для .com укажет на сервер, который отвечает за example.com
5. Запрос к авторитативному DNS-серверу
Резолвер отправляет запрос к авторитативному DNS-серверу, который содержит окончательные записи для домена example.com. Этот сервер возвращает IP-адрес, связанный с доменом.
6. Возвращение IP-адреса
После получения IP-адреса от авторитативного сервера, резолвер возвращает его на компьютер клиента. Теперь клиент может использовать этот IP-адрес для подключения к нужному серверу и загрузки веб-страницы

83
Q

Идемпотентность HTTP

A

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

84
Q

В каких случаях может быть полезна денормализация БД?

A

Денормализация базы данных — это процесс сознательного внесения избыточности в данные для улучшения производительности запросов
- В нормализованных базах данных данные распределены по разным таблицам, и для получения полной информации требуется выполнение сложных операций с использованием JOIN. Денормализация может устранить необходимость этих JOIN, что уменьшит время выполнения запросов, особенно на больших объемах данных
- Если в системе преобладают аналитические запросы с большим количеством агрегаций и фильтраций, денормализация может упростить доступ к агрегированным данным
- В системах, где важны запросы в реальном времени, особенно с высокой частотой доступа к данным, денормализация уменьшает задержки, так как данные могут быть быстро получены из одной таблицы

85
Q

Php FPM откроет ли новый запрос новое соединение

A

Да, PHP-FPM (FastCGI Process Manager) открывает новое соединение для каждого нового HTTP-запроса

Запросы от веб-сервера: Когда веб-сервер (например, Nginx или Apache) получает новый HTTP-запрос, он перенаправляет его в PHP-FPM

Обработка запроса: PHP-FPM управляет пулом PHP-процессов. Для каждого нового запроса веб-сервер устанавливает новое соединение с одним из свободных процессов PHP-FPM

86
Q

Отличия PHP7 и PHP8

A
  • PHP 8: Поддерживаются союзные типы (Union Types), что позволяет указать несколько возможных типов для переменной или параметра функции
  • PHP 8: Теперь можно передавать параметры в функцию по имени, что позволяет указывать только те параметры, которые вам нужны, без соблюдения порядка
  • PHP 8: Введено выражение match, которое похоже на switch, но имеет некоторые улучшения: Не требуется break. Возвращает значение. Поддерживает строгие сравнения (===)
    ~~~
    $result = match($x) {
    1 => ‘one’,
    2 => ‘two’,
    default => ‘other’,
    };
    ~~~
  • PHP 8: Введен nullsafe-оператор (?->), который позволяет безопасно вызывать методы и обращаться к свойствам объектов, даже если объект может быть null
  • PHP 8: Некоторые ошибки, которые в PHP 7 считались предупреждениями или заметками, теперь выбрасываются как исключения
  • PHP 8: Позволяет упрощать определение и инициализацию свойств через параметры конструктора
    ~~~
    public function __construct(public int $x)
    ~~~
  • PHP 8: Введена Just-in-Time (JIT) компиляция. JIT-компиляция позволяет значительно ускорить выполнение кода, компилируя его в машинный код в реальном времени. Это улучшает производительность некоторых задач, особенно вычислительно интенсивных
87
Q

Какие проблемы могут возникнуть при обновлении приложения до новой версии языка

A
  • Функции, изменившие поведение
  • Удаленные функции и расширения
  • Измененные сигнатуры функций
  • Более строгие проверки типов
  • Новые ошибки типизации
  • Новые исключения вместо предупреждений
  • Несовместимые библиотеки
  • Устаревшие зависимости
88
Q

Может ли быть приватный конструктор у классов?

A

Да, в PHP можно создавать приватные конструкторы для классов. Приватный конструктор ограничивает создание экземпляров класса извне, и объекты класса могут создаваться только внутри самого класса.

89
Q

Что будет при одинаковых названиях функций в 2-х подключенных трейтах?

A

Когда два трейта, подключенные к одному классу, содержат методы с одинаковыми именами, возникает конфликт имен. PHP решает этот конфликт с помощью оператора insteadof или as, чтобы указать, какой метод использовать

use TraitA, TraitB {
        TraitA::sayHello insteadof TraitB; 
}

или

 use TraitA, TraitB {
        TraitB::sayHello as sayHelloFromTraitB;
    }
90
Q

Сервис контейнер и паттерн “репозиторий”

A

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

  • Контейнер управляет тем, какие объекты передаются в качестве зависимостей в ваш класс
  • Сервис создается только тогда, когда он впервые используется
  • Благодаря контейнеру можно легко заменять реальные зависимости тестовыми, что упрощает юнит-тестирование

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

91
Q

copy on write

A

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

92
Q

Статические и обычные замыкания, различие и влияние на производительность

A

Замыкания в PHP — это анонимные функции, которые могут захватывать переменные из своей области видимости.

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

Обычные замыкания: Влияют на производительность при каждом вызове, так как переменные копируются
Статические замыкания: Сохраняют состояние и могут быть более производительными, если вам нужно вызывать функцию несколько раз и сохранять состояние

93
Q

Active Record, Data Mapper и использование сырых SQL-запросов

A

Active Record — это паттерн, в котором объекты представляют собой записи в базе данных. Каждый объект класса соответствует одной записи в таблице, а свойства объекта представляют собой поля этой записи
Преимущества: простота, читаемость, автоматизация
Недостатки: запросы могут быть трудными для реализации и поддержки, может быть менее эффективным из-за доп.накладных расходов ORM

Data Mapper — это паттерн, который отделяет бизнес-логику приложения от логики работы с базой данных. Объекты модели не содержат логики доступа к данным; вместо этого данные загружаются и сохраняются через отдельный слой
Преимущества: гибкость, тестируемость
Недостатки: сложность выше, чем у Active Record, доп. время на реализацию

Сырые SQL-запросы — это прямые запросы к базе данных, без использования ORM или паттернов. Это дает вам полный контроль над запросами и их выполнением.
Плюсы: производительность, гибкость
Недостатки: читаемость, безопасность, трудоёмкость

94
Q

Уровни изоляции БД

A

Уровни изоляции в базах данных определяют, как транзакции взаимодействуют друг с другом и как они могут видеть изменения, сделанные другими транзакциями.
1. Read Uncommitted (Чтение неподтвержденных данных): транзакции могут читать неподтверждённые данные других транзакций
2. Read Committed (Чтение подтвержденных данных): транзакции могут читать только подтверждённые данные
3. Repeatable Read (Повторяемое чтение): Обеспечивает, что если транзакция читает строку, она сможет прочитать те же данные снова, даже если другие транзакции изменили данные между чтениями (в рамках одной транзакции)
4. Serializable (Сериализуемый): Транзакции выполняются так, как будто они выполняются последовательно, одна за другой

95
Q

Оконные функции

A

Оконные функции (или window functions) — это специальные функции в SQL, которые позволяют выполнять вычисления по строкам набора данных, сохраняя при этом доступ ко всем строкам исходного результата

Пример
~~~
SELECT name, department, salary,
SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) as running_total
FROM employees;
~~~
Здесь мы вычисляем “текущую сумму” зарплат сотрудников в рамках их департамента. Использование PARTITION BY department делит сотрудников по департаментам.

96
Q

Hash Map (хэш-таблица) и B-дерево (B-Tree)

A

Хэш-таблица — это структура данных, которая позволяет хранить ключи и значения и предоставляет быстрый доступ к значениям по ключам за счёт использования хэш-функций. Основной идеей хэш-таблицы является преобразование ключей в индекс массива (так называемую “ячейку” или “бакет”) с помощью хэш-функции.
Коллизии: это ситуации, когда разные ключи дают одинаковый хэш.

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

97
Q

Разница авторизация и аутентификация

A

Аутентификация — это процесс проверки подлинности пользователя. Она позволяет системе удостовериться, что пользователь является тем, за кого он себя выдает.
- Вход в учетную запись на веб-сайте с использованием имени пользователя и пароля.
- Аутентификация через сторонние сервисы (например, Google, Facebook).
- Использование двухфакторной аутентификации (2FA), где пользователь должен подтвердить свою личность через SMS или приложение

Авторизация — это процесс определения прав и уровней доступа пользователя после успешной аутентификации. Она определяет, что пользователь имеет право делать в системе.
- Проверка прав: После того как пользователь аутентифицирован, система проверяет, какие ресурсы и действия доступны этому пользователю.
- Разграничение доступа: Определяет, что пользователь может видеть и с чем может взаимодействовать.

98
Q

Паттерны микросервисной архитектуры

A

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

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

  • Шаблон «Поиск событий» (Event Sourcing)
    При использовании шаблона Event Sourcing вместо объектов сохраняются события, изменяющие их состояния. Различные службы могут воспроизводить события из хранилища событий, чтобы вычислить соответствующее состояние своих хранилищ данных.

Паттерны коммуникации:
- API-шлюз
Это обеспечивает единую точку входа для всех сервисов, вместо того чтобы клиент напрямую общался с каждым сервисом. API-шлюз обеспечивает агрегацию, аутентификацию, кэширование и т.д.

  • Шаблон «База данных на сервис» (Database Per Service)
    Основная рекомендация при переходе на микросервисы — предоставить каждому сервису собственное хранилище данных, чтобы не было сильных зависимостей на уровне данных. При этом имеется в виду именно логическое разделение данных, то есть микросервисы могут совместно использовать одну и ту же физическую базу данных, но в ней они должны взаимодействовать с отдельной схемой, коллекцией или таблицей
99
Q

Зацепление и связанность

A

Зацепление — это мера того, насколько сильно один компонент (например, класс, модуль или функция) зависит от другого. Чем меньше зацепление, тем легче изменять, тестировать и повторно использовать компоненты.

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

100
Q

Разница между Entity, Value object, DTO, Aggregate

A

Entity (Сущность)
Сущность — это объект, который имеет уникальный идентификатор и жизненный цикл. Сущности изменяются в течение времени и могут иметь разные состояния
(Уникальный идентификатор. Состояние может меняться со временем. Сущности могут иметь сложную бизнес-логику)
Пример: пользователь в системе

Value Object (Объект-значение)
Объект-значение — это объект, который определяется своими атрибутами, а не уникальным идентификатором. Они обычно являются неизменяемыми и могут быть созданы, когда это необходимо
(Не имеет уникального идентификатора. Определяется своими атрибутами. Обычно является неизменяемым.Может быть создан или уничтожен по мере необходимости)
Пример: Например, адрес может состоять из улицы, города и почтового индекса. При сравнении двух адресов, если все их атрибуты совпадают, они считаются равными

Data Transfer Object (DTO)
DTO — это объект, используемый для передачи данных между слоями приложения или между сервисами. Обычно он содержит только атрибуты без бизнес-логики
(Используется для передачи данных. Не содержит бизнес-логики. Может быть изменяемым или неизменяемым.)

Aggregate (Агрегат)
Агрегат — это группа связанных объектов (включая сущности и объекты-значения), которые рассматриваются как единое целое для изменения. Агрегат имеет корневую сущность (root entity), через которую осуществляется доступ ко всем другим объектам в агрегате
(Состоит из одной корневой сущности и связанных с ней объектов. Обеспечивает целостность данных внутри агрегата. Доступ к объектам агрегата осуществляется через корневую сущность)
Пример: Заказ и его позиции. Заказ может быть корневой сущностью, а позиции заказа — связанными объектами, которые нельзя изменять отдельно от заказа.

101
Q

Слои приложения

A
  1. Представительный слой (Presentation Layer)
    Описание: Этот слой отвечает за взаимодействие с пользователем и отображение данных. Он включает в себя пользовательский интерфейс и логику, связанную с отображением.
    (Веб-страницы, мобильные приложения, API-интерфейсы)
  2. Слой бизнес-логики (Business Logic Layer)
    Описание: Этот слой отвечает за выполнение бизнес-правил и логики приложения. Он обрабатывает данные, поступающие из представительного слоя, и взаимодействует с нижележащими слоями. Реализация бизнес-правил и алгоритмов. Управление процессами и состоянием приложения.Валидация данных перед отправкой в нижележащие слои.
  3. Слой доступа к данным (Data Access Layer)
    Описание: Этот слой отвечает за взаимодействие с базой данных и другими источниками данных. Он изолирует бизнес-логику от деталей хранения данных.
    (Репозитории, ORM (Object-Relational Mapping) библиотеки)
  4. Слой хранения данных (Data Storage Layer)
    Этот слой отвечает за фактическое хранение данных. Он включает базы данных, файловые хранилища и другие системы хранения.
  5. Слой интеграции (Integration Layer)
    Описание: Этот слой управляет взаимодействием между разными системами и сервисами, включая внешние API и микросервисы.
102
Q

Разница хэшироваие, кодирование, шифрование

A

Хэширование — это процесс преобразования входных данных произвольной длины в фиксированное значение (хэш).
Однонаправленный: нельзя восстановить исходные данные из хэша.
Разные входные данные должны давать разные хэши (хотя это не всегда возможно, существует возможность коллизий).
Быстрая обработка и легкость вычисления.

Кодирование — это процесс преобразования данных из одного формата в другой, обычно с целью упрощения передачи или хранения.
Двунаправленный: данные могут быть восстановлены в исходный формат.
Используется для представления данных в формате, который поддерживается различными системами и протоколами.
Не обеспечивает безопасность данных, так как кодирование легко обратимо.

Шифрование — это процесс преобразования данных в неразборчивый формат с использованием алгоритма и ключа. Шифрование защищает данные от несанкционированного доступа.
Двунаправленный: данные могут быть зашифрованы и расшифрованы с использованием ключа.
Зависит от ключа: безопасность данных зависит от сложности ключа и алгоритма шифрования.
Может быть симметричным (один ключ для шифрования и расшифровки) или асимметричным (разные ключи для шифрования и расшифровки).

103
Q

DDD (Domain Driver Design)

A

Domain-Driven Design (DDD) — это подход к разработке программного обеспечения, направленный на создание систем, которые отражают реальные бизнес-домены (области деятельности) и обеспечивают более точное решение задач бизнеса.

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

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

DDD подчеркивает важность разделения модели на ограниченные контексты — области внутри бизнес-домена, каждая из которых имеет четкие границы и может управляться отдельно.

104
Q

Пространство имён

A

Пространство имён — способ инкапсуляции классов, функций и констант, предотвращая конфликты имён между фрагментами кода

105
Q

TDD

A

TDD — разработка через тестирование. Тесты пишутся до написания основного кода

106
Q

Как защитить PHP-приложение от атак с использованием межсайтового скриптинга (CSRF)?

A

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

107
Q

Что такое политика безопасности контента (CSP) и как её можно реализовать в PHP

A

Политика безопасности контента (CSP) — это стандарт безопасности, предназначенный для предотвращения широкого спектра атак, в том числе межсайтового скриптинга (XSS) и атак с внедрением данных.
Она позволяет контролировать, какие ресурсы разрешено загружать пользовательскому агенту для конкретной страницы.

108
Q

CQRS

A

CQRS разделяет операции чтения (запросы) и записи (команды). Эти две модели могут развиваться отдельно: модель записи фокусируется на бизнес-логике и проверке, а модель чтения — на представлении данных.

Команда обрабатывается обработчиком команд, который выполняет бизнес-логику и генерирует события.