摘 要 為了提高學生的編程能力,本文對C++、數據結構、離散數學、數值分析、軟件工程等課程統籌考慮,將其教學過程整合為編程能力訓練的綜合平臺,使課程教學與編程訓練緊密結合,既提高教學效果,又提高學生的編程能力。
關鍵字 程序設計 數據結構 離散數學 軟件工程 課程整合
1 引言
計算機類學生的就業率與就業質量逐年下降,而用人單位對畢業生的職業能力、職業經驗的要求卻連年升高,事實上學生職業能力與職業經驗卻逐年走低,已是大家有目共睹的不爭事實。在眾多能力與經驗中,編程能力與編程經驗,是重要的能力之一。
學生在編程方面又如何呢?根據筆者在本科畢業設計的指導及與用人單位的交流等活動中所掌握的情況來看,多數學生的編程經驗與編程能力并不樂觀,很多學生面試時,連“冒泡”排序程序都寫不出來……這使得我們去反思,到底哪個環節出了問題?
2 編程能力低下的原因分析
與編程能力相關的課程是語言類課程,如C/C++、Java、Delphi、C#等,受考試方式的制約,對語言類課程的考試一直非常原始,信息產業部等單位組織的考試也是如此,大量死記硬背的試題,如單選題、多選題、是非題、填空題,這使得老師上課時特別關注細節,計算機語言課堂變成“文言文”的講臺了,忘記了“編程”這個宗旨。
與編程能力相關的課程,可能還有“軟件工程”,這門課程的教學雙方都必須有一定的編程經驗,但是由于教學理念等諸多原因,此門課的教材多是高度概括的原理,對于沒有編程經驗的人來說,不可能引起共鳴,只能是“空對空”的說教,對編程能力的提高幾乎為零!
編程能力是一種過程性知識,它必須通過大量的定向性較強的實訓才能得以提高,而學生恰好缺少這方面的訓練,因此編程能力低下便是情理之中的事情。
3 編程訓練所面臨的困境
按照現有的辦學模式與行政體制,我們不可能像職業院校一樣對教學大綱進行大刀闊斧的改革,與印度軟件培訓、北大青鳥、清華T型人才等社會上的編程培訓項目進行課程置換,完全按照軟件藍領的模式進行培訓,即使能實施這種方式,那將模糊本科教育與職業教育的區別,偏離本科教育的目標。
編程能力難以通過校企合作來提高。這是因為多數軟件公司的規模較小,場地與設備有限,不可能容納很多的學生去實訓,另一方面軟件公司為追求利潤最大化,每個程序員都是滿負荷運轉,有空閑設備與場地,也沒有人員去指導學生,更何況很多企業常采用“項目驅動”模式運作,一旦簽了訂單,便迅速召集人馬,項目完成后這些人員又各奔東西,因此多數軟件公司不愿對員工進行培訓,更不愿意提供實習機會。
編程能力也難以通過畢業設計來提高。由于學生必須花費大量的時間去找工作,不可能有較長的時間去參與一個項目,從需求分析做到測試發布,從開始做到最后,即使能找到這樣的項目,可能難度太大,而無從下手,更何況要找到這樣的項目是多么的困難!
這些是提高編程能力、積累編程經驗,必須要面對的三個困境,這也是本科教育與職業教育的最大區別。
4 提高編程能力的基本思想
讓學生在學習其他課程時進行程序設計訓練,將編程能力的訓練融入到日常的教學中,讓學生受到全方位的編程訓練,進行移潛移默化的訓練。“教書編程”人人有責,盡管彼此分工不同,各有側重,但是必須朝著同一個目標努力:提高學生的編程能力,將計算機語言類課程、離散數學、數據結構、數值計算(計算方法)、軟件工程等課程通盤考慮,進行資源的優化整合,從遣詞造句開始,環環相扣,形成一個編程訓練的生態鏈,將課程學習與編程訓練有機融合起來。
在課程學習中,設計相關的程序,以幫助本課程的學習,反過來通過課程學習,為程序設計提供了豐富的素材,能使學生積累更多的經驗。
5 具體措施
5.1 面向對象的程序設計
為了訓練編程能力,必須學習一門編程語言。如C++、Java、C#,我們傾向于先學習C++,后學習C#或Java,在該課程的教學中,必須讓學生建立“世界萬物皆為對象”,某些對象可以歸納為一類,類中的個體、樣例、實例做為“對象”的思想。
這門課程的主要任務是突破學生的編程恐懼心理。為提高學生編程的興趣,在課堂教學與上機訓練中,可使用一些有趣味編程實例,如10000天后是星期幾?韓信點兵問題、水仙花數、各種簡單圖形的打印、各種曲線的打印、Josephus(約瑟夫)問題、異或加密、猴子吃桃、素數判斷與篩選等。
教師講課時可以先演示程序的運行效果,以提起學生的興趣,活躍課堂氣氛,然后分析設計、給出設計略圖,利用語言知識進行細化,直至給出源代碼,充分考慮學生的接受能力,要像師傅帶徒弟一樣,手把手地訓練學生,最后再演示稍作變動以后的效果,并進行適當的分析與提示,讓學生在課后去完成,以訓練其閱讀程序,修改程序的能力,相當于作文訓練中的閱讀范文與改寫的過程。
5.2 離散數學
離散數學是計算機專業的一門基礎課程,內容比較抽象,其思維模式與高等數學相去甚遠,學習時比較費勁,為了減輕學習難度,加深理解,最好能用程序來演示與驗證其定義、結論、定理。
為此需編寫離散數學的輔助教材,將可利用編程來驗證的知識挑選出來,給出每個知識的編程方案、數據結構、概要設計、詳細設計、關鍵代碼,讓學生在讀懂“需求分析”與“設計書”的基礎上,進行“完形填空”。
如集合論的編程,可以建立一個類ClassSet,其屬性有maxCount(集合中元素的最大數目)、currentCount(當前元素數)、currentSet(集合的元素),方法有subSet、trueSubSet、EqualSet、powerSet……
這本指導書中的每個實驗由任課老師講解,與習題課穿插進行,使之與離散數學的教學融為一體,既作為輔助課程,也作為語言類課程的后續課程,可以鞏固語言類課程的相關知識,為編程提供實訓內容。
5.3 數據結構
“數據結構”源于數據處理與程序設計,該課程對于編程經驗嚴重不足的學生來說,存在一定的難度,因此為了幫助學生理解原理,需先進行驗證性編程。
老師在講完原理并手工演算了部分實例后,應隨堂細致地講解如何在開發平臺上編寫驗證程序,要細致到大多數學生可以編程實現。
在完成驗證性編程后,可以進行“原理演示編程”實驗,驗證性編程實驗,是為了幫助了解原理,而“演示性實驗”是學生自己當老師,給其他人講課,如果能把數據結構與算法講明白,表示學生確實懂了,這些實驗是幫助學生理解、掌握原理。
這部分編程實驗,老師不必在課堂上講解,但要在實驗指導書中寫仔細,學生上機調試需編寫實驗報告,并且讓典型學生發言,老師再適當點評,以正視聽。
在完成驗證、演示性程序設計后,尋找一些實際樣例,在實驗指導書中給出需求分析、數據結構設計、概要設計與詳細設計,并搭建起整個程序的框架,讓學生參照相關文檔,編寫代碼。
5.4 數值分析或計算方法
“數值分析”與“數據結構”有較大區別,“數據結構”研究數據處理中的經典問題,數據結構是重點,算法的復雜性與數據計算量并不大,而“數值分析”專門針對數據量不大但計算比較復雜的問題,精確的模型(如方程)已建好,研究的重點是“算法”,即在滿足約束的前提下,尋找速度快或占用存貯空間少的算法,因此編程的側重點不同,我們認為計算機專業的學生,應該接受數值分析方面的編程訓練,而不是只使用MatLib之類的工具軟件。
算法的“驗證性”編程與算法的“演示性”編程,可參考“數據結構”的方式進行。在驗證性編程中不僅要給出輸入數據與輸出數據,還要給出誤差或精度值。
探索性編程,是指如調整敏感參數,記錄其運行時長、迭代步驟,掌握獲取正確結果的基本技巧,還可以給一些數據比較復雜的實際問題,如求解高微線性方程組、計算特征值、常微分方程等,以提高編程樂趣,也可從現行的函數庫中選擇一部分經典的代碼,由學生改寫。
5.5 組件編程
經過以上訓練,多數學生應突破了恐懼編程的心理障礙,可獨立編寫一些小程序,也積累了很多小程序,為進一步提高學生的編程能力,需訓練學生編寫大型程序,掌握模塊化的編程方法,為此我們選用C++的改良語言C#,引入組件編程方法,將學生們積累的小程序封裝為組件。
為此編寫了《組件編程實訓教程》,該書采用“任務驅動”模式,在每章的前面介紹了使用本章知識的情境、場合,從而設計一個使用本章知識的真實任務,并將該任務分解成一系列的小任務,接著詳細介紹完成這些小任務的操作步驟,學生對照教材可完成這些任務。
這個階段的訓練目標是,讓學生掌握組件編程的技術,養成總結與封裝代碼的習慣,使學生在校期間能積累一些將來工作時用得到的模塊,更重要的是讓學生建立軟件重用的觀念,為職業生涯打下扎實的基礎。程序員如果不會寫組件,意味著編程水平難以提高。
5.6 軟件工程
在前述訓練中,學生應該接觸了軟件工程的相關理念,得到了比較模糊的印象,這時借助一個較大的軟件工程的作業來講解軟件工程這門課,效果應該比一般“空對空”的說教理想,為此讓學生做一個稍大的課程作業。
其背景是“計算機文化”課的Office操作題的考試,要求能獲取考生對Word、Excel、PowerPoint、OutLook所做操作的結果。
為此需編寫《組件編程與軟件工程》一書,按照組件編程的順序,采用軟件工程學的方式展開內容,介紹組件的開發過程,讓學生感到使用軟件工程學的方法,確實能給編程帶來方便。
在該書中我們重點講解Word的二次開發過程,而對Excel、PowerPoint、OutLook的二次開發只做重點提示,由學生類比完成。
6 結束語
將語言類課程、離散數學、數據結構、數值分析、軟件工程等課程有機結合起來,形成一個編程訓練的生態鏈,環環相扣。
為了提高教學效果,對于一個教學班級,這些課程最好由一位老師全程負責,以保證其連貫性。該教學方法成功的關鍵是“人”,老師必須投入極大的精力去編寫各門課程的編程訓練的教學程序、《組件編程實訓教程》與《組件編程與軟件工程》教材,并且需要經常性修改。
參考文獻
[1] 楊晴虹.它山之石——印度InfoSys教學訪問記.計算機教育,2006,6.
[2] 殷人昆.清華大學“數據結構”精品課程建設.計算機教育,2006,5.
[3] 張銘等.從調查入手,了解對計算機教育的新需求.計算機教育,2005,11.