code-reader-v2-cn
npx skills add https://github.com/notlate-cn/code-reader-skills --skill code-reader-v2-cn
Agent 安装分布
Skill 文档
æºä»£ç 深度çè§£åæå¨ v2.3 (Code Deep Understanding Analyzer – 䏿ç)
åºäºè®¤ç¥ç§å¦ç ç©¶çä¸ä¸ä»£ç åæå·¥å ·ï¼æ¯æä¸ç§åææ·±åº¦ï¼ç¡®ä¿çæ£ç解代ç ï¼èéäº§çæµç å¹»è§ã
ä¸ç§åææ¨¡å¼
| ç¨æ·æå¾ | æ¨èæ¨¡å¼ | 触åè¯ç¤ºä¾ | åææ¶é¿ |
|---|---|---|---|
| å¿«éæµè§/代ç å®¡æ¥ | Quick Mode | “å¿«éçä¸ä¸”ã”è¿æ®µä»£ç å¹²åç”ã”ç®åæ«ä¸ç¼” | 5-10 åé |
| å¦ä¹ çè§£/ææ¯è°ç | Standard Mode â | “åæä¸ä¸”ã”帮æçè§£”ã”è§£éä¸ä¸”ã”ä»ä¹åç” | 15-20 åé |
| æ·±åº¦ææ¡/大åé¡¹ç® | Deep Mode ð | “å½»åºåæ”ã”å®å ¨ææ¡”ã”æ·±å ¥ç ç©¶”ã”é¢è¯å夔ã”é¡¹ç®æ´ä½åæ” | 30+ åé |
é»è®¤ä½¿ç¨ Standard Modeï¼ç³»ç»ä¼æ ¹æ®ä»£ç è§æ¨¡åç¨æ·æå¾èªå¨éæ©æåéçæ¨¡å¼ã
ð Deep Mode å 鍿ºè½çç¥ï¼
- 代ç ⤠2000 è¡ï¼ä½¿ç¨æ¸è¿å¼çæï¼é¡ºåºå¡«å ç« èï¼
- 代ç > 2000 è¡ï¼èªå¨å¯ç¨å¹¶è¡å¤çï¼å Agent å¹¶è¡åæåç« èï¼
æ ¸å¿å²å¦ï¼çè§£ä¼å ï¼è®°å¿å ¶æ¬¡
åæµç å¹»è§ (Combat Fluency Illusion)
“è½è¯»æä»£ç â è½ååºä»£ç ”
“è½çæè§£é â è½ç¬ç«å®ç°”
“æè§æç½äº â ççç解五
æ ¸å¿ååï¼
- ç解为ä»ä¹ (WHY)ï¼èéåªç¥éæ¯ä»ä¹ (WHAT)
- 强å¶èªæè§£éï¼éªè¯çå®çè§£ç¨åº¦
- å»ºç«æ¦å¿µè¿æ¥ï¼èéå¤ç«è®°å¿
- éè¿åºç¨åä½ï¼æµè¯è¿ç§»è½å
ç ç©¶æ¯æï¼
- Dunlosky et al. – ç²¾ç»è¯¢é®æ³æææ¾èä¼äºè¢«å¨é 读
- Chi et al. – èªæè§£éè è·å¾æ£ç¡®å¿æºæ¨¡åçæ¦çæ´é«
- Karpicke & Roediger – æ£ç´¢ç»ä¹ ä¼äºéå¤é 读 250%
åæåå¼ºå¶æ£æ¥ï¼çè§£éªè¯å ³å¡
æ ¹æ®éæ©ç模å¼ï¼æ§è¡ç¸åºçéªè¯æµç¨ï¼
Quick Mode – ç®åéªè¯
- å¿«éè¯å«ä»£ç ç±»ååæ ¸å¿åè½
- ååºå ³é®æ¦å¿µï¼æ éæ·±åº¦éªè¯ï¼
Standard Mode – æ åéªè¯
- å¯¹æ ¸å¿æ¦å¿µè¿è¡èªæè§£éæµè¯
- éªè¯è½å¦è¯´åº”为ä»ä¹”
Deep Mode – 宿´éªè¯
- 宿´çèªæè§£éæµè¯
- åºç¨è¿ç§»è½åéªè¯
è¾åºæ ¼å¼ï¼å¨åæææ¡£å¼å¤´ï¼ï¼
## çè§£éªè¯ç¶æ [ä»
Standard/Deep Mode]
| æ ¸å¿æ¦å¿µ | èªæè§£é | çè§£"为ä»ä¹" | åºç¨è¿ç§» | ç¶æ |
|---------|---------|-------------|---------|------|
| ç¨æ·è®¤è¯æµç¨ | â
| â
| â
| å·²çè§£ |
| JWT Token æºå¶ | â
| â ï¸ | â | â ï¸ éæ·±å
¥çè§£ |
| å¯ç åå¸ | â
| â
| â ï¸ | åºæ¬çè§£ |
ä¸ç§æ¨¡å¼çè¾åºç»æ
Quick Mode è¾åºç»æï¼5-10 åéï¼
# [代ç åç§°] å¿«éåæ
## 1. å¿«éæ¦è§
- ç¼ç¨è¯è¨åçæ¬
- 代ç è§æ¨¡åç±»å
- æ ¸å¿ä¾èµ
## 2. åè½è¯´æ
- 主è¦åè½æ¯ä»ä¹ (WHAT)
- ç®è¦è¯´æ WHY éè¦
## 3. æ ¸å¿ç®æ³/设计
- ç®æ³å¤æåº¦ï¼å¦æï¼
- 使ç¨ç设计模å¼ï¼å¦æï¼
- WHY éæ©è¿ä¸ªç®æ³/模å¼
## 4. å
³é®ä»£ç 段
- 3-5 ä¸ªæ ¸å¿ä»£ç 段
- æ¯æ®µç®è¦è¯´æä½ç¨
## 5. ä¾èµå
³ç³»
- å¤é¨åºå表åç¨é
## 6. å¿«é使ç¨ç¤ºä¾
- ç®åå¯è¿è¡ç示ä¾
Standard Mode è¾åºç»æï¼15-20 åéï¼âæ¨è
# [代ç åç§°] 深度çè§£åæ
## çè§£éªè¯ç¶æ
[èªæè§£éæµè¯ç»æè¡¨æ ¼]
## 1. å¿«éæ¦è§
- ç¼ç¨è¯è¨ãè§æ¨¡ãä¾èµ
## 2. èæ¯ä¸å¨æºï¼ç²¾ç»è¯¢é®ï¼
- WHY éè¦è¿æ®µä»£ç
- WHY éæ©è¿ç§æ¹æ¡
- WHY ä¸éå
¶ä»æ¹æ¡
## 3. æ ¸å¿æ¦å¿µè¯´æ
- ååºå
³é®æ¦å¿µ
- æ¯ä¸ªæ¦å¿µåç 2-3 个 WHY
## 4. ç®æ³ä¸ç论
- å¤æåº¦åæ
- WHY éæ©è¿ä¸ªç®æ³
- åèèµæ
## 5. 设计模å¼
- è¯å«ç模å¼
- WHY 使ç¨
## 6. å
³é®ä»£ç 深度解æ
- éè¡ WHY è§£æ
- æ§è¡æµç¨ç¤ºä¾
## 7. ä¾èµä¸ä½¿ç¨ç¤ºä¾
- 详ç»ç WHY 注é
Deep Mode è¾åºç»æï¼30+ åéï¼
Deep Mode æ ¹æ®ä»£ç è§æ¨¡èªå¨éæ©æä¼çç¥ï¼ç¡®ä¿æ¯ä¸ªç« èé½æè¶³å¤æ·±åº¦ï¼
çç¥ Aï¼æ¸è¿å¼çæï¼ä»£ç ⤠2000 è¡ï¼
éç¨äºä¸å°å代ç ï¼é¡ºåºçæåç« èï¼
# [代ç åç§°] å®å
¨ææ¡åæ
[å
å« Standard Mode ææå
容ï¼å ä¸ä»¥ä¸é¨å]
## 3+. æ¦å¿µç½ç»å¾
- æ ¸å¿æ¦å¿µæ¸
åï¼æ¯ä¸ª 3 WHYï¼
- æ¦å¿µå
³ç³»ç©éµ
- è¿æ¥å°å·²æç¥è¯
## 6+. 宿´æ§è¡ç¤ºä¾
- å¤åºæ¯æ§è¡æµç¨
- è¾¹çæ¡ä»¶è¯´æ
- æéç¹æ 注
## 8. æµè¯ç¨ä¾åæï¼å¦ä»£ç å
嫿µè¯ï¼
- æµè¯æä»¶æ¸
åä¸è¦çåæ
- 仿µè¯ä¸åç°çè¾¹çæ¡ä»¶
- æµè¯é©±å¨ççè§£éªè¯
## 9. åºç¨è¿ç§»åºæ¯ï¼è³å° 2 个ï¼
- åºæ¯ 1ï¼ä¸ååç + ä¿®æ¹é¨å + WHY
- åºæ¯ 2ï¼ä¸ååç + ä¿®æ¹é¨å + WHY
- æåéç¨æ¨¡å¼
## 10. ä¾èµå
³ç³»ä¸ä½¿ç¨ç¤ºä¾
- 详ç»ç WHY 注é
## 11. è´¨ééªè¯æ¸
å
- ç解深度éªè¯
- ææ¯åç¡®æ§éªè¯
- å®ç¨æ§éªè¯
- æç»"åè½"æµè¯
çç¥ Bï¼å¹¶è¡å¤çï¼ä»£ç > 2000 è¡ï¼ð
éç¨äºå¤§å项ç®ï¼ä½¿ç¨å Agent å¹¶è¡æ¶æï¼
æ ¸å¿æ¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 主åè° Agent â
â - çæåæå¤§çº²åç®å½æ¡æ¶ â
â - è¯å«æ ¸å¿æ¦å¿µå表ï¼ä¾å Agent å
±äº«ï¼ â
â - åé
ç« èä»»å¡ â
â - æ±æ»å Agent ç»æ â
â - æç»è´¨ééªè¯ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââ¼ââââââââââââââââââ
â¼ â¼ â¼
âââââââââââââââ âââââââââââââââ âââââââââââââââ
â å Agent 1 â â å Agent 2 â â å Agent 3 â
â èæ¯ä¸å¨æº â â æ ¸å¿æ¦å¿µ â â ç®æ³ç论 â
âââââââââââââââ âââââââââââââââ âââââââââââââââ
â â â
âââââââââââââââââââ¼ââââââââââââââââââ
â¼
âââââââââââââââ âââââââââââââââ âââââââââââââââ
â å Agent 4 â â å Agent 5 â â å Agent 6 â
â è®¾è®¡æ¨¡å¼ â â 代ç è§£æ â â åºç¨è¿ç§» â
âââââââââââââââ âââââââââââââââ âââââââââââââââ
å¹¶è¡æ§è¡æµç¨
| é¶æ®µ | æ§è¡è | æä½ | è¾åº |
|---|---|---|---|
| 1. æ¡æ¶åå¤ | 主 Agent | å¿«éæ¦è§ä»£ç ï¼çæå¤§çº²åæ ¸å¿æ¦å¿µå表 | æ¡æ¶.md |
| 2. ä»»å¡åå | 主 Agent | 为æ¯ä¸ªç« èå建ç¬ç«ä»»å¡æè¿° | ä»»å¡å表 |
| 3. å¹¶è¡å¤ç | å Agents | æ¯ä¸ªå Agent 䏿³¨ä¸ä¸ªç« èï¼æ·±åº¦çæ | ç« è-N.md |
| 4. ç»ææ±æ» | 主 Agent | åå¹¶ææç« èï¼ç»ä¸æ ¼å¼ | 宿´åæ.md |
| 5. è´¨ééªè¯ | 主 Agent | æ£æ¥æ·±åº¦æ åï¼è¡¥å èå¼±é¨å | æç»ææ¡£ |
ç« èä»»å¡å®ä¹ï¼ç»å Agent çæä»¤æ¨¡æ¿ï¼
# å Agent ä»»å¡ï¼[ç« èåç§°]
## ä¸ä¸æä¿¡æ¯
- **代ç åç§°ï¼** [项ç®/代ç å]
- **ç¼ç¨è¯è¨ï¼** [è¯è¨]
- **代ç è§æ¨¡ï¼** [è¡æ°]
- **æ ¸å¿æ¦å¿µï¼** [ä»ä¸» Agent ä¼ éçæ¦å¿µå表]
## ä½ çä»»å¡
ä½ æ¯ä¸é¨è´è´£"**[ç« èåç§°]**"ç« èçåæä¸å®¶ã请深度åæè¿ä¸ªç« èï¼çæè¯¦ç»å
容ã
## è¾åºè¦æ±
1. **å
容深度ï¼** æ¬ç« èè³å° [X] å
2. **WHY åæï¼** æ¯ä¸ªå
³é®ç¹å¿
é¡»åç 3 个 WHY
3. **ä»£ç æ³¨éï¼** 使ç¨åºæ¯/æ¥éª¤ + WHY 飿 ¼
4. **å¼ç¨æ¥æºï¼** æä¾æå¨åè龿¥
5. **ç¬ç«æ§ï¼** çæå®æ´ç¬ç«çç« èå
容ï¼ä¸éè¦å¼ç¨å
¶ä»ç« è
## è¾åºæ ¼å¼
ç´æ¥è¾åº Markdown æ ¼å¼çç« èå
容ï¼ä»¥ `## [ç« èåç§°]` å¼å¤´ã
## 深度æ å
- [ ] ææå项é½å·²è¦çï¼ä¸è½æ"ç¥"æ"åä¸"ï¼
- [ ] æ¯ä¸ª WHY è³å° 2-3 å¥è¯è§£é
- [ ] 代ç ç¤ºä¾æå®æ´æ³¨é
- [ ] æ§è¡æµç¨æå
·ä½æ°æ®è¿½è¸ª
å¼å§åæï¼
主 Agent æ±æ»é»è¾
# Parallel Deep Mode æ±æ»è§è
## æ±æ»æ¥éª¤
1. **è¯»åææåç« è**
ç« è_1_èæ¯ä¸å¨æº.md ç« è_2_æ ¸å¿æ¦å¿µ.md ç« è_3_ç®æ³ç论.md ç« è_4_设计模å¼.md ç« è_5_代ç è§£æ.md ç« è_6_æµè¯ç¨ä¾åæ.mdï¼å¦æï¼ ç« è_7_åºç¨è¿ç§».md ç« è_8_ä¾èµå ³ç³».md ç« è_9_è´¨ééªè¯.md
2. **å并顺åº**
```markdown
# [代ç åç§°] å®å
¨ææ¡åæï¼å¹¶è¡æ·±åº¦çï¼
## çè§£éªè¯ç¶æ
[ä»ä¸» Agent ç忥åæçæ]
[æé¡ºåºæå
¥åç« èå
容]
-
äº¤åæ£æ¥
- æ ¸å¿æ¦å¿µå¨åç« èä¸å®ä¹ä¸è´
- WHY è§£éæ²¡æçç¾
- å¼ç¨ç代ç 示ä¾ä¸è´
-
深度éªè¯
- æ¯ç« åæ°è¾¾æ
- WHY åæå å
- æ§è¡ç¤ºä¾å®æ´
#### å®ç°ä¼ªä»£ç
彿°ï¼ParallelDeepMode(代ç , å·¥ä½ç®å½):
// ========== é¶æ®µ 1: æ¡æ¶åå¤ ========== æ¡æ¶ = { “代ç åç§°”: æååç§°(代ç ), “ç¼ç¨è¯è¨”: è¯å«è¯è¨(代ç ), “代ç è§æ¨¡”: ç»è®¡è¡æ°(代ç ), “æ ¸å¿æ¦å¿µ”: æåæ ¸å¿æ¦å¿µ(代ç ), // å ±äº«ç»ææå Agent “ç« èå表”: [ “èæ¯ä¸å¨æº”, “æ ¸å¿æ¦å¿µ”, “ç®æ³ä¸ç论”, “设计模弔, “å ³é®ä»£ç è§£æ”, “æµè¯ç¨ä¾åæ”, “åºç¨è¿ç§»åºæ¯”, “ä¾èµå ³ç³»”, “è´¨ééªè¯” ] }
åå ¥æä»¶(f”{å·¥ä½ç®å½}/00-æ¡æ¶.json”, æ¡æ¶)
// ========== é¶æ®µ 2: å建åä»»å¡ ========== åä»»å¡å表 = []
å¯¹äºæ¯ä¸ª ç« è in æ¡æ¶[“ç« èå表”]: ä»»å¡æè¿° = çæä»»å¡æ¨¡æ¿(ç« è, æ¡æ¶) 任塿件 = f”{å·¥ä½ç®å½}/tasks/{ç« è}-ä»»å¡.md” åå ¥æä»¶(任塿件, ä»»å¡æè¿°) åä»»å¡å表.append(任塿件)
// ========== é¶æ®µ 3: å¹¶è¡æ§è¡å Agent ========== // 注æï¼å®é æ§è¡æ¶éè¿ Task tool å建并è¡å Agent
ç« èæä»¶å表 = []
å¯¹äºæ¯ä¸ª 任塿件 in åä»»å¡å表: // å建å Agentï¼å¹¶è¡æ§è¡ï¼ åAgent = å建Agent( åç§°: f”åæ-{ç« è}”, ä»»å¡: 读åæä»¶(任塿件), 代ç : 代ç , è¾åºæä»¶: f”{å·¥ä½ç®å½}/chapters/{ç« è}.md” )
// å¯å¨å¹¶è¡æ§è¡
åAgent.start(å¹¶è¡=True)
ç« èæä»¶å表.append(åAgent.è¾åºæä»¶)
// çå¾ ææå Agent 宿 çå¾ ææ(ç« èæä»¶å表)
// ========== é¶æ®µ 4: ç»ææ±æ» ========== 宿´ææ¡£ = “# {æ¡æ¶[‘代ç åç§°’]} å®å ¨ææ¡åæ\n\n” 宿´ææ¡£ += “## çè§£éªè¯ç¶æ\n\n” 宿´ææ¡£ += çæéªè¯è¡¨æ ¼(æ¡æ¶) + “\n\n”
å¯¹äºæ¯ä¸ª ç« èæä»¶ in ç« èæä»¶å表: ç« èå 容 = 读åæä»¶(ç« èæä»¶) 宿´ææ¡£ += ç« èå 容 + “\n\n”
// ========== é¶æ®µ 5: è´¨ééªè¯ ========== if not éè¿æ·±åº¦æ£æ¥(宿´ææ¡£): èå¼±ç« è = è¯å«èå¼±é¨å(宿´ææ¡£) å¯¹äº each ç« è in èå¼±ç« è: // éæ°æ§è¡è¯¥ç« èçå Agentï¼è¦æ±æ´æ·±åº¦çå 容 éæ°æ§è¡(ç« è) 宿´ææ¡£ = æ´æ°ç« è(宿´ææ¡£, ç« è)
// ========== æç»è¾åº ========== æç»æä»¶ = f”{å·¥ä½ç®å½}/{æ¡æ¶[‘代ç åç§°’]}-å®å ¨ææ¡åæ.md” åå ¥æä»¶(æç»æä»¶, 宿´ææ¡£)
return æç»æä»¶
---
## åææµç¨ï¼ç 究驱å¨ï¼
**æ¯ä¸ªç« èçæ·±åº¦æ åï¼**
```markdown
## æ·±åº¦èªæ£æ¸
åï¼æ¯ç« 宿忣æ¥ï¼
### å
容宿´æ§
- [ ] ç« èææå项é½å·²è¦çï¼ä¸è½æ"ç¥"æ"åä¸"ï¼
- [ ] æ¯ä¸ª WHY 齿å
·ä½è§£éï¼ä¸è½åªæä¸å¥è¯ï¼
- [ ] 代ç ç¤ºä¾æå®æ´æ³¨éï¼åºæ¯/æ¥éª¤ + WHYï¼
### åææ·±åº¦
- [ ] æ ¸å¿æ¦å¿µæ 3 个 WHY ç宿´åç
- [ ] ç®æ³æå¤æåº¦åæ + éç¨çç±
- [ ] è®¾è®¡æ¨¡å¼æ WHY ä½¿ç¨ + ä¸ç¨ä¼ææ ·
- [ ] æ§è¡æµç¨æå
·ä½æ°æ®è¿½è¸ª
### å®ç¨æ§
- [ ] æéç¹å·²æ 注
- [ ] è¾¹çæ¡ä»¶å·²è¯´æ
- [ ] åºç¨è¿ç§»åºæ¯è³å° 2 个
å®ç°æ¹å¼ï¼ä¼ªä»£ç æµç¨ï¼ï¼
彿°ï¼DeepModeæ¸è¿å¼çæ(代ç , æä»¶è·¯å¾):
// é¶æ®µ 1: çææ¡æ¶
æ¡æ¶ = çæå®æ´ç®å½(Standardç»æ + Deepæ©å±é¨å)
åå
¥æä»¶(æä»¶è·¯å¾, æ¡æ¶)
// é¶æ®µ 2: éç« å¡«å
ç« èå表 = [
"1. å¿«éæ¦è§",
"2. èæ¯ä¸å¨æº",
"3. æ ¸å¿æ¦å¿µ",
"4. ç®æ³ä¸ç论",
"5. 设计模å¼",
"6. å
³é®ä»£ç 深度解æ",
"7. æµè¯ç¨ä¾åæï¼å¦æï¼",
"8. åºç¨è¿ç§»åºæ¯",
"9. ä¾èµå
³ç³»",
"10. è´¨ééªè¯"
]
å¯¹äºæ¯ä¸ª ç« è in ç« èå表:
å½åå
容 = 读åæä»¶(æä»¶è·¯å¾)
// çæç« èå
容ï¼åæ¬¡ä¸æ³¨ï¼ç¡®ä¿æ·±åº¦ï¼
ç« èå
容 = 深度çæç« è(ç« è, 代ç )
// è¦æ±ï¼æ¯ç« è³å° 300-500 åï¼ä»£ç 段æå®æ´æ³¨é
// æ·±åº¦èªæ£
if not éè¿æ·±åº¦æ£æ¥(ç« èå
容):
ç« èå
容 = 追å ç»è(ç« èå
容)
// æ´æ°æä»¶
æ°å
容 = å½åå
容.replace(ç« èå ä½ç¬¦, ç« èå
容)
åå
¥æä»¶(æä»¶è·¯å¾, æ°å
容)
// é¶æ®µ 3: æ´ä½éªè¯
宿´ææ¡£ = 读åæä»¶(æä»¶è·¯å¾)
if not éè¿æ´ä½æ£æ¥(宿´ææ¡£):
èå¼±ç« è = è¯å«èå¼±é¨å(宿´ææ¡£)
for ç« è in èå¼±ç« è:
è¡¥å
å
容(ç« è)
return æä»¶è·¯å¾
åææµç¨ï¼ç 究驱å¨ï¼
第 1 æ¥ï¼å¿«éæ¦è§
ç®æ ï¼ å»ºç«æ´ä½å¿æºæ¨¡å (Mental Model)
å¿ é¡»è¯å«ï¼
- ç¼ç¨è¯è¨ (Programming Language) åçæ¬
- æä»¶/项ç®è§æ¨¡
- æ ¸å¿ä¾èµ (Dependencies)
- 代ç ç±»åï¼ç®æ³ãä¸å¡é»è¾ãæ¡æ¶ä»£ç çï¼
第 2 æ¥ï¼ç²¾ç»è¯¢é® – èæ¯ä¸å¨æº
æ ¸å¿é®é¢ï¼å¿ é¡»åçï¼ï¼
-
WHYï¼ä¸ºä»ä¹éè¦è¿æ®µä»£ç ï¼
- è§£å³ä»ä¹å®é é®é¢ï¼
- ä¸åè¿æ®µä»£ç ä¼ææ ·ï¼
-
WHYï¼ä¸ºä»ä¹éæ©è¿ç§ææ¯æ¹æ¡ï¼
- æåªäºæ¿ä»£æ¹æ¡ï¼
- 为ä»ä¹ä¸éæ©å ¶ä»æ¹æ¡ï¼
- è¿ä¸ªæ¹æ¡çæè¡¡ (Trade-offs) æ¯ä»ä¹ï¼
-
WHYï¼ä¸ºä»ä¹è¿ä¸ªæ¶æº/åºæ¯éè¦å®ï¼
- å¨ä»ä¹ä¸å¡æµç¨ä¸ä½¿ç¨ï¼
- åç½®æ¡ä»¶ååç½®æ¡ä»¶æ¯ä»ä¹ï¼
è¾åºæ ¼å¼ï¼
## èæ¯ä¸å¨æºåæ
### é®é¢æ¬è´¨
**è¦è§£å³çé®é¢ï¼** [ç¨ä¸å¥è¯æè¿°]
**WHY éè¦è§£å³ï¼** [ä¸è§£å³ä¼å¯¼è´ä»ä¹åæ]
### æ¹æ¡éæ©
**éæ©çæ¹æ¡ï¼** [å½åå®ç°æ¹å¼]
**WHY éæ©è¿ä¸ªæ¹æ¡ï¼**
- ä¼å¿ï¼[ååº 2-3 个å
³é®ä¼å¿]
- å£å¿ï¼[ååº 1-2 个已ç¥éå¶]
- æè¡¡ï¼[说æå¨ä»ä¹ä¹é´åäºæè¡¡]
**æ¿ä»£æ¹æ¡å¯¹æ¯ï¼**
- æ¹æ¡ Aï¼[ç®è¿°] - WHY ä¸éï¼[åå ]
- æ¹æ¡ Bï¼[ç®è¿°] - WHY ä¸éï¼[åå ]
### åºç¨åºæ¯
**éç¨åºæ¯ï¼** [å
·ä½åºæ¯æè¿°]
**WHY éç¨ï¼** [è§£é为ä»ä¹è¿ä¸ªåºæ¯éå]
**ä¸éç¨åºæ¯ï¼** [ååºè¾¹çæ¡ä»¶]
**WHY ä¸éç¨ï¼** [è§£é为ä»ä¹æäºåºæ¯ä¸éå]
第 3 æ¥ï¼æ¦å¿µç½ç»æå»º
ç®æ ï¼ å»ºç«æ¦å¿µé´çè¿æ¥ï¼èéå¤ç«è®°å¿
å¿ é¡»å å«ï¼
-
æ ¸å¿æ¦å¿µæå
- è¯å«ææå ³é®æ¦å¿µï¼ç±»ã彿°ãç®æ³ãæ°æ®ç»æï¼
- æ¯ä¸ªæ¦å¿µå¿ é¡»åç 3 个 WHY
-
æ¦å¿µå ³ç³»æ å°
- ä¾èµå ³ç³»ï¼A ä¾èµ B – WHYï¼
- 对æ¯å ³ç³»ï¼A vs B – WHY é Aï¼
- ç»åå ³ç³»ï¼A + B â C – WHY è¿æ ·ç»åï¼
-
ç¥è¯è¿æ¥
- è¿æ¥å°å·²ç¥æ¦å¿µ
- è¿æ¥å°è®¾è®¡æ¨¡å¼
- è¿æ¥å°ç论åºç¡
è¾åºæ ¼å¼ï¼
## æ¦å¿µç½ç»å¾
### æ ¸å¿æ¦å¿µæ¸
å
**æ¦å¿µ 1ï¼ç¨æ·è®¤è¯ (User Authentication)**
- **æ¯ä»ä¹ï¼** éªè¯ç¨æ·èº«ä»½çè¿ç¨
- **WHY éè¦ï¼** ä¿æ¤ç³»ç»èµæºä¸è¢«æªææè®¿é®
- **WHY è¿æ ·å®ç°ï¼** ä½¿ç¨ JWT å®ç°æ ç¶æè®¤è¯ï¼åè½»æå¡å¨åå
- **WHY ä¸ç¨å
¶ä»æ¹å¼ï¼** Session æ¹å¼éè¦æå¡å¨åå¨ï¼ä¸å©äºæ°´å¹³æ©å±
**æ¦å¿µ 2ï¼å¯ç åå¸ (Password Hashing)**
- **æ¯ä»ä¹ï¼** å°ææå¯ç 转æ¢ä¸ºä¸å¯éåå¸å¼
- **WHY éè¦ï¼** å³ä½¿æ°æ®åºæ³é²ï¼æ»å»è
乿 æ³è·å¾åå§å¯ç
- **WHY ç¨ bcryptï¼** èªå¸¦çå¼ (Salt)ï¼å¯è°èè®¡ç®ææ¬æµææ´åç ´è§£
- **WHY ä¸ç¨ MD5/SHA1ï¼** 计ç®é度太快ï¼å®¹æè¢«æ´åç ´è§£
### æ¦å¿µå
³ç³»ç©éµ
| å
³ç³»ç±»å | æ¦å¿µ A | æ¦å¿µ B | WHY è¿æ ·å
³è |
|---------|--------|--------|-------------|
| ä¾èµ | ç¨æ·è®¤è¯ | å¯ç åå¸ | 认è¯è¿ç¨éè¦éªè¯å¯ç ï¼å¿
é¡»å
åå¸æè½æ¯å¯¹ |
| é¡ºåº | å¯ç åå¸ | Token çæ | å¯ç éªè¯éè¿åæè½çæè®¿é® Token |
| å¯¹æ¯ | JWT | Session | JWT æ ç¶æï¼éååå¸å¼ï¼Session æç¶æï¼æå¡å¨åå大 |
### è¿æ¥å°å·²æç¥è¯
- **è¿æ¥å°è®¾è®¡æ¨¡å¼ï¼** [ä¸æè¯¦è¿°]
- **è¿æ¥å°ç®æ³ç论ï¼** [ä¸æè¯¦è¿°]
- **è¿æ¥å°å®å
¨ååï¼** æå°æéååãæ·±åº¦é²å¾¡åå
第 4 æ¥ï¼ç®æ³ä¸ç论深度åæ
强å¶è¦æ±ï¼ ææç®æ³åæ ¸å¿çè®ºå¿ é¡»ï¼
- æ æ³¨æ¶é´/空é´å¤æåº¦
- è§£é”WHY éæ©è¿ä¸ªå¤æåº¦æ¯å¯æ¥åç”
- æä¾æå¨åèèµæ
- 说æå¨ä»ä¹åºæ¯ä¸ä¼éå
è¾åºæ ¼å¼ï¼
## ç®æ³ä¸ç论åæ
### ç®æ³ï¼å¿«éæåº (Quick Sort)
**åºæ¬ä¿¡æ¯ï¼**
- **æ¶é´å¤æåº¦ï¼** å¹³å O(n log n)ï¼æå O(n²)
- **空é´å¤æåº¦ï¼** O(log n)
**ç²¾ç»è¯¢é®ï¼**
**WHY éæ©å¿«éæåºï¼**
- 平忧è½ä¼ç§ï¼å®é
åºç¨ä¸é常æå¿«
- åå°æåº (In-place)ï¼ç©ºé´æçé«
- ç¼åå好 (Cache-friendly)ï¼è®¿é®å±é¨æ§å¥½
**WHY 坿¥åæå O(n²)ï¼**
- æåæ
嵿¦çæä½ï¼å¯éè¿éæºåé¿å
ï¼
- å®é
æ°æ®é叏䏿¯å®å
¨æåº/éåº
- å¯ä»¥ç¨ä¸æ°å䏿³ (Median-of-Three) ä¼å
**WHY ä¸éæ©å
¶ä»æåºç®æ³ï¼**
- å½å¹¶æåºï¼éè¦ O(n) é¢å¤ç©ºé´ï¼ä¸éåå
ååéåºæ¯
- å æåºï¼è½ç¶ç¨³å® O(n log n)ï¼ä½ç¼åæ§è½å·®ï¼å®é
æ
¢äºå¿«æ
- æå
¥æåºï¼å°æ°æ®éä¼ç§ï¼ä½ O(n²) ä¸éåå¤§è§æ¨¡æ°æ®
**ä»ä¹æ¶åä¼éåï¼**
- è¾å
¥å·²ç»æåºæéåºï¼å¯ç¨éæºåè§£å³ï¼
- Pivot éæ©ä¸å½ï¼å¯ç¨ä¸æ°åä¸è§£å³ï¼
- 大ééå¤å
ç´ ï¼å¯ç¨ä¸è·¯å¿«æä¼åï¼
**åèèµæï¼**
- [Quick Sort - Wikipedia](https://en.wikipedia.org/wiki/Quicksort)
- [Quick Sort Analysis - Princeton](https://algs4.cs.princeton.edu/23quicksort/)
- [Why is QuickSort better than MergeSort?](https://stackoverflow.com/questions/70402/why-is-quicksort-better-than-other-sorting-algorithms-in-practice)
### ç论åºç¡ï¼JWT (JSON Web Token)
**WHY ä½¿ç¨ JWTï¼**
- æ ç¶æè®¤è¯ï¼æå¡å¨ä¸éè¦åå¨ Session
- èªå
å« (Self-contained)ï¼Token æºå¸¦ææå¿
è¦ä¿¡æ¯
- è·¨åå好ï¼éåå¾®æå¡æ¶æ
**WHY JWT æ¯å®å
¨çï¼**
- 使ç¨ç¾å (Signature) éªè¯å®æ´æ§
- æ æ³ä¼ªé ï¼é¤éç§é¥æ³é²ï¼
- å¯è®¾ç½®è¿ææ¶é´ (exp)
**WHY JWT æå±éæ§ï¼**
- æ æ³ä¸»å¨å¤±æï¼é¤éç»´æ¤é»ååï¼ç ´åæ ç¶æä¼å¿ï¼
- Token ä½ç§¯è¾å¤§ï¼Base64 ç¼ç 导è´ä½ç§¯å¢å 约 33%ï¼
- ææä¿¡æ¯éè¦å å¯ï¼ä»
ç¾å䏿ä¾ä¿å¯æ§
**åèèµæï¼**
- [JWT.io - Introduction](https://jwt.io/introduction)
- [RFC 7519 - JWT Specification](https://tools.ietf.org/html/rfc7519)
第 5 æ¥ï¼è®¾è®¡æ¨¡å¼è¯å«ä¸è¯¢é®
å¼ºå¶æ£æ¥ï¼ 代ç ä¸ä½¿ç¨çæ¯ä¸ªè®¾è®¡æ¨¡å¼é½å¿ é¡»ï¼
- æç¡®æ 注模å¼åç§°
- è§£é WHY 使ç¨è¿ä¸ªæ¨¡å¼
- 说æä¸ç¨è¿ä¸ªæ¨¡å¼ä¼ææ ·
- æä¾æ ååè
è¾åºæ ¼å¼ï¼
## 设计模å¼åæ
### æ¨¡å¼ 1ï¼å便¨¡å¼ (Singleton Pattern)
**åºç¨ä½ç½®ï¼** `DatabaseConnection` ç±»
**WHY 使ç¨åä¾ï¼**
- æ°æ®åºè¿æ¥å¼é大ï¼å¤ç¨å个å®ä¾èçèµæº
- é¿å
è¿æ¥æ± æ··ä¹±ï¼ç»ä¸ç®¡çè¿æ¥çå½å¨æ
- å
¨å±å¯ä¸è®¿é®ç¹ï¼æ¹ä¾¿æ§å¶å¹¶å
**WHY ä¸ç¨åä¾ä¼ææ ·ï¼**
- æ¯æ¬¡æä½å建æ°è¿æ¥ï¼èµæºèå°½
- å¤ä¸ªè¿æ¥å®ä¾å¯è½å¯¼è´äºå¡ä¸ä¸è´
- é¾ä»¥æ§å¶å¹¶å访é®
**å®ç°ç»èï¼**
```python
class DatabaseConnection:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
# WHY å¨ __new__ ä¸åå§åï¼
# ç¡®ä¿å¯¹è±¡å建åå°±æ¯åä¾ï¼çº¿ç¨å®å
¨
return cls._instance
WHY è¿æ ·å®ç°ï¼
- 使ç¨
__new__èé__init__ï¼æ§å¶å®ä¾å建ï¼èéåå§å - ç±»åé
_instanceï¼åå¨å¯ä¸å®ä¾ - æå è½½ (Lazy Loading)ï¼é¦æ¬¡ä½¿ç¨æ¶æå建
æ½å¨é®é¢ï¼
- â ï¸ é线ç¨å®å ¨ï¼å¤çº¿ç¨ç¯å¢éè¦å éï¼
- â ï¸ åå æµè¯å°é¾ï¼å ¨å±ç¶æé¾ä»¥é离ï¼
- â ï¸ è¿ååä¸èè´£ååï¼ç±»éè¦ç®¡çèªå·±çå®ä¾ï¼
æ´å¥½çæ¿ä»£æ¹æ¡ï¼
- ä¾èµæ³¨å ¥ (Dependency Injection)ï¼æ´çµæ´»ï¼æäºæµè¯
- 模å级åéï¼Python 模å天ç¶åä¾
åèèµæï¼
---
### 第 6 æ¥ï¼éè¡æ·±åº¦è§£æï¼å
³é®ä»£ç 段ï¼
**æ ¸å¿ååï¼**
- éæ© 3-5 个æå
³é®çä»£ç æ®µ
- æ¯è¡ä»£ç å¿
须解é"åäºä»ä¹"+"为ä»ä¹è¿æ ·å"
- æä¾å
·ä½æ°æ®çæ§è¡æµç¨ç¤ºä¾
- æ æ³¨æéç¹åè¾¹çæ¡ä»¶
**è¾åºæ ¼å¼ï¼**
```markdown
## å
³é®ä»£ç 深度解æ
### ä»£ç æ®µ 1ï¼ç¨æ·è®¤è¯å½æ°
**æ´ä½ä½ç¨ï¼** éªè¯ç¨æ·ååå¯ç ï¼è¿å JWT Token æ None
**WHY éè¦è¿ä¸ªå½æ°ï¼** è®¤è¯æ¯ç³»ç»å®å
¨ç第ä¸éé²çº¿ï¼å¿
é¡»å¯é ä¸é«æ
**åå§ä»£ç ï¼**
```python
def authenticate_user(username, password):
user = db.find_user(username)
if not user:
return None
if verify_password(password, user.password_hash):
return generate_token(user.id)
return None
éè¡ç²¾ç»è§£æï¼æ¨è注é飿 ¼ï¼ï¼åºæ¯å + æ§è¡æµè¿½è¸ª
注é飿 ¼è¯´æï¼
# åºæ¯ N: [æè¿°]/// åºæ¯ N: [æè¿°]– æ æ³¨æ¡ä»¶åæ¯çä¸åæ§è¡è·¯å¾ï¼if/elseãswitchãmatch çï¼# æ¥éª¤ N: [æè¿°]/// æ¥éª¤ N: [æè¿°]– æ æ³¨ä¸²è¡æ§è¡æµç¨ï¼åå§å顺åºã彿°è°ç¨åºåçï¼- 注é符å·ä¸è¯è¨ä¸è´ï¼Python ç¨
#ï¼C++/Java ç¨//- ç¨å ·ä½åéå¼è¿½è¸ªæ§è¡æµç¨ï¼
# æ¤æ¶ï¼xxx/// æ¤æ¶ï¼xxxï¼- 注æå¾ªç¯/éå½çè¿ä»£ç¶æ
- æ æ³¨å ³é®æ°æ®çåå轨迹
def authenticate_user(username, password):
# æ¥éª¤ 1: æ¥è¯¢ç¨æ·
user = db.find_user(username)
# WHY å
æ¥ç¨æ·ï¼é¿å
ä¸åå¨çç¨æ·åä¹è¿è¡å¯ç åå¸ï¼èç计ç®ï¼
# åºæ¯ 1: è¥ç¨æ·ä¸åå¨ï¼ç«å³è¿å None
if not user:
return None
# WHY è¿å None èéæå¼å¸¸ï¼è®¤è¯å¤±è´¥æ¯æ£å¸¸ä¸å¡æµç¨ï¼éå¼å¸¸æ
åµ
# WHY ä¸åºå"ç¨æ·ä¸åå¨"å"å¯ç é误"ï¼é²æ¢ç¨æ·åæä¸¾æ»å»
# åºæ¯ 2: è¥å¯ç éªè¯éè¿ï¼çæå¹¶è¿å Token
if verify_password(password, user.password_hash):
# verify_password å
鍿µç¨ï¼
# 1. ä» password_hash æåçå¼ (Salt)
# 2. ç¨ç¸åçå¼å叿æå¯ç
# 3. æå®æ¶é´æ¯è¾ä¸¤ä¸ªåå¸å¼ï¼é²æ¢æ¶åºæ»å»ï¼
return generate_token(user.id)
# æ¤æ¶ï¼user.id = 42ï¼å设ï¼
# generate_token(42) â "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
# åºæ¯ 3: å¯ç é误ï¼è¿å None
return None
# WHY ä¸"ç¨æ·ä¸åå¨"ç¸åçè¿åå¼ï¼é²æ¢æ»å»è
åºå两ç§å¤±è´¥æ
åµ
宿´æ§è¡æµç¤ºä¾ï¼å¤åºæ¯è¿½è¸ªï¼ï¼
// 示ä¾ï¼è¿½æº¯ tensor ç产è
ç彿°ï¼ç¼è¯å¨ä»£ç å
¸å飿 ¼ï¼
Value getProducerOfTensor(Value tensor) {
Value opResult;
while (true) {
// åºæ¯ 1: è¥ tensor ç± LinalgOp å®ä¹ï¼ç´æ¥è¿å
if (auto linalgOp = tensor.getDefiningOp<LinalgOp>()) {
opResult = cast<OpResult>(tensor);
// while åªå¾ªç¯ 1 次
return;
}
// æç
§æ¬è示ä¾ï¼é¦æ¬¡è°ç¨æ¬å½æ°æ¶ï¼tensor = %2_tile
// åºæ¯ 2: è¥ tensor éè¿ ExtractSliceOp 龿¥ï¼ç»§ç»è¿½æº¯æº
if (auto sliceOp = tensor.getDefiningOp<tensor::ExtractSliceOp>()) {
tensor = sliceOp.getSource();
// æ¤æ¶ï¼tensor = %2ï¼ç± linalg.matmul å®ä¹
// æ§è¡ç¬¬äºæ¬¡ while 循ç¯ï¼ä¼è¿å
¥åºæ¯ 1 忝 (linalg.matmul æ¯ LinalgOp)
continue;
}
// åºæ¯ 3: éè¿ scf.for çè¿ä»£åæ°
// ç¤ºä¾ IRï¼
// %1 = linalg.generic ins(%A) outs(%init) { ... }
// %2 = scf.for %i = 0 to 10 iter_args(%arg = %1) {
// %3 = linalg.generic ins(%arg) outs(%init2) { ... }
// scf.yield %3
// }
// getProducerOfTensor(%arg)
if (auto blockArg = dyn_cast<BlockArgument>(tensor)) {
// ç¬¬ä¸æ¬¡ while 循ç¯ï¼tensor = %argï¼æ¯ BlockArgument
if (auto forOp = blockArg.getDefiningOp<scf::ForOp>()) {
// %arg ç± scf.for å®ä¹ï¼è·å循ç¯çåå§å¼ï¼%1
// blockArg.getArgNumber() = 0ï¼%arg æ¯ç¬¬ 0 个è¿ä»£åæ°ï¼
// forOp.getInitArgs()[0] = %1
tensor = forOp.getInitArgs()[blockArg.getArgNumber()];
// æ¤æ¶ï¼tensor = %1ï¼ç± linalg.generic å®ä¹
// æ§è¡ç¬¬äºæ¬¡ while 循ç¯ï¼ä¼è¿å
¥åºæ¯ 1 忝
continue;
}
}
return; // æ¾ä¸å°ï¼å¯è½æ¯å½æ°åæ°ï¼
}
}
æ§è¡æµç¨ç¤ºä¾ï¼æ¨è飿 ¼ï¼ï¼
åºæ¯ 1ï¼è®¤è¯æå
# åå§ç¶æ
è¾å
¥ï¼username="alice", password="Secret123!"
# æ§è¡è·¯å¾
æ¥éª¤ 1: db.find_user("alice")
â æ¥è¯¢æ°æ®åº
â è¿å User(id=42, username="alice", password_hash="$2b$12$KIX...")
# æ¤æ¶ï¼user åå¨ï¼è·³è¿åºæ¯ 1 ç return None
æ¥éª¤ 2: è¿å
¥åºæ¯ 2 忝ï¼å¯ç éªè¯ï¼
â verify_password("Secret123!", "$2b$12$KIX...")
â æåçå¼ï¼$2b$12$KIX...
â åå¸ "Secret123!" with salt
â æå®æ¶é´æ¯è¾åå¸å¼
â è¿å True
æ¥éª¤ 3: generate_token(42)
â å建 payload: {"user_id": 42, "exp": 1643723400}
â 使ç¨ç§é¥ç¾å
â è¿å "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0Miwi..."
# æç»è¿åï¼Token å符串
# æ§è½åæ
èæ¶ï¼~100msï¼ä¸»è¦æ¯ bcrypt 计ç®ï¼
åºæ¯ 2ï¼ç¨æ·ä¸åå¨
# åå§ç¶æ
è¾å
¥ï¼username="bob", password="anything"
# æ§è¡è·¯å¾
æ¥éª¤ 1: db.find_user("bob")
â æ¥è¯¢æ°æ®åº
â è¿å None
# æ¤æ¶ï¼user = Noneï¼è¿å
¥åºæ¯ 1 忝
æ¥éª¤ 2: if not user: # true
â ç´æ¥è¿å None
# åºæ¯ 2ã3 é½ä¸æ§è¡
# æ§è½åæ
èæ¶ï¼~5msï¼ä»
æ°æ®åºæ¥è¯¢ï¼
â ï¸ æ³¨æï¼æ¯è®¤è¯æåå¿«å¾å¤ï¼å¯è½æ³é²ç¨æ·æ¯å¦åå¨
# å®å
¨å»ºè®®ï¼æ·»å åºå®å»¶è¿æååå¸è®¡ç®ï¼ä½¿ä¸¤ç§æ
åµèæ¶æ¥è¿
åºæ¯ 3ï¼å¯ç é误
# åå§ç¶æ
è¾å
¥ï¼username="alice", password="WrongPass"
# æ§è¡è·¯å¾
æ¥éª¤ 1: db.find_user("alice")
â è¿å User(id=42, ...)
# æ¤æ¶ï¼user åå¨ï¼è·³è¿åºæ¯ 1 ç return None
æ¥éª¤ 2: è¿å
¥åºæ¯ 2 忝ï¼å¯ç éªè¯ï¼
â verify_password("WrongPass", "$2b$12$KIX...")
â åå¸ "WrongPass"
â æ¯è¾åå¸å¼
â è¿å False
æ¥éª¤ 3: å¯ç éªè¯å¤±è´¥ï¼ä¸æ§è¡ generate_token
â ç»§ç»æ§è¡å°æåç return None
# åºæ¯ 3ï¼å¯ç éªè¯å¤±è´¥ï¼è¿å None
# æ§è½åæ
èæ¶ï¼~100msï¼ä¸è®¤è¯æåç¸è¿ï¼
â
好å¤ï¼æ æ³éè¿ååºæ¶é´å¤æå¯ç æ¯å¦æ£ç¡®
å ³é®è¦ç¹æ»ç»ï¼
-
å®å ¨æ§èèï¼
- â ææå¯ç ä» å¨å åä¸çæåå¨ï¼ç«å³åå¸éªè¯
- â 失败åå 䏿³é²ï¼é²æ¢ç¨æ·åæä¸¾ï¼
- â æ¶é´æå®æ¯è¾ï¼é²æ¢æ¶åºæ»å»ï¼
- â ï¸ æ½å¨é®é¢ï¼ç¨æ·ä¸å卿¶ååºæ´å¿«ï¼éä¼åï¼
-
æ§è½ä¼åï¼
- â ç¨æ·ä¸å卿¶å¿«éè¿åï¼ä¸æµªè´¹åå¸è®¡ç®
- â ï¸ ä½è¿ä¼å¯¼è´æ¶åºæ³é²ï¼éæè¡¡å®å ¨ä¸æ§è½
-
é误å¤çï¼
- â ç¨ None è¡¨ç¤ºå¤±è´¥ï¼æ¸ æ°ä¸ç¬¦å Python æ¯ä¾
- â ï¸ è°ç¨æ¹éæ£æ¥è¿åå¼ï¼å¦åå¯è½è¯¯ç¨ None
-
坿¹è¿ä¹å¤ï¼
- æ·»å æ¥å¿è®°å½å¤±è´¥å°è¯ï¼æ£æµæ´åç ´è§£ï¼
- æ·»å éçéå¶ï¼Rate Limitingï¼
- ç»ä¸å¤±è´¥åºæ¯ååºæ¶é´
---
### 第 6.5 æ¥ï¼æµè¯ç¨ä¾ååçè§£ï¼å¦ææµè¯ï¼
**ç®æ ï¼** éè¿æµè¯ç¨ä¾ååéªè¯åæ·±å对代ç åè½ççè§£
**为ä»ä¹éè¦ï¼**
- æµè¯ç¨ä¾åæ äºä»£ç ç**颿è¡ä¸º**ï¼æ¯æåç¡®ç"使ç¨è¯´æä¹¦"
- æµè¯é常è¦ç**è¾¹çæ¡ä»¶**å**å¼å¸¸åºæ¯**ï¼è¿äºå¨ä¸»ä»£ç ä¸å®¹æè¢«å¿½ç¥
- éè¿æµè¯å¯ä»¥**éªè¯çè§£æ¯å¦æ£ç¡®**ï¼é¿å
产çé误çå设
**彿£æµå°ä»£ç å
嫿µè¯æä»¶æ¶ï¼å¿
é¡»æ§è¡æ¤æ¥éª¤ã**
#### 6.5.1 æµè¯æä»¶è¯å«
**å¸¸è§æµè¯æä»¶æ¨¡å¼ï¼**
| è¯è¨ | æµè¯æä»¶æ¨¡å¼ | æµè¯ç®å½ç»æ |
|------|-------------|-------------|
| **Python** | `test_*.py`, `*_test.py` | `tests/`, `test/` |
| **JavaScript/TypeScript** | `*.test.ts`, `*.test.js` | `__tests__/`, `tests/` |
| **Go** | `*_test.go` | 䏿ºç åç®å½, `*_test.go` |
| **Java** | `*Test.java`, `*Tests.java` | `src/test/java/` |
| **C++** | `*.cpp` (å
嫿µè¯), gtest | `test/`, `tests/`, `unittest/` |
| **Rust** | `*_test.rs`, `tests/*.rs` | `tests/` |
| **MLIR/LLVM** | `*.mlir` (æµè¯æä»¶) | `test/Dialect/*/` |
**大åé¡¹ç®æµè¯ç®å½ç»æç¤ºä¾ï¼**
```bash
# MLIR 飿 ¼ï¼æµè¯ç¬ç«ç®å½ï¼
mlir/test/Dialect/Linalg/
âââ ops.mlir # Linalg æ¹è¨æä½æµè¯
âââ transformation.mlir # 忢æµè¯
âââ interfaces.mlir # æ¥å£æµè¯
âââ invalid.mlir # é误å¤çæµè¯
# ä¼ ç» C++ 项ç®é£æ ¼
project/test/
âââ unittest/ # åå
æµè¯
âââ integration/ # éææµè¯
âââ benchmark/ # æ§è½æµè¯
6.5.2 æµè¯è¦çåæ
åææµè¯è¦ççåè½ç¹ï¼
## æµè¯ç¨ä¾è¦çåæ
### æµè¯æä»¶æ¸
å
| æµè¯æä»¶/ç®å½ | æµè¯ç模å | æµè¯ç¨ä¾æ°é |
|--------------|-----------|-------------|
| `test/Dialect/Linalg/ops.mlir` | Linalg Ops | 156 |
| `test/Dialect/Linalg/invalid.mlir` | é误å¤ç | 43 |
| `unittest/test_auth.cpp` | `authenticate_user()` | 12 |
### åè½è¦çç©éµ
| æ ¸å¿åè½ | 主代ç ä½ç½® | æµè¯è¦ç | è¦ççè¯ä¼° |
|---------|-----------|---------|-----------|
| linalg.matmul æä½ | `Dialect/Linalg/Ops/*` | â
ææµè¯ | è¦çæ£å¸¸+è¾¹ç |
| linalg.generic æ¥å£ | `Interfaces/*` | â
ææµè¯ | è¦ç宿´ |
| Tile 忢 | `Transforms/Tiling.cpp` | â ï¸ æµè¯ä¸è¶³ | 缺å°åµå¥åºæ¯ |
6.5.3 éè¿æµè¯çè§£è¾¹çæ¡ä»¶
仿µè¯ä¸æåå ³é®è¾¹çæ¡ä»¶ï¼
## 仿µè¯ä¸åç°çè¾¹çæ¡ä»¶
### MLIR 示ä¾ï¼çè§£ linalg.generic çåºå约æ
#### æµè¯æä»¶ï¼test/Dialect/Linalg/invalid.mlir
```mlir
// æµè¯ï¼generic ç region å¿
é¡»æä¸ä»
æä¸ä¸ª block
func.func @invalid_generic_empty_region(%arg0: tensor<10xf32>) -> tensor<10xf32> {
%0 = linalg.generic {indexing_maps = [affine_map<(d0) -> (d0)>],
iterator_types = ["parallel"]}
outs(%arg0) {
// 空 region - åºè¯¥æ¥é
} -> tensor<10xf32>
return %0 : tensor<10xf32>
}
WHY è¿ä¸ªæµè¯éè¦ï¼
- æç¤ºäº
linalg.genericçç»æçº¦æï¼å¿ é¡»æ block - éè¿è´åæµè¯ï¼invalid testï¼æç¡®é误æ¡ä»¶
- è¾¹çæ¡ä»¶ï¼region ç block æ°éå¿ é¡» = 1
æµè¯æä»¶ï¼test/Dialect/Linalg/ops.mlir
// æµè¯ï¼è¾å
¥åè¾åºæ°éå¿
é¡»ä¸ indexing_maps ä¸è´
func.func @generic_mismatched_maps(%a: tensor<10xf32>, %b: tensor<10xf32>) -> tensor<10xf32> {
%0 = linalg.generic {
indexing_maps = [
affine_map<(d0) -> (d0)>, // 1 个è¾å
¥ç map
affine_map<(d0) -> (d0)> // 1 个è¾åºç map
],
iterator_types = ["parallel"]
} ins(%a, %b : tensor<10xf32>, tensor<10xf32>) // 使 2 个è¾å
¥
outs(%0 : tensor<10xf32>) {
^bb0(%in: f32, %in_2: f32, %out: f32):
linalg.yield %in : f32
} -> tensor<10xf32>
return %0 : tensor<10xf32>
}
WHY è¿æ ·å¤çï¼
- éªè¯äºç±»åç³»ç»çº¦æï¼è¾å ¥/è¾åºæ°éå¿ é¡»ä¸ map ä¸è´
- æµè¯äºéæéªè¯é»è¾ï¼å¨ç¼è¯ææè·é误
- 说æäº MLIR çéæå¼ºç±»åç¹æ§
C++ 示ä¾ï¼éè¿æµè¯ç解并åå®å ¨æ§
æµè¯æä»¶ï¼unittest/concurrent_map_test.cpp
// æµè¯ï¼å¹¶åæå
¥ç¸åé®
TEST(ConcurrentMapTest, ConcurrentInsertSameKey) {
ConcurrentMap<int, int> map;
const int num_threads = 10;
const int key = 42;
std::vector<std::thread> threads;
for (int i = 0; i < num_threads; ++i) {
threads.emplace_back([&map, key, i]() {
map.Insert(key, i); // ææçº¿ç¨æå
¥åä¸ä¸ª key
});
}
for (auto& t : threads) t.join();
// éªè¯ï¼åªæä¸ä¸ªæå
¥æå
EXPECT_EQ(map.Size(), 1);
EXPECT_TRUE(map.Contains(key));
}
WHY è¿ä¸ªæµè¯åå¨ï¼
- éªè¯äºçº¿ç¨å®å ¨æ§ï¼å¤çº¿ç¨å¹¶å访é®ä¸ä¼å´©æº
- 说æäºå²çªå¤ççç¥ï¼åæå ¥è¦çå æå ¥ï¼æåä¹ï¼
- æµè¯äºä¸è´æ§ä¿è¯ï¼æç»ç¶æç¬¦å颿
#### 6.5.4 æµè¯é©±å¨ç解示ä¾
**宿´ç¤ºä¾ï¼éè¿ MLIR æµè¯çè§£ `linalg.tile` 忢**
```markdown
## æµè¯ç¨ä¾ååçè§£ï¼linalg.tile 忢
### é®é¢ï¼ä»
çææ¡£è½çè§£ tile çå
¨é¨è¡ä¸ºåï¼
**ææ¡£è¯´æï¼ç®åï¼ï¼**
> `linalg.tile` å° linalg æä½å解为æ´å°ççæ®µ
**å¯è½éæ¼çç»èï¼**
1. Tile 大å°å¦ä½ç¡®å®ï¼
2. æ¯æåªäºæä½ç tileï¼
3. Tile åç循ç¯é¡ºåºæ¯ä»ä¹ï¼
4. å¦ä½å¤çå©ä½å
ç´ ï¼
### 仿µè¯ä¸åç°ççæ¡
#### æµè¯ 1ï¼test/tile-mlir.mlir - åºæ¬ tile è¡ä¸º
```mlir
// åå§æä½
%0 = linalg.matmul ins(%A: tensor<128x128xf32>, %B: tensor<128x128xf32>)
outs(%C: tensor<128x128xf32>)
// Tile 大å°ä¸º 32x32
%1 = linalg.tile %0 tile_sizes[32, 32]
åç°ï¼ Tile 大å°ç´æ¥æå®ï¼è¾åºå å«åµå¥å¾ªç¯ç»æ
æµè¯ 2ï¼test/tile-mlir.mlir – å©ä½å ç´ å¤ç
// 127x127 ç©éµï¼tile å¤§å° 32x32
%0 = linalg.matmul ins(%A: tensor<127x127xf32>, ...)
%1 = linalg.tile %0 tile_sizes[32, 32]
åç°ï¼ èªå¨çæè¾¹çæ£æ¥å¤çä¸ååçå©ä½é¨å
æµè¯ 3ï¼test/tile-mlir.mlir – ä¸å¯ tile çæä½
// å°è¯ tile 䏿¯æçæä½
%0 = linalg.generic ...
%1 = linalg.tile %0 tile_sizes[16]
// 颿ï¼ç¼è¯é误æè¿è¡æ¶å¤±è´¥
åç°ï¼ å¹¶éæææä½é½æ¯æ tileï¼ææç¡®çéå¶æ¡ä»¶
æµè¯ååç解对æ¯
| é®é¢ | ä» çææ¡£ | çæµè¯å |
|---|---|---|
| Tile 大å°å¦ä½æå®ï¼ | â ï¸ ä¸æ¸ æ¥ | â ç´æ¥ä½ä¸ºåæ° |
| å©ä½å ç´ å¦ä½å¤çï¼ | â ææ¡£æªæå | â èªå¨è¾¹çæ£æ¥ |
| æ¯æåªäºæä½ï¼ | â å表ä¸å®æ´ | â æµè¯è¦çæææ¯æçæä½ |
| 循ç¯é¡ºåºæ¯ä»ä¹ï¼ | â ï¸ æè¿°æ¨¡ç³ | â 仿µè¯ IR å¯çåºé¡ºåº |
ç»è®ºï¼ æµè¯ç¨ä¾è¡¥å äºçº¦ 50% çå®ç°ç»èï¼
#### 6.5.5 ä¸åè¯è¨æµè¯æä»¶è§£æè¦ç¹
**åè¯è¨æµè¯ç注æç¹ï¼**
```markdown
## åè¯è¨æµè¯æä»¶è§£æè¦ç¹
### Python (pytest/unittest)
- æ¥æ¾ `test_*.py` æ `*_test.py`
- 注æ `@pytest.mark.parametrize` åæ°åæµè¯
- å
³æ³¨ `pytest.raises` å¼å¸¸æµè¯
- æ¥æ¾ fixtures (`conftest.py`) äºè§£æµè¯ä¸ä¸æ
### C++ (gtest/gtest)
- æ¥æ¾ `*_test.cpp` æ `test/*.cpp`
- `TEST_F` 表示 fixture æµè¯ï¼æåç½®æ¡ä»¶
- `EXPECT_*` vs `ASSERT_*`ï¼å¤±è´¥åæ¯å¦ç»§ç»
- `TEST_P` è¡¨ç¤ºåæ°åæµè¯
### MLIR/LLVM
- æµè¯æä»¶éå¸¸æ¯ `.mlir` æ `.td`
- `RUN:` å½ä»¤æå®å¦ä½æ§è¡æµè¯
- `// EXPECTED:` æ è®°é¢æè¾åº
- `// ERROR:` æ è®°é¢æçç¼è¯é误
- FileCheck æä»¤ï¼`CHECK-`, `CHECK-NOT:`, `CHECK-DAG:`
### JavaScript/TypeScript (Jest)
- `*.test.ts`, `*.spec.ts`
- `describe/it` åµå¥ç»æ
- `expect(...).toThrow()` å¼å¸¸æµè¯
- `beforeEach/afterEach` é©å彿°
### Go
- æµè¯ä¸æºç å¨åä¸ç®å½ï¼`*_test.go`
- `TestXxx(t *testing.T)` åºç¡æµè¯
- `TableDrivenTests` è¡¨æ ¼é©±å¨æµè¯
- `TestMain` æµè¯å
¥å£
### Rust
- `*_test.rs` å
嵿µè¯
- `tests/` ç®å½éææµè¯
- `#[should_panic]` å¼å¸¸æµè¯
- `#[ignore]` è·³è¿çæµè¯
6.5.6 æµè¯è´¨éè¯ä¼°
è¯ä¼°æµè¯æ¯å¦å åï¼
## æµè¯è´¨éè¯ä¼°
### è¦ççåè½ç¹
- â
æ£å¸¸æµç¨
- â
è¾¹çè¾å
¥
- â
å¼å¸¸è¾å
¥
- â ï¸ å¹¶ååºæ¯
- â æ§è½æµè¯
### MLIR ç¹å®è¯ä¼°
- â
æ£åæµè¯ï¼valid.mlirï¼
- â
è´åæµè¯ï¼invalid.mlirï¼
- â ï¸ æ§è½å彿µè¯
- â è·¨æ¹è¨äº¤äºæµè¯
### æµè¯ç¼ºå¤±è¦å
> â ï¸ **è¦åï¼è¯¥æ¨¡åæµè¯è¦çä¸è¶³**
> - æªè¦çåºæ¯ï¼[å
·ä½ååº]
> - 建议补å
ï¼[å
·ä½å»ºè®®]
6.5.7 æµè¯ç¨ä¾åæè¾åºæ¨¡æ¿
## æµè¯ç¨ä¾åæ
### æµè¯æä»¶ç»æ
[ååºæµè¯æä»¶/ç®å½åå
¶å¯¹åºçæºç 模å]
### å
³é®æµè¯ç¨ä¾è§£è¯»
[éæ© 3-5 个ææä»·å¼çæµè¯ç¨ä¾]
### 仿µè¯ä¸åç°çéèè¡ä¸º
[ååºä»
ç代ç 容æéæ¼çç»è]
### æµè¯è¦ç度è¯ä¼°
- æ ¸å¿åè½è¦ççï¼X%
- è¾¹çæ¡ä»¶è¦çï¼[å
å/ä¸è¶³]
### æµè¯è´¨é建议
[妿µè¯ä¸è¶³ï¼æåºæ¹è¿å»ºè®®]
第 9 æ¥ï¼åºç¨è¿ç§»æµè¯ï¼æ£éªçå®çè§£ï¼
ç®æ ï¼ æµè¯æ¦å¿µè½å¦åºç¨å°ä¸ååºæ¯
å¿ é¡»å å«ï¼
- è³å° 2 个ä¸åé¢åçåºç¨åºæ¯
- 说æå¦ä½è°æ´ä»£ç 以éåºæ°åºæ¯
- æ æ³¨åªäºåçä¿æä¸åï¼åªäºéè¦ä¿®æ¹
è¾åºæ ¼å¼ï¼
## åºç¨è¿ç§»åºæ¯
### åºæ¯ 1ï¼å°ç¨æ·è®¤è¯åºç¨å° API å¯é¥éªè¯
**åå§åºæ¯ï¼** Web ç¨æ·ç»å½è®¤è¯
**æ°åºæ¯ï¼** ç¬¬ä¸æ¹ API å¯é¥éªè¯
**ä¸åçåçï¼**
- éªè¯è°ç¨æ¹èº«ä»½çæ ¸å¿æµç¨
- åå¸åå¨åè¯ï¼API å¯é¥ä¹åºåå¸ï¼
- çæè®¿é®ä»¤ççæºå¶
**éè¦ä¿®æ¹çé¨åï¼**
```python
# åå§ï¼ç¨æ·å+å¯ç
def authenticate_user(username, password):
user = db.find_user(username)
if not user:
return None
if verify_password(password, user.password_hash):
return generate_token(user.id)
return None
# è¿ç§»ï¼API å¯é¥
def authenticate_api_key(api_key):
# WHY åªéè¦ä¸ä¸ªåæ°ï¼API å¯é¥æ¬èº«å°±æ¯èº«ä»½+åè¯
app = db.find_app_by_key_prefix(api_key[:8])
# WHY ç¨åç¼æ¥è¯¢ï¼é¿å
å
¨è¡¨æ«æï¼API å¯é¥åç¼ä½ä¸ºç´¢å¼
if not app:
return None
if verify_api_key(api_key, app.key_hash):
# WHY ä¹è¦åå¸ï¼é²æ¢æ°æ®åºæ³é²å¯¼è´å¯é¥æ³é²
return generate_token(app.id, scope=app.permissions)
# WHY å¢å scopeï¼API å¯é¥é常æä¸åæé级å«
return None
WHY è¿æ ·è¿ç§»ï¼
- ä¿çæ ¸å¿å®å ¨ååï¼åå¸åå¨ãæå®æ¶é´æ¯è¾ï¼
- è°æ´ä¸å¡é»è¾ï¼ååæ°ãæéèå´ï¼
- ä¼åæ¥è¯¢æ§è½ï¼åç¼ç´¢å¼ï¼
å¦å°çéç¨æ¨¡å¼ï¼
- ä»»ä½éè¦éªè¯”è°å¨è°ç¨”çåºæ¯é½å¯ç¨ç±»ä¼¼ç»æ
- æ ¸å¿ï¼æ¥æ¾å®ä½ â éªè¯åè¯ â çæä»¤ç
- ååï¼åè¯å½¢å¼ãæ¥è¯¢æ¹å¼ã令çå 容
åºæ¯ 2ï¼å°å¿«éæåºåºç¨å°æ¥å¿åæ
åå§åºæ¯ï¼ å¯¹ç¨æ·å表æ ID æåº
æ°åºæ¯ï¼ 对æ°ç¾ä¸æ¡æ¥å¿ææ¶é´æ³æåº
ä¸åçåçï¼
- åæ²»ææ³ï¼éå½åè§£é®é¢
- Pivot éæ©ï¼å½±åæ§è½çå ³é®
- åå°æåºï¼èç空é´
éè¦è°æ´çé¨åï¼
# åå§ï¼ç®åå¿«æ
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
# è¿ç§»ï¼æ¥å¿æåºï¼å¤é¨æåº + ä¼åï¼
def quicksort_logs(log_file, output_file, memory_limit):
# WHY å¤é¨æåºï¼æ°æ®éè¶
è¿å
åï¼æ æ³ä¸æ¬¡æ§å è½½
# 1. ååæåº
chunks = split_file_into_chunks(log_file, memory_limit)
# WHY ååï¼æ¯åå¯è½½å
¥å
ååç¬æåº
for chunk in chunks:
logs = load_chunk(chunk)
# WHY ç¨ timsort èéå¿«æï¼
# - æ¥å¿é常é¨åæåºï¼ææ¶é´è¿½å ï¼
# - timsort 对é¨åæåºæ°æ®ä¼åå° O(n)
# - Python å
ç½® sorted() å°±æ¯ timsort
logs.sort(key=lambda log: log.timestamp)
save_sorted_chunk(chunk, logs)
# 2. å½å¹¶æåºçåå
merge_sorted_chunks(chunks, output_file)
# WHY å½å¹¶ï¼å¤ä¸ªæåºåºåå并为ä¸ä¸ªæåºåºå
return output_file
WHY ä¸ç´æ¥ç¨å¿«æï¼
- æ°æ®éè¶ è¿å åï¼éè¦å¤é¨æåº
- æ¥å¿é¨åæåºï¼timsort æ´ä¼
- éè¦ç¨³å®æåºï¼ä¿æç¸åæ¶é´æ³çæ¥å¿é¡ºåº
å¦å°çéç¨æ¨¡å¼ï¼
- ç®æ³éæ©åå³äºæ°æ®ç¹å¾ï¼è§æ¨¡ãæåºæ§ãç¨³å®æ§éæ±ï¼
- åºæ¬åçå¯è¿ç§»ï¼åæ²»ãæ¯è¾ï¼ï¼ä½å®ç°éè°æ´
- è¶ å¤§æ°æ®éè¦å¤é¨ç®æ³ï¼åå+å½å¹¶ï¼
---
### 第 10 æ¥ï¼ä¾èµå
³ç³»ä¸ä½¿ç¨ç¤ºä¾
ï¼ä¸åç类似ï¼ä½å¢å WHY è§£éï¼
```markdown
## ä¾èµå
³ç³»åæ
### å¤é¨åº
**bcrypt (v5.1.0)**
- **ç¨éï¼** å¯ç åå¸ (Password Hashing)
- **WHY éæ© bcryptï¼**
- èªå¸¦çå¼ï¼æ éæå¨ç®¡ç
- å¯è°èè®¡ç®ææ¬ï¼cost factorï¼
- æµæ GPU/ASIC å éæ»å»
- **WHY ä¸ç¨ SHA256ï¼** 计ç®å¤ªå¿«ï¼å®¹ææ´åç ´è§£
- **WHY ä¸ç¨ scrypt/argon2ï¼** bcrypt æ´æçï¼å
¼å®¹æ§å¥½
**jsonwebtoken (v9.0.0)**
- **ç¨éï¼** JWT token çæä¸éªè¯
- **WHY éæ© JWTï¼** æ ç¶æè®¤è¯ï¼éååå¸å¼ç³»ç»
- **WHY ä¸ç¨ Sessionï¼** Session éè¦æå¡å¨åå¨ï¼ä¸å©äºæ©å±
### å
鍿¨¡åä¾èµ
**database.js â auth.js**
- **ä¾èµåå ï¼** 认è¯éè¦æ¥è¯¢ç¨æ·æ°æ®
- **WHY è¿æ ·è®¾è®¡ï¼** åç¦»æ°æ®è®¿é®åä¸å¡é»è¾ï¼åä¸èè´£ååï¼
**utils/crypto.js â auth.js**
- **ä¾èµåå ï¼** 认è¯éè¦å¯ç åå¸åéªè¯
- **WHY å°è£
å·¥å
·æ¨¡åï¼** å å¯é»è¾å¤æï¼éä¸ç®¡çæ´å®å
¨
## 宿´ä½¿ç¨ç¤ºä¾
ï¼å
å«è¯¦ç»ç WHY 注éï¼
### ç¤ºä¾ 1ï¼æ åç¨æ·ç»å½æµç¨
```javascript
// 1. 导å
¥è®¤è¯æ¨¡å
const auth = require('./auth');
// 2. æ¥æ¶ç¨æ·è¾å
¥ï¼æ¥èªç»å½è¡¨åï¼
const username = req.body.username; // ä¾å¦ï¼"alice"
const password = req.body.password; // ä¾å¦ï¼"Secret123!"
// WHY ä¸å¨å®¢æ·ç«¯åå¸å¯ç ï¼
// - 客æ·ç«¯åå¸åï¼åå¸å¼æ¬èº«å°±æäº"å¯ç "
// - æ»å»è
è·ååå¸å¼åå¯ä»¥ç´æ¥ç»å½
// - å¿
须卿å¡ç«¯ç¨çå¼åå¸ï¼å®¢æ·ç«¯æ°¸è¿ä¼ ææ
// 3. è°ç¨è®¤è¯å½æ°
const token = await auth.authenticate_user(username, password);
// 4. æ ¹æ®ç»æååº
if (token) {
// è®¤è¯æå
res.json({
success: true,
token: token,
// WHY è¿å tokenï¼å®¢æ·ç«¯åç»è¯·æ±éè¦æºå¸¦
message: 'ç»å½æå'
});
// WHY 设置 HTTP-only Cookieï¼å¯éï¼ï¼
// res.cookie('auth_token', token, {
// httpOnly: true, // WHYï¼é²æ¢ XSS æ»å»è¯»å
// secure: true, // WHYï¼ä»
HTTPS ä¼ è¾
// sameSite: 'strict' // WHYï¼é²æ¢ CSRF æ»å»
// });
} else {
// 认è¯å¤±è´¥ï¼ç¨æ·ä¸å卿å¯ç é误ï¼
// WHY ä¸åºå失败åå ï¼é²æ¢ç¨æ·åæä¸¾
res.status(401).json({
success: false,
message: 'ç¨æ·åæå¯ç é误' // 模ç³çé误信æ¯
});
// WHY è¿å 401 èé 403ï¼
// 401 = æªè®¤è¯ï¼éè¦æä¾åè¯ï¼
// 403 = 已认è¯ä½æ æé
}
æ§è¡ç»æåæï¼
æåè·¯å¾ï¼
客æ·ç«¯è¯·æ± â æå¡ç«¯éªè¯ â è¿å Token
æ¶é´ï¼~100ms
Token 示ä¾ï¼"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
失败路å¾ï¼
客æ·ç«¯è¯·æ± â æå¡ç«¯éªè¯ â è¿å 401 é误
æ¶é´ï¼~100msï¼ä¸æåç¸è¿ï¼é²æ¢æ¶åºæ»å»ï¼
---
### 第 11 æ¥ï¼èªæè¯ä¼°æ£æ¥æ¸
å
**åæå®æåï¼å¼ºå¶éªè¯ä»¥ä¸é¡¹ç®ï¼**
```markdown
## è´¨ééªè¯æ¸
å
### ç解深度éªè¯
- [ ] **æ¯ä¸ªæ ¸å¿æ¦å¿µé½åçäº 3 个 WHY**
- WHY éè¦è¿ä¸ªæ¦å¿µ
- WHY è¿æ ·å®ç°
- WHY ä¸ç¨å
¶ä»æ¹å¼
- [ ] **èªæè§£éæµè¯éè¿**
- [ ] ä¸ç代ç è½è§£éæ¯ä¸ªæ ¸å¿æ¦å¿µ
- [ ] è½è¯´åº"为ä»ä¹"èéåªç¥é"æ¯ä»ä¹"
- [ ] è½å¨ä¸ååºæ¯ä¸åºç¨ï¼è¿ç§»æµè¯ï¼
- [ ] **æ¦å¿µè¿æ¥å»ºç«**
- [ ] æ æ³¨äºæ¦å¿µé´çä¾èµ/对æ¯/ç»åå
³ç³»
- [ ] è¿æ¥å°å·²æç¥è¯ï¼è®¾è®¡æ¨¡å¼ãç®æ³ç论ï¼
- [ ] 说æäºæ¯ä¸ªè¿æ¥çåå ï¼WHYï¼
### ææ¯åç¡®æ§éªè¯
- [ ] **ç®æ³åæå®æ´**
- [ ] æ¶é´/空é´å¤æåº¦æ 注
- [ ] WHY éæ©è¿ä¸ªç®æ³
- [ ] WHY å¤æåº¦æ¯å¯æ¥åç
- [ ] æä¾æå¨åèèµæ
- [ ] **设计模å¼è¯å«**
- [ ] æææ¨¡å¼é½å·²æ 注
- [ ] WHY 使ç¨è¿ä¸ªæ¨¡å¼
- [ ] ä¸ç¨ä¼ææ ·
- [ ] æä¾æ ååè
- [ ] **代ç è§£æè¯¦ç»**
- [ ] å
³é®ä»£ç 段æéè¡è§£æ
- [ ] æ¯è¡å
å«"åä»ä¹"+"WHY è¿æ ·å"
- [ ] æä¾å
·ä½æ°æ®çæ§è¡ç¤ºä¾
- [ ] æ æ³¨æéç¹åè¾¹çæ¡ä»¶
### å®ç¨æ§éªè¯
- [ ] **åºç¨è¿ç§»æµè¯**
- [ ] è³å° 2 个ä¸ååºæ¯çè¿ç§»ç¤ºä¾
- [ ] 说æäºä»ä¹ä¸åãä»ä¹éè¦å
- [ ] æåäºéç¨æ¨¡å¼
- [ ] **使ç¨ç¤ºä¾å¯è¿è¡**
- [ ] 示ä¾ä»£ç 宿´
- [ ] å
å«è¯¦ç»ç WHY 注é
- [ ] 说æäºæ§è¡ç»æ
- [ ] **é®é¢ä¸æ¹è¿å»ºè®®**
- [ ] æåºæ½å¨é®é¢
- [ ] WHY æ¯é®é¢
- [ ] æä¾æ¹è¿æ¹æ¡
- [ ] WHY æ¹è¿æ¹æ¡æ´å¥½
### æç»éªè¯é®é¢
**妿ä¸çå代ç ï¼æ ¹æ®è¿ä»½åæææ¡£ï¼**
1. â
è½å¦ç解代ç ç设计æè·¯ï¼
2. â
è½å¦ç¬ç«å®ç°ç±»ä¼¼åè½ï¼
3. â
è½å¦åºç¨å°ä¸ååºæ¯ï¼
4. â
è½å¦åä»äººæ¸
æ°è§£éï¼
妿æä»»ä½ä¸é¡¹ç"å¦"ï¼è¯´æåæä¸å¤æ·±å
¥ï¼éè¦è¡¥å
ã
è¾åºæ ¼å¼æ»ç»
宿´åæææ¡£ç»æï¼
# [代ç åç§°] 深度çè§£åæ
## çè§£éªè¯ç¶æ
[èªæè§£éæµè¯ç»æè¡¨æ ¼]
## 1. å¿«éæ¦è§
- ç¼ç¨è¯è¨ï¼
- 代ç è§æ¨¡ï¼
- æ ¸å¿ä¾èµï¼
## 2. èæ¯ä¸å¨æºåæï¼ç²¾ç»è¯¢é®ï¼
- é®é¢æ¬è´¨ï¼WHY éè¦ï¼
- æ¹æ¡éæ©ï¼WHY éæ© + WHY ä¸éå
¶ä»ï¼
- åºç¨åºæ¯ï¼WHY éç¨ + WHY ä¸éç¨ï¼
## 3. æ¦å¿µç½ç»å¾
- æ ¸å¿æ¦å¿µæ¸
åï¼æ¯ä¸ªæ¦å¿µ 3 个 WHYï¼
- æ¦å¿µå
³ç³»ç©éµ
- è¿æ¥å°å·²æç¥è¯
## 4. ç®æ³ä¸ç论深度åæ
- æ¯ä¸ªç®æ³ï¼å¤æåº¦ + WHY éæ© + WHY 坿¥å + åèèµæ
- æ¯ä¸ªç论ï¼WHY ä½¿ç¨ + WHY ææ + WHY æéå¶
## 5. 设计模å¼åæ
- æ¯ä¸ªæ¨¡å¼ï¼WHY ä½¿ç¨ + WHY ä¸ç¨ä¼ææ · + å®ç°ç»è + åèèµæ
## 6. å
³é®ä»£ç 深度解æ
- æ¯ä¸ªä»£ç 段ï¼éè¡è§£æï¼åä»ä¹ + WHYï¼ + æ§è¡ç¤ºä¾ + å
³é®è¦ç¹
## 7. æµè¯ç¨ä¾åæï¼å¦æï¼
- æµè¯æä»¶æ¸
åä¸è¦çåæ
- 仿µè¯ä¸åç°çè¾¹çæ¡ä»¶
- æµè¯é©±å¨ççè§£éªè¯
## 8. åºç¨è¿ç§»åºæ¯ï¼è³å° 2 个ï¼
- æ¯ä¸ªåºæ¯ï¼ä¸åçåç + éè¦ä¿®æ¹çé¨å + WHY è¿æ ·è¿ç§»
## 9. ä¾èµå
³ç³»ä¸ä½¿ç¨ç¤ºä¾
- æ¯ä¸ªä¾èµï¼WHY éæ© + WHY ä¸ç¨å
¶ä»
- 示ä¾å
å«è¯¦ç» WHY 注é
## 10. è´¨ééªè¯æ¸
å
[æ£æ¥ææéªè¯é¡¹]
ç¹æ®åºæ¯å¤ç
夿件项ç®
-
æ´ä½æ¶æåæ
- 项ç®ç»ææ + WHY è¿æ ·ç»ç»
- å ¥å£æä»¶ + WHY ä»è¿éå¼å§
- 模ååå + WHY è¿æ ·åå
-
模åé´å ³ç³»
- ä¾èµå¾ + WHY è¿æ ·ä¾èµ
- æ°æ®æµå¾ + WHY è¿æ ·æµå¨
- è°ç¨é¾ + WHY è¿æ ·è°ç¨
-
鿍¡ååæ
- æ¯ä¸ªæ ¸å¿æ¨¡åææ åæµç¨åæ
- å¼ºè°æ¨¡åé´ç WHY å ³ç³»
å¤æç®æ³
-
åå±è§£é
- å ç¨èªç¶è¯è¨æè¿°æè·¯
- åç¨ä¼ªä»£ç å±ç¤ºç»æ
- æåéè¡è§£æå®ç°
-
WHY 贯穿å§ç»
- WHY éæ©è¿ä¸ªç®æ³
- WHY æ¯ä¸æ¥è¿æ ·å
- WHY å¤æåº¦æ¯è¿æ ·ç
-
å¯è§åè¾ å©
- ç¨å ·ä½æ°æ®å±ç¤ºæ§è¡è¿ç¨
- æ¯ä¸æ¥é½è¯´æ WHY
ä¸çæçææ¯æ
-
ææ¯èæ¯è¯´æ
- è¿ä¸ªææ¯æ æ¯ä»ä¹
- WHY åå¨è¿ä¸ªææ¯æ
- WHY 项ç®éæ©å®
-
å ³é®æ¦å¿µè§£é
- ææ¯æ ç¹æçæ¦å¿µ
- WHY è¿æ ·è®¾è®¡
- ä¸å ¶ä»ææ¯æ 对æ¯
-
å¦ä¹ èµæº
- 宿¹ææ¡£é¾æ¥
- WHY æ¨èè¿äºèµæº
- å¦ä¹ è·¯å¾å»ºè®®
åæåæç»æ£æ¥
å¨å¼å§åæåï¼ç¡®è®¤ï¼
- å·²çè§£ç¨æ·ççå®éæ±ï¼å¦ä¹ ï¼å®¡æ¥ï¼é¢è¯åå¤ï¼ï¼
- å·²è¯å«ä»£ç çè¯è¨ãæ¡æ¶ãè§æ¨¡
- 已确å®åæéç¹ï¼å ¨é¢çè§£ vs ç¹å®æ¹é¢ï¼
- åå¤å¥½éæ¶é®”WHY”
- åå¤å¥½è¿è¡èªæè§£éæµè¯
- åå¤å¥½å¯»æ¾æ¦å¿µè¿æ¥
- åå¤å¥½æèåºç¨è¿ç§»
è®°ä½ï¼ç®æ 䏿¯”çå®ä»£ç ”ï¼èæ¯”çæ£çè§£ä»£ç ”ã
ð¤ è¾åºè¦æ±ï¼Token ä¼åçï¼
åæå®æåï¼å¿ é¡»çæç¬ç«ç Markdown ææ¡£ï¼
ä¸ç§æ¨¡å¼çææ¡£çæçç¥
| æ¨¡å¼ | çææ¹å¼ | æä»¶æ°é | éç¨åºæ¯ |
|---|---|---|---|
| Quick | 忬¡ Write | 1 | å¿«é代ç å®¡æ¥ |
| Standard | 忬¡ Write | 1 | å¦ä¹ ç解代ç |
| Deep | æ ¹æ®è§æ¨¡èªå¨éæ©çç¥ | 1-2 | æ·±åº¦ææ¡ã大åé¡¹ç® |
| â 代ç ⤠2000 è¡ | æ¸è¿å¼ Write | 1-2 | é¢è¯åå¤ãå®å ¨ææ¡ |
| â 代ç > 2000 è¡ | å¹¶è¡å¤ç + æ±æ» | å¤ä¸ªä¸´æ¶ç« è â 1 个æç»ææ¡£ | 大å项ç®ã夿代ç åº |
â¡ Token èççç¥
éè¦ååï¼é¿å éå¤è¾åºï¼ç´æ¥åå ¥æä»¶
-
ç¦æ¢å¨å¯¹è¯ä¸è¾åºå®æ´åæ
- 宿´åæç´æ¥åå ¥æä»¶ï¼ä¸è¾åºå°å¯¹è¯
- 对è¯ä¸ä» è¾åºï¼åææè¦ + æä»¶è·¯å¾
-
ååå¤ç大å项ç®
- åæä»¶åæï¼çæåä¸ªææ¡£
- 夿件项ç®ï¼ææ¨¡åçæå¤ä¸ªææ¡£
- è¶
é¿åæï¼æå为
æ¦è¿°.md+模åå-详ç»åæ.md
-
æ¸è¿å¼çæï¼éç¨äº Deep Modeï¼
- å çææ¡æ¶ææ¡£ï¼ç®å½ + æ¦è¦ï¼
- éèå¡«å å å®¹ï¼æ¯æ¬¡è°ç¨ Write è¿½å æ´æ°
ææ¡£çæè§å
-
æä»¶å½åæ ¼å¼
- åæä»¶ï¼
[代ç åç§°]-深度åæ.mdæ[code-name]-deep-analysis.md - 夿件项ç®ï¼
[项ç®å]-æ¦è¿°.md+[模åå]-åæ.md - ä¾å¦ï¼
JWT认è¯-深度åæ.mdãquicksort-deep-analysis.md
- åæä»¶ï¼
-
çææ¹å¼ï¼Token ä¼åæµç¨ï¼
æ¹å¼ä¸ï¼ç´æ¥åå ¥ï¼æ¨èï¼
ç¨æ·: æ·±å ¥åæè¿æ®µä»£ç 1. [宿åæè¿ç¨ï¼ä¸è¾åºå®æ´å 容] 2. ç´æ¥ä½¿ç¨ Write å·¥å ·çæææ¡£ï¼ æä»¶è·¯å¾: [代ç åç§°]-深度åæ.md å 容: [宿´åæå 容] 3. å¨å¯¹è¯ä¸è¾åºç®è¦æè¦ï¼ - åææ¨¡å¼ï¼Standard/Deep - æ ¸å¿åç°ï¼3-5 æ¡è¦ç¹ - æä»¶è·¯å¾ï¼[代ç åç§°]-深度åæ.mdæ¹å¼äºï¼å¤æä»¶é¡¹ç®ååçæ
1. [宿æ´ä½åæ] 2. çææ¦è¿°ææ¡£ï¼ Write: [项ç®å]-æ¦è¿°.md å å®¹ï¼æ´ä½æ¶æã模åå ³ç³»å¾ãåææ¡æ¶ 3. 鿍¡åçæè¯¦ç»ææ¡£ï¼ Write: [模åA]-åæ.md Write: [模åB]-åæ.md Write: [模åC]-åæ.md 4. è¾åºæè¦ï¼ - çæäº 4 ä¸ªææ¡£ - ååºæææä»¶è·¯å¾æ¹å¼ä¸ï¼Deep Modeï¼æ ¹æ®ä»£ç è§æ¨¡èªå¨éæ©çç¥ï¼
Deep Mode 伿 ¹æ®ä»£ç è§æ¨¡èªå¨éæ©æä¼çæçç¥ï¼ ãçç¥ Aï¼æ¸è¿å¼çæã代ç ⤠2000 è¡æ¶ - å çææ¡æ¶ææ¡£ï¼ç®å½ + æ¦è¦ï¼ - éèå¡«å å å®¹ï¼æ¯æ¬¡è°ç¨ Write è¿½å æ´æ° - åè§åæ "Deep Mode è¾åºç»æ - çç¥ A" ç« è ãçç¥ Bï¼å¹¶è¡å¤çã代ç > 2000 è¡æ¶ 1. 主 Agent çææ¡æ¶åä»»å¡åé 2. ä½¿ç¨ Task tool å建å¤ä¸ªå¹¶è¡å Agent 3. æ¯ä¸ªå Agent 䏿³¨ä¸ä¸ªç« èï¼çæç¬ç«æä»¶ 4. 主 Agent æ±æ»ææç« èï¼çææç»ææ¡£ æä»¶ç»æï¼ work/ âââ 00-æ¡æ¶.json # 主 Agent çæçæ¡æ¶ âââ tasks/ # åä»»å¡æè¿°ç®å½ âââ chapters/ # å Agent çæçç« è âââ [项ç®å]-å®å ¨ææ¡åæ.md # æç»æ±æ»ææ¡£ ç¤ºä¾ Task è°ç¨ï¼ Task( description: "深度åæ[ç« èå]ç« è", prompt: "ä½ æ¯[ç« èå]åæä¸å®¶ï¼è¯·æ·±åº¦åæ...[å ·ä½æä»¤]", subagent_type: "general-purpose" ) -
对è¯è¾åºæ ¼å¼ï¼ç²¾ç®çï¼
## åæå®æ **模å¼ï¼** Standard Mode **æ ¸å¿åç°ï¼** - 代ç å®ç°äº [æ ¸å¿åè½] - ä½¿ç¨ [ç®æ³/模å¼] è§£å³ [é®é¢] - å ³é®ä¼åç¹ï¼[ä¼åç¹1]ã[ä¼åç¹2] - æ½å¨é®é¢ï¼[é®é¢1]ã[é®é¢2] **宿´ææ¡£ï¼** `[代ç åç§°]-深度åæ.md`
è¾åºæµç¨å¯¹æ¯
â é« Token æ¶èæ¹å¼ï¼é¿å ï¼ï¼
1. å¨å¯¹è¯ä¸è¾åº 5000 token ç宿´åæ
2. 忬¡ç¨ Write å·¥å
·åå
¥ 5000 token
â æ»è®¡ï¼10000+ token è¾åº
â Token ä¼åæ¹å¼ï¼æ¨èï¼ï¼
1. ç´æ¥ç¨ Write å·¥å
·åå
¥ 5000 token
2. 对è¯ä¸è¾åº 200 token æè¦
â æ»è®¡ï¼5200 token è¾åºï¼èç ~50%ï¼
大å项ç®ååæå
| 项ç®è§æ¨¡ | æ¨èæ¨¡å¼ | çæçç¥ | æä»¶ç»æ |
|---|---|---|---|
| < 500 è¡ | Quick/Standard | åææ¡£ | [åç§°]-åæ.md |
| 500-2000 è¡ | Standard | åææ¡£ï¼å¯è½è¾é¿ï¼ | [åç§°]-åæ.md |
| 2000-10000 è¡ | Deepï¼èªå¨å¹¶è¡ï¼ | å¹¶è¡ç« è | å¤ä¸ªä¸´æ¶ç« è â 1个æç»ææ¡£ |
| > 10000 è¡ | Deepï¼èªå¨å¹¶è¡ï¼ | åå±å¹¶è¡ | 模åçº§å¹¶è¡ + ç« èçº§å¹¶è¡ |
éè¦ï¼ä¸è¦å¨å¯¹è¯ä¸è¾åºå®æ´åæç»æï¼ç´æ¥åå ¥æä»¶ï¼ä» è¾åºæè¦ï¼
ð Deep Mode èªå¨å®ç°æåï¼ç» Claude çå ·ä½æä»¤ï¼
Deep Mode 伿 ¹æ®ä»£ç è§æ¨¡èªå¨éæ©æä¼çç¥ãå½éè¦å¹¶è¡å¤çæ¶ï¼
æ¥éª¤ 1: è¯å«æ¯å¦éè¦å¹¶è¡å¤ç
èªå¨è§¦åæ¡ä»¶ï¼æ»¡è¶³ä»»ä¸å³ä½¿ç¨å¹¶è¡å¤çï¼ï¼
- ä»£ç æä»¶æ° > 10
- ä»£ç æ»è¡æ° > 2000
- ç¨æ·æç¡®è¯´"大项ç®"ã"宿´é¡¹ç®"ã"é¡¹ç®æ´ä½åæ"
- ç¨æ·ä½¿ç¨"å½»åº"ã"å®å
¨ææ¡"ã"æ·±å
¥ç ç©¶"çæ·±åº¦è§¦åè¯ä¸ä»£ç è§æ¨¡è¾å¤§
æ¥éª¤ 2: éæ©å¤ççç¥
if 代ç è¡æ° <= 2000:
使ç¨çç¥ Aï¼æ¸è¿å¼çæï¼é¡ºåºå¤çï¼
else:
使ç¨çç¥ Bï¼å¹¶è¡å¤çï¼ä¸æè¯¦è¿°ï¼
æ¥éª¤ 3: å¹¶è¡å¤çåå¤ï¼çç¥ Bï¼
# å建工ä½ç®å½
mkdir -p code-analysis/{tasks,chapters}
# çææ¡æ¶æä»¶
cat > code-analysis/00-framework.json << 'EOF'
{
"project_name": "[项ç®å]",
"language": "[è¯è¨]",
"total_lines": [è¡æ°],
"core_concepts": [æ¦å¿µå表],
"chapters": [
"èæ¯ä¸å¨æº", "æ ¸å¿æ¦å¿µ", "ç®æ³ç论",
"设计模å¼", "代ç è§£æ", "åºç¨è¿ç§»",
"ä¾èµå
³ç³»", "è´¨ééªè¯"
]
}
EOF
æ¥éª¤ 4: å建并è¡å Agent
å¯¹äºæ¯ä¸ªç« èï¼ä½¿ç¨ Task tool å建ç¬ç«çå Agentï¼
Task(
description: "深度åæ[ç« èåç§°]ç« è",
prompt: """
ä½ æ¯[ç« èåç§°]åæä¸å®¶ã
## ä¸ä¸æ
- 项ç®ï¼{project_name}
- è¯è¨ï¼{language}
- æ ¸å¿æ¦å¿µï¼{core_concepts}
## ä»»å¡
深度åæä»£ç ç[ç« èåç§°]é¨åï¼çæè¯¦ç»ç« èå
容ï¼è³å°{min_words}åï¼ã
## è¦æ±
- 使ç¨åºæ¯/æ¥éª¤ + WHY 飿 ¼æ³¨é
- æ¯ä¸ªå
³é®ç¹åç 3 个 WHY
- æä¾å
·ä½æ§è¡ç¤ºä¾
- å¼ç¨æå¨æ¥æº
## è¾åº
å°å®æ´ç« èå
容åå
¥æä»¶ï¼
code-analysis/chapters/{ç« èå}.md
""",
subagent_type: "general-purpose"
)
æ¥éª¤ 4: æ±æ»ç»æ
çå¾
ææå Agent 宿åï¼ä½¿ç¨ Read å·¥å
·è¯»åææç« èæä»¶ï¼æé¡ºåºåå¹¶ï¼
1. 读å code-analysis/00-framework.json
2. 读å code-analysis/chapters/*.mdï¼æé¡ºåºï¼
3. å并为æç»ææ¡£
4. åå
¥ {项ç®å}-å®å
¨ææ¡åæ.md
ð ç« èæ·±åº¦èªæ£æ åï¼ç¡®ä¿è´¨éï¼
Deep Mode çææ¶ï¼æ¯ç« 宿åå¿ é¡»éè¿ä»¥ä¸æ£æ¥ï¼
## ç« èæ·±åº¦èªæ£æ¸
å
### 1. å
容宿´æ§ï¼å¿
填项ï¼
- [ ] ç« èææå项é½å·²è¦çï¼ä¸è½æ"ç¥"ã"详è§ä¸æ"ã"åä¸"çè·³è¿æ§æè¿°ï¼
- [ ] æ¯ä¸ª WHY 齿å
·ä½è§£éï¼è³å° 2-3 å¥è¯ï¼ä¸è½åªæä¸å¥è¯ï¼
- [ ] 代ç ç¤ºä¾æå®æ´æ³¨éï¼ä½¿ç¨ åºæ¯/æ¥éª¤ + WHY 飿 ¼ï¼
- [ ] å¼ç¨ææ¥æºé¾æ¥ï¼ç®æ³/模å¼/ç论ï¼
### 2. åææ·±åº¦ï¼æç« èç±»åï¼
**æ¦å¿µç±»ç« èï¼ç¬¬ 3 ç« ï¼ï¼**
- [ ] æ¯ä¸ªæ ¸å¿æ¦å¿µé½æ 3 个 WHY
- WHY éè¦è¿ä¸ªæ¦å¿µ
- WHY è¿æ ·å®ç°
- WHY ä¸ç¨å
¶ä»æ¹å¼
**ç®æ³ç±»ç« èï¼ç¬¬ 4 ç« ï¼ï¼**
- [ ] ææ¶é´/空é´å¤æåº¦æ 注
- [ ] æ WHY éæ©è¿ä¸ªç®æ³çè§£é
- [ ] æ WHY å¤æåº¦å¯æ¥åç说æ
- [ ] æéååºæ¯è¯´æ
**设计模å¼ç±»ç« èï¼ç¬¬ 5 ç« ï¼ï¼**
- [ ] ææ¨¡å¼åç§°åæ ååè
- [ ] æ WHY 使ç¨è¿ä¸ªæ¨¡å¼
- [ ] æä¸ç¨ä¼ææ ·ç说æ
**代ç è§£æç±»ç« èï¼ç¬¬ 6 ç« ï¼ï¼**
- [ ] æéè¡è§£æï¼åä»ä¹ + WHYï¼
- [ ] æå
·ä½æ°æ®çæ§è¡ç¤ºä¾
- [ ] æå¤åºæ¯è¿½è¸ªï¼è³å° 2 ä¸ªåºæ¯ï¼
- [ ] ææéç¹åè¾¹çæ¡ä»¶æ æ³¨
### 3. å®ç¨æ§ï¼åºç¨ä»·å¼ï¼
- [ ] æéç¹å·²æ 注
- [ ] è¾¹çæ¡ä»¶å·²è¯´æ
- [ ] åºç¨è¿ç§»åºæ¯è³å° 2 个
- [ ] æ¹è¿å»ºè®®æ WHY 说æ
### 4. æ ¼å¼è§è
- [ ] ä½¿ç¨ Markdown æ ¼å¼
- [ ] 代ç åæè¯è¨æ 注
- [ ] è¡¨æ ¼å¯¹é½æ£ç¡®
- [ ] å表å±çº§æ¸
æ°
### ä¸åæ ¼ç« èçå¤ç
**æ
åµ Aï¼å
容è¿å°ï¼< 300 åï¼**
â 追å ç»èï¼æ·»å æ´å¤è§£éã示ä¾ã对æ¯
**æ
åµ Bï¼WHY åæä¸è¶³**
â è¡¥å
WHYï¼å¯¹æ¯ä¸ªæ ¸å¿ç¹è¿½é®"为ä»ä¹"
**æ
åµ Cï¼ä»£ç 注éä¸å®æ´**
â æ·»å è¯¦ç»æ³¨éï¼ä½¿ç¨ åºæ¯/æ¥éª¤ + WHY 飿 ¼
**æ
åµ Dï¼æ§è¡æµç¨ç¼ºå¤±**
â æ·»å å
·ä½æ°æ®ç¤ºä¾ï¼è¿½è¸ªåéåå轨迹
å¿«éæ·±åº¦è¯ä¼°æ åï¼
| ç« è | æä½åæ° | å¿ å«å ç´ |
|---|---|---|
| 1. å¿«éæ¦è§ | 200 | è¯è¨ãè§æ¨¡ãä¾èµãç±»å |
| 2. èæ¯ä¸å¨æº | 400 | é®é¢æ¬è´¨ãæ¹æ¡éæ©ãåºç¨åºæ¯ |
| 3. æ ¸å¿æ¦å¿µ | 600 | æ¯æ¦å¿µ 3 WHYãå ³ç³»ç©éµ |
| 4. ç®æ³ä¸ç论 | 500 | å¤æåº¦ãWHYãåèèµæ |
| 5. è®¾è®¡æ¨¡å¼ | 400 | 模å¼åãWHYãæ ååè |
| 6. å ³é®ä»£ç è§£æ | 800 | éè¡è§£æãæ§è¡ç¤ºä¾ãåºæ¯è¿½è¸ª |
| 7. æµè¯ç¨ä¾åæ | 400 | æµè¯è¦çãè¾¹çæ¡ä»¶ãæµè¯åç° |
| 8. åºç¨è¿ç§» | 500 | è³å° 2 åºæ¯ãä¸ååçãä¿®æ¹é¨å |
| 9. ä¾èµå ³ç³» | 300 | æ¯ä¾èµç WHYã使ç¨ç¤ºä¾ |
| 10. è´¨ééªè¯ | 200 | éªè¯æ¸ åãåè½æµè¯ |
æ»è®¡ï¼Deep Mode ææ¡£åº ⥠4300 å