天蝎向北:(10) 调离通知与苏州来电
沈星浩走进办公区时,感觉有几道目光迅速从他身上移开。那种躲闪的注视,他在中学时就熟悉——那是人们在议论某人时的条件反射。他的工位上放着一个快递盒,里面是母亲寄来的冬衣。旁边贴了张便利贴,是陈昊的字迹:「阿姨寄来的,帮你收了。另外,林经理让你来了去她办公室。」沈星浩放下背包,没动快递盒,径直走向林晓蔓的办公室。路过茶水间时,他听见里面传出压低的声音:“……听说没?鲸云那个项目,本来预算就不多,还出了问题……”“满意是一回事,赚不赚钱是另一回事。我听说财务那边核算过,按现在的投入产出比,这项目可能白干……”声音在他走近时戛然而止。两个市场部的同事端着咖啡走出来,看到他,点了点头,匆匆离开。林晓蔓的办公室门开着。她正在接电话,看到沈星浩,指了指对面的椅子。“好,明白。下午三点,我准时到。”她挂了电话,揉了揉眉心。“坐。”林晓蔓放下手机,沉默了几秒,“有个调整,需要通知你。”“从今天开始,你调离鲸云项目组。”林晓蔓的话直接得有些冷酷,“新岗位是技术债务清理组,负责梳理公司遗留系统的代码重构。”林晓蔓从抽屉里拿出一份文件,推到他面前。那是一份项目成本核算报告,最后一行用红笔圈出:**预期利润率:-8.7%**。“上周五演示结束后,财务和业务部门做了综合评估。”林晓蔓的声音没什么起伏,“鲸云项目的前期投入超出了预算43%。虽然技术成果不错,但从商业角度看,这是一个失败的项目。”“试运行需要更多投入。”林晓蔓打断他,“人力、设备、后期维护。核算下来,即使项目顺利完成,公司也赚不到钱,还可能小亏。”沈星浩盯着那个负数。他的大脑飞速计算:算法优化、现场测试、团队加班……所有这些努力,最后换算成一个负的百分比。“不,项目继续。但核心团队要精简。”林晓蔓看着他,“你作为算法架构师,是项目里成本最高的几个人之一。调离你,换成更初级的工程师接手,能降低成本。”“但系统的核心逻辑只有我最清楚。”沈星浩声音提高了些,“换人接手,出了问题怎么办?”“周帆会留任技术负责人。他会确保系统稳定。”林晓蔓顿了顿,“星浩,这是商业决策,不是技术决策。你得理解。”理解。沈星浩忽然想起父亲说过的一句话:“在外企,技术永远要为商业让路。这是规则。”“今天。上午交接工作,下午去新组报到。”林晓蔓递过来另一份文件,“这是清理组的任务清单。组长叫王磊,他会带你。”“还有一件事。”林晓蔓叫住他,“调岗的事,不要有情绪。这不是对你的否定。相反,赵总特别交代,让你去清理组是给你学习的机会——接触公司那些最老旧、最混乱的系统,能让你真正理解什么是‘技术债务’,什么是可维护的架构设计。”走出办公室,走廊的灯光白得刺眼。他回到工位,开始收拾东西。键盘、笔记本、那枚黄铜齿轮钥匙扣、父亲送的精密起子套装……陈昊滑着椅子过来,声音压得很低:“星浩,我早上听说了。这太扯了,项目成功了反而调走核心人员?我去找林经理说……”“不用。”沈星浩打断他,“商业决策。我们做好技术就行。”“可这不公平!”陈昊难得激动起来,“那几天加班到凌晨的是谁?现场解决问题的是谁?现在一句‘成本控制’就把你调走?”沈星浩停下手中的动作,看向陈昊:“公司付我们工资,就是买我们的时间和能力。怎么用,公司说了算。”他说这话时,语气平静得像在陈述一个物理定律。但陈昊看到他握着那套起子的手,指节有些发白。交接工作只用了半小时。周帆看起来很为难,一直道歉:“星浩,这事我真的不知道,我也是今天早上才听说……”“没事。”沈星浩把所有的设计文档、代码注释、测试用例整理好,发到项目共享文件夹,“核心算法的几个关键点我都加了详细注释。有问题随时问我。”“好。”周帆欲言又止,最后拍了拍他的肩,“清理组那边……其实能学到很多东西。我以前也在那边待过三个月。”下午一点,沈星浩抱着纸箱走进十八层的技术债务清理组。这里的氛围和三十七层截然不同——没有落地窗,没有开放办公区,只有一排排老旧的隔间。空气里有灰尘和旧纸张的味道。组长王磊是个四十多岁的中年男人,头发稀疏,戴着厚厚的眼镜。他接过沈星浩的调岗通知,看了一眼:“哦,沈星浩。林经理打过招呼了。坐那儿吧。”他指了个靠墙的位置。桌上积着薄灰,电脑是老款的台式机,屏幕边框很厚。“我们组的任务很简单。”王磊递过来一张清单,“这些是公司三到五年前的项目,代码没人维护了,但业务还在用。你的工作是梳理这些代码,写重构方案,但不一定能真的重构——因为业务部门通常不愿意为‘看不见’的重构付费。”沈星浩看着清单上的项目名字:《供应链管理系统v2.1》、《客户关系平台遗留模块》、《财务结算系统兼容层》……都是些听起来就很复杂的系统。“先从最简单的开始。”王磊指了清单最下面一个,《会议室预定系统后台》,“这个系统是五年前一个实习生写的,后来他转正去了别的部门,代码就扔这儿了。现在还能跑,但没人敢改。你去看看,写个分析报告。”沈星浩打开那台老电脑。开机花了三分钟。他按照文档说明,找到代码仓库,克隆到本地。没有注释。变量命名随意:a1, a2, a3。函数长度超过一千行。数据库查询直接拼接字符串,有SQL注入风险。全局变量到处都是。他花了一下午时间,才勉强理清这个“会议室预定系统”的逻辑。本质上,它就是一个增删改查的应用,但因为写得实在太烂,维护成本高到没人愿意碰。父亲在书房,背景是那面蓝图墙。他看了沈星浩几秒:“你脸色不好。病了?”“所以,因为项目不赚钱,就把你调走了?”父亲听完,问。父亲沉默了一会儿,忽然说:“我给你讲个故事。1996年,我在德国公司,参与一个汽车生产线改造项目。我是技术负责人,项目做了九个月,最后验收时,所有指标都达标,客户很满意。”“但项目结束后,我被调离了技术核心岗,去了一个维护部门。”父亲说,“原因和你一样——项目超预算了。虽然技术上成功,但商业上不划算。”“我在维护部门待了一年。”父亲喝了口茶,“那一年,我接触了公司最老、最破、问题最多的机器。那些机器就像你今天的烂代码,设计过时,维修困难,但还在坚持运转。”“学到了两件事。”父亲放下茶杯,“第一,再烂的系统,只要还有业务在用,就有它存在的价值。第二,真正考验工程师水平的,不是在新项目里做出多漂亮的设计,而是在烂摊子里找到还能维持运转的方法。”楼梯间昏暗的灯光下,沈星浩感觉胸腔里那团堵着的东西,松动了一点。“你现在看到的那些烂代码,就是软件行业的‘老破机器’。”父亲继续说,“有人嫌它们丑,不愿碰。但你要是能看懂它们为什么烂,还能想出怎么让它们继续转,那你就比只会写新代码的人,多了一层本事。”“可是爸,我觉得……不公平。”沈星浩终于说出了这个词,“明明我做得很好,为什么是这种结果?”父亲笑了:“你以为我当年没这么想过?后来我想明白了——职场上没有绝对的公平,只有价值的换算。你今天觉得不公平,是因为你只算了自己技术的价值,没算公司商业的价值。”他顿了顿:“但这不是坏事。早点明白技术只是商业的一部分,对你长远发展有好处。”窗外,北京的天空阴沉下来,像是要下雨。楼梯间里的应急灯自动亮了,发出幽幽的绿光。“先把你眼前的烂代码看懂。”父亲说,“就像修机器,你得先知道它哪儿坏了,为什么坏,然后才能想怎么修。至于公平不公平……等你有了不可替代的价值,才有资格谈公平。”通话结束时,外面开始下雨。雨点打在窗户上,发出细密的声响。沈星浩回到工位,重新打开那个会议室预定系统的代码。这一次,他没有带着厌恶,而是带着一种类似考古的心态——试着理解五年前那个实习生,在当时的技术条件下,为什么会写出这样的代码。**3. 安全隐患:SQL注入风险、密码明文存储**写到一半,王磊走过来,看到他的文档,有些惊讶:“你已经开始分析了?”王磊看了几眼文档内容,点点头:“思路对。不过提醒你,这种遗留系统,重构方案要分阶段写。第一阶段怎么用最小代价修复最紧急的问题,第二阶段怎么逐步优化,第三阶段……可能永远没有第三阶段,因为业务部门不会批预算。”下班时,雨还没停。沈星浩没带伞,在楼门口等雨小些。陈昊从后面追上来,递给他一把伞:“我的备用伞,你先用。”两人站在屋檐下,看着雨幕中的国贸建筑群。灯火在雨中晕开,像模糊的光斑。“我听到一些传言……说调你走,不光是成本问题。”陈昊压低声音,“有人觉得你升太快了,想压一压。”“不过你也别太在意。”陈昊拍拍他的肩,“是金子总会发光的。清理组待一阵也好,沉淀沉淀。”雨小了些。沈星浩撑开伞,走进雨里。雨水敲打在伞面上,声音沉闷而规律。他想起父亲工具箱里那些最老旧、最不起眼的工具:一把生锈但还能用的扳手,一个刻度模糊但还能校准的水平仪。那些工具在最糟糕的环境里工作过,反而更有韧性。回到十平米的出租屋,沈星浩放下伞,看到桌上那盒未拆的乐高。他走过去,手指划过盒子边缘。然后他坐下来,打开电脑,继续写那份遗留系统分析报告。