@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,61 @@
|
|
|
1
|
+
# Team Topologies — Quick Reference
|
|
2
|
+
|
|
3
|
+
## Conway's Law
|
|
4
|
+
|
|
5
|
+
**Organizations design systems that mirror their communication structure.** Change structure to change architecture.
|
|
6
|
+
|
|
7
|
+
## Four Team Types
|
|
8
|
+
|
|
9
|
+
| Type | Purpose |
|
|
10
|
+
|------|---------|
|
|
11
|
+
| **Stream-aligned** | Own full value stream; build, run, evolve. Default. |
|
|
12
|
+
| **Platform** | Provide internal services, APIs, tooling for stream-aligned teams |
|
|
13
|
+
| **Enabling** | Help teams learn; temporary; step back when done |
|
|
14
|
+
| **Complicated-subsystem** | Own specialized domain (ML, crypto, compliance) |
|
|
15
|
+
|
|
16
|
+
## Three Interaction Modes
|
|
17
|
+
|
|
18
|
+
| Mode | When | What |
|
|
19
|
+
|------|------|------|
|
|
20
|
+
| **Collaboration** | Discovery, high ambiguity | Side-by-side; shared goals |
|
|
21
|
+
| **X-as-a-Service** | Stable interface (default) | Clear API, SLA; low touch |
|
|
22
|
+
| **Facilitating** | Learning, adoption | Teach; stream-aligned learns; step back |
|
|
23
|
+
|
|
24
|
+
## Cognitive Load
|
|
25
|
+
|
|
26
|
+
- **Intrinsic** — domain complexity (unavoidable)
|
|
27
|
+
- **Extraneous** — tooling, process, ambiguity (minimize)
|
|
28
|
+
- **Germane** — productive learning (maximize)
|
|
29
|
+
|
|
30
|
+
**Design to reduce extraneous load.** Split teams or add platform when load is too high.
|
|
31
|
+
|
|
32
|
+
## Team Size
|
|
33
|
+
|
|
34
|
+
- **Two-pizza rule** — 5–9 people
|
|
35
|
+
- **Dunbar** — effective working teams ~7±2
|
|
36
|
+
- **Split when** — cognitive load too high, decision wait times grow, natural sub-domains emerge
|
|
37
|
+
|
|
38
|
+
## Team API
|
|
39
|
+
|
|
40
|
+
Platform teams need clear contracts:
|
|
41
|
+
- Documentation (what we offer, how to use)
|
|
42
|
+
- SLA (uptime, latency, support)
|
|
43
|
+
- Versioning (how we evolve)
|
|
44
|
+
- Support path (who to ask, how to escalate)
|
|
45
|
+
|
|
46
|
+
## Pitfalls
|
|
47
|
+
|
|
48
|
+
| Avoid | Do Instead |
|
|
49
|
+
|-------|------------|
|
|
50
|
+
| Too much collaboration | Default to X-as-a-Service |
|
|
51
|
+
| Platform does project work | Platform provides capabilities; streams build features |
|
|
52
|
+
| Enabling never steps back | Exit criteria; handoff; step back |
|
|
53
|
+
| Ignoring cognitive load | Split or add platform; simplify |
|
|
54
|
+
| Reorg without behavior change | Change incentives, APIs, communication |
|
|
55
|
+
|
|
56
|
+
## Evolution
|
|
57
|
+
|
|
58
|
+
- **Early** — Few streams; maybe one platform person
|
|
59
|
+
- **Growth** — Add platform when streams duplicate work
|
|
60
|
+
- **Scale** — Enabling teams for big transitions
|
|
61
|
+
- **Mature** — Complicated-subsystem when domain needs dedicated expertise
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Team Topologies — Quiz
|
|
2
|
+
|
|
3
|
+
## Question 1
|
|
4
|
+
|
|
5
|
+
What does Conway's Law state?
|
|
6
|
+
|
|
7
|
+
A) Systems should be designed before teams are formed
|
|
8
|
+
B) Organizations design systems that mirror their communication structure
|
|
9
|
+
C) Team size should match system complexity
|
|
10
|
+
D) Platform teams should own all infrastructure
|
|
11
|
+
|
|
12
|
+
<!-- ANSWER: B -->
|
|
13
|
+
<!-- EXPLANATION: Conway's Law (1967) observes that organizations design systems that mirror their communication structure. If you have three teams, you get a three-part system. The implication: change team structure to change architecture. -->
|
|
14
|
+
|
|
15
|
+
## Question 2
|
|
16
|
+
|
|
17
|
+
Which team type is the default—the one that owns the core value flow?
|
|
18
|
+
|
|
19
|
+
A) Platform team
|
|
20
|
+
B) Enabling team
|
|
21
|
+
C) Stream-aligned team
|
|
22
|
+
D) Complicated-subsystem team
|
|
23
|
+
|
|
24
|
+
<!-- ANSWER: C -->
|
|
25
|
+
<!-- EXPLANATION: Stream-aligned teams own a full stream of value (e.g., checkout, search). They build, run, and evolve it. Platform, enabling, and complicated-subsystem teams exist to support stream-aligned teams. -->
|
|
26
|
+
|
|
27
|
+
## Question 3
|
|
28
|
+
|
|
29
|
+
When should two teams use the "Collaboration" interaction mode?
|
|
30
|
+
|
|
31
|
+
A) Always—teams should always collaborate closely
|
|
32
|
+
B) When the interface is stable and well-defined
|
|
33
|
+
C) During discovery, new domains, or high ambiguity
|
|
34
|
+
D) When one team is teaching the other
|
|
35
|
+
|
|
36
|
+
<!-- ANSWER: C -->
|
|
37
|
+
<!-- EXPLANATION: Collaboration is for discovery, new domains, and high ambiguity—when teams need to work side-by-side with shared goals. For stable interfaces, use X-as-a-Service. For teaching, use Facilitating. Collaboration is expensive; use it sparingly. -->
|
|
38
|
+
|
|
39
|
+
## Question 4
|
|
40
|
+
|
|
41
|
+
What is the primary constraint that team topology design should optimize for?
|
|
42
|
+
|
|
43
|
+
A) Team size
|
|
44
|
+
B) Budget
|
|
45
|
+
C) Cognitive load
|
|
46
|
+
D) Geographic distribution
|
|
47
|
+
|
|
48
|
+
<!-- ANSWER: C -->
|
|
49
|
+
<!-- EXPLANATION: Cognitive load is the key constraint. Teams can only hold so much in their heads. Design to minimize extraneous load, manage intrinsic load, and maximize germane (productive) learning. Splitting teams or adding platform can reduce load. -->
|
|
50
|
+
|
|
51
|
+
## Question 5
|
|
52
|
+
|
|
53
|
+
What is the "Inverse Conway Maneuver" pitfall?
|
|
54
|
+
|
|
55
|
+
A) Reorganizing teams to match desired architecture without changing communication and incentives
|
|
56
|
+
B) Creating too many stream-aligned teams
|
|
57
|
+
C) Making platform teams too large
|
|
58
|
+
D) Using X-as-a-Service when collaboration is needed
|
|
59
|
+
|
|
60
|
+
<!-- ANSWER: A -->
|
|
61
|
+
<!-- EXPLANATION: The Inverse Conway Maneuver is the attempt to reorganize teams to "match" a desired architecture. The pitfall: changing the org chart without changing behavior, incentives, and communication. Structure and behavior must align. -->
|
|
62
|
+
|
|
63
|
+
## Question 6
|
|
64
|
+
|
|
65
|
+
When should an enabling team step back?
|
|
66
|
+
|
|
67
|
+
A) Never—enabling teams are permanent
|
|
68
|
+
B) When the stream-aligned team has learned and can self-serve
|
|
69
|
+
C) When the platform team is ready
|
|
70
|
+
D) After one quarter
|
|
71
|
+
|
|
72
|
+
<!-- ANSWER: B -->
|
|
73
|
+
<!-- EXPLANATION: Enabling teams are temporary. They help stream-aligned teams learn new skills or adopt new tech. Once the stream-aligned team can self-serve, the enabling team steps back. They have an exit criteria; they don't become permanent. -->
|
|
74
|
+
|
|
75
|
+
## Question 7
|
|
76
|
+
|
|
77
|
+
<!-- VISUAL: quiz-matching -->
|
|
78
|
+
|
|
79
|
+
Match each team type to its description:
|
|
80
|
+
|
|
81
|
+
A) Stream-aligned → 1) Owns a full value stream; builds, runs, evolves it
|
|
82
|
+
B) Platform → 2) Provides internal services and tools for other teams
|
|
83
|
+
C) Enabling → 3) Helps other teams learn; temporary, has exit criteria
|
|
84
|
+
D) Complicated-subsystem → 4) Owns a complex subsystem requiring specialized skills
|
|
85
|
+
|
|
86
|
+
<!-- ANSWER: A1,B2,C3,D4 -->
|
|
87
|
+
<!-- EXPLANATION: Stream-aligned owns the value flow. Platform provides shared capabilities. Enabling teaches and steps back. Complicated-subsystem owns specialized domain expertise. -->
|
|
88
|
+
|
|
89
|
+
## Question 8
|
|
90
|
+
|
|
91
|
+
<!-- VISUAL: quiz-matching -->
|
|
92
|
+
|
|
93
|
+
Match each interaction mode to its definition:
|
|
94
|
+
|
|
95
|
+
A) Collaboration → 1) Teams work side-by-side; shared goals; discovery phase
|
|
96
|
+
B) X-as-a-Service → 2) Consumer uses provider's offerings; well-defined interface
|
|
97
|
+
C) Facilitating → 3) Provider helps consumer achieve outcome; teaching/coaching
|
|
98
|
+
D) Stream-aligned → 4) Not an interaction mode; a team type
|
|
99
|
+
|
|
100
|
+
<!-- ANSWER: A1,B2,C3,D4 -->
|
|
101
|
+
<!-- EXPLANATION: Collaboration = work together in discovery. X-as-a-Service = consume defined offerings. Facilitating = provider helps consumer learn. Stream-aligned is a team type, not an interaction mode. -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Team Topologies — Resources
|
|
2
|
+
|
|
3
|
+
## Books
|
|
4
|
+
|
|
5
|
+
- **Team Topologies** by Matthew Skelton and Manuel Pais — Primary source; four team types, three interaction modes, cognitive load. [teamtopologies.com](https://teamtopologies.com)
|
|
6
|
+
- **An Elegant Puzzle** by Will Larson — Engineering org design; team sizing, platform teams.
|
|
7
|
+
- **The Manager's Path** by Camille Fournier — Management in tech; org structure implications.
|
|
8
|
+
- **Accelerate** by Forsgren, Humble, Kim — DevOps, team structure, delivery performance.
|
|
9
|
+
|
|
10
|
+
## Articles
|
|
11
|
+
|
|
12
|
+
- [Conway's Law — Original Paper (1968)](https://www.melconway.com/Home/Committees_Paper.html) — Melvin Conway's original formulation.
|
|
13
|
+
- [Team Topologies — Official Site](https://teamtopologies.com) — Excerpts, diagrams, resources.
|
|
14
|
+
- [Will Larson — An Elegant Puzzle (excerpts)](https://lethain.com/) — Team design, org evolution.
|
|
15
|
+
- [Martin Fowler — Conway's Law](https://martinfowler.com/bliki/ConwaysLaw.html) — Summary and implications.
|
|
16
|
+
- [Spotify Model (and its evolution)](https://engineering.atspotify.com/) — Squad/tribe structure; lessons learned.
|
|
17
|
+
|
|
18
|
+
## Videos
|
|
19
|
+
|
|
20
|
+
- [LeadDev — Team Topologies Talk](https://leaddev.com/) — Matthew Skelton on team design.
|
|
21
|
+
- [InfoQ — Skelton & Pais on Team Topologies](https://www.infoq.com/presentations/team-topologies/) — Conference talk.
|
|
22
|
+
- [QCon — Building Platform Teams](https://qconlondon.com/) — Platform team design.
|
|
23
|
+
- [StaffEng — Organization Design](https://staffeng.com/) — Staff+ perspectives on org structure.
|
|
24
|
+
|
|
25
|
+
## Podcasts
|
|
26
|
+
|
|
27
|
+
- [Engineering Culture by InfoQ](https://www.infoq.com/podcasts/engineering-culture/) — Org design, team structure.
|
|
28
|
+
- [LeadDev podcast](https://leaddev.com/podcast) — Leadership, team topologies.
|
|
29
|
+
- [Software Engineering Daily](https://softwareengineeringdaily.com/) — Episodes on Conway's Law, platform teams.
|
|
30
|
+
- [Lenny's Podcast](https://www.lennyspodcast.com/) — Product and eng org design.
|
|
31
|
+
|
|
32
|
+
## Tools
|
|
33
|
+
|
|
34
|
+
- [Team Topologies — Mapping Template](https://teamtopologies.com/workbook) — Workbook for mapping teams.
|
|
35
|
+
- [Miro](https://miro.com/) — Diagramming team topologies.
|
|
36
|
+
- [Lucidchart](https://www.lucidchart.com/) — Org and architecture diagrams.
|
|
37
|
+
- [Excalidraw](https://excalidraw.com/) — Hand-drawn style diagrams for team mapping.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Team Topologies — Walkthrough
|
|
2
|
+
|
|
3
|
+
## Before We Begin
|
|
4
|
+
|
|
5
|
+
**Diagnostic:** Conway's Law says organizations design systems that mirror their communication structure. In practice: if you have 3 siloed teams, what kind of architecture do you usually get? Why is that—and what would need to change to get something different?
|
|
6
|
+
|
|
7
|
+
**Checkpoint:** You can explain the link between org structure and system design, and why "reorg to match architecture" often fails without behavior change.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1: Map Your Org to Team Types
|
|
12
|
+
|
|
13
|
+
<!-- hint:diagram mermaid-type="classDiagram" topic="Team types: stream-aligned, platform, enabling, complicated-subsystem" -->
|
|
14
|
+
|
|
15
|
+
**Task:** List the teams in your organization (or a subset). For each, classify: stream-aligned, platform, enabling, or complicated-subsystem. If it doesn't fit, note the gap. Are there teams that *should* exist but don't?
|
|
16
|
+
|
|
17
|
+
**Question:** Where are the mismatches? What would need to change for the structure to better support flow?
|
|
18
|
+
|
|
19
|
+
**Checkpoint:** Every current team is classified; at least one gap or mismatch identified.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Step 2: Identify Interaction Modes
|
|
24
|
+
|
|
25
|
+
<!-- hint:buttons type="single" prompt="When should two teams use X-as-a-Service instead of collaboration?" options="When discovering a new domain,When the consumer needs ongoing support,When the provider has a stable API,When both teams are learning" -->
|
|
26
|
+
|
|
27
|
+
**Task:** Pick 2–3 pairs of teams that work together. For each pair, identify the current interaction mode (collaboration, X-as-a-Service, facilitating). Is it the *right* mode for the context? If not, what would better support flow?
|
|
28
|
+
|
|
29
|
+
**Question:** Are you overusing collaboration (everyone needs to talk to everyone)? Or underusing it where discovery is needed?
|
|
30
|
+
|
|
31
|
+
**Checkpoint:** Interaction modes mapped; at least one recommendation for change.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 3: Assess Cognitive Load
|
|
36
|
+
|
|
37
|
+
**Task:** Pick one stream-aligned team you know well. Estimate their cognitive load across intrinsic (domain complexity), extraneous (tooling, process, ambiguity), and germane (learning) dimensions. What's one change that would reduce extraneous load?
|
|
38
|
+
|
|
39
|
+
**Question:** What happens when cognitive load is too high? What are the warning signs?
|
|
40
|
+
|
|
41
|
+
**Checkpoint:** Load assessed; one concrete reduction identified.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Step 4: Define a Team API
|
|
46
|
+
|
|
47
|
+
<!-- hint:list style="cards" -->
|
|
48
|
+
<!-- hint:card type="concept" title="A team API is what the team provides, how to use it, and what to expect—documented for consumers" -->
|
|
49
|
+
|
|
50
|
+
**Task:** If you have (or imagine) a platform team, define its "team API": what it provides, how consumers use it, SLA expectations, and support model. Write it as a one-pager a stream-aligned team could read.
|
|
51
|
+
|
|
52
|
+
**Question:** What makes a team API useful vs. ignored? How do you keep it current?
|
|
53
|
+
|
|
54
|
+
**Checkpoint:** Team API documented; consumable by a stream-aligned team.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Step 5: Plan an Evolution
|
|
59
|
+
|
|
60
|
+
**Task:** Your org is growing. Today: 2 stream-aligned teams, no platform. In 6 months you'll have 5 stream-aligned teams. Draft a team topology evolution: when do you add a platform team? When might you need enabling? What triggers the change?
|
|
61
|
+
|
|
62
|
+
**Question:** What's the cost of adding structure too early? Too late?
|
|
63
|
+
|
|
64
|
+
**Checkpoint:** Evolution plan with triggers and team additions.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Step 6: Avoid Inverse Conway Pitfalls
|
|
69
|
+
|
|
70
|
+
<!-- hint:celebrate -->
|
|
71
|
+
|
|
72
|
+
**Task:** Identify one place where your org (or a past org) reorganized to "match" architecture but didn't change behavior. What stayed the same? What would have been needed (incentives, APIs, culture) to make the reorg stick?
|
|
73
|
+
|
|
74
|
+
**Question:** Why do we often get the org chart right but the behavior wrong?
|
|
75
|
+
|
|
76
|
+
**Checkpoint:** One example of reorg-without-behavior-change; lessons for next time.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Technical Debt — Identifying, Measuring, and Paying It Down
|
|
2
|
+
|
|
3
|
+
<!-- hint:slides topic="Technical debt: Fowler's quadrant, principal vs interest, identification signals, measurement, and paydown strategies" slides="5" -->
|
|
4
|
+
|
|
5
|
+
## What Technical Debt Is (and Isn't)
|
|
6
|
+
|
|
7
|
+
**Technical debt** is the implied cost of rework caused by choosing a quicker or easier solution now instead of a better one that would take longer. Like financial debt: you get something now, you pay interest (extra effort) later.
|
|
8
|
+
|
|
9
|
+
It isn't:
|
|
10
|
+
- **Bugs** — bugs are defects; debt is structural
|
|
11
|
+
- **Missing features** — that's scope, not debt
|
|
12
|
+
- **"Bad code"** without a decision — debt implies a choice (even if unconscious)
|
|
13
|
+
|
|
14
|
+
## The Debt Metaphor
|
|
15
|
+
|
|
16
|
+
| Term | Meaning |
|
|
17
|
+
|------|---------|
|
|
18
|
+
| **Principal** | The work to fix the suboptimal design |
|
|
19
|
+
| **Interest** | Extra cost of every change that touches the debt (slower dev, more bugs) |
|
|
20
|
+
|
|
21
|
+
Low-touch code may have low interest; high-touch code has high interest. Pay down high-interest debt first.
|
|
22
|
+
|
|
23
|
+
## Fowler's Technical Debt Quadrant
|
|
24
|
+
|
|
25
|
+
Not all debt is equal. Martin Fowler divides it by **deliberate vs inadvertent** and **prudent vs reckless**:
|
|
26
|
+
|
|
27
|
+
```mermaid
|
|
28
|
+
flowchart LR
|
|
29
|
+
subgraph Reckless["Reckless"]
|
|
30
|
+
A1["Inadvertent: We didn't know better"]
|
|
31
|
+
A2["Deliberate: We knew but cut corners"]
|
|
32
|
+
end
|
|
33
|
+
subgraph Prudent["Prudent"]
|
|
34
|
+
B1["Inadvertent: We learned; design should change"]
|
|
35
|
+
B2["Deliberate: Thoughtful tradeoff — plan to pay"]
|
|
36
|
+
end
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
| | Reckless | Prudent |
|
|
40
|
+
|--|----------|---------|
|
|
41
|
+
| **Deliberate** | "We know we're cutting corners" — often a mistake; interest compounds | "We ship now, plan to fix" — acceptable if you actually pay it |
|
|
42
|
+
| **Inadvertent** | "We didn't know better" — inexperience, learning | "We learned; design should change" — inevitable, even for good teams |
|
|
43
|
+
|
|
44
|
+
**Prudent-deliberate** is the only "good" debt: you choose it knowingly and plan paydown. The rest range from unavoidable (prudent-inadvertent) to harmful (reckless-deliberate).
|
|
45
|
+
|
|
46
|
+
## Identifying Technical Debt
|
|
47
|
+
|
|
48
|
+
### Code Smells
|
|
49
|
+
- Long methods, deep nesting
|
|
50
|
+
- Duplication (DRY violations)
|
|
51
|
+
- Shotgun surgery (one change touches many files)
|
|
52
|
+
- Feature envy, God classes
|
|
53
|
+
- Comments that explain bad names instead of fixing them
|
|
54
|
+
|
|
55
|
+
### Velocity Trends
|
|
56
|
+
- Story points per sprint dropping
|
|
57
|
+
- Same-size features taking longer
|
|
58
|
+
- More bugs per release
|
|
59
|
+
|
|
60
|
+
### Bug Clusters
|
|
61
|
+
- Same module keeps failing — often a sign of structural debt
|
|
62
|
+
|
|
63
|
+
## Measuring It
|
|
64
|
+
|
|
65
|
+
| Metric | What It Tells You |
|
|
66
|
+
|--------|-------------------|
|
|
67
|
+
| Cyclomatic complexity | Per-function complexity; high = hard to test |
|
|
68
|
+
| Test coverage | Gaps indicate risky areas |
|
|
69
|
+
| Lead time / cycle time | How long from idea to ship |
|
|
70
|
+
| Bug rate by module | Where debt causes the most pain |
|
|
71
|
+
| Churn (files changed often) | High churn + high complexity = high interest |
|
|
72
|
+
|
|
73
|
+
## Prioritizing Paydown
|
|
74
|
+
|
|
75
|
+
1. **Interest rate** — How much does this slow us down? Fix high-touch debt first.
|
|
76
|
+
2. **Principal size** — Can we pay it in one sprint or does it need a plan?
|
|
77
|
+
3. **Risk** — Does it cause outages or security issues?
|
|
78
|
+
4. **Strategic fit** — Are we about to change this area anyway?
|
|
79
|
+
|
|
80
|
+
## Communicating to Stakeholders
|
|
81
|
+
|
|
82
|
+
- **Speak in outcomes** — "This slows feature X by 2 days per release" not "our code is messy"
|
|
83
|
+
- **Quantify when possible** — "We spend 20% of sprint on workarounds"
|
|
84
|
+
- **Offer options** — "We can pay 1 sprint now or absorb 3x cost over 6 months"
|
|
85
|
+
- **Tie to business goals** — "Fixing this unblocks the Q3 roadmap"
|
|
86
|
+
|
|
87
|
+
## Strategies for Paydown
|
|
88
|
+
|
|
89
|
+
### Boy Scout Rule
|
|
90
|
+
Leave code better than you found it. Small, incremental improvement.
|
|
91
|
+
|
|
92
|
+
### Dedicated Sprints
|
|
93
|
+
Allocate a portion of capacity (e.g., 20%) to debt paydown. Protects against infinite postponement.
|
|
94
|
+
|
|
95
|
+
### Strangler Fig
|
|
96
|
+
Replace a legacy system gradually by routing new behavior to new code and migrating callers over time. Avoids big-bang rewrites.
|
|
97
|
+
|
|
98
|
+
### When to Refactor vs Rewrite
|
|
99
|
+
- **Refactor** when the design is salvageable — extract, rename, split. Cheaper, lower risk.
|
|
100
|
+
- **Rewrite** when the design is fundamentally wrong, or the system is small enough that rewrite is faster than untangling. Rare; usually refactor.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Key Takeaways
|
|
105
|
+
|
|
106
|
+
1. Debt = principal (fix cost) + interest (ongoing cost)
|
|
107
|
+
2. Quadrant: prudent-deliberate is acceptable; reckless-deliberate is toxic
|
|
108
|
+
3. Identify via smells, velocity, bug clusters
|
|
109
|
+
4. Measure and prioritize by interest and risk
|
|
110
|
+
5. Communicate in business terms; offer clear options
|
|
111
|
+
6. Prefer incremental paydown (boy scout, strangler fig) over rewrites
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Technical Debt Exercises
|
|
2
|
+
|
|
3
|
+
## Exercise 1: Principal vs Interest
|
|
4
|
+
|
|
5
|
+
**Task:** A payment service has 2000 lines in one file. Every bug fix or feature touches it. Fixing it properly would take 2 sprints. Each change currently takes 2x longer due to complexity.
|
|
6
|
+
|
|
7
|
+
Estimate: (a) Principal (sprint-equivalent), (b) Interest per quarter (assuming 8 changes/quarter), (c) Break-even: after how many quarters does interest exceed principal?
|
|
8
|
+
|
|
9
|
+
**Validation:**
|
|
10
|
+
- [ ] Principal = 2 sprints
|
|
11
|
+
- [ ] Interest = 8 changes × some multiplier (e.g., 1 extra day each = 8 days)
|
|
12
|
+
- [ ] Break-even calculation is coherent
|
|
13
|
+
|
|
14
|
+
**Hints:**
|
|
15
|
+
1. Principal = one-time cost to fix
|
|
16
|
+
2. Interest = extra cost per touch × number of touches
|
|
17
|
+
3. When does cumulative interest > principal?
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Exercise 2: Quadrant Classification
|
|
22
|
+
|
|
23
|
+
**Task:** Classify each into Fowler's quadrant (prudent/reckless × deliberate/inadvertent):
|
|
24
|
+
|
|
25
|
+
1. Team uses `any` everywhere in TypeScript to ship fast; never revisits
|
|
26
|
+
2. Team picks a framework they've never used; architecture turns out wrong
|
|
27
|
+
3. Team defers a DB migration to next quarter with a written ticket
|
|
28
|
+
4. Copy-paste from Stack Overflow without understanding; causes bugs later
|
|
29
|
+
|
|
30
|
+
**Validation:**
|
|
31
|
+
- [ ] (1) Reckless deliberate
|
|
32
|
+
- [ ] (2) Prudent or reckless inadvertent
|
|
33
|
+
- [ ] (3) Prudent deliberate
|
|
34
|
+
- [ ] (4) Reckless inadvertent (or reckless deliberate if they knew)
|
|
35
|
+
|
|
36
|
+
**Hints:**
|
|
37
|
+
1. Deliberate = they knew they were taking a shortcut
|
|
38
|
+
2. Prudent = they planned to pay it back
|
|
39
|
+
3. "Never revisits" = reckless
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Exercise 3: Identify and Measure
|
|
44
|
+
|
|
45
|
+
**Task:** Pick a module (real or hypothetical). List 3 code smells, 2 metrics you'd track, and 1 business impact you'd report.
|
|
46
|
+
|
|
47
|
+
**Validation:**
|
|
48
|
+
- [ ] Smells are specific (e.g., "300-line function", "duplicated validation logic")
|
|
49
|
+
- [ ] Metrics are measurable (complexity, coverage, cycle time)
|
|
50
|
+
- [ ] Business impact is in stakeholder language (time, risk, cost)
|
|
51
|
+
|
|
52
|
+
**Hints:**
|
|
53
|
+
1. Smells: length, duplication, nesting, naming
|
|
54
|
+
2. Metrics: sonar/ESLint complexity, test coverage, Jira cycle time
|
|
55
|
+
3. Impact: "Feature X takes 2 days longer" or "Bugs in payment flow"
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Exercise 4: Pitch to Stakeholders
|
|
60
|
+
|
|
61
|
+
**Task:** Write a short pitch (5–7 sentences) to get 1 sprint for tech debt paydown. Include: problem, current cost, proposed fix, and what unlocks after.
|
|
62
|
+
|
|
63
|
+
**Validation:**
|
|
64
|
+
- [ ] States the problem in business terms
|
|
65
|
+
- [ ] Quantifies cost (time, risk, or money)
|
|
66
|
+
- [ ] Describes the fix at a high level
|
|
67
|
+
- [ ] Connects paydown to a positive outcome (faster features, fewer bugs)
|
|
68
|
+
|
|
69
|
+
**Hints:**
|
|
70
|
+
1. Avoid jargon — "slow to change" not "high cyclomatic complexity"
|
|
71
|
+
2. Use numbers: "20% of sprint on workarounds"
|
|
72
|
+
3. End with: "After this, we can deliver X faster"
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Exercise 5: Refactor vs Strangler vs Rewrite
|
|
77
|
+
|
|
78
|
+
**Task:** For each scenario, choose Refactor, Strangler Fig, or Rewrite. Justify in one sentence.
|
|
79
|
+
|
|
80
|
+
1. Auth logic is scattered across 10 files; needs centralization
|
|
81
|
+
2. Legacy PHP app; team wants to move to Node
|
|
82
|
+
3. One module has wrong abstractions; rest of system is fine
|
|
83
|
+
|
|
84
|
+
**Validation:**
|
|
85
|
+
- [ ] (1) Refactor — extract and consolidate
|
|
86
|
+
- [ ] (2) Strangler (or rewrite if very small) — gradually replace
|
|
87
|
+
- [ ] (3) Refactor — fix one module in place
|
|
88
|
+
|
|
89
|
+
**Hints:**
|
|
90
|
+
1. Refactor = improve in place
|
|
91
|
+
2. Strangler = build new around old, migrate incrementally
|
|
92
|
+
3. Rewrite = replace whole system; rare, high risk
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
slug: technical-debt
|
|
2
|
+
title: "Technical Debt — Identifying, Measuring, and Paying It Down"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Understand technical debt, measure it, prioritize paydown, and communicate it to stakeholders."
|
|
5
|
+
category: developer-skills
|
|
6
|
+
tags: [technical-debt, refactoring, code-quality, maintenance, architecture]
|
|
7
|
+
difficulty: intermediate
|
|
8
|
+
|
|
9
|
+
xp:
|
|
10
|
+
read: 15
|
|
11
|
+
walkthrough: 40
|
|
12
|
+
exercise: 25
|
|
13
|
+
quiz: 20
|
|
14
|
+
quiz-perfect-bonus: 10
|
|
15
|
+
|
|
16
|
+
time:
|
|
17
|
+
quick: 5
|
|
18
|
+
read: 20
|
|
19
|
+
guided: 50
|
|
20
|
+
|
|
21
|
+
prerequisites: [code-review]
|
|
22
|
+
related: [clean-code, solid-principles]
|
|
23
|
+
|
|
24
|
+
triggers:
|
|
25
|
+
- "What is technical debt?"
|
|
26
|
+
- "How do I convince my manager to pay down tech debt?"
|
|
27
|
+
- "How do I measure technical debt?"
|
|
28
|
+
- "When should I refactor vs rewrite?"
|
|
29
|
+
|
|
30
|
+
visuals:
|
|
31
|
+
diagrams: [diagram-mermaid, diagram-flow]
|
|
32
|
+
quiz-types: [quiz-matching, quiz-timed-choice]
|
|
33
|
+
playground: null
|
|
34
|
+
slides: true
|
|
35
|
+
|
|
36
|
+
sources:
|
|
37
|
+
- url: "https://martinfowler.com/bliki/TechnicalDebtQuadrant.html"
|
|
38
|
+
label: "Martin Fowler's Tech Debt Quadrant"
|
|
39
|
+
type: docs
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Technical Debt Quick Reference
|
|
2
|
+
|
|
3
|
+
## Debt Metaphor
|
|
4
|
+
|
|
5
|
+
| Term | Meaning |
|
|
6
|
+
|------|---------|
|
|
7
|
+
| Principal | One-time cost to fix the design |
|
|
8
|
+
| Interest | Extra cost per change that touches the debt |
|
|
9
|
+
|
|
10
|
+
## Fowler's Quadrant
|
|
11
|
+
|
|
12
|
+
| | Reckless | Prudent |
|
|
13
|
+
|--|----------|---------|
|
|
14
|
+
| **Deliberate** | Knew, cut corners, no plan to fix | Knew, planned to pay back |
|
|
15
|
+
| **Inadvertent** | Didn't know, made a mess | Learned; design should change |
|
|
16
|
+
|
|
17
|
+
Prudent deliberate = acceptable. Reckless deliberate = toxic.
|
|
18
|
+
|
|
19
|
+
## Identifying Debt
|
|
20
|
+
|
|
21
|
+
| Signal | What to Look For |
|
|
22
|
+
|--------|------------------|
|
|
23
|
+
| Code smells | Long functions, duplication, deep nesting, God classes |
|
|
24
|
+
| Velocity | Same features taking longer, points per sprint dropping |
|
|
25
|
+
| Bugs | Same module failing repeatedly |
|
|
26
|
+
|
|
27
|
+
## Metrics
|
|
28
|
+
|
|
29
|
+
| Metric | Use |
|
|
30
|
+
|--------|-----|
|
|
31
|
+
| Cyclomatic complexity | Per-function complexity |
|
|
32
|
+
| Test coverage | Gaps = risky areas |
|
|
33
|
+
| Lead time / cycle time | Idea → ship |
|
|
34
|
+
| Bug rate by module | Where debt hurts most |
|
|
35
|
+
| Churn | Files changed often = high interest |
|
|
36
|
+
|
|
37
|
+
## Prioritization
|
|
38
|
+
|
|
39
|
+
1. **Interest** — High-touch debt first
|
|
40
|
+
2. **Principal** — Can we pay in one sprint?
|
|
41
|
+
3. **Risk** — Security, outages
|
|
42
|
+
4. **Strategy** — Are we changing this area soon?
|
|
43
|
+
|
|
44
|
+
## Communicating
|
|
45
|
+
|
|
46
|
+
| Do | Don't |
|
|
47
|
+
|----|-------|
|
|
48
|
+
| Quantify impact (time, bugs, risk) | Use jargon (complexity, smells) |
|
|
49
|
+
| Tie to business goals | Say "code is messy" |
|
|
50
|
+
| Offer options and tradeoffs | Demand without context |
|
|
51
|
+
|
|
52
|
+
## Strategies
|
|
53
|
+
|
|
54
|
+
| Strategy | When |
|
|
55
|
+
|----------|------|
|
|
56
|
+
| Boy Scout Rule | Incremental; leave code better |
|
|
57
|
+
| Dedicated sprints | Allocate % capacity |
|
|
58
|
+
| Strangler Fig | Legacy; replace gradually |
|
|
59
|
+
| Refactor | Design salvageable |
|
|
60
|
+
| Rewrite | Design fundamentally wrong; rare |
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Technical Debt Quiz
|
|
2
|
+
|
|
3
|
+
## Question 1
|
|
4
|
+
|
|
5
|
+
What is "interest" in the technical debt metaphor?
|
|
6
|
+
|
|
7
|
+
A) The time it took to write the original code
|
|
8
|
+
B) The ongoing extra cost of every change that touches the debt
|
|
9
|
+
C) The cost of the initial quick-and-dirty solution
|
|
10
|
+
D) The number of bugs in the code
|
|
11
|
+
|
|
12
|
+
<!-- ANSWER: B -->
|
|
13
|
+
<!-- EXPLANATION: Interest is the recurring cost — each time you work in that area, you pay extra (slower changes, more bugs, harder debugging). Principal is the one-time cost to fix it. -->
|
|
14
|
+
|
|
15
|
+
## Question 2
|
|
16
|
+
|
|
17
|
+
In Fowler's quadrant, which type of debt is acceptable if you actually pay it?
|
|
18
|
+
|
|
19
|
+
A) Reckless inadvertent
|
|
20
|
+
B) Reckless deliberate
|
|
21
|
+
C) Prudent inadvertent
|
|
22
|
+
D) Prudent deliberate
|
|
23
|
+
|
|
24
|
+
<!-- ANSWER: D -->
|
|
25
|
+
<!-- EXPLANATION: Prudent deliberate means you knowingly took a shortcut with a plan to pay it back. The others either lack awareness (inadvertent) or lack intention to fix (reckless). -->
|
|
26
|
+
|
|
27
|
+
## Question 3
|
|
28
|
+
|
|
29
|
+
Which is a signal of technical debt rather than debt itself?
|
|
30
|
+
|
|
31
|
+
A) A decision to ship without tests to meet a deadline
|
|
32
|
+
B) A 300-line function with deep nesting
|
|
33
|
+
C) An intentional tradeoff documented in a ticket
|
|
34
|
+
D) A planned migration to a new framework
|
|
35
|
+
|
|
36
|
+
<!-- ANSWER: B -->
|
|
37
|
+
<!-- EXPLANATION: A long, complex function is a "code smell" — a signal that debt may exist. The actual debt is the decision (or lack of decision) that led to it. A, C, D describe decisions or plans. -->
|
|
38
|
+
|
|
39
|
+
## Question 4
|
|
40
|
+
|
|
41
|
+
When pitching tech debt paydown to a manager, what's most persuasive?
|
|
42
|
+
|
|
43
|
+
A) "Our cyclomatic complexity is high"
|
|
44
|
+
B) "This module causes 40% of our bugs and delays each release by 2 days"
|
|
45
|
+
C) "The code is messy"
|
|
46
|
+
D) "We need to refactor"
|
|
47
|
+
|
|
48
|
+
<!-- ANSWER: B -->
|
|
49
|
+
<!-- EXPLANATION: Stakeholders care about outcomes: bugs, time, risk. Quantifying impact (40% of bugs, 2-day delay) makes the case. Technical jargon (cyclomatic complexity, "messy") doesn't translate. -->
|
|
50
|
+
|
|
51
|
+
## Question 5
|
|
52
|
+
|
|
53
|
+
When should you prefer refactoring over a full rewrite?
|
|
54
|
+
|
|
55
|
+
A) Never — rewrites are always better
|
|
56
|
+
B) When the design is salvageable and the system isn't tiny
|
|
57
|
+
C) Only when you have infinite time
|
|
58
|
+
D) Rewrites are always cheaper
|
|
59
|
+
|
|
60
|
+
<!-- ANSWER: B -->
|
|
61
|
+
<!-- EXPLANATION: Refactoring (extract, rename, split) is cheaper and lower risk when the design can be improved in place. Rewrites are risky and expensive; use for fundamentally broken or very small systems. -->
|
|
62
|
+
|
|
63
|
+
## Question 6
|
|
64
|
+
|
|
65
|
+
What does the "Strangler Fig" strategy mean?
|
|
66
|
+
|
|
67
|
+
A) Rewrite the entire system at once
|
|
68
|
+
B) Gradually replace a legacy system by routing new behavior to new code and migrating over time
|
|
69
|
+
C) Ignore the debt until it crashes
|
|
70
|
+
D) Add more tests around the bad code
|
|
71
|
+
|
|
72
|
+
<!-- ANSWER: B -->
|
|
73
|
+
<!-- EXPLANATION: Strangler fig pattern: build new code around the old, route new features to the new system, migrate callers incrementally. Avoids big-bang rewrites and reduces risk. -->
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Technical Debt — Resources
|
|
2
|
+
|
|
3
|
+
## Videos
|
|
4
|
+
|
|
5
|
+
- [Technical Debt Explained](https://www.youtube.com/results?search_query=martin+fowler+technical+debt) — Martin Fowler and others. The metaphor, quadrant, and paydown strategies.
|
|
6
|
+
- [Managing Technical Debt](https://www.youtube.com/watch?v=ZAhN_2lcfSI) — GOTO Conferences. Practical approaches to measurement and communication.
|
|
7
|
+
|
|
8
|
+
## Articles and Readings
|
|
9
|
+
|
|
10
|
+
- [Technical Debt Quadrant](https://martinfowler.com/bliki/TechnicalDebtQuadrant.html) — Martin Fowler. Prudent/reckless, deliberate/inadvertent. Key framework.
|
|
11
|
+
- [Technical Debt](https://martinfowler.com/bliki/TechnicalDebt.html) — Martin Fowler. Origin of the metaphor.
|
|
12
|
+
- [A Mess Is Not a Technical Debt](https://sites.google.com/site/unclebobconsultingllc/a-mess-is-not-a-technical-debt) — Uncle Bob. Distinguishes debt from mess; complements Fowler's quadrant.
|
|
13
|
+
- [Strangler Fig Application](https://martinfowler.com/bliki/StranglerFigApplication.html) — Martin Fowler. Incremental replacement of legacy systems.
|
|
14
|
+
|
|
15
|
+
## Books
|
|
16
|
+
|
|
17
|
+
- **Refactoring** by Martin Fowler — Systematic techniques for paying down debt safely.
|
|
18
|
+
- **Working Effectively with Legacy Code** by Michael Feathers — Strategies for improving code you're afraid to touch.
|
|
19
|
+
- **The Software Craftsman** by Sandro Mancuso — Professional attitude toward quality and debt.
|
|
20
|
+
|
|
21
|
+
## Tools and Playgrounds
|
|
22
|
+
|
|
23
|
+
- [SonarQube](https://www.sonarqube.org/) — Code quality and technical debt metrics.
|
|
24
|
+
- [ESLint](https://eslint.org/) — JavaScript/TypeScript linting; catches many smells.
|
|
25
|
+
- [CodeClimate](https://codeclimate.com/) — Maintainability and debt metrics.
|