《思考的演算》閱讀筆記-變魔術其實就是在學習演算法!?

朱騏
PM的生產力工具箱
9 min readMar 1, 2019

前言

讓我們思考一個情境:

星期天下午,你一個人走在街頭,此時看到路邊的一位街頭魔術師正在表演魔術,你心想:「反正閒著也是閒著,就停下來看看他表演吧!」街頭魔術師拿起了一副撲克牌,開始了他的表演:

大家好,接下來的這個魔術將完全在我的掌控之中,我在桌上放了一個信封,信封內是一個預言,它將會揭露等下你所做的選擇。

首先,魔術師拿出一副52張、完整的撲克牌,請觀眾在牌堆中間切牌,並將原先下面的牌疊放到口袋,只留下原先上半部分的牌放在桌上使用(牌面朝下)。

魔術師說明,他在昨晚做了一個怪夢,夢中有位靈媒教了他一種占卜的儀式,這個儀式最後可以選出一張無人知曉、代表未來的牌,

儀式步驟:首先,拿起桌上的牌(牌面朝下),接下來要將牌分成兩疊。當發到第一疊時要說出”No”,第二疊時說出”Yes”,如此交替可以把手中的牌分成”No”、”Yes”兩疊牌。拿起”Yes”的那一疊(第二疊),再次執行同樣的步驟,”No”、”Yes”、”No”、”Yes”…。不斷執行這個步驟,最後桌上只會剩下一張屬於”Yes”的牌。

魔術師揭露預言,最後這張無人知曉的牌,跟信封中的牌竟然完全相同。

你驚呆了!這個魔術完全顛覆了你的認知,究竟魔術師是怎麼做到的?

這篇文章想要跟大家分享一本書 -《思考的演算:跟著電腦學思考,你也可以成為計算思考大師》,全書都圍繞在一個重要的思考概念 — 「演算法(algorithm)」。

蝦!? 演算法跟你前面說的魔術有甚麼關係?沒錯,一開始我也是這樣想的,但是在看完整本書後,我完全相信「魔術就是一套演算法」,事實上生活中的一切事物幾乎都跟演算法有關,這是一本跟工程師學習的書。

有趣的是,這本書跟你可能先入為主、密密麻麻的程式碼完全沒有關係。這本書想說的是工程師在寫程式時用到的思考概念,例如演算法、拆解、抽象化、表示法、通化、模式比對…等,這些是放在「工程師的工具箱」的思考工具。

這本書牽涉到的議題很多,從魔術、人工智能(AI)、建造一台機器人、到生命醫學,我會分享三個我在這本書學習到的概念,這些概念你可以在閱讀完這篇文章後立刻使用,如果想更深入理解可以再去閱讀這本書,它們是:

  • 演算法,老師是怎麼傳授知識的?
  • 拆解與抽象化,有時候你不用知道的太多
  • 通化與模式比對,用過的東西可以一用再用

在文章的最後,我們將用演算法說明這個魔術怎麼變的,請慢慢享受這篇文章 😃

一、演算法,老師是怎麼傳授知識的?

我們在前面提到非常多次「演算法」這個詞,但它究竟是甚麼?

「演算法」是學習程式語言學習時一定會接觸到的名詞,這個看似莫測高深的名詞,如果我們用維基百科查看一下這個詞,可以得到以下答案:

演算法(algorithm),在數學(算學)和電腦科學之中,為任何良定義的具體計算步驟的一個序列,常用於計算、資料處理和自動推理。精確而言,演算法是一個表示爲有限長列表的有效方法。演算法應包含清晰定義的指令用於計算函式。

好的,這段看起來解是相當清楚的文字,其實還是很難懂。在《初學者學演算法|談什麼是演算法和時間複雜度》中,筆者寫出了一個簡單的定義:

輸入 + 演算法 = 輸出

簡單來說,演算法只是將輸入(input)轉換成輸出(output)的方法,這就是為什麼演算法可以適用在生活中的一切事物,因為每一件事情的處理過程都是這樣!

舉個例子來說,你今天一時興起突然想要做個漢堡,你需要先去買麵包(最好是圓形的漢堡包)、生菜、小黃瓜、主菜(例如牛肉),並且依照固定的順序組裝,所以這個製做漢堡的演算法是:

如何製做一個漢堡Step 1. 去超市購買麵包、生菜、小黃瓜、牛肉Step 2. 將牛肉煮熟Step 3. 將材料由下而上,依序為麵包、生菜、小黃瓜、牛肉、麵包層層組裝

演算法最大的功效,就是將解決問題的方法透過一步步的動作記錄下來,之後不論是自己或是他人,只要看著這個演算法照表操課,就可以解決同樣的問題。

這邊有一個程式語言的語法:IF(如果)…THEN(那麼)…ELSE(否則),它是非常結構化的表達方式,例如我們可以寫:如果今天晚上沒加班,那麼去和朋友喝一杯,否則在公司加班。

由此學習到:養成自己「紀錄」解決一件事情的步驟,最好是從頭到尾、一步一步,並存放在隨手可得的地方(例如Google drive, Google Keep, Evernote…) ,方便隨時回顧。

但是過程中,有些步驟很明顯的無法用三言兩語來表示,例如去超市購買食材,如果遇到超市沒開怎麼辦法?將牛肉煮熟,但牛肉要煮的多熟才可以?

這些問題我們當然可以補充在上面的演算法,但是很明顯的演算法就會變成非常長,而且每一次我們都必須從頭看到尾,這個演算法擴充如下:

如何製做一個漢堡(詳細版)Step 1. 如果沒有麵包、生菜、小黃瓜、牛肉的任何一項,則執行Step 1–1;否則執行Step 2(Step 1.1 如果家旁邊的超市有開,則去超市購買,並進行Step 2;否則開車過橋到大賣場購買,並進行Step 2)Step 2. 如果牛肉已經煮成7分熟或以上,進行Step 3;如果牛肉為生或不足7分熟,則將牛肉煮成7分熟,並進行Step 3Step 3. 將材料由下而上,依序為麵包、生菜、小黃瓜、牛肉、麵包層層組裝

很明顯的,當我們要考慮的事情愈來愈多,這個演算法會變得愈來愈複雜。

我們心中可能會認為,這些不是基本常識嗎,為什麼需要知道的這麼詳細。但別忘了,如果今天要解決的事情變成你從未接手過的難題、或是你要將工作知識傳承給其他下屬,這些詳細的演算法將是必要的。

因此我們可以使用「工程師的工具箱」中其他法寶,拆解與通化。

二、拆解與抽象化,有時候你不用知道的太多

拆解,顧名思義就是將一個複雜的問題,拆成一個個獨立的小問題,並逐一進行破解;而抽象化則是說,在主演算法中只寫出此步驟的大致描述,而將細節額外寫在其他地方。

讓我們再次用漢堡來舉例,從上方的演算法我們可以知道,要製做漢堡基本上需要3個步驟:購買食材、烹調主菜、組裝漢堡。

當我們將「製做漢堡」這件事情分成三個步驟來記錄時,就是在進行拆解,我們一次只需要考慮一個步驟,而非整個問題;而抽象化則是將較為複雜的步驟細節省略、另記在其他地方,當有需要的時候去進行參考就好。

如何製做一個漢堡(詳細版) — 使用抽象化Step 1. 檢查所需食材*Step 2. 烹調主菜*Step 3. 將材料由下而上,依序為麵包、生菜、小黃瓜、牛肉、麵包層層組裝---
*檢查所需食材
1. 如果沒有麵包、生菜、小黃瓜、牛肉的任何一項,則進行購買食材;否則進行烹調主菜
2. 購買食材
如果家旁邊的超市有開,則去超市購買,並烹調主菜;否則開車過橋到大賣場購買,並烹調主菜
*烹調主菜1. 主菜為牛肉
如果牛肉已經煮成7分熟或以上;如果牛肉為生或不足7分熟,則將牛肉煮成7分熟
2. 主菜為鮪魚…(這裡不贅述)3.其他主菜

由此學習到:在記錄解決問題的步驟時,不需要在步驟內紀錄每一步詳細的解決辦法,而是將複雜的問題獨立出來紀錄。

三、通化與模式比對,用過的東西可以一用再用

最後讓我們來說說通化和模式比對。

通化是指將針對某個問題的演算法拉高層級,抽取此演算法的解題概念,藉以套用到解決其他問題上;而模式比對則是在看到一個新問題時,思考問題的核心是否曾在其他問題中出現,進而可以使用已存在的演算法來解決新的問題。

讓我們還是以製做漢堡為例。其實製做漢堡的過程就是「製做任何其他餐點、甚至是其他物品的過程」,例如今天我們想換點不一樣的,我們來做個鮪魚三明治吧!你會發現製做鮪魚三明治的過程也是類似的,只是這次我替換了不一樣的主菜。

再想想生活中的其他例子,例如你在聖誕節時要手做一張手工卡片送給朋友,「製做漢堡」的演算法就可以再次派上用場,只不過這次我們組裝的不是漢堡,而是一張卡片,這個演算法是:

如何製做一張手工卡片Step 1. 檢查所需材料Step 2. 製作卡片主體(一棵聖誕樹!)Step 3. 將材料外而內,依序為卡片、小聖誕樹、其他配件層層組裝

《思考的演算》書中有許多類似的範例,例如「導遊問題」可以幫助我們思考如何最佳化旅行路線,這個問題的演算法同時也適用我們要在一天內花最少時間拜訪多位客戶、或是外送公司如何安排最佳化路線來送餐點。

由此學習到:遇到一個新問題時,試著回想看看過去是否有解決過類似的問題,參考過去的演算法來思考如何面對新問題。

四、所以魔術到底怎麼變?

讓我們回到文章的最開頭,我們要為這個魔術進行一點準備,請你按照以下步驟操作(沒錯,這就是演算法):

事前準備確認整牌牌中,牌背朝上,由上往下數的第16張牌是甚麼,就從另外一副撲克牌中拿出相同的點數放到信封中,接下來就可以準備開始表演了。表演中Step 1. 拿出撲克牌(牌背朝上),請觀眾切大約一半左右的牌*Step 2. 將原先下半副的牌收到口袋中Step 3. 說明怪夢Step 4. 請觀眾發下兩個牌疊,並拿起第二疊*Step 5.揭露信封中的牌就是桌上的那張牌Step 6.享受掌聲!---*切一半左右的牌:這是魔術成功與否的關鍵,我們必須讓觀眾切牌的張數,介於16 ~ 32中間,這樣魔術才會成功。*請觀眾發下兩個牌疊,並拿起第二疊1.和觀眾解釋在發下兩個牌堆時,第一堆為”No”、第二堆為”Yes”2.重複以下步驟- 觀眾發下兩堆牌到沒有手牌為止- 拿起為”Yes”的牌- 若”Yes”的牌堆只剩下1張,執行Step 5

這類型的魔術,在魔術領域中叫做「自動化魔術(automatic magic tricks)或Self-working tricks」,也就是只要按照步驟操作,不需要困難的手法就可以完成,若你對這類型的魔術有興趣,可以參考《Self-working Card Tricks》by Karl Fulves。

說老實話,這是我第一次看到非魔術專業書籍中,竟然多次提到魔術領域中許多重要的學習書籍,這本書不論你是否對魔術有興趣,都非常值得閱讀!

我是朱騏,一個喜歡研究各種生產力工具、也熱愛將專案管理知識應用在魔術學習上的魔術愛好者。如果有任何疑問、想聽的主題,歡迎留言給我 📒如果想給我一點鼓勵,請給我 1–10 個拍手;
如果覺得文章對你有幫助,請給我 10–40 個拍手;
如果有興趣看其他「讀點書」相關的分享請給我 40+ 個拍手讓我知道 👏🏻
最後,謝謝你的閱讀!

--

--

朱騏
PM的生產力工具箱

線上寫作教練,擁有 6 年的 SaaS 產品經理 & 2 年軟體技術寫手工作經驗。我專注寫 (1)技術寫作 (2)數位寫作 (3) 個人知識管理的文章 🤝 歡迎講座邀約、諮詢,可參考 www.chichu.co/training