Отладка с двумя блокнотами: разделяй «думать» и «делать», чтобы распутывать сложные баги быстрее
Как простая система из двух блокнотов, разделяющая «мышление» и «действие», помогает отлаживать спокойнее, системнее и эффективнее.
Отладка — это то место, где происходит настоящая разработка. Фичи — это весело; баги — это проверка, действительно ли вы понимаете свою систему.
Но под давлением дедлайнов большинство из нас отлаживает так:
- Смотрим на сломанное поведение
- Делаем смутное предположение
- Тыкаемся в код
- Снова запускаем
- Повторяем, пока либо баг не исчезнет, либо не кончится сила воли
Есть способ лучше — согласованный и с исследованиями по отладке, и с тем, как устроен наш мозг: разделить «думать» и «делать» с помощью простой системы из двух блокнотов.
В этом посте вы узнаете:
- Почему отладка — это в первую очередь про гипотезы и ментальные модели, а не только про инструменты
- Как когнитивная нагрузка мешает вам отлаживать
- Практический рабочий процесс с двумя блокнотами для сложных багов
- Как такой подход раскладывает отладку на обучаемые подпункты-навыки
Отладка — это задача мышления, а не только инструментов
Десятилетия исследований в области отладки и понимания программ сходятся в нескольких идеях:
-
Хорошие отладчики формируют чёткие гипотезы.
Они не говорят просто: «Что-то сломалось в auth flow». Они говорят: «Я думаю, чтоtoken.expiryинтерпретируется в секундах в сервисе A и в миллисекундах — в сервисе B». Такая идея конкретная, проверяемая и опровержимая. -
Они строят и уточняют ментальные модели.
Проверяя гипотезы, они постоянно обновляют внутреннюю модель того, как ведут себя код, данные и окружение. Если что-то в модель не вписывается, этот разрыв — подсказка. -
Они осознанно итеративны.
Они запускают эксперименты, интерпретируют результаты и корректируют направление, а не мечутся случайно.
Инструменты вроде дебаггеров, профилировщиков и логов критически важны — но только как усилители вашего мышления. Если ментальные модели и гипотезы размыты, больше данных означает просто больше шума.
Скрытый враг: когнитивная нагрузка во время отладки
У сложных багов обычно есть общий признак: они перегружают вашу рабочую память.
Вы пытаетесь одновременно держать в голове:
- Несколько возможных причин
- Обрывки стэков вызовов и потоков данных
- Крайние случаи и странные входные данные
- Шёпот интуиции («Похоже на гонку… или кеш… или и то и другое?»)
- Давление команды и сроки
Исследования в когнитивной психологии однозначны: рабочая память мала и хрупка. Когда она перегружена, ваше мышление ухудшается. Вы:
- Забываете, какие гипотезы уже проверяли
- Снова запускаете один и тот же неудачный эксперимент
- Залипаете на одной теории и игнорируете противоречащие факты
Решение — не «сильнее напрягать мозг». Решение — выгружать мысли во внешнюю структуру, чтобы мозг занимался рассуждением, а не запоминанием.
Здесь на сцену выходит отладка с двумя блокнотами.
Отладка с двумя блокнотами: идея
Идея: физически или цифрово разделить пространство, где вы думаете, и пространство, где вы делаете.
-
Блокнот 1: Блокнот для мышления
Назначение: фиксировать гипотезы, ментальные модели, планы и выводы. -
Блокнот 2: Блокнот для действий
Назначение: записывать конкретные шаги, эксперименты, команды и наблюдения.
Это могут быть настоящие бумажные тетради, два документа в приложении для заметок, две секции в шаблоне для отладки или даже две панели в системе личных знаний. Главное — концептуальное разделение.
Почему это работает:
- Это структурирует отладку как цикл экспериментов, а не хаос
- Это снижает когнитивную нагрузку, перекладывая память во внешние заметки
- Это заставляет прояснять мысли: «Что я на самом деле думаю, что происходит?»
- Это создаёт обучающую «тропу», к которой можно вернуться и улучшить процесс
Разберёмся, как использовать каждый блокнот.
Блокнот 1: Блокнот для мышления
Здесь вы планируете, моделируете и интерпретируете. Здесь нет деталей реализации вроде конкретных команд; это место про то, что происходит концептуально.
Простой шаблон:
1. Формулировка проблемы
Напишите чёткое описание бага.
- Наблюдаемое поведение: Что именно происходит?
- Ожидаемое поведение: Что должно происходить вместо этого?
- Минимальное воспроизведение (если известно): Входные данные, шаги, окружение.
Это защищает от «багов, которые уползают», когда ваше представление о них меняется прямо в процессе отладки.
2. Окружение и контекст
Зафиксируйте ограничения, которые могут быть важны:
- Ветка / коммит
- Задействованные сервисы и их версии
- Важные конфиги или feature flags
Это даёт снимок того мира, в котором живёт баг.
3. Текущая ментальная модель
Опишите, как вы думаете, работает эта часть системы, даже если не уверены.
Например:
«Запрос идёт
Gateway → AuthService → UserService. Токены авторизации валидируются в AuthService и прикрепляются к контексту запроса. UserService доверяет этому контексту и не перевалидаирует токен.»
Вы не документируете всю систему — только тот срез, который относится к багу.
4. Список гипотез
Это ядро.
Перечислите каждую гипотезу как пронумерованное, проверяемое утверждение:
- H1: «Токен авторизации отсутствует в запросах с мобильного клиента из‑за устаревшего SDK.»
- H2: «Токен есть, но он просрочен, и проверка срока годности ломается на часовых поясах.»
- 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 %
Почему держать это отдельно?
- Это не даёт Блокноту для мышления превратиться в шумную стенограмму
- Это позволяет позже восстановить последовательность шагов для постмортемов или документации
- Это помогает не повторять один и тот же неудачный эксперимент
Не обязательно быть многословным — достаточно такого объёма, чтобы можно было повторить эксперимент или понять его спустя время.
Как система из двух блокнотов раскладывает навыки отладки
Ещё одно преимущество подхода в том, что он разбивает отладку на меньшие, тренируемые подпункты-навыки:
-
Генерация гипотез (Блокнот для мышления)
Практика: заставляйте себя выписать минимум три правдоподобные причины до того, как что‑то тестировать. Это противоядие против преждевременной фиксации на первой версии. -
Проектирование эксперимента (Блокнот для мышления)
Практика: для каждой гипотезы придумывайте самый дешёвый и быстрый тест, который может её опровергнуть. Не «переписать подсистему X», а «залогировать Y и проверить, бывает ли он null». -
Выполнение эксперимента (Блокнот для действий)
Практика: выполняйте запланированный тест с минимумом «а заодно ещё вот это подправлю». -
Интерпретация результатов и обновление модели (Блокнот для мышления)
Практика: всегда пишите однострочный вывод: «Этот эксперимент повысил мою уверенность в H3, потому что…» -
Стратегия поиска (оба блокнота)
По мере накопления багов ваши заметки показывают паттерны того, как вы исследуете пространство причин. Эту стратегию можно затем осознанно улучшать.
Давая названия и границы этим поднавыкам, вы превращаете отладку в то, что можно целенаправленно тренировать, а не в что‑то, в чём вы «по идее станете лучше с опытом».
Выбор инструментов для двух блокнотов
Ничего сложного не требуется, но немного структуры помогает.
Возможные варианты:
- Бумага + цифра: Бумага для мышления (удобно рисовать и черкать), текстовый файл или scratchpad в редакторе — для действий.
- Два файла в репозитории:
bug-123-thinking.mdиbug-123-doing.mdв папке/debug-notes. - Приложение для заметок: Одна заметка с двумя заголовками:
# Thinkingи# Doing(можно и на русском, важно разделение).
Ищите инструменты, которые упрощают:
- Добавление временных меток
- Ссылки на код, логи и PR
- Поиск по прошлым багам по ключевым словам или компонентам
Чем меньше трения при ведении заметок, тем выше шанс, что вы будете их реально обновлять.
Обучение и менторство в отладке через два блокнота
Если вы менторите джунов или преподаёте программирование, система из двух блокнотов даёт вам структуру для обратной связи.
- Разберите их Блокнот для мышления: Насколько конкретны гипотезы? Обновляют ли они модель? Или просто мечутся?
- Разберите их Блокнот для действий: Запускают ли они большие, медленные эксперименты вместо точечных? Повторяют ли одни и те же шаги?
Поскольку отладка сильно нагружает голову, разделение «думать» и «делать» снижает нагрузку для обучающихся. Им не нужно держать весь баг в голове: часть тяжёлой работы несут заметки.
Вы можете и сами показывать процесс вживую: шарить экран и вслух комментировать, заполняя оба блокнота.
Итог: замедлиться, чтобы отлаживать быстрее
Отладка с двумя блокнотами поначалу кажется медленнее. Вы останавливаетесь, чтобы что‑то записать, вместо того чтобы сразу бросаться в код.
Но на практике она:
- Сокращает случайное метание
- Делает ваше мышление видимым и проверяемым
- Снижает когнитивную нагрузку, чтобы вы мыслили яснее
- Превращает отладку в набор навыков, которые можно улучшать
В следующий раз, наткнувшись на особенно неприятный баг, удержитесь от порыва просто начать тыкаться в него. Откройте два блокнота — один для мышления, другой для действий — и позвольте заметкам взять на себя часть ментальной нагрузки, пока вы занимаетесь настоящей задачей: построением и уточнением корректной ментальной модели вашей системы.
Вы будете выпускать фиксы быстрее. И, что важнее, вы будете лучше понимать свой код каждый раз, когда баг заставляет вас вглядеться в него внимательнее — а это в долгосрочной перспективе самая ценная часть отладки.