書呆子的復仇:創新和數學一樣永不過時_風聞
返朴-返朴官方账号-关注返朴(ID:fanpu2019),阅读更多!51分钟前
為什麼DeepSeek會讓硅谷許多人感到意外?DeepSeek創始人梁文鋒在接受採訪時回答:“在美國,每天都有各種創新出現,從這個角度看,我們的突破並不算特別。但他們驚訝的是,一家中國公司不僅僅是跟隨者,而是以創新者的身份加入了他們的競爭。這與大多數中國企業習慣的模式完全不同。”
本文是美國互聯網界的“創業教父”保羅·格雷厄姆撰寫的關於編程語言的創新故事,其探索和發展的複雜性似乎並不可複製,但創新的根基——數學,具有永恆的價值。
撰文 | 保羅·格雷厄姆
翻譯 | 阮一峯
01
為什麼要麻煩地去創新?
軟件業有一場永不停息的戰鬥,書生氣的開發者與官僚主義的經理之間總是發生衝突。大家應該都看過漫畫《呆伯特》(Dilbert),熟悉裏面那個髮型高聳的經理。我想,技術行業的大部分人對這個角色過目難忘,因為在他們的公司裏就有這個角色的原型。
那些經理奇蹟般地同時具備了兩種很常見但很難結合在一起的特點:(a)對技術一無所知;(b)對技術有強烈的個人觀點。
假設你需要寫一個軟件。你的經理根本不懂這個軟件的運作機制,也不知道各種編程語言有什麼區別,但是他竟然明確要求你一定要使用某一種語言進行開發。沒錯,他就是要求你一定要用Java語言。
為什麼他會提出這種要求?讓我們看看他究竟是怎麼想的。他的想法無非就是,Java是業界的標準。我知道肯定如此,因為媒體對此有鋪天蓋地的報道。既然它是標準,那麼使用它就不會錯。另外,這也意味着人才市場上肯定有無數Java程序員,即使現在為我打工的這批人都辭職了(真奇怪,這種事情總是不斷髮生),我也能夠輕易地找到替代者。
嗯,這聽起來也不無道理。但是,它的前提是一個沒有説出口的假設,而這個假設實際上是錯的。你的經理相信所有編程語言的功能都差不多,可以互相替代。如果這種想法是對的,那麼他要求你用Java編程就很合理了。反正編程語言之間沒有區別,那麼就用大家都在用的那種語言吧。
但是,編程語言是不一樣的。就算不探討各種語言之間的具體區別,我也能向你證明這一點。
回到1992年,如果你問經理使用什麼語言開發軟件,他會像今天一樣毫不遲疑地回答説C++。如果所有編程語言都一樣,為什麼答案變了?進一步説,為什麼Java語言的設計者要如此麻煩地去創造一種新語言呢?
一般來説,如果你動手創造一種新語言,那是因為你覺得它在某些方面會優於現有的語言。Java語言之父詹姆斯·高斯林在第一份《Java 白皮書》中説得很清楚,之所以要設計Java,就是想解決C++ 的一些弱點。所以結論就是,各種編程語言的編程能力是不相同的。
如果你接受你的經理的假設,然後一路追溯到Java語言的源頭,就會得到與他的假設完全不同的結果。
到底誰對?高斯林還是你的經理?
02
哪種語言是最酷的?
結果當然是意料之中的,高斯林是正確的。在某些情況下,一些語言就是比另一些語言更出色。可是這樣一説又導致了另外的問題。C++不適合解決某些難題,所以Java才被設計出來。那麼,什麼情況下應該使用Java,什麼情況下應該使用C++呢?會不會某些情況下其他語言比它們更合適呢?
一旦你開始思考這個問題,就會發現它非常棘手。如果你的經理被迫去想這個問題,當他看到它的複雜性時,腦袋恐怕都會爆炸。
如果所有語言真的都一樣,那麼他只需選擇一種看上去獲得大部分人擁戴的語言就可以了,因為這實際上是一種流行風尚,而不是技術問題,所以即使像你的經理那樣對技術無知的人也有可能輕鬆得到正確答案。
但是,如果語言各有不同,你的經理就會突然發現,有兩個互相關聯的方程,他必須找到一個能夠同時滿足兩個方程的最佳解,而最要命的卻是他對此根本一無所知。第一個方程是找到(相對於要解決的問題)能夠適用20年左右的最佳語言,第二個方程是(為這種語言)找到合適的程序員和函數庫的機會有多大。如果假定所有語言都不同,就會遇到這種苦苦求解的情況,所以難怪你的經理不願意接受這個假設了。
認為所有語言都一樣的看法的缺點是自欺欺人,但是優點是可以使許多事情變得很簡單。我想這就是這個看法被廣泛接受的主要原因。這是一個令人舒服的想法。
大家都覺得Java一定有過人之處,因為它是一種很酷的新興編程語言。但是真的如此嗎?如果你站在遠處觀察編程語言的世界,似乎Java就是最新的東西。(如果你站得足夠遠,那麼你看到的所有東西就是Sun公司出錢製作的大型霓虹廣告牌。)但是,如果你靠近觀察這個世界,就會發現不同的人對“酷”的理解是不一樣的。在黑客圈子裏,Perl被公認比Java酷得多。黑客社區網站Slashdot就是用Perl開發的。我估計你不可能看到黑客願意使用Java的JSP技術開發網站。可是,還有一種更新的語言叫作Python,它的使用者往往看不起Perl。另一些人則認為Ruby語言是取代Python的最佳選擇。
當你按照Java、Perl、Python和Ruby這樣的順序觀察這些語言,你會發現一個有趣的結果。如果你是一個Lisp黑客,你就看得出來,排在越後面的語言越像Lisp。Python語言模仿Lisp,甚至把許多Lisp黑客認為屬於設計錯誤的功能也一起模仿了。至於Ruby語言,如果回到1975年,你聲稱它是一種有着自己句法的Lisp方言,沒有人會提出反對意見。編程語言現在的發展不過剛剛趕上1958年時Lisp 語言的水平。
03
數學是不會過時的
1958 年,約翰·麥卡錫第一個提出了Lisp語言。我認為,當前最流行的編程語言不過只是實現了他在1958年的想法而已。
這怎麼可能呢?計算機技術的發展不是日新月異嗎?1958年的計算機的運算能力還不如今天的電子錶,而體積卻大得像冰箱(見圖13-1)。那時的技術怎麼可能超過今天的水平呢?
讓我告訴你原因。這是因為設計者本來沒打算把Lisp設計成編程語言,至少不是我們現在意義上的編程語言。我們今天所説的編程語言指的是用來告訴計算機怎麼做的一種工具。麥卡錫最後確實有意開發這種意義上的編程語言,但是實際上他做出來的Lisp卻是完全不同的一種東西,語言的基礎是他的一種理論演算,他想用更簡潔的方式定義圖靈機。正如他後來所説:
Lisp 比圖靈機表達起來更簡潔。證明這一點的一種方法就是寫一個Lisp通用函數,證明它比圖靈機的一般性描述更短、更易懂。這個Lisp函數就是eval……它用來計算Lisp表達式的值……編寫eval函數需要發明一種表示法,能夠把Lisp函數表示成Lisp數據。設計這種書寫法完全是為了滿足論文寫作的需要。(我)根本沒有想過用它來編寫Lisp程序並在計算機上運行。
1958 年年底,麥卡錫(見圖13-2)的一個學生史蒂夫·拉塞爾看到了eval函數的定義,意識到如果把它翻譯成機器語言,就可以把Lisp 解釋器做出來。這在當時是非常令人吃驚的事。麥卡錫後來回憶:
拉塞爾對我説:“我想把eval編成程序……”我告訴他,別把理論和實踐混淆,eval只是用來讀的,不是用來做計算的。
但是他執意要做,並且還真的做出來了。就是説,他把我論文中的eval 編譯成了IBM 704計算機的機器碼,修正了bug,然後對外宣佈做出了Lisp語言的一種解釋器,這倒沒有説錯,確實如此。所以,從那個時候開始,Lisp語言就基本上是它現在的樣子了……
這樣一下子,就在幾個星期之內,麥卡錫發現他的理論演算變成了一種實際的編程語言,而且出乎意料地強大。由此也就得出了20世紀50年代的編程語言到現在還沒有過時的原因。
簡單説,因為這種語言本質上不是一種技術,而是數學。數學是不會過時的。你不應該把Lisp語言與50年代的硬件聯繫在一起,而是應該把它與快速排序算法進行類比。這種算法是1960年提出的,至今仍然是最快的通用排序方法。
Fortran 語言也是20世紀50年代出現的,並且一直使用至今。它代表了語言設計的一種完全不同的方向。Lisp語言是無意中從純理論發展為編程語言的,而Fortran從一開始就是作為編程語言設計出來的。但是,今天我們把Lisp看成高級語言,而把Fortran看成一種相當低層次的語言。
1956 年Fortran 剛誕生的時候,叫作Fortran I,與今天的Fortran語言差別極大。Fortran I實際上是彙編語言加上數學,在某些方面還不如今天的彙編語言強大。比如,它沒有子例程,只有分支跳轉結構。今天的Fortran語言可以説更接近Lisp而不是Fortran I。
Lisp 和 Fortran 代表了編程語言發展的兩大方向。前者的基礎是數學,後者的基礎是硬件架構。從那時起,這兩大方向一直在互相靠攏。Lisp語言剛設計出來的時候就很強大,接下來的20年它提高了運行速度。而那些所謂的主流語言把更快的運行速度作為設計的出發點,然後再用40多年的時間一步步變得更強大。直到今天,最高級的主流語言也只是剛剛接近Lisp的水平。雖然已經很接近了,但還是沒有Lisp那樣強大。
硅谷創業教父保羅·格雷厄姆暢銷近20年的思想經典,一書瞭解何為黑客精神、如何創造財富與開拓未來。
有效的思考方式,才是你最強大的武器,透過黑客與畫家的視角,與聰明的頭腦對話,瞭解為何聰明人和我們想得不一樣。透過15篇通俗易懂的文章,瞭解黑客精神如何塑造我們的世界,用黑客的先進思想與方法武裝頭腦,離財富更近,離自洽更近,離未來更近。
《黑客與畫家(10萬冊紀念版)》
本文轉載自微信公眾號“圖靈新知”。原文摘自《黑客與畫家(10萬冊紀念版)》“書呆子的復仇” 。
特 別 提 示
1. 進入『返樸』微信公眾號底部菜單“精品專欄“,可查閲不同主題系列科普文章。
2. 『返樸』提供按月檢索文章功能。關注公眾號,回覆四位數組成的年份+月份,如“1903”,可獲取2019年3月的文章索引,以此類推。