@shaykec/bridge 0.4.25 → 0.4.27
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 +2 -2
- package/canvas-dist/assets/_basePickBy-BovdgFIW.js +0 -1
- package/canvas-dist/assets/_basePickBy-BtkHe2u_.js +0 -1
- package/canvas-dist/assets/_basePickBy-C0936578.js +0 -1
- package/canvas-dist/assets/_basePickBy-CE2Qvuh7.js +0 -1
- package/canvas-dist/assets/_basePickBy-DV6sX4CG.js +0 -1
- package/canvas-dist/assets/_basePickBy-DZX6ZNMT.js +0 -1
- package/canvas-dist/assets/_baseUniq-B7dN28TM.js +0 -1
- package/canvas-dist/assets/_baseUniq-Cl23fCdR.js +0 -1
- package/canvas-dist/assets/_baseUniq-CojWFw7B.js +0 -1
- package/canvas-dist/assets/_baseUniq-DA640BJl.js +0 -1
- package/canvas-dist/assets/_baseUniq-Ds-62CCj.js +0 -1
- package/canvas-dist/assets/_baseUniq-KG7SRw9H.js +0 -1
- package/canvas-dist/assets/arc-7E9FFKlC.js +0 -1
- package/canvas-dist/assets/arc-BSMfRZtt.js +0 -1
- package/canvas-dist/assets/arc-C6nT-koR.js +0 -1
- package/canvas-dist/assets/arc-D_fOnjmo.js +0 -1
- package/canvas-dist/assets/arc-Khfvgkr3.js +0 -1
- package/canvas-dist/assets/arc-ieS-i42x.js +0 -1
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DF4t6GQD.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DXgSlsio.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DiomxPB4.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DnFaxvXD.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-Dt38C0LJ.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-egbtMwua.js +0 -36
- package/canvas-dist/assets/blockDiagram-VD42YOAC-CUNKQd-b.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-D-NiLXxd.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-Dx6Dh9gg.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-_r-PmlQy.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-bvYKZLMc.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-l85QT9Ig.js +0 -122
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-BWKCTyQi.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-CbXs2xzC.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-CjiS-GNK.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-D7SnLlHp.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-RTTCSVf2.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-yvqJ_AqX.js +0 -10
- package/canvas-dist/assets/channel-CSXq7GP6.js +0 -1
- package/canvas-dist/assets/channel-CvujjGiJ.js +0 -1
- package/canvas-dist/assets/channel-D959Iony.js +0 -1
- package/canvas-dist/assets/channel-DOSwCnrB.js +0 -1
- package/canvas-dist/assets/channel-sw61LzxF.js +0 -1
- package/canvas-dist/assets/channel-vZVnNhOK.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BBjuAwXr.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BXRNyucU.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-Bgq5Z77T.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BuoMCMCr.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-COD5n7vg.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-K8DepKJO.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-Bic_bMrQ.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-DEy2QUDq.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-Dcgbmfzg.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-DfmuNm_E.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-DlQRcczm.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-p2qMY-fm.js +0 -1
- package/canvas-dist/assets/chunk-B4BG7PRW-BpbyxBP2.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-CCPqvPrP.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-CEeDPAki.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-D2UFN_2M.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-DFI5h6HC.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-DKOiFGMU.js +0 -165
- package/canvas-dist/assets/chunk-DI55MBZ5-BV6nHjNQ.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-CEZJmC0E.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-DOZT99Ek.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-DmC2LoG2.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-DpkcJdZP.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-fVTGx0zh.js +0 -220
- package/canvas-dist/assets/chunk-FMBD7UC4-BOCyQpI7.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-C76FrRL8.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-CAq-btWc.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-CidVsej6.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-DPpfskdX.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-DnLtclge.js +0 -15
- package/canvas-dist/assets/chunk-QN33PNHL-BclpCUi8.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DDUw8IU1.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DdJFAUXw.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DjV4jUn9.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-N-HTycqU.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-sd8p21DW.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-B6mT-JkP.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-BCo8pc7x.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-C8IIu6es.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-D9FF492U.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-DWMbUjXT.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-l5FBJ77g.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BASt-UWt.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BCfaZWLT.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BKIk_hBR.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-C4pt-Ir8.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-DwGlELvo.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-jJKG-WvJ.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-B7YQfPU4.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-BZ61MaHY.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-CGseYor2.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-CKzOc99J.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-Ce_LPjwW.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-DorPdibv.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-B7YQfPU4.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BZ61MaHY.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CGseYor2.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CKzOc99J.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-Ce_LPjwW.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-DorPdibv.js +0 -1
- package/canvas-dist/assets/clone-74KSto7H.js +0 -1
- package/canvas-dist/assets/clone-CJQgAYVe.js +0 -1
- package/canvas-dist/assets/clone-DLeTuhHE.js +0 -1
- package/canvas-dist/assets/clone-D_IHK_lQ.js +0 -1
- package/canvas-dist/assets/clone-DxMUv1L9.js +0 -1
- package/canvas-dist/assets/clone-UNKf_nED.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-BTyQiCkr.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-BtPAe24N.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-DIjE7V3m.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-DKL_BGvE.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-LZ4OsCLU.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-XWeJtgga.js +0 -1
- package/canvas-dist/assets/dagre-6UL2VRFP-BJ2vcFwR.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-C1FlE5s8.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-C3BWFgl6.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-CUnx73Rf.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-Do10BY1y.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-rOZEkrsg.js +0 -4
- package/canvas-dist/assets/diagram-PSM6KHXK-BGi_qzbq.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-C3Nv7h_j.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-CsMy-r0n.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-Dj8g7kGt.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-Dxb1w_7r.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-kVMBkEyV.js +0 -24
- package/canvas-dist/assets/diagram-QEK2KX5R-4bsrr1WZ.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-Bv7BmKfI.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-C_FLN6hv.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-Csuk5L3z.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-D5Aszgz4.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-DX58f87l.js +0 -43
- package/canvas-dist/assets/diagram-S2PKOQOG-1Q7hwiSd.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-Bz9Vxi5V.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-CdWgZIIc.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-DBicbKFU.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-DsXKwPtU.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-L_SMHLXs.js +0 -24
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-BYu7fh6H.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-CvnQ69BF.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-D3xm-Tdm.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-DIPpD8sj.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-DNgu6dMd.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-Decm8aB4.js +0 -60
- package/canvas-dist/assets/flowDiagram-NV44I4VS-2ymk2kw2.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-BEPFOt6U.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-BwqXYGfK.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-CS1jax_z.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-DQz5bf7r.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-KW4T1sqF.js +0 -162
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-B811prZt.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-C75pWm7X.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-CWsbo0fn.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-CbJozPBN.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-Co0cFt4c.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-I4PDqrRh.js +0 -267
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-B-z0cLPt.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-Be40z-LF.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BejNaAVm.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BqWDYr0X.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-DSvWGY-e.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-HLYbyNJ5.js +0 -65
- package/canvas-dist/assets/graph-BE8KKsdf.js +0 -1
- package/canvas-dist/assets/graph-D6DzzszU.js +0 -1
- package/canvas-dist/assets/graph-DFR8Y_8s.js +0 -1
- package/canvas-dist/assets/graph-Da385cDY.js +0 -1
- package/canvas-dist/assets/graph-MU7gZz2B.js +0 -1
- package/canvas-dist/assets/graph-wjSBJwnf.js +0 -1
- package/canvas-dist/assets/index--ztw-8Rw.js +0 -647
- package/canvas-dist/assets/index-5TpIM6B1.js +0 -11
- package/canvas-dist/assets/index-BSswTuBk.js +0 -11
- package/canvas-dist/assets/index-BVvhMmjs.js +0 -11
- package/canvas-dist/assets/index-BY92Mj5g.js +0 -572
- package/canvas-dist/assets/index-CV7palC3.js +0 -572
- package/canvas-dist/assets/index-D9bmQGsB.js +0 -11
- package/canvas-dist/assets/index-DDIKkGv8.js +0 -592
- package/canvas-dist/assets/index-Dyo0NkPb.js +0 -574
- package/canvas-dist/assets/index-iQWajCow.js +0 -572
- package/canvas-dist/assets/index-m68YlAMU.js +0 -11
- package/canvas-dist/assets/index-mEoP57az.js +0 -11
- package/canvas-dist/assets/infoDiagram-HS3SLOUP--9BirqgJ.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-CSJVED2y.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-D68HIb2t.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-DK2VLGGz.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-PaFhn4yD.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-zLNG47sU.js +0 -2
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-Bue2dR2X.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-CrgZfpdU.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-DUxWmkkC.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-OTFkv4pd.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-eK2_Zuu3.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-uds5Tz8D.js +0 -139
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BETdiI7I.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BdVh7KdN.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-Cxl8UM9S.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-DVPlx3I2.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-LtNWeoYB.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-uvhEMvyE.js +0 -89
- package/canvas-dist/assets/layout-1OzszN14.js +0 -1
- package/canvas-dist/assets/layout-CJSupFcF.js +0 -1
- package/canvas-dist/assets/layout-DFRmxN_c.js +0 -1
- package/canvas-dist/assets/layout-DSu-zk7y.js +0 -1
- package/canvas-dist/assets/layout-TGcrvApd.js +0 -1
- package/canvas-dist/assets/layout-eStc8SYK.js +0 -1
- package/canvas-dist/assets/linear-9qlE6xa7.js +0 -1
- package/canvas-dist/assets/linear-CBfFWnLD.js +0 -1
- package/canvas-dist/assets/linear-Cv4ai8Hq.js +0 -1
- package/canvas-dist/assets/linear-DDzz65E6.js +0 -1
- package/canvas-dist/assets/linear-wbIqhwDf.js +0 -1
- package/canvas-dist/assets/linear-wyNKl76F.js +0 -1
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-3l4YzhEM.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-B-KkpNlw.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-DHMHWgmT.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-Dqfyg4Z2.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-NeRYOzsq.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-xyu628P9.js +0 -68
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BWNzVAGj.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-Bm3PXYs-.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BvvN7VvQ.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BwU7AN7W.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-CHgwWCaM.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-DlZc8YOh.js +0 -30
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B-Zd8OFp.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B1CnJyxI.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C0Qo00b9.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C9bx3nEJ.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-UHENkiRO.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-jKfurTPU.js +0 -7
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BPpNNusD.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BwZF1NIK.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-CaT3Frtk.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-Dfoz7R_7.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-DsrX4TT-.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-dmouSXOl.js +0 -64
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BEy-A1Fu.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BViMBiAQ.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BqrM-qWN.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DRkRC9qB.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DbuzKCtn.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-_aHMKbpw.js +0 -10
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-B8FOaL2Q.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-C02NQwOB.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CgyHivPj.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CzW1WaEm.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-DJhHI1pe.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-VFkpAeoG.js +0 -145
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BSqFX4PJ.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BnXhhxkN.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-ClARVrvt.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-CuC6xesY.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-DcAiGjph.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-aBg0hjTp.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-8fib9ftc.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-B-DO0ZqO.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-BksbsE4k.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-C2DJCNPK.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-CeA5jba6.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-zsAyq0tK.js +0 -1
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-BaHdYD2h.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-Bl2hg8IM.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-CrVwLiGm.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-DrXGRjnB.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-cYAwshf6.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-flyL0y-3.js +0 -61
- package/canvas-dist/assets/treemap-GDKQZRPO-C4Hg8kJ_.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-DVY2G9qY.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-DpLWPA1z.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-Ds86cUVw.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-DwmoI6tH.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-SsGFkgVd.js +0 -162
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-B9c1iLBf.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-BpX6MPWa.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CEgW_j0p.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CSEFGEQX.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CnG4XoMc.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-Dftj3Bt3.js +0 -7
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# SQL Quick Reference
|
|
2
|
+
|
|
3
|
+
## Basic Query
|
|
4
|
+
|
|
5
|
+
```sql
|
|
6
|
+
SELECT col1, col2 FROM table WHERE condition ORDER BY col LIMIT n OFFSET m;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## JOINs
|
|
10
|
+
|
|
11
|
+
| Join | Result |
|
|
12
|
+
|------|--------|
|
|
13
|
+
| INNER JOIN | Only matches |
|
|
14
|
+
| LEFT JOIN | All left + matches from right |
|
|
15
|
+
| RIGHT JOIN | All right + matches from left |
|
|
16
|
+
| FULL OUTER | All from both |
|
|
17
|
+
|
|
18
|
+
## Aggregates
|
|
19
|
+
|
|
20
|
+
| Function | Purpose |
|
|
21
|
+
|----------|---------|
|
|
22
|
+
| COUNT(*) | Number of rows |
|
|
23
|
+
| SUM(col) | Sum of values |
|
|
24
|
+
| AVG(col) | Average |
|
|
25
|
+
| MIN(col), MAX(col) | Min/Max |
|
|
26
|
+
|
|
27
|
+
## WHERE vs HAVING
|
|
28
|
+
|
|
29
|
+
| Clause | When |
|
|
30
|
+
|--------|------|
|
|
31
|
+
| WHERE | Before GROUP BY; row-level filter |
|
|
32
|
+
| HAVING | After GROUP BY; group-level filter |
|
|
33
|
+
|
|
34
|
+
## Normalization
|
|
35
|
+
|
|
36
|
+
| Form | Rule |
|
|
37
|
+
|------|------|
|
|
38
|
+
| 1NF | Atomic values, no repeating groups |
|
|
39
|
+
| 2NF | 1NF + no partial dependencies |
|
|
40
|
+
| 3NF | 2NF + no transitive dependencies |
|
|
41
|
+
|
|
42
|
+
## Common Patterns
|
|
43
|
+
|
|
44
|
+
```sql
|
|
45
|
+
-- Pagination
|
|
46
|
+
SELECT * FROM t ORDER BY id LIMIT 10 OFFSET 20;
|
|
47
|
+
|
|
48
|
+
-- Exists check
|
|
49
|
+
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
|
|
50
|
+
|
|
51
|
+
-- Top N per group (simplified)
|
|
52
|
+
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY group_col ORDER BY sort_col) rn FROM t) WHERE rn <= 5;
|
|
53
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# SQL Quiz
|
|
2
|
+
|
|
3
|
+
## Question 1
|
|
4
|
+
|
|
5
|
+
What does an INNER JOIN return?
|
|
6
|
+
|
|
7
|
+
A) All rows from both tables
|
|
8
|
+
B) Only rows with matching values in both tables
|
|
9
|
+
C) All rows from the left table
|
|
10
|
+
D) Only the first matching row from each table
|
|
11
|
+
|
|
12
|
+
<!-- ANSWER: B -->
|
|
13
|
+
<!-- EXPLANATION: INNER JOIN returns only rows where the join condition is satisfied in both tables. Rows with no match in the other table are excluded. -->
|
|
14
|
+
|
|
15
|
+
## Question 2
|
|
16
|
+
|
|
17
|
+
What is the difference between LEFT JOIN and INNER JOIN?
|
|
18
|
+
|
|
19
|
+
A) They are the same
|
|
20
|
+
B) LEFT JOIN includes all rows from the left table, even with no match
|
|
21
|
+
C) LEFT JOIN is faster
|
|
22
|
+
D) INNER JOIN includes NULLs
|
|
23
|
+
|
|
24
|
+
<!-- ANSWER: B -->
|
|
25
|
+
<!-- EXPLANATION: LEFT JOIN returns all rows from the left table. Where there's no match in the right table, right-side columns are NULL. INNER JOIN excludes such rows. -->
|
|
26
|
+
|
|
27
|
+
## Question 3
|
|
28
|
+
|
|
29
|
+
When do you use HAVING instead of WHERE?
|
|
30
|
+
|
|
31
|
+
A) HAVING is for strings, WHERE is for numbers
|
|
32
|
+
B) HAVING filters after aggregation; WHERE filters before
|
|
33
|
+
C) HAVING is for JOINs, WHERE is for single tables
|
|
34
|
+
D) They are interchangeable
|
|
35
|
+
|
|
36
|
+
<!-- ANSWER: B -->
|
|
37
|
+
<!-- EXPLANATION: WHERE filters rows before GROUP BY. HAVING filters groups after aggregation. You use HAVING when the condition involves an aggregate (e.g., SUM(amount) > 100). -->
|
|
38
|
+
|
|
39
|
+
## Question 4
|
|
40
|
+
|
|
41
|
+
What does 2NF (Second Normal Form) require?
|
|
42
|
+
|
|
43
|
+
A) No duplicate rows
|
|
44
|
+
B) No partial dependencies — all non-key attributes depend on the whole primary key
|
|
45
|
+
C) No more than 2 columns per table
|
|
46
|
+
D) All tables must have a foreign key
|
|
47
|
+
|
|
48
|
+
<!-- ANSWER: B -->
|
|
49
|
+
<!-- EXPLANATION: 2NF builds on 1NF (atomic values) and requires that no non-key attribute depends on only part of a composite primary key. This eliminates partial dependencies. -->
|
|
50
|
+
|
|
51
|
+
## Question 5
|
|
52
|
+
|
|
53
|
+
Which query finds users who have placed no orders? (users.id, orders.user_id)
|
|
54
|
+
|
|
55
|
+
A) SELECT * FROM users INNER JOIN orders ON users.id = orders.user_id
|
|
56
|
+
B) SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.id IS NULL
|
|
57
|
+
C) SELECT * FROM users WHERE orders.user_id IS NULL
|
|
58
|
+
D) SELECT * FROM users RIGHT JOIN orders ON users.id = orders.user_id
|
|
59
|
+
|
|
60
|
+
<!-- ANSWER: B -->
|
|
61
|
+
<!-- EXPLANATION: LEFT JOIN keeps all users. Where there's no order, orders columns are NULL. WHERE orders.id IS NULL filters to users with no matching order. -->
|
|
62
|
+
|
|
63
|
+
## Question 6
|
|
64
|
+
|
|
65
|
+
What is the purpose of an index?
|
|
66
|
+
|
|
67
|
+
A) To store backup data
|
|
68
|
+
B) To speed up queries on indexed columns
|
|
69
|
+
C) To enforce unique values
|
|
70
|
+
D) To reduce storage
|
|
71
|
+
|
|
72
|
+
<!-- ANSWER: B -->
|
|
73
|
+
<!-- EXPLANATION: Indexes create a data structure (e.g., B-tree) that speeds up lookups, WHERE, JOIN, and ORDER BY on indexed columns. They trade write speed and storage for read speed. -->
|
|
74
|
+
|
|
75
|
+
## Question 7
|
|
76
|
+
|
|
77
|
+
<!-- VISUAL: drag-order -->
|
|
78
|
+
|
|
79
|
+
Put these SQL clause phases in the order they are logically evaluated during query execution:
|
|
80
|
+
|
|
81
|
+
A) ORDER BY
|
|
82
|
+
B) WHERE
|
|
83
|
+
C) FROM
|
|
84
|
+
D) GROUP BY / HAVING
|
|
85
|
+
|
|
86
|
+
<!-- ANSWER: C,B,D,A -->
|
|
87
|
+
<!-- EXPLANATION: SQL evaluates FROM first (identify tables), then WHERE (filter rows), then GROUP BY/HAVING (aggregation), then ORDER BY (sort results). SELECT projects columns throughout but the logical order of row processing is FROM → WHERE → GROUP BY → ORDER BY. -->
|
|
88
|
+
|
|
89
|
+
## Question 8
|
|
90
|
+
|
|
91
|
+
<!-- VISUAL: fill-blank -->
|
|
92
|
+
|
|
93
|
+
Complete the query to find customers who have ordered more than 5 times:
|
|
94
|
+
|
|
95
|
+
```sql
|
|
96
|
+
SELECT customer_id, COUNT(*) AS order_count
|
|
97
|
+
FROM orders
|
|
98
|
+
GROUP BY customer_id
|
|
99
|
+
___0___ COUNT(*) > 5;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
<!-- ANSWER: HAVING -->
|
|
103
|
+
<!-- EXPLANATION: HAVING filters after aggregation. WHERE cannot use aggregate functions like COUNT(*). HAVING applies to grouped rows, so HAVING COUNT(*) > 5 correctly filters to customers with more than 5 orders. -->
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# SQL — Resources
|
|
2
|
+
|
|
3
|
+
## Videos
|
|
4
|
+
|
|
5
|
+
- [SQL in 100 Seconds](https://www.youtube.com/watch?v=zsjvFFKOm3c) — Fireship. Quick overview.
|
|
6
|
+
- [SQL Tutorial](https://www.youtube.com/watch?v=HXV3zeQKqGY) — freeCodeCamp. Full beginner course.
|
|
7
|
+
- [SQL Joins Explained](https://www.youtube.com/watch?v=9yeOJ0ZMUYw) — Web Dev Simplified. Visual join explanations.
|
|
8
|
+
|
|
9
|
+
## Articles and Readings
|
|
10
|
+
|
|
11
|
+
- [SQLBolt](https://sqlbolt.com) — Interactive SQL tutorials. Start here.
|
|
12
|
+
- [PostgreSQL Tutorial](https://www.postgresqltutorial.com/) — PostgreSQL-specific guide.
|
|
13
|
+
- [Use The Index, Luke](https://use-the-index-luke.com/) — SQL indexing deep dive.
|
|
14
|
+
|
|
15
|
+
## Books
|
|
16
|
+
|
|
17
|
+
- **SQL in 10 Minutes** by Ben Forta — Quick reference and practice.
|
|
18
|
+
- **Learning SQL** by Alan Beaulieu — Comprehensive introduction.
|
|
19
|
+
|
|
20
|
+
## Tools and Playgrounds
|
|
21
|
+
|
|
22
|
+
- [SQL Fiddle](http://sqlfiddle.com) — Run SQL in the browser.
|
|
23
|
+
- [DB Fiddle](https://www.db-fiddle.com/) — PostgreSQL, MySQL, SQLite.
|
|
24
|
+
- [PostgreSQL](https://www.postgresql.org/) — Open-source relational database.
|
|
25
|
+
|
|
26
|
+
## Podcasts
|
|
27
|
+
|
|
28
|
+
- [Software Engineering Daily — Database Episodes](https://softwareengineeringdaily.com/category/all-episodes/exclusive-content/databases/) — Technical deep dives on SQL, PostgreSQL, indexing.
|
|
29
|
+
- [Postgres.fm](https://postgres.fm/) — Weekly PostgreSQL podcast covering SQL performance, extensions, and best practices.
|
|
30
|
+
|
|
31
|
+
## Interactive and Visual
|
|
32
|
+
|
|
33
|
+
- [SQLBolt](https://sqlbolt.com/) — Step-by-step interactive SQL lessons in the browser.
|
|
34
|
+
- [SQL Murder Mystery](https://mystery.knightlab.com/) — Solve a murder mystery using SQL queries — gamified learning.
|
|
35
|
+
- [VisuAlgo — Databases](https://visualgo.net/) — Animated visualizations of B-trees, hashing, and indexing algorithms.
|
|
36
|
+
- [Explain.dalibo.com](https://explain.dalibo.com/) — Visual PostgreSQL EXPLAIN ANALYZE visualizer — paste a plan and see it as a tree.
|
|
37
|
+
|
|
38
|
+
## Courses
|
|
39
|
+
|
|
40
|
+
- [Stanford — Databases (free)](https://online.stanford.edu/courses/soe-ydatabases0005-databases-relational-databases-and-sql) — Jennifer Widom's foundational SQL and relational database course.
|
|
41
|
+
- [freeCodeCamp — SQL and Databases](https://www.freecodecamp.org/learn/relational-database/) — Free interactive curriculum with PostgreSQL projects.
|
|
42
|
+
- [Mode Analytics — SQL Tutorial (free)](https://mode.com/sql-tutorial/) — Practical SQL for analysis with real datasets.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# SQL Walkthrough — Learn by Doing
|
|
2
|
+
|
|
3
|
+
## Step 1: Your First Query
|
|
4
|
+
|
|
5
|
+
Assume a `users` table with `id`, `name`, `email`, `created_at`. Write a query to fetch all users.
|
|
6
|
+
|
|
7
|
+
<!-- hint:terminal -->
|
|
8
|
+
<!-- hint:code language="sql" highlight="1,2" -->
|
|
9
|
+
|
|
10
|
+
**Embed:** https://www.db-fiddle.com/
|
|
11
|
+
|
|
12
|
+
**Task:** Write `SELECT * FROM users`. Then write a query that returns only `name` and `email`.
|
|
13
|
+
|
|
14
|
+
**Question:** When would you use `SELECT *` vs listing specific columns? What are the tradeoffs?
|
|
15
|
+
|
|
16
|
+
**Checkpoint:** The user can write basic SELECT and understands column selection.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 2: Filtering with WHERE
|
|
21
|
+
|
|
22
|
+
<!-- hint:terminal -->
|
|
23
|
+
|
|
24
|
+
**Task:** Write queries to:
|
|
25
|
+
- Find users created after 2024-01-01
|
|
26
|
+
- Find users whose email contains "@gmail.com"
|
|
27
|
+
- Find users with a non-null phone number
|
|
28
|
+
|
|
29
|
+
**Question:** What's the difference between `=` and `LIKE`? When would you use `IN` vs multiple `OR` conditions?
|
|
30
|
+
|
|
31
|
+
**Checkpoint:** The user can use WHERE with various operators.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 3: INNER JOIN
|
|
36
|
+
|
|
37
|
+
Assume `orders` (id, user_id, amount) and `users` (id, name). Fetch all orders with the user's name.
|
|
38
|
+
|
|
39
|
+
<!-- hint:diagram mermaid-type="flowchart" topic="INNER JOIN vs LEFT JOIN — matching rows only vs all left rows" -->
|
|
40
|
+
|
|
41
|
+
**Task:** Write an INNER JOIN that returns `order_id`, `amount`, `user_name`.
|
|
42
|
+
|
|
43
|
+
**Question:** What happens to orders that have a `user_id` pointing to a deleted user? Would they appear? What about users with no orders?
|
|
44
|
+
|
|
45
|
+
**Checkpoint:** The user understands INNER JOIN returns only matching rows.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Step 4: LEFT JOIN
|
|
50
|
+
|
|
51
|
+
<!-- hint:code language="sql" highlight="1,5" -->
|
|
52
|
+
|
|
53
|
+
**Task:** Write a query that lists **all** users and their order count (0 if none). Use LEFT JOIN and COUNT.
|
|
54
|
+
|
|
55
|
+
**Question:** Why does a LEFT JOIN from users to orders give us users with zero orders, while INNER JOIN would not?
|
|
56
|
+
|
|
57
|
+
**Checkpoint:** The user can use LEFT JOIN and understands NULL for non-matching right rows.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Step 5: GROUP BY and Aggregation
|
|
62
|
+
|
|
63
|
+
**Task:** Write queries to:
|
|
64
|
+
- Count orders per user
|
|
65
|
+
- Sum order amount per user
|
|
66
|
+
- Find users whose total order amount exceeds 500 (use HAVING)
|
|
67
|
+
|
|
68
|
+
**Question:** What's the difference between WHERE and HAVING? Can you use aggregate functions in WHERE?
|
|
69
|
+
|
|
70
|
+
**Checkpoint:** The user understands GROUP BY and HAVING.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 6: Subqueries
|
|
75
|
+
|
|
76
|
+
**Task:** Find all users who have placed at least one order over 100. Use a subquery with IN.
|
|
77
|
+
|
|
78
|
+
**Question:** Could you write this with a JOIN instead? When is a subquery clearer vs when is a JOIN better?
|
|
79
|
+
|
|
80
|
+
**Checkpoint:** The user can write an IN subquery and compare it to JOINs.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Step 7: Schema Design
|
|
85
|
+
|
|
86
|
+
<!-- hint:celebrate -->
|
|
87
|
+
|
|
88
|
+
**Task:** Design tables for a simple blog: authors, posts, comments. Identify primary keys and foreign keys. Sketch the relationships.
|
|
89
|
+
|
|
90
|
+
**Question:** How do you decide when to normalize (split tables) vs denormalize (keep redundant data)? What problem does normalization solve?
|
|
91
|
+
|
|
92
|
+
**Checkpoint:** The user can design a minimal normalized schema with PKs and FKs.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# SQL Fundamentals — Interactive Workshop Scenarios
|
|
2
|
+
# Uses SQLite. Setup creates DB files; student writes queries in queries.sql.
|
|
3
|
+
|
|
4
|
+
scenarios:
|
|
5
|
+
- id: basic-select
|
|
6
|
+
title: "SELECT with WHERE"
|
|
7
|
+
difficulty: beginner
|
|
8
|
+
xp: 20
|
|
9
|
+
setup:
|
|
10
|
+
- "mkdir -p basic-select && cd basic-select"
|
|
11
|
+
- "sqlite3 workshop.db \"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, role TEXT); INSERT INTO users VALUES (1, 'Alice', 'alice@example.com', 'admin'); INSERT INTO users VALUES (2, 'Bob', 'bob@example.com', 'user'); INSERT INTO users VALUES (3, 'Carol', 'carol@example.com', 'user'); INSERT INTO users VALUES (4, 'Dave', 'dave@example.com', 'guest'); INSERT INTO users VALUES (5, 'Eve', 'eve@example.com', 'admin');\""
|
|
12
|
+
files:
|
|
13
|
+
- name: queries.sql
|
|
14
|
+
content: |
|
|
15
|
+
-- Write a SELECT query that returns users with role = 'admin'
|
|
16
|
+
-- Run with: sqlite3 workshop.db < queries.sql
|
|
17
|
+
language: sql
|
|
18
|
+
readonly: false
|
|
19
|
+
task: "Write a SELECT query that returns only users whose role is 'admin'. Run it with sqlite3 workshop.db < queries.sql. You should see Alice and Eve."
|
|
20
|
+
validations:
|
|
21
|
+
- label: "Query returns admin users"
|
|
22
|
+
check: output-contains
|
|
23
|
+
pattern: "Alice|Eve"
|
|
24
|
+
hints:
|
|
25
|
+
- "Use SELECT * FROM users WHERE role = 'admin';"
|
|
26
|
+
- "Remember the semicolon at the end of your query."
|
|
27
|
+
- "You can also SELECT specific columns: SELECT name, email FROM users WHERE role = 'admin';"
|
|
28
|
+
agent_prompts:
|
|
29
|
+
on_start: "You have five users. How would you pick only those with role 'admin'? What part of SQL filters rows?"
|
|
30
|
+
|
|
31
|
+
- id: joins
|
|
32
|
+
title: "JOIN Queries"
|
|
33
|
+
difficulty: beginner
|
|
34
|
+
xp: 25
|
|
35
|
+
setup:
|
|
36
|
+
- "mkdir -p joins && cd joins"
|
|
37
|
+
- "sqlite3 workshop.db \"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT, amount REAL); INSERT INTO users VALUES (1, 'Alice'); INSERT INTO users VALUES (2, 'Bob'); INSERT INTO users VALUES (3, 'Carol'); INSERT INTO orders VALUES (1, 1, 'Widget', 29.99); INSERT INTO orders VALUES (2, 1, 'Gadget', 49.99); INSERT INTO orders VALUES (3, 2, 'Widget', 29.99); INSERT INTO orders VALUES (4, 3, 'Thing', 19.99);\""
|
|
38
|
+
files:
|
|
39
|
+
- name: queries.sql
|
|
40
|
+
content: |
|
|
41
|
+
-- Write a JOIN query to show each order with the customer's name
|
|
42
|
+
-- Run with: sqlite3 workshop.db < queries.sql
|
|
43
|
+
language: sql
|
|
44
|
+
readonly: false
|
|
45
|
+
task: "Write an INNER JOIN query that returns each order's id, product, amount, and the user's name. The orders table has user_id linking to users.id. Run with sqlite3 workshop.db < queries.sql."
|
|
46
|
+
validations:
|
|
47
|
+
- label: "JOIN returns order and user data"
|
|
48
|
+
check: output-contains
|
|
49
|
+
pattern: "Alice|Bob|Carol"
|
|
50
|
+
hints:
|
|
51
|
+
- "INNER JOIN connects rows from two tables: SELECT orders.id, orders.product, orders.amount, users.name FROM orders JOIN users ON orders.user_id = users.id;"
|
|
52
|
+
- "Alias tables for brevity: FROM orders o JOIN users u ON o.user_id = u.id"
|
|
53
|
+
- "You should see 4 rows — one per order, each with a customer name."
|
|
54
|
+
agent_prompts:
|
|
55
|
+
on_start: "Orders have user_id but not the user's name. How can you combine data from two tables in one query?"
|
|
56
|
+
|
|
57
|
+
- id: group-by
|
|
58
|
+
title: "GROUP BY and Aggregation"
|
|
59
|
+
difficulty: intermediate
|
|
60
|
+
xp: 30
|
|
61
|
+
setup:
|
|
62
|
+
- "mkdir -p group-by && cd group-by"
|
|
63
|
+
- "sqlite3 workshop.db \"CREATE TABLE sales (id INTEGER PRIMARY KEY, region TEXT, product TEXT, amount REAL); INSERT INTO sales VALUES (1, 'North', 'A', 100); INSERT INTO sales VALUES (2, 'North', 'A', 150); INSERT INTO sales VALUES (3, 'North', 'B', 80); INSERT INTO sales VALUES (4, 'South', 'A', 120); INSERT INTO sales VALUES (5, 'South', 'B', 90); INSERT INTO sales VALUES (6, 'South', 'B', 110);\""
|
|
64
|
+
files:
|
|
65
|
+
- name: queries.sql
|
|
66
|
+
content: |
|
|
67
|
+
-- Write a query that groups by region and product, sums amount,
|
|
68
|
+
-- and only includes groups where the sum is >= 200
|
|
69
|
+
-- Run with: sqlite3 workshop.db < queries.sql
|
|
70
|
+
language: sql
|
|
71
|
+
readonly: false
|
|
72
|
+
task: "Write a GROUP BY query that shows total sales amount per region and product. Add a HAVING clause to show only groups where the total is 200 or more. Run with sqlite3 workshop.db < queries.sql."
|
|
73
|
+
validations:
|
|
74
|
+
- label: "GROUP BY with HAVING returns aggregated results"
|
|
75
|
+
check: output-contains
|
|
76
|
+
pattern: "North|250|South"
|
|
77
|
+
hints:
|
|
78
|
+
- "GROUP BY region, product with SUM(amount)."
|
|
79
|
+
- "HAVING filters after aggregation: HAVING SUM(amount) >= 200"
|
|
80
|
+
- "North,A = 250; South,B = 200. Both should appear."
|
|
81
|
+
agent_prompts:
|
|
82
|
+
on_start: "You want totals per region and product. What does GROUP BY do? And when would you use HAVING instead of WHERE?"
|
|
83
|
+
|
|
84
|
+
- id: subqueries
|
|
85
|
+
title: "Correlated Subqueries"
|
|
86
|
+
difficulty: intermediate
|
|
87
|
+
xp: 35
|
|
88
|
+
setup:
|
|
89
|
+
- "mkdir -p subqueries && cd subqueries"
|
|
90
|
+
- "sqlite3 workshop.db \"CREATE TABLE categories (id INTEGER PRIMARY KEY, name TEXT); CREATE TABLE products (id INTEGER PRIMARY KEY, category_id INTEGER, name TEXT, price REAL); INSERT INTO categories VALUES (1, 'Electronics'); INSERT INTO categories VALUES (2, 'Books'); INSERT INTO products VALUES (1, 1, 'Laptop', 999); INSERT INTO products VALUES (2, 1, 'Phone', 599); INSERT INTO products VALUES (3, 2, 'SQL Book', 39); INSERT INTO products VALUES (4, 2, 'React Book', 49);\""
|
|
91
|
+
files:
|
|
92
|
+
- name: queries.sql
|
|
93
|
+
content: |
|
|
94
|
+
-- Write a correlated subquery to find products priced above
|
|
95
|
+
-- their category's average
|
|
96
|
+
-- Run with: sqlite3 workshop.db < queries.sql
|
|
97
|
+
language: sql
|
|
98
|
+
readonly: false
|
|
99
|
+
task: "Write a correlated subquery that returns products whose price is above the average price for their category. Electronics avg = 799; Books avg = 44. You should get Laptop (999) and React Book (49). Run with sqlite3 workshop.db < queries.sql."
|
|
100
|
+
validations:
|
|
101
|
+
- label: "Correlated subquery returns correct products"
|
|
102
|
+
check: output-contains
|
|
103
|
+
pattern: "Laptop|React"
|
|
104
|
+
hints:
|
|
105
|
+
- "A correlated subquery references the outer query: WHERE price > (SELECT AVG(price) FROM products p2 WHERE p2.category_id = products.category_id)"
|
|
106
|
+
- "The subquery runs once per row in the outer query."
|
|
107
|
+
- "Laptop (999) > 799; React Book (49) > 44. Both qualify."
|
|
108
|
+
agent_prompts:
|
|
109
|
+
on_start: "How would you find the average price per category? Now, how would you compare each product's price to that average?"
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Stakeholder Communication — Status Updates That Actually Help
|
|
2
|
+
|
|
3
|
+
<!-- hint:slides topic="Stakeholder communication: audience mapping, pyramid principle, RAG status, power-interest grid, and update templates" slides="5" -->
|
|
4
|
+
|
|
5
|
+
## Know Your Audience
|
|
6
|
+
|
|
7
|
+
Different stakeholders want different information:
|
|
8
|
+
|
|
9
|
+
| Audience | Cares Most About |
|
|
10
|
+
|----------|------------------|
|
|
11
|
+
| **Executives** | Outcomes, timeline, risks, decisions needed |
|
|
12
|
+
| **Engineers** | Technical blockers, dependencies, scope |
|
|
13
|
+
| **Product** | Scope, priorities, trade-offs |
|
|
14
|
+
| **Customers** | When, what's new, what's fixed |
|
|
15
|
+
|
|
16
|
+
Tailor your update to who's reading. An exec doesn't need Jira ticket IDs; an engineer might. One update can have sections for different audiences, or you send different versions.
|
|
17
|
+
|
|
18
|
+
## The Pyramid Principle
|
|
19
|
+
|
|
20
|
+
**Lead with the conclusion.** Put the most important point first, then support it.
|
|
21
|
+
|
|
22
|
+
**Weak:** "We ran tests. We found some issues. We're fixing them. We might slip by a week."
|
|
23
|
+
|
|
24
|
+
**Strong:** "We're at risk of slipping the release by one week due to integration test failures. We've identified 3 blockers and are addressing them; next update in 48 hours."
|
|
25
|
+
|
|
26
|
+
Executives and busy stakeholders skim. If they read only the first line, they should get the takeaway.
|
|
27
|
+
|
|
28
|
+
## RAG Status (Red / Amber / Green)
|
|
29
|
+
|
|
30
|
+
| Status | Meaning |
|
|
31
|
+
|--------|---------|
|
|
32
|
+
| **Green** | On track. No major issues. |
|
|
33
|
+
| **Amber** | At risk. Issues exist; we're working on them. Needs attention. |
|
|
34
|
+
| **Red** | Off track. Significant problem. Intervention may be needed. |
|
|
35
|
+
|
|
36
|
+
Use RAG consistently. If everything is always green, you lose credibility. If everything is red, you create alarm fatigue. Amber is your workhorse—"we're managing it."
|
|
37
|
+
|
|
38
|
+
## Effective Status Update Structure
|
|
39
|
+
|
|
40
|
+
A good status update answers four questions:
|
|
41
|
+
|
|
42
|
+
1. **What happened?** — Completed, shipped, decided.
|
|
43
|
+
2. **What's next?** — Planned for this period.
|
|
44
|
+
3. **Blockers** — What's in the way?
|
|
45
|
+
4. **Risks** — What might go wrong? (and what we're doing about it)
|
|
46
|
+
|
|
47
|
+
Template:
|
|
48
|
+
|
|
49
|
+
```markdown
|
|
50
|
+
## Status — [Project/Release] | [Date]
|
|
51
|
+
**RAG:** [G/A/R]
|
|
52
|
+
|
|
53
|
+
### What happened
|
|
54
|
+
- [Completed item 1]
|
|
55
|
+
- [Completed item 2]
|
|
56
|
+
|
|
57
|
+
### What's next
|
|
58
|
+
- [Planned item 1]
|
|
59
|
+
- [Planned item 2]
|
|
60
|
+
|
|
61
|
+
### Blockers
|
|
62
|
+
- [Blocker + owner/ETA]
|
|
63
|
+
|
|
64
|
+
### Risks
|
|
65
|
+
- [Risk + mitigation]
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Communicating Bad News Early
|
|
69
|
+
|
|
70
|
+
Bad news does not improve with age. Surface delays, risks, and problems as soon as you have reasonable certainty. Early = more options. Late = fewer options and damaged trust.
|
|
71
|
+
|
|
72
|
+
**How to deliver bad news:**
|
|
73
|
+
1. State the fact clearly: "We're slipping the launch by 2 weeks."
|
|
74
|
+
2. Explain why: "Integration with the payment gateway took longer than estimated."
|
|
75
|
+
3. What you're doing: "We've parallelized the remaining work and added a second developer."
|
|
76
|
+
4. What you need: "We need a go/no-go on scope by Friday."
|
|
77
|
+
|
|
78
|
+
Don't bury it. Don't wait for the "perfect" moment. Communicate early.
|
|
79
|
+
|
|
80
|
+
## Managing Expectations
|
|
81
|
+
|
|
82
|
+
- **Under-promise, over-deliver** — Better to surprise with early delivery than late.
|
|
83
|
+
- **Set checkpoints** — "We'll know by Wednesday whether we're on track."
|
|
84
|
+
- **Be explicit about assumptions** — "This assumes no further API changes from the vendor."
|
|
85
|
+
- **Call out dependencies** — "We're blocked until Legal approves the contract."
|
|
86
|
+
|
|
87
|
+
When stakeholders have clear expectations, they're less likely to be surprised or frustrated.
|
|
88
|
+
|
|
89
|
+
## Stakeholder Mapping (Power / Interest Grid)
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
quadrantChart
|
|
93
|
+
title Stakeholder Power-Interest Grid
|
|
94
|
+
x-axis Low Interest --> High Interest
|
|
95
|
+
y-axis Low Power --> High Power
|
|
96
|
+
quadrant-1 Manage closely
|
|
97
|
+
quadrant-2 Keep informed
|
|
98
|
+
quadrant-3 Monitor
|
|
99
|
+
quadrant-4 Keep satisfied
|
|
100
|
+
"Executive Sponsor": [0.9, 0.9]
|
|
101
|
+
"Engineering Lead": [0.8, 0.7]
|
|
102
|
+
"End Users": [0.6, 0.3]
|
|
103
|
+
"Legal": [0.2, 0.5]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
| | Low Interest | High Interest |
|
|
107
|
+
|---|--------------|---------------|
|
|
108
|
+
| **High Power** | Keep satisfied | Manage closely |
|
|
109
|
+
| **Low Power** | Monitor | Keep informed |
|
|
110
|
+
|
|
111
|
+
- **Manage closely** — Regular, rich updates. Involve in decisions.
|
|
112
|
+
- **Keep informed** — Periodic updates. Don't overwhelm.
|
|
113
|
+
- **Keep satisfied** — Don't annoy; ensure no unpleasant surprises.
|
|
114
|
+
- **Monitor** — Light touch. Watch for changes.
|
|
115
|
+
|
|
116
|
+
## Meeting Cadence
|
|
117
|
+
|
|
118
|
+
| Stakeholder Type | Cadence | Format |
|
|
119
|
+
|------------------|---------|--------|
|
|
120
|
+
| Core team | Daily / every other day | Standup, Slack |
|
|
121
|
+
| Product / Eng leads | Weekly | Written + sync |
|
|
122
|
+
| Executives | Bi-weekly / monthly | Written (pyramid); optional 15-min call |
|
|
123
|
+
| Customers | Milestone-based | Release notes, blog, email |
|
|
124
|
+
|
|
125
|
+
Match cadence to need. More frequent = more overhead. Less frequent = more surprise risk.
|
|
126
|
+
|
|
127
|
+
## Written vs Verbal
|
|
128
|
+
|
|
129
|
+
| Written | Verbal |
|
|
130
|
+
|---------|--------|
|
|
131
|
+
| Asynchronous, scalable | Real-time, interactive |
|
|
132
|
+
| Permanent record | Nuance, Q&A |
|
|
133
|
+
| Good for: status, decisions, specs | Good for: alignment, sensitive topics, complex trade-offs |
|
|
134
|
+
|
|
135
|
+
For status: **written first**. Follow up with a call for anything sensitive or contentious. Written updates create a paper trail and let people read when ready.
|
|
136
|
+
|
|
137
|
+
## Avoiding Information Overload
|
|
138
|
+
|
|
139
|
+
- **One page max** for exec summaries.
|
|
140
|
+
- **Bullet points** over paragraphs.
|
|
141
|
+
- **RAG + key points** — Let them drill down if interested.
|
|
142
|
+
- **Link to details** — Don't put everything in the email.
|
|
143
|
+
- **Consistent format** — Same structure every time so people know where to look.
|
|
144
|
+
|
|
145
|
+
## Status Update Template (Full)
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
# [Project] — Status | [Week of DATE]
|
|
149
|
+
**RAG:** [G/A/R] | **Next milestone:** [Date]
|
|
150
|
+
|
|
151
|
+
## TL;DR
|
|
152
|
+
[One sentence: on track / at risk / off track + why]
|
|
153
|
+
|
|
154
|
+
## Completed
|
|
155
|
+
- [Item 1]
|
|
156
|
+
- [Item 2]
|
|
157
|
+
|
|
158
|
+
## In Progress
|
|
159
|
+
- [Item + owner]
|
|
160
|
+
- [Item + owner]
|
|
161
|
+
|
|
162
|
+
## Next
|
|
163
|
+
- [Item 1]
|
|
164
|
+
- [Item 2]
|
|
165
|
+
|
|
166
|
+
## Blockers
|
|
167
|
+
- [Blocker] — Owner: [Name] — ETA: [Date]
|
|
168
|
+
|
|
169
|
+
## Risks
|
|
170
|
+
- [Risk] — Mitigation: [What we're doing]
|
|
171
|
+
|
|
172
|
+
## Decisions needed
|
|
173
|
+
- [Decision] — By: [Date]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Communicating Delays
|
|
177
|
+
|
|
178
|
+
When you need to announce a slip:
|
|
179
|
+
|
|
180
|
+
1. **Lead with it** — "Release delayed by 2 weeks. New date: March 28."
|
|
181
|
+
2. **Cause** — "Integration testing revealed issues we're fixing."
|
|
182
|
+
3. **Impact** — "Q1 target unchanged; we're compressing the next phase."
|
|
183
|
+
4. **Plan** — "Added QA capacity; daily standup with vendor."
|
|
184
|
+
5. **Ask** — "Need approval to descope analytics from this release."
|
|
185
|
+
|
|
186
|
+
Clear, direct, with a path forward.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Stakeholder Communication — Exercises
|
|
2
|
+
|
|
3
|
+
## Exercise 1: Pyramid Principle Rewrite
|
|
4
|
+
|
|
5
|
+
**Task:** Take this status: "We've been working on the integration. There were some issues. We're fixing them. We might be a week late." Rewrite it using the pyramid principle. Lead with the conclusion. Max 3 sentences.
|
|
6
|
+
|
|
7
|
+
**Validation:**
|
|
8
|
+
- [ ] First sentence is the takeaway (delay + cause or implication)
|
|
9
|
+
- [ ] Supporting detail follows
|
|
10
|
+
- [ ] Total ≤ 3 sentences
|
|
11
|
+
- [ ] Reader gets the point from line 1
|
|
12
|
+
|
|
13
|
+
**Hints:**
|
|
14
|
+
1. Lead: "We're at risk of slipping by one week due to integration issues."
|
|
15
|
+
2. Support: "We've identified and are addressing 3 blockers."
|
|
16
|
+
3. Optional: "Next update in 48 hours."
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Exercise 2: RAG Assignment
|
|
21
|
+
|
|
22
|
+
**Task:** Assign RAG to these: (A) On track, demo next week. (B) Key vendor delayed; we have a fallback. (C) Major bug in prod; fix in progress. (D) Scope increased 30%; no timeline change. For each, write one sentence you'd include in a status.
|
|
23
|
+
|
|
24
|
+
**Validation:**
|
|
25
|
+
- [ ] A = Green, B = Amber, C = Red or Amber, D = Amber or Red
|
|
26
|
+
- [ ] Each has a status-appropriate sentence
|
|
27
|
+
- [ ] No alarmist language for B; no understatement for C
|
|
28
|
+
|
|
29
|
+
**Hints:**
|
|
30
|
+
1. A: Green—"On track for demo next week."
|
|
31
|
+
2. B: Amber—"Vendor delay; fallback plan in place; monitoring."
|
|
32
|
+
3. C: Red or Amber—"Critical bug; fix deployed in 4h; root cause analysis underway."
|
|
33
|
+
4. D: Amber—"Scope +30%; reviewing timeline and resources."
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Exercise 3: Stakeholder Map
|
|
38
|
+
|
|
39
|
+
**Task:** For a "password reset" feature: list 4 stakeholders (e.g., Exec, Eng Lead, Support, Security). Plot on power/interest. For the highest-power, highest-interest one: what do they need in a status update?
|
|
40
|
+
|
|
41
|
+
**Validation:**
|
|
42
|
+
- [ ] 4 stakeholders named
|
|
43
|
+
- [ ] Plotted on grid
|
|
44
|
+
- [ ] "Manage closely" needs described
|
|
45
|
+
- [ ] Needs are specific (not "they need updates")
|
|
46
|
+
|
|
47
|
+
**Hints:**
|
|
48
|
+
1. Exec: outcomes, timeline, risks, decisions
|
|
49
|
+
2. Eng Lead: technical blockers, dependencies
|
|
50
|
+
3. Support: when it ships, what changes for users
|
|
51
|
+
4. Security: compliance, audit trail
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Exercise 4: Delay Communication
|
|
56
|
+
|
|
57
|
+
**Task:** Your "Search v2" release is slipping 2 weeks. Cause: performance issues under load. Write a 5-sentence message to the Product VP. Include: delay, cause, impact, plan, ask.
|
|
58
|
+
|
|
59
|
+
**Validation:**
|
|
60
|
+
- [ ] Delay and new date stated up front
|
|
61
|
+
- [ ] Cause is clear
|
|
62
|
+
- [ ] Impact (what it means) stated
|
|
63
|
+
- [ ] Plan (what you're doing) included
|
|
64
|
+
- [ ] Ask or next step present
|
|
65
|
+
|
|
66
|
+
**Hints:**
|
|
67
|
+
1. "Search v2 delayed 2 weeks. New target: [date]."
|
|
68
|
+
2. "Cause: performance issues under load in testing."
|
|
69
|
+
3. "Impact: Q2 demo still feasible; later phases unchanged."
|
|
70
|
+
4. "Plan: perf sprint this week; load tests in CI."
|
|
71
|
+
5. "Ask: Confirm scope for v2 by Friday."
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Exercise 5: Two-Version Status
|
|
76
|
+
|
|
77
|
+
**Task:** Write one status for a "Payment integration" project. Create (1) Exec summary: 4 bullets, pyramid. (2) Eng Lead version: same content + technical blockers, dependencies, and decisions needed.
|
|
78
|
+
|
|
79
|
+
**Validation:**
|
|
80
|
+
- [ ] Exec: ≤ 4 bullets, outcome-focused
|
|
81
|
+
- [ ] Eng: includes technical detail
|
|
82
|
+
- [ ] Both share the same RAG and core facts
|
|
83
|
+
- [ ] Eng version is longer but still scannable
|
|
84
|
+
|
|
85
|
+
**Hints:**
|
|
86
|
+
1. Exec: RAG, TL;DR, key milestone, top risk
|
|
87
|
+
2. Eng: + Stripe API version, test env blocker, auth handoff decision
|