{"id":3413100,"url":"https://alion.io/job/ddq-php-razrabotchik-backend-middlesenior-2","title":"PHP-разработчик (Backend, Middle+/Senior)","company":{"id":3142,"name":"DDQ","domain":"ddq.ru","url":"https://alion.io/company/ddq","size_band":null,"is_staffing_agency":false,"employer_type":"direct","is_intermediary":false,"listed_via":null,"ats_vendor":"HeadHunter","truth_index":null},"role":"Backend","role_family":"Backend","seniority":"senior","employment_type":null,"work_mode":"hybrid","remote_scope":null,"remote_scope_basis":null,"remote_working_hours":null,"hiring_geo_confidence":"structured","locations":["Saint Petersburg, Russia"],"countries":["RU"],"hiring_countries":[],"hiring_countries_total":0,"salary":{"min":160000,"max":null,"currency":"RUB","period":"month","gross":false,"usd_annual":22716},"salary_estimate":null,"experience_years_min":3,"visa_sponsorship":false,"relocation_package":false,"has_equity":false,"technologies":[{"name":"Composer","optional":false},{"name":"Doctrine","optional":false},{"name":"Git","optional":false},{"name":"Guzzle","optional":false},{"name":"MySQL","optional":false},{"name":"PHP","optional":false},{"name":"PHPUnit","optional":false},{"name":"Redis","optional":false},{"name":"Rest API","optional":false},{"name":"Sentry","optional":false},{"name":"SQL","optional":false},{"name":"Диадок","optional":false},{"name":"Ant Design","optional":true},{"name":"Apache Kafka","optional":true},{"name":"CI/CD","optional":true},{"name":"Docker","optional":true},{"name":"GitHub Actions","optional":true},{"name":"Grafana","optional":true},{"name":"JavaScript","optional":true},{"name":"Laravel","optional":true},{"name":"Nginx","optional":true},{"name":"PHPStan","optional":true},{"name":"Prometheus","optional":true},{"name":"Psalm","optional":true},{"name":"RabbitMQ","optional":true},{"name":"React.js","optional":true},{"name":"Symfony","optional":true},{"name":"Tailwind CSS","optional":true},{"name":"Ubuntu","optional":true},{"name":"Vue.js","optional":true}],"status":"live","first_seen_at":"2026-10-28T18:28:31Z","employer_posted_date":"2026-10-28","last_verified_at":"2026-10-31T08:52:56Z","board_verified":true,"closed_at":null,"days_open":3,"trust":{"level":"ok","repost_count":null,"flags":[],"days_open":3},"description":"Обязанности: \n Разработка и развитие модулей: каталог, карточки товаров, ценовые предложения, атрибуты и фильтры, кабинеты продавцов, биллинг\n Развитие конвейера обработки товарных данных: парсеры прайсов и фидов, алгоритмы идентификации и сопоставления товаров\n Оптимизация работы с базой: профилирование и переработка тяжёлых SQL-запросов, проектирование индексов и структур таблиц\n Развитие REST API для админки и кабинета продавца\n Развитие серверного рендеринга публичной витрины\n Работа с фоновыми задачами: CLI-команды, Job-классы, очереди на Redis, воркеры\n Интеграции с внешними системами: ЭДО (Диадок), Яндекс.Маркет, IndexNow, платёжные и почтовые сервисы\n Написание миграций (Phinx) и тестов (PHPUnit)\n Настройка и поддержка логирования, мониторинга и алертинга (Sentry)\n Постепенное улучшение архитектуры и снижение техдолга - у нас нет иллюзий по поводу состояния некоторых частей системы\n Участие в код-ревью, планировании задач и выработке архитектурных решений\n Совместная работа с frontend-разработчиками и QA\n Требования: Опыт коммерческой разработки на PHP от 3 лет, уверенное знание PHP 8.x\n Уверенная работа с MySQL: написание и оптимизация сложных запросов, чтение планов выполнения (EXPLAIN), индексы, блокировки, транзакции\n Опыт работы с нативным SQL и PDO без ORM: подготовленные выражения, защита от инъекций, осознанная работа с транзакциями\n Опыт работы с миграциями БД (Phinx, Doctrine Migrations или аналоги)\n Опыт проектирования и разработки REST API\n Опыт работы с Redis (кэш, сессии, очереди)\n Опыт написания CLI-команд и фоновых воркеров, понимание особенностей долгоживущих PHP-процессов: потребление памяти, идемпотентность, поведение при падениях\n Опыт обработки больших объёмов данных: пакетная обработка, потоковое чтение файлов, контроль памяти\n Опыт реализации интеграций по HTTP (Guzzle или аналоги), работа с нестабильными внешними API: таймауты, ретраи, обработка ошибок\n Опыт написания unit- и функциональных тестов (PHPUnit) Знание Composer, Git\n Умение читать и анализировать логи backend-сервисов\n Способность разбираться в чужом коде и дорабатывать существующую систему без полного переписывания\n Умение самостоятельно разбираться в сложных задачах, принимать решения и аргументировать выбранный подход\n Ответственное отношение к архитектуре, качеству кода и долгосрочной поддержке продукта\n Плюсом будет\n Опыт работы с агрегаторами, маркетплейсами, крупными каталогами или e-commerce\n Опыт написания парсеров прайс-листов и товарных фидов (YML, XML, XLSX, CSV), задач сопоставления и дедупликации товаров\n Опыт реализации фасетного поиска и фильтрации по большому числу параметров\n Опыт постепенного рефакторинга легаси: выделение слоя доступа к данным, снижение связанности, покрытие тестами\n Знание Doctrine DBAL/ORM - рассматриваем поэтапное внедрение\n Опыт работы со статическим анализом (Psalm, PHPStan)\n Опыт работы с очередями (RabbitMQ, Kafka) - на случай развития текущей очереди на Redis\n Опыт настройки CI/CD (GitHub Actions), Docker\n Опыт работы с системами мониторинга (Grafana, Prometheus, Sentry)\n Понимание SEO для крупных каталогов и серверного рендеринга\n Опыт работы с мультитенантными платформами\n О проекте :\n Costo.ru - агрегатор интернет-магазинов и маркетплейсов России: каталог товаров, сравнение цен от десятков магазинов, характеристики, рейтинги и отзывы.\n Под капотом - собственная платформа на PHP 8.3, на которой работает не один проект: помимо Costo на том же движке живёт второй бренд со своей базой, своим сервером и своей темой оформления. Каждое изменение в ядре затрагивает оба бизнеса - это накладывает отпечаток на то, как мы работаем.\n Проект состоит из трёх приложений:\ncosto.ru - публичная витрина, рендерится на сервере (PHP + собственный шаблонизатор)\nadmin.costo.ru - административная панель (Vue 3 SPA)\nseller.costo.ru - кабинет продавца (Vue 3 SPA)\nBackend обслуживает все три и отвечает как за HTML-рендеринг витрины, так и за REST API для админок.\n Чем интересна задача\n Конвейер товарных данных. Магазины присылают прайс-листы и фиды в разных форматах (XLSX, CSV, XML/YML). Их надо распарсить, идентифицировать товары, сопоставить с карточками каталога, собрать ценовые предложения, отсеять мусор и ошибки, обновить цены и наличие. Всё это - регулярно, по расписанию, на больших объёмах. Задача сопоставления товаров нетривиальная и никогда не бывает «доделанной».\n Фасетный поиск. В каталоге 3000+ атрибутов в 23 разделах, семь типов значений (булевы, числовые с единицами измерения, строки с размерами вида 500x100x200, даты), пять типов фильтров (чекбоксы, радио, range, больше/меньше, исключение) и их комбинации через И/ИЛИ. Всё это работает на нативном SQL и должно отвечать быстро.\n SEO как инженерная задача. Витрина рендерится на сервере, поэтому скорость ответа backend напрямую влияет на позиции. Плюс ЧПУ-ссылки, sitemap, IndexNow, генерация SEO-полей, виртуальные категории, теги с\nдинамическими подборками по сохранённым фильтрам.\nЧестно о проекте\n Мы не будем делать вид, что у нас идеальный код.\n Архитектура самобытная. Это не Symfony и не Laravel, а собственный фреймворк поверх FastRoute, PHP-DI и компонентов Symfony. Роутинг автоматический, по файловой системе: URL /api/admin/seo/read соответствует файлу app/modules/admin/seo/entry/read-api.php . У модуля три типа точек входа: -web (HTML), -api (JSON) и -inner\n(вызов из других модулей через роутер). Ядро приложения - Singleton + Service Locator. ORM нет, весь SQL нативный. Шаблонизатор публички - собственный, со своим синтаксисом.\n Если вы работали только с классическими фреймворками, первые недели будут непривычными. Зато система прозрачная: нет магии, всё можно проследить руками.\n При этом инфраструктура зрелая. Миграции и сиды на Phinx, unit- и acceptance-тесты с фабриками на все основные сущности, статический анализ (Psalm, PHPCS, PHPMD), Sentry, GitHub Actions с раздельными пайплайнами под production, staging и test, пять окружений с изолированными базами, включая песочницы для экспериментов с массовыми обновлениями данных.\n Техдолг есть, и мы его признаём. Часть документации отстала от кода, местами накопилось дублирование, безопасность отдельных механизмов требует внимания. Мы ищем человека, который поможет это разгребать - планомерно, а не революцией.\n Для нас особенно важно\n Мы ищем разработчика, который не просто быстро пишет код, а понимает, как этот код будет жить в продукте\nдальше. Нам важен человек, который умеет уважительно работать с существующей системой: не предлагает\n«переписать всё с нуля», а последовательно улучшает её, не ломая работающий функционал, и понимает цену\nизменения, которое затрагивает два бизнеса одновременно.\nМы нормально относимся к использованию AI-инструментов как к вспомогательным. Но нам принципиально\nважно, чтобы разработчик обладал сильной собственной экспертизой: мог самостоятельно спроектировать\nрешение, написать код, объяснить архитектурный выбор, найти ошибку и оценить риски. Подход «код сгенерирован без понимания и проверки, без учёта архитектуры проекта и договорённостей внутри команды» нам не подойдёт.\nНаш стек\n Язык: PHP 8.3\nФреймворк: собственный - FastRoute, PHP-DI, компоненты Symfony (String, Mailer, Translation)\nБаза данных: MySQL 8, PDO и mysqli (нативный SQL), миграции и сиды - Phinx\nКэш, сессии, очереди: Redis, собственная реализация очередей на Job-классах, воркеры\nИнтеграции: Guzzle, Диадок (ЭДО, OpenID Connect), Яндекс.Маркет, IndexNow\nРабота с данными: PhpSpreadsheet, SimpleXLSX, opis/json-schema\nИзображения: Imagick\nКачество кода: PHPUnit, Psalm, PHP_CodeSniffer, PHPMD\nМониторинг: Sentry\nИнфраструктура: Ubuntu, nginx, Selectel, GitHub Actions, раздельные контуры (production / staging / test)\nFrontend (для контекста): Vue 3 + Ant Design Vue в админках, серверные шаблоны + Tailwind на витрине\n Формат работы\n Мы работаем в офисе по понедельникам и пятницам, ориентировочно с 10:00 до 17:30. Офис находится в собственности компании - это не арендное пространство. Мы постарались сделать его максимально комфортным и уютным: скорее он напоминает небольшой бутик, чем классический офис.\n Для кандидатов, которые привыкли к удалённой работе, хотим сразу обозначить важный момент. Мы понимаем желание брать несколько проектов одновременно, но также хорошо представляем объём задач в нашем продукте. Совмещать полноценную работу у нас с другими проектами, скорее всего, будет непросто.\n Поэтому просим трезво оценивать свою загрузку и возможность уделять проекту достаточно внимания. Мы ищем человека, который сможет глубоко погрузиться в продукт и быть вовлечённым в его развитие.","description_format":"text","description_chars":8558,"description_truncated":false,"requirements":{"experience_years_min":3,"management_years_min":null,"team_size_min":null,"manages_managers":false,"education":null,"security_clearance":false,"languages":[{"language":"Russian","level":"Advanced (C1)","optional":false}]},"benefits":[],"hiring_locations":[{"name":"Russia","iso":"RU","kind":"country"}],"hiring_excludes":[],"relocation_offered":false,"industries":["Web Development Services","Digital Marketing"],"lifecycle":[{"event":"open","at":"2026-10-28T18:31:46Z"}],"visa":[],"liveness":{"score":86,"band":"hot","label":"Hiring now","p_open":1,"p_active":0.86,"p_room":1,"age_days":2,"expected_fill_days":28,"reasons":["conf:22","win:early"],"computed_at":"2026-10-31T05:58:55Z"},"pay":{"stated_usd_annual":22716,"is_top_pay":false},"html_url":"https://alion.io/job/ddq-php-razrabotchik-backend-middlesenior-2","json_url":"https://alion.io/job/ddq-php-razrabotchik-backend-middlesenior-2.json","meta":{"generated_at":"2026-11-01T00:09:07Z","cache_seconds":300,"methodology":"https://alion.io/methodology","terms":"https://alion.io/terms","contact":"https://alion.io/contact","api":"https://alion.io/developers","about":"Alion is a live layer of people, companies and AI agents: who they are, whether they are real and active right now, what they do and how to work with them, readable by people and by agents and paid per call.","catalog":"https://alion.io/catalog.json","usage":{"tier":"crawler_verified","counted_by":"address","units_charged":1,"used_today":281,"day_limit":null,"remaining_today":null,"minute_limit":300,"resets_at":"2026-11-02T00:00:00Z"}},"offers":[{"id":"company.slices","title":"One company in depth, by slice","status":"live","price":{"credits":0.02,"usd":0.002,"plus_per_slice":{"credits":0.05,"usd":0.005}},"unit":"per company, plus each slice with data","note":"the employer in depth","call":{"mcp_tool":"get_company","arguments":{"id":3142},"rest":"https://alion.io/mcp/rest/get_company?id=3142"},"human":"https://alion.io/catalog?offer=company.slices&for=job%2Fddq-php-razrabotchik-backend-middlesenior-2"},{"id":"market.stats","title":"A market slice: pay, demand and time to fill","status":"live","price":{"credits":1,"usd":0.1},"unit":"per slice","note":"pay, demand and time to fill for this role and place","call":{"mcp_tool":"market_stats"},"human":"https://alion.io/catalog?offer=market.stats&for=job%2Fddq-php-razrabotchik-backend-middlesenior-2"},{"id":"job.search","title":"Open jobs by role, technology, place, pay and visa","status":"live","price":{"credits":0.02,"usd":0.002},"unit":"per posting in a list","note":"similar open postings","call":{"mcp_tool":"search_jobs"},"human":"https://alion.io/catalog?offer=job.search&for=job%2Fddq-php-razrabotchik-backend-middlesenior-2"},{"id":"company.verify","title":"Is this company real and active right now","status":"pilot","price":null,"unit":"per company","request":{"url":"https://alion.io/catalog/request","method":"POST","body":"{\"offer\": \"company.verify\", \"for\": \"job/ddq-php-razrabotchik-backend-middlesenior-2\", \"note\": \"what you need it for\"}"},"human":"https://alion.io/catalog?offer=company.verify&for=job%2Fddq-php-razrabotchik-backend-middlesenior-2"}],"agent":{"mcp":"https://alion.io/mcp/jobs","mcp_open":"https://alion.io/mcp/open","next":[{"tool":"get_job","arguments":{"id":3413100}},{"tool":"search_jobs","arguments":{"company":"ddq.ru","detail":"compact"}},{"tool":"match_people","arguments":{"job_id":3413100},"note":"people open to offers who fit this vacancy"}],"note":"The same data through MCP tools: https://alion.io/mcp/open needs no sign-in (compact searches, postings, people); https://alion.io/mcp with an Alion account has everything. Docs: https://alion.io/developers"}}