李軍 曹記東 林勇 郭天印

摘要:分析傳統的以程序設計語言知識體系為脈絡的程序設計基礎課程教學的弊端,結合陜西理工學院程序設計基礎課程教學改革與實踐經驗,提出以語言知識為基礎和以問題求解方法為主線的課程教學模式,確立程序設計基礎課程面向應用,讓學生學會分析問題、設計算法、運用語言知識編寫程序的教學基本原則,并給出課程內容及實踐環節的教學改革方案。
關鍵詞:程序設計基礎課;問題求解方法;教學改革
程序設計基礎主要培養學生運用程序設計語言求解問題的基本能力,包括讓學生了解高級程序設計語言的結構、掌握計算機問題求解的基本思想方法以及基本的程序設計過程和技巧、熟悉并適應計算機的問題求解模式,從提出問題、模型建立、數據表示、算法設計到編寫程序代碼、測試和調試程序、分析結果的過程中,培養學生將問題抽象化、設計與選擇解決方案的能力,以及用程序設計語言實現方案并進行測試和評價的能力。
程序設計基礎課程在大學一年級開設,是大學生認識和應用計算機的入門課程,是計算機及相關專業的一門重要基礎課程,對后續課程的學習乃至學生的整個職業生涯都有至關重要的作用;而如何講好這門課程,更需要廣大計算機專業教師不斷地探索、改革和創新。
1、課程改革的必然性
目前,國內程序設計基礎課程名稱較多,如C語言程序設計、高級語言程序設計、程序設計基礎等。縱觀這些課程的開設情況,我們可以發現教學內容大多都是以某個具體的程序設計語言(如C語言)知識及其自身體系為脈絡,教學模式以課堂講解和學生上機練習為主。按照這一模式組織教學,產生的副作用主要有以下幾個方面。
(1)學生在課程學習過程中,面對程序設計語言中繁雜的語法規則,會產生嚴重的厭學情緒,使得課堂逃課率較高;還有不少學生通過抄襲他人作業或考試作弊的方式完成課程學習。
(2)一些能夠完成課程學習的學生自認為掌握了程序設計方法,但是在解決實際問題時卻發現對問題求解毫無頭緒,由此產生心理落差,嚴重挫傷學習熱情,沒有學習成就感。
(3)另外一些能夠完成課程學習的學生認為他們滿懷希望來學習,但沒有從該課程的學習中獲得編程的愉快感。
這種模式在我國計算機教育事業中曾經發揮過極其重要的作用,但它是從“狹義工具論”的思想出發,過于注重語句、語法等語言細節的教學,沒有把問題求解方法和計算思維能力培養置于首要位置,對于如何分析問題和解決問題的思路講得很少,對學生編程能力的訓練不夠。這一模式沒有很好地為課程開設目標服務,課程的開設只能起到事倍功半的效果,同時也成為制約計算機及相關專業教學質量提高的一個瓶頸。
2、更新課程教學理念
理念更新是教學改革的思想保證,正確合理的課程教學理念是課程改革成敗的關鍵。為了破除“狹義工具論”的課程建設觀念,秉承“授之以魚不如授之以漁”的理念,我們將以語言知識為主線的教學模式轉變為以語言知識為基礎、以問題求解方法為主線的教學模式,確立了程序設計基礎課程面向應用,讓學生學會分析問題、設計算法、運用語言知識編寫程序的教學基本原則,而不是讓學生一味地研究語言本身。按照這一思想,陜西理工學院將傳統的C語言程序設計課程更名為程序設計基礎,并確立以下教學理念。
(1)淡化語言,強化程序設計方法,幫助學生樹立正確的程序設計觀念和思想方法。
(2)淡化編碼,強化算法運用與分析,訓練學生的抽象思維及建模能力。
(3)案例驅動,強化實踐,引導學生獲取正確的問題解決方案。
(4)由易到難,貫通案例,滿足學生的學習成就感,激發學生的學習興趣。
3、課程教學改革方案
3.1 課程內容的優化安排
依據程序設計基礎課程的開設目標和根本任務,課程內容應包含問題求解的基本方法和實現這些方法的計算機語言基礎知識等,因此課程內容的優化安排原則是以語言知識為基礎,以程序設計的基本理論和基本方法(含問題求解方法)為核心。據此原則,課程教學組對課程內容按照程序設計的應用需求進行合理取舍,將知識點分成門檻跨越、體系拓展、創新應用3個部分。
(1)門檻跨越主要解決的是程序設計入門必需的語言知識學習問題。教師通過講解語言體系核心集合,讓學生在很短的時間內完成語言知識的學習并將其應用于實踐,學生學習語言知識獲得的成就感與愉悅感能夠激發并延長學生的學習熱情。
(2)體系拓展主要是在門檻跨越的基礎上圍繞程序設計的基本方法展開。教師通過一些常用且典型的算法,讓學生初步掌握算法的基本知識,并為后續的教學埋下伏筆,以激發學生的求知欲。
(3)創新應用是在前2個體系基礎上實現的以問題為中心的階段性實踐訓練。此處的問題規模較大,程序代碼有相應要求,學生通過多人合作完成對問題的分析、建模及程序實現。
3.2 課程教學策略
要實現知識點3個部分所達到的教學目標,教師必須采用適當的教學策略,綜合應用課堂講授、案例穿插、啟發誘導等多種教學方法;從程序設計的角度出發,按照分析建模、算法設計、程序編碼、測試與維護等環節,培養學生從能夠遵守程序設計準則到習慣成自然地按照程序設計準則完成創新應用問題的程序設計。此外,教師還需在教學過程中針對教學內容的組織處理好以下關系。
(1)處理好該課程與后續課程的關系。程序設計基礎不僅是一門獨立的課程,而且是后續課程的基礎,因此教學內容的安排既要考慮對后續課程的鋪墊作用,又不能過多涉及算法與數據結構的內容,避免超出課程的內容范圍。
(2)突出重點,分散難點,淡化細節。教師對于語言基礎知識的教學應以應用為目的,對于一些語言細節可一帶而過。例如,指針既是結構化程序設計語言的難點,又是后續課程的一個應用重點,教師可避免像傳統教學那樣集中講解指針的概念,而是將這些難點提前并分散到相關章節進行處理,以逐步降低指針內容的難度并減少學生的心理壓力。
(3)程序設計方法的講解主要通過案例來實現。例如,教師在講解C語言基礎知識各章節內容時,可以“快遞運費計價問題”為例,逐步擴展,加入條件,從分析問題、建立模型、設計算法、進行程序設計等方面進行講解,貼近實際,不斷激發學生對知識的探索欲望。
(4)以常用算法為紐帶,實現邏輯思維與程序設計方法的有效融合。例如,針對遞推法、倒退法、迭代法、窮舉法可以不同的有趣實例,如兔子繁殖問題、猴子吃桃問題、牛頓迭代法解方程、雞兔同籠問題、邏輯問題等,對其進行總結和應用,讓學生體驗程序設計的實現過程,既反映問題的難度及求解規模的變化,又彰顯知識和求解方法的多樣性。
4、課程實踐環節建設
程序設計是高強度的腦力勞動,不是聽會的,也不是看會的,而是練會的。只有讓學生動手,學生才會有成就感,進而對課程產生興趣,學起來才比較從容。在“狹義工具論”思想指導下,傳統的實踐環節內容比較單一,以課程實驗為主,內容基本上是程序設計語言的語法驗證,實驗項目與實際應用問題結合不緊密,學生做完實驗沒有成就感。因此,課程的實踐教學應遵循以應用為目的,以任務驅動,循序漸進。我們將課程完整的實踐環節分為課程實驗、課程實訓和課程設計3大部分。
4.1 課程實驗
課程實驗由基礎實驗和綜合實驗組成。基礎實驗與課程講授內容同步,形成配套的實驗項目,加深學生對相關語言知識及某個主題領域知識的理解和應用;綜合實驗主要是針對多個知識點進行綜合訓練,加強學生對課程內容的整體認識。
1)基礎實驗。
基礎實驗項目按照程序跟蹤、改錯調試、設計實現3個遞進層次,從多角度培養學生的程序設計能力。前2個層次的基礎實驗項目訓練學生對語言知識的運用能力,后1個層次的基礎實驗項目訓練學生求解問題的能力。
程序跟蹤是依據項目的主題給出完整的程序,讓學生利用調試工具跟蹤并觀察程序的運行結果,并對結果進行分析,回答給定問題,畫出程序流程圖,這些題目主要是為了加強和鞏固學生的語言知識。改錯調試是在給定功能的程序中設置幾個語法或算法錯誤,讓學生上機進行調試并除錯,主要目的是訓練學生在理解程序主要功能及整體框架的基礎上進行程序調試的能力。設計實現是按照項目的主題給出幾個可選的題目,讓學生根據自己的能力選擇完成。這一層次的題目主要是讓學生掌握從提出問題、模型建立、數據表示、算法設計、編寫代碼到測試調試程序等開發過程和方法,培養學生將問題抽象化、設計與選擇解決方案、用程序設計語言實現方案并進行測試和評價的能力。
2)綜合實驗。
綜合實驗的目的是使學生綜合應用復雜數據類型實現復雜數據處理與存儲,培養學生根據給定問題編寫具有多個模塊程序的能力。實驗內容都是一些與實際應用結合緊密且具有較復雜數據結構的問題。
4.2 課程實訓
課程實訓在課程結束后進行,主要是給出一些典型問題,要求學生運用特定的數據結構及算法編程實現,其綜合程度要高于實驗項目。例如,針對x∈A、A n B及A u B等集合問題的運算,要求每個學生分別用數組和鏈表2種數據結構實現,而且對于每種結構都要求用一些指定的編程方法。教師要按照問題實現的方法與步驟,根據學生的語言知識運用情況制訂嚴格的實現要求和標準,按照標準當場對學生編寫的程序進行評價并給出成績。
4.3 課程設計
課程設計安排在課程結束后的下一個學期初,大約2周時間,將3~5人分為一個小組。小組成員在教師的指導下,分工協作完成有較大實際價值的程序設計項目。課程設計重在培養學生對程序設計課程所學知識的創新應用能力,讓學生深刻體會軟件工程方法,初步掌握大型程序設計思想和開發方法,訓練學生的團隊協作精神以及集體責任感。
5、課程改革成效
以問題求解為主線的教學改變了程序設計基礎課程的教學重點,教學內容強調程序設計思想和方法,摒棄過去以語言知識為主的做法。教學策略的改變強化了學生獨立思考和動手的能力,提高了學生的實際程序設計能力。
學生在對課程評價時,認為“老師從多方面對一個問題進行闡述,激發學生的學習興趣”“老師講課很好,本來枯燥的語言課在老師的講述下一下子有了趣味性,給我們留下很大的思考空間,更一步激發我們的學習興趣”“通過本學期的學習,我學到看書的方法和程序設計思維,深刻地理解‘程序設計=算法+數據結構的思想內涵”。
2008-2011級近4屆計算機科學與技術系學生的程序設計基礎課程考試成績逐年提高,其成績統計如表1所示。
從試卷分析可以看出,學生較以前各屆學生程序分析、調試、查錯及知識的綜合應用能力明顯提高;后續課程的主講教師也反映學生能將該課程中學到的基本方法和技能運用到后續課程的學習中。
由于該課程為學生打好了程序設計的基礎,大多數學生程序設計的信心較前有大幅度提升,因此申報校級創新實驗項目并獲得立項的人數正在逐年增長,參加“挑戰杯”大學生課外科技作品競賽的人數也逐漸增多,并且連續2屆計算機科學與技術系的學生在省級“挑戰杯”競賽中獲得獎勵。
6、結語
以問題求解方法為主線的程序設計基礎課程教學內容及模式的建設工作是一項持續化的工作,現在我們才剛剛起步,今后還要在課程的教材建設、學生自主學習及評測平臺的建設、師資隊伍的建設等方面多下工夫,逐步提升該課程的教學效果,以達到省級精品課程的要求。