http://blog.jobbole.com/18587/
原文出處: Steve Yegge
譯文出處:baohao
【譯注】:圣經(jīng)記載:在遠古的時候,人類都使用一種語言伪阶,全世界的人決定一起造一座通天的塔煞檩,就是巴別塔处嫌,后來被上帝知道了,上帝就讓人們使用不同的語言斟湃,這個塔就沒能造起來熏迹。 巴別塔不建自毀,與其說上帝的分化將人類的語言復雜化凝赛,不如說是人類自身心靈和諧不再的分崩離析注暗。
之所以后來有了翻譯,不僅是為了加強人類之間的交流哄酝,更寄達了一種愿望友存,希望能以此消除人際的隔閡,獲求來自心靈的和諧及慰藉陶衅。真正的譯者屡立,把握血脈,撫平創(chuàng)痕搀军,通傳天籟膨俐,開啟心門。
這是我寫的旋風式的編程語言簡介 —— 我本來為亞馬遜開發(fā)者雜志本月的期刊寫的罩句,但是發(fā)現(xiàn)我寫的東西沒法見人焚刺。
首先,我偶爾一不小心口出臟話门烂,或者對上帝不恭的話乳愉,所以在很官方很正式的亞馬遜上發(fā)表是不合適的; 所以我就把它塞到我的博客里了屯远,我的博客反正沒人看的蔓姚。除了你以外。是的慨丐,只有你會看坡脐,你好啊。
其次房揭,這是一項進行中的工程备闲,現(xiàn)在只是東打一耙西搞一下,還沒有精加工過的捅暴。
又一個把它寫到博客里的很大的理由恬砂。不需要很好,或很完整蓬痒。就是我今天想說的一些話觉既。請隨便!
我的旋風式簡介會講C、C++瞪讼、Lisp钧椰、Java、Perl (我們在亞馬遜用到的所有語言)符欠、Ruby (我就是喜歡) 和 Python嫡霞,把 Python 加進來是因為 —— 好吧,你看了就知道了希柿,現(xiàn)在我可不說诊沪。
C
你必須懂C。為哈?
因為出于所有現(xiàn)實的理由曾撤,這個世界上你過去端姚,現(xiàn)在,將來會用到的每一臺計算機都是一臺馮·諾曼機器挤悉,而C是一種輕量級的渐裸,很有表達力的語法,能很好的展現(xiàn)馮·諾曼機器的能力装悲。
馮·諾曼架構就是你每天都用的計算機的架構的標準:一個 CPU昏鹃,內(nèi)存,硬盤诀诊,一條總線侠姑。
多核計算機并沒有帶來本質(zhì)上的變化囱持。
馮·諾曼機是一個很方便,很便宜趾疚,上世紀五十年代的實現(xiàn)圖靈機的技術网棍,圖靈機是執(zhí)行計算的最知名的抽象模型钓觉。
世上還有其他的計算的機器马僻。比如降狠,Lisp 機器,是上世紀 50 年代對 Lisp 計算模型的實現(xiàn)溜畅。
Lisp 模型是基于 lambda 代數(shù)的一種計算語言表示法,后者是與圖靈機同構的一種模型极祸。
不像圖靈機慈格,lambda 代數(shù)能被人類讀和寫。但是這二者是同等能力的遥金。它們同樣精確的表示了計算機能干什么浴捆。
Lisp 機現(xiàn)在不是很流行了,除了在跳蚤市場里稿械。從誰更受歡迎來說选泻,馮·諾曼機器贏了。
還有一些其他的計算機,比如神經(jīng)網(wǎng)絡計算機页眯,譯者也不知道怎么翻的計算機(cellular automata)梯捕,但是這些都不夠大眾化,至少現(xiàn)在是這樣的窝撵。
所以你必須知道C傀顾。
還有一個你必須知道C的原因是,Unix 是用C寫的碌奉。巧的是短曾,Windows 也是〈土樱基本上所有的其他操作系統(tǒng)都是用C寫的嫉拐。
因為這些操作系統(tǒng)都是馮·諾曼機的操作系統(tǒng),你還能用別的嗎? 任何跟C很不一樣的東西都會跟硬件的實際能力相差太遠而導致無法滿足性能上的需要魁兼,至少對一個操作系統(tǒng)來說是這樣—至少在上個世紀是這樣婉徘,碰巧這些系統(tǒng)都是上個世紀的。
你還應該知道 Lisp璃赡。你不必用它來干實際工作判哥,雖然它在很多 GNU 的軟件里都會很用得著。
尤其是碉考,你應該學會 Scheme塌计,Lisp 的一種小巧化的,純潔的方言侯谁。GNU 的版本叫 Guile锌仅。
他們在麻省理工和加州伯克利教新學生一到兩個學期的 Scheme,這些學生都對他們?yōu)楣獙W這么奇怪的語言抓破腦袋墙贱。
實話實說热芹,作為第一門學習的語言,這是一個很爛的選擇惨撇,第二門也是很爛伊脓。
你應該學會它,最終魁衙,但不是作為第一門或第二門語言报腔。
這是很難的哦。這是很大的一步剖淀。學會怎么用 Lisp 寫出像C語言的程序是不夠的纯蛾,那沒有意義。
C 和 Lisp 一個就像紅外線纵隔,一個就像紫外線翻诉,它們分布在光譜的最兩端炮姨。它倆一個牛逼的地方剛好是另一個傻逼了的地方。
如果說碰煌,C是最靠近計算機是如何工作的語言模型舒岸,Lisp 就是最能反映計算(注意,這里沒有了“機”字拄查,計算機和計算是很不同的吁津!譯者注)是如何工作的模型。
你不需要懂很多 Lisp堕扶,真的碍脏。緊咬 Scheme 就哦了,因為它是最簡單最干凈的稍算。其他的 Lisp 已經(jīng)發(fā)展成了很大典尾,很復雜(很好很強大? 譯者:-)的編程環(huán)境,就像 C++ 和 Java糊探,要有很多庫啊钾埂,工具啊等等之類。
那些科平,你不需要知道褥紫。但是你應該能用 Scheme 寫程序。
如果你能夠做出 The Little Schemer 和 The Seasoned Schemer 這兩本書里的所有習題瞪慧,你懂得就夠多了髓考,我認為。
但是對于你天天要做的編程工作弃酌,你應該基于以下條款選擇你的語言:
庫氨菇,
文檔,
工具支持妓湘,
操作系統(tǒng)集成查蓉,
資源,
和一堆其他的東西榜贴。
這些條款跟計算機如何工作關系很小豌研,但是跟人類如何工作關系甚大。
人們還在用很直白的C語言寫東西唬党。很多東西鹃共。你應該懂C!
C++
C++是地球上最蠢的語言初嘹,即使是從蠢這個字的真正意義上出發(fā)及汉。
C++很無厘頭沮趣。它不知道自己是什么東西屯烦。它沒有自省(introspective,面向?qū)ο罄锏囊粋€概念,譯者注)驻龟。
C也沒有温眉,但是C不是“面向?qū)ο蟆钡模嫦驅(qū)ο蠛艽蟪潭壬鲜顷P于要讓你的程序知道它自己翁狐。
對象就像演員类溢。所以面向?qū)ο笳Z言應該有運行時的自省機制,知道自己是個什么類的對象露懒。
C++不是這樣的闯冷,真的,你不會那樣用它懈词。
關于C:寫一個C的編譯器是那么的簡單蛇耀,以至于你可以用C寫一個關于C的工具,用起來就像是有內(nèi)省機制坎弯。
而 C++ 呢纺涤,基本上是不可解析的,所以如果你想寫一個很牛逼的工具用來 —— 比如抠忘,告訴你你的虛函數(shù)的原型撩炊,或者幫你重構你的代碼,你將不得不依賴別人的工具集崎脉,因為你自己在除非腦子進屎的情況下是根本不會去寫一個 C++ 的解析器的拧咳。
而市面上所有的 C++ 的解析器都很傻逼。
C++很蠢荧嵌,你不能用蠢語言創(chuàng)造一個好系統(tǒng)呛踊。
語言決定世界,蠢語言決定蠢世界啦撮。
所有的計算都基于抽象谭网。你用低級的東西創(chuàng)造出高級的東西。但是你不能用分子創(chuàng)造出一個城市赃春。嘗試使用太低級別的抽象只會給你帶來麻煩愉择。
我們就惹上麻煩了 (是指亞馬遜的員工,還是所有 C++ 的程序員? 我也不知道织中,譯者注)锥涕。
理智的情況下,你用C寫的最大的東東就是一個操作系統(tǒng)狭吼。而操作系統(tǒng)其實不是很大的层坠,真的。它們看起來很大刁笙,但那是因為它們有很多應用軟件破花,操作系統(tǒng)本身的內(nèi)核是蠻小的谦趣。
你用 C++ 能寫的最大的東東是…也是操作系統(tǒng)。好吧座每,或許稍微再大點兒前鹅。讓我們說,再大三倍吧峭梳〗⒒妫或者 10 倍吧。但是操作系統(tǒng)內(nèi)核最多也就葱椭,那啥捂寿,一百萬行代碼? 所以我說你能用 C++ 寫的最大的系統(tǒng)大概也就是一千萬行代碼吧,再大的話就開始不行了孵运,這玩意兒你沒法控制了者蠕,就像恐怖片里的…
我說的一千萬行是指如果你那時候還能讓你的系統(tǒng)編譯通過的話。
我們(在亞馬遜掐松,譯者注)有五千萬行 C++ 代碼踱侣。
不,現(xiàn)在還要更多了大磺。我已經(jīng)不知道有多少行了抡句。
上個圣誕節(jié)是五千萬行,那是九個月前杠愧,而它以每季度八百萬行的規(guī)模增長待榔。增長率本身也增長,媽呀流济。
我們想在這個系統(tǒng)里干點啥好像要一萬年锐锣。一個亞馬遜工程師有一次這樣描述我們的代碼庫:“一座很大的屎山,你見過的最大的山绳瘟,每次你想修正一個 bug雕憔,你的工作就是爬到屎山的正中心去√巧”
伙計們斤彼,那哥們可是在四年前說的這話。他現(xiàn)在已經(jīng)到更環(huán)保綠色的牧場上去了蘸泻。
真是太可惜了琉苇,他可是個實實在在的高手啊。
這都是 C++ 的錯悦施。別跟我爭論并扇。就是的。我們用的是世上最蠢的語言抡诞。這簡直有點老板級的蠢穷蛹,你說呢? (譯者注渗勘,meta 在計算機術語里通常表示更高一個層次,比如俩莽,meta-language,比普通的 language 高一個層次乔遮,意思是關于語言的語言扮超。
哲學里應該會經(jīng)常用到這個詞。我不懂哲學蹋肮,但是我覺得老板們總是比我們高一級出刷,所以 meta-dump 我就翻譯成老板級的蠢嘍。:-)
說了以上這些難聽的話坯辩,話得說回來了馁龟。用 C++ 寫出漂亮的代碼顯然是可以的,我的意思是說漆魔,這樣的代碼應該大部分還是C坷檩,偶爾很有品味的,很有節(jié)制的用一點C++改抡。
但是這種代碼幾乎從來不會被寫出來矢炼。C++是個很好玩的游樂場,而如果你把它玩兒得門兒清的話你會覺得自己特牛阿纤,所以你總是被誘惑把你知道的所有的東西都用上句灌。
但是那是很難做好的,因為從一開始這個語言就太狗屎了欠拾,最終胰锌,你會弄得一塌糊涂,即使你很能干藐窄。
我知道资昧,我說的都是異端邪說,該被釘?shù)绞旨苌系摹?br>
隨便吧荆忍。我在大學里的時候老喜歡 C++ 了榛搔,因為我那時候就只知道這一門語言。
當我聽到我的語言教授东揣,Craig Chambers践惑,絕對的厭憎C++,我想:“為啥呢? 我覺得它挺好的啊”嘶卧。
而當我聽到 STL (標準模板庫)的發(fā)明者被采訪時說他恨 OOP (面向?qū)ο缶幊?時尔觉,我更是認為他肯定是磕藥了。怎么會有人恨 OOP 呢芥吟,而這個人竟然還是 STL 的發(fā)明者?
親不敬侦铜,熟生厭(語出圣經(jīng)专甩,譯者注)。說的是在大多數(shù)情況下钉稍,跟一件事物熟悉了之后你就失去對它的膜拜尊敬了;
在計算機語言里情況不是這樣的涤躲。
光對一門語言熟悉不會導致你看輕這門語言。
你必須成為另一門更優(yōu)秀的語言的專家(才能讓你明白原來那門語言有多么多的問題)贡未。
所以如果你不喜歡我針對 C++ 大放厥詞种樱,請你去學另一門語言并成為一個專家(我推薦 Lisp),只有那時你才有足夠的武器與我爭論俊卤。
然而嫩挤,那時你將不會跟我爭了。你上了我的當了消恍。你也會跟我一樣變得不喜歡 C++ 了岂昭,你或許會覺得我這個人很惡心,把你騙得不喜歡自己曾經(jīng)的最愛了狠怨。
所以或許你應該把我說的一切都忘了约啊。C++挺好的其實,真的佣赖。它就是很棒棒(譯者注棍苹,作者在這里用了 ducky,這是一個女性喜歡用的夸某物好的詞茵汰,近來也為玻璃們喜愛)枢里。
忘了我說的話。C++不錯的蹂午。
Lisp
(我打賭這一節(jié)會讓你覺得驚訝栏豺,即使你已經(jīng)關注我的博客有一陣了[譯者注,作者也可能是說豆胸,即使你成為亞馬遜的員工有一陣了])
亞馬遜創(chuàng)業(yè)之初奥洼,我們有很多明星級的工程師。我不認識他們所有人晚胡,但是我認識幾個灵奖。
比如?Shel Kaphan, 大拿估盘。Greg Linden, 大拿瓷患。Eric Benson。即使在他加入亞馬遜之前就已經(jīng)有自己響亮的名氣了遣妥。也是大拿擅编。
他們寫了 Obidos 服務器。是 Obidos 讓亞馬遜成功的。只是后來那些生產(chǎn)大便很拿手的工程師爱态,網(wǎng)頁開發(fā)者谭贪,搞前端的人 —— 這些人因為生產(chǎn)大便很拿手而總是能讓經(jīng)理們滿意 —— 只是在后來這些人把 Obidos 搞糟了。
(他們的大便)把整條河都堵了锦担,打個比方說的話俭识。但是 Obidos 是亞馬遜最初的成功的一塊關鍵的基石。
這些最早的牛人們在亞馬遜神圣的代碼庫里只允許兩種語言:C 和 Lisp洞渔。
你自己去想吧套媚。
當然,他們所有人都使用 Emacs痘煤。靠猿规,Eric Benson 是 XEmacs 的作者之一衷快。這個世界上所有偉大的工程師都在用 Emacs[注1]。那種世界因你而不同級別的偉大姨俩。不是坐在你旁邊的格子里的那哥們那種偉大蘸拔。也不是 Fred,走廊盡頭那哥們环葵。
我說的是我們這個行業(yè)里最偉大的軟件開發(fā)者调窍,那些能改變這個工業(yè)的面貌的人。
像 James Gosling 們(Java 語言設計者)张遭,Donald Knuth 們(這個人沒有聽說過的話趕緊改行吧邓萨,別搞計算機了),Paul Graham 們[注2]菊卷,Jamie Zawinski 們缔恳,Eric Benson 們。
真正的工程師用 Emacs洁闰。你必須很有點聰明才能把 Emacs 用好歉甚,而如果你能成為一個 Emacs 大師的話它會給你難以置信的牛力。
有機會的話你應該站到 Paul Nordstrom 的肩后看看他是怎么工作的扑眉,如果你不相信我的話纸泄。對那些一輩子都在用爛 Visual Studio 之類的集成開發(fā)環(huán)境的人來說,一定會大開眼界的腰素。
Emacs 是那種你可以用 100 年的編輯器聘裁。
Shel, Eric, Greg,和其他像他們那樣的人弓千,我沒有足夠幸運能跟他們直接一起工作:他們禁止在這里使用C++咧虎,他們禁止使用 Perl(或者 Java,為完整起見)计呈。他們是明白人砰诵。
現(xiàn)在我們都在用C++征唬,Java 和 Perl 了,所有的代碼都用這些語言茁彭。我們的前輩們已經(jīng)到更環(huán)保的牧場上去了 (指沒有大便的牧場总寒,譯者注)。
Shel 用 C 寫了 Mailman理肺,客服部的人把它用 Lisp 封裝了一下摄闸。
Emacs-Lisp。你不需要知道 Mailman 是什么東西妹萨。除非你是個 Amazon 的老員工年枕,或許不是搞技術的,而且你曾經(jīng)不得不讓客戶哈皮 (只有在這種情況下你才需要知道 Mailman乎完,譯者注)熏兄。
不是間接的,因為你用 C++ 寫的一個狗屎功能跑不起來了树姨,讓客戶很生氣摩桶,于是你不得不去搞定它以恢復客戶的哈皮度。
不帽揪,我是說直接的硝清,意思是,你必須跟他們聊转晰。我們可愛的芦拿,不識字的,呱呱其談的查邢,心地善良的防嗡,充滿希望的,困惑的侠坎,能幫點小忙的蚁趁,憤怒的,哈皮的客戶們实胸,真正的客戶們他嫡,那些從咱們這里買東西的人,我們的客戶們庐完。(如果你必須跟他們打交道的話钢属,)那你就會知道 Mailman 這個東西。
Mailman 是客服部的客戶電子郵件處理軟件门躯,我們用了它有…四淆党,五年? 反正是很長時間。它是用 Emacs 寫的,所有人都愛死它了染乌。
人們現(xiàn)在還很愛它山孔。直到今天,我依舊不得不聽我們一些非技術員工跟我長篇大論的叨叨他們是多么的懷念 Mailman荷憋。我可絕不是滿嘴噴糞台颠。上個圣誕節(jié)我參加了一個 Amazon 的派對,一個我不知道自己怎么會被邀請的派對勒庄,里面全是些西裝筆挺的商務人士串前,誰都長得比我?guī)洠任夜怩r实蔽。
以及一些我在公司里曾經(jīng)打過交道的人(這句不知道怎么譯)荡碾。四個美女認出了我是在客服部里干的,把我包圍了局装,跟我說了十五分鐘她們是多么的懷念 Mailman 和 Emacs坛吁,而現(xiàn)在的亞馬遜(我們用 JSP 花了好多年準備換掉 Mailman 的那一套軟件)是怎么的不能滿足她們,讓她們覺得跟以前一樣爽贼邓。
這一切都太夢幻了阶冈,我覺得她們可能是喝多了闷尿。
Shel 是個天才塑径。Emacs 是天才。連非技術人員都愛 Emacs填具。
我現(xiàn)在就是在 Emacs 里打這些文字统舀。我絕不情愿在任何其他地方打字。這不只是關于讓你的效率得到飛躍劳景,通過那些地球上其他地方找不到的快捷鍵和文本編輯功能誉简。
我每分鐘打一百三到一百四十個英文單詞,在 Emacs 里不撑,當我在寫沒有格式要求的文本的時候滴铅。
我測過這個時間速度佑力。自己寫了一個測打字速度的 Emacs 應用。但我想跟你說的不只是這個烹吵。
Emacs 有的是一種你叫不出名字來的品質(zhì)。
我們現(xiàn)在不用 Mailman 了桨武。那是因為我們有一種叫得出名字的品質(zhì) —— 就是肋拔,爛。我們很爛呀酸。我們(當時)找不到 Emacs-Lisp 足夠牛的人把 Mailman 繼續(xù)搞下去凉蜂。今天這應該不難了; 亞馬遜現(xiàn)在到處都是 Emacs Lisp 的黑客。但是在那時候,客服部的人沒法從別人那里得到幫助窿吩。于是他們就用他們當時手頭有的資源去搞這件事茎杂。
他們當時沒有足夠多的 Emacs-Lisp 的人。有一段時間爆存,他們甚至找來 Bob Glickstein 當合同工蛉顽,那個給 O’Reilly 寫了那本 Gnu Emacs 擴展的書的家伙,坐在一個小辦公室里給 Emacs 寫 Mailman 的擴展先较。
客服應用部是 Amazon 的第一個兩塊比薩餅的團隊(代表團隊人數(shù)的增加携冤,編者注)。這個團隊是完全自立的闲勺。不管是那時還是現(xiàn)在曾棕。沒人跟他們說話,沒人幫他們菜循。沒有槍翘地,沒有炮,他們自己造癌幕。他們沒有網(wǎng)頁工程師衙耕,沒有支持工程師。屁也沒有勺远。有的只是一堆骨灰級的工程師和一個能帶新人的文化橙喘。這就是他們需要的一切了。
但他們最終不得不讓 Mailman 光榮退休胶逢。媽哎厅瞎。而我呢今天還聽到人們說他們是多么的懷念它。甚至在派對上初坠。
我想今天按人頭比例來說和簸,客服部仍然擁有比亞馬遜任何其他團隊更多的 Lisp 黑客。
可能他們用到 Lisp 的機會不多了碟刺,但是 Eric Raymond 說過锁保,即使你很少用 Lisp 寫程序,學習 Lisp 會是意義深遠的一個經(jīng)歷半沽,能讓你下輩子都成為一個更好的工程師爽柒。
卡爾,宗教現(xiàn)在已經(jīng)不是大眾的精神鴉片了〕簦現(xiàn)在鴉片是集成開發(fā)環(huán)境了霉赡。(卡爾·馬克思。這個人不知道的話應該打屁屁)幔托。
Java
Java 是過去的 10 年中計算行業(yè)里發(fā)生過的最好的同時也是最壞的事穴亏。
一方面蜂挪,Java 把你從 C++ 編程的很多枯燥易錯的細節(jié)中解救出來了。沒有數(shù)組越界了嗓化,沒有 core dump 了棠涮。
拋出來的異常能讓你精確定位到出錯的那一行代碼,而且 99% 的時候都是正確的那一行出錯了的代碼刺覆。
對象們在需要的時候能智能地把它們自己打印出來严肪。等等等等。
另一方面谦屑,除了是一種語言驳糯,一個虛擬機,一個巨無霸的類庫氢橙,一個安全模型酝枢,一個可移植的字節(jié)碼格式,Java 還是一個宗教悍手。邪教帘睦。所以你不能太相信對它太虔誠的人。
想要招一個好的 Java 工程師是一項很有技術挑戰(zhàn)的活坦康。
但是總的來說竣付,Java 是軟件工程史上的一大進步。
從 C++ 到 Java 不只是語法上的改變滞欠。這是一種需要一段時間去好好體會的一種震撼性的世界觀的轉(zhuǎn)變古胆。
這有點像突然你被配了一個執(zhí)行助理。你知道老總們?yōu)槭裁纯偸呛孟裼袝r間去開會仑撞,總是知道公司現(xiàn)在運行的情況赤兴,總是寫出很酷酷的文檔嗎?
老總們常常忘記其實他們不是一個人在戰(zhàn)斗妖滔,他們都是兩個全職的人隧哮,他們和他們的執(zhí)行助理們。
有一個執(zhí)行助理把你從瑣事中解救出來讓你有時間去思考那些真的需要你去解決的問題; 沒有的話你將不得不花一半的時間在那些無聊的世俗的事情上座舍。
切換到 Java 編程語言就把你變成了兩個程序員 —— 一個處理那些你不需要關心的東西沮翔,另一個可以集中精力在問題本身上。
這是一個很震人的改變曲秉,一個你應該很快就能習慣能喜歡上的改變采蚀。
就像 Jamie Zawinski (Netscape 牛人,開發(fā) Mozilla 瀏覽器承二,好像學歷是高中畢業(yè)?)在他著名的“Java 真爛(java sucks)”那篇文章里說的:“先說那些好東西:Java 沒有 free() 函數(shù)榆鼠。我必須一開始就承認,其他的東西都沒什么了不起亥鸠。(沒有 free)是能讓我原諒其他所有東西的特性妆够,不管其他東西有多爛识啦。講完這一點后,我的文章里其他一切幾乎都完全沒有重要性了神妹⊥窍”
Jamie 的文章寫在 1997 年,按 Java 年來算的話是很早以前了鸵荠,跟他寫這篇文章時比冕茅,Java 已經(jīng)有很大的改善; 一些他抱怨的東西甚至已經(jīng)被 fix 了。
但是大多數(shù)還是沒有被 fix蛹找。Java 作為一門語言還是有點爛姨伤。
但就如 Jamie 指出的,Java“是今天為止最好的語言庸疾。
我的意思是說姜挺,它是今天市面上那些爛得底兒掉地一堆語言比起來有那么一點能被我接受”肆颍”
真的炊豪,你應該讀讀他那篇文章。
Java 幾乎每一方面都很好拧篮,除了它的語言本身词渤,而這是 JWZ 抱怨的主要對象。
但那是一個很大的抱怨串绩。再好的庫也救不了一個爛語言缺虐。
相信我:你可能比我知道多得多的東西,但是我知道好兵救不了爛將礁凡。
在 Geoworks 搞了五年匯編語言都會了我這個道理高氮。
跟 C++ 比,Java 作為一個語言還過得去顷牌。
好吧剪芍,別扯了,Java 要好很多窟蓝。因為它有(內(nèi)建)的字符串罪裹。哥們,你說一個沒有內(nèi)建的字符串的語言是人用的嗎运挫。
但是 Java 跟 C++ 比少了一些好東西状共,比如(函數(shù)調(diào)用時)傳引用,棧上的對象谁帕,typedef峡继,宏,以及運算符重載匈挖。一些時不時地會很稱手的東西碾牌。
哦颠猴,還有多重繼承,我現(xiàn)在老了小染,反而挺欣賞了的多重繼承翘瓮。如果你認為我這個觀點僵硬不靈活的家伙是多態(tài)教義很好的反例的話,我倒是可以給你舉幾個為什么你需要多態(tài)繼承的好例子裤翩,或者至少像 Ruby 那樣的 mixin 或者自動的派遣资盅。
下次問問我白龍馬的事情。今天我要告訴你為什么 Java 的 interface 是個爛貨踊赠。
幾年前 Gosling 自己都說呵扛,如果一切都能重來的話,他不會搞出個 interface 的概念筐带。
但是那正是 Java 的問題今穿。當 James 說出那句話的時候,人們被雷到了伦籍。我甚至能感覺到那股雷勁兒蓝晒,能感覺到 Sun 公司市場部和法務部的鳥人是多么想把 James 滅口,然后告訴大家他沒那么說過帖鸦。
Java 的問題就是人們都被那幫人搞的廣告效應蒙住了眼芝薇。
C++,Perl作儿,任何流行語言都有這個問題洛二。這是很嚴重的,因為如果沒有一些說大話吹牛逼的廣告攻锰,一個語言是不會流行起來的晾嘶。所以如果一個語言的設計者說他的語言沒有被設計得很完美的話,就是趕緊用麻醉槍射擊這胡說八道的家伙并關閉會議的時候了娶吞。
語言們需要放點兒衛(wèi)星才能活垒迂,我只希望人們不要被衛(wèi)星耀瞎了眼。
我學了面向?qū)ο缶幊蹋?我自己也對此大吹大擂寝志。
當我加入亞馬遜時娇斑,我不能告訴你我有什么智慧或者經(jīng)驗策添,但我可以給你背誦出所有關于 OOP 的魔咒材部。
多重繼承是邪惡的,因為大家都這么說; 運算符重載是邪惡的唯竹,諸如此類乐导。我甚至有點模糊地知道為什么是邪惡的,但實際上不知道浸颓。
后來我明白了物臂,這些都不邪惡旺拉,不是爛玩意兒,爛的是開發(fā)者棵磷,是我蛾狗。我現(xiàn)在還是爛,但是希望每年都不爛一點起來仪媒。
上禮拜我碰到一個來面試的沉桌,他告訴我多繼是邪惡的,因為算吩,比如留凭,你可以從頭,胳膊偎巢,腿蔼夜,軀干多重繼承出一個人來。
他既是對的压昼,又是錯的求冷。那樣的多繼情形當然邪惡,但那都是因為他自己太邪惡了窍霞。
那樣繼承出來的“東西”遠遠就能看見有多蠢遵倦,如果他還把這玩意兒弄進門來那就更邪惡了。
不良開發(fā)者官撼,占了這世上開發(fā)者的大多數(shù)梧躺,他們能用你扔給他們隨便什么語言寫出不良的代碼。
說了這些傲绣,還是得說回來掠哥,多繼不是請客吃飯那么輕松的事兒;
mixin 看起來是更好的解決方案,但是還沒人完美的解決這個問題秃诵。
但我還是認為 Java 比 C++ 好续搀,即使它沒有多繼。因為我知道不管我的出發(fā)點是多么好菠净,某一天我還是會被一堆不懂怎么寫好代碼的人包圍禁舷,讓他們用 Java 比用 C++ 會帶來更少的傷害。
此外毅往,Java 除了語言本身外還有老多其他的重要有用的東西牵咙。
且 Java 語言本身也在進化,雖然像冰川一樣慢攀唯,所以我們還是能看到希望洁桌。Java 正是我們應該在亞馬遜推薦使用的語言。
你就是得小心點兒侯嘀,因為和其他任何語言一樣另凌,你能很容易找出一堆人谱轨,他們很懂一門語言及其編程環(huán)境,但對品味吠谢,計算或者其他任何重要的東西卻一無所知土童。
當你有懷疑時,還是雇那種會好幾門語言的 Java 程序員工坊,那種厭憎 J2EE/EJB 之類松松跨跨的所謂框架的娜扇,那種使用 Emacs 的。這都是一些實戰(zhàn)經(jīng)驗栅组。
Perl
Perl雀瓢,怎么說呢?
Perl 是個老朋友。老老朋友玉掸。我開始寫 Perl 代碼的時候刃麸,可能是 1995 年。而它為我很好的服務了差不多 10 年的時間司浪。
它就像你騎了十萬二十萬英里的老自行車泊业,你心里永遠有一塊地方裝著它,雖然現(xiàn)在你已經(jīng)換了一輛更加現(xiàn)代化的只有五磅重的自行車啊易,而且這一輛也不像老的那輛頂?shù)媚闫ㄑ厶哿恕?br>
Perl 受歡迎原因有仨:
用 Perl 你很快就能搞定你的問題吁伺。而這是最終的衡量標準。
Perl 有世上最好的市場推廣租谈。你可以寫一本介紹他們市場推廣有多絕的書篮奄。Sun 公司砸大筆錢給 Java 推市場,Perl 在受歡迎程度來說能跟 Java 齊頭并進割去,但 Perl 純粹是依靠 Larry Wall 和他那幫哥們的三寸不爛之舌做市場窟却。哈佛商學院的人應該去研究 Perl 的市場是怎么做出來的。真的讓人瞠目結舌呻逆。
直到差不多夸赫,呃,現(xiàn)在咖城,Perl 沒有真正的競爭者茬腿。
有比 Perl “好”的語言。操宜雀,有很多比 Perl 好的語言切平,如果你定義“好”為“不是給瘋子用的”的話。Lisp, Smalltalk, Python州袒,媽呀揭绑,我可能可以列出二三十種比 Perl “好”的語言。從這些語言不像這個夏天在臺灣街頭爆了肚皮的抹香鯨這個角度來說郎哭。鯨魚腸子到處都是他匪,汽車上,機車上夸研,行人身上邦蜜。這就是 Perl。讓人著迷亥至,真的悼沈。
但是 Perl 有很多很多好的特性,直到最近姐扮,都是其他語言沒有的絮供。它們彌補了 Perl 腸子在外的不足。你可以從爆了肚皮的鯨魚可以做很多有用的東西出來茶敏,比如香水壤靶。這很有用。Perl 也是這樣惊搏。
當其他的那些語言(尤其是 Lisp 和 Smalltalk)都想假裝操作系統(tǒng)并不存在贮乳,列表(Lisp 的)和對象(Smalltalk 的)就是把屎搞出來的唯一存在,Perl 卻走了截然相反的路子恬惯。Larry 說:Unix 和字符串是搞出屎來的唯一存在向拆。
對很多任務來說,他絕對是正確的酪耳。所以 Perl 絕對是 Unix 系統(tǒng)管理和字符串處理的史上最強語言浓恳,除了一個,剛出來的一個碗暗,從哥斯拉(電影哥斯拉看過沒)之地出來的一個奖蔓。我一會兒會講到那一個。
可惜讹堤,Larry 太太太太在意 Unix 系統(tǒng)管理和字符串處理以致他壓根忘了列表和對象吆鹤,等他明白過來想改正的時候已經(jīng)晚了。
實際上洲守,在 Perl 早期的…好吧疑务,對鯨魚腸子我實在不想用“設計”這個詞,就說生命周期中吧梗醇,他犯的幾個關鍵錯誤讓把列表和對象加進來變得如此尷尬知允,以致 Perl 已經(jīng)進化成一個真正的 Rube Goldberg 機器,至少當你想在 Perl 里用列表和對象的時候叙谨。
(Rube Goldberg 是一漫畫家温鸽,常畫一些很復雜的機器,但只完成簡單的工作,比如一個小球滾過很多關卡涤垫,最后把門打開姑尺。譯者注)。
列表和對象也他媽的是很重要的蝠猬,Larry切蟋!(farging 應該是作者不想說 fucking 那么直白,譯者注)
Perl 沒法表達列表因為 Larry 一早犯了一個悲劇性的愚蠢的錯誤榆芦,把列表全抹平柄粹。
于是(1, 2, (3, 4))魔術般地變成(1, 2, 3, 4)。不是說你會想讓它這樣工作匆绣,而是 Larry 剛好那天在搞一個這樣會更方便的問題驻右。
于是 Perl 的數(shù)據(jù)結構從此就變得爆炸了的鯨魚了。
今天你看 Perl 的書崎淳,小教程或 PPT 的時候堪夭,不花三分之一的時間在“引用”上是不可能的。
這就是 Larry 可憐的凯力,壞了的茵瘾,Goldberg (漫畫家,想起來沒? 譯者注)式的對他那抹平列表的瘋狂錯誤的解決方案咐鹤。
但是 Perl 的市場宣傳做得那么難以置信地好以致它讓你覺得這是你身上發(fā)生過的最好的東西拗秘。
你可以對任何東西取它的引用。這很有趣祈惶!聞起來也很香(說腸子呢雕旨,譯者注,呵呵)捧请!
Perl 不能支持面向?qū)ο缶幊桃驗?Larry 壓根不相信這玩意兒凡涩。
這可能沒什么大不了; 我也不是很確定我是不是信這個 OOP。
但是那么為啥他又要試著把對象加進 Perl 呢? Perl 的面向?qū)ο笫莻€半成品疹蛉,且在 Perl 社區(qū)里沒多少人重視活箕。
它就是不像字符串處理或 Unix 集成那樣充滿靈感。
當然了可款,Perl 還有其他很多怪怪的特性育韩。
比如它的“上下文”,這是 Larry 要有N個變量名字空間的喜劇式?jīng)Q定的一個恐怖片式的產(chǎn)物闺鲸。
這些空間由 sigil 來區(qū)分(就是 Perl 里變量名前面的‘$’筋讨,‘@’,‘%’字符)摸恍,看著像是從 shell 腳本里拷貝來的悉罕。
在 Perl 里,所有的運算符,所有的函數(shù)壁袄,所有的操作其行為都是六取一的隨機的类早,取決于當前的“上下文”。
沒有一些規(guī)則或助記法能幫你搞定這些特定操作在特定上下文里的特定行為然想。你得把它們?nèi)浽谀X子里莺奔。
想要個例子? 這兒有一個:在一個值量(scalar欣范,對應于 vector变泄,向量)上下文里對一個哈希取值你得到一個字符串,里面是個分數(shù)恼琼,分子是目前已分配的鍵妨蛹,分母是總共有多少個桶。
鯨魚腸子晴竞,我告訴你蛙卤。
但就像我說的—直到最近,沒啥能像 Perl 那樣把屎搞定噩死。
Ruby
每過 15 年左右颤难,一門語言就會被更好的代替。
C被 C++ 代替已维,至少對大應用開發(fā)而又需要性能和數(shù)據(jù)類型的人們來說行嗤。
C++ 被 Java 代替,而 Java 無疑在 7 年后又會被更好的東西代替—好吧垛耳,我說的是完全代替 C++ 的 7 年后栅屏,這到目前為止還沒有發(fā)生,主要是因為微軟能在 Java 霸占桌面系統(tǒng)之前狙擊它堂鲜。
但是在服務器上的應用而言栈雳,C++ 的陣地已經(jīng)慢慢讓給 Java 了。
Perl 有一天也會消逝缔莲。那是因為一門新的語言 Ruby 剛剛終于被翻譯成英語了哥纫。
沒錯,它是在日本發(fā)明的痴奏,這么多地兒蛀骇,沒想到日本人搞出來了,還以為他們只是硬件和制造上占有名氣抛虫,而不是他們的軟件業(yè)松靡,所以大家都跟你一樣驚奇。
為什么呢建椰,大家可能都在想雕欺。但是我認為這都是跟打字有關。我根本不能想象他們以前能打字打得足夠快,英文字母只有 26 個屠列,他們卻有上萬個字啦逆。
但是 Emacs 幾年前支持多字節(jié)字符了,所以我猜他們現(xiàn)在打字速度他媽的快多了笛洛。
(所以能搞出 Ruby 來了夏志,譯者猜作者是這個意思)
(是的,他們也用 Emacs —— 事實上日本人負責了 Emacs 多字節(jié)支持的大部工作苛让,而且搞得堅不可摧沟蔑。)
不管怎么樣,Ruby 從 Perl 那里偷師了所有的好東西; 實際上狱杰,Matz, Ruby 的作者(Yukihiro Matsumoto瘦材,如果我沒記錯的話,但是他外號“Matz”)仿畸,覺得他從 Perl 那里偷的有點太多了食棕,他的鞋上也粘了些鯨魚腸子。但是只是一丟丟错沽。
最重要的是簿晓,Ruby 拿來了 Perl 的串處理和 Unix 集成,一點沒改千埃,就是說語法都是一樣的憔儿,于是乎啥也不說了,你就擁有了 Perl 最好的那部分镰禾。這是個不錯的開局皿曲,特別是如果你不把 Perl 剩下的東西也拿進來的話。
但是之后 Matz 還從 Lisp 那里拿來的最好的列表處理吴侦,Smalltalk 和其他語言那里拿來了最好的面向?qū)ο笪菪荩珻LU 那里拿來了最好的迭代器,以及基本上是每個人每個事的最好的東西备韧。
而他讓這些東西全部都跑起來劫樟,跑得那么順,你都不會注意到這些東西在那兒织堂。我比其他任何語言都快就學會了 Ruby叠艳,我總共會三十到四十門語言; 而我花了大概三天時間就能用 Ruby 比 Perl 還流暢地工作了,當了八年的 Perl 黑客后易阳。這些東西是這么的和諧你都能自己猜它們是怎么工作的附较,而且大多數(shù)時候你都能猜對。漂亮潦俺。有趣拒课⌒觳靠譜。
如果把語言比成自行車早像,那么 AWK 就是一輛粉系的兒童自行車僻肖,前面有個白色小框,還插塊小旗卢鹦,
Perl 就是沙灘車(還記得那有多酷吧? 唉臀脏。),
而 Ruby 則是一輛七千五美金的鈦合金山地自行車冀自。
從 Perl 飛躍到 Ruby 意義不下于從 C++ 到 Java 的飛躍揉稚。卻沒有任何缺陷,
因為 Ruby 幾乎是 Perl 功能的一個超集凡纳,而 Java 卻拿掉了一些人們想要的東西窃植,且沒有真正的提供一個替代品帝蒿。
下次我會寫更多關于 Ruby 的東西荐糜。
我先需要靈感。去讀讀 Lucky Stiff 的(poignant) guide to Ruby 吧葛超。
那本書是一本有靈感的書暴氏。
真的,讀一下绣张。超贊答渔。我不理解產(chǎn)生它的那種頭腦,但它很有趣侥涵,很犀利沼撕,且全是關于 Ruby 的。好像芜飘。你會看到的务豺。
Python
啊,Python 怎么說呢嗦明,一個不錯的語言笼沥,這么多年來一直旁邊在等待它的機會? Python 社區(qū)很長時間以來是那些勇敢地吞下紅藥片從 Perl 駭客帝國中醒來的人的避難營。
啊娶牌,有點像 Smalltalk 的人們奔浅,他們永遠在等待替代C++,沒想到半路殺出 Java 一下把它們操翻了诗良,漂亮地汹桦,永久地。哎喲鉴裹。Ruby 正在對 Python 做著同樣的事舞骆,現(xiàn)在灵嫌,今天「鹱鳎可能會在一夜之間吧寿羞。
Python 本來可以統(tǒng)治世界,可惜它有兩個致命缺陷:空格赂蠢,和冷淡绪穆。
空格很簡單,就是說 Python 是用縮進來表達代碼塊之間的嵌套虱岂。
它強制你必須按一定格式把所有的東西縮進玖院,他們這樣做是為了讓所有人寫的代碼看上去一樣。
不料蠻多程序員討厭這點第岖,因為他們覺得自己的自由被拿走了;
感覺就像 Python 侵犯了憲法賦予他們的可以隨便縮進格式和全寫在一行上的權利难菌。
Python 的作者,Guido Van Rossum蔑滓,也在早期犯過一些很傻的技術錯誤 —— 沒有像 Larry 的失誤那么嚴重郊酒,但是還是有幾個。比如键袱,最早 Python 沒有字面變量范圍燎窘,但它同時也沒有動態(tài)變量范圍,而動態(tài)變量范圍可能會有它一些問題蹄咖,但它還是有用的褐健。Python 卻沒有這些,只有全局的和本地(函數(shù))的兩種范圍澜汤。
所以即使它是一個真正的 OO 系統(tǒng)蚜迅,類甚至不能訪問它們自己的動態(tài)成員變量。你必須給成員函數(shù)傳“self”參數(shù)俊抵,一大堆 self 參數(shù)很快就會把你搞瘋掉谁不,即使你不在意空格問題。
等等之類务蝠。
但在我看來拍谐,Python 不行其實是因為冷淡。這阻止了它成為首選腳本語言馏段,或者首選一切語言轩拨。靠院喜,人們現(xiàn)在還在用 Tcl 作嵌入解釋執(zhí)行器亡蓉,雖然 Python 比 Tcl 好得不要太多 —— 除了,我說喷舀,這個冷淡問題砍濒。
(此處開始我不知所云淋肾。呵呵,這樣吧爸邢,把原文貼在最后面樊卓。譯者注)
What’s the frost thing, you ask? Well, I used to have a lot of exceptionally mean stuff written here, but since Python’s actually quite pleasant to work with (if you can overlook its warts), I no longer think it’s such a great idea to bash on Pythonistas。The “frost thing” is just that they used to have a tendency to be a bit, well, frosty。Why?
Because they were so tired of hearing about the whitespace thing挪略!
I think that’s why Python never reached Perl’s level of popularity识藤, but maybe I’m just imagining things许蓖。
Coda
That was the ADJ article I really wanted to write。Or at least something like it。For some reason, though, my true feelings only seem to come out during insomniac attacks between 3am and 6am。Time for bed叹坦!2 hours ’til my next meeting。
注1卑雁,Eric 告訴我當時幾乎全是 Jamie Zawinski募书,當他們在 Lucid 工作的時候。
注2序厉,我寫了這個之后很多人告訴我 Paul Graham 是用 VI 的锐膜,想不到。
注3弛房,為了有據(jù)可查,我個人根本不介意空格問題而柑。我認為因為這個而不喜歡 Python 是很傻的文捶。我只是說有一堆比例讓人驚奇的其他工程師討厭空格問題。
這才是我真正想給亞馬遜開發(fā)者雜志寫的文章媒咳〈馀牛或者至少是這樣的。出于某些原因涩澡,我的真感情好像只有在我凌晨三點到六點失眠的時候都會流露顽耳。該睡覺了!我下個會議再過兩小時就開始了妙同。
(發(fā)布于 2004 年 9 月射富,小小的更新在2006年3月28日)