Лиговский проспект 232
Обязанности:
- Разработка и развитие модулей: каталог, карточки товаров, ценовые предложения, атрибуты и фильтры,
кабинеты продавцов, биллинг - Развитие конвейера обработки товарных данных: парсеры прайсов и фидов, алгоритмы идентификации и
сопоставления товаров - Оптимизация работы с базой: профилирование и переработка тяжёлых 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. Офис находится в собственности компании — это не арендное пространство. Мы постарались сделать его максимально комфортным и уютным: скорее он напоминает небольшой бутик, чем классический офис.
Для кандидатов, которые привыкли к удалённой работе, хотим сразу обозначить важный момент. Мы понимаем желание брать несколько проектов одновременно, но также хорошо представляем объём задач в нашем продукте. Совмещать полноценную работу у нас с другими проектами, скорее всего, будет непросто.
Поэтому просим трезво оценивать свою загрузку и возможность уделять проекту достаточно внимания. Мы ищем человека, который сможет глубоко погрузиться в продукт и быть вовлечённым в его развитие.