大家好,欢迎收听第425期播客。在今天的节目中,我们将探讨一个2013年图灵奖得主Leslie Lamport。前半部分讲一个软件latex,后面讲他在分布式领域的贡献。
要讲latex,就要讲另一个历史悠久,而且至今仍然活跃并深刻影响科技出版界的开源项目——TeX。让我们回到1976年,当时斯坦福大学计算机科学教授Donald Knuth面临着一个科学界普遍关注的问题:如何确保含有复杂数学方程和科学符号的研究论文能够以正确的格式打印出来。那时,虽然手动排版能够产生精美的输出,但成本昂贵,且需要作者与专业排版人员紧密合作。
高德纳写了那本超有名的《计算机编程的艺术》,1968 年那会儿,他可是给出版社 Addison-Wesley 交了厚厚一沓手写稿,那出版社用的是那种老式的金属排版设备。书里还有各种程序例子,高德纳对排版人员那是各种叮嘱,就为了让文字看起来更舒服。第一版出来,他挺满意。但八年后,在扩充书第二卷的第二版中,,出版社想省钱,改用电子排版了,好家伙,高德纳一看校样,那质量简直惨不忍睹!
为了解决这个问题,Knuth教授投入了大量时间和精力。高德纳当年发现,虽然高分辨率数字排版机能做出精美的形状,但专业的排版知识却在转型过程中遗失了。他就琢磨着,能不能用软件来做排版呢?
1977 年,高德纳花了整个夏天,还加上一部分休假时间,一头扎进了数字排版程序的研究。到了 1978 年,他和他的学生们一起开发出一个程序,给他的 700 页巨著排版!这个程序就叫做 TeX,它彻底改变了科学论文的排版和打印方式,而且它也是目前仍在使用的最古老的开源软件项目之一。
TeX的出现,让作者们能够将自己的精确意图直接编码进手稿。通过TeX的标记语言,作者们可以编写纯文本文档,并在其中插入标记命令,从而实现精确的排版控制。这种将内容与格式分离的方法,不仅提高了效率,还减少了错误。
Knuth教授深知,单一的排版命令集无法满足所有作者的需求,因此他设计了TeX以便用户可以自定义扩展。通过宏文件,人们可以创建新的命令,而无需更改TeX引擎本身。这种灵活性使得TeX能够适应不断变化的技术需求。
1984年,Knuth教授出版了The TeXbook,详细介绍了TeX所有原始、简单的宏命令的含义以及引擎的内部工作原理。这本书的目的是让开发人员能够编写自己的宏并对代码进行更改。
在Knuth教授的坚持下,TeX引擎源代码已经免费了40多年,任何人都可以修改它。但为了保护作者的手稿不被破坏,Knuth教授禁止将不兼容的更改版本的引擎称为TeX。他发布了一组自动化测试,任何修改后的引擎版本都必须通过这些测试才能使用该名称。
TeX的发展超出了大学的范畴,因为它必须移植到不同的计算机系统、语言和打印机来排版其他作者的手稿。美国数学会(AMS)是早期采用者和推动者,并于1980年组织了TeX用户定期会议,收集用户反馈并指导TeX的开发。TeX用户组(TUG)将运行TeX所需的所有文档和程序打包到标准发行版TeX Live中,发挥了重要作用。
Knuth教授于1982年修订了TeX(称为TeX82),并于1989年再次修订。然后,在1992年,他退休并专注于完成一直在扩展的书籍,这本书一直是TeX的推动力:《计算机编程的艺术》。但工作仍在继续。
大多数文字处理程序用户都对几十个命令感到满意,例如节、小节、粗体、斜体等。他们希望引擎做出尽可能多的排版决策。
因为 TeX 的 plain 命令集相当低级,所以它最适合像 Knuth 这样希望对其材料的排版进行详细控制的作者。但是,将内容与表示分离的高级、易于使用的标记语言的想法刺激了 Scribe 的创建,这是卡内基梅隆大学的布莱恩·里德 (Brian Reid) 于 1980 年攻读博士学位时发明的程序。 Scribe 在八十年代初受到技术作者的欢迎,但它不是免费的,这限制了它的流通。
Scribe 的用户之一是 SRI International 的 Leslie Lamport。 Lamport已经是分布式系统领域著名的计算机科学家,他正在写一本书。他是 TeX 的早期用户之一,希望将 Scribe 的易用性引入 TeX。他创建了一个名为 lplain (“l”代表 Lamport)的替代宏文件,其中包含一组更易于使用的命令。他将此宏文件与 TeX 一起免费提供。然后,用户可以运行 latex 程序,使引擎首先读取 Lamport 的宏。 Lamport 还写了一本书《LaTeX:文档准备系统》,教作者如何使用这些命令准备手稿。对于更复杂的需求,作者仍然可以使用底层 TeX 命令。
有了这些高级命令、免费的 TeX 引擎和 LaTeX 书籍,TeX 的使用呈爆炸式增长。此后,宏文件不断演变并更改了名称,但作者通常仍然运行名为 latex 的程序或其变体。因此,大多数编写 TeX 手稿的人都知道该程序是 LaTeX,并且他们使用的命令是 LaTeX 命令。
LaTeX 对科技出版的影响是深远的。精确的排版至关重要,特别是对于使用化学和数学公式、算法和类似结构来传达概念时。现代世界产生的论文、期刊、书籍和其他出版物的数量远远超出了手动排版的吞吐量。 TeX 可以在不损失精度的情况下实现自动化。
借助 LaTeX,书籍作者可以自己生成适合的副本。大多数学术和期刊出版商都接受用 LaTeX 编写的文章手稿,甚至康奈尔大学还维护着一个开放档案,物理、化学和其他学科论文的作者可以直接提交他们的 LaTeX 手稿以供公开查看。每月有超过 10,000 份来自世界各地的手稿提交至该档案馆。
LaTeX 的简单适应性继续赢得了狂热的追随者。 “我喜欢 LaTeX,因为我可以专注于写作,而不是花费数小时来调整风格,”灾难研究员和地球物理学家 Mika McKinnon 说,她在不列颠哥伦比亚大学撰写硕士论文时开始使用 LaTeX。 “如果我很好地设置了 LaTeX 文件,我就可以通过最少的手动修复来格式化和重新用于任何出版物或风格指南。”
虽然现代桌面出版从几十年前 TeX 首次引入的创新中受益匪浅,但它也很大程度上接管了非技术材料的排版。事实上,大多数人从未听说过 TeX。
LaTeX的诞生,更是将TeX的易用性提升到了新的高度。Leslie Lamport创建的这套宏文件,让作者们能够更加便捷地使用TeX。他的《LaTeX:文档准备系统》一书,更是成为了无数作者的宝贵指南。
如今,TeX和LaTeX已经成为科技出版的黄金标准。它们不仅能够帮助作者精确地传达复杂的概念,还能够实现自动化排版,极大地提高了出版效率。
接下来,介绍一下Leslie Lamport吧,虽然他是LaTex的作者,但是这可能是他工作中微不足道的部分。毕竟,他得图灵奖可不是靠这个软件得的,而是靠分布式系统。分布式系统远比我们想象的复杂:
想象一下,在分布式系统中,有多个节点需要就某个值达成一致,例如决定哪个节点是主节点,或者更新某个共享数据的最新值。然而,这些节点之间可能存在网络延迟、节点故障等问题,导致信息传递不完整或不及时。在这种情况下,如何保证所有节点最终都能达成一致,这就是共识问题。
这哥们搞出了Paxos算法,这个算法有两个特点,一是高容错性: Paxos 算法能够容忍节点故障,只要大多数节点正常工作,系统仍然能够达成共识。第二是高可用性: Paxos 算法能够保证系统的高可用性,即使某些节点故障,系统仍然能够正常运行。
我尝试解释一下Paxos 算法:简单来说就是少数服从多数
Paxos 算法听起来很高大上,其实它解决的问题很简单:在分布式系统中,如何让大家就一件事达成一致意见。举个例子:假设你和几个朋友要决定周末去哪里玩。每个人都有自己的想法,有人想去爬山,有人想去海边,有人想去博物馆,有人想去洗脚。这时候,你们需要达成一致意见,才能一起行动。
Paxos 算法是怎么做的呢?
- 提议阶段: 每个人都可以提出自己的建议,比如“去爬山”或者“去海边”。
- 接受阶段: 其他人会收到这些建议,并进行投票。如果超过一半的人同意某个建议,那么这个建议就被接受了。
- 学习阶段: 大家都知道了最终的决定,然后就可以一起去玩了。
Paxos 算法的优点:
- 公平: 每个人的意见都有可能被采纳。
- 可靠: 即使有人中途掉线,只要超过一半的人还在,就可以继续进行决策。
- 高效: 整个过程只需要几轮投票就可以完成。
Paxos 算法的缺点:
- 需要多数人参与: 如果参与的人太少,就无法进行决策。
- 需要通信: 参与者之间需要进行通信才能进行投票。
总之,Paxos 算法就像一个民主投票的系统,帮助分布式系统中的节点们达成一致意见。
当然了,在民主国家的人才能想到这种系统,要是放在一些国家,肯定是领导你说去哪咱去哪,火车快不快,全凭车头带。结果一脚油门,开沟里了。火车有没有油门呢?
还有一个,如果这些系统中,出了叛徒怎么办?这就是经典的拜占庭将军问题:信任与背叛的考验。
拜占庭将军问题是一个经典的分布式计算问题,它描述了在存在不可靠节点的情况下,如何达成共识的挑战。
故事背景:
想象一下,拜占庭帝国的军队正在围攻一座城市。军队被分成几个部分,每个部分由一位将军指挥。将军们之间只能通过信使进行通信。他们需要就进攻或撤退达成一致的决定。然而,其中一些将军可能是叛徒,他们会故意发送错误的信息,或者不执行命令,从而破坏整个计划。
问题的核心:
在这种情况下,忠诚的将军们如何才能达成共识,并确保正确的行动方案被执行呢?这就是拜占庭将军问题。
问题的挑战:
- 不可靠的节点: 某些节点可能是叛徒,他们会发送错误的信息或不执行命令。
- 缺乏中央控制: 没有一个中央节点可以协调所有节点的行动。
- 通信延迟: 信息传递可能存在延迟或丢失。
解决方案:
为了解决拜占庭将军问题,需要设计一种容错的共识算法,它能够在存在不可靠节点的情况下,保证大多数忠诚的节点达成一致。
一些常见的容错共识算法包括:
- Paxos 算法: 这是一种经典的共识算法,它能够容忍最多三分之一的节点出现故障。
- Raft 算法: 这是一种更易于理解和实现的共识算法,它也能够容忍最多三分之一的节点出现故障。
拜占庭将军问题的应用:
拜占庭将军问题不仅是一个理论问题,它也具有实际的应用价值。例如,在区块链技术中,拜占庭容错算法被用来保证分布式账本的一致性。
总结:
拜占庭将军问题是一个经典的分布式计算问题,它描述了在存在不可靠节点的情况下,如何达成共识的挑战。解决拜占庭将军问题的算法在构建可靠的分布式系统中至关重要。