欢迎光临
我们一直在努力

【译】《Thinking in Promises》第一章 承诺和强加

想象有这样一组原则,这些原则可以帮助你理解部分如何结合成为整体,以及每个部分如何从自己的角度看待整体。如果这些原则是有效的,那么用这些原则进行观察,会发现团队中的人类、鸟群中的鸟儿、数据中心中的计算机还是瑞士手表中的齿轮都是可以应用这一原则的。合作理论应该是相当普遍适用的,因此我们可以将其应用于技术和工作场所。

这些原则是承诺理论的主题。承诺理论不是从整体出发的,其目标是从部分之和中揭示整体的行为。换句话说,它是一种自下而上的建构主义世界观。你可以将其描述为一种自底向上记录系统行为的学科。

承诺工程

2004年,我正在寻找一种用来描述CFEngine的分布式计算模型,承诺模型的工程概念在此时产生了。当时“承诺”这个词正式我所需要的:一种用来表达意图的院子。然而这个想法打开了潘多拉魔盒,我发现承诺可以用于更普遍的实物之中。组件如何作为一个整体运行的?承诺理论是理解这一问题的有效方式,并且它还承诺了一种从前没有被认真对待的思路:用单一描述来统一人类和机器行为。

与商业和计算机科学等其他建模方法不同,承诺理论并非一份宣言,也不是政治声明或哲学议程。一套简单原则的应用,构成了承诺理论的魔力。它只不过是一种将系统分解为基本组成部分,并重新组合的分析和工程方法。在这个过程中,我们找到了一种表示和质疑预期结果可行性的方法。对于某些人来说,疑点就在于计算机编程的知识,围绕计算机编程已经有了许多哲学思想,如OO、SOA、UML等等。这其中,有些把哲学置于理解之上的方法已经都失败了。

本书的目的是探讨在人机系统、组织和技术中,通过对承诺的理解,可以获知合作的方法,以及如何将这种理解应用于协同工作面临的现实挑战。

从命令到承诺

至少在西方的文化中,会将预期结果编写为分步执行的命令来执行的。然后,我们将这种思路编程为方法,用里程碑和可交付成果的方式来强调我们的思路。这种思路的产生原因是,我们用故事的方式来思考,就像我们通过语言讲述故事一样。但是故事是很难被评估的。我们如何知道一个故事是否成功地表达了其意图?

在另一方面,我们是不是转换一下思路,我们不再关心中间步骤,而只去考虑目标、预期结果、评估方式和成功呢?

举个例子——用如下指令来清理洗手间:

  • 洗地板、拖地
  • 清洗马桶
  • 把纸巾放到纸巾盒
  • 补充皂液
  • 每小时准时执行上述操作

如果我们把该任务转换成为承诺模式:

  • 我承诺,每小时检查时,地板都是清洁和干燥的
  • 我承诺,每小时检查时,马桶都是空的和干净的
  • 我承诺,每小时检查时,纸巾盒里都有干净的纸巾
  • 我承诺,每小时检查时,肥皂盒里都有充足的皂液

重点在哪里?这有什么意义呢?难道这世界不是由用力来推动变化的吗?这是牛顿时代以来一直被广泛接受的学说,但这种看法是一种过度简化,甚至在现代物理学中也不准确。

我们首先要注意的事情就是,必须有代理人(人或者机器人)做出承诺,这样我们就知道谁是活动代理;做出承诺后,代理就负担了承诺所代表的责任。接下来我们会发现,做出承诺是需要动力的。合作通常要包含对话和激励。这些承诺缺少的是一个需求,比如:如果马桶洗干净了,我保证付款给你。因此从承诺的角度来看,就需要解答一个问题:我们如何描述激励措施?

为什么承诺优于命令

为什么是承诺,而不是义务、命令或者需求?在承诺理论中,后面的几个词被认为是强制措施——在没有邀请的情况下把意图强加给别人。

相对于强制措施来说,承诺始终关注因果关系的要点:即作出承诺并负责履行的代理人。承诺会更直接地揭示与预期结果相关的信息

命令或者其他的强制措施有两个问题:

  • 对行为做出要求,而不是直接提出我们的需要(重过程而轻结果)
  • 甚至在不了解目标的情况下,就要按部就班地执行全套命令

所以为什么承诺比命令好?承诺表达的关于终点或最终结果的意图,而不是指示起点时应该做什么。命令是和发出命令时的的具体状况相关联的,所以命令是受限于上下文的。而对于最终状态的承诺则是独立于当前状态的:

![[images/20231226-1.png]]
图 1-1:在本书中,我们将多次讨论时间线的收敛或扩散。在左边,命令从确定的起点扩散到不可预测的结果,我们从一种确定状态转变为一种不确定状态。而在右边,承诺从不可预测的开始趋于一个确定的结果,带来了更高的确定性。

承诺是从最大化确定性的视角来阐述预期的。承诺适用于作出承诺的代理人。根据自治的定义,每个代理人都有权控制自己。强加或命令是适用于他人(非自己)的事物。根据定义,那就是您无法控制的内容。

承诺有时候是可以关联到出发点的:“我承诺现在就倒立”,“我承诺会在早上9点离开房间”。承诺代表持续存在的状态,而命令则不行。

自治带来的确定性

承诺是对预期结果的一个声明。承诺不关注动作,也不试图强迫。承诺是一种自愿的行为。随着内容的推进,我还会使用“自愿”一词,让意义将变得更加清晰,还有个同义词就是自治。

如果一个代理人能控制自己的目标,那么他就是自主的(后果是由自己的行为导致的,而不是其他人)。这是一个独立的代理人。把世界分拆为自主的部分,我们就可以在因果上取得先机。当发生变更时,我们会知道他在一个自主区域里发生;在没有对外部做出明确承诺的情况下,就不会自外向内的产生变化。

注意,一个行为,只要看起来是有意的,或者是有可能有意为之即可被视为有意行为,不一定需要显式地声明意图。

永远正确的观察者

当我们做出承诺时,需要和某角色进行通信,让它能对预期结果进行校验。通常一个承诺意味着一个尚未发生的结果(比如说“我承诺准时把你送到教堂参加婚礼”)。我们还能对已经发生但是尚未验证的事情进行承诺(例如会计部门说:“我承诺已经按时付款了”);结局已经发生了,但是承诺还没有被验证。

验证为何如此重要?实际上,每个可能的观察者都应该是知晓相关信息,能够对承诺是否得到实现进行独立的判断的。承诺人可能是受承诺影响最大的人,但是不会是唯一一个能够发声的人。

例如,Alice承诺要付钱给Bob。如果Alice在Bob不在场的情况下进行转账,Bob必须要检查账号才能确定承诺是否达成。然而Carol作为旁观者,听到了这一承诺,Alice转账时她刚好在场。因此她可以验证承诺是否完成。Bob和Carol所接触到的信息是不同的,因此他们有不同的校验承诺后果的方法。

这样每个自治的代理人都有自己的独立视角,意味着代理人都有自己的独立的预期。因此代理人无需校验后果即可做出判断。这是将承诺与信任结合使用的方式。每一个可能的观察者,都能访问到部分信息,能够独立的做出判断,在不同的环境下,可能的处不同的结论。

这是很像一个商业上的陈词滥调——“顾客永远是对的”。每个观察者都有权利拥有自己的观点。承诺的一个有益的副产品,就是记录代理人做出决策时所处的条件,以备后续使用。

文化和心理学

承诺理论的优势,在文化或心理方面都是可以证实的。在洗手间示例的命令版本中,可以写一个算法来实现所需的最终状态。您的算法可能涉及一份清单,比如擦洗马桶、使用特殊清洁剂等等。写下这些步骤给人以教育意义,因为它告诉你如何做。这对于教导别人如何在未来遵守承诺可能是有益的,但它并没有明确说明最终结果应该是什么样子,或者是否存在多种实现目标的方式。因此,在没有承诺的情况下无法评估算法。通过承诺,我们可以明确所期望达到的最终状态,并讨论实现它的其他方法。”

“How”是设计师的任务。那么关于运行和维护过程如何保证承诺在各种困难环境上都能达成呢?在信息技术领域,设计被翻译为“开发”,而维护则被翻译为“运维”,二者通常被称为DevOps。

想象一本菜谱,通常来说,每一页刚开头都是一个关于预期结果的承诺(一张诱人的成品照),接下来就是一个建议的配方。菜谱里通常不会直接抛给你一个配方,强迫你信任配方,一步一步操作最终得到结果,菜谱中首先给你的,正是一个预期。而在编程和管理方面,通常都不是这样做事的。

承诺与服务的概念是自然契合的。任何在服务或支持角色中工作过的人都会知道,你所做的事情并不是理解的最佳指南:“别告诉我你在做什么,告诉我你想要实现什么!” 你实际上正在做的事情可能与你想要实现的目标毫无关系。

一个简单的意图表达就是所谓的承诺提议。当你真心实意地说出来时,它就变成了一种承诺。

义务的局限性

强制性活动,尤其是“义务”,存在一个重大问题,那就是它们并不能减少我们对情况的不确定性。实际上,它们可能会增加不确定性。由于义务涉及到我们在某个领域中肯定拥有不完整信息的世界,所以很快就会导致冲突。

想象一对父母和一个孩子。妈妈和爸爸以以下方式将他们的语言模式强加给他们无辜的后代。美国妈妈告诉孩子:“你说tomaetoe”,而英国爸爸则说:“我说tomahtoe”。除非他们真正承诺沟通并达成共识,否则妈妈和爸爸可能甚至没有意识到自己在告诉孩子不同的事情。因此存在利益冲突。

但是这情况的糟糕程度不止于此。因为意图的源头是孩子无法控制的,所以她对这个冲突完全无能为力;问题源自在于她无法控制的领域之外:在爸爸妈妈身上。义务实际上增加了这个孩子眼中的不确定性。

解决之道在于让所有的的代理人具备自治能力。孩子和父母都无需听从命令或者履行义务。他们有拒绝的自由,并选择其它方式做出自己的决定。实际上,一旦从这种视角出发,孩子就需要对父母承诺她试图说出的话。实际上,她现在掌握着信息和控制权,可以承诺对妈妈说一件事情,对爸爸说另一件事情而毫无冲突。

这是伪科学?

承诺或者意图是充满人类因素的东西,这种东西和客观可衡量的现实世界里的结果结合在一起,会让科学家(除了某些社会科学家)和工程师们感觉很不舒服。我们受到的教育要求我们在自然科学中消除人为因素的参照,以保持客观。这种情况的部分原因是我们忘记了让我们走到今天的科学哲学,所以我们相信自然科学在某种意义上是“客观”的

科学家(除了某些社会科学家可能例外)和工程师对将像承诺或意图这样的人类因素与似乎客观可衡量的现实世界结果混合在一起的想法感到不舒服。我们被教导要在自然科学中消除所有关于人性的参照,以使其尽可能客观。部分原因是我们已经忘记了让我们走到今天这一步的科学哲学,所以现在我们相信自然科学在某种意义上是“客观”的(不仅仅是中立)。

在我另一本书(《Search of Certainty》)中。描述了在自然科学领域中,科学是如何被最难的问题强迫面对观察者相对性问题(或者换个说法叫主观问题)的,这是一个意外的转折。作为一名物理学家,我花了好一段时间才接受了这一事实——人类问题的确需要体现在技术研究过程中。这一过程甚至无需触及情感、或者针对特权阶级的道德谴责等问题。

承诺必命令或义务更基础,这并不难理解。他可以类比到简单的物理学:承诺是局部的,而义务是分布的(非局部的)。

承诺理论的目标是将变化(动态)和意图(语义)结合起来,形成一种简单的工程方法论,以认识到在处理不完整信息时存在的限制。谁有权访问哪些信息?

在我们描述某些行为时,我们对它在时间和空间上的持续性有什么期望?这是爆炸一样的一次性的变化,还是和平条约一样的持续平衡呢?

语义和动态
动态是可以测量的系统方面,比如大小、速度、频率等。系统的动态可以客观地用数字(“数据”)来描述,并且这些数字独立于解释存在。在科学中,也使用了力学和运动学这些词汇,但对广大受众来说它们不太熟悉。
语义是关于我们如何解释某个事物:它意味着什么,它有什么功能,我们给予它什么样的重要性?语义是主观的(即取决于观察者);因此根据相同的动态数据评估一项承诺是否履行,不同的人可能得出不同的结果。

承诺理论真的是理论么

像任何科学方法一样,承诺理论并不是针对特定问题的解决方案;它是一种描述和讨论不同代理人或行为者之间合作行为的信息语言。如果您在其假设和习语框架内操作,它将帮助您构建假设并找到涉及分布式信息的问题的可能的解决方案。

承诺理论是一种对协作系统进行建模的方法,它帮助我们评估系统的可靠性和效率。要准确评估,参与协作的代理人必须能够承诺满足一些基本条件,以确保系统的有效运作。

承诺理论也是一种原子理论。它鼓励我们将问题分解成一个元素表(基本承诺),一旦关于自身的意图被公开,它就变成了一个承诺,意图之间的组合就像化学反应一样,可能产生各种实质性的结果。SOA定义了具有接口(API),并且由文档完善的的自治服务(代理人)组成,因此是以Web服务和API为基础的承诺模型的一个例子。

承诺理论背后的原则存在是为了遵从普遍性,并尽可能少地做出预测。承诺理论还容许每个参与者持有不完整的世界观(即存在不同观点),从而在所见所闻方面产生局限性。

和其他的科学模型相比,承诺理论的不同之处在于,他用客观的方式对意图进行建模,而不会去管这意图直接来自人类还是某种技术。将承诺理论与博弈论模型相结合,我们还可以看到如何用经济型来解释合作(有时被称为有限理性)。我为什么应该遵守我的承诺?我会得到什么好处呢?

主要概念

我们会时常引用几个关键概念:

  • 意图(Intention):这是某种可能结果的主体。它可以被解释为在特定背景下具有重要意义的事物。任何代理人(人、物体或机器)都可以怀有意图。一个意图可能是灯光“变红”,或者是运动员“赢得比赛”的目标。

  • 承诺(Promise):当一个意图(范围)宣布时,它就变成了承诺。因此,承诺是一种明确的意图。在本书中,我只会谈论所谓的第一类承诺,也就是关于自己的承诺。换句话说,我们制定了一个规则:任何代理人都不能代表他人作出承诺(见图1-2)。

![[images/20231228.png]]
图 1-2 承诺堪比丘比特之箭

  • 强加:这是一种试图引导另一个代理合作的尝试(即植入意图)。它是对承诺概念的补充。强加程度包括暗示、建议、请求、命令等。
    ![[images/20240105.png]]
    图 1-3 强加像是一种攻击

  • 义务:一种暗示:如果不遵守将会产生成本或惩罚的强制措施。它比简单的强制措施更具侵略性。

  • 评估:对于一个承诺是否得到了履行的判断。每个代理人都会对其所知的承诺进行评估。通常,评估涉及观察其他代理人的行为。

  • 其他:还有一些其它层次的代理人之间的互动。例如,可以强迫代理遵从要求,这可能被定义为一种攻击;然而,我们不会进一步讨论这个问题,从而避免引发道德争论。

承诺比强制更常见,因此成为主要关注的重点。强制通常在现有承诺的体系中起作用。此外,承诺通常可以被提出来以等效的自愿行为取代强制。

相对于强制来说,承诺是更为常见的情况,因此我们会主要关注承诺方面的问题。当然,在承诺系统中,强加的方式也是能够奏效的,不过可以用等效的自愿承诺,来取代强加方式。

你要多少确定性

承诺理论还是处在一个研究阶段,所以我们不应期待用这一理论解答一切问题。另外它也综合了图论、相对论等其它理论中的思想,所以它也不是一个全新的理论。这一理论从一组最小的假设出发,然后从总体角度的各个视角来描述独立承诺的联合效果,构建一张协作网络。如果你想更加深入的理解它,我鼓励你用正式的、数学的语言来研究它。

承诺是个常用词,很容易让人产生各种联想。在承诺理论中,它有着特定而明确的含义。其他人也将这个词用于技术用途:并发编程中讨论了未来和承诺。这同样是给普通词汇赋予了专门的含义。我们需要小心,不要将太多自己的想象投射到这些特定的含义中。

在阅读本书的过程中,你会发现承诺理论提出了很多似乎显而易见的观点。这是一件好事。毕竟,一个不能预测明显事物的理论不会是一个很好的理论。然后,还会有其他结论用不熟悉的方式延展你的思维;可能会让你透过文化偏见,更清晰地看到事物。你还可能觉得这个理论缺乏惊人启示,失望透顶;或者你可能会对之前从未意识到的事物感到惊讶。这一切取决于你的思考的起点。无论你的经验如何,我希望这本书能为你提供一些关于合作系统的构建和设计的见解。

快速用户指南

在深入细节之前,首先简要概述一下如何开始以承诺的方式思考。这里归结了几条经验法则:

识别关键参与者(意图代理人)

建模的第一步,是在您所解决的问题范围内,识别扮演角色的代理人。系统的任何部分都可能是代理人,代理人可以独立地直接或者间接的对某事发起意图或承诺。代理人可能是人,也可能是计算机、政策文件等等,无论其原始来源如何,只要能发起意图的任何东西都可以是代理人。

为了正确进行建模的这一步骤,我们需要小心不要把意图与行动或消息混淆起来。行动未必是实现意图所必需的。无动作可能也是必要的。

此外,简单的工具也可以发起承诺。简单如钟表零件,甚至是一个 HTTP 的请求,都可能作为代理人的身份出现。在更大的视野中,最终阶段发挥作用的并不一定是人。

要想独立,一个代理只需要有不同的思考方式或者不同的视角,能够接触到不同的信息等等。这关乎关注点的分离。如果我们希望能够以不同方式推理的代理共同工作,它们就需要承诺以互惠互利的方式行事。这些代理可以是人类(如在商业-IT桥梁中的情况),也可以是计算机(如在多层服务器队列中的情况)。

可以用不同的思考方式、不同的视角或者能够接触到的不同信息,将代理人独立出来。这是符合关注点分离原则的做法。各种不同的代理人要协同工作,就需要做出互惠互利的承诺。代理人可以是人类,也可以是计算机。

处理不确定性和障碍

代理能够履行承诺的可能性有多大?真实世界是没有绝对的确定性的,所以忘记这个不切实际的想法吧!科学正是用来应对不确定性的,所以只管卷起袖子,依据现有条件来设计你的承诺,使其达到最佳效果。这方面是有些技巧可以使用的。

关键在于,可能存在种种原因让承诺无法履行。承诺只是意图,而非不可抗力。

机器和人都可能出故障,无法履行承诺,因此我们需要对此进行建模。基于我们对每个承诺的未来行为的信任或信念,每个承诺都存在一定的可能性(甚至可能是正式的概率)。

然而,代理人只对自己的行为作出承诺。如果我们试图代表他人做出承诺,就很可能遭到拒绝而无法实施——甚至另一个代理根本对这一企图一无所知。因此,合理的模型是拉取或者使用其它代理的承诺,而不应该把承诺推动或强加于其它代理。它假设代理只有在他们愿意的情况下才会遵从于外部强制(也就是说武力无法推动控制)。这意味着我们面对的现实情况里,不存在军事指挥结构这样的东西。应该认为代理人实际上存在产生共识、自愿遵从命令的情况——但是这种机制是有失败几率的。

从要求到承诺(从自上而下到自下而上)

承诺理论关注主动代理的两个原因:首先,因为这些代理最了解自己履行承诺的能力。其次,因为主动代理是可以轻易加入到任何更大的合作行为中的基本构建块。 要求是自上而下地被强加的。承诺则是自下而上地被遵守的。

这和原子理论有些相似——没有人能在元素周期表中强行创造一个新元素。假设设计飞机的过程中,需要一种强度是钢的两倍、但重量只有铝的一半的金属元素——在物理定律的妨碍下,恐怕你只能写信给圣诞老人求助了。我们可以当然可以梦想那些根本不可能的事物,但如果我们放弃不切实际的梦想,而真正去了解世界所做出的承诺,并尝试在此基础上进行构建,我们就会取得真正的进步。 从基本元素的承诺出发,我们可以通过理解不同类型原子及其不同属性(即承诺的行为方式)的结合,构建出具有新材料属性的元素组合。

这是一种自下而上的策略。从上到下的视角不是分布式的。因为缺乏对信息定位的清晰思考,你可能会做出无权做出的假设;例如,你可能会想要代表你无法控制的代理出承诺。

自下而上的方式下,因为你需要提出明确的承诺来应对每种假设,所以你必须知道事情的具体运转。这样一来,承诺方法强制性地引入了一种纪律。

这不就是讨论种笨拙的讨论需求的方式吗?其实并非如此。这恰恰相反。需求是从高层次的泛化出发,对更专业的执行层面提出义务。在要求者和被要求者之间,存在显而易见的的信息差。关于可能结果的重要信息处于这个差距的错误一端。从承诺的角度出发,就被迫只能从执行的角度思考,并将自己置于履行承诺的角色中,面对所有出现的问题。从这个视角出发,就很难做出做出无端的假设。

用承诺的方式思考,应急计划就是个顺理成章的事情——如果你的第一个假设失败了怎么办?

承诺的立场是一个极端的立场,你可能会基于某些传统观念而反对它。正因为它是一个极端的立场,它才有用。如果做出了任何假设,都可以用承诺的方式进行承诺,并用承诺的形式来应对外部影响以及任何合规要。但是一旦我们打开了怀疑的大门,就无法回头。所以承诺理论是建立具有预测能力理论的唯一的合理选择。

承诺理论的目标是确保各个代理通过做出所有必要的承诺来协作并取得成功。假设有一个拥有所有信息的神奇旁观者,那么在他眼里,整个合作行动可以被视为一个单一有机体做出的单一承诺。怎样才能促使这些主体做出承诺,取决于它们是什么类型的主体。经济激励能让人类做出承诺;而可编程的主题,那么它们需要被编程来履行这些承诺。我们称这种行为是自愿合作。对于人类来说,经济因素包括社会、专业和经济方面。

这听起来疯狂吗?为什么不像机械钟那样强迫每个人遵守规则呢?因为这毫无意义。即使是计算机,也只是因为它被自愿构建为遵循指令而遵循指令。如果我们无法通过拔掉其输入线的方式来改变这个承诺。人类也不能被外部代理强制实施——除非通过攻击手段让代理失去独立性。

处理意图冲突

如果所有代理拥有相同的意图,那么就不太需要承诺。每个人都会和谐相处,为共同的目标而努力。然而,一个系统的初始状态拥有未知的意图和分散的信息,这意味着我们需要建立像协议这样的东西,在其中代理承诺以特定方式行事。这就是我们所说的协调。

但如果不同地点的承诺无意中影响到第三方会怎样呢?这种情况经常发生——在义务理论(要求、法律和分布式许可模型)中,冲突的可能性非常高。承诺理论在解决冲突方面相当有效,因为一个代理只能与自己发生冲突,因此解决冲突的所有信息都位于同一个地方。

尽管去做

在一些人眼里,承诺理论是颠倒是非的。他们想要用义务来思考。A应该做B,C必须做D,等等。但除了激怒人的尊严感之外,这种方法很快就会导致可证明的矛盾。问题在于,任何义务的来源(施加义务者)都是存在于主体之外。因此,如果代理不愿意或无法合作(可能是因为它根本没有收到信息),那么除非解决另一个分布式合作问题,弄清楚出了什么错的情况下,才能解决这个问题!如此这般,令人作呕。(人们开始看到信任中心化推送模型和独立监控系统的谬误。)

“承诺理论假设一个代理只能对其自身的行为做出承诺(因为它只能控制自己),这一点解决了信息分布所带来的问题,确保解决任何问题所需的信息和资源都是本地的且代理可以获取。通过这种方式,代理可以通过承担责任来自主地修复一个承诺。这就是代理的含义。

一个练习

尝试用承诺而不是欲望、要求、需求等来思考的能力。花一整天时间思考人们、地方、过程和事物所做的承诺:

  • 承诺是向谁做出的?
  • 承诺是以何种形式做出的?
  • 它们是否依赖于其他事物来帮助它们履行承诺?
  • 这些事物是如何尝试履行它们的承诺的?
  • 如何评估承诺是否成功?

不要错过任何事情:从的睡床(它让你背疼了吗?),到晨练计划(它会减少脂肪吗?),你吃的食物(它新鲜、美味吗?),你合作的人们(他们的角色是什么?),你生活的城市,一直到你一天结束时使用的牙刷。

如果你看不到任何承诺,试着问自己:这些事物的预期功能是什么?我与这些事物的关系是什么?我在它们身上看到了什么价值?最后,你添加了哪些额外的解释,这些并不属于你周围的承诺?金钱对你意味着生活方式、娱乐和未雨绸缪?

在一天结束时,你将更好地理解我们所说的世界中的语义和意图性,并且准备好用这种思维应对各种情况。

文章来源于互联网:【译】《Thinking in Promises》第一章 承诺和强加

赞(0)
未经允许不得转载:莱卡云 » 【译】《Thinking in Promises》第一章 承诺和强加