張永梅 馬禮 孫海燕 付昊天 周奇
摘 要: 針對計算機專業學生在編程和算法設計與分析中存在的問題,在課程設置與教學目標、實驗性課程教學、多模態教學,和學習態度的指引等方面,給出了具體的改革措施,有效提升了學生的編程能力、算法設計與分析能力,以及分析和解決實際問題的能力。
關鍵詞: 編程能力; 算法設計; 計算機專業; 改革措施
中圖分類號:G642 文獻標志碼:A 文章編號:1006-8228(2016)03-60-04
Research and exploration of cultivating students' ability of programming,
algorithm design and analysis
Zhang Yongmei, Ma Li, Sun Haiyan, Fu Haotian, Zhou Qi
(School of Computer Science, North China University of Technology, Beijing 100144, China)
Abstract: Aiming at the problems existing in programming and algorithm design and analysis of computer specialty students, the concrete reform measures are given on the aspects of the curriculum and teaching objectives, experimental course teaching, multi-mode teaching and the guiding of learning attitude, which effectively improve students' ability of programming and algorithm design and analysis, as well as the ability to analyze and solve practical problems.
Key words: programming ability; algorithm design; computer specialty; reform measures
0 引言
計算機科學與技術本科生的基本學科能力可以歸納為計算思維能力、算法設計與分析能力、程序設計與實現能力、系統能力[1]。其中計算思維能力是指模型化、抽象思維能力、邏輯思維能力。系統能力是指計算機系統的認知、分析、開發與應用能力,也就是要站在系統的觀點上去分析和解決問題,追求問題的系統求解,而不是被局部的實現所困擾。算法設計與分析能力、程序設計能力是計算機類專業學生應該具備的基本能力之一,是從抽象思維到具體應用方法的轉換,涉及到閱讀判斷、思考分析、抽象綜合、表達創造等多項能力,對計算機專業高素質人才的培養不可或缺。
從目前社會對計算機專業人才的需求來看,高校在培養學生的程序設計、算法設計與分析能力上所作出的努力還遠遠不夠。本文探討了計算機專業學生在程序設計、算法設計與分析方面存在的主要問題,給出了在課程與實踐中提高學生的程序設計、算法設計與分析能力的具體措施。
1 現狀與問題分析
近年來,企事業用人單位較普遍的反映是計算機類畢業生的實際應用知識、動手能力和程序設計開發經驗嚴重不足,尤其是程序設計能力、算法設計與分析能力無法達到用人單位的要求。這不僅影響學生就業,更阻礙了其進一步發展與自我提升。
我們歸納了問題的主要原因。一是學生對于有關程序設計及算法的知識僅僅停留在了解的程度上,未能融匯貫通,進而應用這些知識解決實際問題。二是教師在講解程序設計、算法設計與分析的相關知識時,并沒有將理論與實際有機的結合。三是實際教學過程中并未對學生進行真正的軟件項目開發訓練。四是對第一門程序設計課程的教學不夠重視。五是學生的數學基礎差、邏輯思維能力弱,阻礙了學生進一步設計算法和分析算法。
2 程序設計、算法設計與分析能力培養的具體措施
教育教學工作應該以學生為主體,同時充分發揮教師的引領、指導作用,二者有機結合,才能充分調動學生的學習積極性和主動性,從而達到最佳的教學效果。因此本文以“學生為主體,教師為主導”這一思想為指導,結合本校的實際情況,以及教師在教育教學工作過程中遇到的問題和廣大學生的反饋,從以下四個方面探討教育教學改革的措施。
2.1 調整課程設置和教學目標
用計算機求解一個實際問題,首先要從這個實際問題中抽象出一個數學模型,然后設計一個解此數學模型的算法,最后根據算法編寫程序,以便調試、編譯、連接和運行,從而形成該問題的解。從實際問題中抽象出一個數學模型的實質,其實就是要用數學方法抽取其主要的、本質的內容,最終實現對該問題的正確認識。設計出解決問題的算法后,要清楚地知道算法的優劣處,如果是好的算法則不必對其懷疑而再浪費時間進行研究;如果不是好算法則應再進行改進。而如何知道算法的優劣,則需要學會分析算法。算法分析是對一個算法需要多少計算時間和存儲空間作定量的分析。編程就是設計程序,用計算機來解決問題。
與數據結構和算法設計相關的課程較多,其中三分之二以上的專業課都需要學習編程,主要是提高學生編程能力和算法分析能力。對于本科生來說,這些課程的重要性是不言而喻的。如果掌握不好則會阻礙他們對編程能力乃至對計算機系統的認識和理解。因此,應該從課程的意義出發,以提高學生的編程能力和算法設計與分析能力為目標,結合計算機專業的特點與教學實際情況,將“C語言程序設計”、“面向對象程序設計”、“離散數學”、“數據結構”、“算法設計與分析”、“網絡編程”、“Windows編程技術”、“操作系統”、“計算機網絡”、“編譯原理”和“數據庫技術”等幾門課程有機地結合起來,并充分利用它們內在的聯系優化授課的順序與內容,為學生提供一套以編程能力和算法設計與分析能力為中心的教學體系,為學好相應的課程打下堅實基礎[2]。
“C語言程序設計”和“離散數學”作為計算機專業學生較早接觸的兩門課程,應該為后續專業課的學習打好基礎。C語言是學生在大學接觸的第一門編程語言,教學中應該重點介紹程序設計思想,并培養學生的邏輯思維能力、抽象能力、編程習慣,而不是一味地強調C語言的語法特性。同時,“C語言程序設計”這門課也為后續的數據結構、算法設計與分析課程做好實踐上的鋪墊?!半x散數學”的概念、理論及方法應用于計算機科學與技術的諸多領域,并大量出現在“數據結構”、“數據庫系統”、“編譯原理”、“算法設計與分析”、“計算機網絡”等專業課程中。此外,離散數學所提供的訓練十分有益于學生的邏輯推理、抽象概括及歸納構造能力的提高,十分有益于培養學生嚴謹、完善、規范的科學態度。
通過“數據結構”課程,使學生了解數據對象的特性,學會數據組織的方法,以及各種類型數據的處理方法,同時培養學生良好的程序設計技能。“算法設計與分析”課程重點講授分治法、貪心法、動態規劃、回溯法、分支限界法,培養學生分析問題和解決問題的能力,使學生掌握算法設計的基本方法,熟悉算法分析的基本技術,并能熟練運用一些常用算法?!安僮飨到y”、“計算機網絡”、“編譯原理”和“數據庫技術”都是對前面學習到的一些基本的數據結構和算法的具體應用,再加上一些相關領域的專業知識。
在“操作系統”教學中,讓學生了解操作系統的一些基本概念,如:進程和線程、虛擬內存、死鎖等,并按操作系統的五大功能分模塊進行介紹。通過相應實驗幫助學生理解重要概念,如通過實現“銀行家算法”讓學生明白進程間的通信過程、模擬LRU算法了解頁面如何置換,通過實驗使學生更加深刻地理解有關概念[3]。對于“編譯原理”這門課,由于其理論性較強,在教學過程中應該盡量多與實驗相結合,在課堂上比較難理解的內容,例如詞法分析中的有限自動機內容或語法分析中LL(1)文法的理解等等,都可以通過與實驗結合來促進對課堂內容的理解,可通過完成詞法分析器的實驗了解編譯器如何把輸入的源程序轉化為單詞符號串。
2.2 加強實驗性課程教學
計算機專業相關的課程總體來說理論性比較強[4-5],開設實驗性課程有利于學生通過自己的實際操作加深對課堂知識的理解,同時強化編程能力、算法設計能力和創新能力。許多課程都有上機編程實驗內容,如“C語言程序設計”、“面向對象程序設計”、“數據結構”、“算法設計與分析”、“Java程序設計”、“操作系統”等課程,都要求學生完成一定數量的設計性,完成驗證性實驗。我們設立了工程與學術實踐、計算機軟件課程設計、獨立實驗課程以及畢業設計等實訓科目,堅持編程實踐四年不間斷。
實驗貫穿于理論、抽象和設計過程;實驗對軟件的設計和實現、測試原理和方法起示范作用;實驗不僅是對理論的驗證,也是技術訓練和能力培養,包括動手能力、分析問題解決問題能力、表達能力、寫作能力等。教學活動是教師和學生不斷交流的過程,實驗是實現這個過程的橋梁,可以彌補課堂教學的不足,加深對理論過程的理解,啟發學生深入思考,敢于創新,理論聯系實際。
例如“編譯原理”課程是計算機類專業的一門重要專業課。設置該課程是讓學生學習編譯系統的結構、工作流程及編譯程序各組成部分的設計原理和實現技術,使學生通過學習既掌握編譯理論和方法基本知識,也具有設計、實現、分析和維護編譯程序等方面的初步能力。編譯原理是一門理論性和實踐性都比較強的課程。實驗的目的是加深學生對課堂知識的理解,掌握幾個主要編譯階段的處理方法,增強實踐能力,能完成初步設計、編制和調試編譯系統。
實驗一詞法分析器構造,通過對給定源語言詞法分析程序的設計,加深對詞法分析原理的理解,掌握源語言的接受、存貯、預處理和掃描分析,生成正確的單詞符號串二元式序列。實驗二語法分析器構造,借助于詞法分析程序提供的分析結果,編寫一個算符優先語法分析程序,程序能進行語法結構分析和錯誤檢查并產生相應的歸約信息。同時給出出錯信息和錯誤類型,從而加深對語法分析的理解。進一步設計實現球類描述語言詞法分析、語法分析實驗(擴展實驗),根據球類比賽技戰術分析的需求,設計的解釋器由詞法器、語法器和語義分析模塊三部分組成,詞法分析器負責詞法分析的預處理和輸入單詞的解釋;語法分析負責輸入碼的語法結構檢查和解釋;在詞法和語法分析器基礎上,語義分析模塊負責比賽技戰術的分類與統計工作。
本校開設了“程序設計專題訓練”、“計算機網絡專題訓練”、“操作系統專題訓練”、“數據庫專題訓練”、“軟件測試技術”、“嵌入式技術”等實踐課程。如“程序設計專題訓練”課程是C程序設計課程后續的訓練課程,針對程序設計中常見問題,以專題形式進行訓練。通過該課程的學習,使學生能深入理解C語言特性,掌握基本程序設計方法,學會常見問題的處理技巧,提高程序設計能力,為后續專業課程的學習打下良好基礎。又如“操作系統專題訓練”課程重點提高學生對操作系統的實際操作能力,使學生了解和掌握在Windows、Linux操作系統上運行的應用服務,對操作系統與外部接口(shell)有更深入的了解和認識。
為了能切實提高學生的編程水平和算法設計與分析能力,我們開設了“項目管理實踐”、“軟件課程設計”、“企業實訓”、“學術與工程實踐”等實踐課程,如“項目管理實踐”課程培養學生參與大型軟件項目開發的基本能力,使學生能夠熟練掌握軟件開發環境使用和軟件開發的基本方法,為畢業設計和就業提供了必要的技能訓練。按照5-8人的規模成立軟件開發項目組,以開發一個軟件項目作為實訓的主線;項目經理由學生擔任,項目成員的角色由項目經理根據各成員的技能來確定;由實訓方提供項目的用戶需求,并且確定要開展的軟件工程活動和管理活動及項目里程碑;根據開展的軟件工程和管理活動,提取出一些關鍵知識點,以案例的方式進行項目培訓,并將其用于項目開發的實踐中,其中案例來自實際開發的軟件和系統集成項目。
2.3 緊跟時代變化,實現多模態教學
首先重視教學內容的時效性,教師在教學過程中,不僅僅著眼于所選用的教材,還應融入前沿思想、技術和一些交叉學科的內容。例如在“編譯原理”課程的教學中,不局限于一種語言,而應該選擇多種不同體系結構的編程語言進行介紹;又例如可以選擇C語言、Ruby、Python,甚至是蘋果最新推出的Swift語言,通過比較這些語言的不同特征,給出其在編譯過程中的各自特點,從而使學生對編譯程序所做的工作有更加清晰透徹的了解。在“數據結構”、“面向對象程序設計”這類課程的教學中,可以多介紹一些國內外的文獻、最新應用等,從多種不同角度引導學生程序閱讀及編程的興趣。這就要求教師關注計算機及電子信息產業發展研究的最新內容,并及時將這些新內容融入到教學工作中。
其次,重視教學方式的時效性,培養學生程序閱讀能力、編程能力,其手段要緊跟時代步伐。充分利用互聯網時代的MOOC,如北京大學的MOOC、浙江大學的MOOC、本校的MOOC等,將原先只能在電腦上或書本中的程序放在手機上,使學生可以隨時隨地從手機端進行學習。學生課外可以利用北京航空航天大學實驗類MOOC的計算機網絡實驗課程、移動計算兩門課程,通過計算機網絡實驗課程,了解網絡基本原理,遠程配路由器、交換機,組一個小的網絡,掌握基本的網絡故障排查方法。通過移動計算即Android編程,MOOC已經搭好大的框架,教學生編寫小的app程序,并將編寫好的代碼嵌入到框架中。
通過促進在計算機系本科教學工作中多模態教學模式的實現,可以將原先計算機專業教學以課堂教學為主、課下上機實驗為輔,其余全靠學生自覺學習的格局,轉化為課堂教學為主導,智能端隨時學習為輔,課下上機實驗為監督檢測的新格局。這樣的格局摒棄了過去教學只能在課堂進行的成見,給予學生更多的學習自由,可以有效提高學生的程序設計、算法設計與分析能力,同時節約課堂時間,教師在課堂中能夠有更多時間講解一些更加實用的難以從書本中直接獲得的知識。
2.4 注重對學生學習態度的引導
在對計算機系學生的調查中發現,后進生大多有“畏難”情緒。他們往往還未開始編程,就對自己的能力進行主觀否定,這種特征在調劑生身上表現得較為突出。對于這種情況,教師在課堂上如果只單方面強調知識的重要性,甚至直接點出考試及格的重要性并不會對這類學生思維模式的轉變有好處。教師在教學過程中,常常會不自覺地將自己體驗過的應試競爭態度帶入教學工作中,具體表現為:過于強調考試分數,為了提起學生的聽課興趣甚至以考試題型作為誘餌,經常強調獎學金和保研問題,整個教學工作圍繞著考試等。這其實都是不正當的競爭指引方式,只會增強學生的厭學心理。
因此,計算機專業講師在教學過程中,應格外注重對學生學習態度的指引,特別是在代碼類課程的教學過程中,教師不應根據自己多年的代碼編寫經驗來對代碼進行講解,而是應該想象自己是這種代碼的一名新學生,對這類代碼一無所知的情況下,可能會從哪里入手進行理解。與其說“這門課掛科了,你畢業就有危險”,不如說“學會寫代碼,你就可以自由駕馭整臺計算機”;與其說“這種數據類型期末考試一定會考”,不如說“你玩的泡泡龍中,屏幕上的泡泡就可以用這種數據類型來寫”。在教學中注重引導學生的學習興趣,激發學生的學習熱情和探索精神,真正做到以學生為本,從學生的角度理解教學,才能在教學工作中正確指引學生的學習態度,達到最佳教學效果。
3 總結
計算機科學是一門具有創造性意識活動的學科,計算機本質上是一個程序的機器,只有那些真正懂得程序的人才能懂得計算機。因此程序設計能力、算法設計與分析能力是一名合格計算機類專業的畢業生必須具備的兩大基礎能力。本文給出的具體措施,有效提高了學生的編程能力、算法設計與分析能力,以及分析和解決實際問題的能力,有利于培養經濟社會發展急需的信息產業人才。
參考文獻(References):
[1] 王銳.改革計算機實驗課,提高計算機教學水平[J].科技與教
育,2008.5:197-198
[2] 曹曉蘭,彭佳紅,彭劍.計算機本科生編程能力與軟件能力的
培養研究[J].計算機教育,2014.4:72-75
[3] 張曉孿,王西鋒.計算機專業大學生程序設計能力培養模式的
探索[J].信息技術,2011.10(10):43-46
[4] 劉幸.教育改革背景下工科院校學生培養模式探析[J].考試
周刊,2015.56:144-145
[5] 耿國華.程序設計能力培養模式的探索與實踐[J].中國大學,
2009.3:30-32