В разработке с 2014 года — от legacy PHP 5.6 до современного TypeScript и Go-микросервисов.
Ко всему пришёл сам. Стараюсь выбирать инструмент под задачу, а не наоборот.
Пишу код с 2014 года. Профильного образования не получал — всему научился сам: по документации, форумам, чужому коду и собственным ошибкам. Этот путь дольше, чем курсы или университет, но он приучил не запоминать «как правильно», а каждый раз разбираться, почему так.
В разработку пришёл не с нуля. Сначала был свой интернет-магазин — я вёл его как владелец, и узнал e-commerce со стороны денег: воронка, выгрузки, возвраты, маркетплейсы, «небольшой баг в корзине = потерянный заказ». Потом был период SEO: техническая оптимизация, скорость, индексация, разметка, аналитика. К моменту, когда я начал писать код, я уже хорошо понимал, что нужно бизнесу и где именно он теряет деньги — оставалось научиться это чинить руками.
Поэтому первой платформой стал OpenCart: я знал её изнутри как владелец магазина и как оптимизатор, и было естественно начать писать под неё модули. Долго брал заказы на русскоязычном форуме OpenCart — по магазинам, интеграциям, миграциям. Со временем заказы почти перестали приходить из открытых площадок: клиенты начали рекомендовать меня друг другу, и большая часть проектов пошла по сарафанному радио.
Этот опыт научил двум главным вещам, которые я ценю до сих пор:
- Код должен работать у клиента без меня. Когда клиент — не программист, ты не можешь оставить за собой «тут надо знать, как это собирать». Всё должно просто запускаться, обновляться и чиниться в понятных местах.
- Рекомендации — лучший KPI. Когда человек приводит к тебе своего знакомого, это значит, что предыдущий проект не доставил ему боли. Это дисциплинирует сильнее любого код-ревью.
Сейчас основное время — в продуктовой разработке Waviot, а фриланс остаётся как «интересные проекты для интересных людей».
Стараюсь не применять технологии ради технологий. Новый фреймворк сам по себе не делает продукт лучше — его делают лучше правильные решения в нужных местах.
- 🧠 Инженерное суждение важнее стека. На проде — стабильный, проверенный стек; эксперименты — в пет-проектах. SPA-фреймворк не появится в проекте, где хватает Alpine или чистого JS. jQuery не будет удалён из работающего legacy ради «моды».
- 🔁 Одинаково уверенно работаю и со старым, и с новым кодом. Читаю чужой legacy без фреймворка, поддерживаю Yii2 и Laminas, пишу современный TypeScript — и всё это может жить в одной компании одновременно.
- 🛠️ Большой опыт миграций и апгрейдов. Переводил проекты с Zend Framework на Laminas, поднимал PHP с 5.6 до актуальных версий, обновлял Yii, переводил поиск на SphinxSearch и обратно под задачу. Знаю, где у таких переходов подводные камни.
- 🪓 Не применяю язык/фреймворк там, где это не нужно. Иногда правильный ответ — это shell-скрипт, yoyo-миграция, bash-cron или одна SQL-вьюха вместо целого сервиса.
- 🧩 Сильная сторона — связывать системы. CRM, АТС, службы доставки, сервисы данных, IoT-устройства — моя специализация в интеграциях, где важно не сломать работающее.
- ♻️ Лучший код — тот, который легко удалить. Пишу так, чтобы через год можно было выкинуть кусок без страха за остальное.
В @waviot (IoT-платформа на протоколе NB-Fi) веду и развиваю системы на очень разных стеках — осознанно, потому что у каждой части свой контекст и свой возраст:
| Слой | Стек | Почему так |
|---|---|---|
| Личный кабинет клиентов | TypeScript + Vue + Vite + Tailwind | Свежий проект — можно позволить современный SPA |
| Основные сервисы биллинга/лицензий | Laravel (PHP) | Экосистема, скорость разработки, проверено временем |
| Сервис лицензирования (legacy) | Yii2 + Codeception + RBAC | Работает стабильно, переписывать без причины — дорого |
| Высоконагруженная авторизация | Go | Там, где PHP избыточен: низкая латентность, бинарник |
| Очереди и шина между сервисами | RabbitMQ + AMQP | Развязка сервисов: отказ одного не роняет остальных, нагрузка сглаживается очередью |
| Телефония / callbacks | Python | Хорошие библиотеки под конкретные задачи |
| Сервер производства (legacy) → новый | Python → сейчас переписываю | Старый сервер работает, новый пишу параллельно без простоя |
| Поиск по большим каталогам | SphinxSearch | Когда нужна полнотекстовая выборка с предсказуемой скоростью |
| Миграции версий PHP и фреймворков | PHP 5.6 → 8.x, Zend → Laminas, Yii upgrade | Переводил несколько проектов на актуальные версии без downtime |
| Desktop-утилиты для инженеров | Go + Wails | Нужен кроссплатформенный бинарник без Electron-веса |
| Программатор устройств | Qt + C++ + OpenSSL | Кроссплатформенный десктоп под специфичную железную обвязку, где Wails не подходит |
| Legacy отчёты и старые модули | PHP (self-made MVC, PHTML) | Не трогаем то, что работает — если трогаем, то точечно |
| Поиск и аналитика нового поколения | Meilisearch + Docker | Правильный инструмент под новую задачу поиска |
Мне интересно не столько «писать на чём-то одном», сколько понимать, когда какой стек уместен — и уметь жить сразу с несколькими поколениями кода в одном проекте.
Языки — PHP (8+), JavaScript / TypeScript, Go, Python, Java, Bash
Backend-фреймворки — Laravel · Yii2 · Laminas (бывший Zend Framework) · OpenCart · самописный MVC (legacy) · Go (чистый) · Python (серверные приложения · FastAPI · aiohttp)
Frontend — TypeScript · Vue · Alpine.js · Blade · jQuery (да, знаю, когда он уместен) · Tailwind · Bootstrap · Vite · Electron · Wails
БД и поиск — MySQL · PostgreSQL · MongoDB · Redis · SphinxSearch · Meilisearch
Очереди и шина — RabbitMQ · AMQP
Инфраструктура — Docker · Linux (debian-пакеты, systemd-юниты) · Nginx · Git · cron/yoyo/fabric для старых деплоев
Интеграции — Mango Office · Megaplan · Dadata · СДЭК · ВКонтакте API · OpenCart marketplace API
Параллельно с основной работой делаю Mercurio — собственную admin-платформу для интернет-магазинов на Laravel + Blade + Bootstrap 5 + jQuery. Стек выбран намеренно: серверный рендер с точечным AJAX — та же идея, что у Hotwire, HTMX и Laravel Livewire, только без новой обучающей кривой поверх и так знакомых инструментов. Новый раздел админки добавляется одним классом, без отдельного SPA-приложения сбоку и build-цепочки на пустом месте.
Это сборка всех трёх «прошлых жизней» в одном продукте — владельца магазина, SEO-специалиста и full-stack-разработчика: сделать админку, в которой удобно тем, кто реально продаёт, а не «настраивает CRM».
Состав админки
| Раздел | Что внутри |
|---|---|
| 📦 Каталог | Товары · Категории · Бренды · Атрибуты · Группы · Варианты · Опции · Изображения |
| 🛒 Продажи | Заказы · Возвраты (RMA) |
| 👥 Клиенты / CRM | Клиенты · Задачи · Диалоги · Быстрые ответы · Сегментация |
| 📣 Маркетинг | Промокоды · Брошенные корзины · Отзывы |
| 📝 Контент | Блог · Страницы · Медиа |
| 🏬 Склад | Остатки · Движения · Перемещения · Приходы (многоскладовость) |
| 📊 Аналитика | Когорты · LTV |
| ⚙️ Сервис | Импорт CSV (с прогрессом и кэшем картинок) · Audit log |
| 🔧 Настройки | Контакты · Доставка · Оплата · Почта · API + Webhooks |
| 🛡️ Команда | Пользователи · Роли и права |
Open-source — то, что выделил из Mercurio в отдельные пакеты
| Пакет | О чём | Стек |
|---|---|---|
| 📋 mercurioplatform/tables | Reusable list/table engine для Laravel-админок: декларативный Resource-класс → admin-страница с поиском, сортировкой, фильтрами, saved views, bulk/row actions, экспортом, prefs и audit log — одной строкой роута |
PHP · Laravel · Bootstrap 5 · jQuery · Blade |
Пакет вырос из реального проекта, а не из «давайте сделаем фреймворк». 5 сознательных точек расширения; страница рендерится сервером, AJAX подгружает только
<x-tables::table-root>.
Коммерческий код закрыт под NDA — здесь то, что можно показать: модули, SDK, утилиты и эксперименты.
| Проект | О чём | Стек |
|---|---|---|
| 📞 Laravel-Mango-Office | Интеграция Laravel с облачной АТС Mango Office | PHP · Laravel |
| 📦 Export-Import-Opencart-Vue | Импорт/экспорт товаров OpenCart с Vue-интерфейсом | PHP · Vue |
| 📍 opencart-dadata | Подсказки адресов/ФИО от Dadata в OpenCart | Vue · PHP |
| 🧹 opencart-image-remover | Чистка каталога изображений OpenCart от «осиротевших» файлов | PHP |
| 🚚 migration-opencart-database-to-new-version | Миграции БД между версиями OpenCart | PHP |
| 📡 NB-Fi-platform | LPWAN IoT-платформа на протоколе NB-Fi | PHP |
| 🛰️ my-tools-parse-message-waviot | Десктопный парсер сообщений WAVIOT API — личная утилита для инженеров | Wails · Vue 3 · Tailwind 4 |
| 📊 Dashboard-Megaplan-and-Mangooffice | Отчёты по менеджерам из Megaplan + Mango Office | PHP |
| 🔗 sdk2.0 | PHP SDK для API v2.0 сервиса СДЭК | PHP |
| ⚙️ Simple-Settings | Минималистичный пакет настроек для Laravel | PHP |
| 📈 simple-settings-benchmark | Бенчмарк производительности пакета Simple-Settings | PHP · Laravel · Blade |
| 🖼️ transfer-images | Перенос папки с изображениями между серверами | Shell |
| 🛜 vpn-help | Восстановление интернета на macOS при конфликте OpenVPN и AmneziaVPN | Shell · macOS |
Основная работа над коммерческими продуктами — во внутреннем GitLab Waviot.
💡 Открыт к интересным проектам и подработкам — особенно где нужно связать системы, разобраться в чужом коде или принять инженерное решение, а не просто «накодить фичу».
