相關閱讀 |
>>> 讀書—連接古今充實信仰 >>> | 簡體 傳統 |
七 Popclient变成了Fetchmail
项目的真正转折点来自一份哈利·豪切斯的草拟程序,通过它我们可以将邮件转发至客户机的SMTP端。几乎在收到程序的同时,我就意识到,这个功能会让其他的邮件传送模式都成为历史。
我曾用几周的时间摆弄fetchmail,当时总觉得虽然界面还能用但是却不够漂亮,到处是用处不大的选项。“将收取到的邮件归档”或者“标准输出”选项尤其让人心烦,可我却说不出个所以然来。
(如果你对网络邮件的技术细节不感兴趣,那么就可以安心的略过下面两段。)
当我考虑加入SMTP转发的时候,才发现popclient包揽了太多的事情。它身兼两职——既是一个邮件传输工具(MTA)又是一个本地投寄工具(MDA)。但是如果有了SMTP转发功能,它就可以摆脱MDA的工作。像sendmail一样专注于MTA并把邮件的本地投寄工作交给其他软件。
几乎每个支持TCP/IP的平台都预留了25号端口,那么何必去折腾复杂的代理设置或者“添加-锁定”本地邮箱呢?特别是,这样可以保证收到的邮件看上去就和一封直接投寄的普通SMTP邮件一样。这才是我们想要的!
(承前段……)
就算你没看懂前面的技术细节,这里还是有几条值得学习的重要经验。首先,这个SMTP的创意是我效法李纳斯的最大收获。用户提供好的创意——而我要做的仅仅是理解它的含义。
11.自主创意很好,能认可源自用户的点子也不错。有时借笔生花更具成效。
The next best thing to having good ideas is recognizing good ideas from your users. Sometimes the latter is better.
有趣的是,你会很快发现,即使你谦卑地坦陈别人为此做出多大的贡献,外界也不会这么看。大多数人认为是你创造了一切,而你只是为自己的天赋表示出适当的谦虚。李纳斯就是个生动的例子!
(1997年8月,我在第一届Perl大会上发言时,杰出的黑客拉里·沃尔正坐在前排。当我讲到上面那句的时候,他醍醐灌顶般的叫出声来:“说下去,说下去,哥们!”引得哄堂大笑。因为大家知道,这一点对于Perl的发明人也不例外。)[1]
在以同样的精神将项目运营了几周后,我开始收到类似的褒奖。不仅来自我的用户,而且来自对此有所耳闻的人。其中一些邮件被我收藏起来了,万一哪天我开始怀疑我生命的意义了,就翻出来看看:-)。
12.通常,当你确信自己在解决一个错误问题的时候,会激发最具突破和创造力的方案。
Often, the most striking and innovative solutions come from realizing that your concept of the problem was wrong.
把popclient开发成一个组合软件(作为MTA兼MDA,让他支持五花八门的本地投寄模式),实际上等于在尝试解决一个错误的问题。fetchmail应该被重新设计为一个纯粹的MTA,作为常规SMTP邮件传输路径的一部分。
当你在开发中碰壁(绞尽脑汁也无法做出下一个补丁)的时候,通常应该问问自己:“我是否找到了正确的答案?”或者“我是不是找对了问题?”。也许有些问题需要重新定义。
好,我这就重新定义我的问题。显然,正确的做法是:(1)在主驱动中加入SMTP转发支持,(2)把它设置为默认模式,(3)最后,抛弃所有其他传输模式,尤其是“本地归档”和“标准输出”两项。
第三步让我踌躇颇久,因为担心会流失依赖此模式的老用户。理论上,他们可以立即使用forward格式文件或者非sendmail的类似功能来达到同样的效果。但实践中,这种转变大费周章。
一旦真这么做了,我发现好处非明显。驱动代码中的症结就此消失,配置选项也大大简化了。再不需要围着系统的MDA和用户的本机邮箱打转了,也不需要为操作系统是否支持归档文件锁定而伤脑筋了。
而且,惟一可能出现邮件丢失的情况也没有了。过去,假设你指定了邮件归档路径,而恰好磁盘满了话,你的邮件就没了。而这在SMTP转发中不会出现。因为除非传送完成或至少已经暂入缓存了,不然SMTP接收端不会发送确认信号。
同时,性能也提高了(尽管这不是你运行一次就能感觉到的)。另外值得一提的是,用户手册也简化了许多。
日后,为了应付一些来自动态SLIP[2]的纠葛,我又不得不重新加入了可由用户制定MDA功能。但是做起来简单多了。
这说明了什么?只要不损失效率,就不要对丢弃一些功能而举棋不定。圣-埃克苏佩里[3](当他不写作经典儿童书籍的时候,是一个飞行员兼飞机设计师)曾说过:
13.“完美(的设计)意味着没有东西可以再被加入,而是没有东西可以移除”
`“Perfection (in design) is achieved not when there is nothing more to add, but rather when there is nothing more to take away.”
当代码变得高效又简洁的时候,就可以说是走上正轨了。在这个过程中,fetchmail有了自己的特设,脱离了前代的popclient。
到了该换名字的时候了,新的设计和老的popclient相比,更像是sendmail的搭档。二者都是MTA,不同的是sendmail是向外投寄,而新的popclient是接收转发。所以,开工两个月之后,我把它更名为fetchmail。
在这个将SMTP转发加入fetchmail的故事中,有一则普遍的经验。那就是不仅调试可以平行展开,开发和(也许这很令人吃惊)探索设计空间同样也可以。当采用快速短周期开发模式的时候,开发很可能成为针对原有的冗余设计或开发观念的一个特殊“调试-修补”环节。
即使在更高层次的设计中,能有许多协作开发者围绕着你的产品设计空间随机游走也是很有价值的。试想一下,一滩水是如何找到排水口的,或更贴切一点,一群蚂蚁是如何找到食物的:实际上就是在分散搜索之后,以一个可延伸的通讯机制加以协调。这很管用,就像哈利·豪切斯和我一样,一个同行之人很可能在你身边开启宝藏,而你只不过是太过专着才一叶障目罢了。
译者按:
1.拉里·沃尔 :Larry Wall,着名黑客,第一届自由软件奖得主。也是Perl语言的发明人,所以作者说“对……也不例外”。
2.SLIP:Serial Line Internet Protocol,即串行线路IP协议,早期的一中IP封包协议,目前基本已不再使用。
3.圣-埃克苏佩里:安托万·玛丽·罗杰·德·圣-埃克苏佩里(Antoine Marie Roger de Saint-Exupéry),法国作家、飞行员。着作颇丰,1943年出版的《小王子》令他誉满全球。
埃里克.斯蒂芬.雷蒙 2014-07-01 18:21:32
稱謂:
内容: