Computational Thinking will be a fundamental skill used by everyone in the world. To reading, writing, and arithmetic, let's add computational thinking to every child's analytical ability. 運算思維 將成為世界上每個人都使用的一項基本技能,除了閱讀、寫作和算術,應該讓孩子都有運算思維的分析能力。
運算思維 是由許多不同的解決問題的技巧 構成,核心為創造演算法 ,其他還包含運算模型 、科學方法 、捷徑思考 、邏輯 、模式比對 、表示法 、抽象化 、拆解 、評估檢驗 。
本文除了介紹運算思維是甚麼 ,還會說明各個問題解決技巧 ,希望讀者不只了解各個技巧,更學會以豐富且彼此連結的方式組合使用這些技巧 。
1.運算思維是甚麼? Photo by Mark Fletcher-Brown on Unsplash
運算思維的定義
運算思維 並不僅僅是指
電腦思考的方式 ,儘管我們越來越頻繁地使用運算思維來寫
電腦程式 ,所謂的運算思維,指的是人類
解決問題 的多元技能之集合,其根本是來自於對
計算本質 的研究。
運算思維 利用大部分科目發展出的
創意 、清楚
解釋事物的能力、團隊合作 等技巧,並帶入
數學 和
科學 的
思考方式 。
運算思維 是非常特別的
問題解決技巧 ,包括使用
邏輯 與
演算法 進行思考、注意到每個出現的細節,以及
設計方法 來
解決問題。
運算思維的重要性 我們創造出運算模型來試著呈現事物實際樣貌 ,不再只仰賴真實世界,若發現運算結果跟理論衝突,可透過思考哪裡出錯,找出方法來修正,進而理論與模型更貼近真實世界。
演算法如今已出現在我們生活的所有面向 ,並大幅改變人類的生活方式 ,且持續深化中。這就是為什麼了解運算思維對於每個人都如此重要,就像要了解物質世界,就要學習物理 ;要了解生物世界就要學習生物學 一樣。我們都需要學習一些電腦科學 ,才能了解這個正在無聲佔據我們人生的虛擬世界。
運算思維的應用 如果找到可以解所有
數獨遊戲 的
演算法 ,那人類再也不需花時間解數獨遊戲;有了精準預測
蚊子飛行軌跡 的
演算法 ,那就可以在被牠吸血之前,將其殲滅;有了準確分析
大氣層雲系變化 的
演算法 ,那就可以預測天氣,再也不用擔心曬衣服的時候下大雨。
2.運算思維 的核心 Photo by Brett Ritchie on Unsplash
演算法創造 運算思維的核心 在於創造
演算法 ,找出一個問題的解決辦法不是只為了得到單一問題的答案,而是這個解法可以得到跟此問題相關的一系列問題的答案,而且只要盲目跟隨
演算法指令 就可以解決。
簡單來說,光是能算出 20+22 = 42 這樣的算法還不夠好,我們想要的是演算法能得到任意兩個數字相加的結果。
假使我們知道某個
理論 ,它能解釋事物如何運作,那麼就可以創造依
同樣方式運作的演算法 ,建立一個
運算模型 ,利用該模型進行實驗,進一步研究真實世界,並做出預測。
演算法是個極強大的工具 ,一旦被創造,就可以不經思考地被使用來完成任務。我們只需要跟隨一串指令,就可無限地遵循操作(一次次地進行導覽、完美地贏得每次比賽、成功的拯救每個病患),而不用再花時間精力來解決問題,也不用再重複思考。甚至要求其他人只要照著演算法操作,可以獲得同樣的成效。
在
電腦時代 ,演算法可以轉換為
程式碼 ,而
電腦 可以替代人類
執行程式碼 。所以
電腦科學家 對演算法特別感興趣,這是因為演算法是
程式基礎 ,但在電腦尚未發明之前,人類就已經在設計演算法了,儘管運算思維這個名詞是近年才出現,卻已經是個
古老的技巧 。
3.運算思維的解決問題技巧 Photo by Olav Ahrens Røtne on Unsplash
運算模型 運算模型 的概念是指,把現實生活中某見想要進一步了解的事物,如
天氣 ,創造一個演算法,讓它在虛擬世界中進行同樣的事。模型能模擬這個事物,透過模擬結果,可以對事物
預測未來的發展 ,譬如預測明天是否下雨。
生物學家 創造如
心臟 或是
癌細胞 的模型 ,可以減少
活體動物實驗 ,改成
虛擬動物實驗 。
經濟學家 創造
財務模型 ,
評估政策 會帶給國家
災難 或是
繁榮 ,在真實世界運作前
確認風險 。而
電腦遊戲 ,如
魔獸世界 ,其實就是
奇幻世界的模型 ,玩家則是可以改變這個虛擬世界的角色,讓人們
實現在現實世界無法做到的夢想 。
簡單來說,有了精準的運算模型,便可以在模型上
進行實驗 ,比起在現實世界實驗,不但
快速高效 且大幅
降低投入成本 。除了運用在
物理學 、
生物學 、
化學 、
地理學 、
考古學 等等,無論哪個領域,它都能帶來新的運作方式,甚至創造出未來的產業。
科學方法
要支持運算模型的程序,需要理解科學是怎麼運作的 。舉例來說,理解一個模型會出現甚麼結果是很重要的,若是結果與現實不相符,則必須透過新預測並進行測試,來確保現實世界的每個結果都有效。
所謂科學方法 就是觀察新現象 ,得到新理論或修正舊理論的系統技術 。因為所使用的方法必須具備科學精神,因此,須遵循以下步驟,形成迭代 或遞歸 ,直到所有的理論與實驗盡量符合,達成一致
1. 仔細觀察,發現現象 :
過去以往的定義是利用感官去查知、覺察自然界的種種現象,但因為感官的主觀性,使得這項定義逐漸被揚棄。現在,大多改為經實驗操作而測量 到某已知或未知的物理量 ,亦即物理量必須是可被測量的。
2. 形成理論 ,解釋現象 :
所有觀察的現象,都必須被既有的理論所解釋,如果既有的理論無法解釋,至少要提出假說 或學說來解釋這種現象。
3. 推論 :
根據以上形成的理論,詳加比較 、歸納 、演繹 ,進而得到新的現象預測 。
4. 反覆實驗驗證 :
重新設計不同實驗,重複上述步驟,如果還不能使實驗結果與理論預測符合,則必須再重複,如果兩相符合,則可形成結論 。
捷徑思考
有幾種情況我們必須改用
捷徑式演算法 ,有時候,我們無法創造最佳解的演算法,有可能是根本做不到,又或者是無法在許可時間內完成。這些情況只能把目標放在得出一個
足夠好的答案 ,而不是最佳解,像是平常使用的導航,本質上就是這樣規畫路線的。
邏輯思考
邏輯思考指的是仔細且準確地看待細節 ,也就是說演算法當中的指令必須包含所有可能性 。
舉例來說,在撰寫
條件判斷式 ,除了判斷為TRUE的指令要執行,判斷為False的指令還有無法判斷TRUE or False的狀況也要設定,這樣才能保證電腦遇到每種狀況至少都可以進行下去,否則他可能會給出錯誤的答案,或是當機。
在創造一個演算法的時候,必須非常有邏輯地思考它是如何運作的,至少在腦中有一套邏輯推論確保它能成功運作。我們絕不會希望因為少了某個細節,而使火星登陸機器人成功起飛並登陸火星後,立刻就當機。
模式比對
對於運算思維而言,要能觀察出兩個不同問題在
本質上的相似度 非常重要,想達到這個目的,必須對這兩個問題進行
模式比對 。
當我們辨認出問題的模式,就可以不加思索地做出正確反應。這也是許多程式運作方式的核心,它們會比對規則與情況,而決定要遵循哪一套合適的指令。發展這類程式的程式設計師,得要列出程式所要比對的模式。
機器學習 也與模式比對有關,如今程式可以
自己找出模式 。
在解決問題時,模式比對可以讓人
省去很多時間 ,因為每次遇到
新問題 ,
不用從零開始 。當新問題與之前解過的問題相似,就可以使用舊解法。例如在
人臉辨識 出現以前,就已經有了
指紋辨識 ,所以在開發人臉辨識演算法時,可以思考是否可以沿用指紋辨識的設計,畢竟兩種辨識演算法都是在做圖像的辨認,應該有極高的相似度。
表示法
透過一個好的
表示法 ,能讓問題更容易解決。它是一種
組織資訊 的方式。像是把
影像 用
點陣圖 來表示,或是儲存許多形成格線的
像素 ,或是儲存
向量圖 (線條與形狀),再透過
濾鏡 來呈現一種模式,創造演算法讓電腦能執行
影像分析 。
抽象化
抽象化 技巧是以某些方式把細節藏起來,讓問題在設計演算法與評估上更容易被處理。
其中
控制抽象化 (control abstraction)是透過將
指令集合 起來,再進行
更大步驟的指令 ,也就是說
隱藏小步驟的細節 。假設要做一道番茄炒蛋,其中細節需要準備食材與調味料、打蛋、番茄切塊、混和炒熟、加調味料等等,這些步驟集合起來便成了一個簡單的指令【製作番茄炒蛋】,同理可推論任何菜餚。
假設未來要做的是一整桌菜,製作單一菜餚的步驟就不需要再考究,因為已經知道作法,要思考的就變成是安排每道菜的製作時間與流程。
另一種抽象化為
數據抽象化 (data abstraction)是
隱藏儲存數據的細節 。舉例,數字會以二進位的方式儲存在電腦;在系統中,16這個數字會儲存成0001000,然而我們在思考時,會直接想成16這樣的十進位數字,要求使用程式的人輸入數字時,也會要求輸入十進位數字,而非二進位數字。
不過最終電腦依舊是以二進位數字運作,無關乎是誰使用這個程式,都不需要知道數字實際上是這樣被儲存的,因為這個細節被隱藏了。
在程式的評估檢驗 也會用到此技巧。譬如評估同樣功能的演算法何者花費時間較短 ,我們並不需要直接去計算所花時間,而是隱藏時間這個細節,改而思考程式的工作量 ,即指令的數量 ,數量越少的花費時間就少。透過計算指令數量,我們就可以知道結果,讓評估演算法的效率變得更簡單。
拆解
拆解 是將一個
大問題分解 成幾個較容易解決的
小問題 ,透過個別
解決小問題 ,達成解決大問題的目標。
這是一個強大的解決問題技巧 ,它讓我們能寫出長達百萬個指令的複雜程式,若少了這個技巧,今天電腦無法擁有做到那麼多事情的程式。
它與抽象化 技巧息息相關,操作概念是將一個程式目標 分成多個小任務 ,接著再針對小任務各別撰寫程式 ,每個小任務都非常容易解決,最後組合 起來就可以解決程式目標。
一旦完成這些個別元件 ,只需要思考它們能做甚麼,而不用想它們是如何完成任務的,為了讓這些步驟變得更容易理解,只要幫每個小程式命名 ,寫清楚各別的任務目標 ,不需要再思考這些煩人的細節,即可組合解決最終問題 。
評估檢驗
評估檢驗 對演算法非常重要,我們需要知道它是否能
成功運作 ,以及是否符合問題的
特殊屬性 或
要求 。
為了確認解法是一個符合目的的優秀解,要評估的東西有很多。最基本的是
運行正確 (functional correctness),必須一直都是如此才行,無論發生甚麼狀況,都能做
正確的事 ,給出
正確的答案 。
除了運行正確,可能還要評估
執行速度 ,演算法能運行多快?有更快的方法嗎?有沒有特殊情況使速度減慢?情況是否常發生呢?這些得依
問題的需求 來思考,評估一個演算法是否適用於該情況。
4. 結論
運算思維是由許多不同的問題解決技巧組成,重要的是,要理解這些技巧並非各個不同的活動,而是以多樣且相連的方式組合在一起使用。它對於問題以及系統會帶來不同的思考方式,把這些技巧作為基礎,用來創造電腦理解的解法。演算法改變我們的生活、工作、遊戲方式,未來也將持續。