胡傳福
(東莞理工學(xué)院 計(jì)算機(jī)學(xué)院,廣東東莞 523808)
如今大學(xué)對(duì)大學(xué)生專業(yè)能力的培養(yǎng)基本上是通過(guò)一系列單門的課程來(lái)實(shí)施和完成的。課程之間存在一定的聯(lián)系——時(shí)間上有先有后,空間內(nèi)容上有先行后繼,知識(shí)點(diǎn)上也必然存在著一定的交叉。在實(shí)際教學(xué)過(guò)程中,對(duì)各門課程進(jìn)行管理,以單門課程作為培養(yǎng)目標(biāo),制定課程計(jì)劃并對(duì)教學(xué)內(nèi)容進(jìn)行取舍,會(huì)在學(xué)生的專業(yè)能力培養(yǎng)這個(gè)總的高度上顯現(xiàn)出局限性和不足。如果以課程群的概念來(lái)建立課程體系,充分利用課程間的內(nèi)在聯(lián)系和邏輯性,把屬于同一目標(biāo)的一系列課程當(dāng)作一個(gè)有機(jī)的整體來(lái)看待,讓各課程相互配合,那么既能加深課程間內(nèi)在的關(guān)系,在教學(xué)效果上又能起到相互促進(jìn)的作用[1]。
課程群是一系列內(nèi)容密切相關(guān),有先行后繼關(guān)系的課程的集合,一般屬于同一學(xué)科,甚至同一專業(yè)。通過(guò)對(duì)同一學(xué)科課程體系的研究,探索課程內(nèi)容及課程間的先行后繼關(guān)系,合理安排教學(xué)內(nèi)容進(jìn)行課程群建設(shè),易于打通各課程的知識(shí)結(jié)構(gòu),使得課程間前后連貫,從而獲得整體的良好教學(xué)效果。
程序設(shè)計(jì)能力是計(jì)算機(jī)專業(yè)培養(yǎng)的學(xué)生主要技能,也是檢驗(yàn)計(jì)算機(jī)專業(yè)教師教學(xué)效果和學(xué)生學(xué)習(xí)效果的主要依據(jù)。因此,對(duì)程序設(shè)計(jì)的認(rèn)知,對(duì)教與學(xué)雙方來(lái)說(shuō)都顯得尤為重要。迄今為止,還沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)來(lái)對(duì)程序設(shè)計(jì)能力進(jìn)行評(píng)判。
傳統(tǒng)的教學(xué)模式比較單一,大多圍繞兩三門語(yǔ)言類課程教學(xué),先從理論上介紹程序設(shè)計(jì)語(yǔ)言、語(yǔ)法、語(yǔ)義、程序的結(jié)構(gòu)、程序邏輯等,然后再讓學(xué)生對(duì)課本上的案例進(jìn)行驗(yàn)證[2]。教學(xué)過(guò)程顯得枯燥無(wú)味,需要學(xué)生以莫大的興趣與熱情才有可能學(xué)好。絕大部分學(xué)生缺乏學(xué)習(xí)的積極性與主動(dòng)性。依筆者十幾年的教學(xué)經(jīng)驗(yàn)表明,個(gè)別有熱情與毅力的同學(xué)可能達(dá)到理想的學(xué)習(xí)效果,但大部分學(xué)生學(xué)與沒(méi)學(xué)的區(qū)別不是很大。
課程群建設(shè)是專業(yè)建設(shè)的一部分。對(duì)于東莞理工學(xué)院這類以“立足東莞、培養(yǎng)新型應(yīng)用型人才”為目標(biāo)的新型地方高校來(lái)說(shuō),制訂培養(yǎng)方案時(shí)應(yīng)找準(zhǔn)專業(yè)定位、行業(yè)現(xiàn)狀和發(fā)展前景,這樣才能明確教學(xué)知識(shí)點(diǎn)、所需課程以及課程群的大致內(nèi)容。同時(shí),課程群建設(shè)應(yīng)當(dāng)以課程的知識(shí)組合、融合為線索,對(duì)各個(gè)課程的教學(xué)、實(shí)驗(yàn)大綱等內(nèi)容進(jìn)行全盤設(shè)計(jì)。針對(duì)應(yīng)用型人才的培養(yǎng)目標(biāo),程序設(shè)計(jì)課程群應(yīng)以“程序設(shè)計(jì)”為中心,注重理論與實(shí)踐相結(jié)合的方法,走“從實(shí)踐入手—上升到理論高度—再指導(dǎo)設(shè)計(jì)實(shí)踐”的路子。通過(guò)實(shí)踐吸引、試驗(yàn)來(lái)先對(duì)學(xué)生學(xué)習(xí)興趣進(jìn)行培養(yǎng),在不斷實(shí)踐的過(guò)程中讓學(xué)生體會(huì)到程序設(shè)計(jì)的方法,慢慢加深學(xué)生對(duì)程序設(shè)計(jì)理論的理解。教學(xué)內(nèi)容上,應(yīng)當(dāng)先以驗(yàn)證、模仿為主,通過(guò)不斷的實(shí)踐,使學(xué)生逐漸體會(huì)程序設(shè)計(jì)的方法,從而獲得、增強(qiáng)學(xué)生學(xué)習(xí)程序設(shè)計(jì)的樂(lè)趣,讓他們漸漸把程序設(shè)計(jì)當(dāng)成一門藝術(shù)而不是枯燥無(wú)味的數(shù)字編碼。在具備了一定的經(jīng)驗(yàn)和方法后,重點(diǎn)放在對(duì)問(wèn)題的理解、分析與設(shè)計(jì)上,要求首先能夠理解具體的問(wèn)題,然后對(duì)具體問(wèn)題進(jìn)行分析,再后找出程序設(shè)計(jì)的相關(guān)元素,設(shè)計(jì)出針對(duì)性的具體的解決方案,最后再用當(dāng)前比較流行的主流開發(fā)工具去驗(yàn)證。在學(xué)習(xí)過(guò)程中,將理解問(wèn)題、分析問(wèn)題、解決問(wèn)題相結(jié)合,使得學(xué)生不斷加深對(duì)程序設(shè)計(jì)的認(rèn)識(shí)。當(dāng)學(xué)生熟練掌握這一過(guò)程之后,對(duì)程序設(shè)計(jì)理論的學(xué)習(xí)就沒(méi)有多大問(wèn)題了。
《程序設(shè)計(jì)》類課程學(xué)習(xí)的重點(diǎn)就是“程序設(shè)計(jì)”,即采用一定的技術(shù)實(shí)現(xiàn)所設(shè)計(jì)的內(nèi)容。實(shí)現(xiàn)設(shè)計(jì)的技術(shù)有很多,逐一介紹既無(wú)效果也不太現(xiàn)實(shí)。采用“觸類旁通、舉一反三”的教學(xué)思路,重點(diǎn)掌握一種工具、獲一門相關(guān)技術(shù)即可,對(duì)其他技術(shù)稍微提及,開動(dòng)學(xué)生的積極性與主動(dòng)性,讓他們自己摸索,即能減輕教師的負(fù)擔(dān),又符合對(duì)人才培養(yǎng)的需求。常用的程序設(shè)計(jì)教學(xué)語(yǔ)言有很多,在課程群建設(shè)中應(yīng)當(dāng)內(nèi)容連貫,避免重復(fù),力求課程間的融合、促進(jìn)、加深,但也要兼顧實(shí)現(xiàn)技術(shù)的由淺入深,循序漸進(jìn)。因此在課程的選擇上,精必選取四至五門即可。理論與實(shí)踐的比例要根據(jù)學(xué)生的能力和進(jìn)度進(jìn)行調(diào)整,新生剛開始接觸編程工具,可能需要多點(diǎn)時(shí)間來(lái)適應(yīng),一學(xué)期乃至一年以后,可以適當(dāng)降低實(shí)踐教學(xué)的比例,同進(jìn)鼓勵(lì)學(xué)生利用課余時(shí)間自主進(jìn)行實(shí)踐學(xué)習(xí)。
對(duì)于不同課程之間內(nèi)容相同或相似部分的處理方式最能體現(xiàn)課程群的優(yōu)勢(shì)。對(duì)相同的概念的介紹能夠讓課程相互促進(jìn),使得概念更加清晰,而類似的概念就需要做適當(dāng)?shù)娜∩?。從教學(xué)目標(biāo)來(lái)說(shuō),程序設(shè)計(jì)課程群的教學(xué)核心目標(biāo)是讓學(xué)生至少熟練掌握一門編程語(yǔ)言及其相關(guān)開發(fā)工具的使用,并能深刻理解程序設(shè)計(jì)思想,主要是面向?qū)ο蟪绦蛩枷?、面向?qū)ο蟮姆治龇椒ā⒚嫦驅(qū)ο蟪绦蛟O(shè)計(jì)技術(shù)以及面向?qū)ο蟮脑瓌t與理論。
東莞理工學(xué)院程序設(shè)計(jì)課程群主要包括《C語(yǔ)言程序設(shè)計(jì)》、《面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)》、《Java語(yǔ)言程序設(shè)計(jì)》、《數(shù)據(jù)結(jié)構(gòu)與算法》、《Java EE編程技術(shù)》。課程群以實(shí)踐教學(xué)為主線,主要培養(yǎng)地方普通本科院校學(xué)生編程創(chuàng)新能力。
課程群中各課程內(nèi)容安排如表1:
表1 各課程及主要教學(xué)內(nèi)容
C語(yǔ)言是在國(guó)內(nèi)外廣泛使用的一種計(jì)算機(jī)語(yǔ)言。C語(yǔ)言功能豐富、表達(dá)能力強(qiáng)、使用靈活方便、應(yīng)用面廣、目標(biāo)程序效率高、可移植性好。特別適合于編寫系統(tǒng)軟件[2]。因此,許多高校都開設(shè)了C語(yǔ)言課程,一般情況下,多數(shù)高校都把《C語(yǔ)言程序設(shè)計(jì)》作為程序設(shè)計(jì)課程群的入門課程。對(duì)于后續(xù)課程的開設(shè),一般都以面向?qū)ο蟮某绦蛟O(shè)計(jì)為主,但根據(jù)主流應(yīng)用平臺(tái)的選擇與喜好不同,一般有兩種不同的見解,當(dāng)前主要分為兩大陣營(yíng)——.Net和Java。它們雖然思想相同,但具體的實(shí)現(xiàn)技術(shù)相差比較大。我們一般把C++作為《面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)》的主講內(nèi)容,而把Java作為選修課程,因?yàn)樵趯W(xué)生學(xué)習(xí)完C++以后,完全能夠很輕松的自學(xué)Java語(yǔ)言,兩者區(qū)別其實(shí)并不是很大。
C++作為《面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)》的主講內(nèi)容的主要原因是C++全面兼容了C,同時(shí)提供了比C更嚴(yán)格、更安全的語(yǔ)法[3]。從這個(gè)意義上講,C++首先是一個(gè)更好的C。所以,學(xué)生在學(xué)習(xí)完C語(yǔ)言以后再學(xué)習(xí)C++,是一個(gè)水到渠成的事情,可以把它看作是C語(yǔ)言的延續(xù)。從課程群的角度來(lái)來(lái)看,兩者有著天然的連續(xù)與一致性。學(xué)生在學(xué)習(xí)C++的過(guò)程中,可以盡量少的關(guān)注語(yǔ)法語(yǔ)義與程序的邏輯結(jié)構(gòu),因?yàn)檫@些都是C語(yǔ)言中已有的。學(xué)生只需把重點(diǎn)放在面向?qū)ο蟮乃枷?、方法上即可。因?yàn)槿婕嫒萘薈,所以可以在C的基礎(chǔ)上慢慢地體會(huì)面向?qū)ο蟮乃枷牒头椒ā?/p>
而Java同樣作為一門程序設(shè)計(jì)語(yǔ)言,它是純面向?qū)ο蟮?。這就要求學(xué)生對(duì)面向?qū)ο蟮乃枷胗幸粋€(gè)全面的認(rèn)識(shí)。對(duì)于學(xué)習(xí)完C++的學(xué)生來(lái)說(shuō),這顯然不是太大的問(wèn)題。在學(xué)習(xí)過(guò)程中,只需注意與C++中不同的地方即可,同時(shí)掌握不同的集成開發(fā)環(huán)境即能很容易的上手實(shí)踐。
雖然數(shù)據(jù)結(jié)構(gòu)的大部分內(nèi)容 (尤其是算法及算法分析)都是描述性的、與語(yǔ)言無(wú)關(guān)的,但是,算法要真正實(shí)現(xiàn)還是需要特定程序設(shè)計(jì)語(yǔ)言的支持。由于C語(yǔ)言的簡(jiǎn)潔易懂、同時(shí)又是計(jì)算機(jī)相關(guān)專業(yè)的入門基礎(chǔ)課程,故國(guó)內(nèi)外很多數(shù)據(jù)結(jié)構(gòu)相關(guān)的書籍教材大多采用類C語(yǔ)言作為數(shù)據(jù)結(jié)構(gòu)的描述語(yǔ)言,并把C語(yǔ)言作為數(shù)據(jù)結(jié)構(gòu)算法的實(shí)現(xiàn)語(yǔ)言。C++除了修正了許多C語(yǔ)言的語(yǔ)法方面的缺陷之外,還提供了直接結(jié)構(gòu) (類和模版)來(lái)實(shí)現(xiàn)抽象數(shù)據(jù)類型的通用數(shù)據(jù)結(jié)構(gòu)。面向?qū)ο蟮姆椒ǜ菍?shù)據(jù)和對(duì)數(shù)據(jù)的操作放在一起,作為一個(gè)相互依存、不可分離的整體—對(duì)象。即對(duì)同類型對(duì)象抽象出其共性,形成類,只通過(guò)一個(gè)簡(jiǎn)單的外部接口與外界發(fā)生關(guān)系[3]。
.Net一般是建立在C/C++之上,而Java EE目前只能以Java為基礎(chǔ),這兩大陣營(yíng)各有優(yōu)劣。不同的學(xué)生根據(jù)自己的喜好完全可以自由的選擇某一方面或同時(shí)進(jìn)行學(xué)習(xí)。在有了前面的基礎(chǔ)鋪墊之后,上面的兩類課程都可以開設(shè)。在培養(yǎng)復(fù)合應(yīng)用型人才的教育宗旨下,學(xué)生多學(xué)習(xí)一種技能,也能在一定程度上提高就業(yè)率。
關(guān)于教學(xué),筆者認(rèn)為,其唯一目的是使學(xué)生掌握知識(shí),培養(yǎng)學(xué)生運(yùn)用知識(shí)分析問(wèn)題解決問(wèn)題的能力。計(jì)算機(jī)相關(guān)專業(yè)對(duì)應(yīng)用型人才培養(yǎng)的主要任務(wù)是培養(yǎng)學(xué)生的編程能力,而程序=數(shù)據(jù)結(jié)構(gòu)+算法,程序設(shè)計(jì)語(yǔ)言是描述數(shù)據(jù)結(jié)構(gòu)的工具,數(shù)據(jù)及數(shù)據(jù)結(jié)構(gòu)的表示首先是在內(nèi)存中的表示,所以數(shù)據(jù)的存儲(chǔ)應(yīng)該是一個(gè)難點(diǎn)。如果不借助調(diào)試工具,我們很難直觀地看出數(shù)據(jù)之間的關(guān)系,而跟蹤、調(diào)試都需要有相應(yīng)的預(yù)備知識(shí)才能完成。傳統(tǒng)的C語(yǔ)言對(duì)數(shù)據(jù)結(jié)構(gòu)的表述能力為最強(qiáng)。但程序設(shè)計(jì)語(yǔ)言發(fā)展較快,目前,面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言C++和Java在Internet上得到廣泛應(yīng)用。數(shù)據(jù)結(jié)構(gòu)為了反映計(jì)算機(jī)科學(xué)技術(shù)的新發(fā)展、新技術(shù),就不能保持一成不變,所以面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言來(lái)描述數(shù)據(jù)結(jié)構(gòu)必將成為一種趨勢(shì),但面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,因?yàn)榘褦?shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一個(gè)類中,理解起來(lái)非常困難,初學(xué)者常常因?yàn)椴恢罃?shù)據(jù)存放在哪里而茫然不知所措。所以,在講授典型數(shù)據(jù)結(jié)構(gòu)及其操作的算法實(shí)現(xiàn)時(shí)要首先考慮面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,引入面向?qū)ο蟮母拍?,但也不能把傳統(tǒng)C語(yǔ)言的描述一概棄之。
所以關(guān)于課程群各課程之間的關(guān)系,筆者提出以下幾點(diǎn)看法:
1)程序設(shè)計(jì)是基礎(chǔ)。在學(xué)習(xí)程序設(shè)計(jì)的階段,應(yīng)當(dāng)讓學(xué)生學(xué)會(huì)程序設(shè)計(jì)的方法。依目前我校的絕大部分學(xué)生來(lái)講,一學(xué)期幾個(gè)月的時(shí)間,不可能讓一個(gè)菜鳥能學(xué)會(huì)編出大型、復(fù)雜、實(shí)用的程序。因此,此階段的學(xué)習(xí)主要是最基本、最常用的內(nèi)容,多注重一些語(yǔ)法、語(yǔ)義和程序的邏輯順序等。讓學(xué)生對(duì)程序設(shè)計(jì)這門學(xué)問(wèn)有一個(gè)基本的認(rèn)識(shí)。
2)面向?qū)ο笫翘岣吲c進(jìn)階。此階段的學(xué)習(xí)我們一般安排C++程序設(shè)計(jì)語(yǔ)言作為面向?qū)ο蟪绦蛟O(shè)計(jì)的主講語(yǔ)言。C++語(yǔ)言是一個(gè)面向?qū)ο蟮木幊陶Z(yǔ)言,而面向?qū)ο蟮木幊谭椒?(Object Oriented Programming,簡(jiǎn)稱OOP)一度被看作是一門比較高深的技術(shù)。這是因?yàn)樵诿嫦驅(qū)ο蟮南到y(tǒng)分析 (Object O-riented Analysis,簡(jiǎn)稱OOA)和面向?qū)ο蟮南到y(tǒng)設(shè)計(jì) (Object Oriented Design,簡(jiǎn)稱OOD)理論出現(xiàn)之前,程序員要寫好一個(gè)好的面向?qū)ο蟮某绦颍紫纫獙W(xué)會(huì)運(yùn)用面向?qū)ο蟮姆椒▉?lái)認(rèn)識(shí)問(wèn)題和描述問(wèn)題[3]。因此,在面向?qū)ο蟮膶W(xué)習(xí)上,重點(diǎn)是放在面向?qū)ο蟮乃枷?、方法、原則與理論的學(xué)習(xí)上,通常的語(yǔ)法、結(jié)構(gòu)等細(xì)枝末節(jié)要求在前期掌握。
3)數(shù)據(jù)結(jié)構(gòu)是中心??陀^世界是千變?nèi)f化的。要對(duì)其進(jìn)行計(jì)算機(jī)化的描述,以不變應(yīng)萬(wàn)變是一個(gè)不錯(cuò)的做法,無(wú)論怎么變,無(wú)非都是內(nèi)存中的大量的二進(jìn)制數(shù)據(jù)而已。而數(shù)據(jù)結(jié)構(gòu)正是組織海量的數(shù)據(jù)的方法和對(duì)算法的運(yùn)行時(shí)間進(jìn)行的估算。隨著計(jì)算機(jī)科學(xué)技術(shù)的發(fā)展,計(jì)算機(jī)早已滲入到了國(guó)民經(jīng)濟(jì)及生活的各個(gè)領(lǐng)域,隨著計(jì)算機(jī)的速度越來(lái)越快,對(duì)于能夠處理大量輸入數(shù)據(jù)的程序的需求變得日益迫切。然而,由于在輸入量很大時(shí)程序的效率明顯降低,因此這又要關(guān)注效率問(wèn)題[4]。數(shù)據(jù)結(jié)構(gòu)課程一般包含兩個(gè)方面的內(nèi)容:數(shù)據(jù)結(jié)構(gòu)與算法分析。即①數(shù)據(jù)及其算法;②算法的效率。在解決生產(chǎn)生活中的實(shí)際問(wèn)題上,數(shù)據(jù)結(jié)構(gòu)是常用且非常有必要的。
4)編程實(shí)踐是貫串程序設(shè)計(jì)課程群的主要線索。程序設(shè)計(jì)是一門實(shí)踐性很強(qiáng)的課程,在理解理論概念的基礎(chǔ)上,理解問(wèn)題、分析問(wèn)題,動(dòng)手編碼,然后調(diào)試運(yùn)行,是每個(gè)程序設(shè)計(jì)人員成長(zhǎng)的必經(jīng)之路。編譯器不是問(wèn)題,編程能力的才是重中之重。但不同的編譯器之間還是有點(diǎn)小區(qū)別的。所以還要注意參閱相關(guān)說(shuō)明文檔,特別是在實(shí)踐中積累經(jīng)驗(yàn)、增長(zhǎng)才干,做到舉一反三、一通百通。
程序設(shè)計(jì)課程群是計(jì)算機(jī)各專業(yè)對(duì)學(xué)生進(jìn)行專業(yè)能力培養(yǎng)教育的一個(gè)重要課程體系,是相關(guān)專業(yè)學(xué)科都需要開設(shè)的重要的理論基礎(chǔ)與實(shí)踐課程體系,其內(nèi)容非常廣泛,各課程相互之間既松散又藕合。程序設(shè)計(jì)語(yǔ)言是數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)工具,也是解決問(wèn)題的具體表示與手段,如何在課程教學(xué)中既能傳授基本知識(shí),又能把當(dāng)代計(jì)算機(jī)科學(xué)與技術(shù)學(xué)科和計(jì)算機(jī)科學(xué)技術(shù)的新發(fā)展、新技術(shù)初步傳授給學(xué)生,而且使學(xué)生初步了解一些解決實(shí)際應(yīng)用問(wèn)題的方法和手段等方面,需要不斷地探索和實(shí)踐。
[1](美)D.S.Malik.C++編程—數(shù)據(jù)結(jié)構(gòu)與程序設(shè)計(jì)方法[M].晏海華,蔡旭輝,常鴻,等,譯,北京:電子工業(yè)出版社,2003.
[2]譚浩強(qiáng).C程序設(shè)計(jì)——新世紀(jì)計(jì)算機(jī)基礎(chǔ)教育叢書[M].3版.北京:清華大學(xué)出版社,2005.
[3]鄭莉,董淵,何江舟.C++語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.
[4](美)Mark Allen Weiss.?dāng)?shù)據(jù)結(jié)構(gòu)與算法分析 C++描述[M].3版.張懷勇,等,譯,北京:人民郵電出版社,2007.