翻張忠謀自傳上冊,讀到他在美國時為了精進英文能力,開始學習用英文來思考;覺得這種學習方式挺有趣的,就嘗試了一陣子,英文有沒有變好不知道,倒是發現明明是一樣的事情,用不同語言卻會得到不同的描述角度。

語言塑造思考?

一個中英文的重大差別是,中文可以省略主詞,例如我喃喃思考著「今天還沒吃早餐…」,在這若要標明主詞是反而稍嫌累贅;但英文卻一定要說「Well, I haven’t had breakfast yet.」這種差別體現在需要客觀筆法的論文寫作尤其明顯,且看以下這段論文摘錄:「在需求工程的各個階段,(誰?)會遭遇到許多的困難與問題,這都需要一一被克服,(誰?)才能完成滿足使用者需求的軟體系統。」(來源)再例如本文的第一段,我特意省略所有主詞,可有影響文章的流暢度嗎?不把主詞說清楚,使得中文比英文曖昧得多,但也讓中文詩詞的意境比英文更為深遠。

如果我們把更小眾的語言納入討論,這種差異有時更為明顯。在亞馬遜有個馬蒂斯(Matses)部落,他們使用的語言有一種明確的結構,迫使說話的人必須指出自己如何知道所說的事情是真的:他們不說「一隻動物經過」,而是必須說他用眼睛確實看到,或是他因為腳印作為參考;如果問馬蒂斯人有多少老婆,除非他眼前能清楚的看見他的老婆們,否則他會用過去式回答:「我上次算的時候有兩個。」畢竟他並不能確定從上回見過她們之後(即便只是五分鐘前),是否有人過世或與別人私奔;這樣特別的語言結構,讓說謊變得更為困難。

另一個例子是澳洲某原住民使用的庫克薩優里語(Kuuk Thaayunth),該語言不使用上下左右描述位置,而是必須用絕對方位(東北、西南西等)表示物品所在;打招呼時也是問「你要去哪裡?」回答的人必須回答他正前往的方向;不意外的,這類語言的使用者擁有遠優於一般人的方向感和定位能力。

所以語言的確或深或淺的影響著我們的生活與想法。維根斯坦說「語言的邊界就是思想的邊界」,如果這句話是真的,我們是不是可以更進一步說:語言反映了思想本身?也許一種語言,代表的是一種獨立的世界觀?

程式語言呢?

這不是「工程師會幾種外語」的老掉牙笑話;程式語言,作為工程師思想的載體,當然也是一種語言,那麼,程式語言本身也會影響程式設計師的想法嗎?

以錯誤處理(Error Handling)為例

(在這邊花些篇幅為沒寫過程式的人解釋什麼是錯誤處理:寫程式其實就是叫電腦做一大串指令,但執行指令的過程是有機率出錯的,例如有個指令是要下載網站的圖片,但如果網路連線有問題呢?這時候這個指令就會出錯,便要適當的處理它,否則程式就會當機。)

Go 語言的 error 是一種型別(可以想像它是該語言最基本的組成之一),並且用慣例約束工程師在有可能出錯的地方都必須檢查有沒有錯誤;而 Python 則顯得寬容得多,並不主動鼓勵檢查錯誤,加上錯誤檢查的成本較高,使得大部份開發者並不會特別檢查寫出來的程式碼有沒有可能出錯。

想像你設計了一個會開水龍頭的機器人,若是 Go 語言的開發者設計,就是它在開水龍頭時會確認水龍頭有沒有壞掉,如果壞掉會進一步判斷它是沒水還是亂噴,並進行相對應的處理;若是 Python 的設計者,因為水龍頭壞掉的機率很低,所以通常不會特別判斷它有沒有出錯,畢竟,若要對每件可能出錯的事情都一一檢查,工程師所花的時間將會顯著提升。

EAFP v.s. LBYL

實際上,Python 的錯誤檢查機制傾向 EAFP(Easier to Ask for Forgiveness than Permission,請求寬恕比要求許可更容易,或翻成先斬而後奏),我就大膽的讓機器執行指令,出錯了我再來補救;而 Go、Java 等語言則是 LBYL (Look Before You Leap,三思而後行),我一定要先想清楚這個指令執行下去會發生什麼鬼問題,沒檢查所有可能的錯誤那是我的錯。

這兩種風格的差異,造成 Python 寫出來的程式非常的簡潔,而 Go/Java 的程式則很穩固(Robustness);也因此 Python 大放異彩的領域,例如機器學習、爬蟲,都是出一點錯,當機也無所謂;而 Go、Java 則適合用來建造複雜、可靠的系統。

結語

我是先學 Python 再學 Go。在學完 Go 之後回頭寫 Python 的程式,會有一種說不清的怪異感湧上來:我這行程式碼寫下去,真的不會有錯嗎?我是不是該仔細研究這個行為哪個環節可能會出錯?我過去怎麼能這麼大膽的就假設它不會出錯?然後我就驚訝的發現學另一種程式語言,確實是賦予了完全不同的思維模式:原本只會 Python 的我,寫出來的程式碼反映的是勇往直前的豁達;學了 Go 之後,則在設計程式時,多了未雨綢繆的嚴謹。於是又想,用不同的語言思考,是不是也會影響人的想法甚深?故有此文之思辨。

To have another language is to possess a second soul. 掌握另一種語言,如同擁有第二個靈魂 ——查理曼大帝