Разработка с использованием AI
LLM-агенты у меня в работе каждый день, и их вклад я считаю в часах.
В оценках проектов коэффициент ускорения назначается отдельно по видам работ,
а не одним числом на всё: на типовом слое он высокий, на финансовом ядре
близок к единице. Единый множитель по принципу «мы с AI в три раза
быстрее» означает, что оценку не делали.
Процесс устроен так:
-
Спецификация раньше кода. Spec-driven development. Контракты API и модель данных проектирую сам,
модель помогает оформить и проверить на полноту.
-
Тесты раньше реализации. В критических доменах деньги, платежи, резервирование
остатков инварианты и тесты формулирую сам. Это граница, которую генерация не пересекает: тестами дело не исчерпывается, и доверять их написание вслепую нельзя.
-
Генерация под тестами. Реализация создаётся моделью и сразу проверяется уже написанными тестами,
а не «на глаз». TDD по умолчанию.
-
Двойное ревью: автоматическое на типовые дефекты и человеческое на соответствие
замыслу. Оба обязательны.
-
В денежных модулях сгенерированный код не принимается без ручного разбора логики, покрытие
выше 90%. Экономия не окупает риск, ответственность за код только на разработчике.
Чего AI не ускоряет совсем:
Согласование требований
Ожидание доступов к сервисам
Договоры с платёжными провайдерами
Юридические заключения
Приёмку на стороне заказчика
Ревью в магазинах приложений
Экономия часов не превращается в такую же экономию календарного срока: обещать
обратное значит, обманывать заказчика.
Инструмент требует настройки, иначе он ускоряет производство мусора. В моих репозиториях лежат
подробные инструкции для агентов с накопленными фактами о поведении конкретной системы, а для
разбора платёжных инцидентов я написал три MCP-сервера, дающих агенту доступ к API банка, Redis
и логам (+ self-hosted Sentry, у которого свой MCP). Это инженерная работа,
а не просто подписка на LLM-сервис.
Принципы работы с заказчиками
У меня самого большой опыт работы с удалёнными исполнителями. Я знаю, что чувствует бизнес,
когда передаёт часть ответственности на внешнюю сторону. Нанять удалённого человека вместо
команды или в помощь команде это всегда риск. Самостоятельность
и проактивность в принятии решений не должны превращаться во вредительство, а понимание своих границ ответственности — в пассивность и потерю времени на проекте.
Полный разбор чужого API: документация всегда немного врёт
У банков и госсервисов поведение регулярно расходится с их же документацией. Например,
на платформе банковская проверка сделки отвечала «всё в порядке» и при этом
обманывала: она сверяет обещания внести деньги, а не реальные остатки на счетах. Когда
документации не хватает, я иду к продуктовым менеджерам провайдера и получаю письменное
разъяснение, а не теряю время, строя догадки или говоря о невозможности сделать что-либо,
не убедившись в обратном.
Интеграция не встаёт на месяц из-за расхождения между документом и реальностью.
Проектирую так, чтобы меня можно было заменить
Разработчики нередко строят себе незаменимость. Я считаю это плохим тоном. Так, например, модули на Rust снабжены чистыми Python-аналогами и меняются один
в один. Промпты и конфигурации запросов к языковым моделям хранятся в базе,
а не в коде, и правятся без релиза прямо на стороне заказчика. Каждое
такое решение описано в проекте отдельно.
Вы не покупаете вместе с кодом зависимость от одного человека.
Оставляю инструменты, а не только код
Чтобы разбирать денежные инциденты, я написал три служебных сервера с прямым доступом к API
банка, кэшу и логам. То, на что уходил час ручных запросов, стало занимать минуты.
Инструменты остаются в проекте и работают без меня.
Тестирую на живых деньгах, не ломая живые деньги
Если на стороне партнёрского сервиса нет тестового контура, это решаемая задача, а не приговор. Например, продакшн, тестовый и рабочий контуры платформы жили
на одном банковском счёте: код окружения был зашит в идентификатор заказа, а обработчики
платежей и фоновые задачи отсекали чужие транзакции.
Не нужен отдельный контур в банке, а выкатка не требует остановки приёма платежей.
Разговариваю с бизнесом напрямую
Одиннадцать лет до разработки я провёл на средних и старших руководящих позициях
по другую сторону стола. Разбор инцидента у меня начинается с того, что произошло с деньгами, и только потом переходит к тому, какой код к этому привёл.
Между вами и разработкой не нужен переводчик.
Документирую отвергнутые варианты, а не только принятые
Например, в проектах зафиксировано, почему готовая обёртка для криптографической подписи оказалась
негодной и что поставлено вместо неё; почему ответы банковского API намеренно не заворачиваются
в схемы. Это ровно те решения, к которым иначе приходят через повторение чужой ошибки.
Следующий человек не потратит месяц, чтобы выяснить то, что уже выяснено.
До разработки
До 2019 года я одиннадцать лет работал по другую сторону стола: прошёл путь
от проджект-менеджера до
директора по маркетингу международного IT-инфраструктурного холдинга XBT Holding
(хостинг и дата-центры, бренды Servers.com и Webzilla). До этого
Яндекс, МТС, Ростелеком, Ogilvy. Всё это время писал на Python: сначала для своих задач,
потом всерьёз.
Заказчику это даёт вещь, которую редко получают от подрядчика: мне не нужно подробное техническое
задание, чтобы начать. Я разбираюсь в предметной области сам, понимаю, зачем нужна функция
и во что она превращается в деньгах, и задаю вопросы про бизнес раньше, чем про схему базы.
Разбор инцидента у меня объясняет, что случилось с деньгами, а не только какая строчка
кода упала.