張榮博,許 莉,叢麗暉,李勝宇
(沈陽航空航天大學 計算機學院,遼寧 沈陽 110136)
程序設計能力是計算機類技術人才的核心能力,對其職業發展至關重要,但從教學和就業反饋結果看,學生的程序設計能力普遍偏弱,存在動手實踐能力不夠,邏輯思維能力和計算思維能力不足,缺乏軟件設計、開發經驗等問題。程序設計能力需要程序語言運用、開發工具使用、運行環境理解、問題算法設計等多種知識和技能的共同支撐,需要學生長期自覺實踐和主動學習相配合。程序設計基礎是培養學生程序設計能力的基礎課程,但傳統的課程教學模式是以教為中心、面向課程的教育模式,其特點是偏重知識的輸入,對學生程序設計能力產出的關注不夠[1]。另外由于缺乏有效的實踐訓練方法和評測手段以及教學效果評價形式單一,學生與教師之間缺乏有效的配合和協同,存在認知斷裂現象,不能有效激發學生自主學習動能。
程序設計基礎通常是計算機類專業在大學第一學期面向無編程基礎的學生開設的程序設計類課程,與數據結構、面向對象程序設計、編譯方法等課程共同、遞進地培養學生的程序設計能力。因此課程的教學目標不能孤立的設置,應該梳理與專業培養方案中畢業要求的支撐關系,以及后續課程所需的先導知識和能力儲備的要求來制訂。表1 是程序設計基礎課程對畢業要求的支撐關系,從中可以看出程序設計基礎課程應該著重培養學生采用計算機思維分析問題、解決問題的能力,并能掌握解決計算機領域復雜工程問題的工具的使用。
在軟件工程專業規范[2]中也指出:“程序設計基礎課程通過講解程序設計語言和程序設計技術,使學生理解程序設計語言的基本結構,掌握程序設計的基本思想、方法和技巧,養成良好的程序設計習慣,培養學生使用計算機求解問題的基本能力,具備初步的高級語言程序設計能力”。綜上確定課程的4 個教學目標。

表1 程序設計基礎課程對畢業要求的支撐關系
(1)理解程序設計語言的基本結構,掌握程序設計的基本思想、方法和技巧,養成良好的程序設計習慣。
(2)理解計算機程序的執行過程,能熟練使用開發工具完成程序代碼編輯、編譯、調試和運行等環節。
(3)培養學生的計算思維和使用計算機求解問題的基本能力。
(4)具備初步的高級語言程序設計能力。
明確課程教學目標后,根據授課對象的特征和學生對程序設計知識體系的認知規律,按照先易后難、從知識到技能、從程序設計方法到計算思維的多維度,分層次、按模塊重構知識體系,總體情況見表2。

表2 課程知識體系
(1)程序設計基礎課程的授課對象通常對計算機基本工作原理和信息數據表達等專業性較強的知識理解不夠,計算機基礎知識模塊通過介紹計算機的基本工作原理、物理信息(如圖形、游戲等)在計算機內的存儲方式等知識激發學生探索計算機編程的興趣,通過介紹馮?諾依曼計算機結構幫助學生在腦海中初步建立計算機運行模型。
(2)程序設計語言模塊采用較少的學時梳理語法知識及可視化開發工具的使用技巧。算法分析與設計模塊是理論教學的重點內容,旨在通過精選案例的分析,逐步加深學生對程序及計算機內存結構的理解,培養學生的計算思維。模塊化程序設計模塊依托函數機制,訓練學生自頂向下、逐步分解的程序設計思維。
(3)內存管理和控制模塊是程序設計基礎課程的難點內容,通過剖析內存的本質,結合編程實踐訓練,使學生理解指針的概念,駕馭指針的應用。數據抽象與設計模塊通過數據封裝強化學生對信息的歸納和抽象訓練。
(4)項目開發技術模塊采用在機房講授可視化開發技術的方式,進一步激發學生對專業知識探索的興趣。
程序設計基礎課程以C 語言作為載體語言,介紹計算思維方法和程序設計基本思想,授課過程中不以語言語法為主線,而是將語法穿插在程序設計過程中詳細準確的介紹,重在教授學生采用計算機思維分析問題、解決問題的方法和技巧。
精選以培養學生計算思維為主線的課程教學內容,課程講授重點放在問題分析、模型建立、算法設計上,以此來培養學生的計算思維、分析問題和解決問題的能力。在課程教學內容講解時,結合實際生活尤其是工程應用中的案例設計教學實例,重點訓練學生對問題信息進行歸納、分析、抽象等邏輯思維能力。如果教學實例是經過了抽象、簡化等處理后的產品,雖然可以訓練學生掌握語言語法和程序結構,但缺少對實際問題的抽象和建模訓練,從而導致學生遇到和實際相關的題目時仍無從下手。例如字符串比較的經典問題講解,選用“windows 系統登錄驗證”案例,三次機會比對用戶名和密碼,既可以加強學生對循環條件控制和多重循環知識的理解,又能訓練學生從工程應用中抽出問題的本質和設計解決方案。
思維訓練的另一個重要方面是問題的分解與組合[3],因此在設計教學實例時還應注重實例間的關系,讓實例不僅能單獨解決一個問題,還能夠通過實例的組合、拓展來完成更復雜的問題。例如,在講授一維數組、查找與排序等內容時,選用某班級學生獎學金評定程序作為案例,核心問題是數據的順序存儲、排序及比較等運算;講授二維數組時,案例升級成某學院年級獎學金評定程序,關注多維數據存儲方法;講授結構體內容時,案例強調對學生、成績等信息的抽象和提??;最后,要求采用文件對系統數據持久化。
實踐是促進各種知識融會貫通,提高程序設計能力的最好磨刀石,為了提高學生的程序設計能力,培養學生自覺學習的習慣,教學過程中強化實踐訓練,學生可以自主完成的教學活動,如預習、練習、實驗和考試等均采用上機完成,用實踐驅動學生對程序設計的理解。為了提高教師的授課效果,采用小班授課,并將實踐性和操作性強的內容安排在實驗室講授,打破以往的課程教學中“老師講、學生聽”的模式,做到邊講邊練、精講多練,便于師生互動及實踐環節輔導,使學生熟練掌握編程語言與開發工具使用,避免學生出現“會讀不會寫、會寫不會調”的情況。
針對程序設計基礎課程實踐性強的特點,摒棄教師批改學生紙質作業的方式,搭建包含在線評判、代碼相似度比較等功能的程序設計類課程教學平臺,教師根據知識點建立程序設計習題庫[4]。學生在線完成作業并提交評判,既能有效避免作業抄襲情況,又能提升學生學習程序設計的動力和提高程序設計能力。
傳統的教與學之間的反饋包括教師課堂提問、課后答疑等方式,師生之間溝通的時間和地點都相對固定,不能保證反饋的時效性。利用信息化手段,依托課程平臺、QQ 課程群、學習論壇等方式,建立多元化教學跟蹤反饋體系,確保對學生的學習狀態、學習效果能夠及時、準確的掌握,并能及早做出干預和教學調整,具體措施如下。
(1)依托課程教學平臺,采用電子作業、程序自動評判和作業成績實時發布等方式,及時、有效地向學生反饋自身知識點的掌握情況,有利于學生及時、準確地調整自己的學習狀態。
(2)教師通過教學平臺實時監控學生的學習狀態或知識點掌握情況,并通過習題課、專項輔導的形式對學生的學習進行早期干預。
(3)依托教學平臺,搭建課程學習論壇、QQ 課程群,方便學生及時、準確地反饋學習中的問題,同時方便教師答疑,以及學生之間的學習互助。
考核是檢驗學生學習成果的重要方法,也是激勵學生積極主動學習的有效手段,基于OBE教育理念是以學生的學習成果為中心來展開教學,擯棄以考查學生對知識點掌握情況的期末考試方式,采用過程化考核,關注學生對知識的運用能力,強調對學習目標的達成度的考查。
(1)作業考核,占課程總成績的10%,采用小目標過程考核,抽取課程中所有可考核的教學活動,根據活動內容和特點設置考核要求,考核點要粒度小、覆蓋廣、易達成,使學生在考核中能獲得持續激勵,減少抵觸并逐步建立自覺學習習慣。
(2)實驗考核,占課程總成績的10%,考核學生針對實際應用題目,進行分析問題、設計問題解決方案及撰寫實驗報告的能力。
(3)階段性考核,占課程總成績的30%,階段性考核題目難度與范圍要比作業題目大,主要考核學生對知識的綜合運用能力。
(4)期末考試,占課程總成績的50%,題目類型全部為編程題,評價學生的程序設計及編程實踐能力。
所有的考核都通過課程平臺在線評判,考核貫穿于整個教學過程,有利于學生根據考核效果及時調整學習態度和學習方法,也為教師調整教學進度和方法提供依據,最終促進教學目標的達成。
自2016 年開始課程改革實踐以來,經歷了多輪的繼續改進,從實際教學效果來看,改革起到了較好作用,2016—2019 年期間某任課教師教授的兩個自然班的課程教學目標的達成情況如圖1 所示。模塊化的知識體系結合精選教學案例的分析加深了學生對程序設計思想的理解,采用小目標過程考核以及依托課程教學平臺搭建的教學反饋體系激發了學生對程序設計課程的學習興趣,逐漸養成了自主學習的習慣。通過課程教學平臺統計的學生在線練習的評測時間分布如圖2 所示,可以看出學生在晚自習之后主動利用2~3 小時的時間學習程序設計。
改革同時也提升了教師的教學水平和實踐能力,教師勞動由低質量的重復性講授知識,逐漸轉向教學案例組織、試題設計和教學研究等高質量勞動。目前課程教師團隊已經依托課程教學平臺,建設了符合本校學生特點、涵蓋所有課程知識體系的作業題1 000 余套,考試題200 余套,極大地豐富了學生編程練習內容和提高了實踐訓練強度。

圖1 2016—2019 年課程教學目標達成度

圖2 學生在線練習評測時間分布
不斷提高教育質量是高等教育追求的永恒“不動點”[5],基于OBE 教育理念的程序設計基礎課程改革,以學生的程序設計能力產出為導向,明確了課程的教學目標,按照模塊化重構課程知識體系,以培養計算思維為主線組織教學內容,以提高學生程序設計能力為目標開展各類教學活動,采用小目標過程考核以及依托課程教學平臺搭建的教學反饋體系激勵學生積極、主動參與整個教學過程。實踐表明,改革后的教學模式提高了學生程序設計能力。