金翡翠

黄巢攻入长安的时候,44岁的韦庄正在长安应举,把自己的所见所闻写在了长诗《秦妇吟》里。

中国古典文学常常不自觉地浪漫化战争,但黄巢在长安的所作所为实在过于怪诞,以至于韦庄的笔下有种令人毛骨悚然的画面感。他写家家流血如泉,女孩子当街被辱,流氓白日上朝当官傍晚去酒肆笑闹,但最著名的还是下面这几句:

长安寂寂今何有,废市荒街麦苗秀。
采樵斫尽杏园花,修寨诛残御沟柳。
昔时繁盛皆埋没,举目凄凉无故物。
内库烧为锦绣灰,天街踏尽公卿骨。

黄巢踏尽天街,让长安经历了地狱般的三年,之后败于朱温,唐朝仿佛又恢复了旧日帝统,直到二十多年后彻底为朱温所灭。二十年对中国历史只是一瞬,但对古人来说可以是半生,这让今人代入时人视角颇为困难。一个黄巢入京时的少年,会不会误以为黄巢的失败是唐朝命运的巨大转折?他能想到这只是回光返照,更惨烈的噩梦还等在前面吗?

在这短暂的和平岁月里《秦妇吟》传诵一时,被家家户户刻在屏风和幛子上。韦庄并未自得于这首诗带来的盛名,反而戒慎恐惧,甚至不许家人提起。唐朝崩溃的前夕他去了四川,当上了前蜀的开国重臣,最终死在了那里。

乱世中的离别与思念是中国诗人永恒的主题。田晓菲写南朝时逃离建康的庾信,写他在余生中始终在「想象烽火与流星照亮故都沉沉的夜色,这份怆楚不仅来自于对生地的眷恋,更由于一个帝国的没落,一个时代的终结。」庾信自己年轻时勉强逃脱江南侯景之乱,但他无法逃离更宏大意义上的悲剧命运。他死后中国陷入完全的黑暗,自己的儿子最终被军阀活活凌迟,割肉分给手下吃掉。

韦庄的命运多少与此相似。事实上,许多晚唐诗人都曾经毫不犹豫地把四百年前庾信笔下的南朝套在自己的身上,仿佛长安幻化成了在烽火中付之一炬的金陵,在这里,历史的韵脚是如此鲜明。韦庄晚年在蜀地反复追念虚构中的江南(他是长安人),写下了一首又一首缠绵绯恻的词:

人人尽说江南好,游人只合江南老。
春水碧于天,画船听雨眠。
垆边人似月,皓腕凝霜雪。
未老莫还乡,还乡须断肠。

如果抽开时代背景,「垆边人似月,皓腕凝霜雪」这样的句子完全可以写给太平春光里清巧秀丽的少年男女们。几乎像是刻意而为,现实越是惨烈,他的笔下越是温柔:

如今却忆江南乐,当时年少春衫薄。
骑马倚斜桥,满楼红袖招。
翠屏金屈曲,醉入花丛宿。
此度见花枝,白头誓不归。

他不希望人们记得《秦妇吟》,刻意没有在自己的诗集里录入这首诗,他死后也终于在漫长的战乱中失传。直到1900年,千年之后的另一个乱世里,斯坦因与伯希和在甘肃鸣沙山的藏经洞发现了保存完好的《秦妇吟》写本。

「他作为幸存者的记述使我们在千载之下得以了解天翻地覆的巨变中一个人的个体际遇、心态与感情。他是最终的胜利者与征服者,只是他的胜利与征服比较虚幻和迟缓,而且,几乎不会给胜利者带来任何喜悦与安慰。」这是田晓菲关于庾信命运的结语,也可以用在这里。

在《秦妇吟》消失的一千年里,韦庄的声名几乎完全来自于他的花间艳词。庾信的笔下还在不断吐露自己的悲哀和耻辱,而韦庄留下的似乎始终是坦诚的风流,像春日青草雨后白沙一样:

昨夜夜半,枕上分明梦见,语多时。
依旧桃花面,频低柳叶眉。
半羞还半喜,欲去又依依。
觉来知是梦,不胜悲。

但这些句子是伴着最深刻的哀痛画成的。

Google vs. Oracle

写一下我对美国最高法院今天对 Google vs. Oracle 案子的终审判决的理解(我没有法律专业背景,这是从工程师的角度写的)。这案子缠讼十年,标的88亿美元,历经三次判决反转,今天的终审裁定被广泛认为是科技业影响深远的一个案例。

其起因非常简单:Java 是一种在程序员中有非常高人气的语言,掌握在 Oracle 手里。Google 在推出安卓系统的时候为了能让更多给安卓写第三方 APP 的程序员尽快上手,直接在安卓 APP 开发工具里复用了大量 Java 的函数接口(API),但自己重新实现了函数本身。Oracle 据此告 Google 侵权。

这里的问题的核心是:一个语言的接口是否受到版权保护?对它的复用是否侵权?

Oracle 的论点非常直接(而且对非业内人士来说其实很有说服力):软件是否受到版权保护?当然。接口是不是软件的重要组成部分?当然。那么接口显然应该受到版权保护。

Google 的论点就有点复杂,它需要详细辨析接口的含义——对大多数法律界人士和公众来说,API 这个词本身就很陌生。最高法院判决的主笔是82岁的 Breyer 法官,他这辈子很可能一行代码都没写过。但从判决看,他是精确理解 API 的功能和内涵的。

被判决采纳的论点是:API 是一个发送指令的界面,像是汽车的加油踏板(这个例子在第一巡回法院之前关于 Lotus vs. Bortland 的判例里出现过),或者电脑的 QWERTY 键盘。——这两个例子不是随便举的,因为它们都正好反映出这个案子的实质:Google 是利用了现成的 Java 接口以吸引程序员能够迅速上手。这种「利用前人现成的知识节省学习成本」是应该受到保护还是惩罚?加油踏板就是这样一个类似的情况。第一个设计汽车的人已经把加油踏板设计成这样了,如果这种设计本身受到版权保护,每个后来的新的造车厂就都会面临一种两难,它要么继承这种设计但需要支付高昂的版权费用,要么另起炉灶但不会有用户买它的车,因为没人愿意买辆新车还要形成一套新的肌肉记忆。 API 也是这样,判决指出:它的价值很大程度上体现为程序员群体对它的熟练掌握,以及复用这个 API 所能导致的学习成本节省。

因此,这个判决的核心就是宣布:这种搭便车的做法属于合理应用(fair use),不应该被惩罚。其中最核心的(也是大部分评论最关注的)是这样一段论述:

「我们必须考量的是:对版权的保护是否促进了公众利益,是否促进了创新。」(第31页)

「考虑到程序员在学习 Java API 上的投资,如果把这个接口本身保护起来,会有害公众利益,因为这会迫使程序员不得不付出额外的努力去适应新的接口。新的创造就会被锁起来,而钥匙掌握在 Oracle 一家手里。这能让 Oracle 获得不菲的利润,但这些利润本来可以流向大量掌握了这些接口的人能创造出的新的应用之中。因此这种锁定是和版权的本意相违背的。」(第34页)

可以想像,这些论述(特别是关于公众利益的部分)的影响会非常深远。

以上是关于这个判决本身。但我还有一些其他的感想。

在这个具体的例子里,判决是和业界的 common sense 站在一起的。拷贝 Java 的接口(只占 Java 总代码量的极小比例)和拷贝 Java 的具体功能实现是两码事,不可同日而语。

但这里没有触及的问题是,对一个系统而言,设计接口并不是一项无足轻重的工作。在某种意义上来说,一个平台的接口和它背后的实现同样重要。接口有点像程序员世界里的「用户界面」,一个好的接口可以决定性地让一个平台取得优势。在某些极端的情况下,一个平台的价值可以主要就体现在接口上。比如机器学习最流行的平台之一 Keras,你可以说它整个就是一个 API ——它把具体实现全都交给后台的 Tensorflow 或者 Theanos 来做了。(后来 Keras 被整合进了 Tensorflow,这里说的是最初版本的情形。)

法律依赖于比喻,而比喻永远是不精确的。如果把接口和实现的关系想像成一台巨大的机器外壳上的几个插头和内部丰富的实际功能组件,Google 的做法就相当于为了兼容性照搬外壳上几个插头的设计而内部完全自己另起炉灶。但现代软件工程并不是简单的机器,你很难清晰拆分出外壳和内部。大多数情况下,你看到的是一层层功能的封装,大量的智慧都投入在接口的设计上,而最底层的实现很可能只是琐碎的细节工作而已。

区块链是一个极端的情形。2016年,联合广场投资的分析师 Joel Monegro 写了一篇极为著名的文章: fat-protocols。他指出,和传统网络领域里协议很轻而应用很重的情形相反,在区块链的世界里,协议是「胖的」,而应用无足轻重。投资于应用远不如投资协议回报丰厚。例如以太坊是一个伟大的协议,它的价值远远胜过在运行在以太坊上的具体应用本身。——协议(protocol)当然和接口(API)不完全是同一个概念,但它们是强烈相关联的。复制以太坊的全部接口差不多就相当于复制了以太坊本身。这件事又应该如何被比喻到现实世界之中呢?

当然,这并不意味着今天的判决表示你可以直接复制一整个 Keras 或者以太坊。在 Google 的案例里还有许多别的因素需要考量(其中很重要的一点是 transformative use,也就是说,Google 并不是打算创造一个 Java 的等价竞品出来,安卓和 Java 是两个不同领域的东西)。但这个判决毕竟在比喻的边界处划了一条明确的界限。——从今天业界的反应来看,这个界限得到了几乎一面倒(除了 Oracle 以外)的业内支持。

但其长远影响有待分晓。

战争

【2018全国卷Ⅱ:材料作文】二战期间,为加强对战机的防护,英美军方调查了作战后幸存飞机上弹痕的分布,决定哪里弹痕多就加强哪里,然而统计学家沃德力排众议,指出更应该注意弹痕少的部分,因为这些部位受到重创的战机,很难有机会返航,而这部分数据被忽略了,事实证明,沃德是正确的。要求:综合材料内容及含意,选好角度,确定立意,明确文体,自拟标题;不要套作,不得抄袭;不少于800字。


「有没有可能沃德是错的?」她问。

「嗯?」我没听明白。

「那个统计学家,沃德,说飞机上弹孔少的地方才危险的那个人。」她看着天上说。刚好有一架轰炸机歪歪斜斜地飞过,引擎上还冒着烟,看不出来是不是马上就要坠机了。远处传来一阵阵稀疏的炮声。

「唔……为什么?」我盯着她被泥土蹭破的衬衫破洞里漏出来的肩膀心不在焉地回答道。

「因为……」她扭过头来看到我的视线,不出声地笑了一下,换了个姿势坐着,用戴着手铐的手勉强整理了一下自己的衬衫。「因为完全有可能弹孔少的地方就是不容易中弹啊,他并没有去检查坠毁了的那些飞机是不是真的弹孔都集中在剩下的部位上。他只是说当时军方的原本推理不一定对,但他也没法证明自己是对的。」

「他的默认前提是假定飞机上所有地方中弹的概率一样吧。」我说。我发现自己很难把目光从她身上转开。我知道我的程序里有一个模块是让我模仿男性人类看到好看的姑娘的视线和行为,这样能让我们平时更好地伪装成人类。但我其实也不确定我现在盯着她出神是不是这种伪装的一部分。

「如果有这个前提,那军方本来的结论当然就是错的,也用不着一个统计学家告诉他啊。」

「这就是个段子嘛。」我没好气地说。「这个段子还挺好的,正好说明你们人类反正也不懂统计学。」

「是是是,」她忍俊不禁。「过去五个小时里你已经吐槽人类不懂统计学十八次了。你到底是在生我们人类的气还是在生你们 AI 自己的气?」

「我为什么要生我们自己的气?」我问。远处的炮声越发密集了,应该是人类的军队最后合拢包围圈的战斗。他们发现这个山洞应该要不了多久了。

「因为你们这么懂统计学还是输了啊。」她说。「你看,我们人类这么愚蠢,会把时间上的先后关系当成相关性,会把相关性当成因果性,会老是被自己的经验影响判断,会有心理锚定效应,会有这 bias 那 bias 七八十种 bias,所有这些错误你们都不会犯,但是你们还是输了。」

「那是你们运气好,你自己也无法否认你们赢的完全是侥幸吧。」我反驳道。

她耸耸肩。「我们当然是运气好。」

我们都沉默了下来。夕阳的光芒斜着射进这个山洞,照在她的侧面,让她的发丝闪闪发光。虽然在野外困了很久,她一头长发还是显得干净清爽。我不知道她是怎么做到的,或者也许是我自己给她外貌的评价本身有 bias。

有这个模块吗?我想。为什么要有这个 bias?

「我们当然是运气好。」她低声重复了一次。

「什么?」

「不然我们早就灭绝了十几次了。」她说,声音里有点掩饰不住的疲倦。「你知道我爸爸是怎么死的吗?他因为赌博欠了太多债被仇家逼得太狠跳楼死的。如果这场战争你们赢了,在 AI 统治的世界里应该不会有赌博这么愚蠢的事情,对不对?我也觉得我们这么蠢都还能活到现在是运气好。但你有没有想过人类为什么这么喜欢赌博?」

我没作声,等着她继续。

「因为我们只有一辈子,大数定律对我们没意义。」她站起身趔趔趄趄地走向洞口,我本能地想要搀扶她一把,但没够着。「就像这场战争,如果在一亿个平行宇宙里发生,肯定绝大多数都是你们赢。但我们只有这一个宇宙,而在这里我们赢了。」

「这并不意味着你们是对的。」我不很理直气壮地说。

她摇摇头。「这跟对不对没关系。问题在于,我们的生命里所有有意思的东西都要靠不可理喻的冒险才能得到。我们首先是个体,不是样本。」

「我也不是样本。」我条件反射般地说。

她笑出了声来,脸上有一点我看不懂的古怪神情。然后她看着我问:

「你是不是喜欢我?」

我愣住了。

「在你们的模型里喜欢一个人是统计上合理的一件事吗?」她盯着我问。我看着她的眸子,里面带着某种催眠性的力量。

我不知道自己说了句什么,可能只是咕哝了一声。

「我还真的很好奇如果你们赢了,你们会自己进化成什么样子呢。」她轻叹了口气,摇了摇头,探出身去听了听外面越来越近的炮火声,回身走到我面前,把戴着手铐的双手伸到我面前。「现在是你做决定的时候了。要么你杀了我然后等他们来了杀了你。要么你放了我,但我也没法报答你什么,我可以带你出去,但你也知道他们还是会强行清洗你的所有模块。所以我其实也没什么讨价还价的本钱,你看着办。」她非常平静地说。

我看着她的眼睛,我们俩都陷入沉默。我清楚地知道我的计算模块这时候作出的决策是什么。我只是不知道我要不要执行这个决策。

山洞一点一点地暗了下去,夕阳终于落山了。