бесплатно без регистрации урок 2 из 16

Первый заход: от задачи до диффа

Провести задачу через все шесть шагов: зафиксировать состояние, поручить, посмотреть журнал, прочитать дифф, запустить у себя и решить — и понимать, зачем нужна отдельная сессия под каждую задачу.

17 мин чтения · 4 главы ·4 задания ·домашняя работа

Запуск и первое знакомство

Разберём первый заход целиком, без пропусков. Он занимает несколько минут, и в нём нет ничего сложного, — но пара привычек, заложенных здесь, определяет, будет ли работа с агентом приятной или мучительной.

Шаг первый: перейти в папку проекта. Агент работает с тем каталогом, из которого запущен. Это не мелочь: запущенный из домашней папки, он увидит вашу домашнюю папку, а не проект, и честно попытается что-нибудь в ней сделать.

cd ~/projects/shop
codex

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

Шаг второй, который пропускают все: посмотреть, где вы находитесь. У агента есть команда состояния. Она показывает рабочий каталог, выбранную модель, режим прав — то есть ровно то, от чего зависит, что сейчас произойдёт.

/status

Шаг третий: убедиться, что есть куда откатываться. Прежде чем поручать первую задачу, зафиксируйте текущее состояние проекта — сделайте коммит, если есть что коммитить. Тогда любой результат агента снимается одной командой, и вам не придётся разбирать, где ваши изменения, а где его.

git status
git add -A && git commit -m "перед работой агента"

Это привычка, которая окупается не сразу, а в тот единственный день, когда агент перепишет то, что вы час писали руками. Стоит она пять секунд.

Шаг четвёртый: поручить задачу. Просто напишите её словами в поле ввода. Никакого особого языка, никаких ключевых слов. Как именно формулировать, чтобы получалось с первого раза, — тема следующего урока; здесь достаточно сказать, что писать надо как коллеге, а не как поисковой строке.

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

Последнее, что полезно сделать в самом начале работы с проектом: попросить агента завести файл правил. У него есть для этого отдельная команда — он осмотрит проект, поймёт, чем он собирается и чем проверяется, и напишет черновик. Черновик придётся дописать руками, но начинать с пустого листа не придётся.

/init

Что видно в журнале работы

Вы написали задачу и нажали ввод. Дальше начинается то, что отличает агента от чата: он не отвечает, а работает, и вы видите его работу шаг за шагом.

поиск по слову «скидка»нашёл 4 местаоткрыл файл заказов180 строкправка функции итога−2 строки, +5 строкзапуск тестов1 из 42 упалправка тестаи повторный запускпятая строка — та, на которую стоит посмотреть внимательно
Журнал показывает не мысли агента, а его действия: что он открыл, что нашёл, что запустил. По нему видно, где он свернул не туда.

Журнал показывает действия, а не мысли. Поиск по слову. Открытый файл. Запущенная команда и её вывод. Правка. Это ровно то, что вам нужно: мысли агента вы всё равно не проверите, а действия — можете.

Смотреть на этот журнал в первые недели полезно, и не из недоверия. Из него видно три вещи, которых больше негде взять.

Первая: нашёл ли он нужное место. Если вы просили поправить расчёт скидки, а агент открывает файл настроек, дальше можно не ждать — проще остановить его и назвать место самому.

Вторая: чем он проверяет себя. Хороший признак — агент запускает тесты или хотя бы саму программу. Плохой — он правит код и сразу пишет «готово», ничего не запустив. Во втором случае «готово» означает «я так думаю».

Третья, самая ценная: что он сделал, когда что-то не сошлось. Посмотрите на схему выше: тест упал — и агент поправил тест. Это законный ход ровно в одном случае: если тест действительно был неправильный. Во всех остальных это подгонка, и она проходит незамеченной у того, кто читает только сводку.

Есть и практическая мелочь: агента можно прервать. Если видно, что он пошёл не туда, не обязательно ждать конца — прерывание останавливает работу, и уже сделанные правки остаются на месте, откуда их видно и откуда их легко снять.

Полезно понимать и обратное: чего в журнале нет. Там нет причин. Строка «открыл файл заказов» не объясняет, почему именно его, — и если выбор был неверный, из журнала это видно только вам, потому что проект знаете вы. Там нет и оценки: агент не пишет «кажется, я делаю ерунду». Журнал — протокол, а не размышление, и читать его надо как протокол: что было сделано, в каком порядке, с каким результатом.

И ещё одна привычка, которая экономит часы: если в журнале агент второй раз подряд запускает одну и ту же команду и получает ту же ошибку, он застрял. Дальше он, скорее всего, будет ходить по этому кругу, пока не упрётся в ограничение. Дешевле прервать его и сказать, в чём дело, — почти всегда причина видна вам и невидима ему.

Сессия: одна задача — один разговор

Разговор с агентом называется сессией. Внутри одной сессии он помнит всё, что было сказано и сделано: ваши поручения, свои правки, вывод команд. Между сессиями — не помнит ничего.

ХорошоПлохозадача 1новая сессиязадача 2новая сессиязадача 1задача 2 — в той жезадача 3 — в той жезадача 4 — в той жекаждая начинается чисточетвёртая тащит мусор трёхпризнак переполнения: агент перестаёт помнить ваши же условия
Каждое сообщение остаётся в окне контекста. Сессия, растянутая на четыре разных задачи, тащит на четвёртую весь мусор первых трёх.

Из этого следует правило, которое звучит скучно и экономит больше всего времени: одна задача — одна сессия. Закончили с расчётом скидки — начните новый разговор для следующей задачи, даже если он про тот же проект.

Причин две, и обе практические.

Первая: окно контекста конечно. Каждое сообщение, каждый прочитанный файл, каждый вывод тестов занимает в нём место. Когда место кончается, самое старое вытесняется — а самое старое это, как правило, ваши условия, заданные в первом сообщении. Признак всегда один и тот же: агент перестаёт соблюдать то, о чём вы просили в начале. Просили не трогать соседние модули — начал трогать. Просили писать тесты — перестал.

Вторая: разговор засоряется. Три отменённых подхода, два неудачных варианта и одно «нет, давай наоборот» лежат в сессии и тянут ответ к себе. Агент честно учитывает их все — включая те, от которых вы отказались десять минут назад.

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

Отдельно про то, чего сессия не помнит даже внутри себя: она не помнит ваших мыслей. Если вы посмотрели дифф, поморщились и решили, что вторая правка лишняя, — агент об этом не знает. Он узнает об этом ровно тогда, когда вы напишете это словами.

Ещё одна вещь, которую стоит знать про сессию: она стоит денег и времени пропорционально своей длине. Каждое новое сообщение отправляется вместе со всем предыдущим разговором — модель каждый раз перечитывает его целиком. Поэтому сессия из сорока сообщений и медленнее, и дороже сессии из пяти, причём разница нелинейная. Это ещё один довод в пользу правила «одна задача — одна сессия», и довод чисто практический: длинный разговор вы почувствуете по времени ожидания раньше, чем по качеству ответов.

И последнее. Многие сессии кончаются не решением, а тем, что человек закрывает окно и идёт делать руками. Это нормальный исход, но у него есть цена: всё, что агент прочитал и понял про задачу, пропадает вместе с сессией. Если вы собираетесь вернуться к этой задаче завтра, потратьте минуту на итог — завтрашний вы скажет спасибо.

Задача целиком: пример

Соберём всё вместе на одной настоящей задаче. Пусть в корзине интернет-магазина неверно считается итог: не учитывается количество товара.

1. Зафиксировать2. Поручить3. Ждать4. Прочитать дифф5. Запустить6. Решитьрешение — только три: принять, уточнить, откатитьшаг 1 стоит секунду, а стоимость его пропуска — весь вечершаги 4 и 5 не заменяют друг друга
Шесть шагов, из которых вам принадлежат первый, второй и шестой. Пропуск первого — самая дорогая экономия в этом списке.

Шаг 1. Зафиксировать. Одна команда, пять секунд, и у вас есть точка возврата.

git add -A && git commit -m "перед правкой итога"

Шаг 2. Поручить. Обратите внимание на три вещи в формулировке: названо место, названа ошибка, названо чем проверять.

В файле корзины, в функции итога, сумма считается без количества товара. Поправь и добавь тест на позицию с количеством больше одного. Соседние модули не трогай.

Нашёл функцию итога. Умножение на количество добавлено, добавлено округление до копеек. Добавлен тест на позицию с количеством 3. Все тесты проходят.

Шаг 3. Ждать — и поглядывать в журнал. Если агент открывает не тот файл, прерывайте, не дожидаясь конца.

Шаг 4. Прочитать дифф. Не сводку — дифф.

src/cart.js
 function total(items) {
- return items.reduce((s, i) => s + i.price, 0);
+ const sum = items.reduce((s, i) => s + i.price * i.qty, 0);
+ return Math.round(sum * 100) / 100;
 }
test/cart.test.js
+test('количество больше одного', () => {
+ expect(total([{ price: 10, qty: 3 }])).toBe(30);
+});

Два файла, девять строк. Всё названное в задаче — на месте; ничего сверх названного нет.

Здесь стоит задержаться на округлении. В задаче про него не было ни слова — агент добавил его сам. Это как раз то самое решение за вас: округление до копеек в денежном расчёте почти наверняка правильно, но вы его не заказывали, и в другом проекте оно могло бы противоречить принятому там правилу.

Обратите внимание и на то, чего в диффе нет. Нет правок в соседних модулях — потому что в поручении было сказано их не трогать. Нет обновлённых версий библиотек. Нет переименованных переменных «для ясности». Отсутствие лишнего — такой же результат работы, как присутствие нужного, и заметить его можно только если смотреть на дифф целиком, а не искать в нём знакомую строку.

Шаг 5. Запустить. Не «тесты зелёные у агента», а зелёные у вас. Это не недоверие: агент мог запустить их в другом окружении, с другими настройками, а то и поправить сам тест.

npm test

Шаг 6. Решить. Три варианта, и все три законны. Принять — фиксируем коммитом. Уточнить — «округление лишнее, убери». Откатить — одной командой, если результат не тот.

git restore .

И ещё одно наблюдение по этому примеру, которое пригодится дальше. Агент сделал ровно то, что было названо в трёх частях поручения, — место, ошибка, чем проверять, — и добавил одно решение сверх. Это типичная пропорция: в хорошо поставленной задаче лишнего бывает одна вещь, в плохо поставленной — половина диффа. Иначе говоря, качество поручения видно не по тому, сделал ли агент нужное, а по тому, сколько сверх нужного он сделал.

Весь заход занял минуты три. Из них ваше внимание требовалось на шагах 1, 2, 4 и 6 — и суммарно это меньше минуты. Именно в этой пропорции и заключается выгода: не в том, что работа исчезла, а в том, что она сжалась до постановки и приёмки.

Задания урока

Каждое проверяется сразу: ответ сверяется с эталоном, и на неверный вариант приходит разбор.

  1. Расставьте по порядку первый заход.легко
  2. На что смотреть в журнале работы агента?средне
  3. Четыре задачи лучше отдавать четырьмя отдельными сессиями, а не одной длинной.средне
  4. Разложите шаги задачи по тому, кто их делает.средне
Пройти урок с проверкой заданий Курс «Codex» открыт и бесплатен, прогресс сохраняется.
Открыть курс