運算思維包含著許多原則概念,本篇列舉幾個最主要的核心概念,並用簡單的例子協助你大略理解這些名詞代表的意思。
拆解 Decomposition
將龐大又複雜的問題或任務分解成一個一個小單元處理
要如何吃下一整頭牛?很簡單,把它切成多個一口大小的牛排,一口一口吃。
想像一下,當我們面對一個龐大又複雜的問題,是不是常感到手足無措呢?當問題的複雜程度超出預期,無法一口氣解決時,最好的策略就是拆解它,若是此時我們能把它細分成多個小問題,不但能減輕心理的壓力,更可以有效地幫助我們進一步簡化並理解它。
不過,我認為拆解問題最困難的部分,其實並不是「拆解它」,而是「再拼回去」。拆解問題時,若真的是將 1 個問題拆成 3 個相互獨立的問題就糟了,若無法再將 3 個小問題整合回原本的大問題,那麼即便能解決所有小問題,大問題依然不會解。
所以,拆解時最重要的是保持見樹又見林的視野,思緒就像 Google Map 一樣隨時可以拉近、拉遠,能夠同時注意細節又不失整體宏觀概念,清楚各個環節中相互依存的互動關係。
類推 Generalisation
辨識出相同類型或相似的問題
因為運算思維所瞄準的不是解決單一問題,而是找出同一類的問題的解法。所以在每個的案例問題之間,必然存在著某些固定的模式,找到這些模式不但有助於分析理解問題,還可以在新的狀況出現之時辨認是否為同一類型問題,甚至能舉出更多相同類型的例子。
舉個非常簡單的例子:
1. 妞妞有 3 顆糖果,媽媽又給了妞妞 2 顆,妞妞現在有幾顆糖果?
2. 妞妞有 2 顆糖果,媽媽又給了妞妞 4 顆,妞妞現在有幾顆糖果?
這是很簡單的加法問題,透過觀察我們可以發現,除了數量上的不同之外,這 2 個問題基本上一模一樣,所以可以歸納出它們一定有一套相同的解法。往後每當媽媽又給妞妞糖果時,我們知道同樣的問題又再次發生了,可以用一樣的解決辦法處理。
抽象化 Abstraction
保留剛好足夠的細節簡化問題,以便找出模型
剛看到「抽象化」這個詞時可能不太好理解,其實它的概念很簡單,我把它稱之為「萃取」:從情境當中過濾掉不重要的資訊,只留下會對結果造成影響的訊息,讓整個問題變得更加單純。
沿用上面的例子:
妞妞有 3 顆糖果,媽媽又給了妞妞 2 顆,妞妞現在有幾顆糖果?
在這個例子中,「誰」給妞妞糖果重不重要?
不重要,媽媽給、爸爸給或奶奶給都沒差,所以可以把「媽媽」先過濾掉。
妞妞有 3 顆糖果,妞妞又得到 2 顆,妞妞現在有幾顆糖果?
再來,「誰」有糖果會不會影響最後糖果的數量?
不會,所以也可以把「妞妞」省略掉。
如果不是糖果,而是香蕉、或是小汽車,會不會影響計算數量?也不會,所以不論要計算的物品是什麼,都可以用簡單的一個點表示。
經過抽象化與類推原則交叉分析,我們可以發現,不論是什麼東西或是誰,只要是有一個數量又得到一個數量的題目都是同一類型的問題,都可以用同一套解法。
演算法 Algorithms
提出一套精確可執行的解決方案步驟
當問題透過抽象化與類推原則的萃取與分析後,我們已經理解了問題的核心,這是便是發揮創意與智慧來設計一套解決流程的時候了,演算法便是將腦中抽象的解法,寫成具體的執行步驟。
演算法並不是程式,差異在於演算法只是將解決流程以具體明確的方法表示出來,電腦還無法執行;而程式則是指將演算法以特定的程式語言文法及結構編譯後,可被電腦執行的文件。
然而對於程式設計來說,演算法必須盡可能精確,因為將來程式是要寫給電腦執行的,而電腦並不像人腦有許多基本常識,可以自行腦補與判斷,若演算法步驟寫得太過簡單或攏統,執行起來就可能產生許多問題。
邏輯推理 Logical Reasoning
預測並提出解釋
訓練運算思維的同時也會鍛鍊孩子的邏輯推理能力,孩子在編寫演算法的過程中,也正不停地在預測每一個步驟將會造成的影響,每個指令將帶來什麼改變。
這一點在教導孩子編寫行動類型的指令時特別明顯,孩子在編寫「前進」或「右轉」等指令時,都需要預測機器人收到指令後會如何行動,並且造成什麼結果,才能進而繼續編寫下一項指令。
此外,當錯誤 (Bug) 發生,也就是實際執行結果與設計規劃的行動不一致時,邏輯推理能力將更受挑戰,因為孩子要一方面觀察指令並在大腦中模擬,然後另一方面對照實際執行的情況,才能挑出錯誤的片段並進行修正。
不要告訴孩子「該如何解決」,問孩子「你觀察到什麼?你想怎麼做?」
實務上在教導運算思維時,時常會透過一些遊戲、設計一些挑戰,引導孩子運用運算思維的各項概念解決問題。最重要的是,絕對不能直接告訴孩子問題該如何解決,因為這樣教育出來的孩子不會思考,當遇到新問題時,只能坐等著別人來教;教導運算思維是要帶著孩子面對問題,試著自己去拆解、分析,設計自己的解決方式,執行看看並反覆修正。這樣孩子才能真正學會去面對沒有答案的問題,培養出「I can」的解題自信。