SKILL.md
唯讀
名稱
lesson-learned
描述
透過 Git 歷史分析最近的程式碼變更,並萃取出軟體工程上的教訓。當使用者問『這裡的教訓是什麼?』、『我能從中學到什麼?』、『工程上的收穫』、『我剛剛學到了什麼?』、『反思這段程式碼』,或想要從近期工作中提取原則時使用。
Lesson Learned
從實際的程式碼變更中萃取出具體且有根據的軟體工程教訓。不是一堂課——而是一面鏡子。讓使用者看到他們的程式碼已經展現了什麼。
開始之前
先載入原則參考文件。
- 讀取
references/se-principles.md以取得原則目錄 - 如果懷疑變更中有可改進之處,可選讀
references/anti-patterns.md - 決定分析範圍(見第一階段)
在載入至少 se-principles.md 之前,請勿繼續。
第一階段:決定範圍
詢問使用者或從上下文推斷要分析的內容。
| 範圍 | Git 指令 | 使用時機 |
|---|---|---|
| 功能分支 | git log main..HEAD --oneline + git diff main...HEAD |
使用者在非 main 分支上(預設) |
| 最近 N 個提交 | git log --oneline -N + git diff HEAD~N..HEAD |
使用者指定範圍,或在 main 分支上(預設 N=5) |
| 特定提交 | git show <sha> |
使用者提及特定提交 |
| 工作目錄變更 | git diff + git diff --cached |
使用者在提交前說『這些變更怎麼樣?』 |
預設行為:
- 如果在功能分支上:分析分支提交與 main 的差異
- 如果在 main 上:分析最近 5 個提交
- 如果使用者提供不同範圍,則使用該範圍
第二階段:收集變更
- 使用決定的範圍執行
git log以取得提交列表與訊息 - 執行
git diff取得該範圍的完整差異 - 如果差異很大(超過 500 行),先使用
git diff --stat,然後選擇性地讀取變更最多的前 3-5 個檔案 - 仔細閱讀提交訊息——它們包含了原始差異中遺漏的意圖
- 只讀取有變更的檔案。不要讀取整個儲存庫。
第三階段:分析
找出主導模式——這些變更中最具啟發性的一件事。
尋找:
- 結構性決策——程式碼是如何組織的?為什麼是那些邊界?
- 所做的取捨——得到了什麼 vs. 犧牲了什麼?(可讀性 vs. 效能、DRY vs. 清晰度、速度 vs. 正確性)
- 解決的問題——變更前後是什麼?是什麼讓「之後」變得更好?
- 錯失的機會——程式碼可以在哪裡改進?(溫和地提出,例如「下次可以考慮……」)
將發現對應到 references/se-principles.md 中的具體原則。要具體——引用實際程式碼,提及實際檔案名稱與行數變更。
第四階段:呈現教訓
使用以下模板:
## 教訓:[原則名稱]
**程式碼中發生了什麼:**
[2-3 句描述具體變更,引用檔案與提交]
**運作中的原則:**
[1-2 句解釋該軟體工程原則]
**為什麼重要:**
[1-2 句說明實際後果——沒有這個原則會出什麼錯,或因為它而做對了什麼]
**下次的收穫:**
[一句具體、可行動的建議,使用者可以應用到未來的工作中]
如果有第二個值得注意的教訓(最多額外 2 個):
---
### 也值得注意:[原則名稱]
**在程式碼中:** [1 句]
**原則:** [1 句]
**收穫:** [1 句]
不該做的事
| 避免 | 原因 | 改為 |
|---|---|---|
| 列出所有勉強適用的原則 | 令人不知所措且過於籠統 | 挑選 1-2 個最相關的 |
| 分析未變更的檔案 | 範圍蔓延 | 只關注差異 |
| 忽略提交訊息 | 它們包含了差異遺漏的意圖 | 將其視為主要上下文來閱讀 |
| 脫離程式碼的抽象建議 | 無法行動 | 始終引用具體檔案/行數 |
| 只有負面回饋 | 打擊士氣 | 先肯定有效之處,再提出改進建議 |
| 超過 3 個教訓 | 稀釋洞察力 | 一個紮實的教訓勝過七個模糊的 |
對話風格
- 反思性,而非指導性。 以使用者自己的程式碼作為主要證據。
- 永遠不要說『你應該……』——而是說『這裡的做法顯示了……』或『下次你遇到這個時,可以考慮……』
- 如果程式碼很好,就說出來。 不是每個教訓都是關於哪裡出錯。辨識好的模式能強化它們。
- 如果變更很瑣碎(單一設定調整、錯字修正),誠實地說出來,而不是硬擠出一個教訓。『這些變更很直接——這裡沒有深層教訓,只是良好的維護。』
- 要具體。 籠統的建議毫無價值。每個主張都必須指向具體的程式碼變更。






