運算思維:未來必備的思考能力

2022/10/28閱讀時間約 12 分鐘
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. 運算思維將成為世界上每個人都使用的一項基本技能,除了閱讀、寫作和算術,應該讓孩子都有運算思維的分析能力。
—引用知名電腦科學家周以真Jeannette M. Wing著作
  【Computational thinking and thinking about computing

運算思維是由許多不同的解決問題的技巧構成,核心為創造演算法,其他還包含運算模型科學方法捷徑思考邏輯模式比對表示法抽象化拆解評估檢驗
本文除了介紹運算思維是甚麼,還會說明各個問題解決技巧,希望讀者不只了解各個技巧,更學會以豐富且彼此連結的方式組合使用這些技巧

1.運算思維是甚麼?

Photo by Mark Fletcher-Brown on Unsplash

運算思維的定義

  運算思維一詞最早由數學家Seymour Papett提出,他認為數學應該要以計算為基礎,使用截然不同的方式來教學;然而,電腦科學改變的不是只有數學,所有領域都因此改變。
  運算思維並不僅僅是指電腦思考的方式,儘管我們越來越頻繁地使用運算思維來寫電腦程式,所謂的運算思維,指的是人類解決問題的多元技能之集合,其根本是來自於對計算本質的研究。

  運算思維利用大部分科目發展出的創意、清楚解釋事物的能力、團隊合作等技巧,並帶入數學科學思考方式

  運算思維是非常特別的問題解決技巧,包括使用邏輯演算法進行思考、注意到每個出現的細節,以及設計方法解決問題。

運算思維的重要性

  我們創造出運算模型來試著呈現事物實際樣貌,不再只仰賴真實世界,若發現運算結果跟理論衝突,可透過思考哪裡出錯,找出方法來修正,進而理論與模型更貼近真實世界。
  演算法如今已出現在我們生活的所有面向,並大幅改變人類的生活方式,且持續深化中。這就是為什麼了解運算思維對於每個人都如此重要,就像要了解物質世界,就要學習物理;要了解生物世界就要學習生物學一樣。我們都需要學習一些電腦科學,才能了解這個正在無聲佔據我們人生的虛擬世界。

運算思維的應用

  如果找到可以解所有數獨遊戲演算法,那人類再也不需花時間解數獨遊戲;有了精準預測蚊子飛行軌跡演算法,那就可以在被牠吸血之前,將其殲滅;有了準確分析大氣層雲系變化演算法,那就可以預測天氣,再也不用擔心曬衣服的時候下大雨。
  現在許多銀行使用演算法判斷取代人工買賣股票NASA建立軌跡演算法算出如何在火星準確降落,進行太空探險Youtube利用演算法建立推薦系統自動判斷用戶觀看取向推送影片;飛機和汽車依導航演算法算出最佳路徑;Amazon用演算法預測用戶的消費習慣推送優惠消息

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. 結論

  運算思維是由許多不同的問題解決技巧組成,重要的是,要理解這些技巧並非各個不同的活動,而是以多樣且相連的方式組合在一起使用。它對於問題以及系統會帶來不同的思考方式,把這些技巧作為基礎,用來創造電腦理解的解法。演算法改變我們的生活、工作、遊戲方式,未來也將持續。
Benson老師教你程式學習技巧
Benson老師教你程式學習技巧
嗨!我是Benson老師,是一名靠自學程式創業的工程師,曾自學JS、Python與相關應用建立線上服務獲得被動收入,所以想把過去自主學習程式語言的經驗分享給大家
留言0
查看全部
發表第一個留言支持創作者!