当前位置:文档之家› 黑客与画家

黑客与画家

黑客与画家(翻译) PAUL GRAHAM我读完计算机本科以后,去艺术学校学习绘画。

许多人感到奇怪,喜欢计算机的人也会喜欢美术吗?他们大概认为编程序和画画是两种完全不同的工作,编程需要冷静,精密,和正确的方法,而画画是表达某种狂热的情感。

这种印象是不对的,编程和画画有很多共同之处,实际上,在我认识的不同类型的人中间,画家和黑客是最相似的。

画家和黑客的相似之处在于:他们都是创造者,就好像作曲家,建筑师,以及作家一样。

黑客和画家类似,他们的目的是创造某种美好的事物。

尽管在创造的过程中,也许会发现新技术,但他们的根本目的并不是研究技术。

我从来都不喜欢"计算机科学"这个词,因为这种东西根本就不存在。

这门学科的内容,不过是由于历史原因偶然凑合到一起的大杂烩,就好像南斯拉夫国的形成一样。

一头是数学家们,他们摆弄计算机是为了得到国防部的资金赞助,中间部分,一伙人在研究仿佛是计算机自然史之类的东西--比如网络上数据流算法的行为特征等等。

在另一个极端上,是黑客们,他们编写有趣的软件。

对他们来说,计算机是表达的工具,如同水泥之于建筑师,颜料之于画家。

这三种人凑在一块的群体,就好像是数学家,物理学家和建筑师被分到一个专业里。

有时候黑客们干的事被称为"软件工程",这个词也是一种误会。

比起建筑师来,软件设计师离工程师的距离更远。

建筑师和工程师的分界并不十分精确,但却是实实在在存在的。

其分界在于做什么和如何做:建筑师决定做什么,工程师考虑如何做出来。

这两件事情也不能分得太开,如果你不懂得如何做,那么你设计的时候就会陷入难局。

但是编程当然不是仅仅决定如何实现某种特性那么简单,在最好的情况下,编程实际上就是设计软件的特性--往往最好的设计方式就是实现它。

说不定哪一天,"计算机科学"会分裂成几个专业,就好像南斯拉夫最终分裂成几个国家那样。

这也许是件好事。

尤其是这意味着我所擅长的编程,会变成独立的专业。

这些不同类型的工作绑到一个专业里,当然有利于行政管理,但是却会引起智力上的困惑。

这也是我不喜欢这个名词的另一个原因。

处于中间部分的那伙人所干的,和经验科学差不多,但是另外两头的人,数学家和黑客,可不太象是在干真正的科学。

数学家好像并不为这个问题发愁,他们就象数学系的同行一样,很高兴地做着理论研究,不久就忘了办公大楼的牌子写的是"计算机科学系"。

但是对黑客们来说,这个牌子就很成问题。

既然他们干的事被称作科学,他们就会感到好歹要象那么回事,于是大学和研究所的黑客们觉得应该写论文,而不是写优美的程序。

但是不幸得很, 后者才是他们真正应该干的。

论文充其量不过是一个手续。

黑客写出很棒的程序,然后再做一篇论文,论文表示软件上的成绩。

但是两者之间的不协调引起了问题:好的软件比起糟糕的软件来,更加不适合做论文的题材。

好的软件不适合作论文的题材。

首先,论文要有独创性的,写过博士论文的都知道,要想保证你开垦的那片地是处女地,就等于说是你划出一片别人都不想要的地来。

第二,论文必须言之有物。

糟糕的软件使论文材料充足,你有很多事实可以描述你是如何克服那些困难的。

糟糕的假设总是会产生大量问题。

大部分AI研究就是好例子。

比如,你假定,以抽象概念为参量的逻辑表达式列表可以用来表示知识,那你要论证的内容可就多了。

就像Rick y Ric ardo说的,Luc y,这下可够你解释了。

创造美好事物的过程,常常是对已有事物的细微调整,或者是把已有概念用新方式组合起来。

这种事情,恐怕不太好做研究论文吧。

那么为什么大学和研究所还要用论文来衡量黑客呢? 同样的, 为什么要用标准化考试来衡量学术才能呢?为什么要用代码行数来衡量程序员的工作量呢?这些考试的好处是容易实施,而且有一点效果, 因此才会引诱我们继续采用这些措施。

真正的黑客能够写出优雅的代码, 但是识别这种黑客的方法,真的很不容易找到。

要有好的嗅觉才可能识别出真正优秀的设计。

是否真的有这种嗅觉,和是否自信有这种嗅觉,这两者之间没什么关联,即使有,也是负面的。

真正的考验是时间。

经过时间的考验,好的东西会发展壮大,坏的东西会丢弃。

不幸的是,需要的时间往往太长, 以至超过人的寿命。

Samuel Johnson说,需要一百年的时间,才能形成一个作家的真正声誉。

你得等到这个作家有影响的朋友都死了,他的追随者也都死了才行。

我想黑客不得不接受名声上的不确定性,这一点上, 他们和其他创造者没什么不同。

实际上比较起来还要幸运一些。

在编程领域,一时的流行风气虽然也有影响,但没有绘画领域那么大。

还有比别人的误解更糟的事情。

更糟的危险是你可能自己误解自己。

你通常在相关领域寻找灵感。

如果你在计算机系,很自然地会以为,编程的本质就是实现计算机理论。

我读本科的时候有一种令我很不舒服的感觉,我觉得自己应当多学一点计算机理论,可是期末考试完了不到三个礼拜,我就把那些东西全忘光了。

这让我觉得自己不够尽责。

现在我认识到我那时的想法都是错误的。

黑客对计算机理论的了解程度,只要达到画家对颜料化学所了解的程度就够了。

你应当知道怎样计算时间和空间复杂度,知道图灵机模型。

也许应当知道状态机,至少知道这个概念,如果要写语法解析或者正则表达式库的时候会用得到。

画家对颜料的学问上,要记的东西比这还要多一些呢。

对我来说,灵感的源泉不是来自于那些挂着计算机招牌的地方,而是那些聚集着创造者的地方。

我从绘画方面得到的灵感比我从计算机理论上得到的,要多得多。

打个比方。

我上学的时候,学生在上机之前,要把整个程序先用纸笔写出来。

可是我觉得这不是我写程序的方式。

我喜欢坐在计算机前面写程序,根本不用纸笔。

我并不先在纸上写出程序并检验其正确性,我喜欢先敲一段代码,当然好多毛病,然后慢慢敲打成型。

我受到的教育告诉我,调试应当是检查输入错误的最后一关,而按照我的方式,程序基本上就是调试出来的。

好长一段时间我都感到很沮丧,念小学的时候,我捉铅笔的方式和老师教的不一样,那时我也感到同此刻一样的沮丧。

如果我那会知道别的创造者-比如画家和建筑师-的做法的话,我就早该知道这种方法的名字,那就是:打草稿。

我可以告诉你,他们在大学时教我的方法是错的。

你应当是一边写程序一边来确定程序的走向, 这和画家, 作家以及建筑师的做法完全一样。

这里蕴涵着软件设计的真义, 认识到这一点, 就意味着程序语言应当首先要具有延展性。

语言要有助于在编程中思考, 而不是仅仅表达思考的结果。

它应该象铅笔, 而不是象钢笔。

如果程序员真的象大学里教的那样写程序, 那么静态类型语言就是不错的选择。

但是我所知道的黑客都不是那样子编程序的。

我们需要这样一种语言, 我们用它来随意涂抹。

而使用静态类型语言编程序的感觉, 就好象手放在膝盖上, 小心翼翼握着茶杯, 正襟危坐着和一个严肃的老太太谈话。

谈论静态类型, 以及创造者这种话题, 我们除去了另外一个困扰的科学的问题: 数学嫉妒。

科学界的每个人暗地里都认为数学家比自己聪明。

我想数学家们自己大概也这么认为。

反正科学家们总是把自己的作品弄得象数学论文一样。

这对物理学倒还没什么大害, 但是你要是在自然科学上走得越远, 就越发现这个问题的严重性。

印上一整页的公式, 看上去很让人敬畏的样子, 用上希腊字母就更加不得了。

这种倾向可能诱惑你去研究那些可以公式化的问题, 结果是忽略了真正重要的东西。

如果黑客认同创作者的身份, 像是画家和作家一样, 他们就不会受此诱惑。

作家和画家才不理会数学呢, 根本就是不相干的事情。

我认为, 黑客也应当这样看。

如果大学和研究所不让黑客做自己想做的事情, 他们还可以去公司, 可惜, 公司和大学的做法是一丘之貉。

大学和研究所要求黑客当科学家, 而公司要求黑客当工程师。

我也是最近才发现这问题的。

Yahoo买了Viaweb之后, 他们问我的意向, 我一向就不喜欢商业公司, 我就说我还是想编程序。

进了Yahoo以后, 我发现在他们那里, 编程序的意思就是代码实现, 和设计没关系。

程序员就是代码工人, 他们把产品经理的愿望, 以代码形式记录下来。

看起来这是大公司的一贯的做法。

这样做的目的是减低工作的偏差。

只有少数程序员真正懂得设计软件, 而且这些有才能的人很不容易一下子识别出来。

所以与其把软件的未来寄托在少数聪明人身上, 不如把软件设计让一个委员会来作, 程序员只管编码实现。

如果你想赚钱, 那么记住我的话, 因为我讲的, 正是小公司取胜的机会。

大公司采取保险的做法, 意图规避风险。

但是试图限制这种工作效果上的震荡的时候, 固然避免了最坏的可能,但也失去了最好的。

这对大公司当然不是问题, 大公司取胜的原因不是因为发明了伟大的产品, 而是因为犯的错误比其他大公司少而已。

如果你有办法和一个大公司竞争某种产品, 这个公司的产品是产品经理们设计的, 那么, 他们永远赶不上你。

不过这样的机会很不容易找到。

你很难和大公司卷入软件竞争, 就好比你很难和对手在城堡里徒手搏斗一样。

写一个比微软的word还要好的字处理器是可能的, 但是在操作系统这个微软独占的堡垒里, 他们对你根本就不屑一顾。

软件竞争只能在全新的市场中展开, 因为在那里还没有谁建立起防御工事。

你有可能采取大胆的策略, 集合那些既做设计又做编码的人, 来赢得竞争。

微软最初就是这样做的, 苹果, HP也莫不如此。

我想任何成功的创业公司都是走的这条路。

所以, 创造伟大软件的一个办法就是创业开公司。

不过这里面还有两个问题。

第一, 开公司以后, 除了编程序, 你需要做好多其他事情。

在Viaweb的时候, 我真的希望自己能挤出四分之一的时间编程就好了。

实际上我四分之三的时间都是在做很讨厌甚至很麻烦的事情。

对此我深有体会, 有一次当我开完董事会去补牙, 坐在诊所的椅子上, 我觉得简直抵得上度假了。

还有另一个问题。

写有趣的软件, 和写赚钱的软件, 经常是没多少共同之处。

设计语言是很有趣的工作, 微软的第一个产品就是。

但是现在没人会花钱买语言。

要想赚钱就得写那种很麻烦的, 没人会免费干的软件。

所有的创造者都会面临这个问题。

价格是供求关系决定的, 对有趣软件的需求总是比较少, 而解决一般用户的平凡问题的需求, 总是多一些。

在高速公路边上演出, 观众一定少, 在庙会搭个台子演出, 观众一定多。

写长篇小说的收入, 比不上写广告词的收入, 虽然那些广告最后的归宿是垃圾箱。

设计一种语言的回报一定不多, 而搞定某些公司的老掉牙的数据库和web serv er的连接问题, 回报会丰厚得多。

我认为这个难题的答案, 是创造者们应当找一个养家糊口的"日常工作"。

这个名词最初是惯于晚上演出的音乐家们使用的。

它的意思是: 你做一个工作是为了赚钱, 另一个工作是因为你喜欢。

相关主题