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