Skip to content

教學文章裡的程式碼要寫到什麼程度:步驟標籤、追蹤、Parsons 題與跑不跑得起來

2026年10月14日1 分鐘
TL;DR替程式例題標上「這一步要達成什麼」,在一門入門課的準實驗裡,有標籤的班剛學完的小考較好,之後的考試沒有顯著差別;現場寫程式、用 Parsons 題代替寫程式,都沒有測到學習上的差別。GitHub 上的公開 notebook 照存下來的順序重跑,跑完沒有錯誤的約四分之一;程式跑不起來對讀者學習的影響,沒有研究量過。

🌏 English version

這是「教學文章怎麼寫」系列的第 3 篇,談文章裡的程式碼。前面兩篇談的是文字(例子與開頭、文中的問題與回饋)和圖;公式、符號與術語之後的篇會談。

起因是本站的 Harvard CS50 AI 七週導讀。2026-10-13 的獨立審稿下載官方發佈的檔案,逐週拿文章貼的程式去比對,有幾週還接上去實際執行。好幾週的舊版專案參考實作不是跑不起來,就是和官方檔案的介面對不上;各週是怎麼確認的,差別很大(細節在「本站的例子」一節)。修完之後,專案節又因為課程的學術誠信政策,改成解題思路、虛擬碼、容易出錯的地方、怎麼檢查在前,完整實作摺疊在最後。這兩件事留下三個問題:貼在文章裡的程式要做到什麼程度;把程式切成步驟、教讀者追蹤執行、出排列程式片段的題目,各有多少證據;程式跑不起來對讀者的影響,有沒有人量過。

來源怎麼選、怎麼讀的。這篇的 13 個來源是從一輪掃描裡挑出來精讀的,每篇從頭讀到尾並留有抽取紀錄。它們有明顯的偏向:電腦科學教育的研討會論文、大學的入門程式課(CS1)、美國的學校、英文。沒有一篇的受試者在讀網頁上的教學文章;學習研究的受試者是課堂或實驗室裡的學生,程式能不能跑的研究則根本沒有讀者。我找到的唯一一份程式教學的量化統合分析(Scherer 等 2020),只拿到摘要,不引它的數字。所以這篇的骨架是一份敘事型的文獻回顧,它只把各研究分成「顯著」與「不顯著」,沒有合併效果量。

先看結論

做法證據強度
程式例題標上「這一步要達成什麼」的標籤(子目標)一門 CS1 的課堂準實驗:剛學完的小考 48% 對 41%,之後的考試平均沒有顯著差別;實驗室研究:效果要看練習題和例題差多遠中;研究多出自同一個團隊
給一段缺幾行的程式要讀者補完文獻回顧轉述同一團隊的三篇與另一篇,方向一致,最早的是 1990 年;其中一篇補完組花的時間較多,另一篇沒有推論統計弱到中;全是轉引,原始研究我沒讀
現場一步步寫程式,對比講解寫好的程式一門 CS1 的準實驗:成績、寫程式的過程都沒有測到差別;現場組較多人要老師放慢沒有測到差別;是課堂講課,不是文章
教讀者逐行追蹤,並把變數值寫在表上24 人的實驗,當場的追蹤題平均 30.0 對 24.6 分(滿分 36),單尾檢定剛好過門檻弱,樣本小
先教讀程式,再教寫37 人的實驗,進步量的組間差異不顯著,兩組前測就不相等沒有測到差別
追蹤能力與寫程式能力的關係38 人的一次期末考,迴圈追蹤和寫程式相關 r = .63相關,不是因果
用 Parsons 題(排列程式片段)代替寫程式練習五校研究:後測沒有差別,練習時間也沒有差別;先前的單校研究是較快、學習相當沒有測到學習差別;省不省時間,研究之間不一致
Parsons 題加干擾項(混入錯的程式行)同一份報告的另一項研究:後測成績沒有差別,語法錯誤較少,效果小弱
公開的程式原樣能不能跑GitHub 上的 notebook 跑完沒有錯誤 24%、結果相同 4%;Python gist 24%;Stack Overflow 的 Python 片段 26%描述性資料,沒有量對學習的影響
文件裡提到的程式名稱會不會過期熱門專案有 29% 被工具標出至少一處描述性;工具沒有報告準確度

「沒有測到差別」不等於「沒有效果」。這批研究多半用顯著性檢定,樣本又小;回顧的作者自己說,這種虛無結果在這個架構下不能下結論。

程式例題的研究有哪些

Kasia Muldner、Jay Jennings 與 Veronica Chiarelli 2022 年的回顧只看兩種例題:示範怎麼一步步追蹤程式的「追蹤例題」,和給出寫好的程式的「寫程式例題」,理由是只有這兩種的研究量夠。我從它的表 1 加總,納入的研究約 87 篇(原文沒有寫總數)。這是敘事型的回顧,沒有合併效果量,也沒有替研究品質評分。

依作者的綜合,正向而且一致的有兩種:

  • 子目標標籤:在例題裡把程式分成幾步,每一步標上它要達成的目的。作者說這一項有多篇研究、而且被複製過。
  • 補完式例題:給一段寫了一部分的程式,要學習者補完。作者轉述 Jeroen van Merriënboer 團隊 1990、1992、2002 年的三篇與 Chang 等人的一篇,方向一致;其中 1990 年那篇的補完組每堂花的時間較多,1992 年那篇把時間拉平之後好處仍在,Chang 那篇沒有報告推論統計。

沒有測到差別的有:老師現場示範的例題對靜態例題、講解用語音或文字、類比式的例題、泛用的自我解釋提示(只找到一篇),以及程式視覺化工具裡的個別功能(動畫對靜態、適性對固定)。最後這一項要分清楚:作者說視覺化工具本身在多數研究裡勝過傳統活動,沒有差別的是工具裡的各種功能,那些研究的樣本只有 14 到 22 人。

「在例題旁邊逐行加註解」這一題,這份回顧給不出乾淨的答案。直接比較的只有一篇:有註解時中學生寫出較多正確的程式,但只在例題和題目相似時成立,註解的種類沒有差別,而且量的是當下的作業表現。另一篇只有單組的研究,學生看加註例題的次數和成績是負相關。

讀這份回顧要注意一件事:摘要把 Parsons 題和視覺化工具列為「已有研究基礎」,指的是研究量,不是效果。正文的結論是 Parsons 題省時間、沒有學習上的優勢。

把步驟標上名字:子目標標籤

子目標標籤(subgoal label)是一行放在一組程式前面的短句,寫的是這一步要達成什麼,不是這一行在做什麼。Lauren Margulieux 等人論文裡的例子,是一題「判斷 if 敘述會走哪一支」的例題,拆成三個標籤:哪些敘述是一組、if 的條件是真是假、真就走真的那一支,假就什麼都不做或走 else。每個標籤下面接該步的實際演算,最後給答案。

這些標籤不是作者隨手下的小標。他們用一種叫 TAPS 的訪談法找出來:一位教了 24 年入門程式的老師邊解題邊講,分析者追問老師已經熟練到講不出理由的步驟,直到分析者只靠列出的步驟就能解新題。

一門課裡的結果

Margulieux、Briana Morrison 與 Adrienne Decker 2020 年的課堂研究在美國一所大學的 Java 入門課做,五個班中兩個班用有標籤的例題,三個班用同一批例題但不加標籤,最後分析 120 對 145 人。學生自己選班,所以不是隨機分派。標籤只用在每種新題型第一次出現時,十五週裡佔五週;例題是老師在翻轉教室的課堂上示範的。

  • 學完新題型一週內的小考,有標籤的兩個班平均 48%,對照組 41%,效果量 d = 0.44。小考是線上作答,每次只佔學期成績的 0.44%。
  • 整學期四次考試的平均,75% 對 72%,差異不顯著。把缺考算零分的考試總分則是顯著的,因為有標籤的那一組缺考較少。
  • 只考了兩次以下的人,有標籤的一組約 10%、對照組約 20%(這是我從原文的人數相加,原文沒有寫合計,也沒有做檢定)。作者據此說有標籤的學生退選與不及格的機率約減半,同時註明這是從考試資料推的,不是學校的退選紀錄。

作者的解讀是:沒有標籤的學生學久了會追上,但過程可能較吃力,撐不下去的人就離開了。這是推測,論文沒有量時間或挫折感。作者自己畫了適用範圍:對已經會這套解法、或本來就有好讀書方法的人,標籤大概沒有用。限制方面,他們列了兩條:沒有隨機分派,以及有標籤那兩班的老師就是研究團隊的成員。

實驗室裡的結果:要看練習題和例題差多遠

同一團隊做過三個實驗室實驗,都用虛擬碼教 while 迴圈,例題分三種格式:沒有標籤、給現成的標籤、留空讓學生自己寫標籤。每個例題後面接一題練習,練習題有兩種:情境相同只換數字,或情境不同但解法格式相同。Morrison、Margulieux 與 Decker 2020 年的論文把三個實驗共 220 人的資料合起來重新分析。

結果是格式和練習題的距離有交互作用:

  • 給現成標籤時,練習題換了情境的那組分數最高(從圖與事後比較看出的型態;「給標籤之內,換情境對只換數字」這一對,合併分析沒有直接檢定);練習題只換數字時,給標籤和不給標籤幾乎一樣(d = .10),而給標籤的那組多花了約 20 分鐘。
  • 學生自己寫標籤時,反過來是練習題只換數字的那組較高。

六個兩兩比較裡只有兩個達到顯著,所以「這兩組最好」是作者依型態做的歸類。作者說給現成標籤要配情境不同的練習題,和認知負荷理論的預測相反,他們沒有解釋。同一份資料裡,五題追蹤題的後測、一題 Parsons 題、自陳的認知負荷,三項都沒有任何組別差異。

這份合併分析不算獨立的複製,因為資料包含了原本發表過的實驗。明確以複製為目的、換一所學校收資料的,是 Morrison、Decker 與 Margulieux 2016 年的複製研究:關鍵的那一對比較(給標籤時,換情境對只換數字)方向相同,但只有 10 個人,沒有達到顯著。

放到文章裡要隔幾層

這組研究最接近「作者在程式裡替讀者標好每一步的目的」,也就是給現成標籤的條件。我從中讀出一個可以用的提醒:給了標籤,後面接的練習要換一個情境,不能只換數字。這是我的推論。

推過去要隔三層。研究的標籤是用專家訪談找出來的;用在老師課堂示範或實驗室的例題,不是讀者自己讀的文章;結果是當場或一週內的測驗。沒有研究測過把標籤寫成程式註解或小標題,放在網頁教學文裡有沒有用。

現場寫程式,對比講解寫好的程式

Anshul Shah 等人 2023 年的研究在 UC San Diego 的 Python 入門課比較兩個由同一位老師教的班,同意參加研究的學生 115 對 110 人,學生自己選班。

  • 現場寫程式的班:老師在編輯器裡當場打,邊打邊說想法,分小步加程式、用 print 看變數,有時刻意撞錯再示範除錯。
  • 寫好程式的班:老師放寫好的程式投影片,在上面手寫註記,畫記憶體圖、列出迴圈每一輪的值。

所以對照組不是唸一遍程式,兩邊都有老師講解,差在程式是當場長出來的還是一次給完。

結果是作業、練習單、期中考、期末考、學期總成績都沒有測到差別,學期總成績的效果量只有 0.018。寫程式過程的指標(是不是一小段一小段地寫、同一種錯會不會一再出現)也沒有差別。除錯題現場組做對的比例較高,但沒有達到顯著。作者的結論是:現場寫程式沒有讓學生寫程式的過程變好,也沒有讓成績變差。

差別出現在學生的感受。期中的開放題裡,現場組約 18% 的回答要老師放慢,另一班是 2%。期末的匿名教學評量裡,兩班多數人都同意「講課能抓住注意力」,現場班同意的比例低約 9 個百分點(我從圖上的各選項比例相加)。作者推測原因是老師同時在打字和講解,學生不知道該抄程式還是抄講解,而且抄不到手寫的記憶體圖。作者也指出,學生說自己「看到」了寫程式和除錯的過程,但這沒有變成量得到的行為差異。

Muldner 的回顧轉述了另外兩篇比較:Rubin 2013 年的課堂研究(146 人)考試與學期成績沒有差別,期末專題是現場組較好;Raj 等人 2020 年的研究沒有差別,數值上反而是靜態組進步較多、現場組進步幾乎是零,只是不顯著;回顧作者說進步量的標準差很大,檢定力可能不夠。這兩篇我沒有讀原文。

這幾篇比的都是課堂講課。文章裡對應的問題是:把程式一段一段長出來、每段後面接說明,還是一次給完整程式再逐段解釋。這個問題目前沒有研究直接測過。

追蹤:讓讀者知道程式一步一步做了什麼

追蹤(tracing)指的是照著程式一行一行執行,記下每個變數在每一步的值,最後說出程式會印出什麼。

一個教追蹤策略的小實驗

Benjamin Xie、Greg Nelson 與 Amy Ko 2018 年的實驗教了一套追蹤的步驟:先讀題,找到程式從哪一行開始執行,再照語言的規則一行一行做,每次呼叫函式就在紙上開一張「名稱/值」兩欄的表,變數更新時劃掉舊值寫新值,函式結束就劃掉整張表。教的時間約 5 分鐘,做第一題時研究者再帶一次。

24 位修 Java 入門課的學生分成兩組,對照組用自己原本的方法。當場做六題「這段程式會印出什麼」,教了策略的那組平均 30.0 分,對照組 24.6 分(滿分 36);用的是單尾檢定,剛好過顯著門檻。六題裡單獨看只有一題顯著,是有巢狀 if/else、要同時記好幾個變數的那一題。幾天後的期中考,策略組平均較高但不顯著,而且是學生自己回報的成績,兩組在研究結束時都接受了研究者的家教。

質性的觀察可能比分數更有用:對照組考得最好的六個人,本來就會一行一行追、把中間值寫下來,只是不一定每次都寫;策略組的低分者則沒有人中途放棄。這個策略把熟手本來就在做的事明講出來,但補不了語法知識的洞,兩組低分者的錯都反映語意知識不完整。作者自己說需要複製研究。

要注意的是,受試者是自己畫表。拿它來支持「文章裡附一張作者畫好的變數表」是類推。談圖的那一篇建議演算法的逐步執行用狀態表,那是另一批證據。

把執行過程寫出來,對誰有用

Muldner 的回顧轉述了 Richard Mayer 1975 年與 Bayman 和 Mayer 1988 年的實驗(BASIC 時代的研究,我沒有讀原文)。依它的轉述,把執行過程一步步寫出來的例題,不論有沒有附機器運作的示意圖,對先備知識低的學習者在追蹤題上有幫助;先備知識高的人看不出差別。寫程式的題目上方向不同:Mayer 的一個實驗是只有文字的例題較好,Bayman 和 Mayer 的實驗裡先備知識高的人用簡略的例題較好。回顧作者的用語是這個好處「may exist only for」先備知識低的學生,最佳格式還要研究。

先學讀,再學寫

Nelson、Xie 與 Ko 2017 年的研究做了一個只教讀程式的網頁系統(PLTutor):學習者不寫程式,只一步步看 JavaScript 的執行、填被藏起來的值。37 位剛開始修 CS1 的學生在一天的工作坊裡用它或用 Codecademy 各學 4.33 小時。

摘要寫 PLTutor 組的進步量高 60%,但這個差異沒有達到顯著。兩組前測就不相等,PLTutor 組起點較低,後測兩組幾乎一樣;之後的期中考平均也沒有差別。所以這篇能說的是「沒有測到差別」,而且「先學讀」的部分只有這四小時多,之後兩組修的是同一門以寫為主的課。

追蹤和寫程式的關係

Mike Lopez 等人 2008 年的研究分析一門 Java 入門課的期末考,78 位考生中 38 人同意。迴圈的追蹤題和寫程式題的相關是 r = .63;不含迴圈的簡單追蹤題,相關只有 .30,作者判定不顯著。作者用路徑圖畫出一個由低到高的技能階層,同時明說箭頭方向不是因果,而且提出另一種解釋:寫程式題考的是呼叫方法,追蹤題考的是迴圈,內容不重疊,相關可能反映的是一般推理能力。這篇只有一個時間點,沒有量「先教追蹤,寫程式會不會進步」。

Parsons 題與補完題

Parsons 題(Parsons problem)把一段正確程式的每一行打散,要學習者排回正確的順序;干擾項是混進去、不該用的錯誤程式行。它的吸引力在於讀者不必從空白開始寫。

先前的研究:較快,學習相當

依 Muldner 的回顧,較早的幾篇比較(Ericson 2017、2018 年與 Zhi 2019 年)結果一致:做 Parsons 題的組比寫程式的組快,後測沒有差別。加上別的東西才看到學習上的好處:一篇在 Parsons 題上加了自我解釋提示,進步較多;兩篇在 Parsons 題裡留空要學生填,一篇只在和先前相似的程式上較好,另一篇只在一題複雜的考題上分數略高(作者用的詞是 marginally)。回顧作者推測單純重排可能太輕微,需要額外的鷹架。這些原始研究我都沒有讀。

五所學校的研究:連時間都沒省

Barbara Ericson 等人 2023 年的工作小組報告在多所學校跑了幾項流程相同、教材各異的研究。其中一項用 Python 基礎的教材,比較「練習時解有干擾項、會依表現調整難度的 Parsons 題」和「練習時寫等價的程式」。原文寫五校合計 369 人,但五校的人數相加是 376,依自我效能分組的人數相加又是 401。

  • 同一堂活動裡緊接著的後測,兩組平均都是滿分的四分之一強(107/400 對 111/400),沒有差別。
  • 練習時間也沒有差別,數值上 Parsons 組還略久。作者在討論節承認這和先前研究「明顯不同」,並說需要更多研究。
  • 兩組都只有約一半的人碰過任何一題後測。

另一項研究用 Python 類別的教材,比較有干擾項和沒有干擾項的 Parsons 題(兩組都做 Parsons 題)。後測成績沒有差別;有干擾項的組後測寫程式時語法錯誤較少,效果量小(Cliff's δ = −0.18 與 −0.28),而且原文沒有交代語法錯誤怎麼計數。

這份報告的摘要沒有提這幾個沒有差別的結果,寫的是研究「provide evidence」支持 Parsons 題與干擾項。要拿它當證據,得引結果節與討論節,不能引摘要。

報告裡的放聲思考觀察有一個細節值得寫作的人知道:智利一門西班牙文 JavaScript 線上課的 12 位成人學員(24 到 55 歲,沒有理工背景)裡,沒有任何一位發現前面的 Parsons 題和後面的寫程式題其實是同一題,包括做完全部題目、自評能力高的人。

文章裡能怎麼用

網頁上要做可以拖拉的 Parsons 題,是一個互動元件,要寫程式也要維護;互動值不值得做,之後的篇會談。純文字的替代做法是把打散的程式行列出來,要讀者寫下順序再展開答案,這沒有人測過。我依上面的證據判斷,它適合當練習的一種變化;說它比寫程式更有效率,目前沒有依據。

貼出來的程式跑不跑得起來

這一組研究沒有讀者,量的是程式本身。

  • Jupyter notebook:João Felipe Pimentel 等人 2019 年從 GitHub 收了約 116 萬個去重後的 notebook,挑出 863,878 個執行順序明確的 Python notebook 重跑。照 notebook 裡存下來的執行順序跑,跑完沒有錯誤的是 24.11%(分母包含約 7.5 萬個因為相依套件裝不起來、根本沒有執行的 notebook),跑完而且結果和存下來的輸出相同的只有 4.03%。最常見的失敗原因是缺套件,其次是變數未定義、找不到檔案。有宣告相依套件的 notebook 反而更常缺套件,作者說宣告常不完整,也承認沒宣告的那一組是在裝了整套 Anaconda 的環境裡跑的。
  • GitHub gist:Eric Horton 與 Chris Parnin 2018 年把 10,259 個至少有一顆星的單檔 Python gist 放進沒有任何第三方套件的 Python 2.7 環境,24.4% 跑完,52.4% 卡在 import 失敗。用 import 的名字直接去裝同名套件,大多數仍然補不起來;補不起來的那批交給 24 位熟悉環境設定的開發者手動處理,他們回報每個要花 20 分鐘到 2 小時,最常見的原因是套件名和 import 的名字不同。
  • Stack Overflow:Di Yang 等人 2016 年取 2014 年資料傾印裡被採納的答案,Python 片段 76% 能解析、26% 能原樣執行。但「片段」包含行內提到的單一個字,抽樣的可執行片段裡有 64% 是單字;執行失敗的 Python 片段,大多是名稱未定義,因為片段只是整段程式的一部分。作者自己說,不能解析的片段可能比能跑的更有用。
  • 文件裡的名稱:Wen Siang Tan 等人 2023 年用自動工具掃 GitHub 星數最高的 1,000 個專案的 README 與 wiki,28.9% 的專案被標出至少一處「文件還提到、原始碼已經找不到」的名稱。工具沒有報告準確度;開了 issue 而有回應的 8 個專案裡,4 個說是誤判。這個工具沒有檢查程式碼區塊裡的內容。

兩種失敗要分開看。片段型的程式(Stack Overflow)跑不起來,主要是因為它依賴前文定義的變數;獨立的程式檔(gist)跑不起來,主要是因為環境裡少了套件。我的推論是教學文章兩種都有:正文裡一段接一段的程式像前者,專案的完整實作像後者。

這四篇都沒有量讀者。程式跑不起來會不會讓讀者學得比較差,目前沒有研究直接測過。 能說的只有:公開的程式原樣跑得起來的比例不高,失敗多半出在環境與上下文,不在程式邏輯。

本站的例子:CS50 AI 導讀的舊版專案程式

2026-10-13 那一輪審稿,審稿者下載官方的 distribution code,逐週拿文章貼的程式去比對,有幾週還接上去實際執行。報告裡記載的舊版問題,各週的確認方式差很多:

週舊版的問題審稿者怎麼確認
第 0 週貼的 Node 多一個欄位、QueueFrontier 沒有繼承、漏匯入;搭配官方 util.py 會丟 TypeError比對官方原始碼;後來一輪自己改壞重現,錯誤訊息相同
第 1 週Knights 的 Puzzle 3 推不出任何人的身分;踩地雷的 add_knowledge 不會結束把舊版接上官方檔案實際執行
第 2 週Heredity 的標題寫成取樣,與官方的做法不符;PageRank 迭代版的舊寫法審稿者判定沒有錯看 git 差異;迭代版實跑,輸出與規格頁相同
第 3 週舊版 Crossword 用的介面不是官方的回 git 上一版核對,沒有寫實跑
第 4 週Nim 的勝負規則舊稿寫反只有一句「已修」
第 5 週沒有記載—
第 6 週Parser 有官方檔案裡沒有的類別與演算法;Questions 的下載網址失效、執行指令多一個官方不收的參數對官方檔案、實際請求網址

壞的是本站舊稿貼的參考實作與專案描述,官方的 distribution code 沒有壞。官方材料有它自己的問題,性質不同,例如第 6 週官方的 requirements.txt 沒有鎖版本,審稿當天照著安裝會在 import 時失敗。

整個系列 25 項「必須修」,我整理時把它們分了類(各報告本身沒有分類):程式或指令照做會壞、或對官方檔案的描述不符的有 5 項;實跑的數字重現不出來、或把單次執行寫成固定結果的有 6 項。後者的一個例子:文章寫的一個結果,審稿者跑 7 次只出現 1 次。

這些審稿報告也沒有讀者資料。「讀者因為舊版程式學到錯的東西」是推論,報告沒有量過。

對照本站的寫作規格

本站有兩份規格管程式:課程導讀共用規格 course-guide-contract.md 的「實作教學」一條,以及 CS50 AI 這一輪專案節改寫的規格(存在工作目錄,沒有進版本)。下面依 2026-10-14 工作目錄裡的版本逐條對照;和文字有關的條文在題目與回饋那一篇。

規格本站的理由研究能說什麼
專案節不在摺疊區外放能直接繳交的實作,改給解題思路與虛擬碼課程的學術誠信政策不允許在繳交前看別人的解答,允許用虛擬碼討論這是誠信上的選擇。沒有研究測過「先給思路與虛擬碼、完整程式摺疊」。最接近的是補完式例題與 Parsons 題,前者有正向結果,後者沒有測到學習差別
虛擬碼不能細到可以逐行翻成 Python專案節複審時,第 0、1、3 週被點名虛擬碼細到等於逐行翻譯,例如第 0 週的審稿寫「照著打成 Python 不需要再想任何事」;第 2 週的審稿說有一段和程式一一對應,判定仍在線內、只是全篇最貼近程式,作者仍改粗;第 4 到 6 週判定在線內,第 6 週的審稿說有三段和程式幾乎一一對應,但那三個函式本身只有三四行本站的判斷。相鄰的結果是:練習題和例題步驟一模一樣時,給現成標籤沒有比不給好;作者猜學生沒有自己解釋。類推到虛擬碼的粗細是我的推論
「容易出錯的地方」寫現象、原因、怎麼察覺,不貼修好的程式實跑驗證出來的錯,是這一節最有價值的部分本站的選擇。錯誤例題的研究結果混雜,沒有研究測過這種寫法
「怎麼檢查」:範例輸入與輸出、手算小案例、實跑數字寫明是哪次、跑了幾次審稿抓到的必須修裡,依我的分類有 6 項是實跑數字重現不出來或把單次寫成固定本站自己的審稿紀錄撐得住;研究面沒有直接證據
文章貼的程式要接上官方檔案實跑過審稿的方法;舊版的問題多半是這樣抓到的公開程式原樣能跑的比例約四分之一;我據此推論「不跑就不知道」,對學習的影響沒有研究
實作教學要寫必要環境、可執行步驟、預期結果、錯誤診斷共用規格的教學功能gist 與 notebook 的失敗多半出在環境與套件,支持寫明環境;寫了之後成功率會不會提高,沒有研究驗證過

來源說法不同的地方

以下幾組結果方向不同,或看起來衝突、其實量的東西不一樣。我把它們並列,不選邊。

Parsons 題比較省時間嗎。Muldner 轉述的三篇單校研究都是 Parsons 組較快。Ericson 等人五校的研究裡,練習時間沒有差別,後測第一題還是 Parsons 練習組顯著較慢。Ericson 等人自己的摘要仍寫 Parsons 題「通常比從頭寫容易也比較快」,這是轉述既有文獻,不是他們這次的資料。

現成標籤還是自己寫標籤。Morrison 等人 2020 年的合併分析:哪一種好要看練習題和例題的距離,沒有回饋時兩者整體沒有差別。同一團隊 2016 年分析二年級學生:給現成標籤的組寫程式最好,要他們自己寫標籤時,Parsons 題反而比另外兩組差,作者猜是 expertise reversal(對新手有用的協助對熟手不利)。Muldner 轉述 Margulieux 與 Catrambone 的實驗:有引導的自己寫最好,但只在提示與回饋二擇一時成立。

給標籤對 Parsons 題有沒有幫助。同一團隊較早的一篇論文說給現成標籤的組 Parsons 題較好;2020 年的合併分析沒有看到,作者明寫不再這樣下結論。Muldner 的回顧仍把較早那篇列為顯著的結果。

要讀者先預測,有沒有用。談圖的那一篇引 Hundhausen 等人 2002 年的彙整:演算法視覺化的實驗裡,讓學生動手(自己設計輸入、預測下一步、寫程式)的那一大類較常有顯著差異;但單獨操弄「先預測」的實驗,那一篇讀到的是 Jarc 等人一篇(預測組後測沒有顯著差異)與 Byrne 等人一篇的兩個實驗(顯著,但作者說預測和動畫的效果分不開)。Muldner 轉述的 Banerjee 等人兩個實驗(78 人與 231 人)又是兩筆單獨操弄預測的資料:要先預測輸出的那組,後測都沒有差別,只有課堂觀察到的投入程度較高。合起來,我讀到的單獨操弄「先預測」的實驗有三篇論文、五個實驗:三個後測沒有差別,另外兩個出自同一篇、和動畫混在一起。兩篇文章其實沒有互相矛盾,差在「動手」的範圍:Hundhausen 的那一大類包括自己設計輸入和寫程式,Muldner 整理的互動程度比的是只看、預測、自己逐步執行;Muldner 的整體看法是幾篇研究都顯示「只是看」和較主動的條件沒有顯著差別。這些都是轉引或彙整,研究年代、工具和測驗也不同。

例題的註解。Muldner 的綜合段寫「加註解與子目標顯著提升學習」。它自己的正文裡,加註解只有一篇,效果只在例題和題目相似時出現、註解種類沒有差別、量的是當下的作業表現;另一篇單組研究是看加註例題越多、成績越低。

執行過程的示意圖幫到哪裡。Muldner 的綜合段說有模型的追蹤例題「improves learning」;它的圖註明只限追蹤題。在寫程式題上,Mayer 的一個實驗是只有文字較好,Bayman 和 Mayer 的實驗裡先備知識高的人是簡略例題較好。

文件裡過期的名稱放了多久。Tan 等人在前言與結論寫這些參照「通常過期好幾年才被修」。文中的「年」只有一個來源:還沒修的參照平均已經過期 4.7 年。已經修掉的那些,過期一個月後只剩約一半還沒修。前一個是存量,後一個是被修掉的那批的存活時間。

片段為什麼跑不起來。Horton 與 Parnin 說 Yang 等人沒有研究原因;Yang 等人其實有錯誤訊息的統計。兩篇的主因不同(import 失敗對名稱未定義),因為一個是獨立程式檔、一個是答案裡的片段,不能合成一個原因。

今晚可以做的三件事

挑一篇自己寫過、貼了程式的教學文章:

  1. 開一個乾淨的環境,照文章的順序把每段程式貼進去跑一次。 只裝文章寫明的套件。跑不起來的地方,要嘛補上它依賴的前一段,要嘛在文中寫明它要接在哪一段後面、依賴哪個檔案與哪個版本。結果有亂數的,寫明跑了幾次。依據是上面的描述性資料與本站審稿的紀錄,不是學習研究。
  2. 把最主要的那段程式切成三到五步,每一步前面加一行註解,寫這一步要達成什麼。 不是這一行在做什麼。後面接一題換了情境的練習,不只換數字。依據是子目標研究,但那些研究用的是課堂與實驗室的例題,寫成註解是我的類推。
  3. 在一段有迴圈的程式後面,放一題「這段程式會印出什麼」,附一張空白的變數表讓讀者自己填,答案摺疊。 依據是 Xie 等人的追蹤策略,重點在讀者自己逐行填表;讀作者畫好的表有沒有同樣的效果,沒有人測過。題目的開頭「先別執行,猜會印出什麼」是一題先預測,單獨測過「先預測輸出」的實驗多半沒有測到差別(見「來源說法不同的地方」)。

下面是第 2、3 件事合在一起的樣子,用的是一段廣度優先搜尋。程式與題目是本文自擬,在 Python 3.15.0 跑過一次,沒有測過學習效果:

graph = {"A": ["B"], "B": ["C", "D"], "C": ["E"], "D": ["F"], "E": [], "F": []}
start, goal = "A", "E"

# 步驟 1:準備好「待檢查」與「已檢查」兩份名單
frontier = [start]
explored = set()

while frontier:
    # 步驟 2:決定下一個要檢查的節點,並判斷是否已經到達目標
    node = frontier.pop(0)
    print("取出", node, "| frontier 剩", frontier)
    if node == goal:
        break
    # 步驟 3:把這個節點能通到、還沒排過的節點,排進待檢查名單的最後面
    explored.add(node)
    for neighbor in graph[node]:
        if neighbor not in explored and neighbor not in frontier:
            frontier.append(neighbor)

先別執行。這段會印出幾行?第四行印出什麼?邊讀邊填這張表:

第幾輪取出的 node加完鄰居後的 frontierexplored
1
2
3
4
5
答案

印出五行,第四行是 取出 D | frontier 剩 ['E']。

第幾輪取出的 node加完鄰居後的 frontierexplored
1A['B']A
2B['C', 'D']A、B
3C['D', 'E']A、B、C
4D['E', 'F']A、B、C、D
5E(是目標,停)印出時是 ['F']不變

換情境的練習:同樣三步,改成在一張朋友關係圖上找兩個人之間最少隔幾層朋友。要多記什麼?

判準:每個節點排進待檢查名單時,要一起記下它離起點幾層(等於取出它的那個節點的層數加一);取出目標時,它的層數就是答案。也可以記下每個節點是從誰那裡排進來的,找到目標後一路往回數。只記「走過沒有」答不出層數。

這些證據的限制

  • 沒有任何一篇研究讀網頁教學文章的人。 學習研究的受試者是課堂與實驗室裡的大學生,多數是入門程式課;程式能不能跑的研究沒有讀者。把結果搬到一篇導讀,是我的推論。
  • 樣本小,而且多半用顯著性檢定。 追蹤策略的實驗 24 人、先學讀的實驗 37 人、相關研究 38 人、子目標的獨立複製裡關鍵比較只有 10 人。Muldner 等人自己說,這種架構下的虛無結果不能下結論,建議改報貝氏因子;全篇回顧只有一篇研究有支持虛無的貝氏證據。
  • 子目標的研究多出自同一個團隊,合併分析的資料包含原本發表過的實驗,不算獨立複製。課堂研究沒有隨機分派,有標籤的班由研究團隊的成員教。
  • 測驗多半在當場或一週內。 Morrison 等人的實驗與 Ericson 等人的研究都是同一場次測完,沒有延宕測驗。
  • 幾份原文的統計數字對不上。 Morrison 等人 2020 年的 p 值,用印出的 F 與自由度重算對不上,所以正文只引效果量;Margulieux 等人的 t 值與自由度不合,正文只引平均、標準差與 d;Ericson 等人同一項研究的人數三處不一致;Shah 等人報告教學評量兩題的差異 p < 0.001,抽取時用圖上的比例還原人數、以趨勢檢定重算,得到約 .06 與 .04;原文沒有給統計量和計分方式,我不確定作者怎麼算的,所以正文只引圖上的比例。
  • 很多結果是轉引。 Rubin、Raj、Mayer、Bayman 與 Mayer、van Merriënboer 團隊、Chang、Banerjee、Fabic、Weinman、Hosseini、Ichinco、Margulieux 與 Catrambone、Zhi、Kumar、Al-Barakati 與 Al-Aama,以及 Ericson 2017 與 2018 年的研究,都是從 Muldner 的回顧或 Morrison 等人的論文讀到的,原文我沒有讀。
  • 描述性的研究有時效。Stack Overflow 的資料是 2014 年,gist 的實跑以 Python 2.7 為主,notebook 的收集到 2018 年。這些比例不能拿來說今天的程式。
  • 只讀到摘要、沒有列進參考資料的:Scherer 等(2020)的程式教學統合分析、Selvaraj 等(2021)的 live coding 回顧。Harrington 與 Cheng(2018)提出「到了進階課,追蹤與寫的先後會反過來」,我沒有拿到全文。
  • 沒有找到的:程式跑不起來對學習的影響;子目標寫成文章裡的註解或小標題;文章裡逐步建構程式對一次給完;讀作者畫好的追蹤表;照著打一遍程式有沒有用(我手上只有一篇只看相關的短文,撐不起結論)。
  • 我的推論:給了標籤後面要接換情境的練習;子目標研究推到程式註解;文字版 Parsons 題適合當練習的一種變化;教學文章的程式分成片段型與獨立檔兩種;把相鄰的結果類推到虛擬碼的粗細;用描述性資料支持「不跑就不知道」與「寫明環境」;今晚可以做的三件事。正文都標了。

附錄:各研究的設計與數字

正文每項只留一兩個數字,其餘放在這裡。

Muldner、Jennings、Chiarelli(2022),ACM Transactions on Computing Education 23(1)。敘事型回顧,兩階段檢索(六個研討會與期刊分開搜;再搜五個資料庫、只收 2000 年以後),另加滾雪球。表 1 各來源的納入篇數加總 87(我加的),附錄 A 列 86 個不重複的引用。納入標準:有真人受試者、評估與程式學習有關的例題活動,排除只靠學生自評學習的問卷研究。正文轉述的幾項:Rubin(N = 146)考試、作業、學期成績不顯著,期末專題現場組較好;Raj 等描述上靜態組較好,不顯著;Kumar(N = 730)在家教系統裡加自我解釋提示,進步量不顯著,學生課外自願使用、沒有人監督也不計分;Ichinco 等(中學生 N = 80)加註只在例題與題目相似時有效;Hosseini 等(N = 109)看加註例題與成績負相關,單組;Banerjee 等兩個實驗(N = 78、231)預測組後測不顯著;Al-Barakati 與 Al-Aama(N = 91)被動觀看、自己逐步執行、沒有工具三組總分不顯著;視覺化工具的個別功能研究樣本 16、22、14、18 人;本回顧找到的 9 篇工具研究裡 6 篇有好處,作者附三條保留:多是資工系學生、對照的傳統活動若沒有明確教追蹤與畫圖則工具勝出並不意外、人不是編譯器。Parsons 題:Ericson 等兩篇(N = 135、126)較快、後測不顯著;Zhi 等六個學期每學期約 50 人,較快、學習相當;Fabic 等(N = 70)加自我解釋提示的 normalized gain 顯著較高;Weinman 等(N = 43)有填空的 Parsons 題只在與先前相似的程式上較好。

Margulieux、Morrison、Decker(2020),International Journal of STEM Education 7:19,刊出版。2018 年秋季,美國中西部一所大學的 Java 入門課,五個班;選課 307 人,最後分析 265 人(子目標組 120、對照組 145);34% 沒有任何程式經驗。小考:平均 48%(SD 14%)對 41%(SD 16%),d = 0.44,p = .001;缺考算零的小考總分 d = 0.42;完成的小考次數 3.9 對 3.4。五次小考都有分數的只有 97 人,組別 × 小考的交互作用不顯著,作者據此說整學期效果相同,但沒有報告各次小考的組間比較。考試:平均 75%(SD 15%)對 72%(SD 18%),d = 0.20,p = .24;缺考算零的總分(滿分 200)140.3 對 128.2,d = 0.26,p = .04;參加的考試次數 3.7 對 3.5,p = .045。四次都考、平均在 70% 以下:30 人(25%)對 64 人(44%),沒有檢定。用白話解釋解法的題目依 SOLO 五級評分,原文說四題裡三題子目標組分布較好,巢狀迴圈那一題「沒有照同樣的趨勢、整體較差」;我照表 5 算,那一題是對照組分布較好,原文沒有這樣寫。那一題也是唯一沒有達到評分者信度的。原文的 t 值與自由度對不上(N = 265 的獨立樣本 t 檢定自由度應為 263),所以不引 t 值。

Morrison、Margulieux、Decker(2020),Computer Science Education 30(2),讀的是 Georgia State University 典藏的作者接受稿,頁碼與刊出版可能不同。三所大學的實驗合併,共 220 人;3(沒有標籤、給標籤、自己寫)× 2(練習題只換數字、換情境)的受試者間設計,用虛擬碼教 while 迴圈,同一場次測完。寫程式 4 題滿分 44,整體平均 26.58;交互作用 F(2, 188) = 5.23。事後比較(六個裡兩個顯著):只換數字時,給標籤對自己寫,自己寫較高(d = .44);換情境時,沒有標籤對給標籤,給標籤較高(d = .59);只換數字時給標籤對沒有標籤 d = .10。時間:只換數字時,沒有標籤 52 分鐘、給標籤 72 分鐘、自己寫 71 分鐘。時間與表現整體相關 r = 0.43,各組內的相關強弱不一,作者據此說好處不只是多花時間,但沒有把時間當共變數控制。Parsons 題、5 題追蹤後測、認知負荷都沒有效果;追蹤後測被作者事後判定沒量到東西,排除在結論之外。抽取時用印出的 F 與自由度重算,交互作用的 p 約 .006(原文印 .028),其他幾處也對不上;距離只有兩個水準,原文卻一律印 F(2, 188)。

Morrison、Decker、Margulieux(2016),ICER '16,刊出版版面(NSF PAR)。美國東北部一所大學 100 人,三門課;入門課學生做實驗時已學過迴圈約兩週。複製分析只收前測答對 2 題以下的 27 人:交互作用 F(2, 21) = 5.19,p = .015;給標籤時只換數字 M = 18.4、換情境 M = 31.2,t(8) = −1.50,p = .17,d = 0.95。二年級課約 49 人(由 F 的自由度推算,原文沒寫人數):給標籤組寫程式較好,交互作用不顯著;自己寫標籤的組 Parsons 題較差。另一個分析比較高中修過電腦課與沒修過的人(橫斷比較,不是追蹤同一批人):入門課裡修過的人寫程式分數較高,二年級課裡兩者相近;Parsons 題上修過的人在二年級課仍然較好。

Shah 等(2023),ICER '23,刊出版,CC BY。UC San Diego 2022 年秋季 CS1,兩班同一位老師,一週兩堂 80 分鐘,作者說程式範例約佔講課一半時間;最後兩週因助教罷工停課。成績(現場對靜態,滿分 100):作業 93.4 對 93.5、練習單 89.7 對 88.7、期中 82.5 對 81.6、期末 78.8 對 79.4、學期總成績 89.1 對 88.9,效果量 −0.031 到 0.069。期末程式挑戰正確率 64.6% 對 57.3%(p = 0.284);除錯挑戰正確率 25.9% 對 14.1%(p = 0.063,作答 81 對 78 人);除錯題到正確為止的編譯次數校正前 p = 0.046,Holm-Bonferroni 校正後不顯著。開放題「慢一點」18.09% 對 2.06%(94 與 97 份回答),不做推論統計。教學評量(我由圖上比例相加):注意力題同意與非常同意 78.3% 對 87.6%,筆記題 59.3% 對 74.8%。作者列的限制:沒有隨機分派、評量可能有選擇偏誤、講課外的學習活動很多、只有一門 CS1、只評了老師在課堂上寫這一種形式。

Xie、Nelson、Ko(2018),SIGCSE '18。ACM 現行提供的檔與作者頁的檔相同,頁尾印 2021 年更新。受試者限修過 0 或 1 門 CS 課,CS 主修只有 3 人。分層隨機分派,因有人取消而不完整,事後程式自我效能顯著偏向對照組。當場總分:策略組 M = 30.00(SD 4.91,n = 13),對照組 M = 24.55(SD 9.16,n = 11),單尾 Welch t,p = 0.049,d = 0.72;只有第 4 題顯著(p = 0.021),策略組 13 人裡 11 人該題滿分。期中考(自報,各 8 人)91.5 對 84.5,單尾 p = 0.083;作者說期中的差距主要來自寫程式題。當場總分與期中成績相關 r = 0.91。摘要寫教策略花 5 到 10 分鐘,正文的 5 到 10 分鐘是介紹放聲思考的時間,教策略約 5 分鐘。

Nelson、Xie、Ko(2017),ICER '17。988 人中 200 人回覆、90 人符合條件、41 人到場,測驗系統遺失部分資料後分析 37 人(PLTutor 18、Codecademy 19)。測驗是 27 題的 SCS1,前後測間隔約 4.3 小時。前測 Codecademy 8.26、PLTutor 6.61;後測 10.68 對 10.5;進步量 2.42 對 3.89,d = .398,Wilcoxon p < .41,t 檢定 p < .24。期中考 76.11 對 77.28,原文只說不顯著。作者列的限制:重測可能灌高後測、兩組講師不同、PLTutor 組的講師曾離開教室 45 分鐘、研究原型有可用性問題。

Lopez、Whalley、Robbins、Lister(2008),ICER '08,讀的是 UTS 典藏的作者稿。一所學校(原文沒寫校名)第一學期 Java 課的期末考,78 人應考、38 人同意(同意者平均 62%,全班 58%)。各題得分先用 Rasch 模型轉換,再扣掉一題短文題代表的一般能力,相關係數是處理後變項之間的相關。迴圈追蹤與寫程式 r = .63,p < .0001;非迴圈追蹤與寫程式 r = .30,p = .03,作者判定不顯著(前一段用的門檻是 .01);解釋程式與寫程式 r = .56。迴圈追蹤與解釋合起來解釋寫程式 46% 的變異。考卷上的 Parsons 題平均 83%,作者說它可能太簡單。

Ericson 等(2023),ITiCSE Working Group Reports,刊出版,51 頁。Parsons 對寫程式的研究(p3pt):五校 168、39、10、7、152 人,原文寫合計 369(相加是 376),依自我效能與先備知識分組的人數相加是 401。後測 107/400 對 111/400,Mann-Whitney U = 20648.0,p = 0.60,沒有給標準差或效果量。練習時間 1783 對 1600 秒,p = 0.58。後測第一題 Parsons 練習組較慢(566 對 292 秒,p = 0.017)。答對前的嘗試次數全體不顯著;低自我效能子群 Parsons 組顯著較多。有無干擾項的研究(class-exp):五校 361 人;5 題版後測 67% 對 62%(p = 0.56),4 題版 76% 對 69%(p = 0.45);後測語法錯誤 18 對 23 個(p = 0.03,δ = −0.18)、13 對 19 個(p = 0.003,δ = −0.28)。低自我效能與低先備的子群,練習有干擾項時較願意把後測做完;這是事後切出的子群,沒有多重比較校正。另有一項單組研究(交換兩個變數),超過 80% 做完三題 Parsons 之後寫得出交換的程式,沒有對照組,量化人數原文沒有寫。設計了但沒有報告結果的研究有四項。

Pimentel、Murta、Braganholo、Freire(2019),MSR 2019,讀的是作者個人頁上的作者稿。GitHub 2013-01 到 2018-04 建立的 repository,去重後 1,159,166 個 notebook,其中 Python 93%。重跑 863,878 個:每個建 conda 環境,裝宣告的相依套件,沒宣告的裝整套 Anaconda,照存下來的執行計數順序只跑當初執行過的 cell,每個限時 5 分鐘。75,059 個因相依套件裝不起來沒有執行,仍算在分母裡。跑完沒有錯誤 208,323 個(24.11%),其中 173,487 個結果不同,剩下 4.03%;「結果相同」怎麼比對原文沒有寫。失敗原因:缺套件 29.23%、變數未定義 14.53%(作者說可能是照執行計數順序跑造成的)、找不到檔案 12.59%。有宣告相依的缺套件比例 45.18%,沒宣告的 31.24%。30.93% 的 notebook 沒有任何說明文字。作者提了八條做法(例如釘住套件版本、用相對路徑、commit 前從頭跑一遍),沒有檢驗照做之後成功率會不會提高。

Horton 與 Parnin(2018),ICSME 2018,讀的是 arXiv 預印本。10,259 個 gist,至少一顆星、單一檔案,平均 92 行。Python 2.7.13 下成功 2,501 個(24.4%)、import 失敗 5,379 個(52.4%)、語法或名稱等解析失敗合計 17.1%;Python 3.6.5 下成功只有 1,445 個,主因是 3,907 個語法錯誤(Python 2 的語法)。把 import 的名字當套件名去裝之後,原本 import 失敗的 5,379 個裡 2,488 個不再卡在 import,其中 1,294 個真正跑完。24 位開發者拿到 240 個補不起來的 gist,回覆 218 個,其中 78 個連他們也做不出可用的設定;有回報原因的 194 個裡,套件名與 import 名不同 70 個。作者說可能高估可執行的比例:只定義函式沒有呼叫的 gist,定義成功就算成功。

Yang、Hussain、Lopes(2016),MSR '16,讀的是 arXiv 預印本。研究目的是評估片段能不能直接給自動程式生成工具用,不是教學品質。只取被採納的答案,每個 <code> 標記算一個片段。可解析:Java 3.89%、C# 16.00%、JavaScript 65.88%、Python 76.22%;Java 與 C# 只做編譯(1.00%、0.12%),JavaScript 與 Python 才實際執行(20.00%、25.61%)。抽 50 個可執行的 Python 片段,回答了問題的 16%、單一個字的 64%;去掉單字後回答問題的 21 個(原文寫 44%,個數換算是 42%);再去掉單行後 66%。Python 執行期錯誤裡「名稱未定義」約 83%(讀自圓餅圖)。

Tan、Wagner、Treude(2023),Empirical Software Engineering 29(2023 年線上刊出),刊出版,CC BY,取自 Monash 典藏。「過期」定義為:文件最後更新時原始碼裡有、現在找不到、文件還留著的名稱,用完全相同的字串比對;只掃 README 與 wiki,不抽三個反引號的程式區塊。星數最高的 1,000 個專案完成分析 991 個:28.9%(265/918,分母排除沒有任何可比對名稱的專案)至少一處被標為過期,以參照計 3.9%;Google 組織的 2,277 個專案是 5.4% 與 2.7%。目前仍過期的參照平均已過期 4.7 年(只給平均);歷史上被修掉的參照,一個月後還有 55% 沒修。被修掉的參照約一半是原始碼又出現,作者說其中有一部分是大量刪掉又還原原始碼檔造成的。人工標註的 50 個名稱沒有報告真陽性幾個。

本站審稿紀錄(2026-10-13 至 14,.work/reviews/ 的八份報告,不是外部研究,不列入參考資料)。七週導讀各走了四輪以上,個別週另有確認輪;跨週四篇三輪。必須修共 25 項,歸類(抽取時做的,原報告沒有分類):把來源沒說的寫成講者說的,或說得比來源強、沒有依據(7 項);實跑數字重現不出來或把單次寫成固定(6 項);程式或指令照做會壞或與官方檔案不符(5 項);其餘 7 項分屬五類。正文提到的「跑 7 次只有 1 次」出自第 0 週專案節的複審。每一輪都沒有人開瀏覽器看過渲染後的頁面,也沒有跑過 check50。

參考資料

每一條都從頭讀到尾並留有抽取紀錄;括號註明讀的版本。