@shaykec/bridge 0.4.25 → 0.4.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/journeys/ai-engineer.yaml +34 -0
- package/journeys/backend-developer.yaml +36 -0
- package/journeys/business-analyst.yaml +37 -0
- package/journeys/devops-engineer.yaml +37 -0
- package/journeys/engineering-manager.yaml +44 -0
- package/journeys/frontend-developer.yaml +41 -0
- package/journeys/fullstack-developer.yaml +49 -0
- package/journeys/mobile-developer.yaml +42 -0
- package/journeys/product-manager.yaml +35 -0
- package/journeys/qa-engineer.yaml +37 -0
- package/journeys/ux-designer.yaml +43 -0
- package/modules/README.md +52 -0
- package/modules/accessibility-fundamentals/content.md +126 -0
- package/modules/accessibility-fundamentals/exercises.md +88 -0
- package/modules/accessibility-fundamentals/module.yaml +43 -0
- package/modules/accessibility-fundamentals/quick-ref.md +71 -0
- package/modules/accessibility-fundamentals/quiz.md +100 -0
- package/modules/accessibility-fundamentals/resources.md +29 -0
- package/modules/accessibility-fundamentals/walkthrough.md +80 -0
- package/modules/adr-writing/content.md +121 -0
- package/modules/adr-writing/exercises.md +81 -0
- package/modules/adr-writing/module.yaml +41 -0
- package/modules/adr-writing/quick-ref.md +57 -0
- package/modules/adr-writing/quiz.md +73 -0
- package/modules/adr-writing/resources.md +29 -0
- package/modules/adr-writing/walkthrough.md +64 -0
- package/modules/ai-agents/content.md +120 -0
- package/modules/ai-agents/exercises.md +82 -0
- package/modules/ai-agents/module.yaml +42 -0
- package/modules/ai-agents/quick-ref.md +60 -0
- package/modules/ai-agents/quiz.md +103 -0
- package/modules/ai-agents/resources.md +30 -0
- package/modules/ai-agents/walkthrough.md +85 -0
- package/modules/ai-assisted-research/content.md +136 -0
- package/modules/ai-assisted-research/exercises.md +80 -0
- package/modules/ai-assisted-research/module.yaml +42 -0
- package/modules/ai-assisted-research/quick-ref.md +67 -0
- package/modules/ai-assisted-research/quiz.md +73 -0
- package/modules/ai-assisted-research/resources.md +33 -0
- package/modules/ai-assisted-research/walkthrough.md +85 -0
- package/modules/ai-pair-programming/content.md +105 -0
- package/modules/ai-pair-programming/exercises.md +98 -0
- package/modules/ai-pair-programming/module.yaml +39 -0
- package/modules/ai-pair-programming/quick-ref.md +58 -0
- package/modules/ai-pair-programming/quiz.md +73 -0
- package/modules/ai-pair-programming/resources.md +34 -0
- package/modules/ai-pair-programming/walkthrough.md +117 -0
- package/modules/ai-test-generation/content.md +125 -0
- package/modules/ai-test-generation/exercises.md +98 -0
- package/modules/ai-test-generation/module.yaml +39 -0
- package/modules/ai-test-generation/quick-ref.md +65 -0
- package/modules/ai-test-generation/quiz.md +74 -0
- package/modules/ai-test-generation/resources.md +41 -0
- package/modules/ai-test-generation/walkthrough.md +100 -0
- package/modules/api-design/content.md +189 -0
- package/modules/api-design/exercises.md +84 -0
- package/modules/api-design/game.yaml +113 -0
- package/modules/api-design/module.yaml +45 -0
- package/modules/api-design/quick-ref.md +73 -0
- package/modules/api-design/quiz.md +100 -0
- package/modules/api-design/resources.md +55 -0
- package/modules/api-design/walkthrough.md +88 -0
- package/modules/clean-code/content.md +136 -0
- package/modules/clean-code/exercises.md +137 -0
- package/modules/clean-code/game.yaml +172 -0
- package/modules/clean-code/module.yaml +44 -0
- package/modules/clean-code/quick-ref.md +44 -0
- package/modules/clean-code/quiz.md +105 -0
- package/modules/clean-code/resources.md +40 -0
- package/modules/clean-code/walkthrough.md +78 -0
- package/modules/clean-code/workshop.yaml +149 -0
- package/modules/code-review/content.md +130 -0
- package/modules/code-review/exercises.md +95 -0
- package/modules/code-review/game.yaml +83 -0
- package/modules/code-review/module.yaml +42 -0
- package/modules/code-review/quick-ref.md +77 -0
- package/modules/code-review/quiz.md +105 -0
- package/modules/code-review/resources.md +40 -0
- package/modules/code-review/walkthrough.md +106 -0
- package/modules/daily-workflow/content.md +81 -0
- package/modules/daily-workflow/exercises.md +50 -0
- package/modules/daily-workflow/module.yaml +33 -0
- package/modules/daily-workflow/quick-ref.md +37 -0
- package/modules/daily-workflow/quiz.md +65 -0
- package/modules/daily-workflow/resources.md +38 -0
- package/modules/daily-workflow/walkthrough.md +83 -0
- package/modules/debugging-systematically/content.md +139 -0
- package/modules/debugging-systematically/exercises.md +91 -0
- package/modules/debugging-systematically/module.yaml +46 -0
- package/modules/debugging-systematically/quick-ref.md +59 -0
- package/modules/debugging-systematically/quiz.md +105 -0
- package/modules/debugging-systematically/resources.md +42 -0
- package/modules/debugging-systematically/walkthrough.md +84 -0
- package/modules/debugging-systematically/workshop.yaml +127 -0
- package/modules/demo-test/content.md +68 -0
- package/modules/demo-test/exercises.md +28 -0
- package/modules/demo-test/game.yaml +171 -0
- package/modules/demo-test/module.yaml +41 -0
- package/modules/demo-test/quick-ref.md +54 -0
- package/modules/demo-test/quiz.md +74 -0
- package/modules/demo-test/resources.md +21 -0
- package/modules/demo-test/walkthrough.md +122 -0
- package/modules/demo-test/workshop.yaml +31 -0
- package/modules/design-critique/content.md +93 -0
- package/modules/design-critique/exercises.md +71 -0
- package/modules/design-critique/module.yaml +41 -0
- package/modules/design-critique/quick-ref.md +63 -0
- package/modules/design-critique/quiz.md +73 -0
- package/modules/design-critique/resources.md +27 -0
- package/modules/design-critique/walkthrough.md +68 -0
- package/modules/design-patterns/content.md +335 -0
- package/modules/design-patterns/exercises.md +82 -0
- package/modules/design-patterns/game.yaml +55 -0
- package/modules/design-patterns/module.yaml +45 -0
- package/modules/design-patterns/quick-ref.md +44 -0
- package/modules/design-patterns/quiz.md +101 -0
- package/modules/design-patterns/resources.md +40 -0
- package/modules/design-patterns/walkthrough.md +64 -0
- package/modules/exploratory-testing/content.md +133 -0
- package/modules/exploratory-testing/exercises.md +88 -0
- package/modules/exploratory-testing/module.yaml +41 -0
- package/modules/exploratory-testing/quick-ref.md +68 -0
- package/modules/exploratory-testing/quiz.md +75 -0
- package/modules/exploratory-testing/resources.md +39 -0
- package/modules/exploratory-testing/walkthrough.md +87 -0
- package/modules/git/content.md +128 -0
- package/modules/git/exercises.md +53 -0
- package/modules/git/game.yaml +190 -0
- package/modules/git/module.yaml +44 -0
- package/modules/git/quick-ref.md +67 -0
- package/modules/git/quiz.md +89 -0
- package/modules/git/resources.md +49 -0
- package/modules/git/walkthrough.md +92 -0
- package/modules/git/workshop.yaml +145 -0
- package/modules/hiring-interviews/content.md +130 -0
- package/modules/hiring-interviews/exercises.md +88 -0
- package/modules/hiring-interviews/module.yaml +41 -0
- package/modules/hiring-interviews/quick-ref.md +68 -0
- package/modules/hiring-interviews/quiz.md +73 -0
- package/modules/hiring-interviews/resources.md +36 -0
- package/modules/hiring-interviews/walkthrough.md +75 -0
- package/modules/hooks/content.md +97 -0
- package/modules/hooks/exercises.md +69 -0
- package/modules/hooks/module.yaml +39 -0
- package/modules/hooks/quick-ref.md +93 -0
- package/modules/hooks/quiz.md +81 -0
- package/modules/hooks/resources.md +34 -0
- package/modules/hooks/walkthrough.md +105 -0
- package/modules/hooks/workshop.yaml +64 -0
- package/modules/incident-response/content.md +124 -0
- package/modules/incident-response/exercises.md +82 -0
- package/modules/incident-response/game.yaml +132 -0
- package/modules/incident-response/module.yaml +45 -0
- package/modules/incident-response/quick-ref.md +53 -0
- package/modules/incident-response/quiz.md +103 -0
- package/modules/incident-response/resources.md +40 -0
- package/modules/incident-response/walkthrough.md +82 -0
- package/modules/llm-fundamentals/content.md +114 -0
- package/modules/llm-fundamentals/exercises.md +83 -0
- package/modules/llm-fundamentals/module.yaml +42 -0
- package/modules/llm-fundamentals/quick-ref.md +64 -0
- package/modules/llm-fundamentals/quiz.md +103 -0
- package/modules/llm-fundamentals/resources.md +30 -0
- package/modules/llm-fundamentals/walkthrough.md +91 -0
- package/modules/one-on-ones/content.md +133 -0
- package/modules/one-on-ones/exercises.md +81 -0
- package/modules/one-on-ones/module.yaml +44 -0
- package/modules/one-on-ones/quick-ref.md +67 -0
- package/modules/one-on-ones/quiz.md +73 -0
- package/modules/one-on-ones/resources.md +37 -0
- package/modules/one-on-ones/walkthrough.md +69 -0
- package/modules/package.json +9 -0
- package/modules/prioritization-frameworks/content.md +130 -0
- package/modules/prioritization-frameworks/exercises.md +93 -0
- package/modules/prioritization-frameworks/module.yaml +41 -0
- package/modules/prioritization-frameworks/quick-ref.md +77 -0
- package/modules/prioritization-frameworks/quiz.md +73 -0
- package/modules/prioritization-frameworks/resources.md +32 -0
- package/modules/prioritization-frameworks/walkthrough.md +69 -0
- package/modules/prompt-engineering/content.md +123 -0
- package/modules/prompt-engineering/exercises.md +82 -0
- package/modules/prompt-engineering/game.yaml +101 -0
- package/modules/prompt-engineering/module.yaml +45 -0
- package/modules/prompt-engineering/quick-ref.md +65 -0
- package/modules/prompt-engineering/quiz.md +105 -0
- package/modules/prompt-engineering/resources.md +36 -0
- package/modules/prompt-engineering/walkthrough.md +81 -0
- package/modules/rag-fundamentals/content.md +111 -0
- package/modules/rag-fundamentals/exercises.md +80 -0
- package/modules/rag-fundamentals/module.yaml +45 -0
- package/modules/rag-fundamentals/quick-ref.md +58 -0
- package/modules/rag-fundamentals/quiz.md +75 -0
- package/modules/rag-fundamentals/resources.md +34 -0
- package/modules/rag-fundamentals/walkthrough.md +75 -0
- package/modules/react-fundamentals/content.md +140 -0
- package/modules/react-fundamentals/exercises.md +81 -0
- package/modules/react-fundamentals/game.yaml +145 -0
- package/modules/react-fundamentals/module.yaml +45 -0
- package/modules/react-fundamentals/quick-ref.md +62 -0
- package/modules/react-fundamentals/quiz.md +106 -0
- package/modules/react-fundamentals/resources.md +42 -0
- package/modules/react-fundamentals/walkthrough.md +89 -0
- package/modules/react-fundamentals/workshop.yaml +112 -0
- package/modules/react-native-fundamentals/content.md +141 -0
- package/modules/react-native-fundamentals/exercises.md +79 -0
- package/modules/react-native-fundamentals/module.yaml +42 -0
- package/modules/react-native-fundamentals/quick-ref.md +60 -0
- package/modules/react-native-fundamentals/quiz.md +61 -0
- package/modules/react-native-fundamentals/resources.md +24 -0
- package/modules/react-native-fundamentals/walkthrough.md +84 -0
- package/modules/registry.yaml +1650 -0
- package/modules/risk-management/content.md +162 -0
- package/modules/risk-management/exercises.md +86 -0
- package/modules/risk-management/module.yaml +41 -0
- package/modules/risk-management/quick-ref.md +82 -0
- package/modules/risk-management/quiz.md +73 -0
- package/modules/risk-management/resources.md +40 -0
- package/modules/risk-management/walkthrough.md +67 -0
- package/modules/running-effective-standups/content.md +119 -0
- package/modules/running-effective-standups/exercises.md +79 -0
- package/modules/running-effective-standups/module.yaml +40 -0
- package/modules/running-effective-standups/quick-ref.md +61 -0
- package/modules/running-effective-standups/quiz.md +73 -0
- package/modules/running-effective-standups/resources.md +36 -0
- package/modules/running-effective-standups/walkthrough.md +76 -0
- package/modules/solid-principles/content.md +154 -0
- package/modules/solid-principles/exercises.md +107 -0
- package/modules/solid-principles/module.yaml +42 -0
- package/modules/solid-principles/quick-ref.md +50 -0
- package/modules/solid-principles/quiz.md +102 -0
- package/modules/solid-principles/resources.md +39 -0
- package/modules/solid-principles/walkthrough.md +84 -0
- package/modules/sprint-planning/content.md +142 -0
- package/modules/sprint-planning/exercises.md +79 -0
- package/modules/sprint-planning/game.yaml +84 -0
- package/modules/sprint-planning/module.yaml +44 -0
- package/modules/sprint-planning/quick-ref.md +76 -0
- package/modules/sprint-planning/quiz.md +102 -0
- package/modules/sprint-planning/resources.md +39 -0
- package/modules/sprint-planning/walkthrough.md +75 -0
- package/modules/sql-fundamentals/content.md +160 -0
- package/modules/sql-fundamentals/exercises.md +87 -0
- package/modules/sql-fundamentals/game.yaml +105 -0
- package/modules/sql-fundamentals/module.yaml +45 -0
- package/modules/sql-fundamentals/quick-ref.md +53 -0
- package/modules/sql-fundamentals/quiz.md +103 -0
- package/modules/sql-fundamentals/resources.md +42 -0
- package/modules/sql-fundamentals/walkthrough.md +92 -0
- package/modules/sql-fundamentals/workshop.yaml +109 -0
- package/modules/stakeholder-communication/content.md +186 -0
- package/modules/stakeholder-communication/exercises.md +87 -0
- package/modules/stakeholder-communication/module.yaml +38 -0
- package/modules/stakeholder-communication/quick-ref.md +89 -0
- package/modules/stakeholder-communication/quiz.md +73 -0
- package/modules/stakeholder-communication/resources.md +41 -0
- package/modules/stakeholder-communication/walkthrough.md +74 -0
- package/modules/system-design/content.md +149 -0
- package/modules/system-design/exercises.md +83 -0
- package/modules/system-design/game.yaml +95 -0
- package/modules/system-design/module.yaml +46 -0
- package/modules/system-design/quick-ref.md +59 -0
- package/modules/system-design/quiz.md +102 -0
- package/modules/system-design/resources.md +46 -0
- package/modules/system-design/walkthrough.md +90 -0
- package/modules/team-topologies/content.md +166 -0
- package/modules/team-topologies/exercises.md +85 -0
- package/modules/team-topologies/module.yaml +41 -0
- package/modules/team-topologies/quick-ref.md +61 -0
- package/modules/team-topologies/quiz.md +101 -0
- package/modules/team-topologies/resources.md +37 -0
- package/modules/team-topologies/walkthrough.md +76 -0
- package/modules/technical-debt/content.md +111 -0
- package/modules/technical-debt/exercises.md +92 -0
- package/modules/technical-debt/module.yaml +39 -0
- package/modules/technical-debt/quick-ref.md +60 -0
- package/modules/technical-debt/quiz.md +73 -0
- package/modules/technical-debt/resources.md +25 -0
- package/modules/technical-debt/walkthrough.md +94 -0
- package/modules/technical-mentoring/content.md +128 -0
- package/modules/technical-mentoring/exercises.md +84 -0
- package/modules/technical-mentoring/module.yaml +41 -0
- package/modules/technical-mentoring/quick-ref.md +74 -0
- package/modules/technical-mentoring/quiz.md +73 -0
- package/modules/technical-mentoring/resources.md +33 -0
- package/modules/technical-mentoring/walkthrough.md +65 -0
- package/modules/test-strategy/content.md +136 -0
- package/modules/test-strategy/exercises.md +84 -0
- package/modules/test-strategy/game.yaml +99 -0
- package/modules/test-strategy/module.yaml +45 -0
- package/modules/test-strategy/quick-ref.md +66 -0
- package/modules/test-strategy/quiz.md +99 -0
- package/modules/test-strategy/resources.md +60 -0
- package/modules/test-strategy/walkthrough.md +97 -0
- package/modules/test-strategy/workshop.yaml +96 -0
- package/modules/typescript-fundamentals/content.md +127 -0
- package/modules/typescript-fundamentals/exercises.md +79 -0
- package/modules/typescript-fundamentals/game.yaml +111 -0
- package/modules/typescript-fundamentals/module.yaml +45 -0
- package/modules/typescript-fundamentals/quick-ref.md +55 -0
- package/modules/typescript-fundamentals/quiz.md +104 -0
- package/modules/typescript-fundamentals/resources.md +42 -0
- package/modules/typescript-fundamentals/walkthrough.md +71 -0
- package/modules/typescript-fundamentals/workshop.yaml +146 -0
- package/modules/user-story-mapping/content.md +123 -0
- package/modules/user-story-mapping/exercises.md +87 -0
- package/modules/user-story-mapping/module.yaml +41 -0
- package/modules/user-story-mapping/quick-ref.md +64 -0
- package/modules/user-story-mapping/quiz.md +73 -0
- package/modules/user-story-mapping/resources.md +29 -0
- package/modules/user-story-mapping/walkthrough.md +86 -0
- package/modules/writing-prds/content.md +133 -0
- package/modules/writing-prds/exercises.md +93 -0
- package/modules/writing-prds/game.yaml +83 -0
- package/modules/writing-prds/module.yaml +44 -0
- package/modules/writing-prds/quick-ref.md +77 -0
- package/modules/writing-prds/quiz.md +103 -0
- package/modules/writing-prds/resources.md +30 -0
- package/modules/writing-prds/walkthrough.md +87 -0
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
slug: stakeholder-communication
|
|
2
|
+
title: "Stakeholder Communication — Status Updates That Actually Help"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Write effective status updates, communicate delays, and manage stakeholder expectations with clarity and impact."
|
|
5
|
+
category: project-management
|
|
6
|
+
tags: [stakeholder-communication, status-updates, reporting, project-management, leadership]
|
|
7
|
+
difficulty: beginner
|
|
8
|
+
|
|
9
|
+
xp:
|
|
10
|
+
read: 10
|
|
11
|
+
walkthrough: 30
|
|
12
|
+
exercise: 20
|
|
13
|
+
quiz: 15
|
|
14
|
+
quiz-perfect-bonus: 10
|
|
15
|
+
|
|
16
|
+
time:
|
|
17
|
+
quick: 5
|
|
18
|
+
read: 15
|
|
19
|
+
guided: 40
|
|
20
|
+
|
|
21
|
+
prerequisites: []
|
|
22
|
+
related: [risk-management, sprint-planning, one-on-ones]
|
|
23
|
+
|
|
24
|
+
triggers:
|
|
25
|
+
- "How do I write a good status update?"
|
|
26
|
+
- "How do I communicate project delays?"
|
|
27
|
+
- "How do I manage stakeholder expectations?"
|
|
28
|
+
- "What should I include in a project status report?"
|
|
29
|
+
|
|
30
|
+
visuals:
|
|
31
|
+
diagrams: [diagram-flow, diagram-mermaid]
|
|
32
|
+
quiz-types: [quiz-drag-order, quiz-timed-choice]
|
|
33
|
+
slides: true
|
|
34
|
+
|
|
35
|
+
sources:
|
|
36
|
+
- url: "https://www.amazon.com/Crucial-Conversations-Tools-Talking-Staked/dp/1469266822"
|
|
37
|
+
label: "Crucial Conversations by Patterson et al."
|
|
38
|
+
type: book
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Stakeholder Communication Quick Reference
|
|
2
|
+
|
|
3
|
+
## Pyramid Principle
|
|
4
|
+
|
|
5
|
+
**Lead with the conclusion.** First line = takeaway. Then support.
|
|
6
|
+
|
|
7
|
+
## RAG Status
|
|
8
|
+
|
|
9
|
+
| G | Green — On track |
|
|
10
|
+
|---|-------------------|
|
|
11
|
+
| A | Amber — At risk; working on it |
|
|
12
|
+
| R | Red — Off track; needs intervention |
|
|
13
|
+
|
|
14
|
+
## Status Update Structure
|
|
15
|
+
|
|
16
|
+
1. **What happened** — Completed, shipped
|
|
17
|
+
2. **What's next** — Planned
|
|
18
|
+
3. **Blockers** — What's in the way
|
|
19
|
+
4. **Risks** — What might go wrong + mitigation
|
|
20
|
+
|
|
21
|
+
## Audience Quick Guide
|
|
22
|
+
|
|
23
|
+
| Audience | Want |
|
|
24
|
+
|----------|------|
|
|
25
|
+
| Executives | Outcomes, timeline, risks, decisions |
|
|
26
|
+
| Engineers | Blockers, dependencies, scope |
|
|
27
|
+
| Product | Priorities, trade-offs |
|
|
28
|
+
| Customers | When, what's new |
|
|
29
|
+
|
|
30
|
+
## Stakeholder Grid
|
|
31
|
+
|
|
32
|
+
| | Low Interest | High Interest |
|
|
33
|
+
|---|--------------|----------------|
|
|
34
|
+
| **High Power** | Keep satisfied | Manage closely |
|
|
35
|
+
| **Low Power** | Monitor | Keep informed |
|
|
36
|
+
|
|
37
|
+
## Bad News Template
|
|
38
|
+
|
|
39
|
+
1. State the fact
|
|
40
|
+
2. Explain cause
|
|
41
|
+
3. What you're doing
|
|
42
|
+
4. What you need
|
|
43
|
+
5. Next update when
|
|
44
|
+
|
|
45
|
+
## Status Template (Short)
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
RAG: [G/A/R] | TL;DR: [One sentence]
|
|
49
|
+
|
|
50
|
+
Completed: [Bullets]
|
|
51
|
+
Next: [Bullets]
|
|
52
|
+
Blockers: [Blocker + owner]
|
|
53
|
+
Risks: [Risk + mitigation]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Cadence Examples
|
|
57
|
+
|
|
58
|
+
| Who | Cadence | Format |
|
|
59
|
+
|-----|---------|--------|
|
|
60
|
+
| Core team | Daily | Standup, Slack |
|
|
61
|
+
| Leads | Weekly | Written + call |
|
|
62
|
+
| Execs | Bi-weekly | Written (pyramid) |
|
|
63
|
+
|
|
64
|
+
## Written vs Verbal
|
|
65
|
+
|
|
66
|
+
| Written | Verbal |
|
|
67
|
+
|---------|--------|
|
|
68
|
+
| Status, decisions, specs | Alignment, sensitive topics |
|
|
69
|
+
| Async, record | Real-time, Q&A |
|
|
70
|
+
|
|
71
|
+
## Mermaid: Stakeholder Grid
|
|
72
|
+
|
|
73
|
+
```mermaid
|
|
74
|
+
quadrantChart
|
|
75
|
+
x-axis Low Interest --> High Interest
|
|
76
|
+
y-axis Low Power --> High Power
|
|
77
|
+
quadrant-1 Manage closely
|
|
78
|
+
quadrant-2 Keep informed
|
|
79
|
+
quadrant-3 Monitor
|
|
80
|
+
quadrant-4 Keep satisfied
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Avoiding Overload
|
|
84
|
+
|
|
85
|
+
- 1 page max (exec)
|
|
86
|
+
- Bullets over paragraphs
|
|
87
|
+
- Link to details
|
|
88
|
+
- Consistent format
|
|
89
|
+
- RAG + key points first
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Stakeholder Communication — Quiz
|
|
2
|
+
|
|
3
|
+
## Question 1
|
|
4
|
+
|
|
5
|
+
The pyramid principle suggests you should:
|
|
6
|
+
|
|
7
|
+
A) Bury the conclusion at the end
|
|
8
|
+
B) Lead with the conclusion, then support it
|
|
9
|
+
C) Use only bullet points
|
|
10
|
+
D) Never mention risks
|
|
11
|
+
|
|
12
|
+
<!-- ANSWER: B -->
|
|
13
|
+
<!-- EXPLANATION: The pyramid principle means putting the most important point first. Busy stakeholders often skim; if they read only the first line, they should get the takeaway. Support with details below. -->
|
|
14
|
+
|
|
15
|
+
## Question 2
|
|
16
|
+
|
|
17
|
+
In RAG status, Amber typically means:
|
|
18
|
+
|
|
19
|
+
A) Everything is perfect
|
|
20
|
+
B) At risk; issues exist; we're working on them
|
|
21
|
+
C) Project is cancelled
|
|
22
|
+
D) No update this week
|
|
23
|
+
|
|
24
|
+
<!-- ANSWER: B -->
|
|
25
|
+
<!-- EXPLANATION: Amber = at risk. There are issues, but the team is addressing them. It needs attention but isn't yet Red (off track). Amber is common and appropriate when managing risks. -->
|
|
26
|
+
|
|
27
|
+
## Question 3
|
|
28
|
+
|
|
29
|
+
When communicating bad news (e.g., a delay), you should:
|
|
30
|
+
|
|
31
|
+
A) Wait until you have a full solution
|
|
32
|
+
B) Communicate early, state the fact, explain cause, share plan
|
|
33
|
+
C) Send it only to your manager
|
|
34
|
+
D) Use vague language to soften the blow
|
|
35
|
+
|
|
36
|
+
<!-- ANSWER: B -->
|
|
37
|
+
<!-- EXPLANATION: Bad news does not improve with age. Communicate early. Be clear: state the fact, explain why, say what you're doing, and what you need. Early communication creates more options and preserves trust. -->
|
|
38
|
+
|
|
39
|
+
## Question 4
|
|
40
|
+
|
|
41
|
+
In a power/interest stakeholder grid, a high-power, high-interest stakeholder should be:
|
|
42
|
+
|
|
43
|
+
A) Monitored only
|
|
44
|
+
B) Kept satisfied with minimal contact
|
|
45
|
+
C) Managed closely—regular, rich updates
|
|
46
|
+
D) Excluded from updates
|
|
47
|
+
|
|
48
|
+
<!-- ANSWER: C -->
|
|
49
|
+
<!-- EXPLANATION: High power + high interest = manage closely. They have influence and care. They need regular, substantive updates and involvement in decisions. Keep them informed and engaged. -->
|
|
50
|
+
|
|
51
|
+
## Question 5
|
|
52
|
+
|
|
53
|
+
An effective status update structure includes:
|
|
54
|
+
|
|
55
|
+
A) Only what was completed
|
|
56
|
+
B) What happened, what's next, blockers, risks
|
|
57
|
+
C) Jira ticket IDs and technical details only
|
|
58
|
+
D) A maximum of one sentence
|
|
59
|
+
|
|
60
|
+
<!-- ANSWER: B -->
|
|
61
|
+
<!-- EXPLANATION: A good status answers four questions: What happened? What's next? What are the blockers? What are the risks? This structure gives stakeholders a complete picture without overwhelming them. -->
|
|
62
|
+
|
|
63
|
+
## Question 6
|
|
64
|
+
|
|
65
|
+
To avoid information overload in status updates, you should:
|
|
66
|
+
|
|
67
|
+
A) Include every detail in the main email
|
|
68
|
+
B) Use one page max for exec summaries, bullets over paragraphs, link to details
|
|
69
|
+
C) Send daily 10-page reports
|
|
70
|
+
D) Never use written updates
|
|
71
|
+
|
|
72
|
+
<!-- ANSWER: B -->
|
|
73
|
+
<!-- EXPLANATION: Respect your reader's time. One page max for exec summaries. Prefer bullets over paragraphs. Link to detailed docs or tickets rather than inlining everything. Consistent format helps people scan quickly. -->
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Stakeholder Communication — Resources
|
|
2
|
+
|
|
3
|
+
## Books
|
|
4
|
+
|
|
5
|
+
- **Crucial Conversations: Tools for Talking When Stakes Are High** by Patterson, Grenny, McMillan, and Switzler — Masterclass on difficult conversations, including delivering bad news and managing expectations.
|
|
6
|
+
- **The Pyramid Principle** by Barbara Minto — The classic on structuring communication: lead with the conclusion.
|
|
7
|
+
- **Never Split the Difference** by Chris Voss — Negotiation and communication from an FBI negotiator; useful for high-stakes stakeholder conversations.
|
|
8
|
+
- **Thanks for the Feedback** by Douglas Stone and Sheila Heen — Receiving and giving feedback; applies to status and reviews.
|
|
9
|
+
|
|
10
|
+
## Articles and Readings
|
|
11
|
+
|
|
12
|
+
- [The Pyramid Principle in Practice](https://www.mckinsey.com/~/media/mckinsey/industries/public%20and%20social%20sector/our%20insights/the%20pyramid%20principle%20and%20the%20art%20of%20communicating%20on%20purpose/the-pyramid-principle-in-practice.pdf) — McKinsey. Applying the pyramid principle to business communication.
|
|
13
|
+
- [How to Write a Project Status Update](https://www.atlassian.com/blog/inside-atlassian/how-to-write-project-status-updates) — Atlassian. Templates and best practices.
|
|
14
|
+
- [RAG Status Reporting](https://www.apm.org.uk/resources/find-a-resource/earned-value-management-rag-status-reporting/) — APM. Red/Amber/Green in project management.
|
|
15
|
+
- [Stakeholder Analysis and Mapping](https://www.mindtools.com/pages/article/newPPM_08.htm) — Mind Tools. Power/interest grid and analysis.
|
|
16
|
+
- [Communicating Bad News to Stakeholders](https://www.pmi.org/learning/library/communicating-bad-news-stakeholders-7097) — PMI. Delivering difficult updates.
|
|
17
|
+
|
|
18
|
+
## Tools
|
|
19
|
+
|
|
20
|
+
- [Notion](https://www.notion.so/) — Status pages, project wikis, shared updates.
|
|
21
|
+
- [Confluence](https://www.atlassian.com/software/confluence) — Status reports, meeting notes, stakeholder pages.
|
|
22
|
+
- [Jira](https://www.atlassian.com/software/jira) — Status via dashboards, filters, and release reports.
|
|
23
|
+
- [Linear](https://linear.app/) — Cycle updates, project status.
|
|
24
|
+
- [Slack](https://slack.com/) — Async updates, channels per project or stakeholder group.
|
|
25
|
+
- [Loom](https://www.loom.com/) — Short video updates for async stakeholder communication.
|
|
26
|
+
|
|
27
|
+
## Templates
|
|
28
|
+
|
|
29
|
+
- [Project Status Report Template](https://www.smartsheet.com/content/project-status-report-templates) — Smartsheet. Free status report templates.
|
|
30
|
+
- [Stakeholder Map Template](https://miro.com/templates/stakeholder-map/) — Miro. Power/interest grid for collaboration.
|
|
31
|
+
- [RAG Status Dashboard](https://www.atlassian.com/software/jira/status) — Jira. Built-in RAG and status tracking.
|
|
32
|
+
|
|
33
|
+
## Podcasts
|
|
34
|
+
|
|
35
|
+
- [Manager Tools](https://www.manager-tools.com/) — Communication, feedback, and managing up.
|
|
36
|
+
- [The Look & Sound of Leadership](https://www.manager-tools.com/podcasts/look-sound-leadership) — Executive communication.
|
|
37
|
+
|
|
38
|
+
## Videos
|
|
39
|
+
|
|
40
|
+
- [Barbara Minto on the Pyramid Principle](https://www.youtube.com/results?search_query=pyramid+principle+barbara+minto) — Search for Minto's presentations.
|
|
41
|
+
- [Crucial Conversations Summary](https://www.youtube.com/results?search_query=crucial+conversations+summary) — Summaries of the book's key ideas.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Stakeholder Communication Walkthrough — Learn by Doing
|
|
2
|
+
|
|
3
|
+
## Before We Begin
|
|
4
|
+
|
|
5
|
+
**Diagnostic:** Who are you writing for? Think of one person who gets your project updates. What do they *need* from you—and what would they skip? How does your audience change the message?
|
|
6
|
+
|
|
7
|
+
**Checkpoint:** You can name at least two different audiences for the same project and one way your update would differ for each.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1: Draft a Status Update
|
|
12
|
+
|
|
13
|
+
**Task:** Pick a project (real or hypothetical). Write a 6–8 line status update using the structure: What happened, What's next, Blockers, Risks. Apply the pyramid principle—lead with the conclusion (RAG + one-sentence TL;DR).
|
|
14
|
+
|
|
15
|
+
**Question:** If your reader only saw the first line, would they get the right takeaway? What would they miss?
|
|
16
|
+
|
|
17
|
+
**Checkpoint:** Update has RAG, TL;DR, and all four sections. First line is the conclusion.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Step 2: Map Stakeholders
|
|
22
|
+
|
|
23
|
+
<!-- hint:buttons type="single" prompt="Who belongs in the 'manage closely' quadrant?" options="High power + high interest,High power + low interest,Low power + high interest,Low power + low interest" -->
|
|
24
|
+
<!-- hint:list style="cards" -->
|
|
25
|
+
|
|
26
|
+
**Task:** List 5 stakeholders for your project. Plot each on a power/interest grid. For the "manage closely" quadrant, write one sentence: what do they need from your updates?
|
|
27
|
+
|
|
28
|
+
**Question:** How would your update change if you were writing for the "manage closely" vs "keep informed" quadrant? What would you add or remove?
|
|
29
|
+
|
|
30
|
+
**Checkpoint:** 5 stakeholders plotted; "manage closely" needs are stated.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Step 3: Communicate a Delay
|
|
35
|
+
|
|
36
|
+
**Task:** Imagine your release is slipping by 1 week due to a third-party API delay. Write a 4–5 sentence message to an executive. Include: the fact, the cause, what you're doing, and what you need (if anything).
|
|
37
|
+
|
|
38
|
+
**Question:** What might you be tempted to soften or hide? Why is stating it clearly better?
|
|
39
|
+
|
|
40
|
+
**Checkpoint:** Message is direct, includes cause and plan, and has a clear ask or next step.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Step 4: Tailor for Two Audiences
|
|
45
|
+
|
|
46
|
+
**Task:** Take one status update. Create two versions: (1) For an executive—3–4 bullets, pyramid style. (2) For an engineering lead—more detail on technical blockers and dependencies.
|
|
47
|
+
|
|
48
|
+
**Question:** What's different? What would be wrong with sending the exec version to the eng lead, or vice versa?
|
|
49
|
+
|
|
50
|
+
**Checkpoint:** Both versions exist; exec version is shorter and outcome-focused; eng version has technical detail.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Step 5: Apply RAG Thoughtfully
|
|
55
|
+
|
|
56
|
+
<!-- hint:card type="tip" title="RAG status: Red = needs attention, Amber = watch, Green = on track" -->
|
|
57
|
+
|
|
58
|
+
**Task:** You have: (A) One minor bug in edge case. (B) Key developer out for a week. (C) Scope creep request from stakeholder. Assign RAG to each and justify. Write one sentence for each on how you'd communicate it.
|
|
59
|
+
|
|
60
|
+
**Question:** When is Amber more appropriate than Red? When might Green be misleading?
|
|
61
|
+
|
|
62
|
+
**Checkpoint:** RAG assigned with rationale; communication approach stated for each.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Step 6: Design a Cadence
|
|
67
|
+
|
|
68
|
+
<!-- hint:celebrate -->
|
|
69
|
+
|
|
70
|
+
**Task:** For your project, define update cadence for: core team, product/eng leads, and executives. Specify: frequency, format (written/call), and what each gets.
|
|
71
|
+
|
|
72
|
+
**Question:** What happens if executives get daily updates? What happens if they get monthly? Where's the right balance?
|
|
73
|
+
|
|
74
|
+
**Checkpoint:** Cadence defined for 3 levels; format and content appropriate to each.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# System Design — From Requirements to Architecture
|
|
2
|
+
|
|
3
|
+
## The System Design Interview Framework
|
|
4
|
+
|
|
5
|
+
A structured approach to designing scalable systems:
|
|
6
|
+
|
|
7
|
+
1. **Requirements** — Clarify functional (what) and non-functional (scale, latency, availability)
|
|
8
|
+
2. **Estimation** — Back-of-envelope (DAU, QPS, storage) to bound the problem
|
|
9
|
+
3. **High-level design** — Sketch boxes and arrows (API, services, data flow)
|
|
10
|
+
4. **Deep dive** — Choose 2–3 components to detail (DB schema, caching, bottlenecks)
|
|
11
|
+
5. **Bottlenecks** — Identify single points of failure, scale limits, mitigation
|
|
12
|
+
|
|
13
|
+
```mermaid
|
|
14
|
+
flowchart LR
|
|
15
|
+
A[Requirements] --> B[Estimation]
|
|
16
|
+
B --> C[High-Level Design]
|
|
17
|
+
C --> D[Deep Dive]
|
|
18
|
+
D --> E[Bottlenecks]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## CAP Theorem
|
|
22
|
+
|
|
23
|
+
In a distributed system, you can only guarantee **two of three**:
|
|
24
|
+
|
|
25
|
+
| Property | Meaning |
|
|
26
|
+
|----------|---------|
|
|
27
|
+
| **Consistency** | Every read returns the latest write |
|
|
28
|
+
| **Availability** | Every request receives a response |
|
|
29
|
+
| **Partition tolerance** | System works despite network failures |
|
|
30
|
+
|
|
31
|
+
In practice: network partitions happen. You choose **CP** (e.g., banking) or **AP** (e.g., social feeds).
|
|
32
|
+
|
|
33
|
+
## Architecture: Typical Web App
|
|
34
|
+
|
|
35
|
+
```mermaid
|
|
36
|
+
flowchart TB
|
|
37
|
+
subgraph Client
|
|
38
|
+
C[Client / Browser]
|
|
39
|
+
end
|
|
40
|
+
subgraph Edge
|
|
41
|
+
CDN[CDN / Static Assets]
|
|
42
|
+
end
|
|
43
|
+
subgraph App
|
|
44
|
+
LB[Load Balancer]
|
|
45
|
+
A1[App Server 1]
|
|
46
|
+
A2[App Server 2]
|
|
47
|
+
A3[App Server N]
|
|
48
|
+
end
|
|
49
|
+
subgraph Data
|
|
50
|
+
Cache[Cache Redis/Memcached]
|
|
51
|
+
DB[(Primary DB)]
|
|
52
|
+
Replica[(Replica)]
|
|
53
|
+
MQ[Message Queue]
|
|
54
|
+
end
|
|
55
|
+
C --> CDN
|
|
56
|
+
C --> LB
|
|
57
|
+
LB --> A1 & A2 & A3
|
|
58
|
+
A1 & A2 & A3 --> Cache
|
|
59
|
+
A1 & A2 & A3 --> DB
|
|
60
|
+
DB --> Replica
|
|
61
|
+
A1 & A2 & A3 --> MQ
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Load Balancing
|
|
65
|
+
|
|
66
|
+
Distribute traffic across servers: **Round-robin**, **least connections**, **consistent hashing** (for stateful affinity).
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Example: nginx upstream (round-robin)
|
|
70
|
+
upstream app_servers {
|
|
71
|
+
server 10.0.0.1:3000;
|
|
72
|
+
server 10.0.0.2:3000;
|
|
73
|
+
server 10.0.0.3:3000;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Caching Strategies
|
|
78
|
+
|
|
79
|
+
| Layer | Use Case | Example |
|
|
80
|
+
|-------|----------|---------|
|
|
81
|
+
| **CDN** | Static assets, edge caching | CloudFront, Cloudflare |
|
|
82
|
+
| **App cache** | Hot data, session | Redis, Memcached |
|
|
83
|
+
| **DB cache** | Query result cache | Redis, query cache |
|
|
84
|
+
|
|
85
|
+
**Cache-aside:** App checks cache first; on miss, fetches from DB and populates cache. **Write-through:** Write to DB and cache together.
|
|
86
|
+
|
|
87
|
+
## Database Choices
|
|
88
|
+
|
|
89
|
+
| Type | When to Use |
|
|
90
|
+
|------|-------------|
|
|
91
|
+
| **SQL** | ACID, relational, complex joins |
|
|
92
|
+
| **NoSQL (document)** | Flexible schema, high write throughput |
|
|
93
|
+
| **NoSQL (key-value)** | Simple lookups, session storage |
|
|
94
|
+
| **NoSQL (columnar)** | Analytics, time-series |
|
|
95
|
+
|
|
96
|
+
**Sharding:** Partition data by key (e.g., user_id) across DB instances. **Replication:** Read replicas for read scaling; primary for writes.
|
|
97
|
+
|
|
98
|
+
## Message Queues
|
|
99
|
+
|
|
100
|
+
Decouple producers and consumers: **RabbitMQ**, **Kafka**, **SQS**. Use for async processing, event sourcing, buffering spikes.
|
|
101
|
+
|
|
102
|
+
## Microservices vs Monolith
|
|
103
|
+
|
|
104
|
+
| Monolith | Microservices |
|
|
105
|
+
|----------|---------------|
|
|
106
|
+
| Single deployable unit | Independently deployable services |
|
|
107
|
+
| Simpler ops, shared DB | Per-service DB, network boundaries |
|
|
108
|
+
| Good for small teams | Scales org and team size |
|
|
109
|
+
|
|
110
|
+
Start with a monolith; extract services when boundaries are clear.
|
|
111
|
+
|
|
112
|
+
## Rate Limiting
|
|
113
|
+
|
|
114
|
+
Protect APIs: **token bucket**, **sliding window**, **fixed window**. Return `429 Too Many Requests` with `Retry-After` header.
|
|
115
|
+
|
|
116
|
+
## Consistent Hashing
|
|
117
|
+
|
|
118
|
+
Minimize rebalancing when nodes are added/removed. Keys map to a ring; each node owns a range. Used in CDN, caching, sharding.
|
|
119
|
+
|
|
120
|
+
## Microservices Layout
|
|
121
|
+
|
|
122
|
+
```mermaid
|
|
123
|
+
flowchart LR
|
|
124
|
+
subgraph Gateway
|
|
125
|
+
API[API Gateway]
|
|
126
|
+
end
|
|
127
|
+
subgraph Services
|
|
128
|
+
S1[Auth Service]
|
|
129
|
+
S2[User Service]
|
|
130
|
+
S3[Order Service]
|
|
131
|
+
S4[Payment Service]
|
|
132
|
+
end
|
|
133
|
+
subgraph Shared
|
|
134
|
+
MQ[Message Bus]
|
|
135
|
+
E[Event Store]
|
|
136
|
+
end
|
|
137
|
+
API --> S1 & S2 & S3 & S4
|
|
138
|
+
S2 & S3 & S4 --> MQ
|
|
139
|
+
MQ --> E
|
|
140
|
+
S1 -.-> S2
|
|
141
|
+
S3 --> S4
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Key Takeaways
|
|
145
|
+
|
|
146
|
+
- **Requirements first** — Don't over-engineer for scale you don't need
|
|
147
|
+
- **Bottlenecks** — Identify SPOFs and plan for failure
|
|
148
|
+
- **Cache wisely** — Invalidation is hard; design for it
|
|
149
|
+
- **Async where it helps** — Message queues for decoupling and buffering
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# System Design Exercises
|
|
2
|
+
|
|
3
|
+
## Exercise 1: Design a News Feed
|
|
4
|
+
|
|
5
|
+
**Task:** Design a news feed (e.g., Twitter-like) for 10M users. Document: (1) functional and non-functional requirements, (2) data model (users, posts, follows), (3) high-level architecture with cache and DB, (4) how you'd generate "feed for user X" (fan-out on write vs read).
|
|
6
|
+
|
|
7
|
+
**Validation:**
|
|
8
|
+
- [ ] Requirements are clear and bounded
|
|
9
|
+
- [ ] Data model supports follows and posts
|
|
10
|
+
- [ ] Architecture includes load balancer, app tier, cache, DB
|
|
11
|
+
- [ ] Tradeoffs between fan-out on write vs read are explained
|
|
12
|
+
|
|
13
|
+
**Hints:**
|
|
14
|
+
1. Fan-out on write: precompute feeds when a post is created; fast reads, slower writes
|
|
15
|
+
2. Fan-out on read: fetch from followed users at read time; simpler writes, heavier reads
|
|
16
|
+
3. Hybrid: fan-out for normal users, on-read for celebrities
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Exercise 2: Add Caching to an API
|
|
21
|
+
|
|
22
|
+
**Task:** You have a REST API: `GET /users/:id` returns user profile. Add a cache layer. Define: (1) cache key format, (2) TTL, (3) invalidation strategy when user updates profile, (4) what to do on cache miss.
|
|
23
|
+
|
|
24
|
+
**Validation:**
|
|
25
|
+
- [ ] Cache key is deterministic and unique per user
|
|
26
|
+
- [ ] TTL chosen with reasoning (e.g., 5 min vs 1 hour)
|
|
27
|
+
- [ ] Invalidation on write is specified (invalidate key, or write-through)
|
|
28
|
+
- [ ] Cache-aside flow on miss is correct
|
|
29
|
+
|
|
30
|
+
**Hints:**
|
|
31
|
+
1. Key: `user:{id}` or `user:profile:{id}`
|
|
32
|
+
2. Invalidation: delete key on PUT/PATCH, or use write-through
|
|
33
|
+
3. Cache stampede: consider locking or probabilistic early refresh
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Exercise 3: Shard a Database
|
|
38
|
+
|
|
39
|
+
**Task:** You have a `orders` table with 1B rows. Design a sharding strategy. Specify: (1) shard key, (2) number of shards, (3) how to route a query for "orders by user_id", (4) how to handle "orders by date range" (cross-shard query).
|
|
40
|
+
|
|
41
|
+
**Validation:**
|
|
42
|
+
- [ ] Shard key chosen (user_id typical for orders)
|
|
43
|
+
- [ ] Routing is deterministic (e.g., hash(user_id) % N)
|
|
44
|
+
- [ ] Cross-shard query strategy described (query each shard, merge; or use a separate analytics DB)
|
|
45
|
+
|
|
46
|
+
**Hints:**
|
|
47
|
+
1. user_id as shard key: all orders for a user on same shard
|
|
48
|
+
2. date range: either scatter-gather or maintain a read replica for analytics
|
|
49
|
+
3. Consistent hashing helps when adding/removing shards
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Exercise 4: Message Queue for Async Jobs
|
|
54
|
+
|
|
55
|
+
**Task:** Design a "send email" flow: user signs up → send welcome email. Use a message queue. Draw the flow: API → queue → worker. What happens if the worker fails mid-processing? How do you ensure at-least-once delivery?
|
|
56
|
+
|
|
57
|
+
**Validation:**
|
|
58
|
+
- [ ] Flow is API → enqueue → worker consumes
|
|
59
|
+
- [ ] Failure handling: retry, dead-letter queue
|
|
60
|
+
- [ ] At-least-once: acknowledge only after successful send; redeliver on timeout
|
|
61
|
+
- [ ] Idempotency considered (don't send duplicate emails)
|
|
62
|
+
|
|
63
|
+
**Hints:**
|
|
64
|
+
1. Worker acks after email sent; if crash before ack, message redelivered
|
|
65
|
+
2. Idempotency: store sent_email_ids or use idempotency key
|
|
66
|
+
3. Dead-letter queue for messages that fail repeatedly
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Exercise 5: Rate Limiting Design
|
|
71
|
+
|
|
72
|
+
**Task:** Implement a simple rate limiter: max 100 requests per minute per API key. Describe the data structure and algorithm. What would you use in Redis? Write pseudocode for "is request allowed?".
|
|
73
|
+
|
|
74
|
+
**Validation:**
|
|
75
|
+
- [ ] Algorithm chosen (fixed window, sliding window, or token bucket)
|
|
76
|
+
- [ ] Data structure supports per-key counters
|
|
77
|
+
- [ ] Redis INCR + EXPIRE or similar is correctly described
|
|
78
|
+
- [ ] Edge cases: what if the clock is at minute boundary?
|
|
79
|
+
|
|
80
|
+
**Hints:**
|
|
81
|
+
1. Fixed window: `KEY = "ratelimit:{api_key}:{minute}"`, INCR, EXPIRE 60
|
|
82
|
+
2. Sliding window: sorted set, remove expired, count, add current
|
|
83
|
+
3. Token bucket: more complex but smoother limiting
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
games:
|
|
2
|
+
- type: scenario
|
|
3
|
+
title: "Scale the System"
|
|
4
|
+
startHealth: 5
|
|
5
|
+
steps:
|
|
6
|
+
- id: start
|
|
7
|
+
situation: "You're designing a URL shortener (like bit.ly). It launches and goes viral — traffic spikes 100x in a week. You need a database to store short codes and long URLs. Which do you choose?"
|
|
8
|
+
choices:
|
|
9
|
+
- text: "PostgreSQL — ACID guarantees, easy schema, good for relational data."
|
|
10
|
+
consequence: "PostgreSQL is solid but can become a write bottleneck. For a shortener, you might need horizontal scaling soon."
|
|
11
|
+
health: 0
|
|
12
|
+
next: database
|
|
13
|
+
- text: "Redis — blazing fast, simple key-value. Short code → long URL fits perfectly."
|
|
14
|
+
consequence: "Redis is great for cache, but persisting to disk and handling durability is trickier. You'd typically use Redis for cache, not primary storage alone."
|
|
15
|
+
health: -1
|
|
16
|
+
next: database
|
|
17
|
+
- text: "PostgreSQL for durability + Redis for hot cache — best of both."
|
|
18
|
+
consequence: "Smart. Durable storage plus fast reads. You can scale reads with Redis and keep writes in PostgreSQL."
|
|
19
|
+
health: 1
|
|
20
|
+
next: database
|
|
21
|
+
- id: database
|
|
22
|
+
situation: "Traffic keeps growing. Redis cache expires, and suddenly 10,000 requests hit the database at once for the same popular link. Cache stampede! How do you handle it?"
|
|
23
|
+
choices:
|
|
24
|
+
- text: "Let them all hit the database — it can handle it."
|
|
25
|
+
consequence: "A stampede can overwhelm the DB. You need to prevent thundering herd."
|
|
26
|
+
health: -2
|
|
27
|
+
next: stampede
|
|
28
|
+
- text: "Use probabilistic early expiration — some requests extend TTL, others repopulate cache."
|
|
29
|
+
consequence: "Probabilistic early expiration (e.g. 'recompute before expire') spreads load. Good pattern."
|
|
30
|
+
health: 1
|
|
31
|
+
next: stampede
|
|
32
|
+
- text: "Implement request coalescing — only one request fetches; others wait for it."
|
|
33
|
+
consequence: "Request coalescing (or 'single-flight') ensures only one recompute. Others block and get the result. Also valid."
|
|
34
|
+
health: 1
|
|
35
|
+
next: stampede
|
|
36
|
+
- id: stampede
|
|
37
|
+
situation: "Cache stampede is under control. But global users complain about latency — requests from Asia take 200ms to reach your US datacenter. What next?"
|
|
38
|
+
choices:
|
|
39
|
+
- text: "Add more database replicas in the same region."
|
|
40
|
+
consequence: "Replicas help DB load but don't fix network latency. Users far from the server still wait."
|
|
41
|
+
health: -1
|
|
42
|
+
next: cdn
|
|
43
|
+
- text: "Put a CDN in front — cache short URLs at edge locations worldwide."
|
|
44
|
+
consequence: "CDN caches at the edge. Most requests never hit your origin. Latency drops dramatically."
|
|
45
|
+
health: 1
|
|
46
|
+
next: cdn
|
|
47
|
+
- text: "Move the entire system to a region closer to most users."
|
|
48
|
+
consequence: "Single-region migration is disruptive. CDN gives global edge without moving everything."
|
|
49
|
+
health: 0
|
|
50
|
+
next: cdn
|
|
51
|
+
- id: cdn
|
|
52
|
+
situation: "CDN is live. But one influencer posts a link — suddenly one short code gets 80% of all traffic. Hot key! The cache node for that key is overwhelmed. How do you deal with it?"
|
|
53
|
+
choices:
|
|
54
|
+
- text: "Shard the cache by short code — spread hot keys across nodes."
|
|
55
|
+
consequence: "Sharding by short code can still put a hot key on one node. Hot keys need different handling."
|
|
56
|
+
health: -1
|
|
57
|
+
next: hot_key
|
|
58
|
+
- text: "Replicate the hot key to multiple cache nodes, or use consistent hashing with virtual nodes."
|
|
59
|
+
consequence: "Replicating hot data or using more granular hashing spreads the load. Good approach."
|
|
60
|
+
health: 1
|
|
61
|
+
next: hot_key
|
|
62
|
+
- text: "Ignore it — CDN should absorb most of it."
|
|
63
|
+
consequence: "CDN helps, but if the key is so hot it overwhelms a single CDN node, you need a strategy."
|
|
64
|
+
health: -1
|
|
65
|
+
next: hot_key
|
|
66
|
+
- id: hot_key
|
|
67
|
+
situation: "Hot key is mitigated. Leadership says: prepare for 10x growth in 6 months. What do you prioritize?"
|
|
68
|
+
choices:
|
|
69
|
+
- text: "Rewrite everything in a faster language."
|
|
70
|
+
consequence: "Premature optimization. Architecture and bottlenecks matter more than language for most scale problems."
|
|
71
|
+
health: -2
|
|
72
|
+
next: growth
|
|
73
|
+
- text: "Add read replicas, consider write partitioning (e.g. by short code range), and capacity plan."
|
|
74
|
+
consequence: "Solid. Scale reads, plan for write partitioning if needed, and model capacity. Pragmatic."
|
|
75
|
+
health: 1
|
|
76
|
+
next: growth
|
|
77
|
+
- text: "Build a real-time analytics dashboard first."
|
|
78
|
+
consequence: "Analytics are nice but not critical for handling 10x. Core scalability comes first."
|
|
79
|
+
health: -1
|
|
80
|
+
next: growth
|
|
81
|
+
- id: growth
|
|
82
|
+
situation: "You've scaled the shortener: PostgreSQL + Redis cache, CDN, hot-key handling, and growth plan. A new requirement: track click analytics (timestamp, geo, device) for each short code. How do you add it?"
|
|
83
|
+
choices:
|
|
84
|
+
- text: "Add analytics columns to the main URLs table."
|
|
85
|
+
consequence: "Mixing transactional and analytical data slows both. High-volume analytics bloat the core table."
|
|
86
|
+
health: -2
|
|
87
|
+
next: end
|
|
88
|
+
- text: "Write analytics to a separate high-throughput store (e.g. Kafka + data lake, or append-only store)."
|
|
89
|
+
consequence: "Right. Separate the analytics pipeline from the core URL lookup. Event stream or append-only keeps the shortener fast."
|
|
90
|
+
health: 1
|
|
91
|
+
next: end
|
|
92
|
+
- text: "Store analytics in Redis and batch-flush to PostgreSQL."
|
|
93
|
+
consequence: "Redis can buffer, but analytics volume may overwhelm. A dedicated pipeline (Kafka, etc.) is more robust for high volume."
|
|
94
|
+
health: 0
|
|
95
|
+
next: end
|