999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

從錯誤中學習:計算機程序設計課程改革實踐

2018-01-27 05:58:53
計算機教育 2017年12期
關鍵詞:能力課程學生

陳 娟

(國防科技大學計算機學院,湖南長沙410073)

1 編程能力培養需要“錯誤”

編程能力的培養一直被認為是程序設計課程的重要內容之一。2013年底,美國前總統奧巴馬呼吁每個美國人都要學習編程,為此還專門錄制了一段視頻,呼吁全民寫代碼,在全美引起了不小的反響[1]。奧巴馬的講話中提到“學習編程技能不僅對你的未來有重要的意義,它對于美國國家的未來也非常重要”。2013年12月,美國科技界最大的新聞之一是code.org發起的“編程一小時”活動[2]。可見,美國政府及社會各界對程序設計的重視程度非常高,關注范圍也非常廣。

我國對程序設計課程的教學改革也十分重視,十分關注學生實際編程能力的提高,并將此作為課程改革的重要目標之一,且目前已經取得了不錯的效果。盡管如此,程序設計課程的實踐能力培養仍然會遇到諸多新問題和新挑戰。其中,學生在編程過程中的自我查錯與自我糾錯能力、教師對各種錯誤案例的分類與整理能力、教學活動中對于錯誤案例的使用和作用發揮程度等,都從很大程度上影響了學生編程能力的進一步提高。

2014年,ACM計算機教育杰出貢獻獎獲得者RobertM.Panoff博士在SIGCSE2014大會所作的主題報告中提出一個鮮明觀點:“Right Answer=WrongAnswer+Corrections”(正確答案=錯誤答案+更正)[3]。由此可以看出,錯誤對于找到正確答案的重要性。該觀點在教材方面也有相關書籍可以參考,如《C陷阱與缺陷》[4]《品悟C——拋棄C程序設計中的謬誤與惡習》[5]等。《C陷阱與缺陷》一書從詞法分析、語法語義、連接、庫函數、預處理器、可移植性缺陷等方面分析了C語言編程中可能遇到的問題,最后給出一些具有實用價值的建議。

在程序設計教學中,雖然我們已經意識到編程錯誤的重要性,但是仍然缺乏系統的分析與研究以及教學實踐,如錯誤產生的理論基礎是什么、錯誤的產生、錯誤的分類與更正方法、錯誤的避免方法、錯誤案例的搜集與分類方法、錯誤與編程能力培養之間的關系等。研究這些問題,有助于提高程序設計課程的教學理論水平以及開展編程實踐活動的水平,有助于真正提高學生的編程能力。

2 國內外相關教學改革

2.1 國外相關教學改革現狀

國際上,計算機教育領域的廣大教育研究者長期關注著程序設計中的編程錯誤。20世紀70年代就出現了關于編程錯誤的相關研究。文獻[6]對程序員所犯的錯誤給出了系統化的描述,通過對42名編程員的數據搜集,洞悉各種編程錯誤的關聯及重要性,其研究中所關心的問題包括程序員易犯的錯誤類型、如何找到并更正錯誤、不同的編程語言之間是否有差異、編程經驗對程序員犯錯有什么影響等。

ACM計算機科學教育大會是ACMSIGCSE的旗艦會議,是計算機教育領域的國際頂級會議。以SIGCSE2017為例,就有多項與幫助學生識別編程錯誤相關的教學研究,如肯特州立大學開發了一個工具[7]幫助C語言的初學者學習編程,對于錯誤的類別進行了區分,包括編譯器能夠識別的語法錯誤和編譯器不能識別的語法錯誤。研究者主要關心以下3個問題:對于學生來說,什么錯誤是最難定位的、學生需要花多長時間找到并修正錯誤以及學生修正錯誤的效果如何。為了回答上述問題,研究者收集了以下數據:識別出的和遺漏的錯誤類型、定位錯誤所需要的時間、學生是否具備將錯誤與錯誤類型相關聯的能力以及修正錯誤所花費的時間。

美國艾柏林基督大學的RaymondPettit等人[8]改善了編譯器錯誤消息的準確度,使得學生更容易理解錯誤,并且更有效地更正錯誤;同時,他們關注學生連續提交相同編譯錯誤的次數是否降低,希望以此證明他們方法的有效性。

2005年,英國肯特大學的MatthewC.Jadud[9]在面向對象編程的導論課中,關注了學生使用BlueJ編程環境開發Java語言時的編譯出錯情況,并給出最易犯的錯誤列表,用以改進之后版本的BlueJ開發環境。他們發現,在出現的1926個錯誤中,共會遇到42個不同的錯誤,其中5個錯誤的出錯次數高達58%。

日本九州大學信息科學與電子工程系開發了一個教學系統,本科生在學習C語言時可以用它定位錯誤并找到解決方案。該教學系統有兩類日志:C語言編程錯誤日志和BookLooper閱讀日志。一旦錯誤發生,系統將分析BookLooper中最常被訪問的頁來提供相關材料;系統會為教師生成一份反饋,以幫助教師對材料進行補充。研究者對錯誤進行分類,將常見錯誤分成了26類,類別信息也連同錯誤日志一起被增加。

調錯系統與錯誤定位緊密相關,文獻[10]中提出教學生debugging的教學方法。

2.2 國內相關教學改革現狀

近幾年,國內針對程序設計課程也展開了多種多樣的改革,如將基于翻轉課堂的創客式課堂教學模式應用在程序設計課程群中,提高學生的學習能力和創新能力[11];通過將任務項目驅動的教學模式引入程序設計課程教學中,提出以培養學生計算思維能力和程序設計能力為目標的教改思路與方法[12];對高級語言程序設計課程進行慕課建設[13-14]等。

3 編程錯誤的產生與編程能力培養實踐

3.1 編程錯誤的產生與避免

在編程過程中,無論是邏輯錯誤,還是運行錯誤,又或者是概念理解錯誤,都與人類認知密切相關。根據人類錯誤理論[15],人類認知過程分為3個階段:planningstage(計劃階段)、storage stage(存儲階段)和executionstage(執行階段)。錯誤根據人類認知過程而分為3類:slips(鍵入錯誤)、lapses(判斷錯誤)和mistakes(錯誤)。鍵入錯誤通常發生在執行階段,是由于不正確地執行一個預定義動作而產生的;判斷錯誤通常發生在存儲階段,是由于疏忽一個已存儲的預定義動作而產生的;發生在執行階段的mistakes(錯誤),是指設定的計劃并不適合于達到期望的目標。

C語言程序設計學習過程中的錯誤有多種分類方法,常見的錯誤分類方法是將編程錯誤分為3類:編譯錯誤、邏輯錯誤和運行時錯誤。編譯錯誤是指違反構成語言規則的錯誤,通常包括未聲明變量或函數錯誤、變量類型錯誤、標點及符號錯誤等,如缺少分號、缺少左(右)花括號、左右括號不匹配等;由于編譯錯誤會妨礙程序執行,因此所有的編譯錯誤都必須在程序運行之前被更正。邏輯錯誤是指運行結果不是期望的結果,但是也不會報錯的錯誤,常見的邏輯錯誤包括未初始化變量、用賦值號代替邏輯相等符號進行邏輯判斷、switch語句中缺少break語句、在不需要使用分號的地方使用分號等。運行時錯誤是指在程序運行時發生的錯誤,常見的運行時錯誤包括數組邊界錯誤、內存溢出、用零做除數、未初始化指針錯誤、返回對局部內存的引用等。

我們根據問題求解過程的大致先后順序,將錯誤產生的原因歸為以下5類:①不進行自頂向下的問題分解,對于復雜問題直接進行代碼編寫;②代碼的模塊化設計不佳,模塊之間的接口不清晰;③不遵循命名規則和通用的編程風格;④代碼測試不完善;⑤不進行調試或存在不良調試習慣。我們分別對每類錯誤進行解釋,并給出避免方法。

第1類錯誤是由于沒有進行自頂向下的問題分解所產生的。對此,我們采取的避免措施包括以下3個方面:①要求學生學會自頂向下的問題分解方法,目的是建立“自頂向下、逐步求精”的思維方式,自頂向下的設計過程包括系統概要設計和子系統的逐步精化;②只有完成所有子系統的設計時,才能開始具體的編碼實現工作,在此之前只能進行子系統的功能設計;③在編寫具體代碼時,要求先寫主程序,主程序由系統概要設計時確定的所有功能子程序所構成,通常調用了各個功能子程序,編寫完主程序之后再依據每個子程序的功能進行代碼編寫。

第2類錯誤是由于代碼的模塊化設計結構不清晰所造成的。避免措施包括:①學會從邏輯意義上進行模塊化設計,而非簡單物理意義上的代碼分割;②必須學會定義和使用函數,定義一個函數包括函數的輸入參數和返回值;③編寫盡可能簡單的函數,每個函數只完成一個功能,避免出現很長的函數,因為對于初學者而言,適當限定每個函數的長度有利于養成良好的編程習慣;④為了盡量避免或減少模塊銜接部分產生的錯誤,要重點注意不同模塊訪問公共數據結構時可能出現的干擾,以及不同模塊之間使用相同局部變量名所引發的沖突和錯誤。

第3類錯誤是由于命名規則和編程風格不好所導致的。避免措施包括:①變量命名要有意義,且命名風格盡量保持一致;②注意變量的命名長度;③編碼盡量規范,注意縮進;④養成編寫注釋的習慣,以下位置一般需編寫注釋,如整個程序的開始、關鍵變量的含義、每個子程序模塊的功能描述和輸入輸出參數說明;⑤編寫程序的說明文檔,如標注整個程序的文件結構、版本及日志文件、主要程序功能、輸入數據集構成、可能的輸出樣例等。

第4類錯誤是由于代碼測試不完整所造成的。這類錯誤可以通過單元測試和集成測試盡可能予以避免。①單元測試是指編寫足夠多的單元測試用例,對每個模塊進行功能性和完整性測試;單元測試要注意測試用例的完整性,盡可能覆蓋所有的執行分支,數據要覆蓋所有可能的范圍,如正數、負數、零等;特殊元素的測試,如零;注意數組邊界情況的測試、指針訪問空間的有效性、申請的臨時空間是否及時回收等。②集成測試是指對組裝在一起的多個模塊進行測試,常用的集成測試方法包括非漸增式測試和漸增式測試。

5類錯誤的分類及避免方法如圖1所示。

3.2 基于錯誤案例的編程能力培養

3.2 .1錯誤案例搜集與分類

錯誤案例的搜集與分類須分別從學生、教師和教輔的角度進行考慮。

1)如何指導學生進行錯誤的搜集和分類?

(1)要求學生對自己在課堂上出現的疑問、犯的錯誤以及教師的解答進行記錄,并每周匯總一次給教輔,同時將出現的錯誤與可能的知識點進行關聯,在教師的指導下進行關聯式學習,避免以后犯類似錯誤。

(2)要求學生對教師在課堂上的提問及展開的討論進行記錄和整理,包括提問的內容、相關代碼、學生的回答、出現的錯誤、調試方法、調試演示過程、相關調試技巧和正確解答。

圖15 類編程錯誤的避免手段

圖2 編程錯誤與編程能力培養之間的關系

(3)要求學生對習題課上的疑問和解決方案進行記錄和整理,包括所用機器的結構、體系結構、編程環境、調試選項等。

(4)對課后作業中出現的各種錯誤進行記錄和整理,還包括開展的Project項目中出現的各種錯誤、不當的日志文檔記錄、bug調試錯誤記錄等。

2)教師如何進行錯誤的搜集和分類?

③應堅持骨干工程與配套工程相匹配。骨干水利工程的良性運行,離不開配套工程的輔佐,田間配套工程是農田灌溉的“最后一公里”。應加強大中型灌區田間配套工程的建設,確保與骨干工程建設的同步和匹配,以保證工程整體效益的充分發揮。

(1)對錯誤問題的設計及課堂提問情況進行記錄。教師根據記錄的錯誤日志文件,進行錯誤案例設計,并將這些錯誤案例穿插在課堂講解中,提問并記錄學生解答情況,以檢測教學效果。

(2)對課堂上學生的提問以及回答情況進行記錄,同時將典型錯誤與相關知識點關聯,采用聯想式教學衍生出與此類似的新問題。

(3)對在線答疑時學生提問及回答情況進行記錄。在線答疑與課堂提問有所不同,課堂上所提出的問題中,有一部分是學生在學習新概念時沒能理解的問題,這類問題通常比較直接;在線答疑的問題有時并不直接,通常是學生經過反復思考或長時間編程、調試仍然未能解決的問題,這往往也是比較典型的錯誤,還有可能涉及其他相關知識,對這類問題的記錄要注意保留學生的出錯“現場”,同時注意跟蹤學生今后是否還會犯類似的錯誤。

3)教輔如何輔助教師進行錯誤的搜集和分類?

(1)教輔協助教師對提交的錯誤進行分類和整理,包括按照章節知識點進行錯誤整理,以便教師在下一次教學中設計新的錯誤案例;對學生所犯錯誤的次數和頻率進行分類,幫助教師設計錯誤案例。

(2)教輔協助教師對學生的學習程度進行分級,并對不同程度的學生錯誤進行歸類,及時發布給學生,同時選擇性地進行課堂講解。

3.2 .2編程錯誤分析與編程能力培養

根據解決問題的過程步驟,我們將編程能力分為4級,從上到下依次是對一個問題的抽象能力、進行模塊化分解的能力、進行子模塊功能定義的能力和實際編寫代碼的能力。如圖2所示,我們給出這4級編程能力與編程錯誤之間的關聯。其中,右邊一列代表5類錯誤,和圖1中的5類錯誤相吻合;雙向箭頭代表這5類錯誤與4級編程能力之間的關聯性;左邊一列列出4級編程能力,用單項箭頭表明問題求解過程中的時間段。

越往上層的編程能力的缺失或不足,所犯的錯誤越難糾正或者糾正的代價越大,因為這種錯誤對于代碼的影響來說可能是根本的、致命的。這類編程能力的培養有時需要學習其他相關計算機課程,如數據結構、算法設計等,以培養學生的問題抽象能力和問題分解能力。目前的程序設計課程往往比較缺乏對問題分解能力的培養和鍛煉,極大地影響了學生編寫大型程序,且使得學生無法高效完成代碼的合作編寫。

越往下層的編程能力的缺失或不足,使得所犯的錯誤相對比較集中和明確,容易識別和糾正,這類錯誤通常與編程習慣的養成有關,規范性的東西較多,在教學過程中比較容易掌控。對于這類錯誤,目前教學中比較注重命名規則和編程風格的規范以及調試方法,但是往往容易忽略調試習慣的養成、高級調試技巧的掌握以及代碼測試的作用,這也影響學生自我查錯能力的鍛煉以及編寫大型軟件時提高全面代碼測試能力。

4 實踐效果及反饋

通過兩個學期的實踐,學生普遍反映自己編程能力的提高比較明顯,具體體現在3方面:①問題分解能力得到提高,掌握了基本的問題分解方法和技巧,學會了如何將一個問題劃分為多個子問題;②子模塊功能定義能力提高,能夠從邏輯意義上將一個問題劃分成多個子模塊,并用函數定義每一個子模塊的功能,清楚函數的參數設置方法及參數作用域,學會了如何調用函數進行復雜問題求解;③程序查錯及調試能力提高,絕大部分學生可以根據基本的編譯錯誤提示快速糾正語法錯誤,大部分學生能夠通過調試、跟蹤代碼的執行過程查找語義錯誤,部分學生掌握了通過斷點設置方法和條件斷點的設置查找運行時錯誤。

5 結語

編程能力培養離不開編程錯誤案例的分析與避免方法,對此國內外程序設計課程教學研究者均有認同,并在錯誤識別、錯誤定位與分析、輔助工具等方面作出大量研究。編程錯誤產生的原因多種多樣,我們從問題求解過程的角度發現錯誤產生的原因主要有5類,并將這5類編程錯誤與編程能力之間進行了關聯,給出了一些錯誤避免方法和建議。

[1]優酷.奧巴馬呼吁每個美國人都學習編程[EB/OL].[2017-08-02].http://v.youku.com/v_show/id_XNjQ2MzAxODky.html.

[2]編程一小時[EB/OL].[2017-08-02].https://code.org/learn.

[3]PanoffRM.Computationalthinkingforall:Thepowerandtheperil[C]//Proceedingsofthe45thAC MtechnicalSymposiumon ComputerScienceEducation(SIGCSE'14).NewYork:ACM,2014:1-2.

[4]凱尼格.C陷阱與缺陷[M].高巍,譯.北京:人民郵電出版社,2008.

[5]薛非.品悟C:拋棄C程序設計中的謬誤與惡習[M].北京:清華大學出版社,2012.

[6] Youngs E A. Human errors in programming[J]. International Journal of Man-Machine Studies, 1974, 6(3): 361-376.

[7] Alqadi B S, Maletic J I. An empirical study of debugging patterns among novices programmers[C]//Proceedings of the 2017 ACMSIGCSE Technical Symposium on Computer Science Education(SIGCSE’17). New York: ACM, 2017: 15-20.

[8] Pettit R, Homer J, Gee R. Do enhanced compiler error messages help students: Results inconclusive[C]//Proceedings of the 2017ACM SIGCSE Technical Symposium on Computer Science Education(SIGCSE’17). New York: ACM, 2017: 465-470.

[9] Jadud M C. A first look at novice compilation behavior using blueJ[J]. Computer Science Education, 2005, 15(1): 25-40.

[10] Lewis C M, Gregg C. How do you teach debugging: Resources and strategies for better student debugging[C]//Proceedings of the2016 ACM SIGCSE Technical Symposium on Computer Science Education(SIGCSE’16). New York: ACM, 2016: 706.

[11] 陳晉音, 俞山青, 毛國紅, 等. 程序設計課程群的創客式課堂教學模式探究[J]. 計算機教育,2017(1): 80-83.

[12] 郭銀章, 王麗芳. 基于項目任務驅動的C語言程序設計課程教學改革與實踐[J]. 計算機教育, 2017(2): 41-44.

[13] 陳娟, 張長海, 鄧春燕, 等. 高級語言程序設計課程的慕課建設與思考[J]. 計算機教育, 2017(1): 9-13.

[14] 鄭莉. “C++語言程序設計”慕課的設計[J]. 計算機教育, 2015(23): 120-122.

[15] Reason J. Human error[M]. Cambridge: Cambridge University Press, 1990: 1-296.

猜你喜歡
能力課程學生
消防安全四個能力
數字圖像處理課程混合式教學改革與探索
軟件設計與開發實踐課程探索與實踐
計算機教育(2020年5期)2020-07-24 08:53:38
為什么要學習HAA課程?
趕不走的學生
大興學習之風 提升履職能力
人大建設(2018年6期)2018-08-16 07:23:10
你的換位思考能力如何
學生寫話
學生寫的話
抄能力
主站蜘蛛池模板: 国产综合日韩另类一区二区| 亚洲中文无码av永久伊人| 中文无码伦av中文字幕| 成人亚洲国产| 99精品视频在线观看免费播放| 无码专区在线观看| 最新亚洲人成网站在线观看| 无码AV高清毛片中国一级毛片| 日本欧美一二三区色视频| 毛片a级毛片免费观看免下载| 成人在线不卡视频| 欧美日韩一区二区三区在线视频| 乱人伦99久久| 狂欢视频在线观看不卡| 四虎国产在线观看| 国产亚洲美日韩AV中文字幕无码成人| 国产欧美日韩另类精彩视频| 久久久无码人妻精品无码| 欧美曰批视频免费播放免费| 高清无码手机在线观看 | 亚洲九九视频| 久草国产在线观看| 国产精品刺激对白在线| 国语少妇高潮| 国产亚洲精| 国产毛片不卡| 国产综合网站| 99尹人香蕉国产免费天天拍| 色婷婷亚洲十月十月色天| 国产一区亚洲一区| 超碰精品无码一区二区| 亚洲天堂网视频| 中文字幕2区| 在线人成精品免费视频| 日本精品中文字幕在线不卡| 香蕉久久永久视频| 亚洲码一区二区三区| 国产精品视频999| 青青草综合网| 无码网站免费观看| 国内老司机精品视频在线播出| 丁香六月激情综合| 国产一区二区三区免费观看| 久久黄色一级片| 国产一区二区三区免费观看| 一区二区三区在线不卡免费| 日韩欧美中文字幕在线韩免费| 996免费视频国产在线播放| 国产大片喷水在线在线视频| 久草视频中文| 久久婷婷国产综合尤物精品| 激情网址在线观看| 免费大黄网站在线观看| 72种姿势欧美久久久大黄蕉| 欧日韩在线不卡视频| 日本一区二区三区精品国产| 久久男人视频| 国产在线麻豆波多野结衣| 最新日韩AV网址在线观看| 日韩a级片视频| 一边摸一边做爽的视频17国产 | 亚洲日本韩在线观看| 久草视频精品| 国禁国产you女视频网站| 欧美成人精品一级在线观看| 91精品aⅴ无码中文字字幕蜜桃| 国产丰满成熟女性性满足视频| 色综合五月婷婷| 最新痴汉在线无码AV| 欧美日韩国产高清一区二区三区| 久久天天躁狠狠躁夜夜躁| 国产成人精品一区二区三区| 亚洲va精品中文字幕| 亚洲欧美在线看片AI| 免费一级α片在线观看| 色国产视频| 国产农村精品一级毛片视频| 国产日韩精品欧美一区灰| 日韩在线2020专区| 91色爱欧美精品www| 日韩欧美国产三级| 国产91高清视频|