1. Введение
Чтобы осуществить цифровую трансформацию соревновательных мероприятий, проводимых офлайн между командами, я самостоятельно разработал и реализовал веб-приложение. В этом приложении участвующие команды покупают ресурсы за виртуальную валюту, создают результаты работы и соревнуются за очки, реагируя на изменения условий в реальном времени. Ранее эти мероприятия проводились с использованием бумажных журналов и ручных вычислений, поэтому ошибки организаторов напрямую отражались на результатах. Участники также не могли в реальном времени проверять состояние своих ресурсов. Испытав эту неэффективность на собственном опыте, я начал проект с вопроса: «Если это система такого масштаба, неужели я не смогу самостоятельно сделать её как следует?»
В то же время я хотел лично проверить, насколько действительно можно повысить продуктивность, используя ИИ не просто как вспомогательный инструмент, а как партнёра по разработке на протяжении всего процесса — от проектирования и реализации до отладки. Ограничение, заключавшееся в необходимости самостоятельно заниматься всем — от планирования до развёртывания, — вместо этого стало ценной возможностью поэкспериментировать с различными подходами к сотрудничеству с Claude и без преувеличений оценить их эффект. В условиях сжатых сроков это отнюдь не была лёгкая задача: требовались панель администратора, управление ресурсами каждой участвующей команды, обработка событий почти в реальном времени и стабильная работа при одновременных подключениях большого числа пользователей.
В этой статье основное внимание уделяется не техническим деталям проекта, а тому, как я использовал Claude в качестве партнёра по разработке на протяжении всего процесса. С практической точки зрения я хотел бы поделиться тем, как сотрудничество с ИИ повлияло на реальную продуктивность в ситуации, когда мне в одиночку приходилось заниматься всем — от планирования и проектирования до реализации, отладки и развёртывания.
2. Обзор проекта
Во frontend используются React и TypeScript, backend состоит из бессерверных функций на основе Next.js API Routes, а база данных представляет собой бессерверный PostgreSQL. Из-за практического ограничения на количество доступных бессерверных функций на платформе развёртывания я на раннем этапе решил группировать API по предметным областям, а не по отдельным функциям. Само это проектное решение было принято в ходе обсуждений с Claude после сравнения нескольких альтернатив и стало важной отправной точкой, определившей общую структуру проекта.
|
Категория |
Подробности |
|---|---|
|
Frontend |
React, TypeScript, Next.js |
|
Backend |
Next.js API Routes (бессерверные функции) |
|
База данных |
PostgreSQL (бессерверный Postgres) |
|
Развёртывание |
Vercel (тариф Hobby) |
|
Планирование |
Inngest (планирование обработки на основе событий) |
|
Инструмент для сотрудничества с ИИ |
Claude (обсуждение проектирования, написание кода и отладка на протяжении всего процесса) |
3. Принципы сотрудничества с Claude
В этом проекте Claude был не просто инструментом автодополнения кода, а партнёром по сотрудничеству во всём — от обсуждения проектирования до отладки и рефакторинга. Принципы сотрудничества, которые я выработал методом проб и ошибок, выглядят следующим образом.
|
Принцип |
Применение |
|---|---|
|
Предоставлять весь файл |
Предоставлять весь изменяемый файл, а не отдельные фрагменты кода → получать результаты, сохраняющие существующие стили и шаблоны |
|
Указывать минимальный объём изменений |
Каждый раз явно писать: «По возможности сохраните существующую структуру» → предотвращать ненужный полномасштабный рефакторинг и снижать затраты на проверку |
|
Сначала причина → затем решение |
Сначала подробно описать симптомы, вместе проследить причину, а затем запросить изменение → устранить первопричину |
|
Фиксировать основания для решений |
Явно систематизировать причины проектных решений в ходе разговора → не объяснять их повторно при последующем изменении связанных функций |
|
Сначала перечислять область изменений, затем применять их последовательно |
При изменении структуры сначала перечислить область воздействия → применять изменения по одному, проверяя каждое и ничего не пропуская |
«Вместо попыток получить идеальный ответ с первой попытки в конечном итоге оказалось быстрее потратить время на повышение точности вопросов».
Оглядываясь назад, я понял, что ключ к эффективному использованию Claude в конечном счёте сводился к тому, «сколько конкретного контекста я предоставил». Расплывчатые запросы давали расплывчатые результаты, тогда как чёткое представление ограничений и существующих шаблонов позволяло получать результаты, которые можно было непосредственно применять в практической работе. Это было больше, чем простой совет: навыки общения, необходимые при внедрении ИИ в процесс разработки, сами стали новым фактором продуктивности.
4. Примеры сотрудничества из реальной практики
4.1 Обсуждение проектирования: совместная систематизация области структурных изменений
В исходной модели данных одна сущность одновременно содержала информацию о принадлежности и принадлежащих активах. Однако по мере уточнения реальных требований стало необходимо разделить понятия «кто участвует в деятельности» и «кто владеет активами». Такой тип структурных изменений цепной реакцией затрагивает всю связанную логику запросов и системы разрешений. Вместо того чтобы сразу просить Claude изменить код, я сначала попросил его «помочь составить список файлов и логики, на которые повлияет это изменение». Последовательно применяя полученный список, по одному пункту за раз, я смог выполнить миграцию без пропусков и конфликтов. Этот опыт показал мне, насколько важно сначала совместно нарисовать «карту», а уже затем поручать ИИ выполнение.
4.2 Адаптация к последним версиям библиотек: сокращение разрыва между документацией и фактическим поведением
Библиотека планирования, добавленная для планирования событий, как раз претерпела обновление до новой мажорной версии, из-за чего возникли ситуации, в которых ранее известный способ использования отличался от фактического поведения. В таких случаях я предоставлял Claude как сообщения об ошибках, так и используемую версию, а затем шаг за шагом разбирал различия между API, описанным в официальной документации, и его фактическим поведением. Такой подход оказался особенно эффективным для тонких, но критически важных деталей, таких как расположение конфигурации триггеров, указание условий отмены и преобразование часовых поясов. При работе с новейшими технологиями важно учитывать, что между моментом, когда знания ИИ были получены, и фактически последней версией может существовать разрыв. Активный обмен журналами ошибок и информацией о версиях существенно повлиял на скорость решения проблем.
4.3 Пошаговая отладка: сначала симптомы, вывод — позже
Когда возникала ошибка, вместо того чтобы сразу просить Claude «исправить её», я сначала максимально конкретно описывал симптомы, вместе с ним сужал круг возможных причин, а затем переходил к изменению. В ошибках, связанных с синхронизацией асинхронной обработки или ограничениями базы данных, при слишком поспешном применении решения первопричина часто сохраняется, а исчезают лишь видимые симптомы. Если сначала просить Claude объяснить причину, проверять соответствие объяснения фактическим журналам и данным и только затем вносить изменения, частота повторного возникновения ошибок значительно снижается.
4.4 Когда проводить рефакторинг: выделять повторяющийся элемент при его появлении в третий раз
По мере роста числа функций на разных экранах начали неоднократно появляться похожие шаблоны интерфейса — фильтры, обработка загрузки и диалоговые окна подтверждения. Каждый раз мы с Claude оценивали, не пришло ли время выделить этот шаблон в повторно используемый компонент. Установленным нами критерием стал «момент, когда один и тот же шаблон появляется на третьем экране». После того как этот критерий был чётко включён в наши обсуждения, изменились и ответы Claude на похожие запросы: он начал сначала упоминать возможность повторного использования. Я смог убедиться, что по мере продолжения сотрудничества с ИИ контекст, накопленный в разговорах, сам по себе отчасти выполняет функцию командного соглашения.
4.5 Сотрудничество с точки зрения code review: спрашивать об обосновании, а не только о результате
Вместо того чтобы применять предложенный Claude код как есть, я выработал привычку спрашивать, почему он выбрал именно такую структуру. Например, когда Claude предложил метод join для определённого запроса, я спросил: «Почему вы выбрали этот подход и какие есть альтернативы?» Ответы иногда выявляли более простой вариант. Это было не так уж сильно отличается от вопросов, задаваемых во время code review с коллегой-человеком. Проверка обоснования вместо безоговорочного принятия результатов, созданных ИИ, в конечном счёте оказалась важной не только для качества кода, но и для сохранения собственного понимания разработчика.
Также эффективным оказалось разбивать большой запрос на проверяемые части, а не формулировать один общий запрос. Например, вместо просьбы к Claude «создать всю функцию обмена» я разделил её на этапы: «зарегистрировать транзакцию → получить список транзакций → выполнить транзакцию». Это позволило проверять фактическое поведение на каждом этапе перед переходом к следующему и тем самым рано обнаруживать ошибки. Я понял, что способность соотносить размер результатов работы с циклом проверки столь же важна при сотрудничестве с ИИ, как и при сотрудничестве с людьми.
5. Количественный обзор проекта
Готовую систему можно обобщить в числах следующим образом. В рамках ограничений платформы развёртывания backend API был объединён в 11 файлов, которые в общей сложности обслуживают 11 предметных областей: аутентификация, организации, команды, участники, ресурсы, результаты работы, транзакции, комбинации, обменные курсы, события и журналы. База данных состоит из 20 таблиц, а frontend разделён на 9 типов экранов администратора и 5 типов экранов участников — всего 14 основных экранов. Несмотря на то что в ходе разработки модель данных была дважды существенно переработана, мне удалось соблюсти график благодаря привычке сотрудничества: сначала перечислять область изменений, а затем последовательно применять их по одному.
-
Файлы API: 11 (интегрированный дизайн по доменам)
-
Основные таблицы данных: примерно 20
-
Конфигурация представлений: 9 представлений администратора, 5 представлений участников
-
Переработка модели данных: 2 раза (① разделение структуры владения «игрок — команда — пакет», ② изменение метода покупки/продажи обменных активов на однонаправленную структуру продаж)
6. Извлечённые уроки: практические выводы из сотрудничества с ИИ
-
Конкретность контекста определяет качество результата: даже при одном и том же вопросе качество результата существенно различалось в зависимости от того, были ли ограничения и контекст существующего кода предоставлены одновременно.
-
«Составление карты» предшествует выполнению: для задач с широким диапазоном воздействия, таких как структурные изменения, полезно было сначала совместно систематизировать область воздействия, а не сразу запрашивать выполнение. Это помогло сократить объём повторной работы.
-
Диалоги превращаются в накопленные активы: когда во время диалогов я явно формулировал замысел и обоснование решений, я мог получать согласованные результаты в последующих связанных задачах, не объясняя всё заново.
-
Чем новее технология, тем больше требуется проверки со стороны человека: чем новее версия библиотеки, тем больше потенциальный разрыв с моментом, когда были собраны обучающие данные ИИ. Поэтому было важно выработать привычку сопоставлять журналы ошибок с официальной документацией.
-
ИИ скорее является партнёром по сотрудничеству, чем инструментом: производительность значительно повысилась, когда я стал относиться к ИИ как к партнёру, участвующему в процессе принятия решений и помогающему формировать общее обоснование, а не просто как к инструменту, который пишет код вместо меня.
7. Заключение
Главный урок, который я вынес из этого проекта, заключается в убеждённости, что «то, как общаться с ИИ», сильнее влияет и на качество результата, и на скорость разработки, чем «что поручать ИИ». Следуя трём принципам — предоставлять конкретный контекст, чётко сообщать ограничения и выполнять пошаговую проверку, — я смог завершить сервис производственного уровня в установленные сроки, работая в одиночку.
Я считаю, что это не опыт, ограниченный конкретным проектом, а методология сотрудничества, применимая ко всей дальнейшей работе. Способность использовать ИИ как практического партнёра по разработке в конечном счёте напрямую связана со способностью ясно мыслить и чётко выражать свои мысли. Основываясь на этом опыте, я намерен постепенно применять такой подход и в работе команды.
PYS