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