Мой путь в разработке начался более 20 лет назад: фронт, бэк, софт под ОС и микроконтроллеры, инфраструктура и DevOps. Теперь перешел от написания кода к автоматизации с помощью ИИ. Делюсь экспериментами, решениями и выводами из практики.
ПодписчикиСколько подписчиков у канала сейчас. Волна — число подписчиков в каждой точке периода. Изменение — к началу периода.10,0 %+0 с 25 октября
ПросмотрыСколько сейчас просмотров у постов, вышедших за период. Это не просмотры за день: сколько посмотрели вчера, MAX не сообщает.46у постов за период
РеакцииСколько реакций у постов, вышедших за период.0у постов за период
УпоминанияСколько раз канал упомянули другие каналы: ссылки и репосты, без рекламных постов. Чем крупнее круг, тем больше упоминаний в этой точке периода.61▼ 18,1 %было 76по подписке
РепостыСколько раз другие каналы сделали репост постов этого канала (без рекламных постов). Репосты входят и в число упоминаний.28▲ 14,3 %было 25после входа
Средний охват постаСколько просмотров в среднем набирает один пост. Считаем по постам старше двух суток: у свежих просмотры ещё растут. Точки, где есть свежие посты, — пунктиром и полыми кружками: охват всех постов на сейчас, он ещё вырастет.3просмотров на пост
ERRКакая доля подписчиков видит средний пост: средний охват ÷ подписчики × 100 %. Линия — ERR в каждой точке периода, пунктир — ERR прошлого такого же периода. Точки с постами моложе двух суток — полые кружки на пунктирном конце линии.276,9 %подписчиков видят пост
Вовлечённость ERКак часто читатели реагируют на посты: реакции ÷ просмотры × 100 %. Засечка на полосе — прошлый период.—реакций на 100 просмотров
Постов в деньСколько публикаций в среднем выходит за день. Клетка — точка периода: чем темнее, тем больше постов в день.2,6публикаций в день
Доля рекламыКакая доля публикаций за период похожа на рекламу: маркировка erid, рекламные ссылки и другие признаки. Шкала — рекламная нагрузка по порогам индекса качества: до 10 % — низкая, до 25 % — умеренная, до 50 % — высокая, дальше — очень высокая. Рост доли отмечается красным.4,2 %▲ 0,8 п. п.
ДинамикаСверху — число подписчиков на конец каждой точки периода, снизу — прирост за точку: зелёный — подписчиков стало больше, красный — меньше. Над графиком прироста — самый большой прирост и самая большая убыль. Сколько подписалось и отписалось по отдельности, MAX не сообщает.
Рост аудитории
0подписчиков с 25 октября
Число подписчиков за период не менялось
Оценка каналаОценка канала от 0 до 100 из пяти частей: аудитория, честность роста, рекламная нагрузка, доверие и достоверность расчёта. Полоса — сколько баллов часть набрала из своего максимума. Индекс пересчитывается каждую ночь; каналы сравниваются с похожими — той же категории и размера.
Индекс качества пока не рассчитан. Он появляется у каналов от 500 подписчиков, которые публикуют посты хотя бы раз в неделю, после недели наблюдения.
ОхватыСколько сейчас просмотров у постов, вышедших в каждой точке периода (а не просмотры за день). Подписан рекорд; точка с сегодняшним днём бледнее — день ещё идёт. Средний охват поста — по постам старше двух суток.
Просмотры и охват
46просмотров за период
Средний охват поста — 3 просмотров (посты старше двух суток).
ВовлечённостьER — реакции, делённые на просмотры, в процентах — у постов каждой точки периода. Пунктир — ER за весь период. Изменение — в процентных пунктах к прошлому такому же периоду.
Вовлечённость подписчиков
—ER = реакции ÷ просмотры
За период у постов нет прочитанных реакций.
ЦитируемостьИндекс цитируемости (ИЦ) — насколько часто и какими каналами упоминают этот канал за последние 30 дней, без рекламных постов. Уровень — место среди похожих каналов. Линия — ИЦ в каждой точке периода (в неделе и месяце — средний за её дни).
Индекс цитируемости пока не рассчитан: он появится после ночного расчёта, когда канал упомянут другие каналы.
РитмСколько постов в среднем выходит в каждый час каждого дня недели, время московское: чем темнее клетка, тем больше публикаций. «Лучшее время» — часы, в которые у постов старше двух суток самый высокий средний охват.
Когда и сколько публикует
ПнВтСрЧтПтСбВс
036912151821
Лучшее время:09:0018:00часы, в которые у постов самый высокий средний охват
ФорматыИз чего состоит лента. У каждого поста один формат — по старшинству: репост, видео, фото, ссылка, текст. Полоса и проценты — доля постов формата; справа — средний охват одного поста формата (по постам старше двух суток), полоска — сравнение с самым просматриваемым форматом.
ПубликацииКаждая точка — пост за период: по горизонтали — дата выхода, по вертикали — просмотры, размер точки — реакции, цвет — формат. Так видно хиты, провалы и то, как меняется охват. У крупных каналов показаны 100 самых просматриваемых постов и равномерная выборка остальных — не больше 1 500 точек.
Каждый пост — точка
Выше — больше просмотров, крупнее — больше реакций. Нажмите на точку, чтобы открыть пост.
ВидеоФотоДругоеразмер — реакцииПриближение — кнопками «+» и «−», щипком или Ctrl + колесо мыши; приближенный график сдвигается перетаскиванием
СводкаИтоги выбранного периода: сколько вышло публикаций, сколько у них сейчас просмотров и реакций и средний охват поста. Просмотры — текущие у постов, вышедших в эти дни, а не просмотры за день. Изменение — к такому же отрезку перед периодом, если за него есть статистика.
Итоги периода
Нажмите на показатель — ниже он появится по точкам периода
Просмотрысегодня — день ещё идётТочки с постами моложе двух суток — бледные с пунктиром: их просмотры ещё растут.
РекламаКакая доля публикаций за период похожа на рекламу: маркировка erid, рекламные ссылки и другие признаки. Детектор осторожный, поэтому настоящая доля обычно выше. Шкала — рекламная нагрузка по порогам индекса качества. Ниже — средний охват рекламного и обычного поста и кого рекламирует канал (сайты, на которые ведут ссылки из рекламы).
Что работаетПосты периода с наибольшим числом просмотров. Полоса — просмотры относительно первого места. Превью — картинка поста, у поста без картинки — аватар канала. Просмотры — сколько у поста сейчас.
РитмСколько постов вышло в каждый день периода (бледные столбики) и среднее за 7 дней (линия): видно, разгоняется канал или затихает. Сегодняшний день ещё идёт, поэтому среднее для него считается по вчерашний день.
Публикации по дням
Бледные столбики — дни, линия — среднее за 7 дней: видно, разгоняется канал или затихает
Публикации за деньСреднее за 7 дней
Данные обновлены в 09:38 по Москве. Просмотры — текущие у постов, вышедших в эти дни; средний охват — по постам старше двух суток.
Как считается индекс качества
От rules к skills Поначалу я записывал все инструкции для агента в rules. Как писать код, как организовывать проект, каких подходов придерживаться. В моей тогдашней настройке все эти правила загружались в контекст при каждом запросе.
И меня это устраивало. Я писал промпты, агент писал код. Правила были про написание кода, поэтому нужны были практически в каждой задаче)
Сейчас у нас в команде десятки скиллов: написание кода, подготовка контрактов, ресерч по документации, создание задач и так далее.
Если всё это каждый раз целиком загружать в модель, контекст будет забит инструкциями ещё до того, как начнётся работа. Даже когда нужно просто создать задачу, рядом окажутся подробности написания кода и подготовки контрактов. Со скиллами загрузка устроена иначе. Сначала модель видит их названия и краткие описания, чтобы понять, какие из них подходят для текущего запроса. А полные инструкции подгружает по мере необходимости.
Нужно написать код — читает скилл для разработки. Нужно разобраться в документации — скилл для ресерча. Если задача включает несколько этапов, по ходу работы может понадобиться несколько скиллов.
Так можно хранить десятки подробных инструкций и подключать нужные под конкретную задачу. Пока я только просил агента писать код, загружать все мои правила сразу было вполне логично. Когда агент стал участвовать в разных этапах работы команды, понадобилось управлять ещё и тем, какие инструкции и в какой момент попадают в его контекст.
В контексте агента накапливаются наши сообщения, ответы модели, код и результаты работы инструментов. Часть этих данных со временем становится лишней. У контекстного окна есть предел. Поэтому в длинных сессиях может использоваться сжатие контекста — compaction: историю заменяют более компактным представлением, сохраняя важное для продолжения работы.
Например, вместо полных логов можно оставить, какой тест падал, что исправили и прошла ли последняя проверка. Но при сжатии отдельные детали и точные формулировки могут потеряться.
Кэширование может снизить затраты на обработку истории, но место в контекстном окне не освобождает.
Поэтому полезно ограничивать ненужный вывод инструментов, а актуальные решения и ограничения сохранять в файлах проекта. Так агент сможет прочитать их заново после сжатия или в следующем чате.
Если упростить, это модель, инструкции, инструменты и программа, которая связывает их в рабочий цикл.
Например, мы просим исправить ошибку в коде. Программа передаёт модели задачу, инструкции и описание доступных инструментов. Модель выбирает следующий шаг — допустим, прочитать файл — и формирует вызов инструмента.
Программа выполняет вызов, добавляет результат в историю и снова обращается к модели. Та выбирает следующий шаг. Цикл повторяется до готового ответа или остановки, например, чтобы задать нам вопрос.
Поэтому одно наше сообщение может запустить сразу несколько обращений к модели. Между ними программа выполняет действия через инструменты: читает файлы, меняет код, запускает команды.
При каждом обращении модель получает новые данные вместе с контекстом разговора: инструкциями, нашими сообщениями, своими предыдущими ответами и результатами работы инструментов.
То есть мы пишем короткое «да, продолжай», а рядом с ним в контексте уже могут быть десятки сообщений, куски кода и логи)
В прошлом посте я писал о том, что важные детали задачи могут остаться у меня в голове и не попасть к ИИ. А иногда достаточно одной опечатки, чтобы смысл стал противоположным)
Однажды я написал «ну активити» вместо «не активити».
Всего одна буква — и отрицание исчезло. Как вы понимаете, получил противоположный результат.
У меня в голове всё ещё было «не активити». А модель получила совсем другой текст.
Поэтому мало сформулировать задачу. Нужно ещё перечитать то, что отправляешь, и проверить, совпал ли результат с тем, что ты хотел получить.
На уточнения и исправления тоже уходит время. И в реальном проекте его приходится учитывать, когда сравниваешь разработку с ИИ и без него.
Есть такое упражнение: одному человеку показывают картинку, а остальные должны нарисовать её по его описанию. Саму картинку они не видят.
Потом все показывают свои рисунки и сравнивают их с оригиналом. И оказывается, что у каждого получилась своя версия) Все слушали одно описание, но недостающие детали каждый додумал по-своему. Мне кажется, с ИИ примерно так же.
У меня в голове уже есть картинка того, как должна работать система. Я знаю, где нужна валидация, как должны проходить транзакции, что делать при ошибках. Часть этих вещей кажется настолько очевидной, что я даже не упоминаю их в задаче.
Модель же ориентируется на описание задачи и доступный ей контекст. Если важных деталей там нет, она заполняет пробелы сама.
После истории с несовпавшими контрактами дописал в правила обязательный Swagger.
Но в том случае само его наличие не решило бы проблему: контракты для бэкенда и фронтенда создавались параллельно.
Можно было сначала описать общий контракт в OpenAPI, а уже потом запускать двух агентов на бэкенд и фронтенд. Для этого проекта, скорее всего, такого порядка было бы достаточно.
В более крупных проектах и это не гарантия: по ходу исправлений после тестов и код-ревью контракты иногда меняются. За этими изменениями тоже нужно следить.
И снова всё прошло быстро: всего два часа — и второй проект уже в проде)
Ко второму проекту я подошел уже более организованно.
Правила у меня уже были, и я их доработал: описал, какие технологии использовать, каких архитектурных подходов придерживаться, как называть папки и что где размещать.
Включил режим планирования. Агент задал ряд вопросов, составил план и сохранил его в файл. Я несколько раз перечитал план и руками отредактировал.
После этого написал:
Сделай бэкенд и фронтенд параллельно, двумя субагентами.
Агенты приступили к работе: один собирал бэкенд, второй — фронтенд. Обе части были готовы, но вместе сразу не заработали.
Контракты почти совпали)
В большинстве мест всё сошлось. Но где-то различались имена полей, где-то — сами передаваемые данные. Этого хватило, чтобы бэкенд и фронтенд не состыковались с первого раза.
После первого проекта я увидел в одном чате сообщение о том, что ИИ ускоряет разработку менее чем в два раза.
Мне тогда было сложно с этим согласиться. У меня перед глазами был собственный результат: четыре часа — и готовый проект. По моим прикидкам, руками я бы делал его больше недели.
А тут — даже не в два раза?
Решил пообщаться с людьми в этом чате. Был уверен, что мой опыт говорит сам за себя: ИИ ускоряет разработку в десятки, а то и в сотни раз)
На тот момент мне казалось, что я уже это проверил на практике.
За это время появились бэкенд, UI, фичи ретро-доски и онлайн-игра с рисовалкой по WebSocket. Успел посмотреть код, уточнить правила и попросить агента внести исправления.
Для себя я убедился: ИИ действительно пишет код) И может писать его с теми подходами, которые ты ему задаешь. Свои ожидания пришлось описать явно, а потом проверить, насколько результат им соответствует.
Думаю, на простых проектах это может давать ускорение в десятки, а на отдельных задачах — даже в сотни раз.
По моей оценке, только игру с передачей событий и рисованием в реальном времени через вебсокеты я бы вручную делал не один день. А на весь проект у меня ушло бы точно больше недели.
Еще увидел, куда можно двигаться дальше: идти от контрактов и делать бэкенд и фронтенд параллельно. А внутри них — распределять независимые задачи между агентами.
Решил подробнее посмотреть, что же получилось под капотом.
Местами валидация оказалась в юзкейсах, были возможны гонки данных, не хватало транзакций на уровне application. Общее правило «писать по DDD» оказалось недостаточным.
Попросил модель провести код-ревью. Она нашла несколько проблем, но ни одну из тех, которые нашел я.
Тогда я начал разбирать отдельные куски кода и спрашивать, могут ли там возникнуть проблемы. После таких вопросов модель подсвечивала возможные гонки данных и предлагала решения.
Решил дописать правила явно: про транзакции на уровне application, доменную валидацию и другие требования к организации кода.
Заодно заметил, что миграции оформлены по-разному: часть — обычные SQL-файлы, часть — под `goose`. Зафиксировал в правилах, что все миграции нужно делать под `goose`.
Затем попросил агента найти расхождения с обновленными правилами и переписать код.