潮州商人
潮州商人
一
林默在凌晨三点十七分发现了那个注释。
不是普通的注释。他维护的这个系统叫”天穹”,是一个为潮汕地区三十七家村镇银行提供清算服务的中间件平台,代码库的历史可以追溯到2009年。那时候还没有云原生这个概念,架构师用的是Java 6和XML配置,后来几代人在这座代码的山丘上层层叠叠地搭建,像潮汕的老房子——骑楼上面加盖骑楼,水泥糊住红砖,铝合金窗框嵌进雕花木窗棂。
林默的工作是夜间值守。准确地说,他的职位叫”运维工程师”,但他自己知道,这个职位的真正含义是”替罪羊”。天穹系统每天处理着大约四十亿人民币的清算流水,任何一个数字出错,监管的电话会在十分钟之内打过来。而凌晨三点到五点,是日终批处理的窗口期,也是最容易出问题的时候。
他本来只是在排查一个对账差异。潮安农商行有一笔三千二百元的交易在轧差时丢失了,金额不大,但系统不允许任何差异存在。他顺着交易流水号往回追,从一个数据库表追到另一个数据库表,从一个微服务追到另一个微服务,最终追到了一段被人注释掉的代码。
那段代码藏在清算引擎的底层,一个叫SettlementCore.java的文件里,第三千四百一十二行。注释的格式很老式,用的是Javadoc风格,但内容不是给程序员看的:
/**
* 2012年3月15日,潮汕将有大雨。
* 那个叫陈素珍的女人会在雨天出现在老城区的骑楼下,
* 她手里拿着一把透明雨伞,伞柄上刻着"林"字。
* 你会认出她。
* 不要让她走进那家叫"荣发"的茶行。
* ——致未来的我
*/
林默盯着这段注释看了很久。
他叫林默。他爷爷是潮州人。他确实有一个从未见过的奶奶,名字叫陈素珍。
但他从未对任何人提起过这些。这段代码写在2012年。那一年他十五岁,还在湖南的一个小镇上读初中,根本不知道什么潮汕什么清算系统。写代码的人不可能知道他。
他把这段注释复制到了自己的私人笔记里,然后继续排查对账差异。最终他发现是网络抖动导致的一条消息丢失,补上数据,批处理继续跑。
但他整晚没有睡着。
二
第二天是周六。林默住在汕头龙湖区的一个老小区里,房租一千二,楼下有一家牛肉火锅店,常年飘着沙茶酱的味道。他起得很晚,快到中午才出门,去附近的一家潮汕小吃店吃了一碗粿条。
然后他鬼使神差地坐上了公交车,去了老城区。
汕头的老城区是一种奇异的景观。民国时期的骑楼沿着安平路一路排开,灰白的墙面上爬满了电线和空调外机,底下的商铺卖着一切:茶叶、药材、五金、手机壳、廉价首饰。骑楼的拱券上依稀能看到当年的彩绘,褪色到只剩下轮廓,像是一张过度曝光的老照片。
天上确实在下雨。
不是大雨,是那种潮汕特有的细雨,湿漉漉的,像空气本身在出汗。林默没有带伞,他站在一家已经关门的绸布店骑楼下,看着雨水沿着拱券的边缘滴下来,在地面上砸出一个又一个的小坑。
然后他看见了她。
一个女人从雨里走过来,大约五十多岁,穿着一件灰蓝色的棉布外套,头发花白但梳得整齐。她手里拿着一把透明雨伞,伞柄是木质的,上面刻着一个字。
雨太大,他看不清刻的是什么字。
女人走到骑楼下,收起雨伞,甩了甩水,抬头看了一眼骑楼上的门牌号。她的目光扫过林默,没有停留,继续往前走。
林默跟上了她。
他自己也不知道为什么。也许是因为那个注释,也许是因为雨天,也许是因为他在这个城市住了两年却从未真正看过它。女人走得很快,穿过骑楼的柱廊,在一条窄巷子里拐了弯。巷子很深,两边是贴满了小广告的墙壁,地上铺着凹凸不平的石板,雨水汇成小溪往低处流。
巷子尽头是一家茶行,招牌上写着”荣发茶行”四个金字。
女人正要推门进去。
林默几乎是下意识地开口:“陈阿姨。”
女人停住了。她转过头来,看着林默,眼睛里带着一种奇怪的平静,好像她一直在等这一刻。
“你是谁?“她问。
“我姓林,“他说,“林默。”
陈素珍的表情没有变化,但她握着伞柄的手指收紧了。她看了一眼茶行的招牌,又看了一眼林默,然后做了一个让林默完全没有预料到的动作——她转身离开了。
没有进茶行。没有说话。只是走了。
林默站在巷子里,雨水打在他脸上,他看着那个灰蓝色的背影消失在巷口的光亮处。然后他听见身后传来一个声音:“进来坐坐吧。”
荣发茶行的门不知道什么时候开了,一个穿白色老头衫的老头站在门口,手里端着一个盖碗,笑眯眯地看着他。
“你姓林?“老头问。
“是。”
“进来。我给你泡茶。“
三
老头叫方荣发,七十三岁,荣发茶行的老板。茶行不大,一进门就是一张巨大的茶台,酸枝木的,上面摆满了各种茶具。墙上挂着几幅字画,都有些年头了,纸面发黄。最里面有一扇门,通向后面的仓库,门半掩着,能看到里面堆满了用竹箬包着的茶饼。
方荣发泡的是单丛,鸭屎香。第一泡倒掉,第二泡递给林默。茶汤金黄,入口有一股浓郁的花果香,然后是持久的回甘。
“好茶,“林默说。
“当然好茶,“方荣发得意地笑了,“这是我九十年代存的,那时候凤凰山上的老茶树还没有被过度采摘。现在?现在都是些急功近利的东西,催出来的茶叶,没有灵魂。”
他给林默续了一杯,然后问:“你怎么知道她姓陈?”
林默犹豫了一下。他不知道该怎么解释一段藏在清算系统代码里的预言式注释。最后他选择了一个最简单的说法:“我爷爷提起过她。”
“你爷爷是谁?”
“林……林国栋。”
方荣发的手停住了。他端着盖碗,茶水微微晃动,然后他很慢很慢地把盖碗放回了茶台上。
“林国栋的儿子,“他说,语气变了,不再是那种潮汕老人特有的随意和热情,变得很轻,很小心,像是在触碰一件易碎的东西,“去了湖南?”
“是。”
“然后生了你。”
“是。”
方荣发沉默了很久。外面还在下雨,雨水从骑楼的檐角滴下来,滴在茶行门口的石阶上,发出细碎的声响。茶台上的电水壶自动跳闸了,发出”咔嗒”一声。
“你爷爷当年是潮汕最聪明的人,“方荣发终于开口了,“不是最有钱的,是最聪明的。他八几年就开始做电子产品生意,从深圳进货,在汕头卖。那时候汕头还是特区,遍地是黄金。但他不满足。他想要更大的东西。”
“什么东西?”
“信息。“方荣发说,“他想要提前知道未来。”
林默等着他说下去。
“九五年的时候,你爷爷通过一个香港的朋友,接触到了一种技术。那时候个人电脑才刚开始普及,互联网还很原始。但那个香港人告诉他,有一种新的算法,可以分析经济数据,预测市场走势。你爷爷花了大价钱买下了那个算法,然后请了一帮大学生来实现它。”
“那是什么算法?”
“我不知道细节,“方荣发摇头,“我只知道你爷爷用那个算法赚了很多钱。亚洲金融风暴的时候,别人都在亏钱,他在赚钱。九八年他在汕头买了三栋楼。两千年的时候,他的资产已经过亿了。”
“然后呢?”
“然后他犯了两个错误。“方荣发的声音变得更低了,“第一个错误是,他开始相信算法能预测一切,不只是市场,还有人心。第二个错误是,他爱上了陈素珍。”
茶凉了。方荣发重新烧了一壶水,换了茶叶,这次泡的是老丛水仙,茶汤更深,味道更沉。
“陈素珍当时是汕头大学数学系的学生,被你爷爷招去优化算法。她是天才,真正的天才。你爷爷原来的算法只是一个粗糙的统计模型,陈素珍把它改造成了一个——我不知道该怎么说——一个接近于预言的东西。”
“预言?”
“你不信?“方荣发看着他,“你今天为什么会来到这条巷子?”
林默无法回答。
“陈素珍改造后的算法,不仅能预测市场走势,还能预测特定的人在不同条件下会做出的选择。你爷爷用它来做生意,几乎是百战百胜。但他不知道的是,陈素珍在算法里留了一个后门。”
“什么后门?”
“她让算法生成了一种特殊的输出——不是市场预测,而是一系列写给特定的人的信息。这些信息被编码成普通的数据格式,藏在各种系统里面。电子邮件的元数据、银行的清算记录、手机基站的日志——任何能存储数字的地方。”
方荣发指了指头顶:“包括你正在维护的那个清算系统。”
林默的脊背发凉。他想起了那段注释,那些精确到不可思议的细节——日期、地点、雨伞上的字。
“这些信息的目的是什么?“他问。
“这个,“方荣发说,“你得问陈素珍自己。但她在2014年就消失了。你爷爷也在那一年去世。茶行本来是他开的,他死后留给了我。这间铺子,这些茶,还有一堆我永远看不懂的硬盘和软盘。”
“我奶奶……陈素珍,她为什么消失了?”
方荣发看着他,目光里有一种很复杂的情绪——同情、警惕,还有一丝几乎看不见的愧疚。
“因为你爷爷用算法做了最后一件事情,“他说,“他预测了自己的死亡。“
四
林默回到家后,打开了自己的笔记本电脑,连上了天穹系统的代码仓库。
他开始系统地搜索。
搜索的关键词很简单:日期、地点、人名。但结果远超他的想象。不是只有一段注释,而是有数百段。它们藏在天穹系统的各个角落——Java代码的注释里、XML配置文件的备注里、SQL脚本的字符串常量里、甚至有一个藏在了Base64编码的数字证书里,解码后是一首潮汕话的童谣。
这些信息的分布遵循着某种规律,但不是程序员能一眼看出的规律。林默花了一整天的时间,把它们全部提取出来,按照时间线排列。
然后他看到了一个完整的故事。
故事从2009年开始。那一年,天穹系统的第一版刚上线,代码库里出现了第一条隐藏信息:
“林国栋会在2010年6月遇到陈素珍。她比他小二十三岁。他会爱上她。他不应该爱上她。但算法已经算出了这个结果,而他不会相信算法的警告——因为他用算法赚了太多钱,他以为算法永远是对的。他不知道,算法从来不说’应该’或’不应该’,算法只说’会’或’不会’。”
接下来几年的信息像是一部编年史,记录着林国栋和陈素珍的关系:
2010年:陈素珍加入算法团队,她发现林国栋的统计模型存在一个关键缺陷——它假设人的决策是理性的。
2011年:陈素珍开始重写算法的核心模块。她引入了一个基于混沌理论的子系统,将人的非理性因素纳入计算。新的算法不再预测”最可能的结果”,而是预测”所有可能的结果及其概率分布”。
2012年:陈素珍完成了算法的最终版本。这个版本有一个前所未有的能力——它可以通过分析足够多的数据,精确地模拟出特定个人的思维模式,然后预测这个人在未来某个时刻会做出的具体决策。
“算法不会告诉你未来会发生什么,“一条注释引用了陈素珍的话,“算法会告诉你,如果一个人知道了未来会发生什么,他会怎么做。”
2013年:林国栋开始用新版算法做更大胆的投资。他开始介入潮汕地区的民间金融——那些没有牌照的投资公司、P2P平台、地下钱庄。算法告诉他哪些平台会爆雷,哪些老板会跑路,哪些官员会落马。他就像一个站在时间上游的人,看着下游的洪水将至,从容地在每一条支流上建起水坝。
“他不知道,“一条2013年9月的注释写道,“他建起的每一道水坝,都在改变河流的走向。他以为自己在预测洪水,其实他在制造洪水。”
2014年3月:林国栋用算法分析了自己未来的所有可能结局。在百分之八十七的模拟中,他在五年内会出事——民间金融的崩盘会牵连到他,监管的调查会找到他,他的资产会被冻结,他本人会面临刑事指控。只有一条路径可以避免这个结局。
“放弃一切,“那条注释写道,“把资产转移到一个他永远不会触碰的地方,然后消失。但林国栋不会这样做。因为在百分之八十七的模拟中,还有另一个变量——陈素珍。只要陈素珍在他身边,他就能在每一条可能的路径中找到最优解。他相信这一点,因为算法是这么说的。”
“他不知道的是,陈素珍在算法里加了一条规则:所有涉及她本人的预测,都会被加权。她让算法高估了她的重要性。这不是bug,这是她留给自己的后门。”
林默读到这里,手指在键盘上停住了。
2014年6月14日:林国栋在汕头市金砂东路的办公室里,用一根USB线连接了自己的笔记本电脑和天穹系统的服务器。他把算法的最新版本——包含陈素珍所有改进的完整版——编译成了一段代码,嵌入了天穹系统的清算引擎。
然后他删除了所有原始数据。
2014年6月15日凌晨两点:林国栋在办公室里心脏病发作。没有人知道他是什么时候死的,因为那是一个周日,办公室里没有其他人。他的手机最后一次活动是凌晨一点四十三分,给陈素珍发了一条短信:
“我知道你做了什么。但我不怪你。算法说得对——你是我所有可能性的最优解。只是最优解不一定是对的解。来生再见。”
陈素珍在第二天早上看到了这条短信。然后她消失了。
五
林默用了三天时间来消化这些信息。
他没有告诉任何人。他照常上班,照常在凌晨值守,照常排查天穹系统的各种小问题。但他的注意力已经不在那些日常的故障上了。他在想一个问题:如果算法真的能预测人的行为,那么它现在在预测什么?
天穹系统还在运行。嵌入在清算引擎里的算法还在运行。每一笔交易、每一条清算记录、每一个数据包经过系统时,算法都在默默地计算着什么。
第四天,他开始写程序。
不是在工作时间写的——他在自己的笔记本电脑上,用Python写了一个脚本,用来提取天穹系统中所有异常的数据模式。他已经知道那些隐藏信息的编码方式,现在他要看看,除了他已经找到的那几百条注释之外,系统里还有没有其他东西。
结果让他震惊。
算法在运行。不是静态地躺在代码里的那种运行,而是真正地在运行——它通过天穹系统的日常清算流量在进行实时计算。每一笔经过系统的交易数据都被它用来更新自己的模型。
更可怕的是,它在输出。
输出不是以注释的形式——那种方式太原始了,是2012年的技术。现在的输出方式更隐蔽:算法会微妙地修改某些清算记录中的数字。不是大数字,而是小数字——几分钱、几毛钱的差异。这些差异在小数点后第四位或第五位,远低于对账系统的精度阈值,永远不会被检测到。
但这些被修改的数字本身构成了一种编码。
林默花了整整一周的时间,写出了解码程序。当他运行程序,看到输出结果的时候,他的手在发抖。
算法在预测一场金融风暴。
不是未来十年、未来五年的那种遥远预测,而是正在发生的预测。潮汕地区的民间金融市场正在经历一场缓慢的崩塌——那些隐藏在村镇银行背后的影子资金、那些通过地下钱庄流向海外的资本、那些用高息揽储支撑起来的房地产项目——所有这一切都在同时走向临界点。
算法预测,崩塌将在四十五天之内开始。
而最让林默不安的是最后一条信息:
“林默会来到天穹系统面前。这是所有模拟中唯一不变的变量。”
然后是另一行:
“他会在知道真相之后,做出一个选择。这个选择将决定潮汕地区三百二十万人的命运。算法无法预测他会做出什么选择。这是算法第一次无法预测一个人的行为。”
“也许这就是陈素珍想要的。“
六
林默去找了方荣发。
老茶行的门开着,但方荣发不在茶台后面。林默往里走了几步,看到后门开着,方荣发正在仓库里整理茶饼。他抬头看到林默,没有显得惊讶。
“你找到了,“他说。
“你知道?”
“我猜到了。国栋去世之前跟我说过,‘有一天,会有人来找你。那个人姓林,比我年轻,比你聪明。他会问你一些问题。你把你知道的告诉他,然后让他自己做决定。’”
“什么决定?”
方荣发放下手里的茶饼,拍了拍手上的灰尘,走回前面的茶台。他重新烧水,重新泡茶,这次泡的是一款老白茶,据说是他存了十五年的。
“天穹系统里的算法,“方荣发缓缓地说,“它能预测金融风暴,也能阻止金融风暴。”
“怎么阻止?”
“修改清算数据。不是几毛钱的小修改,而是真正的大修改——在关键时刻,让资金流向改变方向。一笔该到达某个影子银行的资金被延迟一天,就能让一家即将爆雷的P2P平台提前崩盘。而提前崩盘意味着牵连更少的人。”
“那不是篡改数据吗?”
“当然是的。“方荣发看着他,“而且是你爷爷设计的。他生前就已经把修改的路径编好了,嵌在算法里。只要有人按下回车键,算法就会在未来四十五天内,逐步修改天穹系统的清算流程,把潮汕地区的金融风暴控制在一个可接受的范围内——当然,‘可接受’是算法的定义,不是你的。”
“代价是什么?”
“代价是那个按下回车键的人,会成为整个事件的替罪羊。篡改清算数据是犯罪,你知道的。不管动机多么高尚,法律就是法律。”
林默沉默了。白茶的汤色是琥珀色的,在灯光下看起来像液态的琥珀。他端起杯子,喝了一口。茶汤入口柔和,有一股药香,然后是持久的甜味,像是一段很长很长的回甘。
“有没有第三个选择?“他问,“不按回车键,也不什么都不做?”
“陈素珍可能知道。“方荣发说。
“她在哪?”
方荣发没有回答。他站起来,走到茶台后面的墙壁前,取下了一幅字画。字画后面是一个保险柜。他从口袋里掏出一把钥匙——那种老式的保险柜钥匙,黄铜的,带着岁月的包浆——打开了柜门。
里面只有一个牛皮纸信封。
信封上写着:致林默。
字迹是女性的,娟秀但有力,每一笔都收得很干净。
“她三年前寄来的,“方荣发说,“她说你会来。“
七
信封里有一封信和一枚U盘。
信是用钢笔写的,三页纸,写得很密。陈素珍的行文风格像她的字迹一样——干净、精确,没有多余的情感,但每一句话都像是用手术刀刻出来的。
林默:
你不认识我,但我认识你。不是因为你爷爷的描述——他从未向任何人提起过他有一个在湖南的儿子,更不知道那个儿子生了一个叫林默的孩子。我认识你,是因为算法。
你爷爷把算法嵌入天穹系统的那天晚上,我在潮州的一个旅馆房间里,用我自己的笔记本电脑远程监控了整个过程。我看着他一行一行地写代码,把算法的核心模块编译成Java字节码,然后把字节码分拆成无数个碎片,嵌入到天穹系统的各个模块里。
我没有阻止他。不是因为我不能——我有系统的管理员权限,我可以随时切断他的连接。我没有阻止他,是因为算法告诉我,如果我阻止了他,他会在另一个时间、用另一种方式做同样的事情,而那个版本的他会犯更大的错误。
你爷爷是一个执念很深的人。他一旦决定了某件事,就会一直做下去,不管后果。这是他成功的原因,也是他毁灭的原因。算法把这一点算得清清楚楚。
但算法算不出你。
这不是修辞。这是事实。在我设计的算法中,所有人的行为都可以被建模——只要数据足够多,一个人的思维模式就可以被精确地模拟。但你是一个例外。你的数据太少了。你在湖南长大,在武汉读书,毕业后在深圳工作了一年,然后来到汕头。你的数字足迹很少,社交网络很小,消费习惯几乎没有规律。算法在你身上失效了。
这让我很兴奋。
我设计算法的初衷,不是为了预测未来。你爷爷误解了这一点。我设计算法,是为了证明一件事:人的自由意志是否存在。如果算法能完美地预测每个人的行为,那么自由意志就不存在——每个人都只是在执行一个早已写好的程序,只是自己不知道而已。但如果算法遇到了一个它无法预测的人,那就意味着,自由意志是存在的。
你就是那个人,林默。
你是算法的唯一盲点。你在所有模拟中都会来到天穹系统面前,都会发现那些隐藏的信息,都会面临那个选择。但算法无法预测你会选择什么。不是五十对五十的概率,不是百分之八十七的确定性,而是真正的——无法预测。
这让我相信,人是有自由的。
U盘里存着算法的源代码——完整的、未被修改的版本。你可以用它来理解天穹系统里正在运行的每一个计算。你也可以用它来寻找第三个选择——如果存在的话。
我不知道第三个选择是什么。如果能算出来,我就不算失败了。
但我知道一件事:你不是你爷爷,也不是我。你不需要在预测和被预测之间做出选择。你需要的,是找到一种让算法不再必要的方式。
无论你做什么选择,请不要来找我。我已经用了十二年来说服自己,算法不是上帝。我不想再用十二年来说服你。
陈素珍 2023年冬
林默读完信,把它折好,放回信封。他的手已经不抖了。
方荣发一直在旁边喝茶,没有说话。茶台上的水壶已经自动保温了,偶尔发出细微的咕嘟声。
“方叔,“林默说,“潮汕话里,‘天穹’是什么意思?”
方荣发愣了一下:“天穹?那是普通话的说法。潮汕话里,天穹叫’老天’。”
“不对,“林默摇头,“我问的是字面意思。天——穹。”
方荣发想了想:“穹是弯的意思。天穹就是天弯下来。天弯下来的时候,是什么样子?”
“是一口锅,“林默说,“倒扣在地上的锅。我们在锅底。所有的一切——预测、算法、选择——都在这口锅的里面。没有人从外面看过这口锅。”
他把U盘插进了自己的笔记本电脑。
八
U盘里的内容比林默预想的要多得多。
算法的源代码占了大约两千兆字节——对于一个纯数学模型来说,这个体量意味着它的复杂度远远超出了普通的统计分析。林默花了一周的时间才大致理解了它的架构。
算法的核心是一个自监督的神经网络,但不是深度学习意义上的神经网络。陈素珍用了一种完全不同的方式来构建它——她把每个被预测的人建模为一个”节点”,节点之间的连接不是固定的权重,而是动态的概率分布。每当新的数据输入,所有节点的连接方式就会重新计算一次。
这意味着算法是一个活的系统。它在不断地学习、适应、进化。它不是一个人写的程序,而是一个在十四年的时间里,通过吞噬潮汕地区所有经过天穹系统的金融数据,自己成长起来的东西。
林默在代码的深处发现了一个隐藏的模块。这个模块不参与任何计算,它只是在运行——像一个心跳一样,每隔三秒钟输出一个数字。
那个数字是倒计时。
四十五天。不,现在是三十八天。时间在流逝。
林默开始理解陈素珍说的”第三个选择”可能是什么了。
算法能预测金融风暴,是因为它掌握了足够多的数据。这些数据来自天穹系统处理的每一笔交易——谁在什么时候给谁转了多少钱,通过什么渠道,用什么币种。这些数据汇聚在一起,就形成了一幅完整的潮汕地区金融生态图。
如果这幅图是透明的——如果所有人都能看到这幅图——那么金融风暴就不会发生。
因为金融风暴的本质是信息不对称。影子银行利用信息不对称来吸收资金,P2P平台利用信息不对称来制造信任假象,地下钱庄利用信息不对称来转移资本。如果所有的信息都是公开的,这些寄生在信息黑洞上的东西就会失去生存的空间。
但这意味着——
林默需要把天穹系统的所有数据公开。
全部。不是脱敏后的统计数据,而是每一笔交易的完整记录。谁,什么时候,多少钱,从哪里来,到哪里去。
这不仅是犯罪,这是核弹级别的信息泄露。它会让潮汕地区半个金融体系在一夜之间崩溃,因为太多见不得光的交易藏在系统的深处。
但算法算出了另一种可能性:如果数据分阶段公开——先公开机构层面的汇总数据,再逐步下钻到交易明细——那么市场会经历一个短暂的恐慌期,然后迅速恢复。因为透明度会带来信任,而信任是金融的基石。
这个”分阶段公开”的路径,就是第三个选择。
不是按回车键让算法来操控,也不是什么都不做任由风暴来袭,而是主动地、可控地、逐步地揭开潮汕金融的黑箱。
林默看着屏幕上倒计时的数字:37天14小时23分07秒。
他拿起手机,打了一个电话。
电话是打给他的大学同学的——周琳,在银保监会汕头分局工作。
“琳姐,我有个事情想跟你聊一下。不是电话里能说清楚的。能见面吗?”
电话那头沉默了几秒钟:“你现在在哪里?”
“汕头。”
“我在广州。明天上午的高铁回去。明天下午见?”
“好。”
“林默,“周琳在挂电话前说,“你声音不太对。是出什么事了?”
“不算出事,“他说,“算是——发现了一口倒扣的锅。“
九
周琳是一个认真的人。她和林默是武汉大学计算机系的同届生,毕业后走了不同的路——林默去做了运维,她考了公务员,分到了银保监会。但她们一直保持着联系,偶尔在微信上聊几句,一年见一两次面。
第二天下午,他们约在汕头市区的一家咖啡馆见面。周琳穿了一身正装,显然是刚从高铁站直接过来的。她点了一杯美式,然后看着林默,等着他开口。
林默没有直接说算法的事。他先问了一个看似不相关的问题:“琳姐,你知道潮汕地区的村镇银行现在是什么情况吗?”
周琳的眉头微微皱了一下:“你问这个干什么?”
“我维护的天穹系统,给这些银行做清算。我看到了一些——异常。”
“什么异常?”
“数据层面的异常。交易流水中有些不该出现的东西。”
周琳放下咖啡杯,正色看着他:“你说的’不该出现的东西’,具体是什么?”
林默深吸一口气。他知道接下来的话一旦说出口,就没有回头路了。
“潮汕地区至少有十七家村镇银行,在过去三年里,通过天穹系统的清算渠道,向境外转移了大量资金。这些资金的来源很复杂——有民间借贷的资金、有房地产项目的预售款、还有一些我不知道来源的钱。它们通过层层的账户嵌套,最终都流向了同一个地方。”
“什么地方?”
“一个在香港注册的公司,叫’潮信金融科技集团’。这家公司表面上是做金融科技的,实际上是一个资金中转站。钱到了那里之后,一部分进了比特币市场,一部分进了东南亚的房地产,还有一部分——”
他停顿了一下。
“还有一部分回到了潮汕,以’投资’的名义进入了本地的基础设施项目。修路、建桥、搞开发区。”
周琳的脸色已经变了。她是一个在监管系统工作了五年的人,听过无数个金融乱象的故事,但这个故事的规模显然超出了她的预期。
“你说的这些,有证据吗?”
“有。都在天穹系统的数据库里。”
“你能拿到这些数据吗?”
“我能拿到。但问题是——“他犹豫了。
“但什么?”
“如果我拿出来了,这些数据会牵连到很多人。不只是银行的负责人、企业的老板,还有一些——你可能不想碰的人。”
周琳沉默了很久。咖啡馆的音响里放着一首很轻的爵士乐,窗外的阳光照在桌面上,在两个人的手之间投下一道明亮的分界线。
“林默,“她终于开口了,声音很平,“你知道我为什么离开武汉来广东吗?”
他摇头。
“因为我爸。他在湖北的一个县里当了一辈子公务员,最后因为一个小小的违规操作被查了——帮朋友的儿子在银行贷了一笔款,十万块,朋友跑了,贷款烂了。他被判了缓刑。十年工龄,一夜清零。”
她端起咖啡杯,喝了一口,然后苦笑了一下:“我发誓要做一个不一样的监管者。不靠关系,不走后门,看到什么就说什么。但你知道这五年我看到了什么吗?我看到了一个巨大的、盘根错节的系统,每个人都觉得自己的违规是’小小的’,‘不得已的’,‘大家都在做的’。而这个系统的总账——”
她用手指在桌面上画了一个圈。
“没有人算过总账。你说的那些数据,可能就是这个总账。”
“所以我来找你,“林默说,“不是因为我不知道该怎么办,而是因为我需要一个对的人来一起办。”
周琳看着他,目光里多了一种他从未见过的东西——不是犹豫,不是恐惧,而是一种很深的、来自职业本能的警觉。
“你说你需要一个’对的人’。你觉得我是对的人?”
“你是唯一一个我认识的人,既有权限处理这些数据,又有动机做正确的事。”
“正确的事。“周琳重复了一遍这个词,然后摇头笑了,“你什么时候变得这么天真了?正确的事。在这个系统里,正确的事往往是最危险的事。”
“我知道。”
“你知道?你知不知道,如果你说的是真的,这不是一个简单的金融违规案件?这涉及到跨境资金流动、地方基建投资、可能还有——”
“我知道。”
“你真的知道?“她盯着他的眼睛。
“我知道这意味着什么。但我更知道,如果什么都不做,三十七天之后——不,现在应该是三十五天了——一场金融风暴会席卷整个潮汕地区。受影响的不只是那些银行家和开发商,还有三百多万普通人。他们存在银行里的钱、他们的退休金、他们孩子的教育基金——所有这些都会被波及。”
周琳把咖啡喝完了。她把杯子放在桌上,双手交叉放在桌面上,看着林默。
“给我三天时间,“她说,“我要先确认你的身份和你说的事情的可信度。然后,如果你说的是真的,我会走内部渠道向上汇报。”
“不向上汇报,“林默说,“而是向下公开。”
“什么?”
“不是向上汇报给监管系统——那条路太长了,等不到审批,风暴就来了。而是向公众公开——分阶段地、可控地公开。先公开汇总数据,让市场自行消化,再逐步公开明细。”
周琳几乎是本能地摇头:“你疯了。泄露金融数据是——”
“是犯罪。我知道。但犯罪的定义是什么?是违反了法律条文,还是伤害了无辜的人?如果法律保护的是一个正在腐烂的系统,那么违反它——”
“不,“周琳打断他,“你听我说。我理解你的想法。但你不能这样做。不是因为法律不允许,而是因为这样做没有用。你以为公开了数据,市场就会自动修正?不会的。市场会恐慌,普通人会排队去银行取钱,挤兑会加速崩盘。你想要保护的三百多万人,会成为最先被牺牲的。”
林默沉默了。
“我们需要一条中间路线,“周琳说,“既不是什么都不做,也不是把所有东西都掀开。我们需要找到一种方式,让信息在不引起恐慌的情况下,逐步地修正市场的方向。”
“怎么做?”
周琳站起来,把包背在肩上:“我来想办法。给我一周时间。”
“时间不多了。”
“我知道。但做正确的事需要时间,林默。这不是写代码,不能按回车键就跑。”
她走到门口,又回头看了他一眼:“还有——你说的那个算法。你爷爷嵌入系统的那个。你确定它还在运行?”
“确定。”
“把它关了。”
“关了?”
“如果它在运行,就意味着有人在通过它影响系统的输出。不管那个人是谁——你爷爷、陈素珍、还是算法自己——你都不能让它继续运行。先关掉算法,再来处理数据。”
林默没有说话。
“怎么了?”
“算法不是我能关的。”
“什么意思?”
“算法已经不是一个程序了。它分布在天穹系统的每一个模块里,没有中心节点,没有开关。要关掉它,唯一的办法是把整个天穹系统关掉。”
“那就关掉天穹系统。”
“关掉天穹系统,三十七家银行的清算就停了。所有交易中断。那比金融风暴来得还快。”
周琳站在门口,手握着门把手,看着外面的街道。汕头的下午阳光很烈,行道树的影子缩成了一团一团的小黑点。一辆公交车从咖啡馆门前开过,车身上的广告是某家地产公司的楼盘宣传——“海滨新城,梦想起航”。
“一周,“她说,“给我一周。”
然后她走了。
十
接下来的几天,林默做了一个决定——他要去寻找陈素珍。
不是为了问她问题,而是因为他需要理解一件事:一个人如果创造了上帝,然后发现上帝不是全能的,她会怎么做?
方荣发给不了他答案。信件给不了他答案。代码也给不了他答案。只有陈素珍本人——那个在算法中留了后门、然后消失在时间里的女人——才能告诉他,算法的终点是什么。
他请了年假。五天。然后他去了潮州。
不是汕头,是潮州。潮州是潮汕文化的源头,也是林国栋的老家。林默从未去过那里,但方荣发给了他一个地址——潮州市区的一条老街,牌坊街附近的一条巷子里,有一栋老房子,门上贴着一副褪色的对联。
“那是国栋的老宅,“方荣发说,“他走之后,没有人住过。但陈素珍消失之前,经常去那里。也许她还留着什么东西。”
林默在第四天的早上到了潮州。从汕头坐大巴,一个小时的车程。潮州比汕头更老,也更安静。牌坊街上全是游客,但一拐进旁边的巷子,就安静得像是另一个时代。
老宅的门是开着的。
不是被打开的,是一直开着——门板已经烂了,合页锈死了,关不上。林默走进去,看到一个典型的潮汕四点金格局——前后两个大厅,中间一个天井,两侧是厢房。天井里长满了青苔,墙角有一棵芭蕉树,叶子又宽又绿,遮住了半边天。
正厅里有一张八仙桌,桌上放着一个落满灰尘的茶盘和几个盖碗。墙上挂着一面钟,停在了三点十四分——不知道是哪一天的三点十四分。
林默一间一间地查看厢房。第一间是空的,只有一些旧家具。第二间也是空的,但地上有一堆烧过的纸灰。第三间的门是锁着的。
锁是新的。在一栋所有东西都在老化的房子里,这把锁是唯一的新的东西。
林默蹲下来,研究了一下锁的型号。是一个普通的挂锁,五金店十块钱就能买到的类型。他从口袋里掏出一张饭卡——这是他从大学时代就保留下来的习惯——花了三十秒钟就把锁撬开了。
门开了。
房间不大,大约十平方米。窗户被厚厚的黑布遮住了,不透光。林默打开手机的手电筒,照了一圈。
房间里只有一样东西:一面墙。
整面墙上贴满了纸。不是打印纸,是手写的信纸、笔记本的纸、甚至还有餐巾纸和烟盒的内衬。每一张纸上都写满了数字和符号——数学公式、统计图表、坐标轴、概率分布曲线。有些纸已经发黄了,有些还是白的。它们被图钉、胶带、订书钉固定在墙上,层层叠叠,像是一种疯狂的考古地层。
在墙的正中央,有一张纸比其他的都大。它是一张A3大小的绘图纸,上面画了一张网络图。图的节点是人名——林默一个都不认识,但他在一些名字旁边看到了备注:
“潮安农商行,行长” “潮信金科,实际控制人” “汕头某区,副区长” “深圳某私募,合伙人” “香港某银行,合规部”
节点之间的连线标注着金额和日期。
这是潮汕民间金融的完整关系图。
林默用手电筒仔细地照着这张图,试图把它记下来。但他发现,他不需要记——因为这张图的每一个节点和每一条连线,都和他在天穹系统数据库里看到的数据完美吻合。
陈素珍不是消失了。她在这里——在这栋老房子里——用了十年的时间,用纸和笔,把算法的所有输出重新验证了一遍。
她在找算法的错误。
在墙角的最下面,有一张纸几乎被其他纸盖住了。林默小心翼翼地把它抽出来。
那是一张很普通的便签纸,上面只写了一行字:
“算法没有错误。它只是比我们更诚实。”
下面还有一行,字迹更潦草,像是后来加上去的:
“林默:别来找我。去外面看天。”
林默抬起头,看向被黑布遮住的窗户。他走过去,一把扯下了黑布。
窗户外面是潮州的天。阴天,灰蒙蒙的,看不到太阳。但天是亮的,光是均匀地洒下来的,照在墙上那些密密麻麻的纸上。
在光线下,他发现了之前在黑暗中看不到的东西。
那些纸不只是写了数字和公式。在每一张纸的边缘,在最不起眼的角落里,陈素珍用极小的字写了一句话。每张纸上一句,像是写在一本书每一页的页码旁边。
林默凑近了看:
“2009年:我来了。” “2010年:我遇见了他。” “2011年:我开始理解。” “2012年:我完成了。” “2013年:我后悔了。” “2014年:他走了。” “2015年:我留下来。” “2016年:我在计算。” “2017年:我在等待。” “2018年:我开始画画。” “2019年:画的是海。” “2020年:海里有一座城。” “2021年:城在下沉。” “2022年:城沉到了海底。” “2023年:我写了那封信。” “2024年:我在等一个人。” “2025年:他还没有来。”
2026年的那张纸——在所有纸的最后面,最大的一张——上面只画了一样东西:一扇门。
门是开着的。
十一
林默从潮州回到汕头的当天晚上,接到了周琳的电话。
“出事了,“周琳的声音很急,“我按照你给的信息去查了潮信金科的背景。今天下午,我在局里查到一半的时候,我的主管找到我,让我把手头的案子交出去。”
“什么意思?”
“意思是有人知道我在查了。林默,天穹系统是不是被监控了?”
“有可能。算法在运行,任何对异常数据的查询都可能被它捕捉到。”
“那就不是’有可能’,而是’一定’。我查了不到三个小时,主管就来找我了。他说这个案子涉及到跨境资金流动,要移交给外汇管理局。但我查了——外汇管理局根本没有收到移交通知。”
“他在压下来。”
“不只是他。我今天晚上在食堂吃饭的时候,碰到一个同事,她跟我说,最近局里在搞内部审查,重点查的就是’异常数据访问’。她暗示我,有人在查我的系统日志。”
林默闭上了眼睛。算法。它在计算。它在预测。它预测到了他会去找周琳,它预测到了周琳会去查数据,它也预测到了监管系统内部会有人试图阻止这一切。
“你现在安全吗?“他问。
“暂时安全。但我不确定能安全多久。林默,一周的时间可能不够了。”
“还剩多少天?”
“你说呢?”
他看了一眼笔记本电脑上的倒计时:29天。
“还有二十九天。”
“不,不是二十九天。我说的不是风暴的倒计时,是——我收到了一个消息。今天下午,在我被要求交出案子之后,我的手机收到了一条短信。号码是未知的,内容只有一行字。”
“什么内容?”
“潮信不倒,汕头不倒。潮信若倒,汕头地震。”
林默的脊背发凉。这不是威胁,这是宣战。
“这是算法发的吗?“周琳问。
“不,“林默说,“算法不会发短信。这是人发的。是那些从算法的输出中获益的人——他们也在监控系统的运行,他们也在利用算法的预测来保护自己的利益。”
“你是说,算法不是只有我们在看?”
“算法是天穹系统的一部分。任何有能力访问系统的人,理论上都能发现它。我只是其中之一。也许还有其他人——更早发现的人,更有权力的人,更需要算法的人。”
电话那头沉默了。
“那我该怎么办?“周琳的声音变了,不再是那个冷静的监管者,而是一个被卷入漩涡的普通人。
“你还记得你说过的话吗?“林默说,“做正确的事需要时间。但我们没有时间了。”
“你想怎么做?”
“明天见面。带上你能带的所有人。”
“什么意思?”
“字面意思。带上所有你认为值得信任的人。越多越好。”
“林默,你在说什么?”
“我在说——我们需要把锅掀开。“
十二
他们在第三十一天的时候,做了一件没有任何人预料到的事情。
不是公开数据。不是向上汇报。不是关闭系统。
而是——开会。
林默用了一个最古老、最原始、最不技术的方法:他在汕头的金海湾大酒店租了一个会议室,然后通过周琳的关系,邀请了二十三个人来开会。
这二十三个人包括:三名银保监会的基层工作人员、两名汕头大学的经济学教授、一名 retired 的检察院干部、四名本地媒体的记者、两名律师、三名村镇银行的普通员工、两名汕头市人大代表、一名从深圳请来的网络安全专家、一名潮汕商会的退休会长、以及三名普通市民——其中一个是林默楼下牛肉火锅店的老板。
林默在会上用四个小时,把所有事情讲了一遍。
从2012年的代码注释开始,到陈素珍的算法,到天穹系统中隐藏的预测,到潮汕金融体系即将崩塌的证据,到他自己面临的困境。他没有隐瞒任何东西,包括他自己可能面临的法律风险。
然后他打开电脑,把天穹系统中算法的输出——那些关于金融风暴的预测数据——投影在会议室的屏幕上。
“这些数据是真实的,“他说,“你们可以验证。我不要求你们相信我,我要求你们去查。查到了,然后自己做决定。”
会议室里沉默了很久。
然后牛肉火锅店的老板开口了。他叫阿福,五十多岁,黑黑的脸上全是油光,说话带着浓重的潮汕口音。
“林默啊,“他说,“我听不懂你说那些什么算法什么预测。我就问你一件事:我存在潮安农商行的那四十万——我的养老钱——安不安全?”
“不安全,“林默说。
阿福站起来,拿起他的茶杯,把茶一饮而尽。
“那够了,“他说,“我来的时候不知道你要说什么。现在我知道了。你说吧,要我们做什么。”
那天晚上的会议开了六个小时。结束时,二十三个人投票表决,决定了三件事:
第一,由银保监会的三名工作人员以”例行检查”的名义,在不触发系统警报的前提下,逐步提取天穹系统中的关键数据。
第二,由两名律师起草一份法律意见书,详细说明潮汕地区民间金融的违规事实和潜在风险,提交给汕头市人民检察院。
第三,由四名记者以”专题报道”的形式,在本地媒体上发表一系列关于潮汕金融生态的调查报道——不涉及具体的数据和预测,只描述现象和趋势,让公众在不恐慌的情况下逐步了解真实情况。
周琳把这个方案叫做”滴水穿石”。
林默知道,这不是最优解。算法预测的最优解是”一步到位”——一次性公开所有数据,让市场在短暂的震荡后迅速恢复。但周琳说得对:最优解不一定是对解。
对解是二十三个普通人,坐在一个酒店的会议室里,用最笨拙、最缓慢、最不可预测的方式,一点一点地把真相推进阳光里。
算法算不出这个解。
因为算法不会开会。
十三
第三十五天。
天穹系统的清算引擎在凌晨四点十二分出现了一次异常。不是算法造成的异常——是外部攻击。
有人试图入侵系统。
林默在值班室里看到了告警。攻击的来源是一个境外的IP地址,经过了七层代理跳转,最终指向了——香港。
潮信金融科技集团。
他们知道了。
林默立刻联系了周琳。周琳在电话里的声音异常冷静:“我们的人已经在提取数据了。速度比预计的快。银保监会的三个人今天下午就把第一批发给了记者。明天见报。”
“他们入侵了系统,“林默说。
“我猜到了。他们入侵了什么?”
“清算引擎的管理端口。如果他们拿到了管理权限,他们可以——”
“可以什么?”
“可以修改数据。不是几毛钱的小修改。是整个系统的数据——包括我们提取的那些证据。”
电话那头安静了几秒钟。
“你能不能阻止他们?”
“我在试。”
林默挂了电话,打开了自己的笔记本电脑。他知道他在做一件不可能的事情——他一个人,面对一个有组织的、资金雄厚的、掌握着大量资源的攻击团队,要保护一个年久失修的金融清算系统。
但他还有一个东西:陈素珍的U盘。
U盘里不只是算法的源代码。还有一个他之前没有注意到的东西——一个独立于天穹系统的小程序,陈素珍在2014年写的,一直没有运行过。
小程序的功能很简单:它会接管天穹系统的清算引擎,把所有的数据处理流程镜像到一个独立的服务器上。镜像的数据无法被篡改,因为每一笔交易都会被加密并用区块链的方式存储。
陈素珍在十二年前就准备好了这一手。
她知道有一天会有人试图篡改数据。她不知道这个人是谁、什么时候来,但她知道——算法告诉她——这一天一定会来。所以她提前写好了防御工具,藏在了U盘里,等着那个算法无法预测的人来使用它。
林默运行了程序。
屏幕上出现了进度条。数据镜像开始了。每一笔经过天穹系统的交易,都在被实时复制到那个独立的服务器上。即使攻击者修改了原始数据,镜像中的记录也无法被改变。
凌晨五点零三分,镜像完成。
林默靠在椅背上,看着屏幕上的数字——镜像服务器已经存了今天所有清算记录的完整副本。一万三千七百四十二笔交易,总金额四亿六千万元。
他的手机响了。是一个陌生的号码。
“喂。”
“林默先生,“电话那头的声音是一个男人,普通话很标准,但带着一种微妙的、不自然的流畅感,像是提前录好的,“我们知道你在做什么。我们也知道你手里有什么。”
“你们是谁?”
“这不重要。重要的是,你在保护一个正在死去的东西。天穹系统,清算引擎,还有那些过时的银行——它们都是上一个时代的遗物。你不应该为一个遗物而战。”
“那你们在为什么而战?”
“为下一个时代。一个没有中间人的时代。一个资金自由流动的时代。一个算法——真正的算法,不是陈素珍那个过时的玩意——决定一切的时代。”
林默笑了。
“你知道为什么陈素珍的算法无法预测我吗?“他问。
“因为你的数据太少?”
“不。因为算法在建模的时候,假设每个人都会在利益和风险之间做权衡。但我不是。我在做一件没有任何利益、只有风险的事情。算法理解不了这种行为,因为在算法的世界里,没有人会因为’正确’而行动。”
“那你就是——“对方的声音第一次出现了犹豫。
“我是一个算法无法理解的变量,“林默说,“我是一个bug。而bug,有时候才是系统的真正功能。”
他挂了电话。
十四
第三十七天。
本地媒体的第一篇报道出来了。标题很克制:“潮汕村镇银行清算异常引关注,专家呼吁加强监管”。没有提天穹系统,没有提算法,没有提任何敏感的数据。只是一篇普通的财经新闻。
但它在汕头的金融圈里引起了巨大的震动。
因为所有从业者都知道——那些”异常”不是异常,而是常态。报道像是一面镜子,照出了一个所有人都假装看不见的事实。
第二篇报道在第三十八天出来。这次更具体了——点名了三家村镇银行,列出了它们的资金流向数据(来自银保监会的”例行检查”),引用了汕头大学经济学教授的分析。
第三十九天,汕头市人民检察院收到了律师的法律意见书。
第四十天,潮信金融科技集团的香港办公室被香港警方搜查。
第四十二天——距离算法预测的金融风暴只剩三天——银保监会广东监管局正式对潮汕地区的村镇银行开展专项检查。
所有这些事情,都在算法的预测范围之内。
但有一个事情不在预测范围之内:公众的反应。
没有挤兑。没有恐慌。潮汕地区的人们用一种让所有经济学家都困惑的平静,接受了这个消息。也许是因为信息是逐步公开的,也许是因为本地媒体的报道足够克制,也许是因为——
也许是因为潮汕人骨子里有一种东西,一种在无数次台风和海啸中磨出来的东西:他们知道,天会塌,但塌了之后,人还在。
第四十五天。
什么都没有发生。
金融风暴没有来。不是被阻止了,也不是被延缓了,而是——根本就没有来。算法预测的崩塌,在信息逐步公开的过程中,被市场自行消化了。那些见不得光的资金,在阳光照射进来的时候,要么缩回了阴影里,要么就干脆变成了光的颜色。
天穹系统的清算引擎在凌晨五点完成了最后一次日终批处理。所有的数字都对上了。一分钱都不差。
林默坐在值班室里,看着屏幕上绿色的”对账成功”提示,笑了。
然后他注意到了一个细节。
倒计时消失了。
算法还在运行——它永远在运行——但那个倒计时的模块,在三十二天十四小时零七分之前自动关闭了。关闭的时间,精确地对应着——
他回忆了一下——那个酒店会议室开会的那个晚上。二十三个人投票表决的那个瞬间。
算法在三十二天前就知道风暴不会来了。它只是在等,等那二十三个人做出决定。决定一旦做出,结果就已经确定。剩下的三十二天,不是倒计时,而是算法的确认——它在用这段时间来验证,自己的预测是否正确。
验证结果:正确。
但算法无法预测的是过程。它预测了结果——风暴不会来——但它无法预测是哪些人、用什么方式、在什么时候、做出了什么决定,才让这个结果成为现实。
算法知道终点,但不知道路径。
而路径,才是真正重要的事情。
尾声
六月的一个周末,林默去了潮州。
他又去了那栋老宅。门还是开着的,天井里的芭蕉树又长高了一些,叶子更绿了。
第三间厢房的门还是锁着的——他在上次离开的时候重新锁上了。他打开锁,走进去,扯下了窗户上的黑布。
阳光照进来。
墙上那些密密麻麻的纸还在。但有一张纸变了——最后那张画着门的画。
门还是开着的。但在门的里面,陈素珍画了另一样东西。
是一片海。
海面很平静,没有风浪。海天之间有一条线,把蓝色和更深的蓝色分开。在线的上方,有一个太阳,不大,但是很亮。
画的右下角,有一行字,还是那种娟秀但有力的钢笔字:
“潮州商人,四海为家。天穹之下,皆为故土。林默,不要找我。去看看海。它比你爷爷的算法和我的公式都大。”
林默站在那里,看了很久。
然后他拍了张照片,走出了老宅。
牌坊街上全是游客。有人在拍照,有人在吃小吃,有人在讨价还价。一个老人推着一辆三轮车,车上堆满了鲜花——白色的、黄色的、红色的——在阳光下散发出浓烈的香气。
林默买了两束白色的百合。
他把其中一束放在了老宅门口的石阶上——不知道为什么,他觉得陈素珍应该喜欢百合。
另一束他带回了汕头,放在了自己的办公桌上。
然后他打开了天穹系统的监控界面,开始了新一天的工作。系统还在运行,清算引擎还在处理着每一笔交易,算法还在默默地计算着什么。
但倒计时不会再出现了。
因为在这个故事里,没有一个倒计时是无法取消的。
就像在这片天空下,没有一个故事是只有一种写法的。
(全文完)