昨天修好了導師亂說我寫錯的問題。今天本來想繼續做別的,
結果盯著側邊欄看了一陣子,發現另一件怪事。
我的「弱點累積」好像從來沒變過。
一直都是同一個項目在那裡,數字慢慢往上加。
照理說我這幾天練了不同的題目、犯了不同的錯,清單應該會長出新的項目才對。
與其猜,不如打開 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,
命中越多分數越高。於是:
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 擺在那裡很久了,我卻一直沒打開資料庫看過一眼。
目前還差: