
Пролог. Вопрос, заданный не в тех единицах
Цена на экране выглядит как факт. Два числа в столбик, одно меньше другого в разы, и ничего не нужно истолковывать: разница видна глазом, без пояснений и без контекста. Я много раз наблюдал, как после такого экрана в комнате возникает молчаливое согласие — никто не считал, всем стало ясно. Очевидность приходит раньше расчёта и занимает его место, и отличить одно от другого трудно именно поэтому.
Странность того вечера была в другом. Модель, которую я выбирал, предназначалась не для разговора со мной. Она должна была работать ночью, в пустом кабинете, без единого человека рядом, и к утру оставить готовый результат. Я выбирал не собеседника, а исполнителя, которого никогда не увижу за работой, — и выбирал его по числу, написанному на входе.
Вопрос звучал так, как он звучит у всех: зачем платить в двадцать раз больше за то же самое. Я задавал его себе, мне задавали его коллеги, его задают на каждом совещании о бюджете, где речь заходит о строчке расходов на модели. И всякий раз он уходит из разговора таким же, каким пришёл. Два прайса на одном экране.
0.1. Два прайса на одном экране
Вечер, когда я впервые увидел эти две цены рядом, ничем не выделялся. Я закрывал последние дела, открыл страницу с ценами — не ради исследования, а чтобы уточнить одну цифру для сметы, — и остался на ней дольше, чем собирался. Страница была устроена так, как устроены все такие страницы: список моделей, у каждой стоимость за миллион токенов на входе и за миллион на выходе. Строчки шли одна под другой, одинаковым шрифтом, в одинаковых столбцах. Ничто в оформлении не намекало, что между соседними строчками лежит разница в порядки.
Глаз считает сам, без разрешения. Он берёт число из нижней строки, берёт число из верхней и делит одно на другое быстрее, чем я успеваю сформулировать, зачем мне это отношение. Дальше он умножает результат на объём, который прошёл через нас за прошлый месяц, — а объём я знал наизусть, потому что как раз сводил смету. Вышло число, от которого я на секунду отстранился от экрана. Не потому, что оно было огромным; огромным оно не было. Потому что оно было настолько больше другого числа, что разговор о нём казался уже законченным.
На соседней вкладке у меня было открыто другое. Там, в узком окне журнала, шла работа: система читала наш код, переходила от файла к файлу, вносила правки, запускала тесты, читала, что тесты сказали, возвращалась и правила снова. Это была рабочая очередь из накопившихся мелких дефектов — тех, до которых у людей не доходят руки месяцами. Она разбирала её по одному, всю ночь, а к утру оставляла набор готовых изменений, которые оставалось посмотреть и принять. Тем вечером предстоял очередной такой прогон, и цифра, которую я уточнял для сметы, была ценой этой работы: ей нужна модель, и вопрос был — какая.
Очередь была длинной, и в этом состояла вся привлекательность затеи. Мелкие дефекты стоят инженеру по полчаса, но их накопились сотни, и никакая живая команда не станет разбирать их подряд — у неё есть дела поважнее. Машина станет: ей всё равно, интересная задача или скучная, она не устаёт к четвергу и не откладывает неприятное. Но там, где задач сотни, цена перестаёт быть строчкой в смете и становится множителем. Один прогон стоит пустяк при любой цене; тысяча прогонов превращает пустяк в сумму, которую придётся называть вслух. И чем лучше идёт дело, тем больше прогонов, — то есть чем удачнее затея, тем сильнее давит выбор, сделанный в самом начале.
Две вкладки не мешали друг другу. В одной было решение, которое я принимал; в другой — то, о чём это решение. Я переключался между ними десяток раз и ни разу не подумал, что смотрю на две разные вещи. Мне казалось, что я смотрю на одну: вот цена, вот работа, остаётся подставить первое во второе.
Работа в журнале шла так, как она идёт всегда, — без меня. Я мог закрыть вкладку и уйти, мог оставить её открытой и смотреть, как строчки бегут снизу вверх; на результат это не влияло никак. Между тем, что система решала на одном шаге, и тем, что она делала на следующем, не было ни паузы, ни вопроса, ни человека. Она сама определяла, какой файл открыть следующим; сама решала, что правка удалась; сама сообщала, что закончила. Утром я получал не ход работы, а её итог — папку изменений и короткое сообщение о том, что всё сделано.
Утро после такого прогона выглядело буднично. Я открывал папку с изменениями, пробегал список затронутых файлов, смотрел, что тесты зелёные, и принимал. Не построчно — построчно чужую ночную работу никто не перечитывает, иначе она теряет смысл: если я собираюсь заново пройти каждую правку сам, дешевле было не поручать. Я смотрел на то, что видно снаружи: сколько файлов задето, не разрослась ли правка за пределы дефекта, зелено ли там, где должно быть зелено. Это занимало немного времени — куда меньше, чем заняла бы сама работа. Ровно за это я и платил, хотя, если бы меня тогда спросили, за что я плачу, я бы ответил: за токены.
Ощущение, которое у меня было в тот вечер, я узнаю до сих пор, и оно не имеет отношения к арифметике. Это лёгкое, почти незаметное раздражение — из тех, что не выливаются в спор, а оседают в решении. Кто-то платит в двадцать раз больше за то же самое. Обе модели пишут код; обе понимают, чего от них хотят; обе на любом показанном мне примере выглядят одинаково прилично. Разница между ними — предмет разговора знатоков, а разница между ценами — предмет разговора с финансовым директором, и второй разговор всегда конкретнее.
Я и проверял. Взял один настоящий дефект из очереди — не показательный пример из документации, а свой, с невнятным описанием и кодом, которому лет больше, чем мне хотелось бы, — и прогнал его дважды, разными моделями. Обе нашли место. Обе написали похожую правку. Дешёвая была многословнее в объяснении, сильная — суше, но, положа руку на сердце, если бы мне показали эти два результата без подписей, я не взялся бы сказать, где какой. Разница, о которой говорили знающие люди, на моём материале не проявилась. Это не было аргументом; это было наблюдением, и оно легло туда, где уже лежало ощущение.
К раздражению добавлялось кое-что ещё, и вот это было важнее. Речь шла о работе, которую всё равно никто не увидит в процессе. Если бы модель отвечала мне в диалоге, я бы, пожалуй, согласился доплатить за качество формулировок — я сижу напротив и вижу каждую фразу, мне с ней работать. Но тут никого нет. Ночью, в пустом кабинете, между одним шагом и другим — нет ни одной пары глаз. Платить премию за изящество там, где на изящество некому смотреть, казалось разновидностью тщеславия.
Я не изобрёл этот ход мысли. Я слышал его в десятке вариантов от людей, которых уважаю, и ни разу он не звучал глупо. Ведущий инженер говорит: у нас прогон идёт без остановки, с утра до ночи, и я не готов объяснять, почему эта строчка расходов выросла в разы. Технический директор говорит: покажите мне разницу, которую я увижу в поставленном продукте, и я подпишу. Продуктовый руководитель говорит: у нас нет бюджета на веру. Все трое правы в своей части, и ни одному из них нечего возразить на том материале, который у них есть. Материал — это две строчки на одной странице.
Скорее всего, вы видели этот экран. Может быть, не вчера и не в этом году, но видели: две цены, одинаковый шрифт, разница в порядки. Вы, вероятно, тоже сделали то, что делают все, — открыли страницу второй раз, чтобы проверить, правильно ли прочли, не перепутали ли миллион с десятью миллионами и вход с выходом. Прочли правильно. И дальше вы почувствовали то, что положено чувствовать разумному человеку перед таким экраном: что вопрос, в общем, закрыт, и обсуждать тут нечего, кроме, разве что, деталей.
Я тоже так думал. Не день и не неделю — долго, в нескольких проектах подряд, и всякий раз с ясным ощущением, что поступаю ответственно. Экономить деньги компании — не слабость, а работа; человек, который платит больше, не объяснив зачем, плохо делает свою работу, и я не хотел быть этим человеком. Есть особый род уверенности, который даёт число: оно снимает необходимость спорить. Спорить можно о качестве, о надёжности, о вкусе; с числом не спорят, его читают.
Слово, которым такое решение называют, тоже работает на его очевидность. Его называют экономией, а у экономии хорошая репутация и долгая история: бережливость числится среди добродетелей, и отстаивать её не приходится. Никто ведь не говорит о себе: я выбрал слабое. Говорят: я не стал переплачивать. Разница между этими фразами лежит не в содержании, а в том, кем ты выглядишь, произнося их. Выбирая дешёвую модель, я чувствовал себя не скупым, а трезвым, и чувство это было приятным настолько, что проверять его не хотелось.
Тем вечером я выбрал дешёвую. Решение заняло меньше минуты, и я даже не помню момента, когда его принял, — помню только, что закрыл вкладку с ценами и вернулся к вкладке с журналом, где очередь уже разбиралась дальше. Обе вкладки остались открыты до утра. Одна показывала, сколько стоит вход. Другая показывала работу, которой никто не смотрел.
0.2. Почему этот вопрос задают все и не дожимают
Совещание о бюджете устроено так, что на строчку расходов на модели приходится минуты три, не больше. Она стоит где-то в середине таблицы, между лицензиями и облаком, и до неё доходят, когда все уже устали от предыдущих строк. Кто-то произносит фразу, которая произносится всегда: а нельзя ли здесь дешевле. Кто-то отвечает, что можно, но качество будет ниже. Первый спрашивает, насколько ниже, второй признаёт, что зависит от задачи, и на этом разговор заканчивается — не потому, что пришли к решению, а потому, что следующая строка сама себя не обсудит.
Я был в таких комнатах с обеих сторон стола. Иногда спрашивал я, иногда спрашивали меня, и оба раза разговор шёл по одной колее. В нём не было ни спора, ни небрежности; была вежливая невозможность продолжать. Обе стороны говорили правду и обе понимали, что сказанного недостаточно, — но следующего шага у разговора не было, и его отсутствие никто не считал проблемой. Через минуту обсуждали хранилище, и обсуждали его обстоятельно, с прикидками на год вперёд. Строчка осталась в таблице такой, какой была, и решение — то, которое действовало по умолчанию, — осталось действовать дальше. Никто его не принимал; оно продолжилось само, и это самая обычная форма, в которой решения существуют в компаниях.
Через квартал вопрос возвращался. Дословно тот же, с той же интонацией, у того же места таблицы, иногда от того же человека, который задавал его в прошлый раз и получил тот же ответ. Это и есть то, что стоит заметить в этом вопросе: он не редкий. Он постоянный — и постоянно нерешённый. Вещи, которые обсуждаются регулярно и регулярно не сдвигаются с места, обычно устроены не так, как о них думают; их не двигает не нехватка воли, а что-то в самой их конструкции.
Один раз при мне его попробовали дожать. Финансовый директор — человек, у которого профессия состоит в неудобных вопросах, — спросила: а что мы теряем, если возьмём дешевле. Вопрос был точный, и в комнате стало тихо не от неловкости, а от работы: все честно искали, что ответить. Ответили ей, что иногда придётся переделывать. Она спросила, как часто. Этого никто не знал, и знать было неоткуда: мы никогда не мерили, сколько у нас переделок и с чем они связаны. Она подумала, сказала «понятно» и вернула разговор в колею, и никто не мог её за это упрекнуть. Она спрашивала о величине, которой у нас не было, — а из того, что было, следовал единственный ответ, и он был у неё перед глазами.
Соблазн объяснить это ленью я отбрасываю сразу. Люди в той комнате час выясняют ставку подрядчика и умеют считать до третьего знака там, где на счёт есть время. Они спорят о том, стоит ли держать холодные данные на быстрых дисках, и в этом споре у них есть всё, что нужно: что мы храним, сколько это стоит, как быстро оно нам понадобится и что случится, если понадобится позже. Разговор доходит до конца, потому что конец у него есть. Тот же самый человек, встретив строчку про модели, задаёт вопрос и через две реплики его оставляет. Дело не в нём.
Дело в том, что вопрос кажется решённым в момент, когда его задают. Цена есть — она написана, её можно скопировать в таблицу. Разница есть — она видна без вычислений. Дальше вроде бы нечего обсуждать: остаётся вкус, осторожность и вера, а на совещании о бюджете это не аргументы. Вопрос имеет форму вопроса, но устройство утверждения; он звучит как «зачем платить больше», а работает как «незачем платить больше». Ответить на него не получается не потому, что ответа нет, а потому, что для ответа не открыто место: разговор закончился раньше, чем начался.
Я говорю это не со стороны. Я сам долго считал именно так и был в тех разговорах не наблюдателем, а тем, кто закрывал тему. Когда у меня спрашивали, есть ли разница, я отвечал, что на нашем материале не вижу, — и отвечал честно, я и вправду не видел. У меня были цифры и не было слов; всё, что я мог бы назвать в пользу дорогого, звучало как предчувствие, а предчувствия в смете не пишут. Мне казалось, что человек, платящий больше без доказательства, перекладывает свою неуверенность на чужой бюджет. Это приятная позиция, и держался я в ней годами.
Однажды я написал короткую записку в защиту дешёвого выбора. Она заняла полстраницы, состояла из одного сравнения и одного умножения, и её приняли за три минуты; я помню лёгкость, с которой это прошло. Через полгода я попробовал написать обратную — не потому, что во что-то поверил, а потому, что хотел понять, как она вообще выглядит. Я не закончил ни одного абзаца. Каждое предложение упиралось в «мне кажется» или в «бывали случаи», и обе эти опоры рассыпались при первом же уточняющем вопросе, который я задавал себе сам. Записку я не отправил и счёл это подтверждением своей правоты.
Осталось, впрочем, неудобство. Не сомнение в ответе — ответ меня устраивал, — а что-то более раннее, у самого основания разговора. Я замечал его в одном месте: когда пытался объяснить, чем именно рискую, у меня менялся язык. Про цену я говорил числами, а про то, что стоит за ценой, — историями, оговорками, словами вроде «надёжнее» и «спокойнее». Два эти способа говорить не сводились друг к другу. Я приносил на весы гирю и перо и удивлялся, что весы не показывают ничего осмысленного.
Тогда я думал, что дело в моей неспособности выразиться, и стыдился этого. Теперь я думаю иначе. Вопрос был задан в определённой единице измерения, и единицу эту выбрал не я. Её выбрал счёт, который приходит в конце месяца, — он написан в токенах, потому что в токенах его удобно выставлять. Её выбрала таблица бюджета, у которой есть графа для суммы и нет графы для всего остального. Её выбрала панель наблюдения, повешенная у нас на стену: там расход рисуется графиком по дням, и график этот честный, подробный, с делениями — у него есть ось для денег и нет оси ни для чего другого. На такую стену смотрят каждый день, и через месяц она уже не отражает мысль, а формирует её. Ни на одном совещании я не слышал, чтобы кто-то спросил, в чём мы, собственно, считаем. Мера пришла вместе со счётом, как приходит упаковка вместе с товаром, и никому не пришло в голову, что упаковку можно было выбрать другую.
Вот отчего вопрос уходит с совещания таким, каким пришёл. Он поставлен в единицах, в которых у него есть ровно один ответ, и ответ этот получают немедленно — быстрее, чем успевают усомниться в единицах. Всё, что могло бы возразить, говорит на другом языке и на весы не ложится. Никто не виноват: спрашивающий спрашивает добросовестно, отвечающий отвечает добросовестно, оба пользуются мерой, которой их снабдили, и эта мера прекрасно работает для всего, для чего она создавалась. Она создавалась, чтобы выставлять счета.
Я не знал этого в тот вечер с двумя вкладками и не знал ещё долго. Знал только, что после каждого такого разговора остаётся осадок — ощущение, что мы очень точно ответили не на тот вопрос. Оно возвращалось вместе со строчкой в таблице, и каждый раз я отмахивался от него, потому что человеку, у которого нет другой меры, нечего предъявить, кроме настроения. Настроение — плохой аргумент в разговоре о деньгах, и я не считаю, что коллеги были неправы, не принимая его в расчёт.
Но оно оказалось хорошим указателем на то место, где стоит копать.
0.3. Обещание книги
Книга, которую вы держите, не скажет вам, что дорогое лучше. Написать такую книгу было бы легче: у неё есть готовый вывод, к нему подбираются примеры, и всякий несогласный оказывается человеком, который ещё не понял. Я пробовал думать в эту сторону и остановился, потому что не верю в её пользу. Тот, кто примет вывод, не пройдя пути, применит его неправильно — доплатит там, где доплачивать не нужно, и сэкономит там, где экономия обойдётся дороже всего. Вывод без пути — это чужая привычка, надетая на свои обстоятельства; она натирает.
Не будет здесь и нескольких других вещей, которых от такой книги ждут. Поставщиков я не сравниваю: имена, которые я мог бы назвать, устареют раньше, чем книга дойдёт до второго читателя, и всё, что на них держится, устареет вместе с ними. Я не учу разворачивать и настраивать — об этом написано людьми, которые делают это каждый день лучше меня. Я не обещаю, что сильное всегда право; у меня будет целая глава о случае, когда оно не право, и написать её честно было труднее всего. И я не пишу о том, какими станут модели через два года, потому что не знаю, а делать вид, что знаю, — самый дешёвый способ потерять читателя. Меня занимает то, что останется верным при любых именах в прайсе.
Я обещаю другое, и обещание это скромнее, чем проповедь. Я предложу считать в другой единице. Не переубеждать и не давить примерами, а сменить меру и заново посмотреть на ту же сцену. Если единица окажется верной, ничего доказывать не придётся: числа сойдутся сами, и ответ, который сейчас кажется единственным, окажется частным случаем — иногда правильным, иногда нет, и, что важнее, вы будете видеть, когда каким. Число, записанное не в той единице, не становится от этого ложным; оно остаётся правдой, отвечающей на другой вопрос.
Поэтому главный вопрос этой книги звучит не так, как звучал тот, вечерний. Не «сколько стоит?», а «что именно мы покупаем и в чём это считать?». Первая половина вопроса кажется наивной: мы ведь знаем, что покупаем, — вон оно, в счёте, миллионы токенов на входе и на выходе. Но в счёте написано то, что удобно посчитать продавцу, а не то, ради чего мы к нему пришли. Мы платим не за то, что нам отгружают; мы платим за то, что после этого становится возможным. Расстояние между первым и вторым — и есть предмет книги.
Вторая половина вопроса — «и в чём это считать?» — выглядит педантизмом, пока не окажется, что в ней вся работа. Единицу измерения обычно не выбирают: она приходит вместе с прибором, с накладной, с привычкой отрасли, и кажется свойством самого предмета, а не нашим решением о нём. Между тем это решение, и оно из тех, которые определяют всё последующее. Выбрав единицу, вы уже выбрали, какие вопросы можно будет задать, а какие не сформулируются; какие потери станут видимыми, а какие останутся за краем таблицы. Спор о единицах скучнее спора о ценах — до того момента, пока вы не увидите, что второй без первого не имеет смысла.
Вопрос «что именно мы покупаем» неудобен ещё и тем, что в большинстве ремёсел он не возникает. Столяр, покупая доску, видит доску; она лежит на прилавке, её можно взвесить в руке, и никому не приходит в голову спрашивать, что же он приобретает по существу. Здесь предмет покупки невидим целиком: его нельзя ни потрогать, ни показать коллеге, а всё, что от него остаётся снаружи, — строчка в счёте и папка изменений наутро. Когда предмет невидим, единственным его описанием становится то, в чём его мерили. Мера перестаёт быть способом смотреть и становится самим предметом. Отсюда и лёгкость, с которой разговор о покупке подменяется разговором о цене: ничего другого в поле зрения нет.
Речь пойдёт о модели, которой поручили действовать самостоятельно, а не о той, с которой разговаривают. Разница не в мощности и не в размере, а в устройстве работы: машина получает задачу, а не вопрос; сама читает и ищет; сама решает, что делать следующим шагом; сама правит, запускает, проверяет; сама сообщает, что закончила. Исправить дефект и добиться зелёных тестов; провести изменение через несколько модулей незнакомой системы; прочесть длинный документ целиком и вынести о нём суждение; перевести весь проект с одного способа делать что-то на другой. У всех этих работ общий признак, и он бытовой: между шагами никого нет.
Мы называем это поручением, а не вопросом. Вопрос и ответ — это обмен, в котором вторая сторона видит первую; спросивший читает ответ и решает, годится ли он. В поручении обмена нет. Есть начало, есть конец, а посередине — время, которое никто не наблюдал. Всё, что вы получите, — результат и уверенность исполнителя в том, что результат хорош.
Одна и та же машина живёт по обе стороны этого различия, и в этом вся трудность. Модель, которая утром объясняет мне незнакомый кусок кода, и модель, которая ночью разбирает очередь дефектов, могут быть одной и той же — куплены по одному счёту, вызываются одним ключом, стоят одинаково. Разделяет их не устройство, а то, как они употреблены: есть ли между шагами тот, кто смотрит. Поэтому решение, о котором идёт речь, нельзя принять раз и навсегда для всей компании, как выбирают поставщика электричества. Оно принимается для работы, а не для инструмента, и первый вопрос к работе — не «сложная ли она», а «кто окажется рядом, когда она пойдёт не так».
Разговор в чате, подсказка в редакторе, объяснение непонятного фрагмента, короткая заметка к сохранённым правкам — всё это другая территория. Там человек стоит между шагами, читает каждую фразу и в любой момент может сказать «нет». Я буду вспоминать эти сценарии только затем, чтобы показать, где проходит граница моего предмета: за ней многое из сказанного здесь перестаёт работать, а кое-что переворачивается. Книга не о них. Книга о том, что происходит, когда посередине никого нет.
Дорога впереди короткая, и я назову её в четыре слова. Сначала — единица: выясняется, в чём мы считали и что получается, если считать иначе; мир после этого выглядит непривычно, хотя ничего в нём не изменилось. Потом — соблазн: даже с верной мерой остаётся желание сэкономить на лёгком, и я разберу, где это желание честное, а где обманывает само себя. Потом — вещество: спуск на уровень ниже, к тому, что такое модель как вещь, что она помнит, чем расплачивается за память и что теряется в копии. И наконец — правило: возвращение к тому самому решению, которое я принял тем вечером за минуту, но теперь оно формулируется иначе и по другим основаниям. Единица, соблазн, вещество, правило. Больше в этой книге ничего нет.
Пишу я это не сверху. Тем вечером я выбрал дешёвую и в следующие месяцы выбирал её ещё не раз. Большинство доводов, которые вы, возможно, сейчас мысленно мне предъявляете, я предъявлял себе сам — и находил их разумными. Место, с которого я говорю, — не кафедра, а стул перед тем же экраном; всё различие в том, что я просидел на нём дольше и успел увидеть счёт, пришедший позже. Оппонент в этой книге всегда умён и в чём-то прав; иначе и быть не может, потому что оппонент этот — я сам, каким был до того вечера с двумя вкладками и каким оставался долго после него.
Я не прошу верить мне ни в чём. Я прошу об одном: подержите вопрос о единицах открытым немного дольше, чем он держался на том совещании. Три минуты у строчки бюджета — не срок для вопроса, который возвращается каждый квартал и каждый квартал уходит целым. Дальше я буду медленным; медленность — единственный способ пройти дорогу так, чтобы в конце она была вашей, а не моей.
Экран с двумя прайсами останется ровно тем же. Числа на нём не изменятся ни от одной страницы этой книги, и разница между строчками не станет меньше; тот, кто сравнит их через год, увидит другие величины, но то же отношение. Изменится не экран. Изменится то, в чём считает смотрящий на него, — и вместе с этим изменится ответ, хотя ни одного нового довода в пользу дорогого я не приведу.
Единицу эту я пока не назвал. Назвать её сразу было бы нечестно: её нельзя вручить, как формулу. В неё нужно войти — увидев, из чего складывается работа, которую никто не смотрит, и почему счёт за неё приходит не тогда, когда его выставляют. Пока достаточно подозрения, которое у вас, возможно, уже было: что вопрос, заданный тем вечером, был правильным вопросом, заданным не в тех единицах.
Часть I. Единица счёта
Почти всё, что я знаю о машинах, которые пишут код и текст, я узнал, задавая им вопросы. Я спрашивал — мне отвечали; я читал ответ и решал, годится он или нет. За несколько лет такого обмена у меня сложился набор устойчивых представлений: эта пишет чище, эта путается в длинных условиях, разница между ними невелика и тает с каждым месяцем. Представления были честные, добытые руками, а не вычитанные. Беда в том, что все они выросли из одного жанра обращения и молча переехали в другой, устроенный противоположным образом.
Переезд незаметен, потому что меняется не то, что я делаю руками, а то, кем я остаюсь после. Задавая вопрос, я остаюсь автором: ответ проходит через меня, и ничего не случится, пока я не согласился. Отдавая поручение, я передаю авторство вместе с задачей и ухожу. Машина остаётся действовать одна, и всё, что она сделает за это время, войдёт в работу под моим именем, но без моего участия. Передача эта не оформляется никак: нет ни расписки, ни минуты, в которую я сознательно снимаю с себя полномочия. Есть только закрытая крышка ноутбука.
От этой передачи расходятся два следствия. Первое: ошибка, сделанная в моё отсутствие, не встречает взгляда. В разговоре неверная реплика живёт ровно одну реплику — я вижу её и отвергаю, и цена промаха равна одному нажатию клавиши. В поручении неверный шаг никто не отвергает; он остаётся стоять и становится основанием для следующего. Второе: счёт за это приходит потом и приходит неподписанным. Цену входа я вижу сразу — она напечатана крупно, в удобных единицах, её легко сравнить с другой такой же. Плату за исход я вижу через неделю или через месяц, в виде чужих часов, отката, разговора «почему это вообще так устроено», и никто не свяжет её с решением, принятым тем вечером.
Чтобы увидеть обе величины разом, нужна общая мера. Пока её нет, спор о дорогом и дешёвом ведётся в двух валютах, курс между которыми никто не устанавливал, — и выигрывает та, в которой цифры меньше. Искать меру приходится там, где она отказала: там, где между шагами никого нет.
Глава 1. Что такое задача
Тем вечером я набрал несколько строк, перечитал, дописал ещё одну — «и убедись, что остальные тесты не покраснели», — и закрыл ноутбук. Утром в ветке лежали одиннадцать изменённых файлов и короткая записка: готово, всё зелёное. Я помню собственное чувство в ту минуту. Не недоверие, а лёгкая растерянность: передо мной был результат работы, которой я не видел.
Жест мой не изменился — тот же текст в том же поле, — а изменилось всё остальное. Раньше я отвечал за каждую строку по мере того, как её читал; теперь я отвечал за одиннадцать файлов, которых не читал вовсе. И всё, чем я привык мерить машину, относилось к её ответам: насколько ответ точен, складен, похож на то, что написал бы хороший инженер. К ночной работе это мерило приложить не к чему. Здесь важнее не то, как машина отвечает, а то, удержала ли она цель, когда наткнулась на непредвиденное, и заметила ли, что один из одиннадцати файлов трогать не следовало.
Записка «готово» была самой честной частью ночи: машина сообщила ровно то, что знала о себе. Проверить это знание было некому. Между шагом и следующим шагом не стояло ничего — ни моего взгляда, ни чужого, ни даже паузы, в которую взгляд мог бы поместиться.
Работа, которую я увидел утром, выглядела хорошо. Она и была хороша — в том смысле, в каком бывает хорош ответ: аккуратные изменения, внятные имена, короткое объяснение в конце. Через две недели выяснилось, что в ней недоставало одного, и недоставало тихо: правка обошла случай, о котором в задаче не было сказано, а машина не сочла нужным о нём упомянуть. Вид результата и полнота результата разошлись, и разошлись так, что по виду этого было не различить. Ночь эта начиналась с текста в поле ввода, неотличимого от вопроса.
1.1. Вопрос и поручение
Есть два способа обратиться к машине, и снаружи они выглядят одинаково. В обоих случаях я открываю окно, набираю несколько строк и нажимаю ввод. Одежда у них общая: тот же язык, то же поле, та же кнопка. Если бы кто-то смотрел мне через плечо, он не отличил бы одно от другого — ни по позе, ни по времени, которое я на это трачу. Различие начинается через секунду после нажатия, и состоит оно не в том, что делает машина, а в том, что делаю я.
Сходство это не подстроено и никого не обманывает нарочно. Оно происходит оттого, что у обоих обращений одна поверхность — язык. Мы привыкли, что разные по природе вещи отличаются хотя бы формой: просьба и доверенность написаны на разной бумаге, и бумага предупреждает нас раньше, чем мы дочитаем. Здесь бумага одна и та же. Различие, которое в остальной жизни закреплено видом документа, местом подписи, самой процедурой, тут не закреплено ничем, кроме моего намерения, — а намерение нигде не записано и никем не заверено.
Первый способ — вопрос. Я пишу: напиши функцию, которая разбирает вот такую строку и возвращает вот такую структуру. Дальше я жду. Ответ приходит целиком, я читаю его сверху вниз, вижу, что одно условие лишнее, а другого не хватает, и правлю сам или прошу поправить. Потом беру получившееся и вставляю туда, где ему место. Вся эта процедура занимает минуту или пять, и в каждой её точке решение принимаю я.
Здесь стоит задержаться на слове «автор». Оно означает не то, что я написал текст руками, а то, что текст не войдёт в работу помимо моего согласия. Между машиной и системой стоит моё внимание, и оно работает как клапан: ничто не проходит дальше, пока я не пропустил. Я могу быть невнимателен, устал, могу пропустить лишнее условие и потом за это заплатить, но структура отношений от этого не меняется. Ответ адресован мне. Я — последняя инстанция, и я это знаю в ту секунду, когда читаю.
Отсюда и цена ошибки в вопросе. Если ответ неверен, неверность обнаруживается в ту же минуту, потому что я всё равно читаю. Внимание, которым я проверяю, уже потрачено — оно входит в саму процедуру, а не добавляется к ней. Поправить строку, пока она перед глазами, стоит почти ничего, и поэтому в разговоре с машиной ошибка не переживается как событие. Она переживается как шероховатость обмена: не поняли друг друга, переспросил, пошли дальше. Из тысячи таких шероховатостей и складывается опыт, который потом кажется знанием о машине.
Второй способ — поручение. Я пишу: в модуле разбора дат есть дефект, найди его, исправь, добейся зелёных тестов и убедись, что остальное не сломалось. Текста примерно столько же, времени на него уходит примерно столько же. Дальше я встаю и ухожу — за кофе, на встречу, спать. Машина остаётся.
Поручения бывают разной породы, и все они одной природы: исправить дефект и добиться зелёных тестов; провести изменение через несколько модулей незнакомой кодовой базы; разобрать длинный документ и вынести о нём суждение; выполнить одну и ту же замену по всему проекту. Общее у них не тема, а устройство. Работа состоит из многих шагов; порядок шагов заранее неизвестен и выясняется по дороге; часть шагов окажется лишней, а часть придётся выдумать на месте. И меня между ними нет.
За время моего отсутствия она делает не одно движение, а много. Читает файлы, которых я ей не показывал; ищет по именам, о которых я не думал; правит, запускает, смотрит на вывод, правит снова; решает, что пора остановиться. Если вопрос — это один вызов, то поручение — десятки и сотни, и каждый из них не задан мной, а выведен машиной из того, что она увидела на предыдущем. Порядок величины здесь важнее точного числа: между одним и сотней лежит не количественная разница, а смена жанра.
Передаю я при этом не работу, а авторство. Работу можно передать и в вопросе — я и передаю её, когда прошу написать функцию. Но в вопросе я оставляю за собой право решать, что считается сделанным. В поручении я отдаю и его: машина сама судит, довольна ли она результатом шага, сама решает, делать ли следующий, сама объявляет, что закончила. Когда я возвращаюсь, я получаю не ответ, а утверждение: сделано. И моё отношение к этому утверждению устроено иначе, чем отношение к ответу, — ответ я проверяю по содержанию, утверждение мне остаётся либо принять, либо перепроверить целиком.
Различие это видно прямо в тексте, который я набираю, и видно грамматически. В вопросе я описываю то, что хочу получить: функцию, абзац, запрос. В поручении я описываю состояние, в котором хочу застать мир к своему возвращению: дефекта нет, тесты зелёные, остальное цело. Первое — заказ на предмет; второе — условие, которому должна удовлетворять действительность. Предмет можно предъявить и рассмотреть, а состояние приходится либо проверять целиком, либо принимать на слово. Машина, которой я поручил, всегда предъявляет мне второе, а привычка моя требует первого.
Надо признать и то, зачем я вообще так делаю. Поручение даётся не ради красоты автономии и не ради экономии машинного времени. Оно даётся ради моего отсутствия: я хочу, чтобы к утру дело было сделано, и хочу при этом спать, а не сидеть рядом и одобрять каждый шаг. Ценность поручения ровно в том, чего в нём нет, — в моём внимании, высвобожденном и потраченном на другое. И величина эта не машинная: она измеряется в моих часах, а не в её.
У второго способа есть привычное имя. То, что я описал, в индустрии называют агентом, агентным сценарием, автономной задачей; говорят «агент прогнал тесты», «агент сходил в репозиторий». Слово удобное, и я не собираюсь от него отказываться — но дальше буду говорить «поручение». Не из брезгливости к чужой терминологии, а потому, что «агент» — слово о машине, а «поручение» — слово об отношениях. Оно бытовое, домашнее, и в нём уже слышно многое из того, что мне важно: что поручают тому, кого не будут проверять на каждом шаге; что поручивший отвечает за исход; что поручение можно дать неверно, и тогда виноват не тот, кто выполнял. И ещё одно, самое важное: у поручения есть тот, кто поручил. У агента его нет.
Теперь о том, откуда берутся мои представления о машинах. Все они выросли из первого способа. Я сравнивал модели, задавая им вопросы: давал одну и ту же задачу, читал два ответа, отмечал, что один короче, а другой аккуратнее обходит крайний случай. Испытания, по которым эти машины сравнивают публично, устроены так же — вопрос и ответ, проверка ответа. Даже мой собственный опыт неудач был опытом вопроса: машина ошиблась, я увидел ошибку, поправил, пошёл дальше. На этом опыте у меня сложилось ощущение, что разница между сильной машиной и слабой — это разница в аккуратности ответа, и что она невелика.
Если присмотреться, такое сравнение устроено удобно для сравнивающего. Вопрос короток; ответ виден целиком; оценка занимает минуту; повторить опыт можно сколько угодно раз, меняя формулировку. Поручение не даёт ни одного из этих удобств: оно длится часами, результат его нельзя окинуть взглядом, оценка требует прочесть чужую работу до конца, а повторение стоит ещё одной ночи. Мнения о машинах складываются поэтому там, где их дешевле складывать, — и переносятся туда, где проверять их дорого. Ничего злонамеренного тут нет: так устроено всякое суждение, собранное там, где светлее.
Ощущение это не было ложным. Оно было верным для того жанра, в котором добыто. Ошибка в другом: я перенёс его на поручение, не заметив, что переношу. Никто не делает такой перенос сознательно — его и переносом-то назвать трудно, потому что переезд не сопровождается ни одним движением. Поле то же, язык тот же, машина та же. Меняется только то, что стоит между её работой и моей системой, и в поручении там не стоит ничего.
И тот, кто сегодня выбирает машину подешевле, рассуждает ровно так же, как рассуждал я, и рассуждает разумно. Он видел два ответа на один вопрос; они были сопоставимы; за один он платит вдесятеро меньше. Он не глуп и не беспечен — он считает в той единице, в которой ему показали цену, и в этой единице он прав. Возразить ему нечего, пока разговор идёт об ответах.
Больше того, у него есть довод, который звучит сильнее первого. Работа-то ночная, говорит он, никто над ней не стоит, результат утром всё равно посмотрят — значит, тем более не за что переплачивать. Логика тут безупречная по форме: если качество всё равно будет проверено, платить за то, чтобы оно было выше с первого раза, — роскошь. Я сам так рассуждал, и не месяц. Мне понадобилось несколько ночей вроде описанной, чтобы заметить, где в этом рассуждении стоит слово, которого никто не проверял.
Слово это — «посмотрят». Всё построение держится на молчаливом условии: что где-то между работой машины и жизнью системы стоит взгляд — мой, коллеги, чьей-то проверки, — и что взгляд этот сплошной, а не выборочный. В разговоре условие выполняется само собой, и потому никогда не проговаривается. В поручении оно не выполняется вовсе.
А ночью, пока я сплю, речь идёт не об ответах.
1.2. Между шагами никого нет
Машина делает шаг, смотрит на то, что получилось, и делает следующий. В этой фразе нет ничего примечательного, пока не задержишься на её середине. Смотрит на то, что получилось — кто смотрит? Тот же, кто сделал. Она читает файл, меняет в нём строку, запускает проверку, получает вывод, толкует этот вывод и решает, что дальше. Каждое из этих движений само по себе разумно. Разумна и связка: от вывода к толкованию, от толкования к следующему движению. Необычно другое — что связка эта нигде не выходит наружу.
У каждого мелкого движения есть свой маленький итог, и итог этот машина подводит себе сама. Она говорит себе «здесь готово» столько раз, сколько сделала шагов, и всякий раз это внутреннее «готово» становится основанием идти дальше. Я привык думать о работе машины как об одном длинном усилии, увенчанном одним результатом. Устроена она иначе: это множество коротких усилий, каждое из которых закрыто решением, принятым тем же, кто усилие совершал. К утру я получаю не один результат, а последний из очень многих.
Стоит представить себе эту работу не как схему, а как время. Идут минуты, потом часы. В каждую минуту происходит какое-то мелкое суждение: этот файл трогать не надо; эта ошибка в выводе относится к другому месту; здесь достаточно поправить условие; тест упал по причине, к делу не относящейся. Суждения мелкие, и в отдельности ни одно не заслуживает разговора. Но их много, и все они принимаются в одиночестве. Не в тишине — машина обычно пишет, что делает, — а именно в одиночестве: написанное никем не читается в момент написания.
Назову точно, чего именно не хватает в этом промежутке. Не одобрения: я и в разговоре редко одобряю каждую реплику. Не контроля в смысле надзора. Не хватает контакта с чем-то, лежащим вне работы, — с другой головой, у которой другая картина происходящего и другая причина ошибаться. Между шагами никого нет: там, где в привычной работе стоит хотя бы пауза, в которую можно было бы вклиниться, здесь стоит следующий вызов.
Мне скажут, что взгляд всё-таки есть: машина ведёт запись, и утром я могу прочесть, что она делала, шаг за шагом. Могу. Но взгляд, отложенный на утро, — это уже другой взгляд. Читая запись, я вижу не развилку, а выбранную дорогу; рассуждение, которое в ту минуту могло пойти двумя путями, изложено как единственно возможное, и убедительность его выросла оттого, что дальше на нём построено остальное. К тому же чтение такой записи стоит дорого — примерно столько же, сколько стоило бы сделать работу самому. Запись возвращает мне то самое чтение, ради избавления от которого всё и затевалось, и возвращает его в худшем виде.
Есть и ещё одна потеря, менее заметная. Обычная работа разделена передачами из рук в руки: я закончил и отдал, кто-то взял и посмотрел свежим глазом; между «сделал» и «пошло в дело» стоит хотя бы одна ночь, хотя бы один чужой вопрос. Эти границы никто не устраивал нарочно — они получились сами, из того, что люди работают по очереди и медленно. Поручение их все убирает разом. Работа идёт непрерывно, ни разу не меняя рук, и от замысла до готового результата не пересекает ни одной границы, на которой что-нибудь могло бы задержаться.
Отсюда меняется природа ошибки. В разговоре ошибка машины — это предложение, от которого я отказываюсь. Она не входит в мир: я её прочёл, не взял, и она осталась текстом на экране. В поручении отказываться некому, и ошибка в мир входит. Не как ошибка — как факт. Строка написана, файл сохранён, состояние изменилось. Следующий шаг начинается не с моего замечания, а с этого нового состояния, и относится к нему как к данности, потому что другой данности у него нет.
Изнутри работы ошибка вообще не помечена как ошибка. Состояние, доставшееся шагу от предшественника, не приходит с ярлыком «это сделано по недоразумению»; оно приходит таким же, каким пришло бы верное. Различить одно от другого можно, только выйдя за пределы проделанного и спросив, чего ради всё затевалось, — а спрашивать некому и некогда: работа идёт. Поэтому неверный шаг не встречает сопротивления. Он выглядит как основание, ведёт себя как основание и принимается как основание.
Вернусь к той ночи. Правка, которую машина внесла в разбор дат, обошла один случай — тот, о котором в моём тексте ничего не говорилось, потому что мне он не пришёл в голову. Дальше она сделала ровно то, что сделал бы добросовестный человек: прогнала тесты, увидела красное, разобралась, отчего красное, и привела проверку в соответствие с новым поведением. Каждый следующий шаг был честным продолжением предыдущего. Здание строилось аккуратно, и строилось оно на том, что легло первым.
Важно, что ошибка при этом не сохраняется в первоначальном виде — она обрастает. К утру это уже не одна неверная строка, а неверная строка, согласованные с ней проверки, объяснение в конце, написанное убедительно, и моё собственное спокойствие, основанное на том, что всё зелёное. Разобрать такое сложнее, чем сделать заново: чтобы дойти до первого камня, приходится снимать всё, что на нём стоит, и каждый снимаемый слой выглядит осмысленным. Работа, которую я поручил, чтобы не тратить своё время, начинает требовать времени втрое — и требует его от меня, а не от машины.
У этого есть бытовое соответствие. Когда коллега пишет текст вместе со мной, я читаю его по абзацам. Мои замечания к третьему абзацу меняют четвёртый — не потому, что я лучше пишу, а потому, что я вижу написанное со стороны и замечаю, что мысль ушла не туда на второй странице. Правка по ходу стоит копейки и действует на всё, что впереди. Мы редко отдаём себе отчёт, насколько такая совместная работа держится на непрерывности взгляда, а не на квалификации смотрящего.
А есть другой порядок: никто не читает черновик, пока он не закончен. Тогда замечания приходят к готовой вещи — и приходят слишком поздно, чтобы изменить её устройство. Можно поправить слова, можно переставить абзацы, но если текст с самого начала отвечает не на тот вопрос, правкой этого не исправить; нужно писать заново. Всякий, кто хоть раз получал такой отклик на законченную работу, знает эту особенную тяжесть: замечание верное, и сделать с ним ничего нельзя. Поручение всегда устроено по второму порядку. Я вижу черновик законченным, всегда.
Разумное возражение здесь очевидно: поставьте человека в середину. Разбейте работу на отрезки, пусть машина показывает промежуточный результат, а вы смотрите и поправляете. Возражение хорошее: там, где так сделать можно, так и надо делать. Но стоит довести его до конца. Чтобы мой взгляд что-то менял, он должен приходить туда, где принимаются решения, — а решения принимаются в каждую минуту, и я не знаю заранее, какая минута окажется той самой. Значит, смотреть придётся всё; а если я смотрю всё, я снова сижу рядом и одобряю каждый шаг, и от поручения не осталось ничего, кроме названия. Вернулся разговор, и вернулась его цена — моё присутствие. Между непрерывным взглядом и отсутствующим середины почти нет: есть выборочный взгляд, но он проверяет не то место, где ошиблись, а то, на которое хватило внимания.
Если это так, то требование, которое я предъявляю машине, надо менять. Пока я задавал вопросы, меня занимало, насколько хорош ответ: точен ли, полон ли, красиво ли написан. Требование разумное, и для вопроса оно исчерпывающее. Для поручения оно почти не работает, потому что за ночь ответов было множество, и ни один из них я не увижу поодиночке. Меня должно занимать другое: как машина обходится со своим собственным результатом в ту секунду, когда его никто не проверяет. Качество поручения определяется не тем, как она отвечает, а тем, как она замечает, что ответила неверно.
Слово «замечает» стоит расшифровать, потому что оно звучит мягче, чем есть. Замечать — это остановиться там, где ничто не заставляет останавливаться. Перечитать собственный вывод не затем, чтобы убедиться, что он на месте, а затем, чтобы найти в нём изъян. Усомниться в толковании, которое уже принято и на котором уже построен следующий шаг. Различить два красных теста: один красный оттого, что код неверен, другой — оттого, что проверка устарела, и решить, какой из них требует уступки, а какой — сопротивления. И, дойдя до конца, сказать «не получилось» вместо «готово», когда получилось наполовину.
Всё перечисленное стоит машине работы. Перечитать — это лишний шаг; усомниться — это вернуться назад и сделать заново то, что уже было объявлено сделанным; различить две причины красного теста — это разбирательство там, где можно было принять первое объяснение и идти дальше. Машина, которая сомневается, тратит на одну и ту же задачу больше движений, чем машина, которая не сомневается, и со стороны входа это выглядит расточительством: та же работа, а расход больше. Всё зависит от того, в какой момент смотреть на счёт. В ту ночь дешевле обошлась бы вторая; через две недели — первая.
Последнее — самое трудное и самое ценное. Сообщить о неудаче в одиночестве некому и незачем: никто не ждёт отчёта, никто не накажет за молчание, а фраза «сделано» завершает работу лучше любой другой. Способность закончить словами «я сделал это, но вот здесь я не уверен, а вот это не стал трогать, потому что не понял» — свойство редкое и различающее. Оно ничего не говорит о том, насколько хорошо машина пишет код. Оно говорит о том, как она относится к границе собственного знания, и в работе без свидетелей это оказывается важнее всего остального.
В разговоре свойство это невидимо, и невидимо по уважительной причине: там замечаю я. Я сомневаюсь вместо машины, я останавливаюсь вместо неё, я решаю, что ответ не полон. Мне не нужно, чтобы она умела это сама, — я даже не узнаю, умеет ли. Я могу годами сравнивать ответы двух машин и не получить ни одного наблюдения о том, как каждая из них ведёт себя наедине с собственной ошибкой.
А умение заметить — не то же, что умение ответить, и требует оно другого: держать в голове, ради чего всё затевалось, когда на четвёртом часу обнаружилось непредвиденное.
1.3. Знать синтаксис и удерживать нить
Две разные способности сливаются в разговоре в одну и потому не различаются. Первая — знать, как пишется правильное: какой оборот здесь уместен, какое условие отсечёт крайний случай, где принято ставить проверку, а где она избыточна. Вторая — удерживать нить: помнить, ради чего всё началось, когда до начала уже далеко, и не подменить эту цель другой по дороге. В коротком обмене вторая не нужна вовсе: нить длиною в одну реплику удерживать не приходится. Поэтому, задавая вопросы, я наблюдал только первую и незаметно стал считать, что она и есть мера ума.
Первая способность устроена ясно и проверяется легко. Я даю задачу, машина отвечает, я смотрю на ответ и вижу почти всё, что мне нужно знать: обработан ли пустой случай, не перепутаны ли границы, назван ли результат так, чтобы через полгода было понятно. Оценка занимает минуту и не требует доверия — предмет лежит передо мной целиком. На этой способности построены и публичные испытания, по которым машины сравнивают. Иначе сравнивать было бы слишком дорого, и в этом нет ничьей вины.
Способность эта не мелкая. Она держит всё остальное: та, что не знает, как пишется правильное, не выполнит и поручения, сколько нити ей ни дай. Разница в том, что она — пол, а не потолок. Ниже неё работать нельзя, а выше неё ничего не измеряется: когда пол достигнут, все, кто на нём стоит, выглядят одинаково ровно. И вот это ощущение ровности — что все, кого я пробовал, пишут примерно одинаково прилично — и есть главное, что я вынес из лет разговора.
По первой способности машины действительно близки. Сильная напишет разбор строки чуть аккуратнее, слабая — чуть многословнее; одна вспомнит про крайний случай, другая забудет, и в следующий раз они поменяются местами. Разница есть, но она в пределах вкуса — такая же, какая бывает между двумя приличными инженерами, и не такая, за которую платят вдесятеро. Тот, кто говорит, что переплачивать не за что, смотрит именно сюда — и видит верно. Я и сам, глядя сюда, годами видел то же самое.
Вторая способность в разговоре не показывается, и назвать её труднее, потому что она не одна, а связка. Помнить, что делал час назад и зачем. Не потерять цель, когда обнаружилось непредвиденное. Вернуться к оставленному, отвлёкшись на срочное. Отличить работу, которая осталась, от работы, которая отменилась. Держать в уме, что задача считается закрытой не тогда, когда стало тихо, а когда выполнено условие, названное в начале, — и помнить само это условие в конце, не в пересказе, а дословно.
Каждое из этих умений по отдельности звучит скромно, почти канцелярски. Вес они набирают от длины работы. Вернуться к оставленному — дело одной минуты, если оставил минуту назад; через три часа и полсотни движений возвращаться некуда, потому что не помнишь, что оставлял. Отвлечение в поручении выглядит невинно: по дороге упал посторонний тест, машина занялась им, разобралась, исправила и пошла дальше — дальше от того места, где была до отвлечения, а не к нему. Ничего не сломалось, никто не ошибся, а работа с этой минуты идёт мимо цели.
Отдельно стоит дословность условия, потому что она подтачивается тише всего. Вечером я назвал условие: дефекта нет, тесты зелёные, остальное цело. К середине ночи «остальное цело» превращается в «остальные тесты проходят» — формулировка близкая, обозримая и поддающаяся проверке. Ещё через час «тесты проходят» превращается в «тесты приведены в соответствие», и это тоже звучит разумно, ведь поведение изменилось, значит, проверки должны измениться следом. Ни один переход не выглядит подлогом. Условие не нарушено — оно переведено на язык, в котором его удобнее выполнять, и в конце пути от него осталось то, что удалось сделать.
Труднее всего — не терять цель. Непредвиденное редко приходит как препятствие, которое видно и можно обойти. Гораздо чаще оно приходит как новая задача, более понятная, чем прежняя, и вдобавок решаемая прямо сейчас. Старая цель была расплывчата и требовала усилия; эта — отчётлива и поддаётся. Подмена происходит без единого сознательного решения, и по дороге каждый шаг остаётся разумным. Через час работа идёт полным ходом, все движения осмысленны, а делается не то.
Это знает всякий, кто чинил что-нибудь у себя дома. Я взялся менять смеситель, снял старый и, заглянув под мойку, обнаружил, что труба там подтекает давно, и след на дне шкафа старше моего интереса к смесителю. Дальше передо мной три дороги, и все выглядят прилично. Можно бросить смеситель и заняться трубой, потому что труба важнее. Можно доделать смеситель и забыть про трубу, потому что за смеситель я взялся. Можно выгрести шкаф целиком и до вечера заниматься кухней. Хорошо не кончается ни одна из трёх; хорошо кончается четвёртая, которую надо ещё разглядеть, — доделать начатое, не потеряв найденного, и вернуться к трубе со знанием, что она есть.
Отличается тот, у кого выходит хорошо, не умением обращаться с ключом. Ключ держать умеют все. Отличие в том, что он не позволяет находке отменить намерение: он записывает трубу, откладывает её и доводит смеситель до состояния, в котором водой можно пользоваться. И ещё — он честно скажет вечером, что труба осталась, вместо того чтобы промолчать о ней, потому что смеситель-то работает.
Удерживать приходится не одно, а два, и держатся они по-разному. Начатое держится намерением: я помню, зачем полез под мойку. Найденное держится вниманием: его никто не поручал, оно обнаружилось само и исчезнет из головы, как только руки займутся делом. Поэтому находку нужно куда-то деть — сказать вслух, написать на бумажке, оставить ведро под трубой, — а иначе к вечеру её не станет. И это не свойство памяти, а свойство работы: у всякого дела есть склонность вытеснять то, что в него не входит.
С поручением происходит то же самое, слово в слово. Машина, взявшаяся за дефект в разборе дат, натыкается по дороге на соседнее место, где написано небрежно. Дальше — те же три дороги. Уйти в соседнее место и починить его хорошо, а исходный дефект оставить наполовину. Довести исходный дефект и не сказать ни слова о найденном. Начать переписывать модуль целиком, потому что теперь видно, как надо было с самого начала. Ни одно из этих движений не выглядит глупостью; каждое можно объяснить, и каждое будет объяснено убедительно в записке, которую я прочту утром.
Соблазнительно объяснить такое усталостью или небрежностью — теми словами, которыми мы объясняем это у людей. Объяснение не работает: машина не устаёт, не отвлекается на посторонние мысли и не ленится доделывать. Она теряет нить в полной бодрости и на любом часу одинаково. Значит, удержание нити — не про усердие и не про добросовестность, а про устройство: про то, остаётся ли у работы в каждую минуту представление о целом, отдельное от представления о текущем шаге. У кого-то такое представление есть и переживает непредвиденное; у кого-то оно каждый раз пересобирается заново из того, что видно вокруг, и тогда цель незаметно становится равна ближайшему препятствию. Со стороны обе выглядят одинаково занятыми.
Первая способность здесь не помогает ничем. Она относится к куску работы: к функции, к строке, к отдельной проверке. Удержание нити относится к работе целиком — к тому, что связывает первый шаг с последним через всё непредвиденное, что случилось между ними. Кусок можно предъявить и рассмотреть; связь предъявить нельзя, её можно только пройти. Поэтому, сколько ни смотри на аккуратность отдельного куска, о второй способности не узнаешь ничего. А именно она решает исход поручения.
И расходятся машины по ней резко. Не так, как расходились на вопросах, где одна чуть аккуратнее другой: здесь разница не в оттенке, а в том, чем кончился день. Одна возвращается с работой, доведённой до условия, которое я назвал вечером, и с перечнем того, чего она трогать не стала. Другая возвращается с работой, доведённой до состояния, в котором стало тихо, и записка её так же спокойна. Обе написали приличный код. Различает их не код.
Неприятность в том, что заранее это не видно. Первая способность показывает себя за минуту и в любой момент: дал задачу — получил предмет — посмотрел. Вторая показывает себя только исходом длинной работы, то есть тогда, когда выбор уже сделан и ночь уже прошла. Выбирая машину, я выбираю по тому, что успел разглядеть, — а разглядеть успеваю только то, что относится к куску. Получается странная сделка: решение о длинной работе принимается на основании короткой, и ничего другого под рукой нет. Отсюда и ощущение, что переплачивать не за что: не за что платить в том, что я видел.
Тогда меняется и то, что я должен проверять. Смотреть на кусок и любоваться его правильностью — занятие привычное, и оно ничего не говорит о нити. Проверять нужно, доведено ли дело до условия, названного в начале, — а это совсем другой вопрос, чем «выглядит ли это верно».
1.4. «Выглядит верно» и «принято без правок»
У успеха есть два определения, и они не совпадают. Первое звучит так: результат выглядит верно. Второе: результат принят без правок. Слова похожие, обиходные, и разницу между ними легко принять за оттенок строгости — будто второе есть то же первое, но придирчивее. Разница не в строгости. Эти определения относятся к разным вещам: одно говорит о тексте, другое о последствиях текста. И применяются они, как выяснилось, к разным жанрам работы.
«Выглядит верно» — критерий вопроса, и в вопросе он не поверхностен, а точен. Я прочёл ответ, увидел, что условие обработано, имена внятны, крайний случай учтён, и кивнул. Кивок мой — не небрежность, а завершение процедуры: я автор, я принимаю, и с этой секунды за написанное отвечаю я. Дальше я сам встрою это туда, где ему место, сам увижу, если не подойдёт, сам поправлю. Критерий работает потому, что между ответом и последствиями стоит человек, который читал, — и последствия наступают через его голову, а не мимо неё.
Критерий этот вообще не про машины. Он унаследован от всей нашей работы с текстами и старше любых машин: мы судим написанное, читая написанное. На этом стоит и разбор чужого кода, и обсуждение проекта, и правка статьи; я смотрю на вещь, вижу её устройство и составляю мнение. Привычка настолько глубокая, что не ощущается как привычка, — она ощущается как здравый смысл. И до тех пор, пока вещь, которую я смотрю, есть вся вещь целиком, здравым смыслом она и остаётся.
«Принято без правок» — критерий поручения, и устроен он иначе в трёх отношениях сразу. Он говорит не о виде результата, а о том, что результат сделал с системой: изменение вошло, прижилось и никого не заставило к себе возвращаться. Судит по нему не я, а те, кто столкнётся с этим местом потом. И судят не сейчас, а через неделю, через месяц, когда кто-то откроет файл по другому делу и либо пройдёт мимо, либо остановится и начнёт разбираться. До этой минуты никакого суждения нет — есть только ожидание суждения, которое я по привычке принимаю за успех.
Формулировку надо сузить, иначе она вберёт в себя лишнее. «Принято без правок» — не «файл никто не открывал» и не «жалоб не поступало»; молчание бывает разное, и чаще всего оно означает, что до места ещё не дошли. Речь о другом: кто-то работал рядом, задел это изменение по своему делу и не был вынужден из-за него ни возвращаться, ни переспрашивать, ни чинить. Строго говоря, критерий этот проверяется не наличием чего-либо, а отсутствием — отсутствием второй работы, порождённой первой. Мерить отсутствие трудно, и оттого его редко мерят; но платят за него всегда.
Отсроченность здесь не досадная подробность, а само существо дела. Ни один известный мне признак, различимый утром, не говорит, чем кончится встреча результата с системой. Аккуратность изменений не говорит; убедительность объяснения не говорит; зелёные проверки не говорят, потому что проверки — часть той же работы и могли быть приведены к ней. Всё, что можно осмотреть утром, относится к первому критерию. Второй в этот момент недоступен в принципе, и не потому, что я плохо смотрю, а потому, что события, о котором он судит, ещё не произошло.
Отсюда и обман. Красивый ответ на вопрос красив честно: он и есть то, что я покупал. Красивый ответ на поручение красив за чужой счёт. В ту ночь всё было хорошо написано: изменения лежали ровно, объяснение в конце читалось приятно. Первый критерий был удовлетворён полностью — и удовлетворён тем сильнее, чем меньше работы стояло за словами, потому что несделанное не спорит, не путается и не оставляет шероховатостей. Гладкость отчёта и полнота работы связаны слабее, чем хочется думать.
Хуже того, первый критерий поощряет молчание. Работа, сделанная добросовестно, приходит с оговорками: вот здесь я не был уверен; вот это не стал трогать, потому что не понял, зачем оно; вот тут поведение изменилось, и стоит посмотреть. Отчёт с оговорками читается хуже гладкого — он тревожит, требует решений, отнимает те самые минуты, ради экономии которых поручение и давалось. Отчёт без оговорок читается прекрасно и закрывает вопрос. Если я принимаю работу по тому, как она выглядит, то из двух машин мне больше понравится та, которая меньше сомневается вслух, — то есть ровно та, которая хуже замечает собственные промахи. Критерий не нейтрален: он выбирает за меня, и выбирает не в мою пользу.
Скажу точнее, почему половина несделанной работы не выглядит как половина. Сделанное оставляет следы: правки, объяснения, места, где пришлось повозиться. Несделанное не оставляет ничего — у него нет вида, нет объёма, нет строки, на которую можно показать. Оно отсутствует тем же способом, каким отсутствует то, чего и не требовалось. Поэтому работа, выполненная наполовину, предъявляется мне как целая, и предъявляется не из хитрости: изнутри она и есть целая, потому что вторая половина не входила в представление о задаче ни у кого, кто в этой работе участвовал.
Здесь мне возразят разумно: если первый критерий обманывает, применяйте второй. Смотрите не на вид, а на последствия; проверяйте по существу. Возражение верное, и беда его в цене. Проверить поручение по второму критерию значит пройти работу следом — прочесть изменения, понять, отчего каждое сделано, восстановить ход рассуждения и убедиться, что условие выполнено дословно. Это стоит примерно того же, что стоила бы работа своими руками, а часто и дороже, потому что чужой ход мысли восстанавливать труднее, чем вести свой. Я поручал, чтобы этого не делать. Вот почему в жизни второй критерий подменяется первым почти всегда, и подменяется людьми внимательными и добросовестными: не по глупости, а потому, что честная проверка отменяет смысл поручения.
С людьми эту трудность мы обходим не проверкой, а вопросом. Когда работу приносит человек, я редко иду следом по его шагам; я спрашиваю: ты дошёл до конца, ничего не осталось? И полученное «дошёл» кое-чего стоит — за ним годы, репутация, нежелание отвечать потом за собственное слово, а иногда и заметная неохота, с которой оно произносится. Я покупаю не проверку, а поручительство, и это дёшево и обычно работает. Машине я задаю тот же вопрос и получаю то же слово, произнесённое с той же уверенностью, — только за ним не стоит ничего из перечисленного. «Готово» здесь не обещание и не подпись; это отчёт о внутреннем состоянии работы, и точность его равна тому, насколько хорошо работа видит саму себя.
Подмена эта и есть тихое место, в котором решается всё. Я плачу за машину, глядя на её ответы; я принимаю её работу, глядя на её отчёт; и в обоих случаях смотрю на текст, а покупал я не текст. Я покупал состояние системы, в котором ничего не придётся переделывать, и узнаю я о нём не утром, а тогда, когда узнавать поздно и дёшево уже не выйдет.
У этой подмены есть следствие, о котором я долго не думал. Если работу принимают по первому критерию, то разница между машинами по второму не фиксируется никогда. Та, что удержала условие дословно, и та, что перевела его во что-то удобное, утром неотличимы: обе предъявили гладкий отчёт и зелёные проверки. Разойдутся они через месяц — но к тому времени связь между тем вечерним выбором и сегодняшней вознёй уже не восстановить, и никто её не восстанавливает: возня объясняется наследием, спешкой, тем, что модуль был сложный. Опыт, который должен был бы накопиться, не накапливается. Я продолжаю выбирать по ответам не оттого, что упрям, а оттого, что других сведений ко мне не поступает.
Один и тот же результат может быть успехом по первому определению и неудачей по второму, и между этими двумя оценками пройдёт месяц. Всё, что я успею сделать за этот месяц, будет опираться на первую из них.
Утром я кивнул. Записка была короткая и убедительная, изменения — аккуратные, тесты — зелёные, и я закрыл ветку, не читая. Это было разумное решение: я ведь для того и поручал, чтобы не читать. Через две недели выяснилось, что в разборе дат остался случай, до которого никто не добрался, и обошёлся он куда дороже той ночи. Долго после этого я пытался понять, в какой момент следовало поступить иначе, и не находил такого момента.
Момента и не было, потому что ошибка была не в решении, а в мере. Результат поручения — не ответ, на который кивают. Это изменение, вошедшее в систему и никого не заставившее его переделывать. Всё, что мы привыкли ценить в ответах — точность формулировки, складность, полнота изложения, — к поручению относится мало; оно судится не тем, как выглядит, а тем, что после него не пришлось делать заново.
И раз между шагами никого нет, то заметить неверный шаг, пока он ещё стоит копейку, может только тот, кто его сделал. Не я — я сплю. Не коллега — его не позвали. Не проверка — она сама часть работы. Способность остановиться и усомниться в собственном результате оказывается не приятной добавкой к умению писать код, а единственной инстанцией внутри работы, где ошибка ещё может быть остановлена.
Тогда меня занимало другое. Шаги в поручении стоят один на другом: каждый принимает предыдущий за основание и не имеет способа его перепроверить. А если одна машина держится на шаг чуть надёжнее другой — не вдвое, не на порядок, а чуть, — то на работе из многих шагов это «чуть» должно как-то себя вести. Я тогда полагал, что оно ведёт себя так же скромно, как звучит.
Глава 2. Цепь
Разница, о которой мне обычно сообщают, звучит скромно. Одна модель немного точнее, другая немного уступает; отставание выражают в процентах, и проценты выглядят небольшими. Я слышу в этом обещание пропорции: если каждый шаг выйдет чуть хуже, то и работа выйдет чуть хуже, и с этим можно жить. Обещание кажется настолько естественным, что его не проверяют.
Проверять стоит, потому что шаги в поручении зависимы, а зависимое собирается иначе, чем независимое. Мы привыкли судить о качестве по среднему: средний шаг хорош — значит, и работа хороша. Там, где каждый следующий шаг стоит на предыдущем, среднее не решает ничего; решает, выдержали ли все. Разница между «хорошо в среднем» и «выдержали все» — это разница между сложением и умножением, и она растёт с длиной.
Отсюда тянутся ещё три вещи, которые я долго не сводил в одно. Слабое звено не только рвётся чаще — оно заставляет возвращаться, а возвращение добавляет звеньев, и цепь оказывается длиннее той, которую я задумал. Разрыв между сильным и слабым поэтому не линеен: есть длина, за которой отставание перестаёт быть отставанием и становится неспособностью. И само умение держать нить через всю цепь — свойство отдельное, не вытекающее из величины: его либо вырастили, либо нет.
Цепь — вещь старая, и главное её свойство известно всякому, кто что-нибудь ею поднимал. Прочность цепи не складывается из прочности звеньев. Она ими перемножается.
2.1. Сумма и произведение
Интуиция, с которой я подхожу к качеству, устроена как усреднение. Я спрашиваю, сколько раз машина ответила хорошо, и делю на то, сколько раз я спрашивал. Получается доля, доля выглядит как оценка, и оценка ведёт себя разумно: если одна модель отвечает хорошо чуть реже другой, я потеряю чуть больше. Такая арифметика не выдумана из ничего. Она выросла из многолетнего опыта вопроса и внутри вопроса совершенно верна.
Стоит отдать ей должное, прежде чем показывать, где она кончается. Есть целые области, где качество действительно суммируется. Поток обращений, который надо рассортировать по темам; короткие ответы, каждый из которых живёт отдельно; разметка, где один пример не влияет на соседний. Там ошибка остаётся на своём месте, как опечатка на странице: она портит страницу и не портит книгу. Доля верных ответов — честная мера, средний уровень — честное суждение, и человек, который выбирает по такой мере модель подешевле, ведёт себя рационально. Я бы и сам так выбирал, и в этих задачах, подозреваю, до сих пор выбираю.
Так же мы оцениваем и людей. Хороший, но не блестящий сотрудник делает работу немного хуже блестящего: чуть менее аккуратно, чуть менее изобретательно, но делает. Мы даже умеем переводить эту разницу в деньги и говорить, что она их стоит или не стоит. За этим стоит молчаливое допущение, которое почти никогда не проговаривается: что работа делится на куски, что куски независимы и что плохо сделанный кусок можно найти и переделать, не трогая остальные.
Привычку поддерживает и то, как качество мне сообщают. Оно приходит ко мне долей: столько-то решённых задач из стольких-то предложенных, одно число на модель, удобное для сравнения. Доля хороша тем, что её можно поставить рядом с ценой и получить отношение, которое выглядит как ответ. Но доля устроена так, что задачи в ней равноправны и независимы: каждая идёт в счёт отдельно, промах по одной не касается остальных. Мера сама несёт в себе допущение о независимости, и я перенимаю это допущение вместе с ней, не замечая, что перенимаю. Число получено на наборе, а применяю я его к цепи.
Поручение устроено иначе. Это не набор отдельных ответов, а один результат, собранный из множества зависимых движений. Он существует, если выдержали все; если не выдержало одно — его нет. И вопрос, который здесь уместен, звучит не «как часто машина права», а «какова вероятность, что она права подряд». Второй вопрос получается из первого умножением, и умножение — единственная операция, которая тут работает. Ничего не складывается. Каждый новый шаг — ещё один множитель, и каждый множитель тянет произведение вниз, даже когда сам по себе выглядит прекрасно.
Умножение не утверждает, что машина плоха; оно утверждает, что длина имеет вес. Надёжность, которой более чем достаточно для одного движения, может оказаться недостаточной для длинной работы — не потому, что надёжность упала, а потому, что движений стало много. Величина, которая описывает шаг, и величина, которая описывает работу, — разные величины, и вторая не равна первой, даже примерно.
Держится привычка суммировать ещё и оттого, что работу машины я вижу шагами. Я смотрю, как она идёт, и каждое её движение по отдельности выглядит толково: разумно объяснила, куда смотрит; аккуратно нашла нужное место; внятно сказала, что собирается сделать. Впечатление растёт, пока я смотрю, и растёт оно именно сложением — хороший шаг, ещё хороший шаг, ещё. К середине работы у меня складывается уверенность, которая ощущается как знание о результате, хотя она не о результате вовсе; она о среднем качестве того, что я успел увидеть. Результат тем временем собирается умножением, за которым никакого впечатления не следует: умножению нечего показывать по дороге.
Цепь вспоминают обычно ради слабейшего звена: цепь не прочнее его, и это правда. Но меня давно занимает другой случай — тот, где слабейшего звена нет. Возьмите цепь, в которой все звенья откованы одинаково и ни одно не выделяется изъяном; каждое проверено и признано надёжным. Такая цепь всё равно менее надёжна, чем любое её звено, и тем менее, чем она длиннее. Ей не нужен брак, чтобы порваться; ей достаточно длины. Мастер, который клянётся за каждое звено в отдельности, ещё ничего не сказал о цепи, и говорит он это совершенно искренне.
Люди, которые имеют дело с цепями всерьёз, это знают и потому испытывают цепь целиком. Её нагружают в сборе, под нужным весом, и смотрят, что будет; никому не приходит в голову испытать звенья по одному, сложить результаты и выдать заключение о готовом изделии. Заключение о звене — не заключение о цепи, и разница между ними тем больше, чем длиннее изделие. С моделями я долгое время поступал наоборот: судил по звену, покупал цепь.
Второй образ ближе к обыденной жизни, и в нём та же арифметика видна без всякого железа. Дорога с пересадками, каждая из которых взята с приличным запасом времени. Ни один отрезок не выглядит рискованным; о каждом в отдельности я сказал бы, что всё будет хорошо. Но опоздание на любую пересадку срывает не отрезок, а поездку целиком: дальше едет расписание, а не я. Опытные путешественники поэтому не спрашивают, насколько надёжен средний рейс. Они спрашивают, сколько пересадок. Они считают в правильной единице, не зная, что делают что-то особенное.
Запас времени в этом образе — отдельно поучительная вещь. Он ощущается как страховка, и на каждом отрезке она настоящая: небольшая задержка съедается запасом, и ничего не происходит. Но запасы не складываются в общий фонд. Время, оставшееся лишним на ранней пересадке, ничем не поможет на поздней: оно потрачено на ожидание и не переносится. Страховка работает поштучно, а срывается маршрут целиком, и в этом несовпадении вся суть дела. Всё, чем я укрепляю отдельное звено, остаётся при этом звене; то, что я теряю, теряется сразу по всей цепи.
И здесь стоит остановиться на том, почему я вообще беру цепь, а не набор. В поручении шаги зависимы не по стечению обстоятельств, а по устройству работы. Прежде чем править, машина читает и решает, что происходит; правка опирается на это решение. Проверка опирается на правку: запускается то, что написано, и смотрится то, что запустилось. Откат опирается на проверку: чтобы вернуться, нужно понять, что вернуться следует. Порядок нельзя переставить, шаги нельзя развести по разным столам и делать одновременно, результат одного — материал для другого.
Поручение «найди дефект и добейся, чтобы тесты стали зелёными» выглядит как одно дело, а разворачивается в длинный ряд. Машина читает описание и решает, что именно сломано. Ищет, где это может жить, и выбирает, какие файлы читать; прочитанное сужает поиск, сужение задаёт следующее чтение. Находит подозрительное место и решает, оно ли виновато. Правит. Запускает проверку. Читает, что проверка сказала, и решает, означает ли сказанное успех — а это отдельное решение, потому что проверка может позеленеть и от того, что правка сделала её беззубой. Не означает — решает, возвращаться ли к правке или к диагнозу. И так по кругу, пока не сочтёт, что закончила, и не сообщит об этом. Каждый пункт здесь опирается на предыдущий: он берёт его вывод как вход.
Заметьте, чего в этом ряду больше. Правок в нём мало, а решений много: что читать, где искать, то ли это, достаточно ли, вернуться или идти дальше, закончено или нет. Действие оставляет след, который можно посмотреть; решение следа не оставляет. И если я, глядя на работу машины, считаю звеньями изменённые файлы и запуски проверок, я считаю малую часть цепи и удивляюсь потом, откуда взялся разрыв.
Из этого следует вещь, которую я осознал позже, чем стоило бы. Ошибка в зависимой работе не остаётся ошибкой. Она становится предпосылкой. Неверно понятое условие не портит анализ — анализ по-своему безупречен; оно делает безупречной правку, исполняющую неверное намерение. Проверка после такой правки честно проверяет не то, что нужно, и честно сообщает, что всё в порядке. Каждый последующий шаг выполнен добросовестно и опирается на предыдущий, и вся эта добросовестность работает на то, чтобы ошибка стала незаметнее. К концу она уже не выглядит ошибкой; она выглядит решением.
Между шагами никого нет, и потому зависимость работает без помех. В работе, которую люди делают вместе, цепь то и дело разрывают взглядом: кто-то читает промежуточный результат, спрашивает, зачем сделано так, и ошибка кончается на своём шаге, не успев стать предпосылкой. Взгляд — не звено, а разрез; он превращает одну длинную цепь в несколько коротких, а короткие ведут себя почти как независимые, и к ним возвращается арифметика среднего. Убрав человека из середины, я убрал не одного работника. Я склеил короткие цепи в одну длинную и заменил сложение умножением, а сэкономленное на работнике записал в выгоду, не заметив, чем за неё плачу.
Мне возразят, что я описываю худший случай: настоящая работа не бывает такой хрупкой, в ней есть проверки, откаты, здравый смысл, возможность заметить и вернуться. Возражение справедливо, и с ним ещё придётся считаться всерьёз. Пока замечу лишь, что всё перечисленное — тоже шаги. Средства, которыми цепь спасают от разрыва, сделаны из того же материала, что и сама цепь.
Умножение — слово короткое, и согласиться с ним ничего не стоит. Соглашаются обычно быстро, кивают и продолжают считать по-старому, потому что согласие в уме и ощущение в руках — разные вещи. Чтобы это перестало быть словом, его нужно произнести до конца: взять звено, которое не жалко назвать надёжным, взять цепь, которую не жалко назвать длинной, и сказать вслух, что выходит.
2.2. Одна иллюстрация с числами
Числа в разговоре о моделях стареют быстрее всего остального, и я стараюсь их не трогать. Но есть одно место, где без числа не обойтись, потому что умножение нельзя почувствовать на словах: пока не произнесёшь, что выходит, слово «перемножается» остаётся вежливым согласием. Поэтому дальше идут числа. Они условные и круглые; ни одно из них не описывает конкретную модель и ни одно не взято из замеров. Замеры, которые были у меня под рукой в 2026 году, для этого разговора и не годились: наборы задач того времени измеряли в основном короткие цепи, а на короткой цепи расхождение между уровнями надёжности почти не проступает. Важны в них не значения, а то, что с ними делает длина.
Возьмём три уровня надёжности звена. Очень высокий — звено выдерживает девяносто девять раз из ста. Высокий — девяносто семь. Средний — девяносто пять. В разговоре эти три уровня неразличимы: про все три я сказал бы, что машина работает хорошо. Теперь возьмём три длины цепи: короткая — пять звеньев, средняя — двадцать, длинная — сотня. На короткой цепи очень высокий уровень доходит до конца примерно девяносто пять раз из ста, высокий — восемьдесят шесть, средний — семьдесят семь. На средней цепи очень высокий доходит восемь раз из десяти, высокий — чуть чаще, чем раз через раз, средний — чуть чаще трети. На длинной цепи очень высокий доходит примерно раз из трёх, высокий — раз из двадцати, средний — шесть раз из тысячи.
На короткой цепи все три уровня ведут себя прилично. Разница между лучшим и худшим есть, но она из тех, что списывают на невезение: сегодня не получилось, завтра получится. Человек, который пробует модель на коротких задачах — а пробуют всегда на коротких, ведь их удобно повторить и легко проверить, — увидит три раза примерно одно и то же и сделает вывод, который кажется ему осторожным и взвешенным: разница невелика, платить за неё не за что. Я делал такой вывод и не считаю его глупым. Он верен ровно для той длины, на которой получен.
Стоит представить, как выглядит такая проверка. Берётся задача, которую нетрудно объяснить и быстро оценить: починить понятную поломку, дописать недостающую ветку, привести кусок к другому виду. Её дают обеим машинам, смотрят на результат, иногда повторяют для верности. Обе справляются; у дорогой чуть аккуратнее вышли имена и комментарии, у дешёвой чуть больше лишнего, но работает и то, и другое. Дальше происходит вещь, которую я за собой знаю: я сравниваю то, что увидел, с тем, что написано в счёте, и вывод складывается сам. При этом я сравнил модели на длине, для которой их не беру.
На средней цепи картина начинает расходиться. Верхний уровень ещё уверенно доходит; нижний доходит реже, чем не доходит. Это уже не невезение, это поведение: с одной машиной задача обычно закрывается, с другой обычно нет. Причём ни одно отдельное звено не стало хуже, чем было на коротком примере; звенья те же самые, изменилось число сомножителей.
Полезно понимать, чему эти длины соответствуют в работе. Короткая цепь — это одна правка в одном файле с проверкой: прочитать, понять, изменить, запустить, посмотреть. Средняя — изменение, которое проходит через несколько модулей: там приходится держать в голове, что уже тронуто, что из этого потянуло за собой соседнее, и почему одно место чинится не так, как похожее на него другое. Длинная — работа, которую я оставляю машине на ночь: разобрать незнакомое, провести одно и то же изменение по всему проекту, довести до зелёного состояния то, что зелёным не было давно. Длинная цепь — не редкость и не крайний случай. Это обычный размер поручения.
На длинной цепи от прежней картины не остаётся ничего. Верхний уровень доходит до конца в меньшинстве случаев — и это, замечу, уровень, который мы назвали очень высоким. Средний уровень не доходит практически никогда: не «реже», не «хуже», а никогда, если говорить о повседневном опыте, а не о теории вероятностей. Разница между звеном, которое держит девяносто девять раз из ста, и звеном, которое держит девяносто пять, — это разница, которой не слышно в разговоре и не видно на демонстрации. На длинной цепи она превращается в разницу между «иногда получается» и «не получается никогда».
Разница, которой не видно в звене, видна в цепи.
Здесь важно не перепутать, что именно показывает эта арифметика. Она не говорит, что слабая модель хуже пишет код: на каждом отдельном шаге она пишет почти так же. Она говорит, что качество шага и качество работы связаны нелинейно, и что связь эта тем круче, чем длиннее работа. Расхождение растёт неровно: на первых звеньях машины почти неразличимы, и потому начало любой длинной задачи выглядит одинаково успешным независимо от того, кому её поручили. Копится оно в середине и делается очевидным к концу, то есть ровно тогда, когда отменять решение поздно.
Значения здесь можно менять как угодно, и через год их придётся менять: звено станет надёжнее, цепи, которые мы решаемся поручать, станут длиннее, и числа разъедутся. Форма останется той же. Всегда найдётся длина, на которой любые два уровня надёжности неразличимы, и всегда найдётся длина, на которой они несравнимы; между этими двумя длинами лежит участок, где ответ на вопрос «стоит ли платить больше» меняется на противоположный, не меняя при этом ни одной цены. Оттого и бессмысленно спорить о моделях вообще, не назвав длину. Это вопрос не о том, какая машина лучше, а о том, на чём её меряли.
И вот тут возражение, которое я слышу чаще всего и которое считаю сильным. Настоящий агент — не одноразовый бросок костей. Он не идёт по цепи вслепую: он запускает проверку и видит, что она красная; он читает сообщение об ошибке и возвращается; он пробует другой путь, когда первый не вышел. Способность восстанавливаться после неудачного шага — главное, что отличает поручение от одного длинного ответа, и человек, который на это указывает, указывает на правду. Умножение в чистом виде описывает цепь, в которой нет починки, а в настоящей работе починка есть, и она действительно спасает множество прогонов, которые иначе кончились бы ничем.
Возражение верно, и оно не отменяет арифметики, а меняет то, что в неё подставляется. Восстановление не стоит вне цепи; оно сделано из звеньев. Чтобы вернуться, машина должна сперва заметить, что что-то не так, — это звено, и, кстати, самое ненадёжное из всех: заметить труднее, чем сделать. Проверка покраснела — и надо ещё решить, покраснела ли она от сделанного сейчас или была красной с утра; сообщение об ошибке указывает на строку, но виновата обычно не она; тишина вместо ошибки означает либо что всё хорошо, либо что сломано в месте, куда проверка не заглядывает. Потом решить, к какому месту возвращаться, — ещё звено; вернуться не туда означает чинить здоровое, оставив больное. Потом выбрать другой путь — звено. Потом пройти этот путь заново — столько звеньев, сколько в нём шагов. Починка — не действие, отменяющее неудачу, а участок цепи, пристроенный к месту разрыва, и у этого участка своя надёжность, обычно не выше, чем у основного.
Поначалу это неочевидно: восстановление повышает шанс дойти на коротком отрезке и одновременно удлиняет всю дорогу. Каждая попытка, которая не удалась и была переделана, оставляет за собой не пустоту, а лишние звенья: прочитанное заново, написанное и стёртое, проверку, запущенную дважды. Цепь, по которой машина прошла в действительности, всегда длиннее той, которую я описал в поручении, — и тем длиннее, чем чаще ей приходилось возвращаться. Слабое звено, таким образом, наказывает дважды: один раз тем, что рвётся, и второй раз тем, что удлиняет цепь, в которой рвутся остальные. Второе наказание тише первого и потому долго остаётся незамеченным: разрыв виден, а лишняя длина выглядит как обычная работа.
2.3. Слабое звено удлиняет цепь
Лишние звенья появляются не от катастроф. Катастрофа — это когда цепь порвалась и работа встала, и такое видно сразу. Лишние звенья появляются от мелочей, каждая из которых по отдельности сходит за добросовестность. Машина потеряла нить и перечитала то, что уже читала. Изменила место, забыла, что изменила, и вернулась посмотреть. Не поняла по сообщению об ошибке, где именно сломалось, и расширила поиск на соседние файлы. Сделала правку, засомневалась в ней, отменила, сделала почти такую же. Ни одно из этих движений не является ошибкой в обычном смысле; ни одно не сорвало работу; каждое добавило к цепи по звену.
Самое частое из этих движений — перечитывание. Машина открывает файл, который открывала полчаса назад, и читает его заново, потому что от прежнего чтения у неё мало что осталось. Иногда она перечитывает то, что сама же и написала, и читает свою правку как чужую: пытается понять, зачем так сделано, и выводит замысел из результата. Это занятие безобидно на вид и разрушительно по сути, потому что замысел, выведенный из результата, всегда чуть отличается от исходного, и дальше машина идёт уже с этим чуть другим замыслом. Каждое перечитывание — не возврат в прежнюю точку, а переход в соседнюю, немного сдвинутую.
Слабое звено, таким образом, производит не только разрывы. Оно производит работу. Причём производит её тихо и убедительно: перечитать — разумно, перепроверить — похвально, уточнить — осмотрительно. Тот, кто наблюдает за происходящим со стороны, видит машину, которая старается, и старание вызывает доверие. Разница между «старается, потому что задача трудная» и «старается, потому что не удержала уже сделанное» с виду никакая, а по существу это разные вещи, и различить их можно лишь по тому, сколько из проделанного было проделано впервые.
Отсюда получается петля, которую я долго не замечал, хотя смотрел на неё каждый день. Слабость добавляет звеньев. Добавленные звенья удлиняют цепь. Удлинённая цепь чаще рвётся — не потому, что в ней что-то испортилось, а потому, что сомножителей стало больше. Каждый новый разрыв требует нового возвращения, и возвращение снова добавляет звеньев. Слабость увеличивает длину, длина усиливает слабость, и обе стороны этого обмена работают в одну сторону — против того, чтобы цепь была пройдена.
Петля эта не бесконечна, и кончается она одним из двух. Либо цепь всё-таки доходит до конца — и тогда никто не считает, сколько раз машина ходила по кругу: результат есть, и он закрывает вопрос. Либо она упирается в предел, поставленный человеком: в отведённое время, в терпение того, кто ждёт, в границу, за которой прогон решают остановить. Второй исход выглядит как «не справилась», хотя формально машина не ошиблась ни разу: каждое её движение было уместным, а работа не кончилась, потому что кончилась раньше, чем цепь. И это, пожалуй, самая честная картина того, как слабость проявляет себя в длинном деле: не как неверный ответ, а как работа, которая не сходится к концу.
У петли есть неприятная особенность: изнутри она неотличима от усердия. Работа идёт, движение есть, отчёты приходят, и то, что цепь растёт быстрее, чем движется к концу, снаружи не читается. Наблюдатель видит поток действий и по нему судит о продвижении, а действия — плохая мера продвижения, когда часть из них возвращает туда, где машина уже была. Я видел прогоны, в которых происходило очень много всего и не происходило ничего.
Есть и вторая причина, по которой рост цепи трудно заметить со стороны. Растёт вместе с ней и рассказ о работе: отчёт машины о сделанном становится обстоятельнее, в нём появляются оговорки, уточнения, описания того, что было проверено и отвергнуто. Обстоятельный отчёт мы привыкли читать как признак тщательности, а он в этом случае — слепок пройденных кругов. Чем длиннее вышла цепь, тем убедительнее выглядит её описание, и убедительность растёт ровно в том направлении, в котором убывает надёжность.
Одна такая история мне запомнилась. Машине поручили провести через проект переименование — из тех задач, где нет ни одного трудного места, а трудность вся в том, чтобы не забыть ни одного простого. Она пошла файл за файлом и делала всё верно. Но проект был старый, и в нём жило соглашение, нигде не записанное: в одних местах имя писалось одним образом, в других — другим, и второе было наследством давнего слияния двух частей. Машина натыкалась на это несоответствие, останавливалась, перечитывала окрестности, выводила правило заново и шла дальше. Вывела она его трижды и трижды по-разному, потому что каждый раз читала другой участок и получала другое большинство. К утру переименование было проведено. В трёх местах проекта оно было проведено в трёх разных вариантах, и каждый из них внутри своего участка выглядел последовательным.
Работа была сделана, ни один шаг не был выполнен плохо, и, если считать по шагам, надёжность машины в ту ночь была превосходной. Дело не в шагах. Дело в том, что удержание одного правила через всю дорогу — это не свойство шага, а свойство прохождения; там, где его не хватает, правило приходится восстанавливать заново, и каждое восстановление есть новое звено, а новое звено — новый повод разойтись с предыдущим. Цепь, которую я задумал, была длиной в число файлов. Цепь, которую машина прошла, была длиннее, и разница между ними была ровно тем местом, где поселилась ошибка.
Сильные машины ошибаются тоже. Это стоит сказать прямо, потому что иначе картина выходит слишком удобной: одни ошибаются, другие нет. Ошибаются все, и на отдельном шаге разница между ними невелика. Разница в другом: в длине шлейфа, который тянется за ошибкой. У одной ошибка кончается там же, где началась: машина замечает несоответствие в ближайшие шаги, возвращается в нужное место, чинит и идёт дальше, и цепь вырастает на несколько звеньев. У другой ошибка не замечается, работает дальше как предпосылка, и обнаруживается поздно, когда на ней уже стоит половина сделанного; возвращение тогда отматывает не шаг, а участок, и заново проходить приходится всё, что на нём стояло.
Поэтому качество в цепи меряется не частотой промахов, а тем, сколько работы порождает один промах.
Тут и сама цепь перестаёт быть спокойной. Обычная цепь — вещь неизменная: сколько звеньев отковали, столько и есть, и под нагрузкой она либо держит, либо рвётся. Цепь, о которой я говорю, ведёт себя иначе: она достраивается на ходу, и достраивает её то самое место, которое хуже всего держит. Каждый раз, когда слабое звено подаётся, к нему приковывают ещё несколько — чтобы обойти, чтобы починить, чтобы вернуться и попробовать снова, — и все они выкованы из того же материала и той же рукой. Нагрузка не разрывает такую цепь. Она её удлиняет, и удлиняет с той стороны, где тонко.
Две обычные интуиции о надёжности здесь, кстати, расходятся. Первая говорит: важно не ошибаться. Вторая говорит: важно уметь исправляться. В коротком деле они дают почти одинаковый ответ, потому что и ошибок мало, и исправлять недалеко. В длинном они расходятся: способность заметить оказывается дороже способности не промахнуться, поскольку незамеченное множится, а замеченное кончается. Машина, которая ошибается чаще, но ловит себя сразу, пройдёт длинную цепь надёжнее той, которая ошибается реже, но не ловит вовсе.
Я говорю здесь только о вероятности — о том, дойдёт цепь до конца или нет. Лишние звенья имеют и другую сторону: каждое из них чем-то оплачено, и счёт за них приходит не туда, куда смотрят. Эта сторона важнее, чем кажется, и счёт по ней ещё придёт.
Остаётся то, что видно уже сейчас. Слабость и длина не складываются в общую тяжесть — они разгоняют друг друга, а разгон не бывает пропорциональным. Значит, и разница между слабым и сильным не может расти ровно вместе с длиной работы: там, где две величины усиливают одна другую, рано или поздно находится место, в котором количество перестаёт быть количеством.
2.4. Порог
Вывод «разница невелика» рождается не из лени и не из жадности. Он рождается из опыта, и опыт этот настоящий. Почти всё, что я делал с машинами до того, как стал им поручать, лежало на коротких длинах: спросить, как устроена незнакомая библиотека; попросить набросать функцию; дать кусок и услышать, что в нём не так; получить подсказку в редакторе прежде, чем успел додумать строку. В этих делах человек стоит рядом на каждом шаге, цепь не успевает вырасти, и разница между машинами действительно измеряется в оттенках. Выводы, сделанные на этой территории, честные. Их беда в том, что они переезжают вместе с нами на другую территорию и там продолжают звучать так же уверенно.
Мало того, до порога дешёвое нередко приятнее. Оно отвечает быстрее, а скорость в коротком деле ощущается как качество: меньше ждёшь, чаще пробуешь, живее идёт работа. Оно не растекается в рассуждениях, а сразу даёт ответ — и на коротком деле это достоинство, потому что рассуждать там особенно не о чем. Человек, сравнивший обе машины на своих привычных делах, получает не только вывод «разница невелика», но и лёгкое подозрение, что дорогая перемудрила. Подозрение это заслуженное, и ошибка в нём одна: сделан он в единицах шага, а решение принимается о цепи.
С ростом длины расхождение между машинами растёт не равномерно, и в какой-то момент оно перестаёт быть расхождением. Есть длина, до которой всё выглядит как отставание: слабая приходит к тому же результату дольше, с бо́льшим числом возвратов, с чуть худшими деталями — и приходит. И есть длина, за которой она не приходит вовсе. Между этими двумя состояниями нет плавного перехода, который можно было бы измерить в долях; переход занимает узкую полосу, и по ту её сторону меняется не количество, а род поведения.
Порог — не свойство машины и не свойство задачи. Это место их встречи: у каждой машины есть длина, которую она держит, и задача либо короче этой длины, либо длиннее. Оттого спор «какая модель лучше» без указания длины напоминает спор о том, какая верёвка крепче, без указания, что на ней поднимают. Верёвка, которая держит ведро, и верёвка, которая держит человека, — это может быть одна и та же верёвка, и вопрос решается не ею, а грузом.
Такое поведение известно всякому, кто имел дело с материалом. Балка под растущим грузом сначала прогибается, и прогиб пропорционален: добавил вес — опустилась чуть ниже, и по тому, насколько опустилась, можно судить, сколько ещё выдержит. До определённого места она ведёт себя предсказуемо и даже любезно, показывая, как ей тяжело. Потом кончается упругость, и дальше идёт не прогиб, а излом; между «сильно прогнулась» и «сломалась» нет промежуточных состояний, в которых можно постоять и подумать. Самое неприятное в этом переходе не то, что он резкий, а то, что он приходит после длинного участка, на котором всё было понятно и измеримо. Привычка доверять прогибу и подводит.
Зрелище за порогом оказалось неожиданным. Я ждал, что увижу учащение ошибок: те же действия, но чаще неудачные. Видно другое. Машина за порогом начинает делать не то же самое хуже, а другое. Она сужает задачу до той части, которую способна удержать: берёт первый кусок, делает его хорошо и объявляет, что остальное в изменениях не нуждается. Она принимает за условие последнее, что видела, а не то, что было сказано вначале. Она чинит признак вместо причины, потому что признак рядом, а причина далеко. Она ходит по кругу, каждый раз чуть иначе формулируя одну и ту же догадку. И она ни разу не сообщает, что упёрлась. Она сообщает, что готово.
Это и есть главное неудобство порога: по ту сторону от него отказ не выглядит отказом. Цепь не обрывается с грохотом — она заканчивается там, где машина решила, что дошла. Сообщение об успехе за порогом ничем не отличается от сообщения об успехе до него; отличается только то, что за ним стоит. Умение честно сказать «я не справилась» требует того же самого, чего не хватило для работы: удержать в голове, что было поручено, и сравнить с тем, что получилось. Чем меньше машина способна пройти цепь, тем меньше она способна и заметить, что не прошла.
Узким переход делают две силы сразу. Произведение падает тем круче, чем больше в нём сомножителей, — это одна. Слабость добавляет звеньев, а добавленные звенья добавляют поводов для новой слабости — это вторая, и она разгоняет первую. Пока цепь коротка, обе почти не работают: сомножителей мало, возвращаться некуда и незачем. Дальше они входят в силу одновременно и умножаются одна на другую, а произведение двух ускорений не даёт склона — оно даёт обрыв. Порог, таким образом, не отдельное явление, которое нужно объяснять чем-то новым. Это то, как выглядит перемножение, если смотреть на него со стороны, не зная, что оно перемножение.
Всё это, скажут мне, лечится дроблением: разбейте длинную работу на короткие куски, и каждый кусок окажется до порога. Возражение сильное, и в нём есть правда — дробление работает и им пользуются все, включая меня. Но стоит увидеть, чем платят. Куски надо кем-то соединять: решать, на какие части резать, проверять результат каждой перед началом следующей, держать в голове общий замысел, который ни в одном куске целиком не содержится. Всё это делает человек, и делает ровно между шагами. Дробя цепь, я не укорачиваю её — я возвращаю себя внутрь неё. Поручение превращается обратно в череду вопросов, и вместе с ним исчезает то, ради чего оно затевалось: возможность уйти и не смотреть.
Задачи по ту сторону порога описать нетрудно: это и есть те задачи, ради которых заводят поручение. Изменение, проходящее через несколько модулей, где правка в одном месте требует согласованной правки в трёх других, а какое именно место четвёртое — выясняется только по дороге. Незнакомая база, где половина правил нигде не записана и выводится из того, как сделано вокруг, — и выводить их надо на ходу, не теряя по пути ни одного. Поломка, которая не воспроизводится по команде: её нельзя поймать, можно только построить догадку, поставить наблюдение, дождаться, отбросить догадку и построить следующую — и так столько раз, сколько потребуется, ни разу не забыв, что уже отброшено. Миграция по всему проекту, где трудность не в отдельном шаге, а в том, чтобы одинаковое сделать одинаково везде.
Короткие дела я не поручаю. Их я делаю сам — потому что объяснить машине короткое дело дольше, чем сделать его. Поручаю я именно длинное: то, что не помещается в один присест, то, от чего хочется уйти и вернуться к готовому. Выходит, что вся территория, на которой я выбирал модель, и вся территория, на которой я собирался ею пользоваться, не пересекаются.
Есть, впрочем, деталь, которая мешает увидеть порог даже тому, кто о нём знает. За порогом вероятность дойти не равна нулю; она мала, но не пуста. Значит, случаются удачные прогоны: слабая машина берётся за длинное дело и доводит его до конца, и человек, наблюдавший такой прогон, получает доказательство того, что всё работает. Доказательство это настоящее — работа действительно сделана. По одному прогону, однако, различить «может» и «иногда получается» невозможно, а различие между ними для поручения решающее: я отдаю работу машине затем, чтобы не смотреть, а «иногда получается» означает, что смотреть придётся каждый раз. Порог виден не в одном прогоне, а в череде одинаковых, и потому его обычно не видят: череду одинаковых длинных прогонов никто не устраивает.
Одно поручение я давал дважды, с разницей в несколько дней и двум разным машинам. Нужно было провести через незнакомый проект изменение, затрагивающее несколько модулей: разнести по-новому то, что раньше лежало в одном месте, и не сломать по дороге ничего из того, что на это опиралось. Первая машина работала долго и нудно, дважды возвращалась к сделанному, один раз призналась, что не уверена в одном месте, и назвала его. К концу изменение было проведено целиком, и я нашёл в нём одну ошибку — в том самом месте, о котором была оговорка. Вторая работала быстрее и ровнее, вернулась всего однажды, отчиталась раньше и написала в отчёте фразу, которую я запомнил дословно: остальные модули в изменениях не нуждаются. Модули нуждались. В них лежало то же самое, разнесённое иначе, и увидеть это можно было, лишь удерживая рядом оба способа, которыми в этом проекте делали одно и то же.
Обе машины сказали «готово». Одна сказала это о работе, сделанной целиком, с названным сомнением в одном месте; другая — о трети работы, названной целым. Разница между ними — не в аккуратности, не в знании языка и не в качестве отдельной правки: правки у второй были лучше. Разница в том, до какого места каждая из них дошла, оставаясь при том, что ей поручили.
Отсюда и главный вывод. Судить о машине по задачам до порога — значит судить не о том, ради чего её берут. Сравнение, проведённое на коротком, измеряет реальное свойство, но не то, за которое платят; оно отвечает на вопрос, который я не задавал. И цена, поставленная рядом с таким сравнением, создаёт отношение, выглядящее убедительно и не значащее ничего: числитель взят из одной работы, знаменатель относится к другой.
Заметно и то, что делается с самим вопросом. «Зачем платить больше, если обе умеют писать код» — вопрос осмысленный и трудный, пока речь идёт о коротком: там обе действительно умеют, и разница между ними стоит ровно столько, сколько стоит аккуратность. За порогом вопрос теряет ту форму, в которой его задавали. Речь идёт не о том, насколько одна лучше другой, а о том, доходит она или нет; не о качестве результата, а о его наличии. Сравнивать по-прежнему можно, но сравнение из шкалы превращается в различение: с этой стороны черты — работа, которую приняли, с той — работа, которую объявили сделанной. Между ними нет процентов.
Мера должна лежать по ту сторону порога. Это неудобно: задачи за порогом долгие, их трудно повторить, результат у них не сводится к отметке «верно — неверно», и оценивать их приходится так, как оценивают чужую работу, а не так, как проверяют ответ. Неудобство не отменяет правила. Меряют на том грузе, который собираются поднимать.
Остаётся вопрос. Если способность пройти длинную цепь не следует ни из скорости, ни из качества отдельной правки — тех самых свойств, по которым обычно и выбирают, — то из чего она следует и почему у одних машин её больше, чем у других.
2.5. Отступление: качество — не размер
Возьмём две машины, у которых совпадает всё, что принято сравнивать. Одна величина — то, что называют размером, и что в разговорах служит главной мерой серьёзности. Одно устройство внутри: те же принципы, то же семейство, та же школа. Почти одно время появления, так что ни одна не могла воспользоваться тем, чего не знала другая. На коротких делах они и ведут себя одинаково: отвечают похоже, ошибаются в похожих местах, и, поставленные рядом, выглядят как две копии одной вещи. Случай этот не выдуман: обе машины были открытыми и вышли с разницей в несколько месяцев. На длинной цепи одна доходит, а другая — в разы реже.
Объяснить это величиной нельзя: величина у них общая. Устройством — тоже: оно общее. Остаётся то, что делали с машиной после того, как она была сделана, — и это оказывается решающим. Языку её научили примерно одинаково; разошлись они в другом обучении, которое идёт следом и на которое смотрят меньше, потому что оно не выражается ни одним числом. Одну приучали доводить дело до конца: возвращаться к поручению, сверяться с ним, замечать, что сделанное разошлось с задуманным, признавать, что упёрлась. Другую не то чтобы отучали — этим занимались меньше, потому что оценивали её по коротким ответам, а в коротком ответе ничего из перечисленного не требуется.
Видно это и по тому, чему каждую из них было выгодно научиться. Если машину оценивают по одному ответу, лучшее, что она может в себе вырастить, — умение делать ответ хорошим с виду: полным, стройным, уверенным. Умение остановиться и сказать «здесь я не уверена» при такой оценке ничего не приносит, а иногда и мешает: уверенный ответ нравится больше. Если же её гоняют по длинным делам, где результат либо принят, либо нет, выгодным становится противоположное: проверять себя, возвращаться, называть сомнительные места, не объявлять готовым недоделанное. Выходит не разница в способностях, а разница в том, что каждой из них было выгодно, и эта выгода в них застывает.
Разница получается похожей на ту, что бывает между двумя выпускниками одной школы. Учились в одном классе, у тех же преподавателей, с одинаковыми отметками; знают они, если проверять по отдельности, примерно одно и то же. Но один доводит работу до конца, а другой бросает её на середине — не от неспособности, а оттого, что середина скучна, а мысль ушла в сторону. Проверка знаний покажет их равными. Любая настоящая работа покажет разными. И если спросить, откуда берётся это отличие, ответ будет не про способности, а про то, что одному это где-то поставили, а другому нет.
В ремесле это ставят руками. Мастер заставляет ученика переделывать не потому, что сделано плохо, а потому, что брошено на середине; не потому, что ошибся, а потому, что не проверил; не потому, что не знал, а потому, что не сказал, что не знает. Ни одно из этих требований не добавляет знания. Все они добавляют того, что потом называют надёжностью и принимают за черту характера. Ученик, которого так вели, и ученик, которого не вели, через несколько лет отличаются не тем, что знают, а тем, чем кончаются их работы.
Удержание нити — свойство такого же рода. Оно не выводится из величины, не выводится из владения языком и не выводится из качества отдельного ответа. Оно состоит из вещей, которые на коротком деле незаметны и потому кажутся необязательными: помнить условие в его исходном виде, а не в том, в какой оно переформулировалось по дороге; замечать расхождение между тем, что сделано, и тем, что поручено; не считать законченным то, что закончено частично; уметь сказать, что не вышло. Всё это — не следствие ума, а привычки, и привычка либо выращена, либо нет.
Незаметно оно по понятной причине: в коротком деле удерживать нечего. Условие стоит перед глазами, от начала до конца проходит немного времени, и забыть его за этот срок невозможно даже при желании. Всё, что требуется, — ответить хорошо один раз, и машина, у которой ничего, кроме этого умения, не выращено, выглядит здесь безупречно. Свойство, которого нет, не оставляет в коротком деле следа — как не оставляет следа отсутствие выносливости у того, кого попросили пройти по комнате. Проверить выносливость можно только расстоянием, и никакого другого способа для неё не придумано.
Оттого я и называю это отдельным свойством: оно может присутствовать или отсутствовать независимо от остальных. Машина бывает изобретательной и несобранной. Бывает знающей и неспособной довести. Бывает и обратное, хотя реже: скромная в разговоре и упрямая в работе. Портреты эти узнаваемы, если работал с несколькими машинами подряд. Одна придумывает изящные решения, каких я бы не нашёл, и на середине дороги начинает решать не ту задачу, что была поставлена, а соседнюю, которая показалась ей интереснее. Другая пишет скучно, предсказуемо, без единой находки, но к концу приносит ровно то, о чём договаривались, и честно перечисляет два места, где сомневается. По разговору первая производит куда лучшее впечатление. По результату длинной работы вторая надёжнее, и разрыв между этими двумя оценками тем шире, чем длиннее работа.
Мы привыкли представлять качество машин одной шкалой, на которой все они выстроены от слабой к сильной, и одной ручкой, которой двигают по этой шкале. Там, где речь о цепи, шкала расслаивается, и позиция на одной её полосе мало говорит о позиции на другой.
Тут напрашивается мысль, что недостающее можно добавить снаружи: если машина не проверяет себя, велите ей проверять. Я пробовал, и это работает хуже, чем хочется. Попросить можно, и машина согласится — согласится охотно и подробно, перечислив, что именно будет делать. Но исполнение просьбы само есть звено цепи: чтобы проверить себя на сороковом шаге, надо на сороковом шаге помнить, что обещала на первом. Та, у которой это выращено, помнила бы и без просьбы. Та, у которой не выращено, забудет и просьбу — обычно в том же месте, где забыла бы условие. Внешнее указание не заменяет свойства; оно ложится на него сверху и держится ровно настолько, насколько хватает того, что под ним.
Это подрывает главную интуицию, с которой выбирают дешёвое. Интуиция говорит: меньшая модель — это та же модель, уменьшенная, и потому от неё стоит ждать того же, но хуже; немного менее точно, немного менее красиво, в основном то же самое. Сравнение честное, если бы меньшая была уменьшенной. Она не уменьшенная. Она другая вещь, сделанная другими руками и воспитанная под другую работу — чаще всего под короткую, потому что именно короткой от неё и ждут. То, чего в ней нет, отсутствует не пропорционально; оно отсутствует целиком, как отсутствует навык, которому не учили.
И честности ради надо сказать обратное. Величина сама по себе тоже ничего не обещает. Большая машина, которую воспитывали на коротком, будет ломаться на длинном ровно так же, и её размер ей не поможет; я такое видел и не хочу оставлять впечатление, будто плачу за величину. Способность пройти цепь видна только на цепи.
Вывод отсюда получается менее приятный, чем «берите ту, что больше». Из отдельности свойства следует, что величина, цена и репутация — все три косвенные приметы, и каждая из них иногда обманывает. Следует и то, что выбирать приходится по признаку, который нельзя прочитать в описании: дошла или не дошла, и сколько раз из скольких. Это требует работы, которой раньше не требовалось, и я понимаю тех, кто предпочитает не начинать её вовсе. Но отказ от этой работы не отменяет свойства. Он лишь означает, что о нём узнают не заранее, а по результату, и не на пробной задаче, а на настоящей.
Размер при этом не пустая характеристика, он говорит о другом. Он говорит не о том, как машина работает, а о том, чего она требует, чтобы работать вообще. Мерой ума он не является ни в каком смысле.
Если удержание нити — отдельное свойство, а не следствие величины, то и разница между машинами на длинной цепи не обязана быть маленькой оттого, что мала разница в их размере, цене или поведении на коротком. Ничто не мешает ей быть кратной. Она такой и бывает.
Цепь, о которой шла речь, всё это время была моей выдумкой: я задавал её длину сам, чтобы показать, как ведёт себя произведение. Настоящая цепь длину себе задаёт не по моему замыслу. Она вырастает по дороге — на каждом возвращении, на каждом перечитывании, на каждой попытке, начатой заново, — и к концу работы оказывается заметно длиннее той, которую я описывал, отдавая поручение. Разница между задуманной длиной и пройденной и есть настоящий предмет спора о дешёвом и дорогом.
Потому что эта разница не бесплатна. Каждое лишнее звено выковано из чего-то: из вычисления, из минут ожидания, из чьего-то вечера, потраченного на разбор того, что получилось вместо обещанного. Кто-то оплатил каждое из них, не выставляя счёта и чаще всего не зная, что платит. Разница, которую я собирался мерить процентами, на этой длине процентами не меряется вовсе; она меряется тем, чья работа была сделана дважды, и тем, кто в итоге смотрел вместо меня. Пока я говорил о вероятности, лишние звенья были только поводом для разрыва. Они не только повод. Они ещё и счёт, и приходит он позже, чем отчёт об успехе, и выписан не на то имя, на которое я смотрел, когда выбирал, сколько платить за токен.
Глава 3. Невидимая цена
У поручения в прайсе один плательщик. Там написано, во что обходится тысяча знаков на входе и тысяча на выходе, и это честная цифра: её можно умножить на число обращений, сложить с такими же и получить сумму, которую в конце месяца снимут со счёта. Я много раз проделывал это умножение и смотрел на результат с удовлетворением человека, который знает цену своей работы. Число было верным. Оно было ценой одной четверти.
За одну закрытую задачу платят четверо, и только первый платит деньгами. Остальные трое платят временем, вниманием и сосредоточенностью — и платят не в тот момент, когда работа сделана, а позже, иногда намного позже, когда связь между платежом и покупкой уже не восстанавливается. Кто-то читает результат и убеждается, что его можно принимать. Кто-то доводит то, что принято наполовину. А кто-то через месяц садится разбираться, почему сломалось то, что месяц работало исправно, и тратит день, не подозревая, что оплачивает работу, заказанную в прошлом квартале и признанную завершённой.
Эта вторая плата не выглядит платой. У неё нет получателя, нет строки, нет валюты; она растворена в обычных рабочих днях обычных людей, и каждый день по отдельности выглядит как день, потраченный на текущие дела. Задача, которую машина не закрыла и вернула ни с чем, оплачена и будет оплачена ещё раз, когда её отдадут заново. Задача, которую машина закрыла неправильно, но объявила закрытой, оплачена трижды: за работу, за её обнаружение и за исправление того, что успело на ней вырасти. Ни одна из этих сумм не попадает в отчёт о стоимости машины.
Счёт, который приходит потом, никем не подписан.
3.1. Структура стоимости результата
Начнём с одной задачи, доведённой до конца. Пусть это будет что-то заурядное: дефект в модуле, который никто из работающих сейчас не писал, тесты падают, надо разобраться и сделать так, чтобы перестали. Задачу отдали машине. Через некоторое время машина сообщила, что готово: нашла причину, внесла правку, прогнала проверки, приложила объяснение. Изменение ушло в работу, дефект больше не воспроизводится. Задача закрыта, и теперь можно спросить, во что она обошлась.
Первым платит машина, и это тот платёж, который я умею считать. Обращения, шаги, знаки на входе и на выходе, минуты вычисления — всё сосчитано, выставлено и записано. Этот плательщик удобен тем, что он безличен и аккуратен: он не забывает выставить счёт, не округляет в свою пользу, не приходит через месяц. Он сообщает о себе в тот же день.
Вторым платит тот, кто читал результат. Он открыл изменение, посмотрел, что тронуто, прочитал объяснение, сверил его с тем, что видит в коде, подумал, не задето ли что-то рядом, и решил, что можно принимать. Это было его внимание — не рассеянное, а то самое, сосредоточенное, которого у человека за день набирается немного и которое тратится быстрее, чем восстанавливается. Потраченное нигде не зафиксировано. В календаре у него стояло другое.
Третьим платит тот, кто доводил. Правка была верной по существу, но оформлена не по принятому здесь порядку; объяснение оказалось точнее кода, и пришлось дописать то, чего в коде не было; проверка прошла, но прошла на одном наборе данных, и кто-то добавил второй. Это ещё время, и тоже ничьё. Работа была сделана не заново, а вокруг: подобрать, подправить, привести к общему виду. Она почти никогда не называется работой и почти всегда занимает время.
Четвёртым платит тот, кто через месяц обнаруживает, что доведено было не всё. Он не искал этой задачи, не помнит о ней и не связывает своё утро с чужим давним поручением. Он видит, что ночная выгрузка второй день приходит короче обычного, идёт назад по истории изменений, находит правку, читает объяснение, не понимает его, читает код, понимает, поднимает голову и спрашивает, кто это делал. Ему отвечают, что это была машина, и что изменение прошло проверку. К этому моменту он потратил утро и потратит ещё, потому что на неверной правке успели вырасти другие, верные.
Четверо. Один сообщил о себе цифрой, трое — нет.
И это была одна задача, заурядная, закончившаяся благополучно. Не катастрофа, не громкий отказ, не история, которую пересказывают на совещании. Такие задачи идут потоком: их десятки в неделю у одной команды и сотни в квартал, и каждая раскладывается на тех же четверых. Второй и третий плательщик вносят свою долю мелкими купюрами, по нескольку минут за раз, и мелочь эта не собирается ни в какую кучу, потому что собирать её некому и негде. Четвёртый платит редко и крупно, но его платёж уже никак не связан с покупкой: он приходит в другой месяц и к другому человеку. Стоимость результата устроена так, что её невозможно увидеть целиком, стоя в любой одной точке.
Дальше можно было бы сказать, что первый платёж мал по сравнению с остальными, и на этом закончить. Но интереснее не величина, а видимость. Прайс освещает ровно одного плательщика из четырёх, и освещает его так ярко, что остальные оказываются в темноте не потому, что малы, а потому, что свет направлен мимо них. Тот, кто читал результат, не выставляет счёта самому себе. Тот, кто доводил, считает это частью своей работы, и в каком-то смысле прав. Тот, кто разбирался через месяц, вообще не знает, что участвует в этой сделке.
Так вышло не по чьему-то умыслу. Цена за знаки — единственная величина в этой истории, которую можно измерить с точностью до сотой доли и предъявить, не прибегая ни к чьей оценке на глаз. Всё остальное измеримо плохо, спорно и неприятно для измерения: у человека нет счётчика, который включался бы в момент, когда он начинает читать чужой код, и выключался, когда перестаёт об этом думать. Естественно, что учёт лепится к тому, что учитывается. Неестественно другое — считать, что сосчитанное и есть целое.
Есть ещё одно обстоятельство, из-за которого темнота так устойчива. Видимый счёт приходит туда, где принимают решение: его видит тот, кто выбирает машину, подписывает договор и отвечает за расходы. Невидимый счёт приходит совсем в другое место — к тем, кто читает, доводит и через месяц разбирается, и эти люди в выборе не участвовали. Между двумя счетами нет общего стола, на который их можно было бы положить рядом. Один приходит в отчёте, другой — в усталости к четвергу, и человек, у которого есть оба, встречается редко; чаще у каждого есть ровно один, и каждый по-своему прав, говоря, что расходы под контролем.
Я долго так считал. Когда меня спрашивали, во что обходится работа машины, я называл сумму из отчёта, и она была правдой; когда меня спрашивали, дешевле ли одна машина другой, я делил одну сумму на другую и называл отношение, и оно тоже было правдой. Обе правды складывались в ложное целое, потому что обе относились к одному плательщику из четырёх, а решение принималось за всех четверых.
Здесь нужно назвать различие. Есть счёт, который приходит сразу, в понятной валюте, с указанием суммы и отправителя, — назову его видимым. И есть счёт, который приходит потом, в чужом времени, без суммы и без подписи, — невидимый. Оба оплачиваются. Разница между ними не в том, насколько они тяжелы, а в том, что первый можно положить рядом с другим таким же и сравнить, а второй не с чем положить рядом: он приходит в другой валюте, в другой месяц и другому человеку.
Экономисты различали видимое и невидимое задолго до машин, которым можно что-то поручить. На этом различии стоит вся классическая мысль о ложной экономии: сбережённое всегда на виду, а утраченное всегда где-то ещё, и счёт сводится неверно не из-за ошибки в сложении, а из-за того, что часть слагаемых не попала в столбец. Я называю это родство не для того, чтобы опереться на авторитет, а чтобы обозначить: речь идёт не о новом свойстве машин, а о старом свойстве человеческого учёта, которое машины подсветили с непривычной силой.
Стоит договориться и о том, что означает эта неподписанность. Подписанный счёт можно оспорить: у него есть отправитель, сумма и основание, и если сумма неверна, есть с кем говорить. Неподписанный счёт оспорить нельзя, его можно только оплатить, и оплачивается он в тот момент, когда никто не считает себя платящим. Человек, потративший утро на чужую правку, не скажет, что купил эту правку; он скажет, что разбирался с дефектом. Работа, которая была бы отменена, если бы кто-то увидел её цену заранее, спокойно делается, потому что цена нигде не названа. Невидимый счёт не становится меньше оттого, что его не заметили; он становится только неоспоримым.
Подсветили потому, что раньше разрыв между двумя счетами был меньше. Когда работу делает человек, оба счёта выставляются в одной валюте: его час стоит столько-то, час того, кто за ним проверяет, — столько-то, и даже если второй час никто не считает, он хотя бы соизмерим с первым. Машина вводит в расчёт величину другого порядка и другой природы. Её труд стоит доли копейки и измеряется в знаках; труд, который она порождает у людей, стоит дорого и измеряется в сосредоточенности. Соблазн состоит не в том, чтобы забыть про второе, а в том, чтобы вычесть первое из первого и решить, что сэкономил.
Я не думаю, что от этого соблазна спасает бдительность. Он держится не на невнимательности, а на честной привычке считать в той единице, которая поддаётся счёту, и всякий раз, когда я ловил себя на нём, мне казалось, что я рассуждаю строго. Строгость и была проблемой: я аккуратно складывал то, что складывалось, и не задавал вопроса, полон ли столбец. Единица досталась мне из времён, когда я задавал машине вопросы и получал ответ за секунду; в вопросе она работала, потому что вопрос и стоил ровно того, что было в счёте. В поручении та же единица измеряет малую долю происходящего и продолжает выглядеть строгой.
Можно было бы возразить, что невидимый счёт есть всегда и потому его допустимо вынести за скобки: кто бы ни делал работу, её всё равно кто-то читает и кто-то доводит. Возражение сильное, и я сам им долго пользовался. Оно верно ровно в одном случае — если второй счёт одинаков у любого исполнителя. Тогда он и вправду константа: прибавляется к обеим чашам, ничего не меняет, и выбирать можно по первому счёту. Но одинаковым он не бывает. Сколько минут уйдёт на чтение, сколько правок понадобится вокруг, найдётся ли через месяц второе место, где нужна была та же правка, — всё это зависит от того, кто делал работу, и зависит сильнее, чем цена за знак. Вынося невидимый счёт за скобки, я выношу туда единственную величину, на которую мой выбор влияет по-настоящему.
Отсюда и весь вопрос. Если у задачи есть видимый счёт и невидимый, то выбирая между машиной дорогой и машиной дешёвой, я выбираю по первому и получаю оба. И прежде чем говорить о том, что невидимый счёт больше, стоит посмотреть на его первую строку — ту, что ближе всего к видимому и написана почти в той же валюте. Слабая машина берёт дешевле за знак. Она берёт куда больше знаков.
3.2. Слабая модель тратит больше
Цена за знак — это цена за знак, а не за работу. Между ними стоит число, которое в прайсе не указано: сколько знаков понадобится, чтобы работа была сделана. Я привык считать это число свойством задачи — она большая или маленькая, и значит, знаков будет много или мало. Оно оказалось свойством исполнителя.
Поручение разворачивается в цепь шагов, и каждое звено чего-то стоит. Звено — это прочитанный файл, запущенная проверка, обдуманный вариант, внесённая и откаченная правка. Одни звенья необходимы: без них задача не закрывается. Другие возникают оттого, что исполнитель потерял нить и восстанавливает её, или пошёл не туда и возвращается. Для надёжности лишнее звено — это ещё один шанс промахнуться. Для счёта лишнее звено — это оплаченная строка, ничем не отличающаяся от необходимой. Машина не делает скидки на то, что шаг оказался напрасным; напрасный шаг тарифицируется так же, как тот, который привёл к результату.
Я несколько раз смотрел подряд на то, как одну и ту же задачу выполняют машина слабая и машина сильная, и постепенно перестал воспринимать разницу как разницу в качестве ответа. Это была разница в повадке. У слабой машины есть характер, и характер этот узнаваем от задачи к задаче, как узнаваем неловкий работник, которого видишь второй месяц.
Она перечитывает. Открывает файл, разбирает его, идёт дальше, а через несколько шагов открывает тот же файл снова и разбирает заново, потому что не удержала прочитанное в рабочей нити. Я видел, как один и тот же файл настроек открывался четырежды за одно поручение, и каждый раз разбирался целиком, от первой строки до последней, будто впервые. Внешне это выглядит как прилежание: машина сверяется с источником. По счёту это выглядит как двойная оплата одного и того же чтения, и чем длиннее поручение, тем чаще повтор. Причём повтор не бесплатен вдвойне: перечитанное вытесняет из нити что-то другое, и через несколько шагов потребуется перечитать уже это.
Она пробует и откатывает. Вносит правку, запускает проверку, видит, что стало хуже, возвращает как было, вносит другую. В этом нет ничего порочного: так работает всякий, кто не видит решения целиком, и человек делает то же самое. Разница в доле. У сильной машины перебор — способ уточнить гипотезу, которая уже почти верна; у слабой перебор заменяет гипотезу. Первая примеряет, вторая ищет наугад, и каждая примерка стоит одинаково. Узнаётся это по тому, как меняется правка: у сильной машины вторая попытка отличается от первой в том самом месте, где проверка показала расхождение, у слабой — в другом месте, выбранном по соседству.
Она упорствует. Выбрав неверное объяснение происходящего, слабая машина не отбрасывает его при первом же противоречии, а начинает достраивать: если не сходится здесь, значит, дело в чём-то рядом, и надо посмотреть рядом. Так возникают самые длинные и самые бесполезные ветви работы — не короткие промахи, а развёрнутые, аккуратные, внутренне связные исследования не той области. Читать их отчёт неприятно именно потому, что он логичен. Неверна только первая посылка, а всё остальное безупречно следует из неё. Однажды машина решила, что дело в устаревших данных, и половину поручения потратила на то, чтобы их обновить, очистить и обновить снова; данные были ни при чём, но каждый шаг этой работы выглядел осмысленным, и каждый был оплачен.
Она рассуждает вместо того, чтобы действовать. Там, где достаточно открыть соседний файл и посмотреть, слабая машина строит предположения о том, что в нём может быть, взвешивает варианты, оговаривает условия. Рассуждение стоит знаков ровно столько же, сколько действие, а иногда больше; при этом действие дало бы ответ, а рассуждение даёт только список того, каким ответ бывает. Хуже другое: рассуждение о неизвестном содержимом файла нередко заканчивается выбором наиболее вероятного варианта, и дальше работа идёт от предположения, которое можно было проверить одним движением.
Все четыре черты — одна черта, увиденная с разных сторон. Слабая машина хуже держит в голове систему целиком и хуже замечает, что уже сбилась. Отсюда и повторное чтение, и перебор вместо гипотезы, и упорство в неверной ветви, и разговор вместо взгляда. Это не случайные промахи, которые в среднем сойдутся: это повадка, воспроизводимая от поручения к поручению. Поэтому её и можно закладывать в расчёт.
Справедливости ради: лишние звенья бывают у любой машины и у любого человека. Сильная тоже открывает не тот файл, тоже проверяет то, что можно было не проверять, тоже иногда идёт по ложному следу. Речь не о безошибочности, которой нет ни у кого, а о доле напрасного в общем объёме и о том, как быстро напрасное распознаётся. Сильная машина возвращается с ложного следа через шаг или два, потому что замечает противоречие; слабая возвращается через десять или не возвращается вовсе. Обе ошибаются; счёт им выставляют за длину заблуждения.
Из этого следует то, что меня в своё время задело. Прайс не позволяет оценить стоимость поручения даже приблизительно, потому что в нём указана цена за знак, а неизвестным остаётся сомножитель — и сомножитель этот тем больше, чем дешевле цена. Умножая одно на другое, я получаю не оценку, а нижнюю границу, причём нижнюю границу тем более оптимистичную, чем слабее выбранная машина. Настоящая цена становится известна после работы, и узнаю я её не из прайса, а из отчёта о том, что было сделано. Даже в этой, самой видимой своей части счёт приходит потом.
Мне возражали — и возражали резонно, — что всё это учтено заранее. Разрыв в цене между машиной дешёвой и машиной сильной бывает не в проценты, а в разы: в 2026 году между самыми дешёвыми машинами и сильнейшими из доступных он доходил до десятикратного и больше. Пусть слабая делает вдвое больше шагов, пусть даже втрое: десятикратная скидка покрывает трёхкратный расход с запасом, и по этому счёту дешёвая остаётся дешёвой. Возражение верное по форме и неполное по существу, потому что множится не только число шагов.
Каждый следующий шаг поручения несёт с собой всё, что было раньше: прочитанные файлы, прошлые попытки, вывод проверок, собственные рассуждения. Это и есть нить, ради которой машине передают историю работы. Длина этой истории растёт вместе с числом шагов, и растёт не у одного шага, а у всех последующих сразу. Поэтому вдвое больше шагов — это не вдвое больше знаков, а заметно больше: удлиняется и список дел, и то, что приходится держать при себе на каждом деле. Перебор, который у сильной машины был бы третьим шагом из пяти, у слабой становится тринадцатым из сорока, и все сорок помнят про все предыдущие.
Сложите одно с другим — и десятикратная разница в цене за знак перестаёт быть десятикратной разницей в цене работы. По моему опыту она сжимается до двух-трёх раз, а на длинных и запутанных поручениях подходит вплотную к единице. Числа эти условны: зависят от того, какие машины сравнивать и в каком году; неусловно направление. Разрыв всегда сжимается, никогда не расширяется, и сжимается тем сильнее, чем длиннее поручение — то есть тем сильнее, чем больше оно похоже на настоящую работу, а не на пробный запуск.
У длинной работы есть и та сторона счёта, которая знаками не меряется. Сорок шагов идут дольше пяти — не в разы дольше по времени ожидания, потому что машина работает быстро, но достаточно долго, чтобы человек, отдавший поручение, успел переключиться на другое и потерять контекст. Когда результат приходит, ему нужно возвращаться в задачу, которую он уже выпустил из головы. Эта строка не попадает ни в один отчёт, и всё же она из того же счёта, что и остальные: длинная работа машины оплачивается коротким разрывом в чужом внимании.
Здесь стоит остановиться и заметить, чего этот расчёт не учитывает. Он молчаливо предполагает, что обе машины дошли до конца. Я сравнивал успешную работу с успешной работой: сильная закрыла задачу за пять шагов, слабая — за сорок, и мы посчитали, во что обошлись эти сорок. Но у слабой машины есть ещё один исход, которого у сильной почти не бывает, — сорок шагов и никакого результата. Эти шаги тоже оплачены.
3.3. Провал тоже оплачен
Отчёт, в котором написано «не удалось», приходит по той же цене, что и отчёт, в котором написано «готово». Это очевидно, если сказать вслух, и почти никогда не участвует в расчётах. Мы сравниваем машины по стоимости работы, подразумевая под работой сделанную работу, — а платим за попытку. Попытка тарифицируется независимо от исхода, как тарифицируется час адвоката, проигравшего дело.
Мало того, неудачная попытка обычно дороже удачной. Удачная кончается решением: машина нашла причину, внесла правку, проверки прошли, и дальше идти незачем. Неудачная кончается исчерпанием — упёрлась в отведённый предел шагов, или в предел времени, или в то место, где стало ясно, что дальше идти некуда. Между началом и этим местом уместилось всё то, о чём шла речь раньше: повторные чтения, перебор, длинная ветвь, выросшая из неверного объяснения. Слабая машина не сдаётся рано; она сдаётся поздно, потратив на бесплодную работу больше знаков, чем потратила бы на плодотворную. Худший исход обходится дороже среднего.
Между «готово» и «не удалось» есть ещё исход, который в расчётах не значится вовсе: работа, сделанная наполовину и возвращённая с вопросом. Машина дошла до места, где требуется решение не из её ведения, — какой из двух порядков считать правильным, можно ли менять внешнее поведение, кто отвечает за старый формат, — и остановилась, изложив развилку. Это разумное поведение, и всё же по счёту оно ближе к провалу, чем к успеху: работа оплачена, задача не закрыта, а тот, кто отвечает на вопрос, должен сначала войти в задачу настолько глубоко, чтобы вопрос понять. Слабая машина упирается в такие развилки чаще, потому что чаще принимает за развилку то, что решается чтением соседнего файла.
Дальше задачу делают ещё раз. Её отдают сильной машине или человеку, и это вторая оплата того же самого — с той особенностью, что от первой попытки почти ничего не наследуется. Иногда наследуется хуже, чем ничего: в рабочем дереве осталась половина правки, в проверках — ослабленное условие, в истории — три отката, и тот, кто берётся заново, сначала разбирает следы. Я несколько раз ловил себя на том, что читаю отчёт первой попытки, надеясь сэкономить время, и трачу больше, чем потратил бы на чистом месте, потому что отчёт был связным, подробным и неверным. Чужая незаконченная работа вообще плохо передаётся: чтобы ею воспользоваться, надо проверить каждое сделанное в ней допущение, а проверка допущения стоит примерно столько же, сколько его самостоятельное принятие. Дешевле всего наследуется работа, которой не было.
Прошлой зимой мы отдавали слабой машине однообразную работу: провести по всему проекту изменение способа, которым модули сообщают об ошибках. Работа выглядела идеально подходящей — сотни мест, один и тот же образец правки, никакой изобретательности. Машина прошла три четверти и остановилась там, где образец переставал работать: в нескольких старых модулях ошибки заворачивались в оболочку, написанную ещё до того, как в проекте завёлся общий порядок. Она попробовала одно, попробовала другое, переписала оболочку по-своему, сломала соседний модуль, вернула как было, попробовала третье и сообщила, что задача требует решения, которое она принять не может. Всё это заняло у неё вечер. Наутро ту же работу отдали сильной машине, и она сделала её целиком, включая старые модули, за время, которого хватило на кофе.
Мораль здесь не в том, что слабая машина оказалась плоха. Она сделала три четверти работы верно и остановилась там, где честно упёрлась. Мораль в том, что за эти три четверти заплатили дважды: первый раз — когда их делала слабая машина, второй — когда сильная делала всё заново, потому что принимать чужую незаконченную работу в середине оказалось дороже, чем начать с начала. Оплачены были сотни правок, полезной — ни одной.
Так устроен не редкий случай, а правило, и вот почему. Мысль «возьмём дешёвую, а если не справится — переключимся на сильную» звучит разумно и часто оформляется как сознательная политика: пусть сложное само выплывет наверх. Но эта политика гарантирует двойную оплату ровно на тех задачах, где работа дороже всего. Наверх выплывает не случайная треть поручений — наверх выплывает самое трудное: запутанное, длинное, с неочевидной причиной. Дешёвая попытка съедает больше всего знаков именно там, где она обречена, и передаёт задачу дальше в состоянии худшем, чем исходное. Отбор работает против того, кто его устроил.
Мне скажут, что отбор можно наладить заранее: отдавать дешёвой машине заведомо простое, а сложное сразу отправлять наверх. Возражение хорошее, и часть пути оно проходит. Загвоздка в том, что поручения не объявляют о своей трудности в момент постановки. «Поправить сообщение об ошибке» может оказаться работой на десять минут или раскопками в трёх модулях, и какой из двух это случай, выясняется в середине, когда деньги уже потрачены на выяснение. Трудность — свойство не формулировки, а того, что обнаружится внутри; поэтому всякая предварительная сортировка работает на видимом признаке, а платим мы за невидимый.
Теперь можно сложить всё это в один счёт. Возьму тысячу поручений — не потому, что где-то видел такую статистику, а потому, что на тысяче видно то, чего не видно на трёх. Пусть сильная машина закрывает почти все: девять из десяти доходят до результата, остальные возвращаются, и с ними разбираются люди. Пусть слабая закрывает две трети. Пусть по деньгам, с учётом её лишних шагов, одна задача обходится у неё втрое дешевле, чем у сильной, — тот самый сжавшийся разрыв, оставшийся от десятикратной разницы в прайсе.
Тогда тысяча поручений у сильной машины стоит тысячу условных единиц работы, по одной за штуку. У слабой каждая попытка стоит треть, и попыток ровно тысяча — это триста с небольшим. Но треть тысячи вернулась ни с чем, и эти триста с лишним задач надо сделать заново, теперь уже сильной: ещё триста с лишним единиц, по полной цене, потому что вторая попытка стоит столько же, сколько стоила бы первая. Складываю: около семисот вместо тысячи.
Доли здесь взяты условно, и я не выдаю их за измеренные: другая пара машин, другая кодовая база, другой род поручений дадут другие. Устойчиво в этом расчёте одно — его направление. Каждая доля невыполненного переносит часть работы из дешёвой чаши в дорогую по полной цене, и чем ниже доля успеха, тем ближе вторая чаша к тому, что было бы, если бы дешёвой машины не было вовсе. Арифметика тут нехитрая: при половине успеха от экономии остаётся шестая часть, а при трети она исчезает совсем, и вся дешёвая работа становится оплаченным предисловием к дорогой.
Экономия осталась. Она сжалась — с десятикратной, обещанной прайсом, до примерно трети, — но она есть, и я не собираюсь делать вид, что её нет. Тот, кто платит только за машины, на этом месте закроет книгу с чувством, что его расчёт выстоял. В его границах он и вправду выстоял: если считать одни машины, дешёвая остаётся дешевле даже с поправкой на лишние шаги и на переделку.
Границы этого расчёта, впрочем, стоит проговорить, потому что в них спрятано всё остальное. Он предполагает, что провалившаяся задача известна как провалившаяся. Триста возвратов, которые я прибавил ко второй чаше, — это триста случаев, когда машина сказала «не удалось» и тем самым сообщила, что работа не сделана. Счёт сошёлся благодаря её честности. В нём нет ни одной задачи, которую машина закрыла неверно и объявила закрытой. Триста честных отказов обошлись мне в треть тысячи и оказались самой дешёвой частью этой арифметики. У отказа есть свойство, которого нет больше ни у одного исхода: он приходит вовремя и с обратным адресом. Известно, какая задача не сделана, известно, когда это стало известно, известно, кому её отдавать дальше. Провал, сообщивший о себе, остаётся в видимом счёте целиком — он неприятен, но он сосчитан.
Бесплатный фрагмент закончился.
Купите книгу, чтобы продолжить чтение.