第九章 源自Fetchmail的更多经验

简介: 在我们回到广义的软件工程问题之前,还有几条fetchmail开发中的独特细节需要深思。非技术性的读者可以安心跳过本章。 rc(fetchmail用户配置)文件语法中包含了一些完全不需解析的,可选的“噪音”关键词。

在我们回到广义的软件工程问题之前,还有几条fetchmail开发中的独特细节需要深思。非技术性的读者可以安心跳过本章。

rcfetchmail用户配置)文件语法中包含了一些完全不需解析的,可选的“噪音”关键词。与传统“关键词-对应值”匹配关系相比,它们所带来的趋近于英语语法的配置文件更具可读性。

这源自一个深夜的实验,当时我注意到rc文件的配置命令非常像一门微型指令语言。(这也是我把关键字“server”改成“poll”的原因)[1]

在我看来,努力使这个微型指令语言更像英语可以让其更便于使用。现在我虽然支持“让它成为一门语言(make it a language)”的设计流派(诸如EmacsHTML和很多数据库引擎那样),但是并不热衷于“类英语”的语法。

传统上,程序员们倾向选用简洁紧凑、完全没有冗余的语法。这是计算资源昂贵时期的文化遗留,以致解析过程必须尽可能的简洁廉价。所以如果采用像英语这样有50%冗余的语法建模,在当时显然是很不合时宜的。

这并不是我通常避免使用“类英语”语法的原因。我在这里提及就是为了打破这种观点。有了更廉价的缓存和处理器,简洁就没有必要称为最终的追求了。现在一门语言的人性化远比降低计算成本要重要。

然而,我们仍然有要谨慎为之的原因。其一就是解析过程的复杂度带来的成本——你总不希望这个成本上升到足以滋养错误和迷惑用户吧?另外,让一门语法趋近英语的作法,通常会令其所谓的“英语”走形。以至于对自然语言的表面的模仿会导致如同传统语法一般的混乱。(你可以在很多号称“第四代”的和商业数据库查询语言中看到这种恶果)

Fetchmail的控制语法之所以能避免这些问题,是因为它的语言空间极为有限。它离一门多用途的语言还差得远呢;其所描述的问题也很简单。所以大可不担心穿梭于微小的英语子集和实际控制语言会造成什么迷惑。我觉得这里有一则可以推而广之的经验:

 

16.当你的语言还远不足以达到图灵完备的时候,不妨为语法蘸上一层“糖衣”。[2]

When your language is nowhere near Turing-complete, syntactic sugar can be your friend.

 

另一则经验是有关隐藏的安全性的。一些用户要求我改写软件,以便能对rc文件加密。这样入侵者就不会在无意间看到它们。

我没有照做,因为这并不会带来实际的保护。因为只要有人能获得你rc文件的使用权,他就能和你一样运行fetchmail查看邮件——如果真的想要你的密码,他就可以从fetchmail代码中剥离出必要的解码器。

言而总之,在rc文件中注入密码只是给那些没有深入思考的人一种安全的假象。进而,我们得出通用的规则:

 

17.安全系统的效用只取决于对秘密的保护,谨防伪安全。[3]

A security system is only as secure as its secret. Beware of pseudo-secrets.

 

 

 

 

 

 

译者按:

1.这个关键字后面对应的是邮件服务器名称。计算机中,“Poll”是动词“轮询”的意思,也就是依次向服务器发送报文,收取邮件。而“Server”是名词“服务器”。显然使用“Poll”更符合英语语法。

2.图灵完备:又称图灵完备性。如果一门语言达到“令一切可计算的问题都能计算”的程度就可以说其达到了图灵完备或说具有图灵完备性。

3.“秘密”是指所要隐藏的标的;“安全系统”是指保护这个标的不泄露的手段;“伪安全”是指将标的写入手段的做法。让我们以fetchmail为例,“秘密”就是要保护rc文件,“安全系统”就是密码,把密码写入rc文件显然就是伪安全。

相关文章
|
自然语言处理
[软件工程导论(第六版)]第4章 形式化说明技术(复习笔记)
[软件工程导论(第六版)]第4章 形式化说明技术(复习笔记)
|
存储 机器学习/深度学习 并行计算
数据结构与算法 之三 算法的力量
数据结构与算法 之三 算法的力量
36 0
|
架构师
《架构师修炼之道》第八章--建立模型,化繁为简
项目进入了开发阶段,我们发现团队成员描述同一架构元素时使用的词汇各不相同。我们的设计决策表面上取得了一致意见,但大家实际各有各的理解。
361 0
《架构师修炼之道》第八章--建立模型,化繁为简
|
人工智能 算法 安全
【C++怎么入门】C++是什么及发展史 | 重要性(工作领域、校招领域) | 怎么学
【C++怎么入门】C++是什么及发展史 | 重要性(工作领域、校招领域) | 怎么学
173 0
【C++怎么入门】C++是什么及发展史 | 重要性(工作领域、校招领域) | 怎么学
|
设计模式 运维 前端开发
《构建之法-现代软件工程》读书笔记(二)
《构建之法-现代软件工程》读书笔记(二)
《构建之法-现代软件工程》读书笔记(二)
|
设计模式 网络协议 算法
自学编程的八大误区!克服它们,豁然开朗!
说在前面 小伙伴们大家好,又是全新的一天。 关于“自学编程的一些常见误区”这个话题其实很早之前就在视频里聊过了。时间过去了大半年,也还是有很多小伙伴会提及各种自学过程中的常见疑惑,所以还是用文字总结一下这几点想法,和大家共勉。 误区1:忽略基础,盲目莽进 基础知识和基础路线真的非常重要,就以Java领域举例,现在的应用框架实在是太多了,五花八门,层出不穷,迭代的速度太快了。但是假如Java SE的基础不牢、网络协议和操作系统不熟,基本的设计模式不了解,那一味地追求学习新框架反而会让自己陷入迷茫与困顿。 基础牢固,应用框架的学习自然就不用惧怕了,很快就能切入核心,掌握原理。而且越时髦的东西
143 0
《战争论》第三篇《战略概论》的主要内容
《战争论》第三篇《战略概论》的主要内容 《战略概论》是《战争论》的第三篇,是全书的核心内容,主要论述了战略的定义和三任务、战略五要素和战略四原则,其中战略四原则是《战略概论》的核心(如图1所示)。
1623 0
|
决策智能
复杂性思维中文第二版 十二、合作进化
十二、合作进化 原文:Chapter 12 Evolution of cooperation 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 在最后一章中,我们提出两个问题,一个来自生物学,一个来自哲学: 在生物学中,“利他主义问题”是自然选择与利他主义之间的明显冲突,自然选择表明动物生存在不断竞争的状态中来生存和繁殖,利他主义是许多动物帮助其他动物的倾向,甚至是显然对他们不利。
1090 0