05 / 06 · Best Practices

🎯 Peter Steinberger

Контр-интуитивный подход к CC: меньше инструментов, меньше трения, максимальная скорость. CEO PSPDFKit намеренно идёт против большинства mainstream рекомендаций — и детально объясняет почему это работает.

🎯
Peter Steinberger
CEO PSPDFKit — PDF SDK for iOS / Android / Web
⚠️
Важный контекст перед применением: подход Steinberger (без MCP, без worktrees, без permission prompts) оптимален для его конкретного контекста — опытный разработчик, хорошо знающий кодовую базу PSPDFKit. Новичкам отключение permission prompts опасно: CC может удалить файлы или выполнить нежелательные команды без предупреждения. Применяйте его философию «меньше трения» только после того как накопили опыт работы с CC и понимаете какие действия CC совершает автоматически.
⚠️ Это контр-интуитивный подход
Steinberger сознательно нарушает большинство популярных рекомендаций по работе с CC. Никаких MCP-серверов. Никаких git worktrees. Никаких permission prompts. Его аргумент: каждое дополнительное средство добавляет трение и точки отказа. Для PSPDFKit — большого коммерческого SDK с кодом на Swift, Kotlin, TypeScript и C++ — это трение суммируется в часы потерянного времени в неделю. Читайте его аргументацию критически и берите то, что подходит вашему контексту.
🎯 Ключевой принцип

"Убрать всё лишнее. CLI вместо MCP. Main без worktrees. Скорость через простоту." Система с наименьшим количеством слоёв — наиболее предсказуема, наиболее быстра и наиболее надёжна в долгосрочной перспективе.

💡
Тонкость для опытных: подход «работа на main без worktrees» у Steinberger держится на одном критическом условии — непрерывный бэкап всей файловой системы (он использует Time Machine-подобное решение). Если у вас нет такого бэкапа, его подход опасен. Прежде чем копировать его методологию, убедитесь что у вас есть эквивалентная сеть безопасности. Без неё он бы не работал так же — это не скрытое, а явное требование его системы.

Steinberger vs Mainstream: таблица противоречий

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

Тема Mainstream рекомендация Подход Steinberger
MCP-серверы Подключай нужные: GitHub, Playwright, БД Удали все. Только filesystem если критично
Git workflow Worktrees для параллельного выполнения задач Main + атомарные коммиты + feature flags
Permissions deny-list + hooks для безопасного окружения --dangerously-skip-permissions + непрерывные бэкапы
Документация CLAUDE.md + ADR + specs + wiki Только CLAUDE.md, строго менее 100 строк
Внешние инструменты MCP-серверы для интеграций CLI-команды одной строкой в CLAUDE.md

6 ключевых практик

1
Удалил ВСЕ MCP-серверы

Steinberger прошёл через полный цикл: подключил MCP-серверы, наблюдал за поведением Claude несколько недель, затем удалил всё. Его центральное наблюдение:

"Claude уходит крутить Playwright вместо того чтобы просто прочитать код. MCP создают соблазн для Claude делать лишние действия."

Проблема не в самих MCP-серверах — технически они прекрасны. Проблема в том, что наличие инструмента меняет поведение Claude:

  • Есть Playwright MCP → Claude запускает браузер вместо статического анализа HTML
  • Есть GitHub MCP → Claude делает API-вызовы вместо чтения локальных файлов
  • Есть Database MCP → Claude строит запросы вместо анализа схемы по миграциям

Для проекта PSPDFKit с тысячами файлов C++, Swift и TypeScript, скорость статического понимания кода критически важна. Каждый лишний roundtrip через внешний инструмент — это дополнительная задержка и непредсказуемость.

Единственное исключение: базовый filesystem MCP если абсолютно необходим для доступа к файлам вне рабочего каталога.

2
CLI-инструменты вместо MCP

Вместо MCP-сервера для каждого инструмента — одна строка в CLAUDE.md описывает CLI-команду. Это радикально проще и прозрачнее:

# Инструменты

## База данных
`psql $DATABASE_URL -c "SELECT ..."` — прямые SQL-запросы без MCP

## Deploy
`vercel deploy --prod` — деплой в production напрямую

## GitHub
`gh pr create --title "fix: ..." --body "..."` — создание PRs через CLI
`gh issue list --label bug --state open` — просмотр issues

## Логи
`axiom query 'status >= 500' --start=-1h` — поиск ошибок за последний час

## Тесты
`npm test -- --filter=PDFAnnotation` — запуск конкретных тестов

Принцип предельно прост: Claude видит команду → выполняет через Bash → получает результат. Никаких дополнительных слоёв протокола. Никакой возможности для "творческого" использования инструмента не по назначению.

Дополнительные преимущества этого подхода:

  • Прозрачность: команды видны в истории сессии, легко воспроизводятся вручную
  • Портабельность: не требуют настройки на каждой машине
  • Предсказуемость: Claude не может "изобрести" нестандартное использование инструмента
  • Дебаггинг: если что-то пошло не так — видно точную команду которую запускал Claude
3
На main, без git worktrees

Git worktrees активно рекомендуются многими экспертами для параллельного выполнения задач. Steinberger пробовал этот подход и пришёл к другому выводу:

"I tried worktrees. They just slowed me down."

Для его workflow параллельность через worktrees создаёт больше проблем, чем решает:

  • Слияние изменений из нескольких worktrees требует постоянных ментальных усилий
  • Claude теряет контекст при переключении между рабочими деревьями
  • Отладка и тестирование усложняются при нескольких активных состояниях кода
  • SDK с нативными компонентами требует чистого, линейного состояния для компиляции

Альтернатива: строгая дисциплина на main ветке.

  • Атомарные коммиты — каждый коммит = одно логическое изменение, всегда зелёные тесты
  • Feature flags — незавершённый код живёт за флагом, не мешает основной разработке
  • Частые коммиты — каждые 15-30 минут, не ждать "полной готовности"
  • Ясный фокус — одна задача за раз, без переключения контекста

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

4
--dangerously-skip-permissions + надёжные бэкапы
⚠️ Явный trade-off, не небрежность
Steinberger использует этот флаг в паре с непрерывным бэкапом. Без надёжной системы резервного копирования этот подход абсолютно неприемлем. Сначала — бэкапы, только потом — skip permissions.

Его расчёт:

"I'd rather lose 10 minutes of work than lose 10 minutes per task to permission prompts."

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

Его система бэкапов (macOS):

  • Arq Backup — непрерывный бэкап в облако, снапшоты каждые несколько минут
  • SuperDuper — полные клоны диска для восстановления системы
  • git stash + частые коммиты — дополнительный слой защиты на уровне кода

При таком покрытии максимальная потеря работы — несколько минут. Это приемлемо если каждая задача экономит 10+ минут на permission prompts.

Аналоги для Windows: Backblaze Personal Backup, VSS-снапшоты, rsync с временными метками, или любая система непрерывного бэкапа с гранулярностью до нескольких минут.

5
CLAUDE.md как единственный источник истины

Всё что Claude должен знать о проекте — только в CLAUDE.md. Никаких внешних spec-файлов, никаких ADR-документов, никаких wiki для повседневных задач.

Жёсткий лимит: менее 100 строк. Если файл растёт сверх этого предела — это сигнал проблемы. Либо правила слишком детальные (упрости архитектуру проекта), либо правил слишком много (оставь только самые важные).

Почему краткость важна: чем длиннее CLAUDE.md, тем меньше вероятность что конкретное правило будет весомо влиять на решения Claude. Короткий, точный файл = выше соблюдение каждого правила.

# PSPDFKit — Claude Instructions

## Project
Cross-platform PDF SDK: iOS (Swift), Android (Kotlin), Web (TypeScript).
Shared C++ core accessed via NDK/JNI bridges.

## Critical Rules
- Never modify Core/ without explicit permission
- All public APIs need unit + integration tests
- Objective-C interop: maintain backward compatibility
- No force unwraps in Swift except clearly documented exceptions

## Tools
`psql $DATABASE_URL -c "..."` — database queries
`gh pr create --title "..."` — GitHub PRs
`npm test -- --filter=Name` — run specific test suites

## Commits
Atomic, present tense: "Add PDF annotation layer"
Never: "fix stuff", "wip", "temp", "changes"

Обратите внимание: в этом файле нет архитектурных решений, исторических объяснений, или "почему мы сделали X". Только то, что Claude должен делать прямо сейчас.

6
Философия: убрать трение, добавить скорость

За всеми конкретными практиками стоит единая философия: каждый дополнительный элемент системы добавляет трение. Steinberger буквально считает стоимость каждого слоя:

  • Каждое лишнее слово в CLAUDE.md → трение восприятия → Claude медленнее и менее точно понимает главное
  • Каждый MCP-сервер → дополнительный сетевой слой + точка отказа → замедление и непредсказуемость
  • Каждый worktree → ментальный overhead при управлении → медленнее принятие решений
  • Каждый permission prompt → прерывание потока → суммарно часы в неделю
// Хороший воркфлоу — минимальный стек:
Claude + CLAUDE.md + Bash (CLI-команды) + git commit

// Плохой воркфлоу — слишком много слоёв:
Claude + 8 MCP-серверов + worktrees + permission prompts
+ ADR-документы + spec-файлы + wiki + hooks + agents

Важный нюанс: этот подход работает именно потому что у него надёжные бэкапы. Убирая защитные слои, он не становится безрассудным — он перекладывает защиту в одно надёжное, простое место (непрерывный бэкап) вместо многих сложных, взаимодействующих слоёв.

Главный урок

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

Когда этот подход работает (и когда нет)

Подходит если:
  • Большой, стабильный codebase
  • Есть надёжная система бэкапов
  • Скорость итераций критична
  • Маленькая команда или соло-разработка
  • Хорошо знаете структуру своего проекта
  • SDK или библиотека без прямого доступа к БД
Не подходит если:
  • Работа с production БД напрямую
  • Нет системы бэкапов
  • Новый или плохо знакомый проект
  • Большая команда с compliance требованиями
  • Критические системы: медицина, финансы
  • Регуляторные требования к аудиту действий

Источник и контекст

Все практики основаны на статье "Optimal AI Development Workflow", опубликованной Steinberger в 2025 году. PSPDFKit — коммерческий SDK для PDF-документов, используемый в тысячах приложений. Steinberger разрабатывает его с 2010 года, поэтому его взгляды на скорость и простоту формировались полутора десятилетиями работы над одним большим многоплатформенным продуктом. Это не теоретические рассуждения — это выводы из реальной практики.