開發日誌 做了什麼 · 試過什麼 · 否決了什麼 · 留下了什麼
進行中 dev-blog 2026-W34

讓工具去問問題,不要讓它寫文章

從 commit 生成日誌這件事我試了,結果是一坨流水帳。改成讓工具生成「該問的問題」。

AbstractAuto-generating posts from commits produced filler. The tool now generates recall questions instead, and the writing happens in a Q&A pass.

那時候在想什麼

原本的想法是寫一支程式讀 git log,自動生出日誌草稿。commit 訊息、變動檔案、時間區間都在那裡,拼一拼應該就能成篇。

實際做了什麼

拿 super-reversi 跑第一版。輸出大概長這樣:

這段時間修改了 src/main-complete.tssrc/i18n.tssrc/style.css 等檔案,新增了多語系支援,並改善了響應式版面。

這句話沒有錯,可是它沒有任何價值。任何人打開 GitHub 都能得到同一句。

問題出在資訊來源本身。那個 repo 六十二個 commit 裡有十八個訊息是 addfix。真正有內容的地方在別的地方:

#17 codex/fix-blurred-rectangle-for-multi-piece-flip
#22 codex/add-support-for-7-hit-combos

PR 的分支名比 commit 訊息誠實得多。還有一個 commit 寫著 移除光束,那一行比前面五十個 fix 加起來都有資訊量,因為它記錄了一個決定。

試過但沒留下

第二版試著讓工具把這些線索組成敘事。偵測到大量刪除就寫「進行了重構」,偵測到新目錄就寫「引入了新模組」。

結果更糟。這種句子讀起來像真的,可是它在猜。「引入了新模組」聽起來很合理,但當時為什麼引入?工具不知道,而它寫出來的句子會讓人以為它知道。編出來的因果比留白危險。

結論

工具的產物改成兩塊,一塊是事實,一塊是問題。

事實那塊照抄不加工:檔案熱點、改最多次的檔案、PR 分支名、完整 commit 清單。問題那塊依訊號生成,看到 revert 就問「是踩到什麼還是想法變了」,看到「移除」就問「當初為什麼做、後來為什麼決定不要」,看到超過四成訊息是 addfix 就直接標注「這篇幾乎沒東西可以從 log 撈,整段靠回憶」。

跑 super-reversi 的第二片,問出來的是這些:

  • 有 1 次大量刪除,最多一次 −2820 行,拿掉的是什麼
  • 新開了 src/i18nsrc/workerspublictests/unit,當時是想解決什麼
  • 之前一直在動的 memoryscriptssrc/view 這次完全沒碰,是刻意先擱著還是已經定案
  • src/main-complete.ts 被改了 20 次,是需求還沒定還是做法沒找到

這些問題我答得出來,而答案就是文章。

標進行中是因為提問規則還在調。第一版把「新開了根目錄」當成訊號,那是純雜訊,根目錄的檔案不是一塊區域。第一個切片問「新開了什麼」也沒有意義,因為那裡所有東西都是新的。這種規則要跑過幾個真的 repo 才會收斂。