[摘 要]計算機專業課程知識間的聯系是天然存在的,但由于種種原因,在實際教學中這種聯系有時變得有點疏遠,不利于學生學習。文章提出采用計算機課程全息教學法,以解決具體工程問題為線索,更明確地將知識間的關系展現給學生,可提高學生的學習效率,幫助學生加快對專業課程知識的融會理解,避免知識的碎片化。
[關鍵詞]全息教學 計算機課程 課程體系 字符串處理
[中圖分類號] G642 [文獻標識碼] A [文章編號] 2095-3437(2013)05-0108-04
計算機專業的畢業生找工作時,招聘單位常常會問一些簡單的實際工程問題,以判斷學生的實際經驗與動手能力。[1]面試過后,學生往往會沮喪地說我學過某門課,但這個問題我就是不知道如何解決。造成這種現象的原因,除了實際工程經驗缺乏之外,課程知識是否融會貫通也是其中一個原因。計算機領域某些實際工程問題的解決往往需要綜合計算機專業的各門專業課知識,需要對計算機體系有完整透徹的理解,猶如醫生看病,沒有對人體系統以及生命機理的深入理解,就不可能找出準確有效的治療方案,頭疼醫頭、腳疼醫腳的謬誤就在所難免。因此,為了更高效地幫助學生深入把握計算機系統的整體機制,本文總結已有的教學經驗,提出計算機課程全息教學法這一教學理念。
(一)字符串的簡單使用
在這一階段,學生的知識不能學得太深入,但教師在授課時可簡略地以計算機系統為背景提一下字符串的構成與操作實現技術,可讓學生對以后的課程有一個心理預期和準備。
(二)字符串的結構與存儲
在數字邏輯課程中,有關ASCII編碼與多字節字符編碼的知識徹底讓學生理解字符編碼構成,單字節字符的處理以及雙字節字符的構成與處理。這時適當讓學生做一做如何處理中英文混合字符串的練習,可加深他們的理解,比如:如何取得中英文混合字符串中的中文字符的個數?
當然這時還必須告訴學生,在不同的編程語言中,由于編譯器的設計不一樣,字符串數組的存儲結構是不一樣的。比如,傳統的C語言的字符串是一個以NULL字符結束的字符數組,NULL的ASCII編碼是0,也就是說C語言的字符串以0作為結束符。在PASCAL中,字符串也是一個數組,但其構成與C不一樣,數組的第一個字節存儲的是字符串的長度,之后才是字符序列。圖2是字符串“He travels alone.”在C與PASCAL中的存儲結構。
C字符串
字符串的存儲結構不一樣,那么字符串的處理方法也就不一樣,比如要獲取一個字符串的長度,在PASCAL中是很簡單的,只要讀字符串的首字節中的數字就可以了,而在C語言中就是一個比較麻煩的問題了。
另外,不同的編譯器對字符串數組在內存中的存儲區分配也是不一樣的。比如32位的編程語言中,Delphi的字符串的首地址能被4整除,而Visual C++卻不能。字符串的首地址為4的整數倍,可方便快速地按每單元4個字節對字符串進行處理。這和CPU與存儲器間的總線讀取有關系,32位的微計算機中,地址總線為32位,數據總線至少是32位的,存儲器最小存儲單位為字節,CPU尋址時以4個字節為一單元(從0開始編址),一個讀操作可以讀4個字節的數據,如果某4個字節數據的首地址是4的倍數,一個讀操作就可讀完這4個字節,如果不是,4個字節數據就會分布在臨近的兩個不同的單元中,CPU需要做2次讀操作,數據的處理就會慢一倍。Delphi的編譯器考慮到了這種情況,自動優化了字符串的存儲分配,而Visual C++的編譯器沒有這樣做,Visual C++的字符串操作函數必須檢查字符串首地址是否是4的倍數并做優化處理。
要理解以上問題,學生還需再深入地了解計算機的體系結構才行,此時教師可對學生做更深入的引導,大略地提及總線結構、CPU指令對程序效率的影響,為后續課程學習打下伏筆。
(三)字符串處理的優化
了解了字符串的構成,并具備計算機體系結構、CPU構架、匯編指令等知識后,學生可能就不太滿足編程平臺提供的現有的字符串處理函數,嘗試自己設計或改進字符串的處理函數。下面我們用一個實驗來說明這個問題。
數據處理的過程中,要大量重復地調用到開發語言運行庫的串操作或內存塊操作函數,比如strlen、strend、memcopy等。由于這些函數都是開發語言的通用庫函數,開發工具廠商一般采用匯編代碼來實現這些函數,以保證獲取最高的運行效率。在我們常用的PC機上,由于X86CPU的構架在不斷的演進,不同廠商的CPU對指令集的實現效率也不一樣,這樣導致這些函數在最新的CPU上或在特定的CPU上的運行效率不能達到最好,甚至還會降低。[3]比如,雖然都是遵循IA-32和Intel64(AMD64)構架,但Intel和AMD各自的CPU微構架不同,而且同一廠家不同代的CPU的微構架也是不一樣的,必然導致對不同指令的執行效率的不同,有的相差還特別大。比如表1和圖2是5種strlen函數的實現版本的對比試驗。strlen函數的功能是:盡可能快地掃描到C語言字符串的結尾標志-0,并計算字符串長度。
雖然這幾個函數并不支持雙字節字符串,但本實驗的測試字符串為“流量測試數據集”,目的是同時檢查函數對字符串中的多字節字符的處理情況。
通過具體分析函數的代碼實現,我們可進一步發現:
1.有些指令在不同的CPU構架上的執行效率有很大的差別。
2.采用簡單指令比采用復雜指令有時更有利于程序效率的提高。
3.CPU微構架的改進可能導致以前的代碼優化策略失效,甚至起反作用。
顯然要做到在CPU層面的程序優化,學生除了要知道字符串的結構外,還必須非常熟悉微計算機系統、X86CPU的構架、匯編指令等內容。
而算法級的優化就得借助于數據結構方面的知識了。
二、全息教學法
(一)全息教學法的作用
由以上分析我們可知,由于計算機是一個系統的體系,與字符串操作有關的課程知識其實是緊密相關的,課程之間借助字符串操作這一實際問題,可以幫助學生將前后知識融會貫通。但實際上,由于教學中每門課程的老師都不一樣,且教學風格迥異,要做到這一點,有點困難,學生往往在學后面的課程時就將先前課程的內容忘得差不多了,學到的知識零散感很強,而孤立的知識是很容易遺忘的。如果教師能把每門課的內容或某些問題置于一個完整的計算機系統中來講敘,上課時教師心底有一個計算機系統的全息影像,將某個實際問題當做一條線將散落的計算機知識串起來,就能更好地幫助學生進行知識的融會理解。一旦知識間建立起聯系就不再容易被遺忘了。
簡而言之,全息教學法就是:提倡教師在具體的教學過程中,采用全局的視角,將課程的內容置于一個計算機系統的背景下,仿佛每門課中都能依稀看到一個全息的計算機系統影像。這樣,前面的課程就能給后面的課程做好鋪墊,后面的課程則可主動聯系前面以及相關課程,課程間有著有效的相互呼應,學生學到的知識也就變“活”了。
我們知道,在一個嚴格的臨床醫生培訓體系中,不同臨床專業的學生必須經歷一個較長的通科實習的階段,以保證對其他專科的知識的了解,在此基礎上再進入專科醫生學習層面。因為人體是一個系統,只有在對人體有系統把握的前提下做到的術業有專攻才是真正有效的。其實就學習而言,任何專業知識要學通,不僅要打通任督二脈,還需打通七經八絡,從而達到氣息通暢、游刃有余的狀態。在全息教學體系下,計算機專業的學生可明確地感受到對字符串的處理所用到的不同層面知識間的相互關系,在老師的幫助下打通七經八絡。反過來,如果學生能自如地綜合運用相關知識來解決字符串處理中的實際問題,這說明他的相關課程知識已經融會貫通了。
(二)其他工程問題
當然,也有很多其他工程問題,也可以適用于計算機課程全息教學,比如數據庫的設計與優化。數據庫的存儲與查詢效率也是一個工程中經常要解決的問題,特別是現在網絡高速發達和云計算開始流行的時代。這一問題的解決要從以下幾個層面入手:
存儲硬件層面:硬盤與存儲系統構架
網絡層面:網絡接口與構架
操作系統層面:操作系統磁盤讀寫優化,進程優化
數據庫層面:數據庫管理優化與庫表設計優化
相關的課程知識有:數據庫設計與管理、計算機系統與結構、計算機接口、操作系統、網絡等。
(三)課程內容與計算機體系掛鉤
對于某些基礎課,直接將課程知識置于一個計算機系統的框架下,效果就更好。比如數字邏輯。如果只抽象地講授數字邏輯的知識,學生特別是軟件專業或信息安全專業的學生有時會很納悶:我為什么要學這門課,似乎數字邏輯與軟件或網絡并沒有直接關系啊?殊不知,數字邏輯是計算機的基礎,沒有計算機,軟件與網絡又如何存在呢?正可謂皮之不存,毛將焉附。試想看一個對安全技術、網絡理論頭頭是道的人,一旦問題出現在硬件層面就干瞪眼,多少會有“書到用時方恨少”的感覺吧?將數字邏輯的知識與計算機的基本構架結合在一起學習,學生會更有興趣,感覺更有意義,頭腦中的概念也會更明確些,也可為后續課程做更好的鋪墊。
三、總結
總結教學經驗,從實際的工程問題入手,本文提出計算機課程全息教學這一教學理念,該理念有助于學生加快對專業知識的融會理解。本質上,計算機課程知識間的聯系是天然存在的,但由于種種原因,在實際教學中這種聯系有時變得有點疏遠,不利于學生學習,全息教學法主張教師以解決具體工程問題為線索,更明確地將知識間的關系展現給學生,提高學生的學習效率。當然,每門課的實際情況不一樣,具體運作則需任課教師依具體課程內容來操作、實現,本文僅起拋磚引玉之用。
[ 參 考 文 獻 ]
[1] 北京應屆畢業生求職調查結果[J/OL].新華網,[2008-02-26]. http://news.xinhuanet.com/politics/2008-02/26/content_7672798.htm
[2] Randal E. Bryant and David R. O'Hallaron.Computer Systems: A Programmer's Perspective[M]. Prentice Hall,2003,ISBN 0-13-034074-X.
[3] 楊全勝.現代微機原理與接口技術[M].電子工業出版社,2004.
[4] 朱德軍.計算機字符串處理方法淺談[J].計算機光盤軟件與應用,2012,(12).
[5] 楊揚.淺議計算機字符串的使用[J].計算科學,2010,(10).
[責任編輯:左 蕓]