運算思維的核心 — 抽象化
繼 Wing 在 2006 發表了《Computational thinking》提倡運算思維的重要性,引起大量的學者討論、引用。Wing 後在 2008 發表《Computational thinking and thinking about computing》,進一步解釋 — 「運算思維的精髓在於抽象化 (Abstraction)」。
而在運算思維的幾個構面中,抽象化恐怕是最不好解釋的一個部分了。
什麼是「抽象」?
抽象化可不是什麼新名詞,它可以說是人類文明演進的一大基石,有了抽象化能力,人類才能進行較高層次的思考,舉例來說:阿拉伯數字、加減乘除都是抽象化之後的結果。你能想象少了這些元素的世界嗎?
其實不用想象,這件事就確實發生在亞馬遜流域的 Piraha 部落,這個部落沒有數字的概念,因此當你給他們看過一堆電池後(例如6顆電池),請他們試著從更多電池中挑出一樣數量的電池,他們是做不到的。在他們的觀念中,大致只有「比較少一點」和「比較多一點」的分別。
想想,在這樣的世界中,要如何傳承較複雜的知識、文化?光想就覺得很困難,對吧?
接著我們思考一下,要如何向孩子解說何為「乘法」。
有些人可能會這麼解釋:「乘」其實就是「幾倍」的意思。
好,那麼重點來了:請問什麼是「倍」?
這時你就會發現:「倍」這個名詞其實也挺抽象的。不像大象、水、葉子,我們看得到、甚至摸得著,「倍」是個概念,是抽象化之後的結果。理解了「倍」這個名詞後,我們能夠快速地交換更加複雜的訊息、高深的觀念。
抽象化的另一面 - 「提取重點」
Abstraction 本身也有「提取」的意思,在 Wikipedia 的解釋中,抽象化是找出共同點、規律、原則,用一個較高層級的分類來定義事物或概念。舉例來說,「木制的球體」和「皮製的足球」都可被抽象化為「球」。
「隱藏細節、提取重點」可以說是抽象化的核心精神。
古時候的人類就已經會使用簡單的特征來表達實事物、留下記錄,慢慢成為文字。
運算思維中的抽象化
在電腦科學中,抽象化的定義比較寬鬆,只要你將一個流程、規則定義為一個較為簡單的名詞,就算是抽象化。舉例來說,用「平方根」代表「一個乘上自己後等於目標的數」。
Google 曾將 CT 歸納為4個構面 (後來細分為11個):
- 拆解 (Decomposition)
- 模式判別 (Pattern recognition)
- 模式歸納與抽象化 (Pattern generalization & Abstraction)
- 設計演算法 (Algorithm design)
你會注意到「模式歸納」和「抽象化」被放在一起,為什麼呢?
因為抽象化的本意就是要依照共同特徵(模式)將事物歸納為資訊量更少的表現,如此一來,人類或電腦就更容易處理。例如:
- 將 2,4,6,8,10…. 等「都能被二整除」(共同特徵) 的數字歸納為「偶數」
- 將多種貓咪的共同特征 (尖尖的耳朵和明顯的鬍鬚)簡化為一個大家都看得懂的符號。
這邊再進一步舉個例子:
如果你發現容易找到工作的新鮮人大部分都有著「國立大學出身、身高170以上、多益700分以上」等規律,或許你就能將這些指標抽象化為一個加權指數,叫做「競爭指數」之類的。當競爭指數大於特定數值,我們就能將他歸類為「高競爭力」的族群。
(此例子可能並不嚴謹,單純用來表示規律與抽象化之間的關係)
撰寫這篇文章主要是因為最近教育部不斷強調運算思維的重要性,但是放眼望去,相關文章甚少,而抽象化本身又是最不好理解的一個概念,希望能夠透過這篇幫助老師或是研究生更加理解運算思維的概念若希望更進一步了解運算思維。
如果你喜歡這篇文章,請幫我們拍 5 下手;
如果這篇文章對你很有幫助,請幫我們拍 10 下以上,支持我們產出更多文章!
想知道更多關於運算思維的知識,可參考拙作:
- 《什麼是「運算思維」?》 http://oaoa.fun/C8S3W
- 《寫程式,就是學運算思維?》 http://oaoa.fun/C6YR3
- 《教運算思維,一定要透過程式設計嗎?》 http://oaoa.fun/C9NFG
也歡迎追蹤我們的部落格 (https://medium.com/orangeapple),將不定期推播資訊教育相關知識、新聞。
誌謝
撰寫這篇文章後,有幸受運算思維的專家 — 師大資教所 林育慈老師指導,修正了內文未盡善之處。
若讀者對文章有任何疑問、指教,也請不吝提出,非常感謝。