201707 The Science of System Design (TLA Plus) 学习笔记 (0) - xiaoxianfaye/Learning GitHub Wiki

The Science of System Design

using TLA+, PlusCal and TLC

0 Preface

0.1 Introduction

老师在课程简介中写到:

我们都知道,随着系统复杂性的升高,人在设计、编码和运维方面发生错误的概率也会随之升高。这些隐藏在系统核心中的错误会伤害系统的可用性,造成极大的经济损失,并增加系统的开发、维护成本。尽管我们花费大量努力避免那些不必要的复杂性,但是系统的固有复杂性可能依然很高。并且,我们还必须要在交付新特性、发布新服务时,对系统核心的正确性抱有极大的信心。

这些信心从哪里来呢?一般来讲,我们会采用很多方法,包括:编写设计文档、进行设计评审、静态代码检查、代码评审、压力测试、故障注入测试等等。这些技术都是必要的,但是对于高度复杂的系统(比如:并发和分布式系统)来讲,还远远不够。由于这类系统的固有复杂性很高,一些隐藏在系统设计核心中的微妙错误是很难通过这些方法发现的。

软件系统设计文档往往不能做到精确,一般都用自然语言和一些图示进行表达,因此无法通过工具自动检查设计的正确性。从精确性方面来讲,只有代码才是精确的(这也是有人说“源代码就是设计”的原因)。但是,编程语言编写的代码中混杂了很多实现层面的决策和细节,无法清晰的呈现出设计层面的规范,因此会造成设计难以理解,难以保证实现的正确性,并且对于一些微妙的错误也难以调试。在这种情况下,为了提升对正确性信心,只能采用强化条件、加强测试等方法,而这则会增加不必要的设计复杂性和成本。因此,越来越多的软件领导企业开始寻找新的设计表达方法。

我们希望可以清晰、准确地描述系统的行为而又不陷入繁杂的细节,可以用几百行代码就可以表达极其复杂的设计。我们希望有工具可以在设计层面快速地检查出各种失败条件,并自动给出导致失败的用例。我们希望表达方法和工具能解决真实世界的问题,并对一线设计师、程序员友好。这样的表达方法和工具存在吗?答案是:存在!表达方法是TLA+和PlusCal,工具是TLC。

TLA+是Leslie Lamport (2013年图灵奖得主) 近半个世纪的研究成果,和其他类似技术(dependent type,Coq等)相比,TLA+更加简单和注重实效,它一开始就把目标人群定位成解决现实复杂问题的工程师,而不是做学术研究的数学家和逻辑学家。这和Lamport一直投身工业,以解决工业界实际问题为目标密不可分。目前的整个互联网、云计算系统的核心基础都建立在Lamport的两篇论文(一篇是关于分布式系统中的时间问题的,一篇是关于分布式系统中数据一致性问题的)之上就是最好的证明。

TLA+的核心是时态逻辑加上集合论和一阶逻辑(都是一些初等数学),是Lamport在时态逻辑基础上的天才发明。那些让绝大多数软件从业人员带着敬畏避而远之的复杂系统(比如:分布式系统、并发并行系统、拜占庭系统等等),都可以用很少的几个布尔逻辑原语进行表达、验证和证明,而这类系统仅靠测试是无法发现设计层面的一些微妙错误的。有了TLA+来保证和维持设计的正确性,就可以大胆弱化条件、简化设计,可以采取创新性的优化手段来消除瓶颈、提升性能,可以省去很多不必要的测试工作,可以极大地提升DevOPS的可靠性。总之,这个正确性的保证为软件生产、交付环节的各种创新提供了坚实的基础。目前业界很多知名公司(微软、Intel、Oracle、Amazon等)使用TLA+的案例都很好地证明了这一点。

在本次培训中,我们将教授大家如何在更高的维度做思考、如何从数学的视角理解定义计算、如何用数学语言清晰地表达思考并写出高层次的系统规格说明、如何自动生成模型去验证规格说明的正确性、如何去证明规格说明的正确性等。所采用的工具正是是TLA+、 PlusCal(可以看作是TLA+的语法糖,供患有数学恐惧症的程序员使用)和TLC(模型检查器,可以根据specification自动生成模型验证specification的正确性)。

很多人一听到数学就觉得恐惧,造成这个结果的主要原因是教育。在本课程中,希望能消除大家对数学的误解,我们会通过深入浅出的讲解和大量实战,让大家领略到数学之美,喜欢上数学,我们对此抱有信心。通过本课程的训练,你的抽象能力、思考的深度和清晰性、表达能力都会得到大幅的提升。即使你在工作中不使用TLA+,通过本课程的训练,也会让你写出更加简单、高效、正确而富有逻辑美的代码,而这是你之前学习的那些设计技巧远不能做到的。一旦你学会了TLA+,你的工作就更加接近科学家,因为用数学公式表达对问题的理解和认识,用数学工具解决问题是所有科学工作的共性。

当然,这不是一件容易的事情,本次培训充满挑战,同时充满乐趣 ... ...

Happy Learning!

0.2 Preparation

安装JDK1.8.0以上版本和TLA Toolbox1.5.3版本,Toolbox的安装方法见如下链接:

http://lamport.azurewebsites.net/tla/toolbox.html

安装完毕后,确认安装目录中有toolbox.exe文件(Windows系统),点击确认能正常运行。

下面两个链接是对Leslie Lamport的两个简短采访:

其中谈到了他的工作对计算机科学的影响,他当前的兴趣所在(如何让人更好地思考)以及他对数学的热爱。

0.3 Outline

本次课程的授课时间从2017年7月20日到7月23日,共三天半。在这次课程中,

TODO 待整理补充

  • 7月20日上午 什么是计算:数学的视角
  • 7月20日下午 TLC介绍、TLA+简介和训练
  • 7月21日上午 时态逻辑:safty、liveness等
  • 7月21日下午 时态逻辑实战和正确性的关键
  • 7月22日上午 PlusCal介绍和实战练习
  • 7月22日下午 编写TLA+ spec的要点和原则、实战练习
  • 7月23日上午 答疑和探讨

根据授课内容,整理出本次课程的学习笔记。

1 Introduction to Course

详见 201707 The Science of System Design (TLA Plus) 学习笔记 (1) Introduction to Course

2 Introduction to TLA+

详见 201707 The Science of System Design (TLA Plus) 学习笔记 (2) Introduction to TLA+

3 State Machines

详见 201707 The Science of System Design (TLA Plus) 学习笔记 (3) State Machines

4 Temporal Logic of Action

详见 201707 The Science of System Design (TLA Plus) 学习笔记 (4) Temporal Logic Of Action

4 Essence of Concurrency

5 PlusCal

6 Summary

7 Readings

⚠️ **GitHub.com Fallback** ⚠️