V3_C12_两万行
六月下旬。周二早上。
我打开电脑。习惯性地看Git日志。每天早上第一件事。看最近的代码提交。谁改了什么。什么时候改的。改了多少行。
往上一拉。
一个巨大的提交摆在那里。
时间戳:凌晨3:47。
提交信息:refactor: 底层架构全面重构。
修改行数:21,387行。
我盯着这个数字。两万一千三百八十七行。四位数。不是改了一个函数。不是修了一个bug。是两万行。整个底层。全部重来。
我点开diff。屏幕刷满了两种颜色。红色是删除的。绿色是新增的。红色和绿色的比例大概是一比一。删了一万多行。又写了一万多行。一夜之间。
我看了十分钟。看不懂大部分。我不是技术出身。代码对我来说是另一种语言。但我看得懂结构。旧的架构是平的,一个文件夹装所有东西。新的是分层的,数据处理一层,模型训练一层,API接口一层,清清楚楚。
我继续往下翻。有些部分我认得。数据库连接的配置。API的路由表。这些是我跟刘海洋一起写的,我至少知道它们的功能。旧的全删了。新的重写了。同样的功能,新代码比旧代码短了三分之一。更干净。变量名更清楚。每个函数前面有一行注释说明用途。旧代码没有这些注释。旧代码是赶出来的。新代码是想过了再写的。
两万一千行。一个晚上。他不只是拆了重来。他是拆了、想了、然后比原来写得更好地重来了。
然后我看见了第一行的注释。
代码的第一行。不是代码。是注释。两个斜杠开头。灰色的字。
// 古老的东西都拆了。重来。
九个字。写在凌晨3:47的代码里。没有人会看注释的第一行。注释是给自己看的。程序员的日记。
"古老的东西都拆了。重来。"
古老。他用了许畅那个词。他收了一周的那个词。现在他把它写在了代码的第一行。不是引用。是认领。你说古老。我承认。古老。然后我拆了。重来。
这行注释没有人会看到。除非你像我一样点开了diff翻到了第一行。程序员的注释是写给未来的自己看的。也许三个月后他会翻回这段代码。看到这行注释。他会记得这个晚上。记得为什么要重来。
也许他不会翻回来。也许这行注释会永远躺在代码库里。跟那十一万条客户投诉一样。没有人看。但它在。他把那个词收下了。收了一周。然后在一个所有人都睡了的凌晨,把它变成了两万一千三百八十七行代码。
我转头看刘海洋。
他坐在自己的工位上。正常工作。脸上什么表情都没有。跟平时一样。耳机没戴。咖啡在手边。桌上有三个空的红牛罐。昨晚的。他没有收。也没有扔。它们就那么摆在桌角。三个铝罐。像三枚勋章。但他不会把它们当勋章。他只是忘了扔。
他没有说"我昨晚重构了两万行"。没有等任何人发现。没有邮件通知。没有在群里说。没有任何暗示。他只是提交了代码。然后来上班。坐下。打开电脑。继续写今天的部分。
这就是刘海洋的回应方式。
他不会跟许畅争论谁对谁错。不会说"你说得对"。也不会说"你凭什么说我"。他不用嘴。他用手。他用两万行代码说了一句话——
你说得对。所以我已经改了。
不是服软。是另一种硬。一种你没法反驳的硬。你说我古老?好。我拆了。重来。你再看看。
我坐在椅子上。盯着他的后背看了十秒。白色的衬衫。有点皱。肩膀弓着。跟第一天见他的时候一样。七年了。他还是这样。话少。事多。不解释。做完了也不说。你看见了是你的事。你没看见也不影响他做下一件。
我认识这个人七年了。但每次他做出这种事的时候我还是会被戳一下。不是感动那种戳。是一种"他妈的你怎么这样"的戳。别人受了委屈至少会说出来。他不说。他把委屈变成代码。变成两万行代码。凌晨三点四十七分提交。然后第二天早上正常上班。脸上什么都没有。
这种人你怎么对付?你没法对付。你只能尊重他。然后确保你不再让他受第二次同样的委屈。
我走过去。站在他旁边。他没有抬头。
"海洋。"
"嗯。"
"我看到了。"
他的手指停了一秒。然后继续敲。"嗯"了一声。没有别的。
"我看到了"三个字是我能想到的最准确的话。不是"辛苦了"——他不需要同情。不是"写得好"——他不需要评价。不是"谢谢"——他不是在帮忙,他是在做该做的事。
我看到了。意思是:你做的事,有人知道。
他"嗯"了一声。继续写代码。
够了。
上午九点。许畅到了。
他每天九点到。准时。背包放下。笔记本打开。第一件事照例拉一下代码库。看有没有新的提交。他在养一种习惯。好的习惯。每天第一件事同步代码。
今天他拉了代码。然后安静了。
不是普通的安静。是那种走进一间房间发现家具全换了的安静。你站在门口。眼睛在扫。脑子在算。每一件新东西都在问你一个问题:这是怎么回事?
他在屏幕前坐了五分钟。
赵秉文从他的角度看不清许畅的表情。只能看到他的侧脸。黑框眼镜。镜片反着屏幕的光。绿色和白色。代码的颜色。
五分钟。我从余光里看到他的手在触摸板上滑动。很快。他在翻代码。一个文件一个文件地打开。每个文件看几秒。关掉。下一个。他不是在看细节。他是在看结构。他在确认一件事——这个新的架构跟他脑子里的方案重合度有多高。
五分钟以后。他停了。手从触摸板上收回来。放在桌面上。
然后他转过来。看了刘海洋一眼。
刘海洋在写代码。没有看他。或者说,刘海洋选择不看他。他知道许畅在看。他能感觉到。程序员对周围环境有一种特殊的敏感。屏幕前面的世界他们不在意。屏幕旁边有人动他们知道。
许畅站起来。走到刘海洋旁边。站了两秒。
"这个……是你重写的?"
"嗯。"
"什么时候?"
"昨晚。"
停顿。三秒。
三秒的停顿在程序员之间的对话里很长。程序员说话通常很快。问题和答案之间不超过一秒。三秒。他在消化一件超出预期的事。
"比我想的好。"
许畅说了这句话。五个字。语调是平的。不是夸张的赞美。不是客气的敷衍。是一个技术人员看完代码以后做出的判断。比我想的好。意思是:我以为你会改一部分。你改了全部。而且改得比我预期的质量高。
刘海洋没有抬头。
但我注意到他的肩膀松了一下。
很轻。很小幅度。如果你不是在专门看他的肩膀,你不会注意到。但我在看。我一直在看。从今天早上发现那个Git记录的时候我就在看他。
肩膀松了一下。
这是他们之间最接近和解的一个动作。不是握手。不是道歉。是一个人说了五个字。另一个人的肩膀松了一下。
够了。对这两个人来说,够了。
程序员之间的和解不需要拥抱。不需要握手。不需要"对不起"和"没关系"。一段好代码就够了。你用代码证明你行。对方用五个字承认你行。完了。继续干活。
但和解不是消除。裂缝还在。只是暂时粘住了。粘住裂缝的胶水是技术上的相互承认。这种胶水很强。但不是永久的。以后如果出现了别的东西——比如权力,比如功劳的分配,比如谁更被CEO重视——胶水可能会开裂。
但那是以后的事。今天,够了。
接下来一周。工作格局开始成型。
刘海洋负责底层架构和SaaS系统稳定性。配合林工。林工的bug修复列表在缩短。三个月前困扰所有人的演示卡顿问题终于彻底解决了。刘海洋重构的那两万行里有一部分就是为了优化查询速度。附带的效果。他没有单独说。张富贵是第一个发现的。他带客户做了一次产品演示。点开客户列表。一秒都没转。"卧槽。不卡了。"他在群里发了三个字加一个感叹号。
许畅负责算法模型和NLP优化。他的工位上永远开着十几个浏览器标签。论文。技术博客。GitHub。Stack Overflow。他看文档的速度是刘海洋的两倍。但他写代码的速度比刘海洋慢。因为他写之前想得更久。刘海洋是边写边想的。许畅是想完了再写的。两种方式。都能到终点。但路径不同。
两台发动机开始同时运转。转速不同。噪音不同。但方向一致。
我在中间。两条线在我这里汇合。刘海洋跟我汇报架构进展。许畅跟我汇报模型进展。我听完一个再听另一个。然后把两边的信息翻译一下传给对方。
我在中间。变速箱。不产生动力。但连接两个产生动力的部件。变速箱坏了,两台发动机就是两台独立的机器。连不上。转不起来。力出不去。
我的工作越来越像翻译。刘海洋跟我说的话我要翻译给许畅。许畅跟我说的话我要翻译给刘海洋。他们两个都坐在同一间办公室里。相距一米二。但他们之间的信息传递需要经过我。不是因为他们不能直接对话。是因为他们的语言系统不同。刘海洋说的是"架构""接口""并发"。许畅说的是"模型""损失函数""训练集"。两种方言。同一个行业。但听不太懂对方在说什么。
同周。张富贵的两个积压了三个月的意向客户终于签了。一个做数码配件的。一个做宠物用品的。都是一年一千五的基础版。客户数从四十九变成了五十一。
五十一。比四十九多了两个。我在备忘录里写了这个数字。没有特别高兴。因为这两个客户是在没有AI差异化的情况下签的。纯粹靠张富贵的关系和林工修好bug之后稳定的演示效果。
下半年要加AI。才有真正的差异化。才能让年费从一千五涨到三千五。才能让吴老板看到的不是PPT。
周小薇的周五现金流报告这周的数字:账上一百二十二万。月烧十三万。如果不加新收入,还能撑九个多月。如果AI模块在三个月后上线,开始接实施项目,收入会增加。如果不能——不想这个。
张富贵在笔记本上记了一行:"51。不卡了。下周约三家。"然后在旁边画了一个小人。小人在跑步。他心情好的时候会画小人。心情不好的时候只写数字。
今天有小人。说明他觉得事情在变好。
林工也有变化。自从刘海洋重构了底层,林工的bug修复工作变容易了。新架构的代码结构清晰,bug定位比以前快了一倍。他这周修了五个bug。上个月整个月修了六个。效率上来了。不是他变厉害了。是地基换好了,上面的活就好干了。
他的绿萝最近也好了一点。不知道是不是他重新开始浇水了。有两片新叶子。很小。嫩绿的。从蔫了的老叶子中间冒出来。绿萝不会死。只要还有一点根在。就能活。
人也是。
那天晚上躺在床上。我想刘海洋昨晚在办公室的样子。
我没有看见。但我能想象。
梧桐树的影子打在窗帘上。六月的夜晚。窗户开着。夜风从外面进来。带着马路上的尾气味和远处的油烟味。
机械键盘的声音。咔嗒。咔嗒。咔嗒。均匀的。不快不慢。他写代码的速度就是这个速度。不管是下午三点还是凌晨三点。同一个节奏。
桌角三罐红牛。第一罐大概是十一点开的。第二罐一点。第三罐三点。每一罐能撑两个小时的专注。
屏幕上代码一行一行飞过去。旧的代码被删掉。红色的。新的代码被写上。绿色的。一万多行红色。一万多行绿色。一个人。一个晚上。一台键盘。
没有人看见他在干什么。他不需要有人看见。
刘海洋从来不需要观众。他只需要一台电脑和一个值得解决的问题。
"古老"是一个值得解决的问题。他解决了。用他唯一会的方式。代码。
我翻了个身。枕头有点热。六月的枕头。盖了一天太阳的被子。黄雨萱已经睡了。背对着我。呼吸很均匀。她不知道今天发生了什么。她不知道刘海洋昨晚写了两万行代码。她不知道许畅说了"比我想的好"。她不知道方教授说了"骨头和刀"。
她在准备下个月的CPA考试。她有她自己的两万行。
我闭上眼。脑子里还是那行注释。灰色的字。两个斜杠。
// 古老的东西都拆了。重来。
睡了。
第二天早上。我给方教授发了一条微信。
不是炫耀。是想让推荐人知道。这家公司里不只有他的学生。还有另一个人。一个他可能低估了的人。
"刘海洋昨晚用一夜重构了两万行。今天许畅说'比我想的好'。"
方教授隔了十分钟回了两个字:"不错。"
我想了想。加了一句:"说的是刘海洋。"
方教授沉默了。一分钟。两分钟。我以为他不会回了。三分钟的时候来了一条长消息。比他之前任何一条都长。
"两个人都不错。但不一样。刘海洋是骨头。许畅是刀。骨头撑起来的东西你看不见,但它在。刀切下去的东西你看得见,但它会钝。骨头和刀放在一起,你要想清楚你想要的是一副骨架,还是一把武器。"
我盯着这段话看了很久。站在地铁出口。六月的傍晚。太阳还没全落。天空是那种橘色和蓝色混在一起的颜色。路灯亮了但还不需要亮。白天和黑夜之间的间隙。什么都在过渡。什么都还没有定型。
骨头和刀。
刘海洋是骨头。不说话。不表功。不争论。但你把他抽掉,整个架子就塌了。两万行代码。凌晨三点四十七分。没有人看见。但整个公司的底层因为他换了一遍。
许畅是刀。锋利。快。看到问题直接切下去。"古老"两个字切得干净利落。但刀会钝。刀在同一个地方切太多次会卷刃。
骨头和刀放在一起。
我想清楚了吗?没有。
我只知道两台发动机都在转。一台安静的。一台嗡的。我在中间。变速箱。连接两个方向相同但节奏不同的力量。
我把这段话截图了。存在手机相册里。没有转发给任何人。
不是因为它太私密。是因为我还没想清楚该怎么用它。也许永远用不上。也许有一天会用上。
骨头和刀。一副骨架和一把武器。
我想要哪个?
都要。贪心一点说,都要。骨架让公司站着。武器让公司往前切。站着不够。切着不够。得又站着又切着。
但骨头和刀放在一起会出什么事?方教授没说。他留了一个空白。空白是给我填的。
先让它们都转着。别停。停了就真的什么都没有了。
备忘录最后一行。今天的。
"两万行。凌晨3:47。刘海洋是骨头。许畅是刀。我是变速箱。别停。"
写完。合上手机。走进小区。六楼的灯亮着。黄雨萱还没睡。也许在看CPA。也许在等我。也许只是灯忘了关。
上楼。开门。她在书桌前。荧光笔的黄色。翻书的声音。她没转头。
"吃了?"
"吃了。"
"好。"
三句话。六个字。我们的日常词汇表没有增加。但今天我不在意。今天我脑子里装的不是她。是两万一千三百八十七行代码。是一行灰色的注释。是一个松了一下的肩膀。
明天开始。两台发动机。同时转。