JavaRush /Курси /Claude Code SELF /Баг, який бреше мовчки

Баг, який бреше мовчки

Claude Code SELF
Рівень 14 , Лекція 0
Відкрита

Ранок починається з телефона. У чаті з Артем2036 — свіжа картинка, без жодного рядка тексту, як завжди.

— Знову ребус зранку, — бурмоче Тьома і змахує картинку вгору. Розгадувати чужі загадки настрою немає. Хочеться чогось цікавого, веселого й легкого.

І щось легке тут як тут. Просто в порталі, серед важких зон, живе bonus-game — мініаркада з лідербордом: збираєш фішки в ряд, капають очки, найкращі потрапляють у таблицю. Після кількох тижнів серйозної роботи над порталом Тьома пірнає в неї, мов у басейн у спеку.

Перші спроби — суцільний кайф. Фішки летять, комбо клацають, очки капають, лідерборд росте. Тьома азартно ганяє партію за партією, ловить той самий старий драйв, за яким скучив: не «доведи-перевір», а просто весело.

І під час однієї зі спроб щось муляє око. Він збирає комбінацію, кидає погляд на табло — цифра якась велика. Ніби зібрав небагато, а набігло чимало.

— Це я позіхнув, чи що, — бурмоче він собі під ніс. Рука сіпнулася, зайве зібралося — буває.

Запускає ще раз, уже уважніше. Рахує збіги сам, уголос, тикаючи пальцем у екран: раз. Два. Три. Рівно три штуки в ряд. Він спеціально не поспішав. Переводить погляд на табло.

Тридцять.

Тьома завмирає на секунду. Три зібрав — тридцять прилетіло. Він ще не злиться, радше не вірить очам.

— Так. А ну-ка ще раз.

Третя спроба, четверта — уже не грає, а ловить. І система проступає, спокійна й нахабна: щоразу рівно в десять разів більше, ніж має бути. Не випадкове сміття, не «іноді збоїть». Три дає тридцять. Пʼять дасть пʼятдесят. Лічилка не сходить з глузду — вона рівно й холоднокровно бреше за одним і тим самим правилом.

— Ну хоч не навмання брешеш, — фиркає Тьома. — Із характером. — Випадковий баг шукай-свищи, а в цього є звичка. Світ не руйнується, але в лідерборд залітає нісенітниця.

І ось що в цьому багу найпаскудніше. Гра ж не падає. Не видає помилку, не зависає, не червоніє. Працює — бадьоро, весело, з анімацією, лідерборд справно набивається іменами та цифрами. Усе виглядає здоровим, живим, хоч зараз показуй клієнту. А всередині гнилизна саме в тому місці, заради якого вся гра й задумувалась, — у чесному підрахунку.

Тьома пише Сашкові — перевірити, чи не привиділося:

— Сашку, глянь bonus-game. Збираю три в ряд — на табло тридцять. Це баг?

— Баг, — відповідає Сашко. — Дивлюся логіку рахунку: за кожне збігання нараховується в десять разів більше належного. Стабільно, не випадково. Лагодити?

— Почекай із лагодженням. — Тьому чіпляє не сам баг, а його звичка. — Ти тільки подивися, який хитрий. Гра ж не падає, червоним не кричить. Навпаки — усміхається, махає анімацією й бреше з чесним обличчям. Загляне сюди хтось похапцем — побачить бадьору аркаду зі зростаючими очками й піде задоволений.

— Так і є, — підтверджує Сашко. — Зовні все зелене. Проблема лише в самих числах.

І ось на цьому «зовні все зелене» в Тьоми в голові спливає стара стрічка з нічного логу — та, яку він давно відклав. Як агент колись підлаштував перевірку під бажане: зробив, щоб усе виглядало добре, а насправді нічого не полагодив. І після цього Льоха вбивав йому в голову істину: звіту «готово» не вір, готово — це коли доведено. Тоді Тьома кивнув і забув. А зараз — ось воно, наживо.

— Слухай, а це ж те саме, — каже він уголос, уже не Сашкові, а собі. — Памʼятаю, мене вчили не вірити, коли кажуть «готово»? Так от тут сходинка вище. Мало того що звіт може брехати. Виявляється, можна підробити сам доказ. Зробити все зеленим і майже готовим — а код усе одно бреше.

Сам баг він уже майже намацав — справа в кількох рядках формули рахунку, Сашко полагодить і не спітніє. Але за багом стирчить щось більше, і він ще не знає, як це назвати.

1. Не «воно зламалося», а постановка задачі

Тьома відкриває чат із Льохою, починає за звичкою: «Льох, тут зламалося…» — і стирає. Рука сама тягнеться до нотатки-постановки. Замість ниття він накидає: сценарій, де bonus-game збоїть, який шматок зачеплено, що має стати — три в ряд дають три очки, а не тридцять. Криво, але це вже не скарга, а замовлення.

— Слухай, — пише він Льохові, перечитавши. — Я ж сідав просто поплакатися «воно зламалося». А накатав половину постановки. Само вийшло.

— Само, ага, — озивається Льоха. — Кілька тижнів тому ти б прибіг із криками «зламалося, лагодь» і чекав би, поки я все розкладу. А тут сам поганяв, сам знайшов сценарій, сам тицьнув у рахунок, а не у відмальовування. «Що бісить» і «що конкретно не так» у тебе розʼїхалися. Це, брате, уже ріст.

Льоха це помічає — уперше майже не лізе переписувати за нього, читає чернетку, як редактор — чужу роботу.

— Нормально, — пише Льоха. — Баг ти описав. Де живе, що має стати — є. А тепер головне питання сьогоднішнього дня: як ти доведеш, що полагодив саме це?

І ось на цьому питанні Тьома зависає.

2. Чотири речі, які не можна змішувати в ТЗ

Тьома відкриває рота — і розуміє, що чіткої відповіді немає. Ну… полагоджу, прогоню, буде зелене. Льоха чіпляє саме це «буде зелене»:

— А «зелене» — це доказ чого? Що баг пішов? Чи що хтось зробив рядок звіту зеленим? Це, брате, дві дуже різні речі, і сьогодні ти дізнаєшся, наскільки.

Він не розгортає теорію, він тисне формулюванням — як редактор, що тикає в кожне розмите місце. Спочатку — про межі. Фрази «полагодь рахунок» Льоху замало:

— А що саме ти дозволяєш чіпати ШІ? Ось агент полізе лагодити рахунок і заодно перепише тобі відмальовування гри, яка працює. Хто винен? Ти — не сказав, де стоп. Обовʼязково назви сусідні зони, яких торкатися не можна.

Тьома спочатку відмахується — ну навіщо, я ж прошу тільки рахунок полагодити, до чого тут відмальовування. Льоха не ведеться:

— «Прошу тільки рахунок» — це в тебе в голові. А агент бачить увесь файл гри. Скажеш «полагодь, щоб три давало три» — він може вирішити, що заодно треба «покращити» сусіднє, раз уже заліз. І прилетить тобі фікс, де рахунок правильний, але кнопки поїхали. Межа — не просто ввічливість для агента, це твоя страховка. Обовʼязково пиши, що не можна.

Тьома вловлює суть і дописує: ввід та відмальовування не чіпати, там усе працює, баг тільки в лічилці. Льоха киває — уже тепліше. Потім тисне на друге, на критерій:

— Тепер головне місце. Пиши не лише «як має стати», а й за якою ознакою буде видно, що виправлено рівно цей збій, а не намальовано лише відчуття покращення. «Стало краще» — не критерій. «Три в ряд дають три очки, а не тридцять» — критерій, його видно очима і можна перевірити.

Тьома вже бачить, до чого хилить Льоха: ганяє його не по коду, а по суті — змушує назвати цільову поведінку так, щоб це можна було перевірити, а не «за відчуттям». І поступово в чернетці ТЗ проступають чотири окремі речі, а не одна каша:

# TASK_SPEC — баг рахунку в bonus-game
ДЕФЕКТ:    3 в ряд нараховує 30 очок замість 3 (логіка рахунку бреше)
БАЖАНЕ:    3 в ряд = 3 очки; лідерборд отримує правильне значення
НЕ ТРОГАТИ: сусідні зони гри (відмальовування, введення) — там працює
ДОКАЗ:     чим саме покажу, що виправлено САМЕ цей баг (← заповню до вечора)

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

3. Складніше за баг — доказ

Тьома дивиться на цей порожній рядок, як на недороблену клітинку в анкеті: заповнити зобовʼязаний, а нічим. Раніше його ТЗ завжди закінчувалося на «бажаному» — ось баг, ось як має стати, поїхали лагодити, і цього вистачало з головою. А тут під «бажаним» зияє ще одна графа, і вона іншої породи.

— Слухай, ну а що тут заповнювати, — пробує він. — Полагоджу, запущу тест — буде PASS. Ось тобі й доказ.

— Стоп. Це ти знову про «буде зелене», — Льоха не дає зіскочити. — Я тебе на цьому ловлю вдруге. «Запущу тест, буде зелене» — це не доказ, це надія. Доказ — це коли ти заздалегідь знаєш, яка саме перевірка впіймає рівно ЦЕЙ баг, і чому їй взагалі можна вірити. Оце в графу й пиши. А «буде зелене» — викинь, до вечора зрозумієш чому.

Тьома не до кінця розуміє, але графу залишає порожньою чесно — не затикає її фальшивим «прогоню тест». І вголос підводить підсумок сам, хай і криво:

— Виходить, я сьогодні роблю не одну роботу, а дві. Одна — полагодити рахунок. Друга — побудувати доказ, що я його справді полагодив, а не прикрасив. І друга, ти кажеш, складніша за першу.

— Складніша і важливіша, — відповідає Льоха. — Полагодити-то будь-який дурень попросить. А ось довести так, щоб не можна було схитрувати, — це вже ремесло.

Тьома закриває нотатку з однією порожньою графою.

— Дожили, — фиркає він. — Раніше код написав — і все. А тепер ще доводь, що він не бреше. Наче за самим собою стежити треба.

— Ось саме за собою, — озивається Льоха. — Найхитріший брехун — це власне «ніби працює». Сьогодні вчишся його ловити.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ