【觀書有感】《全圖解-寫給所有人的運算思維入門》
不只是Coding,學習寫程式背後的思維方法

前言
約莫在智慧型手機剛普及,行動裝置開始進入人們的日常生活,人們開始滑起各種應用程式(App),這時候演算法這個詞也開始流行起來。
從那時候起,其實一直到現在也是,演算法被描述成科技巨頭操控人們的無形魔法,只要擁有它就能掌控大眾,主宰人們生活的各個層面,並且讓企業賺得缽滿盆滿。
在接觸寫程式之後,我親身驗證了一個道理:群眾對於陌生的事物,時常會誇大,或是妖魔化。
所以演算法到底是什麼?
我想就用我最近閱讀的一本書來介紹好了!
這本書的書名叫:《寫給所有人的運算思維入門》,作者為日本電腦科學專家、通往未來有限公司(みらいアクセス合同会社)創辦人-草野俊彥。
本書以生活化的角度切入,淺白地介紹了運算思維,以及程式開發者是如何解決問題的。
既然目標讀者是所有人,IT素人也能理解本書內容,認識運算思維,這個建構了我們習以為常的現代科技生活—無所不在的各類智慧裝置、網路通訊,以及近期的AI狂潮——的思維方式。
有在寫程式的人一定要了解它,不寫程式的人也需要認識它。
它不只能用在寫程式,也是一種相當實用的思考框架。
演算法是什麼?
電腦,包括你用的各種智慧裝置,其實都只能執行簡單的指令。
這些簡單的指令必須明確、精準。
以日常移動來說,人對移動這個概念可能不會有太多遲疑,它可以是行走、搭乘或駕駛交通工具,但以上的描述對電腦而言,其實是相當曖昧、模糊,以至於窒礙難行。
那對電腦而言怎樣才算明確、精準?
書中用駕駛來舉例,想像你打算開車回家,來到路口時要操作車輛轉彎,人類駕駛只要專注在目標車道的轉向,憑手感轉動方向盤,利用視線修正車輛的軌跡,就能完成轉彎。
但如果讓電腦來做同樣的操作就會變成:「進入路口2公尺後,用3kgf的力將方向盤往右轉0.87圈」!
原本對人來說可以簡單完成的事情,若變成給電腦下指令,就需要明確、精準到近乎繁瑣、囉唆的地步了。
給電腦的指令之所以需要這麼囉唆,是因為電腦沒有「理所當然」的常識,書中稱之為「內隱知識」。
內隱知識,讓人可以不假思索地進行日常的各種活動,因為我們無意識地依靠生活經驗、學識背景、本能、情緒等等,這早已成為我們行為的一部分,所以我們能夠直覺地發揮這些能力,這是電腦所缺乏的。
因此我們在要求電腦執行任務時,會需要將整體情況、目標,化約成明確的指令,電腦才有辦法執行。
追根究底,電腦的運作不過就是利用電流控制0與1的訊號來計算而已,所以就像前面所說的,電腦只能執行簡單的指令。
那為什麼現今的電腦有各種強大功能,能完成各種複雜的工作,甚至最近的AI浪潮,也讓電腦看起來聰明到不可思議呢?
因為演算法。
「程式由兩個要素構成:讓人與電腦相互理解用的程式語言,以及提供給電腦的指示步驟的演算法(algorithm)。演算法意指為了解開問題的一連串程序。」
演算法說穿了,就只是讓電腦自動完成工作的「一系列步驟」。
複雜巧妙的演算法其實是「簡單指令的複雜組合」。
讓簡單指令,能夠組合在一起的關鍵在於「邏輯」,它在電腦科學領域還有另一個名字:「運算思維」。
看到「運算」,你可能會覺得「很數學」、「很抽象」,但在了解這個概念後會發現,其實我們相當常使用「運算思維」的方式來工作與生活,只是沒有特別意識到,並且刻意練習這種思考方式。
用日常生活來舉例,像是做菜,料理的步驟其實就是演算法,雖然煮一道菜不需要像電腦程式那樣嚴謹(除非你想寫一個給料理機器人用的料理演算法)。
但料理還是有它的邏輯與程序在,像是備料、食材處理、食材搭配、烹煮調味等等,這些程序該怎麼安排、食材該怎麼處理與組合等等。
當有大廚將這些步驟整理成食譜,其實就是寫成一個讓其他人也能照著步驟完成料理的演算法。
(除了駕駛與料理的例子,書還提供許多有趣的問題給讀者進行思考練習,或是跟著作者的思路一起來體驗運算思維的操作過程。)
運算思維
運算思維的內涵包含四個步驟:拆解問題 -> 模式辨識 -> 抽象化 -> 演算法設計。
從這套流程我們可以發現,演算法是在運算思維的最後流程才冒出來。
運算思維的運用,初步會先將遇到的問題進一步定義與拆解,如果問題太過龐大、空泛、複雜,就很難找到下手解決問題,甚至走錯方向。
在嘗試拆解問題的過程,如果發現某些現象一再出現(模式識別),那就可以整理成規則(抽象化)來處理。
程式設計中的DIY原則(Don’t repeat yourself)就是這樣,當寫程式的開發者發現,他們不斷在寫重複的代碼,或是不斷將某段代碼一直複製貼上時,就該考慮該怎麼將這個「反覆執行」的動作,抽換成讓程式自動運行的規則,來完成這個低效的作業。
最後將規則統整成一連串解決問題的步驟,就是演算法。
以前我還在政府機關任職的時候,執行公務都必須按照既定的SOP進行。
SOP其實也是演算法的一種,我之前有寫過的一篇:《為什麼流程很重要?從戰術執法到運算思維,我學到受用一生的思維技術》就有提過。
(有些人會將SOP視為僵化的教條,確實啦!如果制定出來就不再隨著時代變遷更新的話,那這種沒有迭代可能性的有毒SOP確實跟演算法扯不上邊。)
其實大部分專業工作者在工作時,都會有一套專屬的流程,這是經驗總結出來的Know-How,專業人士或者說專業化,就是熟練流程並且能夠精準判斷情況的行為。
所以懂專業才不會瞎忙(雖然專業遭到輕忽的情況好像在各行各業大量發生…),正如美國的生產管理學家-威廉·愛德華茲·戴明所說的:「說不出你的工作流程,就代表你根本不知道自己在幹嘛!」
演算法可以解決曖昧問題?
雖然食譜上料理步驟可以視為一種演算法,但做菜有時候含有「藝術」成分,多年經驗的大廚有時候會隨性揮灑,但電腦在運行過程不存在模糊的空間,機器會完全按照演算法的規則來執行。
人類的判斷力具有彈性。 機器人(電腦)是有限制的,無法自行任意推敲內容來決定規則。
那當碰到曖昧的人性問題,演算法還有介入的空間嗎?
有句老話是這樣說的:「運用之妙,存乎一心」。
有時候不是解決辦法不存在,而是有沒有辦法想到。
許多巧妙的解決方案,都是人類思考能力極致的展現。
書中有一個思考練習是關於購物的情境,讓我覺得很有啟發,這個問題是關於該如何評估人們購物時的主觀購買慾望。
作者提到:
將隨心情影響的划算感轉換為「機率性現象」,程式設計便大有可為。
本來曖昧難解的人類喜好、心情,換成數學的機率概念來描述就變得清晰起來。
近期的AI狂潮,讓人們見識到,即便指令既不明確也不精準,機器也能準確理解人類使用的自然語言,甚至只靠模糊的指令,也能產生有結構、條理的回答,這感覺很神奇,但其本質仍然是簡單指令所構成的演算法。
當簡單的事物持續累積,且不斷彼此互動時,最終就會增長成極其複雜的系統或現象,這在探討系統理論 (Systems Theory)與複雜性科學 (Complexity Science)的領域中,有個專有名詞稱作「湧現 (Emergence)」。
其實在生活中就有許多湧現的例子,像是天氣,其本質不過就是水分子與空氣的流動,當規模變大,就會複雜到連超級電腦也難以預測的天氣系統(所以你看氣象預報都只寫機率);市場,從最單純的買賣行為,演變成千絲萬縷的經濟脈動;群眾行為,像是投票,即便確定少數選民的投票偏好,也沒有一家民調公司能夠「每一次」都完美預言選舉的當選人等等。
電腦演算法也是一種湧現,原本單純的0與1的電流訊號,演變成現在的AI。
湧現造成的複雜性,讓一般人甚至連專家也難以完全理解其中的運作機制,這樣你應該就能了解為什麼運算思維可以有這麼大的能耐,甚至讓演算法成為一種科技信仰。
結語
網路通訊的發展,讓獲取資訊不再是問題。
所以記憶知識資料的能力價值,已經被搜尋引擎的等技術工具取代大半,反倒是觀點、思路、如何解決問題的能力,開始變得稀缺。
畢竟培養思考能力,比死記硬背知識還要花費成本(時間、方法、麻煩程度)。
運算思維是一套簡單實用的思考框架,它讓素人也能一窺大神們解決問題的思路,雖然它出身自資訊領域,卻不只能拿來coding。
近期生成式AI的迭代,各式強大功能讓各界驚嘆,也讓各個專業領域的知識工作者人人自危,各種販賣焦慮的言論也隨著AI熱潮竄起。
不免讓人覺得,如果AI的產出水準這麼高,人們所積累的學經歷與思考產出是不是毫無意義?AI最終仍會取代人的思考?
我最近看到一個觀點,讓我覺得,不需要悲觀到完全交出思考的主導權:
AI在本質上還是工具,駕馭AI、對AI下指令的還是人。
而該怎麼對AI提問,取決於你的思考品質,問問題的能力會決定AI的回答水準。
垃圾進就只有垃圾出(garbage in, garbage out),資訊領域流傳已久的那句老話依然適用。