
Полная версия
Цена мысли. Об экономике агентного ИИ
Способность эта не мелкая. Она держит всё остальное: та, что не знает, как пишется правильное, не выполнит и поручения, сколько нити ей ни дай. Разница в том, что она — пол, а не потолок. Ниже неё работать нельзя, а выше неё ничего не измеряется: когда пол достигнут, все, кто на нём стоит, выглядят одинаково ровно. И вот это ощущение ровности — что все, кого я пробовал, пишут примерно одинаково прилично — и есть главное, что я вынес из лет разговора.
По первой способности машины действительно близки. Сильная напишет разбор строки чуть аккуратнее, слабая — чуть многословнее; одна вспомнит про крайний случай, другая забудет, и в следующий раз они поменяются местами. Разница есть, но она в пределах вкуса — такая же, какая бывает между двумя приличными инженерами, и не такая, за которую платят вдесятеро. Тот, кто говорит, что переплачивать не за что, смотрит именно сюда — и видит верно. Я и сам, глядя сюда, годами видел то же самое.
Вторая способность в разговоре не показывается, и назвать её труднее, потому что она не одна, а связка. Помнить, что делал час назад и зачем. Не потерять цель, когда обнаружилось непредвиденное. Вернуться к оставленному, отвлёкшись на срочное. Отличить работу, которая осталась, от работы, которая отменилась. Держать в уме, что задача считается закрытой не тогда, когда стало тихо, а когда выполнено условие, названное в начале, — и помнить само это условие в конце, не в пересказе, а дословно.
Каждое из этих умений по отдельности звучит скромно, почти канцелярски. Вес они набирают от длины работы. Вернуться к оставленному — дело одной минуты, если оставил минуту назад; через три часа и полсотни движений возвращаться некуда, потому что не помнишь, что оставлял. Отвлечение в поручении выглядит невинно: по дороге упал посторонний тест, машина занялась им, разобралась, исправила и пошла дальше — дальше от того места, где была до отвлечения, а не к нему. Ничего не сломалось, никто не ошибся, а работа с этой минуты идёт мимо цели.
Отдельно стоит дословность условия, потому что она подтачивается тише всего. Вечером я назвал условие: дефекта нет, тесты зелёные, остальное цело. К середине ночи «остальное цело» превращается в «остальные тесты проходят» — формулировка близкая, обозримая и поддающаяся проверке. Ещё через час «тесты проходят» превращается в «тесты приведены в соответствие», и это тоже звучит разумно, ведь поведение изменилось, значит, проверки должны измениться следом. Ни один переход не выглядит подлогом. Условие не нарушено — оно переведено на язык, в котором его удобнее выполнять, и в конце пути от него осталось то, что удалось сделать.
Труднее всего — не терять цель. Непредвиденное редко приходит как препятствие, которое видно и можно обойти. Гораздо чаще оно приходит как новая задача, более понятная, чем прежняя, и вдобавок решаемая прямо сейчас. Старая цель была расплывчата и требовала усилия; эта — отчётлива и поддаётся. Подмена происходит без единого сознательного решения, и по дороге каждый шаг остаётся разумным. Через час работа идёт полным ходом, все движения осмысленны, а делается не то.
Это знает всякий, кто чинил что-нибудь у себя дома. Я взялся менять смеситель, снял старый и, заглянув под мойку, обнаружил, что труба там подтекает давно, и след на дне шкафа старше моего интереса к смесителю. Дальше передо мной три дороги, и все выглядят прилично. Можно бросить смеситель и заняться трубой, потому что труба важнее. Можно доделать смеситель и забыть про трубу, потому что за смеситель я взялся. Можно выгрести шкаф целиком и до вечера заниматься кухней. Хорошо не кончается ни одна из трёх; хорошо кончается четвёртая, которую надо ещё разглядеть, — доделать начатое, не потеряв найденного, и вернуться к трубе со знанием, что она есть.
Отличается тот, у кого выходит хорошо, не умением обращаться с ключом. Ключ держать умеют все. Отличие в том, что он не позволяет находке отменить намерение: он записывает трубу, откладывает её и доводит смеситель до состояния, в котором водой можно пользоваться. И ещё — он честно скажет вечером, что труба осталась, вместо того чтобы промолчать о ней, потому что смеситель-то работает.
Удерживать приходится не одно, а два, и держатся они по-разному. Начатое держится намерением: я помню, зачем полез под мойку. Найденное держится вниманием: его никто не поручал, оно обнаружилось само и исчезнет из головы, как только руки займутся делом. Поэтому находку нужно куда-то деть — сказать вслух, написать на бумажке, оставить ведро под трубой, — а иначе к вечеру её не станет. И это не свойство памяти, а свойство работы: у всякого дела есть склонность вытеснять то, что в него не входит.
С поручением происходит то же самое, слово в слово. Машина, взявшаяся за дефект в разборе дат, натыкается по дороге на соседнее место, где написано небрежно. Дальше — те же три дороги. Уйти в соседнее место и починить его хорошо, а исходный дефект оставить наполовину. Довести исходный дефект и не сказать ни слова о найденном. Начать переписывать модуль целиком, потому что теперь видно, как надо было с самого начала. Ни одно из этих движений не выглядит глупостью; каждое можно объяснить, и каждое будет объяснено убедительно в записке, которую я прочту утром.
Соблазнительно объяснить такое усталостью или небрежностью — теми словами, которыми мы объясняем это у людей. Объяснение не работает: машина не устаёт, не отвлекается на посторонние мысли и не ленится доделывать. Она теряет нить в полной бодрости и на любом часу одинаково. Значит, удержание нити — не про усердие и не про добросовестность, а про устройство: про то, остаётся ли у работы в каждую минуту представление о целом, отдельное от представления о текущем шаге. У кого-то такое представление есть и переживает непредвиденное; у кого-то оно каждый раз пересобирается заново из того, что видно вокруг, и тогда цель незаметно становится равна ближайшему препятствию. Со стороны обе выглядят одинаково занятыми.
Первая способность здесь не помогает ничем. Она относится к куску работы: к функции, к строке, к отдельной проверке. Удержание нити относится к работе целиком — к тому, что связывает первый шаг с последним через всё непредвиденное, что случилось между ними. Кусок можно предъявить и рассмотреть; связь предъявить нельзя, её можно только пройти. Поэтому, сколько ни смотри на аккуратность отдельного куска, о второй способности не узнаешь ничего. А именно она решает исход поручения.
И расходятся машины по ней резко. Не так, как расходились на вопросах, где одна чуть аккуратнее другой: здесь разница не в оттенке, а в том, чем кончился день. Одна возвращается с работой, доведённой до условия, которое я назвал вечером, и с перечнем того, чего она трогать не стала. Другая возвращается с работой, доведённой до состояния, в котором стало тихо, и записка её так же спокойна. Обе написали приличный код. Различает их не код.
Неприятность в том, что заранее это не видно. Первая способность показывает себя за минуту и в любой момент: дал задачу — получил предмет — посмотрел. Вторая показывает себя только исходом длинной работы, то есть тогда, когда выбор уже сделан и ночь уже прошла. Выбирая машину, я выбираю по тому, что успел разглядеть, — а разглядеть успеваю только то, что относится к куску. Получается странная сделка: решение о длинной работе принимается на основании короткой, и ничего другого под рукой нет. Отсюда и ощущение, что переплачивать не за что: не за что платить в том, что я видел.
Тогда меняется и то, что я должен проверять. Смотреть на кусок и любоваться его правильностью — занятие привычное, и оно ничего не говорит о нити. Проверять нужно, доведено ли дело до условия, названного в начале, — а это совсем другой вопрос, чем «выглядит ли это верно».
1.4. «Выглядит верно» и «принято без правок»
У успеха есть два определения, и они не совпадают. Первое звучит так: результат выглядит верно. Второе: результат принят без правок. Слова похожие, обиходные, и разницу между ними легко принять за оттенок строгости — будто второе есть то же первое, но придирчивее. Разница не в строгости. Эти определения относятся к разным вещам: одно говорит о тексте, другое о последствиях текста. И применяются они, как выяснилось, к разным жанрам работы.
«Выглядит верно» — критерий вопроса, и в вопросе он не поверхностен, а точен. Я прочёл ответ, увидел, что условие обработано, имена внятны, крайний случай учтён, и кивнул. Кивок мой — не небрежность, а завершение процедуры: я автор, я принимаю, и с этой секунды за написанное отвечаю я. Дальше я сам встрою это туда, где ему место, сам увижу, если не подойдёт, сам поправлю. Критерий работает потому, что между ответом и последствиями стоит человек, который читал, — и последствия наступают через его голову, а не мимо неё.
Критерий этот вообще не про машины. Он унаследован от всей нашей работы с текстами и старше любых машин: мы судим написанное, читая написанное. На этом стоит и разбор чужого кода, и обсуждение проекта, и правка статьи; я смотрю на вещь, вижу её устройство и составляю мнение. Привычка настолько глубокая, что не ощущается как привычка, — она ощущается как здравый смысл. И до тех пор, пока вещь, которую я смотрю, есть вся вещь целиком, здравым смыслом она и остаётся.
«Принято без правок» — критерий поручения, и устроен он иначе в трёх отношениях сразу. Он говорит не о виде результата, а о том, что результат сделал с системой: изменение вошло, прижилось и никого не заставило к себе возвращаться. Судит по нему не я, а те, кто столкнётся с этим местом потом. И судят не сейчас, а через неделю, через месяц, когда кто-то откроет файл по другому делу и либо пройдёт мимо, либо остановится и начнёт разбираться. До этой минуты никакого суждения нет — есть только ожидание суждения, которое я по привычке принимаю за успех.
Формулировку надо сузить, иначе она вберёт в себя лишнее. «Принято без правок» — не «файл никто не открывал» и не «жалоб не поступало»; молчание бывает разное, и чаще всего оно означает, что до места ещё не дошли. Речь о другом: кто-то работал рядом, задел это изменение по своему делу и не был вынужден из-за него ни возвращаться, ни переспрашивать, ни чинить. Строго говоря, критерий этот проверяется не наличием чего-либо, а отсутствием — отсутствием второй работы, порождённой первой. Мерить отсутствие трудно, и оттого его редко мерят; но платят за него всегда.
Отсроченность здесь не досадная подробность, а само существо дела. Ни один известный мне признак, различимый утром, не говорит, чем кончится встреча результата с системой. Аккуратность изменений не говорит; убедительность объяснения не говорит; зелёные проверки не говорят, потому что проверки — часть той же работы и могли быть приведены к ней. Всё, что можно осмотреть утром, относится к первому критерию. Второй в этот момент недоступен в принципе, и не потому, что я плохо смотрю, а потому, что события, о котором он судит, ещё не произошло.
Отсюда и обман. Красивый ответ на вопрос красив честно: он и есть то, что я покупал. Красивый ответ на поручение красив за чужой счёт. В ту ночь всё было хорошо написано: изменения лежали ровно, объяснение в конце читалось приятно. Первый критерий был удовлетворён полностью — и удовлетворён тем сильнее, чем меньше работы стояло за словами, потому что несделанное не спорит, не путается и не оставляет шероховатостей. Гладкость отчёта и полнота работы связаны слабее, чем хочется думать.
Хуже того, первый критерий поощряет молчание. Работа, сделанная добросовестно, приходит с оговорками: вот здесь я не был уверен; вот это не стал трогать, потому что не понял, зачем оно; вот тут поведение изменилось, и стоит посмотреть. Отчёт с оговорками читается хуже гладкого — он тревожит, требует решений, отнимает те самые минуты, ради экономии которых поручение и давалось. Отчёт без оговорок читается прекрасно и закрывает вопрос. Если я принимаю работу по тому, как она выглядит, то из двух машин мне больше понравится та, которая меньше сомневается вслух, — то есть ровно та, которая хуже замечает собственные промахи. Критерий не нейтрален: он выбирает за меня, и выбирает не в мою пользу.
Скажу точнее, почему половина несделанной работы не выглядит как половина. Сделанное оставляет следы: правки, объяснения, места, где пришлось повозиться. Несделанное не оставляет ничего — у него нет вида, нет объёма, нет строки, на которую можно показать. Оно отсутствует тем же способом, каким отсутствует то, чего и не требовалось. Поэтому работа, выполненная наполовину, предъявляется мне как целая, и предъявляется не из хитрости: изнутри она и есть целая, потому что вторая половина не входила в представление о задаче ни у кого, кто в этой работе участвовал.
Здесь мне возразят разумно: если первый критерий обманывает, применяйте второй. Смотрите не на вид, а на последствия; проверяйте по существу. Возражение верное, и беда его в цене. Проверить поручение по второму критерию значит пройти работу следом — прочесть изменения, понять, отчего каждое сделано, восстановить ход рассуждения и убедиться, что условие выполнено дословно. Это стоит примерно того же, что стоила бы работа своими руками, а часто и дороже, потому что чужой ход мысли восстанавливать труднее, чем вести свой. Я поручал, чтобы этого не делать. Вот почему в жизни второй критерий подменяется первым почти всегда, и подменяется людьми внимательными и добросовестными: не по глупости, а потому, что честная проверка отменяет смысл поручения.
С людьми эту трудность мы обходим не проверкой, а вопросом. Когда работу приносит человек, я редко иду следом по его шагам; я спрашиваю: ты дошёл до конца, ничего не осталось? И полученное «дошёл» кое-чего стоит — за ним годы, репутация, нежелание отвечать потом за собственное слово, а иногда и заметная неохота, с которой оно произносится. Я покупаю не проверку, а поручительство, и это дёшево и обычно работает. Машине я задаю тот же вопрос и получаю то же слово, произнесённое с той же уверенностью, — только за ним не стоит ничего из перечисленного. «Готово» здесь не обещание и не подпись; это отчёт о внутреннем состоянии работы, и точность его равна тому, насколько хорошо работа видит саму себя.
Подмена эта и есть тихое место, в котором решается всё. Я плачу за машину, глядя на её ответы; я принимаю её работу, глядя на её отчёт; и в обоих случаях смотрю на текст, а покупал я не текст. Я покупал состояние системы, в котором ничего не придётся переделывать, и узнаю я о нём не утром, а тогда, когда узнавать поздно и дёшево уже не выйдет.
У этой подмены есть следствие, о котором я долго не думал. Если работу принимают по первому критерию, то разница между машинами по второму не фиксируется никогда. Та, что удержала условие дословно, и та, что перевела его во что-то удобное, утром неотличимы: обе предъявили гладкий отчёт и зелёные проверки. Разойдутся они через месяц — но к тому времени связь между тем вечерним выбором и сегодняшней вознёй уже не восстановить, и никто её не восстанавливает: возня объясняется наследием, спешкой, тем, что модуль был сложный. Опыт, который должен был бы накопиться, не накапливается. Я продолжаю выбирать по ответам не оттого, что упрям, а оттого, что других сведений ко мне не поступает.
Один и тот же результат может быть успехом по первому определению и неудачей по второму, и между этими двумя оценками пройдёт месяц. Всё, что я успею сделать за этот месяц, будет опираться на первую из них.
Утром я кивнул. Записка была короткая и убедительная, изменения — аккуратные, тесты — зелёные, и я закрыл ветку, не читая. Это было разумное решение: я ведь для того и поручал, чтобы не читать. Через две недели выяснилось, что в разборе дат остался случай, до которого никто не добрался, и обошёлся он куда дороже той ночи. Долго после этого я пытался понять, в какой момент следовало поступить иначе, и не находил такого момента.
Момента и не было, потому что ошибка была не в решении, а в мере. Результат поручения — не ответ, на который кивают. Это изменение, вошедшее в систему и никого не заставившее его переделывать. Всё, что мы привыкли ценить в ответах — точность формулировки, складность, полнота изложения, — к поручению относится мало; оно судится не тем, как выглядит, а тем, что после него не пришлось делать заново.
И раз между шагами никого нет, то заметить неверный шаг, пока он ещё стоит копейку, может только тот, кто его сделал. Не я — я сплю. Не коллега — его не позвали. Не проверка — она сама часть работы. Способность остановиться и усомниться в собственном результате оказывается не приятной добавкой к умению писать код, а единственной инстанцией внутри работы, где ошибка ещё может быть остановлена.
Тогда меня занимало другое. Шаги в поручении стоят один на другом: каждый принимает предыдущий за основание и не имеет способа его перепроверить. А если одна машина держится на шаг чуть надёжнее другой — не вдвое, не на порядок, а чуть, — то на работе из многих шагов это «чуть» должно как-то себя вести. Я тогда полагал, что оно ведёт себя так же скромно, как звучит.
Глава 2. Цепь
Разница, о которой мне обычно сообщают, звучит скромно. Одна модель немного точнее, другая немного уступает; отставание выражают в процентах, и проценты выглядят небольшими. Я слышу в этом обещание пропорции: если каждый шаг выйдет чуть хуже, то и работа выйдет чуть хуже, и с этим можно жить. Обещание кажется настолько естественным, что его не проверяют.
Проверять стоит, потому что шаги в поручении зависимы, а зависимое собирается иначе, чем независимое. Мы привыкли судить о качестве по среднему: средний шаг хорош — значит, и работа хороша. Там, где каждый следующий шаг стоит на предыдущем, среднее не решает ничего; решает, выдержали ли все. Разница между «хорошо в среднем» и «выдержали все» — это разница между сложением и умножением, и она растёт с длиной.
Отсюда тянутся ещё три вещи, которые я долго не сводил в одно. Слабое звено не только рвётся чаще — оно заставляет возвращаться, а возвращение добавляет звеньев, и цепь оказывается длиннее той, которую я задумал. Разрыв между сильным и слабым поэтому не линеен: есть длина, за которой отставание перестаёт быть отставанием и становится неспособностью. И само умение держать нить через всю цепь — свойство отдельное, не вытекающее из величины: его либо вырастили, либо нет.
Цепь — вещь старая, и главное её свойство известно всякому, кто что-нибудь ею поднимал. Прочность цепи не складывается из прочности звеньев. Она ими перемножается.
2.1. Сумма и произведение
Интуиция, с которой я подхожу к качеству, устроена как усреднение. Я спрашиваю, сколько раз машина ответила хорошо, и делю на то, сколько раз я спрашивал. Получается доля, доля выглядит как оценка, и оценка ведёт себя разумно: если одна модель отвечает хорошо чуть реже другой, я потеряю чуть больше. Такая арифметика не выдумана из ничего. Она выросла из многолетнего опыта вопроса и внутри вопроса совершенно верна.
Стоит отдать ей должное, прежде чем показывать, где она кончается. Есть целые области, где качество действительно суммируется. Поток обращений, который надо рассортировать по темам; короткие ответы, каждый из которых живёт отдельно; разметка, где один пример не влияет на соседний. Там ошибка остаётся на своём месте, как опечатка на странице: она портит страницу и не портит книгу. Доля верных ответов — честная мера, средний уровень — честное суждение, и человек, который выбирает по такой мере модель подешевле, ведёт себя рационально. Я бы и сам так выбирал, и в этих задачах, подозреваю, до сих пор выбираю.
Так же мы оцениваем и людей. Хороший, но не блестящий сотрудник делает работу немного хуже блестящего: чуть менее аккуратно, чуть менее изобретательно, но делает. Мы даже умеем переводить эту разницу в деньги и говорить, что она их стоит или не стоит. За этим стоит молчаливое допущение, которое почти никогда не проговаривается: что работа делится на куски, что куски независимы и что плохо сделанный кусок можно найти и переделать, не трогая остальные.
Привычку поддерживает и то, как качество мне сообщают. Оно приходит ко мне долей: столько-то решённых задач из стольких-то предложенных, одно число на модель, удобное для сравнения. Доля хороша тем, что её можно поставить рядом с ценой и получить отношение, которое выглядит как ответ. Но доля устроена так, что задачи в ней равноправны и независимы: каждая идёт в счёт отдельно, промах по одной не касается остальных. Мера сама несёт в себе допущение о независимости, и я перенимаю это допущение вместе с ней, не замечая, что перенимаю. Число получено на наборе, а применяю я его к цепи.
Поручение устроено иначе. Это не набор отдельных ответов, а один результат, собранный из множества зависимых движений. Он существует, если выдержали все; если не выдержало одно — его нет. И вопрос, который здесь уместен, звучит не «как часто машина права», а «какова вероятность, что она права подряд». Второй вопрос получается из первого умножением, и умножение — единственная операция, которая тут работает. Ничего не складывается. Каждый новый шаг — ещё один множитель, и каждый множитель тянет произведение вниз, даже когда сам по себе выглядит прекрасно.
Умножение не утверждает, что машина плоха; оно утверждает, что длина имеет вес. Надёжность, которой более чем достаточно для одного движения, может оказаться недостаточной для длинной работы — не потому, что надёжность упала, а потому, что движений стало много. Величина, которая описывает шаг, и величина, которая описывает работу, — разные величины, и вторая не равна первой, даже примерно.
Держится привычка суммировать ещё и оттого, что работу машины я вижу шагами. Я смотрю, как она идёт, и каждое её движение по отдельности выглядит толково: разумно объяснила, куда смотрит; аккуратно нашла нужное место; внятно сказала, что собирается сделать. Впечатление растёт, пока я смотрю, и растёт оно именно сложением — хороший шаг, ещё хороший шаг, ещё. К середине работы у меня складывается уверенность, которая ощущается как знание о результате, хотя она не о результате вовсе; она о среднем качестве того, что я успел увидеть. Результат тем временем собирается умножением, за которым никакого впечатления не следует: умножению нечего показывать по дороге.
Цепь вспоминают обычно ради слабейшего звена: цепь не прочнее его, и это правда. Но меня давно занимает другой случай — тот, где слабейшего звена нет. Возьмите цепь, в которой все звенья откованы одинаково и ни одно не выделяется изъяном; каждое проверено и признано надёжным. Такая цепь всё равно менее надёжна, чем любое её звено, и тем менее, чем она длиннее. Ей не нужен брак, чтобы порваться; ей достаточно длины. Мастер, который клянётся за каждое звено в отдельности, ещё ничего не сказал о цепи, и говорит он это совершенно искренне.
Люди, которые имеют дело с цепями всерьёз, это знают и потому испытывают цепь целиком. Её нагружают в сборе, под нужным весом, и смотрят, что будет; никому не приходит в голову испытать звенья по одному, сложить результаты и выдать заключение о готовом изделии. Заключение о звене — не заключение о цепи, и разница между ними тем больше, чем длиннее изделие. С моделями я долгое время поступал наоборот: судил по звену, покупал цепь.
Второй образ ближе к обыденной жизни, и в нём та же арифметика видна без всякого железа. Дорога с пересадками, каждая из которых взята с приличным запасом времени. Ни один отрезок не выглядит рискованным; о каждом в отдельности я сказал бы, что всё будет хорошо. Но опоздание на любую пересадку срывает не отрезок, а поездку целиком: дальше едет расписание, а не я. Опытные путешественники поэтому не спрашивают, насколько надёжен средний рейс. Они спрашивают, сколько пересадок. Они считают в правильной единице, не зная, что делают что-то особенное.
Запас времени в этом образе — отдельно поучительная вещь. Он ощущается как страховка, и на каждом отрезке она настоящая: небольшая задержка съедается запасом, и ничего не происходит. Но запасы не складываются в общий фонд. Время, оставшееся лишним на ранней пересадке, ничем не поможет на поздней: оно потрачено на ожидание и не переносится. Страховка работает поштучно, а срывается маршрут целиком, и в этом несовпадении вся суть дела. Всё, чем я укрепляю отдельное звено, остаётся при этом звене; то, что я теряю, теряется сразу по всей цепи.









