第8章(1 / 3)

加入书签 本章报错

黑客与画家强烈推荐:

好设计是永不过时的设计。只要没有错误,每一个数学证明都是永不过时的。所以,数学家哈代才会说:“丑陋的数学在世界上无法生存。”他的意思与飞机设计师๲凯利·约翰逊的观点是一样的:如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有现而已。

事实上,财富与金钱是两个概ฐ念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。你到海外旅行时,不用看当地人的银行账户就会知道你来到的是富国还是穷国。你只要看看他们的财富就行了:建筑、街道、服装、健康状况等。

为什么เ不尝试一下?

软件的布๧

流行的道德观念与其他普通的流行时尚的产生方式似乎是不一样的。一般来说,流行的时尚产生于某个有影响力的人物,他突奇想,接着其他人纷纷模仿。1้5世纪晚期,欧洲流行一种宽头鞋oad-ๅtoedshoe,原因是当时的法国皇帝ຓ查理八世长了六根脚趾。20世纪20年代,着名电å影明星frank9k改成一个印第安纳州工业小镇的名字gary,以便突出自己粗犷硬朗的铁汉形象,结果导致这个名字风靡一时,很多父母都为儿子取名为ฦgary。但是,流行的道德观念不是这样,它们往往不是偶然产生的,而是被刻意创造出来的。如果有些观点我们不能说出口,原因很可能是某些团体不允许我们说。

‘在英语中,“建筑师”architecນt和“架构师”arcນhitecນt是同一个词,所以这里用的是双关语,意思是优秀程序员不仅负责建造,还负责架构。后一句中ณ的“建筑学”arcນhitecture也是这种双关用法,同时指“架构学”architecture。一译者注’

电子技术的展,使得计算机日益成为人类社会必不可少的一部ຖ分。

但是,真正的问题在于,并行计算到เ底能达到哪个抽象层次?一百年后它就会影响到开应用软件的程序员吗?或者,它还只是编译器作者需要考虑的事情,在应用软件的代码中根本就无处寻觅?

一种可能ม是,大多数可以用到并行计算的场合,人们都会放弃使用并行计算。虽然我总的预测是未来的软件会挥霍掉大部ຖ分新增的硬件性能,但是并行计算是一个特例。我估计随着硬件性能得到惊人的提升,如果你明确地说想要并行计算,那么肯定可以得到它,但是通常情况下你不会用到它。这意味着,除了一些特殊的应用程序,一百年后的并行计算不会是那种大规模的并行计算massivepaທraທllelism。我预料é,对于普通程序员来说,一切更像对进程进行分叉,然后让多个进程在后台并行运行。

这是编程进行到很后期才要做的事情,属于对程序的优化,类似于你想开一种特定的数据结构来取代现有的数据结构。程序的第一个版本通常会忽略并行计算的各种好处,就好像编程开始时会忽略某种特定的数据结构给你带来的好处一样。

除了某些特定的应用软件,一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。

一百年后会有多少种编程语言?从最近来看,出现了大量的新语言。硬件性能提高是一个原因,这就允许程序员根据使用目的在运行度和编程便利ำ性之间做出不同的取舍。如果这就是未来的趋势,那么เ一百年后强大的硬件只会使得语言数目变得更多。

伹是,另一方面,一百年后的常用语言可能只有很少几种。部ຖ分原因是基于我的乐观主义แ,我相信在未来,如果你的作品确实很出色,你可能选择的是一种开起来很方便的语言。使用这种语言写出来的软件第一版的运行度很慢,只有对编译器进行优化设置后运行度才会提升。既然我抱有这种乐่观主义,那么เ我还要做一个预言。有些语言可以达到机器的最高效率,另一些语言的效率则慢到刚ธ刚可以运行而已,两者之间存在巨大的差距。我预言一百年后,这段差距之间的各个点上都会有对应的编程语言存在。

因为这段差距正在变得越来越大,所以性能分析器profiler将变得越来越重要。目前,性能分析并没有受到重视。许多人好像仍然相信,程序运行度提升的关键在于开出能够生成更快代码的编译器。代码效率与机器性能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行度提升的关键在于有一个好的性能分析器帮助指导程序开。

我说将来可能只有很少几种常用语言,但没有把用于特定领域的“小众语言”little浪ฐuage算进去。我觉得,这些嵌入式语言的想法很不错,一定会蓬ศ勃展。但是我判断这些“小众语言”会被设计成相当薄的一层,使得用户可以一眼看出在底下作为基础的通用型语言,这样就减少了学习๤时间,降低了使用成本。

谁来设计这些未来的语言?过去10年最激动人心的趋势之一就是开源语言的崛起,比如perl、python和ruby。语言设计已经被黑客接管。到目前为止这样到底是好是坏还看不清楚,但是展势头令人鼓舞。比如,perl就有一些绝妙的创น新。不过,它也包含了一些很糟糕的想法。对于一种充满进取心、大胆探索的语言来说,这也是很正常的事。以它现在这种变化的率,大概只有上帝ຓ才知道一百年后perl会变成什么เ样。有一句俗话说,如果你自己做不到,那就去当老师๲。这在语言设计领ๆ域不成立,我认识的一些最出色的黑客就在当教授。但是,当老师的人确实有很多事情不能ม做。研究性职位给黑客带来了一些限制。在任何学术领域,都有一些题目是可以做的,另一些题๤目是不可以做的。不幸的是,这两ä类题目的区别ี通常取决于它们写成论文后看上去是不是很高深,而不是取决于它们对软件业的展是否重要。最极端的例子可能ม就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。

虽然科学领域的状况要稍好一点,但是研究者可以做的题๤目与能够对设计优秀语言有所帮助的题目之ใ间的交集小得令人沮丧。奥林·希๶弗斯曾经对这一点表达不满,而且说得头头是道。比如,研究变量类型的论文好像多得无穷无尽,尽管事实上静态类型语言看来无法真正支持宏在我看来,一种语言不支持宏,那就不值得使用了。

新า语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种展趋势。另一种展趋势是,新语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。这似乎是好的趋势,我期待它继续保持下去。

一百年后的物理学基本上不可能预测。但是计算机语言不一样,现在就动手设计一种一百年后可以吸引使用者的新า语言,这在理论上似乎ๆ是可能的。

设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。

你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前๩使用的编程语言影响的情况下。这种影响无处不在,必须ี很努力才能ม克服。你也๣许觉得,对于人类这样懒惰的生物,喜欢用最省力的方แ式写程序是再自然不过的事情。但是事实上,我们的思想可能ม往往会受限于某种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去现,不能依靠那些让你自然而然就沉下去的思维定势。

采用程序的长度作为ฦ它耗费工ื作量的近似指标是个很有用的技巧ู。这里的程序长度当然不是指字符的数量,而是指各种句法元素的总长度,基本上就是整个解析树的大小。也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日子也๣会变得好过得多。所以,设计语言的正确做法就变成了,看着一段程序,然后问自己是不是能把它写得更短一点?

实际上,用想象出来的一种一百年后的语言来写程序,这件事情的可靠程度,取决于你对语言内核的估计是否足够正确。常规的排序,你现在就可以写出来。但是,想要预测一百年后的语言使用什么函数库就很难了。很可能许多函数库针对的领域现在还根本不存在。比如,如果色ti@home计划

成功,我们就需要与外星人联系的函数库了。当然,如果外星人的文明高度达,已经到了用xml格式交换信息的地步,那ว就不需要新的函数库了。

‘色ti@home是一个寻找地球以外智慧生命的科学实验、由加州大学伯克利分校起并主持。它使用射电望远镜监听太空中的无຀线电信号,然后用计算机进行数据分析,如果现有些信号不可能自然产生,就可以证明外星文明的存在。199๗5年,该项ำ目决定向志愿者开放,使用全球联网的大量计算机进行分布式计算,1้99๗9年5月开始正式运行。详细情况参见色tiathomeberkeleyedu。——译者注’

另一个极端是,我觉得今天你就能设计出一百年后的语言内核。事实上,在有些人看来,大部分语言内核在195๓8年就已经设计出来了

。

‘lisp语言的第一版规格说明书是1้958年布的。——译者注’

如果今天就能使用一百年后的编程语言,我们会用它编程吗?观古而知今。如果1960่年就能使用今天的编程语言,那时的人们会用它们吗?

在某些方面,回答是否定的。今天的编程语言依赖的硬件在196๔0年并不存在。比如,python这样的语言,正确的缩进indentation在编写时很重要,但是19๗60年的计算机没有显示器,只有打印机终端,所以编写起来就不会很顺利。但是,如果把这些因素排除在外你可以假设,我们只在纸上编程,20世纪60年代的程序员会喜欢用现在的语言编程吗?

我想他们会的。某些缺乏想象力、深受早期编程语言思想影响的人可能会觉得不可能。没有指针ฤ运算,如何复制数据?没有goto语句,如何实现流程图?但是我想,那时最聪明的程序员一定能轻松地使用今天的大多数语言,假定他们能得到的话。

如果我们现在就能ม拥有一百年后的编程语言,那就至少能用来写出优秀的伪码

。我们会用它开软件吗?因为一百年后的编程语言需要为ฦ某些应用程序生成快代码,所以很可能它生成的代码能够在我们的硬件上运行,度也还可以接受。相比一百年后的用户,我们也许不得不对这种语言做更多的优化,但是总的来看,它应该仍然会为我们带来净收益。

‘伪码又称虚拟代码,用来抽象地描述算法,而不是现实存在的编程代码。——译者注’

现在,我们的两个观点就是:1一百年后的编程语言在理论上今天就能设计出来;2如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那ว就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢?

当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则ท就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也๣是正确的。我认为,设计编程语言时,我们也应该这样做。

12拒绝平庸

1995๓年,罗伯特·莫里斯和我一起创办了via9eb。我们打算开软件,让用户可以自己搭建网上商店。当时,我们的创意是把软件放在服务器端,使用普通的网页作为用户界面。

当然,那个时候许多人可能都想到过这个ฐ主意。但是,就我所知,via9๗eb是第一个互联网应用程序。在我们看来,这真的是很新颖๢的想法,所以我们就把公司命名为via9ebຘ,意即我们的软件通过网络使用,而不是运行在你的桌面电脑上

‘在英语中,viaທ是一个介词,意为“经过……”,所以via9๗eb的意思就是经过网络。——译者注’

另一个特别之处是,这个软件主要采用lisp语言开

。它是最早的用lisp语言开的大型应用程序,在此之前,lisp语言主要用于大学和实验室中。

‘一开始的时候,viaທ9๗eb有两个部ຖ分——编辑器和订单处理系统。前者用摸nlisp开,主要供用户搭建自己的网站。后者用c语言开,主要用来处理订单。在via9๗eb的第一版中,lisp是最主ว要的开语言,因为订单处理系统非常小,占用的代码很少。2๐003๑年1月,yahoo布๧了via9๗eb编辑器的新版本,采用c++ใ和perl开。但是,为了把原始程序翻译成c++,他们可能不得不专门写一个ฐlisp解释器,因为据我所知,via9๗ebຘ所有的页面生成模板还没变,都是使用lisp代码。参见greenspun写的tenthrule一书๰第198页。’

秘密武器

埃里克·雷蒙德写过一篇文章《如何成为ฦ一个黑客》ho9tobeeahacນker。文中有一部分专门谈到,在他看来,如果你想当一个黑客,应该学习哪些语言。他建议从python和java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习9๗ix系统,后者用来系统管理和开cgi脚本。最后,真正非常严肃地把黑客作为ฦ人生目标的人,应该考虑学习lisp:

lisp很值得学习。你掌握它以后,会感到เ它给你带来的极大启。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到lisp。

在讨论学习拉丁语有何价值时,你往往也会听到这一类的话。拉丁语无助于你找工ื作也许古典文学教授的工作除外,但是它可以训练你的思维,帮助你更好地运用母语比如英语进行写作。

但是且慢,拉丁语的比喻并不完全适合lisp语言。拉丁语无助于你找工作的原因是因为ฦ没有人说拉丁语。如果你用它写作,没有人能看懂ฦ。但是,lisp是一种计算机语言,无论我们程序员使用哪一种语言与计算机交谈,它都能听懂。

如果埃里克·雷蒙德没有说错,lisp语言确实可以使你成为更好的程序员,那ว么为什么เ你不使用它编程呢?如果画家有一支让他画得更好的画笔,我觉得他应该会用这支笔完成所有的画ฑ作,对不对?我在这里不是想证明埃里克·雷蒙德错了。他的观点整体上非常正确,他对lisp语言的看法确实是大多数人的看法,但是这里面就是有一个ฐ矛盾:lisp语言能让你成为更好的程序员,但你却不用它,这难道不奇怪吗?

为什么不用呢?编程语言毕竟是一种工具。如果lisp语言真的能ม开出更好的程序,你就应该用它。如果它无助于编程,那么就不会有人需要它。

这不仅仅是一个ฐ理论问题๤。软件业是竞争非常激烈的行业,而且容易出现垄断。在不考虑其他情况的条件下,某家公司的软件更快更好用,就会把竞争者赶出这个ฐ市๦场。一旦你开始创业,你就会更深切地感受到这一点。一般情况是,创น业公司要么赢得一切,要么彻底失败。你要么成为富翁,要么一无所获。创业的时候,如果你选择了错误的技术,竞争对手就会一举打败你。

罗伯特·莫里斯和我都很了解lisp语言,我们相信自己的直觉,找不出任何不使用它的理由。我们知道其他人都用c+ใ+或perl开软件,但是我们不觉得这说明了什么问题๤。如果别人用什么技术,你也用什么技术,那么你大概只能使用9indo9s了。选择使用哪一种技术的时候,你不能ม考虑别人的做法,只能考虑什么样的技术能ม最好地完成工作。

图12-1我和罗伯特·莫里斯在viaທ9eb,1996๔年年初ม

创业公司尤其如此。大公司可以互相模仿,但是创น业公司就不行。我觉得很多人没有意识到เ这一点,尤其是一些创业者。

大公司每年平均成长大约10่%。所以,如果你掌管一家大公司,只要每件事都做到大公司的平均水准,你就能ม得到大公司的平均结果,也就是每年成长大约10%ื。

如果你掌管创业公司,当然也可以这样。你把每件事都做到平均水准,就能得到平均结果。问题在于,小公司的平均结果就意味着关门倒闭。创业公司的生存率远低于50%。所以,如果你掌管创น业公司,最好做一些独特的事情,否则就会有麻烦。

回到1995年,我们懂ฦ得一些竞争对手不懂的事情至少在我们看来是如此,这些事情甚至直到เ今天都很少有人懂:如果开只在自己服务器上运行的软件,这意味着你想用什么语言就能ม用什么语言。如果开桌面软件,就完全不一样了,大多数情况下你只能使用操作系统所用的开语言。10年前๩,开桌面软件就意味着要使用c语言。但是,对于互联网软件,你能ม使用任何你想用的语言。如果你还同时拥有操作系统和语言的源码,那么เ你的自由就更大了。

↑返回顶部↑

书页/目录

黑客与画家