PHP-разработчик (Backend, Middle+/Senior)
Описание
Обязанности: Разработка и развитие модулей: каталог, карточки товаров, ценовые предложения, атрибуты и фильтры,кабинеты продавцов, биллинг Развитие конвейера обработки товарных данных: парсеры прайсов и фидов, алгоритмы идентификации исопоставления товаров Оптимизация работы с базой: профилирование и переработка тяжёлых SQL-запросов, проектированиеиндексов и структур таблиц Развитие REST API для админки и кабинета продавца Развитие серверного рендеринга публичной витрины Работа с фоновыми задачами: CLI-команды, Job-классы, очереди на Redis, воркеры Интеграции с внешними системами: ЭДО (Диадок), Яндекс.Маркет, IndexNow, платёжные и почтовые сервисы Написание миграций (Phinx) и тестов (PHPUnit) Настройка и поддержка логирования, мониторинга и алертинга (Sentry) Постепенное улучшение архитектуры и снижение техдолга — у нас нет иллюзий по поводу состояния некоторых частей системы Участие в код-ревью, планировании задач и выработке архитектурных решений Совместная работа с frontend-разработчиками и QA Требования: Опыт коммерческой разработки на PHP от 3 лет, уверенное знание PHP 8.x Уверенная работа с MySQL: написание и оптимизация сложных запросов, чтение планов выполнения (EXPLAIN), индексы, блокировки, транзакции Опыт работы с нативным SQL и PDO без ORM: подготовленные выражения, защита от инъекций, осознанная работа с транзакциями Опыт работы с миграциями БД (Phinx, Doctrine Migrations или аналоги) Опыт проектирования и разработки REST API Опыт работы с Redis (кэш, сессии, очереди) Опыт написания CLI-команд и фоновых воркеров, понимание особенностей долгоживущих PHP-процессов: потребление памяти, идемпотентность, поведение при падениях Опыт обработки больших объёмов данных: пакетная обработка, потоковое чтение файлов, контроль памяти Опыт реализации интеграций по HTTP (Guzzle или аналоги), работа с нестабильными внешними API: таймауты, ретраи, обработка ошибок Опыт написания unit- и функциональных тестов (PHPUnit)Знание Composer, Git Умение читать и анализировать логи backend-сервисов Способность разбираться в чужом коде и дорабатывать существующую систему без полного переписывания Умение самостоятельно разбираться в сложных задачах, принимать решения и аргументировать выбранный подход Ответственное отношение к архитектуре, качеству кода и долгосрочной поддержке продукта Плюсом будет Опыт работы с агрегаторами, маркетплейсами, крупными каталогами или e-commerce Опыт написания парсеров прайс-листов и товарных фидов (YML, XML, XLSX, CSV), задач сопоставления и дедупликации товаров Опыт реализации фасетного поиска и фильтрации по большому числу параметров Опыт постепенного рефакторинга легаси: выделение слоя доступа к данным, снижение связанности, покрытие тестами Знание Doctrine DBAL/ORM — рассматриваем поэтапное внедрение Опыт работы со статическим анализом (Psalm, PHPStan) Опыт работы с очередями (RabbitMQ, Kafka) — на случай развития текущей очереди на Redis Опыт настройки CI/CD (GitHub Actions), Docker Опыт работы с системами мониторинга (Grafana, Prometheus, Sentry) Понимание SEO для крупных каталогов и серверного рендеринга Опыт работы с мультитенантными платформами О проекте : Costo.ru — агрегатор интернет-магазинов и маркетплейсов России: каталог товаров, сравнение цен от десятков магазинов, характеристики, рейтинги и отзывы. Под капотом — собственная платформа на PHP 8.3, на которой работает не один проект: помимо Costo на том же движке живёт второй бренд со своей базой, своим сервером и своей темой оформления. Каждое изменение в ядре затрагивает оба бизнеса — это накладывает отпечаток на то, как мы работаем. Проект состоит из трёх приложений:costo.ru — публичная витрина, рендерится на сервере (PHP + собственный шаблонизатор)admin.costo.ru — административная панель (Vue 3 SPA)seller.costo.ru — кабинет продавца (Vue 3 SPA)Backend обслуживает все три и отвечает как за HTML-рендеринг витрины, так и за REST API для админок. Чем интересна задача Конвейер товарных данных. Магазины присылают прайс-листы и фиды в разных форматах (XLSX, CSV, XML/YML). Их надо распарсить, идентифицировать товары, сопоставить с карточками каталога, собрать ценовые предложения, отсеять мусор и ошибки, обновить цены и наличие. Всё это — регулярно, по расписанию, на больших объёмах. Задача сопоставления товаров нетривиальная и никогда не бывает «доделанной». Фасетный поиск. В каталоге 3000+ атрибутов в 23 разделах, семь типов значений (булевы, числовые с единицами измерения, строки с размерами вида 500x100x200, даты), пять типов фильтров (чекбоксы, радио, range, больше/меньше, исключение) и их комбинации через И/ИЛИ. Всё это работает на нативном SQL и должно отвечать быстро. SEO как инженерная задача. Витрина рендерится на сервере, поэтому скорость ответа backend напрямую влияет на позиции. Плюс ЧПУ-ссылки, sitemap, IndexNow, генерация SEO-полей, виртуальные категории, теги сдинамическими подборками по сохранённым фильтрам.Честно о проекте Мы не будем делать вид, что у нас идеальный код. Архитектура самобытная. Это не Symfony и не Laravel, а собственный фреймворк поверх FastRoute, PHP-DI и компонентов Symfony. Роутинг автоматический, по файловой системе: URL /api/admin/seo/read соответствует файлу app/modules/admin/seo/entry/read-api.php . У модуля три типа точек входа: -web (HTML), -api (JSON) и -inner(вызов из других модулей через роутер). Ядро приложения — Singleton + Service Locator. ORM нет, весь SQL нативный. Шаблонизатор публички — собственный, со своим синтаксисом. Если вы работали только с классическими фреймворками, первые недели будут непривычными. Зато система прозрачная: нет магии, всё можно проследить руками. При этом инфраструктура зрелая. Миграции и сиды на Phinx, unit- и acceptance-тесты с фабриками на все основные сущности, статический анализ (Psalm, PHPCS, PHPMD), Sentry, GitHub Actions с раздельными пайплайнами под production, staging и test, пять окружений с изолированными базами, включая песочницы для экспериментов с массовыми обновлениями данных. Техдолг есть, и мы его признаём. Часть документации отстала от кода, местами накопилось дублирование, безопасность отдельных механизмов требует внимания. Мы ищем человека, который поможет это разгребать — планомерно, а не революцией. Для нас особенно важно Мы ищем разработчика, который не просто быстро пишет код, а понимает, как этот код будет жить в продуктедальше. Нам важен человек, который умеет уважительно работать с существующей системой: не предлагает«переписать всё с нуля», а последовательно улучшает её, не ломая работающий функционал, и понимает ценуизменения, которое затрагивает два бизнеса одновременно.Мы нормально относимся к использованию AI-инструментов как к вспомогательным. Но нам принципиальноважно, чтобы разработчик обладал сильной собственной экспертизой: мог самостоятельно спроектироватьрешение, написать код, объяснить архитектурный выбор, найти ошибку и оценить риски. Подход «код сгенерирован без понимания и проверки, без учёта архитектуры проекта и договорённостей внутри команды» нам не подойдёт.Наш стек Язык: PHP 8.3Фреймворк: собственный — FastRoute, PHP-DI, компоненты Symfony (String, Mailer, Translation)База данных: MySQL 8, PDO и mysqli (нативный SQL), миграции и сиды — PhinxКэш, сессии, очереди: Redis, собственная реализация очередей на Job-классах, воркерыИнтеграции: Guzzle, Диадок (ЭДО, OpenID Connect), Яндекс.Маркет, IndexNowРабота с данными: PhpSpreadsheet, SimpleXLSX, opis/json-schemaИзображения: ImagickКачество кода: PHPUnit, Psalm, PHP_CodeSniffer, PHPMDМониторинг: SentryИнфраструктура: Ubuntu, nginx, Selectel, GitHub Actions, раздельные контуры (production / staging / test)Frontend (для контекста): Vue 3 + Ant Design Vue в админках, серверные шаблоны + Tailwind на витрине Формат работы Мы работаем в офисе по понедельникам и пятницам, ориентировочно с 10:00 до 17:30. Офис находится в собственности компании — это не арендное пространство. Мы постарались сделать его максимально комфортным и уютным: скорее он напоминает небольшой бутик, чем классический офис. Для кандидатов, которые привыкли к удалённой работе, хотим сразу обозначить важный момент. Мы понимаем желание брать несколько проектов одновременно, но также хорошо представляем объём задач в нашем продукте. Совмещать полноценную работу у нас с другими проектами, скорее всего, будет непросто. Поэтому просим трезво оценивать свою загрузку и возможность уделять проекту достаточно внимания. Мы ищем человека, который сможет глубоко погрузиться в продукт и быть вовлечённым в его развитие.