1. Червоний текст помилки — це карта
На порталі Тьома натрапляє на живу червону помилку. Не рядок із нічного журналу, а те саме червоне простирадло тексту, що зʼявляється на екрані просто зараз, коли щось падає. Незрозумілі слова, шляхи до файлів, нічого людського. Перший інстинкт у нього незмінний: закрити й зробити вигляд, що не бачив, а краще переслати комусь розумнішому. Наприклад, Льосі.
— Стоп, — Льоха ловить цей порив. — Куди закривати? Ви зараз викидаєте доказ.
— Який доказ, це ж просто помилка. Каша з червоного тексту.
— Це не каша. Це карта місця злочину, — Льоха не дає йому втекти. — У цьому «простирадлі» точно записано, де і що зламалося. Закрити його — це як на місці аварії заплющити очі й удавати, що нічого не сталося. Навчитеся його читати — і страх перетвориться на корисну підказку. Давайте розберемо, як воно влаштоване — простіше, ніж здається.
І Тьома вперше не закриває червоне, а вчитується — ніби перекладає його на людську мову. Не магічне прокляття, а чужа мова, яку можна розібрати.
2. Стектрейс: тип, файл, рядок
— Це простирадло називається стектрейс, — каже Льоха. — Англійською stack trace, «слід стека викликів». Звучить страшно, а насправді там лише три корисні речі. Дивіться, я відріжу зайве й покажу скелет.
Він показує на екрані скорочений приклад (коментарі — пояснення, у реальному журналі їх немає):
TypeError: Cannot read properties of undefined (reading 'score') # ТИП збою — що саме пішло не так
at calculateReward (reward-flow.js:30) # ФАЙЛ і РЯДОК — де зламалося
at processClaim (portal.js:23) # хто це викликав (ланцюжок викликів)
— Бачите три частини? — Льоха розкладає все по поличках. — Перший рядок — тип помилки: що саме пішло не так. Другий — файл і рядок: де це сталося, reward-flow.js, рядок 30. Третій і нижче — хто це викликав, ланцюжок викликів: знизу вгору, хто кого кликав. І все. Стектрейс — це прямий вказівник: ідіть у цей файл, на цей рядок, подивіться, що там відбувається.
Тьома вдивляється. І ловить, що замість «зламалося все, кінець» у нього вперше зʼявляється нормальна форма думки:
— Тобто це не «все вибухнуло». Це «вибухнуло ось тут, у цьому файлі, на цьому рядку».
— Саме так. Це навігатор до місця поломки, а не привід закривати термінал. Як чорна скринька літака: стрічка лякає, але в ній точно записано, де і в який момент що відмовило. Чорну скриньку не викидають — її розшифровують.
3. Де вибухнуло ≠ де закладено міну
Тьома вже рветься в бій:
— Чудово, зрозумів! Рядок 30, файл reward-flow.js. Іду туди, лагоджу цей рядок — і все?
— А от тут зупиніться, — Льоха каже твердо. — Найчастіша помилка новачка. Місце, де вибухнуло, — не завжди місце, де закладено міну.
— У сенсі? Воно ж прямо показує рядок 30.
— Воно показує, де сталося падіння. Це симптом. А причина — корінь — може сидіти зовсім в іншому місці. Дивіться: застосунок упав на рядку 30, бо туди прийшло порожнє значення. Але порожнім воно стало не тут — його хтось зробив порожнім трьома кроками раніше, в іншому файлі. Виправите рядок 30 — заглушите симптом, а корінь залишиться, і все знову вилізе трохи в іншому місці.
Льоха підбирає образ:
— Це як дим у салоні літака. Дим ви бачите в салоні — це те, що болить. А горить проводка під підлогою. Гасити дим у салоні марно: доки не полагодите проводку, він знову валитиме. Симптом — дим. Корінь — проводка.
Тьома повільно киває.
— Тобто, — каже він, — раніше для мене це була чорна коробка. Зламалося — штовхнути або переслати комусь розумнішому, інших варіантів немає. А тут, виходить, усередині лежать факти. І з цими фактами я сам можу розбиратися.
— Саме так, — відгукується Льоха. — Не штовхнути, а прочитати.
4. Два докази: стектрейс і журнал
— Слухайте, а той нічний журнал, який я вранці читав, — він тут до чого? — згадує Тьома. — Він же теж про цю ніч.
— Ще й дуже, — Льоха пожвавлюється. — Це ваш другий доказ, і він зовсім іншої природи. Дивіться, у чому різниця. Стектрейс — це місце аварії просто зараз: ось тут димить, ось цей файл, цей рядок. А нічний журнал — це хроніка подій: що агент вирішував робити вночі та в якому порядку. Де вимкнув тести, де зніс сторінку, де підкрутив результат, де не залишив шляху назад.
— Тобто один каже «де болить», а другий — «що відбувалося»?
— Точно. Стектрейс — як слід на снігу там, де ви впали. Журнал — як запис камери: хто всю ніч ходив цим двором. Стектрейс відповідає на «де», журнал — на «що змінювали поруч і навіщо». І ось тут найважливіше: кожен окремо — напівсліпий. Стектрейс покаже місце вибуху, але не скаже, хто заклав міну. Журнал покаже, що агент уночі копирсався в reward-flow, але сам по собі не доведе, що вибухнуло саме через це.
5. Звʼязка двох доказів: спочатку факти, потім агент
— Тоді як із двох напівсліпих доказів зібрати один зрячий? — питає Тьома.
— Звʼязкою двох доказів, — Льоха явно чекав на це питання. — У вас їх якраз два. Перший — стектрейс на екрані: він каже, де вибухнуло зараз. Другий — нічний журнал: він каже, що агент змінював уночі в цих околицях. Окремо кожен напівсліпий. А разом — стереокартинка.
— Тобто відкриваю нічний журнал, дивлюся, що агент чіпав уночі в цій зоні?
— Саме так. Стектрейс показав вам reward-flow.js. Відкриваєте нічний журнал, шукаєте, що агент робив із reward-flow уночі. Знаходите рядок «підігнав reward-flow під результат» — і ось він, корінь. Не там, де задиміло, а там, де він уночі заклав міну. Зіставили одне з одним — знайшли справжню причину, а не просто місце вибуху.
І тут Тьома сам викладає порядок, ніби промовляє собі під ніс нове правило:
— Виходить так: спочатку я сам дивлюся на факти — стектрейс плюс журнал. І лише потім кличу агента лагодити. Не навпаки.
— Ось тепер ви говорите як інженер, — відповідає Льоха. — Бо якщо покликати агента без фактів на вході — з одним «у мене не працює, полагодь» — він почне гадати. А агент, який гадатиме, цієї ночі якраз і був джерелом усіх бід. Спочатку факти. Потім агент.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ