李勝華,李 念
(湖北大學 數學與統計學學院,湖北 武漢 430062)
信息與科學計算專業培養具有扎實的數學基礎、較高數學素養和創造才能,具有較強的算法設計分析編程能力,能用所學的理論知識、方法和技能解決信息技術或科學工程計算中的實際問題[1],從事數學應用研究、信息技術、程序設計和軟件開發的創新研究型、應用型、復合型優秀人才。在這種“厚基礎、寬口徑”的人才培養理念及當今IT 行業高素質人才持續緊缺的情況下,計算機程序設計素養、算法設計能力、計算機應用能力的培養尤為重要。
信息與科學計算專業的高級語言程序設計課程在大一年級開設,但由于在低年級開設了大量的數學專業基礎知識,后續也沒有開設直接應用程序設計的計算機類課程,導致學生課程學習時間投入不足,實際訓練不足,相當一部分學生只是應付課程學分,計算機程序設計能力較弱。另一方面,信息與科學計算專業的學生由于對數學基礎知識的重要性認識不夠,導致學習興趣不大,數學與計算機有效融合比較困難。近些年許多高校為提高程序設計能力對計算機程序設計類課程及數學課實踐課的教學改革進行了廣泛的研究。文獻[2—3]針對計算機專業類提出教學改革:文獻[2]構建計算機軟件設計類課程群(14 門課),文獻[3]提出程序設計基礎、數據結構、算法設計與分析和組合數學等4 門課程整體優化的教學改革。文獻[4—7]分別研究抽象代數、運籌學、密碼學和離散數學的教學實踐。
根據計算機能力的培養目標,計算機程序設計類課程在大學各專業的開設情況按計算機相關專業、信息類專業和其他專業可分3 類。表1 列出了湖北大學4 個專業開設程序設計類課程的情況,可以看出計算機類專業的程序設計類課程多且直接應用于較多的其他專業課程;信息類專業的計算機程序設計類課程除高級語言程序設計外,還有幾門核心課程:離散數學、數據結構和算法設計與分析等;其他專業一般只開設一門高級語言程序設計課。
對比計算機類專業,信息與計算科學專業的數學基礎課設置較多,表2 列出了湖北大學信息與計算科學和計算機科學與技術兩個專業數學類課的設置情況。
信息與計算科學專業的計算機算法、程序設計能力的要求與計算機類專業類似,但高級語言程序設計入門課沒有很多直接應用程序設計實踐的相關課程,且低年級數學基礎課程較重,課外沒有過多時間參加項目實施,導致相當一部分同學存在計算機程序設計知識不系統,用計算機程序解決實際問題的能力訓練不足等問題。另一方面,數學課的實踐課目前主要是使用Excel、R語言、Lindo、Lingo、Matlab、Mathematica 等專用數學軟件,直接用C 語言程序設計的很少,且課程間的實踐方法聯系少。
信息與計算科學專業基于程序設計能力、專用軟件應用能力及軟件開發能力,分別開設3 門對應的入門課——高級語言程序設計、數學軟件與應用和面向對象程序設計,并和后續相關課程組建了對應的課程群。程序設計類課程群包括高級語言程序設計(C 語言)、初等數論、知識實習、離散數學、數據結構、抽象代數、算法設計與分析、課程設計、運籌學、計算機密碼學等10 門課程。這10 門課程的設定考慮了知識的邏輯性、功能性及時間的連續性,它們按培養目標分為三大類:①與程序設計直接相關的課程,旨在循序漸進培養專業的計算機程序設計能力;②在課內可以進行程序設計實驗的理論課程,旨在訓練程序設計應用專業知識能力,增強對理論知識的理解;③在課外進行實踐的課程,旨在培養綜合專業應用能力。表3 列出了各學期開設的相關課程及對應目標類別。

表1 三類四專業計算機程序設計類課程開設情況

表2 兩專業前4 學期數學基礎類課程開設情況

表3 信息與計算科學專業程序設計類課程群
程序設計能力的培養分入門、簡單應用、提高和高級應用4 個階段。程序設計語法及應用的教學內容循序漸進地分布在課程群中,詳細內容見表4。
在高級語言程序設計這門課,一方面要把前學期計算機基礎課提到與程序設計相關的基本知識落實,另一方面要掌握C 程序設計的基本語法、程序設計思維及初步的算法設計。

表4 程序設計語法及應用教學內容分布
相關的計算機基本知識包括:計算機語言、數據內部表示及整數的進制轉換等。
C 程序設計基礎知識包括:C 語言程序的基本框架、基本數據類型、三大控制結構、數組、函數、用戶自定義型等內容。
一些簡單基本問題的算法設計:進制轉換、順序查找、折半查找、選擇排序、冒泡排序、最大公因子等。
為了鍛煉程序設計能力及后續課程的需要,高級語言程序設計課程之后開設了初等數論、知識實習兩門課程。該兩門課程中的實踐和實習中要求學生能用C 語言解決已學數學理論中的基本問題,如:矩陣類、行列式類、整數類等的實現。矩陣類的相關操作有輸入、輸出、加運算、減運算、乘運算、是否對稱、求鞍點等;行列式類的相關操作有輸入、輸出、求值等;整數類的相關算法有判斷素數、質因數分解、不定方程及同余方程求解等。
對上述問題的實現一方面重點學習、理解、應用高級語言程序設計課程中提到的二維數組、二重指針、函數、多文件等語法內容;另一方面對后續課程數據結構的入門及計算機密碼學的實踐有很大的幫助。
離散數學研究離散變量的結構及相互間關系的數學學科,在計算機學科與技術有著廣泛的應用,是提高程序設計質量的必備學習基礎。教學內容主要有集合論、數理邏輯、圖論、代數結構等部分。在集合論、數理邏輯可設計一些程序設計應用實驗來提高學生的學習興趣;圖論和代數結構部分注重理論教學,提高學生抽象思維和嚴格的邏輯推理能力,為后續設計、開發工作打下堅實的基礎。
數據結構是研究非數值問題中數據對象、關系及其操作的專業核心課程。它的教學內容是常見數據結構(線性、樹、圖)的抽象、實現,以及兩類常用操作(查找、排序)的算法及分析。通過該課程的學習,學生可熟練掌握C 中函數、指針及結構類型的應用,還可使用C++的一些簡單語句及標準類文件。對于非線性結構“圖”“樹”章節,有了離散數學課程的理論準備,重點應放在數據類型的表示及算法實現和分析上。
算法設計與分析主要介紹常用算法設計技術及算法分析方法。基本設計方法有遞歸與分治、動態規劃、貪心法、回溯法、分支限界法等5 種;算法分析主要掌握時間復雜度、空間復雜度的理論分析方法及算法分析的實驗方法等。算法實例一部分來源于經典基本問題,另一部分針對現實生活熱點問題。有了前面數據結構中C++簡單語法的滲透,此門課中的算法用C++實現,應用C++中的STL 及Algorithm 庫。
抽象代數主要研究群、環、域等代數系統的結構。有了數據結構及程序設計語言的基礎,對每種代數系統都可選擇特例設計實現作業。例如,n元對稱群Sn、模n剩余類環Zn、有限域Fq(q=pn,p為素數)等。設置這些作業極大提高了學生學習理論的興趣,更重要的是鍛煉程序設計應用能力,并且為后續的密碼學實踐搭建了平臺。
運籌學是運用數學方法,對需要進行管理的問題統籌規劃,做出決策的一門應用科學。它的教學內容中的動態規劃、圖論、搜索論等在前期課程離散數學、算法設計與分析中涉及,在此門課中這些內容一方面理論方法性更嚴密,另一方面應用性也更具體。本專業學生有了前面學習的基礎,這些算法掌握相對容易,重點可放在實踐性上,對實際問題的解決提供決策性的意見。
計算機密碼學課程的理論性和實踐性都很強。可設計古典加密算法、RSA 加密算法、AES加密算法等實驗來鍛煉學生程序設計中數據位的處理能力及接觸初步的高性能編程。
上述3 門課的實踐,信息與計算科學的學生可先用C 語言完成來幫助理解算法,然后自學專用軟件快速應用算法解決實際問題。
課程設計是一門單獨綜合性實踐課程,主要培養學生綜合掌握并運用專業知識的能力,突出學生的探索性、創新性和完整性。學生分組指派導師指導,各自完成設計作業的定題、實現、總結分析及報告成文。
互聯網+時代,混合式 (“線上”+“線下”)教學成為必然。清華學堂在線、中國大學慕課優質在線課程、網易公開課等平臺重點高校優秀專業團隊制作的相關精品課程都是很好的教學參考。成熟的在線評測系統是學生提高程序設計能力的訓練場,例如:北京大學在線測試系統(POJ)、浙江大學的程序設計類實驗輔助教學平臺PTA 和在線測試系統(ZOJ)、杭州電子科技大學在線評測系統(HDOJ)等。課堂學時有限,老師在課余時間通過網絡通信工具加強與學生溝通交流,及時答疑解惑。引入了網絡資源,極大地拓展了學生的學習和交流空間,激勵了學生的自主學習能力。
課程群的課程有聯系,更有區別。在課程入門時需選擇合適的案例用對比方法讓學生快速了解該區別。由于是入門課,案例要通俗易懂,用類比和對比引導學生分析問題,最后概括總結。
算法和數據結構是程序設計兩大重要方面,為了讓學生快速清晰體會兩者的區別及算法設計方法的重要性,設計“求Fibonacci 數列1,1,2,3,5,8,……中的第n項f(n)”案例。利用f(n)滿足下面遞歸關系可設計下列3 種函數。

這3 個函數在C 程序設計中陸續都提到過,但當時強調的是對應語法知識點:fib1 主要體會循環體中的工作部分和修改部分,fib2 主要理解數組的使用,fib3 主要學會遞歸函數的使用。此次課集中這3 種函數重點是分析對比數據結構和算法:fib1 用3 個整型變量,算法技術屬模擬法;fib2 用1 個整型數組(n 個整型變量),算法設計技術屬動態規劃法;fib3 不需要中間數據,算法設計技術屬遞歸法。fib2 對比fib1,由于數組的利用,使得算法表達更清晰;fib2 對比fib3,本質上是算法設計的區別。為了對比算法效率,在main 函數中分別調用這3 個函數,并用clock()函數統計各自運行時間,看到的現象是fib2 與fib1 用時差別不大,fib3 用時較多;且隨著n 的增大,這個差別越明顯。可以得出結論,算法fib2 求解Fibonacci 問題較好。
通過這個簡單例子,用對比方法既讓學生快速了解該課程和前課程的區別與聯系,又見識動態規劃、遞歸法算法,體會算法選擇的重要性。
相互作用教學法[8]充分利用學生之間、學生與教師之間及教師之間的信息交流。整個的學習過程是學生積極參與的,相互促進協同學習的。課堂上老師根據知識模塊引導學生探究,對不同層次的學生設置對應參與環節,充分調動學生學習積極性,相互學習相互進步。對于高級應用作業,難度較大,學生精力時間有限,相互作用的教學方法會做到事半功倍。老師先公布選題系列,學生分小組定題,然后在老師指導下分工協作完成,最后小組匯報總結,學生參與評價分析。這樣,每個組看似只做了一兩個作業,但通過組間交流,課堂上10 個作業都掌握了,并且由于是公開報告演示成果,自己組的作業也會盡力做好,團隊協調合作能力也得到了鍛煉。老師間的交流有助于知識銜接處理且充分了解學生學習基礎,以便后續教學。
課程成績考核一般分為平時、期中和期末3 部分,平時有課堂表現、作業、考勤等方面組成。原來偏數學的課程考試形式就是筆試,實驗只是為了提高興趣,能驗證完成即可,對成績幾乎不影響;偏計算機的課程實驗成績主要為實驗報告+題庫抽題測試,記平時成績。建立課程群后,我們加大了實踐的考核:原來偏數學的課程的實踐要作實驗報告并記入平時成績;計算機類課程的實驗單獨開課,成績由實驗報告、項目演示和在線測試幾部分構成。
實踐的考核方式決定學生的學習方法,實踐作業大多是開放性的,容易讓學生應付,從而造成老師評價比較困難;過于依賴在線測試平臺會造成學生大量重復刷題應付考試,但程序設計能力并沒有提高,也扼殺了創新性。單獨開課后,實驗報告更規范并有選擇地進行口頭報告及演示,給學生更多展示機會并可以相互評價;平時練習借助在線測試平臺,系統統計學生的行為作平時成績依據;考試也是利用在線測試平臺,但要增加知識點要求,評判方式是機器實時評判與老師評斷相結合。機器實時評判是時間和結果上控制,老師評斷主要看代碼的質量及知識點的要求是否達到。這種測試方法比較準確反映學生的真實水平,便于改進教學。
老師應在實踐課的考核方式上探索多元化,挖掘學生潛能,發揮學生能動性。高年級的實踐作業大多是綜合性的,為了鼓勵學生合作、創新,我們設置多種考核方式,充分發揮學生的積極性。除了基本考核要求外,特色加分項有以下幾類:項目大作業、在線競賽、實驗分析報告等。這些項目的設置讓不同特點的學生充分發揮了自己的特長,真正做到學有所用。
組建程序設計類課程群,課程間的銜接教學研討實施了近3 年,信息與計算科學專業學生在程序設計素養及能力有了顯著提高,學生學習興趣大增,發揮專業優勢較明顯。近兩年本專業參加數學建模大賽人數都超過本班人數1/3,在全國大學生數學建模競賽、美國大學生數學建模競賽與交叉學科數學建模競賽中有多名學生獲獎;在校企實習基地本專業動手能力明顯優于應用數學專業,學習新知識的能力很強;信息與計算科學專業的本科畢業生2017 至2019 三屆就業率都達到了95%以上,且專業相關度較高。通過組建課程群,老師們打破了傳統的系、教研室的束縛,圍繞學生的綜合能力培養進行相互學習合作,提高了人才培養質量。下一步,我們的主要任務將是探討學生的專業、應用能力的科學評價。