李環(huán)宇,林曉霞,徐燕妮,李保銀
(山東科技大學(xué)智能裝備學(xué)院,泰安271000)
針對(duì)程序設(shè)計(jì)課學(xué)習(xí)效果欠佳的情況,分析學(xué)生在學(xué)習(xí)過(guò)程中遇到的細(xì)節(jié)處理能力差的情況。以工程教育認(rèn)證為契機(jī),提出反向利用錯(cuò)誤程序,以學(xué)生為中心,讓學(xué)生自主分析錯(cuò)誤程序,分析錯(cuò)誤發(fā)生的原因,總結(jié)編程規(guī)律,達(dá)到提高學(xué)生綜合素質(zhì)的要求。
工程教育認(rèn)證;錯(cuò)誤程序;設(shè)計(jì)細(xì)節(jié);反向利用;素質(zhì)提高
《C程序設(shè)計(jì)》是中國(guó)高校理工科類(lèi)各專(zhuān)業(yè)普遍開(kāi)設(shè)的一門(mén)基礎(chǔ)課。《中國(guó)高等院校計(jì)算機(jī)基礎(chǔ)教育課程體系》在2006年、2008年以及2014年三次調(diào)整相關(guān)課程時(shí),一直將其列為中國(guó)大學(xué)生計(jì)算機(jī)教育的基礎(chǔ)課程[1],這也從側(cè)面印證了該課程在中國(guó)大學(xué)計(jì)算機(jī)教育中不可或缺的基礎(chǔ)性地位。
但是眾所周知,C語(yǔ)言的程序十分繁瑣,大多數(shù)學(xué)生是在大一剛?cè)胄5臅r(shí)候開(kāi)始學(xué)習(xí)該課程,對(duì)程序設(shè)計(jì)的概念相當(dāng)陌生,算法基礎(chǔ)幾乎為零,所以在理解有關(guān)語(yǔ)法、程序結(jié)構(gòu)時(shí)會(huì)感覺(jué)吃力,容易產(chǎn)生抵觸心理,主動(dòng)去理解、探索程序設(shè)計(jì)的內(nèi)在規(guī)律就更為困難,因此及時(shí)有針對(duì)性地解決程序設(shè)計(jì)教學(xué)中凸顯出來(lái)問(wèn)題一直是相關(guān)專(zhuān)家和任課教師重點(diǎn)關(guān)注的研究方向。
很多專(zhuān)家學(xué)者對(duì)改進(jìn)C語(yǔ)言的教法進(jìn)行了積極有益的探討和改進(jìn),例如:針對(duì)學(xué)生雖然記住了簡(jiǎn)單的語(yǔ)言知識(shí),但卻不知道總體如果布局下手編程的問(wèn)題,柴群提出了“五步編程法”,指出了一個(gè)“編程路線(xiàn)圖”,讓學(xué)生在編程過(guò)程中有路可循[2];算法是程序的靈魂,離開(kāi)了算法,編程就像沒(méi)有明燈指引走夜路。安廣勇老師提出了以“數(shù)學(xué)算法為基礎(chǔ)的編程技巧”[3],深入剖析數(shù)學(xué)算法在C程序設(shè)計(jì)中的指導(dǎo)性作用;楊琴等人提出基于“互聯(lián)網(wǎng)+”平臺(tái)下載翻轉(zhuǎn)課堂教學(xué)改革,目的是增強(qiáng)學(xué)生學(xué)習(xí)的主動(dòng)性,提高課堂教學(xué)效率,使課堂教學(xué)更有針對(duì)性[4]。綜合各種教改成果,這些改革的思路側(cè)重于系統(tǒng)化的改革,對(duì)于程序設(shè)計(jì)教學(xué)過(guò)程中的細(xì)節(jié)涉及不多。
另外,近年來(lái),隨著新工業(yè)革命時(shí)代的到來(lái),與之相對(duì)應(yīng)的工程教育認(rèn)證蓬勃發(fā)展。早在2013年,同濟(jì)大學(xué)副校長(zhǎng)陳以一教授就在教育部人文社會(huì)科學(xué)研究專(zhuān)項(xiàng)任務(wù)項(xiàng)目中指出了新工業(yè)革命對(duì)工程教育的影響,并且提出了在新工業(yè)革命背景下工程教育改革的新課題,例如專(zhuān)業(yè)整合、課程重構(gòu)、學(xué)習(xí)模式變革等[5]。工程教育認(rèn)證強(qiáng)調(diào)教學(xué)“以學(xué)生為中心,產(chǎn)出為導(dǎo)向,持續(xù)改進(jìn)”的標(biāo)準(zhǔn)。以此為標(biāo)準(zhǔn),許多教師也提出了自己的教學(xué)思考,例如蔡美琴老師提出在教學(xué)內(nèi)容上需要重構(gòu),在學(xué)生“怎么學(xué)”上,要要充分發(fā)揮學(xué)生的自主性、能動(dòng)性和創(chuàng)造性,提高學(xué)生的參與度[6]。凡此種種研究成果,本文不再贅述。
按照工程教育認(rèn)證的標(biāo)準(zhǔn),要使學(xué)生主動(dòng)參與,提高整體素質(zhì),能夠著手的地方很多?!凹?xì)節(jié)決定成敗”。本文擬從提高設(shè)計(jì)細(xì)節(jié)角度來(lái)談?wù)勗O(shè)計(jì)綜合能力的提高。
設(shè)計(jì)中需要關(guān)注的細(xì)節(jié)很多,“轉(zhuǎn)化”能力就是設(shè)計(jì)細(xì)節(jié)中容易被忽略,但卻又是一種不可或缺的基礎(chǔ)性能力。文獻(xiàn)[7]以介紹“打擂臺(tái)”法為“鋪墊”,“轉(zhuǎn)化”為選擇法排序,降低了理解算法的難度。不過(guò)在實(shí)際的教學(xué)中,即便是學(xué)生對(duì)題目的算法、程序設(shè)計(jì)步驟都已經(jīng)非常清楚了,在具體編程實(shí)現(xiàn)過(guò)程中,仍面臨著“轉(zhuǎn)化”的問(wèn)題,“轉(zhuǎn)化”能力較差,就會(huì)產(chǎn)生了一系列編程錯(cuò)誤。這類(lèi)錯(cuò)誤無(wú)論是從教師角度看,還是從學(xué)生自身角度看,都好像是淺層次的問(wèn)題。但是此類(lèi)錯(cuò)誤一而再,再而三的出現(xiàn),就成了系統(tǒng)性問(wèn)題,需要重點(diǎn)關(guān)注和解決。從這類(lèi)問(wèn)題實(shí)際產(chǎn)生的影響看:一是降低了學(xué)習(xí)效率,因?yàn)閷W(xué)生總是在低層次問(wèn)題“徘徊”;二是打擊了學(xué)生的自信心和學(xué)習(xí)的積極性,因?yàn)檫@種問(wèn)題一般出現(xiàn)在學(xué)習(xí)的入門(mén)階段,反復(fù)出現(xiàn)的此類(lèi)問(wèn)題,好像是掉入了“錯(cuò)誤的海洋”,由此影響學(xué)生的學(xué)習(xí)熱情。
教師在指導(dǎo)學(xué)生編程時(shí),一般是先分析問(wèn)題,得到一個(gè)具體的算法,然后用流程圖、偽代碼等算法語(yǔ)言把算法表達(dá)清楚。下一步,就是學(xué)生把前面得到流程圖或偽代碼等算法“轉(zhuǎn)化”為符合C語(yǔ)言語(yǔ)法的程序了。但就在這個(gè)以“轉(zhuǎn)化”階段為代表的細(xì)節(jié)處理,在具體實(shí)現(xiàn)算法的這個(gè)環(huán)節(jié)就出現(xiàn)了各種各樣的問(wèn)題。以“轉(zhuǎn)化”環(huán)節(jié)來(lái)說(shuō),細(xì)節(jié)處理出現(xiàn)的問(wèn)題主要體現(xiàn)在以下幾個(gè)方面:
(1)數(shù)學(xué)公式轉(zhuǎn)化為合法C語(yǔ)言表達(dá)式的能力較差。
在編程過(guò)程中,有很多數(shù)學(xué)公式需要轉(zhuǎn)化為C語(yǔ)言的表達(dá)式。例如編程中常用到的一元二次方程的兩個(gè)根。學(xué)生基本了解要把求根公式分解為兩部分:p=但在實(shí)現(xiàn)p或q的時(shí)候,編程就出現(xiàn)了“轉(zhuǎn)化”錯(cuò)誤。以實(shí)現(xiàn)p為例,學(xué)生常犯的錯(cuò)誤經(jīng)常是:
(2)對(duì)基本概念轉(zhuǎn)化為具體語(yǔ)句的能力差
這類(lèi)問(wèn)題經(jīng)常出現(xiàn)在選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)中。例如算法描述:“if a>b,將a和b交換”。實(shí)現(xiàn)語(yǔ)句為:if(a>b){t=a;a=b;b=t;},該語(yǔ)句實(shí)現(xiàn)了一個(gè)選擇結(jié)構(gòu),其中使用了“復(fù)合語(yǔ)句”這個(gè)概念,但初學(xué)者往往把“花括號(hào)”忘記,導(dǎo)致程序可能出錯(cuò)。
(3)從算法語(yǔ)言到合法C語(yǔ)句的轉(zhuǎn)化能力差
該類(lèi)問(wèn)題很多,例如閏年的表示問(wèn)題,涉及到關(guān)系表達(dá)式和邏輯表達(dá)式的綜合應(yīng)用。素?cái)?shù)問(wèn)題,算法本身不復(fù)雜,但涉及到循環(huán)的正常結(jié)束與非正常結(jié)束的問(wèn)題。在遇到這種上述算法時(shí),學(xué)生們經(jīng)常是算法明白了,但仍然是寫(xiě)不出正確的程序。
(4)對(duì)具體問(wèn)題中已知條件轉(zhuǎn)化為函數(shù)參數(shù)能力較差
函數(shù)的定義和調(diào)用是學(xué)習(xí)C程序設(shè)計(jì)中的難點(diǎn)。具體到函數(shù)參數(shù)的設(shè)置,學(xué)生更是屢屢出現(xiàn)問(wèn)題。究其原因:是學(xué)生不了解參數(shù)的本質(zhì)是解決一個(gè)問(wèn)題的已知條件,不是在程序設(shè)計(jì)過(guò)程中用到過(guò)度變量;從表現(xiàn)形式上說(shuō),不清楚已知條件的表達(dá)方法,特別是涉及到數(shù)組和指針作為函數(shù)參數(shù)的時(shí)候。
凡此種種的“轉(zhuǎn)化”過(guò)程出現(xiàn)的問(wèn)題,其實(shí)是的細(xì)節(jié)處理能力薄弱的表現(xiàn),實(shí)質(zhì)是都是編程能力低下的具體體現(xiàn)。錯(cuò)誤的細(xì)節(jié)處理必然產(chǎn)生錯(cuò)誤的程序。因此細(xì)節(jié)處理能力差就是編程能力差。而基于工程教育認(rèn)證模式下,尤其重視能力的培養(yǎng)。編程能力差,尤其與以目標(biāo)為導(dǎo)向的工程教育認(rèn)證原則相背離。
上文提到的細(xì)節(jié)處理能力不足,主要的自主學(xué)習(xí)能力和實(shí)踐能力不足所致。解決這個(gè)問(wèn)題的傳統(tǒng)方法是強(qiáng)調(diào)正面引導(dǎo),強(qiáng)調(diào)正確的轉(zhuǎn)化過(guò)程。當(dāng)學(xué)生出現(xiàn)錯(cuò)誤時(shí),就告訴學(xué)生,你的程序錯(cuò)了,然后告訴他正確的應(yīng)該是怎樣的。而對(duì)學(xué)生編程過(guò)程中出現(xiàn)的錯(cuò)誤案例(錯(cuò)誤程序)反而重視不夠,忘記了“教訓(xùn)”本身也會(huì)在學(xué)生成長(zhǎng)過(guò)程中扮演重要的角色。
文獻(xiàn)[8]就提出重視錯(cuò)誤程序的觀點(diǎn),并引用了ACM計(jì)算機(jī)教育專(zhuān)家Robert M.Panoff博士在SIGCSE 2014大會(huì)所作的主題報(bào)告中提出一個(gè)鮮明觀點(diǎn):“Right Answer=Wrong Answer+Corrections”(正確答案=錯(cuò)誤答案+更正)。因此重視錯(cuò)誤程序,從中發(fā)現(xiàn)錯(cuò)誤發(fā)生的規(guī)律可以從反向提高學(xué)生的編程能力。
交互式學(xué)習(xí)在20世紀(jì)70年代就已經(jīng)提出,它強(qiáng)調(diào)以學(xué)生為主體,注重教育者與學(xué)習(xí)者之間的平等交流和自由互動(dòng)[9],與工程教育認(rèn)證的以學(xué)生為中心的思想是相同的。根據(jù)程序設(shè)計(jì)課程的教學(xué)和學(xué)習(xí)特點(diǎn),在面對(duì)學(xué)生的錯(cuò)誤程序的時(shí)候,通過(guò)交互式雙向討論的方式改正學(xué)生的錯(cuò)誤,采用了以下的教學(xué)環(huán)節(jié)。
(1)收集學(xué)生的錯(cuò)誤案例
教師應(yīng)該在日常教學(xué)工作中,注重發(fā)現(xiàn)學(xué)生在編程過(guò)程中所犯的錯(cuò)誤程序。為了能夠使各種錯(cuò)誤程序有代表性,應(yīng)該對(duì)錯(cuò)誤程序進(jìn)行分類(lèi),使每一類(lèi)錯(cuò)誤程序都能代表某一個(gè)方向性問(wèn)題,提高教學(xué)效率。
(2)對(duì)學(xué)生進(jìn)行分組
根據(jù)學(xué)生的編程水平,對(duì)學(xué)生進(jìn)行分組。每組人數(shù)不宜太多,以四到五為宜,讓每個(gè)學(xué)生在這個(gè)小組中都有具體的任務(wù)。小組人員組成水平最好有層次之分,以層次較高的學(xué)生帶動(dòng)較差的學(xué)生。
(3)教師分配討論任務(wù)
教師將不同類(lèi)別的錯(cuò)誤程序分配給不同的學(xué)生組。為了提高下面在課堂討論時(shí)的效率,每個(gè)小組分配的題目盡量的不同,但是每個(gè)類(lèi)型的錯(cuò)誤程序都要有。分配討論時(shí)機(jī)應(yīng)與課堂正面教學(xué)相配合。
(4)學(xué)生按照分組討論并記錄總結(jié)
學(xué)生分組討論可以在自習(xí)期間,也可以再自建微信群或QQ群中討論。把討論發(fā)現(xiàn)的程序中的錯(cuò)誤記錄下來(lái),并分類(lèi)保存形成文字內(nèi)容。討論時(shí)的內(nèi)容既可以包含語(yǔ)法細(xì)節(jié),也可以包括宏觀算法思路。特別是算法思路,程序可能并沒(méi)有語(yǔ)法錯(cuò)誤,僅僅是邏輯錯(cuò)誤,與預(yù)定的結(jié)果不符。這樣的情況可以鼓勵(lì)學(xué)生將各自的想法程序化,然后運(yùn)行看結(jié)果,然后從結(jié)果倒推錯(cuò)誤成因。
(5)教師引導(dǎo)啟發(fā)
學(xué)生在討論的過(guò)程中,教師應(yīng)該適時(shí)的加入討論,可以提高學(xué)生討論的層次,并將討論引入更寬的視角,點(diǎn)出所涉及問(wèn)題的難點(diǎn)并對(duì)相關(guān)知識(shí)進(jìn)行適當(dāng)?shù)耐卣埂?/p>
(6)課堂總結(jié)歸納,學(xué)生撰寫(xiě)本次差錯(cuò)報(bào)告
在整個(gè)教學(xué)環(huán)節(jié)中,課堂總結(jié)是交流討論的收尾階段。在這個(gè)階段,教師在課堂上要對(duì)各個(gè)小組的討論結(jié)果分別進(jìn)行總結(jié)。教師應(yīng)該站在更高的層次上,把各個(gè)小組的討論結(jié)果背后的知識(shí)點(diǎn)進(jìn)行串聯(lián)。經(jīng)過(guò)這個(gè)階段,對(duì)相關(guān)知識(shí)點(diǎn)從正反兩個(gè)方面進(jìn)行強(qiáng)化。經(jīng)過(guò)強(qiáng)化串聯(lián)之后,學(xué)生應(yīng)該能從宏觀和微觀兩個(gè)方面對(duì)知識(shí)進(jìn)行掌握,學(xué)會(huì)從局部到全局的學(xué)習(xí)方法。
本文采用的案例是筆者在教學(xué)過(guò)程中遇到的真實(shí)案例,錯(cuò)誤程序片段以照片的形式原樣呈現(xiàn),如圖1所示。原題目要求編程完成數(shù)學(xué)上的一個(gè)分段函數(shù):
圖1 錯(cuò)誤程序段樣例
將該錯(cuò)誤程序提供給學(xué)生討論。學(xué)生容易發(fā)現(xiàn)兩個(gè)錯(cuò)誤:首先,“y=5x”這個(gè)錯(cuò)誤最容易被發(fā)現(xiàn),很顯然與“y=-5x”這個(gè)句子不一致,形成對(duì)比,當(dāng)然從表達(dá)式的組成的定義也容易判斷;其次,“x=0”這個(gè)錯(cuò)誤的發(fā)現(xiàn)困難些,主要原因是數(shù)學(xué)概念對(duì)學(xué)生的影響太大了,學(xué)生對(duì)兩種話(huà)語(yǔ)體系區(qū)別還體會(huì)不深。
如果教師不介入討論,很多時(shí)候?qū)W生發(fā)現(xiàn)的錯(cuò)誤就到此為止了。教師在這個(gè)時(shí)候的介入就可以拓展學(xué)
生的思路。例如可以向?qū)W生提出該程序整體的結(jié)構(gòu)是什么?當(dāng)筆者給學(xué)生提出這個(gè)問(wèn)題的時(shí)候,部分學(xué)生誤以為這是if語(yǔ)句的三分支結(jié)構(gòu)呢!而沒(méi)有意識(shí)到這是連續(xù)使用了兩個(gè)選擇結(jié)構(gòu)的順序結(jié)構(gòu),并且第一個(gè)選擇雙分支選擇結(jié)構(gòu)使用的還很不規(guī)范!
在課堂總結(jié)歸納階段,可以首先總結(jié)學(xué)生們發(fā)現(xiàn)的錯(cuò)誤,其次應(yīng)重點(diǎn)介紹隱藏比較深的邏輯錯(cuò)誤,編譯階段發(fā)現(xiàn)不了,但實(shí)際上算法是錯(cuò)誤的程序段。另外不良的編程風(fēng)格也應(yīng)該及時(shí)給學(xué)生指出,例如圖1中的第一個(gè)雙分支選擇結(jié)構(gòu),是一個(gè)不規(guī)范的用法。此外編程風(fēng)格不好,例如本例中代碼沒(méi)有形成縮進(jìn)。最后學(xué)生將本次差錯(cuò)的心得各自寫(xiě)成文字保存,方便以后查詢(xún),逐漸改正錯(cuò)誤,形成良好的編程習(xí)慣。
上述過(guò)程不是一勞永逸的,應(yīng)該在發(fā)現(xiàn)新問(wèn)題時(shí),反復(fù)執(zhí)行。具體的討論形式也應(yīng)該與時(shí)俱進(jìn),不斷鞏固發(fā)展,這也是工程教育認(rèn)證本身所要求的。
本文分析了學(xué)生在編程細(xì)節(jié)處理方面出現(xiàn)的問(wèn)題?;诠こ探逃J(rèn)證的編程能力的培養(yǎng),需要正面的引導(dǎo)和教育,也離不開(kāi)對(duì)錯(cuò)誤的反向思考。因?yàn)樵趯W(xué)習(xí)編程的過(guò)程中,避免不了犯各種各樣的錯(cuò)誤。要對(duì)每一種錯(cuò)誤進(jìn)行分析,分析錯(cuò)誤發(fā)生的原因以及避免錯(cuò)誤發(fā)生的方法。放棄對(duì)錯(cuò)誤的研究,意味著失去進(jìn)步的一個(gè)途徑。通過(guò)讓學(xué)生自己對(duì)典型編程錯(cuò)誤分析和總結(jié),可以起到事半功倍的效果,加深學(xué)生對(duì)編程的理解,提高學(xué)生編程的能力。