Две работы, похожие снаружи
Есть две работы, которые снаружи выглядят одинаково: в обеих человек пишет код. Разница начинается после того, как код написан, — и именно она определяет, чем эти работы отличаются на деле.
Первая работа — для себя. Скрипт, который разбирает выгрузку. Заготовка, чтобы проверить идею. Утилита, которой пользуетесь только вы. Здесь ошибка стоит вашего времени, откат — это стереть файл и написать заново, данные свои, и достаточно, чтобы работало сегодня.
Вторая — для людей. То, чем будут пользоваться другие: сервис, страница, отчёт, который уходит в бухгалтерию, внутренний инструмент отдела. Здесь ошибка стоит чужого времени, откат — это отдельная работа, данные чужие, и работать оно должно не сегодня, а год, меняясь по дороге.
Агент ускоряет набор текста одинаково в обоих случаях. Это и есть причина, по которой первая работа с ним преображается, а вторая — не очень. В первой набор текста и был главным делом. Во второй он никогда им не был.
Курс — про вторую работу. Не потому, что первая неважна, а потому, что с ней всё и так неплохо: поручили, посмотрели, запустили, готово. Вторая требует ремесла, и ремесло это не про инструмент, а про то, что вокруг написанного кода.
Стоит сразу снять одно возражение, которое возникает почти у всех: «это же обычная разработка, при чём тут агент». Верно — почти всё в этом курсе было верно и десять лет назад. Изменилось одно: раньше эта работа была распределена по времени, а теперь сжалась.
Когда правка писалась полдня, у вас было полдня, чтобы подумать о её последствиях: что она сломает, как её откатывать, кого она затронет. Теперь она пишется за десять минут, и этих полдня нет. Думать приходится намеренно и отдельно — то, что раньше происходило само, по ходу набора текста.
Отсюда и устройство курса: шестнадцать видов работы, и у каждого свой порядок. Порядок — это не бюрократия, это то, что заменило собой ушедшие полдня.
Есть и третья причина, по которой курс нужен именно сейчас. Порог входа упал: код теперь пишут люди, которые раньше его не писали — аналитики, инженеры-технологи, маркетологи, бухгалтеры. Скрипт, который раньше заказывали разработчику и ждали неделю, сегодня собирается за вечер, и это хорошо. Но вместе с кодом к человеку приходит всё остальное: данные, которые можно испортить, пользователи, которые на него рассчитывают, и правки, которые придётся вносить через полгода.
Ремесло, которое раньше передавалось внутри профессии — от старшего к младшему, на ревью и на разборах поломок, — до этих людей просто не доходит. Не потому, что оно секретное, а потому, что его негде взять: в учебниках по языку его нет, а команды, которая бы его показала, рядом нет тоже.
Что добавляется, когда код уходит к людям
Разберём подробнее, что именно добавляется, когда код уходит к людям. Четыре вещи, и ни одна не про написание кода.
Необратимость. Часть действий нельзя отменить. Отправленное письмо, списанные деньги, удалённая запись, изменённая схема базы, выложенная наружу страница, которую успели увидеть. Для обратимого достаточно проверить после; для необратимого — до.
Чужие данные. В базе лежат записи людей, которые доверили их вам. Ошибка в расчёте — это не «неверное число на экране», а неверная запись, по которой кто-то примет решение. И исправить её задним числом часто нельзя: неверный документ уже ушёл.
Совместимость. У работающей системы есть те, кто ей уже пользуется: люди, другие программы, чужие интеграции. Поменять формат ответа — значит сломать того, кто на него рассчитывал, и вы об этом узнаете не сразу.
Срок жизни. Код, который живёт год, читают чаще, чем пишут. Его правят люди, которые не помнят, почему он такой. Поэтому понятность из вкусовщины превращается в свойство, у которого есть цена.
Отсюда главное правило курса, и оно простое до неловкости: агент знает то, что вы ему сказали, плюс то, что есть в проекте. Всё остальное — контекст, который существует только в голове человека: кто этим пользуется, что было раньше, чего боятся, что сломается, если тронуть вот это.
Раньше этот контекст применялся сам собой. Человек, писавший код полдня, по дороге вспоминал: «а, тут же есть старые записи», «а этот формат читает бухгалтерия». Агент не вспомнит: он не знает.
Отсюда практическое следствие, из которого растёт половина приёмов курса: то, что вы держали в голове, теперь приходится говорить вслух — в поручении, в файле соглашений, в тесте, в комментарии рядом с неочевидным местом. Не потому, что агент глупее вас, а потому, что он не был на тех совещаниях.
Хорошая новость: сказанное вслух пригождается и людям. Соглашение, записанное ради агента, работает и для нового человека в команде, и для вас через полгода. Это тот редкий случай, когда работа на инструмент оказывается работой на себя.
Есть и обратная сторона, о которой стоит знать заранее. Агент почти никогда не отвечает «я не знаю»: он сделает предположение и пойдёт дальше, и предположение будет разумным. Разумное предположение о том, чего он знать не мог, — это ровно тот вид ошибки, который труднее всего заметить: результат выглядит осмысленным, код читается, тесты проходят.
Отсюда привычка, которая пригодится во всех шестнадцати уроках: спрашивать не «правильно ли это», а «на каких предположениях это построено». Первый вопрос даёт ответ «да» почти всегда. Второй вытаскивает наружу то, о чём вы не подумали сказать, — и половина настоящих ошибок обнаруживается именно там, а не в коде.
Что агент не ускоряет
Теперь посчитаем, где в работе время. Это важно, потому что ожидания от агента обычно строятся на неверной раскладке.
Возьмём обычную задачу: добавить в отчёт колонку с процентом выполнения плана. Раскладка примерно такая.
| Часть работы | Было | Стало с агентом |
|---|---|---|
| понять, что нужно | 20 мин | 20 мин |
| разобраться, где править | 20 мин | 5 мин |
| написать код | 40 мин | 5 мин |
| проверить результат | 20 мин | 20 мин |
| принять и выложить | 10 мин | 10 мин |
Было два часа, стало час. Это отличный результат — и он вдвое, а не в десять раз, хотя написание кода ускорилось в восемь. Причина в первой и четвёртой строке: они не ускоряются почти никак.
Понять, что нужно. Что означает «процент выполнения плана», если план менялся в середине месяца? Считать от начального или от текущего? Что показывать, если плана нет? Ответы на это живут у людей, и агент их не добудет.
Проверить результат. Прочитать изменения, запустить, посмотреть на числа, проверить края — месяц без плана, план равен нулю, отчёт за незакрытый период. Это ваше время, и оно почти не зависит от того, кто написал код.
Практическое следствие, которое стоит принять заранее: доля проверки в вашей работе выросла. Раньше она была шестой частью задачи, теперь — третью. Это не потому, что проверять стало нужнее, а потому, что остальное сжалось.
И отсюда же — почему курс устроен по видам работы. У каждого вида своя тяжёлая часть. В починке это воспроизведение, в рефакторинге — доказательство, что поведение не изменилось, в миграции — обратимость, в выкладке — порядок отката. Написание кода во всех четырёх занимает меньше всего, и это единственное, что агент делает за вас.
Есть и третья часть, которой нет в таблице, потому что она не измеряется минутами: ответственность за то, что ушло к людям. Она не делится ни с кем. Правка, сделанная агентом и принятая вами, — ваша, ровно как если бы вы набрали её сами. Это не морализаторство, а практическое обстоятельство: из него следует, что принимать непонятое нельзя, и об этом будет отдельный разговор в уроке про ревью.
И ещё одно наблюдение, которое видно только на длинной дистанции. Ускорение написания кода меняет не только раскладку одной задачи — оно меняет сколько задач вы успеваете взять. Там, где раньше за неделю проходило пять правок, теперь проходит пятнадцать, и каждая из них тянет за собой свою проверку, своё ревью, свою выкладку.
В итоге узким местом становится не написание, а всё, что после. Команды, которые этого не заметили, обычно описывают происходящее словами «стали работать быстрее, а релизы стали болезненнее» — и это не совпадение, а прямое следствие: поток правок вырос, а порядок их прохождения остался прежним.
Шестнадцать видов работы
Осталось разложить курс. Шестнадцать уроков — это шестнадцать видов работы, и порядок у них тот же, что в жизни проекта.
| Урок | Вид работы | Что в нём тяжелее всего |
|---|---|---|
| 2 | войти в незнакомый проект | понять устройство, а не прочитать файлы |
| 3 | сделать новую возможность | признак готовности и края |
| 4 | починить поломку | воспроизвести и найти причину |
| 5 | покрыть тестами | решить, что проверять |
| 6 | переделать, не меняя поведения | доказать, что не изменилось |
| 7 | править чужой код | соблюдать чужие решения |
| 8 | пройти ревью и делать его | читать правку, которую написал не человек |
| 9 | автоматизировать рутину | выбрать, что вообще стоит |
| Урок | Вид работы | Что в нём тяжелее всего |
|---|---|---|
| 10 | изменить данные и схему | необратимость |
| 11 | не сломать тех, кто уже пользуется | узнать, кто это |
| 12 | работать с доступами и секретами | чего не давать вовсе |
| 13 | выложить | порядок, а не смелость |
| 14 | жить после выкладки | заметить, что сломалось |
| 15 | работать в команде | договорённости, которых нет в коде |
| 16 | провести маленький продукт целиком | не потерять ничего из пятнадцати |
Что не входит в курс, стоит сказать прямо, чтобы не искать.
Устройство агента. Как он работает внутри, что такое окно и шаги — это курс «Codex». Здесь предполагается, что вы уже поручали ему задачи.
Построение своей обвязки. Слои, потолки, наблюдаемость, оценка — это «ИИ-Инжиниринг». Там про систему вокруг агента, здесь про работу руками.
Конкретный инструмент. Codex в названии стоит потому, что курс вырос из практики с ним, но почти всё в нём верно для любого кодового агента. Где важна особенность конкретного — это сказано отдельно.
И последнее про сам подход. В каждом уроке есть порядок действий — три-пять шагов, которые стоит проходить в определённой последовательности. Порядок нужен не ради дисциплины, а по причине из третьей главы: он заменил собой те полдня, в течение которых раньше можно было подумать. Пропустить шаг можно, и иногда ничего не случится; беда в том, что случается это не сразу, и связь с пропущенным шагом теряется.