Rain Lag

Пяти-вопросный дневник отладки: маленький ритуал, который тихо прокачивает каждый фикс бага

Как простой дневник отладки из пяти вопросов превращает любой баг в возможность обучаться, снижает количество повторяющихся ошибок и помогает создать лёгкую базу знаний для вас и вашей команды.

Введение

Большинство разработчиков отлаживают «на инстинктах»: уставились в код, накидали пару console.log, покрутили что‑то туда‑сюда, пока не зашевелилось, закатили фикс — и вперёд к следующей задаче.

Это работает — пока не приходит баг того же класса. Потом ещё один. И ещё. Стек‑трейсы разные, корневая причина — одна и та же.

Проблема не в том, что мы не умеем чинить баги. Проблема в том, что мы почти никогда системно на них не учимся.

Эту ситуацию может изменить маленький, но регулярный ритуал: дневник отладки из пяти вопросов. На каждый баг уходит несколько минут, но за недели и месяцы он тихо прокачивает:

  • ваши навыки отладки,
  • ваши архитектурные решения,
  • и общие знания команды.

Речь не о тяжёлых процессах и постмортемах по каждому опечаточному багу. Это про лёгкий цикл рефлексии, который встраивается прямо в обычный рабочий поток.

Разберём эти пять вопросов и то, как они связаны с более умной отладкой.


Пяти-вопросный дневник отладки

После того как вы пофиксили баг — но до того, как забудете, как это было больно, — зафиксируйте ответы на эти пять вопросов:

  1. Что было сломано и как это проявлялось?
  2. В чём была реальная корневая причина? (Конкретно.)
  3. В каких данных, конфигурации или окружении были неверные допущения?
  4. Как именно я нашёл баг? (Что сработало, а что нет?)
  5. Что я могу изменить, чтобы этот класс багов реже появлялся в будущем?

И всё.

Каждый вопрос мягко подталкивает перепроверить входные данные, конфиг и собственную ментальную модель — именно там чаще всего и прячутся «мистические» баги.

Ниже разберём каждый вопрос подробнее и привяжем его к конкретным чек‑листам и привычкам.


1. Что было сломано и как это проявлялось?

Большинство багрепортов расплывчаты: «Не работает», «Платёж не прошёл», «Страница всё время грузится».

Запись в вашем дневнике должна начинаться с наблюдаемых симптомов, а не с догадок:

  • точное сообщение об ошибке или стек‑трейс,
  • URL или функциональность, где это проявилось,
  • шаги действий пользователя,
  • окружение (prod, staging, локально; ОС; браузер или клиент; версии).

Это заставляет ответить на вопросы: Что именно я увидел? При каких условиях?

Пример записи:

Симптом: страница оформления заказа отдаёт 500 Internal Server Error при применении промокода только в продакшене. На staging всё работает.
Контекст: prod, Node 18, промокод BLACKFRIDAY2025, только для новых пользователей.

Вы уже на шаг впереди: многие баги висят неделями только потому, что никто толком не записал, как их воспроизвести.


2. В чём была реальная корневая причина? (Конкретно.)

«Падал API» — это не корневая причина.

«Сервис скидок вернул null, потому что наша валидация отклоняла коды длиной больше 10 символов» — уже да.

В дневнике должна появиться одна чёткая, конкретная формулировка, которая объясняет, что пошло не так, на уровне, понятном на обычном языке:

  • «Мы предполагали, что поле price всегда число; в продакшене оно оказалось строкой».
  • «Cron‑задача запускалась дважды, потому что расписание было настроено и в приложении, и в инфраструктуре».
  • «Мы обрабатывали таймауты по сети, но не обрабатывали ошибки DNS‑разрешения».

Когда вы вынуждены это сформулировать, внезапно начинают проявляться паттерны:

  • «Мы регулярно неправильно обрабатываем null/undefined».
  • «Мы слишком доверяем форматам данных от внешних сервисов».
  • «Мы постоянно забываем о конвертации часовых поясов».

Именно в этих повторяющихся мотивах и лежит источник долгосрочных улучшений.


3. В каких данных, конфигурации или окружении были неверные допущения?

Удивительно много «багов в коде» на самом деле оказываются проблемами данных, конфигурации или окружения.

Используйте этот вопрос, чтобы системно проверить следующее.

a) Входы, выходы и крайние случаи

Спросите себя:

  • Проверил ли я реальные входные данные во время выполнения?
    (Настоящие payload’ы, тела запросов, файлы, пользовательский ввод, строки в БД.)
  • Убедился ли я, что выходные данные соответствуют ожиданиям?
    (Коды ответа, формат тела, побочные эффекты, изменения в базе данных.)
  • Протестировал ли я крайние случаи?
    • пустые списки, null, нули, очень большие значения, не‑ASCII символы, странные даты и т.п.

Типичные находки:

  • API принимал null, к которому ваш код не был готов.
  • UI отправлял пустую строку вместо null.
  • «Редкий» сценарий (несколько скидок, отсутствие e‑mail, протухший токен) активировал неоттестированный путь.

b) Конфигурация, переменные окружения и зависимости

Теперь посмотрите на всё, что вокруг кода:

  • Конфиги: feature‑флаги, YAML/JSON‑конфиги, настройки сборки.
  • Переменные окружения: отсутствуют, неверные значения, различия между staging и prod.
  • Внешние зависимости: сервисы лежат, выкатили новую версию, сработали rate limit’ы, изменился контракт API.

Вопросы для самопроверки:

  • Я проверил конфиг именно в том окружении, где проявляется баг?
  • Есть ли различия между local / staging / production в конфиге?
  • Мы полагались на значение по умолчанию, которое кто‑то поменял?

Пример фрагмента дневника:

Неверное допущение: DISCOUNT_SERVICE_URL одинаково задан в staging и production.
Реальность: в продакшене переменная указывала на старую версию микросервиса, который возвращал чуть другой JSON.

Зафиксировав это один раз, вы в следующий раз с куда большей вероятностью начнёте отладку с проверки конфига, а не закончите ей.


4. Как именно я нашёл баг? (Что сработало, а что нет?)

Здесь вы описываете сам процесс отладки, а не только итог.

Особенно важно отметить:

  • какие шаги были полезными,
  • какие — потерей времени,
  • какие инструменты или техники дали ключевое озарение.

Используйте простые и прицельные инструменты

Не для каждого бага нужны сложные observability‑системы. Часто самый быстрый путь — это:

  • console.log / print с выводом ключевых значений переменных,
  • маленькие «пробные» скрипты или одноразовые тесты для одного конкретного метода или эндпоинта,
  • запросы к базе данных для просмотра конкретных строк,
  • DevTools браузера / вкладка Network.

В записи это может выглядеть так:

Потратил 45 минут, читая код и гадая.
Что реально помогло: добавил console.log("discount payload", payload) и сравнил запросы из staging и prod.

или так:

Существенно сузил поиск, написав маленький скрипт, который дёргает сервис скидок с падающим payload’ом. Увидел, что в prod поле code: "BLACKFRIDAY2025" иногда приходит числом.

Со временем вы начнете видеть, какие техники стабильно окупаются. Так формируется ваш личный стиль отладки.


5. Что я могу изменить, чтобы этот класс багов реже появлялся в будущем?

Это самый важный вопрос.

Вы чините не только этот баг — вы снижаете вероятность появления его «родственников».

Думайте на трёх уровнях.

a) Мгновенные «ограждения»

Что можно добавить прямо сейчас как быстрый и практичный способ профилактики?

  • Добавить валидацию входных данных (типы, диапазоны, обязательные поля).
  • Усилить сообщения об ошибках и логирование (ID, форма payload’а, окружение).
  • Написать тесты (unit, интеграционные, регрессионный тест под конкретный сценарий).

Пример:

Добавил схему‑валидацию для payload’ов скидок и регрессионный тест для кодов длиной >10 символов.

b) Среднесрочные улучшения

Что можно улучшить в дизайне или архитектуре?

  • Делиться типами/контрактами между сервисами (OpenAPI, protobuf, общие модели).
  • Централизовать разбор и валидацию конфигурации.
  • Включить более строгий линтинг или типизацию.

Пример:

Нам стоит вынести описание payload’а скидок в общий тип TypeScript, вместо того чтобы копировать его в трёх сервисах.

c) Процессы и обмен знаниями

Что стоит донести до команды?

  • Заметку в wiki команды о странном поведении конкретного внешнего API.
  • Пункт в чек‑лист релиза («Проверить, что env‑переменные совпадают между staging/prod»).
  • Короткое сообщение в Slack/Team’с с кратким разбором бага и фикса.

Так ваши записи из дневника постепенно превращаются в базу знаний по реальным инцидентам.


Где хранить дневник отладки

Дневник должен быть лёгким и легко доступным, иначе вы просто не будете им пользоваться.

Практичные варианты:

  • файл debug-diary.md в репозитории,
  • папка debug/ с одним markdown‑файлом на каждый значимый баг,
  • страница в wiki или Notion,
  • личное приложение заметок, если вы работаете в одиночку.

Простой шаблон:

# Баг: [краткий заголовок] **Дата:** 2025-01-01 **Окружение:** (prod/staging/local, версии и т.п.) ## 1. Что было сломано и как это проявлялось? [Симптомы, ошибки, шаги воспроизведения] ## 2. В чём была реальная корневая причина? [Объяснение человеческим языком] ## 3. В каких данных/конфиге/окружении были неверные допущения? [Входы, выходы, крайние случаи, конфиг/окружение/зависимости] ## 4. Как именно я нашёл баг? [Что сработало, что нет, какие инструменты использовал] ## 5. Как я буду предотвращать этот класс багов? [Ограждения, тесты, изменения в дизайне, документация]

Старайтесь делать записи довольно краткими — на это должно уходить 5–10 минут на каждый действительно значимый баг.


Как это окупается со временем

Сначала это воспринимается как лишняя работа. Но через несколько недель вы замечаете:

  • Быстрее отлаживаете — узнаёте знакомые паттерны («Похоже на рассинхрон конфига»).
  • Меньше повторяющихся проблем — вы уже добавили тесты, валидацию и внятные логи в самые «больные» места.
  • Легче онбордить новичков — они могут читать реальные истории из дневника и учиться на настоящих кейсах.
  • Чётче мыслите — вы учитесь разделять симптомы и причины, факты и гипотезы.

Код вы всё равно бы написали тот же, но теперь вокруг него есть небольшой цикл осмысленной рефлексии.


Заключение

Отладка неизбежна. Повторное проживание одних и тех же уроков — нет.

Пяти‑вопросный дневник отладки превращает каждый баг в маленькое исследование:

  1. Что сломалось и как это проявлялось?
  2. В чём была реальная корневая причина?
  3. В каких данных/конфигурации/окружении были неверные допущения?
  4. Как именно я нашёл баг?
  5. Как я буду предотвращать этот класс багов в будущем?

Последовательно проверяя входы, выходы, крайние случаи, конфигурацию и окружения — и фиксируя, как именно вы отлаживали — вы создаёте тихое, но мощное преимущество.

Не нужно кардинально менять процессы. Начните со следующего нетривиального бага. Откройте markdown‑файл, ответьте на пять вопросов и закатите фикс.

Будущий вы (и ваши коллеги) будут благодарны за те «хлебные крошки», которые вы оставили по пути.

Пяти-вопросный дневник отладки: маленький ритуал, который тихо прокачивает каждый фикс бага | Rain Lag