首页 / 科幻灵异 / 超级系统 / 章节正文阅读

黑客圣经:大教堂和市集(4 / 5)

作品:《超级系统

结果总是执着的原因——实际上,它是每个黑客为之生存的成功!而且它们意味着我必须把自己的标准定高一点,为了把fetchmail变得和我所能设想的那样好,我必须不仅为我自己的需要写代码,而且也要包括对在我生活围主页外的人们的需求的支持,而且同时也要保证程序的简单和健壮。

在实现它之后我首先写的最重要的特征是支持多投——从集中一组用户的邮件的邮箱中取出邮件,然后把它路由到每个人手中。

我之所以加上多投功能部分是因为有些用户一直在闹着要它,更是因为我想它可以从单投的代码中揭露出错误来,让我完全一般地处理寻址,而且这被证明了。正确解释rfc822花了我相当长的时间,不仅因为它的每个单独部分都很难,而且因为它有一大堆相互依赖的苛刻的细节。

但是多投寻址也成为一个极好的设计决策,由此我知道:

任何工具都应该能以预想的方式使用,但是一个伟大的工具提供你没料到的功能。

fetchmant多投功能的一个没有料到的用途是在slip/ppp的客户端提供邮件列表、别名扩展。这意味着一个使用个人机器的人不必持续访问isp的别名文件就能通过一个isp帐户管理一个邮件列表。我的beta测试员提出的另一个重要的改变是支持8位mime操作,这很容易做,因为我已经仔细的保证了8位代码的清晰,不仅因为我预见到了这个特性的需求,而且因为我忠实于另一准则:

当写任何种类的网关型程序时,多费点力,尽量少干扰数据流,永远不要抛弃信息,除非接收方强迫这么作!

如果我不遵从这个准则,那么8位mime支持将会变得困难和笨拙,现在我所需要做的,是只读一下rfc1652,在产生信头的逻辑加上一点而已。

一些欧洲用户要求我加上一个选项来限制每次会话取得消息数(这样他们就可以从昂贵的电话网中控制花费了),我很长一段时间拒绝这样做,而且我仍然对它不很高兴,但是如果你是为了世界而写代码,你必须听取顾客的意见——这并不随他们不付给你钱而改变。

八.从fetchmail得来的另一些教益

在他们回到一般的软件工程问题以前,还有几个从fetchmail得到的教益需要思考。

rc文件语法包括可选的“noise”关键字,它被扫描器完全忽略了,当你把它们全抽取出的时候,关键字/值对更具可读性。

当我注意到rc文件的声明在多大程度上开始象一个微型命令语言时,这是一个latenight的体验(这也是我为什么把popclient原来的“server”关键字改成了“poll”)。

对我来说似乎把这个微型命令语言变得更象英语可能会使它更容易使用。现在,虽然我对经过emacs和html及许多数据库引擎所证实的“把它做成一个语言”的设计方式确信不疑,但是我并不是一个通常的“类英语”语法的狂热拥护者。

传统程序员容易控制语法使它尽量精确和紧凑,完全没有冗余,这是计算机资源还很昂贵时遗留下的一种文化传统,所以扫描策略需要尽可能的廉价和简单,而具有50%冗余度的英语,看来好象是一个非常不合适的模型。

这并不是我不用类英语语法的原因,我提到这一点是为了推翻它,在更廉价的时钟周期与核心的时代,简洁并没有走到尽头,今天对一个语言来说,对人更方便比对机器更廉价来的更加重要。

然而,有几个原因提醒我们小心一点,一个是扫描策略的复杂度开销——你并不想把它变成一个巨大的错误来源和让用户困惑,另一个是试图使语言表面上的类似可以和传统语言一样令人困惑(你可以在许多4gl和商业数据库查询语言上看到这一点)。

fetchmail的控制语法避免了这些问题,因为语言的领域是极其有限的。它一点也不象一个一般性的语言,它很简单地描述的东西并不复杂,所以很少可能在英语的一个小子集与实际的控制语言之间发生混淆,我想这有一个更广泛的教益:

如果你的语言一点也不象是图灵完备的,严格的语法会有好处。

另一个教益是关于安全的,一些fetchmail用户要求我修改软件把口令加密存贮在rc文件里,这样觑探者就不能看到它们了。

我没有这样做,因为这实际上起不到任何保护作用,任何有权读取你的rc文件的人都可以以你的名义运行fetchmail——如果他们要破你的口令,它们可以从fetchmail的代码中找到制作解码器的方法。

所以fetchmail口令的加密都会给那些不慎重思考的人一种安全的错觉,这里一般性的准则是:

一个安全系统只能和它的秘密一样安全,当心伪安全。

九.集市风格的必要的先决条件

本文的早期评审人员和测试人员坚持提出成功的市集模式开发的先决条件,包括工程领导人的资格问题和在把项目公开和开始建造一个协作开发人员的社团的时候代码的状态。

相当清楚,不能以一个市集模式从头开发一个软件,我们可以以市集模式、测试、调试和改进,但是以市集模式从头开始一个项目将是非常困难的,linus没有这样做,我也没有,初期的开发人员的社团应该有一此可以运行和测试的东西来玩。

当你开始创建社团时,你需要演示的是一个诺言,你的程序不需要工作的很好,它可以很粗糙、很笨拙、不完整和缺少文档、它不能忽略的东西是要吸引哪些人卷入一个整洁的项目。

linux和fetchmail都是以一个吸引人的基本设计进入公共领域的,许多和我一样在思考市集模式的人已经正确的认为这是非常关键的,然后得出了一个结论,工程领导者的高度的设计直觉和聪颖是必不可少的。

但是linus是从unix得到他的设计的,我最初是从先前的popmail得到启发的(虽然相对linux而言,它最后改变巨大),所以市集风格的领导人/协调人需要有出众的设计才能,或者他可以利用别人的设计才能?

我认为能够提出卓越的原始设计思想对协调人来说不是最关键的,但是对他/她来说绝对关键的是要能把从他人那里得到的好的设计重新组织起来。

linux和fetchmail项目都显示了这些证据,linus(如同前面所说)并不是惊人的原始设计者,但他显示了发现好的设计并把它集成到linux内核中的强大决窍。还有我也描述了怎样从别人那里得到了fetchmail中最强大的设计思想(smtp转发)。

本文的早期读者称赞我,说因为我做了许多关于原始设计的事,所以倾向于低估原始设计在市集项目中的价值,也许有些是对的吧,但是设计(而不是编码或调试)本来就是我最强的能力。

变得聪明和软件设计的原始创作的问题是它会变成一个习惯,当需要保持事物健壮和简洁的时候,你却开始把事情变得漂亮但却复杂。我曾经犯过错误,使得一些项目因我而崩溃了,但我努力不让它发生在fetchmail身上。

所以我相信fetchmail项目的成功部分是因为我抑制自己不要变得太聪明,这说明(至少)对市集模式而言原始设计并不是本质的,请考察一下linux假设linustorvalds在开发时试图彻底革新操作系统设计,它还会象今天我们所拥有的内核那样稳定和成功吗?

当然基本的设计和编码技巧还是必需的,但我希望每个严肃考虑发起一个市集计划的人都已至少具备这些能力,自由软件社团的内部市场对人们有某些微妙的压力,让他们不要发起自由不能搞定的开发,目前为止,这工作得仍然相当好。

对市集项目来说,我认为还有另一种通常与软件开发无关的技能和设计能力同样重要——或者更加重要,市集项目的协调人或领导人必须有良好的人际和交流能力。

这是很显然的,为了建造一个开发社团,你需要吸引人,你所做的东西要让他们感到有趣,而且要保持他们对他们正在做的工作感到有趣,而且要保持他们对他们正在做的工作感到高兴,技术方面对达成这些目标有一定帮助,但这远远不是全部,你的个人素质也有关系。

并不是说linus是一个好小伙子,让人们喜爱并乐于帮助他,也并不是说我是个积极外向的,喜欢扎堆儿工作,有出众的幽默感的人,对市集模式的工作而言,至少有一点吸引人的技巧是非常有帮助的。