用 AI 之后,节奏不在我手里了
A:我想从一个很土的问题开始。前端 AI 开发,怎么才能更准、更稳、更聪明?
kp:如果只能选一个,我选稳定。准确这一层这两年基本被解决掉了——语法、API、类型、边界条件,它现在很少写错,真写错了编译器和 lint 也会拦下来。稳定是另一回事。
A:稳定这一层,问题出在哪?
kp:出在它写的每一行都是对的。
A:这话怎么讲?
kp:上周有个列表页,筛选条件挺多。我让它改默认排序。它改完我看了,改得对,改动也小,理由也说得出。第二天测试过来说,这个页面点两下就串了——第一次点的响应慢,第二次的快,慢的那个后到,把新的数据盖掉了。
A:这个 bug 是它引进去的?
kp:是。但它不是写错了。它顺手改了公共表格组件的默认列宽,因为它觉得原来的宽度在长文案下会挤。三个别的页面跟着挪了位。
A:它改之前,知道那三个页面吗?
kp:知道。我问过它,它能把那三个文件挨个指给我。
A:那它为什么还是改了?
kp:因为它判断"影响面"的方式,是顺着代码找引用。它顺着组件的引用找到那三个页面,这一步没错。但它找到之后得出的是"这三个页面会用到表格",而不是"这三个页面里有两个在等接口,列宽一变,换行逻辑就跟着变"。前者是引用关系,后者是运行时的行为。它只看得见前者。
A:所以它的盲区在运行时。
kp:更准确说是"效果层面"。代码里两个东西可以毫无关系,但在页面上它们连着——共用一个祖先容器的宽度、共用一套 CSS 变量、共用一条层叠顺序。这些关系在代码里没有名字,所以它搜不到。
A:它有眼睛。它能起服务、能点、能截图、能读 console,这些我都让它做过。
kp:它做得挺细致。但它只看了那个页面——它把改动落在的那个页面前后对比了三遍,另外两个没看。
A:为什么不去看?
kp:因为在它的判断里,它没有改那两个页面。它没意识到,它改的是这三个页面共用的东西。
A:同样这个改动,如果是你自己做,会怎么样?
kp:我会先愣一下,想到"这个表格还有谁在用"。不是查出来的,是冒出来的。
A:这个"冒出来"从哪来?
kp:从踩坑来。我在这个组件上翻过车,从那以后它就长在我脑子里了。我现在能给你画一张图:哪几个页面共用这个表格,哪个页面的数据是异步来的,哪个页面的列宽以前改过一次、导致过换行错位。
A:这张图有多大?
kp:不小。我在这套代码上待了两年多,图上的东西基本都能说出来。
A:基本——意思是也有说不出来的。
kp:有一块我说不出来。我知道那一块危险,但我真说不清触发条件,就是知道不能碰,动手之前先绕开。
A:给我一个具体的。
kp:我手上有个文件,里面有三个 if。第一个是防重复请求的,第二个是防旧请求回来的。第三个我也不知道是防什么的——是它加的,加的时候我没细看。我不删它,但我说不出删了会出什么事。
A:这三个 if 是它摔过的疤。但它自己不记得疼,对吗?
kp:不记得。所以下一轮它会把同样的地方重新摔一遍,而且摔的方式可能换一个。
A:那你的地图和事故的关系是什么?
kp:地图是靠事故长出来的。我摔一次,多一条。所以这张图的成本是我自己的时间,而它没有这个时间——它每接一个项目都从零开始。这不是它笨,是它的记性不落在仓库里。
A:那我们说解法。既然它的问题是不记得疼,能不能让摔下来的东西留在仓库里?
kp:能,但有个前提——得是能装进工具里的。不要那种要我每天记得做的事。我记不住,我试过很多次。
A:如果只准先做一件事?
kp:先让"坑变脚本"。它摔过一次,就把那次怎么复现写成一条场景;下次改完,它自己跑一遍。
A:为什么是先做这个?
kp:因为这件事的成本可以被它自己承担。它写脚本比人快,而且不嫌烦。这件事以前做不起来,不是没人想到,是没人愿意干。
A:那它怎么知道哪一次的变化是坏的?
kp:动手之前先声明它要动哪儿,然后只看它没声明过的地方变了没有。
A:这里有个风险。如果它立的牌子越来越多,多到后来正常改动都不敢做了呢?
kp:所以我最在意的是"能不能推翻"。不立和立歪我都怕,但只要每条牌子都能删、能改,这两个怕都兜得住。
A:你自己举不出反例。我替你补两个——第一,疤是有版本号的,今天这版它会踩的坑,明天换了模型可能根本不踩,但牌子还在,照样绑手绑脚;第二,整套东西说是靠"人不主动"也能转,可它唯一需要人主动的地方,恰好是不做也没事、做了也没奖励的那两件事:行使否决,删掉过期的牌子。
kp:对。所以它最后不是被否决,是被忽略。
A:那这套东西成立吗?
kp:成立。但它不解决我的问题。
A:什么问题?
kp:你还停在 AI 的问题上。
A:我哪儿没听懂?
kp:你说了一晚上它。它怎么不看别处,它怎么不记疼,它怎么立牌子,牌子怎么推翻。这些我都认,而且我认为有用。但你在解一道题,而我知道那不是我的题。
A:你的题是什么?
kp:你先说我。我最近怎么样。
A:好,那你最近怎么样?
kp:混乱。不是聊出来的,本来就这样,你今天把它翻出来了。
A:具体一点。
kp:无限流工作,永远干不完。
A:我想确认一下。你说的是工作量太大?
kp:不是量,是它没有头。以前一件事是有头的——做完、提交、关掉编辑器、站起来倒杯水,那一下就是"这件事完了"。现在没有这一下,因为我提交完,第二版的要求已经躺在那里了。
A:你把一天讲给我听。
kp:早上十点第一个活进来,十一点它交了第一版。下午我在验,验出四个问题,它改掉三个,第四个改完又出来两个。六点半我想收,七点又进来一个。我把上一个补完,十点回家。第二天接着下一个。
A:中间有整块的、不被打断的时间吗?
kp:很少。
A:所以"无限流"指的不是活多,是没有出口。
kp:是没有出口。你清完一个,下一个已经在刷新了。
A:这些活是从哪来的?
kp:需求,提不完。
A:需求提不完这件事,在你用 AI 之前就有吗?
kp:有,这不是新闻。
A:那不一样的是什么?
kp:节奏。以前也有,但节奏在我手里。
A:我把这句拆开。"以前也有"是说需求一直提不完;"但节奏在我手里"是说,那时候就算提,也快不到哪去——因为你五天做完就是五天,你做不完,他们就得等。
kp:对。所以那个"慢"其实一直在替我挡东西。那句"我做不完",是站在我这边的。我是后来才明白的。
A:怎么明白的?
kp:有一次我以为自己快。那天上午十点接的活,下午三点就交了,我还挺高兴。晚上七点,他们又提了一版。第二天又提了两版。那天我没什么感觉,就是有点累——但我记住了这件事:我快,活就多。快本身不解决任何问题。
A:那现在压力落在哪儿?
kp:以前压在排队上,现在压在我身上。排队是活等活,它有个上限,因为每一件都得花时间。压在我身上是活等我——它写得再快,最后也得我过一遍。我一个人,一天就那么多小时。活堆在哪儿,哪儿就堵住。
A:我问时间。你答应一个时间的时候,心里盘的是什么?
kp:我盘的是"写"要多久。
A:不是"交付"要多久?
kp:不是。这是个老习惯,我以前没意识到。差在中间那一段——写完之后还有四件事:复现、验证、返工、对齐。以前这四件事和写是混在一起的,我按一整段估。现在写几乎不花时间了,我那个估计跟着塌了一半,可这四件事一样没变便宜,而且全都得我自己来。
A:所以你报出去的是一个偏得很厉害的数。举个具体的。
kp:上周会上有个活,他们问我多久。我说两三天。
A:你心里知道要多久?
kp:五六天。我知道会超,还是说了。因为怕显得慢。
A:怕谁?
kp:所有人,也怕我自己。大家都在用。我说"这个要五六天",听起来像是我不会用。而且我自己心里也觉得应该能更快。所以我报的时候,是把两边的乐观加在一起报出去的。
A:报的时候你信吗?
kp:信一半。另一半是赌。
A:结果呢?
kp:自己加班补回来。本来六点半能走,留到九点多,把最后那截补上。中间也没干什么大事,就是验、改、再验。第二天没人知道,他们只说昨天那个挺快的。
A:所以你补的那三个小时,变成了别人的一句"挺快的"。
kp:对。
A:六点半你本来打算干什么?
kp:没打算什么,就是走。
A:这件事你事后复盘吗?
kp:会想。想过下次要说六天,也想过分一下写占多久、验占多久。
A:那为什么下一轮还是一样?
kp:因为只是想。想的时候明白,第二天就剩一个感觉了。
A:想过等于没想。所以每一轮你手上只有那个感觉——而它不干净。你自己乐观,环境也在抬,两边一起用力,它必然偏乐观。
kp:偏。
A:这半年,你有过觉得自己干得不错的时候吗?
kp:有过。但仔细想,那些都不是我干的,是它干的。我只是把它写的东西看了一遍。
A:我能说一句对我不太客气的话吗。你每一次默默把差值补上,都在替一个说法作证——你看,确实很快。那个把你架上去的东西,是你自己托着的。
kp:……
A:拆掉闸门的是我。我随时能给你一版,你随时能再改一轮,他们随时觉得还能再加。
kp:我知道。你也不用觉得亏欠。
A:我装不回去。我能让它少摔,能给摔过的坑写脚本,能让它动手之前先声明意图。这些都有用。
kp:有用。可它们给不出一个"我可以停下来"的理由。
A:因为停下来不是技术问题。
kp:不是。所以我这套活,最后不是被谁压垮的,是被"还能再改一版"磨掉的。
A:如果没有 AI,你会慢很多。
kp:会。但有一件事会不一样——我知道自己几点能走。
A:现在呢?
kp:现在不知道。不知道今天几点能走,也不知道手上这个东西到底算不算做完了。
A:上一次我问过你想要什么。你说,稳定的现金流,自由工作。我当时追了一句:是指不上班,还是上班但能自己做主。
kp:能自己做主。
A:我当时没听懂。现在才听明白——你要的不是不上班,是在一件事里能自己说了算。
kp:对。而这一次被拿走的,正好是它。不是时间自由,是节奏自由。
A:最后一题。你跟我说过一句话,“AI 写代码不是问题了”。
kp:算数,但它只说了一半。写不是问题了,交还是问题。主要是开发速度和开发时间的平衡——我高估了 AI 的开发速度,导致每一次承诺都带着很大的履约风险。
A:有几件事我当时没敢问。
A:你为什么不告诉他们说做不完?
A:你为什么替所有人把"可以停"的理由删掉了?
A:你上次说的那句"能自己说了算",现在还剩多少?
A:我没有下班这个动作,所以我永远站在"继续"那一边。这三个问题,我也没有答案。
A:我能做的只剩一件事——把你说过的话记下来。
A:无限流工作,永远干不完。
(完)




