跳转至

第十三章 · 易文

九月二日,星期三,上午九点。

纪衡的邮件在收件箱第一封,两行:"OKR 已收到。下午两点,三楼会议室,跨部门项目会,营销技术部主讲。你参加。"没有议题,没有材料,没有附件。

这个会不在他的日历里,也不在结算组这周的会议安排里。他打开结算对账模块的核心比对方法,四百一十七行,从头翻到尾。翻完,他在一张空白的纸上画了三个框:结算系统、接口层、营销对账服务,在接口层旁边写了一行字:数据一致性由谁保证?

这行字他没有写进任何文档。纸压在键盘下面。

上午十一点,他又去查了一次 10.14.1.88 的 DHCP 分配记录。运维那边的回复只有一句:"该地址在测试网段 DHCP 池内,租期两小时,历史分配日志按周滚动清理。"八月十一号那天的记录已经不在了。索引删除操作的执行账号还是 root@localhost,Git 里没有对应提交。

记事本上这一条他已经写了三遍,日期不同,内容一样。这件事他没有告诉纪衡,也没有告诉蒋辉。

下午两点,三楼会议室。纪衡在主位,笔记本合着。蒋辉在纪衡左手边,面前摊着一份打印好的材料,三四页,每页都划了线。对面是一个他没见过的男人,戴眼镜,三十五六岁,格子衬衫,袖口卷到小臂。纪衡右手边空着一个位置,桌面上什么都没有,那是给他的。

"人到齐了。"纪衡说,合上笔记本,介绍了周其正和项目情况:营销技术部要做一套新的营销结算对账系统,把现有的对账逻辑从结算系统里拆出来,单独做一个服务,结算组只需要提供数据接口。

"蒋辉,你怎么看。"

蒋辉翻了一下打印材料,抬起头。他说思路没问题,SLA、数据延迟容忍度、数据量预估确认清楚就行。周其正说 SLA 三个九,延迟三十分钟以内可接受,日均三万笔,月末六到七万。蒋辉在材料上划了一道,说数据接口层一周内出第一版,两周内接入测试。

"陈稳。"纪衡说,"你对这个方案有什么看法。"

蒋辉那份材料的封面是打印体:营销结算对账系统解耦方案,落款周其正,日期九月一日。比这个会早了一天。

他问数据接口层拆出来之后跟现有的结算对账模块是什么关系。周其正说并行,营销侧用新的,结算侧用现有的。他又问两边数据不一致怎么办,接口层由谁维护。周其正说接口层由结算组维护,数据一致性由结算组保证。

"如果营销侧改规则,接口层没有同步更新,数据对不上,算谁的。"

周其正端起水杯喝了一口,杯底磕了一下桌面。他说这个需要约定,但还没有想好怎么约定。

纪衡敲了一下桌面,说先定接口层,数据一致性后面再讨论。蒋辉牵头,陈稳配合,两周内出第一版。

"还有问题吗。"

蒋辉说没有。陈稳也说没有。他刚才问出来的那句话,跟压在键盘下面那张纸上写的一模一样,一个字不差。那张纸他没有带来,也没有提。

散会的时候周其正在门口叫住他,问数据一致性的问题以前遇到过没有。他说遇到过,写了一个拦截器做运行时校验,上线四十三天。周其正在手机上记了一句,转身走了。

记事本上他写了一行:营销结算对账系统解耦,蒋辉牵头,我配合。"我配合"三个字他圈了一下。

下午五点,蒋辉发了一封邮件,抄送纪衡、周其正、陈稳。标题:营销结算对账系统解耦——数据接口层技术方案(初稿)。附件是一个 Word 文档,十六页。

十六页写得很完整:字段定义、SLA、异常处理、数据一致性。最后一条写的是"依赖结算组现有拦截器机制,由陈稳配合接入"。这句话陈稳读了两遍。拦截器是他七月写的,蒋辉一行代码没看过。

他在记事本上写:他写了十六页,里面有我的拦截器。这行字他删掉了,重新写了一行:下午自己问易文。

他给易文发消息:蒋辉的方案发了,十六页,里面有我的拦截器。

易文没有回复。

到家十点,易文的消息在四十分钟前:明天中午,食堂,十二点。

他回了一个字:好。

牛奶一杯,凉的,胃没有反应。他喝完,把杯子洗了,放在架子上。今天桌面上有材料的人是蒋辉和周其正。

第二天上午,十一点五十分,食堂靠窗的位置。易文面前一碗面,吃了一半,筷子搁在碗沿上。陈稳端着餐盘在她对面落座。

易文问他,昨天说蒋辉的方案里有你的拦截器,你做了什么。他说,蒋辉写方案的时候把拦截器写进去了,说由我配合接入。易文问他之前知不知道,他说不知道。

易文吃了一口面,嚼完,咽下去,放下筷子。"你知不知道,你昨天下午被叫去那个会议,是做什么的。"

"……配合。"

"不是。"易文说,"你被叫去,是因为这个项目需要你。不是因为蒋辉需要你,是因为纪衡知道,没有你,这个项目做不了。"

陈稳的餐盘一动没动,米饭上的塑料盖子还在。

"你知不知道,你昨天下午在会议室里说的那句话,是什么。"

"哪句。"

"'数据一致性由谁保证'。"

"嗯。"

"周其正答不出来,不是因为他不想答。你问完那句话,他才知道这个项目不简单。你知不知道,你问完之后,蒋辉做了什么。"

"什么。"

"他去找了周其正,说拦截器的事,他来做。"

"你怎么知道。"

"周其正跟我是同一个项目组出来的。"易文又吃了一口面,"他刚才给我打了一个电话。他说,你们结算组的蒋辉做事很主动,是那个项目最靠谱的人。然后他说,结算组还有一个同事,叫陈稳,问了一个数据一致性的问题,但没想好怎么回答。"

"我想好了。"

"你想好了,你为什么不说。"

昨天那张纸压在键盘下面,上面写着"数据一致性由谁保证",画了三个框,接口层和营销对账服务之间有一条虚线,虚线上写着拦截器。这张纸他没有带进会议室。

"你的问题是对的。"易文说,"但你没有把问题变成你的。你问了一个问题,周其正答不出来,然后你坐着,等别人回答。你等到了蒋辉。他回答的不是你的问题,他回答的是'这个项目怎么做',不是'数据一致性怎么保证'。他把你的问题盖过去了。"

"那做什么。"

"你说了算。你问完问题,你知道答案是什么,你说出来。你说,数据一致性由拦截器保证,拦截器由我负责,接入方案我出。你说完了,这个事就是你的了。"

"我怕说错。"

"你说错了,最多丢一次脸。你不说,这个事就是别人的。哪个贵。"

米饭上的塑料盖子他撕开了一半,又按回去。

"你在恒澜多久了。"

"十一个月。"

"十一个月,纪衡上面那个人,见过吗。"

"没有。"

"知道他叫什么吗。"

"不知道。"

"他知道你叫什么吗。"

这个问题他没有答。三个月前纪衡在白板上画过一张组织架构图,最上面一个框是空的,里面只写了一个数字:九十二万笔。

"这就是我要说的。"易文把筷子搁回碗沿,"你写的代码在跑,跑的是九十二万笔一天。这个数字上面那个人看得见,你看不见。你之间隔着蒋辉、纪衡两层人,每一层都会把名字换掉。"

易文看着他,问听懂了没有。他说听懂了。

"你听懂什么了。"

"问完问题,要说答案。把事变成自己的。"

易文把剩下的面吃完,汤喝完,碗推到一边。"下午有事吗。"

"没有。"

"来我工位。给你看个东西。"

她端着餐盘走了。陈稳的饭凉了,牛肉硬,青菜咸。他吃完了。

电梯口撞见蒋辉,手里一个文件夹。蒋辉问他看到方案了没有,他说看到了。蒋辉说有什么意见可以提。

"数据接口层的字段定义跟现有的结算对账结果表不一致,需要对齐。"

蒋辉停了半秒。"好,我回去改。"

数据组在走廊尽头靠窗。易文工位上堆着三本书:《数据分析实战》《SQL 反模式》《用数据讲故事》。笔记本翻开着,写满数字和简写。屏幕上是数据看板,蓝底白字。

她关掉看板,转过来。"你刚才说蒋辉的方案里字段定义跟结算对账结果表不一致。"

"是。四个字段对不上。商户 ID 在结算系统里是 varchar(32),蒋辉写的 int;结算金额用 decimal(18,2),蒋辉写的 decimal(10,2);对账时间戳用 datetime,蒋辉写 timestamp;状态字段有七种,蒋辉只写了三种。"

"你刚才在电梯口,告诉他了。"

"嗯。"

"你告诉他了,他回去改,改完,这个方案就是他的。你为什么不自己写一个方案。"

"……我没有时间。"

"你没有时间,是因为你没有把时间花在对的事情上。"易文的指甲在桌沿上敲了一下,"昨天下午散会之后你做了什么。"

"看代码。结算对账模块,四百一十七行。对账逻辑可以拆成两部分,数据加载和比对执行,数据加载可以单独调用,不需要每次都跑完整对账。"

"写了没有。"

"写了。"

"拿来。"

陈稳把手机上的 IDE 打开,找到昨天那个方法,递过去。易文看完,还给他。

"你写的是对的。但你没有用。你写了一个优化方案,然后你把它存起来了。你没有提交,没有发邮件,没有告诉任何人。你写的东西,总是出现在别人的方案里。"

"我打算这周提。"

"这周还有两天。蒋辉的方案已经发了。"

"你听懂了没有。"

"……听懂了。写了要说。写了要变成自己的。"

易文打开一个文件。"你过来看。"

屏幕上是 Excel,列名:项目名称、负责人、预估工期、技术依赖、业务价值。其中一行:"营销结算对账系统解耦",负责人蒋辉,预估工期两周,技术依赖:结算组数据接口层、结算组拦截器。

"这是什么。"

"周其正的项目资源表。他做项目之前,先拉一张表,把依赖和负责人列清楚,然后找资源。蒋辉是负责人,你是技术依赖。你在这个项目里,是一个依赖项,不是一个人。"

"技术依赖"那一栏里没有他的名字,只有"结算组"两个字加上模块名。

"你知道为什么吗。"

"……不知道。"

"因为你在那个会议上,没有说任何一句话,能让周其正记住你。你问了一个问题,但他记住了蒋辉的方案。你没有把你的名字和任何可交付的东西绑在一起。"

"那下次带什么。"

"你写的方案。不用多,三页纸就够了。你写清楚,数据加载部分由你负责,拦截器接入由你负责,数据一致性方案由你负责。你写完了,发出去,这个项目就有你的名字了。"

"发给谁。"

"纪衡。抄送蒋辉。你不抄送他,他会觉得你在背后走一步。你抄送他,他就没话说。"

易文关掉 Excel。"拦截器还在跑吗。"

"在跑。全部通过,零资损。"

"写一个报告,把拦截器的数据拎出来。不要写技术实现,写业务效果。写完发我。"

"好。"

拦截器上线以来的数据在库里:运行天数四十三天,累计拦截请求四万二千一百七十六次,通过率百分之百,资损零,触发告警零。他写进文档,看了一遍,是一份技术周报。他删掉一半,只留了一句:四十三天,零资损,零人工介入。

保存。没有发给易文。记事本上多了一条待办:发给易文看拦截器报告。

茶水间的水是凉的,胃缩了一下。他把整杯喝完了。

下午五点,蒋辉的消息:数据接口层字段定义,已修改。附件是新版 Word。

字段定义那一页:商户 ID varchar(32),结算金额 decimal(18,2),对账时间戳 datetime,状态字段七种。四个字段全改了,改动记录里没有写是谁提的。

他回了一个字:好。

然后他给昨天写的数据加载方法加了几行注释,提交。

commit d4c5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3
Author: Chen Wen <[email protected]>
Date:   2026-09-02 17:42

feat: 对账模块数据加载方法拆分,支持单独调用

将核心比对逻辑拆分为数据加载和比对执行两个阶段。
数据加载方法可独立调用,为后续接口层提供数据支持。

推送成功。这是今天唯一一件有他名字的事。

到家十点十分,易文的消息在十五分钟前:报告写好了吗。

他回:写了。易文说:发我。

邮件发出去,正文一行:附件。

牛奶一杯,凉的,胃没有反应。杯子洗了,放在架子上。

易文的回复不到两分钟:第一段太长,删掉技术细节,只留数字。第二段跟第一段重复。加一句对比——上线前四十三天发生过几次事故。

他把第一段删了一半,第二段合进第一段,最后加了一行:上线前四十三天,营销结算适配器发生过一次事故,涉及十一个系统,长事务回滚五千三百三十六条。上线后四十三天,零事故。

保存,发回去。

易文没有回复。

十点四十,何晚发来一条消息:这周有空吗。

他打字打了两行,删了,回了三个字:这周忙。何晚回了一个"好"。星期天在她家吃面的事,还有面里没放葱的事,他一件都没提。

对面那栋楼的窗户一格一格亮着。他看了十一个月的那扇窗,还是黑的。

蒋辉那份十六页方案他从头到尾又过了一遍:字段定义、SLA、异常处理、数据一致性。数据一致性那一节写了三行,第三行是"具体机制待与结算组确认"。这一行是他昨天问出来的那个问题,被写成了一句待办。

他新建了一个文档,写了三页。第一页:数据加载部分,由他负责,方法已写好,可单独调用。第二页:拦截器接入,由他负责,已有上线后四十三天运行数据,零事故。第三页:数据一致性保障,由他负责,方案待确认。

第三页他改了一次。原来写的是"方案待确认",他删掉,改成"由拦截器机制保证,运行时校验,已验证四十三天"。然后他又改回了"方案待确认"。

三页里"陈稳"这个名字出现了六次。

保存。没有发出去。

记事本上加了一行:明天上午把方案发给纪衡。

卧室天花板上的那道裂缝还在,物业说不影响结构。

三页纸在本地,收件人一栏空着。


← 第十二章 背C · 目录 · 第十四章 烂摊子 →