Rain Lag

Отладка с двумя блокнотами: разделяй «думать» и «делать», чтобы распутывать сложные баги быстрее

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

Отладка — это то место, где происходит настоящая разработка. Фичи — это весело; баги — это проверка, действительно ли вы понимаете свою систему.

Но под давлением дедлайнов большинство из нас отлаживает так:

  • Смотрим на сломанное поведение
  • Делаем смутное предположение
  • Тыкаемся в код
  • Снова запускаем
  • Повторяем, пока либо баг не исчезнет, либо не кончится сила воли

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

В этом посте вы узнаете:

  • Почему отладка — это в первую очередь про гипотезы и ментальные модели, а не только про инструменты
  • Как когнитивная нагрузка мешает вам отлаживать
  • Практический рабочий процесс с двумя блокнотами для сложных багов
  • Как такой подход раскладывает отладку на обучаемые подпункты-навыки

Отладка — это задача мышления, а не только инструментов

Десятилетия исследований в области отладки и понимания программ сходятся в нескольких идеях:

  1. Хорошие отладчики формируют чёткие гипотезы.
    Они не говорят просто: «Что-то сломалось в auth flow». Они говорят: «Я думаю, что token.expiry интерпретируется в секундах в сервисе A и в миллисекундах — в сервисе B». Такая идея конкретная, проверяемая и опровержимая.

  2. Они строят и уточняют ментальные модели.
    Проверяя гипотезы, они постоянно обновляют внутреннюю модель того, как ведут себя код, данные и окружение. Если что-то в модель не вписывается, этот разрыв — подсказка.

  3. Они осознанно итеративны.
    Они запускают эксперименты, интерпретируют результаты и корректируют направление, а не мечутся случайно.

Инструменты вроде дебаггеров, профилировщиков и логов критически важны — но только как усилители вашего мышления. Если ментальные модели и гипотезы размыты, больше данных означает просто больше шума.


Скрытый враг: когнитивная нагрузка во время отладки

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

Вы пытаетесь одновременно держать в голове:

  • Несколько возможных причин
  • Обрывки стэков вызовов и потоков данных
  • Крайние случаи и странные входные данные
  • Шёпот интуиции («Похоже на гонку… или кеш… или и то и другое?»)
  • Давление команды и сроки

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

  • Забываете, какие гипотезы уже проверяли
  • Снова запускаете один и тот же неудачный эксперимент
  • Залипаете на одной теории и игнорируете противоречащие факты

Решение — не «сильнее напрягать мозг». Решение — выгружать мысли во внешнюю структуру, чтобы мозг занимался рассуждением, а не запоминанием.

Здесь на сцену выходит отладка с двумя блокнотами.


Отладка с двумя блокнотами: идея

Идея: физически или цифрово разделить пространство, где вы думаете, и пространство, где вы делаете.

  • Блокнот 1: Блокнот для мышления
    Назначение: фиксировать гипотезы, ментальные модели, планы и выводы.

  • Блокнот 2: Блокнот для действий
    Назначение: записывать конкретные шаги, эксперименты, команды и наблюдения.

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

Почему это работает:

  • Это структурирует отладку как цикл экспериментов, а не хаос
  • Это снижает когнитивную нагрузку, перекладывая память во внешние заметки
  • Это заставляет прояснять мысли: «Что я на самом деле думаю, что происходит?»
  • Это создаёт обучающую «тропу», к которой можно вернуться и улучшить процесс

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


Блокнот 1: Блокнот для мышления

Здесь вы планируете, моделируете и интерпретируете. Здесь нет деталей реализации вроде конкретных команд; это место про то, что происходит концептуально.

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

1. Формулировка проблемы

Напишите чёткое описание бага.

  • Наблюдаемое поведение: Что именно происходит?
  • Ожидаемое поведение: Что должно происходить вместо этого?
  • Минимальное воспроизведение (если известно): Входные данные, шаги, окружение.

Это защищает от «багов, которые уползают», когда ваше представление о них меняется прямо в процессе отладки.

2. Окружение и контекст

Зафиксируйте ограничения, которые могут быть важны:

  • Ветка / коммит
  • Задействованные сервисы и их версии
  • Важные конфиги или feature flags

Это даёт снимок того мира, в котором живёт баг.

3. Текущая ментальная модель

Опишите, как вы думаете, работает эта часть системы, даже если не уверены.

Например:

«Запрос идёт Gateway → AuthService → UserService. Токены авторизации валидируются в AuthService и прикрепляются к контексту запроса. UserService доверяет этому контексту и не перевалидаирует токен.»

Вы не документируете всю систему — только тот срез, который относится к багу.

4. Список гипотез

Это ядро.

Перечислите каждую гипотезу как пронумерованное, проверяемое утверждение:

  1. H1: «Токен авторизации отсутствует в запросах с мобильного клиента из‑за устаревшего SDK.»
  2. H2: «Токен есть, но он просрочен, и проверка срока годности ломается на часовых поясах.»
  3. H3: «Токен валиден, но UserService иногда обходит проверку auth для кешированных ответов.»

Для каждой гипотезы добавьте:

  • Уверенность (например, 20 %, 50 %)
  • План проверки: «Добавить логирование в AuthService, печатать токен + expiry и сравнить мобильный клиент с вебом.»

Вы превращаете смутную интуицию в явные ставки и конкретные эксперименты.

5. Результаты и обновление модели

После каждого эксперимента вернитесь сюда и запишите:

  • Какую гипотезу проверяли
  • Что ожидали увидеть
  • Что на самом деле наблюдали
  • Как меняется ваша ментальная модель

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


Блокнот 2: Блокнот для действий

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

Каждая запись может включать:

  • Время
  • Ссылку на гипотезу (например, «Проверяю H2»)
  • Выполненные команды, вызванные endpoints, просмотренные данные
  • Важные фрагменты логов или выводов

Например:

15:42 — проверка H2 (timezone срока действия)

  • Добавил временный лог в AuthService: log.info("expiry={}, now={}", token.expiry, Instant.now())
  • Воспроизвёл через мобильный клиент
  • Увидел expiry на 5 минут в будущем, now в правильном часовом поясе
  • Вывод: проблема не в timezone срока действия → Понизил уверенность в H2 с 40 % до 5 %

Почему держать это отдельно?

  • Это не даёт Блокноту для мышления превратиться в шумную стенограмму
  • Это позволяет позже восстановить последовательность шагов для постмортемов или документации
  • Это помогает не повторять один и тот же неудачный эксперимент

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


Как система из двух блокнотов раскладывает навыки отладки

Ещё одно преимущество подхода в том, что он разбивает отладку на меньшие, тренируемые подпункты-навыки:

  1. Генерация гипотез (Блокнот для мышления)
    Практика: заставляйте себя выписать минимум три правдоподобные причины до того, как что‑то тестировать. Это противоядие против преждевременной фиксации на первой версии.

  2. Проектирование эксперимента (Блокнот для мышления)
    Практика: для каждой гипотезы придумывайте самый дешёвый и быстрый тест, который может её опровергнуть. Не «переписать подсистему X», а «залогировать Y и проверить, бывает ли он null».

  3. Выполнение эксперимента (Блокнот для действий)
    Практика: выполняйте запланированный тест с минимумом «а заодно ещё вот это подправлю».

  4. Интерпретация результатов и обновление модели (Блокнот для мышления)
    Практика: всегда пишите однострочный вывод: «Этот эксперимент повысил мою уверенность в H3, потому что…»

  5. Стратегия поиска (оба блокнота)
    По мере накопления багов ваши заметки показывают паттерны того, как вы исследуете пространство причин. Эту стратегию можно затем осознанно улучшать.

Давая названия и границы этим поднавыкам, вы превращаете отладку в то, что можно целенаправленно тренировать, а не в что‑то, в чём вы «по идее станете лучше с опытом».


Выбор инструментов для двух блокнотов

Ничего сложного не требуется, но немного структуры помогает.

Возможные варианты:

  • Бумага + цифра: Бумага для мышления (удобно рисовать и черкать), текстовый файл или scratchpad в редакторе — для действий.
  • Два файла в репозитории: bug-123-thinking.md и bug-123-doing.md в папке /debug-notes.
  • Приложение для заметок: Одна заметка с двумя заголовками: # Thinking и # Doing (можно и на русском, важно разделение).

Ищите инструменты, которые упрощают:

  • Добавление временных меток
  • Ссылки на код, логи и PR
  • Поиск по прошлым багам по ключевым словам или компонентам

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


Обучение и менторство в отладке через два блокнота

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

  • Разберите их Блокнот для мышления: Насколько конкретны гипотезы? Обновляют ли они модель? Или просто мечутся?
  • Разберите их Блокнот для действий: Запускают ли они большие, медленные эксперименты вместо точечных? Повторяют ли одни и те же шаги?

Поскольку отладка сильно нагружает голову, разделение «думать» и «делать» снижает нагрузку для обучающихся. Им не нужно держать весь баг в голове: часть тяжёлой работы несут заметки.

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


Итог: замедлиться, чтобы отлаживать быстрее

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

Но на практике она:

  • Сокращает случайное метание
  • Делает ваше мышление видимым и проверяемым
  • Снижает когнитивную нагрузку, чтобы вы мыслили яснее
  • Превращает отладку в набор навыков, которые можно улучшать

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

Вы будете выпускать фиксы быстрее. И, что важнее, вы будете лучше понимать свой код каждый раз, когда баг заставляет вас вглядеться в него внимательнее — а это в долгосрочной перспективе самая ценная часть отладки.

Отладка с двумя блокнотами: разделяй «думать» и «делать», чтобы распутывать сложные баги быстрее | Rain Lag