怎麼會有兩個「原本」

今天很突然地發現裘宗燕老師還翻譯了一本《編程原本》,英文名是」Elements of Programming」,是C++的STL庫之父Alexander Stepanov,簡單地說就是「一個大牛」。而看到這個書名的時候,就是一驚:撞衫撞臉撞書名,我那本《程序原本》的英文名原本也是打算用」Elements of Programming」的呀。

這裏寫圖片描述

這兩本書的介紹在這裏:

Alex這本書是2009年出的,中文版則等到了2012年。所以我寫《大道至易》的時候並不知道這本書,這很正常。到2012年《大道至易》發行的時候,我在「程序原本」這一篇上用的標題是「程序源流」,是再到後來把這一部分獨立成書並打算出電子版的時候,才用回到更早擬的名字,也就是《程序原本》。

於是現在就有了兩個「原本」:《編程原本》和《程序原本》。

我仔細讀了讀Alex的《編程原本》,感嘆於裘宗燕老師精準的翻譯——是的,沒錯,這本書確實應該叫「編程(Programming)原本」。Alex在講的,根本就不是「程序是怎麼一回事」,而是「怎麼寫出好程序」——編程源於數學,因而可以從一個數學系統的構建和演進來理解編程的精髓,並「(或許就是)希望基於這種思維方法和開發技術,爲範圍廣泛的軟件系統建立起堅實基礎」。由於這樣的觀念,Alex的《編程原本》中的數學系統既不是嚴格學術上的數學,也不是一般含義上的計算機系統。

在書中,Alex用於定義/構建數學系統的篇幅很小,也就是第一章(「基礎」,14頁)。而在這14頁中,用於討論「數/數據」的篇幅更少,大概只有3~4個小節。在全書接下來的篇幅中,Alex就基於這樣的數學系統開始設計和分析算法,並以之解決實際問題了。

這與我在《程序原本》中講述的內容與方法完全不同,並且存在着根本觀念上的不同。在《程序原本》的第一個小節中,我就通過一個斷言「算是程序之表,數是程序之本」,將整本書定調在了對「數」的討論之中。由數的結構化延伸到算的結構化,以及後面的應用和系統的結構化,其本質上是在討論:如今在「程序」中出現的種種元素,無非是大家在「結構化」這一個求解方向上的所得。因此我纔在《我的架構思想》中提出了我對這所有觀察作出的結論:程序是可被組織的元素。並由此提出進一步的觀點:結構化——只是「程序是什麼」的一個解,而絕非唯一解。

所以,我其實是在討論「程序(Program)的原本」,而Alex在討論的是「編程(Programming)的原本」。正是因此,《程序原本》中看到的就是數據,或者結構化視角下的可組織元素;《編程原本》中看到的就是數學系統,以及由此構建的算法與實現。

算法 + 數據結構 = 程序這個經典的描述中,我討論的是「數據結構」的問題,並進一步的討論了「對數據、算法和程序的結構化」的問題,而Alex討論的是算法問題。源於這種分析問題的剖面不同,Alex的《編程原本》要求讀者有較高的數學基礎,而《程序原本》則幾乎對此沒有什麼要求——所以你看我在致謝中就只感謝了「我的小學數學老師」。^^.

不過《程序原本》要求你有很好的抽象思維能力,你可以把整本書看成一個完整的抽象思維與論證的訓練過程——如何拿着最基礎、簡單的「數」的概念與原則,構建出對整個的系統描述。這本書回顧了你所有見到過的「程序」的樣子,以及這些「樣子」背後的邏輯,但是卻並不教你寫一行有效的代碼、一個有用的算法,或者一個看起來有明確運行邏輯的系統。

算是程序之表,數是程序之本。

又:

我最終覺得我在這本書的英文譯名上還是犯了「嚴重且不可饒恕的錯誤」,所以只好悻悻然地將所有已經用過英文名的地方(例如github上)都進行了修改。我的《程序原本》這本書,今後就只用「Elements of Program」這個英文的書名吧。

好象更確切的譯法是「Elements of Programs」?比如「算法 + 數據結構 = 程序」原書名就是「Algorithms + Data Structures = Programs」。算了,就這樣吧!我的英文還沒有好到可以較真這個東西的地步……