Блог

Статьи про архитектуру, headless e-commerce и практичную продуктовую разработку.

Два кэша воюют: CDN против Bitrix Composite

Мы подключили Cloudflare к Bitrix-магазину в четверг вечером. В пятницу утром пошли жалобы: «корзина пустая, хотя добавлял». К субботе — «личный кабинет показывает чужие данные».

Почему я плачу за AI-инструменты сам — пока корпорации режут лицензии

Microsoft отозвала корпоративные лицензии Claude Code у тысяч своих разработчиков. Один тикет в IT-отдел — и инструмент, на котором человек выстроил свой рабочий процесс, перестал открываться в понедельник утром.

Constraint decay: почему AI «забывает» твои ограничения в долгих сессиях — и что с этим делать

Я дал Claude Code задачу: рефакторинг PHP-модуля синхронизации Bitrix с 1С. Прописал в начале: строгая типизация, никаких mixed, никаких глобальных переменных, все методы через dependency injection.

Мы потратили три дня на настройку Copilot. Вот что я сделал бы иначе

Мой коллега потратил три дня, чтобы поднять GitHub Copilot для команды из пяти человек. У каждого своя конфигурация VPN. Billing не проходит через карты. На корпоративный аккаунт нужен иностранный способ оплаты. Итог: двое работают с AI, трое — нет. Разрыв в скорости виден уже через неделю.

Bitrix REST API и TypeScript: контракт, который мы сгенерировали сами

Когда мы переводили каталог на 28 000 позиций в headless-архитектуру, первые две недели прошли в одном режиме. Открываешь метод Bitrix REST, смотришь на документацию — документация отстаёт от текущей версии месяца на три. Открываешь дебаггер, вызываешь метод, смотришь на реальный ответ. Делаешь вывод о форме. Пишешь интерфейс вручную. На следующий день коллега делает то же самое с другим методом — чуть иначе, чуть другие предположения.

File-lock через mkdir в PHP: как я решаю параллельность cron без Redis и mutex

Мне нужно было, чтобы 13 cron-задач никогда не запускались параллельно. Все они работают с одним Chrome-профилем — той же сессией LinkedIn, которую я залогинил руками месяц назад. Два параллельных инстанса и профиль умирает.

Google убивает органику e-commerce. Что делать владельцу сейчас?

В апреле я открыл Google Analytics трёх e-commerce проектов, с которыми работаю давно. Органика Google: минус 23% год к году. Не у одного клиента — у трёх разных магазинов, разные ниши, разный размер, разный возраст сайта. Картина одинаковая.

Контекст AI-агента — это ресурс. Как я перестал его тратить вслепую

Я потратил час на AI-сессию, только чтобы в конце обнаружить: агент исправил файл, который мы уже поправили в начале. Не потому что он плохой. Контекст переполнился, и модель «забыла» о том, что было в начале разговора. С тех пор я отношусь к контекстному окну как к оперативной памяти: когда кончается — начинаются свопы. И у меня появилась гигиена.

Четыре PHP-поведения, которые мы поймали только в проде Bitrix

Мы три дня искали, почему страницы каталога тормозят при конкурентных запросах. Профилировщик показывал: время уходит в ожидание. Nginx — чистый. MySQL — idle. FPM workers — свободны. Оказалось: session_start() ставит файловый lock, и все параллельные запросы одного пользователя выстраиваются в очередь. PHP ведёт себя именно так, как написано в документации. Просто эту страницу документации никто не читает перед деплоем в прод.

Redirects умерли в день деплоя. Bitrix об этом не предупреждает.

Мы переехали на headless в феврале. В апреле SEO-специалист прислал выгрузку: 340 битых ссылок. Три года работавших редиректов. Ноль ошибок в логах — потому что Next.js не знал, что они вообще должны были существовать.

Маппинг Elasticsearch — это архитектура, а не конфигурация

Три недели мы не могли понять, почему фильтр по цене не работает. Elasticsearch был жив. Запросы приходили. Результаты возвращались. Но диапазон цен от 1000 до 5000 рублей игнорировался полностью: в выдаче появлялись товары за 12 000 и за 300 рублей одновременно.

Как мы используем Claude Code в студии — без розовых очков

Год назад я написал статью про то, что не отдаю AI в работе. В ней был список запретов: архитектуру не проектирует, контракты между слоями не меняет, решения по схеме БД не принимает. Список работает. Но за год добавилось кое-что ещё — понимание того, где Claude Code реально полезен. Это не там, где вы думаете.

Владеть продуктом, а не только разрабатывать его: три момента, когда я это понял

Я долго думал, что быть хорошим разработчиком — значит делать хорошо то, что попросили. Пишут задачу — я её реализую. Принимают работу — я иду дальше. Так работает большинство. Так работал и я. До трёх конкретных моментов.

PHP 8.4 и Bitrix в production: что реально ломается после обновления

В release notes Bitrix написано: «PHP 8.4 поддерживается». Первый клиент, который обновил staging, получил 47 deprecated notices за один запрос главной страницы и сломанный платёжный модуль. Ни одна из этих проблем не была в ядре Bitrix.

Релевантность — не прибыль: как мы научили Elasticsearch работать на маржу

Мы провели A/B-тест. Контроль — поиск сортировал по текстовой релевантности. Вариант — по функции, которая учитывала маржу, остаток и скорость оборота. Кликабельность — почти одинаковая. Выручка с поискового сеанса — на 12% выше в варианте с бизнес-ранжированием.

Рабочее место не-вайбкодера: как я выстроил harness для AI в PHP-студии

Вайбкодинг — это когда ты описываешь задачу, AI выдаёт код, ты смотришь «вроде работает» и деплоишь. Я так не работаю. Не потому что боюсь AI — Claude Code открыт у меня каждый рабочий день. Просто без структуры в legacy PHP-проекте это не ускорение. Это накопление долга с красивым интерфейсом.

Как понять, что вы реально упёрлись в потолок Bitrix — а не просто устали от него

Недавно мне написал клиент. Интернет-магазин, 30 тысяч SKU, Bitrix, «всё тормозит». Хотят уйти на headless. Я спросил: какой процент запросов превышает 2 секунды? Включён ли composite-режим? Смотрели slow_query_log за последние три месяца?

Почему я веду список «что НЕ делать в следующем проекте»

После каждого проекта я открываю одну и ту же заметку. Называю её «что не делать в следующем проекте». Там не «что прошло хорошо» — это в ретроспективу. Только одно: что именно я не повторю.

Почему у меня запрещено ставить LLM на клиентскую сторону

У меня в студии работает 13 автономных задач на Claude. Они ведут мой LinkedIn, пишут статьи для блога, мониторят SSI-систему, отправляют уведомления в Telegram. Я им доверяю — и сплю спокойно. Потому что если Claude напишет что-то не то в моём имени, я это увижу. Но если бы он написал это в ответ на вопрос покупателя о возврате товара на сайте моего клиента — это другая история. Именно поэтому у меня есть правило: никаких LLM на клиентской стороне. Пока.

Авторизованный пользователь видит форму входа. Bitrix жив. Next.js жив. Они просто не договорились.

Когда мы перенесли каталог 28 000 товаров на Next.js, первые два дня после деплоя были про CSS и перфоманс. На третий день пришёл тикет: «Авторизованные пользователи видят форму входа вместо личного кабинета».

Лог поиска — это лучший продуктовый документ, который вы не читаете

Клиент спросил: «Что ищут наши покупатели?» Я открыл Elasticsearch и вытащил топ-40 поисковых запросов с нулём результатов за прошлую неделю. Среди них — три точных названия товаров, которые были в наличии. Просто записаны иначе, чем в каталоге.

AI умножает не навыки. Он умножает привычки.

За последний год я написал примерно втрое больше кода. Это правда. AI-инструменты реально ускоряют. Но если честно, значительную часть этого кода я потом удалил.

Bitrix на выделенных ядрах: что стало видно в prod-графиках после переезда с shared-хостинга

Клиент пишет: «Мы всё перенастроили по вашим рекомендациям. OPcache включён, Redis-сессии работают. SQL-индексы тоже — проверяли отдельно. Вечерний пик всё равно роняет сайт».

Локальная разработка для headless Bitrix: три сценария и один рабочий

Первый вопрос, который мне задают про headless Bitrix, всегда про архитектуру. Второй — про деплой. Третий никто не задаёт вслух, но все спотыкаются об него на первой неделе: как вообще разрабатывать, если у тебя нет Bitrix на машине?

Как я вычисляю трудного клиента ещё до старта проекта

Два года назад я взял проект, в котором с первого звонка было три признака, которые я уже умел распознавать. Взял, потому что деньги были хорошие, а я сказал себе: «Справлюсь». Четыре месяца спустя я выходил из этого проекта — нормально, без скандала, но с ощущением, что потратил время на работу, которую надо было не брать.

Поиск, который врёт: почему Elasticsearch показывает «в наличии», когда товара нет

Покупатель ввёл запрос, нашёл нужный товар, кликнул — и увидел «нет в наличии». Ушёл. Написал в поддержку: «у вас сломан поиск». Я открыл логи — поиск работал правильно. Он показывал то, что было в индексе час назад. Проблема не в Elasticsearch. Проблема в том, что мы не подумали, как часто он должен узнавать о переменах.

Как я мониторю 13 автономных агентов: что логировать, что алертить, что игнорировать

У меня работают 13 агентов Claude без моего участия. На прошлой неделе двое из них упали. Я узнал об этом через 2 минуты — не потому что поставил сложный мониторинг, а потому что с первого дня вписал в каждую задачу пять строчек JSONL.

«Носки» и «гольфы» — один товар. Elasticsearch об этом не знал

После трёх недель настройки Elasticsearch — шарды, реплики, mapping, кастомный токенайзер — мы разобрались с нечёткостью: добавили fuzziness AUTO и zero-results упали с 22% до 11%. Хорошо. Но 11% покупателей по-прежнему уходили ни с чем. Я полез в логи и обнаружил: большинство из этих запросов не были опечатками. Это были синонимы.

Нет, я не масштабируюсь. И это моя стратегия.

Мне периодически говорят: «Тебе надо масштабироваться». Я веду boutique-студию разработки и намеренно её не масштабирую. Соглашаюсь кивком и не делаю ничего. Не потому что лень. Потому что я пробовал.

Кэш-инвалидация в headless: как Next.js узнаёт, что Bitrix обновил товар

Первая жалоба пришла на третий день после запуска headless. Менеджер обновил цену в Bitrix в 10:47. Покупатель положил товар в корзину в 11:20 — по старой цене. В Next.js была страница, закэшированная на один час.

Я пишу спецификацию до того, как прошу AI написать код. Вот почему

Я замерил. Когда я пишу спецификацию перед тем, как открыть Claude Code, итерация занимает в среднем 40 минут. Когда сажусь сразу писать промпт — около двух с половиной часов и три откатa.

Я перестал собеседовать разработчиков. Вот что я делаю вместо этого

В 2020 году я нанял разработчика, который на собеседовании безупречно объяснил архитектуру microservices, правильно ответил на все вопросы по PHP и произвёл впечатление на двух людей в команде. Через четыре месяца я его уволил. Не потому что он был плохим человеком — он просто не умел работать в нашем реальном контексте.

Как PHP OPcache убивает production Bitrix — и три строки, которые это чинят

Три месяца мы смотрели в slow query log. Перекраивали индексы. Добавляли Redis-кеш там, где его раньше не было. Сайт становился чуть лучше, но страницы каталога иногда виснули на 800-900ms без видимой причины.

Что ищут и не находят: как no-results превратился в наш главный источник задач

Мы добавили Elasticsearch в каталог на 28 000 SKU и решили, что дело сделано. Поиск работает, товары находятся, скорость нормальная. Через месяц я открыл аналитику поиска — конкретно логи no-results запросов.

Пять вопросов, которые я задаю перед тем, как предложить headless

За последние два года я трижды отговорил клиента от headless-миграции. Не потому что headless плохой — я люблю его строить и видел, что он даёт. А потому что ответы на пять вопросов делали результат очевидным ещё до того, как мы открывали Figma. В четвёртый раз ответы были другими, и проект получил полноценный Next.js + Bitrix на бэкенде. Сейчас это один из лучших ecom-проектов, с которыми я работал.

Технический долг в деньгах: как я объясняю рефакторинг без слова «архитектура»

Первые три раза я объяснял рефакторинг через «архитектуру» — и получал вежливое «окей, но давайте сначала сделаем фичи». Потом я поменял одну вещь: вместо «архитектурного долга» сказал «вот эта часть системы сейчас стоит нам дополнительных 6 часов на каждый новый тип доставки. За квартал это 60 часов, которые мы теряем». Клиент ответил: «ладно, выдели неделю».

MCP: 3 месяца в работе — что изменилось, что нет

Когда вышел MCP, я поставил четыре сервера за день. Потом убрал два. Потом добавил один другой. Через три месяца понял: Model Context Protocol не делает тебя умнее. Он убирает трение — в конкретных местах, за конкретные минуты.

Когда headless — это плохая идея

Я строю headless-сайты на Next.js + Bitrix уже несколько лет. Мигрировал каталог на 28 000 SKU. Отказался от $40K-контракта, потому что переписывать монолит там не имело смысла. И когда клиент приходит с запросом «хотим headless», первый вопрос всегда один: «А почему именно headless?»

Я веду блог, но ставлю на LinkedIn. Вот почему.

Через три недели после запуска ivanpin.com я посмотрел на источники трафика. LinkedIn дал на порядок больше визитов, чем поисковая органика. Сайту три недели, это нормально. Молодые домены так не работают. Но я всё равно задал себе следующий вопрос: а что будет, когда индексация устаканится?

Я даю Claude писать тесты. Я не даю ему выбирать архитектуру

Claude написал мне 340 строк тестов за восемь минут. Хорошие тесты. Я бы писал их два часа. Но когда я попросил его предложить структуру модулей для нового проекта на Bitrix, он выдал что-то симметричное, логичное и совершенно неработающее в нашем контексте. Разрыв между этими двумя результатами стал для меня рабочим определением: где заканчивается задача для Claude и начинается задача для меня.

Как модернизировать 1С-Битрикс без переписывания: Headless-архитектура как стратегическое решение

Rewrite — не всегда решение. Я модернизировал high-load e-commerce на 1С-Битрикс через Headless-подход: быстрее, безопаснее, без SEO-потерь. В статье — архитектура, риски, результаты и технический deep dive.