這篇文章是從保羅的主頁(yè)上找到的,已經(jīng)有一篇對岸的譯文收錄在《駭客與畫(huà)家》中了。
超越平凡
--Lisp在一個(gè)創(chuàng )業(yè)公司中的故事
作者:保羅.格雷厄姆
譯者:不累的王
校對:瘋子魚(yú)
原文地址:
http://www.paulgraham.com/avg.html(本文由2001年三月25日劍橋的一次Franz Developer研討會(huì )中的發(fā)言整理而來(lái)。)
1995年夏天,我得朋友Robert Morris 和我創(chuàng )立了一家個(gè)名叫Viaweb的公司。我們計劃編寫(xiě)令用戶(hù)可以構建在線(xiàn)商店的軟件。當時(shí),這個(gè)軟件的新奇之處在于,它跑在我們的服務(wù)器上,使用普通的Web頁(yè)面作為界面。
當然,當時(shí)許多人產(chǎn)生了相同的想法,不過(guò)據我所知,Viaweb 是第一個(gè)基于Web的應用程序。它看上去確實(shí)是一個(gè)新鮮的想法,以至于我們使用它作為我們公司的名字:Viaweb,因為我們的軟件通過(guò)web工作,而非運行在你的桌面計算機上。
這個(gè)軟件的另外一個(gè)不同尋常之處在于,它主要使用一種稱(chēng)作Lisp的語(yǔ)言編寫(xiě)。[注1]它是最早的使用Lisp編寫(xiě)的終端用戶(hù)程序之一,Lisp被廣泛的應用于大學(xué)和實(shí)驗室。相對其他使用那些不那么強悍語(yǔ)言的對手,Lisp給予了我們巨大的優(yōu)勢。
1. 秘密武器
Eric Raymond撰寫(xiě)過(guò)一篇名為《怎樣成為一名黑客》的文章,其中提到若想成為大牛該學(xué)習哪些語(yǔ)言。他建議從 Python 或 Java 開(kāi)始,因為它們容易學(xué)習。有品位的黑客要學(xué)習 C,以在Unix上工作;為了作系統管理或 CGI,還需要學(xué)習 Perl。最后,真正牛的黑客應該考慮學(xué)習Lisp:學(xué)習Lisp可以使你獲得受到深刻的啟迪后的經(jīng)驗;這種經(jīng)驗將使你在剩下的日子成為一名更出色的程序員,即使你并非很多地使用Lisp本身。
這和你經(jīng)常聽(tīng)說(shuō)的關(guān)于拉丁語(yǔ)的說(shuō)法相同。它不會(huì )使你得到一份工作,除非是典型的教授職位,但是它會(huì )改進(jìn)你的思想,使你更好地使用你所希望使用的語(yǔ)言,就像拉丁語(yǔ)相對于英語(yǔ)。
但請稍等。這個(gè)比喻并不完全恰當。拉丁語(yǔ)無(wú)法使你得到一份工作,是因為沒(méi)有人講拉丁語(yǔ)。如果你使用拉丁語(yǔ)書(shū)寫(xiě),沒(méi)有人能理解你的意思。但是Lisp是一種計算機語(yǔ)言,計算機使用程序員對它講的任何一種語(yǔ)言。所以,如果 Lisp 使你成為一名更出色的程序員,就像他(Eric Raymond)說(shuō)的那樣,為什么不使用它呢?如果一名畫(huà)家獲得一支可以使他成為更好的畫(huà)家的畫(huà)筆,我覺(jué)得他會(huì )在他所有的繪畫(huà)中都使用這支筆,不是么?我并非在此開(kāi) Eric Raymond 的玩笑??偟膩?lái)說(shuō),他的建議是非常好的。他談?wù)摰腖isp就像常說(shuō)的賢者。不過(guò)這位賢者有一個(gè)矛盾:Lisp 會(huì )使你成為一名更好的程序員,但之后你將不會(huì )使用它。
為什么不?編程語(yǔ)言只是工具而已。如果 Lisp 真的生成更好的程序,你會(huì )去使用它的。但如果它不能,誰(shuí)會(huì )用它呢?
這并不只是一個(gè)理論問(wèn)題。軟件業(yè)是充滿(mǎn)競爭的行業(yè),傾向于產(chǎn)生天然的壟斷。在其他條件相等的情況下,一家能夠更快更好的生產(chǎn)出軟件的公司,將淘汰它的競爭對手。當你正在開(kāi)始一家創(chuàng )業(yè)公司的時(shí)候,你會(huì )非常敏銳的感受到這一點(diǎn)。創(chuàng )業(yè)公司通常徘徊于天堂和地獄之間。你或者變得富有,或者變得一無(wú)所有。在一家創(chuàng )業(yè)公司,如果你將賭注壓在錯誤的技術(shù)上,競爭對手將粉碎你。
羅伯特和我都很了解Lisp,并且我們看不到任何理由阻止我們憑著(zhù)天性選擇 Lisp。我們知道很多人使用 C++ 或 Perl 編寫(xiě)他們的軟件。但我們同樣知道那并不意味著(zhù)任何事。如果你那樣選擇技術(shù),你一定在跑Windows。當你選擇技術(shù)的時(shí)候,你必須忽略其他人的選擇, 而僅考慮什么技術(shù)能夠工作得最好。
對于一家創(chuàng )業(yè)公司來(lái)說(shuō)尤為如此。在大公司,你可以照般所有其他那些大公司的做法。但是創(chuàng )業(yè)公司不能照搬其他創(chuàng )業(yè)公的做法。我并不認為有多少人了解這一點(diǎn),即使在創(chuàng )業(yè)公司。一般的大公司每年大概增長(cháng)十個(gè)百分點(diǎn)。所以如果你在經(jīng)營(yíng)一家大公司,并且照搬其他一般的大公司的做法,假如和其它一般的大公司作得一樣好,那么每年可以增長(cháng)10個(gè)百分點(diǎn)。
當然,在你經(jīng)營(yíng)創(chuàng )業(yè)公司時(shí),同樣的事情也會(huì )發(fā)生。如果你作的所有事情只是照搬其他創(chuàng )業(yè)公司,你一定期待一個(gè)平均的回報。問(wèn)題是,這時(shí)候,平均意味著(zhù)你將出局。創(chuàng )業(yè)公司的存活率只有不到百分之五十。所以如果你在經(jīng)營(yíng)一家創(chuàng )業(yè)公司,你最好作點(diǎn)不同凡響的事情。否則你將面臨麻煩。
回到1995年,我們知道我不認為我們的競爭者明白,甚至直到今天還很少有人明白:當你編寫(xiě)跑在自己服務(wù)器上的軟件時(shí),你可以使用任何你想使用的語(yǔ)言。當你在編寫(xiě)桌面軟件時(shí),一個(gè)巨大的偏見(jiàn)導致應用程序使用同一種語(yǔ)言編寫(xiě),運行在同一種操作系統上。十年前,編寫(xiě)應用程序意味著(zhù)用 C 語(yǔ)言編寫(xiě)圖形界面。但編寫(xiě) Web 軟件時(shí),特別是當你同時(shí)用有編程語(yǔ)言和操作系統的源代碼時(shí),你可以使用任何你希望使用的語(yǔ)言??墒?,這種新的自由是一柄雙刃劍?,F在你可以使用任何語(yǔ)言,你必須思考使用哪一種。公司們都裝作沒(méi)有做出冒險的轉變并試圖找到對手的真正意圖。
如果你可以使用任何語(yǔ)言,你用哪一種?我們選擇 Lisp。首先,顯而易見(jiàn)的是快速開(kāi)發(fā)在這個(gè)市場(chǎng)上將非常重要。我們全都從零起步,所以一家公司可以在他的對手獲得長(cháng)足進(jìn)步之前獲得新的特性。我們知道 Lisp 確實(shí)是一種適合快速編寫(xiě)軟件的好語(yǔ)言,并且服務(wù)器端程序擴大了這種快速開(kāi)發(fā)的效果,因為你可以在軟件完成的同時(shí)就發(fā)布它。
如果其他公司不想使用 Lisp,那就更好了。這將帶給我們一個(gè)技術(shù)優(yōu)勢,并且我們我們需要我們能夠獲得的所有幫助。當我們開(kāi)始 Viaweb,我們沒(méi)有任何關(guān)于業(yè)務(wù)的經(jīng)驗。我們不知道關(guān)于市場(chǎng)/雇傭人力/籌集資金/或者獲得客戶(hù)的任何知識。甚至我們中間沒(méi)有人曾經(jīng)擁有過(guò)一份真正的工作。我們唯一擅長(cháng)的就是編寫(xiě)軟件。我們希望這可以拯救我們。我們將獲得軟件開(kāi)發(fā)方面所有的優(yōu)勢。
所以你可以說(shuō),使用 Lisp 是一個(gè)大膽的嘗試。我們的假設是使用 Lisp 編寫(xiě)我們的軟件可以使我們比競爭對手更快獲得新特性,并且可以做到他們的軟件做不到的事情。并且,因為 Lisp 是這樣高階,我們不需要一個(gè)龐大的開(kāi)發(fā)組,所以我們的成本將更低。如果是這樣,我們可以花更少的錢(qián)獲得更好的產(chǎn)品,并且持續盈利。我們最終將獲得所有用戶(hù),我們的競爭對手將一無(wú)所獲,并且最終被淘汰出局。無(wú)論如何,這正是我們所期待的。
嘗試的結果如何?稍微有點(diǎn)驚喜,它能工作。我們的競爭對手中最后有20%~30%存活下來(lái),但是沒(méi)有任何一個(gè)可以和我們相提并論。我們有一個(gè)跑在服務(wù)器上的在線(xiàn)商店構建器,執行時(shí)的感覺(jué)就像一個(gè)桌面程序一樣。我們的競爭對手使用CGI腳本。我們一直有領(lǐng)先他們的特性。有時(shí),對手使出渾身解數嘗試引入一個(gè)我們所沒(méi)有的特性。但是 Lisp 使我們的開(kāi)發(fā)周期非常之快,以至于有時(shí)候在對手發(fā)布某個(gè)特性之后的一兩天內,我們就可以將其復制。當記者們想把對手軟件登上封面而來(lái)找我們時(shí),我們也已經(jīng)有了相同的新特性。
對手一定認為我們用友某種秘密武器--比如我們破解了他們的加密通信之類(lèi)的。實(shí)際上我們確實(shí)有一個(gè)秘密武器,只不過(guò)比他們的猜測更簡(jiǎn)單。沒(méi)有人泄露關(guān)于他們新特性的消息給我們。我們只是可以用超乎任何人想象的速度開(kāi)發(fā)軟件。
我在九歲的時(shí)候,偶然間得到了一本小說(shuō)《豺狼的假日》,主要情節描述一個(gè)殺手受到委托刺殺法國總統。殺手必須繞過(guò)警察進(jìn)入一間公寓眺望總統的路線(xiàn)。他裝扮成一個(gè)老人拄著(zhù)拐杖從警察身邊走過(guò),然而他們絲毫沒(méi)有注意到他。
我們的秘密武器與其類(lèi)似。我們使用一種語(yǔ)法古怪的充滿(mǎn)了圓括號的語(yǔ)言編寫(xiě)我們的軟件。多年以來(lái),Lisp 被如此描述令我非常惱火。但現在它使我們處于領(lǐng)先地位。在商業(yè)競爭中,一項對手無(wú)法理解的技術(shù)是無(wú)價(jià)之寶。商場(chǎng)如戰場(chǎng),出奇制勝與實(shí)力同樣重要。
所以,有些羞于啟齒,在我們經(jīng)營(yíng) Viaweb 的時(shí)候我從未公開(kāi)提起關(guān)于 Lisp 的任何事。我們從未公開(kāi)提起它,如果你在我們的網(wǎng)站上搜索 Lisp,只能找到我的簡(jiǎn)介中提到的兩本書(shū)的書(shū)名。沒(méi)有意外。創(chuàng )業(yè)公司應該盡可能向競爭對手隱藏自己的信息。如果他們不知道或者不在乎我們使用何種語(yǔ)言編寫(xiě)我們的軟件,我希望保持這種狀態(tài)。[注2]
我們的顧客是最理解我們技術(shù)的人。他們不在乎 Viaweb 使用何種語(yǔ)言編寫(xiě),他們只知道它確實(shí)工作得很好。它使他們可以用幾分鐘構建出看上去非常好的在線(xiàn)商店。所以,口口相傳,我們擁有了越來(lái)越多的用戶(hù)。1996 年底,我們擁有大概 70 個(gè)在線(xiàn)商店。1997 年底,這個(gè)數字達到了 500。六個(gè)月后,當雅虎收購我們時(shí),我們有 1070 個(gè)用戶(hù)。直到今日,這個(gè)軟件作為 Yahoo Store 依舊繼續支配這它的市場(chǎng)。他是雅虎最賺錢(qián)的部門(mén)之一,它構建的商店是Yahoo Shopping的基礎。我在 1999 年離開(kāi)了雅虎,所以我不知道現在他們到底擁有多少用戶(hù),但是我最后一次聽(tīng)說(shuō)它時(shí)大概有 14,000。
大家有時(shí)問(wèn)我雅虎是否依舊在使用 Lisp。是的,所有的 Lisp 代碼依然在那兒。雅虎的服務(wù)器端使用了Eric Raymond提到的所有五種建議黑客學(xué)習的語(yǔ)言。
2. Blub 悖論
Lisp 真的這么好么?如果 Lisp 真的這么好,為什么不是所有人都用它?聽(tīng)起來(lái)想一個(gè)語(yǔ)言游戲,但實(shí)際上他有一個(gè)簡(jiǎn)單的答案。Lisp 是如此出色并非因為擁有一些僅僅它的信徒才能發(fā)覺(jué)的魔力,只是因為他是所有通用語(yǔ)言中最強大的。大家不使用它是因為,編程語(yǔ)言除了是技術(shù)之外也是思維習慣,任何事物的轉變都需要時(shí)間。當然這些答案都需要進(jìn)一步解釋。
我將從庸俗的編程語(yǔ)言能力之爭開(kāi)始
可能會(huì )有些爭論,但至少,顯而易見(jiàn)的是,高級語(yǔ)言比機器語(yǔ)言更強大。如今多數程序員通常情況下都不會(huì )想要使用機器語(yǔ)言編程。你需要使用一種高級語(yǔ)言編寫(xiě)程序,并通過(guò)編譯器將它翻譯為機器語(yǔ)言。如今這個(gè)想法甚至被納入硬件:20世紀80年代以來(lái),已經(jīng)有為編譯器而不是為人類(lèi)的程序員設計的指令集出現。
所有人都知道用機器碼手工編寫(xiě)程序是一個(gè)錯誤。鮮為人知的一條更普適的原則是:在其他條件相等的情況下,如果你可以在幾種語(yǔ)言中選擇,那么除了使用最強勁的語(yǔ)言之外的所有選擇都是錯誤的。[注3]
對于這條法則存在許多例外。如果你的程序必須接近某種特定語(yǔ)言編寫(xiě)的程序,使用相同的語(yǔ)言是一個(gè)好主意。如果你的程序只需要作一些簡(jiǎn)單的工作,比如數字操作或者位操作,你可能需要一種不那么抽象的語(yǔ)言,因為它也許會(huì )稍微快一些。如果你在編寫(xiě)一個(gè)很短小的一次性程序,你最好選擇一種擁有最擅長(cháng)處理那種任務(wù)的庫函數的語(yǔ)言。但是通常,對于應用程序軟件來(lái)說(shuō),你希望使用你可以得到的最強勁的語(yǔ)言(因為高效),并且使用任何其他的都是錯誤,同理,某種情況下可能需要更低級的語(yǔ)言,比如機器語(yǔ)言。
顯而易見(jiàn),機器語(yǔ)言非常低級。但是,至少作為一種約定俗成的慣例,高級語(yǔ)言之間經(jīng)常獲得同等的對待。而機器語(yǔ)言卻不是。技術(shù)上說(shuō),“高級語(yǔ)言”不說(shuō)明任何問(wèn)題。沒(méi)有一條分割線(xiàn)將機器語(yǔ)言和高級語(yǔ)言隔開(kāi)。所有語(yǔ)言,從最強勁的機器語(yǔ)言到機器語(yǔ)言,都擁有一致[注4]的抽象性。
考慮一下 Cobol。Cobol 是一種高級語(yǔ)言,通常,它被編譯為機器語(yǔ)言。有人真的認為 Cobol 和某種語(yǔ)言,比如說(shuō) Python,等價(jià)嗎?與 Python 相比,Cobol 更接近機器語(yǔ)言。
Perl4 怎么樣?在 Perl 4 向 Perl 5 的發(fā)展中,字典和閉包被加入語(yǔ)言。大多數 Perl 黑客會(huì )同意 Perl 5 比 Perl 4 更加強大。一旦你承認了這點(diǎn),你就承認了一種高級語(yǔ)言可能比另一種高級語(yǔ)言更強大。更無(wú)情的事實(shí)是,除非特殊情況,你會(huì )使用你能得到的最強大的語(yǔ)言。盡管這個(gè)想法很少跟隨著(zhù)它的結論。超過(guò)一定年齡之后,程序員很少自愿的更換語(yǔ)言。不管別人開(kāi)始使用什么語(yǔ)言,他們總是選擇剛好夠用的語(yǔ)言。
程序員們非常關(guān)注他們最喜愛(ài)的語(yǔ)言,我不想傷害任何人的感情,所以我將使用一種假想的語(yǔ)言Blub來(lái)解釋這一點(diǎn)。Blub剛好是一種中級語(yǔ)言。但是它比Cobol或者機器語(yǔ)言更強大。
實(shí)際上,使用我們的虛擬語(yǔ)言Blub的程序員不會(huì )使用他們中的任意一種。他當然不會(huì )使用機器語(yǔ)言,那是編譯器干的事兒。對于Cobol,他不知道人們到底可以用這種東西寫(xiě)出些什么來(lái)。它甚至連x(x是Blub語(yǔ)言的某種特性)都沒(méi)有。
只要我們的Blub程序員按照語(yǔ)言能力俯視低級語(yǔ)言,他一定知道他是在俯視。那些語(yǔ)言是如此明顯的弱于Blub,因為它們缺少了某些他習慣于使用的Blub語(yǔ)言特性。但是當我們的Blub程序員向另一個(gè)方向,仰視某些高級語(yǔ)言的時(shí)候,他不知道他是在仰視。他認為看到的只是些怪異的語(yǔ)言。
他可能會(huì )考慮Blub如何做到與這種語(yǔ)言等價(jià),但是沒(méi)有這些亂七八糟的內容也沒(méi)什么不妥。Blub對于他來(lái)說(shuō)足夠好了,因為他用Blub思考。
然而,當我們以某種比Blub語(yǔ)言更高級語(yǔ)言的程序員的視角來(lái)觀(guān)察的時(shí)候,我們就會(huì )發(fā)現我們在俯視Blub?!澳闶窃趺从肂lub搞定所有事兒的呢?它甚至沒(méi)有y(沒(méi)有幽默感的譯者注:假設的某種高級語(yǔ)言的某種特性)”。
綜上,能夠看到所有不同語(yǔ)言能力差異的程序員只有那些理解了最強語(yǔ)言的程序員。(這可能是Eric Raymond認為L(cháng)isp使你成為更好的程序員的原因)
你不能相信其他人的想法,因為Blub悖論:他們對他們開(kāi)始時(shí)使用的語(yǔ)言感到滿(mǎn)意,因為它是他們構思程序的方式。在我還是一個(gè)寫(xiě)Basic程序的高中生的時(shí)候,我就憑經(jīng)驗了解這一點(diǎn)。那種語(yǔ)言甚至不支持遞歸。很難想像如何寫(xiě)一個(gè)不使用遞歸的程序,但是那是我沒(méi)有放棄它。我使用Basic思考。并且我是一個(gè)Basic神童。在接觸到的所有領(lǐng)域中,我都是專(zhuān)家。
Eric Raymond向黑客們推薦的五種語(yǔ)言擁有各自不同的特性。他們的能力高低是一個(gè)敏感的話(huà)題。我想說(shuō)的是我認為L(cháng)isp是最強的那種。為了支持這個(gè)觀(guān)點(diǎn)我將告訴你們我發(fā)現其他四種語(yǔ)言缺少了什么。其它四種語(yǔ)言怎么可能搞定所有問(wèn)題呢?--如果缺少了Lisp的某種特性的話(huà)。而對于我來(lái)說(shuō),他們缺少的最重要的東西,是宏。[注5]
很多語(yǔ)言擁有稱(chēng)為“宏”的東西。但是Lisp的宏是獨一無(wú)二的。無(wú)論你是否相信,它們與圓括號有關(guān)。Lisp的設計者并非只是為了標新立異才將圓括號加入語(yǔ)言。對于Blub程序員來(lái)說(shuō),Lisp代碼顯得怪異。但是這些圓括號的存在是有理由的。他們是Lisp與其他語(yǔ)言?xún)仍诓煌耐庠诒憩F。
Lisp代碼有Lisp數據對象構成。并非是微觀(guān)上”源文件由字符構成,字符串是語(yǔ)言支持的數據類(lèi)型的一種”的含義。Lisp代碼,在其被解析器讀取之后,是可以被遍歷的數據結構。
如果你理解編譯器的工作原理,實(shí)際上剩下容易解釋了,Lisp擁有奇怪的語(yǔ)法,因為L(cháng)isp沒(méi)有語(yǔ)法。你在使用在其他語(yǔ)言中由編譯器生成的語(yǔ)法解析樹(shù)寫(xiě)程序 。但是這些解析樹(shù)完全可以被你的程序訪(fǎng)問(wèn)。你可以編寫(xiě)操作它們的程序。
在Lisp中,這些程序被稱(chēng)為宏。他們是寫(xiě)程序的程序。
寫(xiě)程序的程序?你何時(shí)會(huì )想做這樣的東西呢?如果你用Cobol思考,很少。如果你用Lisp思考,所有的時(shí)候??赡苋绻医o出一個(gè)強力的宏的例子以說(shuō)明這一點(diǎn)會(huì )比較合適。需要嗎?如果我那樣做了,它對于不懂Lisp的人來(lái)說(shuō)會(huì )像是含混不清的鬼扯;這里沒(méi)有足夠的空間解釋你需要理解這些含義所需的所有東西。在《Ansi Common Lisp》中我試圖盡可能快速的講解東西,同時(shí)我也沒(méi)有在160頁(yè)之前提到宏。
但是我想我可以給出一些比較合適的參數。Viaweb編輯器的代碼大約20-25%由宏構成。宏比普通的V函數更難寫(xiě),而且當他們出現在不必要的場(chǎng)合的時(shí)會(huì )導致糟糕的風(fēng)格。所以每個(gè)宏代碼都是無(wú)可或缺,事出有因的。這意味著(zhù)這個(gè)程序至少有20-25%的代碼使用任何其他語(yǔ)言都很難編寫(xiě)。盡管V程序員可能會(huì )對我宣稱(chēng)的Lisp的神奇力量產(chǎn)生懷疑,這應該刺激了他的好奇心。我們不是為了個(gè)人的消遣才這樣寫(xiě)程序的。我們是一家小創(chuàng )業(yè)公司,我們盡可能的編寫(xiě)艱深的程序以設置留給競爭對手們的技術(shù)門(mén)檻。
多疑的人可能開(kāi)始懷疑這些是否有關(guān)聯(lián)。我們有大段的代碼做了在其他語(yǔ)言中非常難實(shí)現的事情。我們的產(chǎn)品擁有競爭對手產(chǎn)品無(wú)法實(shí)現的功能??赡苓@里有一些關(guān)聯(lián)。我鼓勵你跟進(jìn)。對于對于跛足的老人來(lái)說(shuō)拐杖比眼睛更重要。
3. 創(chuàng )業(yè)公司的合氣道
但我并不期盼任何人立刻開(kāi)始學(xué)習Lisp。這篇文章的目的并非改變任何人的思想,而是給那些開(kāi)始對使用Lisp感興趣的人--那些知道Lisp是一種強勁語(yǔ)言卻對其沒(méi)有被廣泛應用而感到擔心的人--更強的信心。在競爭中,這是一個(gè)優(yōu)勢。Lisp的威力因為你的競爭對手沒(méi)有使用它而得到倍增。
如果你考慮在創(chuàng )業(yè)中使用Lisp,不必擔心它沒(méi)有被廣泛的理解。你應該希望它一直不被理解。并且貌似事實(shí)上也是如此。這是大多數人安于他們當前使用的語(yǔ)言的結果。計算機硬件的變化相對于個(gè)人習慣是如此的快速,以至于編程實(shí)踐通常落后處理器十到二十年。
在MIT那樣的地方,人們早在1960年代就開(kāi)始使用高級語(yǔ)言編寫(xiě)程序,但是很多公司在1980年代還在使用機器語(yǔ)言編寫(xiě)代碼。我打賭很多人在被處理器--像急著(zhù)關(guān)店回家的酒保一樣--踢出來(lái)轉向Risc指令集之前一直在使用機器碼寫(xiě)程序。
普通技術(shù)更新得很快。但編程語(yǔ)言有所不同:編程并非僅僅是技術(shù),它還包含程序員的思想。
它們一半是技術(shù),一半是信仰。[注6]
所以中級語(yǔ)言,即大多數程序員使用的語(yǔ)言,改變得就像冰山融化一樣緩慢。
垃圾收集技術(shù)在 1960 年被 Lisp 引入,現在被廣泛的認為是一樣好動(dòng)西。閉包,早在 70 年代就被 Lisp 引入,現在被人們廣泛地關(guān)注。宏,60 年代被 Lisp 引入,至今依然是鮮為人知的基礎。
當然,中級語(yǔ)言擁有巨大的沖量。我并非建議你去違背這種強大的力量。恰恰相反,我只是建議你像合氣道修煉者那樣,用這種力量對抗你的敵人。
如果你為一個(gè)大公司工作,這可能不那么簡(jiǎn)單。你將花費巨量的時(shí)間說(shuō)服尖頭老板(譯者注:尖頭老板,缺乏一般知識常識及職位所應具有的管理能力,愛(ài)說(shuō)大話(huà)且富有向物理現實(shí)挑戰的精神,倒霉跟負責的往往是他的下屬。)允許你使用Lisp寫(xiě)程序,而他只在紙面上讀到過(guò)一些平庸的語(yǔ)言,比如像Ada那種二十年前產(chǎn)生而今早已被取代了的語(yǔ)言。但是,如果你在一家創(chuàng )業(yè)公司,沒(méi)有尖頭老板,你可以像我們一樣,將Blub悖論轉化為你的優(yōu)勢:你可以使用那些被中級語(yǔ)言粘得動(dòng)彈不得的競爭對手們永遠無(wú)法匹敵的技術(shù)。
如果你曾經(jīng)在一家創(chuàng )業(yè)公司工作,這里有一條可以評價(jià)你的競爭對手們。讀他們的招聘啟事。他們的站點(diǎn)可能會(huì )做照片儲存或者其他類(lèi)似的平平無(wú)奇的東西,但是招聘啟事必須指明他們想要的是什么,否則他們將得到錯誤的應聘者。
在Viaweb工作的這些年來(lái)我讀過(guò)許多招聘啟事。似乎每個(gè)月都有新的競爭對手浮出水面。在查看他們是否有在線(xiàn)的demo之后,我做的第一件事是就是查看他們的招聘啟事。經(jīng)過(guò)這樣幾年后我可以指出哪些競爭對手值得關(guān)注,而哪些不需要。招聘啟事中的IT味道越重,這家公司就越不值得關(guān)注。最不值得注意的是那些需要Oracle經(jīng)驗的公司。你永遠不必擔心那些公司。如果他們需要C++或者Java開(kāi)發(fā)者,你也同樣可以悠然自得。如果他們需要Perl或Python程序員,就有一點(diǎn)值得小心了----這說(shuō)明這家公司有點(diǎn)技術(shù)實(shí)力,至少被一些真正的黑客運作著(zhù)。如果見(jiàn)到有招聘啟事尋找Lisp黑客,我才會(huì )真正的擔心。
在我寫(xiě)那些關(guān)于Lisp的書(shū)的時(shí)候,我習慣于希望每個(gè)人都理解它。但是當我開(kāi)始Viaweb的時(shí)候,我發(fā)現我變了,我希望每個(gè)人都理解它,除了我們的競爭對手。
[1] Viaweb 最初包含兩個(gè)部分:由 Lisp 編寫(xiě)的編輯器,用戶(hù)可以用它創(chuàng )建自己的站點(diǎn),以及由 C 編寫(xiě)的選購系統,用來(lái)處理指令。第一個(gè)版本大多數是 Lisp,因為那時(shí)指令系統還很小。稍后我們添加了兩個(gè)模塊,一個(gè)由 C 編寫(xiě)的圖片生成器, 一個(gè)大部分由 Perl 編寫(xiě)的后端處理器。
[2]Robert Morris 說(shuō),我不需要保密,因為如果我們的即使競爭對手知道,他們也無(wú)法理解我們使用 Lisp:“如果他們那么聰明,他們早就用 Lisp 編程了?!?br>[3]所有圖靈完備的語(yǔ)言具有相同的能力,但是程序員并不在乎這點(diǎn)。(沒(méi)有人希望給一個(gè)圖靈機編程)。程序員并不關(guān)心可以被形式化定義的能力,而是在意那些只能由低級語(yǔ)言編寫(xiě)的更強大語(yǔ)言的解釋器實(shí)現的功能。假設A語(yǔ)言擁有一個(gè)移除字符串中所有空格的操作符,而B(niǎo)語(yǔ)言中沒(méi)有,這可能并不能使得A更強大,因為你或許可以在B中使用一段子程序做到這一點(diǎn)。但是如果A支持,比如說(shuō)遞歸之類(lèi)的特性,而B(niǎo)不支持,那可能就不是可以通過(guò)函數庫解決的問(wèn)題了。
[4] 請書(shū)呆子們注意:或許更像是一張在頂部收縮的網(wǎng);相對于思想來(lái)說(shuō)形狀并不重要,至少這兒有一個(gè)大致的順序。
[5]這可能會(huì )使大家誤以為宏是一個(gè)分離的特性。實(shí)際上他們的用處因其它一些Lisp特性而得到增強,比如詞法閉包。
[6]編程語(yǔ)言之間的比較或者表現得像宗教戰爭,或者像學(xué)生的教科書(shū)一樣堅決的中立,無(wú)論如何,他們確實(shí)是在為整個(gè)人類(lèi)工作??粗孛娜丝梢院雎赃@個(gè)話(huà)題。但這個(gè)問(wèn)題只有一半是與信仰有關(guān)的;如果你想設計新的語(yǔ)言,還是有一些東西是值得從中學(xué)習的。