第十二章 鼎盛的外包
第二天早上,韩路一醒来第一件事就是打开电脑,重新点开了那条外包需求。
昨晚他没做决定。睡了一觉,脑子清醒了一些,但决定还是没做出来。
需求页面上附著的技术概要只有三页,做了脱敏处理,去掉了公司名和项目名,但对韩路一来说跟没脱一样。
每一段描述他都能对应到具体的代码文件。
“核心推荐引擎近期进行了架构调整,將原有的动態权重分配模块替换为基於规则的静態引擎。”
韩路一看到这句话的时候,表情很微妙。
动態权重分配。那是他花了八个月设计的核心调度模块,整个推荐系统的心臟。它的精妙之处在於能根据用户实时行为自动调整推荐权重,每一次点击、每一次滑动、每一次停留都会被纳入计算。
这套东西不是写出来就能用的,是他一边写一边调,跑了上亿条用户数据,一个参数一个参数地磨出来的。
然后陈博文的团队把它拆了,换成了静態规则引擎。
韩路一能理解为什么。动態权重模块確实复杂,没有他本人在场,团队里没有第二个人能完全看懂那套逻辑。陈博文的选择是,看不懂的东西就换掉,换成看得懂的。
技术概要后面还列了一串症状:峰值期响应延迟飆升、推荐精准度下降、用户留存率持续走低、a/b测试全面不如旧版。
说白了就是:换了之后全面拉胯,而且越来越差。
韩路一靠在椅背上,开了视界。
精力值满的,250/250。他把注意力集中在屏幕上那三页技术概要上。
面板炸开了。
不是一般的弹窗。整个屏幕被半透明的红色警告覆盖,像一面著火的墙。
【目標系统:鼎盛数字科技·核心推荐引擎】
【整体稳定性评级:d-(极度危险)】
【严重bug(s级):12个|中等(a级):37个|轻微(b级):91个】
【预计完全崩溃时间:上线后72小时內】
140个bug。红的黄的橙的,密密麻麻铺了一屏,像一份病危通知书。
他只扫了一眼前三个s级bug就不想再看了,內存泄漏,三天后系统会把自己撑死。数据管道断裂,四分之一的用户数据在悄悄丟失。並发锁死,高峰期两成概率直接雪崩。
三颗定时炸弹,隨便一颗炸了都够上一次热搜。
他花了三年时间把这套推荐系统从能用调到好用,又从好用磨到稳如老狗。每一个参数、每一条权重、每一次版本叠代,都是他一行一行敲出来的。
陈博文接手半个月。140个bug。
他忽然想起了第一天被裁时,视界扫到陈博文面板上的那行字——
【warning:该对象存在3个严重bug点击展开(当前等级不足)】
当时他是lv.1,看不到详情。
那三个严重bug,其中一个大概就是这个,陈博文摘了他的果子,但咬不动。
debug修復的面板紧跟著弹了出来。
【检测到可修復系统|修复方案已生成|预计4小时|精力消耗:约120点】
他当然能修好。这套代码是他写的,有些bug他看一眼就知道改哪行。
他关掉了视界。
屏幕回到了正常的外包需求页面。右上角有两个按钮:【接受需求】和【忽略】。
韩路一的手指停在滑鼠上。
接还是不接?
接。五万块,四个小时的活。三年心血,说不心疼是假的。
不接。桃子是陈博文摘的,烂了也该他兜著。况且平台是实名的,他一接单,陈博文就知道了。到时候鼎盛那边怎么想?觉得他捨不得走?觉得他求著回去?
韩路一想了一会。
然后点了【忽略】。
不接。
他关掉了外包页面,端起桌上已经凉了的咖啡喝了一口。
不接归不接,但有些东西憋著也浪费。
他打开论坛,以nullpointer的身份花了四十分钟写了一篇《推荐系统架构改造的七个经典陷阱》。全部脱敏,不提鼎盛不提任何公司,纯技术分享。但小明要是看到了就会知道,七个陷阱里至少有三个,他正在踩。
算是隔空递了把伞。接不接,是小明自己的事。
发完帖子,他关掉论坛。
脑子开始转了。
这140个bug。这两周接单修过的上百个bug。再往前,五年里经手的几千个bug。
它们长得不一样,但死法都一样。
內存泄漏的死法是撑死自己。並发锁的死法是卡死自己。数据管道的死法是悄悄烂掉,等你发现的时候已经晚了。
同样的模式,在不同的项目里反覆出现。他每次修bug,本质上就做两件事,认出模式,匹配方案。
韩路一的手停在咖啡杯上。
认出模式。匹配方案。
这不就是餵给ai乾的活吗?
他放下杯子,掏出手机翻到备忘录里那行字——
“代码审查工具,连接代码与现实场景,bugkiller?”
那天这只是一个问號。现在问號没了。
把视界看到的bug模式全部整理出来,特徵、触发条件、修復路径,餵给ai,让它学会“看到代码就知道上线后会出什么问题”。ai不需要拥有视界,它只需要学会视界看到过的东西。
就像教ai下棋不需要教它思考,只需要让它看够多的棋局。
韩路一打开电脑。新建文件夹,命名“bugkiller”。新建文档:《bug模式资料库 v0.1》。
然后开始写。写得很快。这两周修过的bug、今天扫出的一百四十个bug、五年里踩过的坑,全从记忆里涌出来,按类型自动归位,內存类、並发类、数据流类、接口类,每一类下面是触发条件、典型表现、修復路径。
他像在给一个什么都不懂的新手编一本《bug大全》。
写了两个小时,停下来。
不够。一个人的经验撑不起一整个资料库。他需要更多样本,更系统的分类。
他需要一个產品经理。
韩路一拿起手机,找到苏念念的微信对话框。
“念念,上次聊的ai代码审查方向,我有个想法。今晚有空吗?吃个饭聊聊。”
发出去不到三十秒,苏念念回了:“今晚?!几点?”
“七点。”
“没问题!下班正好六点半。什么想法?先说说?”
“到了再说。”
对话框顶部的“对方正在输入…”闪了好几次。最后发过来的不是追问,是:
“那我先选个餐厅。你想吃什么?”
“隨意,不挑。”
“好,我来定。”
韩路一觉得有点好笑,明明是他约的人,三句话下来主导权就到对方手里了。
不过也正常,苏念念做產品经理的,抢需求主导权是本能。
韩路一放下手机,又闷头写起了文档,再抬起头已经是下午四点半了。
离七点还有两个半小时。
他回头看了看屏幕上刚建好的bugkiller文件夹,想了想,没有继续写文档。今晚跟苏念念聊的时候,脑子里得是活的想法,不能是写僵了的文字。
他关掉电脑,起身去洗了个澡,换了件乾净的衬衫。
出门的时候,隔壁传来林朵朵的声音,在跟林晚晴讲幼儿园的事。
韩路一带上门,往地铁站走去。
晚风不凉也不暖,三月中旬的海城,恰好卡在两个季节的缝隙里。
昨晚他没做决定。睡了一觉,脑子清醒了一些,但决定还是没做出来。
需求页面上附著的技术概要只有三页,做了脱敏处理,去掉了公司名和项目名,但对韩路一来说跟没脱一样。
每一段描述他都能对应到具体的代码文件。
“核心推荐引擎近期进行了架构调整,將原有的动態权重分配模块替换为基於规则的静態引擎。”
韩路一看到这句话的时候,表情很微妙。
动態权重分配。那是他花了八个月设计的核心调度模块,整个推荐系统的心臟。它的精妙之处在於能根据用户实时行为自动调整推荐权重,每一次点击、每一次滑动、每一次停留都会被纳入计算。
这套东西不是写出来就能用的,是他一边写一边调,跑了上亿条用户数据,一个参数一个参数地磨出来的。
然后陈博文的团队把它拆了,换成了静態规则引擎。
韩路一能理解为什么。动態权重模块確实复杂,没有他本人在场,团队里没有第二个人能完全看懂那套逻辑。陈博文的选择是,看不懂的东西就换掉,换成看得懂的。
技术概要后面还列了一串症状:峰值期响应延迟飆升、推荐精准度下降、用户留存率持续走低、a/b测试全面不如旧版。
说白了就是:换了之后全面拉胯,而且越来越差。
韩路一靠在椅背上,开了视界。
精力值满的,250/250。他把注意力集中在屏幕上那三页技术概要上。
面板炸开了。
不是一般的弹窗。整个屏幕被半透明的红色警告覆盖,像一面著火的墙。
【目標系统:鼎盛数字科技·核心推荐引擎】
【整体稳定性评级:d-(极度危险)】
【严重bug(s级):12个|中等(a级):37个|轻微(b级):91个】
【预计完全崩溃时间:上线后72小时內】
140个bug。红的黄的橙的,密密麻麻铺了一屏,像一份病危通知书。
他只扫了一眼前三个s级bug就不想再看了,內存泄漏,三天后系统会把自己撑死。数据管道断裂,四分之一的用户数据在悄悄丟失。並发锁死,高峰期两成概率直接雪崩。
三颗定时炸弹,隨便一颗炸了都够上一次热搜。
他花了三年时间把这套推荐系统从能用调到好用,又从好用磨到稳如老狗。每一个参数、每一条权重、每一次版本叠代,都是他一行一行敲出来的。
陈博文接手半个月。140个bug。
他忽然想起了第一天被裁时,视界扫到陈博文面板上的那行字——
【warning:该对象存在3个严重bug点击展开(当前等级不足)】
当时他是lv.1,看不到详情。
那三个严重bug,其中一个大概就是这个,陈博文摘了他的果子,但咬不动。
debug修復的面板紧跟著弹了出来。
【检测到可修復系统|修复方案已生成|预计4小时|精力消耗:约120点】
他当然能修好。这套代码是他写的,有些bug他看一眼就知道改哪行。
他关掉了视界。
屏幕回到了正常的外包需求页面。右上角有两个按钮:【接受需求】和【忽略】。
韩路一的手指停在滑鼠上。
接还是不接?
接。五万块,四个小时的活。三年心血,说不心疼是假的。
不接。桃子是陈博文摘的,烂了也该他兜著。况且平台是实名的,他一接单,陈博文就知道了。到时候鼎盛那边怎么想?觉得他捨不得走?觉得他求著回去?
韩路一想了一会。
然后点了【忽略】。
不接。
他关掉了外包页面,端起桌上已经凉了的咖啡喝了一口。
不接归不接,但有些东西憋著也浪费。
他打开论坛,以nullpointer的身份花了四十分钟写了一篇《推荐系统架构改造的七个经典陷阱》。全部脱敏,不提鼎盛不提任何公司,纯技术分享。但小明要是看到了就会知道,七个陷阱里至少有三个,他正在踩。
算是隔空递了把伞。接不接,是小明自己的事。
发完帖子,他关掉论坛。
脑子开始转了。
这140个bug。这两周接单修过的上百个bug。再往前,五年里经手的几千个bug。
它们长得不一样,但死法都一样。
內存泄漏的死法是撑死自己。並发锁的死法是卡死自己。数据管道的死法是悄悄烂掉,等你发现的时候已经晚了。
同样的模式,在不同的项目里反覆出现。他每次修bug,本质上就做两件事,认出模式,匹配方案。
韩路一的手停在咖啡杯上。
认出模式。匹配方案。
这不就是餵给ai乾的活吗?
他放下杯子,掏出手机翻到备忘录里那行字——
“代码审查工具,连接代码与现实场景,bugkiller?”
那天这只是一个问號。现在问號没了。
把视界看到的bug模式全部整理出来,特徵、触发条件、修復路径,餵给ai,让它学会“看到代码就知道上线后会出什么问题”。ai不需要拥有视界,它只需要学会视界看到过的东西。
就像教ai下棋不需要教它思考,只需要让它看够多的棋局。
韩路一打开电脑。新建文件夹,命名“bugkiller”。新建文档:《bug模式资料库 v0.1》。
然后开始写。写得很快。这两周修过的bug、今天扫出的一百四十个bug、五年里踩过的坑,全从记忆里涌出来,按类型自动归位,內存类、並发类、数据流类、接口类,每一类下面是触发条件、典型表现、修復路径。
他像在给一个什么都不懂的新手编一本《bug大全》。
写了两个小时,停下来。
不够。一个人的经验撑不起一整个资料库。他需要更多样本,更系统的分类。
他需要一个產品经理。
韩路一拿起手机,找到苏念念的微信对话框。
“念念,上次聊的ai代码审查方向,我有个想法。今晚有空吗?吃个饭聊聊。”
发出去不到三十秒,苏念念回了:“今晚?!几点?”
“七点。”
“没问题!下班正好六点半。什么想法?先说说?”
“到了再说。”
对话框顶部的“对方正在输入…”闪了好几次。最后发过来的不是追问,是:
“那我先选个餐厅。你想吃什么?”
“隨意,不挑。”
“好,我来定。”
韩路一觉得有点好笑,明明是他约的人,三句话下来主导权就到对方手里了。
不过也正常,苏念念做產品经理的,抢需求主导权是本能。
韩路一放下手机,又闷头写起了文档,再抬起头已经是下午四点半了。
离七点还有两个半小时。
他回头看了看屏幕上刚建好的bugkiller文件夹,想了想,没有继续写文档。今晚跟苏念念聊的时候,脑子里得是活的想法,不能是写僵了的文字。
他关掉电脑,起身去洗了个澡,换了件乾净的衬衫。
出门的时候,隔壁传来林朵朵的声音,在跟林晚晴讲幼儿园的事。
韩路一带上门,往地铁站走去。
晚风不凉也不暖,三月中旬的海城,恰好卡在两个季节的缝隙里。