零点一元 第 9 / 14 章

第八章 · 软件葬礼

Day 70。北京 798,晚上八点。

仓库是个九十年代的老厂房,屋顶很高,中间挂着一根钢梁。那根钢梁今晚被绑了一块投影幕,正面对着北墙。墙上,一个数字以每秒大约三次的频率往上跳——

当晚 GitHub 新增 archived 仓库数: 173,841 173,842 173,844

数字旁边,一行小字:数据来源:Hugging Face Hub + GitHub Archive · 由 agent observability 厂商 Lighthouse 提供。

仓库里大约三百人。没有桌椅,只有一圈沿墙摆的折叠凳。中间是水泥地。林行进门时,门口的工作人员递给他一张白色卡片,上面写一行字:"今晚,我们送一个时代下班。" 卡片背面是一个二维码,扫了之后是当晚议程。

仓库地面是九十年代浇的素混凝土,踩上去有一种轻微的回声——三百人各自移动,鞋底在水泥上的摩擦声叠在一起,变成一种持续的、近乎潮汐的低响。仓库一角原本应该是吊车轨道,现在轨道还在,锈得发红,挂着两条粗麻绳——上面绑了几十张 GitHub 用户的 contributor 头像打印件,头像下面打印着每个人的 commit 总数。林行扫了一眼最近那一张,那是一位他以前在 RubyGems 里见过的维护者,77 万次 commit,2008 年到 2024 年,头像底下打了一行小字:"已 archive。已离开行业。已经回家陪妻子。"林行盯着这一行看了五秒。

仓库的空气里漂着一种他熟悉的味道——是工业风装修常见的那种水泥灰加新刷涂料的味道,但这一晚多了两层。一层是后台某处煮咖啡的焦香,另一层是 300 个人各自身上带进来的下班后的疲惫味。林行后来想,这种味道是只有"这一行的人聚在一起送别这一行"的时候才会出现的味道——它不是悲壮,它是疲。它是 300 个曾经每天通宵的人,这一晚第一次允许自己疲。

林行扫了一下议程。

议程一(20:00-20:15):Manus 朗读 stripe-go 的 README。 议程二(20:30-20:50):嘉宾分享。陆衡 · 衡安创始人。 议程三(21:00-21:30):自由发言。 议程四(21:30-21:50):墙上 archived 数字归零仪式。

林行没认识陆衡。他选了离投影幕最远的角落,坐下。

二十点零分。仓库的灯灭了一半。一个女声从音响里说:"我们开始。"

接下来的十五分钟,Manus 用一个介于男声和中性声之间的合成音,朗读 stripe-go 的 README。它读得不快,每一行后面留半秒停顿。它读到 // Package stripe provides the binding for Stripe REST APIs.,它读到 // Copyright 2014 Stripe, Inc.,它读到那一行林行从来没注意过的、放在文件最末尾的一行注释:// Thanks to everyone who ever filed an issue.

林行那一刻把头低下去。他没哭——他三十四岁了,他不在公开场合哭——但他鼻腔里是热的。

朗读完,场内零声。三百人没人鼓掌。

二十点三十分,陆衡上台。

他穿一件深灰色的衬衫,袖子卷到肘弯。他没用麦克风,他直接对着场内说话。他第一句话是:"我爹是河南某县殡仪馆的老馆长。"

林行抬起头。

陆衡讲了二十分钟,他讲他爹那两段——白线和半寸。他没讲他自己的衡安 ARR,他没讲投资人,他没讲行业分析。他讲到最后,他说:"我们这群人——做软件的人——过去二十年都以为护城河是技术。但 0.1 元那一晚,技术沉了底。沉下去之后,水面之上长出来的不是新技术,是那些没法被通用 agent 学会的东西。我爹的白线是一个。半寸是一个。一个老太太晚上能不能睡着,是一个。"

他停了一下。

"潜规则就是数据。"他说,"数据就是护城河。"

林行在台下,把这句话默默地在心里重复了一遍。然后他自己接了一句——只在心里——"会不会是,愿意慢的能力?"

他不知道自己什么时候在心里组出这句话的。但组出来的那一秒,他想起他妻子早上煎蛋的那一刻——她每说一句重要的话之前,都会先把嘴里的东西嚼完。

陆衡下台的时候,从林行旁边的那条过道走过——林行靠走道的位子。陆衡那一刻没认识林行,陆衡眼神扫过去,他看见的是一个穿浅灰夹克、左手食指在腿上慢慢敲的男人。陆衡愣了 0.3 秒。陆衡敲过太多次桌子,他认得这种节奏——这是一个有过一个真正听过他说话的师傅的人留下的节奏。陆衡没停步,他从林行旁边过去,继续往后台走。林行也没抬头看他。两个人离得最近的那一刻,大约 30 厘米。两个人都没意识到这是他们第一次同框。

陆衡下台。掌声很久。

二十一点。自由发言。一个看上去六十多岁的男人上台,他说他叫陈守仁,77 岁,77 年前——他笑了一下,自己改口——他做了 38 年开源,他参与过 GNU 工具链。他今晚来,是因为他下周要住进一家临终关怀医院,他想趁还能站着,把"配得上被记住的那部分代码"说一遍。

林行听到"临终关怀"四个字,身体微微往前倾了一寸。

陈守仁讲了八分钟。他讲他第一次给 GCC 提交 patch 是 1989 年,讲他第二个孩子出生那天他正在调一个连续两周没修出来的 bug,讲他妻子去年走了之后他把家里那台 ThinkPad T420 从书房搬到客厅、再搬到床头、最后他自己住进医院之前又把它搬回床头柜。他讲到他妻子的时候,他停了大约六秒——他没擦眼镜,也没低头,他只是把麦克风换到另一只手。仓库三百人这六秒里没有任何声音——连墙上 archived 数字滚动的"嗒嗒"声都好像被这六秒按住了。

他讲完,把麦克风递给下一个人,慢慢走下台。林行看见他走的时候右腿微跛。林行那一刻在心里记下"陈守仁"三个字,他没意识到 60 天之后他会在临终关怀医院的病床上,接住这位老人

二十一点半。墙上数字归零仪式。组织者按了一下遥控,投影上那个 173,xxx 的数字被一个白色的"0"覆盖。底下一行小字:"今晚截止,中国大陆区 archived repo +18 万。"

仓库里有人轻轻嚯了一声。

林行起身,往外走。

他在仓库后台一个临时的茶水台前停了一下。他想喝口热水。一个穿米色毛衣的女孩,手里端着一个保温壶,看他脸色,直接给他倒了一杯。

"你脸色不太好。" 她说,"喝点。"

林行接过来,没抬头。"谢谢。" 他说。

水温比他预想的高一档——大概八十度,稍烫。他端着杯子,先用嘴唇沿着杯沿试了一下,没喝。他这一刻闻到那个倒水女孩身上很淡的一种味道——是某种琴谱纸特有的、米浆胶的味道。这种味道他在他妻子大学时代的旧诗集里闻过,他没把这两件事联系起来。他不知道,他这一辈子离一个 19 岁的姜禾最近的一刻,就是此刻——隔着一个保温壶,隔着一杯八十度的热水,隔着 798 后台一盏暗黄的灯。他低着头,他没看姜禾的脸。姜禾也没刻意看他——她只看了一眼他端杯的手,看见他左手食指在杯沿上敲了一下,敲得很轻,但节奏她记住了。她当时不知道这是谁,她也没多想。她端着保温壶走开了。

女孩没多话,端着保温壶继续给下一个人倒。

林行喝完那杯水,把杯子放回台面,走出仓库。

外面下小雨。雨不大,落到水泥路面上是一点一点的暗色斑,落到他夹克肩头是一点一点的凉。798 这一带晚上路灯偏暖黄,雨丝在路灯里被照成一种很淡的金色——像是有人把这一晚的疲拉成了一根一根的细线。林行站在路边,他抬头看了一眼天空——天空是 798 上方那种被城市光污染反照过的暗紫色,他从这个暗紫里数出三颗星,数到第三颗他停下了。三颗星这个数,他十年没数过。他十年来每一晚的天空都是 Slack 通知打开时手机屏幕的那种白色。

他在路边站了三秒,拦了一辆车。

司机问:"师傅去哪儿。"

林行想了三秒。他自己都不知道为什么想了三秒。然后他说:"医院。"

司机没追问哪家医院,直接发动了车。林行看着车窗外 798 的霓虹一点一点退后。他从口袋里把手机摸出来,打开备忘录,新建一条:

Day 70。

他停在那里很久,没继续打字。

车从 798 开到协和医院的路上,雨慢慢变大。司机把雨刷开到二档,雨刷在挡风玻璃上来回扫,声音是规律的——刷、刷、刷。林行靠着后座头枕,闭眼。他不打算去协和。他甚至不打算去任何具体的医院。他刚才回司机"医院"两个字,只是因为他这一晚听到陈守仁讲"我下周要住进一家临终关怀医院"那一句之后,"医院"这两个字在他脑子里变成了一个非常具体的、可以走进去的地方——而不是过去三十四年里他每次听见这个词都会自动绕开的那种背景词。

到了协和门口,司机问:"师傅,在这儿停?"

林行睁眼,看了一下医院大门——夜班的灯还亮着,急诊门口有几个人在等。他想了三秒。

"不停了。" 他说,"麻烦掉头,送我回家。"

司机没说话,把车掉头。

回家的路上,雨没有变小。林行靠着头枕,半睡半醒。他后来想,这一夜他没真的去到任何医院,但他在心里已经走进去过一次。这一次走进去,就不需要 Day 130 才走进去第二次。

到家的时候是深夜十一点四十一分。妻子还没睡——她在台灯下改作文。林行没问她为什么没睡。妻子也没问他去了哪里。她只是把自己那杯热水推到他面前。

(第八章 · 完)