打破平庸(Beating The Averages)

打破平庸(Beating The Averages)
2008年12月10日 星期三 14:17
原文地址: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]结果是,对编程语言的比较要么是以“宗教战争”的形式,要么就像本科教材里面那样尽量中立的表述。对于看重和平,明哲保身的人来说,他们会避免这个话题。但是这个问题其实只是半宗教的:有些东西还是值得你去学习,特别是当你想要设计新语言的时候。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是C++表白代码,其中包含了一个跳动的心脏图案: ``` #include <iostream> #include <windows.h> using namespace std; int main() { cout << "我喜欢你,愿意做你的男朋友吗?" << endl; Sleep(300); //等待3秒 //打印跳动的心脏图案 for (int i = ; i < 20; i++) { cout << " ** ** " << endl; cout << " ** ** " << endl; cout << " ** ** " << endl; cout << "** **" << endl; cout << "** **" << endl; cout << " ** ** " << endl; cout << " ** ** " << endl; cout << " ** ** " << endl; Sleep(200); //等待.2秒 system("cls"); //清屏 Sleep(200); //等待.2秒 } return ; } ``` 希望这个代码能够帮助你成功表白! ### 回答2: “C表白代码”是一种特殊的编程方式,就是写代码来表达自己对他人的情感表白。其中,“beating heart”就是其中一种表白代码,也是比较受欢迎的一种。 “beating heart”的代码格式是一个无限循环的心形图案,里面不断闪现的“炫酷数字”。具体来说,代码会通过调用一些函数来实现循环和闪烁的效果,让心形图案跳动起来,表示出心中不断跳动的爱意。 使用“beating heart”表白代码,能够让人感受到浪漫与幸福。因为心形图案和跳动的数字,都让人想起爱情中那份充满活力、热情与温暖的感觉。同时,通过编写代码的方式来表达爱情,也能体现出程序员们一丝不苟、敬业认真的工作态度和技术水平。 当然,使用表白代码也有一些需要注意的事项。首先,要考虑受方是否能够理解和接受这种方式表达的情感,毕竟不是所有人都懂得编程。其次,要避免使用机密信息或者涉及隐私的内容。最后,千万不要将自己的感情完全依赖于代码,真正的爱情需要口头表达和行动相结合。 总而言之,“beating heart”是一种很有意义的编程方式,可以通过代码来表达爱情的感觉,不论技术水平如何,这种方式都具有一定的吸引力和浪漫情趣。 ### 回答3: “beating heart”,也就是“跳动的心”,是表白代码中非常经典的一种。它通常表示的是对某个人深深的爱意,让人感觉到自己的内心在跳动。 这种表白代码以“<3”符号为主体,再加上一些特殊的字符,形成一个类似于心脏跳动的图案。这种表白方式可以在聊天软件、社交网站、短信等各种场合使用,非常适合用来表达爱意。 “beating heart”表白代码的使用,通常应该具备以下几个条件: 1. 表白对象必须是你深深爱着的人,而不是随便一个人; 2. 表白代码可以作为爱意的附加表达方式,但不应该取代其他更真挚的表白方式,例如直接用文字或口头表达爱意; 3. 当使用这种表白方式时,应该考虑到对方的接受程度,如果对方对表白代码不太了解,或者根本没有耐心去理解这个代码所代表的意思,那么在表达爱意时就会失去效果。 在使用“beating heart”的时候,需要注意一些细节,比如: 1. 需要确保符号和字符的显示效果,一些软件或网站可能不支持某些字符而显示错误; 2. 在表白时需要选择合适的场合,例如在对方浪漫情绪高涨或者对你有好感的时候; 3. 正确选择表白对象,确保自己的感情和目的都是纯粹的,而不是为了恶意或者利益而表白; 总之,“beating heart”表白代码是一种非常文艺和浪漫的表白方式,可以用来表达自己对某个人的真挚爱意,但需要合适的场合和对象。最重要的是,无论使用哪种表白方式,真诚和纯粹的爱意才是最重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值