摘要:本文討論了C++課程的設置方法與定位,從“通識教育”、高職生學習風格特點、C/C++的普及化等不同視角,分析了臺灣地區高職教材《C/C++程序設計》的三個編寫特色:基礎性、范例性和通俗化。
關鍵詞:C++;程序設計;高職教材;通識教育;職業技術教育
中圖分類號:G642 文獻標識碼:B
1引言
從事程序設計教學以來,筆者選擇教材時一直有一個偏好,就是要選擇程序實例較多,較完整的教材,認為這樣易教易學。如匯編語言曾選用張懷蓮編的《宏匯編語言程序設計》;C語言曾選用譚浩強編著的《C程序設計》。本世紀初,當筆者接受高職C++語言的教學任務時,由Decoder編著、中國鐵道出版社于2002年2月出版的《C/C++程序設計》一書(以下簡稱“Decoder本”),便以其豐富的例程和通俗的敘述立即進入筆者視野。這本教材是由中國鐵道出版社推出的“21世紀臺灣高職高專系列教材”之一,筆者用它教過4屆8個班約450名學生,教學效果非常好。這本教材究竟好在何處?它的編寫特色是什么?它又給了我們怎樣的啟示?本文是筆者對上述問題的一點思考,愿拋磚引玉與同行分享。
2關于C++課程設置與定位的討論
課程設置與定位將直接決定教材的體系結構與教材內容取舍。在具體分析“Decoder本”編寫特色前,有必要先討論一下C++課程的設置與定位。
2.1C++課程設置方法:
目前內地高校C++課程的開設日漸普遍,然而不同類型、不同層次學校的不同專業,開設C++的方法并不相同,概括起來可以分為以下4種:
(1) 作為第二語言課開設:即在先期C語言課的基礎上開設。由于C語言教學的普及,學生已經具備程序和算法概念,已經學過面向過程編程的方法。在C++中只須重點講C++對C語言的擴展,重點講面向對象的編程方法。將C語言和C++作為兩門課分別在兩個學期不同的階段開設,是比較穩妥的作法,可以使學生學得更扎實。這種設置方法比較適合計算機專業,也適合已經學過一門高級編程語言的學生。
(2)C/C++直通車:C++是對C語言的擴展。它不僅支持面向對象編程,也支持面向過程編程,即是說C++兼容C語言。C++可視為C語言的超集,C語言則是C++的子集,從這一點出發,C++不一定以C語言為先導課。現在通行的作法是將C++分段,前期只講與C兼容的內容,只講面向過程編程,后期側重點講面向對象編程。前后兩個階段使用統一的C++標準,可以避免課程內容重復及不同語言版本的混淆。這樣的教學安排適合作為方法學課程或非計算機專業的程序設計基礎課。目前內地出版的C++主流教材多是依據這種教學安排所編寫,例如劉璟編著、高等教育出版社于2001年1月出版的《高級語言C++程序設計》(以下簡稱“劉璟本”),譚浩強編著、清華大學出版社于2004年6月出版的《C++程序設計》(以下簡稱“譚浩強本”)等。
(3)C++/數據結構綜合課:課程綜合化是當代世界范圍課程改革的潮流。科學技術日新月異的發展,一方面使學科分化越來越細;另一方面則是在學科高度分化基礎上的高度綜合。設置綜合課程是高等教育應對信息化時代知識爆炸的挑戰,加強學生綜合能力、創新能力培養的必然選擇。近年來內地已出版了反映“C++/數據結構”綜合課改革成果的多種教材,例如由美國阿姆斯特郎亞特蘭大州立大學Y.Daniel Liang著(王剛等譯)、機械工業出版社于2008年7月出版的《C++程序設計》(以下簡稱“(美) Y.D. Liang本”),王立柱編著、清華大學出版社于2008年3月出版的《C/C++與數據結構(第3版)》等。
(4) 作為專業課開設:由于C++至今仍是在軟件開發中占主流的程序設計語言之一,內地軟件學院或公司培訓機構往往選擇VC++或C++Build的最新版本編寫培訓教程,不僅講基礎、講方法學,還要講與軟件實際開發有密切聯系的MFC類庫以及數據庫編程,網絡編程等內容。C++作為專業課開設的開課時機,最好選擇在畢業設計階段、職前培訓階段,否則學生由于缺乏必要的基礎而不易掌握。目前一種比較流行的作法是將C++教材分為上、下兩篇(基礎篇和高級編程篇),也可以出兩本教材。高級編程部分放在學習最后的階段供有需求的學生選學。 2.2 “Decoder本”的內容與基礎課程定位
“Decoder本”共15章,包括第0章 認識C++(屬概述);第1章 第一個C++程序,結合實例介紹流輸入(cin)、流輸出(cout)以及VC++上機操作基本方法;第2~9章分別為變量與數據類型、運算符、決策與循環、函數、數組、結構與枚舉、指針、重載,介紹面向過程編程方法,包括與C語言兼容的內容以及對C語言擴展的內容(引用參數、重載等);第10章調試,介紹調試概念、方法以及VC++上機調試方法;第11~14章分別為對象與類、繼承、成員函數的其它特性(虛函數、抽象類、友元函數、靜態函數等)、文件與流,介紹面向對象編程方法。
從教材選取的內容看,它側重的是C++語法規則、算法分析和程序設計方法的介紹,并未安排MFC類庫等在實際軟件開發過程中有重要作用的內容。因此,它是一本基礎課程教材,而不是專業課教材。
3臺灣地區高職教材《C/C++程序設計》編寫特色
3.1從“通識教育”角度看“Decoder本”的“基礎性”特色
“Decoder本”編寫的“基礎性”特色具體體現在哪些地方呢?首先,它將C/C++內容區分為基礎和高級編程兩部分,教材中只寫了基礎部分,至于C ++中和實際軟件開發有關的較深入內容,放到后期實訓教材中。其次,教材按“基礎先行”、“對象適行(object-right)”順序排列,先講面向過程編程,再講面向對象編程。這樣的安排符合由淺入深的認識規律,降低了學生學習的臺階和難度,便于學生入門,便于學生掌握。在2005年之前的國際計算機科學教育大會(Computer Science Education,SIGCSE)上,對象早行(object-early)方法曾被廣泛宣揚,后來的實踐證明對象早行方法遇到挫折。在其他高級語言(如Java、VB等)的教學中也有類似的情況,這也可以反證編寫教材遵循“基礎性”是多么重要。
現在再從通識教育的角度對教材的“基礎性”作進一步分析。既然“Decoder本”是高職教材,為什么它不將C++中那些在軟件實際開發中有著重要應用的MFC類庫等內容包括進去呢?我們也可以反問,究竟有多少學生畢業后會去做C++程序員,即便去做又能做幾年?談到課程設置,都強調市場需求、就業導向,解決“學非所用,用非所學”的問題。問題的另一面是不應當忽視市場需求“多元化”、“動態化”的特征。也就是說,我們對學生的職業規劃不可能“嫁一從終”。由于科學技術日新月異的發展,市場風云變幻莫測,在未來市場經濟社會,一個人一生的職業變遷是常態,“用非所學”也成了常態。臺灣地區由于經濟發展較早,在職業技術教育方面積累了一些經驗。也曾經歷過高職教育指向性過分狹窄的彎路,后來發現這并不符合真正的市場需求,也不符合學生及家長期望。后一點說的是相當多在職業技術院校就讀的學生仍希望將來有繼續深造的機會,能經過技能性工作鍛煉,最終走向設計、管理等高層工作。這就要求提高學生素質,基礎知識面放得更寬一些。現在臺灣地區的職業教育已經形成了高級職業學校(相當于內地中等職業學校)、專科學校、職業技術學院,科技大學和研究所的梯次職教體系,并和普通高等教育有多個出、入口接軌。這就說明臺灣地區高等職業教育仍然強調“通識教育”的重要性。“通識教育”的本質是注重學生能力培養與素質提高,而不是單純知識技能傳授與記憶。在這方面臺灣銘傳大學的經驗也可以給我們有益啟示。臺灣銘傳大學王立天教授介紹他們的經驗主要有兩條:(1)“學術顧問”制(Academic Advisor),學校為每一個學生安排全程咨詢的學術顧問,依據每一個學生的特長、基礎、興趣愛好,幫助其確定主修課程,制訂未來職業規劃,體現“以學生發展為本”;(2)“通識教育”(The General Education),就是對確立了不同個性化目標的學生抓好共同知識技能基礎。以上背景介紹,可以使我們進一步認識“Decoder本”作為基礎課程教材定位的合理性。
3.2從高職生學習風格特點看“Decoder本”的“范例性”特色
凡是教過高職課的教師都有切身體驗,那就是套用普高教材和教法效果欠佳,甚至會遭到學生抗拒(如上課說話、睡覺,逃課)。究其原因,需要從高職學生的培養目標,學習基礎和學習風格等作多因素分析。首先,教師的第一反映往往是高職學生的學習基礎不如普高生,好像這就是對問題順理成章的解釋。其次,高職學生的培養目標是高素質技能型人才,而不是研究型人才或一般意義上的應用型人才,這點雖然說起來明白,但很難落到實處,如高職教材經常編寫成普本教材的濃縮版。至于高職學生的學習風格特點又有多少教師清楚呢?2006年秋,筆者在華東師范大學訪學期間曾從事“全納教育”實踐研究,期間一個重要收獲就是認識到美國教育心理學家柯勃(Kolb D.A)學習風格理論對實現“全納教育”的重要意義。柯勃將學習風格區分為經驗感覺型、抽象分析型、主動操作型、省思觀察型(或每兩類的組合)。不同類型的學生擅長不同的學習風格,高職學生一般都不太適應傳統的概念演繹、邏輯推導的課堂教學方法,他們更適合范例學習、實踐學習和交往學習的方法。所以,在程序設計教學中采用“范例導向法”比較適合高職學生的學習風格特點。這里所謂“范例”指的是典型的實例程序。每一個范例程序都是某些C++語法規則同求解某種問題的算法緊密結合的產物。“范例導向法”就是通過對典型例程的分析和運行演示,講解蘊涵其中的概念,語法規則和算法,比較符合譚浩強教授在程序設計教學中提出的“提出問題——解決問題——歸納總結”的“新三步曲”法。“Decoder本”每一章節都詳舉完整例程,每一個概念、語法規則和算法都通過恰當例程闡釋。現將“Decoder本”與筆者手頭其他同類教材中所舉的部分章節的例程,進行比較,如表1所示。

由表一可以看出,“Decoder本”中的例程簡明、實用、有趣。例程不涉及高深數學(如積分求值、高次方程求根等)和復雜算法分析(如“漢諾塔”、“八皇后”等),降低了學習的難度,有利于學生克服畏難情緒、增強學習信心。例程貼近日常生活、貼近應用、貼近讀者,使學生樂學、易學。豐富的例程還很方便安排實踐教學,無論教師演示還是學生上機都可以信手拈來。比如,構造函數和析構函數是C++中的一個難點。為了說明析構函數的功能及其何時執行的問題,“Decoder本”舉出一個范例程序,程序中盒類(Box)的析構函數中加入輸出信息“Box is Destructed! ”。教師讓學生自行閱讀這個程序并上機實驗,觀察運行結果。然后師生共同討論,結果中為什么會有兩個析構函數的輸出信息?它們分別在何時執行?何以見得?緊接著改寫程序(刪除析構函數調用語句并在程序結束前插入輸出語句cout<<”End!”< 3.3從C/C++的普及化看“Decoder本”的“通俗化”特色 C++是當前軟件開發領域占主流的程序設計語言之一,它原本是專業程序員所掌握使用的高科技知識和技術。隨著信息技術的普及,現在C++正在成為各類高校普遍開設的課程,正是“舊時王謝堂前燕,飛入尋常百姓家。”在C++走下“神壇”回舊“大眾化”的過程,必然要求教材的表述形式脫下濃重的學術話語體系的外衣,而轉向通俗化,即盡量使用生活化的語言、確切生動的比喻、深入淺出地講解。讓我們看看“Decoder本”中對C++一些重要概念是如何論述的: 關于構造函數:“發現了嗎?構造函數的名稱居然與類一模一樣,這是一般函數與構造函數最大的差異所在”。 關于虛函數:“我們定義所有的animal(動物)都能call()(叫),也能eat()(吃),……但是所有動物call()及eat()的方式都不一樣,因此animal的call()及eat()都是virtual(虛)函數”。 關于友元函數:“日記是我們最私密的記錄,應該不允許其他人來隨意讀取。對于好朋友,我們是愿意將自己的秘密交給他的。……C++的類在設計函數時也有所謂的朋友函數,因為當中也有一些秘密數據是不希望讓外部程序隨意讀取的,但類的朋友卻可以讀取當中的秘密數據,這種叫作friend(友元)函數”。 以上的敘述是不是讀來倍感親切,讓人樂于接受? 讓我們再看看“Decoder本”怎樣用生動確切的比喻說明抽象的概念: “孤兒”:“沒有人會認得”——比喻使用內存動態分配(new)常會造成的內存中無法訪問的區域。 “超市成堆的蘋果”:“想要取出下方的蘋果,就必須將上方的蘋果先一一取出才行。”——比喻棧的“先進后出,后進先出”的存儲特性。 這樣的比喻是不是也會給人留下深刻印象呢? 有人擔心“Decoder本”這樣通俗的敘述比較“淺顯”、“學術水平不高”,其實這是一種誤解。“大音唏聲,大象無形”,“Decoder本”敘述通俗卻不乏深刻,比如書中動態數組及棧數組的范例程序都是有一定深度的程序,內地同類教材多未述及。究竟怎樣的教材才是“高水平”的呢?依據教材評價標準而非學術著作評價標準,真正高水平的教材(特別是基礎課教材)一定會是深入淺出的。教材的讀者對象是初學者,它一定要寫得使人容易讀懂、學懂,一定要經得起讀者和時間檢驗才算合格。眾所周知,在我國計算機普及教育二十多年的發展中,譚浩強教授開創了程序設計教材“大眾化”、“通俗化”的寫作新風。他的《BASIC語言》和《C程序設計》雙雙發行1000萬冊,創造了全球科技圖書出版的奇跡,其中的秘訣又是什么呢?譚浩強教授在回答出版界業內人士提問時說:“無非一個‘懂字,寫書的人必須要想到讀書的人,使他們能看得懂”。一個“懂”字,答案竟是如此言簡意賅而又發人深省。 4結論與啟示 綜上所述可以概括出下列結論: (1)“Decoder本”能夠取得教學實效的三個編寫特色是“基礎性”、“范例性”和“通俗化”。 (2) 程序設計的概念、方法是當代大學生必須具備的科學素質,因而程序設計應作為通識教育課程或專業基礎課程開設。 (3) 認清高職生的培養目標和學習風格特點,研究學生學習心理是提高高職教材編寫質量和教學質量的基礎。 (4) 通俗化的寫作風格是將程序設計教材“大眾化”的一個關鍵,編寫教材要緊緊圍繞“懂”字做文章。 5結束語 “Decoder本”美中不足之處是有些地方科學性略嫌不足、敘述稍嫌煩瑣。如“決策與循環”一章的累加程序,誤將累加器變量清零寫入循環體中(低級錯誤);“文件與流”一章的流類關系圖有畫錯之處等。又如“虛函數”和“純虛函數”兩個例程的語句重復太多(實際僅有兩處語句不同),如果是大陸版教材,往往僅給出一個完整的例程,后一個例程不重復寫,只指出與前者不同之處。 “瑕不掩瑜”,一本科學性、敘述表達等方面看似不夠嚴謹不夠精練的教材,使用起來卻比較順手,學生也容易接受,這說明各種類型的教材,“陽春白雪”和“下里巴人”都有各自適合的對象,而不必所有教材都按一個模式編寫,都以相同的面孔出現。中國鐵道出版社引進的教材,讓我們看了新面孔,讓我們有機會領略臺灣地區同行編寫高職教材的經驗,這對改變目前教材“計劃編寫”模式雷同的現狀有重要啟示作用。可以預料,通過“全國計算機教育論壇”建立一個內地與港澳臺地區甚至國外教材交流、互用和互授的機制,并在此基礎上開展程序設計教學的比較研究,將有助于推動程序設計教學取得新的突破。 參考文獻: [1] (美)Y.Daniel Liang. C++程序設計[M]. 王剛,等譯. 北京:機械工業出版社,2008.6 [2] 張曉峰. 臺灣職業技術教育的改革與發展及其對我們的啟示[J]. 職業技術教育,2001(25):52-55. [3] 王立天. 教育國際化的行與思——從臺灣銘傳大學國際學院信息科技運用學程談起[J]. 計算機教育,2008(3):7-9. [4] 由布西.“全納教育”視野下的“畢業設計”課程改革[J]. 中國大學教學,2007(4):51-53. [5] 劉瑞挺. 譚浩強教授的創作思想[J]. 計算機教育,2009(12):5-7. [6] 李江濤. 新時期圖書出版應大力弘揚科學精神和培養科學思維[J]. 計算機教育,2009(12):15-16.