iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0

BUG與他的產地

昨天修好了導師亂說我寫錯的問題。今天本來想繼續做別的,
結果盯著側邊欄看了一陣子,發現另一件怪事。

我的「弱點累積」好像從來沒變過。

一直都是同一個項目在那裡,數字慢慢往上加。
照理說我這幾天練了不同的題目、犯了不同的錯,清單應該會長出新的項目才對。

直接去看資料庫

與其猜,不如打開 Firestore 看實際存了什麼:

s1411332077: missing-return ×9
   last_note: 當條件不符合時函式缺少對應的 return 回傳值

九筆,全部擠在同一個分類。而且那個 note 講的是「函式缺少 return」——
但我現在練的是 CPE 題,寫的是讀 stdin、印 stdout 的完整程式,
根本沒有「函式回傳值」這回事。

清單沒有變,不是因為沒在寫,是因為每次都寫到同一格。

問題比想像中大

我把導師的分類清單和題庫的標記拿出來對照:

兩邊都有  : control-flow, indentation, loop, type-confusion
只有導師有: dict-access, missing-return, recursion-base-case
只有題庫有: io-eof, io-parse, off-by-one, output-format

這兩份清單是我在不同時間、為不同目的寫的:

  • 導師的分類是專案最早期寫的,那時的題目是「實作一個函式」
  • 題庫的 skills 是改成 CPE 題之後寫的,用的是 CPE 的常見錯誤

它們從來沒有對過。

而「依我的弱點出題」是怎麼運作的?拿黑板上的代碼去比對題目的 skills,
命中越多分數越高。於是:

uva-118   分數=0
uva-272   分數=0
uva-299   分數=0
...       全部 0

所有候選都是零分。 挑題退化成照題庫順序給下一題。

我以為自己做好的那個「閉環」——導師寫進黑板、出題讀出來——
接線是通的,但兩端講的是不同的語言,所以資料流過去等於沒流。
畫面上完全看不出來,因為它還是會給你下一題。

回頭看導師的 prompt 就懂了。它被要求「從這份清單挑出學生顯露的錯誤觀念」,
而那份清單裡對一支 CPE 程式來說,沒有一個真的合用。

它看到一支只讀一行輸入的程式,想講的是「你沒有讀到檔案結尾」,
但選項裡沒有這一項。最接近的是什麼?missing-return。

模型不是判斷錯了,是我只給了它錯的選項。

修正方法

把詞彙表抽成一個獨立模組,讓所有人共用同一份:

# misconceptions.py
CODES = (
    "io-eof",           # 沒讀到 EOF,或多筆測資只處理一筆
    "io-parse",         # 讀進來的字串沒轉型
    "output-format",    # 多餘空白、缺換行、測資之間的空行
    "off-by-one",       # 差一錯誤
    "loop",
    "control-flow",
    "indentation",
    "type-confusion",
    "other",
)

改完之後再對照一次:

只有導師有: ['other']   ← 刻意的,清單外的錯誤要有地方去
只有題庫有: []

今日總結

“接線通了不等於系統會動”

我測過導師會寫進黑板,也測過出題會讀黑板,兩邊都是綠的。
但沒有任何一個測試問過「寫進去的東西,讀出來的人看得懂嗎」。

介面對得上、型別對得上、資料真的流過去了——語意卻對不上。
這種 bug 不會拋例外、不會讓測試變紅,只會讓功能安靜地失效。

抓到它的方法也不是寫更多單元測試,而是去看真實資料。
那九筆 missing-return 擺在那裡很久了,我卻一直沒打開資料庫看過一眼。

目前還差:

  • 看有無更多BUG or 可改進地方
  • 沙盒系統

上一篇
Day 18:Agent Debug
下一篇
Day 20:沙盒 (上)
系列文
基於 Multi-Agent 協作之蘇格拉底式程式學習與自動化評測系統 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言