上周,我做了一件有点残忍的事。
把小杨叫过来,让他关掉所有AI工具,手写两个小时代码。
规则和我一个月前测自己的时候一模一样:关掉Cursor,关掉Copilot,用最原始的IDEA,不查Stack Overflow,不查文档。
两小时之后,我看了他的结果,沉默了很久。
不是因为他比我差。
是因为他的问题,和我的问题,完全不一样。
一、先说说背景
小杨是我带的校招实习生,大三,Java方向。
来了将近两个月,用AI的时间比我还长------他从第一天入职就开始用,从来没有经历过"没有AI"的开发状态。
上个月我写了一篇文章,说我用AI带他,两周后他的产出超出了我的预期。
那篇文章我写得很高兴,然后有读者留言问了我一个问题:
"你有没有想过,从一开始就用AI的新人,和你们这种先手写多年再切换AI的老程序员,成长路径是不一样的?他学会的,真的是你想让他学会的吗?"
这个问题,我放了很久。
直到上周,我决定测一测。
二、测试结果:完成度比我高,但问题比我深
两小时结束,他完成了大概65%。
比我一个月前测自己的55%高了10个百分点。
我以为这说明他还不错。
但当我仔细看他卡住的记录,发现了一件事:
他卡住的地方,和我完全不同。
我当时卡住的地方:
API/方法名想不起来:5次
逻辑起点不确定,不知从哪里动手:3次
写完想让AI验证一下:3次
他卡住的地方:
API/方法名想不起来:2次(比我少)
某个功能点不知道"应该"怎么实现:6次
写完不确定"这样对不对":5次
前两类,他比我好------工具用得熟,语法记得更牢,这很正常,他每天都在用。
但后两类,他比我严重得多。
"不知道应该怎么实现"和"不确定对不对",是两种更底层的能力缺失。
三、一个让我们都沉默的细节
测试结束后,我们坐在一起复盘。
我让他描述一下,那6次"不知道应该怎么实现",具体卡在哪里。
他举了一个例子:写一个分页查询,需要根据多个可选条件动态拼接SQL。
他说:
"我知道要用动态SQL,知道MyBatis有这个功能,但我不知道从哪里下手。以前都是把需求告诉AI,AI直接生成的,我来review。现在AI没了,我反而不知道该先写什么了。"
我问他:那你最后怎么解决的?
他说:
"我想了很久,感觉脑子里有一个模糊的印象,但不清晰。最后把条件一个个if判断写出来了,但我不确定这是不是正确的写法,感觉AI会建议我用另一种方式。"
我看了他写的代码。
逻辑是对的。一堆if-else,不够优雅,但功能完全正确。
然后我问他:你觉得这段代码有什么问题?
他想了一下,说:"代码有点丑?"
我说:还有呢?
他沉默了。
他不知道。
他能写出来,但他不知道为什么这样写,也不知道"更好的写法"好在哪里,只是隐约觉得AI会给他一个不一样的答案。
这才是真正让我停下来的东西。
四、我们的退化,不是同一种
一个月前,我测完自己,写了一篇文章,说我退化的是三层:肌肉记忆、起手式、自我验证能力。
现在看小杨,他的情况不一样。
他没有退化。
更准确地说:他从一开始就没有建立过那些东西。
我用了12年手写代码,建立了肌肉记忆,建立了"从空白开始构建逻辑"的直觉,建立了"看一段代码就知道哪里有问题"的判断力。
然后AI来了,我开始退化。
小杨不同。他从第一天起就用AI。那些东西,他从来没有建立过。
所以他不是在"退化",他是在"从零开始",只不过他跳过了那个"手写建立直觉"的阶段。
这两种情况,表面上看起来相似------都是"离开AI就不行"------但根源完全不同,危险程度也不同。
我的退化,是可以找回来的。
手感生疏了,练一练能回来,因为底层的理解还在。
我知道那段if-else为什么不够好,知道更好的写法是什么,知道什么时候该用哪种方案------这些判断力,不会因为一年没手写就消失。
小杨的缺失,不是能"练回来"的。
因为那个东西从来没建立过。
他可以学会用AI生成出色的代码,但他还没有建立起一套自己的判断标准:为什么这样写比那样写好,这段代码的瓶颈在哪里,这个方案在什么场景下会出问题。
他的判断,完全外包给了AI。
五、一个更扎心的发现
复盘快结束的时候,我问小杨:你觉得你学到东西了吗?
他说:"学到了。感觉学了很多。"
我问:那你现在能独立设计一个模块的架构吗?
他想了一下,说:"应该可以,我可以问AI。"
我说:不用AI呢?
他沉默了几秒,说:"可能......要想很久。"
然后他问我:
"老师,是不是所有程序员都要先学会不用AI手写代码,才能用好AI?"
这个问题问得很好,也很难回答。
我想了一会儿,说:
"我不知道。我这一代人是先学会手写,然后再切换到AI的。但你们这代人从一开始就在用AI,这条路没人走过,我也不知道终点在哪里。"
他点了点头,说他明白了。
我不确定他真的明白了什么。
我自己也不确定。
六、我改变了带他的方式
测试结束之后,我调整了他接下来的培养方向。
不是让他"戒掉AI",那没有意义,也不现实。
而是专门设计了一套针对他这种情况的训练:不练速度,练判断力。
第一件事:每周一个"先自己想,再看AI怎么做"的任务。
给他一个功能点,让他先独立设计实现方案,不管写不写出来,先把思路说出来。
然后让AI出一个方案,两个方案放在一起,让他分析:差在哪里?AI的方案好在哪里?有没有AI没考虑到的地方?
目的不是让他记住某种写法,而是让他建立一个参照系:知道"好代码"和"能跑的代码"之间的差距在哪里,以及为什么。
第二件事:专门设计一批"边界条件"的题目。
AI生成的代码,在正常路径上往往是对的。薄弱的地方在边界条件:并发怎么处理,失败了怎么回滚,极端数据会不会崩。
我给他出的题不考正常流程,专门考这些:如果这个接口同时来了1000个请求会怎样?如果这个字段传了null会怎样?如果数据库在第三步挂了,前两步的操作怎么处理?
这些问题,AI当然也可以回答,但我要他先自己想,再去看AI怎么说。
第三件事:让他做Code Review,不只是被Review。
以前他的角色是提交代码、等别人review。
现在我会把一些我自己或者其他同事的代码交给他review,让他找问题。
不是走过场,是真的找,找到一个就讨论一个。
这个训练的核心是:让他建立"发现问题"的能力,而不只是"实现功能"的能力。
七、跑了三周,有一个变化让我意外
调整之后跑了三周,小杨有一个变化让我没想到。
他开始主动质疑AI了。
有一次他做一个库存扣减的功能,AI生成了一段代码,他review之后发来消息:
"老师,AI给的方案我觉得有问题。它用的是乐观锁,但我们这个场景并发量比较高,失败重试会很多,我想用悲观锁,你觉得呢?"
我看了他的分析,他说的是对的。
这个判断,三周前的他给不出来。
三周前他的反应是:AI给了方案,能跑,提交。
现在他开始问:AI给的方案,在我的场景里合不合适?
这才是我想看到的。
不是他学会了某种技术,而是他开始有自己的判断了。
八、一个我还没想清楚的问题
这件事让我思考了很久,有一个问题我到现在还没有答案。
对于从来没有经历过"无AI时代"的程序员,他们需要刻意补上手写代码的经历吗?
我自己的答案是:不一定需要补手写代码,但一定需要补的是独立判断的能力。
这两件事不是同一件事,但在我们这代人身上,独立判断能力是通过手写代码的经历建立起来的。
对小杨们,也许有另一条路------通过大量的"分析和比较"来建立判断力,而不是通过"从零手写"。
我试着在走这条路,但走到哪里,我不知道。
小杨是第一个,他的结果可能就是这个答案的一部分。
写在最后
一个月前,我写了那篇《AI编程一年后,我还记得怎么手写代码吗》,说我的某些能力在退化。
上周测完小杨之后,我意识到:我和他面对的,不是同一个问题。
我的问题是:曾经建立的东西,在悄悄消失。
他的问题是:有一些东西,从来没建立过。
这两件事,都值得认真对待。
只是解法不一样。
那天最后,小杨问了我一句话:
"老师,你觉得像我这样从一开始就用AI的人,以后会比你们更强,还是会有什么缺陷?"
我想了很久,说:
"我不知道。但我觉得这取决于你。AI用得好的人,会有一种我们没有的能力------他们从来不会被'这很难实现'这个想法卡住,因为他们从来没经历过'难'。但同时,有些东西只有被难住过,才知道难在哪里,才能真正解决它。"
"两种能力,都重要。你现在缺的那个,要自己去建。"
他沉默了一会儿,说:"那我知道接下来要做什么了。"
我希望他真的知道了。
你们团队有没有从一开始就用AI的新人?你觉得他们和你的成长路径有什么不同?
欢迎评论区聊聊。
后端AI实验室 不讲概念,只谈实战 代码开源,每周更新