Опубликовано 13 дней назад

PHP-разработчик (Backend, Middle+/Senior) в Молинет Санкт-Петербург

Building iconв офис
Person iconmiddle
Money bag iconот 230 000 ₽/мес
Обязанности:
  • Разработка и развитие модулей: каталог, карточки товаров, ценовые предложения, атрибуты и фильтры,
    кабинеты продавцов, биллинг
  • Развитие конвейера обработки товарных данных: парсеры прайсов и фидов, алгоритмы идентификации и
    сопоставления товаров
  • Оптимизация работы с базой: профилирование и переработка тяжёлых 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. Офис находится в собственности компании — это не арендное пространство. Мы постарались сделать его максимально комфортным и уютным: скорее он напоминает небольшой бутик, чем классический офис.

Для кандидатов, которые привыкли к удалённой работе, хотим сразу обозначить важный момент. Мы понимаем желание брать несколько проектов одновременно, но также хорошо представляем объём задач в нашем продукте. Совмещать полноценную работу у нас с другими проектами, скорее всего, будет непросто.

Поэтому просим трезво оценивать свою загрузку и возможность уделять проекту достаточно внимания. Мы ищем человека, который сможет глубоко погрузиться в продукт и быть вовлечённым в его развитие.

Эту вакансию мы нашли в HH.ru
МО

Молинет

Санкт-Петербург

Получить оффер

Похожие вакансии

Это единственная вакансия по вашему фильтру

Не то, что искал?

вакансии джуниор
как откликнуться на вакансию
примеры вакансий junior
вакансии по QA
стажировки по QA
Автоотклики