程式初學者的失落之鑰 - “運算思維”
June 02, 2015 18:57
Computational Thinking,在華文地區普遍被翻譯為「運算思維」,但是聽起來還是很抽象,到底什麼才是 Computational Thinking (以下簡稱"CT") 呢?
但是如果今天我們要求一個小學五年級程度的孩子,想辦法運用既有的知識,盡量精準地求出「100以內任意正整數的平方根」,這樣做得到嗎? 可以的,讓我們來看看怎麼做。
[先備知識]:如何比較數字的大小、小數的乘法。
首先,瞭解到:「任意正整數都可以看作是『另一較小數與自己的乘積』,而此數即為該數之平方根」(拆解)
再來,觀察出:「任意正整數的平方根,必定會在0與該數之間」(找出規律)
接著,定義:「用X來代表所求數之平方根」(抽象化)、「只要盡量求到精準即可,X與X的乘積與所求數相差0.1以內即可」(歸納)
接著,他只要設計一個「從0開始慢慢找出X」的流程 (設計演算法),如下:
從這個例子就能知道,「計算」跟「解題思維」是兩個不同的概念。
上面提出的流程其實就是「解題思維」,而「計算」會影響的是速度與正確性。
過去我們會非常看重「計算」,是因為人類的計算能力有限,但有時又沒有一個更好的替代方案,所以人類會透過背九九乘法表或諸多公式來提升自己的計算速度與準確性。但是在這個過程中,我們也慢慢地失去了「分析問題」、「拆解問題」的能力,而慢慢的失去了CT的基礎。
現在的孩子生在一個充滿運算能力的時代,手機、平板、筆電、電腦充斥著孩子的生活,「計算」的重要性早已慢慢消失。全球知名的技術專家 Conrad Wolfram 就曾經在一場 TED 演講中提到:「我們該使用電腦教導小孩們真正的數學」
(其實 CT 曾經進入國小課程,但是水土不服罷了....還記得 “建構式數學” 嗎?)
而這些生而知之者,也難以將自身的經驗複製,畢竟他們的學習過程是跳躍式的,根本無法與常人解釋自己是如何學會程式設計。這些絕頂聰明的工程師常說:「我一開始是看XXX書,寫寫OOO專案,在###網站上找一些經典的練習題來做,我想你也行」
錯,通常是不行的!
如果你仔細觀察,這些成功的工程師往往有個特點:「很會拆解問題,能夠一步步的組出解決方案」
他們的超能力,就是「拆解(Decomposition)」能力。 而這項能力,是許多工程師與生俱來的,也是許多人之所以學不會程式設計的關鍵點! 常人在學習程式的時候,往往因為不知道從何拆解問題,而將問題想得太龐大,一開始就備受挫折,也難以堅持下去。但是只要能好好掌握CT,不只是程式設計,連生活中的許多問題都能迎刃而解。
其實在教學現場,我看過太多的孩子,即便經過多次的習題練習,一旦題型改變了就只好束以待斃,因為他們已經習慣了「面對任何問題,我都應該要先學會對應的解法」這種思維。
傳統而死板的教育體制,再加上現在都市的孩子生活單一、缺乏刺激 (以前的孩子或許要幫忙生意、家事,或是在沒有娛樂的情況下設計一些有趣的事情來做),可以說是雪上加霜,更加扼殺了孩子的思考靈活度,也因此越來越多孩子成了一個個的生活白痴。
程式設計,不是養成問題解決能力的唯一途徑,卻是最經濟、快速、靈活,並且符合當下趨勢的一條路。
因此,無論孩子未來是否會走上工程師這條路,具備了計算性思維,無論是對他學業或生活,絕對是百利而無一害的。
Computational Thinking - 用電腦解決問題的思維
計算性思維,是一種用電腦的邏輯來解決問題的思維。 美國知名的電腦科學家 Jeannette M. Wing,曾經寫了一篇很有名的文章:<Computational thinking and thinking about computing>,詳細敘述了何為CT。而 Google 這間極度重視資訊人才的軟體巨擘,也不遺餘力地推動CT教育,並提出了四個CT核心能力:- 拆解 (Decomposition): 將一個任務或問題拆解成數個步驟或部分。Breaking a task or problem into steps or parts.
- 找出規律 (Pattern Recognition): 預測問題的規律,並找出模式做測試。Make predictions and models to test.
- 歸納與抽象化 (Pattern Generalization and Abstraction): 找出最主要導致此模式的原則或因素。Discover the laws, or principles that cause these patterns.
- 設計演算法 (Algorithm Design): 設計出能夠解決類似問題並且能夠被重複執行的指令流程。Develop the instructions to solve similar problems and repeat the process.
CT在數學領域的情境運用 - 開根號
照理來說,開根號是國中二年級的數學範圍。但是如果今天我們要求一個小學五年級程度的孩子,想辦法運用既有的知識,盡量精準地求出「100以內任意正整數的平方根」,這樣做得到嗎? 可以的,讓我們來看看怎麼做。
[先備知識]:如何比較數字的大小、小數的乘法。
首先,瞭解到:「任意正整數都可以看作是『另一較小數與自己的乘積』,而此數即為該數之平方根」(拆解)
再來,觀察出:「任意正整數的平方根,必定會在0與該數之間」(找出規律)
接著,定義:「用X來代表所求數之平方根」(抽象化)、「只要盡量求到精準即可,X與X的乘積與所求數相差0.1以內即可」(歸納)
接著,他只要設計一個「從0開始慢慢找出X」的流程 (設計演算法),如下:
- 先寫下“輸入=17”、“答案=0”、“位數=1”
- 把“答案”乘以自己,看看有沒有超過“輸入”:
- 是:將“答案”減“位數”,跳到第3步
- 否:將“答案”加“位數”,跳回第2步
- 看看“答案”乘上“答案”的結果與“輸入”是否相差0.1以內:
- 是:跳到第4步
- 否:將“位數”除以10,跳回第2步
- 此時“答案”即為“輸入”的平方根近似值,流程結束
從這個例子就能知道,「計算」跟「解題思維」是兩個不同的概念。
上面提出的流程其實就是「解題思維」,而「計算」會影響的是速度與正確性。
過去我們會非常看重「計算」,是因為人類的計算能力有限,但有時又沒有一個更好的替代方案,所以人類會透過背九九乘法表或諸多公式來提升自己的計算速度與準確性。但是在這個過程中,我們也慢慢地失去了「分析問題」、「拆解問題」的能力,而慢慢的失去了CT的基礎。
現在的孩子生在一個充滿運算能力的時代,手機、平板、筆電、電腦充斥著孩子的生活,「計算」的重要性早已慢慢消失。全球知名的技術專家 Conrad Wolfram 就曾經在一場 TED 演講中提到:「我們該使用電腦教導小孩們真正的數學」
(其實 CT 曾經進入國小課程,但是水土不服罷了....還記得 “建構式數學” 嗎?)
讓「生而不知者」,也能學會程式設計
從前,有不少工程師的確是「生而知之者」,好像他們腦袋的迴路就是與常人不同。而這些生而知之者,也難以將自身的經驗複製,畢竟他們的學習過程是跳躍式的,根本無法與常人解釋自己是如何學會程式設計。這些絕頂聰明的工程師常說:「我一開始是看XXX書,寫寫OOO專案,在###網站上找一些經典的練習題來做,我想你也行」
錯,通常是不行的!
如果你仔細觀察,這些成功的工程師往往有個特點:「很會拆解問題,能夠一步步的組出解決方案」
他們的超能力,就是「拆解(Decomposition)」能力。 而這項能力,是許多工程師與生俱來的,也是許多人之所以學不會程式設計的關鍵點! 常人在學習程式的時候,往往因為不知道從何拆解問題,而將問題想得太龐大,一開始就備受挫折,也難以堅持下去。但是只要能好好掌握CT,不只是程式設計,連生活中的許多問題都能迎刃而解。
不只是程式設計,它無所不在
訓練 CT 的過程中,其實就養成了學生用不同角度、以及既有資源解決問題的能力。其實在教學現場,我看過太多的孩子,即便經過多次的習題練習,一旦題型改變了就只好束以待斃,因為他們已經習慣了「面對任何問題,我都應該要先學會對應的解法」這種思維。
傳統而死板的教育體制,再加上現在都市的孩子生活單一、缺乏刺激 (以前的孩子或許要幫忙生意、家事,或是在沒有娛樂的情況下設計一些有趣的事情來做),可以說是雪上加霜,更加扼殺了孩子的思考靈活度,也因此越來越多孩子成了一個個的生活白痴。
程式設計,不是養成問題解決能力的唯一途徑,卻是最經濟、快速、靈活,並且符合當下趨勢的一條路。
因此,無論孩子未來是否會走上工程師這條路,具備了計算性思維,無論是對他學業或生活,絕對是百利而無一害的。