Открытое PHP-интервью с разбором архитектуры каталога, производительности MySQL, паттернов, инструментов профилирования и базовой алгоритмической задачи.
Это открытое собеседование на позицию PHP Senior Developer: кандидат кратко описывает около 15 лет опыта, преимущественно с PHP, и отвечает на технические вопросы. Он разбирает опыт работы с каталогом товаров на PHP, Yii2 и MySQL, паттерн Strategy, оптимизацию SQL, кэширование, партиционирование, PHP-FPM/FastCGI, профилирование и алгоритм слияния двух отсортированных массивов. В конце ведущий завершает разговор и говорит, что передаст информацию руководству, однако компания и итог собеседования не названы.
Подготовьте рассказ о высоконагруженном каталоге: кандидат приводит пример ежедневного обновления десятков миллионов товаров через очередь и параллельные воркеры на PHP, Yii2 и MySQL.
Для Strategy нужно уметь объяснить связку «интерфейс — конкретные стратегии — контекст»: в записи это показано на обработчиках архивов RAR и ZIP.
При оптимизации SQL обсуждаются индексы для полей из WHERE, GROUP BY и ORDER BY, выбор только нужных столбцов вместо SELECT *, LIMIT и кэширование тяжёлых запросов.
Для запроса, который нельзя ускорить и который может вызвать шторм после истечения кэша, кандидат предлагает заранее пересчитывать данные фоновой задачей, отдавать часть интерфейса асинхронно и в зависимости от задачи рассматривать Elasticsearch, Sphinx или партиционирование.
При партиционировании выигрыш ожидается, когда запрос фильтрует по ключу партиционирования; запрос по другой колонке может не получить этого преимущества.
Из инструментов диагностики названы Xdebug, логи, Blackfire, XHProf и Yii2 Debug Toolbar; на примере кандидат связывает поиск медленных SQL-запросов со снижением времени страницы примерно с 3 секунд до 0,2–0,5 секунды.
Алгоритмическая задача решается слиянием двух отсортированных массивов двумя указателями с линейной сложностью O(n + m); отдельно стоит точно формулировать различия Git merge и rebase, поскольку ответ в записи неточен.