原文地址:http://www.paulgraham.com/avg.html
作者:Paul Graham
原文:http://paulgraham.com/avg.html
翻譯:Schemer.HW
(文章取自2001年在 Franz 開發者大會的一篇演講)
1995年夏天,朋友Rober Morris和我創辦了Viaweb,我們計劃寫一個可以讓最終用戶建立在線商店的軟件。當時而言,有革命意義的是,該軟件運行在我們的服務器上,通過網頁給用戶提供接口。
當然,可能很多人當時也有同樣的想法。但是就我所知,Viaweb是第一個完全基於服務器架構的。我們的這個軟件是通過網頁運行的(worked via the Web),不是運行在個人電腦上,所以我們公司也取名為:Viaweb。
軟件另一點不同尋常的地方是,它主要使用一個叫做Lisp的語言編寫。這是第一個用Lisp寫出的大型最終用戶軟件,在此之前,Lisp主要用在大學和研究室裡。[1]
秘密武器
Eric Raymond寫過一篇叫做「怎樣成為黑客」的文章,告訴那些想當黑客的人,必須掌握的編程語言。他建議從python或者java入門,因為它們很容易 上手。為了理解Unix內幕,黑客還應當學習c;為了管理系統和CGI腳本,還要學習Perl。最後,真正的黑客需要考慮學習Lisp:
「學習Lisp可以給你極大的收穫,讓你成為一個更好的程序員,即使你以後不會常常用到它。「
這和學習拉丁語的原因很像。拉丁語不會給你一份工作,除非你要當個拉丁語教授。但是它能鍛鍊你的頭腦,讓你成為一個更好的作家。
不過,等等,這個比喻可沒想這麼多。拉丁語之所以不能給你一份工作,是因為沒人使用拉丁語。如果你用拉丁語寫作,沒人能理解。但是Lisp是一個計算機的語言,計算機可以理解你,程序員,告知它的任何語言。
所 以,假如Lisp能讓你成為一個更好的程序員,像他說的,那你為什麼不會去用它?假如一根畫筆能讓某人成為一個更好的畫家,在我看來,他應該想要用這根畫 筆去畫他所有的作品,不是嗎?我不是想在這開Eric Raymond的玩笑。總體來說,他的建議是很好的。只是他對Lisp的看法是傳統的觀點,而這個觀點有自相矛盾的地方:Lisp能讓你成為一個更好的程 序員,但是你不會去使用它。
為什麼這樣?編程語言只是工具而已。如果Lisp真的能寫出更好的程序,你當然應該用它;如果它不能,那誰又需要它?
這 不僅僅是一個理論上的問題。軟件業是個競爭很激烈的行業,優勝劣汰。其他條件一樣,但是軟件寫的又快又好的公司,就能打敗他的競爭對手。當你創業的時候, 這種感覺是非常強烈的。創業的結果,要麼得到所有,要麼一無所有。你不是成為富豪,就是變成窮光蛋。在創業的開頭,如果選錯了技術,你的競爭對手就會幹掉 你。
Robert和我都很瞭解Lisp,我們找不到任何理由不去相信自己的直覺:用Lisp。我們知道其他人都用C++或者Perl寫軟件,但與我們無關。如果你準備和他們一樣,那你就是在用Windows。從技術角度出發,你得忽略其他人的普遍做法,而只去思考最佳方案。
這對於創業來說同樣適用。在一家大公司,你可以用其他公司都在用的方法。但是創業公司不能這樣。很多人沒意識到這點,即使是那些創業者。
大企業平均每年增長10%的利潤。所以如果你在管理大企業,作大眾作的事情,你也只能期望一個中庸的表現——每年10%左右的利潤。
對創業者來說,也是一樣。假如你和其他創業公司用同樣的方法,你也只能期望有中庸的表現。問題是,中庸的表現意味著你會破產。創業公司的存活率低於15%。所以,如果你開始創業,最好另闢蹊徑,否則,你就會陷入困境。
回 到1995年,我們明白一些其他競爭者不瞭解,即使現在也很少人理解的東西:當你寫一個只會運行在你自己的服務器上的軟件時,可以用任何你喜歡的語言。而 當你寫個人桌面軟件時,一種強烈的偏見是,你必須使用和操作系統一樣的語言。10年前,編寫應用程序意味著用C。但是基於網站的軟件,特別是當你擁有操作 系統和使用的語言的代碼時,你可以使用任何語言。
儘管如此,這種新型的自由卻是一把雙刃劍。既然你可以使用任何語言,就得好好想想用哪種。那些不願意冒險作出改變的公司會發現,他們的競爭對手可不這樣保守。
如 果你可以使用任何語言,你會選哪個?我們選擇Lisp。首先,很明顯,快速開發的能力對於佔領市場是很重要的。我們都是白手起家,能早於競爭對手推出新功 能的就會有很大的優勢。我們知道Lisp是一種編寫軟件非常快的語言,而基於服務器的軟件又放大了這種影響,因為你可以在編寫完成的第一時間發佈你的軟 件。
如果其他公司不想用Lisp,那正好。這也許會讓我們處於技術的邊緣,得到任何可以得到的幫助。當我們創辦Viaweb時,我們對毫 無商業經驗。我們對市場,僱傭員工,賺錢,吸引顧客都一無所知。我們倆也都沒實際工作過,只擅長編寫軟件,我們希望這能幫助我們制勝。我們要利用一切優 勢。
你可以說使用Lisp是一次實驗。我們的設想是,假如用Lisp寫軟件,那就能比競爭對手更快的完成軟件,能作對手作不到的事。因為 Lisp的高級特性,我們不需要一個大的開發團隊,所以花費也更少。如果能這樣,我們就能提供更好的產品,或者更低的價格,仍然可以盈利。逐漸的,我們就 能得到所有的客戶,而對手們什麼都得不到,直到退出這個行業。當然,這就是我們所期望的。
實驗的結果如何?讓人吃驚的是,成功了。一開始 我們有很多競爭對手,大約2,30個,但是他們的軟件都無法和我們的相比。我們有一個所見即所得的在線商店創建程序,運行在服務器上,但是和個人桌面應用 程序沒什麼兩樣。競爭對手們使用CGI腳本,而我們總是在功能上遙遙領先。有時候,對手會拚命宣傳我們沒有的功能。但是Lisp大大縮短了開發週期,以至 於我們能在1到2天之內就複製一個競爭對手剛剛發佈的新功能。當記者報導他們新發佈的版本的時候,我們也有了同樣的功能。
在競爭對手看來,我們似乎有某種秘密武器——我們能解密他們的Enigma機器或者別的東西。事實上,我們確實有一個秘密武器,但是比他們想像的簡單得多。沒有人洩露他們的秘密給我們,我們只是能以別人意想不到的速度開發軟件。
我9歲的時候,看過Frederick Forsyth寫的《刺殺戴高樂》。主角是一個被僱傭來刺殺法國總統的刺客。那個刺客需要越過警察,到一個可以俯瞰總統行走路徑的旅館。他從警察正面走過,偽裝成一個杵著枴杖的老頭,沒有人對他起疑心。
我們的秘密武器也是這樣。我們用一個充滿了怪異括號,古怪的人工智能語言編寫軟件。很多年前,我對Lisp的這個特點感到厭煩,但是它現在卻成了我們的優勢。商業上,最強的技術優勢就是,你用著競爭者不懂的技術。商業,和打仗一樣,出奇才能制勝。
所 以,有點慚愧的說,當我們在作Viaweb的時候,從未在公開場合提到Lisp。我們從來沒有對媒體提到它,如果你在我們網站上搜索Lisp,只會找到2 本我的藏書。這不奇怪,創業公司透露給它的競爭對手的信息越少越好。如果他們不知道,或者不關心我們的軟件用什麼寫的,那正合我意。[2]
最 瞭解我們技術的是客戶們。他們不關心Viaweb是用什麼寫的,只是知道它很好用。他們可以用Viaweb幾分鐘就建好一個漂亮的在線商店,所以,一傳 十,十傳百,我們有了越來越多的客戶。1996年底,我們的在線商店是70個左右。1997年年底,我們有了500個。6個月後,當Yahoo收購我們 時,有1070個用戶。今天,作為Yahoo Store,這個軟件依舊統治著市場。也是Yahoo盈利很多的商品之一,而用它建立的商店,則是Yahoo Shopping的基礎。我1999年離開Yahoo,所以不知道他們現在有多少用戶了,但是最近一次聽說是20000。
Blub矛盾原則
Lisp 到底強在哪裡?如果Lisp這麼強大,為什麼這麼少人用?聽起來是個複雜的問題,但是答案很直接:Lisp不僅因為,只有喜歡它的人才能看到它的強大,還 因為它是你可以使用的最強大的語言。不是所有人都用Lisp的原因是,編程語言不只是技術,還包括頭腦的習慣,而這些改變起來都很緩慢。當然,這裡需要解 釋一下。
我從一個非常有爭議的聲明開始說起:編程語言的威力是不一樣的
至少,大部分人會同意,高級語言比機器語言強大。如今,很多程序員都明白,用機器語言寫程序很傻。你應該用高級語言,讓編譯器去把它轉換成機器語言。這個觀點甚至被用在硬件上了:20世紀80年代以來,彙編指令集開始為編譯器設計,而不是為程序員。
所有人都知道手寫機器語言編寫程序是錯誤的。但很多人沒理解另一個通用的觀點:如果你可以選擇許多種語言,他們其他地方都一樣,那只有用最有威力的才是唯一正確的選擇。[3]
這 個觀點有很多例外。如果你需要寫一個和某個語言寫的程序工作很接近的程序,也許用同樣的語言寫這個程序會是個不錯的選擇;如果你需要寫一個只作很簡單的, 比如數字,位處理,你也許應該用抽象程度不那麼高的語言,特別是當它能夠運行得更快的時候;如果你只想寫一個臨時程序,也許你該用對這個任務來說,有最佳 的函數庫的語言。但是,總的說來,對於應用程序,你應該能使用最有威力(最有效率)的語言。用別的語言都是個錯誤,因為那樣幾乎等於,雖然誇哦張了點,是 在用機器語言編程。
你們都知道機器語言是很低級的。但是,以社會上的普遍觀點來說,高級語言通常都被認為是差不多的,其實不然。從技術上說,「高級語言」並不是一個精確的定義,而在低級語言和高級語言之間也沒有明確的分界線。根據抽象程度的高低,編程語言形成了一個有序的梯隊列表。[4]
看看Cobol。Cobol是一個高級語言,因為它需要編譯成機器語言執行。但是會有人認真的說Cobol的威力和,比如Python,是一樣的嗎?它顯然比Python更接近機器語言。
那 麼Perl 4呢?從Perl 4到Perl 5,詞法閉包添加了進來。大多數Perl黑客會同意,Perl 5比Perl 4更強大。一旦你也這麼覺得,那就意味著你承認,一種高級語言可以比另一種更強大。除非特殊情況,接下來你自然會想要去用能得到的,最強大的語言。
但是,這個想法很少會和上述結論吻合。歲月流逝,程序員極少積極的更換使用的語言。人們一旦習慣使用某種語言,他們就會滿足現狀。
程序員和他們喜愛的語言特別親近,而我也不想傷害任何人的情感。因此,為了說明這個觀點,我將使用一個假設的語言:Blub。Blub處於語言抽象程度列表的中間位置,它不是最強大的語言,但是比Cobol或者機器語言要強大。
而事實上,我們的Blub程序員2者都不會用。他當然不會想要用機器語言寫程序,那是編譯器干的事。至於Cobol,他不瞭解怎麼用它解決問題,因為它沒有X功能(設想的某種功能)。
我 們假設的Blub程序員如果從語言抽象程度列表往下看,他能知道自己是在往下看。比Blub弱的語言明顯的弱很多,因為缺少他已經習慣的一些功能。但是, 假如我們的Blub程序員從相反的方向去看,他卻不會覺得自己是在往上看。因為他看到的都是古怪的語言。他也許會認為那都是和Blub差不多的語言,只是 長相稀奇古怪而已。Blub對他來說足夠了,因為他是在用Blub思考。
當我們從另外一個,使用更高級的語言的程序員的角度來看時,又會如何?你用Blub能作什麼呢?它連Y功能都沒有。
簡 單的說,只有理解最強大語言的程序員,才會對整個列表的高級語言的威力,有一個全面的瞭解。(這也許就是Eric Raymond說的,Lisp會讓你成為一個更好的程序員的原因。)你不能相信其他人的看法,因為Blub矛盾原則:他們對自己習慣的語言感到滿足,因為 這符合他們思考程序的方式。
我自己的經歷證明了這點,當時我還在高中用Basic寫程序時。那種語言甚至不支持遞歸。很難想像不用遞歸來寫程,但是我當時不這麼覺得。我以Basic的方式思考,成了Basic的專家,掌握了所有我能瞭解到的。
Eric Raymond推薦給黑客的5種語言,位於語言威力列表中不同的位置,而他們之間的比較則是個容易引起爭吵的話題。我想說的是,我覺得Lisp是在最頂層 的。為了證明這個觀點,我會指出一個其他四種語言沒有的特性。他們甚至不支持宏(Macro),我能用它能作什麼呢?[5]
許多語言都一 個被叫做「宏」的東西,但是Lisp的宏是不同的。信不信由你,它們作的都是和括號相關的。Lisp的設計者並不是只是為了與眾不同才使用那麼多括號。對 Blub程序員來說,Lisp的代碼看起來很古怪。但是,這些括號的出現是有原因的。這使得Lisp從外表上看起來,和其他語言有本質的不同。
Lisp代碼是由Lisp數據對象組成的。別的語言一般會設計成:源文件包含字符,字符串是則是該語言所支持的數據類型之一。而當解析器讀取Lisp代碼時,你會發現Lisp是由你可以遍歷的數據結構組成的。
如 果你明白編譯原理,就會可以理解Lisp的這種奇怪的語法,或者說沒有語法的語法。其他語言會被編譯器解析成解析樹,而你在Lisp中,就是用這種解析樹 的結構寫程序。這些解析樹對你的程序來說是可讀的,因此就可以寫程序來維護它們。在Lisp裡,這樣的程序稱為宏。它們是可以生成程序的程序。
可 以生成程序的程序?什麼時候會需要這麼作?如果你用Cobol的方式思考,這種需求並不常見;如果用Lisp的方式思考,你會經常想要這麼作。這裡如果能 給出一個強大的宏的例子,也許會比較方便闡明。但是對一個不懂Lisp的人來說,會覺得那像是在胡扯,我沒辦法把需要讓你理解宏的預備知識在這裡說清楚。 在《Ansi Common Lisp》這本書裡,我已經很快的引導讀者理解所有的東西,儘管如此,在160頁之前,我都沒有提到宏。
我 能給出一個有說服力的例子。Viaweb編輯器的源碼有20%-25%是宏。宏比普通的Lisp函數要難寫,在不需要的地方使用也是個壞習慣。所以,宏存 在於那裡是因為它必須存在。這就是說,在這個程序裡,有20%-25%的部分是你用別的語言難以實現的。Blub程序員可能會對我聲稱的,Lisp如此神 氣的威力,感到懷疑和好奇。我們寫這些代碼不是只給自己看看而已。我們是個很小的創業公司,所以盡最大的力在我們和競爭者之間構築了一道技術的壁壘。
感到疑惑的人也許會想,你說的這些東西都有什麼關聯?我們的一大段代碼,是在作用別的語言很難實現的工作,這樣,我們就能人所不能。也許這就是關鍵所在,我鼓勵你順著這個角度去思考。也許這個杵著枴杖的老頭可不簡單哦。
創業之道
我 不指望說服所有的人(大於25歲)都去學Lisp。這篇文章的目的不是改變別人的想法,而是給那些對Lisp有興趣的人信心。他們已經知道Lisp是一個 強大的語言,但是因為它沒有被廣泛的使用而感到擔憂。在競賽中,這是一種優勢。因為你的競爭對手用不了它,所以Lisp的優勢還被放大了。
如 果你想要用Lisp創業,不需要因為它不被廣泛的理解而感到擔憂。你應該覺得那樣很好。人們普遍對於他們當前使用的語言很滿意。計算機硬件的發展速度比人 們習慣的改變速度快得多,實際編程比處理器要落後10到20年。像在MIT,他們早在20世紀60年代就開始用高級語言寫程序了,而很多公司在80年代之 前都還在用機器語言。我敢打賭,處理器換到RISC指令集時,相當大一部分還在用機器語言寫代碼的人失了業。
通常說來,技術更新是很快 的。但是編程語言不一樣:編程不止是技術,也是程序員思維的方式。他們是半技術,半宗教信仰的東西。[6]所以,流行的語言,即大部分程序員使用的語言, 發展像冰山一樣緩慢。垃圾回收,大約20世紀60年代由Lisp引入,現在普遍被認為是個好東西;運行時輸入(runtime typing),同上,現在開始流行起來;詞法閉包,20世紀70年代由Lisp引入,現在少量的運用在雷達技術上。宏,20世紀60年代由Lisp引 入,現在還是未開墾的領域。
當然,流行的語言有強大的勢力,我不是想讓你去對抗。相反,像合氣道(譯者:日本的一種競技項目)一樣,你可以用它來對付競爭對手。
如果你在一家大公司工作,也許沒那麼容易。說服一個頭髮油光鋥亮的老闆是個艱難的任務,而他也許正好讀到某篇報導,說某某語言,就像20年前的Ada一樣,將要佔領這個行業。
但假如你在創業公司工作,也沒有那種油光鋥亮的老闆,那就好好利用Blub矛盾原則提到的優勢,就像我們一樣:你可以使用,那些堅持使用流行語言的競爭對手,永遠無法匹敵的技術。
如果你在一個創業公司工作,這裡有一些可用於評估對手的提示:查看他們的招聘崗位。他們網站上的其他東西也許會是股票照片,或者之類的。但是職位需求肯定會反映出他們要什麼樣的員工,否則無法得到想要的候選人。
我 在Viaweb工作的幾年裡,查看過很多的職位描述。每個月都會有新的競爭者冒出來。我首先作的通常是,看看他們是否有在線的demo,然後去查看他們的 招聘信息。很多年之後,我可以知道那些公司需要注意,而那些不需要。最安全的是那些需要Oracle經驗的,你不需要擔心他們。如果他們需要C++或者 java開發者,你同樣不需要擔心。如果他們想要Perl或者Python程序員,那就得小心了——看起來這家公司是搞技術的,至少,他們是真的黑客創辦 的。如果看到招聘Lisp黑客的信息,我就會非常擔心。
註釋
[1]起初Viaweb有2部分:編輯器,用Lisp編寫的,用戶們用它來建立站點;請求處理系統,用C編寫,處理請求。初版基本上是Lisp,因為請求處理系統很小。後來我們增加了2個模塊,用C寫的一個圖像生成器,用Perl寫的一個後台管理系統。
2003年1月,Yahoo發佈了用C++和Perl寫的新版本。很難說這個程序是否還是Lisp寫的,因為要把它移植到C++,他們需要寫一個Lisp解釋器:構建頁面模板的源文件,就我所知,還是Lisp代碼。
[2]Rober Morris說我不需要保密,因為即使競爭者們知道我們用Lisp,他們也不會理解為什麼:「假如他們有那麼聰明的話,他們早就用Lisp編程了。「
[3] 因為圖靈等價,所以很多語言被認為威力差不多,但是這不是程序員關心的。(沒人想要寫一個圖靈機)。NB的程序員到底關心什麼不好說,一種可能的解釋是: 那些只能通過為更強大語言寫一個解釋器,才能在較弱的語言中獲得的功能。如果語言A有一個操作符可以把字串中的空格去掉,而語言B沒這個,那並不意味只A 就更強大。因為你大可在B裡寫一個類似的函數。但是假如A支持,比如遞歸,而B不支持,那可就不是你寫一個函數庫可以解決的問題了。
[4]呆頭呆腦和斷章取義的人注意:重要的是這裡存在一個抽象的順序,它到底長什麼形狀並不重要。
[5]把宏作為一個單獨的功能列出來,有些不妥。實際上,他們的功效需要和其他的Lisp功能,比如詞法閉包,變參等,一起才能發揮最大作用。
[6]結果是,對編程語言的比較要麼是以「宗教戰爭」的形式,要麼就像本科教材裡面那樣儘量中立的表述。對於看重和平,明哲保身的人來說,他們會避免這個話題。但是這個問題其實只是半宗教的:有些東西還是值得你去學習,特別是當你想要設計新語言的時候。
沒有留言:
發佈留言