教孩子寫程式:培養邏輯能力

今晚碰巧花了兩個多小時,教一位13歲的小孩寫程式。所謂因材施教,教寫程式也是如此,無有定法。

由於這個小孩頗聰明,選擇在家自學,之前自己試著學過簡單的Scratch,所以我一開始先測試他的程度。雖然他已經大半年沒碰了,但是學過的東西還沒忘,反應很快,由此可見Scratch容易上手,不易厭煩。

我先要他用Scratch寫一個能夠從1加總到N的程式,他說這個簡單,很快就寫完了;原來是用 N(1+N)/2 的公式直接算答案。

我說我們試著不要用公式,因為有些複雜的數列很難推出公式,而且這不是數學課。他不會,因此我知道他Scratch的程度只是入門而已;但是我們很快就找到用Scratch寫重複N次的迴圈,定義遞增的計數器,以及用變數來加總的方法。

國中生也能輕鬆學會C語言

我尋思接下來要怎麼教他?教他什麼?我決定直接教他C語言。原因是,我相信他有辦法學得會,因為他的腦袋看起來比當年自學C語言的我還要靈光,又有我在旁邊教,應該行的。

我們臨機應變找到一個線上的編輯/編譯器,選了一個看起來較為淺顯易懂的C語言中文教學網站,很快地就教了以下的概念:變數的宣告與型態轉換、自動變數與全域變數、算數與邏輯運算式、副程式呼叫、printf/scanf的使用、控制結構(if、while、for、switch、goto)。

由於只是教概念,所以我想盡量跳過一些不重要的細節,但是這小孩很快就掌握住重點,對細節也不放過;例如他一定要知道 ++a 和 a++ 有什麼不同?浮點數轉整數時為何不用四捨五入?。所以他很快就寫出數列加總的程式。

當然,可以學的東西還很多,但我想基本的重點都點到了,今後我想可以酌量教他一些進階的東西,可能是以做出某件作品來學所需的東西(project-based learning),而且最好是他有興趣自行完成其中大部分的學習。

程式教學的重點:培養邏輯思維方式

在今晚的過程中,我屢屢提醒自己,網頁上的教材是給大學生看的,旁邊坐的這位只是國中生。然而我發現我多慮了,誰說國中生的邏輯思考一定不如大學生呢?

如果會出現問題的話,可能是在教材的編寫上,或者是學習者的思維邏輯上。教材往往放入太多瑣碎不必要談的細節,學生見樹不見林,而且邏輯分析與表達的訓練不足。

其實程式設計的基本概念和語法,對於那些很清楚符號和邏輯表達的人來說,是相當簡單易解的;而寫程式的過程,也就是在腦袋裡面將要做的工作分解成一連串的動作,用符號和邏輯表達而已。

不少人對符號和邏輯無能為力,可能因為我們的學校教育過於僵化,應該要大幅改革。

我知道有不少人對符號和邏輯無能為力,我想其中有部分是思考和學習方式所導致的。因此我之前即主張,國民教育中的資訊教育,強調的是基礎觀念,不要教太難懂的東西,主要是為了訓練邏輯思維。

今晚教的這個小孩雖是特例,但這個經驗告訴我,在家自學的小孩有機會比我們當年走得更適志,而且省去一些不必要的冤枉路;如果有好的環境讓他能適性學習、因材施教的話。

不過這樣的環境往往是可遇不可求的,因為我們的學校教育過於僵化,應該要大幅改革,而多數家長還搞不懂自學。

當然,這個小孩未來很可能不念資訊工程,也不見得會直接用到寫C程式的技能,但是靈光的腦袋加上計算思維,對各行各業都會有用的。