数字菩提之梦

招魂者 · 2026/5/17

一、删除键

林未时知道自己不该按下那个键。

那是六月二十三号,周一,下午三点十七分。窗外的北京正在下雨,一种灰蒙蒙的、粘稠的雨,像是天空在缓慢地融化。他在”融信科技”三十二层的工位上,面前开着三个终端窗口,左侧是生产环境的日志流,中间是他写的代码,右侧是一个聊天窗口,上面闪烁着产品经理的头像。

“用户评分系统的降权规则,今天必须上线。“产品经理说。

这条规则很简单:对所有在系统中被标记为”高风险”的用户,在信用评分基础上额外扣除三十七分。三十七这个数字是风控模型算出来的——它对应着”违约概率的临界阈值”,是数据科学家们用三个月的历史数据训练出来的最优参数。

林未时是负责实现这条规则的工程师。他已经写好了代码,测试通过,部署脚本也准备好了。只需要按一次回车,推送到生产环境,几百万人就会在几秒钟之内失去三十七分。

三十七分是什么概念?

在融信的评分体系里,三十七分等于一辆二手面包车的贷款额度。等于一个小餐馆老板半个月的流水。等于一个刚毕业的大学生能租到的房子,从”正规公寓”变成”城中村隔断间”。等于一个人在深夜打开手机,发现自己的信用额度从五万变成了三千,而明天就是交房租的日子。

林未时当然知道这些。他在融信工作了四年,从初级工程师做到了算法组的tech lead。他亲手写下了这个评分系统百分之四十的代码。他知道每一条规则的权重、每一个阈值背后的含义、每一行SQL查询从数据库里捞出的是什么样的数据。

他也知道,这条”降权规则”并不像产品文档里写的那样客观。

“高风险”标签的生成逻辑中,有一个隐含变量:用户的地理区域。系统会根据用户手机号归属地和常用IP地址的位置,给来自特定区域的用户加上一个”风险系数”。这个系数不会出现在任何文档里,也不会在用户端显示——它藏在模型中间层的一个权重矩阵中,是训练数据自动学出来的。

但林未时看过那个矩阵。他知道,来自西南某三个省份的用户,平均会获得比其他地区高出零点一七的”风险系数”。这意味着,即使两个用户的收入、消费、还款记录完全相同,来自那三个省份的用户也会更容易被标记为”高风险”。

他曾经在一次技术评审会上提出过这个问题。风控组的负责人——一个戴金丝眼镜、说话慢条斯理的博士——微笑着回答:“模型学出来的是统计相关性,不是歧视。那三个省份的违约率确实更高,这是数据告诉我们的。”

“但相关性不等于因果性。“林未时说。

“我们不做因果推断,我们做的是风险定价。“博士说。

那天下午的会议就这样结束了。林未时回到工位,盯着自己的屏幕看了很久。他没有再提这件事。不是因为被说服了,而是因为他知道,在这个系统里,“公平”不是一个被优化的目标函数。

但今天不一样。

今天,他在准备部署降权规则的时候,顺手跑了一次影响分析。结果显示,在即将被扣除三十七分的用户中,有百分之四十二来自那三个省份。而那三个省份的用户,在整个用户池里只占百分之十八。

他在椅子上坐了很长时间。

窗外的雨还在下。办公室里的灯光是冷白色的,照在每个人的脸上都像是一张打印出来的证件照。周围的同事们安静地敲着键盘,偶尔有人低声说话。一切都很正常,一切都很专业,一切都很合理。

然后他看到了那个聊天窗口里的消息。

是一个叫”陈秀兰”的用户发来的客服工单,被系统转到了技术组的垃圾桶里——因为她的评分太低,系统自动判定她的工单优先级为”最低”。工单内容只有一句话:

“你好,我叫陈秀兰,我在你们平台上借了两万块钱开店,一直在按时还款。但是昨天我的额度突然变成了零,我明天要进货,请帮我看一下。”

后面附了一个手机号码,归属地是贵州。

林未时盯着这行字看了三分钟。然后他打开了那个手机号对应的用户画像。陈秀兰,四十七岁,贵阳人,在平台上借款两万元,用于”小吃店经营”。过去十一个月,每月按时还款,从未逾期。信用评分六百一十二分,刚好在”优质客户”的门槛上。

如果降权规则上线,她的评分会变成五百七十五。在融信的体系里,五百七十五分意味着”信用受限”——无法申请新的贷款,现有的循环额度会被冻结,已发放的贷款可以继续还款,但不能再借出一分钱。

林未时又看了一眼窗外。雨不知道什么时候停了,天空变成了一种奇怪的颜色——不是晴天的蓝,也不是阴天的灰,而是一种发亮的、半透明的白色,像是有人在云层后面点了一盏灯。

他按下了回车键。

不是部署。是删除。

他把那段降权规则的代码全部删掉了。然后他保存了文件,关上了终端窗口,摘下耳机,起身走向电梯。

他没有跟任何人说。没有写辞职信,没有在群里发消息,没有回头看他坐了四年的工位。他只是走了。像一个在深夜醒来的人,发现自己一直在做同一个梦,然后赤着脚走到窗前,发现窗外不是他以为的那个世界。

电梯门关上的时候,他看到三十二层的灯光在缩小,像一颗正在被吞没的星星。


二、数中之城

林未时花了三天时间才走出北京。

不是物理意义上的”走出”——高铁只需要几个小时。而是说,他花了三天时间才让自己真正意识到,他不再是融信的员工了。

第一天,他在出租屋里躺着,手机响了一百多次。其中八十多次是公司打来的——他的直接上级、HR、同事、风控组的博士。他一个都没接。剩下二十多次是来自各种App的推送通知,提醒他今日步数不足、信用分已更新、有人关注了他的动态、他可能认识某人、系统为他推荐了一篇文章。

他把手机调成飞行模式,然后继续躺着。

第二天,他开始收拾东西。出租屋在朝阳区一栋老旧的居民楼里,十二层,朝北,没有阳光。他搬进来两年了,但房间里几乎没有任何个人痕迹——没有照片,没有装饰,甚至连窗帘都是房东留下的。唯一属于他的东西是一台笔记本电脑、三件外套、一箱子书,和一个装满了各种数据线的铁盒。

他打开笔记本电脑,看到了自己过去四年写的代码。几百万行。他花了两个小时把它们全部删除了——不是格式化硬盘那种删除,而是逐个文件地删除,像是在拆一座自己亲手搭建的积木塔。每删一个文件,他就想起写这个文件时的场景:哪个深夜,哪杯咖啡,哪个同事的哪句话。

最后一个文件是一个叫”score_engine.py”的模块。那是整个评分系统的核心,也是他写的第一个文件。他盯着屏幕上的代码看了很久,发现他已经记不清自己为什么要写这个了。

不是说忘记了技术细节——那些逻辑、那些变量、那些条件判断,他闭着眼睛都能默写出来。而是说,他忘记了”为什么”。为什么他要给每一个人打一个分数?为什么这个分数要决定一个人能不能借到钱?为什么他,林未时,一个在湖南小镇长大的程序员,要坐在北京三十二层的高楼里,用他写的代码,去决定一个远在贵州的、他从未见过的女人,明天能不能进到货?

他删掉了那个文件。然后合上了电脑。

第三天,他买了一张去贵阳的火车票。

不,他不是去找陈秀兰。他甚至不知道为什么要去贵阳。也许是因为那个工单里的手机号码,也许是因为风控模型里那三个省份的名字,也许只是因为他从来没有去过那里。

火车上他睡了一路。醒来的时候,窗外已经是另一种风景了——不是北京的灰色高楼和灰蒙蒙的天空,而是一种浓烈的、铺天盖地的绿。山丘一个接一个地涌过来,像是一群正在奔跑的巨人,身上长满了树木和藤蔓。偶尔有一栋房子从绿色的缝隙里冒出来,白墙灰瓦,像是被遗忘在时间里的信件。

他在贵阳站下了车。

这座城市和北京不一样。不是说大小或者繁华程度——贵阳也在大兴土木,到处都是新建的高楼和宽阔的马路。但这里有一种北京没有的东西:一种潮湿的、温热的、带着植物气味的空气,像是城市本身在呼吸。

他在一家小旅馆住下,然后出门随便走了走。

走在街上的时候,他发现了一件奇怪的事情:这里的人不像北京的人。不是说长相或者穿着——而是说他们走路的方式。北京的人走路很快,低头看手机,身体前倾,像是被一条看不见的绳子拽着。这里的人走得慢。有人停下来看天。有人蹲在路边抽烟,不为什么,就是蹲着。有一群老头在广场上下棋,吵吵嚷嚷的,声音传过了半条街。

林未时突然觉得自己非常轻。

不是体重上的轻——而是另一种轻,像是卸下了一套穿了很久的盔甲。在过去四年里,他每天都被数据包围着:用户日活、留存率、转化率、风险系数、信用分、通过率、坏账率。这些数字像是一张密不透风的网,把他裹在里面。他从来没有意识到这张网有多紧,直到现在它突然消失了。

他在路边的一家米粉店坐下来。老板是个中年男人,围了一条油腻的围裙,在灶台后面煮粉。店里只有三张桌子,墙上的菜单是手写的,价格比北京便宜一半。

“一碗酸汤粉。“林未时说。

“辣不辣?“老板问。

“辣。”

粉端上来的时候,他闻到了一种很复杂的味道——酸、辣、鲜、还有一丝说不清楚的甜。他吃了第一口,然后停住了。不是不好吃,而是太好吃了。好吃到他突然意识到,在北京的四年里,他从来没有认真吃过一顿饭。每一顿饭都是对着电脑屏幕吃的,左手拿筷子,右手敲代码,食物只是燃料,味道只是背景噪音。

他放慢了速度。一口一口地吃。汤底有一种很深的酸味,不是醋的酸,而是发酵出来的酸——像是什么东西在时间的深处慢慢变成了另一种东西。

吃完粉,他付了钱。老板找给他几个硬币,其中一个是一块钱的硬币,背面印着菊花。他看着那枚硬币,突然想起了一个很久远的事情。

小时候在镇上,他奶奶每天会给他一块钱零花钱。他会拿着那一块钱去学校门口的小卖部,买一根冰棍,或者一包辣条,或者一个作业本。一块钱能买到的东西不多,但足够让一个孩子快乐一个下午。

那个时候,钱是有重量的。硬币攥在手心里,沉甸甸的,有温度。纸币揉皱了,会有一种特殊的味道,像是被很多人的手摸过之后,沾上了某种集体的气息。

现在,钱只是数字。存在服务器里,显示在屏幕上,从一个账户跳到另一个账户,速度快得连看都看不清。他写了四年的代码,就是让这些数字跳得更准、更快、更”合理”。

但”合理”是谁定义的?

他走出米粉店,站在路边。天空在发亮——又是那种奇怪的、半透明的白色。他突然觉得,这座城市的上空有什么东西在看着他。不是人,也不是摄像头,而是某种更古老的、更庞大的东西——像是山脉本身在注视着这片土地上的每一个人。

他摇了摇头。太荒唐了。

然后他继续走。


三、秀兰的店

他找到陈秀兰的小吃店是一个巧合。

或者说,是一个在统计学上概率极低、但在叙事学上几乎必然发生的事件。

那天他在贵阳的老城区闲逛,走进了一条狭窄的巷子。巷子两边是老式的砖楼,底层开着各种小店——裁缝铺、修鞋摊、麻将室、还有一个卖香烛纸钱的老头。巷子的尽头是一个丁字路口,左边通向一条更窄的巷子,右边是一面刷了白灰的墙,墙上用红漆写着”拆”字。

正对面是一家小吃店。没有招牌,只在门口挂了一块木板,上面用毛笔写着”酸汤鱼粉”四个字。门口支了一口大铁锅,锅里的汤正在翻滚,冒着白气,散发出那种复杂的、发酵的酸味。

林未时站在门口,闻到了那个味道。和米粉店的酸味很像,但更深、更浓、更有层次——像是一段很长的时间被压缩在了这锅汤里。

他走进去了。

店里很小,只有四张桌子。其中三张空着,一张坐着一个穿校服的女孩,正在低头写作业。柜台后面站着一个中年女人——不,不是”站在”,而是”嵌在”那里。她的身体和这家店的关系不是”在店里”,而是”是店的一部分”。就像灶台是店的一部分、桌子是店的一部分一样。

她就是陈秀兰。

当然,林未时不知道这一点。他只是看到一个中年女人在煮粉,如此而已。

“一碗酸汤鱼粉。“他说。

“坐嘛。“陈秀兰说。她的口音很重,但声音很干净,像是什么东西在水里洗过之后发出来的。

他坐下来。女孩抬起头看了他一眼,又低下去了。她在做数学题,本子上写满了计算过程,数字很小很密,像是一群蚂蚁在纸上爬。

粉端上来了。汤是橘红色的,上面漂着几片薄薄的鱼片、一把葱花和一层辣椒油。他吃了第一口,然后又停住了。

这次不只是”好吃”。而是某种更深层的东西——像是这碗粉在他体内打开了一个通道,连接到了某个他已经遗忘的记忆。他想起了奶奶做的酸菜鱼,想起了小时候的厨房,想起了灶台上的火焰和奶奶被蒸汽模糊的脸。

他慢慢地吃完了那碗粉。然后他坐在那里,看着窗外的巷子,什么都没有想。

“好吃不?“陈秀兰在柜台后面问。

“好吃。“他说。然后他犹豫了一下,问:“你这个汤是怎么做的?”

陈秀兰笑了。那是一种很特别的笑——不是社交性的微笑,而是一种从内部涌出来的、像是泉水一样的笑。

“这个汤啊,要用本地的番茄,不是那种大棚里种的,是山坡上自己长的那种小小的、酸酸的番茄。然后要加米汤发酵,夏天三天,冬天五天。还要放木姜子,就是山里面那种野生的香料。我家做了三代了,我奶奶教给我妈,我妈教给我。”

她说这些话的时候,眼睛在看向某个很远的地方——不是巷子的尽头,也不是天空,而是某种时间深处的地方。

“三代人。“林未时说。

“嗯。我妈在镇上开了一辈子的小吃店,到死都在开店。她说,人这一辈子能做好一碗粉就够了。“陈秀兰说这话的时候语气很平淡,像是在陈述一个不需要解释的事实。

林未时突然想到了什么。他掏出手机,打开飞行模式之前,他曾经截了一张图——那个工单的内容。他找到了那张截图,看了看上面的手机号码,然后看了看柜台后面贴着的一张纸。纸上写着一个手机号码,下面写着”外卖请打电话”。

号码一模一样。

他愣住了。

“老板,你……你是不是在融信平台上借过钱?“他问。

陈秀兰的表情变了。不是惊恐或者愤怒,而是一种很微妙的、像是被人突然揭开了某块伤疤的表情——痛,但已经习惯了痛。

“你怎么知道?“她问。

“我在融信工作过。“林未时说。然后他意识到这句话不够准确。“我在那里写代码。就是你借钱的那个App,评分系统是我写的。”

陈秀兰沉默了几秒钟。然后她放下手里的勺子,从柜台后面走出来,在他对面坐下来。

“那你应该知道,我的额度被冻结了。“她说。语气没有怨恨,只是平静。一种经历过太多事情之后的平静。

“我知道。“林未时说。“你的工单……我看到过。”

“那你能不能帮我看看,为什么?我一直在按时还款,从来没有逾期。”

林未时低下头。他看着桌面上的纹路——老旧的木头,被无数双手摸得发亮。

“因为你在我们的系统里,被标记成了’高风险’。“他说。

“为什么?”

“因为……”他停了一下。“因为你在这里。”

陈秀兰没有说话。她只是看着他,眼睛里有一种他读不懂的东西。

“我们的模型会根据用户的地理区域计算一个风险系数。贵州……这个系数比较高。不是针对你个人,是统计上的相关性。“他尽量用最平实的语言说。

“统计。“陈秀兰重复了这个词。然后她笑了——不是刚才那种泉水一样的笑,而是一种很苦的、像是嚼了黄连之后的笑。

“我在你们平台上借了两万块钱。用这两万块钱,我盘下了这个店面,买了灶台和桌椅,开了这家店。每个月我还两千多块,还了十一个月,还剩九千多。十一个月里,我每天凌晨四点起来熬汤,晚上十一点收摊。我没有一天休息过。没有一天逾期过。”

她顿了一下。

“然后你们的系统告诉我,我是’高风险’。”

林未时说不出话来。

“你们知不知道,这两万块钱对我来说是什么?“陈秀兰继续说。她的声音依然很平静,但平静里面有一种很深的东西在流动,像是河底的暗流。“我老公三年前走了,留给我一个女儿和五万块的外债。我在工地上搬过砖、在饭店洗过碗、在超市当过收银员。我用两年时间还清了外债,然后我想,我应该自己做点什么。我妈妈教过我熬汤,我奶奶教过我熬汤,我有一个手艺。我差的就是一个起步的钱。”

“两万块。“她说。“就这么点钱。但就是这两万块钱,让我从一个打工的人,变成了一个开店的人。你们知道这意味着什么吗?”

林未时知道。或者说,他现在知道了。在他写代码的时候,“两万”只是一个数字,是数据库里的一个字段,是表格里的一个单元格。但现在,坐在这家弥漫着酸汤味道的小店里,看着面前这个女人和她灶台上翻滚的铁锅,“两万”变成了另一个人整整两年的劳动、整个下半生的赌注、和一个女儿的未来。

“对不起。“他说。

陈秀兰看着他,摇了摇头。

“不用对不起。你们做你们的事,我做我的事。只是我想让你知道,你们系统里的那些数字,每一个数字后面都站着一个人。”

林未时没有回答。他低着头,看着桌面上的纹路。那些纹路在灯光下像是某种古老的文字,记录着这张桌子见证过的所有事情——所有的碗筷、所有的对话、所有的沉默。

穿校服的女孩站起来,走到柜台后面拿了一瓶酸奶。她看了林未时一眼,然后又低下头走了。

“你女儿?“林未时问。

“嗯。初三了。成绩还可以。“陈秀兰说。她看着女儿的背影,眼睛里那种泉水一样的东西又出现了。

“她数学很好。“陈秀兰说。“每次考试都是班上第一。她说她以后要学计算机。”

林未时觉得有什么东西在他的胸腔里碎了。不是疼,而是一种结构性的坍塌——像是他花了四年搭建的那座积木塔,在某个瞬间全部倒下了。


四、概率之海

那天晚上,林未时回到旅馆,躺在床上,盯着天花板。

天花板上有一块水渍,形状像一片云——或者说,像一个数据分布图。他看了很久,发现自己在下意识地分析那块水渍的面积、形状、边缘的曲率。这是他作为算法工程师的职业病:看任何东西都会下意识地量化。

但今天下午在陈秀兰的店里,他第一次感受到了另一种认知方式——不是量化的,而是质感的。酸汤的味道、灶台的热气、陈秀兰说话时眼睛里的那种光、女孩写作业时铅笔在纸上的沙沙声。这些都不是数字,也不是可以被数字化的东西。它们是某种……存在本身的密度。

他翻了个身,拿出手机,关掉了飞行模式。手机立刻开始疯狂地接收消息——微信、邮件、App推送、未接来电提醒。他一条一条地划掉,然后打开了浏览器。

他搜索了”融信科技 降权规则 上线”。没有找到任何公开消息。又搜索了”融信科技 信用评分 调整”。只有一些第三方的分析文章,标题像是”融信评分体系重大调整,部分用户额度下降”。

他往下翻,在第三页找到了一个论坛帖子。标题是:“有没有人的融信额度突然降了?“发帖时间是三天前,也就是他删除代码的那天。

帖子里有很多回复。

“我的额度从八万变成了两万,没有任何通知。”

“我也是,打客服电话说是’系统评估’,什么意思?”

“我是做小生意的,明天要进货,现在资金链断了。”

“融信是不是要暴雷了?赶紧把里面的钱取出来。”

“我已经逾期了,因为额度突然冻结,没法周转。求问有没有类似经历的?”

“有没有人管管这种事?”

林未时把手机放下了。

他闭上眼睛,脑子里开始自动运行一个模型——不是计算机模型,而是他自己大脑里的模型。他开始计算他删除那段代码的后果。

降权规则没有上线。这意味着所有本应被扣三十七分的用户,他们的评分保持不变。在短期之内,这意味着那些用户可以继续使用原来的额度,继续借贷、继续消费、继续周转。

但在长期,这意味着融信的风控模型出现了一个缺口。那些”高风险”用户的贷款不会被降权,违约率可能会上升,公司的利润可能会下降。风控组会发现这个缺口,然后用另一种方式来弥补——也许是更严格的审核标准,也许是更高的利率,也许是另一种形式的降权。

他的行为改变了一些人的短期命运,但长期来看,系统的自我修复能力会让一切回到原来的轨道上。就像在一条河里扔了一块石头——水花会溅起来,波纹会扩散,但最终,河水会继续沿着原来的方向流。

这个认知让他感到一种很深的无力。

然后他又想到了陈秀兰。她说:“你们系统里的那些数字,每一个数字后面都站着一个人。”

这句话在他脑子里反复回响,像是一段被设置了循环播放的音频。他想起了他在融信的四年里看过的所有数据——数百万条用户记录,每一条都有年龄、性别、收入、消费记录、借贷历史、还款行为、手机型号、常用地址、社交关系。这些数据在他眼里曾经只是数据——是模型的输入、是SQL查询的结果、是表格里的一行行数字。

但现在,每一条记录都变成了一个陈秀兰。每一个”高风险”标签都变成了一个被冻结的账户、一个断裂的资金链、一个深夜打不开的手机屏幕。每一个”风险系数”都变成了一个人所在的地方、一个人的出身、一个人无法选择的命运。

他睡不着了。

凌晨三点,他起床,打开笔记本电脑。他连上了一个公共WiFi,然后用一个匿名账号登录了GitHub。他创建了一个新的仓库,名字叫”score_transparency”——评分透明性。

然后他开始写代码。

不是写一个新的评分系统,而是写一个工具——一个可以让用户理解自己被评分的工具。他把过去四年里学到的所有关于评分系统的知识都写进了这个工具的文档里:评分的维度有哪些、权重是如何分配的、哪些因素会导致评分变化、哪些因素是用户无法改变的。

他写了六个小时。天亮的时候,仓库里已经有了一份完整的技术文档和一段Python示例代码。

他看着那个仓库的页面,犹豫了很久。最终,他没有点”Public”按钮。不是因为他害怕——而是因为他知道,这样做可能会伤害到他在融信时签过的保密协议,可能会给他带来法律风险,也可能会被融信的法务团队迅速压制。

但他也没有删掉那个仓库。它就放在那里,一个私有的、只有他能看到的仓库,像是一封写好了但没有寄出去的信。


五、第七天

他在贵阳待了一周。

这一周里,他每天都会去陈秀兰的店里吃一碗酸汤鱼粉。有时候是早上,有时候是下午,有时候是晚上关门前。他坐在同一张桌子的同一个位置,看着同样的景色——灶台上的蒸汽、柜台上的菜单、写作业的女孩、门口那条窄窄的巷子。

他注意到一些细节。

陈秀兰每天会在下午两点到三点之间休息一个小时。她会在店门口支一把折叠椅,坐在那里看天。不是看手机,就是看天。有时候她会和隔壁的老头聊天,有时候她就一个人坐着,表情平静,像是在等待什么——也许是汤发酵好了,也许是女儿放学了,也许什么都不是,就是在等时间过去。

他注意到,陈秀兰的手。那是一双很粗糙的手——指节粗大,手背上有烫伤的痕迹,指甲缝里嵌着洗不掉的辣椒红色。但这双手做的事情非常精细:切鱼片的时候,刀法又快又稳,每一片都薄得透光;舀汤的时候,勺子在锅里转三圈,不多不少,每一次的味道都一样。

他注意到那个女孩——陈秀兰的女儿,叫陈一然。一然每天放学后都会来店里,在角落的桌子上写作业。她写完作业之后会帮妈妈收桌子、擦椅子、算今天的流水。她算账的时候用的是心算,速度很快,嘴唇微微动,像是在和自己说话。

有一天晚上,店里没有客人了,一然在写作业,陈秀兰在收拾灶台。林未时坐在那里喝茶——陈秀兰给他泡的,是本地的一种粗茶,叶子很大,味道有点苦,但回甘很长。

“叔叔,你是做什么的?“一然突然问他。

“我以前是写代码的。“他说。

“代码是什么?”

“就是……告诉计算机要做什么的话。就像你写数学题,用公式告诉别人怎么算。我用代码告诉计算机怎么算。”

“那你算什么?”

林未时停了一下。“我算人。”

一然歪着头看他,不太理解。

“我算一个人的分数。“他解释道。“比如说,一个人想借钱,计算机会根据他的一些信息,算出一个分数。分数高的人可以借更多的钱,分数低的人借不到。”

“那你是算分数的人?”

“我是写算分数的程序的人。”

一然想了想。“那你的程序算得准吗?”

这个问题让林未时愣了一下。

“大部分时候是准的。“他说。

“大部分时候?那不准的时候呢?”

“不准的时候……”他看了看陈秀兰的方向。她在擦灶台,背对着他们,但不知道为什么,他觉得她在听。

“不准的时候,就会有人受伤。“他说。

一然又想了想。“那你为什么不把它改准?”

林未时看着这个十三岁的女孩,突然觉得她的眼睛非常亮。不是那种比喻意义上的”亮”——不是”充满智慧”或者”闪烁着光芒”那种。而是物理意义上的亮:她的瞳孔里反射着头顶灯管的光,像是两面小小的镜子,把整个小店都装了进去。

“因为……”他说。“准和不准不是我能决定的。程序算出来的东西,只是概率。概率永远有对有错。”

“但你可以改概率啊。“一然说。“你不是写程序的人吗?”

陈秀兰转过身来了。她靠在灶台上,手里拿着一块抹布,看着林未时。

“她说得对。“陈秀兰说。“你是写程序的人。”

林未时沉默了。

“我以前也觉得,我只是在做一碗粉。“陈秀兰说。“但我妈告诉我,你不是在做一碗粉,你是在做一个人的下午。你不知道吃你这碗粉的人,今天经历了什么。也许他被老板骂了,也许她刚和老公吵了架,也许他刚刚失业了,也许她刚刚拿到了一个好消息。你不知道。但你的粉,是他今天的一部分。你做好了,他今天的这一部分就好了。你做坏了,他今天的这一部分就坏了。”

她把抹布放在灶台上。

“你写的那个程序,也是一样。你给别人打了一个分数,你不知道这个分数在别人的生活里意味着什么。但你得知道,它意味着什么。”

林未时张了张嘴,但没有说出话来。

“我不是在怪你。“陈秀兰说。“你也不是坏人。你只是不知道。但现在你知道了。”

窗外的天空又在发亮了。那种奇怪的、半透明的白色。林未时觉得,那不像是天空,而像是一块屏幕——一块巨大的、覆盖了整个城市上空的屏幕,正在显示着某种他还看不懂的图像。

一然低下头继续写作业。她的铅笔在纸上移动,留下了一行行数字。林未时看着那些数字,突然觉得它们不再是数据了——它们是一然在世界上留下的痕迹,是一个十三岁女孩对世界说话的方式。

他想起了一个很久以前读过的故事。说是一个僧人在菩提树下坐了七天七夜,然后看到了世界的真相。他不知道这个故事的细节,但他现在觉得自己理解了那个僧人——不是理解了世界的真相,而是理解了”坐七天”意味着什么。

意味着你需要离开你原来的地方,走到一个陌生的世界里,用一个陌生人的眼睛去看你做过的事。


六、数据田野

离开贵阳之前,林未时做了一件他以前从来没有做过的事:他去了陈秀兰每天买菜的市场。

不是游客会去的那个整齐干净的农贸市场,而是另一个市场——在城边的一个山坡上,每天凌晨四点开市,上午九点就收了。这个市场没有摊位编号,没有电子秤,没有移动支付,甚至没有名字。当地人说”山上那个场”,就是这里。

他五点钟到的。天还没亮,市场里已经挤满了人。卖菜的、卖肉的、卖鱼的、卖调料的、卖豆腐的——每个摊位就是一块塑料布铺在地上,上面摆着货物。灯光是摊主们自己拉的电线,挂着几只裸灯泡,发出昏黄的光。

他在这个市场里走了两个小时。

他看到一个老太太在卖番茄——小小的、不规则的、颜色从青到红过渡的番茄。他想起了陈秀兰说的”山坡上自己长的那种”。他蹲下来,问老太太多少钱一斤。

“三块。“老太太说。

他买了两斤。老太太用一个塑料袋给他装好,称是用一杆老式的秤——那种带铜砣的杆秤。秤杆翘起来的时候,老太太用手指拨了一下秤砣,然后说:“两斤二两,算你两斤。”

他在一个鱼摊前停下来。摊主是一个年轻男人,正在杀鱼,刀法利落,和陈秀兰的刀法很像。鱼是活的,在一个大盆里游来游去。盆里的水很浑,但鱼看起来很健康,鳞片在灯光下闪着光。

他买了一条鱼。

他走到一个卖辣椒面的摊位前。摊主是一个中年女人,面前摆着十几种不同的辣椒面——粗的、细的、红的、暗红的、甚至还有一种是黑色的。她让他闻每一种的味道,然后告诉他,哪种适合做酸汤,哪种适合炒菜,哪种适合蘸水。

“你这个是要做什么?“她问。

“酸汤。“他说。

“那你得买这种。“她指了一种暗红色的辣椒面。“这是花溪辣椒,不是很辣,但是香。酸汤要的就是香,不是辣。”

他买了半斤。

他在市场里走的时候,一直在想一个词:“田野调查”。这是他在大学的人类学课上听到的概念——研究者走进被研究的社区,用观察和访谈的方式收集数据,而不是从数据库里提取数据。

他突然意识到,他在融信的四年里,从来没有做过”田野调查”。他从来没有走进过任何一个用户的生活,从来没有坐在任何一个用户的餐桌前,从来没有问过任何一个用户”你的生活是什么样的”。他只是坐在三十二层的办公室里,看着屏幕上的数字,然后根据这些数字写出规则。

他不是在”计算人”,而是在”想象人”。他用数据来想象一个人——他的收入是数据,他的消费是数据,他的借贷行为是数据,他的手机型号是数据。但这些数据拼凑出来的不是一个完整的人,而是一个被切片的、被量化的、被去语境化的人。

就像那些番茄。在融信的数据库里,番茄的营养价值、产地、价格、销售量都可以被量化。但在五点钟的山坡市场上,一个老太太用杆秤称出来的、多给了二两的番茄,是量化的数据永远无法捕捉的。

那是信任的重量。


七、回到水面

回北京的火车上,林未时做了一个梦。

梦里,他站在一片巨大的数据海洋上。海面不是水做的,而是由无数行数字组成的——每一行数字都是一条用户记录,密密麻麻地排列在一起,一直延伸到天际线。海面在波动,数字在起伏,像是某种巨大的呼吸。

他低头看自己的脚。他站在一个数字上——是他的信用评分。七百二十三分。在融信的体系里,这是一个”优秀”的分数。他可以借到二十万,可以申请到最低的利率,可以在任何一家合作的商户享受”信用免押”。

但在这个梦里,七百二十三只是一个让他能够站立的数字。如果他往下沉一层——比如变成六百分——他就会沉下去一点,海水——不,数据——会没过他的脚踝。如果再往下沉——变成五百分——数据会没过他的膝盖。如果变成四百分——

他不敢想了。

他开始在数据海洋上行走。每走一步,脚下的数字就会变——有时候变高,有时候变低,像是海面在随着某个看不见的波浪起伏。他走了很久,看到了其他的人——不是具体的人,而是某种轮廓,某种存在感。他们也在数据海洋上行走,或者沉浮。有的人站得很稳,在数字的浪尖上轻松地走。有的人在挣扎,数字已经没到了胸口,他们张着嘴,但发不出声音。

他看到了陈秀兰。

她站在一个不太高的数字上——五百七十五。数据没过了她的大腿,但她的姿态很稳,像是在稻田里站着的人,已经习惯了水的存在。她的手里端着一碗酸汤——在梦里这是合理的——她在微笑。

他走向她。每走一步,脚下的数字都在变,像是他的行走本身在改变着海面的分布。他走到她面前,看着她。

“你的汤好喝吗?“他问。

“你尝尝不就知道了。“她说。

她把碗递给他。他低头看——碗里不是酸汤,而是流动的数字。数字在碗里旋转、碰撞、融合,形成了一种液体的质感,但每一滴都是一个具体的数值。

他端起碗,喝了一口。

味道是酸的。不是醋的酸,不是柠檬的酸,而是一种他从来没有尝过的酸——像是所有被错误分类的人的委屈,所有被冻结的账户的焦虑,所有被系统拒绝的申请的失望,全部被发酵成了一种味道。

但酸的后面,有一丝甜。

很微弱的甜,像是从很深的地下涌出来的一眼泉水。他分辨出了那丝甜的味道——那是陈秀兰每天凌晨四点起来熬汤的坚持,是一然每次考试第一名时眼睛里的光,是市场上老太太多给的那二两番茄,是辣椒面摊主说”酸汤要的就是香,不是辣”时的语气。

那是人的味道。

他醒了。

火车正在穿越一座隧道。窗外是黑暗的,只有车厢里的灯光在玻璃上反射出他自己的脸。他看着那张脸——三十岁,瘦,黑眼圈很重,头发有点乱——像是一个刚刚从水底浮上来的人。

他想起了一个数学概念:“涌现”。在复杂系统理论中,“涌现”指的是大量简单的个体通过局部交互,产生出超越个体的、全新的整体行为。蚂蚁群体涌现出智慧,神经元涌现出意识,水分子涌现出海浪。

他想,也许人的价值也是一种涌现。它不能被还原为任何单一的指标——不是收入,不是信用分,不是社交关系数,不是消费能力。它是在所有这些指标的交互之中,在时间的发酵之中,在人与人之间的关联之中,涌现出来的某种东西。

那种东西,他的评分系统永远计算不出来。

因为那种东西不是一个数字。它是一种密度——存在的密度。


八、第九行代码

回到北京之后,林未时做了三件事。

第一件事:他给融信的HR发了一封邮件,正式辞职。邮件很短,只有一句话:“因个人原因,申请离职。”

第二件事:他把GitHub上那个”score_transparency”仓库设为了公开。没有宣传,没有发朋友圈,没有通知任何媒体。他只是把可见性从”Private”改成了”Public”。然后他关上了电脑。

第三件事:他去了一个地方。

不是回出租屋,不是去人才市场,不是去找新工作。他去了北京西站,买了一张回湖南的火车票。他的老家在湖南西部的一个小镇上,他已经在那里生活了十八年,然后去长沙读了大学,然后来了北京,一去就是十年。

他已经三年没有回过家了。

火车上他想起了很多事情。想起小时候的镇子——一条主街,两边是各种店铺,他奶奶在街上开了一家小小的杂货铺。想起他第一次看到计算机——在镇上的网吧,一台笨重的台式机,屏幕上闪烁着绿色的字符。想起他写的第一行代码——一个简单的”Hello, World!”,在黑色的屏幕上跳出来的时候,他觉得整个世界都在向他说话。

想起他的奶奶。

奶奶在他来北京的第二年去世了。他没有赶回去。不是不想回去——而是那时候他正在赶一个项目的deadline,代码必须在周五之前提交。他在出租屋里哭了十分钟,然后擦了擦脸,继续写代码。

现在想起来,那十分钟是他人生中最长的十分钟。

火车到站的时候是凌晨四点。小镇的火车站很旧,站台上的灯只亮了一半。他拖着行李箱走出来,看到了一个完全陌生的地方。

镇子变了。主街拓宽了,两边盖了新楼,杂货铺不见了,取而代之的是一家连锁便利店。他奶奶的铺子所在的那栋楼已经拆了,变成了一片空地,周围用蓝色的铁皮围了起来,上面挂着开发商的广告牌。

但空气没有变。还是那种潮湿的、带着泥土和青草味道的空气。他深深吸了一口气,感觉有什么东西在他体内松动了。

他沿着记忆中的路走。有些路还在,有些路不在了。他走过一座石桥——桥还在,但桥下的河变窄了。他走过一棵大树——树还在,但比他记忆中的小了很多(或者说是他变大了)。他走过一个拐角——拐角还在,但拐角处的那家米粉店换了主人。

最后他走到了一个地方:镇子边上的一个小山坡。山坡上有一棵很大的树——他不知道那是什么树,但从他有记忆以来,那棵树就在那里。树下有一块石头,石头上长满了青苔。

他小时候经常来这里。放学之后,他会爬上这块石头,坐在上面看天。天很大,云很远,风吹过来的时候,整棵树都在发出沙沙的声音,像是在说什么他听不懂的话。

他爬上了那块石头。石头比他记忆中的滑——青苔很厚,踩上去有点滑。他坐下来,看着天。

天正在亮。不是那种突然的亮,而是缓慢的、不均匀的亮——东边的天空先泛出一层淡淡的橙色,然后橙色慢慢扩大,和上方的深蓝色融合在一起,形成了一种他在北京从来没有见过的颜色。不是橙色,也不是蓝色,而是一种介于两者之间的、无法命名的颜色。

他坐在那里,什么都没有想。

或者说,他在想一件很小的事。他在想陈秀兰的酸汤,在想起市场里的老太太的杆秤,在想起一然写作业时铅笔的沙沙声,在想起他奶奶的杂货铺,在想起他写的第一行代码。

这些事情之间有什么关联吗?

也许没有。也许它们只是一个人在三十年的生命里偶然遇到的一些片段,像是随机分布在一条时间线上的点。但也许,它们之间有某种更深层的关联——某种只有在他坐在这块石头上、看着这片天空的时候,才能隐约感受到的关联。

那是一种关于”看见”的关联。

他写代码,是因为他想让计算机”看见”人——用数据、用模型、用算法来理解一个人的价值和风险。但他后来发现,他写的代码没有让人被看见,反而让人变得更不可见了。因为在评分系统里,一个人不再是一个人,而是一组数字。数字越精确,人就越模糊。

陈秀兰的酸汤让他”看见”了另一种方式——不是用量化的方式,而是用味觉的方式。市场里的杆秤让他”看见”了信任的重量。一然的铅笔让他”看见”了一个数字背后的人生。他奶奶的杂货铺让他”看见”了钱最初的温度。

而此刻,坐在山坡的石头上看着天,他”看见”了——

他不知道那是什么。但他知道,那种东西不是数字可以描述的。不是算法可以计算的。不是模型可以预测的。它是一种超越了一切量化手段的、关于存在本身的某种感知。

像是菩提树下的那种感知。

他笑了。不是因为好笑,而是因为终于明白了。明白了什么呢?他也不确定。也许只是明白了:他不需要用代码来理解世界。他可以用眼睛看,用耳朵听,用嘴巴尝,用手触摸,用心感受。

天完全亮了。太阳从山后面升起来,光线穿过树叶,在他的脸上投下了斑驳的影子。他闭上眼睛,感觉到阳光的温暖,感觉到石头的凉意,感觉到风从山坡上吹过来,带着泥土和青草的味道。

他拿出手机,打开了那个GitHub仓库的页面。已经有人发现了它——star数在缓慢增长,issue里出现了一些评论。

第一条评论是:“这个文档应该被翻译成英文。”

第二条评论是:“有人能验证这些信息的准确性吗?”

第三条评论是一个链接,指向了一篇关于信用评分歧视的学术论文。

第四条评论只有一句话:“谢谢。”

林未时看着那个”谢谢”,突然觉得眼睛有点热。不是因为感动——或者说,不是因为那种戏剧性的、电影配乐响起来的感动。而是一种很安静的、很朴素的、像是小时候吃了一根冰棍之后的那种满足。

他关上了手机。

然后他从石头上跳下来,拍了拍裤子上的灰,开始往山下走。走到半山腰的时候,他遇到了一个老人家。老人家背着一篓子菜,正在慢慢地往上走。

“小伙子,你是从外面回来的?“老人家问。

“嗯。“他说。

“回来了就好。“老人家说。然后继续往山上走了。

林未时看着他走远的背影——佝偻的、缓慢的、但很稳的背影。他突然想起了陈秀兰说的话:“人这一辈子能做好一碗粉就够了。”

他想,也许他这一辈子能做好一件事就够了。

不是写代码。而是让人被看见。

他不知道那具体会是什么——也许是一个新的项目,也许是一个开源工具,也许只是一篇文档、一次对话、一个”谢谢”。但他知道,他不会再回到三十二层的办公室里,不会再面对三个终端窗口,不会再按下那个把几百万人沉入数据海洋的回车键。

他会回到地面。回到市场。回到那一碗酸汤的味道里。回到老太太的杆秤和多给的那二两。

回到人的世界。


九、余数

三个月后。

林未时在长沙的一所大学里找到了一份工作。不是教职,是实验室的技术顾问——帮社会学系的研究团队做数据分析。工资是融信的三分之一,但够用了。

他的日常工作不是写评分算法,而是帮研究者们处理田野调查的数据。这些数据不是数据库里的表格,而是录音、照片、访谈笔记、手绘地图——所有那些不能被轻易量化的、关于人的真实生活的记录。

他把这些数据整理成结构化的格式,但不会用它们来训练模型或者打分。他只是帮研究者们更好地”看见”他们的研究对象。

陈秀兰的店还在开。她的额度最终恢复了——不是因为林未时删除了代码(降权规则在他离开后的第二周就以另一个版本重新上线了),而是因为她连续按时还款十二个月之后,系统自动把她的”高风险”标签降级了。她现在可以正常借贷了,但她不再需要了——小吃店的收入已经足够支撑她和女儿的生活。

一然的成绩还是班上第一。她依然说以后要学计算机,但林未时给她寄了一本人类学的入门书。她读完之后发了一条消息给他:“叔叔,我改主意了。我以后要学既懂计算机又懂人的东西。”

林未时回了一个字:“好。”

那个”score_transparency”仓库在三个月里获得了一万七千个star。有人在它的基础上开发了一个浏览器插件,可以在融信的App里显示评分的各个维度和权重。融信的法务团队发了律师函,但GitHub没有下架——因为仓库里没有融信的代码,只有林未时自己写的技术文档和分析工具。

有记者想采访他。他拒绝了。

有风投想投资他做一个”透明信用评分”的创业项目。他拒绝了。

有人骂他是”白左”和”数据恐怖分子”。他没有回应。

他只是每天去上班,每天帮研究者处理数据,每天晚上回到他租的小房子里,喝一杯粗茶,看一会儿书,然后睡觉。

偶尔,他会在周末坐高铁去贵阳,去陈秀兰的店里吃一碗酸汤鱼粉。陈秀兰每次都会多给他加一片鱼,他每次都会说”太多了”,她每次都会说”不多,吃嘛”。

有一次,他问陈秀兰:“你觉得你的生活被改变了吗?”

陈秀兰想了想,说:“你的意思是,因为你删了那个代码?”

“不是。我是说,整体上。你觉得评分系统、互联网金融、这些科技的东西,改变了你的生活吗?”

陈秀兰用抹布擦了擦桌子,然后把抹布放在一边。

“改变了一点。“她说。“借钱方便了,以前我要跑好几家银行,没人肯借给我。在你们平台上,手机上点几下就好了。”

“那不好吗?”

“好。但是……”她顿了一下。“你们借给我钱,不是因为你们知道我,而是因为你们的系统算了我。系统说我值两万,你就借我两万。系统说我不值了,你就不借了。从头到尾,没有人知道我是谁。”

“如果有人知道呢?“林未时问。“如果借钱给你的不是系统,而是一个人——一个真正看过你的店、吃过你的粉、和你聊过天的人呢?”

陈秀兰笑了。

“那我就还钱的时候多加一个鸡蛋。“她说。

林未时也笑了。

窗外,贵阳的天空在发亮。不是那种半透明的白色了——而是一种很深的、很干净的蓝色,蓝到让人觉得自己可以看到无限远的地方。

他又吃了一口粉。

酸的。但酸的后面,有一丝甜。

他想起了一个数学概念:余数。在整除运算中,余数是除不尽的、剩余的那一小部分。它不是主要的,它不影响大局,它是系统运行后剩下的、被忽略的、看似无用的残余。

但余数恰恰证明了系统的不完美。余数恰恰是那个无法被整除的、无法被完全纳入计算的东西。

也许人就是余数。

也许那些评分系统算不到的东西——一碗酸汤的味道、一个十三岁女孩的眼睛、一块石头上的青苔、一棵树的沙沙声、一杆秤多给的那二两——就是人的余数。

是那些除不尽的部分。

是那些让”人”成为”人”的部分。

他把最后一口汤喝完了。碗底是空的,但碗壁上还残留着一些汤的痕迹——橘红色的、油亮的、在灯光下折射出微弱的光。

他看着那个空碗,觉得它很好看。

不是碗本身好看——它只是一只普通的白瓷碗,边上还有一个小缺口。好看的是碗壁上的那些痕迹——它们记录了一碗酸汤存在过的证据,记录了一次完整的品尝,记录了一个人在某个下午、某座城市、某家小店里的一个瞬间。

那个瞬间不是数据。但它存在过。

就像余数不是整数。但它确实存在。


十、最后一行

这个故事没有结局。

因为正在发生。

此时此刻,有一个人正在某个办公室的第三十二层,面前开着三个终端窗口,手指悬在回车键上方。他或者她,正在犹豫要不要按下那个键。

此时此刻,有一个人正在某个省份的一个小城里,看着手机屏幕上的一个数字,那个数字告诉她或者他,明天能不能进到货、能不能交上房租、能不能继续生活。

此时此刻,有一个人正在某个山坡上的石头上坐着,看着天空慢慢变亮,闻着泥土和青草的味道,想着一些数字无法衡量的事情。

这些人在同一个国家、同一个时间、同一个被数据编织起来的世界里。但他们看不见彼此。评分系统看见了他们的数据,但没有看见他们。算法预测了他们的行为,但没有理解他们。模型计算了他们的风险,但没有计算他们的重量。

重量是什么?

重量是陈秀兰每天凌晨四点起床时,脚踩在冰冷地板上的那一秒钟。重量是林未时按下删除键时,手指的轻微颤抖。重量是一然在作业本上写下每一个数字时的认真。重量是市场上老太太多给的那二两番茄。重量是一碗酸汤在发酵时,时间留下的痕迹。

重量是那些系统算不到的东西。

重量是余数。

如果你是一个正在写代码的人——一个正在构建某种系统、某种模型、某种算法的人——请你记住:

你写的每一行代码,都会变成某个人生活的一部分。也许是一个很小的部分,小到那个人永远不会注意到。但也许是一个很大的部分,大到足以改变那个人的一天、一个月、甚至一生。

你不需要为此感到恐惧。你只需要为此感到清醒。

清醒地知道,你的代码不是中性的工具。清醒地知道,“优化”永远有一个被优化的目标,而目标的选择本身就是一种价值判断。清醒地知道,“数据驱动”不是客观的同义词——数据是人收集的,模型是人训练的,规则是人写的,而你,就是那个”人”。

清醒地知道,在每一个数字的背后,都站着一个和你一样的人。

然后,做你认为对的事。

也许你会按下回车键,也许你会按下删除键。也许你会留在三十二层,也许你会走到地面。也许你会继续写代码,也许你会去吃一碗酸汤鱼粉。

无论你做什么,都请你——

看见他们。


(完)