《計算機思維》1:無情的計算


《計算機思維》1:無情的計算

今天開始咱們來講一本今年4月份出版的新書,《計算機思維》(Computational Thinking ),作者是兩位計算機科學家,美國的彼得·丹寧(Peter J. Denning)和芬蘭的馬蒂·泰德(Matti Tedre)。

《計算機思維》1:無情的計算

我們要藉助這本書系統地、但同時也是快速地瞭解一下計算機思維 —— 我們要理解計算機是怎麼回事兒,計算機能幫我們幹什麼,以及怎樣把計算機思維用於其他領域。

為了讓你印象更深,咱們先玩一個小孩愛玩的、小小的數學遊戲 ——


  1. 把你出生的月份和日期這兩個數字相加,得到一個數;
  2. 把這個數乘以 18;
  3. 把所得結果的各個數字相加;
  4. 把上一步結果的各個數字再相加。


而我能猜出來,你最後得到的那個數字是什麼。答案在文稿最後的註釋裡 [1]。

這個遊戲也許能讓小學生感到驚奇,對大人來說就有點直白了。不過我想讓你體會的是這一波操作的過程。

你有什麼感受嗎?把一個兩位數乘以 18 可能讓你感到了一點痛苦。你必須兢兢業業準確無誤地按我說的步驟操作,才能得到我想要的結果。你沒有自我發揮的餘地。


在這個過程中,你是一個 computer。

1.計算師

Computer 這個詞,現在我們都翻譯成“計算機”。但是這個詞最初的含義,可是指人。早在十七世紀就已經出現了 computer,也許應該叫做“計算者”或者“計算師”。計算師不是數學家也不是工程師,他們是專門做計算的人。

二戰期間,計算師甚至還是美軍一個專門的編制。當時美軍發明了射程能達到好幾英里的大炮,而這個大炮怎麼瞄準,就涉及到很複雜的計算。要算一個瞄準角度,你至少必須考慮目標到你的距離,目標跟你的高度差,以及當時戰場上的風速。

如果你學過物理,你應該知道怎麼算。但是,在戰場上找個懂物理的人現場拿三角函數解方程可就太慢了。計算跟“會算”是完全不同的要求。美軍必須把整個計算給流程化,變成標準操作,而且還得能讓好幾個計算師一起算。這就要求這個計算方法滿足三個條件 ——

第一,計算過程必須被拆解成很多步驟,每一步幹什麼必須是簡單而明確的。比如這一步就做個加法、下一步就查個三角函數表,在下一步是除法,等等。

第二,所有這些步驟要能拆分開來,分給幾個計算師,各自負責其中的一部分。而這就有個交流問題,各個計算師算出來的東西得彙總在一起,形成一個最終的結果。

第三,還得有個糾錯機制,讓計算師們能覺察到自己哪裡算錯了。

按今天的概念,這其實就是“分佈式並行計算”。這不但是計算機方法,而且還是超級計算機的方法。所以你看,我們可不是先有了計算機之後才有的計算機思維。人們早就有了計算機思維,只不過當時沒有機器可用、只能用人。


這一波流程化的操作,叫做“算法”。“算法(algorithm)”這個詞,也早在十七世紀就有了。

現在已知最早的一個算法,是歐幾里得在公元前300年發明的計算兩個整數的“最大公約數”的方法,咱們中國人通常稱之為“輾轉相除法”。兩個數的最大公約數,就是能同時被這兩個數整除的最大的數,比如 18 和 48 的最大公約數是 6。你肯定會算最大公約數,但是你的計算方法需要自身的理解和直覺 —— 如果你仔細想想,你也許會發現自己有點說不清是怎麼算出來的。

而歐幾里得提出了一個得到最大公約數的標準操作。給定任何兩個數,它們的最大公約數,和這兩個數的差與其中較小的那個數的最大公約數是一樣的。使用這個方法,你只做減法就能得到最大公約數!比如我們用 gcd 表示最大公約數,那麼 ——

gcd(48,18) = gcd(30,18) = gcd(18,12) = gcd(12,6) = gcd(6,6) = 6.


歐幾里得可能沒想到,他發明的這套操作,到現在仍然在被計算機使用。

2.算法的妙處

說到這裡你應該看出來了,能提出算法,和自己會算,完全是兩碼事。算法最大的好處就是它是機械化的操作。

有了歐幾里得這個算法,操作者根本就不需要知道什麼叫最大公約數,他甚至不需要知道我們為什麼要做這個計算,他只要會算最基本的加減乘除,能夠嚴格地執行規則就行。這就實現了可推廣。

想要現場解決一個數學問題,原本你需要找個專家才行。專家有多年知識儲備和技巧訓練,他會用到巧妙的構思,很可能還有些說不清道不明的直覺,才能給你解決。可是專家太貴了。而如果我們能把一類通用的問題給算法化,你就不再需要請專家了。你只要僱些計算師就行。

算法化就是標準化和流程化。這其實就是整個機械化大生產的秘密!我們看麥當勞的食物,味道也可以,衛生也放心,價格也便宜 —— 而你去吃的那家麥當勞,可沒有著名的廚師。每個麥當勞裡的食物都是一樣的。任何人經過簡單的培訓,都能給你操作出麥當勞食品來。麥當勞有自己的研發中心,它始終在測試不同的口味和營養搭配,但是因為它會算法化,它只要定型一個,就可以推廣到所有。

麥當勞只恨做飯的不是機器人。人們從十七世紀開始就在琢磨怎麼讓機器去做計算,而且發明了構思巧妙的計算機,只是因為沒有電子管晶體管這些東西,那時候的計算機不能取代計算師。

我忍不住就想,如果人類一直沒有發明電子計算機,我們今天就會有一個叫做“計算師”的職業。這很可能是一個白領工作。計算師們很可能會使用中國的算盤做各種計算,還要背誦三角函數表和對數表。他們會被分成從初級到高級的職稱,會有自己的職業道德和職業規範。他們可能都穿著統一的職業裝,髮型一絲不苟……


但是,那將是一個非常低端的工作。做計算師不需要什麼聰明才智。

而要想比他們掙得多,要想領導他們,你就得掌握計算機思維。

3.計算機思維

古人對計算的鑽研可不僅僅是算法,哪怕是沒有計算機的時代,那些最聰明的人就已經想得很深了。十七世紀尚未發生工業革命,但是啟蒙運動已經開始了,牛頓已經出來了,“理性”已經在知識分子中深入人心。

就在十七世紀,笛卡爾和萊布尼茨就有一個設想,說既然計算可以變成流程化、算法化的操作,那能不能把人的推理,也給機械化呢?

今天我們都愛談論各種心理學意義上的偏見和謬誤。啟蒙時代的人就已經知道,讓人去推理,是非常靠不住的。人會有各種主觀的判斷、有很多情緒化的東西。那如果我們能把一切理論的推理都給標準化、流程化、機械化,不管是誰來操作,只要你嚴格遵守規則,就一定能推出客觀的、正確的判斷,這豈不就解決了一切爭論嗎?這不就是通往真理之路嗎?

笛卡爾和萊布尼茨想要的,是冷酷無情的計算。

這恰恰就是計算機思維的第一原則:把人的情感和主觀判斷排除在計算過程之外。

好消息是我們現在已經取得了很多很多進展。後世的學者發明了像“布爾代數”、“謂詞邏輯”這些理論準備,信息論祖師爺香農發明了用電路實現通用邏輯運算的方法 [2],而且我們有了速度無法想象的快的計算機……今天真的有很多理論推導,可以交給計算機去做。計算機甚至能證明數學定理。


但是,壞消息是計算機不能解決所有的問題。現代計算機的祖師爺,圖靈,用“圖靈停機問題”說明,哪怕在理論上,計算機也無法通過閱讀一段算法來判斷這個算法到底是能自動執行到停機呢,還是會永遠計算下去。我們專欄還討論過“哥德爾不完備性定理”,我們知道笛卡爾和萊布尼茨的那個夢想哪怕在數學上也是不可能實現的。

但是,我們仍然得到了一個自動化的時代!這個時代的計算機所能做的事情,一定會讓十七世紀那些思想家和計算師大開眼界。

*

哲學家的思想總是領先於技術實現,而老百姓的思想則被技術所左右。

每個時代的技術,都會主導這個時代的人的思維。老一輩的人愛說“壓力很大”、“動力十足”、“把壓力化為動力”,這其實是一種暗喻 —— 是把人給當成了蒸汽時代的機車。而今天的年輕人則善於用計算機做暗喻,會說……“我的大腦死機了”。


計算機思維已經深入到了現代生活的方方面面。這一講我們理解了“算法”,剩下的咱們後面慢慢說。

註釋

[1] 最後的數字一定是 9。這是因為,如果一個數能被 9 整除,它的各位數字相加之和就一定能被 9 整除。

[2] 精英日課第二季,《硬件的大智慧》。

《計算機思維》1:無情的計算


分享到:


相關文章: