摘要:針對傳統程序設計教學中以語言為重點而忽略編程技能培訓的不足,提出以技能為主導的程序設計教學模式。該模式以“精講多練、注重技能、開拓創新”作為教學理念,以編程累計行數TLOC和單個程序代碼行數SLOC作為衡量學生學習效果的兩級考核指標,獨創具有“數據表示”和“程序實現”兩條主線的雙線索式知識體系,有效克服傳統教學中的瓶頸問題。
關鍵詞:編程技能;TLOC;SLOC;雙線索;高集成度程序設計綜合訓練平臺
程序設計作為各專業程序開發基礎課程和實踐環節的軟件工具,是大學計算機教育的核心課程和各類專業的必修課程。該課程覆蓋面廣、影響力大,為大學生參加課程設計、畢業設計、創新實驗、科技制作、學科競賽等活動提供有力的實踐平臺。
大多數學校教師選擇c語言進行程序設計課程教學,原因在于世界上大多數軟件都是由C/C++語言開發的。在TIOBE編程語言排行榜上,C/C++語言多年來始終名列前茅。從C語言人手學習程序設計,對于培養算法設計與分析能力、抽象數據描述與表示能力、利用計算機求解現實問題的計算思維能力,具有其他高級語言無法比擬的優點。因此,我們也以C語言為重點進行討論。
然而,程序設計語言的學習難度是很大的,面對龐大、復雜的語言知識系統,不少學生在學習過程中始終感覺“一葉障目”“不見森林”,對學過的程序思路不甚了解,數據描述不清楚,算法設計不到位,最終連最基本的語言知識也掌握不住,最基本的開發環境也不會使用。因此,筆者分析教學各環節中存在的不足,結合多年程序設計課程的教學經驗,提出以技能為主導的程序設計教學模式。
1 教學現狀及不足
1.1課程知識體系重語言,與實際應用脫節
國內的程序設計課程在構建知識體系時,多以語言本身為重點。知識體系偏重語言知識,教師只對詞法和語法進行詳細介紹,千篇一律,列舉的例子大多面向某一語法,與實際應用脫節;同時教師在課堂上缺少對程序設計方法的講解,不重視對學生計算思維的訓練。
大多數學校在構建知識體系時僅停留在程序設計語言層面,教師只注重講解語言詞法和語法細節,鮮有對程序設計方法的分析,缺少對應用編程技術的展開講解。
1.2教學方法不成熟,難以培養學生解決實際問題的技能
由于C/C++語言等程序設計語言的語法體系十分繁雜,教師普遍感覺教學任務繁重,以函數和自定義類型等為教學中心的編程階段教學無法獲得良好的教學效果;而學生在學習過程中,疲于接受與記憶每一個語法細節,忽略程序設計的整體概念,抓不住學習重點,從而無法達到應用程序開發的教學目標。
盡管有些學校提出在教學中運用諸如“案例教學”、“項目驅動”等教學方法,但是由于缺少成熟的教學平臺和系統化、規范化的教學資源,難以培養和提高學生應用程序設計解決實際問題的技能。隨著社會逐漸向數字化信息時代邁進,學生不僅應該學會如何使用程序,而且要學會如何編寫程序。當語言知識轉化為編程技能時,知識就不會被遺忘,應用程序設計解決實際問題的能力也就如同本能一般。
為此,筆者在多年程序設計課程一線教學經驗和軟件開發科研工作的基礎上,結合自主研發的程序設計綜合訓練教學平臺和系列教育軟件,推出以語言知識為工具、以技能為目標、以編程技術為核心的全新程序設計教學模式。
2 以技能為主導的程序設計教學
2.1教學理念
以技能為主導的程序設計教學模式提倡“精講多練、注重技能、開拓創新”的教學理念。1)“精講多練”思想注重程序設計課程的強實踐性,強調教師應將精力放在精華內容的講解上,對于語言中很細微的語法或詞法等內容應盡量精煉,以留出更多的時間讓學生動手編程。實踐性課程的特點決定了教師在課堂上講解得再多、再細也不會對教學效果的提升起到很大作用,學生只有經過自身實踐才會加深理解和記憶。因此,新的教學模式提倡精講多練,要求教師運用程序設計方法從語言整體上進行教學,而將語言細節留給學生,讓其從大量的實踐練習中體會。
2)“注重技能”是針對傳統程序設計課程教
學忽略技能培訓而提出的。它通過常用算法、數據結構、程序設計方法以及稍有難度的題目,讓學生嘗試使用函數、數組、結構體、指針等程序設計高級工具,鞏固和回憶數學、物理等自然科學提供的解決現實問題的知識,彌補傳統實踐模式中學生相關知識欠缺的問題,提高學生應用知識求解問題的能力。這是傳統的程序設計課程教學所欠缺的,也是造成學生在學習完程序設計課程后不會編程序的主要原因之一。
3)“開拓創新”是對學生又一個層次的拔高訓練,讓學生通過課程設計和參與軟件開發項目等方式,學會怎樣將一個實際中的復雜應用進行分解,然后針對每個應用子問題進行抽象并將子問題逐個求解,最終完成一個大型應用問題求解的程序甚至軟件。“開拓創新”培養學生的創新精神和動手能力,使學生具備較強的計算思維能力和現實問題求解能力。
2.2考核指標
以技能為主導的程序設計教學模式不再以期末紙質考試成績作為衡量學生學習效果的標準。新教學模式提出衡量教學效果有兩個重要指標:編程累計行數TLOC(Total Lines of Code)和單個程序行數SLOC(Source Lines ofCode)。
編程累計行數TLOC指編程者在一段時間內編寫代碼的總行數。作為課程考核指標使用時,它主要指學生在一個課程學期內編寫代碼的總行數。TLOC指標一般用以強化學生的基本知識訓練,學生依靠以解題為主的編程訓練提高能力,即通過多個基本練習題達到TLOC指標的要求,這是程序設計課程的初級要求。
單個程序行數SLOC指單個程序或軟件的源代碼行數,是衡量軟件或程序大小的一個標準,經常被用來預測軟件開發的工程量、估算編程效率和程序的可維護性。SLOC作為以技能為主導的程序設計教學模式的高級考核指標,要求學生能夠設計并編寫出具有一定規模的程序,領會大型程序設計以及軟件開發技術的思維方式和開發過程。
2.3知識體系
筆者重新構建了程序設計課程的知識體系,克服傳統課程知識體系中以語言為唯一主線的弊端,增加用以培訓學生編程技能的算法、數據結構、高級編程技術等內容,并在算法、數據結構與程序設計的結合上精心設計,力圖適合高等院校和專業計算機培訓教學目標與知識結構的要求。該知識體系有以下幾個特色。
1)創新的雙線索結構。
C/C++等程序設計語言都具有龐大的語言知識內容,以語言為唯一線索必然會使教學始終處在學時不夠的“高壓狀態”,教師疲于完成教學任務,而學生則在學習過程中抓不住主次。因此,以技能為主導的程序設計教學模式首創雙線索程序設計知識體系。該知識體系以“數據表示”和“程序實現”作為教學的兩條主線索,螺旋交叉推進。c語言知識體系雙螺旋線索結構如圖1所示。
首先,教師通過簡單程序引出程序基本結構,以編程為目標給出兩條線索:數據表示和程序實現。其次,從引入簡單數據開始,逐步解決運算和程序組織,進而上升到程序模塊化的實現。第三,從C語言的基本數據類型逐步提高到復雜數據類型,上升到數據結構層面的數據表示,程序模塊晉級到算法實現。最后,兩條線索交匯到高級編程技術應用專題,揭示程序設計與應用軟件開發的一般規律。
雙線索程序語言知識體系體現出程序設計方法學中的理念,程序語言成為編程的工具而不是目標,學生既獲取了語言知識,又掌握了編程技能。
2)算法、數據結構和程序設計的緊密結合。
算法、數據結構與程序設計實際上是一個統一體,我們不應該也不可能將它們對立與分割。算法、數據結構是以程序語言為基礎的程序設計的理論升華,可以培養學生向應用程序開發轉型。本知識體系加入算法和數據結構的初步知識,并克服了簡單羅列算法和數據結構內容、算法與程序設計脫節、數據結構與程序數據表示脫節等問題。教師在講解每一種常用算法和數據結構基本思路與設計步驟時,要落實到每一個案例,從案例的提出到算法設計與數據描述、從程序實現到案例結果的討論與分析,環環相扣,融為一體,力求理論與實際相結合,數據描述與數據表示、算法與程序實現相統一,切實保證學生對所學算法和數據結構的理解和掌握。
3)強調以編程技術為主的技能訓練。
本知識體系增加了操作系統、人機界面、圖形圖像、多媒體、網絡通信、數據庫、硬件接口等高級編程技術知識,輔以研究型專題的技術,可以拓寬學生的知識面,使其充分認識到程序是如何解決實際應用問題的,抱著極大興趣展開研究型學習。只有在這樣的學習環境下,學生才能從根本上提高SLOC,提升技能訓練層次。
2.4教學方法
1)理論教學。
相比傳統的課程體系,新的知識體系增加不少內容。為了達到良好的教學效果,我們重新設計理論教學方法,并將其總結為“快慢結合、抓大放小”。
在新的教學方法中,我們對程序設計知識進行優化安排,即在程序語言知識方面采用“快節奏”,在程序設計方法和編程技術方面采用“慢節奏”,解決了多年來程序設計教與學的難題和瓶頸問題。“快節奏”體現為語言基礎知識大幅壓縮,教師一開始即以簡單程序框架展開程序,直接進入以程序模塊為主的教學環境。這種方式方便教師精講知識,學生盡早練習程序設計和編程,使得課堂教學不在語言細節和小片段程序上反復循環。“慢節奏”體現為以較難的編程技術為研究專題展開歷時較長的編程方法教學,方便教師組織技能訓練,學生獲取應用編程技巧。理論教學過程將軟件開發中的結構化、面向對象、組件模型、敏捷思想融入到每個知識單元的教學中,讓學生接受專業化訓練。
適應本知識體系的優化的C語言教學計劃如圖2所示。從圖中可以看出,這種優化的知識體系以快慢結合的教學方法使教師能夠“抓大”(設計方法)、“放小”(語言知識),學生在學習時能夠始終主次分明,得到最大化的編程訓練,并最終獲得較強的編程技能。
2)實驗教學。
實驗教學方法可以總結為八個字:夯實基礎、提升創新。
夯實基礎階段主要鞏固語言基礎,使學生通過足量的編程訓練掌握程序語言知識和編程方法,具備一定的編程能力,學會使用程序排錯、動態調試技術、開發工具。本階段通過大量的簡單題目,要求學生在真實編程環境中得到充分鍛煉,熟練掌握程序語言基礎知識和編寫程序的流程,目的是希望學生通過大量的簡單題目訓練具備將實際問題進行簡單抽象的能力,培養學生具備扎實的計算思維能力。因此,該階段訓練的重點內容集中在語言的數據類型、表達式和控制結構等簡單內容的應用上。
提升創新階段是教師在學生熟練掌握語言知識的基礎上,通過講解和剖析相關案例的方法,引導學生完成大型課程設計題目。在此階段,學生嘗試將所學的語言與算法、數據結構等知識結合進行大型程序設計,并借助高級編程技術完成課程設計題目中高級應用的開發工作。這也是學生提升自身技能并嘗試創新的過程。
這種以技能為目標、以編程技術為核心的實驗教學依靠傳統實驗手段根本無法實施,因此我們設計了高集成度的程序設計綜合訓練平臺以全程自動化輔助教學,并進行教學管理。系列教學軟件包括“程序設計在線評測系統INPOJ”,由機器大規模訓練學生的習題解答速度(POJ訓練);“軟件設計協同開發平臺DevForge”按專業軟件開發方式,引導學生進行程序設計,跟蹤課程設計進程、自動評閱學生的課程設計程序報告,并構建程序設計課程網上社區,使實驗機房變成學生討論、思考、相互交流的研究場所,形成數字化課堂、網絡輔助教學、電子教室、智能答疑、綜合訓練等立體化教學環境,為落實教學理念和教學目標提供物質基礎。3
試行效果
以技能為主導的程序設計教學模式從2006年開始逐步實施,到2010年全部環節得到落實。下面從幾個方面描述該教學模式的試行效果。
1)學生的編程量。
2011年,學習程序設計課程的全部學生在課程學期內,共完成305 236道程序設計目并由機器進行自動評閱。每名學生的TLOC指標從2001年的30行紙質程序,上升到2004年的600行,2008年的1200行,再到2011年的1500行,達到了美國計算機學會ACM計算初課程體系(L-72)05建議標準,并目學生的SLOC指標達到500行。
2)對學生畢業設計等的后續影響。
經統計,學習該課程的學生中僅有8%的學生選擇的畢業設計題目與程序或軟件無關,30%的學生選擇的畢業設計需要借助編程或軟件工具完成,62%的學生選擇的畢業設計以程序為核心或完全是軟件設計。在現有教學模式下,這些學生進行畢業設計的技術預備時間趨向零。計算機等級考試機試部分的一次通過率和總體通過率得到很大提高,很多學生踴躍參加各種校級、省級、國家級、國際級競賽并取得了很好的成績。
3)對教師的影響。
理論教學從原來的48學時降低到40學時,并計劃再次降低到24學時,以留出更多的實踐學時。理論學時減少的同時教學效果反而得到優化,教師普遍反映教學過程相比以前主次更分明,思路更清晰。而在實踐教學中,由于開發了高集成的教學輔助平臺,教師的工作量不但沒有增加,反而得到大幅度降低。其中,教師用于實踐教學的工作量降低到原來的40%,用于批改作業的工作量降低到原來的20%,處理教學事物的工作量僅為原來的5%。
4 結語
以技能為主導的程序設計教學模式提出全新的教學理念,重新設計了知識體系和考量方法,并指出理論教學和實驗教學的實施策略,保證教學過程的每一個環節都以技能為目標和以編程技術為核心。新的教學模式下,教師的教學思路清晰,教學負擔相對減輕,學生學習主次分明,能夠獲得較強的編程技能。因此,該模式是一種迎合創新人才需求的優秀教學模式,值得進行大范圍推廣。