最近幾年時常可以看到一些文章,介紹在某些國家,很早就讓兒童開始接觸程式設計的課程,文章中所描述的兒童,年紀小小就能寫出煞有其事的軟體。

這讓我身邊的許多朋友們都熱烈地主張,應該要提前開始培養小朋友學習寫程式的能力,以及提供撰寫程式的環境,好讓我們的下一代能在這領域盡早萌芽,提升未來的競爭力。

學程式設計越早越好?

的確,以目前軟體影響人類生活的程度及趨勢來看,程式設計能力,只會愈來愈重要。而且,未來我們能否在軟體產業中佔有一席之地,也會和此息息相關。

基於「不讓孩子輸在起跑線」上的想法,的確有不少人主張,讓小朋友們早點開始學習寫程式、培養開發軟體的能力。

甚至,有些人不自覺地,也會流露出一些焦慮的感覺,彷彿我們的程式設計教育,就要因為不能趁早開發出孩子們的程式設計能力,而即將遠遠落後給其他國家。

回想一下,我和身邊年齡相仿的朋友相比起來,算是很早開始學習程式設計的了。

是什麼時候開始呢?國小畢業、準備升國中的暑假,因為看到了電腦課程的廣告,所以請求父母讓我參加。因為家裡沒有電腦,所以一直等到實際上課的當天,才真的算是初次接觸。很幸運的,和當時坊間常見的電腦課程不同的是,這個課程並不是以教授應用軟體為主的,而是以程式設計為主的。做為教學的電腦主要是Apple II ,而教授的程式語言為 BASIC 程式語言。

因為,Apple II 的 ROM 內建開機就是進到 BASIC 的執行環境中,所以,學生們只能做一件事,那就是寫程式。

在學寫程式之前,老師先教我們徒手在紙上繪製流程圖,然後教我們流程圖中的圖示工具,包括開始結束、條件判斷及分支、計算、……等等。接著,老師出題目,要我們在紙上繪製流程圖,以便描述解決問題的方法。

在流程圖的部份,大家都練習到一定程度之後,老師才開始教授簡單的 BASIC 語法,以及如何透過這些語法來完成小程式。慢慢的,學到的語法愈來愈多,能做的事也愈來愈多。在那個暑假,很快學會了如何靈活運用 BASIC 語言。

進了國中之後,家裡也沒有添購電腦,直到考上了高中的暑假,家裡才買了一部 386 PC 供我學習,在那個暑假,我自己買書,憑著 BASIC 語言的基礎,開始自習 80x86 組合語言,而在高中之後,因為社團的關係,又開始學習 C 語言。

這麼早就開始接觸程式設計,我想,讀者可能會認為我多半主張愈早開始學習寫程式愈好吧。不過,我的看法倒不全然如此。

在這一回裡,除了討論什麼年紀適合開始學習撰寫程式之外,這些想法也和如何學好程式設計會有關係。

掌握解題的能力是學好程式開發的關鍵

學習程式設計有那些重要的事情呢?有些人可能認為是語法的學習十分重要,例如,一個原始檔案的結構、有什麼關鍵字、怎麼做迴圈、怎麼做分支控制,還有,怎麼控制其他重要的輸入、輸出設備、……等等。

當然,不懂得程式語言的語法,現在我們是絕對無法撰寫程式的,但是在這些語法之上,還有更重要的事物。

讓我們重新思考,程式語言的作用是什麼?程式語言基本上就是用來描述解決問題方法的語言。我們有一個待解的問題,程式設計者透過解題的思考方法,建構出解題的方法,接著再利用特定的程式語言來描述所想出來的解題方法。

所以,程式語言的重要目的之一,就是讓程式設計者可以透過一種既定的表述形式,來描述解題的方法。

但是,解決問題的最關鍵部份,並不在這個表述方法,而是解題本身。

就像許多人最早學習的程式設計語言,可能都是所謂程序式(Procedural)的程式設計語言。

程序式的程式語言對應的,即為程序式的解題方法。我個人初學程式設計的經驗裡,老師先教流程圖,之後才教 BASIC 程式語言,而流程圖也是一種表述方法,比程式更高階,但都是要表達相同的事情,也就是解題的方法。

想找一群數字中最小的、或是將一群數字排序,這都是問題,而程序式的方法是解決此種問題的方法之一。

因此,你可以用流程圖來表示解題方法、也可以具體寫下程式來表示解題方法。甚至,你可以不用程序式的方式來解決這個問題。

當你會用流程圖描述如何解題時,只要再懂得程式語言的語法,此時,就能輕易用程式來表達解題的方法。

所以最核心的部份在那裡?是如何解題本身。

如果你不懂得透過一套思維方法,來思考如何解決問題,也不知道利用這套方法對應的描述方式,來描述解題方法,就算你很熟悉程式語言的語法,也沒有辦法把程式設計好。

養成良好的解題思維方式

有些人學習程式設計很快能上手,甚至進步神速,原因不在於他們比起旁人更快學會語法,而是因為他們本來就熟悉解題的思維方式,這使得在習得語法之後,可以很快利用程式語言來表示解題的方法。

程式語言有很多種類型,有程序式、物件導向式(不過實際上我們所接觸的大多是物件導向及程序式的混合式)、邏輯式、函數式、……等等。每一種類型都代表著一種解題的思維方式,即使同一個問題,使用不同類型的解題思維方式,解題的方法就有可能會有所不同。

程式設計要學得好、學得快,我認為,關鍵在於解題思維能力的學習及訓練,而不是學習程式語言本身。

只要解題思維能力學得夠好,學習程式語言就能快速上手。反之,若解題思維能力本身就有問題,即使學了程式語言,最後的效果仍是有限。

如果我想教自己的小孩如何程式設計,我不會急著先去教他程式語言,但我會教他相關的思維方式(很有可能就是程序式),來解決各種可能的問題。

這些我們所面對的問題,不見得是演算法問題,也可能是生活中可能遇到的問題。然而,解決問題的思考方式是放諸四海皆準,卻也和程式設計領域是相通的。

根本若固,則枝葉自茂,因此當小孩懂得思考如何解決問題,等到接觸程式語言之後,一切就水到渠成。

就我所知,有些國家主張不要過早開發兒童的腦力。但我們如果要教導兒童什麼,那麼應該是更基礎的事物。

即使我們希望,日後能有更多人具備更強大的程式設計能力,我們也應該著眼在對程式設計有用的基礎能力,而不單只是將關注焦點放在程式設計本身。

若有怕「輸在起跑線上」的焦慮感,其實不妨想想,如果你有機會提前起跑,就一定代表你能最早跑到終點線嗎?

因此,很多事情不用急著結成果實,先耐心地澆灌等待吧!

專欄作者

熱門新聞

Advertisement