05 / 06 · Best Practices

⚡ Boris Cherny

Создатель Claude Code. Практики из первых рук — от человека, который построил инструмент изнутри.

Boris Cherny
Software Engineer, Anthropic · Создатель Claude Code · Автор «Programming TypeScript»
"5 параллельных сессий + голосовой ввод = максимальная скорость"
Параллельность Голосовой ввод Opus Hooks CLAUDE.md Permissions
⚠️
Частая ошибка новичков: открывают 5 вкладок CC и начинают параллельную работу без нумерации, без изоляции задач и без hooks-уведомлений. Результат: постоянное переключение без понимания в каком состоянии каждая сессия, потеря контекста, конфликты изменений. Boris's система работает только в полном комплекте: нумерованные вкладки + строгие роли + системные уведомления от hooks. Без уведомлений параллельность превращается в хаос, а не в ускорение.

🎯 Контекст: почему Boris знает лучше всех

Boris Cherny — не просто активный пользователь CC. Он его создатель. Он проектировал архитектуру инструмента, работал с его ограничениями изнутри, и выработал практики понимая как CC работает на уровне кода. Его подходы — не эксперименты, а выводы из месяцев ежедневной работы с собственным инструментом.

Сайт howborisusesclaudecode.com — живой документ, который он обновляет по мере развития практик. Ниже — шесть ключевых принципов.

⚡ Практика 1: 5 параллельных сессий в нумерованных вкладках

1
Пять вкладок, пять задач — одновременно

Boris открывает ровно 5 вкладок терминала, пронумерованных 1–5. Каждая — отдельная CC-сессия с отдельной задачей или независимым аспектом одной большой задачи. Пока одна сессия думает и пишет код, он переключается на другую.

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

Дисциплина обязательна: у каждой вкладки строго своя роль. Смешивать контексты нельзя — они загрязняются.

bash ~/.claude/hooks/notify-done.sh
#!/bin/bash # PostToolUse hook — уведомить когда Claude ждёт ввода # Добавить в .claude/settings.json под ключом hooks.PostToolUse if [[ "$(uname)" == "Darwin" ]]; then # macOS osascript -e 'display notification "Claude ждёт ввода" with title "Claude Code" sound name "Glass"' elif command -v notify-send >/dev/null 2>&1; then # Linux с libnotify notify-send "Claude Code" "Claude ждёт ввода" --icon=terminal else # WSL / Windows — через PowerShell уведомление powershell.exe -Command "Add-Type -AssemblyName System.Windows.Forms; [void][System.Windows.Forms.MessageBox]::Show('Claude ждёт ввода','Claude Code')" fi
Почему именно 5?

Boris пришёл к числу 5 экспериментально. Меньше — недостаточная параллельность. Больше — слишком высокая когнитивная нагрузка переключения. Пять сессий дают максимальный throughput при сохранении контроля над каждой.

"I keep five numbered terminal tabs open. Each has its own Claude session. While Claude thinks in tab 2, I'm reviewing output in tab 1 or giving instructions in tab 3."

🧠 Практика 2: Opus с extended thinking для всего

2
Почти всегда Opus — даже если это кажется медленным

Контринтуитивный совет от Boris: используй самую мощную модель почти всегда. Haiku отвечает быстро, но чаще ошибается. Итоговое время на задачу с Opus часто меньше, чем с Haiku плюс три цикла исправлений. Ключевое слово — итоговое.

Когда НЕ нужен Opus: rename файла, форматирование, тривиальный regex. Всё что не требует понимания контекста — это Haiku. Но граница гораздо выше чем кажется интуитивно.

СитуацияМодельПричина
Новая фича, архитектурное решениеOpusСложный контекст, нужен глубокий анализ
Рефакторинг существующего кодаOpusМного зависимостей, риск сломать логику
Написание тестов с edge casesOpusНужно понять бизнес-логику
Debugging сложного багаOpusНужно отследить цепочку зависимостей
Rename переменной / файлаHaikuТривиальная механическая задача
Форматирование, prettier-style fixHaikuНет логики — нет смысла в Opus
Простой regex, однострочная заменаHaikuМинимальный контекст нужен
bash terminal — переключение моделей
# Переключить модель в текущей сессии /model opus # Запустить новую сессию сразу с Opus claude --model claude-opus-4-8 # Проверить текущую модель и статус /status # Тривиальная задача — Haiku быстрее claude --model claude-haiku-4-5 "rename variable oldName to newName throughout"
"Almost always, using Opus, though slower, is faster overall. More time thinking, fewer iterations fixing."

📋 Практика 3: CLAUDE.md в git + теги @.claude в PR

3
Каждая ошибка Claude превращается в правило

Boris ведёт CLAUDE.md как живой документ в git. Каждый раз когда Claude делает ошибку — неправильный паттерн, небезопасный код, нарушение конвенций — это фиксируется как правило. Так накапливается «институциональная память» проекта.

При code review в PR: рецензент, заметив нежелательный паттерн от Claude, оставляет комментарий с тегом @.claude. Это сигнал добавить правило в CLAUDE.md чтобы предотвратить повторение.

Результат: с каждой неделей Claude делает меньше типичных ошибок конкретно в этом проекте. CLAUDE.md растёт как база знаний команды.

md CLAUDE.md — секция обученных правил
## Обученные правила (не нарушать) # Добавлено 2026-01-15 после инцидента с mass assignment - НИКОГДА не используй request->all() без явного fillable - При создании миграции всегда добавляй индексы на foreign keys # Добавлено 2026-02-03, review от @alex - Не использовать отладочные функции (dd/dump) в production-коде - Все API-ответы через Resource-классы, не raw json # Добавлено 2026-02-20 @.claude после security review - SQL-запросы только через ORM/Query Builder, никогда raw SQL без binding - При работе с паролями — только bcrypt/argon2, не устаревшие алгоритмы
CLAUDE.md как обучение модели

CLAUDE.md читается Claude в начале каждой сессии. Правила в нём — это эффективное «дообучение» под специфику вашего проекта. Чем точнее правила, тем меньше ошибок и итераций исправлений. Это накапливается как сложный процент.

🎤 Практика 4: Голосовой ввод для богатых промптов

4
Говорить промпт — быстрее и детальнее чем писать

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

На macOS: двойное нажатие fn открывает системный диктовщик. На Windows: Win+H. На Linux: whisper-mic или ibus-speech.

Особенно эффективно для передачи бизнес-контекста — объяснить почему нужна фича, какие ограничения, что важно учесть. Голосом это 30 секунд вместо 3 минут печатания.

"You naturally speak in more complete sentences and provide richer context. Voice input produces better prompts than typing for me, almost every time."

🔐 Практика 5: Точечные permissions вместо --dangerously-skip

5
Wildcards в allow-листе лучше ядерного варианта

Флаг --dangerously-skip-permissions существует, но Boris рекомендует избегать его. Вместо отключения всех проверок — точечные wildcards для конкретных команд которые вы действительно хотите разрешить без подтверждения.

Это даёт баланс: удобство (не подтверждать каждое действие) и безопасность (CC не может выполнить произвольную команду). Список allow/deny в .claude/settings.json коммитится в git — вся команда видит правила.

json .claude/settings.json
{ "permissions": { "allow": [ "Bash(bun run test:*)", "Bash(bun run build:*)", "Bash(bun run lint:*)", "Bash(git add *)", "Bash(git commit *)", "Bash(git diff *)", "Bash(git status)", "Bash(composer install)", "Bash(composer require *)" ], "deny": [ "Bash(rm -rf *)", "Bash(git push --force *)", "Bash(curl * | bash)" ] } }
💡
Принцип минимальных привилегий Разрешай только то что реально нужно. Список permissions контролируется через git — вся команда видит что разрешено CC.

✅ Практика 6: Верификация через реальные тесты

6
Никогда не принимать "всё работает" без доказательств

Boris категоричен: никогда не принимать утверждение Claude что задача выполнена без независимой проверки. Claude может быть уверен в своём коде — и ошибаться. Единственный объективный критерий — прохождение тестов с реальным выводом.

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

TDD усиливает это: если тест был красным до реализации, Claude не может «забыть» что он должен стать зелёным.

bash Промпт-шаблон для верификации
# Правильно — явный запуск с полным выводом Запусти тесты для SubscriptionTest и покажи полный вывод, включая неудавшиеся тесты если они есть. # Неправильно — принимать на слово Убедись что тесты пройдут и закончи задачу <-- НИКОГДА ТАК # Python pytest с деталями pytest tests/test_subscription.py -v --tb=short # Bun / JS bun run test --reporter=verbose # Go go test ./... -v -run TestSubscription
"The only source of truth is the test runner output. Not Claude's confidence, not 'the code looks right'. Run the tests."

🔑 Ключевой вывод

Система, а не набор трюков

Практики Boris работают как система. Пять параллельных сессий без уведомлений — хаос. Opus без правил в CLAUDE.md — повторяющиеся ошибки. Wildcards без deny-листа — риски. Голосовой ввод без структуры промпта — богатый но неточный запрос. Все шесть практик усиливают друг друга.

🔗
Смотрите также: Хуки Claude Code — hooks для уведомлений подробнее. Правила CLAUDE.md — структура файла инструкций. Мульти-агентность — параллельные сессии в деталях. Настройка — permissions полностью.