Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Принятие решений
decisions

Принятие решений

Принятие технических решений, процесс RFC, документирование архитектурных решений

Учебник: Принятие решений

Время освоения: ~40 минут Цель: Освоить системный подход к принятию технических и управленческих решений — от RFC процесса до ADR, от DACI матрицы до правил Безоса — чтобы команда двигалась быстро и не застревала в бесконечных обсуждениях


#Быстрый справочник

#Типы решений

ТипПримерыИнструмент
ТехническиеВыбор технологии, архитектуры, паттернаADR (Architecture Decision Record)
ПроцессныеКак делать code review, как деплоитьRFC + team agreement
СтратегическиеПриоритеты, roadmap, распределение ресурсовDACI + RFC

#DACI матрица

РольКтоОтветственность
DriverТот, кто ведёт процессСобирает информацию, фасилитирует, следит за сроками
ApproverТот, кто принимает финальное решениеОдно лицо (не комитет!)
ContributorТе, кто вносят экспертизуДают мнение, не блокируют
InformedТе, кого нужно уведомитьПолучают результат, не участвуют

#RFC процесс (таймбокс)

ЭтапВремяЧто происходит
Черновик1-3 дняDriver пишет RFC документ
Обсуждение3-5 днейAsync комментарии от Contributors
Решение1 деньApprover принимает решение
ADR1 деньДокументирование в репозитории

#Введение (5 минут)

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

Типичные проблемы в командном принятии решений:

  • Решение откладывается, потому что "нужно ещё обсудить" — бесконечные встречи без результата
  • Решение принято неясно — через 2 недели каждый помнит по-разному
  • Решение принято одним, а команда не понимает почему — потеря вовлечённости
  • Решение принято коллективом, никто не несёт ответственности — "решили вместе" = не решил никто

Почему это критически важно:

  • Хорошие процессы принятия решений ускоряют команду
  • Документированные решения экономят время на "почему мы делаем это именно так?"
  • Прозрачность процесса = доверие команды, даже если решение не нравится всем

Принцип: Лучше принять несовершенное решение вовремя, чем идеальное — с опозданием. Скорость принятия решений — конкурентное преимущество.


#Типы решений: как их классифицировать (8 минут)

#Технические vs. Процессные vs. Стратегические

Технические решения — выбор инструментов, архитектурных паттернов, технологий. Требуют технической экспертизы. Документируются в ADR.

Процессные решения — как команда работает: формат code review, ветки, деплой, ceremony. Требуют согласия команды больше, чем экспертизы. Документируются в team agreements / runbooks.

Стратегические решения — что строить, когда, с каким приоритетом. Требуют бизнес-контекста. Часто принимаются с участием product/stakeholders.

#Обратимые vs. Необратимые (Type 1 и Type 2 по Безосу)

Джефф Безос ввёл разделение, которое изменило культуру принятия решений в Amazon:

Type 1 (Необратимые, "однопутные двери"):

  • Изменить очень дорого или невозможно
  • Требуют тщательного анализа
  • Примеры: выбор основного фреймворка, переход на другую БД, переписывание core-системы, публичный API

Type 2 (Обратимые, "двусторонние двери"):

  • Можно передумать и откатить с разумными затратами
  • Решать быстро, с меньшим числом участников
  • Примеры: эксперимент с новой библиотекой, изменение формата stand-up, A/B тест фичи

Правило: Большинство команд применяют к Type 2 решениям процесс Type 1 — и замедляются в 5-10 раз. Первый вопрос при любом решении: "Это Type 1 или Type 2?"

#Двухпиццевое правило

Безос также ввёл принцип: в принятии решения не должно участвовать больше людей, чем можно накормить двумя пиццами (6-8 человек). Больше участников не улучшают решение, а замедляют и размывают ответственность.


#RFC процесс (10 минут)

RFC (Request for Comments) — документ-предложение, который описывает проблему, предлагаемое решение и приглашает к обсуждению. Пришёл из мира интернет-стандартов, адаптирован для командных процессов.

#Когда использовать RFC

Используйте RFC для:

  • Значительных технических изменений (новая зависимость, изменение архитектуры)
  • Изменений, затрагивающих несколько команд
  • Решений, которые трудно или дорого откатить (Type 1)
  • Когда хотите получить экспертизу команды в async режиме

Не нужен RFC для:

  • Мелких технических решений (выбор переменных, локальный рефакторинг)
  • Очевидных исправлений
  • Type 2 решений, которые легко откатить

#Структура RFC документа

# RFC: [Название]

## Статус
Черновик / На рассмотрении / Принят / Отклонён

## Контекст
Что происходит? Какую проблему решаем? Почему сейчас?

## Предлагаемое решение
Что именно предлагаем? Как это работает?

## Альтернативы (рассмотренные и отклонённые)
Что ещё рассматривали? Почему отклонили?

## Трейд-оффы
Что мы получаем? Что теряем? Какие риски?

## Влияние
Кто затронут? Что нужно изменить? Требуется ли миграция?

## Открытые вопросы
Что ещё неясно? Что нужно исследовать?

## Решение и дата
[Заполняется Approver после обсуждения]

#Пример RFC (реальный случай)

# RFC: Переход на Kafka для event streaming

## Статус
На рассмотрении

## Контекст
Сейчас используем RabbitMQ для внутренних событий. При росте до 10k RPS возникают задержки и сложности с масштабированием. Нужна система с высокой пропускной способностью и гарантией доставки.

## Предлагаемое решение
Перейти на Apache Kafka для всех новых event-based сервисов. RabbitMQ оставить для легковесных задач (например, email notifications).

## Альтернативы
- **RabbitMQ + clustering**: сложнее масштабировать, нет native replay
- **AWS SQS/SNS**: lock-in, дороже при высокой нагрузке
- **NATS**: нет гарантии доставки, не подходит для critical path

## Трейд-оффы
+ Высокая пропускная способность (100k+ RPS)
+ Гарантия доставки и replay
- Сложнее в эксплуатации (нужен DevOps support)
- Высокая начальная стоимость внедрения

## Влияние
- DevOps: нужно настроить кластер Kafka
- Backend: изменить клиентские библиотеки
- Frontend: не затронут

## Открытые вопросы
1. Какой SLA по доступности Kafka мы можем гарантировать?
2. Нужно ли вводить новый role для Kafka-admin?

## Решение и дата
[Ожидается Approver к 15 марта]

#Как достигать консенсуса (и когда не нужно)

Consent, а не consensus: Консенсус — все согласны. Consent — никто не возражает настолько сильно, чтобы заблокировать. Стремитесь к consent, не к consensus.

Таймбокс обязателен: Установите дедлайн для комментариев. Без дедлайна RFC висит бесконечно. Рекомендуемый период: 3-5 рабочих дней.

Disagree and commit: После принятия решения — все его поддерживают и реализуют, даже если кто-то был против. Это принцип, а не подавление мнения.

#Кто участвует в RFC

Используйте DACI:

  • Driver: Автор RFC, ведёт процесс
  • Approver: Технический лид, архитектор или тимлид (один человек!)
  • Contributors: Эксперты, чьё мнение важно
  • Informed: Команды/люди, на которых это влияет, но чей input не нужен

#ADR: Architecture Decision Records (8 минут)

#Что такое ADR и зачем он нужен

ADR — короткий документ, который фиксирует одно архитектурное решение: контекст, само решение и его последствия. Через год новый разработчик читает ADR и понимает не только "что" — но и "почему именно так".

Без ADR: "Почему у нас PostgreSQL, а не MongoDB?" — никто не помнит, у основателей спросить нельзя, решение менять страшно.

С ADR: Открываешь docs/adr/002-database-choice.md — читаешь контекст, альтернативы, трейд-оффы, решение. 5 минут — и полная ясность.

#Структура ADR (минималистичная)

# ADR-[номер]: [Название]

**Дата**: YYYY-MM-DD
**Статус**: Proposed / Accepted / Deprecated / Superseded by ADR-XXX

## Контекст
[1-3 абзаца: ситуация, проблема, которую решаем]

## Решение
[Что именно решили. Конкретно.]

## Последствия
**Плюсы**: ...
**Минусы**: ...
**Риски**: ...

#Пример ADR (реальный)

# ADR-003: Использование Redis для кэширования сессий

**Дата**: 2024-02-10
**Статус**: Accepted

## Контекст
При масштабировании до 10k одновременных пользователей сессии в памяти не работают в multi-instance окружении. Нужно внешнее хранилище.

## Решение
Redis как внешний сессионный хранилище с TTL 24 часа.

## Последствия
**Плюсы**:
- Масштабируется горизонтально
- Сессии переживают перезапуск приложения
- Поддержка pub/sub для invalidation

**Минусы**:
- Дополнительная инфраструктурная зависимость
- Нужен мониторинг Redis

**Риски**:
- Утечка данных при неправильной конфигурации
- Зависимость от одного провайдера (если используется managed Redis)

#Где хранить ADR

  • В репозитории: docs/adr/ (рядом с кодом — версионируется вместе с ним)
  • Нумерация: ADR-001, ADR-002 (никогда не удалять, только устаревать)
  • Инструменты: adr-tools (CLI), Log4brains (красивый веб-интерфейс)

#DACI матрица: кто и как принимает решения (4 минуты)

#Почему важна чёткость ролей

Без чёткого "кто решает" команда либо тратит часы на поиск консенсуса, либо никто не решает вообще. DACI фиксирует роли до начала обсуждения — это снимает политику и ускоряет процесс.

#Как применять DACI на практике

До обсуждения: Определите Approver. Один человек. Не "команда".

#Пример DACI для RFC по выбору message broker

РольКтоОтветственность
DriverBackend Lead (Алексей)Пишет RFC, собирает мнения, следит за сроками
ApproverCTO (Елена)Финальное решение по выбору Kafka/RabbitMQ
ContributorsDevOps Engineer (Максим), Senior Backend (Иван)Экспертиза по эксплуатации и производительности
InformedProduct Manager (Анна), Frontend TeamПолучают результат, не участвуют в обсуждении

Как это работает:

  1. Алексей пишет RFC (черновик)
  2. Максим и Иван комментируют в документе (3 дня)
  3. Елена принимает решение 15 марта
  4. Анна и Frontend получают уведомление о решении

#DACI vs. RACI

DACIRACI
ФокусПроцесс принятия решенийРаспределение задач
Approver/AccountableОдин человек (A)Один человек (A)
Лучше использоватьДля решенийДля проектов и задач

#Сравнение RFC и ADR (важно!)

КритерийRFCADR
ЦельПолучить экспертную обратную связь до принятия решенияЗафиксировать принятое решение после принятия
ВремяДо реализацииПосле принятия решения
ФорматДлинный документ с обсуждениемКороткий, факт-ориентированный
АвторDriver (часто один человек)Любой, кто фиксирует решение
СтатусЧерновик → На рассмотрении → ПринятProposed → Accepted
Когда использоватьЛюбое значимое изменениеТолько после того, как решение принято

💡 Правило: RFC — это процесс, ADR — это результат. RFC без ADR — решение не задокументировано. ADR без RFC — решение принято без обсуждения.


#Как работать с trade-offs (5 минут)

Trade-offs — не недостаток, а часть инженерного мышления. Вот как системно их взвешивать:

#Алгоритм анализа trade-offs

  1. Сформулируйте все варианты (минимум 2, включая "оставить как есть")
  2. Для каждого варианта запишите:
    • Что мы получаем (плюсы)
    • Что теряем (минусы)
    • Какие риски (что может пойти не так)
    • Как это влияет на текущие приоритеты (скорость, надёжность, стоимость)
  3. Сопоставьте с текущими целями команды
    • Если сейчас важна скорость — выбирайте вариант с быстрой реализацией
    • Если важна надёжность — выбирайте вариант с меньшими рисками
  4. Зафиксируйте выбор и почему

#Пример: Выбор между REST и GraphQL

КритерийRESTGraphQL
Скорость разработкиВысокая (простой CRUD)Средняя (нужно писать schema)
Гибкость клиентаНизкая (over-fetching)Высокая (client-driven)
Сложность поддержкиНизкаяСредняя (нужно управлять schema)
ПроизводительностьВысокая для простых запросовВысокая для сложных, но есть overhead
РискПерегрузка данных для мобильныхСложность кэширования

Решение: Для нашего MVP — REST (скорость выхода на рынок важнее гибкости). Для будущего — планируем миграцию на GraphQL.


#Как восстановить культуру RFC (если она утрачена)

Если команда игнорирует RFC и принимает решения в чате — вот конкретный план действий:

#Шаг 1: Диагностика

  • Поговорите с 2–3 разработчиками: "Почему RFC не используется?"
  • Обычные причины: "долго", "не видно пользы", "мы и так знаем"

#Шаг 2: Показать ценность

  • Выберите одну небольшую задачу (например, выбор библиотеки для логирования)
  • Напишите RFC сами и проведите обсуждение
  • Покажите, как это помогло: сэкономили время на обсуждении, избежали ошибки

#Шаг 3: Ввести правила

  • Правило 1: Любое изменение, влияющее на >2 сервиса, требует RFC
  • Правило 2: RFC должен быть готов за 1 день, обсуждение — 3 дня максимум
  • Правило 3: Approver обязан принять решение в назначенный день

#Шаг 4: Автоматизация

  • Добавьте шаблон RFC в GitHub/GitLab (например, .github/ISSUE_TEMPLATE/rfc.md)
  • Настройте Slack-бота, который напоминает: "RFC для изменения X не создан — нужно ли его создать?"

#Шаг 5: Поощрение

  • Публично хвалите тех, кто использует RFC
  • Покажите, как RFC помог в реальном проекте (например: "Благодаря RFC мы избежали ошибки в миграции БД")

#Баланс централизации и автономии (5 минут)

Когда в организации есть централизованная архитектурная группа, а команда чувствует потерю автономии — вот как найти баланс:

#Матрица разделения решений по уровню воздействия

Уровень воздействияПримерыКто решаетКак документировать
ЛокальныеВыбор библиотеки внутри сервиса, формат логовКомандаTeam agreement, не RFC
Кросс-командныеНовый API, общий SDK, shared databaseАрхитектурная группа + командаRFC + ADR
СтратегическиеПереход на новую платформу, смена cloud providerCTO + Engineering LeadershipRFC + Executive Approval

#Практические правила

  • Не централизуйте локальные решения — это убивает автономию и скорость
  • Не давайте командам решать стратегические вопросы — это создаёт хаос и дублирование
  • Установите SLA на одобрение RFC: например, 2 рабочих дня для кросс-командных решений
  • Создайте "зелёную зону": команды могут экспериментировать с новыми технологиями в песочнице без одобрения

#Пример: Выбор ORM

  • Если ORM используется только в одном сервисе → команда решает сама
  • Если ORM будет использоваться в 3+ сервисах → RFC с архитектурной группой
  • Если ORM влияет на всю инфраструктуру (например, требует нового типа DB) → стратегическое решение с CTO

#Типичные ошибки принятия решений

ОшибкаПочему это плохоКак исправить
Решение по умолчанию: "решим консенсусом"Комитет из 8 человек не принимает решений — размывает ответственность и замедляет в 5xВсегда назначать одного Approver до начала обсуждения по DACI
Не документировать решения — "мы обсудили и договорились"Через месяц у каждого своя версия договорённости, споры начинаются зановоКаждое значимое решение = ADR in репозитории, даже короткий
Применять процесс Type 1 к Type 2 решениямКоманда тратит 3 встречи на то, что можно попробовать и откатить за деньПервый вопрос: "Это обратимо?" Если да — решаем быстро, делаем эксперимент
RFC без таймбокса и ApproverДокумент обсуждается вечно, статус "на рассмотрении" живёт месяцамиУстанавливать дедлайн 3-5 дней в начале RFC, Approver принимает решение в назначенный день
Решение без альтернатив: "у нас один вариант"Нет анализа трейд-оффов, в ADR не зафиксировано почему отклонили другие путиВсегда рассматривать минимум 2 альтернативы, включая "ничего не делать"
"Disagree and not commit" — саботаж решенияКто-то был против, публично согласился, но пассивно сопротивляется реализацииПринцип disagree and commit: несогласие выражается до решения, после — поддержка обязательна

#Практические упражнения

#Упражнение 1: Классификация решений

Возьмите 5 последних решений вашей команды (или придумайте типичные). Для каждого определите:

  1. Тип: технические / процессные / стратегические
  2. Обратимость: Type 1 (необратимое) или Type 2 (обратимое)
  3. Нужен ли RFC? Нужен ли ADR?
  4. Кто был бы Approver по DACI?

Примеры для практики:

  • "Перейти с Jest на Vitest для тестов" → Type 2, RFC не нужен, ADR желателен
  • "Перейти с REST на GraphQL для всего API" → Type 1, RFC обязателен, ADR обязателен
  • "Изменить формат daily standup" → Type 2, RFC не нужен, team agreement достаточно
  • "Добавить Redis в продакшн стек" → Type 1, RFC желателен, ADR обязателен

#Упражнение 2: Напишите первый ADR

Выберите реальное техническое решение из вашей команды (уже принятое или предстоящее).

Напишите ADR по структуре:

  1. Контекст: какую проблему решали? Почему это было важно?
  2. Рассмотренные альтернативы: что ещё рассматривали?
  3. Решение: что выбрали? Почему?
  4. Последствия: что получили (плюсы), что потеряли (минусы), какие риски?

Цель: Через 10 минут у вас будет реальный ADR. Разместите его в docs/adr/ — это ваш первый шаг к культуре документирования решений.

Далее: Управление изменениями