Что означает буква "D" в принципах SOLID?
Anonymous Poll
4%
Dependency Decoupling — разделение зависимостей на разные слои архитектуры
87%
Dependency Inversion — высоко- и низкоуровневые модули зависят от абстракций
4%
Dependency Determination — определение зависимостей для классов и методов
6%
Dependency Demarcation — разграничение зон ответственности для зависимостей
Какой признак характерен для архитектуры CQRS?
Anonymous Poll
5%
Разделение клиентской и серверной частей
91%
Разделение команд (изменений) и запросов (чтения)
2%
Использование одного сервиса для чтения и записи
3%
Отказ от реактивщины
Используется Doctrine transport. Какая семантика доставки сообщений?
Anonymous Poll
17%
At-most-once
21%
Exactly-once
62%
At-least-once с возможностью ретраев и “failed”-queue
2%
Гарантия завист от версии PHP
💬 Обратная связь
Текущий уровень сложности задачек?
🔥 — Слишком просто, хочу сложнее
👍🏼 — В самый раз
❤️ — Иногда сложновато
😁 — Часто не понимаю
Текущий уровень сложности задачек?
🔥 — Слишком просто, хочу сложнее
👍🏼 — В самый раз
❤️ — Иногда сложновато
😁 — Часто не понимаю
🔥4👍1
❓ Что такое событийно-ориентированная архитектура?
Event-driven architecture — это когда компоненты общаются через события, не зная друг о друге напрямую.
// Событие:
class UserRegistered {
public function __construct(public readonly User $user) {}
}
// Listener:
class SendWelcomeEmail {
public function handle(UserRegistered $event): void {
$this->mailer->send($event->user->email, 'Welcome!');
}
}
// Диспетчер:
$dispatcher->dispatch(new UserRegistered($user));
Зачем
✔️ Слабая связанность (UserService не знает о SendWelcomeEmail)
✔️ Легко добавить новый listener без изменения существующего кода (Open/Closed)
✔️ Можно делать асинхронные listeners (через очередь)
В Laravel: Event / Listener, EventServiceProvider.
В Symfony: EventDispatcher, декларация через атрибуты.
Подводный камень: сложно трейсить цепочку — одно событие вызывает другое.
Event-driven architecture — это когда компоненты общаются через события, не зная друг о друге напрямую.
// Событие:
class UserRegistered {
public function __construct(public readonly User $user) {}
}
// Listener:
class SendWelcomeEmail {
public function handle(UserRegistered $event): void {
$this->mailer->send($event->user->email, 'Welcome!');
}
}
// Диспетчер:
$dispatcher->dispatch(new UserRegistered($user));
Зачем
✔️ Слабая связанность (UserService не знает о SendWelcomeEmail)
✔️ Легко добавить новый listener без изменения существующего кода (Open/Closed)
✔️ Можно делать асинхронные listeners (через очередь)
В Laravel: Event / Listener, EventServiceProvider.
В Symfony: EventDispatcher, декларация через атрибуты.
Подводный камень: сложно трейсить цепочку — одно событие вызывает другое.
Что обеспечивает идемпотентность?
Anonymous Poll
44%
Уникальный индекс по payload
13%
Авто-дедупликация брокер
3%
sleep(1) между ретраями
50%
Транзакция БД и запись обработанного event_id
💬 Обратная связь
Какие темы освещать чаще?
🔥 — PHP Core
👍🏼 — Laravel / Symfony
❤️ — Паттерны и дизайн
😁 — Предложу в комменты
Какие темы освещать чаще?
🔥 — PHP Core
👍🏼 — Laravel / Symfony
❤️ — Паттерны и дизайн
😁 — Предложу в комменты
👍17🔥9👎1
🤔 Какая главная проблема этого кода и как её правильно решить?
Anonymous Poll
24%
Нужно добавить try/catch — код упадёт, если база недоступна
82%
N+1: для каждого пользователя выполняется отдельный SQL-запрос. Нужно использовать withCount()
51%
Логику нужно вынести в UserService, контроллер не должен работать с моделями
13%
$result = [] неэффективен, нужно использовать Laravel Collection с map()
Какова временная сложность сортировки слиянием (Merge Sort) в худшем случае?
Anonymous Poll
22%
O(log n)
27%
O(n^2)
14%
O(n)
39%
O(n log n)
Какой основной компонент используется для хранения данных в Elasticsearch?
Anonymous Poll
22%
Коллекции
29%
Документы
52%
Индексы
8%
Таблицы
Код рабочий, но что здесь не так?
Anonymous Poll
20%
str_replace небезопасен для шаблонов, нужен Twig или Blade
18%
Метод делает слишком много вещей и его невозможно нормально протестировать
32%
file_get_contents на каждый вызов. Если отправить 1000 писем в цикле, будет 1000 обращений к диску
55%
Все три проблемы
Что произойдёт, если два воркера вызовут deductBalance(1, 100) одновременно при балансе пользователя 150?
Anonymous Poll
19%
Второй вызов вернёт false — база сама обработает конкурентность
43%
Оба спишут по 100
11%
Один вызов бросит исключение из-за deadlock
40%
Запросы выполнятся последовательно — MySQL сам блокирует строку на SELECT
❓ Что такое Lazy Collections в Laravel?
Обычная Collection загружает всё в память сразу. При работе с большими объёмами данных — это проблема.
// ❌ Загрузит ВСЕ записи в память
$users = User::all()->filter(...)->map(...);
// ✅ Lazy Collection — обрабатывает по одной записи через генератор
User::cursor()->filter(function (User $user) {
return $user->is_active;
})->each(function (User $user) {
ProcessUser::dispatch($user);
});
cursor() использует PDO fetchRow под капотом — в памяти одновременно одна запись.
Lazy Collection из файла:
// Обработка огромного CSV без OutOfMemoryError
$collection = LazyCollection::make(function () {
$handle = fopen('huge_file.csv', 'r');
while ($row = fgetcsv($handle)) {
yield $row;
}
});
$collection->skip(1)->chunk(100)->each(function ($rows) {
ImportBatch::dispatch($rows->toArray());
});
Когда использовать
— 10k+ записей в обработке → cursor() + LazyCollection
— Файлы, стримы, внешние API с пагинацией → LazyCollection с генератором
Важно: методы типа count() и last() материализуют коллекцию. Их лучше избегать в lazy-контексте.
Обычная Collection загружает всё в память сразу. При работе с большими объёмами данных — это проблема.
// ❌ Загрузит ВСЕ записи в память
$users = User::all()->filter(...)->map(...);
// ✅ Lazy Collection — обрабатывает по одной записи через генератор
User::cursor()->filter(function (User $user) {
return $user->is_active;
})->each(function (User $user) {
ProcessUser::dispatch($user);
});
cursor() использует PDO fetchRow под капотом — в памяти одновременно одна запись.
Lazy Collection из файла:
// Обработка огромного CSV без OutOfMemoryError
$collection = LazyCollection::make(function () {
$handle = fopen('huge_file.csv', 'r');
while ($row = fgetcsv($handle)) {
yield $row;
}
});
$collection->skip(1)->chunk(100)->each(function ($rows) {
ImportBatch::dispatch($rows->toArray());
});
Когда использовать
— 10k+ записей в обработке → cursor() + LazyCollection
— Файлы, стримы, внешние API с пагинацией → LazyCollection с генератором
Важно: методы типа count() и last() материализуют коллекцию. Их лучше избегать в lazy-контексте.
Что происходит при выполнении git commit --amend с точки зрения объектной модели Git?
Anonymous Poll
22%
Изменяется только COMMIT_EDITMSG, SHA не меняется
20%
Rebase последнего коммита на HEAD~1
24%
Создаётся новый commit-объект с новым SHA, старый остаётся в объектной БД
34%
Модифицируется существующий commit-объект в .git/objects
Команда git cherry-pick A..B выбирает коммиты:
Anonymous Poll
66%
От A до B включая обе границы
13%
От A до B не включая A, то есть коммиты A+1, ..., B
4%
Только коммит B
17%
Все коммиты между A и B в обратном порядке не включая границы
Транзакция читает строку дважды в рамках одной транзакции и получает разные результаты, хотя сама строку не меняла. Какой это феномен и на каком уровне изоляции он устраняется?
Anonymous Poll
35%
Dirty read — устраняется на READ COMMITTED
26%
Phantom read — устраняется на SERIALIZABLE
34%
Non-repeatable read — устраняется на REPEATABLE READ
18%
Non-repeatable read — устраняется на READ UNCOMMITTED
В чём разница между Blue-Green deployment и Canary deployment?
Anonymous Poll
63%
Blue-green переключает 100% трафика мгновенно, canary — постепенно
29%
Canary требует двух полных окружений, blue-green — нет
17%
Blue-green используется только для stateless сервисов
10%
Разницы нет — оба стратегически идентичны