江南+王春枝+康瑞華


摘 要:針對計算機專業程序設計語言類課程體系設置單一、教學過程較為僵化、重技能而輕計算思維等問題,提出增加函數式編程語言課程、適當調整課程內容的講授次序、積極引導學生深入理解程序設計語言等措施。
關鍵詞:程序設計語言;課程體系;教學過程;計算思維
文章編號:1672-5913(2017)05-0042-03
中圖分類號:G642
1 程序設計語言類課程的教學現狀及問題
計算機學科知識結構更新快,其中,程序設計語言在短短的幾十年間經歷了較大變化。語言類課程是計算機學科的專業基礎課程,其學習效果直接影響其他后續課程。當前語言類課程教學主要面臨以下問題。
1.1 課程體系設置單一
國內高校計算機專業的程序設計語言類課程大多是過程式或者面向對象的命令式編程語言,課程體系設置單一。不可否認,這類語言無論是從學科性還是有用性上講,都是合適的。然而,程序設計語言不僅僅是這類命令式語言,它還包括如ML、Haskell這樣經典的函數式編程語言,或者如兼顧面向對象和函數式的Scala語言等。從某種意義上講,函數式編程能夠更大程度地鍛煉計算思維[1]。在多核并行程序設計已經被推到前沿的今天,命令式編程語言天生的缺陷使得構造并行編程模型變得非常復雜,而函數式編程在經歷數十年的發展之后,終于不再局限于實驗室的理論研究。事實上,如果不懂得函數式編程,Google不可能創造出MapReduce。
1.2 教學過程僵化
程序設計語言類課程的傳統講授是按照編程語言類教材的典型撰寫次序,先講常量、變量、數據類型等,再講表達式、語句等,再比較復雜的語言特點,這些花費了較多時間,最后可能不再有多余的時間剖析該語言的內建庫函數或者類,更少涉及該門課程與后續課程的銜接關系。這種傳統的講授方式針對第一門程序設計語言課程的教學,特別對那些沒有接觸過編程語言的學生來講,可能是一種較好的方式[2]。然而,對于第二門程序設計語言的授課,按照這種按部就班的教學過程推進教學進度時,由于在較長一段教學活動中所講授的都是孤立的語法點,學生看不到一個較為完整的應用實例,也不了解這門課程與其他課程之間的貫通,容易產生厭學的心理,也很難體會程序語言的設計藝術。
1.3 重編程技能,輕計算思維
針對程序設計語言類課程實踐性特別強的特點,許多教改措施都是針對如何提高學生的工程應用實踐技能的[2-3],如采用案例化、任務驅動、項目驅動等方式。編程技術固然重要,然而計算思維比單純技術更加重要。培養學生以計算機的方式進行思考和解決問題,讓他們認識到程序是思想的表現形式,最終能夠通過語言來表達思考與設計,并能理解這門語言設計和實現的長處、不足、限制等。為了達到這個目標,需要引導學生深入理解編程語言本身。
2 教學改革措施
2.1 增設函數式編程語言課程
函數式編程模型早在面向對象概念出現之前就已經存在了,它的核心是lambda演算。由于其語法不如命令式語言的語法直觀易懂,許多初次接觸函數式編程的人常常不知所措,會覺得難以理解。然而,這種難以理解性與熟悉程度相關。近20年的課程改革中,因為種種原因,程序設計語言類課程體系幾乎完全拋棄了函數式程序設計語言。如今,多核時代的興起,函數式程序代碼的簡潔性使得它在并發應用領域綻放光彩。雖然實用性是我們應當考慮的一個方面,但是從培養學生計算思維以及從編程語言本身的研究方面,增設函數式編程語言課程是很有必要的。
常用的函數式編程語言或者具備函數式編程語言特點的編程語言包括Haskell、ML、OCaml 、Scala等。依據需要可以選擇不同的函數式編程語言:如果傾向于編程語言本身的理解,可以選擇純函數式的ML、Haskell,或者OCaml;如果傾向于并行分布式程序的開發,可以選擇結合了面向對象和函數式特點的Scala語言,它兼容Java。此外,Java 8的lambda表達式也是一個不錯的學習函數式編程的選擇。
2.2 適當調整講授內容的次序
以Java程序設計語言的教學為例,按照常規教材的編寫次序,Java的教學內容通常是先講變量、類型、表達式和語句,然后是數組,接著是類和對象、繼承等。在實踐中我們對講授內容的次序進行了調整:在對Java語言作了初步介紹之后,緊接著講解對象的創建和使用,見表1。表1第2行的內容不再放在講解了類的定義之后。這個調整出于兩方面的考慮:一方面,讓學生盡快建立對象的概念,知道怎么使用對象;另一方面,數組在Java程序設計語言中視為對象,因此,講解了如何使用對象之后有利于數組的講解。而類的定義涉及較多語法知識,在講解了如何使用對象、變量、類型、表達式和語句之后,引導學生考慮這個問題——我們能不能按照自己的設計來創建對象呢,于是開始講解類的定義,見表1第5行。
為了講解如何使用對象,首先選擇兩個常用的Java內建類——字符串String和System,針對已經學習了C語言程序設計的學生,從教學效果上看,盡管學生還沒有接觸到Java的各種語法規則,但是他們仍然接受了“對象”這個知識點的講授。更重要的是,他們建立了對象的初步印象,了解了Java與C的不同,并在一定程度上激發了學生的學習興趣。
由于Java程序需要使用標準輸出流的方法System.out.print()用于輸出程序的運行結果,學生就問:Java程序怎么輸入呢?此時,對輸入輸出流進行較為完整的講解顯然不合適,在講解使用對象時,我們進一步講解如何使用Java的字符緩沖輸入流類BufferedReader,直接給出如下板書:
BufferedReader br = new BufferedReader(
//BufferedReader需要一個Reader類型的參數
//InputStreamReader就是一個Reader
new InputStreamReader(
//InputStreamReader需要一個InputStream類型的參//數,System.in就是一個InputStream
System.in));// System.in用于接受鍵盤的輸入
br.readLine(); //BufferedReader的readLine
//方法讀入一行
以上這段代碼稍顯復雜,學生在課余可以仔細研究并進行試驗。實踐表明,這些Java常用內建類的使用在教學初期給出時,不但沒有造成學生的困惑和畏懼,反而提升了學生的學習熱情。
2.3 引導學生深入理解程序設計語言
程序設計語言類課程對于培養學生的計算思維非常重要,需要學生深入理解程序設計語言本身的設計與實現,而不僅僅是學習單純的語法。
通常學生因其視野的局限性和課時的限制,無法深入學習一門程序設計語言。教師在授課時應該找機會引導學生去深入理解。通常,語言設計和實現者提供了API文檔和源碼,這些是深入理解一門編程語言最直接也是非常好的參考資料。如果學生能夠養成查看API的習慣,無疑能夠促進對語言的認識和理解。以引用類型變量的講解為例,假設變量p引用的是一個Person類型的對象,變量s引用的是一個String字符串對象。System.out.print(p)輸出結果是代表對象地址的哈希碼,而System.out.print(s)輸出了一個字符串。這是為什么呢?同時,有學生就會提出疑問:System.out.print(p)是否可以直接輸出p所引用的Person對象的成員值,如姓名和年齡等,而System.out.print(s)是否可以輸出這個字符串對象的地址哈希值?在這個過程中,可以引導學生逐步查找對應的API,如圖1所示。最后可以進一步查看Object類和String類對應方法的實現源碼。知道了這個思路后,學生豁然開朗,開始著手解決問題。
在教學實踐中,我們常常鼓勵學生按照這種方法去找解決思路,而不是直接給出答案。得益于Java的開源,在Java程序設計語言的教學活動中,我們也鼓勵學生查看javac編譯器或者JVM的即時編譯器的實現源碼。學生通過這種學習方式,在長期使用一門程序設計語言后,最終能夠駕馭語言,表達類似計算機方式的思考與設計。
3 結 語
在兼顧學科性和社會有用性方面,我們一直致力于計算機專業程序設計語言類課程的教學改革。結合教學實踐以及對計算機專業程序設計語言類課程如何開展教學的長期思考,我們針對存在的問題,給出了相應的解決辦法,并作了初步嘗試,取得了一定的效果。程序設計語言類課程的教學任重道遠,我們應該投入熱情,積極摸索和實踐,總結經驗教訓,使程序設計語言類課程體系更趨于合理,不斷提高教學質量。
參考文獻:
[1] 車萬翔, 蘇小紅, 袁永峰, 等. 計算機專業高級語言程序設計課程改革探索[J]. 計算機教育, 2014(7): 56-58.
[2] 李東明, 趙偉. Java語言課程實踐教學實踐[J]. 計算機教育, 2011(13): 122-125.
[3] 魯紅英, 肖思和, 孫淑霞.“C/C++語言程序設計”課程教學改革與實踐[J]. 計算機教育, 2013(7): 95-98.
[4] Igoe T. Stop teaching programming, start teaching computational thinking [EB/OL]. [2016-04-05]. http://makezine.com/2016/04/05/stop-teaching-programming-start-teaching-computational-thought/.
(編輯:彭遠紅)