Lisp在一个创业公司中的故事
这篇文章是从保罗的主页上找到的,已经有一篇对岸的译文收录在《骇客与画家》中了。
超越平凡
--Lisp在一个创业公司中的故事
作者:保罗.格雷厄姆
译者:不累的王
校对:疯子鱼
原文地址:http://www.paulgraham.com/avg.html
(本文由2001年三月25日剑桥的一次Franz Developer研讨会中的发言整理而来。)
1995年夏天,我得朋友Robert Morris 和我创立了一家个名叫Viaweb的公司。我们计划编写令用户可以构建在线商店的软件。当时,这个软件的新奇之处在于,它跑在我们的服务器上,使用普通的Web页面作为界面。
当然,当时许多人产生了相同的想法,不过据我所知,Viaweb 是第一个基于Web的应用程序。它看上去确实是一个新鲜的想法,以至于我们使用它作为我们公司的名字:Viaweb,因为我们的软件通过web工作,而非运行在你的桌面计算机上。
这个软件的另外一个不同寻常之处在于,它主要使用一种称作Lisp的语言编写。[注1]它是最早的使用Lisp编写的终端用户程序之一,Lisp被广泛的应用于大学和实验室。相对其他使用那些不那么强悍语言的对手,Lisp给予了我们巨大的优势。
1. 秘密武器
Eric Raymond撰写过一篇名为《怎样成为一名黑客》的文章,其中提到若想成为大牛该学习哪些语言。他建议从 Python 或 Java 开始,因为它们容易学习。有品位的黑客要学习 C,以在Unix上工作;为了作系统管理或 CGI,还需要学习 Perl。最后,真正牛的黑客应该考虑学习Lisp:学习Lisp可以使你获得受到深刻的启迪后的经验;这种经验将使你在剩下的日子成为一名更出色的程序员,即使你并非很多地使用Lisp本身。
这和你经常听说的关于拉丁语的说法相同。它不会使你得到一份工作,除非是典型的教授职位,但是它会改进你的思想,使你更好地使用你所希望使用的语言,就像拉丁语相对于英语。
但请稍等。这个比喻并不完全恰当。拉丁语无法使你得到一份工作,是因为没有人讲拉丁语。如果你使用拉丁语书写,没有人能理解你的意思。但是Lisp是一种计算机语言,计算机使用程序员对它讲的任何一种语言。所以,如果 Lisp 使你成为一名更出色的程序员,就像他(Eric Raymond)说的那样,为什么不使用它呢?如果一名画家获得一支可以使他成为更好的画家的画笔,我觉得他会在他所有的绘画中都使用这支笔,不是么?我并非在此开 Eric Raymond 的玩笑。总的来说,他的建议是非常好的。他谈论的Lisp就像常说的贤者。不过这位贤者有一个矛盾:Lisp 会使你成为一名更好的程序员,但之后你将不会使用它。
为什么不?编程语言只是工具而已。如果 Lisp 真的生成更好的程序,你会去使用它的。但如果它不能,谁会用它呢?
这并不只是一个理论问题。软件业是充满竞争的行业,倾向于产生天然的垄断。在其他条件相等的情况下,一家能够更快更好的生产出软件的公司,将淘汰它的竞争对手。当你正在开始一家创业公司的时候,你会非常敏锐的感受到这一点。创业公司通常徘徊于天堂和地狱之间。你或者变得富有,或者变得一无所有。在一家创业公司,如果你将赌注压在错误的技术上,竞争对手将粉碎你。
罗伯特和我都很了解Lisp,并且我们看不到任何理由阻止我们凭着天性选择 Lisp。我们知道很多人使用 C++ 或 Perl 编写他们的软件。但我们同样知道那并不意味着任何事。如果你那样选择技术,你一定在跑Windows。当你选择技术的时候,你必须忽略其他人的选择, 而仅考虑什么技术能够工作得最好。
对于一家创业公司来说尤为如此。在大公司,你可以照般所有其他那些大公司的做法。但是创业公司不能照搬其他创业公的做法。我并不认为有多少人了解这一点,即使在创业公司。一般的大公司每年大概增长十个百分点。所以如果你在经营一家大公司,并且照搬其他一般的大公司的做法,假如和其它一般的大公司作得一样好,那么每年可以增长10个百分点。
当然,在你经营创业公司时,同样的事情也会发生。如果你作的所有事情只是照搬其他创业公司,你一定期待一个平均的回报。问题是,这时候,平均意味着你将出局。创业公司的存活率只有不到百分之五十。所以如果你在经营一家创业公司,你最好作点不同凡响的事情。否则你将面临麻烦。
回到1995年,我们知道我不认为我们的竞争者明白,甚至直到今天还很少有人明白:当你编写跑在自己服务器上的软件时,你可以使用任何你想使用的语言。当你在编写桌面软件时,一个巨大的偏见导致应用程序使用同一种语言编写,运行在同一种操作系统上。十年前,编写应用程序意味着用 C 语言编写图形界面。但编写 Web 软件时,特别是当你同时用有编程语言和操作系统的源代码时,你可以使用任何你希望使用的语言。可是,这种新的自由是一柄双刃剑。现在你可以使用任何语言,你必须思考使用哪一种。公司们都装作没有做出冒险的转变并试图找到对手的真正意图。
如果你可以使用任何语言,你用哪一种?我们选择 Lisp。首先,显而易见的是快速开发在这个市场上将非常重要。我们全都从零起步,所以一家公司可以在他的对手获得长足进步之前获得新的特性。我们知道 Lisp 确实是一种适合快速编写软件的好语言,并且服务器端程序扩大了这种快速开发的效果,因为你可以在软件完成的同时就发布它。
如果其他公司不想使用 Lisp,那就更好了。这将带给我们一个技术优势,并且我们我们需要我们能够获得的所有帮助。当我们开始 Viaweb,我们没有任何关于业务的经验。我们不知道关于市场/雇佣人力/筹集资金/或者获得客户的任何知识。甚至我们中间没有人曾经拥有过一份真正的工作。我们唯一擅长的就是编写软件。我们希望这可以拯救我们。我们将获得软件开发方面所有的优势。
所以你可以说,使用 Lisp 是一个大胆的尝试。我们的假设是使用 Lisp 编写我们的软件可以使我们比竞争对手更快获得新特性,并且可以做到他们的软件做不到的事情。并且,因为 Lisp 是这样高阶,我们不需要一个庞大的开发组,所以我们的成本将更低。如果是这样,我们可以花更少的钱获得更好的产品,并且持续盈利。我们最终将获得所有用户,我们的竞争对手将一无所获,并且最终被淘汰出局。无论如何,这正是我们所期待的。
尝试的结果如何?稍微有点惊喜,它能工作。我们的竞争对手中最后有20%~30%存活下来,但是没有任何一个可以和我们相提并论。我们有一个跑在服务器上的在线商店构建器,执行时的感觉就像一个桌面程序一样。我们的竞争对手使用CGI脚本。我们一直有领先他们的特性。有时,对手使出浑身解数尝试引入一个我们所没有的特性。但是 Lisp 使我们的开发周期非常之快,以至于有时候在对手发布某个特性之后的一两天内,我们就可以将其复制。当记者们想把对手软件登上封面而来找我们时,我们也已经有了相同的新特性。
对手一定认为我们用友某种秘密武器--比如我们破解了他们的加密通信之类的。实际上我们确实有一个秘密武器,只不过比他们的猜测更简单。没有人泄露关于他们新特性的消息给我们。我们只是可以用超乎任何人想象的速度开发软件。
我在九岁的时候,偶然间得到了一本小说《豺狼的假日》,主要情节描述一个杀手受到委托刺杀法国总统。杀手必须绕过警察进入一间公寓眺望总统的路线。他装扮成一个老人拄着拐杖从警察身边走过,然而他们丝毫没有注意到他。
我们的秘密武器与其类似。我们使用一种语法古怪的充满了圆括号的语言编写我们的软件。多年以来,Lisp 被如此描述令我非常恼火。但现在它使我们处于领先地位。在商业竞争中,一项对手无法理解的技术是无价之宝。商场如战场,出奇制胜与实力同样重要。
所以,有些羞于启齿,在我们经营 Viaweb 的时候我从未公开提起关于 Lisp 的任何事。我们从未公开提起它,如果你在我们的网站上搜索 Lisp,只能找到我的简介中提到的两本书的书名。没有意外。创业公司应该尽可能向竞争对手隐藏自己的信息。如果他们不知道或者不在乎我们使用何种语言编写我们的软件,我希望保持这种状态。[注2]
我们的顾客是最理解我们技术的人。他们不在乎 Viaweb 使用何种语言编写,他们只知道它确实工作得很好。它使他们可以用几分钟构建出看上去非常好的在线商店。所以,口口相传,我们拥有了越来越多的用户。1996 年底,我们拥有大概 70 个在线商店。1997 年底,这个数字达到了 500。六个月后,当雅虎收购我们时,我们有 1070 个用户。直到今日,这个软件作为 Yahoo Store 依旧继续支配这它的市场。他是雅虎最赚钱的部门之一,它构建的商店是Yahoo Shopping的基础。我在 1999 年离开了雅虎,所以我不知道现在他们到底拥有多少用户,但是我最后一次听说它时大概有 14,000。
大家有时问我雅虎是否依旧在使用 Lisp。是的,所有的 Lisp 代码依然在那儿。雅虎的服务器端使用了Eric Raymond提到的所有五种建议黑客学习的语言。
2. Blub 悖论
Lisp 真的这么好么?如果 Lisp 真的这么好,为什么不是所有人都用它?听起来想一个语言游戏,但实际上他有一个简单的答案。Lisp 是如此出色并非因为拥有一些仅仅它的信徒才能发觉的魔力,只是因为他是所有通用语言中最强大的。大家不使用它是因为,编程语言除了是技术之外也是思维习惯,任何事物的转变都需要时间。当然这些答案都需要进一步解释。
我将从庸俗的编程语言能力之争开始
可能会有些争论,但至少,显而易见的是,高级语言比机器语言更强大。如今多数程序员通常情况下都不会想要使用机器语言编程。你需要使用一种高级语言编写程序,并通过编译器将它翻译为机器语言。如今这个想法甚至被纳入硬件:20世纪80年代以来,已经有为编译器而不是为人类的程序员设计的指令集出现。
所有人都知道用机器码手工编写程序是一个错误。鲜为人知的一条更普适的原则是:在其他条件相等的情况下,如果你可以在几种语言中选择,那么除了使用最强劲的语言之外的所有选择都是错误的。[注3]
对于这条法则存在许多例外。如果你的程序必须接近某种特定语言编写的程序,使用相同的语言是一个好主意。如果你的程序只需要作一些简单的工作,比如数字操作或者位操作,你可能需要一种不那么抽象的语言,因为它也许会稍微快一些。如果你在编写一个很短小的一次性程序,你最好选择一种拥有最擅长处理那种任务的库函数的语言。但是通常,对于应用程序软件来说,你希望使用你可以得到的最强劲的语言(因为高效),并且使用任何其他的都是错误,同理,某种情况下可能需要更低级的语言,比如机器语言。
显而易见,机器语言非常低级。但是,至少作为一种约定俗成的惯例,高级语言之间经常获得同等的对待。而机器语言却不是。技术上说,“高级语言”不说明任何问题。没有一条分割线将机器语言和高级语言隔开。所有语言,从最强劲的机器语言到机器语言,都拥有一致[注4]的抽象性。
考虑一下 Cobol。Cobol 是一种高级语言,通常,它被编译为机器语言。有人真的认为 Cobol 和某种语言,比如说 Python,等价吗?与 Python 相比,Cobol 更接近机器语言。
Perl4 怎么样?在 Perl 4 向 Perl 5 的发展中,字典和闭包被加入语言。大多数 Perl 黑客会同意 Perl 5 比 Perl 4 更加强大。一旦你承认了这点,你就承认了一种高级语言可能比另一种高级语言更强大。更无情的事实是,除非特殊情况,你会使用你能得到的最强大的语言。尽管这个想法很少跟随着它的结论。超过一定年龄之后,程序员很少自愿的更换语言。不管别人开始使用什么语言,他们总是选择刚好够用的语言。
程序员们非常关注他们最喜爱的语言,我不想伤害任何人的感情,所以我将使用一种假想的语言Blub来解释这一点。Blub刚好是一种中级语言。但是它比Cobol或者机器语言更强大。
实际上,使用我们的虚拟语言Blub的程序员不会使用他们中的任意一种。他当然不会使用机器语言,那是编译器干的事儿。对于Cobol,他不知道人们到底可以用这种东西写出些什么来。它甚至连x(x是Blub语言的某种特性)都没有。
只要我们的Blub程序员按照语言能力俯视低级语言,他一定知道他是在俯视。那些语言是如此明显的弱于Blub,因为它们缺少了某些他习惯于使用的Blub语言特性。但是当我们的Blub程序员向另一个方向,仰视某些高级语言的时候,他不知道他是在仰视。他认为看到的只是些怪异的语言。
他可能会考虑Blub如何做到与这种语言等价,但是没有这些乱七八糟的内容也没什么不妥。Blub对于他来说足够好了,因为他用Blub思考。
然而,当我们以某种比Blub语言更高级语言的程序员的视角来观察的时候,我们就会发现我们在俯视Blub。“你是怎么用Blub搞定所有事儿的呢?它甚至没有y(没有幽默感的译者注:假设的某种高级语言的某种特性)”。
综上,能够看到所有不同语言能力差异的程序员只有那些理解了最强语言的程序员。(这可能是Eric Raymond认为Lisp使你成为更好的程序员的原因)
你不能相信其他人的想法,因为Blub悖论:他们对他们开始时使用的语言感到满意,因为它是他们构思程序的方式。在我还是一个写Basic程序的高中生的时候,我就凭经验了解这一点。那种语言甚至不支持递归。很难想像如何写一个不使用递归的程序,但是那是我没有放弃它。我使用Basic思考。并且我是一个Basic神童。在接触到的所有领域中,我都是专家。
Eric Raymond向黑客们推荐的五种语言拥有各自不同的特性。他们的能力高低是一个敏感的话题。我想说的是我认为Lisp是最强的那种。为了支持这个观点我将告诉你们我发现其他四种语言缺少了什么。其它四种语言怎么可能搞定所有问题呢?--如果缺少了Lisp的某种特性的话。而对于我来说,他们缺少的最重要的东西,是宏。[注5]
很多语言拥有称为“宏”的东西。但是Lisp的宏是独一无二的。无论你是否相信,它们与圆括号有关。Lisp的设计者并非只是为了标新立异才将圆括号加入语言。对于Blub程序员来说,Lisp代码显得怪异。但是这些圆括号的存在是有理由的。他们是Lisp与其他语言内在不同的外在表现。
Lisp代码有Lisp数据对象构成。并非是微观上”源文件由字符构成,字符串是语言支持的数据类型的一种”的含义。Lisp代码,在其被解析器读取之后,是可以被遍历的数据结构。
如果你理解编译器的工作原理,实际上剩下容易解释了,Lisp拥有奇怪的语法,因为Lisp没有语法。你在使用在其他语言中由编译器生成的语法解析树写程序 。但是这些解析树完全可以被你的程序访问。你可以编写操作它们的程序。
在Lisp中,这些程序被称为宏。他们是写程序的程序。
写程序的程序?你何时会想做这样的东西呢?如果你用Cobol思考,很少。如果你用Lisp思考,所有的时候。可能如果我给出一个强力的宏的例子以说明这一点会比较合适。需要吗?如果我那样做了,它对于不懂Lisp的人来说会像是含混不清的鬼扯;这里没有足够的空间解释你需要理解这些含义所需的所有东西。在《Ansi Common Lisp》中我试图尽可能快速的讲解东西,同时我也没有在160页之前提到宏。
但是我想我可以给出一些比较合适的参数。Viaweb编辑器的代码大约20-25%由宏构成。宏比普通的V函数更难写,而且当他们出现在不必要的场合的时会导致糟糕的风格。所以每个宏代码都是无可或缺,事出有因的。这意味着这个程序至少有20-25%的代码使用任何其他语言都很难编写。尽管V程序员可能会对我宣称的Lisp的神奇力量产生怀疑,这应该刺激了他的好奇心。我们不是为了个人的消遣才这样写程序的。我们是一家小创业公司,我们尽可能的编写艰深的程序以设置留给竞争对手们的技术门槛。
多疑的人可能开始怀疑这些是否有关联。我们有大段的代码做了在其他语言中非常难实现的事情。我们的产品拥有竞争对手产品无法实现的功能。可能这里有一些关联。我鼓励你跟进。对于对于跛足的老人来说拐杖比眼睛更重要。
3. 创业公司的合气道
但我并不期盼任何人立刻开始学习Lisp。这篇文章的目的并非改变任何人的思想,而是给那些开始对使用Lisp感兴趣的人--那些知道Lisp是一种强劲语言却对其没有被广泛应用而感到担心的人--更强的信心。在竞争中,这是一个优势。Lisp的威力因为你的竞争对手没有使用它而得到倍增。
如果你考虑在创业中使用Lisp,不必担心它没有被广泛的理解。你应该希望它一直不被理解。并且貌似事实上也是如此。这是大多数人安于他们当前使用的语言的结果。计算机硬件的变化相对于个人习惯是如此的快速,以至于编程实践通常落后处理器十到二十年。
在MIT那样的地方,人们早在1960年代就开始使用高级语言编写程序,但是很多公司在1980年代还在使用机器语言编写代码。我打赌很多人在被处理器--像急着关店回家的酒保一样--踢出来转向Risc指令集之前一直在使用机器码写程序。
普通技术更新得很快。但编程语言有所不同:编程并非仅仅是技术,它还包含程序员的思想。
它们一半是技术,一半是信仰。[注6]
所以中级语言,即大多数程序员使用的语言,改变得就像冰山融化一样缓慢。
垃圾收集技术在 1960 年被 Lisp 引入,现在被广泛的认为是一样好动西。闭包,早在 70 年代就被 Lisp 引入,现在被人们广泛地关注。宏,60 年代被 Lisp 引入,至今依然是鲜为人知的基础。
当然,中级语言拥有巨大的冲量。我并非建议你去违背这种强大的力量。恰恰相反,我只是建议你像合气道修炼者那样,用这种力量对抗你的敌人。
如果你为一个大公司工作,这可能不那么简单。你将花费巨量的时间说服尖头老板(译者注:尖头老板,缺乏一般知识常识及职位所应具有的管理能力,爱说大话且富有向物理现实挑战的精神,倒霉跟负责的往往是他的下属。)允许你使用Lisp写程序,而他只在纸面上读到过一些平庸的语言,比如像Ada那种二十年前产生而今早已被取代了的语言。但是,如果你在一家创业公司,没有尖头老板,你可以像我们一样,将Blub悖论转化为你的优势:你可以使用那些被中级语言粘得动弹不得的竞争对手们永远无法匹敌的技术。
如果你曾经在一家创业公司工作,这里有一条可以评价你的竞争对手们。读他们的招聘启事。他们的站点可能会做照片储存或者其他类似的平平无奇的东西,但是招聘启事必须指明他们想要的是什么,否则他们将得到错误的应聘者。
在Viaweb工作的这些年来我读过许多招聘启事。似乎每个月都有新的竞争对手浮出水面。在查看他们是否有在线的demo之后,我做的第一件事是就是查看他们的招聘启事。经过这样几年后我可以指出哪些竞争对手值得关注,而哪些不需要。招聘启事中的IT味道越重,这家公司就越不值得关注。最不值得注意的是那些需要Oracle经验的公司。你永远不必担心那些公司。如果他们需要C++或者Java开发者,你也同样可以悠然自得。如果他们需要Perl或Python程序员,就有一点值得小心了----这说明这家公司有点技术实力,至少被一些真正的黑客运作着。如果见到有招聘启事寻找Lisp黑客,我才会真正的担心。
在我写那些关于Lisp的书的时候,我习惯于希望每个人都理解它。但是当我开始Viaweb的时候,我发现我变了,我希望每个人都理解它,除了我们的竞争对手。
[1] Viaweb 最初包含两个部分:由 Lisp 编写的编辑器,用户可以用它创建自己的站点,以及由 C 编写的选购系统,用来处理指令。第一个版本大多数是 Lisp,因为那时指令系统还很小。稍后我们添加了两个模块,一个由 C 编写的图片生成器, 一个大部分由 Perl 编写的后端处理器。
[2]Robert Morris 说,我不需要保密,因为如果我们的即使竞争对手知道,他们也无法理解我们使用 Lisp:“如果他们那么聪明,他们早就用 Lisp 编程了。”
[3]所有图灵完备的语言具有相同的能力,但是程序员并不在乎这点。(没有人希望给一个图灵机编程)。程序员并不关心可以被形式化定义的能力,而是在意那些只能由低级语言编写的更强大语言的解释器实现的功能。假设A语言拥有一个移除字符串中所有空格的操作符,而B语言中没有,这可能并不能使得A更强大,因为你或许可以在B中使用一段子程序做到这一点。但是如果A支持,比如说递归之类的特性,而B不支持,那可能就不是可以通过函数库解决的问题了。
[4] 请书呆子们注意:或许更像是一张在顶部收缩的网;相对于思想来说形状并不重要,至少这儿有一个大致的顺序。
[5]这可能会使大家误以为宏是一个分离的特性。实际上他们的用处因其它一些Lisp特性而得到增强,比如词法闭包。
[6]编程语言之间的比较或者表现得像宗教战争,或者像学生的教科书一样坚决的中立,无论如何,他们确实是在为整个人类工作。看重名利的人可以忽略这个话题。但这个问题只有一半是与信仰有关的;如果你想设计新的语言,还是有一些东西是值得从中学习的。
超越平凡
--Lisp在一个创业公司中的故事
作者:保罗.格雷厄姆
译者:不累的王
校对:疯子鱼
原文地址:http://www.paulgraham.com/avg.html
(本文由2001年三月25日剑桥的一次Franz Developer研讨会中的发言整理而来。)
1995年夏天,我得朋友Robert Morris 和我创立了一家个名叫Viaweb的公司。我们计划编写令用户可以构建在线商店的软件。当时,这个软件的新奇之处在于,它跑在我们的服务器上,使用普通的Web页面作为界面。
当然,当时许多人产生了相同的想法,不过据我所知,Viaweb 是第一个基于Web的应用程序。它看上去确实是一个新鲜的想法,以至于我们使用它作为我们公司的名字:Viaweb,因为我们的软件通过web工作,而非运行在你的桌面计算机上。
这个软件的另外一个不同寻常之处在于,它主要使用一种称作Lisp的语言编写。[注1]它是最早的使用Lisp编写的终端用户程序之一,Lisp被广泛的应用于大学和实验室。相对其他使用那些不那么强悍语言的对手,Lisp给予了我们巨大的优势。
1. 秘密武器
Eric Raymond撰写过一篇名为《怎样成为一名黑客》的文章,其中提到若想成为大牛该学习哪些语言。他建议从 Python 或 Java 开始,因为它们容易学习。有品位的黑客要学习 C,以在Unix上工作;为了作系统管理或 CGI,还需要学习 Perl。最后,真正牛的黑客应该考虑学习Lisp:学习Lisp可以使你获得受到深刻的启迪后的经验;这种经验将使你在剩下的日子成为一名更出色的程序员,即使你并非很多地使用Lisp本身。
这和你经常听说的关于拉丁语的说法相同。它不会使你得到一份工作,除非是典型的教授职位,但是它会改进你的思想,使你更好地使用你所希望使用的语言,就像拉丁语相对于英语。
但请稍等。这个比喻并不完全恰当。拉丁语无法使你得到一份工作,是因为没有人讲拉丁语。如果你使用拉丁语书写,没有人能理解你的意思。但是Lisp是一种计算机语言,计算机使用程序员对它讲的任何一种语言。所以,如果 Lisp 使你成为一名更出色的程序员,就像他(Eric Raymond)说的那样,为什么不使用它呢?如果一名画家获得一支可以使他成为更好的画家的画笔,我觉得他会在他所有的绘画中都使用这支笔,不是么?我并非在此开 Eric Raymond 的玩笑。总的来说,他的建议是非常好的。他谈论的Lisp就像常说的贤者。不过这位贤者有一个矛盾:Lisp 会使你成为一名更好的程序员,但之后你将不会使用它。
为什么不?编程语言只是工具而已。如果 Lisp 真的生成更好的程序,你会去使用它的。但如果它不能,谁会用它呢?
这并不只是一个理论问题。软件业是充满竞争的行业,倾向于产生天然的垄断。在其他条件相等的情况下,一家能够更快更好的生产出软件的公司,将淘汰它的竞争对手。当你正在开始一家创业公司的时候,你会非常敏锐的感受到这一点。创业公司通常徘徊于天堂和地狱之间。你或者变得富有,或者变得一无所有。在一家创业公司,如果你将赌注压在错误的技术上,竞争对手将粉碎你。
罗伯特和我都很了解Lisp,并且我们看不到任何理由阻止我们凭着天性选择 Lisp。我们知道很多人使用 C++ 或 Perl 编写他们的软件。但我们同样知道那并不意味着任何事。如果你那样选择技术,你一定在跑Windows。当你选择技术的时候,你必须忽略其他人的选择, 而仅考虑什么技术能够工作得最好。
对于一家创业公司来说尤为如此。在大公司,你可以照般所有其他那些大公司的做法。但是创业公司不能照搬其他创业公的做法。我并不认为有多少人了解这一点,即使在创业公司。一般的大公司每年大概增长十个百分点。所以如果你在经营一家大公司,并且照搬其他一般的大公司的做法,假如和其它一般的大公司作得一样好,那么每年可以增长10个百分点。
当然,在你经营创业公司时,同样的事情也会发生。如果你作的所有事情只是照搬其他创业公司,你一定期待一个平均的回报。问题是,这时候,平均意味着你将出局。创业公司的存活率只有不到百分之五十。所以如果你在经营一家创业公司,你最好作点不同凡响的事情。否则你将面临麻烦。
回到1995年,我们知道我不认为我们的竞争者明白,甚至直到今天还很少有人明白:当你编写跑在自己服务器上的软件时,你可以使用任何你想使用的语言。当你在编写桌面软件时,一个巨大的偏见导致应用程序使用同一种语言编写,运行在同一种操作系统上。十年前,编写应用程序意味着用 C 语言编写图形界面。但编写 Web 软件时,特别是当你同时用有编程语言和操作系统的源代码时,你可以使用任何你希望使用的语言。可是,这种新的自由是一柄双刃剑。现在你可以使用任何语言,你必须思考使用哪一种。公司们都装作没有做出冒险的转变并试图找到对手的真正意图。
如果你可以使用任何语言,你用哪一种?我们选择 Lisp。首先,显而易见的是快速开发在这个市场上将非常重要。我们全都从零起步,所以一家公司可以在他的对手获得长足进步之前获得新的特性。我们知道 Lisp 确实是一种适合快速编写软件的好语言,并且服务器端程序扩大了这种快速开发的效果,因为你可以在软件完成的同时就发布它。
如果其他公司不想使用 Lisp,那就更好了。这将带给我们一个技术优势,并且我们我们需要我们能够获得的所有帮助。当我们开始 Viaweb,我们没有任何关于业务的经验。我们不知道关于市场/雇佣人力/筹集资金/或者获得客户的任何知识。甚至我们中间没有人曾经拥有过一份真正的工作。我们唯一擅长的就是编写软件。我们希望这可以拯救我们。我们将获得软件开发方面所有的优势。
所以你可以说,使用 Lisp 是一个大胆的尝试。我们的假设是使用 Lisp 编写我们的软件可以使我们比竞争对手更快获得新特性,并且可以做到他们的软件做不到的事情。并且,因为 Lisp 是这样高阶,我们不需要一个庞大的开发组,所以我们的成本将更低。如果是这样,我们可以花更少的钱获得更好的产品,并且持续盈利。我们最终将获得所有用户,我们的竞争对手将一无所获,并且最终被淘汰出局。无论如何,这正是我们所期待的。
尝试的结果如何?稍微有点惊喜,它能工作。我们的竞争对手中最后有20%~30%存活下来,但是没有任何一个可以和我们相提并论。我们有一个跑在服务器上的在线商店构建器,执行时的感觉就像一个桌面程序一样。我们的竞争对手使用CGI脚本。我们一直有领先他们的特性。有时,对手使出浑身解数尝试引入一个我们所没有的特性。但是 Lisp 使我们的开发周期非常之快,以至于有时候在对手发布某个特性之后的一两天内,我们就可以将其复制。当记者们想把对手软件登上封面而来找我们时,我们也已经有了相同的新特性。
对手一定认为我们用友某种秘密武器--比如我们破解了他们的加密通信之类的。实际上我们确实有一个秘密武器,只不过比他们的猜测更简单。没有人泄露关于他们新特性的消息给我们。我们只是可以用超乎任何人想象的速度开发软件。
我在九岁的时候,偶然间得到了一本小说《豺狼的假日》,主要情节描述一个杀手受到委托刺杀法国总统。杀手必须绕过警察进入一间公寓眺望总统的路线。他装扮成一个老人拄着拐杖从警察身边走过,然而他们丝毫没有注意到他。
我们的秘密武器与其类似。我们使用一种语法古怪的充满了圆括号的语言编写我们的软件。多年以来,Lisp 被如此描述令我非常恼火。但现在它使我们处于领先地位。在商业竞争中,一项对手无法理解的技术是无价之宝。商场如战场,出奇制胜与实力同样重要。
所以,有些羞于启齿,在我们经营 Viaweb 的时候我从未公开提起关于 Lisp 的任何事。我们从未公开提起它,如果你在我们的网站上搜索 Lisp,只能找到我的简介中提到的两本书的书名。没有意外。创业公司应该尽可能向竞争对手隐藏自己的信息。如果他们不知道或者不在乎我们使用何种语言编写我们的软件,我希望保持这种状态。[注2]
我们的顾客是最理解我们技术的人。他们不在乎 Viaweb 使用何种语言编写,他们只知道它确实工作得很好。它使他们可以用几分钟构建出看上去非常好的在线商店。所以,口口相传,我们拥有了越来越多的用户。1996 年底,我们拥有大概 70 个在线商店。1997 年底,这个数字达到了 500。六个月后,当雅虎收购我们时,我们有 1070 个用户。直到今日,这个软件作为 Yahoo Store 依旧继续支配这它的市场。他是雅虎最赚钱的部门之一,它构建的商店是Yahoo Shopping的基础。我在 1999 年离开了雅虎,所以我不知道现在他们到底拥有多少用户,但是我最后一次听说它时大概有 14,000。
大家有时问我雅虎是否依旧在使用 Lisp。是的,所有的 Lisp 代码依然在那儿。雅虎的服务器端使用了Eric Raymond提到的所有五种建议黑客学习的语言。
2. Blub 悖论
Lisp 真的这么好么?如果 Lisp 真的这么好,为什么不是所有人都用它?听起来想一个语言游戏,但实际上他有一个简单的答案。Lisp 是如此出色并非因为拥有一些仅仅它的信徒才能发觉的魔力,只是因为他是所有通用语言中最强大的。大家不使用它是因为,编程语言除了是技术之外也是思维习惯,任何事物的转变都需要时间。当然这些答案都需要进一步解释。
我将从庸俗的编程语言能力之争开始
可能会有些争论,但至少,显而易见的是,高级语言比机器语言更强大。如今多数程序员通常情况下都不会想要使用机器语言编程。你需要使用一种高级语言编写程序,并通过编译器将它翻译为机器语言。如今这个想法甚至被纳入硬件:20世纪80年代以来,已经有为编译器而不是为人类的程序员设计的指令集出现。
所有人都知道用机器码手工编写程序是一个错误。鲜为人知的一条更普适的原则是:在其他条件相等的情况下,如果你可以在几种语言中选择,那么除了使用最强劲的语言之外的所有选择都是错误的。[注3]
对于这条法则存在许多例外。如果你的程序必须接近某种特定语言编写的程序,使用相同的语言是一个好主意。如果你的程序只需要作一些简单的工作,比如数字操作或者位操作,你可能需要一种不那么抽象的语言,因为它也许会稍微快一些。如果你在编写一个很短小的一次性程序,你最好选择一种拥有最擅长处理那种任务的库函数的语言。但是通常,对于应用程序软件来说,你希望使用你可以得到的最强劲的语言(因为高效),并且使用任何其他的都是错误,同理,某种情况下可能需要更低级的语言,比如机器语言。
显而易见,机器语言非常低级。但是,至少作为一种约定俗成的惯例,高级语言之间经常获得同等的对待。而机器语言却不是。技术上说,“高级语言”不说明任何问题。没有一条分割线将机器语言和高级语言隔开。所有语言,从最强劲的机器语言到机器语言,都拥有一致[注4]的抽象性。
考虑一下 Cobol。Cobol 是一种高级语言,通常,它被编译为机器语言。有人真的认为 Cobol 和某种语言,比如说 Python,等价吗?与 Python 相比,Cobol 更接近机器语言。
Perl4 怎么样?在 Perl 4 向 Perl 5 的发展中,字典和闭包被加入语言。大多数 Perl 黑客会同意 Perl 5 比 Perl 4 更加强大。一旦你承认了这点,你就承认了一种高级语言可能比另一种高级语言更强大。更无情的事实是,除非特殊情况,你会使用你能得到的最强大的语言。尽管这个想法很少跟随着它的结论。超过一定年龄之后,程序员很少自愿的更换语言。不管别人开始使用什么语言,他们总是选择刚好够用的语言。
程序员们非常关注他们最喜爱的语言,我不想伤害任何人的感情,所以我将使用一种假想的语言Blub来解释这一点。Blub刚好是一种中级语言。但是它比Cobol或者机器语言更强大。
实际上,使用我们的虚拟语言Blub的程序员不会使用他们中的任意一种。他当然不会使用机器语言,那是编译器干的事儿。对于Cobol,他不知道人们到底可以用这种东西写出些什么来。它甚至连x(x是Blub语言的某种特性)都没有。
只要我们的Blub程序员按照语言能力俯视低级语言,他一定知道他是在俯视。那些语言是如此明显的弱于Blub,因为它们缺少了某些他习惯于使用的Blub语言特性。但是当我们的Blub程序员向另一个方向,仰视某些高级语言的时候,他不知道他是在仰视。他认为看到的只是些怪异的语言。
他可能会考虑Blub如何做到与这种语言等价,但是没有这些乱七八糟的内容也没什么不妥。Blub对于他来说足够好了,因为他用Blub思考。
然而,当我们以某种比Blub语言更高级语言的程序员的视角来观察的时候,我们就会发现我们在俯视Blub。“你是怎么用Blub搞定所有事儿的呢?它甚至没有y(没有幽默感的译者注:假设的某种高级语言的某种特性)”。
综上,能够看到所有不同语言能力差异的程序员只有那些理解了最强语言的程序员。(这可能是Eric Raymond认为Lisp使你成为更好的程序员的原因)
你不能相信其他人的想法,因为Blub悖论:他们对他们开始时使用的语言感到满意,因为它是他们构思程序的方式。在我还是一个写Basic程序的高中生的时候,我就凭经验了解这一点。那种语言甚至不支持递归。很难想像如何写一个不使用递归的程序,但是那是我没有放弃它。我使用Basic思考。并且我是一个Basic神童。在接触到的所有领域中,我都是专家。
Eric Raymond向黑客们推荐的五种语言拥有各自不同的特性。他们的能力高低是一个敏感的话题。我想说的是我认为Lisp是最强的那种。为了支持这个观点我将告诉你们我发现其他四种语言缺少了什么。其它四种语言怎么可能搞定所有问题呢?--如果缺少了Lisp的某种特性的话。而对于我来说,他们缺少的最重要的东西,是宏。[注5]
很多语言拥有称为“宏”的东西。但是Lisp的宏是独一无二的。无论你是否相信,它们与圆括号有关。Lisp的设计者并非只是为了标新立异才将圆括号加入语言。对于Blub程序员来说,Lisp代码显得怪异。但是这些圆括号的存在是有理由的。他们是Lisp与其他语言内在不同的外在表现。
Lisp代码有Lisp数据对象构成。并非是微观上”源文件由字符构成,字符串是语言支持的数据类型的一种”的含义。Lisp代码,在其被解析器读取之后,是可以被遍历的数据结构。
如果你理解编译器的工作原理,实际上剩下容易解释了,Lisp拥有奇怪的语法,因为Lisp没有语法。你在使用在其他语言中由编译器生成的语法解析树写程序 。但是这些解析树完全可以被你的程序访问。你可以编写操作它们的程序。
在Lisp中,这些程序被称为宏。他们是写程序的程序。
写程序的程序?你何时会想做这样的东西呢?如果你用Cobol思考,很少。如果你用Lisp思考,所有的时候。可能如果我给出一个强力的宏的例子以说明这一点会比较合适。需要吗?如果我那样做了,它对于不懂Lisp的人来说会像是含混不清的鬼扯;这里没有足够的空间解释你需要理解这些含义所需的所有东西。在《Ansi Common Lisp》中我试图尽可能快速的讲解东西,同时我也没有在160页之前提到宏。
但是我想我可以给出一些比较合适的参数。Viaweb编辑器的代码大约20-25%由宏构成。宏比普通的V函数更难写,而且当他们出现在不必要的场合的时会导致糟糕的风格。所以每个宏代码都是无可或缺,事出有因的。这意味着这个程序至少有20-25%的代码使用任何其他语言都很难编写。尽管V程序员可能会对我宣称的Lisp的神奇力量产生怀疑,这应该刺激了他的好奇心。我们不是为了个人的消遣才这样写程序的。我们是一家小创业公司,我们尽可能的编写艰深的程序以设置留给竞争对手们的技术门槛。
多疑的人可能开始怀疑这些是否有关联。我们有大段的代码做了在其他语言中非常难实现的事情。我们的产品拥有竞争对手产品无法实现的功能。可能这里有一些关联。我鼓励你跟进。对于对于跛足的老人来说拐杖比眼睛更重要。
3. 创业公司的合气道
但我并不期盼任何人立刻开始学习Lisp。这篇文章的目的并非改变任何人的思想,而是给那些开始对使用Lisp感兴趣的人--那些知道Lisp是一种强劲语言却对其没有被广泛应用而感到担心的人--更强的信心。在竞争中,这是一个优势。Lisp的威力因为你的竞争对手没有使用它而得到倍增。
如果你考虑在创业中使用Lisp,不必担心它没有被广泛的理解。你应该希望它一直不被理解。并且貌似事实上也是如此。这是大多数人安于他们当前使用的语言的结果。计算机硬件的变化相对于个人习惯是如此的快速,以至于编程实践通常落后处理器十到二十年。
在MIT那样的地方,人们早在1960年代就开始使用高级语言编写程序,但是很多公司在1980年代还在使用机器语言编写代码。我打赌很多人在被处理器--像急着关店回家的酒保一样--踢出来转向Risc指令集之前一直在使用机器码写程序。
普通技术更新得很快。但编程语言有所不同:编程并非仅仅是技术,它还包含程序员的思想。
它们一半是技术,一半是信仰。[注6]
所以中级语言,即大多数程序员使用的语言,改变得就像冰山融化一样缓慢。
垃圾收集技术在 1960 年被 Lisp 引入,现在被广泛的认为是一样好动西。闭包,早在 70 年代就被 Lisp 引入,现在被人们广泛地关注。宏,60 年代被 Lisp 引入,至今依然是鲜为人知的基础。
当然,中级语言拥有巨大的冲量。我并非建议你去违背这种强大的力量。恰恰相反,我只是建议你像合气道修炼者那样,用这种力量对抗你的敌人。
如果你为一个大公司工作,这可能不那么简单。你将花费巨量的时间说服尖头老板(译者注:尖头老板,缺乏一般知识常识及职位所应具有的管理能力,爱说大话且富有向物理现实挑战的精神,倒霉跟负责的往往是他的下属。)允许你使用Lisp写程序,而他只在纸面上读到过一些平庸的语言,比如像Ada那种二十年前产生而今早已被取代了的语言。但是,如果你在一家创业公司,没有尖头老板,你可以像我们一样,将Blub悖论转化为你的优势:你可以使用那些被中级语言粘得动弹不得的竞争对手们永远无法匹敌的技术。
如果你曾经在一家创业公司工作,这里有一条可以评价你的竞争对手们。读他们的招聘启事。他们的站点可能会做照片储存或者其他类似的平平无奇的东西,但是招聘启事必须指明他们想要的是什么,否则他们将得到错误的应聘者。
在Viaweb工作的这些年来我读过许多招聘启事。似乎每个月都有新的竞争对手浮出水面。在查看他们是否有在线的demo之后,我做的第一件事是就是查看他们的招聘启事。经过这样几年后我可以指出哪些竞争对手值得关注,而哪些不需要。招聘启事中的IT味道越重,这家公司就越不值得关注。最不值得注意的是那些需要Oracle经验的公司。你永远不必担心那些公司。如果他们需要C++或者Java开发者,你也同样可以悠然自得。如果他们需要Perl或Python程序员,就有一点值得小心了----这说明这家公司有点技术实力,至少被一些真正的黑客运作着。如果见到有招聘启事寻找Lisp黑客,我才会真正的担心。
在我写那些关于Lisp的书的时候,我习惯于希望每个人都理解它。但是当我开始Viaweb的时候,我发现我变了,我希望每个人都理解它,除了我们的竞争对手。
[1] Viaweb 最初包含两个部分:由 Lisp 编写的编辑器,用户可以用它创建自己的站点,以及由 C 编写的选购系统,用来处理指令。第一个版本大多数是 Lisp,因为那时指令系统还很小。稍后我们添加了两个模块,一个由 C 编写的图片生成器, 一个大部分由 Perl 编写的后端处理器。
[2]Robert Morris 说,我不需要保密,因为如果我们的即使竞争对手知道,他们也无法理解我们使用 Lisp:“如果他们那么聪明,他们早就用 Lisp 编程了。”
[3]所有图灵完备的语言具有相同的能力,但是程序员并不在乎这点。(没有人希望给一个图灵机编程)。程序员并不关心可以被形式化定义的能力,而是在意那些只能由低级语言编写的更强大语言的解释器实现的功能。假设A语言拥有一个移除字符串中所有空格的操作符,而B语言中没有,这可能并不能使得A更强大,因为你或许可以在B中使用一段子程序做到这一点。但是如果A支持,比如说递归之类的特性,而B不支持,那可能就不是可以通过函数库解决的问题了。
[4] 请书呆子们注意:或许更像是一张在顶部收缩的网;相对于思想来说形状并不重要,至少这儿有一个大致的顺序。
[5]这可能会使大家误以为宏是一个分离的特性。实际上他们的用处因其它一些Lisp特性而得到增强,比如词法闭包。
[6]编程语言之间的比较或者表现得像宗教战争,或者像学生的教科书一样坚决的中立,无论如何,他们确实是在为整个人类工作。看重名利的人可以忽略这个话题。但这个问题只有一半是与信仰有关的;如果你想设计新的语言,还是有一些东西是值得从中学习的。