Trade-offs мышление, Event Storming и архитектурные принципы
Зачем знать на Middle 3: Tech lead не «знает правильные ответы» — он умеет работать в условиях, где нет правильных ответов, только trade-offs. Каждое решение — компромисс между consistency/availability, latency/throughput, simplicity/flexibility. Event Storming — workshop-техника, которая структурирует понимание сложного domain’а за несколько часов. Архитектурные принципы (KISS, YAGNI, DRY, 12-factor, Conway’s Law) — это «системы координат» для принятия решений.
Содержание
Заголовок раздела «Содержание»- Концепция: trade-off мышление как основа архитектуры
- Глубже: оси trade-offs, Event Storming, принципы
- Gotchas: типовые когнитивные ошибки
- Real cases: AWS, Netflix, Spotify
- Вопросы (20+)
- Practice: провести Event Storming, документировать trade-offs
- Источники
1. Концепция
Заголовок раздела «1. Концепция»1.1 Архитектура — это trade-offs
Заголовок раздела «1.1 Архитектура — это trade-offs»“All engineering decisions are trade-offs. Architecture is the art of picking which ones.” — Mark Richards
Junior пишет код. Middle пишет код хорошо. Tech lead решает, какой код вообще писать — и обосновывает выбор.
Каждое решение имеет:
- Что выигрываем.
- Что теряем.
- Что нет в данный момент (отложенные последствия).
- Какие новые проблемы создаём.
1.2 Простой пример
Заголовок раздела «1.2 Простой пример»«Микросервисы или монолит?»
Не «микросервисы лучше». А:
| Монолит | Микросервисы | |
|---|---|---|
| Latency между модулями | ns (in-process call) | ms (network) |
| Deploy | Одна сборка | Independent deploys |
| Team scale | 1 команда | Много команд |
| Тестирование | E2E проще | Сложнее (contracts) |
| Operations | 1 сервис | N сервисов (мониторинг ×N) |
| Эволюция | Coupled | Decoupled |
Trade-off matrix — основной инструмент.
1.3 «Reversible vs irreversible» решения (Bezos)
Заголовок раздела «1.3 «Reversible vs irreversible» решения (Bezos)»Jeff Bezos: бывают two-way doors (вернуться можно) и one-way doors (нельзя).
- Two-way: попробовать новый CI-tool. Не понравилось → откатились.
- One-way: миграция БД с PG на Mongo на проде. Очень сложно откатить.
Правило: для two-way — быстрые решения, эксперимент. Для one-way — обстоятельный анализ, RFC, ADR.
2. Глубже: Trade-offs мышление
Заголовок раздела «2. Глубже: Trade-offs мышление»2.1 Базовые оси trade-offs
Заголовок раздела «2.1 Базовые оси trade-offs»Consistency vs Availability (CAP)
- Strong consistency (RDBMS, single leader): atomic, но потенциальный downtime при сбое.
- Eventual consistency (Cassandra, DynamoDB): high availability, но реплики могут расходиться.
Latency vs Throughput
- Batch processing: high throughput, high latency.
- Real-time: low latency, нижний throughput per node.
Memory vs CPU
- Кеширование: меньше CPU (no recompute), больше памяти.
- Streaming compute: меньше памяти, больше CPU.
Simplicity vs Flexibility
- Hardcoded config: просто, но негибко.
- Plugin architecture: гибко, но overhead.
Build vs Buy
- Build: control, но time и maintenance.
- Buy: быстро, но lock-in и стоимость.
Now vs Later
- Quick fix: решает сейчас, накапливает debt.
- Proper solution: дольше, чище.
Cost vs Quality vs Speed Iron triangle: можно выбрать 2.
2.2 Менее очевидные оси
Заголовок раздела «2.2 Менее очевидные оси»Performance vs Maintainability
- Hand-optimized assembly: быстро, никто не поймёт.
- Idiomatic code: медленнее, но maintainable.
DRY vs Coupling
- Слишком DRY: одна абстракция для двух подобных вещей → coupling, изменение «А» ломает «Б».
- Some duplication: ок, если это decoupled.
Generality vs Concreteness
- Generic framework: «всё умеет», но сложно использовать.
- Specific tool: одно дело, но хорошо.
Local optimization vs Global
- Делаем 1 сервис быстрее на 10% → но это не bottleneck системы. Бесполезная работа.
2.3 Decision matrix
Заголовок раздела «2.3 Decision matrix»Когда сравниваешь варианты, делай матрицу:
| Критерий | Вес | Опция A | Опция B | Опция C |
|---|---|---|---|---|
| Latency | 5 | 8 | 6 | 4 |
| Cost | 3 | 5 | 9 | 7 |
| Operational complexity | 4 | 4 | 7 | 9 |
| Team familiarity | 4 | 9 | 5 | 3 |
| Score | 117 | 122 | 103 |
Score = Σ(вес × оценка). Не «правда», но структурирует.
2.4 Cost of complexity
Заголовок раздела «2.4 Cost of complexity»Operational cost:
- Каждый компонент нужно деплоить, мониторить, патчить.
- 10 микросервисов = 10× работы DevOps.
Cognitive cost:
- Новый разработчик неделю учит систему.
- Сложная архитектура → больше bus factor.
Maintenance cost:
- 5-летнего проекта на 3 фреймворках сложнее эволюционировать.
Right-size: complexity должна быть соразмерна проблеме.
Простая проблема + простая архитектура = ✅Простая проблема + сложная архитектура = ❌ OverengineeringСложная проблема + простая архитектура = ❌ UnderengineeringСложная проблема + сложная архитектура = ✅ (но проверь, что сложность нужна)2.5 Risk assessment
Заголовок раздела «2.5 Risk assessment»При принятии решения — оценить риски:
Что может пойти не так?
- Data loss?
- Downtime?
- Performance regression?
- Security breach?
- Cost explosion?
Какова вероятность × impact?
Risk matrix: Low impact High impactHigh prob: Watch Mitigate nowLow prob: Accept Plan for it2.6 Examples concrete trade-offs
Заголовок раздела «2.6 Examples concrete trade-offs»gRPC vs REST
| gRPC | REST/JSON | |
|---|---|---|
| Performance | Высоко (HTTP/2, binary) | Ниже |
| Streaming | Built-in | Сложно (WebSockets, SSE) |
| Ecosystem | Меньше tools | Огромный |
| Browser | Нужен grpc-web | Нативно |
| Debuggability | Сложнее (binary) | Просто (curl) |
| Polyglot | Хорошо | Отлично |
Use case:
- Внутренние сервисы → gRPC.
- Public API, browser clients → REST.
Kafka vs RabbitMQ
| Kafka | RabbitMQ | |
|---|---|---|
| Throughput | Очень высокий (млн msg/sec) | Средний |
| Latency | Низкая, но не лучшая | Очень низкая |
| Retention | Долгая (часы/дни/всегда) | Только до consume |
| Replay | Да | Нет (без extensions) |
| Routing | Простой (topics) | Сложный (exchanges) |
| Setup | Сложно (Zookeeper/KRaft) | Просто |
Use case:
- Event streaming, аналитика → Kafka.
- Task queue, command bus → RabbitMQ.
- Сейчас: NATS — между ними по сложности и фичам.
SQL vs NoSQL
| SQL (Postgres) | NoSQL (Mongo/Cassandra) | |
|---|---|---|
| Schema | Strict | Flexible |
| ACID | Полная | Опционально |
| Scale | Vertical + read replicas | Horizontal |
| Joins | OK | Плохо |
| Maturity | 40+ years | 15 лет |
Use case:
- Любая транзакционная система → SQL.
- Огромный volume, простые queries → NoSQL.
- Default — Postgres.
Build vs Buy frameworks
| Build own | Use OSS | Buy commercial | |
|---|---|---|---|
| Control | Полный | Средний | Меньше |
| Cost | High dev | Low (free) | Subscription |
| Customization | Идеально | Через PR | Через limits |
| Maintenance | На нас | Сообщество | Vendor |
Right answer: для бизнес-логики — build, для infrastructure — use proven OSS, для специфики (data tools, observability) — иногда buy.
2.7 Documenting trade-offs (ADR)
Заголовок раздела «2.7 Documenting trade-offs (ADR)»В ADR обязательно секция Consequences с + и −. Это и есть trade-offs.
## DecisionИспользуем Kafka для event bus.
## Consequences+ Long retention, replay для аналитики.+ Высокий throughput (важно для CDC).+ Партиционирование = горизонтальный scale.
− Операционная сложность (KRaft / Zookeeper, partitions).− Сложнее dead-letter handling, чем в RabbitMQ.− Сильное обучение команды (3–6 месяцев до уверенности).
## Why not RabbitMQ?- Нет встроенного retention.- Streams есть, но молодые.- Подойдёт для command bus, но мы выбираем event bus.3. Глубже: Event Storming
Заголовок раздела «3. Глубже: Event Storming»3.1 Концепция (Alberto Brandolini)
Заголовок раздела «3.1 Концепция (Alberto Brandolini)»Event Storming — workshop-техника для быстрого понимания сложного бизнес-domain’а через события.
Метафора: мозговой штурм, где «штурмуем» events на стене.
3.2 Уровни Event Storming
Заголовок раздела «3.2 Уровни Event Storming»1. Big Picture — обзорный, для понимания всей системы.
- Целая компания на стене.
- Stakeholders, продакты, devs.
- 2–8 часов.
2. Process Level — детально для одного процесса.
- Например, «процесс checkout».
- 1 день.
3. Software Design Level — для конкретного сервиса.
- Aggregates, commands, events.
- 1 день+.
3.3 Color coding (sticky notes)
Заголовок раздела «3.3 Color coding (sticky notes)»🟧 Orange — Events (что случилось в системе)🟦 Blue — Commands (триггеры)🟨 Yellow — Aggregates (сущности, владеющие state)🟪 Pink — External systems🟩 Green — Read models / views (UI screens)🟥 Red — Hotspots, конфликты, вопросы👤 Actor — User / role🟫 Brown — Policies (правила, реакции на events)3.4 Steps Big Picture Event Storming
Заголовок раздела «3.4 Steps Big Picture Event Storming»Step 1: Chaotic exploration
- Каждый участник пишет events которые knows happen в системе.
- Past tense: “Order Placed”, “Payment Received”, “User Registered”.
- Стикеры на стену — хаотично, без порядка.
- 30–60 минут.
Step 2: Timeline organization
- Сортируем стикеры по timeline (слева направо).
- Дубликаты убираем.
- Появляются связи и пробелы.
Step 3: Identify pivotal events
- Какие events — ключевые поворотные?
- Между ними — bounded contexts.
Step 4: Adding commands and actors
- Что вызвало event? (command + actor).
- “User → [Place Order command] → Order Placed (event)”.
Step 5: Adding policies
- Между events: что в ответ автоматически происходит?
- “Order Placed → policy ‘send confirmation email’ → Email Sent”.
Step 6: Identify aggregates
- Какие сущности владеют state?
- Order, User, Payment, etc.
Step 7: Bounded contexts
- Где границы responsibility?
- “Sales context”, “Fulfillment context”, “Billing context”.
3.5 Пример из e-commerce
Заголовок раздела «3.5 Пример из e-commerce»Time →
[Actor: Customer] → 🟦 Place Order ↓ 🟨 Order ↓ 🟧 Order Placed ↓ 🟫 Policy: notify warehouse ↓ 🟧 Warehouse Notified ↓ 🟨 Shipment ← 🟦 Pick Items (worker) ↓ 🟧 Shipment Created ↓ 🟧 Order Shipped ↓ 🟫 Policy: charge customer ↓ 🟧 Payment Charged ↓ 🟪 External: StripeИз этого:
- Bounded contexts: Sales, Warehouse, Billing, Notifications.
- Aggregates: Order, Shipment, Payment.
3.6 Что получаем после Event Storming
Заголовок раздела «3.6 Что получаем после Event Storming»- Shared understanding — все участники видят полную картину.
- Bounded contexts — границы для микросервисов.
- Aggregates — основные DDD-сущности.
- Subdomain discovery — что core, что supporting, что generic.
- Hidden complexity — pink/red стикеры (внешние системы, hotspots).
3.7 Tools для Event Storming
Заголовок раздела «3.7 Tools для Event Storming»Physical (in-person):
- Большая стена / окно.
- Sticky notes (orange, blue, yellow, etc).
- Sharpie маркеры.
Remote:
- Miro — самый популярный.
- FigJam — Figma’s whiteboard.
- Mural — enterprise.
- EventModeling.org — специализированный tool.
3.8 Когда использовать Event Storming
Заголовок раздела «3.8 Когда использовать Event Storming»✅ Когда полезно:
- Greenfield проект — понять domain.
- Understanding legacy — реверс-инжиниринг системы.
- Onboarding — новые члены быстро вкатываются.
- Bounded context discovery — для микросервисов.
- Process improvement — найти bottlenecks.
❌ Когда не очень:
- CRUD-системы с одним workflow.
- Просто, что добавить новую кнопку.
- Команда из 2 человек (можно проще).
3.9 Связь с DDD
Заголовок раздела «3.9 Связь с DDD»Event Storming — практическая техника для Domain-Driven Design:
- Ubiquitous language — events на стене на языке бизнеса.
- Bounded contexts — выделяются естественно.
- Aggregates — yellow стикеры.
- Domain events — основа event-driven архитектуры.
3.10 Event Modeling (вариация)
Заголовок раздела «3.10 Event Modeling (вариация)»Adam Dymitruk развил Event Storming в Event Modeling:
- Более структурированно.
- Включает UI mockups как часть модели.
- Slice = one user story end-to-end.
Подход: каждый «слайс» = command + event + read model + screens.
4. Глубже: Архитектурные принципы
Заголовок раздела «4. Глубже: Архитектурные принципы»4.1 Single Responsibility Principle (SRP) на уровне сервиса
Заголовок раздела «4.1 Single Responsibility Principle (SRP) на уровне сервиса»«У сервиса должна быть одна причина изменяться».
❌ Bad:
UserService — auth, profile, billing, notificationsКогда меняется billing → меняется UserService → деплой → риск.
✅ Good:
AuthService, ProfileService, BillingService, NotificationService4.2 KISS (Keep It Simple, Stupid)
Заголовок раздела «4.2 KISS (Keep It Simple, Stupid)»Самое простое решение, которое работает, обычно правильное.
«Если можешь решить cron’ом — не пиши Kafka».
4.3 YAGNI (You Aren’t Gonna Need It)
Заголовок раздела «4.3 YAGNI (You Aren’t Gonna Need It)»Не строить инфраструктуру «на будущее, когда понадобится».
❌ “Лучше сразу сделаем kafka, может пригодится”. ✅ “Сейчас 100 RPS, in-memory queue хватает. Когда упрёмся → мигрируем”.
Контекст: YAGNI про функционал, не про архитектуру. Иногда нужно проектировать на будущее (one-way doors).
4.4 DRY (Don’t Repeat Yourself)
Заголовок раздела «4.4 DRY (Don’t Repeat Yourself)»Не дублировать знание. Но:
- Не код, а knowledge.
- Иногда повторение лучше, чем неудачная абстракция.
Sandi Metz: “Duplication is far cheaper than the wrong abstraction”.
4.5 12-factor app
Заголовок раздела «4.5 12-factor app»Heroku 2011, стандарт cloud-native:
- Codebase — один репо на app.
- Dependencies — explicit (go.mod).
- Config — в env vars.
- Backing services — БД, queue как resources, swappable.
- Build, release, run — separate stages.
- Processes — stateless.
- Port binding — self-contained (Go серверы — нативно).
- Concurrency — через processes.
- Disposability — fast startup, graceful shutdown.
- Dev/prod parity — minimize diff.
- Logs — stdout, не файлы.
- Admin processes — one-off (migrations).
В Go-сервисах — обычно соблюдаются естественно.
4.6 Cloud-native principles (CNCF)
Заголовок раздела «4.6 Cloud-native principles (CNCF)»- Containerized — Docker.
- Dynamically orchestrated — Kubernetes.
- Microservices-oriented — independent deploys.
- Observability — metrics, logs, traces, profiles.
- Resilience — circuit breakers, retries.
4.7 Conway’s Law
Заголовок раздела «4.7 Conway’s Law»“Organizations design systems that mirror their communication structures.” — Melvin Conway, 1967
Следствия:
- Если у тебя 3 команды — у тебя 3 сервиса.
- Если команды плохо общаются — модули с плохими интерфейсами.
Inverse Conway Maneuver: спроектируй организацию под архитектуру, которую хочешь.
Пример:
- Хочешь микросервисы → команды по domain (Sales, Billing).
- Хочешь монолит → одна команда.
4.8 SOLID на уровне архитектуры
Заголовок раздела «4.8 SOLID на уровне архитектуры»- Single Responsibility — service has one purpose.
- Open-closed — extensions via plugins, не модификация core.
- Liskov substitution — interface compliance.
- Interface segregation — узкие интерфейсы.
- Dependency inversion — depend on abstractions.
В Go SOLID часто переписывают как гексагональную архитектуру / clean architecture.
4.9 Failure modes мышление
Заголовок раздела «4.9 Failure modes мышление»Перед запуском любой системы — спроси:
- Что если DB упала на 10 минут?
- Что если 1 worker завис?
- Что если внешний API таймаутит?
- Что если deploy выкатил баг?
- Что если оператор случайно
DROP TABLE?
Chaos Engineering (Netflix) — намеренно ломать production, чтобы найти слабости.
4.10 «Worse is Better» (Richard Gabriel)
Заголовок раздела «4.10 «Worse is Better» (Richard Gabriel)»Иногда проще-но-неполно > сложнее-но-полно. Unix vs Lisp Machines.
Урок: перфекционизм убивает прогресс. Ship MVP.
5. Gotchas
Заголовок раздела «5. Gotchas»5.1 ⚠️ Optimization bias
Заголовок раздела «5.1 ⚠️ Optimization bias»Optimize, что легко измерить, не что важно. Latency p99 vs developer experience.
5.2 ⚠️ Sunk cost fallacy
Заголовок раздела «5.2 ⚠️ Sunk cost fallacy»«Мы уже 6 месяцев вложили в этот подход» — не аргумент продолжать, если он плох.
5.3 ⚠️ “Lock-in” страх
Заголовок раздела «5.3 ⚠️ “Lock-in” страх»Иногда vendor lock-in — норма (стоит того). Не строй abstraction поверх RDS, чтобы «можно мигрировать на Aurora» — почти никто не мигрирует.
5.4 ⚠️ Premature optimization
Заголовок раздела «5.4 ⚠️ Premature optimization»«А если у нас будет 100M users?» — у тебя 100 users. Не строй для 100M.
5.5 ⚠️ Cargo cult
Заголовок раздела «5.5 ⚠️ Cargo cult»«Netflix делает chaos engineering, значит и нам надо». У них SRE команда, у тебя — нет.
5.6 ⚠️ Bikeshedding
Заголовок раздела «5.6 ⚠️ Bikeshedding»Тратишь часы на маловажное (цвет logo), не обсуждаешь важное (security).
5.7 ⚠️ Decision fatigue
Заголовок раздела «5.7 ⚠️ Decision fatigue»Слишком много решений за день → плохие решения. Делегируй мелочи.
5.8 ⚠️ Event Storming без бизнеса
Заголовок раздела «5.8 ⚠️ Event Storming без бизнеса»Сидят только разработчики → фантазии, не реальный domain. Обязательно продакты, аналитики, поддержка.
5.9 ⚠️ Event Storming → код 1:1
Заголовок раздела «5.9 ⚠️ Event Storming → код 1:1»Каждый event ≠ Kafka message. Event Storming = модель domain’а, не тех-спецификация.
5.10 ⚠️ Принципы как догма
Заголовок раздела «5.10 ⚠️ Принципы как догма»«DRY обязательно!» — иногда нет. Принципы — guidelines, не правила.
6. Real cases
Заголовок раздела «6. Real cases»6.1 Amazon — two-pizza teams
Заголовок раздела «6.1 Amazon — two-pizza teams»Каждая команда ≤ 8 человек (2 пиццы). Каждая team owns свой service. Conway’s Law применён намеренно.
6.2 Netflix Chaos Monkey
Заголовок раздела «6.2 Netflix Chaos Monkey»Случайно убивает production instances. Cmd принят, потому что инфра должна быть resilient. Trade-off: cost (incidents) vs benefit (готовность к real failures).
6.3 Spotify Squad model
Заголовок раздела «6.3 Spotify Squad model»Squads (10 человек), tribes (squads), guilds (interest groups). Conway’s Law формализован.
6.4 Google design docs
Заголовок раздела «6.4 Google design docs»Каждый проект начинается с дизайн-документа. Trade-offs обсуждаются formal-у, до кода.
6.5 Avito Event Storming для нового сервиса
Заголовок раздела «6.5 Avito Event Storming для нового сервиса»Перед запуском нового сервиса — Event Storming workshop. Cross-functional команда (backend, frontend, продакт). Результат — bounded contexts → микросервисы.
6.6 Microsoft retreat от microservices
Заголовок раздела «6.6 Microsoft retreat от microservices»Некоторые продукты Microsoft вернулись к более монолитной структуре после микросервисов. Trade-off перевешивает.
6.7 GitHub оставшийся Rails monolith
Заголовок раздела «6.7 GitHub оставшийся Rails monolith»GitHub.com — всё ещё в основном Rails monolith. Они сознательно не дробят, потому что для их случая trade-offs против микросервисов.
6.8 Stack Overflow — extreme monolith
Заголовок раздела «6.8 Stack Overflow — extreme monolith»8 серверов, monolith на ASP.NET, миллиарды requests. Best example «KISS работает».
7. Вопросы (20+)
Заголовок раздела «7. Вопросы (20+)»- Почему «все engineering decisions — trade-offs»?
- Что такое two-way vs one-way doors (Bezos)?
- Опиши trade-off между Consistency и Availability.
- Сравни Kafka и RabbitMQ — когда что?
- Что такое decision matrix?
- Что такое «cost of complexity»?
- Почему «duplication > wrong abstraction»?
- Что такое Event Storming? Кто автор?
- Перечисли цветовое кодирование стикеров в Event Storming.
- Опиши 7 шагов Big Picture Event Storming.
- Что получаем после Event Storming?
- Чем Event Modeling отличается от Event Storming?
- Связь Event Storming и DDD?
- Что такое Single Responsibility на уровне сервиса?
- Что такое 12-factor app? Перечисли 5 факторов.
- Что такое Conway’s Law? Inverse Conway?
- Что такое YAGNI? Когда не работает?
- Что такое DRY и когда не стоит применять?
- Что такое Chaos Engineering?
- Что такое cargo cult в архитектуре?
- Опиши SOLID для микросервисов.
- Какие cloud-native принципы CNCF?
- Что такое premature optimization?
- Как Документировать trade-offs?
- Приведи пример решения, где KISS перевесил «правильный» подход.
8. Practice
Заголовок раздела «8. Practice»Задача 1: Event Storming для своего проекта
Заголовок раздела «Задача 1: Event Storming для своего проекта»- Собрать команду (продакт + 2–3 dev) на 2 часа.
- На Miro/FigJam — Big Picture Event Storming.
- Зафиксировать events, commands, aggregates, контексты.
- Сравнить с фактической архитектурой — где gaps?
Задача 2: Decision matrix для технологии
Заголовок раздела «Задача 2: Decision matrix для технологии»- Выбери задачу (например, «выбрать message queue»).
- 3 опции (Kafka, RabbitMQ, NATS).
- 5 критериев с весами.
- Заполни оценки, посчитай.
- Запиши ADR с обоснованием.
Задача 3: ADR с trade-offs
Заголовок раздела «Задача 3: ADR с trade-offs»- Возьми реальное архитектурное решение из проекта.
- Напиши ADR — особенно Consequences (+ и −).
- Покажи коллеге: всё ли понятно, какие trade-offs?
Задача 4: Failure mode analysis
Заголовок раздела «Задача 4: Failure mode analysis»- Возьми сервис.
- Brainstorm: 10 способов «как это может сломаться».
- Каждый сценарий — что произойдёт?
- Какие mitigations добавить?
Задача 5: упростить архитектуру
Заголовок раздела «Задача 5: упростить архитектуру»- Найди компонент, который redundant.
- Например, отдельный Redis, можно ли заменить in-memory?
- Запиши: что выиграем (KISS), что потеряем.
- Реши: стоит ли упрощать?
9. Источники
Заголовок раздела «9. Источники»- Mark Richards, Neal Ford — Fundamentals of Software Architecture (книга)
- Neal Ford — Building Evolutionary Architectures
- Alberto Brandolini — Introducing EventStorming (книга): https://www.eventstorming.com/book/
- Eric Evans — Domain-Driven Design (книга)
- Vaughn Vernon — Implementing Domain-Driven Design
- Adam Dymitruk — Event Modeling: https://eventmodeling.org/
- Joel Spolsky — Things You Should Never Do: https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
- Sandi Metz — The Wrong Abstraction: https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction
- Heroku — 12-factor: https://12factor.net/
- Site Reliability Engineering — Google (книга)
- Adrian Cockcroft (Netflix) — talks on chaos engineering, microservices
- Werner Vogels (Amazon CTO) blog: https://www.allthingsdistributed.com/
- Accelerate — Nicole Forsgren et al.
- Conway, Melvin — How Do Committees Invent? (1967)
- Sam Newman — Building Microservices (2nd edition)
- Spotify Engineering — Squad model
- Martin Fowler — bliki: https://martinfowler.com/bliki/
- Anthropic, OpenAI engineering blogs (для современных кейсов AI-стека)
- Software Architecture: The Hard Parts — Mark Richards, Neal Ford
- ThoughtWorks Technology Radar: https://www.thoughtworks.com/radar
Резюме. Tech lead — это не про «знать правильные ответы», а про умение работать в условиях неопределённости и trade-offs. Decision matrix, ADR с consequences, two-way vs one-way doors (Bezos) — рабочие инструменты. Event Storming — workshop-техника для domain discovery и bounded contexts. Принципы (KISS, YAGNI, 12-factor, Conway’s Law) — система координат. Самая частая ошибка middle разработчиков — догматизм и over-engineering. Senior/Tech Lead — это про здравый смысл и контекст, а не про следование «правильным паттернам».