楊 波,張 軍
(貴陽(yáng)學(xué)院 數(shù)學(xué)與信息科學(xué)學(xué)院,貴州 貴陽(yáng) 550005)
掌握一門程序設(shè)計(jì)語(yǔ)言的基本知識(shí)和編程技能并熟練運(yùn)用于解決實(shí)際問(wèn)題,是高等院校對(duì)理工類學(xué)生的一項(xiàng)基本要求。各類程序設(shè)計(jì)語(yǔ)言課程的教學(xué),一方面需要一定課時(shí)的理論教學(xué)講授語(yǔ)言基礎(chǔ)知識(shí)、語(yǔ)法規(guī)則和基本技能,另一方面更需要相當(dāng)數(shù)量的實(shí)踐課時(shí)使學(xué)生訓(xùn)練和掌握這些規(guī)則與技能,進(jìn)而培養(yǎng)和提升他們運(yùn)用理論知識(shí)分析和解決問(wèn)題的能力。
在實(shí)際的教學(xué)反饋中,常常發(fā)現(xiàn)很多學(xué)生都存在“課堂上能聽懂語(yǔ)法知識(shí),做實(shí)驗(yàn)時(shí)無(wú)從著手”的情況,也就是說(shuō),不少學(xué)生雖然掌握了一門程序語(yǔ)言的基本規(guī)則,卻不具備分析一個(gè)一般問(wèn)題并運(yùn)用所學(xué)語(yǔ)言編程知識(shí)解決該問(wèn)題的能力。在課程考核時(shí),很多學(xué)生雖然能正確回答試卷中的理論知識(shí),但是對(duì)于一個(gè)實(shí)際問(wèn)題的算法或程序設(shè)計(jì)往往無(wú)能為力。近年來(lái),“知易行難”問(wèn)題已成為從事程序語(yǔ)言教學(xué)的教師面臨的一大困擾,越來(lái)越多的討論集中于對(duì)學(xué)生實(shí)踐和創(chuàng)新能力的培養(yǎng)和提高[1-5]。針對(duì)這一問(wèn)題,應(yīng)從教與學(xué)雙方進(jìn)行深入剖析,找出可能的原因并進(jìn)行相應(yīng)的處理或改進(jìn),以期有效提高程序語(yǔ)言類課程學(xué)習(xí)的效率,進(jìn)而培養(yǎng)學(xué)生主動(dòng)進(jìn)行探索性、創(chuàng)造性學(xué)習(xí)的能力。
當(dāng)前,對(duì)于本科階段理工科學(xué)生而言,要求掌握的主流程序設(shè)計(jì)語(yǔ)言通常包括C、C++、Java、Python等。這些語(yǔ)言雖然有各自不同的應(yīng)用背景、語(yǔ)法特征、編程技巧和思想,采用不同數(shù)據(jù)結(jié)構(gòu)表示實(shí)際問(wèn)題中的數(shù)據(jù)對(duì)象,但是核心任務(wù)仍然是利用順序、選擇、循環(huán)3種基本結(jié)構(gòu)的組合對(duì)實(shí)際問(wèn)題的操作步驟進(jìn)行抽象表達(dá)。因此,不論是哪一種語(yǔ)言,其學(xué)習(xí)過(guò)程都是類似的:在初步認(rèn)識(shí)和掌握語(yǔ)法規(guī)則的基礎(chǔ)上,逐步運(yùn)用語(yǔ)言中的各類工具求解實(shí)際問(wèn)題并得出正確答案。
一門語(yǔ)言的基本構(gòu)件及相應(yīng)規(guī)則總是有限的。即使像C這樣包含復(fù)雜、易錯(cuò)的指針運(yùn)算的語(yǔ)言,能運(yùn)用指針操作的對(duì)象也不外乎普通變量、數(shù)組、字符串、函數(shù)及結(jié)構(gòu)體幾類。如果教材組織合理、教學(xué)方法得當(dāng),學(xué)生通常能在給定的理論學(xué)時(shí)內(nèi)識(shí)記和理解各類語(yǔ)言構(gòu)件的運(yùn)用規(guī)則。在實(shí)際教學(xué)過(guò)程中,學(xué)生通常的反饋是在課堂上聽懂基本語(yǔ)法和簡(jiǎn)單例程分析沒(méi)問(wèn)題。事實(shí)上,不論哪一種程序語(yǔ)言,其在基本知識(shí)和技能的教學(xué)中并不涉及晦澀難懂的理論知識(shí)和抽象概念,教學(xué)內(nèi)容具體而實(shí)踐性強(qiáng)。對(duì)于大多數(shù)學(xué)生而言,只要認(rèn)真聽講,就很容易掌握語(yǔ)法知識(shí)和簡(jiǎn)單例程分析。
相對(duì)于基本語(yǔ)法知識(shí)的“知易”,學(xué)生在完成課下的編程作業(yè)或?qū)嶒?yàn)任務(wù)時(shí),常常感到“無(wú)從下手,不知怎么開始”。面對(duì)這樣不夠具體的問(wèn)題反饋,任課教師也很難找到原因所在,特別是一些有多年程序語(yǔ)言教學(xué)經(jīng)驗(yàn)的教師,會(huì)疑惑為什么同樣的教學(xué)過(guò)程,以前的學(xué)生基本沒(méi)有這樣的問(wèn)題,近年來(lái)卻越來(lái)越多學(xué)生反饋“聽得懂、不會(huì)做”。
大致上,“行難”問(wèn)題通常表現(xiàn)為:①面對(duì)一個(gè)編程任務(wù),不能確定程序所要處理的計(jì)算對(duì)象是什么;②即使能正確分析出計(jì)算對(duì)象,也不知道采用哪些程序結(jié)構(gòu)及其組合正確表達(dá)數(shù)據(jù)的操作步驟;③能正確給出一個(gè)問(wèn)題的求解算法,但在實(shí)現(xiàn)時(shí)往往由于語(yǔ)法錯(cuò)誤較多或經(jīng)驗(yàn)不足導(dǎo)致調(diào)試通過(guò)耗時(shí)較多,甚至越改越錯(cuò);④對(duì)較為復(fù)雜的實(shí)際問(wèn)題,不能采用正確、合適的數(shù)據(jù)結(jié)構(gòu)表示其中涉及的對(duì)象,也較難對(duì)問(wèn)題進(jìn)行合理的分解和組合。
以上表現(xiàn)中,①—③出現(xiàn)在初學(xué)者的入門階段,④則常出現(xiàn)在學(xué)生基本能完成一些簡(jiǎn)單編程任務(wù)后的提高階段。
學(xué)生在掌握基本語(yǔ)法規(guī)則后,面對(duì)實(shí)際問(wèn)題仍然無(wú)從著手、不能寫出正確可行的算法或代碼,從教與學(xué)兩方面來(lái)看,原因有以下幾種。
1)教學(xué)內(nèi)容相對(duì)固化,教學(xué)方式較為傳統(tǒng)。
通常,程序設(shè)計(jì)語(yǔ)言類教材的內(nèi)容組織架構(gòu)都是以從易到難、從簡(jiǎn)單到復(fù)雜的順序逐一介紹語(yǔ)言中各種構(gòu)件的使用規(guī)則和基本運(yùn)用。為適應(yīng)不同的學(xué)習(xí)者,教材中的例程和習(xí)題也大多為常見簡(jiǎn)單數(shù)學(xué)或日常問(wèn)題的求解。教師在安排課堂講授和實(shí)驗(yàn)時(shí),一般以教材內(nèi)容為主,依教材順序按部就班推進(jìn)教學(xué)過(guò)程,很少針對(duì)學(xué)生的程度、專業(yè)方向等進(jìn)行適當(dāng)?shù)脑鰟h或取舍;在完成一個(gè)語(yǔ)言構(gòu)件的語(yǔ)法知識(shí)講授后,安排一定數(shù)量的編程習(xí)題作為實(shí)驗(yàn)內(nèi)容,由學(xué)生上機(jī)完成程序的調(diào)試運(yùn)行。這樣相對(duì)固化的教學(xué)內(nèi)容與方式不太可能在最大范圍內(nèi)提升學(xué)生對(duì)于程序語(yǔ)言學(xué)習(xí)的興趣度。
2)相關(guān)課程間銜接存在一定誤差。
程序語(yǔ)言類課程的開設(shè)不會(huì)早于第二學(xué)期,在此之前,學(xué)生通常都已學(xué)習(xí)過(guò)計(jì)算機(jī)文化基礎(chǔ)或計(jì)算科學(xué)導(dǎo)論課程。這類課程一般著眼于計(jì)算機(jī)基本操作和常用工具軟件的使用,對(duì)于引領(lǐng)學(xué)生認(rèn)識(shí)編程邏輯幾乎沒(méi)有作用。IT類專業(yè)的課程體系中,算法與數(shù)據(jù)結(jié)構(gòu)類的課程必不可少,開課時(shí)間通常晚于第一門程序語(yǔ)言課程。在學(xué)生作為初學(xué)者第一次接觸程序設(shè)計(jì)語(yǔ)言時(shí),并不具備算法設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),這樣在學(xué)習(xí)語(yǔ)言的過(guò)程中,就難免出現(xiàn)1.2節(jié)中的第4種表現(xiàn)。
3)學(xué)生獨(dú)立思考能力和自主學(xué)習(xí)能力較弱。
很多在高校(特別是地方普通院校)任教多年的教師都有一個(gè)共同的感受:當(dāng)下的學(xué)生似乎普遍沒(méi)有10多年前的學(xué)生“聰明”,以前的學(xué)生在認(rèn)知能力、推理能力、自主鉆研等方面的表現(xiàn)普遍好于后來(lái)的學(xué)生。這種現(xiàn)象的出現(xiàn),大概源于兩個(gè)原因:一是近20年來(lái)高等院校不斷擴(kuò)招,大大提高了學(xué)生進(jìn)入大學(xué)的幾率,然而事實(shí)上不少學(xué)生在學(xué)習(xí)能力和自身素質(zhì)上是達(dá)不到10多年前的高校錄取標(biāo)準(zhǔn)的;二是中學(xué)階段以升學(xué)率為第一指標(biāo)的應(yīng)試教育體制,很多升學(xué)率高的中學(xué)多年來(lái)已形成一套完善且相當(dāng)有效的應(yīng)試訓(xùn)練體系,即使是資質(zhì)一般的學(xué)生,通過(guò)“刷題”之類的機(jī)械式訓(xùn)練,也能取得不錯(cuò)的高考分?jǐn)?shù),但這種機(jī)械訓(xùn)練方式在較大程度上扼殺了學(xué)生進(jìn)行獨(dú)立思考和自主學(xué)習(xí)的能力。
4)環(huán)境影響學(xué)習(xí)習(xí)慣和學(xué)習(xí)風(fēng)氣。
外界環(huán)境中的一些因素對(duì)學(xué)生的學(xué)習(xí)習(xí)慣和學(xué)風(fēng)有較壞的影響。一些中學(xué)教師常以“現(xiàn)在辛苦學(xué),進(jìn)入大學(xué)就輕松”之類的說(shuō)法激勵(lì)學(xué)生,這就使得不少學(xué)生在完成中學(xué)階段繁重的學(xué)習(xí)任務(wù)后,一進(jìn)入大學(xué)就由于目標(biāo)達(dá)成而喪失學(xué)習(xí)動(dòng)力;再者,大學(xué)的教學(xué)方式不再是由老師“看”著學(xué),學(xué)生無(wú)所適從,找不到正確的學(xué)習(xí)方法,特別在一些地方普通院校中,由于沒(méi)有了教師的督促,學(xué)生在課下很少主動(dòng)自習(xí)或深入鉆研;此外,社會(huì)上偶有的“知識(shí)無(wú)用論”以及電子游戲的泛濫,也對(duì)一些思想不夠成熟、自制力弱的學(xué)生產(chǎn)生了很大影響,導(dǎo)致學(xué)生怠惰,無(wú)心學(xué)習(xí)。
程序語(yǔ)言的學(xué)習(xí)需要學(xué)生有較強(qiáng)的邏輯分析和動(dòng)手實(shí)踐能力,對(duì)學(xué)生的學(xué)習(xí)主動(dòng)性和積極性有較高要求。學(xué)生僅僅在課堂上聽懂一門語(yǔ)言的語(yǔ)法規(guī)則和例程分析是遠(yuǎn)遠(yuǎn)不夠的,需要在課下主動(dòng)思考、積極動(dòng)手、勇于探索才能真正熟練掌握這門語(yǔ)言,然而,由于前述3和4兩個(gè)原因,能滿足以上要求的學(xué)生并不多,這就使得學(xué)生在初學(xué)一門語(yǔ)言時(shí)常常是“聽得懂,不會(huì)編”。
首先,要根據(jù)上課對(duì)象、學(xué)時(shí)分配等條件,對(duì)教材中的章節(jié)進(jìn)行合理取舍。如果是入門語(yǔ)言,可將一些對(duì)初學(xué)者而言難于理解和掌握,且屬于進(jìn)階提升的內(nèi)容(如C中的外部函數(shù)、動(dòng)態(tài)內(nèi)存分配、指針數(shù)組、鏈表、位操作等)暫時(shí)擱置,待學(xué)生能熟練運(yùn)用語(yǔ)言主要構(gòu)件后,必要時(shí)再根據(jù)專業(yè)需要將其作為補(bǔ)充內(nèi)容加入。如果學(xué)生之前已學(xué)習(xí)過(guò)其他語(yǔ)言課程,則可將與之前課程重復(fù)或相似的內(nèi)容作略化處理(如一些面向?qū)ο笳Z(yǔ)言的教材中仍然會(huì)介紹變量、常量、數(shù)據(jù)類型、程序3種基本結(jié)構(gòu)等基礎(chǔ)知識(shí)),而將重心放在當(dāng)前語(yǔ)言的核心特征上。
其次,拓寬例程分析或?qū)嶒?yàn)任務(wù)的范圍,引入與學(xué)生專業(yè)背景相關(guān)的實(shí)例或問(wèn)題進(jìn)行分析與求解。例如,對(duì)于電子類專業(yè)學(xué)生,可在講授C語(yǔ)言的選擇或循環(huán)結(jié)構(gòu)時(shí)演示C代碼中條件判斷對(duì)一些受控實(shí)體(如智能小車、無(wú)人機(jī)等)的控制作用,讓學(xué)生能真正體會(huì)編程在本專業(yè)領(lǐng)域內(nèi)的應(yīng)用。
第三,前述兩點(diǎn)對(duì)于教師提出了較高的要求,僅靠任課教師一人并不容易做到。教學(xué)院部可考慮將相關(guān)課程組成課程群,具體到程序語(yǔ)言類課程,可以將各類語(yǔ)言課程和算法與數(shù)據(jù)結(jié)構(gòu)課劃入同一課程群中。針對(duì)課程群成立課程教學(xué)組,組內(nèi)成員既有分工,又有合作,各成員分別擔(dān)任課程群中一門課程的主講教師,同時(shí)也為群內(nèi)其他課程提供支持。成員間的合作可以是相關(guān)課程間知識(shí)點(diǎn)的銜接教學(xué),也可以是共性知識(shí)的平臺(tái)化教學(xué),如常量、變量、數(shù)據(jù)類型、程序3種基本結(jié)構(gòu)等基本知識(shí)可由講授入門語(yǔ)言的教師負(fù)責(zé)講好講透,各類語(yǔ)言涉及算法和數(shù)據(jù)結(jié)構(gòu)的部分則由數(shù)據(jù)結(jié)構(gòu)課程主講教師負(fù)責(zé)講解。
最后,一直以來(lái)慣常的“課堂講理論,課下編程序”教學(xué)模式使得學(xué)生在課下缺乏指導(dǎo),面對(duì)實(shí)驗(yàn)任務(wù)無(wú)從著手。教師可以在課堂上給出與實(shí)驗(yàn)任務(wù)相近但較為簡(jiǎn)單的題目,現(xiàn)場(chǎng)引導(dǎo)學(xué)生完成任務(wù)分析、算法描述、代碼編寫及調(diào)試運(yùn)行的全過(guò)程。學(xué)生若能在課堂上完成簡(jiǎn)化版任務(wù),則課下再進(jìn)一步鉆研完成實(shí)驗(yàn)的主動(dòng)性和興趣度都會(huì)得到提高。此外,教師可提供一定數(shù)量與當(dāng)次實(shí)驗(yàn)內(nèi)容相關(guān)的例程,要求學(xué)生在課下進(jìn)行閱讀分析,然后撰寫閱讀分析報(bào)告,與實(shí)驗(yàn)報(bào)告一起進(jìn)行評(píng)定。
學(xué)習(xí)程序語(yǔ)言的核心不在于掌握各構(gòu)件的語(yǔ)法規(guī)則和使用技巧,而在于能將實(shí)際問(wèn)題的操作步驟利用程序結(jié)構(gòu)進(jìn)行正確、高效的表達(dá),這需要學(xué)生具有嚴(yán)密、清晰的邏輯思維。Scratch雖然是面向青少年的簡(jiǎn)易編程工具[6],但是建模、控制、邏輯、運(yùn)算等編程要素都在其圖形化界面操作中得到體現(xiàn)。在地方院校中,很多學(xué)生進(jìn)入大學(xué)前沒(méi)有條件和時(shí)間較為系統(tǒng)地接觸程序設(shè)計(jì),如果能在他們進(jìn)校后普遍開設(shè)的計(jì)算機(jī)文化基礎(chǔ)或計(jì)算科學(xué)導(dǎo)論課程中增加一個(gè)章節(jié)講授Scratch,可讓學(xué)生對(duì)程序設(shè)計(jì)的各要素有一個(gè)初步的感性認(rèn)識(shí),也為后續(xù)的程序語(yǔ)言學(xué)習(xí)建立起興趣基礎(chǔ)。
對(duì)IT類專業(yè)學(xué)生而言,算法和數(shù)據(jù)結(jié)構(gòu)課程是學(xué)生深入程序設(shè)計(jì)領(lǐng)域的必修基礎(chǔ)課程,需在學(xué)生掌握一門基本語(yǔ)言(通常為C、C++或Java)后才能開設(shè)。對(duì)于第一次接觸程序語(yǔ)言的初學(xué)者而言,并沒(méi)有算法和數(shù)據(jù)結(jié)構(gòu)方面的知識(shí)基礎(chǔ),在遇到較為復(fù)雜的問(wèn)題時(shí),自然就無(wú)法對(duì)其中的計(jì)算對(duì)象和操作步驟進(jìn)行有效、正確的抽象表達(dá)。為彌補(bǔ)這一不足,需在入門的語(yǔ)言課程中適當(dāng)加入算法和數(shù)據(jù)結(jié)構(gòu)方面的知識(shí);在學(xué)習(xí)程序3種基本結(jié)構(gòu)的控制語(yǔ)句時(shí),首先強(qiáng)調(diào)其算法描述,然后再講授相關(guān)語(yǔ)句的具體使用;在分析典型例程和布置作業(yè)、實(shí)驗(yàn)任務(wù)時(shí)也要將算法分析作為重點(diǎn),以期逐漸培養(yǎng)學(xué)生分析和解決實(shí)際問(wèn)題的能力。例如,對(duì)于2.1節(jié)中的第3點(diǎn)建議,可考慮由算法和數(shù)據(jù)結(jié)構(gòu)類課程負(fù)責(zé)人將控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的內(nèi)容做成較為簡(jiǎn)化、占用學(xué)時(shí)數(shù)較少的通識(shí)型教學(xué)資源,語(yǔ)言類課程在學(xué)習(xí)到相關(guān)知識(shí)點(diǎn)時(shí),由算法和數(shù)據(jù)結(jié)構(gòu)類算法的主講教師提供支持。
很多學(xué)生在多年應(yīng)試教育體制訓(xùn)練下形成了“老師怎么教就怎么學(xué)”的學(xué)習(xí)習(xí)慣,較難在課下主動(dòng)學(xué)習(xí)并進(jìn)行獨(dú)立思考。在教學(xué)過(guò)程中引入明辨性思維方式,有助于引導(dǎo)學(xué)生擺脫盲從,養(yǎng)成帶著問(wèn)題學(xué)知識(shí)的習(xí)慣。
明辨性思維也稱為批判性思維(critical thinking),原意是指邏輯清晰嚴(yán)密的思考,是一種非盲從的、分析的、推理的、反思性的思維方式。明辨性思維“是對(duì)思維展開的思維”,進(jìn)行明辨性思維的目的是考量自己或他人的思維是否符合邏輯,是否符合好的標(biāo)準(zhǔn),從而做出明智決定或得出正確結(jié)論。明辨性思維具有避免接受或做出不好的論證、排除無(wú)關(guān)因素干擾、不受情感/偏見/謬誤的支配、不盲從權(quán)威或臆斷等基本特征,具體包括判斷信息的恰當(dāng)性、區(qū)分理性斷言和情感斷言、區(qū)別事實(shí)和觀點(diǎn)、識(shí)別不足證據(jù)等21項(xiàng)技能[7]。在程序語(yǔ)言教學(xué)中引入明辨性思維,可嘗試以下方法。
(1)避免灌輸型教學(xué),給學(xué)生留主動(dòng)學(xué)習(xí)的機(jī)會(huì)。在程序語(yǔ)言的教學(xué)中,給出所講授語(yǔ)言構(gòu)件的主要框架和重點(diǎn)、難點(diǎn),該構(gòu)件使用中的各種細(xì)節(jié)則交由學(xué)生補(bǔ)充完善,讓學(xué)生在掌握主要使用方法的前提下通過(guò)實(shí)踐逐漸深入體會(huì)。
(2)通過(guò)提出問(wèn)題增加課堂討論。每堂課可針對(duì)所講授知識(shí)點(diǎn)設(shè)置一些(開放性的)問(wèn)題,以提問(wèn)或?qū)W生分組的形式進(jìn)行充分討論,引導(dǎo)學(xué)生從不同角度認(rèn)識(shí)和分析問(wèn)題,并給出合理的最佳解決辦法。
(3)課程任務(wù)注重培養(yǎng)和提升學(xué)生進(jìn)行獨(dú)立思考和探索的能力。教師在布置習(xí)題或?qū)嶒?yàn)任務(wù)時(shí)應(yīng)摒棄所謂標(biāo)準(zhǔn)答案,強(qiáng)調(diào)方法的多樣性或結(jié)論的非唯一性,鼓勵(lì)學(xué)生提出不同的思路,及時(shí)高度肯定學(xué)生給出的有效而與眾不同的解決方案,營(yíng)造敢于探索和創(chuàng)新的學(xué)習(xí)氛圍。
強(qiáng)大的程序設(shè)計(jì)能力一定是來(lái)源于大量的實(shí)踐,課堂教學(xué)范圍內(nèi)的習(xí)題或?qū)嶒?yàn)任務(wù)并不能提供足夠?qū)拸V且深入的編程實(shí)踐。第二課堂活動(dòng)的開展,可在很大程度上彌補(bǔ)這一不足。程序語(yǔ)言類課程組的教師應(yīng)組織學(xué)生建立編程或其他與專業(yè)相關(guān)的興趣社團(tuán),通過(guò)社團(tuán)活動(dòng)(如講座、競(jìng)賽、項(xiàng)目開發(fā)等)為學(xué)生提供交流、實(shí)踐、提升編程技能的機(jī)會(huì)和平臺(tái),充分發(fā)揮第二課堂對(duì)課堂教學(xué)的補(bǔ)充和深化作用。
程序語(yǔ)言類課程具有非常強(qiáng)的實(shí)踐性,僅僅掌握基本語(yǔ)法知識(shí)而缺乏足夠的實(shí)踐,學(xué)生就不可避免地面臨“知易行難”問(wèn)題。設(shè)計(jì)得當(dāng)?shù)慕虒W(xué)內(nèi)容和教學(xué)方法,著力于推動(dòng)學(xué)生獨(dú)立思考、主動(dòng)探索、積極實(shí)踐,可以讓他們掌握并熟練運(yùn)用一門程序語(yǔ)言。這不僅可為學(xué)生利用計(jì)算機(jī)技術(shù)解決專業(yè)問(wèn)題進(jìn)行技術(shù)儲(chǔ)備,更為重要的是,還可訓(xùn)練和培養(yǎng)學(xué)生進(jìn)行嚴(yán)密邏輯思維、正確分析和求解實(shí)際問(wèn)題的能力,而后者才是一名合格大學(xué)畢業(yè)生的核心競(jìng)爭(zhēng)力。