孫昌愛 于雙元 吳盡昭
摘要:程序設計語言是高等學校計算機專業本科教學計劃中不可缺少的基礎課程,由于語言種類多、發展快、實踐性強,如何在有限的課時內讓學生系統地掌握程序設計語言的基本原理、具備初步的編程能力,是該類課程教學面臨的一個主要挑戰。本文介紹北京交通大學在程序設計語言類課程教學方面進行的研究性教學與實踐性教學相結合的探索與嘗試。
關鍵詞:計算機教育;程序設計語言類課程教學;教學改革;研究性教學;實踐教學
中圖分類號:G642 文獻標識碼:B
1程序設計語言類課程教學的問題
程序設計語言的研究與開發一直是計算機科學領域的核心問題之一。事實上,信息技術領域的任何新技術與新方法都離不開程序設計語言的表達和實現,多名“圖靈獎”獲得者都是因為在程序設計語言方面的開創性成果而獲獎。研究型大學的計算機專業本科生不僅應掌握特定程序語言的應用,更應了解不同類型程序設計語言的理論基礎及其背后所蘊涵的程序設計方法學。
我國絕大多數高校計算機專業方向的本科生教學培養計劃中安排了程序設計語言的教學任務。與西方發達國家的高等院校相比,程序設計語言教學方面的突出不足之處主要表現為:
(1) 程序設計語言的教學在有限的本科生教學課時中占用了較大比例,開設了如C、C++、Java、C#、Web程序設計語言、腳本語言等課程,設置零散,缺乏系統性。
(2) 程序設計語言的教學大綱側重語言的語法教學,忽視程序語言設計的理論基礎。學生缺乏研究和開發新型程序設計語言的能力,與研究型大學的學生培養目標有較大差距。
(3) 程序設計語言實例教學的效果不能令人滿意。相當比例的計算機專業本科畢業生需要經過一段時間的編程訓練后方能滿足工業界需求。
初步調研發現,我國計算機學科排名靠前的幾所高校,如北京大學、北京航空航天大學、東南大學,開設了“高級程序設計語言的設計與實現”或“程序設計語言的原理與實踐”課程,但這些課程大多是面向計算機專業方向的研究生。據我們所知,德國和荷蘭等西方發達國家的高校在本科生層次上就已經開設了相應課程,并且將程序設計語言的教學任務分配到多個階段。
基于以上分析,我們認為,有必要在計算機專業本科生教學培養計劃中增設程序設計語言的理論基礎課程,適當刪減程序設計語言實例教學課時,實現從程序設計語言基礎理論到編程實踐的系統化教學。
以培養可持續發展的計算機專業人才為導向,本文探討“研究性”教學與“實踐性”教學相結合的“程序設計語言”課程教學的探索與實踐。具體說來,在程序設計語言理論基礎教學方面,歸納與整理幾類程序設計語言的理論基礎,并以代表性程序設計語言為例進行分析與講解;在程序設計語言實踐教學方面,保留“C程序設計”課程教學,但對已有的教學內容與方式實施改革。上述教學改革的目標是提高學生程序設計語言的理論水平,增強對程序設計語言的理解與應用能力,為后期從事計算機相關領域的研發活動夯實基礎。
2程序設計語言理論基礎的研究性教學探索
程序設計語言理論基礎研究性教學遵循“三結合”的基本原則,設計和實施課程教學。具體說來,采用“授之以漁”與“授之以魚”相結合、“演繹”與“歸納”相結合、“原理”與“實踐”相結合的方式。
由教授、副教授、講師各一名組成本課程的教學小組。三名授課教師均長期從事計算機軟件與理論方面的研究工作,在國內外學術期刊或學術會議上發表多篇高水平的研究論文。其中,一名教師負責講授不同類型程序設計語言的理論基礎,另外兩名教師配合理論基礎講授語言實例。
本課程以授課教師編寫的講義為主,并提供大量相關的參考文獻。通常,程序設計語言的理論基礎可按三種編排方式講授,即按照不同語言的重要特征及比較、或者按照程序設計語言的基本結構及實現、或者按照程序設計語言的形式化語義講解。基于近幾年程序設計語言的研究進展,本課程采用第一種編排方式組織課程的教學大綱。
(1) 分析與整理現有的各種程序設計語言,如C、C++、C#、Java、Ada、Lisp、Prolog等,歸納不同范型程序設計語言的特點與由來,繪制程序設計語言的發展譜系。
(2) 整理與探討過程式、函數式、邏輯式、面向對象式、并發式等不同范型程序設計語言的理論基礎,結合有代表性的程序設計語言實例分析講解。
(3) 探討新型程序設計語言的發展趨勢,討論開發新型程序設計語言的一般過程與方法。
在實施課程教學時,采取教師講授、學生演講與報告、課堂討論等各種形式的研究性教學方式。首先教師主講先導性知識與理論基礎,然后由教師指定相關文獻,學生課前必須認真研讀、準備課堂演講與報告,老師和其他同學提問;學生無法回答或解釋不清時,由教師進行疏導。學生準備課堂演講與報告時,應能運用合適的研究方法,并結合具體程序設計語言進行分析與討論。該教學方式將“學”與“教”互相融合,學生既是“學”的主體,又具有“教”的能力,即學習新知識并能清晰地講授給別人。通過積極參與課堂討論,學生必須積極思考教師或其他同學提出的問題,并進一步研讀文獻,鍛煉“提問題”、“回答問題”的能力,提高做研究的素質。
下面以“過程式程序設計語言的理論基礎”與“過程式程序設計語言實例”為例,簡要論述“學”與“教”相結合的研究性教學方式。
(1) 由教師講解過程式程序設計語言的基本思想、特點與理論基礎。
(2) 教師指定過程式程序設計語言中相關問題的研究論文,要求學生課后進行認真閱讀,并安排不同的學習小組對這些研究文章進行課堂演講與報告。
(3) 教師與學生提出各種問題,要求作報告的同學進行回答。例如,教師讓學生思考或回答“作為過程式程序設計語言的代表,C語言是如何處理控制結構、類型、存儲”等問題,學生必須將所學的基礎理論與C語言設計的基本思想結合起來才能回答此類問題。
類似地,教師系統地講授各類程序設計語言的理論基礎,學生結合各自程序設計語言實例進行分析與研究。通過這樣的由“一般”到“具體”或“歸納”與“演繹”相結合的過程,學生不僅可以深入理解面向對象、函數、邏輯、并發等各種范型的程序設計語言的理論基礎、設計思想,還可以對不同范型的程序設計語言進行系統的分析與比較。更重要的是,已知的程序設計語言上百種,課堂教學中不可能講授所有的程序設計語言,因此上述研究性教學方式有助于學生快速掌握新型程序設計語言。
課程考核采用“課堂演講與報告”加“課程論文”的形式,前者占40%,后者占60%。“課堂演講與報告”布置一些經典的程序設計語言方面的研究論文,學生閱讀并理解其中的關鍵思想,運用本課程講授的各種計算機專業研究方法、并結合程序設計語言實例進行課堂演講與報告,所有同學必須參與課堂討論。“課程論文”則要求學生運用計算機專業研究方法學習和追蹤某種新程序設計語言,或對當前主流程序設計語言進行評述。為了鼓勵討論,課程論文可以以研究小組為單位提交。但小組成員必須獨立參加口頭答辯,并說明自己在論文研究中的貢獻。
不難看出,上述課程教學將計算機專業研究方法潛移默化地運用到程序設計語言的教學中。通過本課程的學習,學生不僅要掌握程序設計語言的理論基礎,增強對程序設計語言的理解與應用,而且應理解如何應用各種計算機專業研究方法。
3程序設計語言實例實踐性教學的改革與嘗試
盡管程序設計語言的理論基礎教學已經部分講授具有代表性的程序設計語言,但是距如何熟練地運用這些程序設計語言進行編程實踐還有一段距離。為此,有必要開設具體程序設計語言實例的課程教學。在本科生教學計劃中,我們認為應該保留“C程序設計”課程教學。一方面,C語言在實踐中有著廣泛的應用;另一方面,C語言是面向對象程序設計語言C++的基礎。
與程序設計語言的理論基礎教學不同,“C程序設計”應側重于實踐性教學。根據北京交通大學近兩年的“C程序設計”教學實踐,我們發現程序設計語言實例教學存在一些不足之處:如學生對C語言的基本概念、特征與簡單的數據類型掌握較好,但對指針、數組、函數等復雜概念的理解與運用有待進一步提高;如具備了一定的程序分析能力,但程序設計能力較差。以筆者任教的信息與計算科學本科生的“C程序設計”為例,本課程共32學時,其中理論教學24課時,實驗教學8課時。表1總結了2008年度2007級“C程序設計”課程考察情況。本次考察由6道考題組成,題1~題6分別為概述題、填空題、選擇題、程序分析題、程序填空題和程序設計題。最高分、最低分、平均分行分別給出了各道題的最高得分、最低得分和平均分。得分率的高低與學生的基礎以及試題的難易程度有關。橫向比較發現:題1~題3的得分率較高,表明學生基本掌握與理解C語言的基本概念;題1~題3得分率較低,表明學生對C語言的運用能力較差。

針對上述不足之處,我們進行了加強實踐性教學的嘗試:
(1) 引進啟發式問題,增加提問,增強互動,讓學生主動思考問題。例如,在講解為何學習C語言時,提問“人們可采用哪些途徑跟計算機打交道?”在講解C語言3種控制結構時,提問“如何通過程序設計語言讓計算機按照人們的想法工作?”在講解C語言的輸入輸出處理時,提問“計算機怎樣接受要處理的數據,怎樣將計算的結果反饋給人們?”等。我們發現,學生對這些啟發式問題比較感興趣,會主動構想一些答案。
(2) 在講授內容上遵循“抓住主干,忽略細節”的原則。理論教學課時非常有限,無法講授C語言的全部知識點,因此要抓住重點,忽略細節。
(3) 增加例子與解析,著重提高學生的程序構造能力。通過與學生的廣泛交流,我們發現學生基本可以掌握C語言的各種概念,能讀懂一般難度的C程序,但是編寫程序則感到棘手。編程就是將各種C語言的成分按照一定的方式組合起來解決實際問題,是一個構造性思維過程。提高程序構造能力的唯一辦法是多實踐,一個有效的辦法是增加程序舉例與解析,然后讓學生模仿這些例子。
表2總結了實施上述加強實踐性教學的嘗試之后,筆者任教的信息與計算科學本科2009年度2008級“C程序設計”課程考察情況。本次考察由5道題組成,題1~題5分別為填空題、選擇題、程序分析題、程序填空題和程序設計題。與2007級“C程序設計”課程考察相比,難度稍有增加。比較表1和表2,可以得出如下結論:
(1) 表2中,不同題之間得分率差距進一步拉大。例如,題1(填空題)得分率為85%,題5(程序設計題)為60%,表明學生較好地掌握了C語言的概念,編程能力仍然欠缺。
(2) 表2中,每道題的最高分與最低分差距進一步拉大。例如,題5的最高分為滿分,最低分為3分,表明學生的編程能力差距大。
(3) 表2中,程序填空得分率較表1有大幅度的提高,但程序分析與程序設計得分率稍有下降。

從近兩年來的課程考察結果看來,如何提高程序構造能力仍然是“C程序設計”課程實踐性教學面臨的主要問題。通過加強實踐性教學的改革與嘗試,學生能較好地掌握C語言的概念,但應用能力仍有待提高;另一方面,高分的學生數多了,同時低分的學生數也在增多,說明上述教學改革導致了學生對C語言的理解與應用出現了較大差距。
4結束語
程序設計語言是計算機專業本科教學計劃中的一門基礎課程。由于程序設計語言種類多、實踐性強,如何在有限的課時內讓學生系統地掌握并應用多種程序設計語言,是該類課程教學面臨的一個主要挑戰。為此,我們進行了拓寬程序設計語言的理論基礎、強化程序設計語言運用能力的初步教學探索與嘗試。在程序設計語言理論基礎教學方面,我們探索了研究性教學方式,加強程序設計語言基礎原理的教學,講授多種語言之間的共性與不同點,力求舉一反三。在程序設計語言實例教學方面,我們初步嘗試了強化實踐性教學。值得注意的是,程序設計語言的理論基礎和實例教學是兩門緊密配合的系列課程,應分為兩個階段實施。為配合該系列課程的有效實施,現有的教學大綱需要進一步調整課時分配,更合理地規劃理論和實踐教學的協同。
本文提出的教學改革與嘗試有利于實現程序設計語言的系統化教學。學生具備理論基礎及某種程序設計語言的編程能力后,應該有能力自學和運用其他程序設計語言這正是我們強調的可持續發展的計算機專業人才應該具備的基本素質。上述程序設計語言類課程教學改革是我們的初步嘗試,需要進一步完善、檢驗實際效果。
注:本文得到北京交通大學計算機與信息技術學院本科教改項目“計算機專業研究方法論課程建設”(2008.9~2010.3)和北京市實驗示范中心“計算機科學實踐教學體系建設項目”(2008.4~2009.3)的大力支持。
參考文獻:
[1] 吳鶴齡. ACM圖靈獎(1966-2006)-計算機發展史的縮影[M]. 3版. 北京:高等教育出版社,2008.
[2] 蔡啟先. CC2004計算機學科教程體系分析與思考[J]. 高等工程教育研究,2006(5).
[3] 吳平,黃燕,黃嵐,等. 本科計算機專業課程體系改革初探[J]. 中國大學教學,2004(6).
[4] [美]Kenneth C.Louden. 程序設計語言—原理與實踐[M]. 黃林鵬,毛宏燕,黃曉琴,等譯. 2版. 北京:電子工業出版社,2004.