我如何帶國小生學程式(五) 程式教育磨練的思維

Martinet Lee
6 min readMar 4, 2017

大家都在談運算思維、演算法思維,各有各的定義與說法、各有各的道理。我這邊只想簡單分享教程式的過程中,我發現寫程式的過程中包含孩子過去不曾被多訓練的思維模式。他們的思維上的改變讓他們:

(刪)後來頭腦靈光很多,考試都考一百分、長得又更美更帥了(刪)

欸不是。如果這麼神奇我不就早變成金城武+愛因斯坦了?(資工系的人應該也都攻佔時尚圈與演藝圈了)

以下談談我認為程式教育能夠磨練的思維:

清楚而連續的邏輯

孩子講事情時跳躍而缺乏連貫性的邏輯在所難免,因為沒有特別訓練過。然而孩子要讓程式能依照他們的想法來執行則必須學會如何一步一步的、非常具體的描述出來。有了程式語言的經驗之後,有一位平時思緒跳躍的小朋友,她比以前能夠整理思緒,把她的思想流程以較慢、較細節的方式告訴我們。整體來說,孩子們認知到「因為感覺上這樣才對!」在某些領域上可以用邏輯切得更細更清楚。

有人或許會擔心聯想力與創造力是否會因此減弱,我是認為多慮了。請去詢問藝術領域的人們吧--他們的創作可不是亂無章法的隨意聯想啊!藝術領域也是邏輯脈絡在的,絕不像是一般人以為的跳躍式的。總之,這兩個決不是互相衝突互不相融的。聯想力我不敢說,但創造力一定提升:愈瞭解現實與可用手段,便愈能夠把自己的思考與資源聚焦在可行的方案上,連帶著便是創造力的提升。創造力不是空想,而是能夠實踐的思想!

另外可能有人會問,數學不也是邏輯嗎?為什麼大多都講得好像程式才在訓練邏輯呢?關於這點我也思考過,我初步的結論是這樣的:數學其實分成兩大部分,算術與邏輯。而在台灣,傳統教育的數學偏重於算術:計算數字的技術,而不是在邏輯上。算術只看公式,而數學的邏輯演繹被限縮在”數學歸納法”之類的證明,而這些證明被很機械化的教導給孩子。數學的邏輯展現於數學家思考問題時所採取的分析方法,其他科學亦是如此:物理、化學,何嘗沒有邏輯在裡頭?但傳統教育只教最後的”結果",大家忙著套公式,自然邏輯的部分便少得多了。但是程式本身卻是以邏輯流為主,如果邏輯流錯誤根本不可能正確執行。

邏輯是程式的基礎,但不是全部:以下三大方向是寫程式的過程中能夠心領神會的事情。

分而治之(Divide & Conquer):大問題的解決方法

一個看起來很複雜的大問題,要怎麼解決?在教程式之前,孩子們的腦海中通常只有”會”跟”不會”/”教過"跟”沒教過”。

傳統的科目題型有限,看到甚麼題型便用甚麼公式,有單一正確解法的東西比較難讓孩子體會問題分解的精要。要理解一個問題怎麼分解,要從觀察已被分解的區塊如何互動開始。而程式的問題最基本就有 (1) 輸入 (2) 處理 (3) 輸出 這三大塊:從這天然的問題切法中,不同的問題之下有不同的處理方式,而不同的處理方式對應到不同的儲存方式,孩子則必須依此對輸入進行不同的處理。

分而治之的概念在寫程式的不同學習階段中不斷出現,先是程式具有的天然結構,進一步的可以從函式的定義與使用中看到,最後更可以直接在演算法概念中學習各種 Divide and Conquer 相關的演算法。孩子們可以在這個過程中一再地學習程式乃至於抽象的問題本身可以如何被分解並再利用。

除錯(Debug)

在剛開始的時候孩子們只知道”答案不如預期”、”錯了”,但是不知道該如何行動找出問題。這是因為傳統科目通常只是給定一個狀況,並要求計算,因此錯誤通常發生在計算錯誤、公式的錯誤運用上,而且往往只有在公布答案時才知道錯誤。

程式剛好相反:我們知道應該要出來的結果,並想讓程式完全重現這樣的結果,學生在把答案丟出去之前就會知道它到底正確與否。結果錯了,如何找到錯誤並修正?除錯是逆向的運用分而治之的觀念來一段一段的測試,找出問題點來。另外除錯訓練會要求孩子們考慮極端與特殊狀況,讓孩子們絞盡腦汁去想在符合要求的狀況下有沒有任何可能的輸入會造成程式出現問題。

除此之外,他們會一再的發現很多誤解誤用定義而衍生的錯誤,自然地引起他們對”單位”、”類別”的重視-這種錯誤過去在傳統科目只能口述其重要性,但很少真的受到重視。(我自己大概是在讀高中的書籍時才比較能夠理解與重視單位的意義…)

”除錯”因此也是程式教育中突出的特點之一。工程師朋友都知道,把程式碼寫完其實只完成了1/3,還有2/3的工作在”除錯”上。

算法的好壞與權衡(Tradeoff)

傳統科目只有正確答案。即便有多種解法,也只是供你選擇的不同算法而已,沒有明顯的優劣(尤其對小朋友來說,他們懂而且算得出來的方法就是好方法)。但在程式中,不同的演算法有明顯優劣,而且可以分析。只是能正確還不夠好:真正重要的是解出正確答案的好方法!除了在程式執行時可以展現速度與記憶體使用量的差異以外,還會反映在後期教的演算法上:遞迴雖然觀念上好用但是卻常常執行很慢(例子:Fibonacci數列)。

在這邊我們就可以教孩子們”好”的定義了,他們會發現,原來”好”這件事情,還要看環境的需求:有時我們希望快,有時慢沒關係但要省空間,有時則是各有一定的範圍要求。”好”是相對的。這在一般科目裡面很難被強調出來,但是卻是程式很容易展現的一部分。

這也是為什麼程式能夠教孩子在現實條件限制下,我們要如何做取捨。小朋友藉著程式的物理限制(例如說只能開幾個變數以下、要求程式執行時間在多久以內等)能夠理解到各種做法所需要的不同資源。

小結

其實以上這些淵遠流長,是工程世界與現實跳探戈的老學問了。如果這些便是所謂的”運算思維”,那其實是舊瓶新裝。但,程式革命性的地方在於它能夠把學這些工程思維時間拉到很早很早:過去我們必須學完一堆基礎知識之後,開始設計實際物品時才會接觸到的思維,變得可以拉到小學生都能接觸到,這是前所未有的。

另外必須注意,教程式設計不必然隱含教工程思維!這並不是像很多人所說:教程式設計就會有甚麼”運算思維”。nonononono。這是必須額外花心思教導的。這也點出了現在程式教育應該注意的面向:程式並非只是邏輯,應該要教導工程思維。若教程式只教邏輯,那其實並不是在教”Programming”(程式設計),而是在教”Scripting”(腳本設計)。

下一篇:

我如何帶國小生學程式(六) 小朋友潛力驚人,現有教育卻沒有”培養”的意識

關注我們的粉絲頁:教育圈裡的工程師

--

--