第二十九章: 能跑和能上线之间,差了一场吵架

16 阅读19分钟

我后来慢慢发现,互联网公司里最不值钱的东西有两个。

一个是产品经理嘴里的“就改一点点”。
另一个是活动需求里的“这一版应该就是最终版了”。

七夕活动正式启动那天,产品经理抱着电脑站在会议室最前面,神采飞扬得像刚融完一轮资。他把投影一打开,第一页 PPT 就写着一行大字:

「打造更有传播性、更有情绪价值、更有情侣互动感的七夕专题页」

我看了十分钟,只提炼出一句人话:

这活又不好做。

什么叫“更有传播性”?
就是你得多做分享链路。
什么叫“更有情绪价值”?
就是页面不光得能用,还得会撩。
什么叫“更有情侣互动感”?
就是原本一个活动页的工作量,现在要被包装成半个恋爱综艺。

产品讲得激情澎湃,仿佛这不是一个七夕活动,而是整个项目组集体奔赴爱情事业的起点。顺哥坐在旁边,边听边低头记东西,脸上没什么表情,像一个已经提前知道服务要崩、但暂时还不想打断汇报的老运维。

等产品把饼画完,顺哥把电脑一合,开始拆任务。

后端谁负责活动规则。
前端谁负责主页面。
测试什么时候介入。
设计什么时候出第一版稿。
文案谁来对。
埋点谁补。

拆到一半,他忽然抬头看了我一眼。

“阿雷,这次活动页前端你也一起跟。”

我当场一愣:“我?”

“嗯。”顺哥说得很自然,“前端那边人手不够,时间也紧,你之前不是也改过几个活动页吗?这次你把接口和页面逻辑一起跟着扛,省得来回对口径。”

我坐在那儿,脑子里只有一个念头:

这需求已经不是跨部门协作了,这是开始越权调用了。

但互联网公司最不讲道理的地方就在这儿。
当时间不够、人手不够、节点快到了的时候,岗位边界这种东西就会自动降级。谁会写谁上,谁没死谁顶。你要是会点前端,那你就是前端;你要是懂点后端,那你也能顺手背点后端的锅。大家平时都说自己是工程师,真到活动节点,工程师和可回收劳动力之间的边界其实很薄。

会开完以后,我抱着电脑往外走,小马哥在我后面笑得极其缺德。

“恭喜啊,雷哥,正式从后端扩展成全栈了。”

“滚。”我头都没回,“这不叫全栈,这叫资源透支。”

“别这么说。”他拍了拍我肩膀,“至少这次你和设计组的沟通链路更短了。”

我转头看他:“你要再用这种语气说话,我今天就让你体验一下什么叫物理降级。”

他笑着跑了。

回工位以后,我点开需求文档,认真看了二十分钟,越看越觉得头疼。

这个活动从结构上讲不算复杂,主页面、情侣互动区、领券区、分享弹窗、活动规则页,再加几个状态切换和倒计时。但问题在于,这东西看着像五块模块,真正落地时每一块下面都挂着一串条件判断。用户有没有登录、领没领券、券还有没有库存、是否满足情侣互动条件、分享完有没有额外奖励、活动开始没、结束没、异常态怎么兜,全都得考虑。

活动页这种东西,最烦的从来不是模块多。

是它表面看起来花里胡哨,底下其实是一整套状态机。
而一旦状态定义没说清,页面就会像配置没配好的前端项目,哪儿都能亮,哪儿都不太对。

下午第一版设计稿出来的时候,我和小璇一起过了一轮。

那会儿气氛还算正常。

她站在我旁边,一页一页给我讲:首屏怎么进、卡片怎么翻、情侣互动区的按钮态怎么区分、领券成功后弹窗怎么反馈。她讲得很细,我也听得挺认真。偶尔我会问一句“这个状态和那个状态是不是能合并”,她会摇头,说不行,视觉上用户会分不清。

那时候我还觉得,一切都在可控范围内。

顶多就是活多一点,细一点,熬一点。
问题不大。
互联网活动不都这么过来的吗?

结果这种“问题不大”的错觉,只持续了不到一天。

第二天中午,产品就在群里发了一句:

“互动区玩法微调一下,这版改动不大,大家辛苦。”

我一看到“微调一下”和“改动不大”这几个字,心里就开始自动拉响告警。经验告诉我,需求文档里最危险的句子,通常都包着很礼貌的外壳。就像系统报错时跟你说“unexpected error”,听着很客气,实际上意思是:准备通宵吧。

我点开新文档,对比了一眼,太阳穴当场就跳了两下。

原来的情侣互动区是“完成互动解锁抽奖资格”,现在改成了“完成互动可额外领一张券”;原来的主按钮文案和路径都得跟着变,弹窗逻辑也变了,倒计时和库存展示的位置还被重新挪了一遍。

这哪叫微调?

这叫把已经跑通的业务逻辑拆开以后,换个顺序重新组装。

我正盯着文档发愣,顺哥从旁边经过,低头看了一眼我的屏幕。

“看到新版本了?”

“看到了。”我叹气,“这不叫改一点,这叫重排调用链。”

“先别骂。”顺哥语气平静,“今晚把页面主结构先稳住,细节后面再调。现在最重要的是别让整体进度掉下去。”

我点点头,心里却很清楚:
顺哥嘴里的“细节后面再调”,翻译成人话通常就是——后面会有很多细节来找你。

果然,到了下午,小璇那边的新稿也出来了。

她把我叫过去,开始过第二版。

“这个互动卡片区要加一层轻动效,不然太平。”
“这里按钮分主次,主按钮更实一点。”
“领券成功弹窗别直接硬弹,先过一个轻反馈。”
“这个状态下文案要换,不然用户会以为还能继续领。”

我一边听一边点头,开始还能跟得上,听到后面就感觉脑子像开了一堆没必要的后台线程,风扇都快转出来了。

“等等。”我指着屏幕,“这个成功弹窗不是昨天已经定过了吗?”

“昨天那个版本是按第一版规则走的。”她说,“现在互动路径改了,这里得顺一下,不然前后体验断掉。”

“那这个按钮态呢?昨天不是也分过了吗?”

“昨天分得不够细。”她低头看稿,“现在多了一个‘已参与待解锁’的状态,不补出来页面上会很乱。”

我盯着屏幕看了两秒,没说话。

她大概也感觉到我情绪开始往上拱,语气稍微放轻了一点:“我知道你那边已经写了一版,但这些地方如果现在不改,上线以后看起来会很糙。”

我点点头,说了句知道。

表面看着还算平静。
实际上我心里的连接池已经快被这些“再补一点”“顺一下”“改一下”借空了。

到了晚上联调的时候,问题终于开始集中爆发。

前端项目一开,群消息一刷,产品、测试、设计、研发全在线,整个气氛特别像一场有组织有纪律的集体渡劫。我坐在工位上,一边改页面样式,一边接活动逻辑,一边还得抽空看后端接口返回,感觉自己像一个被强行打成多线程的单核服务,表面上每个任务都在响应,实际上随时可能因为资源抢占直接死锁。

我刚把第二版主页面状态接完,小璇的消息就过来了。

“阿雷,互动卡片区的间距还是太挤了。”

我回:

“我这边先把逻辑走通,样式细调晚点改。”

她很快又发来一张截图,圈了几个地方:

  • 标题离主视觉太近
  • 互动卡片之间呼吸感不够
  • 主按钮和副按钮视觉层级不明显
  • 弹窗里的确认按钮压得太下
  • 状态切换时动效太硬

我看着那张图,额头开始发热。

不是说她指出来的问题没道理。
相反,她说得都对。
问题就在于——都对。

程序员最烦的不是对方乱挑刺。
程序员最烦的是对方每一刀都挑得很准,准到你一句“这没必要吧”都说不出口,但你又真的已经改不动了。

我压着火,先回了一句:

“我知道,我这版先把流程跑起来。”

她那边过了几分钟,又发来一句:

“流程能跑和页面能上线,不是一回事。”

我盯着那行字,半天没动。

这话我当然明白。
可我那会儿的状态,已经不是讲不讲道理的问题了,而是 CPU 长时间满载以后,任何再正常不过的请求,都会让我觉得是在加压。

群里产品这时候又冒出来一条:

“辛苦大家,这里还有个小优化:互动完成后文案能不能再甜一点?”

我看着“小优化”三个字,差点把鼠标捏碎。

甜一点。

都这个点了,他居然还在想文案要不要更甜一点。

我那会儿的感受特别复杂。
就像你一边在修线上问题,一边有人站在你旁边说“顺便把按钮颜色再调亮一点吧”。
你不能说这需求完全错。
可你真的很想把说这话的人直接加入风控黑名单。

晚上十点多,页面总算勉强接出一个能跑的版本。

我站起来去接水,路过设计区时,小璇还在盯着屏幕改最后一版走查稿。她看到我,抬手叫了我一下。

“你过来一下,这几个细节再看一眼。”

我走过去,她把页面截图放大给我看。

“这里活动倒计时和按钮之间太堵了。”
“这里领券成功后的轻反馈不够明显。”
“还有这个弹窗,关闭叉和文案位置有点抢。”
“情侣互动完成后的高亮态也得再拉开,不然用户会看不出来自己已经解锁了。”

我站在她旁边,听着这些问题一个个往外蹦,脑子里那根绷了一整天的线终于开始嘎吱作响。

“这些能不能明天再看?”我尽量让语气正常一点,“我今天先把整体页面跑顺,很多细节现在再改,等于又得重新抠一遍。”

“可这些不是可改可不改的地方。”她抬头看我,“这些不调,整个页面质感会很差。”

“我知道。”我声音已经有点僵了,“但你能不能别总在页面快成型的时候,一次性给我补这么多细节?”

这句话一出来,她愣了一下。

我自己也知道,这话已经不是单纯在聊工作了。

她看着我,几秒没说话,最后才开口:“我不是故意等你快做完了才说。很多问题就是页面真正落出来以后才看得见,不是我不早提,是前面看稿的时候根本暴露不出来。”

“可你现在这样提,对我来说就是返工。”

“那你以为我愿意一直改吗?”她语气也开始硬了,“页面做得太糙,我不盯着,最后上线出来难看的还是整个项目。”

“我没说你不该盯。”我压着声音,“我只是说你每次都在我刚写完一版的时候继续往上加,这种感觉真的很像在反复热修一个不允许稳定的页面。”

她看着我,眼神一下冷了点。

“那你有没有想过,为什么我总是在你写出来以后还能挑出这么多问题?”

我没接话。

“因为你做页面的时候,脑子里优先级一直是‘先能跑’。”她盯着我,一字一句说得很稳,“按钮能点就行,弹窗能弹就行,状态能切就行。可页面不是后台接口,不是返回 200 就算完成了。”

我心里那点火一下就被她这句话点着了。

她说得没错。
但人累到一定程度以后,听见真话,往往不会立刻服,只会先烦。

“那你们设计是不是总觉得,多两像素留白、多一点动效,页面就能飞升?”我声音不大,但已经明显带刺了,“现在是活动要赶上线,不是作品集评审。”

她脸上的表情一下收住了。

那一瞬间,我就知道,坏了。

这句话已经过了。

不是工作争论,是开始拿对方的专业说事了。

她沉默了两秒,语气也彻底冷下来:

“对,至少我们不会觉得‘能跑就行’是万能免死金牌。”

空气一下安静了。

那种安静比吵起来还难受。
像两个服务原本还在做正常通信,结果某一刻突然同时断开连接,谁都不再发心跳包,但谁都知道,刚才有东西已经崩了。

后面半个小时,我们还是把联调做完了。

该改的地方继续改。
该确认的状态继续确认。
该发群里的截图还得发。
表面上看,一切都还能正常运行。
只有我自己知道,我和小璇之间那条本来一直挺顺的协作链路,已经开始丢包了。

下班的时候快十一点半。

我们一起从公司楼里出来,外面风有点闷,路灯把地上的影子拉得很长。平时这条路我们走过很多次,要么聊今天谁又提了离谱需求,要么吐槽产品又把文案写成了像 AI 生成的。可那天谁都没说话。

沉默走到一半,还是我先开了口。

“你今天很多细节,真的提得太晚了。”

她脚步没停,只是淡淡回了一句:“很多问题本来就是做出来以后才会暴露,不是我故意拖到最后。”

“可我这边已经改了两版了。”我压着火,“每次我刚把结构和逻辑接好,你那边就又有新的视觉问题、状态问题、动效问题。我不是不想改,我是改到后面真的会烦。”

“那你烦的是我,还是烦需求一直在变?”

这句话问得特别准。

可人在情绪顶上的时候,是不会老老实实认根因的。

我回她:“都烦。”

她点点头,没立刻说话。

走了几步,她才开口:“可你刚才那种说法,听起来像是在怪我故意找你麻烦。”

“我没那个意思。”我嘴上这么说,语气却一点都不像没那个意思。

“那你是什么意思?”她停下来,转头看我,“阿雷,我今天从早到晚也在改稿、看页面、补状态,不是只有你一个人在返工。你累,我也累。可你刚才那句‘作品集评审’,就是在拿我的工作当情绪出口。”

我站在原地,一下没接上。

因为她说得对。

可我那时候还没从那个状态里退出来,只觉得胸口像堵了一堆没处理完的异常。你明知道日志里写得清清楚楚,问题不全在对方,可你就是烦,烦需求、烦返工、烦进度、烦自己怎么改都改不完,最后最近的那个人刚好站在风口上。

“那你呢?”我也抬头看她,“你刚才那句‘返回 200 不算完成’,不也是在说我做东西糙吗?”

她看着我,声音不高:“如果你听进去的是这个,那说明你今天已经根本没在听我到底想说什么了。”

这话一下把我堵死了。

我们谁都没再接着往下吵。

没有摔门。
没有狠话。
没有那种狗血到像短视频剧情的“行,那你去忙你的吧”。

就是突然都不想说了。

那种沉默其实比大吵更难受。
因为大吵至少还在交换数据。
沉默不是。
沉默像两个服务彻底断开连接以后,只剩各自的日志系统还在本地默默报错。

走到地铁口的时候,她说了句“我先走了”。

我点点头,说了句“嗯”。

就这样。

特别普通。
普通得让我一路回去都觉得心里发空。

回到住处以后,老袁正戴着耳机打游戏,看到我进门,还问了一句:“今天这么晚?活动页还没搞完?”

我“嗯”了一声,没多说,抱着电脑回了房间。

门一关上,整个世界一下安静下来。

我把电脑往桌上一放,整个人瘫进椅子里,盯着桌面发了很久的呆。屏幕上还停着今天最后一版页面,按钮、卡片、弹窗、文案,一个个看着都很正常。可我一想到晚上那段对话,就觉得脑子里像堆着一堆没清的临时文件,系统明明还在跑,心里却已经卡得不行。

我点开和小璇的聊天框,打了一句:

“你刚才的话也挺伤人的。”

盯了两秒,删了。

又打了一句:

“我不是说你不该提问题。”

又删了。

接着又写:

“今天这活谁来都得疯。”

还是删了。

删到后面我突然发现,我根本不是不知道该说什么。
我是不知道该怎么把今天这一整条失控链路,准确翻译成一句不伤人的话。

程序员其实很擅长描述问题。
哪个接口挂了,哪段代码脏了,哪个状态没兜住,谁的锅占几成,正常情况下我都能讲得挺清楚。
可一旦问题变成情绪,就不一样了。
情绪这东西不像日志,不能直接 grep;不像 bug,不能复现一次就定位;更不像需求,能开个会拉齐。

它更像一堆没有结构的脏数据,乱七八糟堆在心里,占资源、拖性能,还不肯自己消失。

我靠在椅背上,把今天从早到晚的事重新过了一遍。

产品改第三版。
顺哥让我一起扛前端。
页面状态来回切。
按钮、弹窗、动效、留白、文案。
群里不停有人说“小优化很快”。
我明明已经很累了,还要硬撑着做出一副“没事,我还能接着改”的样子。

过到最后,我才慢慢承认一个很丢人的事实:

我今晚真正气的,不是小璇。
我气的是今天所有不稳定的东西。
需求不稳定。
节奏不稳定。
页面状态不稳定。
甚至我自己的情绪也不稳定。

只是刚好,她站在了离我最近的地方。

想到这里,我忽然就有点难受。

不是那种想大吵一架的难受。
而是很明确地知道自己刚才把火发歪了,但又不知道该怎么补。

另一边,小璇其实也没比我好到哪儿去。

当然,这是后来我才知道的。

她回到住处以后,也没立刻洗漱,而是坐在桌前把今天所有设计稿和页面截图重新翻了一遍。她看着我白天改出来的页面,又把自己晚上指出来的问题一条条过了一次,最后也承认:问题她挑得没错,但语气确实有点太像 code review 了。

UI 这种岗位,有时候也挺残忍的。

你越专业,越容易精准;越精准,越容易显得不留情面。
她白天那几句“这不只是能跑就行”“页面不是返回 200 就算完成”,放在纯工作场景里没毛病,可放在我已经快过载的状态下,就像把一串本来就很扎眼的错误日志加粗以后又贴到了我脸上。

我们俩其实都没错到哪儿去。

也都没对到哪儿去。

说白了,就是两个都已经快打满 CPU 的人,偏偏还在尝试做高质量沟通。系统都快冒烟了,谁还指望输出能多温柔、多优雅。

我盯着聊天框,看着输入法光标一闪一闪,像个一直在提醒我“你最好说点什么”的心跳信号。

我又打了一行字:

“我不是怪你。”

停住。

后面接什么,我想了很久。

不是怪你挑问题。
不是怪你说得直。
不是怪你改得细。
我怪的是今天这一整天,像个怎么调都调不顺的烂项目。
可这些话真要全打出来,又太长,也太碎,像一段没整理好的异常堆栈。

我删删改改,最后输入框里只剩一句:

“我不是怪你,我只是今天真的撑不住了。”

我盯着这句话看了很久。

久到手机屏幕都快暗下去了,我也没按发送。

因为我突然不确定,这句话现在发出去,到底是在解释,还是在把自己的崩溃继续转嫁给她。

光标还在闪。

那句话停在输入框里,没发出去,也没舍得删。

像一条终于接近根因、却还没来得及真正提交的修复记录。