任遠 吉順如 林志杰
摘要:《程序設計》是高等學校理工科專業(yè)普遍開設的系列必修課程,對計算機專業(yè)具有非常重要的地位。探討如何通過《程序設計》教學培養(yǎng)本科生,特別是新生的計算思維,提出了五種以計算為訓練方式培養(yǎng)計算思維的教學方法,以計算思維為導向的教學改革已經在上海電機學院計算機基礎教學部進行了小范圍應用并取得一定成果,初步說明通過計算培養(yǎng)計算思維是一種行之有效的教學模式。
關鍵詞:計算思維;程序設計;語言;計算;新生
中圖分類號:G642.0 文獻標志碼:A 文章編號:1674-9324(2015)49-0276-03
一、《程序設計》課程簡介
《程序設計》是高等學校理工科專業(yè)普遍開設的系列必修課程。這門課主要講授用高級語言如C/C++及Java等開發(fā)計算機程序的基本知識,培養(yǎng)學生用計算機分析并解決問題的能力,使學生掌握軟件設計的基本方法,為后續(xù)課程奠定基礎。
國內高校普遍將《程序設計》課程按照語言的不同分為多個系列:C語言、C++語言及Java語言等。不同學校及專業(yè)根據(jù)各自的培養(yǎng)方案為學生開設其中幾種,至少有一種語言(一般是C語言)為必修,開設于大一及大二學年,理論課與實驗課共60~100課時,持續(xù)1~2個學期。各高校也普遍為計算機相關專業(yè)高年級學生開設其他流行編程語言如Visual Basic以及更專業(yè)化編程語言如Matlab、SQL及HTML等等。這些語言的基本語法與C語言相似甚至是高度相似,程序設計思想相通,因而其教學也高度依賴于低年級程序設計課程的教學效果。
二、面向新生的《程序設計》課程
對計算機及軟件等專業(yè)的學生而言,《程序設計》是一門專業(yè)基礎課,這門課程一般開設于本科一年級,因而授課對象主要是本科新生。一方面,大多數(shù)計算機相關課程如《數(shù)據(jù)結構》、《操作系統(tǒng)》及《數(shù)據(jù)庫》等都需要編程語言的基礎知識,學生在這門課收獲的學習成果對高層次的學習乃至工作都具有非常重要的意義;另一方面,編程語言課程的教學能夠直接訓練學生的計算思維[1],計算思維的形成和培養(yǎng),是目前高等院校計算機教學,甚至包括非計算機專業(yè)的計算機基礎教學所追求的一個重要目標。在學生剛剛升入本科階段,而幾乎不曾開始學習專業(yè)課,專業(yè)思維模式尚未形成之前,就逐漸培養(yǎng)其計算思維,又顯然是這項任務的重中之重。
高中信息技術課程一般包括Visual Basic等編程語言的知識,但長期以來,受高考指揮棒的影響,全國各省市的小學、初中與高中教育普遍對計算機(信息技術)課程的重視程度不夠。在程序設計不作為會考要求內容的省份,一些學校甚至沒有開設編程語言課程,或者要不做任何要求,導致在高中階段,教師與學生的教學興趣度極低。一個最直接的后果是,即使是計算機相關專業(yè)的學生,剛進入大學時,也普遍對程序設計這類課程既陌生又恐懼。
由于這類課程本身的深度與難度,本科新生,特別是在高中階段沒有學過程序設計,甚至幾乎不曾接觸過計算機的新生,往往承受較大的學習壓力,如果不能很好地掌握程序設計的思維與方法,學生很容易喪失學習計算機相關課程的興趣與信心,從而影響整個大學階段的專業(yè)學習,因而承擔大一新生程序設計課程的教師也同樣承受較大的教學壓力。如前所述,這個問題產生的直接原因固然是高中信息科學知識儲備的不足,但根本原因還是學生在從多年來已經習慣的數(shù)理化式的定義與公式學習模式轉變?yōu)橐杂嬎銠C學科為代表的設計與實驗的學習模式時產生了障礙,或者說學生沒有能夠形成學習計算科學應具有的思維模式。因而解決這個問題的關鍵即是,要通過程序設計課程的教學使學生形成并逐漸強化計算思維。
三、計算思維的內涵及重要性
按照卡內基·梅隆大學Jeannette M. Wing教授提出的廣義概念[1],計算思維是運用計算機科學的基礎概念進行問題求解、系統(tǒng)設計以及人類行為理解等涵蓋計算機科學之廣度的一系列思維活動。而具體到程序設計這門課,計算思維可以理解為編寫高級語言程序的方式解決問題的思維活動。由此可以看出,程序設計課程是培養(yǎng)學生的計算思維最重要的方式之一,而培養(yǎng)學生的計算思維也是程序設計課程最重要的目的之一。
計算思維這一重要概念被提出后,引起高等教育界的廣泛注意。關于如何在程序設計課中培養(yǎng)本科生的計算思維能力這一問題也成為高校計算機教學中普遍關注的問題。文獻[2-4]討論了如何通過計算機基礎教學培養(yǎng)計算思維,文獻[5-7]討論了通過程序設計課程培養(yǎng)計算思維,文獻[8]討論了如何通過程序設計培養(yǎng)學生的多種思維能力,文獻[9;10]提出以計算思維為導向開展程序設計教學,文獻[11-13]提出了基于計算思維的程序設計教學改革方式,文獻[14;15]討論了通過程序設計課程培養(yǎng)計算思維的具體實踐方式,文獻[16]探討了如何以計算思維為訓練目標設計程序設計案例,文獻[17]討論了如何通過非計算機專業(yè)的程序設計課程培養(yǎng)計算思維。但圍繞如何針對新生開展高效程序設計課程教學[18],以及如何培養(yǎng)新生的計算思維這些方面的研究卻還很少。
計算思維,顧名思義,即“一切皆為計算的思維”,可以把它理解為一種將復雜的實際問題都轉換為可以用計算機解決的思維模式,而計算機解決任何問題的本質,顯然都是通過各種計算來完成的。掌握用計算機解決問題的方法,是當今社會中最重要也是最基本的技能之一。要實現(xiàn)這一目標,就要靠計算思維的長期漸進式培養(yǎng)與發(fā)展,這主要涉及兩個方面的任務:(1)需要了解計算機求解問題所使用的計算方式。只有了解計算機計算的方式,才能判斷一個問題是否可以直接被計算機求解,也才能將待求解的問題轉換為計算機可以求解的形式;(2)需要掌握用計算機求解問題的設計方法。只有能夠設計出讓計算機求解問題的計算方法,即算法,才算真正掌握了計算機科學。在眾多計算機相關課程中,程序設計是能夠實現(xiàn)以上兩個任務的重要載體課程,而計算,作為計算機解決問題的終極形式,又顯然應該是實現(xiàn)培養(yǎng)計算思維這一目標的核心訓練手段。
四、以《程序設計》培養(yǎng)計算思維的實踐策略
本人所在基礎教學部承擔上海電機學院全校非計算機專業(yè)及計算機專業(yè)本科一年級學生的程序設計課程教學任務,包括C/C++語言及Java語言,分兩個學期授課,理論課共64學時,實驗課共32學時。從字面意義就不難看出,“計算思維”的核心思想是計算的能力和技巧。在教學中,我們以計算作為最重要的訓練方式,貫穿于整個教學環(huán)境中,嘗試以計算促進計算思維的形成。具體地,我們主要采取以下方法:
1.用計算問題讓學生快速開始程序設計。學生都經過從小學到高中的數(shù)學訓練,普遍對各種基本數(shù)學問題非常熟悉。用一些最簡單的計算問題例如“從鍵盤輸入數(shù)值,計算其和差積商”可以使學生迅速上手,開始學習編寫程序。一方面,這樣可以避免在學習初就因受困于復雜的問題本身而影響編程語言語法規(guī)則的學習;另外一方面,也使學生通過解決簡單的計算問題獲得學習新課的成功感和自信心,提高對后續(xù)課程學習的興趣。
2.用計算問題使學生了解程序設計實現(xiàn)計算的規(guī)則。在講授選擇結構程序設計時,我們使用了“數(shù)學年份,輸出各月天數(shù)”的例子。一年中的各個月份天數(shù)不同,僅需分為三種情況;二月份的天數(shù)需要根據(jù)該年是否是閏年來判斷,而閏年的判斷是小學生都非常熟悉的:即年份能被400整除;或能被4整除但不能被100整除。為了用編程語言描述這種判定規(guī)則,就需要引入邏輯運算符表示“與”和“或”的關系并且要準確理解運算符的優(yōu)先級。這樣就可以通過一個例子充分了解分支結構程序的設計規(guī)則和邏輯計算的規(guī)則。
3.用計算問題使學生了解用計算機解決問題所需要考慮的額外因素。在進行一般的數(shù)學計算時,除了有些情況要求數(shù)值只能是整數(shù),我們一般不必考慮一個數(shù)是整數(shù)還是小數(shù)。但是用高級語言處理數(shù)據(jù),除了比較特殊的Python等語言不區(qū)分數(shù)據(jù)類型,一般的高級語言如C和Java都是嚴格區(qū)分數(shù)據(jù)類型的。在數(shù)學上,我們可以很自然地書寫x=1,y=0.5,但是在編程語言中,如果x被定義為浮點型,那么整數(shù)轉換為浮點數(shù),涉及表示方式的轉換,可能會丟失精度;如果y是整數(shù),將浮點數(shù)轉換為整數(shù)會丟失小數(shù)部分。而后者,在類型嚴格的語言如Java語言中甚至是不允許的。雖然單純的數(shù)學計算幾乎不涉及整數(shù)和浮點數(shù)類型轉換的問題,但數(shù)據(jù)的類型轉換卻是程序設計中最容易出錯的。通過編寫測試性程序驗證0.1+0.2不等于0.3,學生的印象會非常深刻,并且能夠更直觀地了解在用計算機計算時,數(shù)據(jù)類型精度是一個必須要考慮的因素,從而形成一種思維模式,在設計計算方法時能夠處處考慮類型與精度的相關問題。
4.通過計算加深對計算中特殊規(guī)則的理解,強化計算思維。在教學中,我們會讓學生編程練習求“3斤2元的蔬菜,6斤多少錢”這樣看似極其容易的問題。大多數(shù)學生會因為按照數(shù)學的習慣書寫2/3*6這樣的表達式而得到看似荒謬的答案0,這樣的錯誤在程序設計中非常普遍地存在,并且在調試代碼時這類錯誤隱蔽性極大,不容易被發(fā)現(xiàn)。只有通過大量這類的計算練習,才能讓學生充分理解程高級語言(C/C++/Java等)中/的特殊運算規(guī)則,即整數(shù)除法的結果還是整數(shù),如果要得到比較準確的結果,至少要把被除數(shù)和除數(shù)中的一個轉換為浮點數(shù),對于變量需要使用強制類型轉換,對于常量,除了強制類型轉換,還可以在后邊添加.0,及2和2.0在計算中是截然不同的兩個數(shù),產生的計算結果也是全然不同的。由此可以進一步強化對數(shù)據(jù)類型轉換的理解。
5.用計算問題使學生了解純粹的數(shù)學思維和計算思維的差別。在講解循環(huán)結構時,我們讓學生編程計算兩個數(shù)的最大公約數(shù)和最小公倍數(shù)。大多數(shù)學生會受困于小學數(shù)學中學過的短除法方法:用一個一個公因子依次去除兩個數(shù),直到商是互質的。對于手工計算,這種方法當兩個數(shù)都不太大,公因子比較容易找且不都太大的情況是非常容易且直觀的。但是用計算機套用這種思路編程時就會遇到麻煩:手工計算式公因子是直觀“看”出來的,而計算機是沒有辦法一下子猜到一個公因子的。但是利用循環(huán),這個問題就迎刃而解。按照定義,最大公約數(shù),就是最大的可以整除兩個數(shù)的數(shù),最大不會超過兩個數(shù)中較小的一個,只要用循環(huán),從兩個數(shù)的最小值開始,一個一個嘗試,每次減1,找到一個能夠同時整除兩個數(shù)的數(shù),就是答案而不必繼續(xù)找,而各種高級語言普遍都提供了求余的運算符。當兩個數(shù)變得很大時,這種方法的效率很低,于是可以利用循環(huán)實現(xiàn)更快尋找最大公約數(shù)的輾轉相除法;對最小公倍數(shù)的練習,也同樣可以強化循環(huán)的學習效果。通過這些例子可以使學生清楚地意識到,數(shù)學中的計算方式轉換為計算機的求解過程需要一定的轉換,而這種轉換正是計算思維的關鍵所在。
對以上幾種計算訓練模式,一個重要的環(huán)節(jié)是讓學生在實驗時犯錯誤,通過在計算中發(fā)生看似怪異的錯誤,而運算過程在數(shù)學上看來又無懈可擊,才能通過仔細的錯誤分析與代碼調試,發(fā)現(xiàn)按照一般思維無法發(fā)現(xiàn)的,由于計算機編程語言處理問題的特殊性而導致的錯誤,這樣才能使學生對這類錯誤的印象更深刻,從而盡可能減少今后出現(xiàn)同類錯誤的可能。
五、結語
在程序設計的教學中,我們利用學生普遍具有長期打下的良好的數(shù)學基礎這一特點,通過采取以上幾種方法,讓學生在解決計算問題時學會設計計算方法,逐步形成計算思維模式、加強計算思維方法,最終培養(yǎng)其計算思維能力。目前,課程教學改革正在持續(xù)進行階段,已初步取得一定成果,但還缺乏更久更大范圍的理論研究和實踐論證。我們希望能夠以這些改革措施改進理工科《程序設計》課程的教學效果,為大一學生學習后續(xù)課程打下良好的基礎,使他們受到全面的計算思維訓練,具有良好的信息素養(yǎng),最終提升他們在走出校園進入當今信息社會時的核心競爭力。
參考文獻:
[1]Wing J M. Computational thinking[J].Commun. ACM,2006,49(3):33-35.
[2]朱鳴華,趙銘偉,趙晶,et al.計算機基礎教學中計算思維能力培養(yǎng)的探討[J].中國大學教學,2012,(03):33-35.
[3]陸漢權,何欽銘,徐鏡春.基于計算思維的“大學計算機基礎”課程教學內容設計[J].中國大學教學,2012,(09):55-58.
[4]李波.計算思維與大學計算機基礎[J].中國大學教學,2012,(07):43-45.
[5]馮惠妍,陳爭光,邰建華,et al.程序設計中“計算思維”的教學研究[J].農業(yè)網絡信息,2013,(04):120-122.
[6]王衛(wèi)華.在程序設計類課程中培養(yǎng)學生計算思維能力的思考[J].武警學院學報,2013,(07):51-53.
[7]王先超,王春生,胡業(yè)剛,et al.以培養(yǎng)計算思維為核心的C程序設計探討[J].計算機教育,2013,(13):44-47.
[8]卜晨月.程序設計與學生思維能力培養(yǎng)的探討[J].林區(qū)教學,2013,(03):72-73.
[9]董衛(wèi)軍,邢為民,索琦.以計算思維為導向的程序設計課程改革與實踐[J].工業(yè)和信息化教育,2013,(06):60-64.
[10]劉光蓉.以計算思維能力培養(yǎng)為導向的C程序設計實驗教學[J].實驗技術與管理,2013,(01):154-156+191.
[11]劉曉璐.基于計算思維的Java程序設計教學改革[J].廣東技術師范學院學報,2013,(05):108-110.
[12]孫麗君,楊志強,高枚.圍繞計算思維培養(yǎng)的程序設計課程改革[J].計算機教育,2013,(05):29-31+38.
[13]徐燕,潘亞平.計算思維與計算思維能力培養(yǎng)——談大學計算機基礎教學改革[J].江蘇技術師范學院學報,2013,(02):92-95.
[14]商書元.計算思維培養(yǎng)在程序設計課程中的實踐[J].教育教學論壇,2013,(39):203-205.
[15]張雪伍,常晉義.計算思維在C++程序設計教學中的應用[J].計算機教育,2013,(13):52-56.
[16]楊俊生,張潤.基于計算思維的“C程序設計”案例設計初探[J].工業(yè)和信息化教育,2013,(06):65-69+64.
[17]商艷麗,許美玲.基于計算思維的非計算機專業(yè)VB程序設計課程教學研究[J].河南科技,2013,(16):262.
[18]趙飛,荊光輝,張潤澤.如何培養(yǎng)大學新生計算機語言編程能力[J].計算機教育,2007,(10):13-15.