章小莉 李曉東 王艷紅
摘要:“數(shù)據(jù)結(jié)構(gòu)”教學(xué)中如何提升學(xué)生編程能力,是教學(xué)難點(diǎn),設(shè)立課程設(shè)計(jì)是新培養(yǎng)方案中處理這一難點(diǎn)的常規(guī)做法。本文提出編程能力培養(yǎng)過(guò)程中,“抄”是新手上路的起點(diǎn),“會(huì)抄”是老手的技巧,“善抄”是高手的秘訣之“數(shù)據(jù)結(jié)構(gòu)”編程技能提升的教學(xué)新思路。
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);編程能力;抄寫(xiě);設(shè)計(jì)模式;集合框架
中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A
“數(shù)據(jù)結(jié)構(gòu)”課程自1968年成為計(jì)算機(jī)學(xué)科的專(zhuān)業(yè)基礎(chǔ)課程以來(lái),其講述的理論知識(shí)至今發(fā)展不多,但是教材卻在不斷更新,主要變化在于算法所用描述語(yǔ)言不斷追新。一定要追新?追新對(duì)編程能力培養(yǎng)有意義嗎?如何提高學(xué)生編程能力?值得教師深思,因?yàn)橹挥刑幚砗眠@一問(wèn)題,才可能在課堂上把教學(xué)內(nèi)容講得清楚,說(shuō)得明白,才可能讓學(xué)生學(xué)習(xí)時(shí)不糊涂,讓他們真地愛(ài)上“數(shù)據(jù)結(jié)構(gòu)”課程,在學(xué)習(xí)中提升編程能力,掌握快速編程的技巧。
1數(shù)據(jù)結(jié)構(gòu)課程難點(diǎn)
通?!皵?shù)據(jù)結(jié)構(gòu)”教材給出課程的教學(xué)目標(biāo)是“研究非數(shù)值計(jì)算的程序設(shè)計(jì)問(wèn)題中計(jì)算機(jī)的操作對(duì)象以及它們之間的關(guān)系和操作的學(xué)科”,與編程關(guān)系不明確。只有參考文獻(xiàn)[1]中開(kāi)門(mén)見(jiàn)山地指出“這是一本關(guān)于編程方面的書(shū)籍”。查閱各類(lèi)”數(shù)據(jù)結(jié)構(gòu)”課程教材發(fā)現(xiàn),數(shù)據(jù)結(jié)構(gòu)涉及的理論知識(shí)主要有:(1)關(guān)于非數(shù)值計(jì)算要解決的3大基本數(shù)據(jù)結(jié)構(gòu)——線(xiàn)性、樹(shù)型和圖形——的邏輯關(guān)系和兩種物理關(guān)系(順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)),(2)關(guān)于兩大常見(jiàn)應(yīng)用——查找與排序——的幾種基本算法理論。教材上對(duì)3類(lèi)數(shù)據(jù)結(jié)構(gòu)的主要操作和查找與排序算法進(jìn)行了代碼實(shí)現(xiàn),并討論實(shí)現(xiàn)代碼的時(shí)間復(fù)雜度和空間復(fù)雜度。這些內(nèi)容始終變化不太多。但是,教材卻在不斷更新,主要是算法描述語(yǔ)言在追新,從Pascal到C(C++)和Java。國(guó)內(nèi)教材即使是用C++描述的基本算法,其實(shí)現(xiàn)上也不一定是采取面向?qū)ο蟮木幊趟枷?。雖然Java語(yǔ)言提供了集合框架LinkedList、TreeSet類(lèi)等,可以大大降低基本算法的實(shí)現(xiàn),提高代碼的復(fù)用,但是目前在學(xué)校教學(xué)中真正使用集合框架的不多,因?yàn)榭蚣艿氖褂米屗惴ň幊虒?shí)現(xiàn)發(fā)生很大的改變,會(huì)轉(zhuǎn)移教學(xué)難點(diǎn)。所以,從算法思想描述上追新的必要性可以商榷。
“數(shù)據(jù)結(jié)構(gòu)”是“高級(jí)語(yǔ)言程序設(shè)計(jì)”的延伸,是從高級(jí)語(yǔ)言課程的學(xué)語(yǔ)句、語(yǔ)法,走向求解實(shí)際問(wèn)題的過(guò)程。對(duì)學(xué)生來(lái)說(shuō),學(xué)習(xí)第一門(mén)編程語(yǔ)言時(shí),常?;ê芏嗟木ρ芯空Z(yǔ)言使用的符號(hào)、語(yǔ)法、語(yǔ)言環(huán)境,忽略實(shí)際問(wèn)題的分析與求解。在不斷壓縮的理論課時(shí)面前,面向過(guò)程的模塊化思想訓(xùn)練有限。而在“面向?qū)ο蟪绦蛟O(shè)計(jì)”課程中又很難涉及到數(shù)據(jù)結(jié)構(gòu)的集成框架介紹。如此之基礎(chǔ)上,學(xué)生學(xué)習(xí)“數(shù)據(jù)結(jié)構(gòu)”時(shí),鑒于非數(shù)值計(jì)算問(wèn)題解決過(guò)程復(fù)雜,算法代碼量提升快,由十幾行突然猛增到幾十行,甚至好幾百行。尤其,當(dāng)強(qiáng)調(diào)模塊劃分時(shí),子程序數(shù)量會(huì)達(dá)到十幾至二十幾個(gè)。這種“大規(guī)?!钡某绦蜷_(kāi)發(fā),往往使學(xué)生陷入一堆語(yǔ)法錯(cuò)誤的處理中,忽略知識(shí)本身的學(xué)習(xí)。教學(xué)中,放棄實(shí)踐環(huán)節(jié),則肯定不可能。畢竟探究“數(shù)據(jù)結(jié)構(gòu)”課程的本質(zhì),還是在培養(yǎng)學(xué)生編程,以解決非數(shù)值計(jì)算的能力。
由于教材上給出的只是基本算法模塊,代碼量只有幾行,一種數(shù)據(jù)結(jié)構(gòu)的知識(shí)連貫性不明顯,學(xué)生通讀課本時(shí)不容易理解這些基本算法的實(shí)際作用。教材上列舉的實(shí)際應(yīng)用例子解決的都是小問(wèn)題。而實(shí)際需要中,無(wú)論是游戲軟件,還是編譯、操作系統(tǒng)、數(shù)據(jù)庫(kù)等大型計(jì)算機(jī)系統(tǒng)軟件都與數(shù)據(jù)結(jié)構(gòu)知識(shí)緊密相關(guān)。教材與實(shí)際的脫節(jié),難于提起學(xué)生的學(xué)習(xí)興趣,也是教學(xué)的一大難點(diǎn)。
2拉近理論與實(shí)踐距離的探索
實(shí)踐環(huán)節(jié)可以幫助學(xué)生理解和消化理論知識(shí)點(diǎn),并且使學(xué)生自己動(dòng)手編程解決實(shí)際問(wèn)題。為了不同層次的學(xué)生都能自己動(dòng)手做實(shí)驗(yàn),實(shí)踐內(nèi)容分層設(shè)立教學(xué)目標(biāo)。
初級(jí):驗(yàn)證型實(shí)驗(yàn)。本著自己動(dòng)手練習(xí)一遍,以幫助理解理論知識(shí)點(diǎn)的目的,依據(jù)理論學(xué)習(xí),設(shè)置驗(yàn)證型題目。如線(xiàn)性結(jié)構(gòu)應(yīng)用題目有:教材43頁(yè)的多項(xiàng)式相加的實(shí)現(xiàn);53頁(yè)的10以?xún)?nèi)數(shù)據(jù)的表達(dá)式求值等。這類(lèi)題目的主要算法已經(jīng)在課堂上詳細(xì)講述,所以學(xué)生在實(shí)驗(yàn)中的任務(wù)就是把教學(xué)內(nèi)容驗(yàn)證一遍。
這類(lèi)實(shí)驗(yàn)題目比較合適前導(dǎo)課程“高級(jí)語(yǔ)言程序設(shè)計(jì)”學(xué)得不好的學(xué)生,他們不會(huì)因?yàn)檎Z(yǔ)言基礎(chǔ)差,又需要理解很多“數(shù)據(jù)結(jié)構(gòu)”的內(nèi)容,而難于自己動(dòng)手。但是對(duì)于成績(jī)好的學(xué)生,顯然,訓(xùn)練力度太小。
中級(jí):擴(kuò)展型實(shí)驗(yàn)。這是為有一定能力進(jìn)行程序設(shè)計(jì)的學(xué)生設(shè)置。實(shí)驗(yàn)題目主體內(nèi)容與初級(jí)要求相同,結(jié)果卻要求更多。如整型數(shù)或?qū)嵭蛿?shù)表達(dá)式計(jì)算、多項(xiàng)式相乘等。學(xué)生在完成初級(jí)題目的基礎(chǔ)上,做適當(dāng)?shù)臄U(kuò)充能達(dá)到中級(jí)要求。
高級(jí):設(shè)計(jì)型實(shí)驗(yàn)。這類(lèi)題目主要是針對(duì)程序設(shè)計(jì)能力強(qiáng)、有自我發(fā)揮愿望的學(xué)生設(shè)置。題目本身的內(nèi)容與生活貼切,如“超市大贏(yíng)家”電視節(jié)目中的猜商品價(jià)格、計(jì)算機(jī)與人對(duì)弈五子棋等。學(xué)生必須獨(dú)立分析問(wèn)題和設(shè)計(jì)問(wèn)題。
分層設(shè)立教學(xué)目標(biāo)的優(yōu)點(diǎn)是:不同學(xué)習(xí)能力的學(xué)生都有機(jī)會(huì)實(shí)際動(dòng)手,每個(gè)人都有可以獨(dú)立完成實(shí)驗(yàn)的空間。
3 “抄”的由來(lái)、作用與方法
具體教學(xué)實(shí)施中發(fā)現(xiàn),實(shí)驗(yàn)內(nèi)容設(shè)置的良好愿望未必能激發(fā)學(xué)生的學(xué)習(xí)興趣,跨不過(guò)自己能編碼的這道“鴻溝”,學(xué)生的學(xué)習(xí)興趣依然不高。究其原因是教材上的理論與實(shí)踐題目,尤其是高級(jí)目標(biāo)題目離得太遠(yuǎn)。新問(wèn)題是如何跨越“鴻溝”?
抄作業(yè)、抄實(shí)驗(yàn)是時(shí)下校園里很常見(jiàn)的現(xiàn)象,教師如何引導(dǎo)學(xué)生以杜絕抄襲?懲罰!沒(méi)見(jiàn)本質(zhì)上的改變;放任!肯定不可取。鑒于“數(shù)據(jù)結(jié)構(gòu)”教材上的知識(shí)是基本操作的實(shí)現(xiàn),在實(shí)際問(wèn)題求解中引用這些知識(shí)點(diǎn)可獲得較好的結(jié)果,因此在教學(xué)中,提出可以“抄”。課堂上注重分析不同代碼之間的異同點(diǎn),如教材24頁(yè)線(xiàn)性表結(jié)點(diǎn)插入和刪除算法中,移動(dòng)元素代碼是相同的,不同是前一算法插入一個(gè)元素,后一算法刪除一個(gè)元素。再如,“數(shù)據(jù)結(jié)構(gòu)”中每種結(jié)構(gòu)定義一個(gè)抽象數(shù)據(jù)類(lèi)型,分析它們的相同和不同,再進(jìn)一步對(duì)比它們的實(shí)現(xiàn)代碼的異同點(diǎn),學(xué)生會(huì)發(fā)現(xiàn):基本操作相同的不同數(shù)據(jù)結(jié)構(gòu)之間,其基本算法實(shí)現(xiàn)有很多相同點(diǎn),從而理解教師說(shuō)的:“抄襲不是copy,而是理解了之后的copy and rewrite”,是根據(jù)情況找到一段功能相似的代碼,按需要修改,而不是亂抄、瞎抄。教師平時(shí)在作業(yè)批改中,注意區(qū)分兩類(lèi)不同性質(zhì)的“抄”,對(duì)亂抄提出批評(píng),介紹如何判斷亂抄。在實(shí)驗(yàn)中,給出數(shù)據(jù)結(jié)構(gòu)基本操作算法的可調(diào)用代碼,讓學(xué)生直接引用,以便他們有精力關(guān)注待求解問(wèn)題的核心內(nèi)容。
“抄”的點(diǎn)子源于學(xué)習(xí)與工作的體會(huì)——大量實(shí)例的閱讀與積累,可以提高工作效率。也源于“數(shù)據(jù)結(jié)構(gòu)”課程本身的特點(diǎn),樹(shù)型結(jié)構(gòu)和圖形結(jié)構(gòu)中,核心算法思想只有“遍歷”,其他關(guān)于這兩大類(lèi)結(jié)構(gòu)的基本算法都是遍歷算法的變形和應(yīng)用。實(shí)際教學(xué)中,對(duì)比遍歷算法和實(shí)際應(yīng)用問(wèn)題求解的核心思想,分析“抄”的作用。
“抄”的作用非常強(qiáng)大。現(xiàn)在市場(chǎng)上有很多“百例”書(shū)籍,給出各種典型應(yīng)用問(wèn)題的設(shè)計(jì)思想與實(shí)現(xiàn)代碼。學(xué)生在實(shí)習(xí)、課程設(shè)計(jì)以及畢業(yè)設(shè)計(jì)中需要完成的任務(wù),雖然與這些典型實(shí)例不相同,但是若干典型實(shí)例具體求解的局部思想完全可以借鑒和參考。因此,在指導(dǎo)實(shí)習(xí)與實(shí)驗(yàn)中,建議學(xué)生找到與求解問(wèn)題的最接近解,以之為核心,逐步修改或擴(kuò)展,完成任務(wù)。這種方法比完全從空白開(kāi)始設(shè)計(jì)到代碼編寫(xiě)更快,結(jié)果常常也相對(duì)更好。
“抄”是否會(huì)阻礙學(xué)生創(chuàng)新能力的發(fā)揮呢?回答是:不會(huì)!因?yàn)樘岢氖菫槲宜玫摹俺?是理解之后依據(jù)需要合理的“抄”,是圍繞自己求解問(wèn)題的主題思想來(lái)抄。這種學(xué)習(xí)方法,“抄”僅僅是一個(gè)用詞而已,實(shí)質(zhì)是“參考”和“復(fù)用”。但是對(duì)學(xué)生來(lái)說(shuō),教師提倡他們“參考”,他們會(huì)有畏難情緒,感覺(jué)學(xué)不會(huì)。改用“抄”一詞,從心理上給他們簡(jiǎn)單容易、順手拈來(lái)的感覺(jué),更利于引導(dǎo)他們自信地自己動(dòng)手解決問(wèn)題。例如,在“線(xiàn)性結(jié)構(gòu)應(yīng)用”實(shí)驗(yàn)中有題目“求解兩個(gè)多項(xiàng)式之間的相乘C(x)=A(x) *B(x)”,分析題目要求可知,復(fù)用教材第2章多項(xiàng)式相加算法,再在調(diào)用復(fù)用代碼前編程子算法得到first(x)(A(x)前一項(xiàng)與B(x)之積)和second(x)(A(x)后一項(xiàng)與B(x)之積),就可以實(shí)現(xiàn)實(shí)驗(yàn)要求。實(shí)驗(yàn)指導(dǎo)中提示學(xué)生用連續(xù)加法完成乘法的思想,他們自己就能很好地復(fù)用教材代碼。再如,教材上“圖結(jié)構(gòu)”內(nèi)容雖然和“樹(shù)結(jié)構(gòu)”一樣主算法是“遍歷”,樹(shù)結(jié)構(gòu)中應(yīng)用主要是直接修改遍歷算法中的“訪(fǎng)問(wèn)”語(yǔ)句,圖結(jié)構(gòu)的最小生成樹(shù)、拓?fù)渑判虻葐?wèn)題卻不是直接調(diào)用遍歷算法,而是另外編寫(xiě)代碼,然而分析代碼可以發(fā)現(xiàn),它們貫穿的是遍歷思想。所以在“圖結(jié)構(gòu)”授課之后的章節(jié)小結(jié)中圍繞“遍歷”算法,分析其他應(yīng)用算法實(shí)現(xiàn)中如何用遍歷思想,有利于學(xué)生在完成圖相關(guān)的“城市巡游”“星球大戰(zhàn)”等實(shí)驗(yàn)題目編碼時(shí),參考“遍歷”算法實(shí)現(xiàn)的方法。
4高手“抄襲”之門(mén)道
“抄襲”可以說(shuō)也是計(jì)算機(jī)業(yè)界的行規(guī)。面向?qū)ο笤O(shè)計(jì)是現(xiàn)在軟件開(kāi)發(fā)的重要方法,其目標(biāo)是提高代碼的復(fù)用率。而復(fù)用的更高境界是設(shè)計(jì)模式。C. Alexander說(shuō)過(guò):“每一個(gè)模式描述了一個(gè)在我們周?chē)粩嘀貜?fù)發(fā)生的問(wèn)題,以及該問(wèn)題的解決方案的核心思想。這樣,就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)”。設(shè)計(jì)模式,實(shí)現(xiàn)了同類(lèi)問(wèn)題求解的思維方式的共享。用通俗的話(huà)來(lái)說(shuō),使用設(shè)計(jì)模式就是“抄襲”他人求解問(wèn)題的思想。在面向模式的軟件體系結(jié)構(gòu)一書(shū)中,歸納了常見(jiàn)的軟件體系結(jié)構(gòu),并給出了這些軟件實(shí)現(xiàn)的設(shè)計(jì)模式思想。一個(gè)編程高手,必然會(huì)對(duì)設(shè)計(jì)模式有深入的了解,并在自己的編碼工作中使用各種設(shè)計(jì)模式實(shí)現(xiàn)框架來(lái)搭建自己任務(wù)的程序代碼架構(gòu),隨后按任務(wù)的要求編寫(xiě)必要的模塊代碼。如Struts和Hibernate框架在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的開(kāi)發(fā)中被廣泛使用。如今作為計(jì)算機(jī)軟件工程方向的專(zhuān)業(yè)課程——《軟件工程》——就在軟件設(shè)計(jì)中包含了“復(fù)用設(shè)計(jì)”,全方位的介紹組件、應(yīng)用框架和設(shè)計(jì)模式的復(fù)用。
Java語(yǔ)言集合框架以幾個(gè)相關(guān)的組件:接口、抽象類(lèi)和完全定義的類(lèi),對(duì)基本數(shù)據(jù)結(jié)構(gòu)進(jìn)行了實(shí)現(xiàn),如List、Set、Collection等接口,ArrayList、LinkedList、HashSet、HashMap等類(lèi),這些集合框架在具體用Java語(yǔ)言做數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)時(shí)可以直接導(dǎo)入(import)引用,大大縮小了編碼量。當(dāng)然,集合框架具有軟件特性:邏輯產(chǎn)品,不可見(jiàn)。因此,對(duì)新手來(lái)說(shuō),有一定的使用難度。不過(guò),集合框架從旁證明了:如今不該再?gòu)牧汩_(kāi)始編寫(xiě)問(wèn)題求解代碼,而應(yīng)該首先“抄”一段來(lái),再下手改,以達(dá)到問(wèn)題的快速求解。
5小結(jié)
每個(gè)計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生必須具備編程能力,學(xué)校知識(shí)的學(xué)習(xí)只是進(jìn)入編程的起點(diǎn),掌握各類(lèi)問(wèn)題的程序設(shè)計(jì)方法,是教師和學(xué)生共同需要完成的任務(wù)。本文提出的“數(shù)據(jù)結(jié)構(gòu)”課程中編程能力培養(yǎng)的教學(xué)方法,意在探索如何快速提高學(xué)生編程能力、訓(xùn)練學(xué)生編程思維。
參考文獻(xiàn):
[1] [美]William J. Collins.數(shù)據(jù)結(jié)構(gòu)和Java集合框架[M]. 陳曙暉,譯.北京:清華大學(xué)出版社,2006.
[2] 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)[M].北京:清華大學(xué)出版社,1997.
[3] [美]Erich Gamma, Richard Helm.設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M]. 李英軍,等譯.北京:機(jī)械工業(yè)出版社,2000.
[4] [英]Ian Sommerville.軟件工程[M]. 程一劍,等譯.北京:機(jī)械工業(yè)出版社,2005.
[5] [德]Frank Buschmann, Regine Meunier.面向模式的軟件體系結(jié)構(gòu)(I):模式系統(tǒng)[M]. 賁可榮,等譯.北京:機(jī)械工業(yè)出版社,2005.
Debating on “Copying and Rewriting rather than Plagiarizing ”
——Exploring A Way to Improve Students Ability for Program in Teaching of Data Structure
ZHANG Xiao-li; LI Xiao-dong; WANG Yan-hong
(Department of Computer Science and Technology, Beijing Electronic Science and Technology Institute, Beijing 100070, China)
Abstract: A Difficulty in the teaching of Data Structure is how to improve students ability for programming. Course Design is a frequent way that can overcome this difficult in new educating project. The paper shows “Copying and rewriting rather than plagiarizing” is a way that can improve the students programming capability while they study Data Structure. Authors deem that “copy” is a jumping-off point for novice, “able to copy” is a skill for veteran, and “be good at copy” is recipe for master-hand.
Key words: Data Structure; program; copy; design model; collections framework