李環宇,林曉霞,徐燕妮
(山東科技大學信息工程系,泰安271019)
目前國內各高校普遍將《C語言程序設計》作為計算類相關專業的基礎必修課,它以編程語言作為工具和平臺,介紹程序設計的一般思想和程序設計所涉及的方法。該課程對后續學位課程起著重要的鋪墊作用。同時由于C語言具有高級和低級語言的雙重特點,能夠對底層硬件進行較為靈活的操縱,還有著靈活的控制和數據結構,能夠表達豐富的語義,能夠比較簡潔的完成各種操作[2],所以理工類各專業,例如地圖學與地理信息系統、氣象學、自動化、機械電子工程等專業也都把它當做重要的基礎課來開設。
學習C語言程序設計的學生,一般都是初次接觸程序設計,甚至是初次接觸計算機,所以大多對計算機編程一無所知,因而在實際的C語言程序設計課程教學中,許多學生普遍感覺C語言涉及的概念比較復雜,規則繁多,知識點太多,容易出錯,致使學生在不同程度上產生畏難心理。
另外,在教師的教學過程中,為了照顧緩解學生們的畏難情緒,長期以來的C語言程序設計教學過多注重的語句、語法和程序設計技巧,從而忽略了培養學生的動手編程解決問題的能力和程序調試能力。許多學生在一學期的學習結束后,或許對某個語法點是了解的,但在面對程序設計的題目、在解決實際問題的時候,感到無從下手,一篇茫然。由此也經常產生疑問:我花了這么多的時間、費了那么多精力來學習程序設計,但到底有什么用呢?能解決什么問題呢?
很多經常講授該課程的教師都意識到了該課程的教學所面臨的問題,認識到該課程的教學方法、教學方式的改革的必要性,并已經從很多方面進行了有益的嘗試。
在多年的教學改革中,已經取得明顯成效的改革措施中,以“項目為驅動的案例式”教學方式的改革,取得的效果極為明顯。例如《C語言程序設計課程改革探討》[3]一文中就指出:不能一開始就給學生講解相對無趣和復雜的語言和定義,而是應該從一個學生感興趣的實際案例出發,通過對案例的分析與講解找到解決問題的方法和思路,依次激發學生學習的熱情,也能使學生感性地認識到所學知識的可用性。“淺析案例教學對教學成果的提升”[4]一文中也有類型的觀點。
上述教學研究成果旨在增強學生學習的興趣,克服學生的畏難情緒。可以說是都在一定程度上解決了學生學習C語言程序設計比較困難的問題。但也有較大的改進空間:
首先,從要求掌握基本知識點來看,很多教學案例雖然從自身來看,其架構較為完整,但每個案例到底應該包含多少知識點,并無定論,只是根據教師的實際經驗來臨時確定,在面對不同專業、不同知識背景的學生時,事前并不好預判這樣的案例是否合適。
這天傍晚,柳紅正在井邊沖涼,蘇秋琴來了。她見到柳紅就哇哇直叫,說:“好啊,柳紅,你當著爸的面在洗澡啊。”柳紅被她說得難為情起來,轉身欲走,蘇秋琴就一把攔住了她,罵這鬼天氣,一個月都不落一顆雨,想熱死人啊。她也迅速地扒了衣服,和柳紅一起沖涼。柳紅就羞她:“你怎么也當著爸的面洗澡了?”
其次,從整個C語言程序設計課程來說,各個案例開放性不足,案例之間缺乏相互的聯系,無形之間就割裂了本該前后勾連的知識體系,也就是缺少對課程知識點群合理的分布和重組[5]。
最后,由于缺乏整體的結構性,學生們在進行二次開發,以鞏固基本知識點,提升編程能力時,需要再次搭建知識載體,并對載體進行再認識,效率比較低。同時也失去了給學生強調模塊化(函數化)思想的機會,但C程序設計最基本的思想,從微觀角度看,是強調函數這個基本單位而不是單個語句。
通過分析可以發現,之所以在教改中仍然出現很多問題,很重要的一點就是很多教師在制定相應案例的時候,忽略了案例的“粒度”問題。所謂“粒度”,原意是指數據倉庫的數據單位中保存數據的細化或綜合程度的級別。細化程度越高,粒度級就越小;相反,細化程度越低,粒度級就越大[6]。
本文所說的“粒度”,實際是一種對知識點的劃分問題,也就是怎樣合乎邏輯的將聯系較為緊密的知識點化為一個整體來進行理解和掌握。粒度級別太低,將融合較多的知識點,給學生的學習帶來較多的困難;相反,如果粒度級別太高,一個案例將只包含數個甚至是單個知識點,這樣可能人為的割裂知識點之間的有機聯系,妨礙從總體上把握課程總的知識框架。
為了有效解決上述問題,筆者所在的程序設計教學團隊,在總結經驗的基礎上,充分調研,對以“項目驅動的案例式教學”再次改進,形成多層次的多粒度的案例教學題庫[7]。該題庫從“分”與“和”,“微觀”與“宏觀”兩個方面入手,較為合理地把握“粒度”的概念,確定了兩個“粒度”劃分標準:即宏觀粒度與微觀粒度。
宏觀粒度的案例主要涉及三個層次:認知層次、提高層次和應用層次。
認知層次對所有的學生(包括專科生)都是適用的,它們是學習了C語言后最起碼應該達到了水平;提高層次主要體現在對知識的融會貫通,對知識的熟練應用,在這個過程中應該能夠學到一些編程的方法和技巧;而提高層次則應該能夠用學到的編程思想和編程方法、技巧,結合后續課程所用的算法和數據結構,用于解決實際的問題,真正能夠為后續課程,甚至是畢業后的工作打好知識基礎。該層次主要是在課程講授完畢后課程實訓時實施。
為了方便教師授課,學生聽課,該粒度的三個層次都將形成各自的一個完整C源程序,其中的各個子函數將分別涵蓋了本課程所有重要知識點,以函數調用的形式出現,這樣幫助學生一開始就能從宏觀上理解他們以后所編程的程序到底該是什么樣的。
在目前紛繁多樣的教學改革中,“慕課”和“微課”所取得的教學成果也非常明顯。認知層次所涉及的知識點就非常適合使用“慕課”和“微課”收到予以解決。事實上,我們也的確是將各基本知識點以“慕課”的形式錄制,放在學校校園網上,方便學生隨時隨地的學習,這樣的學習“以學習者為中心,增強學習者的吸引力”[8],大大緩解了教師講授該方面知識點的時間壓力,教師在課上只需要講解學生關注的重點難點內容。
微觀粒度的案例主要是對宏觀粒度中各個子函數的分解,其內容服從于整個宏觀框架,力求做到出現在一個案例重大知識點具有內聯性。雖然這里的主體內容來自于宏觀粒度中的子函數,卻是一個可以單獨調試、不需要參數的主函數的形式的出現,因為這里關注的是一個函數內部所涉及的到的知識點,需要看到立竿見影的效果。
需要注意的是,為了提高學習的效率,所用到的所有源程序都應該給學生練習預留接口,使學生比較容易的利用框架所提供的形式為掌握知識點服務。
筆者所在教學團隊就認真研究了“基于用戶角色的圖書管理系統案例分析”[10],選擇該案例的目的,是因為該案例來自于學生比較熟悉的場景,貼近學生們的生活,容易讓學生對其感興趣,同時該案例有一定的工程背景[9],如果想要日后都學生進行拓展訓練,非常容易在該案例的基礎上進行改進。
不過對于初學者來說,它還是太復雜了,所以筆者對其進行簡化,保留了其整體的架構,分解出了若干函數,每個函數均包含教學大綱中所要求的知識點,在不同的章節進行重點講解。例如:在“管理員系統菜單界面”,重點引入了printf函數和scanf函數,用于輸出菜單信息和供用戶選擇的輸入信息。從層次上說,這是認知層次。
具體菜單選項中引入了多分支選擇結構switch語句,而對于該界面能夠持續的存在,則還引入了循環結構;在文件讀取用戶信息模塊,引入了文件的管理和字符串在數組中的保存。從層次上說,這也是認知層次。但是在應用switch時,涉及到了表達式的應用、整除的具體應用,屬于多知識點的教誨,這又屬于提高層次。這樣教師再給學生講授相關知識點時,學生就不會單純認為類似的算術運算早就知道,枯燥無味。他們會發現,原來一個簡單的算術運算及其表達式,原來還有如此的用途,增強了其學習興趣。
在信息統計模塊,則引入了數組中的排序算法,并對此類信息進行統計。這就屬于提高層次。
以上一系列的編排一方面使學生從總體上了解到了該函數模塊的作用,有了較強的方向性,另一方面又簡化了程序的復雜度,使單節學習的效率更高。由于上面所述的各個函數均是“圖書管理管理系統”的一個組成函數,最后再強調整體性的時候,當然很容易的實現了從“分”到“合”,從“微觀”到“宏觀”的轉變。
為了能夠使學生在學習了C語言以后有一個自我消化、理解的過程,一般應在開設了程序設計課程后的下一個學期,安排學生進行二個周的課程實訓,課程實訓的內容將是應用層次框架下的已經詳細規定功能帶有綜合知識點與一定應用價值的題目。例如,筆者就曾經讓學生編制程序,讓學生實現一個簡單的計算器的算術計算功能,根據時間的長短,對該計算器的功能可以進行約束。經過了這一步的訓練,絕大多數的學生都能夠熟悉掌握所學程序的重要知識點、一定的編程思想和編程技巧,為后續課程的學習打下了堅實的基礎。
在確定了上述教學方法后,筆者所在單位的對17級、18級本科生中進行了試驗,取得了較好的效果:兩個年級的學生連續兩年參加“藍橋杯”軟件技術大賽中多個獎項。在以程序設計課為基礎的學習中,例如在學習《數據結構》課程時,兩級的學生都展現了較強的編程能力,有力促進了相關專業課的學生。
當然,應該認識到,在粒度劃分中,允許針對不同能力的學習者,做到分層設計,要有較常規的實驗內容,特別是在認知層次上更應該考慮到學生之間的差異性。在應用層次中應該有綜合性較強并和后續課程有一定聯系的項目實驗案例。考核群體和考核內容也進行分層,實現同一課堂的分層教學。
本文給出了基于案例粒度的程序設計教學方法,該方法既強調案例本身的內斂性,認識到每個案例本身的知識聚集點,同時又從宏觀角度考慮到知識之間的關聯性,方便學生學習和掌握。但是粒度的劃分不是一成不變的,根據學生的專業特點和能力特點,應該有不同的劃分方法。案例的選擇應該與時俱進,始終能引起的興趣,便于學生沉浸其中,激發學生學習的主動性。