周幸妮
摘要:編程是人們開始使用計(jì)算機(jī)時最難以掌握的概念。傳統(tǒng)的程序語言教科書基本是以高級語言自身的體系為脈絡(luò),針對學(xué)生一般很難在課堂上就掌握編程方法的普遍性問題,提出應(yīng)該從人們對事物的認(rèn)知規(guī)律出發(fā),首先注重在教學(xué)中給出根據(jù)計(jì)算機(jī)特點(diǎn)解決問題的思維過程,分析各種機(jī)制設(shè)置的本質(zhì)原因、各種相關(guān)概念間的區(qū)別與聯(lián)系,再通過基本語法學(xué)習(xí)、算法設(shè)計(jì)練習(xí)、調(diào)試技能訓(xùn)練等環(huán)節(jié)達(dá)到事半功倍的效果。
關(guān)鍵詞:程序設(shè)計(jì);思維;認(rèn)知規(guī)律
0、引言
“老師,書里那些語法規(guī)則之類的概念我都知道,也記得很清楚,編程的例子也都能看明白,但最后自己還是不會編程序,總覺得編程是很難掌握的東西,真的高不可攀啊……”這是學(xué)生在學(xué)習(xí)c語言課程時常常提出的問題。筆者從事多年的程序設(shè)計(jì)教學(xué),逐步發(fā)現(xiàn)如果用傳統(tǒng)的c語言教材講授課程,學(xué)生在課堂上學(xué)完了程序設(shè)計(jì)課程卻不能掌握程序設(shè)計(jì)也就是編程的方法,這是普遍存在的現(xiàn)象。
1.編程學(xué)習(xí)困難的原因分析
從程序設(shè)計(jì)本身的特點(diǎn)和學(xué)習(xí)它的方法上分析這個問題,筆者認(rèn)為造成編程學(xué)習(xí)難的原因有以下兩方面。
1)編程本身的問題。
算法和程序設(shè)計(jì)技術(shù)的先驅(qū)者Donald E,Knuth(唐納德·克努特)在其堪稱計(jì)算機(jī)科學(xué)理論與技術(shù)的經(jīng)典巨著The Art of ComputerProgramming(計(jì)算機(jī)程序設(shè)計(jì)的藝術(shù))開篇中提到,編程是把問題的解法翻譯成為計(jì)算機(jī)能“理解”的明確術(shù)語,這是人們開始試圖使用計(jì)算機(jī)時最難以掌握的概念。
2)講授方法的問題。
傳統(tǒng)的程序設(shè)計(jì)語言教科書基本上都是以高級語言自身的體系為脈絡(luò)展開教學(xué),注重的是語法規(guī)則、基本概念之類的基本知識點(diǎn)細(xì)節(jié)介紹,往往缺乏各概念間比較、聯(lián)系的分析總結(jié);給出程序?qū)嵗囊话惴椒橄冉o出詳細(xì)的算法思路描述,再給出相應(yīng)程序,即從問題直接得到“詳解”。對于如何能獲得這樣詳細(xì)的思路、分析的過程及方法是什么即思維的過程,傳統(tǒng)教科書一般沒有闡述;對于如何從一個問題人手、算法應(yīng)該如何設(shè)計(jì)、如何從實(shí)現(xiàn)的角度看程序設(shè)計(jì)問題,傳統(tǒng)教科書沒有總結(jié)出一般性的方法。學(xué)習(xí)者看到的是一個個問題的具體解,解決了一個問題,換另一個新的問題,依然不知如何下手分析和解決該問題,因此學(xué)生普遍反映學(xué)完程序設(shè)計(jì)語言后只會一些語法規(guī)則,而很難在課堂上就掌握編程的方法。
2、學(xué)習(xí)思維過程的價值
歐拉認(rèn)為,如果不能把解決數(shù)學(xué)問題背后的思維過程傳授給學(xué)生,那么數(shù)學(xué)教學(xué)就沒有意義。現(xiàn)代計(jì)算機(jī)實(shí)質(zhì)上的發(fā)明者萊布尼茲也說過:“在我看來,沒有什么能比探索發(fā)明的源頭還重要,它遠(yuǎn)比發(fā)明本身更重要?!蔽墨I(xiàn)中指出,“從小到大,我們看過的數(shù)學(xué)書幾乎無一不是歐幾里德式的,從定義到定理,再到推論。這樣的書完全而徹底地扭曲了數(shù)學(xué)發(fā)現(xiàn)的真實(shí)過程。目前幾乎所有算法書的講解方式也都是歐幾里德式的,每一個推導(dǎo)步驟都精準(zhǔn)制導(dǎo)、直接面向目標(biāo),實(shí)際上,這完全把人類大腦創(chuàng)造發(fā)明的步驟反過來了。對讀者來說,這就等于直接告訴你答案和做法,然后讓你驗(yàn)證這個答案和做法可行或成立,而關(guān)于答案和做法到底怎么來,從問題到答案之間經(jīng)歷了怎樣的思維過程卻鮮有教科書能夠給予很好的闡釋。對于這類知識講述(歐幾里德方式)方式的批判,西方(尤其是在數(shù)學(xué)領(lǐng)域)早就有了?!蔽覀兌紩季S,為什么思維本身又需要一遍遍地教呢?講述思維過程而非結(jié)果有以下幾個極其重要的價值。
1)思維的內(nèi)隱化。
思維法則其實(shí)也是知識(只不過它是元知識——是幫助我們獲得新知識的知識),是內(nèi)隱的記憶。我們在思考的過程中覺察不到思維法則的作用,它們卻在幕后實(shí)實(shí)在在地左右著我們的思維軌跡。將思維方法內(nèi)隱化需要不斷練習(xí),就像需要不斷練習(xí)才能在無意識狀態(tài)下騎自行車一樣。
2)思維過程比結(jié)果包含了更多的知識。
思維法則也是知識記憶,是問題解決的策略。在不知其所以然的情況下,算法只是一堆離散的機(jī)械步驟,缺少背后思想的支撐,這些步驟之間就沒有一個本質(zhì)層面上的關(guān)聯(lián),記一個算法,就只有一個算法,所以就跟背歷史書沒多大區(qū)別;而記處理問題背后的思想,卻有助于解決一類問題。思想所處的抽象層面往往比到處都是實(shí)現(xiàn)細(xì)節(jié)的算法本身更接近事物的本質(zhì),涵蓋范圍就越是廣泛。
3)跨情境運(yùn)用。
一本從思維角度講問題求解的書可以教人做思維練習(xí),同時強(qiáng)化一些思維習(xí)慣,熟練之后就可以用到類似的場景中。
4)注重分析推理,找出問題的本質(zhì)。
重在思維的傳授可以讓人養(yǎng)成從問題本質(zhì)人手逐步分析推理的習(xí)慣,而不是直接生搬硬套。很多時候我們并不知道問題的本質(zhì)是什么,而需要靠聯(lián)想和類比來探索。手把手地教學(xué)生走一遍推理的思路,可以讓學(xué)生獲得思維過程的訓(xùn)練。歐幾里德式的介紹除了提供枯燥的知識之外,并沒有提供幫助人獲得知識的思維。傳統(tǒng)教科書的問題在于沒有一個思維過程的引導(dǎo)與分析,沒有按認(rèn)知規(guī)律進(jìn)行知識的傳授,致使概念論述、實(shí)現(xiàn)細(xì)節(jié)有余而設(shè)計(jì)實(shí)現(xiàn)過程描述不足,讓學(xué)生看到的只是一個個問題的詳解,而把握不住算法設(shè)計(jì)的總方法和原則。
3、基于認(rèn)知特點(diǎn)設(shè)計(jì)編程學(xué)習(xí)方法
如何讓學(xué)生容易理解和掌握編程的方法?在教學(xué)中遵循人們對事物的認(rèn)知規(guī)律,注重思維方法的教授,才能提高教學(xué)實(shí)效。筆者在《c語言程序設(shè)計(jì)新視角》(以下簡稱“新視角”)一書中,從學(xué)以致用的角度出發(fā),強(qiáng)調(diào)程序的設(shè)計(jì)思路、分析方法、測試及調(diào)試方法,彌補(bǔ)傳統(tǒng)教科書中的不足。針對實(shí)際問題進(jìn)行程序設(shè)計(jì)應(yīng)該如何人手,“新視角”一書從總體的實(shí)現(xiàn)思想(自頂向下方法)、處理要素的把握(如函數(shù)要素如何提煉)、程序的分析方法(列表分析)等各方面,即如何用“程序的思維”看問題和解決問題,給出了相關(guān)的新方法和新思路。
3.1 把握程序設(shè)計(jì)架構(gòu)全局
教師要有融會貫通教材的能力,使每個教學(xué)環(huán)節(jié)的教學(xué)內(nèi)容相互關(guān)聯(lián)、由淺入深、由基本到拓展。在學(xué)習(xí)之初,我們應(yīng)先從大的方面人手,給出如何做程序設(shè)計(jì)的整體印象,然后再逐步深化,讓初學(xué)者能快速把握整體框架,樹立信心,形成初步應(yīng)用能力。endprint