Hints and Principles for Computer System Design

作者:Butler Lampson

January 15, 2020

摘要

这篇文章是我在1983年所发表的论文的长篇版。在那篇论文中提出了设计系统的目标应是:简洁、及时、高效、兼容性强、可靠、稳定、==令人愉悦的==(缩写为“STEADY”[^a1])。同时为了实现这些目标,所采用的方法是:近似、增量、分治(缩写为“AID[^a2]”)。同时文中指出了一些系统设计的法则而不仅仅是建议,并且给出了相应的示例来说明如何运用。

目录

1. 介绍

写小说有三个规则。 不幸的是,没人知道他们是什么。——Somerset Maugham[^Q50]

==如果你不知道你正在去往哪里,请务必小心,因为你可能无法到达那里==。 — Yogi Berras[^Q8]

站在巨人肩膀上才能看得更远——Bernard of Chartre[^Q7]

==莎士比亚因为束缚不多而写了更好的诗。 弥尔顿…因知晓太多反而束缚太多使其诗篇逊色了一点==——A.N. Whitehead^Q90

设计计算机系统和设计算法有很大不同:

  • 外部接口(需求)更加复杂、模糊和多变。
  • 因为系统具有更多的内部结构,所以有更多的内部接口。
  • 并没有一个确切的标准去衡量成功。

设计人员通常会发现自己在海量的可能性中挣扎,不清楚一个选择将如何限制他们做出其他选择的自由,或者影响整个系统的大小和性能。可能没有“最好”的方法去建造一个系统,甚至是其主要部分;但是重要的是要避免使用糟糕的方式,并在各部分之间有明确的责任分工。

我设计和建造了许多计算机系统,有些成功了,有些失败了。我还使用和研究了许多其他的系统,其中不乏成功的和失败的。从这些经验中,我们可以得到一些设计好产品的一般性提示。大多数都是经验丰富的设计师们的民间智慧,但是,“人们没有充分考虑到,男人更经常需要被提醒而不是被告知。”[^Q35]还有一组原则(关于抽象模块化)几乎总是适用的,还有一组对立的原则,建议以不同的方式看待事物。

我将这些提示按照三个轴组织起来,它们与三个历史悠久的问题相对应,并给出了一个朗朗上口的总结:STEADY with AID by ART。

疑问 缩写
是什么? 目标 STEADY Simple, Timely, Efficient, Adaptable, Dependable, Yummy
怎么做? 手段 用AID Approximate, Incremental, Divide & Conquer
时机, 主体? 程序 ART Architecture(架构), Automate(自动化), Review(审查), Techniques(手段), Test(测试)

建议有很多,但是下面罗列了其中很重要的一些:

这些只是提示。它们不是新提出的想法(有少数例外),也不是万无一失的配方,不能保证系统合理运转、不可能是在精确制定下设计或者操作系统、一致的、或者总是适当的,并得到所有领先专家的批准。跳过那些你认为错误的、无用的或无聊的东西。

论文从一系列对立词组开始,这种对比可以帮你决定系统的优先事情和结构。这些对立词组描述的是各种可能性的终点,而不是可供代替的一些选择。第2章提供了一些法则:抽象、规范、代码、模块化和观点的价值。第3章中的每个目标都有一个相关章节描述支持它的技术,接着是一个章节描述不适合目标的增量技术的章节。其中“效率”的篇幅最大,其次是“可靠性”;这样安排的原因是局部性并发性自然地属于第一种,而冗余属于第二种,而这三种是当今系统的基础。最后有一个简短的非技术的第4章讲述程序,并在第五章中讨论每个反对意见。自始至终,这些简短的标语抓住了最重要的一点,没有任何细微的差别,语录有时会对文章做出愤世嫉俗的评论。

有很多例子来说明具体的观点; 我试着选了一些大家都知道的观点,但你可能得先查一下才能抓到重点。我还讲了一些更长的故事,用“»”和更小的字体标记。很多东西不止适用于一个地方,所以有很多交叉引用链接。艺术术语第一次使用时是斜体的;使用网络检索往往是一个不错的开始。

我要说的大部分都是关于软件的——硬件通常都是现成的。如果您的系统确实需要新的硬件设计,这些想法中的许多仍然适用。

1983年,我写了一篇关于提示、R49的论文,多年来,我认为没有理由重写或扩展它;我写了我所知道的关于个人分布式计算、操作系统、语言、网络、数据库和容错的东西,20世纪70年代在这些方面的工作还在继续。但自上世纪90年代中期以来,互联网、万维网、搜索引擎、移动电话、社交媒体、电子商务、恶意软件、网络钓鱼、机器人和物联网已经成为日常生活的一部分,并发性和可伸缩性现在是系统的主导主题。

然后我可以把我知道的几乎所有的东西放入一个合理篇幅,但是今天的计算更加多样化,我知道的也更多了这篇论文长得不合理。我找不到一个单一的方式来组织它,所以我采取了几个不同的角度,并把他们链接起来(像这样),如果你在网上阅读到的话,希望这些链接能帮到你,以及一个索引。

这不是一篇评论性文章;我引用的作品都是是我所知道的作品,不一定是很早的,也不一定是最好的。我已经给出了一些参考资料,以扩展一些想法或例子,但通常只有当这些例子和想法很难使用网络找到的时候才会提供。

这里有一个较短的版本,只有这篇文章的一半大小,但仍然比1983年的那篇长50%。

[^a1]: 分别对应五个单词:Simple, Timely, Efficient, Adaptable, Dependable, Yummy [^a2]: 分别对应三组词:Approximate, Incremental, Divide & Conquer

1.1 对立和标语

我现在从两个方面看待生活。—Joni Mitchell[^Q52 ]

通常从两个(或三个)极端之间的角度来考虑设计是有帮助的;记住,极端是一系列可能性的终点,而不是不可调和的选择。这里有一些重要的极端角度,每一个都有其对应的标语。如果解释得当,就能知晓其本质(又是可能恰恰相反)。他们的排序是依据他们的第一目标或者技术。在第五章中对每一个极端角度都有讨论

目标 对立 标语
原则 文档​↔​代码 建立文档,保持正确,保持简洁;不要隐藏力量,把它留给客户
简洁 简单​↔​复杂,精巧的↔有特色的,通用​↔​专用 KISS[^注释1]:保持简单,傻瓜操作;专心做好一件事,别做太多不要隐藏力量,把它留给客户;保持系统快速运行,哪怕使用暴力
文档↔代码 保持神秘,解放实现者。好篱笆造就好邻居。接受非确定性。==抽象泄漏==
完美↔适当,确切↔宽容 适当就可以。碎片的,弹性的
不可变的↔扩展↔可变的 ==保证不可变==
声明式↔功能↔势在必行 表明你的想法,保证原子性
及时 精准的↔近似的 软件 ==保证软件正确,和酷==
高效 ABCs。使用理论。延迟vs带宽。保证其原子性。S^3^:碎片、流或挣扎。[^注释2]
动态↔静态 保持松弛,固定下来。卸载负载,拆分资源。
间接↔内联 绕道而行,看看世界。
时间↔空间 缓存结果,保持紧密
懒惰↔渴望↔投机 搁置,大胆尝试
集中式↔分布式,共享↔副本 再做一次,制作副本,找到共识
兼容性 确定的↔升级,统一的↔可扩展的 唯一不变的就是“要变化”,使其可扩展。==片状,富有弹性的部分==
进化↔革命 保持冷静,把握住弯道,抓住机会^注释3
政策↔机制 改变想法没什么大不了的
可靠性 一致性↔可用的↔分区容忍性 安全最重要,总是准备好。就够了
生产↔核实 信任但是要核查
持久性↔不稳定性 不要忘记,开始整理
吸引人 简洁↔繁富,精巧的↔有特色的 KISS: 保持简单,傻瓜操作(同上)
增量编程 已变成↔将变成 如何到这步的?不要直接拷贝,要共享
迭代↔递归,数组↔树 视局部为整体
再计算↔调整 小步变化
程序 建立在一个平台上。保证接口稳定

[^注释1]: KISS是Keep it Simple, Stupid的首字母缩写组合。没有翻译 [^注释2]: S^3^:对应的三个词是shard, stream or struggle.

[^Q50]: 萨默塞特·毛姆,在《拉尔夫·戴格》中没有引用,也许你应该写一本书,普伦蒂斯-霍尔,1977年,1977, p 7. Link [Daigh77, p 9] [^Q8]: Yogi Berra, 《棒球史上最伟大的英雄之一的灵感与智慧》,《亥伯龙神》,2002年,第53页。 [^Q7]: 沙特尔的伯纳德,详尽地记录在罗伯特·默顿的《巨人的肩膀》中,自由出版社,纽约,1965年。转载芝加哥,1993年。链接。索尔兹伯里的约翰在bk. 3 (1159) bk. 3, ch. 4中说:“在我们的内心深处存在着准巨量的贝纳尔·卡诺坦斯,但我们的身体是不受本体的影响的,我们在身体的下半部和巨大的下半部中都曾说过。”“剑桥,科珀斯克里斯蒂学院,MS 046, f. 217r;亨利·奥斯本·泰勒,《中世纪的思想》,伦敦,麦克米伦,1911年,第2卷,第133页。如果我们比他们看得更多更远,这并不是因为我们有清澈的眼睛或高大的身体,而是因为我们被他们的巨大身躯抚养长大。”。牛顿。

[^R49]: 巴特勒·兰普森:《计算机系统设计的提示》,《美国计算机学会第九版》。操作系统原理(SOSP ‘ 83), ACM SIGOPS操作系统回顾,1983,10月17日,第33-48页。链接。转载自1984年1月1日《IEEE软件》第11-28页。

[^Q52]: Joni Mitchell,现在两边,在《云端》,重录记录,1969年5月。(Mitchell67)