黃成
(中南林業(yè)科技大學(xué)涉外學(xué)院,湖南 長沙 410201)
軟件工程專業(yè)是一個(gè)強(qiáng)調(diào)程序設(shè)計(jì)實(shí)踐能力和編程動(dòng)手能力的專業(yè)?!端惴ǚ治雠c設(shè)計(jì)》是專業(yè)內(nèi)的一門重要的專業(yè)基礎(chǔ)課,通常是有了基本編程和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的大二下期或是大三上期開課。作為《高級(jí)語言程序設(shè)計(jì)》和《數(shù)據(jù)結(jié)構(gòu)》課程之后續(xù)課程,這門課的理論性和實(shí)踐性都很強(qiáng)。而根據(jù)尼克勞斯·威茨在他的著作《算法+數(shù)據(jù)結(jié)構(gòu)=程序》一書中提出的理念:程序的編輯其本質(zhì)就是數(shù)據(jù)結(jié)構(gòu)加算法的綜合應(yīng)用。所以培養(yǎng)應(yīng)用型人才就是在培養(yǎng)實(shí)際運(yùn)用算法和數(shù)據(jù)結(jié)構(gòu)解決問題的能力。這個(gè)應(yīng)該成為《算法分析與設(shè)計(jì)》課程教學(xué)的核心任務(wù)。
由于算法本身特點(diǎn)不能局限于某種具體的程序語言,所以部分教學(xué)內(nèi)容具有一定的難度。教授課程的老師如果將代碼完整的展現(xiàn)給學(xué)生,就會(huì)糾結(jié)于代碼的組成和實(shí)現(xiàn),不利于學(xué)生理解算法原理和思維邏輯;而不寫完整的代碼,使用偽代碼講述算法,對(duì)于學(xué)生來說就成了“聽起來很重要,條理梳理明確了,方法講解明白了,但是自己運(yùn)用起來就不知道從哪里下手、怎么下手,編程實(shí)現(xiàn)很困難”。這其實(shí)就是學(xué)生解決實(shí)際問題的能力并沒有本質(zhì)上的提高,知其然不知其所以然。這樣的情況應(yīng)該予以改變。
梳理筆者多年算法課程的教學(xué),發(fā)現(xiàn)傳統(tǒng)的課程教學(xué)中存在以下的問題:(1)本課程要求學(xué)生的編程基礎(chǔ)扎實(shí)。而部分同學(xué)在前導(dǎo)課程中學(xué)習(xí)并不理想,導(dǎo)致課程實(shí)踐的時(shí)候想法思想和代碼不能無縫銜接,無法順利實(shí)現(xiàn)自己的設(shè)計(jì),從而影響后續(xù)課程的學(xué)習(xí)積極性。(2)課堂講述因課時(shí)的影響,只能偏重理論教學(xué),實(shí)踐教學(xué)薄弱乃至空白。一般算法實(shí)踐課時(shí)僅占總課時(shí)的百分之二十不到,有的專業(yè)還不到這個(gè)比例。這個(gè)情況導(dǎo)致學(xué)生為了應(yīng)付考試和學(xué)分,只顧死記硬背理論內(nèi)容,缺乏上機(jī)操作的鍛煉,不善于應(yīng)用算法思想解決實(shí)際問題。(3)教學(xué)內(nèi)容涉及面廣且知識(shí)點(diǎn)眾多,加上綜合應(yīng)用性強(qiáng),所以它不能像其他的課程一樣依靠記憶背誦就可以學(xué)好,更多的是依賴于理解算法的思想和數(shù)學(xué)知識(shí)的相結(jié)合達(dá)到靈活運(yùn)用程度。軟件工程的部分同學(xué)數(shù)學(xué)知識(shí)基礎(chǔ)薄弱,對(duì)于理論知識(shí)抽象且繁雜的時(shí)候,越學(xué)到后面越不能理解,越學(xué)越覺得枯燥難懂,沒有興趣繼續(xù)學(xué)習(xí)。算法的含義是一系列按機(jī)械步驟解決問題的明確指令,也就是說對(duì)于符合一定規(guī)范的輸入能夠在有限時(shí)間內(nèi)以一定的機(jī)械步驟獲得要求的輸出。雖然這標(biāo)志著絕大多數(shù)算法最終靠計(jì)算機(jī)來執(zhí)行,并強(qiáng)調(diào)解題步驟的機(jī)械性,但是算法概念本身并不依賴這樣的假設(shè)[1]。算法不只是為了寫出良好的計(jì)算機(jī)程序而準(zhǔn)備的,是為了培養(yǎng)人們的分析能力和向“計(jì)算機(jī)”描述知識(shí)而準(zhǔn)備的。所以局限于某一特定的語言編程中,無助于學(xué)生真正的掌握算法的思維。所以算法強(qiáng)調(diào)以偽代碼描述,而非程序代碼。但是偽代碼不是程序,不能運(yùn)行看結(jié)果。這樣導(dǎo)致沒有理解算法思想的學(xué)生無法也沒有興趣將理論應(yīng)用至實(shí)際問題當(dāng)中。所以激發(fā)學(xué)生應(yīng)用的興趣和能力,也就成了算法課程急待解決的問題。
而想要達(dá)到這一目標(biāo),需要激發(fā)學(xué)生面對(duì)問題主動(dòng)思考的熱情和積極性,鼓勵(lì)他們自主動(dòng)手解題、勇于動(dòng)手解題。探究式的教學(xué)方法正是為了這樣的目標(biāo)而出現(xiàn)的。通過探究式教學(xué)啟發(fā)學(xué)生思考,帶領(lǐng)他們體會(huì)算法的核心思想,領(lǐng)悟不同的算法解決不同的問題的選擇,學(xué)習(xí)遇到實(shí)際問題時(shí)分析問題性質(zhì)、設(shè)計(jì)適合的解決方案的辦法,從而培養(yǎng)他們舉一反三的探索問題、解決問題的能力。
筆者經(jīng)過教學(xué)實(shí)踐總結(jié)了一些經(jīng)驗(yàn),本文擬從教學(xué)內(nèi)容、教學(xué)方式等幾方面來進(jìn)行探討。
當(dāng)前算法設(shè)計(jì)與分析的教材五花八門,總結(jié)其所涉及的知識(shí)點(diǎn)主要是三大部分:首先是算法分析基礎(chǔ),其中包括算法問題求解基礎(chǔ)和算法效率分析基礎(chǔ)。其次是算法設(shè)計(jì)策略,包括蠻力法、分治法、減治法、變治法、時(shí)空權(quán)衡、動(dòng)態(tài)規(guī)劃、貪婪技術(shù)、迭代改進(jìn)等[2]。第三部分是算法能力的極限和超越能力的極限,核心是求解困難問題。
知識(shí)點(diǎn)的第一部分是全體算法求解思路的核心,是總綱但也是理解的難點(diǎn)。原來算法課程是立足理論,主要進(jìn)行概念的教授。學(xué)生沒有接觸過實(shí)際工程項(xiàng)目,對(duì)項(xiàng)目的效率分析沒有直接的感受,無法明確了解算法效率的意義。僅僅停留在理論明白的層面上,對(duì)實(shí)際應(yīng)用的時(shí)候沒有起到指導(dǎo)性的作用。對(duì)于應(yīng)用型的大學(xué)生來說應(yīng)立足于用、理解思想精髓為上。所以在這里減少理論講述,以具體實(shí)際經(jīng)典算法為案例結(jié)合后面的課程創(chuàng)設(shè)探究的情境[2]。先建立感性認(rèn)識(shí),讓學(xué)生在后期的算法實(shí)踐中感受和認(rèn)知。第二部分內(nèi)容繁多,涉及的編程技巧眾多,授課課時(shí)壓力很大。但可以結(jié)合第一部分內(nèi)容所形成的情景,選擇其中較貼近生活的典型事例,以此引導(dǎo)學(xué)生采用書本多種算法思路分析求解問題。從而從實(shí)際問題的求解方式的對(duì)比,來體會(huì)效率的意義和算法思維的精髓。例如:排序算法在求解序列相關(guān)問題時(shí)可以使用的排序方法有合并排序,快速排序等。都是針對(duì)排序問題的算法,但是按情景設(shè)定的區(qū)別,各自都有不同的適用場(chǎng)景。如求無序序列數(shù)據(jù)中間的極值時(shí)宜使用合并排序算法,僅僅求取最大或最小值時(shí)無需全部歸并,只要找最大的和最小的歸并即可。求無序序列數(shù)據(jù)區(qū)間情況的時(shí)候用快速排序算法,在只求無序數(shù)列排序后的部分區(qū)間內(nèi)數(shù)據(jù)的時(shí)候,可以增加門閥值作為快排分裂點(diǎn)以提高效率,且同時(shí)可以進(jìn)行數(shù)據(jù)壓縮的操作講解。這樣可以告訴學(xué)生算法不是模板,不需要完全照搬算法的原始設(shè)計(jì)。這些都可以在課堂上引導(dǎo)學(xué)生通過分組討論的形式分辨算法思維和效率的高低,從而得到直觀貼切的解題感受形成課程報(bào)告。而不再局限于某個(gè)章節(jié)或是某類方法的講授。第三部分求解困難問題部分,可以結(jié)合前面的實(shí)踐成果來討論求解的條件和場(chǎng)景,也可以作為學(xué)生課后擴(kuò)展的練習(xí)。針對(duì)學(xué)時(shí)有限的軟件工程專業(yè)的本科生來說,在總數(shù)56學(xué)時(shí)中包含了眾多的知識(shí)點(diǎn)。因而在內(nèi)容的選擇上要依據(jù)容量適中、前后內(nèi)容銜接緊密的原則,盡量減少在相似內(nèi)容上的講述時(shí)間,用解題思路的演變和對(duì)應(yīng)的實(shí)現(xiàn)方法貫穿整個(gè)教學(xué)活動(dòng)。
原本的算法課程大都是理論講述,各章節(jié)的內(nèi)容較為分散,沒有有機(jī)的結(jié)合[3]。雷同的解題情景在不同的算法章節(jié)中重復(fù)出現(xiàn),如稱金幣或式金塊,旅行者問題、二叉樹查找問題。雖然是經(jīng)典的事例,但是算法思維隨著情景的改變而改變的思路、情景的對(duì)比討論、算法之間的耦合都沒有。而且與生活事例交集不大,形成學(xué)生無法對(duì)比聯(lián)系,無法認(rèn)同這些理論的價(jià)值,在實(shí)際使用時(shí)常常無法應(yīng)用,從而降低了他們學(xué)習(xí)的興趣。所以變?cè)瓉戆床烤桶嗟匾勒账惴ù箢愓鹿?jié)講述方法為以案例驅(qū)動(dòng)的探究式教學(xué)。以實(shí)際生活中的事例為場(chǎng)景,按照情景的變化綜合性的跨算法大類講授算法的實(shí)現(xiàn),會(huì)極大的調(diào)動(dòng)學(xué)生的積極性,提高他們的主觀能動(dòng),開拓他們的思維,提升實(shí)際算法思維的使用。如同二叉樹剪枝操作。是十分有必要使用的算法,但是因涉及算法能力的優(yōu)化內(nèi)容,教材安排在后續(xù)的章節(jié)中,在課時(shí)的壓力下大多情況是不會(huì)教授的。在教授過程中可以提出案例“查詢公司在某個(gè)范圍的時(shí)間內(nèi),售賣價(jià)格大于門閥值,庫存小于門閥值”,在這里加入二叉樹剪枝操作的講解。傳統(tǒng)的做法一般是在數(shù)據(jù)采集完成后,用于降低程序的計(jì)算復(fù)雜度時(shí),減少處理數(shù)據(jù)的分支數(shù)據(jù)的。但是在大數(shù)據(jù)環(huán)境下一般是在對(duì)采集的數(shù)據(jù)進(jìn)行價(jià)值化處理的數(shù)據(jù)挖掘時(shí)期決策樹使用的。一個(gè)是減少程序的計(jì)算量,一個(gè)是篩選數(shù)據(jù)形成有效分類。這樣既述說了使用的適用場(chǎng)景,也聯(lián)系了現(xiàn)下最流行的技術(shù)應(yīng)用,十分吸引學(xué)生的注意力,提高了學(xué)生的學(xué)習(xí)興趣。
這個(gè)教學(xué)體系主要以實(shí)際事例為引導(dǎo),貫穿各個(gè)算法的思維演變和方法的變化,可以適用于所有計(jì)算機(jī)相關(guān)專業(yè)的算法分析與設(shè)計(jì)課程。
雖然是通過教學(xué)實(shí)踐總結(jié)了一個(gè)體系,但是尚存在諸多不足。作為一種新的教學(xué)思路,所提出的方法能否解決當(dāng)下課程的問題?是否是最有效的解決方案?能否滿足學(xué)校培養(yǎng)方案和社會(huì)用人需求之間的完美統(tǒng)一?是值得討論的。一家之言,希望能夠拋磚引玉獲得大家的指正。