分而治之是人類解決問題的基本手段。普通人與高手之間的差異,很大程度上取決於任務分解的粒度大小。
大師級程式設計師的工作秘笈是任務分解,分解到可以進行的微操作。
為什麼要任務分解#
軟體變更成本會隨著時間和開發階段逐步增加。越早發現問題,修復成本越低。任務分解讓我們:
- 更早發現問題
- 更準確估算時間
- 更容易追蹤進度
- 更少被打斷後迷失
分解到什麼程度#
任務拆小,越小越好。每一步都應該非常容易執行。
任務分解實例:修復一個 RPC 介面的 Bug
- 列出每個程式碼的修改點
- 要修改的測試
- 要增加的測試
- 合併到哪個分支
- 修改 RPC 文件
- 文件中有哪些點要修改
這樣做的好處:
- 事前思考:不會造成遺漏
- 抗打斷:被中斷後知道該從哪一步繼續
任務分解的順序#
按照完整實現一個需求的順序安排開發任務,而不是按技術層次(先資料庫、再後端、最後前端)。
先寫思路、需要用到的知識點、API 等,寫出各個小任務,然後對應寫出關鍵程式碼段。最後真正敲程式碼可能只花很少時間。
測試金字塔#
行業中測試組合的最佳實踐:
flowchart TB
subgraph pyramid [測試金字塔]
E2E[🔺 E2E 測試<br/>少量]
INT[🔶 整合測試<br/>適量]
UNIT[🟩 單元測試<br/>大量]
end
E2E --> INT --> UNIT
style E2E fill:#ffcdd2,stroke:#c62828
style INT fill:#fff9c4,stroke:#f9a825
style UNIT fill:#c8e6c9,stroke:#2e7d32多寫單元測試。單元測試運行快、覆蓋廣、定位問題準確。
測試驅動開發(TDD)#
TDD 的節奏是:紅 → 綠 → 重構
flowchart LR
R[🔴 紅<br/>寫失敗的測試] --> G[🟢 綠<br/>最少程式碼通過]
G --> RF[🔵 重構<br/>改善結構]
RF --> R
style R fill:#ffcdd2,stroke:#c62828
style G fill:#c8e6c9,stroke:#2e7d32
style RF fill:#bbdefb,stroke:#1565c0- 紅:先寫一個失敗的測試
- 綠:寫最少的程式碼讓測試通過
- 重構:改善程式碼結構,保持測試通過
重構是 TDD 區別於「測試先行」的關鍵。 TDD 帶來的思維改變是:編寫可測的程式碼。
好測試的標準:A-TRIP#
| 特性 | 說明 |
|---|---|
| Automatic | 自動化,可重複執行 |
| Thorough | 全面,覆蓋各種情況 |
| Repeatable | 可重複,結果穩定 |
| Independent | 獨立,測試之間不互相依賴 |
| Professional | 專業,測試程式碼也要有品質 |
需求管理:艾森豪威爾矩陣#
將事情按照重要和緊急兩個維度劃分:
quadrantChart
title Eisenhower Matrix
x-axis "Not Urgent" --> "Urgent"
y-axis "Not Important" --> "Important"
quadrant-1 "Do First"
quadrant-2 "Schedule"
quadrant-3 "Eliminate"
quadrant-4 "Delegate"| 緊急 | 不緊急 | |
|---|---|---|
| 重要 | 立即做 | 重點投入精力 |
| 不重要 | 委託別人做 | 盡量少做 |
重要但不緊急的事情應該是我們重點投入精力的地方。許多人把時間都花在緊急但不重要的事情上。
最小可行產品(MVP)#
「剛剛好」滿足客戶需求的產品。
實踐原則: 用最小的代價找到一條可行的路徑。
技術 Spike#
對不了解的技術任務:
- 先進行一次技術 Spike(技術探針)學習新技術
- 丟棄 Spike 過程中開發的原型程式碼
- 然後再做正式的任務分解
實戰指南#
| 情境 | 行動指南 |
|---|---|
| 動手做一個工作之前 | 先對它進行任務分解 |
| 編寫測試 | 多寫單元測試 |
| 設計程式碼 | 編寫可測的程式碼 |
| 分解任務 | 越小越好 |
| 安排任務順序 | 按完整實現需求的順序 |
| 管理需求 | 先把需求拆小 |
| 做產品開發 | 採用 MVP |
| 安排工作優先級 | 盡量做最重要的事 |