创作声明:本文为虚构创作,请勿与现实关联

纪怀舟偷走核心代码那天,苏默白在出租屋里坐了三个小时。

然后他打开电脑,登录了一个很久没用的GitHub仓库——十年前,他和纪怀舟还在大学机房通宵赶项目的时候用的那个仓库。

他翻到最底层一行注释:「//这行代码我知道有问题,但产品明天要上线,先这样。等用户量超过百万,我再重写。——苏默白,2015年11月。」

他盯着这行字看了一整夜。

第二天,他租下了纪怀舟公司正对面的办公室,架起四台投影仪,把那行BUG代码打在了六十平米的玻璃幕墙上。

第三天,不是骂人,不是举报,是一行代码,二十四小时滚动播放。纪怀舟透过百叶窗看到那行代码时,手里的咖啡杯掉在了地上。

01

纪怀舟把我踢出公司那天,是周四下午。

他约我在楼下的咖啡厅见面,点了两杯美式。咖啡还没上来,他就从公文包里拿出了一份文件——股东会决议。我的名字不在上面。他把文件放在桌上,推到我面前,动作很轻,像是怕碰洒什么。他说公司的核心代码是团队共同开发的,知识产权属于公司,不属于任何个人。他的声音不高不低,语速均匀,每个字都像提前排练过。我看着他,问你说的是哪个团队。他没回答。

他旁边坐着公司法务,一个我没见过的人,穿深灰色西装,领带松了一扣。法务的手放在桌上,手边摊着一份技术服务合同——我签过的那份。他指了一下合同第七页的某个条款,没有念出来。我知道那条款写的是什么。当初纪怀舟跟我说,签技术顾问合同是税务上的权宜之计,方便走账。我信了。签了。现在这份合同在法律上的定义是:我是一个按月拿服务费的外包技术顾问。合同到期的那个月,他不再续约。我和这个公司没有任何股权关系。我写了所有代码,但法律上,代码是公司的。

我站起来。椅子刮在地砖上发出一声尖响。我端起自己那杯美式,放在他面前。咖啡液面晃了两下,洒出来几滴,洇在他那份股东会决议的纸边上。我说你喝吧,你需要醒醒。然后我走出了咖啡厅。

外面在下雨。不大。手机震了,是公司OA系统发来的离职确认提醒。纪怀舟是个细致的人,连离职流程都提前帮我走完了。系统提示:您有新的待办——确认离职交接清单。清单编号后面,我点进去看,核心仓库的提交记录里,我所有的签入名都被替换成了三个字母——J.H.Z.。纪怀舟。那些代码的注释还是我的笔迹,但名字被擦掉了。像一个陌生人穿着我的衣服走在街上。

我回到出租屋。在沙发上坐了三小时。窗外的雨停了,又下,又停。天黑了。我没有开灯。然后我打开电脑,登录了一个很久没用的GitHub仓库——十年前我们在大学机房赶第一个项目时用的那个。那时候还没有云帆企服,没有融资,没有客户。只有我和他,两台旧电脑,一包泡面掰两半分着吃。仓库还在,没被清理。

我点进最底层的那个文件,拉到代码最后。一行注释还在。

「//这行代码我知道有问题,但产品明天要上线,先这样。等用户量超过百万,我再重写。——苏默白,2015年11月」

屏幕的光照着我的脸。窗外又开始下雨。我没有修改这个文件,只是往下翻。文档区有一份《技术债务清单》,文件名很正式——是当年创业比赛要求提交的“已知问题与改进计划”。清单第三条写着底层调度算法在大规模并发下的时间戳错位风险,预估重构周期三周。末尾有一行回复,纪怀舟写的:「好的,先记着。上完线回头一起改。——J.H.Z.」

两份文件,同一年的同一个月。我当时没有多想。关掉文档区,回到那行注释上。手指悬在键盘上方,没有按下任何一个键。只是看着那行注释,看了一整夜。十年前的我用两行斜杠给自己留了一句话,十年后我才看清楚那句话还留着。

打开网易新闻 查看精彩图片

02

我没有打官司。纪怀舟在这件事上的准备比我想的更充分,当初的合同条款每一个字都是拦路虎。我需要时间,需要一种他无法用律师函挡回去的方式。

我打了几个电话,找了写字楼租赁中介。中介叫小丁,二十五岁,头发打了太多发蜡,说话语速很快。他带我看了几个办公空间,我都不满意。直到他领我到望江路那栋写字楼——二十一层,正对面是纪怀舟的新公司「云帆企服」。两栋楼间距不到三十米,近到我能看清他办公室百叶窗上的灰尘。他的办公室在对面楼的十八层,一整面玻璃幕墙,阳光照在上面反着光,像一块巨大的广告牌。

我租下了最靠窗的那间。六十平米,月租押一付三。然后我去二手市场买了四台工程投影仪,型号很老,灯泡用了很久但亮度足够。我把它们并排架在窗边,镜头对准对面写字楼的玻璃幕墙。画面要投满整面墙——不是我这边这面,是他的那扇墙。我在玻璃上贴了一张黑色的遮光膜,把自己这面遮住,只留投影仪的镜头从缝隙里伸出去。像一个枪管。

我在窗边的墙上贴了一张纸条,写了一句话:从这面窗户看出去,只有一行代码。

03

投影开始的那天,是纪怀舟公司新办公室启用的第一天。

他那天请了客户来参观,门口摆了花篮,前台在分蛋糕。云帆企服四个大字挂在背景墙上,烫金字体,灯光打在上面亮得晃眼。我从二十六楼往下望,能看到穿西装的客人们在门口握手、交换名片。透过玻璃幕墙,能隐约看到纪怀舟的背影——他在人群中间,手在空中比划着什么,大概在说云帆的未来。

下午三点,访客最多的时候,我按下了投影仪的开关。

一行代码,白色字体,打在纪怀舟公司正面的玻璃幕墙上。二十四号字,CourierNew,等宽字体。每一个字符清晰到能看清分号上的弧度:那行十年前的注释,和注释下面那十二行缩进对齐的BUG代码本身,像一个袖珍的墓碑。四台投影仪,每一台打一句版本迭代记录——从2015年的初版,到2018年被删掉的提交备注,到今年仓库里被替换的签名。信息流在玻璃上慢慢滚动。没有骂人,没有举报,没有泄露一行商业机密。只是一行十年前的代码,和一段被删掉的提交历史。

路人开始停下来拍照。先是一个外卖骑手,他把电动车停在路边,仰头看了半分钟,掏出了手机。然后是两个穿格子衫的年轻人,大概是隔壁写字楼的程序员——其中一个举起了手机,嘴巴张着,没有合上。接着越来越多。有人在打电话,有人在大声念出那行注释里的日期和署名。

楼下保安仰头看了半天。物业的人来了,敲门。我没有开。他们报警。

民警来了两个,一老一少。老的走进我办公室,看了看窗边那四台投影仪,又看了看对面玻璃幕墙上滚动的代码。他转过头看我:「这玩意是你弄出来的?」

「是。」

「这是什么东西。」

「代码。我写的。上面有我的名字和日期。」

他沉默了一会儿,走到窗边,盯着对面墙上的字幕看了大概五分钟。投影仪嗡嗡地响,一行一行代码从玻璃上滑过去。他转过来问我:「这违法吗。」

我说不违法。不是诽谤,不是侵权,代码是我写的,注释是我写的,我只是在展示一份公开仓库里的历史记录。他斜靠在我那台旧投影仪旁边,又看了半小时滚动字幕,然后站起来说了一句话:「要是人家公司因为你这行字倒了,算谁的。」

「代码本身不杀人。触发的条件是他自己写进去的,他也未必还记得。」

老民警看了我一眼。那个眼神没有恶意,也没有同情,只是一种见过太多事情之后的平淡审视。他没再说话,招呼年轻的那个走了。走到门口,他回头看了一眼我贴在墙上的那张纸条,没读出声。他的嘴唇动了动,然后关上了门。

第二天,写字楼物业接到一个电话。不是投诉。是有人想租我对面那间更大的办公室,要求窗户正对着那面幕墙。他说他想每天看到那行字。

04

投影开始后的第三天,纪怀舟没来找我。

他让法务发了一封律师函,说我「干扰正常商业活动」,要求立即停止投影。我把律师函扫描成PDF,第二天把它投在了他的玻璃幕墙上。函里有一行字被我不小心放得特别大——「贵方行为已构成不正当竞争」。我把「不正当竞争」五个字排在那行BUG代码的旁边,字体放大到和代码注释一样的大小。路过的人越来越多。有人在拍照,有人录视频发到网上。一个穿格子衫的年轻人站在对面楼下,仰头看了五分钟,嘴里念叨着什么。然后他转身走了——走的方向是云帆企服的大门。他大概是被叫来改BUG的。

第五天,出事了。不是纪怀舟的事——是他客户的事。

云帆企服的核心产品是一套物流调度SaaS系统,卖给中型物流公司。系统底层有一个自动分配运力的算法模块,是核心中的核心。而这个模块的底层,就藏着十年前那行BUG。触发条件很简单——单日订单量超过一百万。过去十年,没有客户超过这个量。

直到上个月,纪怀舟签了「通远物流」——全国前二十的物流公司。通远物流的单日订单量,峰值一百三十万。

系统开始崩溃。不是一次性崩溃,是间歇性。运力分配出错——明明是往华东的货,系统把车派到了西北。时间戳错位——已经签收的订单重新出现在待发货列表里。调度结果延迟,整个链路出现间歇性断裂。通远物流的研发团队紧急排查,两天两夜没合眼,从底层模块一层一层往上翻,最后找到了那行BUG。他们试图修改。改了三版,每一版都在测试环境里把别的模块带崩。那行代码背后的算法是一个自定义变种,用一种非常冷门的递归结构写的——不是标准模式,是苏默白大四实习时自己写的一个算法变种。改一行会引发整个模块的逻辑链条断裂,像拆一个自己会动的炸弹。

通远物流的电话打到了云帆企服的客服部。语气从客气变成冷硬。他们说如果在两周内修不好,合同终止,追偿违约金。违约金是多少不重要。重要的是通远一旦解约,其他客户会跟着走。

纪怀舟知道这一点。他开始打电话。不是打给我。打给以前公司的技术骨干,一个一个问能不能改这行BUG。我在前同事群里的消息记录里看到有人发了一句:「怀舟昨晚打了四个电话,语气一个比一个急。」没人能改。那行BUG是苏默白写的,只有苏默白能改。

他最后打给了我。

05

他约我在楼下的咖啡厅见面。

同一家咖啡厅,同一种美式。这次他先到了,坐在靠窗的位置,桌上没有文件,只有两杯冒着热气的咖啡。他比上次瘦了,衬衫领口松了一指,眼睛里血丝密布,下巴上有没刮干净的胡茬——纪怀舟从来不在见人之前不刮胡子。他叫我默白,不是苏默白。默白是我们大学时互相叫的称呼。他在试图把一个被背叛的合伙人拉回室友距离。

他说他可以给我公司百分之十五的股份,签正式协议,这次签真的,有律师公证。我说不要。他又说,或者一笔现金,具体数额让我自己填。他掏出支票簿,放在咖啡杯旁边,钢笔搁在支票簿上。我说不要。他沉默了一会儿。窗外能看到对面写字楼的玻璃幕墙,那行代码还在滚动。从咖啡厅的窗户往外看,刚好能看到那行代码投在云帆企服的logo上方。

「那你到底要什么。」

我说:「你站在你的客户面前,亲口告诉他们。这行代码是谁写的,谁删了谁的提交记录,谁把创业的合伙人踢出了他一手创建的公司。」

他不说话了。咖啡凉了。奶精在液面上凝成一层薄膜。

法务在旁边,还是那个灰西装的。他在桌下用手机发了一条消息。过了一会儿,纪怀舟的手机亮了。他低头看了一眼,脸色变了。他手机屏幕上是我刚发布的一个公开技术文档——里面有那行BUG的完整剖析,包括触发条件和历史提交记录。那些被删掉的Commit记录全部挂在文档里,时间戳、修改内容、原始作者署名。我把它们从旧仓库里一条一条找出来,一个一个放在公开页面上,标签就打在页头:「已知技术债务,原作者记录。」

他盯着手机屏幕足足一分钟。然后把手机翻过来放在桌上,抬起头看着我。他眼睛里第一次出现了一种东西——不是愤怒,是恐惧。他怕的不是这行BUG。是不知道我还有多少行这样的代码、多少条存着的记录、多少个十年没删干净的注释。

法务在旁边敲电脑,敲了几下停了。大概是在查我公开仓库有没有侵犯知识产权——没有。代码是我写的,十年前写在私人仓库里,不是公司的。我展示的也是公开仓库,时间戳不可篡改。

我起身走了。走到门口的时候,纪怀舟在我身后说了一句:「你十年前就防着我。」

我没回头。推开咖啡厅的门,玻璃上映着对面写字楼幕墙上的代码。它还在滚。

06

他查了所有备份。找到了那个GitHub仓库的时间戳。

那天晚上他独自来了我的办公室。没有法务,没有咖啡,没有开场白。门没锁,他直接推门进来。雨伞上的水一滴一滴滴在地板上。外面又下雨了。

他站在门口。我坐在窗边,身后四台投影仪还在工作,嗡嗡的声音填满了整个房间。他的脸被投影仪的蓝光照亮,一半明一半暗。他说这行BUG不可能是意外留下的。十年前我们的产品还在校园测试阶段,用户量不到一千,根本不可能想到有一天会有百万订单。想得到的不是产品——是我写的那个递归变种算法,它比我上过的任何编程课都更难读,但唯独这行BUG,夹在用不上它的年代里,卡在一个永不可能被触发的条件上。他不明白我为什么在根本没有用户的时候就埋了这个东西。

「那个算法,」我说,「你不是一直说它整段都长得像另一个时代的遗产吗。」

他愣了一下。然后他的脸白了——白到投影仪的蓝光打在他脸上都没有血色。他从我的语气里听出来了。听出了这行BUG是什么。

这行BUG不是意外。是我十年前故意留的。

不是我预知了背叛。是我不信任何人,包括我自己。我在每一个重要项目里都会留一行只有我自己能解的锁——不是什么高级后门,是如果我被拿走作品的署名权,它就是活的证据。我把命名规则嵌进了一段没人能读懂的递归,外人不碰它,相安无事。一旦有人试图删掉我的名字,它就等着某一天被人翻到,把时间戳和触发条件一起摆出来。十年前我写了这把锁,十年后他自己撞了上去。我没有上他的锁。是他用他删掉的那些签入记录,撬开了我十年前埋的保险柜。

他扶着门框。雨声很大,但他的呼吸声比雨声还重。投影仪把代码一帧一帧投到他背后的墙上,白色的字符从他肩头滑过去。几年前我最后一次和他一起写代码的时候,他坐在我旁边,说你这人写注释总是太长。我说注释不是写给机器的,是写给以后看代码的人的。他问以后是谁。我说以后是任何人。

现在这个任何人是他自己。

我站起来,投影仪的光从我背后投过来,把他的影子拉得很长,投射在对面的百叶窗上——就是那扇窗背后他明天就要跟客户解释为什么连自己的核心代码都改不了的地方。「你还想让你的客户听见什么。我可以帮你投上去。」

他没有回答。他的手抓着门框,骨节泛白,像抓住一块浮木。然后他松开了手,退后半步,走进了走廊的黑暗里。门在他背后缓缓合上。投影仪的嗡嗡声填补了整个房间。