• 沒有找到結果。

第二章 文獻探討

第一節 程式設計教學

第二章 文獻探討

根據第一章所提出的研究問題,本章蒐集程式設計教學的相關文獻並做整理 和探討,包含程式設計教學、Alice 程式設計軟體及診斷式訪談。

第一節 程式設計教學

一、程式設計學習

Brooks(1983)認為程式設計是一個將無形的問題轉化為有形的程式碼的過 程,除了需要組合程式語言本身的語法及結構,還有可能會使用其他領域的知識 方可完成。因此初學者在學習程式時,最重要的是需要學會理解整個程式,包含 程式的功能、程式碼內容、使用目的以及難易程度的差別。這個能力不僅能實際 用於撰寫程式的過程中,亦有助於程式設計者進行除錯、測試以及閱讀其他人的 程式碼。

Linn 與 Dalbey(1985)提出程式設計理想的「認知鏈結」,認為程式設計的 學習成果可以透過下列三方面進行評量:(1)程式語言特性;(2)程式設計技能;(3) 一般性的問題解決能力。一般而言,在入門的課程中學生所學習的程式設計知識 多屬於基本程式語言特性的理解及設計技能的範疇,鮮少觸及問題解決技巧的領 域。

在程式開發過程方面,Shneiderman(1980)將程式設計解題的過程對應至 Polya(1966)所提出的問題解決四階段:(1)理解問題;(2)設計解題策略;(3)執 行策略進行解題;(4)回顧解答,並修改為理解問題需求、規劃與設計、編寫程式 和除錯(引自 Bishop-Clark, 1992):

1. 理解問題需求:理解程式所要完成的工作、呈現的功能。

2. 規劃與設計:針對問題需求找出解決方法。

4

3. 編寫程式:將所找出的解決方法透過程式語言實作。

4. 除錯:檢視程式執行成果,並進行修正。

Soloway(1986)認為學習程式設計的重點除了精熟目標程式語言的知識,

更需要學習問題解決的能力。教師除了程式語言的語法及語意之外,還要進一步 的教導要教導程式概念的作用原理、說明、使用目標、計畫、程式論述的規則和 計畫組成的方法等問題解決能力。如果能有效的協助學生將他們的想法轉化為實 際的程式,那程式設計就不單單是一個專業技能,而能成為一個解決問題的工具。

綜上所述,學生在學習程式設計時,除了必須針對程式語言學習語法結構及 規則以外,更重要的是要夠從中培養出分析問題、構思解題策略、透過程式設計 技巧將解題策略實作、並根據測試結果進行調整及除錯的能力。

二、程式設計的學習困難

程式設計一直被認為是難以學習精熟的學科。Jenkins(2002)認為學生在學 習程式設計的過程中容易產生困難,是由於程式設計這門學科具備以下特性:

1. 需要多種技能:程式設計的範圍包含語法、語意、程式結構、寫作風格等不 同的面向。課本跟課堂通常只有教導語法、語意的部分,其他程式設計技能 必須透過程式設計的過程來學習

2. 具備多個程序:學生必須先自己的想法轉換為有效、可行的演算法,再將演 算法轉化為程式碼,在這些不同的領域轉換的過程中,發生任何微小的錯誤 都有可能導致學生無法順利完成程式。

3. 所使用之程式語言:目前大多數課堂都是選用業界常見的程式語言,而非適 合教學的程式語言。當學生必須花費大量心力於理解和處理語法時,往往難 以分心關注問題解決的技巧。

4. 教學新穎性:對很多學生而言,程式設計是過去從未接觸過的學科領域。學 習的過程必須兼顧指令語法的記憶及解題方法的知識理解兩種不同面向的能

5

力,和其他的科目不盡相同。

5. 難以引發興趣:程式語法課程通常十分枯燥,且基礎程式概念程式範例亦較 為單調,難以引起學生興趣。

6. 外在觀感不佳:「程式設計」普遍被認為是困難的技術,而「程式設計師」也 常給人書呆子的印象。學生可能會因為這些認知而產生排斥感。

7. 課程步調:由於授課時間受制於學制,使得課程進度必須不斷推進,造成學 生若是基本概念有所缺漏,將難以跟上後續進度。

由於在程式設計的過程中不僅需要針對目標問題發展出對應的問題解決方 法,還必須使用「程式語言」這個工具將其實作出來,因此 Spohrer 與 Soloway

(1986b)將學生常犯的錯誤統整為程式語言結構以及計畫組織兩大類型。其中 程式語言結構相關的程式錯誤是由於對程式語法的誤解所產生,除了基本的語法 錯誤以外,初學者在編寫程式的過程中,往往會使用較為熟悉的自然語言去解釋 程式碼(Bonar & Soloway, 1983),進而導致如邏輯判斷中的「且」及「或」混淆、

重複結構的終止條件設定錯誤等邏輯錯誤的發生;Putnam、Sleeman、Baxter 與 Kuspa(1989)發現學生在面對未完全理解的程式語法時,亦會使用其他領域的 知識進行程式碼的解讀,進而導致迷思概念及錯誤的發生,例如將 BASIC 程式語 言中等號(代入)以一般數學的使用方式解釋為「等於」。SamurÇ ay(1985)更 發現即使核心概念相同,學生在將其他領域的知識轉化為可執行的程式碼的過程 中仍有困難。以重複結構 loop 為例,學生在數學中所學到的代數、等號以及方程 式的知識並不足以協助他們在實作程式題目時建構變數、代入及迴圈概念。

Perkins 與 Martin(1986)認為學生在犯下程式錯誤的原因,並不完全是因為 學生缺乏所需的知識,而可能是有部分缺漏或誤解。他們將其稱之為脆弱知識,

並分為以下四種:

1 局部知識:學生僅擁有該知識的局部片段。

2 惰性知識:學生擁有該知識,但無法在需要時取用。

6

3 錯置知識:學生擁有該知識,但使用在錯誤的地方。

4 混用知識:學生將不同的知識混雜在一起。

另一方面,計畫組織型的錯誤多發生於學生將不同的程式片段整合為完整程 式的過程中,因為缺乏整體性的規劃使得程式有所缺漏無法正常運行,如未進行 邊界錯誤的阻擋。Spohrer、Soloway 與 Pope(1985)將計畫組織目標程式時所需 進行規劃設計的計畫元件(plan components)分為:(1)輸入;(2)輸出;(3)初始值;

(4)資料更新;(5)防護措施;(6)語法;(7)整體計畫。並將計畫組織時會發生的錯 誤分為以下四種類型:

1 缺乏(Missing):未進行計畫元件的實作。

2 異常(Malformed):計畫元件未實作完全或有錯誤。

3 偽造(Spurious):實作了不屬於計畫中的元件。

4 錯位(Misplaced):計畫元件有實作,但位置錯誤。

Spohrer、Soloway 與 Pope(1985);Kopec、Yarmish 與 Cheung(2007)及 Kopec 與 Yarmish(2007)實際統計分析學生在 Pascal 及 C 程式語言中的程式錯 誤發現,學生最常犯的程式組織錯誤多屬於異常及缺乏兩類。Kopec 與 Yarmish

(2007)更進一步提出若是能清楚呈現程式題目將有助於學生理解題意及規劃解 題計畫。

Ebrahimi(1994)發現程式語言結構以及計畫組織這兩種類型的錯誤發生量 具有高度相關,意即若學生常犯下語言結構類的程式錯誤,他同時也較容易犯計 畫組織型的錯誤。

另外有部分的迷思概念是源自於學生對電腦的能力具有不切實際的幻想,Pea

(1986)將這些與特定程式語法無關的錯誤觀念分為以下三種:

1. 排比型(Parallelism bug):認為程式可以同時執行多段程式碼。

2. 意向型(Intentionality bug):認為電腦會在執行過程中具有自動完成的能 力。

7

3. 心之所向型(Egocentrism bug):認為電腦會自動補足程式設計者遺漏的 部分,或可以正確的將寫錯的序數修正。

Lahtinen、Ala-Mutka 與 Järvinen(2005)針對 559 名學生和 34 名教師所進行 的問卷調查統計結果顯示學生在進行程式設計時最容易遭遇到的困難有(1)設計 程式以處理特定任務;(2)將程式依所需的功能化分為數個程序;(3)從自己的程式 中找出錯誤。在程式概念方面,學生較難理解的概念包括遞迴(recursion)、指標 與參照(pointers and reference)、抽象資料型態(abstract data type)及錯誤處理(error handling)。Ragonis 與 Ben-Ari(2005)及 Chen、Cheng 與 Lin(2012)統整學生 使用 Java 學習物件導向程式設計時常見的迷思及迷失概念,發現學生之所以無法 順利解答程式題目,是由於(1)無法記住程式語言語法規定,如無法正確定義靜態 資料成員及常數、建立物件、迴圈、方法的呼叫;(2)缺乏對程式碼實際運作情形 的理解,特別是 for-each 及 for 迴圈的控制及運作流程,以及方法的參數回傳方 式;(3)不了解物件導向概念,如靜態資料成員、方法重載、建構式及常數與變數 的差異等,進而導致未進行宣告、呼叫或誤用;(4)對程式概念未完全理解,如將 建構式與一般方法混淆、資料定義位置錯誤等。

除此之外,由於程式設計教學的過程中教師及教科書皆提供學生「絕對正確」

的程式碼範例,因此造成許多學生在遭遇程式錯誤時缺乏解決錯誤的能力。

Ahmanzadeh、Elliman 與 Higgins(2005)指出,一個好的程式設計者,未必同時 是一個好的除錯者,學生在除錯時需要掌握的能力包含(1)對程式的執行目標;(2) 目前程式的實際狀況;(3)錯誤內容;(4)針對錯誤的處理方法。其中最為重要的是 對程式現況的理解能力,學生不僅需要能夠讀懂程式碼,並且還要能夠透過輸 入、輸出等資訊判斷程式運作情形,藉此找出錯誤進行處理。Vainio 與 Sajaniemi

(2007)發現學生在追蹤(tracing)程式碼中的困難包含難以追蹤變數值的變化、

程式結構及函式的混淆、無法有效的使用其他程式表示方式及無法提升至抽象思 考層面,究其原因除了學生缺乏對程式語言語法結構及程式概念上的專業知識,

8

還牽扯到程式呈現的方式及相關輔助工具(如流程圖)的使用。教師應該要協助 學生學習及掌握除錯技巧,以增加學生的自信及學習動機。

綜上所述,學生在學習程式設計時,從各語言專屬的語法結構,到共通的問 題解決層面都有可能遭遇學習困難。教學者應透過學生所遭遇到的困難,分析理 解學生在知識上的誤解或缺失,並規劃合適的教學方法,以期培養學生在程式設

綜上所述,學生在學習程式設計時,從各語言專屬的語法結構,到共通的問 題解決層面都有可能遭遇學習困難。教學者應透過學生所遭遇到的困難,分析理 解學生在知識上的誤解或缺失,並規劃合適的教學方法,以期培養學生在程式設

相關文件