我给隐居多年的父亲发消息——他是中国互联网最早一批传奇架构师,但名字早已被行业遗忘。
“爸,我做了两年的推荐算法框架,被总监署名为‘核心创新’,明天就要在发布会上展示。我可能要卷铺盖走人了。”
父亲没有反应。
发布会当天,行业巨头云集。总监站在台上,对着PPT侃侃而谈,台下掌声如潮。直到提问环节,一个问题引发网络热议。
“请问,这个‘基于长序列行为的动态兴趣网络’的核心推导,您说是您团队独立完成的。但据我所知,这个公式的第二部分,三年前曾在一个个人技术博客上发布过。博主ID是‘LZ_1978’,后来注销了。您能解释一下,为什么核心代码里的注释,和那个博客的署名完全一致吗?”
全场哗然。
总监面如土色,发布会中断直播。
人群后方,我掏出手机。屏幕上,父亲注销多年的博客,悄然更新了一行字:
“代码可以抄袭。但解决问题的视角,是偷不走的。”
01
我两年的心血,变成了别人的东西。
公司内网刚刚更新了明天发布会的最终议程。
压轴环节的标题是:“突破性推荐算法——基于长序列行为的动态兴趣网络”。
演讲人:张维,技术总监。
下面的简介里写着:“由张维总监带领核心团队自主研发,攻克了长序列建模中的兴趣漂移难题,实现了推荐效果的显著提升……”
我把那张截图放大,看了整整五分钟。
那个算法叫什么名字——基于长序列行为的动态兴趣网络。这个名字,是我起的。
两年前我加入这家公司的时候,张维还不是总监。
那时候我们坐在同一排工位,他工位在我左边,每天中午一起下楼抽烟。
他烟瘾比我大,抽的是中南海,我抽的是黄鹤楼。
他说我代码写得漂亮,我说他PPT做得好看。互相吹捧,也互相帮衬。
有一次周末加班,只剩下我们两个人。
他忽然问我:“老陆,你说咱们干到什么时候是个头?”
我说不知道。
他笑了笑,说:“我想当总监。”
我说那你加油。
他看着我说:“你不想?”
我说:“我想写出一个让所有人都在用的算法。”
那时候我们都年轻,说的话都是真的。
后来他升了总监,搬进了独立办公室,抽烟也变成了一个人站在消防通道里抽。
偶尔在电梯里遇见,他还是笑着打招呼,但那种笑,和以前不一样了。
但算法的事,他没忘。
那套DSIN的初版代码,是我入职第三个月开始写的。用了半年时间搭出框架,又用了一年时间反复调优、迭代、验证。每一次版本更新,我都抄送邮件给他——他是技术总监,这是流程。
他每次都回两个字:“收到。”
然后就没有然后了。
直到三个月前,公司决定做一次大的产品升级,需要一套全新的推荐算法。
技术委员会开会讨论,张维站起来,说:“我这里有一套方案,已经内部验证过,效果不错。”
他展示的PPT里,有完整的架构图、公式推导、离线测试数据。
那里面每一个核心模块,都来自我这两年写的代码。
会后我找他谈。
我说:“张总,那个算法,是我做的。”
他看着我,眼神很真诚——那种让你怀疑自己是不是记错了的真诚。
“小陆,我知道你做了很多工作。但算法这东西,是在迭代中完善的。你贡献了基础版本,我带领团队做了后续的优化和落地,这是集体成果。”
“那署名呢?”我问。
他笑了,拍了拍我的肩膀:“署名的事,公司有公司的规则。你放心,到时候会体现你的贡献。”
我信了。
然后我等来了今天这份议程。
我给父亲发了一条微信。
父亲叫陆正,是中国互联网最早一批程序员。
九十年代末,他在一家当时还叫“瀛海威”的公司写代码,后来自己创业,做出过一个日活千万的产品。
再后来公司被收购,他拿着钱退隐江湖,在杭州买了一套房子,每天喝茶、看书、写点开源代码。
他的名字,行业里还有老人记得。但对现在的年轻人来说,已经和考古差不多。
这些年他很少管我的事。我毕业、找工作、跳槽来这家大厂,他从来没打过招呼。
偶尔通电话,他问的最多的是:“代码写得开心吗?”
我说开心。他就说:“那就行。”
但今天凌晨两点十七分,我不知道为什么,就是想告诉他。
“爸,我做了两年的推荐算法框架,被总监署名为‘核心创新’,明天就要在发布会上展示。我可能要卷铺盖走人了。”
等了五分钟,没有回复。
我又发了一条:“那个算法叫DSIN,你还记得吗?去年我跟你聊过。”
又等了十分钟。
屏幕终于亮了。
“记得。”
我盯着那两个字,不知道该哭还是该笑。
我爸还是那个我爸。话少,字更少。
“知道”是什么意思?觉得无所谓?我被扫地出门不重要?
我没再问。
关上手机,我打开电脑,把DSIN的代码库从头到尾看了一遍。四十七个模块,三万两千行代码。每一行都是我写的。每一行注释都是我敲的。
最后几行注释里,我写了一句:“感谢父亲,教会我写第一行代码。”
那是我六岁的时候,他用一台386电脑,教我在DOS系统里敲“Hello World”。
我合上电脑,躺回床上。
窗外的天快亮了。
02
早上八点,我醒了。
手机上多了十几条未读消息。有大刘的,有老孟的,还有几个平时不怎么联系的同事。
大刘发的是一条链接,标题是:“今日发布会前瞻:某大厂将发布重磅推荐算法”。下面配图是张维的照片,西装革履,笑得一脸自信。
大刘的留言:“老陆,你今天来公司吗?”
我没回。
老孟的留言更直接:“听说那个算法是你的?真的假的?”
我还是没回。
放下手机,我走进卫生间,看着镜子里的自己。黑眼圈很深,眼睛里全是血丝。我洗了把脸,刮了胡子,换了一身干净的衣服。
然后我坐回电脑前,打开了直播页面。
直播间还没开始,黑屏上显示着倒计时:05:23:47。
我盯着那个数字,一秒一秒地跳。
脑子里乱糟糟的。
我想起刚来这家公司那天,张维带我去工位,帮我装电脑,告诉我茶水间在哪里。
我想起我们一起熬夜上线,凌晨三点叫外卖,他抢着付钱说“下次你请”。我想起他说“老陆你代码真牛逼”的时候,那语气是真诚的。
我到底哪里看错了他?
或者说,他到底是什么时候变成这样的?
手机震了。是老周。
老周叫周建国,基础技术部的资深专家,五十多岁,头发花白,在公司属于那种“扫地僧”级别的人物。
平时我们没什么交集,只在几次技术分享会上听过他讲话。
他的微信头像是一个茶杯,朋友圈一年发不了一条。
“小陆,今天的事,我看见了。”
他的消息很简单。
我回:“周老师,您看见什么了?”
他回:“我看见那个议程。也看见你昨晚发的朋友圈。”
我愣了一下。
我昨晚发了一条朋友圈,只有一句话:“两年,三十二万行代码。”没有配图,没有解释。但懂的人自然懂。
我回:“周老师,您信我吗?”
他回:“我信你爸的儿子。”
这句话让我怔了很久。
九点,我开始洗漱。十点,我出门买早餐。十一点,我回来继续盯着倒计时。
十二点,直播间开了。
屏幕上出现了发布会现场的舞台,灯光璀璨,背景板上印着公司的Logo和发布会的主题。观众席上坐满了人,前排是各家媒体的记者,后排是受邀的合作伙伴和行业人士。
弹幕开始飘过:
“期待!”
“听说这个算法很牛”
“张维是谁啊”
“大厂出品必属精品”
我把声音调低,拿起手机。
大刘又发消息来了:“老陆你在看吗?张维在后台了,我看见他了。”
我回:“在看。”
大刘发了一张照片。
是后台的偷拍,张维正在对着镜子整理领带,旁边有人给他递水。他的脸上带着那种即将登台的兴奋和紧张,嘴唇微微动着,大概是在默念台词。
我盯着那张照片,忽然想起一个细节。
两年前,我第一次在组里做技术分享,讲的就是DSIN的雏形。
讲完之后,张维第一个鼓掌,说:“老陆,你这条路是对的,坚持下去。”
那时候他还没有独立办公室,坐我左边。
那时候的掌声,是真的。
下午两点,发布会正式开始。
03
主持人的声音从电脑里传出来:“下面有请技术总监张维,为我们揭晓新一代推荐算法的神秘面纱!”
张维走上台。
他穿了一身定制西装,皮鞋锃亮,头发打了发胶,在灯光下一丝不苟。
他走到台中央,微笑着环顾四周,那个姿势练过——我在公司的演讲培训课上看过,叫“舞台掌控”。
“各位来宾,各位线上的朋友们,大家好。”
他的声音通过话筒传出来,稳得像播音员,“今天,我很荣幸代表团队,向大家介绍一套我们自主研发的推荐算法——基于长序列行为的动态兴趣网络。”
大屏幕上亮出四个字母:DSIN。
我的心跳漏了一拍。
屏幕上开始播放PPT。
架构图、公式推导、离线测试数据……每一页我都烂熟于心。
那些公式是我熬夜推导的,那些图表是我用Python画的,那些数据是我跑了三十几轮实验才跑出来的。
张维站在台上,手指着那些图,侃侃而谈。
“这个算法的核心创新点,在于它能够捕捉用户在一个完整会话内的兴趣演化轨迹……”
他的声音在直播间里回荡,“我们团队花了两年时间,攻克了长序列建模中的兴趣漂移难题……”
弹幕疯狂滚动。
“卧槽太强了”
“这才是技术大牛”
“膜拜张总”
“这波操作稳了”
“收藏了以后学习”
看着那些弹幕,我心里翻涌着一种很奇怪的感觉。
不是愤怒——愤怒早就过去了。是荒谬。是那种“我明明在这里,但没有人看见我”的荒谬。
手机震个不停。
大刘:“老陆你看见了吗!那个公式!就是你推导的那个!”
老孟:“卧槽张维这逼真敢啊!”
还有几个不认识的头像发来好友申请,备注写着“技术群看到你的朋友圈”。
我没理。
张维讲到第三个公式的时候,提问环节开始了。
直播间里弹幕刷得更快了。主持人念了几个问题,都是常规的——“什么时候上线”“效果提升多少”“开源吗”。
张维一一作答,从容不迫。
然后,一个ID引起了我的注意。
那个ID叫“LZ_1978”。
弹幕很简短,但每一个字都像钉子钉进我的眼睛:
“请问,第二个公式里的W_s矩阵初始化方法,为什么和2019年一个个人博客上发布的代码完全一致?”
弹幕瞬间安静了。
张维脸上的笑容僵了一瞬。但那只是一瞬间,他立刻恢复了正常。
“这位朋友的问题很有意思。算法的某些基础模块,确实会借鉴业界的公开成果,这是行业惯例。我们在论文中也会标注参考文献。”
那个ID又发了一条:
“不是‘借鉴’。是完全一致。包括那个0.01的初始化参数,包括那个被注释掉的‘temp fix’。那个博客的博主,ID也是LZ_1978。巧合吗?”
直播间炸了。
弹幕疯了似的刷起来:
“什么情况?”
“抄袭?”
“求锤得锤?”
“LZ_1978是谁?”
“有大神扒一下吗?”
张维站在台上,脸上的笑容开始僵硬。他看向台下某个方向,大概是工作人员的位置,示意他们处理这个“捣乱”的弹幕。
但那个ID又发了第三条:
“博主LZ_1978,2003年注册,2019年注销。最后一条博客写的是:教完这行代码,我退休了。这条博客的阅读量是37万,评论里有很多人叫他老师。你们可以去看看。”
我盯着那个ID,手指开始发抖。
LZ_1978。
那是父亲的博客。
04
直播被紧急切断了。
屏幕上弹出一行字:“技术调整,稍后继续。”
但弹幕还在刷,截图已经满天飞。
微博上,“DSIN抄袭”的词条开始往上爬,半小时就冲进了热搜前十。
论坛上有人开了问题:“如何评价今天某大厂发布会上的DSIN算法抄袭事件?”回答数眨眼间过了百。
我的手机彻底炸了。
大刘发来一堆消息:
“卧槽老陆你看热搜了吗”“那个LZ_1978是谁啊”“有人说是隐退的大佬”“不会是你爸吧你爸不是程序员吗”。
我没回。
老孟直接打了电话过来。他的声音激动得发抖:“老陆!你看见了吗!那个LZ_1978!那是谁啊?怎么这么猛!发布会现场直接锤!”
我说:“我也不知道。”
他愣了一下:“你也不知道?”
我说:“真不知道。”
挂了电话,我打开浏览器,输入那个博客地址。
那是一个早就被遗忘的角落。博客中国的老域名,界面还是十年前的样式,广告位早就失效了,只剩一片空白。最后一篇博文停在2019年3月,标题是:《再见,朋友们》。
正文只有几句话:
“写了十六年代码,教会了很多人写第一行程序。现在退休了,去喝茶、看书、晒太阳。江湖再见。”
下面的评论有三千多条。最新的一条是三分钟前发的:
“老师,今天有人抄袭您的代码,我们帮您锤回去了!”
再往前翻,是2018年的一条博文,标题是:《DSIN:一种基于会话的兴趣网络实现》。
我点进去。
正文里,父亲用他一贯的简洁风格,介绍了这个算法的思路。
没有花哨的术语,没有复杂的推导,只有最核心的几句话。最后附了一段核心代码,注释里写着:
“初始化W_s矩阵,参数设为0.01。这个值是我试出来的,不是最优解,但最稳定。注释掉的‘temp fix’是我写的一个补丁,处理边缘情况的,不用管它。”
我盯着那段代码,看了很久很久。
然后我打开DSIN的代码库,翻到W_s矩阵初始化的那一行。
0.01。
旁边有一行注释:
“ temp fix,保留,可能有用的边缘情况处理。”
一模一样。
一字不差。
我的眼眶忽然有点酸。
原来父亲一直都在看。看我的代码,看我遇到的问题,看我可能自己都没注意到的细节。他把他试了无数次的参数留在了博客里,等着哪一天有人需要。
他不知道那个人会是我。
但他知道,总有一天,会有人需要。
05
我继续往下翻博客。
父亲的博文不多,每年也就四五篇。
但每一篇下面都有很多评论。最早的评论可以追溯到2005年,那时候互联网还在拨号上网的时代。有人问问题,父亲就回答;有人发感谢,父亲就回“不客气”。
翻着翻着,我翻到一篇2008年的博文。
标题是:《写给想学编程的年轻人》。
“很多年轻人问我,学编程难不难。我说不难,只要你能坐得住。写代码是一件很寂寞的事,你要面对的是屏幕,是逻辑,是无穷无尽的bug。没有人陪你,只有你自己。
但这也是它最美的地方。当你终于跑通一段代码,看到你想要的输出,那种快乐,是任何东西都换不来的。
我教过我儿子写代码。他六岁,敲出‘Hello World’的时候,眼睛亮了。那一刻我知道,他会喜欢这个。
所以,如果你也喜欢,就坚持下去。无论将来做什么,写代码都会是你最可靠的伙伴。”
我盯着这段话,视线模糊了。
那是2008年,我六岁。他已经想好了要教我什么。
我继续往下翻。