Posts archived in Cool Stuff

在以前的文章中我介绍过囚徒困境,并且介绍了 Tit for Tat 策略,这种策略可以在多轮囚徒困境中不至于受益太差。那么,假如囚徒困境的游戏只有一轮呢? 有什么好的方法可以达到左上角那个双赢状态而不是左下角那个对两者都不是最优的状态呢?

囚徒困境是一个纯博弈论的模型,这个模型里面的赋值就直接决定了想要最大化自己利益的局中人必然会陷入困境,这是模型无法避免的。 所以想要跳出这个困境,只能靠博弈论之外的手段。 所幸的是,我们人类早就发现了这两种方法,并且都在实践中尝试过了这样两种方法。 第一种方法可以看成是直接的斩草除根法,即直接剥夺两个局中人选择“不合作”这个选项的自由,让他们都只有一个合作的选项。 这种政治学方法的优缺点在此我们不做讨论,我们关心的是第二种方法,一种经济学的方法–通过改变游戏受益矩阵,在新的游戏中,让局中人偏好合作。 在宏观经济的实践中,第二种的一般实现方法则是通过道德和法律手段对选择不合作的进行惩罚,对选择合作的实施奖励,以期改变整个收益矩阵,让这个收益矩阵不再满足囚徒困境的条件。 因为道德手段不确定太多,我们只考虑现代社会的最普遍手段,即法律手段。 具体来说,就是让局中人构建合同,并通过合同法等立法手段保护这个合同的实行,从而改变收益矩阵。

从博弈论的角度理解合同的话,通过订立合同,规定合同和法律效力,调控局中人不合作所获得的收益,使得局中人不再偏好”不守约定”选项。 具体的做法也很简单,估计聪明的各位早就想到了:

假定双方都选择合作则收益为 a, 而甲方合作,乙方背叛的时候,甲的收益是 b, 而乙的收益是 c。 按照我们的囚徒困境假设,背叛的收益 c 要大于合作的收益 a, 这样乙才会偏好背叛。 现在我们假设甲乙事先签订一个合同,规定背叛的一方要向合作(没有背叛)的一方支付损失。 我们假设这个值为 r。 显然的,现在乙背叛之后的收益就变成了 c-r, 而 甲合作的收益就是 b+r。 对于乙来说,我们的目的是要让他偏好合作,所以我们一定要让 a 大于等于 c-r。 最极限的情况就是 a = c-r, 于是, r = c-a。 这样, 乙的收益变成了 a, 而甲的收益变成了 b+c-a, 乙即使背叛也占不到好处,而甲也收到了合作的回报。

当然我这里说的是一个简化的模型。 不同的司法实践可能会取不同的 r 值,但是法的精神都是一样的,法律本身不限制你的选择,只是通过合理的奖励和惩罚,让理性的人自然的做出符合自己利益的选择。

从经济学角度来说,人类社会的运行中必然会有这样那样的博弈,尤其是市场经济发达的现代社会,可以说博弈无处不在, 而避免如囚徒困境这样的博弈情景也是社会效率所必须的。 如果单纯地剥夺局中人的选择权,通过”下一盘很大的棋”的方式去掉博弈选项,逃避囚徒困境, 那么局中人就可能不能完成充分博弈,利益得不到最大化。 而事实也证明, 这种方法在实践中效率不够高,因为人类社会运行这盘旗完全复杂到任何人都不能全盘掌控, 而且很容易就造成哈耶克说的”通向奴役之路”。 而法律为我们提供了另一种截然不同的思路,即仍然保持博弈,但调控收益矩阵,这样,仍然保证了合同双方的博弈选择自由。 在合同法和自由的关系的阐述上, 西方学者马克思韦伯曾经说过一段著名的话: “规范合同双方的那些法律的发展,以及在规范的框架下允许自由意志的法律的充分发展,往往被视为个人自由发展的标志[1]“。  通过对囚徒困境的解决方法和韦伯的这句话,应该不难理解为什么市场经济发达的国家恰好就法律制度健全,且恰好有较多的个人自由。

—-

[1] 这个自由具体来说叫做 Freedom of Contract, 有兴趣的读者可以阅读  “Max Weber on Law in Economy and Society”

A People’s History of the Supreme Court 这本书很有意思,虽然是讲美国最高法院的历史的,却在前7章全是讲美国宪法的制定里的各种曲折和争议,读起来让人唏嘘不已,在读书过程中零散的做了一些笔记,如下:

1776 年独立宣言发表后, 美国一直和英国打独立战争,一直打到 1783 年和英国在巴黎签订和和平协议,才算真的建立了和平的国家。这场仗打完以后,老兵和军官居然都回家了,没有一个人跑出来说自己打下的江山自己坐。

在这场独立战争过程中,十三个殖民地在1781年通过了 The Articles of Confederation, 组建了一个松散的中央政府,这个中央政府除了管理军队和发行货币外,什么权力也没有,连中央政府的财政经费,都要州捐助。

这样一个中央政府在处理州的事物上十分没有权力。当时有几个州为了边界上的一些河流的归属闹得不可开交,而中央政府居然没有足够的权力去协调。不少国父看到这种现象,决定组建一个强有力的中央政府,也就是美利坚合众国联邦政府,这帮人,被称为联邦党人。

联邦党人组建中央政府的努力,落实在行动上,就是1787年的费城制宪会议。 来自12 个殖民地的代表在费城的某个楼里面,天天吵架,几乎把宪法的每个条文都辩论了一次,最后才有了美国宪法。

1787 年的这场吵架,被 James Madison 翔实的记载下来了,书店里可以买到全书,也可以在网上看到当时吵架的内容, 比如 http://teachingamericanhistory.org/convention/debates/ 美国的历史虽然短,但是文书都透明公开,很方便历史研究。

这些吵架中间的妥协很有意思,举两个例子: 1, 南方的州拥有较多的奴隶,就想把这些奴隶算上充数,这样在国会就有更大的代表权; 北方的州不同意,认为你南方把奴隶当物品,那就和牛,马宠物没区别,不能算人;你想算人头,他们就是自由民,不算财产。 南方一方面不承认奴隶的公民权力,一方面有把他们当人算代表,在逻辑上非常不自恰; 但是如果不承认奴隶代表权,南方估计也不会通过宪法,所以,最后两方面各让一步,每个奴隶算 3/5 的代表。这就是美国宪法上著名的 3/5 人的由来。 2, 小州和大州之间妥协。 小州怕自己代表太少,利益被侵犯;大州认为自己人多,就该代表多; 妥协的结果是在上院各自两个代表,下院按人口。 又有代表认为自己州人口增长迅速,要求更多席位,所以最后宪法加一条修正案: 每十年人口普查一次。 虽然这条修正案没有获得通过,但是已成为联邦政府标准实践 (我以前的文章里也讲过这个简单的一个条文,是怎样催生了 IBM 的)。

有一些历史学家认为当年美国这些国父制宪的动机是一个强有力的中央政府对于他们的个人利益有益。 这些人的不同的个人利益交织到一起,就形成了针锋相对的观点。 这些观点和利益通过制宪会议得到了均衡。因为各种意见得到表达,所以宪法达到了近乎完美。 当时已经在轮椅上的本杰明 富兰克林在立宪会议闭幕的时候动情的说: 我承认我不同意这个宪法的很多部分,但我不确定我是否应该永远不同意这些部分… 先生们, 我同意这个宪法,包括它的所有可能错误。 我也怀疑任何一个其他的”立宪会议”,能制定出一部更好的《宪法》… 我发现这个宪法竟能这样接近完美, 甚至能使我们的敌人也感到惊奇。

即使参与宪法制定的一些代表,最后也有几个拒绝在宪法上签字,因为他们觉得对宪法不满意。 而对宪法不满意的一位叫 Edmund Randolph 的代表,也是弗吉尼亚州的州长,最后却真诚的建议只要宪法在 9 个殖民地公投获得通过就算生效,丝毫不计较一定要自己的州通过。

立宪会议的代表提到了很多提案,这些提案在细节上有很大的不同,但是所有的人都支持三权分立,支持一个独立的联邦最高司法机构,也就是最高法院。 宪法中关于最高法院拥有违宪审查权力的条款是极少几条没有任何反对意见一致通过的,可见这些立宪者对于独立司法制度的重要性认识深刻。 其实这也和代表的背景有关,这些国父,基本都不是什么所谓的”秘书”、”秀才”,而是专业的律师。

华盛顿总统在做了两届总统之后,认为长期霸占总统颇为无趣,因此退位让贤,开创了总统连任不超过两届的不成文范例,美国政府的权力交接从一开始就成为了范例。 华盛顿之后是亚当斯,也是联邦党人; 亚当斯之后就是著名的托马斯杰弗逊,是反联邦党人。 杰弗逊当选总统,是一件非常重要的事件,这是人类历史上第一次以权力以民主的方式完成和平交接。

托马斯杰弗逊在没做总统前,一直大喊权力法案,支持最高法院的独立司法,可是他当上总统第一天就遇到了一件神奇的案子。 这个神奇的案子是这样的,话说亚当斯当总统的最后几天,知道自己离下台不远了,就和联邦党人控制的国会一起通过了一个法令,临时成立了很多联邦地方法院,临时任命了一堆联邦党人做法官。 这个事情他们没做好,有一个叫做 Marbury 的法官的委任书他们前一天忘了发了。 等到杰弗逊第二天上台,江山变了,杰弗逊就让他的手下 Madison 不发委任状。 这下 Marbury 就当不了官了,于是,火了, 就把不给发委任状的,日后是美国第四任总统的 Madison 给告上了。 这个案子就闹到了最高法院。 最高法院的判决一共三条, 前两条是让托马斯杰弗逊不高兴的,因为这个判决直接指明总统没有权力不发委任书。 最后一条是看上去最八杆子打不着但是最重要的: 最高法院在应用某项法令的时候,居然发现这个法令违反了宪法,于是很牛逼的把几年前联邦党人通过的一项法令以违反宪法为由给废止了! 是的,这就是美国最高法院历史上最早的一起著名判例,即 Marbury vs. Madison. 在这个著名的判例中,最高法院的大法官 Marshall 说:”判定什么是法律是断然属于司法部门的权限和职责”, 这句话,被刻在美国最高法院的墙上。 这个事件,是人类历史上第一次由司法机关提到”违宪审查” 这个概念。

从杰弗逊起草独立宣言,到杰弗逊当选总统并买了路易斯安娜,经过无数的妥协,争吵和辩论,大大小小的战争和利益较量,美利坚合众国强力的中央政府已经构建完毕,三权分立的架构也已经初具雏形,制约和均衡让政府失去了对人民作恶的力量, 两党之间权力的民主交接也顺利完成。民有,民治,民享的国家在北美大陆初步建立完毕,美利坚建国大业至此大致完成。

14 comments

八月所读书目

编程

Software Tools in Pascal

是 Software Tools 的 Pascal 版本,除了编程语言不一样以外,其他都一样

UNIX for FORTRAN Programmers

工作可能需要, 每天翻几页

Artificial intelligence with Common Lisp: fundamentals of symbolic and numeric processing

为了写最近的几篇番外篇,把这本书从头到尾翻了一遍。

The Art of UNIX programming 第2遍

好书,值得每年读一遍

开始读但是还没看完的


TAOCP Vol4 F1, Binary Decision Diagram

想研究一下 BDD, Knuth 大神的风趣和平实依旧。

Submodular Functions and Optimization

作研究用的

其他看得差不多的闲书

A People’s History of the Supreme Court

一本讲最高法院和美国历史的书,角度非常接近群众,而不是帝王将相传,很推荐。

Everyday American History

一本搞笑的讲美国历史的书,搞笑之余学到了很多以前不知道的美国历史。 和上面的书对照着看,对于美国早期历史更加明白了。

Understanding Human Communication

一本大学教科书,旧书摊上几毛钱淘的。 看了之后对人际交往和对话的理解立即上了一个台阶,很推荐给自认为“情商”不高的老师们。 我看了之后说话就觉得有方法多了。

Games People Play: The Psychology of Human Relationships

也是旧书摊上淘宝淘到的,是一本 60 年代的畅销书,算是我之前提到的 Freud 和 Jung 的精神分析的后续作品,据说是当时很划时代的作品。

The Seven Principles for Making Marriage Work: A Practical Guide from the Country’s Foremost Relationship Expert

也是旧书摊上的。 要结婚的人了,看看这个估计对将来有好处。

(“高级语言怎么来的“ 系列仍然有后续,这篇是临时插入)

程序员心底的小声音

编程大约有三个境界,新手,高手,和高不成低不就的中手。这三个境界,大致和王国维先生划定的做学问的三个境界一一对应。 一般来说,如果不经过几十万行的代码的锤炼(衣带渐宽终不悔,为伊消得人憔悴),或者长期在一个高手团队里面打磨切磋,那么无论怎么样的理论熟悉,打字熟练,考试全A,编程起来,都应该算是中手。一个中手如果机缘很好,得到高人亲自指点,则能很快成长为高手,如果没有这样的机缘,那就要在“众里寻她千百度”这个层次苦苦的求索锤炼很久,才能“蓦然回首”。

读书是一种很好弥补没有高手在场的方法,都说书是最好的老师嘛。 可是现实是,高手写给中手的书很少。 在任何行业,适合新手的入门的书很多,适合中手的书就很少。 原因有两个,一来高手极少愿意耐心的的指点成长秘诀,就算写了,也是蜻蜓点水,因为这些经验啊结论啊,都被他们本身提炼成了珠玑,他们觉得最重要的也就是这么寥寥几句,也没有太多的废话好写。 而读者如果没有类似的经历,则看到这些珠玑,只是觉得把玩颇为有趣而已,极少能有同感。 鲜有高手,能把技术书写成散文集,如 Brooks 一样,在《人月神话》中把经验教训和经历背景等一一道来,并且从这些经历中抽出一般性的知识。 所以,高手的风格一般是浮光掠影概括一下大致自己领会到的几个原则和教训。 这些寥寥数语的珠玑,对于其他高手来说一看就懂,但是对于中手来说就很难以理解。 所以很多高手写出来的给中手看的书就曲高和寡。 二来,中手其实水平差异巨大,偏好也各不一样,有的或许根本认识不到自己应该走的成长轨迹,有的认为这些书籍是片面知识,所以把不喜欢的书都给扔垃圾堆了,光捡自己喜欢的书看;有的未必看得上高手的经验,认为高手说的那些自己也早就领悟到了。所以,也不喜欢购买这些书籍。这两个原因,就造成了高手提携中手的书在市场上很少见到。

不过这样的书倒不是没有,比方说在编程领域, 我至少可以推荐四本这类的书,这四本分别是
《Pragmatic Programmer》, 《The Art of UNIX Programming》, 《Elements of Programming Style》 和 《The Productive Programmer》. 这四本书,都是高手所写,都属于高手指导中手的典范。第二第三本我原先都介绍过。 而第四本余晟同学的书评比我写得好几百倍,所以我就以 《Pragmatic Programmer》 为例说明这个问题。

我们前面说了,对于中手,特别是在“寻她千百度”这个层次的中手来说,或许本身已经捡到了一些珠玑,或许对于像 《Pragmatic Programmer》 里面说的那些 Tip,有的是深有同感的。 比如 DRY (Don’t Repeat Yourself 不要重复你自己), 基本上大家都知道,可是在实际中(至少我自己)还是不停的一次一次的犯错误,做事情不符合 DRY 原则(一次一次犯这个错误本身也是一个 DRY 错误, 因为 DRY 原则要求你对于每种错误你只能犯一次)。 读到的时候深有同感, 写代码的时候却忘到 Java 国去了,这还真不是个案,是非常普遍的现象。

能不能让正确的原则指挥正确的行动本身,其实就是区分是否是高手的一个显著标志。 试想,两个都了解 KISS 原则的程序员在一起写代码,高手的代码必然是自然流露出 KISS 的优雅,而中手或许需要旁人提醒和多次重构,才能达到理想的状态。 出现这个问题的原因很明显–中手没有完全内化 KISS 原则,所以尚且不能“运用自如”。 内化是一个非常复杂的认知过程,本身涉及到大脑中 mind set 和 paradigm 的切换, 所以必然不是一个简单的隔夜就能完成的过程,这也就是为啥能够“消得人憔悴”,但是切换一旦完成,实践中就会自然流露出这种新的认识,也就是到了一个新的境界,发现灯火阑珊处。

那么原则和知识的内化这个过程怎么能够加速呢?也就是说,怎么较快的到达高手境界呢? 可以肯定的说,光靠对自己说我“下次一定按照这个原则这样做”是不行的。认知科学认为,频繁的高强度的外部刺激和自主的有意识的反复提醒是加速内化的两个重要方法。 第一个方法需要外部环境的支撑。 试想,如果一个程序员不是天天和复杂文本处理打交道,他必然没有足够外部刺激来熟悉和内化正则表达式; 如果一个程序员不是天天和极度复杂的大项目打交道,用全自动编译环境和自动单元测试也显得无甚必要,所以,除非你正好掉进了一个天天有高强度训练的环境,否则全靠第一点是不可能的。 尤其是自学一门语言和一门技术的程序员,往往在没有高强度训练之前就拿着这些技能投入工作了,因此想成为某方面的高手,只能采取第二条路,就是有意识的强化实践和反复提醒。

《圣经》里有个故事,说一个人在沙漠里,信心丧失的时候,突然听到 “A Still Small Voice” (平静的小声音), 即上帝的启示。这个平静的小声音把他从绝望中拉了回来。 其实对于这个人来说,他本身的实践能力在 “平静的小声音” 出现前后并没有多大的改变,唯一的不同就是他知道该怎么做了。

内化一个知识或者认识的时候所循的路径也是一样的。 我们常常会“忘了”应该怎么正确的做一件事情(这个地方的“忘了”,指我们之前从书中或者其他渠道读到看到了正确的原则或方法,但是在那一刻脑子里压根没考虑这个原则或方法,因为这个原则或方法压根没有亲自实践过,所以根本不是自己的一部分,不属于自己)。 在这个时候, 如果突然有一个平静的小声音跳出来,说,“嘿,你是不是该遵循这个原则,用这个方法?” 无需说,我们对问题的思考就能顿时全面起来, 也会更加深刻的理解原先读到看到的不属于自己的原则和方法。当然,我们更加感兴趣的是,如何能够在身边没有高手和上帝发出这样的平静的小声音的时候,自己发出这样的小声音?

怎么靠自己呢,记得鲁迅小朋友破坏公物在课桌上刻的“早”么?是的,我们需要抽象出一些简单的词句和规则,靠记忆和不断的提醒,小规模的内化这些小声音,让这些简单的小声音能够时刻从大脑里跳到耳边,提醒自己。 具体来说,在阅读上面的几本书,尤其是阅读 《Pragmatic Programmer》 的时候,如果仅仅是以普通的浏览的方式阅读,就会很简单的陷入 “啊,这个我知道了,啊,那个我了解了,恩,这个以后要注意” 的套路中。 这样的阅读方式,只会强化原有的自己已经知道的部分,而不大可能把“以后要注意” 这部分全部内化。所以,自负的读者读完了之后必然觉得“哈哈,高手不过如此,大部分我也知道嘛”,而不是“是的,我还有不少要注意”。 这两个态度,就把高手和易于满足的中手永恒的隔开了。 我觉得,想要内化这些小声音,还是要靠实践,如果不实践,即使你把这些小声音写在 100 块钱的高档笔记本上也没有用。我个人觉得,理想的阅读状态应该是先大致理解和记住里面的 Tip, 然后每周争取实践 2-3 个 Tip。其实如此做完一圈也就是半年,在这一圈之后就会记住所有的 Tip 的内容,这时候,小声音就成了自己的一部分了。然后在剩下的几年里,只要时时有这些小声音挑出来,告诉你,“要自动频繁的测试”,或者“别手动做繁琐的工作”,你会很快的被强迫转换到高效而优雅的工作状态。 到了那个时候,这些小声音就再也不会跳出来了,因为你早就自然的遵守这些小声音的要求了。

《Pragmatic Programmer》 和 《The Elements of Programming Style》 这些书里面的 Tip 都不是来自上帝的话语,却都是值得随声带着的小声音。 其实只要是处理过实际问题,编过几万行程序,大多程序员都差不多都会有或深刻或浅显的对各个 Tip 都感悟,而且我相信或许对有些 Tip 的认识能比原书的作者还要深刻,这是很正常的。 事实上每一个 Tip 只是一句话而已,对这一句话的理解层次, 则完全不这一句话能够覆盖的。 比如说,一天写了两个 Hello Word 的程序员也会领悟到 DRY, 一个刚刚重构扔掉掉几千行重复代码的程序员也领悟到 DRY, 而这两个 DRY 所在的认识层面, 必然是不一样的。 再好比说我在“编程珠玑番外篇”这个系列里面写的有些文字,看上去很有道理,但我本人对这些文字的认识可能比我的读者要浅, 但是这倒不妨碍引发读者思考。 即使有些牛人觉得上面这几本书的作者在某些原则上的认识不够深刻,或者觉得作者只是在罗列一些小碎片,读这些书,特别是 《Pragmatic Programmer》 这本书的那些小 Tip,依然是有益的, 因为他或许能触发你高于作者的思考,然后在你脑中形成更加圆润的珠玑。而对于像我这样属于中手下游平时又没有大项目训练的人,《Pragmatic Programmer》 这本书,和其他的几本书一起, 实在是很好的“小声音汇编”。

技术类:

Bruce J. Maclennan: Principles of Programming Languages: Design, Evaluation, and Implementation

讲了高级语言的历史,设计沿革。是写作编程珠玑番外篇的极好参考材料。

Dale Dougherty, Arnold Robbins: sed and awk and Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger:  The awk book

天天要数据处理,所以系统的学习了一下 sed 和 awk.


非技术类

Letters to a Young Mathematician

类似于 Advice for a Young Investigator, 都是教年轻人怎么做科学研究的书。

China Road

这本书包含的内容很多,看了几遍。看得越多,越是感慨。我之前说过,再也不再博客上对贵国的事情发表任何看法,所以,就不写书评了。书中提到了一个人,我觉得值得提一下。 这个人叫做胡佳,在作者写作的那年,还冒着很大的危险,辛辛苦苦的救助和关心河南的艾滋病患者,时过境迁,他现如今却身在牢狱,老婆孩子全家几乎被软禁和监视,这就是现实。

Carl Jung: Psychology and Religion

Jung 可以称得上是精神分析之父, 也是心理人格测试发明人。这本从心理学看宗教的小册子帮助我厘清了很多以前不明白的宗教心理现象。越是了解宗教心理,越是害怕和有“信仰”没逻辑的人辩论。此外,这本书读起来非常舒服。

J.K. Rowling: Harry Potter and the Sorcerer’s Stone

我是个超级没文化的人,现在才开始看第一本。写得果然很好,我以前很鄙视这类奇幻小说的,现在读来,饶有趣味。

下月争取读完 The Elements of ProgrammingIn Defense of American Liberties: A History of the ACLU 两本书,并且读 Harry Potter 第二本。