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