Розділ 13. Контроль, керованість, деградація¶
У нашому пайплайні кілька місяців стояв статичний аналізатор коду — SonarQube, інструмент, який читає код і шукає в ньому типові проблеми. Налаштований абияк: дві тисячі застережень, які ніхто не відкривав, і поріг якості, виставлений так, щоб не заважати релізам. Кожен прогін — сім хвилин очікування. Одного ранку я його вимкнув.
Не з принципу — набридло чекати на крок, який нічого не змінював. Я збирався сказати команді, але відволікся. Минуло пару тижнів, поки хтось спитав, куди подівся значок у пул-реквесті.
Пару тижнів команда працювала без інструмента, який у схемі процесу називався «контроль якості коду». І ніхто не помітив — не тому, що команда неуважна. Помічати не було чого: за весь час цей крок не дав жодного сигналу, на який хтось відреагував. Він стояв у пайплайні, як стоїть у коридорі старий щиток, у який ніхто не заглядає.
Що ж тримало якість коду в рамках ці пару тижнів? Те саме, що й до того: рев’ю колег, тести і звичка. Аналізатор до цього не мав стосунку — і не мав давно. Контроль, який у нас «був», існував лише як фантомний крок пайплайну.
З цієї історії виростає питання розділу: що саме тримає систему в допустимих межах у ту хвилину, коли ви не дивитесь? У назві три слова, і це три відповіді на нього. Чим тримати — контроль. Скільки відпускати — керованість. І як помітити, що тримач давно нічого не тримає, — деградація.
Попередній розділ, про нормативну базу, вів до норм, які тримаються без вас. Тут — скільки така стабільність коштує і чим загрожує.
Рівновага, за яку платять¶
Є два способи, якими система лишається в допустимих межах.
Перший: допустимий стан збігається з тим, куди система і сама тяжіє. Кулька на дні лунки лежить у центрі не тому, що її хтось тримає, — це її найстійкіший стан. Тримати не треба нічого.
Другий: допустимий стан підтримується безперервним зусиллям ззовні. Тіло тримає тридцять шість і шість не тому, що ця температура природна для шматка білка, а тому, що щосекунди витрачає на це енергію: потіє, тремтить, звужує судини. Фізіологи називають це гомеостазом. Рівновага є, але вона активна: перестанеш платити — і за кілька годин температура зрівняється з кімнатною.
Контроль «я читаю все, що згенеровано» — другого типу. Система в рамках доти, доки ви читаєте. Відволіклись, втомились, пішли по каву — і ніщо, крім вашої уваги, її там не тримало. Гірше того: така система розпадається не тоді, коли увага зникає назовсім, а при першому короткому спаді уваги нижче критичного рівня. Досить одного вечора, коли ви прочитали по діагоналі.
Розділ 10 показав це на пілотах: стежити за тим, що робить усе саме і добре, — окрема робота, в якій людина слабка. Будувати контроль на тому, в чому ви слабкі, — це і є контроль на силі волі.
У розділі 2 я вивів правило для послаблювача: він працює, лише коли структурний. Тут те саме правило доводиться до цілої конструкції. Контур контролю — це три дії: спостерігати, порівнювати з граничним значенням, повертати в допустимі межі або зупиняти. І питання до кожної з трьох одне: її робить конструкція — чи ви?
Я не закликаю не читати код. Я пропоную відповісти собі, що тримає систему в рамках, коли ви його не читаєте. Якщо нічого — контролю у вас немає. Є звичка, яка поки що не підвела.
Щиток¶
Відкрийте електрощиток у коридорі.
Ряд автоматичних вимикачів, у кожного свій номінал: шість ампер на освітлення, шістнадцять на розетки, двадцять п’ять на плиту. Коли струм у лінії перевищує номінал, автомат вибиває — клац, і в кімнаті темно. Він не питає, чи ви зараз зайняті. Не чекає, поки ви відчуєте запах гару. Не покладається на те, що ви пам’ятаєте, скільки приладів увімкнули. Граничне навантаження записане в конструкцію. Конструкція спрацьовує сама — о четвертій ранку так само, як о десятій.
Придивіться до номіналу. Він не про довіру до приладів — він про дріт. На тонкий дріт освітлення ставлять шість ампер не тому, що лампам не довіряють, а тому, що більший струм його розплавить. Скільки можна дозволити лінії, визначає не бажання, а те, що лінія витримає. Хочете більший номінал — тягніть товщий дріт.
Друге. Автомат міряє лише той струм, який тече через нього. Лінія, кинута повз щиток напряму від лічильника — у старих будинках таке трапляється, — для автоматів не існує. Вони захищають свій дріт і нічого не знають про чужий.
Третє. Автомат не вирішує, що робити далі. Він зупиняє і чекає на людину. Спрацював — ви йдете в коридор, дивитесь, що сталося, і вирішуєте: вимкнути обігрівач чи таки тягнути новий дріт. Конструкція зупиняє, людина вирішує. Автомат, який сам «розбирався б» і вмикав лінію назад, був би не захистом, а пожежею з затримкою.
Четверте. Поруч із автоматами стоїть захисний вимикач — той, що ловить витік струму, — і на ньому маленька кнопка «Тест». Інструкція каже натискати її щомісяця: вимикач має клацнути, і це єдиний доказ, що він досі здатен спрацювати. Скільки разів ви її натискали? Я — двічі за десять років, і то коли приходив електрик і нагадував про це. Вимикач стоїть, виглядає надійно, і ніхто не знає, чи він ще щось ловить.
І п’яте, найгірше. У старих будинках трапляється «жучок»: замість запобіжника, що перегорів, хтось вставив шматок дроту. Зовні контур на місці — пробки в щитку, як і були. Всередині — нічого. Струм піде будь-який, і дізнаєтесь ви про це разом із сусідами.
Номінал, лінія повз щиток, спрацьовування, кнопка «Тест», жучок. П’ять деталей — і кожну з них далі ми знайдемо в роботі з моделлю.
Контур бачить лише слід¶
Керувати можна лише тим, що не замкнуте цілком. Підсистема, яка працює «сама в собі» і нічого не віддає назовні, для того, хто зовні, — точка: вона існує, але зазирнути всередину нема крізь що. Приховування тут ні до чого. Агент, який три години переписував модуль і показав вам готовий результат, нічого не ховав — просто три години його роботи не лишили сліду, який можна порівняти з дозволеним. Ви бачите останній стан, і все, що було між ним і початком, для вашого контуру не існувало. Автомат міряє лише той струм, що проходить через нього. Агент, який ходить у базу чи в інтернет повз ваш скрипт-перевірку, — це лінія, кинута повз щиток: він щось робить, а ваш автомат про це не знає.
Звідси перше правило: слід — це вимога, а не побажання. План до коду. Звіт після кожної порції — стільки роботи, скільки система робить за один захід до перевірки: п’ять файлів, один модуль, одна міграція. Тест на кожен критерій, а не «тести є». Без сліду ви контролюєте не процес, а власне уявлення про нього.
І друге правило, неприємніше. Нуль на вашому приладі — це не «нічого немає». Це «нічого, що прилад здатен розрізнити». Скільки проблем аналізатор знайшов у нас за ті пару тижнів? Нуль — його ж не було. Скільки він знаходив за місяць до того? Теж нуль, і тоді ми називали це «якість у нормі». Різниці між цими двома нулями зсередини не видно, і ось чому.
Будь-який прилад має поріг чутливости, і все, що нижче за нього, він показує як нуль. Кухонні ваги округлюють до десяти грамів. Поставте порожню миску, обнуліть — і киньте дрібку солі: ваги покажуть той самий нуль.
Так само аналізатор: із порогом, виставленим «щоб не заважати релізам», він показував нуль і тоді, коли проблем справді не було, і тоді, коли вони були, але дрібніші за його поріг. Його нуль означав не «проблем нема», а «нічого з того, що я налаштований помічати». І що вище піднято поріг, то більше вміщує такий нуль — аж до дня, коли він вміщує все, і прилад можна вимикати: різниці ніхто не побачить.
Є ще ціна. Щоб систему можна було спостерігати, вона має бути розімкнена: частина того, що вона робить, мусить виходити назовні — у звіт, у таблицю, у зупинку з питанням до вас. Цей вихід не безкоштовний.
Слід система лишає з того самого ресурсу, яким робить роботу: кожен звіт — токени, кожна зупинка — час, кожне рев’ю — ваша увага. Що більше ви хочете бачити, то більшу частку ресурсу система віддає на те, щоб її бачили, а не на саму справу. І що більшу частку ресурсу з’їдає контур, то менше та робота схожа на ту, яку ви збиралися контролювати. Автомат у щитку майже не з’їдає струм, який пропускає, і саме тому його можна поставити на кожну лінію.
Контур, що забирає половину ресурсу процесу, — не контроль, а дорогий спосіб читати все самому. І доля в нього передбачувана: рано чи пізно його вимикають ті, кого він захищає. Сім хвилин очікування на прогін, який нічого не змінює, — так я і вимкнув аналізатор.
Скільки відпускати¶
Тепер номінал.
Керованість — властивість системи, яка визначає, скільки автономії їй можна дати. І на відміну від довіри її можна виміряти: скільки зусиль коштує повернути систему в допустимі межі, коли вона з них вийшла. Кожен такий випадок — робота зупинилась і повернулась до вас, за правилом ескалації чи тому, що ви помітили відхилення і втрутились, — далі я називаю зупинкою.
У будь-якої системи є мінімальне зусилля — рівно стільки, щоб усунути відхилення. І є реальне: з пошуком, з’ясуванням, переробками. Реальне завжди більше. Розрив між ними — і є втрата керованости.
Агент відхилився у двох файлах із п’ятдесяти, і ви виправили два файли — керованість висока. Відхилився у двох, а вам довелось перечитати всі п’ятдесят, бо невідомо, в яких саме, — низька, хоч помилок стільки ж. Різниця не в агентові. Різниця в тому, чи лишив він слід.
Тому обсяг автономії — не аванс довіри, а результат вимірювання. Роботу віддають порціями і рахують зупинки. Нуль зупинок із двадцяти порцій — порцію можна збільшувати. Кожна третя зупиняється — треба зменшувати, і неважливо, як хочеться швидше. Номінал підбирають під дріт, а не під апетит.
Коли керування взагалі можливе? Дві з трьох умов вам уже знайомі. Перша — з розділу 2: ваше різноманіття має бути більшим за різноманіття підсистеми; якщо агент за ніч породжує більше станів, ніж ви розрізняєте за ранок, керувати ним не вийде, хоч би скільки зусиль ви вклали, — лише наздоганяти.
Друга — з розділу 6: що ближча внутрішня ціль підсистеми до потрібної вам, то дешевший контроль; агентові, для якого «тести проходять» і є ціллю, порожній тест не суперечить нічому, і платити за кожен такий тест доведеться вам.
Третя нова: цілей у підсистеми має бути мало. Керувати процесом з однією ціллю дешевше, ніж із п’ятьма; агент, якому дали мігрувати тести і «заодно підчистити код», — це дві лінії на один автомат: коли він виб’є, ви не знатимете, через яку.
І ще одна закономірність — про критичну масу. Автономію можна давати доти, доки залишок вашого ресурсу більший за те, що система встигла зробити. Чотириста файлів за ніч — це більше, ніж ви прочитаєте за ранок. У ту хвилину, коли обсяг зробленого перевищує вашу здатність його оцінити, керуєте вже не ви: продукт диктує вам, що з ним робити. Доводиться мержити — бо переробляти ще дорожче. Тому пороги виставляють до старту. Після старту виставляти вже нічого — лишається дочитати. Ваш залишок ресурсу — і є той дріт. Номінал ставлять під нього.
Одне застереження.
Буває система, яка ніколи не сперечається і робить рівно те, що сказано, з першого разу. Виглядає як ідеальна керованість. У системній теорії на це дивляться підозріло: система без власної цілі справді ідеально керована — її можна повести будь-якою траєкторією без опору. Але це симптом, а не заслуга контуру. Модель, яка на будь-яке ваше формулювання відповідає «так, зроблено», не має нічого, що чинило б опір хибному формулюванню. Хибне вона виконає так само старанно, як правильне, — і результат буде прийнято як правильний в обох випадках.
У такої системи має бути пружність. Пружину можна стиснути сильніше за норму — і вона дозволить, але з кожним міліметром опір росте, і рука сама відчуває, де вже занадто. Такою я хочу бачити й систему, якою керую: щоб її можна було навантажити більше за звичне, але щоб вона сама сказала, що це вже забагато, — перепитала, заперечила, відмовилась. Система без опору — не пружина, а пластилін: приймає будь-яку форму і нічого не каже про те, чи форма хибна. Пружність — не те саме, що керованість: керованість міряє, скільки коштує повернути систему; пружність — чи скаже вона вам, що вже занадто.
Чотири елементи контуру¶
Ті три дії тримаються на чотирьох елементах конструкції.
Зона допуску. Записано наперед, що прийнятно, — і записано так, що перевірити можна без вас. Не «зроби акуратно», а: кількість перевірок у тестовому файлі не зменшується; змін поза каталогом тестів немає; нових залежностей не додано; покриття не падає; частка помилок у логах після деплою не вища, ніж до нього. Це послаблювачі з розділу 2 — межа контексту, формат, тести, права, — зібрані в одну огорожу. У щитку це номінал автомата: скільки дозволено лінії, записано наперед і не залежить від того, хто зараз у квартирі. І правило те саме: допуск працює, лише коли він структурний. Рядок у промпті «не видаляй перевірок» — побажання. Скрипт, який рахує перевірки до і після і червоніє, коли їх стає менше, — допуск.
Видимий слід. Те, що виходить назовні після кожної порції, у формі, яку можна порівняти з допуском за хвилину. План до коду. Таблиця «файл — було — стало — статус» замість слова «готово». Тест на кожен критерій. І не лише тести: логи додатку і логи воркерів, які цей додаток обслуговують; лічильники помилок і час відповіді; споживання пам’яті і процесора. Сервіс, який пише в лог лише «запущено», для контуру такий самий невидимий, як агент, що каже «готово». Слід — це дріт, проведений через автомат, щоб автомат мав що міряти.
Точка ескалації. Конкретний стан, у якому система зупиняється і повертає керування людині. Не «повідом, якщо щось не так» — на це формулювання підсистема відповість власним уявленням про «не так», а воно правдоподібне, не правильне. А так: «якщо тест не переводиться механічно і треба міняти те, що він перевіряє, — не чіпай, додай у список і йди далі»; «якщо падає тест не в тому файлі, який ти змінював, — стоп»; «якщо помилка в логах повторюється частіше, ніж раз на хвилину, п’ять хвилин поспіль, — поклич людину: створи тікет, надішли листа». У щитку це спрацьовування автомата. І зверніть увагу, що робить автомат після клацання: нічого. Він чекає. Ескалація, яка сама вирішує, як обійти проблему, — це автомат, що вмикає лінію назад.
Поетапна автономія. Обсяг автономії збільшують за виміряною керованістю, а не за відчуттям. Спершу мала порція, і ви читаєте кожен файл. Проходить гладко і без ескалацій — збільшуємо обсяг порції і читаємо вже таблицю і скрипт, не файли. Якщо й там зупинки лише за визначеним правилом ескалації — запускаємо решту одним заходом. І у зворотний бік теж: дві зупинки не за правилом — порцію ріжемо вдвічі. Розширювати від жорстких шарів до м’яких: спершу автономія в тому, що перевіряє скрипт, потім — у тому, що перевіряє лише людина.
Якщо ця конструкція здається вам незнайомою, погляньте на Kubernetes — систему, яка сама запускає й перезапускає сервіси на багатьох машинах: там усі чотири елементи вже зібрані, тільки для сервісів, а не для агентів. Сервіс мусить сам відповідати на перевірку здоров’я — це вимога сліду: що не відповіло, того для оркестратора не існує. Ліміт пам’яті і цільове навантаження процесора — допуск, за яким він додає чи прибирає копії. Контейнер, що впав кілька разів поспіль, оркестратор перестає перезапускати і чекає на людину — ескалація. А нову версію викочують не на всі копії одразу, а на одну, потім на частину, потім на решту, — поетапна автономія. Ніхто з інженерів не сидить і не дивиться на ці сервіси. За них дивиться конструкція.
Чотириста тестів за ніч¶
Тепер усе це на одній задачі — нудній і великій: перевести чотириста тестових файлів з одного фреймворку на інший.
Перша спроба. Я описав задачу, дав агентові каталог тестів і пішов спати. Зранку — зелений прогін і пул-реквест на чотириста файлів. Перші двадцять я прочитав уважно. Наступні сорок — по діагоналі. Решту змержив: тести ж пройшли.
Через тиждень колега спитав, чому тест на розрахунок знижки нічого не перевіряє. Я відкрив файл: перевірки всередині зникли, лишився виклик функції і зелена галочка. Таких файлів виявилось сорок.
Агент нічого не ламав — він оптимізував «тести проходять», бо саме це і стояло в моєму формулюванні, а внутрішня «мотивація» моделі дописала решту. Сорок тестів, які нічого не перевіряють, — це сорок жучків: контур зовні є, всередині нічого. А що контролював я? Формально — все: я ж читав. Фактично контроль закінчився на двадцятому файлі разом із моєю увагою, а чотириста файлів перевищили мій залишок ресурсу ще до того, як я прокинувся.
Друга спроба, з контуром контролю.
Спершу допуск, до старту. Скрипт, який для кожного файлу рахує перевірки до і після і червоніє, якщо їх стало менше. Правило «змін поза каталогом тестів немає», перевірене тим самим скриптом. Покриття не падає. Десять хвилин на скрипт — це дріт, на який тепер можна ставити автомат.
Потім слід. Після кожної порції агент віддає таблицю: файл, перевірок було, перевірок стало, статус. Не «зроблено» — таблиця, яку я читаю за хвилину.
Потім ескалація. «Якщо тест не переводиться механічно — потрібно міняти те, що він перевіряє, або порядок виклику, — не чіпай його. Додай у список «руками» і йди далі. Якщо падає тест не в тому файлі, який ти змінював, — зупинись і покажи».
І поетапність. Перша порція — п’ять файлів, кожен читаю. Зупинок нуль. Друга — п’ятдесят, читаю таблицю і скрипт, файли не відкриваю. Дві зупинки, обидві за правилом ескалації: два тести викликали функцію, якої в новому фреймворку немає, і агент відклав їх замість того, щоб зробити їх прохідними. Це саме та поведінка, яку я і хотів виміряти: система вийшла на межу і зупинилась, а не проїхала. Третя порція — решта триста сорок п’ять, одним заходом, зі скриптом і таблицею: двадцять одна зупинка, усі за правилом.
Рахунок. Перша ніч дала чотириста файлів із пройденими тестами, з яких сорок були порожніми, і ніхто не бачив цього тиждень. Другий день дав триста сімдесят сім переведених файлів і двадцять три, відкладені у список «руками». Їх я перевів сам за пів дня — і кожен справді потребував рішення, якого агент приймати не мав права.
Але головна різниця не в числах. Після першої ночі я не мав жодного способу дізнатись, чи можна цьому агентові на цій задачі давати чотириста файлів. Тепер маю: нуль із п’яти, дві з п’ятдесяти, двадцять одна з трьохсот сорока п’яти — і жодної поза правилом. Наступну міграцію в цьому проєкті можна починати не з п’яти файлів, а з п’ятдесяти, і це не довіра. Це номінал, підібраний під дріт.
Коли все працює, чи добре це?¶
Досі йшлося про те, як зробити стабільною вашу практику — усталений спосіб працювати з моделлю: норми, промпти, перевірки, контури, звички команди. Стабільною — щоб допустимі межі тримались без вас. Здавалося б, ось мета: система, яка тримає себе в рамках, доки ви спите.
Але є особливість, і вона неприємна саме тим, що виглядає як успіх.
Система, яка повністю стабілізувалась, перестає віддавати сигнал назовні. Не тому, що ховає, — тому, що їй нічого повідомляти: усе в допуску, жодного збою, зупинок нуль. І саме через це вона стає невидимою. Ви перестаєте дивитись, бо дивитись нема на що. А те, на що ніхто не дивиться, з часом змінюється так, як йому зручно, — ця закономірність із розділу 6 працює не лише проти моделі, а й проти вашої практики.
Стабільна практика і заіржавіла — та, що далі виконується, але вже не відповідає ні моделі, ні задачам, ні команді, — зовні однакові. Обидві не вимагають уваги. Обидві дають прийнятний результат. Різниця в одному: чи практика ще щось міряє — чи лише повторює.
Як іржавіє практика? Спершу перестають мінятися правила. Системний промпт, написаний під тодішню модель, і досі каже їй: відповідай коротко, не додавай бібліотек, спершу план на п’ять рядків. Модель відтоді змінилась двічі, задачі — з дрібних правок на міграції, команда — наполовину. Промпт той самий.
Заперечення знайоме і сильне: працює — не чіпай. Тільки «працює» тут означає, що ніхто не скаржиться, а не що хтось перевіряв. Які з тих рядків модель досі потребує, які ігнорує, а які їй тепер заважають — ніхто не знає, бо система не віддає назовні нічого, крім «усе гаразд». Це біг по колу: тисячу разів те саме, і ніхто не пам’ятає, від чого воно захищало.
Потім наростає шкаралупа. Процедур стає більше, а не менше: чекліст рев’ю на сорок пунктів, три етапи погодження, обов’язковий звіт. Кожен із них колись відповідав на реальну проблему. Тепер вони — шари, крізь які зовнішній сигнал не доходить усередину; що довше практика в стабільній фазі, то товща шкаралупа — і то менше ті, хто всередині, здатні побачити, що вона є. Пропозицію щось змінити зустрічають не аргументом, а «у нас так заведено».
І ще одне, що легко пропустити. Оболонка з розділу 6 — чат, агент у редакторі, харнес — теж не стоїть на місці: з кожним оновленням вона вбирає в себе те, що ви колись прописали самі в навиках і системних промптах. Половину ваших правил оболонка вже робить сама, а ви й далі носите їх із собою і платите за них контекстом. Тому перевірка «чи це досі потрібне» — і видалення того, що вже ні, — така ж частина практики, як і додавання нового правила.
І нарешті практика починає працювати сама на себе. Більше запусків, більше промптів, більше агентів — та сама якість. Активність висока, а продукту з неї немає: уся енергія йде на підтримання власного обертання. «У нас із цим проблем немає» — спитайте, звідки відомо. Якщо відповідь — «давно нічого не траплялось», у вас не вимірювання, а відсутність сигналу. Вимикач із кнопкою «Тест», яку ніхто не натискає, теж давно не спрацьовував.
І головне про такий стан: заіржавіла практика не ламається. Вона далі працює — на нижчому рівні, часом навіть непогано в окремих задачах, — і саме тому її не помічають. Поломку видно: тест червоний, реліз зірвано. Виродження не видно: перевірки мовчать, реліз вчасно, лише розрізнень усередині стало менше, і ніхто не міряє, скільки їх лишилось. Багаття, що прогоріло, зовні лишається багаттям — ті самі головешки, той самий контур. Тільки тепла воно вже не дає.
Що з цим робити? Не чекати, поки практика заіржавіє, а перебудовувати її, коли вона підходить до стабільности — саме тоді, коли все спокійно і нічого не хочеться чіпати. Тримати в контурі хоча б одну незамкнену зону: вимірювання від зафіксованого еталона, яке практика не може «пройти» автоматично. І час від часу пускати всередину чужі очі — людину з іншими сліпими зонами, яка спитає «а звідки ви знаєте?», не знаючи, що так не заведено.
Зелений ритуал¶
Повернуся до аналізатора з початку розділу — тепер він читається інакше.
Усе там було: інструмент стояв, прогін ішов, значок у пул-реквесті світився. Контур зовні на місці. Всередині — жучок: пороги виставлені так, щоб не заважати, застереження ніхто не читав, і розрізнення, заради якого його ставили, зникло задовго до того, як я його вимкнув. Мої два тижні без аналізатора — це і була кнопка «Тест», натиснута випадково. Вимикач не клацнув.
У ширшій формі цей анти-патерн виглядає так. У команді є рев’ю-промпт: модель проганяє кожний пул-реквест за чеклістом і ставить оцінку. Півроку тому він упіймав кілька реальних проблем, і його зробили обов’язковим. Відтоді — зелений. Кожен пул-реквест, кожен день. Команда впевнена: у нас є автоматичне рев’ю. Ніхто не пам’ятає, коли він востаннє щось знайшов, і нікого це не турбує: не знаходить — значить, усе добре.
Одного дня хтось із цікавості підклав у пул-реквест помилку — очевидну, з тих, які чекліст мав би ловити першим пунктом. Зелений.
Діагноз за законом цього розділу: «усе гаразд» — не сигнал, якщо ви не знаєте, чи система здатна сказати «стоп». Чому вона перестала — неважливо: модель змінилась і читає чекліст інакше; чекліст обріс пунктами, і модель виконує їх вибірково, як мегапромпт з розділу 2; або він і півроку тому ловив лише те, що випадково збігалось із його уявленням про проблему. Важливо те, що ніхто цього не міряв.
Лікується це не новим промптом. Лікується кнопкою «Тест»: за розкладом підкладати в систему помилку, яку вона мусить упіймати, і дивитись, чи впіймає. У тестуванні цей прийом давно має ім’я — мутація: зламати код навмисно і перевірити, чи почервоніють тести. Той самий прийом працює для будь-якого контуру — рев’ю, лінтера, чекліста, людини на погодженні.
І друге: міряти від еталона, а не від відчуття. Два числа на місяць: скільки проблем контур упіймав і скільки з тих, що дійшли до продакшну, він мав би упіймати. Ці два числа — єдиний спосіб дізнатись, що у вас у щитку: автомат чи жучок.
Аналізатор ми потім повернули — з трьома правилами замість двох тисяч застережень, з порогом, який зупиняє мерж, і з датою наступної перевірки в календарі. Тепер він червоніє раз на два тижні, і щоразу хтось іде в коридор дивитись, що сталось.
Контур масштабується¶
Агент — це контур, зібраний у конструкцію: допуск, слід, ескалація і поетапність, віддані підсистемі разом із задачею; про це наступний розділ.
Команда — той самий контур на рівень вище: процес рев’ю, який півроку нічого не знаходить, — зелений ритуал у масштабі відділу, і питання до нього те саме: що тримає команду в рамках у ту хвилину, коли тимлід у відпустці?
Фірма — ще рівень: дашборд, який три роки показує зелені показники, і рада директорів, яка давно не питала, чи здатен він показати червоне.
Механіка на всіх рівнях одна. Змінюється лише ціна жучка.
У вашому ремеслі¶
Контур не знає, що таке код. Щиток є в кожному ремеслі.
Текст. Редактор, який особисто вичитує кожний згенерований абзац, — контроль на силі волі: він тримається до сотого абзацу, а далі читає по діагоналі. Допуск — список заборонених зворотів і перевірка довжини речень, яку прогін робить без редактора; ескалація — «якщо в джерелі немає цитати — постав позначку, не вигадуй». І кнопка «Тест»: раз на місяць підкласти абзац із вигаданою цитатою і подивитись, чи контур його зловить.
Аналітика. Звіт, який щомісяця проходить ту саму перевірку і щомісяця «сходиться», — кандидат на зелений ритуал. Спитайте: коли ця перевірка востаннє щось знайшла? Якщо ніколи — підкладіть у дані помилку в одному рядку і подивіться, чи звіт почервоніє. Керованість аналітичного процесу міряється так само: скільки зусиль коштує знайти, де саме розійшлось.
Дизайн. Гайдлайн, якого не міняли, поки продукт змінився двічі, — заіржавіле правило. Автоматична перевірка контрасту і відступів — автомат у щитку: спрацьовує без дизайнера. А «зроби в нашому стилі» без жодного способу перевірити, чи це наш стиль, — впевненість без вимірювання, і що впевненіша команда, то далі вона від еталона.
Наостанок — три питання до вашої практики.
— Назвіть один контур у вашій роботі, який тримається на конструкції, — і один, який тримається на тому, що ви уважні. Що станеться з другим, коли ви візьмете відпустку?
— Коли ваша автоматична перевірка — тест, лінтер, рев’ю-промпт — востаннє показала червоне? Якщо не пам’ятаєте — звідки ви знаєте, що вона ще працює?
— І глибше: що у вашому пайплайні можна вимкнути на пару тижнів так, щоб ніхто не помітив?
