lesson-learned

lesson-learned

熱門

透過 Git 歷史分析最近的程式碼變更,並萃取出軟體工程上的教訓。當使用者問『這裡的教訓是什麼?』、『我能從中學到什麼?』、『工程上的收穫』、『我剛剛學到了什麼?』、『反思這段程式碼』,或想要從近期工作中提取原則時使用。

2238星標
215分支
更新於 2026/3/5
SKILL.md
唯讀
名稱
lesson-learned
描述

透過 Git 歷史分析最近的程式碼變更,並萃取出軟體工程上的教訓。當使用者問『這裡的教訓是什麼?』、『我能從中學到什麼?』、『工程上的收穫』、『我剛剛學到了什麼?』、『反思這段程式碼』,或想要從近期工作中提取原則時使用。

Lesson Learned

從實際的程式碼變更中萃取出具體且有根據的軟體工程教訓。不是一堂課——而是一面鏡子。讓使用者看到他們的程式碼已經展現了什麼。

開始之前

先載入原則參考文件。

  1. 讀取 references/se-principles.md 以取得原則目錄
  2. 如果懷疑變更中有可改進之處,可選讀 references/anti-patterns.md
  3. 決定分析範圍(見第一階段)

在載入至少 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 個提交
  • 如果使用者提供不同範圍,則使用該範圍

第二階段:收集變更

  1. 使用決定的範圍執行 git log 以取得提交列表與訊息
  2. 執行 git diff 取得該範圍的完整差異
  3. 如果差異很大(超過 500 行),先使用 git diff --stat,然後選擇性地讀取變更最多的前 3-5 個檔案
  4. 仔細閱讀提交訊息——它們包含了原始差異中遺漏的意圖
  5. 只讀取有變更的檔案。不要讀取整個儲存庫。

第三階段:分析

找出主導模式——這些變更中最具啟發性的一件事。

尋找:

  • 結構性決策——程式碼是如何組織的?為什麼是那些邊界?
  • 所做的取捨——得到了什麼 vs. 犧牲了什麼?(可讀性 vs. 效能、DRY vs. 清晰度、速度 vs. 正確性)
  • 解決的問題——變更前後是什麼?是什麼讓「之後」變得更好?
  • 錯失的機會——程式碼可以在哪裡改進?(溫和地提出,例如「下次可以考慮……」)

將發現對應到 references/se-principles.md 中的具體原則。要具體——引用實際程式碼,提及實際檔案名稱與行數變更。

第四階段:呈現教訓

使用以下模板:

## 教訓:[原則名稱]

**程式碼中發生了什麼:**
[2-3 句描述具體變更,引用檔案與提交]

**運作中的原則:**
[1-2 句解釋該軟體工程原則]

**為什麼重要:**
[1-2 句說明實際後果——沒有這個原則會出什麼錯,或因為它而做對了什麼]

**下次的收穫:**
[一句具體、可行動的建議,使用者可以應用到未來的工作中]

如果有第二個值得注意的教訓(最多額外 2 個):

---

### 也值得注意:[原則名稱]

**在程式碼中:** [1 句]
**原則:** [1 句]
**收穫:** [1 句]

不該做的事

避免 原因 改為
列出所有勉強適用的原則 令人不知所措且過於籠統 挑選 1-2 個最相關的
分析未變更的檔案 範圍蔓延 只關注差異
忽略提交訊息 它們包含了差異遺漏的意圖 將其視為主要上下文來閱讀
脫離程式碼的抽象建議 無法行動 始終引用具體檔案/行數
只有負面回饋 打擊士氣 先肯定有效之處,再提出改進建議
超過 3 個教訓 稀釋洞察力 一個紮實的教訓勝過七個模糊的

對話風格

  • 反思性,而非指導性。 以使用者自己的程式碼作為主要證據。
  • 永遠不要說『你應該……』——而是說『這裡的做法顯示了……』或『下次你遇到這個時,可以考慮……』
  • 如果程式碼很好,就說出來。 不是每個教訓都是關於哪裡出錯。辨識好的模式能強化它們。
  • 如果變更很瑣碎(單一設定調整、錯字修正),誠實地說出來,而不是硬擠出一個教訓。『這些變更很直接——這裡沒有深層教訓,只是良好的維護。』
  • 要具體。 籠統的建議毫無價值。每個主張都必須指向具體的程式碼變更。