@shaykec/bridge 0.4.24 → 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 +5 -3
- package/src/server.js +17 -7
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Sprint Planning Quick Reference
|
|
2
|
+
|
|
3
|
+
## The Two Parts
|
|
4
|
+
|
|
5
|
+
| Part | Focus | Who |
|
|
6
|
+
|------|-------|-----|
|
|
7
|
+
| **What** | Sprint goal, selected items | Product Owner + Team |
|
|
8
|
+
| **How** | Tasks, approach | Development Team |
|
|
9
|
+
|
|
10
|
+
## Sprint Goal Template
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Sprint [X]: [One-sentence outcome]
|
|
14
|
+
Success: [2–3 concrete outcomes]
|
|
15
|
+
Out of scope: [What we're NOT doing]
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Estimation Cheat Sheet
|
|
19
|
+
|
|
20
|
+
| Technique | When to Use |
|
|
21
|
+
|-----------|-------------|
|
|
22
|
+
| Story points | Backlog refinement, sprint planning |
|
|
23
|
+
| T-shirt sizing | Quick triage, non-technical stakeholders |
|
|
24
|
+
| Planning poker | New or complex stories, alignment needed |
|
|
25
|
+
|
|
26
|
+
**Fibonacci:** 1, 2, 3, 5, 8, 13, 21
|
|
27
|
+
|
|
28
|
+
## Velocity vs Capacity
|
|
29
|
+
|
|
30
|
+
| Term | Formula / Meaning |
|
|
31
|
+
|------|-------------------|
|
|
32
|
+
| Capacity | Team size × Days × Hours × (1 − overhead) |
|
|
33
|
+
| Velocity | Avg points completed (last 2–3 sprints) |
|
|
34
|
+
| Forecast | Pull ~80–90% of velocity |
|
|
35
|
+
|
|
36
|
+
## Definition of Ready (Example)
|
|
37
|
+
|
|
38
|
+
- [ ] Acceptance criteria defined
|
|
39
|
+
- [ ] Dependencies identified
|
|
40
|
+
- [ ] Sized by team
|
|
41
|
+
- [ ] Technically feasible
|
|
42
|
+
|
|
43
|
+
## Anti-Patterns to Avoid
|
|
44
|
+
|
|
45
|
+
| Anti-Pattern | Better Practice |
|
|
46
|
+
|--------------|-----------------|
|
|
47
|
+
| Over-commit (100%+) | 80–90% of velocity |
|
|
48
|
+
| No sprint goal | One outcome-focused goal |
|
|
49
|
+
| Estimate in hours | Story points (complexity) |
|
|
50
|
+
| Skip "how" | Break into tasks |
|
|
51
|
+
| Stakeholder dictates scope | Team decides |
|
|
52
|
+
|
|
53
|
+
## Remote Planning Tips
|
|
54
|
+
|
|
55
|
+
1. **Async prep** — Send items 24–48h ahead
|
|
56
|
+
2. **Shared boards** — Miro, FigJam, Jira, Linear
|
|
57
|
+
3. **Timebox** — 15-min chunks
|
|
58
|
+
4. **Document live** — Capture goal + decisions in shared doc
|
|
59
|
+
5. **Cameras on** — For goal agreement, voting
|
|
60
|
+
|
|
61
|
+
## Capacity Example
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
5 devs × 10 days × 6 hrs × 0.85 = 255 person-hours
|
|
65
|
+
Velocity: 45 pts → Forecast: 38–40 pts this sprint
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Mermaid: Sprint Planning Flow
|
|
69
|
+
|
|
70
|
+
```mermaid
|
|
71
|
+
flowchart LR
|
|
72
|
+
A[Product Owner: goal + items] --> B[Team: capacity]
|
|
73
|
+
B --> C[Select items]
|
|
74
|
+
C --> D[Break into tasks]
|
|
75
|
+
D --> E[Sprint backlog]
|
|
76
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Sprint Planning — Quiz
|
|
2
|
+
|
|
3
|
+
## Question 1
|
|
4
|
+
|
|
5
|
+
In Scrum, what are the two parts of sprint planning?
|
|
6
|
+
|
|
7
|
+
A) Estimate and commit
|
|
8
|
+
B) What and how
|
|
9
|
+
C) Scope and schedule
|
|
10
|
+
D) Backlog and capacity
|
|
11
|
+
|
|
12
|
+
<!-- ANSWER: B -->
|
|
13
|
+
<!-- EXPLANATION: The Scrum Guide defines sprint planning as having two parts: (1) What can we achieve?—the Product Owner presents the goal and proposed items; (2) How will we build it?—the Development Team plans tasks and approach. -->
|
|
14
|
+
|
|
15
|
+
## Question 2
|
|
16
|
+
|
|
17
|
+
What is the main purpose of a sprint goal?
|
|
18
|
+
|
|
19
|
+
A) To list all stories in the sprint
|
|
20
|
+
B) To create a single, cohesive objective that guides trade-offs
|
|
21
|
+
C) To satisfy stakeholders
|
|
22
|
+
D) To track velocity
|
|
23
|
+
|
|
24
|
+
<!-- ANSWER: B -->
|
|
25
|
+
<!-- EXPLANATION: The sprint goal is a unifying objective. When the team faces trade-offs mid-sprint, they ask: "Does this support the goal?" Instead of a list of features, it describes the outcome they're aiming for. -->
|
|
26
|
+
|
|
27
|
+
## Question 3
|
|
28
|
+
|
|
29
|
+
Velocity and capacity differ in that:
|
|
30
|
+
|
|
31
|
+
A) Velocity is in hours, capacity is in points
|
|
32
|
+
B) Velocity is historical throughput; capacity is planned available time
|
|
33
|
+
C) Velocity is set by the Product Owner; capacity by the Scrum Master
|
|
34
|
+
D) They are the same thing
|
|
35
|
+
|
|
36
|
+
<!-- ANSWER: B -->
|
|
37
|
+
<!-- EXPLANATION: Velocity = how many points the team typically completes (measured after the sprint). Capacity = how much person-time is available (planned before the sprint). Capacity helps you sanity-check; velocity helps you forecast. -->
|
|
38
|
+
|
|
39
|
+
## Question 4
|
|
40
|
+
|
|
41
|
+
Which estimation technique encourages discussion and surfaces assumptions?
|
|
42
|
+
|
|
43
|
+
A) T-shirt sizing
|
|
44
|
+
B) Hours
|
|
45
|
+
C) Planning poker
|
|
46
|
+
D) Random guessing
|
|
47
|
+
|
|
48
|
+
<!-- ANSWER: C -->
|
|
49
|
+
<!-- EXPLANATION: Planning poker involves private voting, reveal, and discussion of outliers. The conversation—"Why did you pick 8?"—surfaces hidden assumptions, dependencies, and knowledge gaps. The estimate is secondary to the alignment. -->
|
|
50
|
+
|
|
51
|
+
## Question 5
|
|
52
|
+
|
|
53
|
+
A common anti-pattern in sprint planning is:
|
|
54
|
+
|
|
55
|
+
A) Writing a clear sprint goal
|
|
56
|
+
B) Estimating in story points
|
|
57
|
+
C) Over-committing to 100%+ of velocity
|
|
58
|
+
D) Using a Definition of Ready
|
|
59
|
+
|
|
60
|
+
<!-- ANSWER: C -->
|
|
61
|
+
<!-- EXPLANATION: Over-commitment leaves no buffer for unknowns, interrupts, or discovery. Teams often load the sprint to 100% or more of past velocity, then spill work or cut quality. A healthier approach is 80–90% to leave slack. -->
|
|
62
|
+
|
|
63
|
+
## Question 6
|
|
64
|
+
|
|
65
|
+
In Scrum, the team commits to:
|
|
66
|
+
|
|
67
|
+
A) Delivering every story in the sprint backlog
|
|
68
|
+
B) The sprint goal
|
|
69
|
+
C) A fixed scope with no changes
|
|
70
|
+
D) Completing all tasks in the first week
|
|
71
|
+
|
|
72
|
+
<!-- ANSWER: B -->
|
|
73
|
+
<!-- EXPLANATION: The team commits to the sprint goal—the outcome they're aiming for. The product backlog items selected are a forecast, not a contract. Scope can be rebalanced as the team learns, as long as the goal remains valid. -->
|
|
74
|
+
|
|
75
|
+
## Question 7
|
|
76
|
+
|
|
77
|
+
<!-- VISUAL: quiz-drag-order -->
|
|
78
|
+
|
|
79
|
+
Put these Scrum sprint ceremonies in the order they occur within a sprint:
|
|
80
|
+
|
|
81
|
+
A) Sprint Review
|
|
82
|
+
B) Sprint Retrospective
|
|
83
|
+
C) Sprint Planning
|
|
84
|
+
D) Daily Scrum (each day)
|
|
85
|
+
|
|
86
|
+
<!-- ANSWER: C,D,A,B -->
|
|
87
|
+
<!-- EXPLANATION: Sprint starts with planning. Daily Scrum runs each day. At the end, Sprint Review (inspect the increment) and Sprint Retrospective (improve the process) close the sprint. -->
|
|
88
|
+
|
|
89
|
+
## Question 8
|
|
90
|
+
|
|
91
|
+
<!-- VISUAL: quiz-drag-order -->
|
|
92
|
+
|
|
93
|
+
Put these story refinement steps in the correct order:
|
|
94
|
+
|
|
95
|
+
A) Split or combine as needed
|
|
96
|
+
B) Ensure Definition of Ready is met
|
|
97
|
+
C) Clarify acceptance criteria
|
|
98
|
+
D) Estimate (planning poker or similar)
|
|
99
|
+
E) Discuss and ask questions
|
|
100
|
+
|
|
101
|
+
<!-- ANSWER: E,C,A,D,B -->
|
|
102
|
+
<!-- EXPLANATION: Refinement starts with discussion and questions to clarify. Define acceptance criteria, then split or combine stories. Estimate, and finally verify the Definition of Ready before adding to the sprint. -->
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Sprint Planning — Resources
|
|
2
|
+
|
|
3
|
+
## Official Guides
|
|
4
|
+
|
|
5
|
+
- [Scrum Guide](https://scrumguides.org) — The definitive Scrum framework. Free; covers sprint planning, roles, and events.
|
|
6
|
+
- [Scrum Guide — Sprint Planning](https://scrumguides.org/scrum-guide.html#sprint-planning) — Direct link to the sprint planning section.
|
|
7
|
+
|
|
8
|
+
## Articles and Readings
|
|
9
|
+
|
|
10
|
+
- [Sprint Planning](https://www.mountaingoatsoftware.com/agile/scrum/meetings/sprint-planning-meeting) — Mountain Goat Software. Practical guide to running the ceremony.
|
|
11
|
+
- [Velocity vs Capacity in Agile](https://www.mountaingoatsoftware.com/blog/velocity-vs-capacity) — Mike Cohn. Clarifies the difference and when to use each.
|
|
12
|
+
- [Story Points: Why They Work](https://www.mountaingoatsoftware.com/blog/story-points-why-they-work) — Mike Cohn. The case for relative estimation.
|
|
13
|
+
- [Planning Poker](https://www.mountaingoatsoftware.com/agile/planning-poker) — Mountain Goat Software. How to run planning poker effectively.
|
|
14
|
+
- [Definition of Ready](https://www.scrum.org/resources/blog/definition-ready-empiricism) — Scrum.org. Why DoR matters and how to define it.
|
|
15
|
+
- [Sprint Goal — Why It Matters](https://www.scrum.org/resources/blog/sprint-goal) — Scrum.org. The power of a single, cohesive goal.
|
|
16
|
+
|
|
17
|
+
## Books
|
|
18
|
+
|
|
19
|
+
- **Scrum: The Art of Doing Twice the Work in Half the Time** by Jeff Sutherland — Origins of Scrum, including sprint planning.
|
|
20
|
+
- **Agile Estimating and Planning** by Mike Cohn — Deep dive on story points, velocity, and planning. The canonical reference.
|
|
21
|
+
- **Succeeding with Agile** by Mike Cohn — Broader agile adoption, including planning best practices.
|
|
22
|
+
|
|
23
|
+
## Podcasts
|
|
24
|
+
|
|
25
|
+
- [Agile for Humans](https://ryanripley.com/agile-for-humans/) — Ryan Ripley. Episodes on sprint planning, estimation, and Scrum.
|
|
26
|
+
- [Scrum Master Toolbox](https://www.scrummastertoolbox.com/) — Daily tips and stories from practicing Scrum Masters.
|
|
27
|
+
|
|
28
|
+
## Tools
|
|
29
|
+
|
|
30
|
+
- [Jira](https://www.atlassian.com/software/jira) — Sprint planning, backlog, velocity charts.
|
|
31
|
+
- [Linear](https://linear.app/) — Modern issue tracking with cycles (sprints) and capacity.
|
|
32
|
+
- [Notion](https://www.notion.so/) — Flexible boards for backlog and sprint planning.
|
|
33
|
+
- [Planning Poker Online](https://www.planningpoker.com/) — Free planning poker for distributed teams.
|
|
34
|
+
- [Miro](https://miro.com/) — Virtual whiteboards for remote sprint planning.
|
|
35
|
+
|
|
36
|
+
## Videos
|
|
37
|
+
|
|
38
|
+
- [Sprint Planning in Under 10 Minutes](https://www.youtube.com/results?search_query=sprint+planning+scrum) — Search for "sprint planning scrum" for short explainers.
|
|
39
|
+
- [Mountain Goat Software — Agile Videos](https://www.mountaingoatsoftware.com/agile-videos) — Mike Cohn's video library on estimation and planning.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Sprint Planning Walkthrough — Learn by Doing
|
|
2
|
+
|
|
3
|
+
## Before We Begin
|
|
4
|
+
|
|
5
|
+
**Diagnostic:** What is a sprint, and why plan one? In one sentence: what should a team have at the end of sprint planning that they didn't have at the start?
|
|
6
|
+
|
|
7
|
+
**Checkpoint:** You can distinguish "a list of work" from "a committed plan with a shared goal"—and explain why the latter matters.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1: Draft a Sprint Goal
|
|
12
|
+
|
|
13
|
+
**Task:** Pick a product area (e.g., "password reset," "search," "notifications"). Write a one-sentence sprint goal that describes the *outcome* the team is aiming for, not the list of features.
|
|
14
|
+
|
|
15
|
+
**Question:** If someone asked "Why does this matter?" could you answer in terms of user or business value? Or are you describing output (features) instead of outcome?
|
|
16
|
+
|
|
17
|
+
**Checkpoint:** The goal is outcome-focused and could guide trade-off decisions mid-sprint.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Step 2: Estimate Three Stories
|
|
22
|
+
|
|
23
|
+
<!-- hint:buttons type="single" prompt="Which estimation technique helps teams discuss complexity together?" options="Story points,T-shirt sizes,Hours,No estimate" -->
|
|
24
|
+
|
|
25
|
+
**Task:** Take three backlog items (real or hypothetical): "Add email validation to signup form," "Refactor payment module for testability," "Design and implement dark mode toggle." Estimate each using story points (1, 2, 3, 5, 8). Write one sentence justifying your estimate for each.
|
|
26
|
+
|
|
27
|
+
**Question:** What makes one story "bigger" than another? Is it effort, uncertainty, or both? How might two teammates disagree—and what would that discussion surface?
|
|
28
|
+
|
|
29
|
+
**Checkpoint:** Estimates are relative (the 5 is bigger than the 2) and justified.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Step 3: Calculate Capacity and Forecast
|
|
34
|
+
|
|
35
|
+
**Task:** For a 5-person team, 2-week sprint, with 20% of time in meetings: calculate capacity in person-hours. If last sprint's velocity was 38 points, how many points would you forecast for this sprint? What if 2 people have 2 days of PTO each?
|
|
36
|
+
|
|
37
|
+
**Question:** Why might you pull *fewer* points than your velocity even when no one is out? What buffers do you want?
|
|
38
|
+
|
|
39
|
+
**Checkpoint:** Capacity math is correct; forecast is justified and conservative.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Step 4: Apply Definition of Ready
|
|
44
|
+
|
|
45
|
+
<!-- hint:list style="checklist" -->
|
|
46
|
+
|
|
47
|
+
**Task:** Write a Definition of Ready (3–5 criteria) for your team. Then take one backlog item and score it: does it meet each criterion? If not, what's missing?
|
|
48
|
+
|
|
49
|
+
**Question:** What happens to sprint planning when half the items aren't ready? Who owns getting items ready—Product Owner, team, or shared?
|
|
50
|
+
|
|
51
|
+
**Checkpoint:** DoR criteria are testable; at least one gap is identified for the sample item.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Step 5: Spot Anti-Patterns
|
|
56
|
+
|
|
57
|
+
<!-- hint:card type="warning" title="Sprint Planning Anti-Patterns" -->
|
|
58
|
+
|
|
59
|
+
**Task:** Read this scenario: "The stakeholder asked the team to add 5 more stories to 'fill the sprint.' The team added them. Sprint goal: 'Complete all backlog items.'" List 2–3 anti-patterns. Rewrite the sprint goal to be outcome-focused.
|
|
60
|
+
|
|
61
|
+
**Question:** Why do teams often accept pressure to over-commit? What would you say to the stakeholder to protect the team's ownership of the sprint?
|
|
62
|
+
|
|
63
|
+
**Checkpoint:** Anti-patterns are named; the goal is rewritten to focus on outcome.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Step 6: Plan a Remote Sprint Planning Agenda
|
|
68
|
+
|
|
69
|
+
<!-- hint:celebrate -->
|
|
70
|
+
|
|
71
|
+
**Task:** Design a 2-hour remote sprint planning agenda. Include: async prep, Part 1 (what), Part 2 (how), timeboxes, and how decisions will be captured.
|
|
72
|
+
|
|
73
|
+
**Question:** What typically goes wrong in remote planning? How does your agenda address those risks?
|
|
74
|
+
|
|
75
|
+
**Checkpoint:** Agenda has clear sections, timeboxes, and an outcome (sprint goal + backlog) documented.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# SQL — Queries, Joins, and Data Modeling Essentials
|
|
2
|
+
|
|
3
|
+
## SELECT Basics
|
|
4
|
+
|
|
5
|
+
Fetch data with `SELECT`, `FROM`, and optionally `WHERE`:
|
|
6
|
+
|
|
7
|
+
```sql
|
|
8
|
+
SELECT * FROM users;
|
|
9
|
+
SELECT id, name, email FROM users WHERE status = 'active';
|
|
10
|
+
SELECT DISTINCT country FROM users;
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## WHERE Clauses
|
|
14
|
+
|
|
15
|
+
Filter rows with conditions:
|
|
16
|
+
|
|
17
|
+
```sql
|
|
18
|
+
SELECT * FROM orders WHERE amount > 100;
|
|
19
|
+
SELECT * FROM users WHERE created_at >= '2024-01-01' AND status = 'active';
|
|
20
|
+
SELECT * FROM products WHERE name LIKE 'Widget%'; -- starts with Widget
|
|
21
|
+
SELECT * FROM users WHERE email IN ('a@x.com', 'b@x.com');
|
|
22
|
+
SELECT * FROM users WHERE phone IS NOT NULL;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## JOINs
|
|
26
|
+
|
|
27
|
+
Combine rows from two or more tables based on a related column.
|
|
28
|
+
|
|
29
|
+
### INNER JOIN
|
|
30
|
+
|
|
31
|
+
Only rows with matches in **both** tables:
|
|
32
|
+
|
|
33
|
+
```sql
|
|
34
|
+
SELECT orders.id, orders.amount, users.name
|
|
35
|
+
FROM orders
|
|
36
|
+
INNER JOIN users ON orders.user_id = users.id;
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### LEFT JOIN
|
|
40
|
+
|
|
41
|
+
All rows from left table; matching rows from right (NULL if no match):
|
|
42
|
+
|
|
43
|
+
```sql
|
|
44
|
+
SELECT users.name, orders.id
|
|
45
|
+
FROM users
|
|
46
|
+
LEFT JOIN orders ON users.id = orders.user_id;
|
|
47
|
+
-- Users with no orders still appear; orders columns are NULL
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### RIGHT JOIN
|
|
51
|
+
|
|
52
|
+
All rows from right table; matching from left. (Less common; often rephrased as LEFT JOIN.)
|
|
53
|
+
|
|
54
|
+
### FULL OUTER JOIN
|
|
55
|
+
|
|
56
|
+
All rows from both tables; NULL where no match.
|
|
57
|
+
|
|
58
|
+
## JOIN Quick Reference
|
|
59
|
+
|
|
60
|
+
| Join Type | Left Table | Right Table |
|
|
61
|
+
|-----------|------------|-------------|
|
|
62
|
+
| INNER | Only matches | Only matches |
|
|
63
|
+
| LEFT | All | Matches only |
|
|
64
|
+
| RIGHT | Matches only | All |
|
|
65
|
+
| FULL | All | All |
|
|
66
|
+
|
|
67
|
+
## GROUP BY and Aggregation
|
|
68
|
+
|
|
69
|
+
Aggregate rows by a column:
|
|
70
|
+
|
|
71
|
+
```sql
|
|
72
|
+
SELECT status, COUNT(*) as count FROM orders GROUP BY status;
|
|
73
|
+
SELECT user_id, SUM(amount) as total FROM orders GROUP BY user_id;
|
|
74
|
+
SELECT category, AVG(price) as avg_price FROM products GROUP BY category;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**HAVING** filters after aggregation:
|
|
78
|
+
|
|
79
|
+
```sql
|
|
80
|
+
SELECT user_id, SUM(amount) as total
|
|
81
|
+
FROM orders
|
|
82
|
+
GROUP BY user_id
|
|
83
|
+
HAVING SUM(amount) > 1000;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## ORDER BY
|
|
87
|
+
|
|
88
|
+
Sort results:
|
|
89
|
+
|
|
90
|
+
```sql
|
|
91
|
+
SELECT * FROM products ORDER BY price DESC;
|
|
92
|
+
SELECT * FROM users ORDER BY name ASC, created_at DESC;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Subqueries
|
|
96
|
+
|
|
97
|
+
Use a query inside another:
|
|
98
|
+
|
|
99
|
+
```sql
|
|
100
|
+
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
|
|
101
|
+
SELECT name, (SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) as order_count
|
|
102
|
+
FROM users;
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Indexes
|
|
106
|
+
|
|
107
|
+
Speed up lookups. Create on columns used in WHERE, JOIN, ORDER BY:
|
|
108
|
+
|
|
109
|
+
```sql
|
|
110
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
111
|
+
CREATE INDEX idx_orders_user_id ON orders(user_id);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Normalization
|
|
115
|
+
|
|
116
|
+
Reduce redundancy and update anomalies.
|
|
117
|
+
|
|
118
|
+
**1NF:** Atomic values; no repeating groups. Each cell has one value.
|
|
119
|
+
|
|
120
|
+
**2NF:** 1NF + no partial dependencies. All non-key attributes depend on the whole primary key.
|
|
121
|
+
|
|
122
|
+
**3NF:** 2NF + no transitive dependencies. Non-key attributes don't depend on other non-key attributes.
|
|
123
|
+
|
|
124
|
+
## ER Diagram Example
|
|
125
|
+
|
|
126
|
+
```mermaid
|
|
127
|
+
erDiagram
|
|
128
|
+
users ||--o{ orders : places
|
|
129
|
+
products ||--o{ order_items : "ordered in"
|
|
130
|
+
orders ||--o{ order_items : contains
|
|
131
|
+
users {
|
|
132
|
+
int id PK
|
|
133
|
+
string name
|
|
134
|
+
string email
|
|
135
|
+
}
|
|
136
|
+
orders {
|
|
137
|
+
int id PK
|
|
138
|
+
int user_id FK
|
|
139
|
+
date created_at
|
|
140
|
+
}
|
|
141
|
+
products {
|
|
142
|
+
int id PK
|
|
143
|
+
string name
|
|
144
|
+
decimal price
|
|
145
|
+
}
|
|
146
|
+
order_items {
|
|
147
|
+
int order_id FK
|
|
148
|
+
int product_id FK
|
|
149
|
+
int quantity
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Common Patterns
|
|
154
|
+
|
|
155
|
+
| Need | SQL |
|
|
156
|
+
|------|-----|
|
|
157
|
+
| Pagination | `LIMIT 10 OFFSET 20` |
|
|
158
|
+
| Unique values | `DISTINCT` or `GROUP BY` |
|
|
159
|
+
| Top N per group | Window functions or subquery |
|
|
160
|
+
| Exists check | `EXISTS (SELECT 1 FROM ...)` |
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# SQL Exercises
|
|
2
|
+
|
|
3
|
+
## Exercise 1: Basic Queries
|
|
4
|
+
|
|
5
|
+
**Task:** Given `products` (id, name, price, category), write queries to:
|
|
6
|
+
1. Get all products in category 'Electronics'
|
|
7
|
+
2. Get product names and prices, sorted by price descending
|
|
8
|
+
3. Get the count of products per category
|
|
9
|
+
|
|
10
|
+
**Validation:**
|
|
11
|
+
- [ ] WHERE filters correctly
|
|
12
|
+
- [ ] ORDER BY produces correct sort
|
|
13
|
+
- [ ] GROUP BY with COUNT gives per-category counts
|
|
14
|
+
|
|
15
|
+
**Hints:**
|
|
16
|
+
1. SELECT name, price FROM products WHERE category = 'Electronics'
|
|
17
|
+
2. ORDER BY price DESC
|
|
18
|
+
3. SELECT category, COUNT(*) FROM products GROUP BY category
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Exercise 2: INNER vs LEFT JOIN
|
|
23
|
+
|
|
24
|
+
**Task:** Tables: `customers` (id, name), `orders` (id, customer_id, total). Write:
|
|
25
|
+
1. INNER JOIN: orders with customer names (exclude orders with invalid customer_id)
|
|
26
|
+
2. LEFT JOIN from orders to customers: all orders with customer name, or NULL if customer missing
|
|
27
|
+
|
|
28
|
+
**Validation:**
|
|
29
|
+
- [ ] INNER returns only orders with valid customer
|
|
30
|
+
- [ ] LEFT returns all orders; NULL for orphaned orders
|
|
31
|
+
- [ ] Correct ON condition (orders.customer_id = customers.id)
|
|
32
|
+
|
|
33
|
+
**Hints:**
|
|
34
|
+
1. JOIN customers ON orders.customer_id = customers.id
|
|
35
|
+
2. LEFT JOIN keeps all rows from left (orders)
|
|
36
|
+
3. Test with an order whose customer_id doesn't exist
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Exercise 3: Aggregation and HAVING
|
|
41
|
+
|
|
42
|
+
**Task:** From `orders` (id, customer_id, total, status), find:
|
|
43
|
+
1. Total sales per customer
|
|
44
|
+
2. Customers with total sales > 1000
|
|
45
|
+
3. Count of orders per status
|
|
46
|
+
|
|
47
|
+
**Validation:**
|
|
48
|
+
- [ ] SUM(total) grouped by customer_id
|
|
49
|
+
- [ ] HAVING SUM(total) > 1000
|
|
50
|
+
- [ ] GROUP BY status with COUNT
|
|
51
|
+
|
|
52
|
+
**Hints:**
|
|
53
|
+
1. GROUP BY customer_id, SUM(total)
|
|
54
|
+
2. HAVING goes after GROUP BY
|
|
55
|
+
3. GROUP BY status
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Exercise 4: Subquery
|
|
60
|
+
|
|
61
|
+
**Task:** Find all products (id, name, price) that have been ordered (table `order_items`: order_id, product_id, quantity). Use a subquery with IN or EXISTS.
|
|
62
|
+
|
|
63
|
+
**Validation:**
|
|
64
|
+
- [ ] Only products that appear in order_items
|
|
65
|
+
- [ ] Subquery correctly correlates or filters
|
|
66
|
+
- [ ] No duplicate products (DISTINCT if using IN)
|
|
67
|
+
|
|
68
|
+
**Hints:**
|
|
69
|
+
1. SELECT * FROM products WHERE id IN (SELECT DISTINCT product_id FROM order_items)
|
|
70
|
+
2. Or: WHERE EXISTS (SELECT 1 FROM order_items WHERE order_items.product_id = products.id)
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Exercise 5: Normalization
|
|
75
|
+
|
|
76
|
+
**Task:** This table has redundancy: `sales` (id, product_name, product_price, category, quantity, sale_date). Split into `products` and `sales` to satisfy 2NF. Define the new tables and relationship.
|
|
77
|
+
|
|
78
|
+
**Validation:**
|
|
79
|
+
- [ ] products: id, name, price, category
|
|
80
|
+
- [ ] sales: id, product_id (FK), quantity, sale_date
|
|
81
|
+
- [ ] No repeated product info in sales
|
|
82
|
+
- [ ] Can join to get product details for a sale
|
|
83
|
+
|
|
84
|
+
**Hints:**
|
|
85
|
+
1. products holds product_name, product_price, category once
|
|
86
|
+
2. sales references product_id
|
|
87
|
+
3. JOIN sales ON products.id = sales.product_id for full info
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
games:
|
|
2
|
+
- type: command-sprint
|
|
3
|
+
title: "SQL Query Sprint"
|
|
4
|
+
challenges:
|
|
5
|
+
- prompt: "Get all users from the users table."
|
|
6
|
+
answer: "SELECT * FROM users;"
|
|
7
|
+
alternates: ["SELECT * FROM users", "select * from users;"]
|
|
8
|
+
timeLimit: 15
|
|
9
|
+
- prompt: "Get all users older than 25. Table has columns id, name, age."
|
|
10
|
+
answer: "SELECT * FROM users WHERE age > 25;"
|
|
11
|
+
alternates: ["SELECT * FROM users WHERE age>25", "select * from users where age > 25;"]
|
|
12
|
+
timeLimit: 18
|
|
13
|
+
- prompt: "Get users with names starting with 'J'. Use the LIKE operator."
|
|
14
|
+
answer: "SELECT * FROM users WHERE name LIKE 'J%';"
|
|
15
|
+
alternates: ["SELECT * FROM users WHERE name LIKE 'J%'", "select * from users where name like 'J%';"]
|
|
16
|
+
timeLimit: 20
|
|
17
|
+
- prompt: "Get the count of users in the users table."
|
|
18
|
+
answer: "SELECT COUNT(*) FROM users;"
|
|
19
|
+
alternates: ["SELECT COUNT(*) FROM users", "select count(*) from users;"]
|
|
20
|
+
timeLimit: 18
|
|
21
|
+
- prompt: "Get users ordered by name alphabetically (A to Z)."
|
|
22
|
+
answer: "SELECT * FROM users ORDER BY name ASC;"
|
|
23
|
+
alternates: ["SELECT * FROM users ORDER BY name", "select * from users order by name asc;"]
|
|
24
|
+
timeLimit: 20
|
|
25
|
+
- prompt: "Get user names and their order totals. Join users (id, name) with orders (user_id, total)."
|
|
26
|
+
answer: "SELECT users.name, orders.total FROM users INNER JOIN orders ON users.id = orders.user_id;"
|
|
27
|
+
alternates: ["SELECT users.name, orders.total FROM users JOIN orders ON users.id = orders.user_id"]
|
|
28
|
+
timeLimit: 22
|
|
29
|
+
- prompt: "Get all users and their order count. Include users with zero orders. Table orders has user_id."
|
|
30
|
+
answer: "SELECT users.name, COUNT(orders.id) FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id, users.name;"
|
|
31
|
+
alternates: ["SELECT users.name, COUNT(orders.id) FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id, users.name"]
|
|
32
|
+
timeLimit: 25
|
|
33
|
+
- prompt: "Get department names and the average salary per department. Table employees has dept_id, salary; departments has id, name."
|
|
34
|
+
answer: "SELECT departments.name, AVG(employees.salary) FROM departments INNER JOIN employees ON departments.id = employees.dept_id GROUP BY departments.id, departments.name;"
|
|
35
|
+
alternates: ["SELECT d.name, AVG(e.salary) FROM departments d INNER JOIN employees e ON d.id = e.dept_id GROUP BY d.id, d.name"]
|
|
36
|
+
timeLimit: 25
|
|
37
|
+
- prompt: "Get departments with more than 5 employees. Join departments and employees on dept_id."
|
|
38
|
+
answer: "SELECT departments.name FROM departments INNER JOIN employees ON departments.id = employees.dept_id GROUP BY departments.id, departments.name HAVING COUNT(*) > 5;"
|
|
39
|
+
alternates: ["SELECT d.name FROM departments d INNER JOIN employees e ON d.id = e.dept_id GROUP BY d.id, d.name HAVING COUNT(*) > 5"]
|
|
40
|
+
timeLimit: 25
|
|
41
|
+
- prompt: "Get products with price above the average product price. Use a subquery."
|
|
42
|
+
answer: "SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);"
|
|
43
|
+
alternates: ["SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)"]
|
|
44
|
+
timeLimit: 22
|
|
45
|
+
|
|
46
|
+
- type: bug-hunt
|
|
47
|
+
title: "Query Bug Finder"
|
|
48
|
+
snippets:
|
|
49
|
+
- code: |
|
|
50
|
+
SELECT department, name, COUNT(*)
|
|
51
|
+
FROM employees
|
|
52
|
+
GROUP BY department;
|
|
53
|
+
bugLine: 1
|
|
54
|
+
explanation: "The column 'name' is in SELECT but not in GROUP BY. Every non-aggregated column in SELECT must appear in the GROUP BY clause."
|
|
55
|
+
hint: "Every non-aggregate column in SELECT must appear in GROUP BY."
|
|
56
|
+
- code: |
|
|
57
|
+
SELECT users.name, orders.total
|
|
58
|
+
FROM users
|
|
59
|
+
LEFT JOIN orders ON users.id = orders.user_id
|
|
60
|
+
WHERE orders.total > 100;
|
|
61
|
+
bugLine: 4
|
|
62
|
+
explanation: "Using WHERE orders.total > 100 with a LEFT JOIN filters out users with no orders (NULL), turning it into an effective INNER JOIN. Use a subquery or move the filter to preserve LEFT JOIN semantics."
|
|
63
|
+
hint: "LEFT JOIN + WHERE on the right table excludes NULL rows. What happens to users with no orders?"
|
|
64
|
+
- code: |
|
|
65
|
+
SELECT * FROM users
|
|
66
|
+
WHERE age = 25
|
|
67
|
+
ODER BY name;
|
|
68
|
+
bugLine: 3
|
|
69
|
+
explanation: "Typo: ODER should be ORDER. The SQL keyword for sorting is ORDER BY."
|
|
70
|
+
hint: "Check the spelling of the sort keyword."
|
|
71
|
+
- code: |
|
|
72
|
+
SELECT category, SUM(price) AS total
|
|
73
|
+
FROM products
|
|
74
|
+
GROUP BY category
|
|
75
|
+
WHERE total > 1000;
|
|
76
|
+
bugLine: 4
|
|
77
|
+
explanation: "WHERE cannot reference aggregate aliases or aggregates. Use HAVING for aggregate conditions: HAVING SUM(price) > 1000."
|
|
78
|
+
hint: "WHERE runs before grouping. Aggregate conditions need HAVING."
|
|
79
|
+
- code: |
|
|
80
|
+
SELECT name, email
|
|
81
|
+
FROM users
|
|
82
|
+
JOIN orders ON id = orders.user_id;
|
|
83
|
+
bugLine: 3
|
|
84
|
+
explanation: "Ambiguous column: 'id' could refer to users.id or orders.id. Qualify with the table name: users.id."
|
|
85
|
+
hint: "When two tables have a column with the same name, you must specify which table."
|
|
86
|
+
- code: |
|
|
87
|
+
UPDATE users
|
|
88
|
+
SET status = 'inactive';
|
|
89
|
+
bugLine: 2
|
|
90
|
+
explanation: "Missing WHERE clause. This updates every row in the table. Always add a WHERE clause to limit which rows are updated."
|
|
91
|
+
hint: "An UPDATE without WHERE affects every row. Always verify the filter."
|
|
92
|
+
- code: |
|
|
93
|
+
SELECT name, MAX(salary)
|
|
94
|
+
FROM employees
|
|
95
|
+
GROUP BY department;
|
|
96
|
+
bugLine: 1
|
|
97
|
+
explanation: "SELECT includes 'name' which is not in GROUP BY. Either add name to GROUP BY or use an aggregate/subquery for name."
|
|
98
|
+
hint: "Non-aggregated columns in SELECT must appear in GROUP BY."
|
|
99
|
+
- code: |
|
|
100
|
+
SELECT users.name
|
|
101
|
+
FROM users
|
|
102
|
+
INNER JOIN orders ON id = orders.user_id;
|
|
103
|
+
bugLine: 3
|
|
104
|
+
explanation: "Ambiguous column reference: 'id' could mean users.id or orders.id. Qualify it as users.id."
|
|
105
|
+
hint: "Which table does 'id' belong to? Both might have it."
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
slug: sql-fundamentals
|
|
2
|
+
title: "SQL — Queries, Joins, and Data Modeling Essentials"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Master SQL queries, joins, aggregation, and database normalization."
|
|
5
|
+
category: data
|
|
6
|
+
tags: [sql, databases, queries, joins, data-modeling]
|
|
7
|
+
difficulty: beginner
|
|
8
|
+
|
|
9
|
+
xp:
|
|
10
|
+
read: 10
|
|
11
|
+
walkthrough: 30
|
|
12
|
+
exercise: 20
|
|
13
|
+
quiz: 15
|
|
14
|
+
quiz-perfect-bonus: 10
|
|
15
|
+
game: 20
|
|
16
|
+
game-perfect-bonus: 10
|
|
17
|
+
|
|
18
|
+
time:
|
|
19
|
+
quick: 5
|
|
20
|
+
read: 15
|
|
21
|
+
guided: 45
|
|
22
|
+
|
|
23
|
+
prerequisites: []
|
|
24
|
+
related: [system-design]
|
|
25
|
+
|
|
26
|
+
triggers:
|
|
27
|
+
- "How do SQL joins work?"
|
|
28
|
+
- "How do I write a SQL query?"
|
|
29
|
+
- "What's the difference between INNER and LEFT join?"
|
|
30
|
+
- "How do I design a database schema?"
|
|
31
|
+
|
|
32
|
+
visuals:
|
|
33
|
+
diagrams: [diagram-mermaid]
|
|
34
|
+
quiz-types: [quiz-drag-order, quiz-fill-blank]
|
|
35
|
+
game-types: [command-sprint, bug-hunt]
|
|
36
|
+
playground: bash
|
|
37
|
+
web-embeds: true
|
|
38
|
+
|
|
39
|
+
sources:
|
|
40
|
+
- url: "https://www.postgresql.org/docs/"
|
|
41
|
+
label: "PostgreSQL Docs"
|
|
42
|
+
type: docs
|
|
43
|
+
- url: "https://sqlbolt.com"
|
|
44
|
+
label: "SQLBolt"
|
|
45
|
+
type: docs
|