@Lenciel

AI 究竟能不能替代程序员? (1)

最近在董事会汇报,进入「any questions?」环节,一位董事问:「我们现在还有这么多研发,是不是可以考虑用 AI 替换?我现在投的好几个公司自从用 Cursor 之后,效率都提高了 30% 到 40%我没有和他争论他是不是被骗了,是不是我更加成熟了? 。」

这是一个我这两年被反复问过的问题:在美帝的设计师朋友问过我,是不是现在有个点子就能用 AI 写代码创业;在基金里的同学问过我,是不是 Cursor 这类产品产出会超过程序员;当然,最多的还是类似于董事会上这种场景,公司究竟能不能通过这些技术,替代那些昂贵的程序员。

受限于讨论这个问题的时间、场合和提问人的知识背景,我应该给了虽然意思相对统一,但都不太完整的答案。而且,三年前系统对类似问题的观点现在确实有更新,所以不如再整理一次。

目录

先说结论

我认为:

  1. 在 AI 消灭人类之前,不会消灭程序员;
  2. 但 AI 绝对可以解放和发展现有的生产力;
  3. 就个体而言:
    a. 不去动手研究 AI 的管理者特别是技术管理者是不合格的;
    b. 不去掌握和应用 AI 的程序员也是不合格的;
  4. 就公司而言:
    a. 仅仅用 AI 降低成本的,会被真正用 AI 拓展能力的打垮;
    b. 应该优先考虑清楚 AI 层面的交互然后再构建其他的交互;

为什么消灭不了程序员

程序员的工作如果粗略分成编码和非编码两部分,我们来看看究竟 AI 能替代里面的哪些。

非编码工作

不同层级的工程师花在非编码工作的时间是不同的。但即便是最基层的自称「码农」的工程师,编码在整个工作中的占比不会超过 50%。还会有大量的时间用于沟通评审(需求、测试用例、交互设计)、文档写作、环境配置等工作(摸鱼这些非工作的我就不提了)。

这些工作需要很多上下文对齐,就像 Mozilla 的 Senior Staff Chelsea Troy 在一个反驳这篇号称 AI 对编程提效 26%的论文时说的那样

Large language models have not wholesale wiped out programming jobs so much as they have called us to a more advanced, more contextually aware, and more communally oriented skill set that we frankly were already being called to anyway…. On relatively simple problems, we can get away with outsourcing some of our judgment. As the problems become more complicated, we can’t.

编码工作

只要真正用过 Cursor、Windsurf 或类似产品,就得承认它们比大部分没写过十万行代码的程序员,都写得更快更好。

这很像人类对化纤材料或者转基因技术的使用一样:虽然没有办法提高上限,但绝对大大提高了下限。

不过,编码工作会被 AI 取代吗?

我仍然持怀疑态度。

倒并不是说有些代码的生产就会像羊绒一样永远雍容华贵,而是没有真正干过程序员的人没理解,整个编码工作如果往细了拆,仍然可以分解成写代码、读代码和调代码等部分,并且对象可以是自己的代码,但更可能是别人的代码。

和已有代码交互

除开一些创业项目或者自己练手的 solo 项目,大部分公司里的编码工作都是所谓的「屎山雕花」:阅读调试修改其他人代码的时间远远超过自己写代码。

这部分工作,不仅时间上占比更高,难度也比自己撸高。《K&R C》和 AWK 的作者,Kernighan 在《The Elements of Programming Style》里说过一句我印象很深的话,它如此有名以至于被称为 Kernighan 定律这段话也一直很有争议:拥护者认为就应该尽量避免写那些「聪明」而难以理解和维护的代码,也就是 KISS 原则;而反对者认为开发的时候就应该挑战自己技术的极限,毕竟心流难得。

Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.

消化一个代码库的架构和细节,搞清楚别人代码的逻辑和实现,「认知负担」确实挺高的。这些工作可以在 AI 的辅助下加速,但是很难被 AI 替代。

自己新写的代码

自己写代码的时候借助 AI 生成和辅助,现在好像被叫做「vibe coding」我不知道有没有 vibe debugging 之类的。

这部分完全交给 AI 行不行?我看不行,理由如下。

什么是「代码」

代码是资产还是负债?

差不多十年前,Kellan 在那篇可能是历史上关于「技术债」最精彩的文章中指出,它既不是资产也不是债务,而是 liability:一个项目里的每一行代码,无论来自人还是 AI,都只代表了对待解决问题当前的最佳理解,都需要被测试、维护、确保安全。

并且如果你同意我说的

要把软件开发看成一个对需要解决的问题和解决的技术进行学习的过程,把架构和代码都当成这个过程的副产品

那么,AI 使编写代码变得更快、更便宜,实际上只会以前所未有的速度创造技术债。因此可以看到,行业里管着一定规模的系统,需要长期维护和迭代的人,对 AI 编程会有一些声音:

  • 比如 Gergely Orosz 认为,《人月神话》等书籍中描述的问题仍然存在,AI 无法改变它们;
  • 比如 Camille Fournier 说,自己的公司一直很纠结要不要从初级程序员手里收回 AI 工具(我跟阿里、字节的一些管理者聊天也听到过类似的想法),因为这些同学如果没有通过自己编码形成的分析思考能力很难成长;
  • 哪怕是走得非常前沿的推行 AI 编程的 Harper Reed 也说,他在回归瀑布模型,也就是在交给 AI 之前花大量的时间梳理需求文档、交互设计和测试用例,然后把这些内容以专门优化过的 propmt 给到 AI。

因此,我认为从长期看,完全让 AI 来写代码在大型项目里还是很难发生。

用自然语言也是「编程」

前几年,在 NoCode 或者 LowCode 或者 RPA 还很火的时候,我跟一些朋友开玩笑说,如果无代码或者低代码那套拖拉拽的东西就能完整解决问题,那它本质上就是图灵完备的,于是,它仍然是一门程序语言:你只是在用拖拉拽的方式 coding,谈不上 NoCode。

同理,如果像 Harper Reed 那样,用一个完整的瀑布流来给 AI 输入,然后不断调整、测试、上线…我认为他也在编码,只是用自然语言而已。

编程的两个核心,逻辑的梳理和数据的治理,被拆成过各种概念,运用了各种工具,万变不离其宗。

可能会带来更多的「程序员」

最后,你读到这里可能会认为我很反对 AI 辅助编程(或者,我认为更合适的名称应该是 AI 辅助代码/文档/测试用例…生成),那请你相信我前面的结论

只是,我不认为会替代程序员,而是更多的人,可能成为「程序员」。

因为历史上,从给纸片打孔至今,每一次计算机编程方面的进步,都在不断降低成为一名程序员的认知负担,都曾经引起过「这是不是可以取代程序员」的妄念或者是担忧,最终,都带来了更多的程序员。

我还记得我刚入行的时候,IBM 等公司正在推通过 UML现在的小朋友还知道什么是 UML 吗? 图生成代码取代程序员。

相信了的公司和个人都很惨。

后来是云计算,号称取代运维工程师。

还有自动化测试工具,号称取代测试工程师。

最后,运维升级为 DevOps,测试左移,大家只是变得更加「程序员」了而已。

这有点像 CNC 机器,它的出现只会让更多人成为木匠,而那些好的木匠成为很好的木匠,而不是消灭木匠。

那么,站在管理者和从业者角度,究竟应该在 AI 工具运用上怎么办?我们下次继续…

伦敦

接到邀请时,Will 觉得 Chris 让他出任贝斯手,完全是因为这趟去伦敦的演出乐队需要一个免费的司机,而他不喝酒。毕竟,之前在牛津也有很多演出机会,很少叫他。

Chris 连忙解释道:「你才开始练习不到两年,就能有现在的水平,我们都觉得你会弹得越来越好,所以现在叫你加入正是时候。而且,你还能唱非常好的和声,那也是我们需要的。」

Will 听了没有说话。他自己也曾开玩笑说遗传了父亲的绝对音准,在和声时,围绕主唱的声音略微做些往上或者往下的调整,就可以显得很动听。

Chris 看到他犹豫的样子,继续说道:「我们谁不是听着你爸的那些歌长大的?你不仅仅有双适合搞音乐的耳朵,Will,你还有很多天赋之外的资源,不要浪费它们。」

Will 还是没有说话。

Chris 叹了口气:「你是不是担心在伦敦遇到你爸?」

Will 突然有点激动:「我可不怕遇到一个十几年没见过的爸爸。」

Chris 明白自己已经成功了,笑道:「那你还担心什么呢?我们去的可是周六晚上的 Ronnie Scott’s」。

Chris 说的没错,玩音乐的没有谁会抱怨在星期六晚上的 Ronnie Scott’s 登台演出。这个时段伦敦的各种酒吧里挤满了来自世界各地形形色色寻欢作乐的人类,只有这里永远坐着真正懂得音乐的观众。他们气氛活跃,互动积极,脸上洋溢着满足和放松,但永远不会把自己的啤酒洒到台上去。

演出开始前,Will 在二楼的入口处拍了张照片,发到自己的 Ins。即将在传说中的「Upstairs at Ronnies」的演出,一如 1959 年的 Ronnie Scott,或者后来的 Ella Fitzgerald 或 Miles Davis,让他的手心满是汗水。于是他到吧台给自己点了一杯冰可乐。

Chris 走过来,喝下一大口啤酒:「你听说了吗,我们演出之前暖场的歌手。」

「就算你是这副幸灾乐祸的样子,我也不相信会是他。」

「他们说是。伦敦有这么多酒吧,你父亲也有好几年没登台了,今天你们俩要在这里一前一后演出,太巧了对不对?」

Chris 说完笑着转身走了,Will 独自站在吧台旁,仔细地看了看舞台附近的人,觉得没有谁像他。

但也有可能只是认不出来了。一开始父亲给他写过信,他回了句现在想起来有点后悔的话,说宁可父亲杀了他而不是离开他和母亲。也许这是因为他和父亲有过漫画《父与子》里那样,仿佛永远不会被庸碌生活夺走的近乎于调皮的脉脉温情,而父母的离异让这一切变成了两面镜子间晃动的烛火。

那是十二年前了吧?总之,那以后他和父亲就不怎么说话了。但他还经常在听他的歌。节奏缓慢,娓娓道来,歌词也很有诗意。偶尔他会把专辑封面点开,端详那张记忆中很熟悉的脸:笑容狡黠,神采飞扬,面对镜头自信中又有点儿羞涩。

他还是感觉手心冒汗,就又买了杯可乐,然后在舞台前的角落里找了个位置坐下,想要躲起来。突然间,他发现父亲在舞台的一侧,正直勾勾地看着他。昏暗的灯光下,五十多岁的他并不比那些专辑封面上的样子老多少。

Will 不动声色地回视,不笑也不露出认识的表情,然后把目光转向楼梯间。当他故作平静地看了一会儿楼梯上进进出出的人,再次向他的方向望去时,父亲仍然在注视着他。传说中的酒吧老板娘 Carrie 不知何时站在了他的身边,也微笑着看向他的方向。

伦敦音乐圈的每个人都知道,Carrie 在周末从不会来酒吧,但父亲让她破了这个例。她做了个手势把父亲请到舞台中间,然后说:「你现在就开始吧,趁着消息还没有散布出去,你唱完了还可以脱身。」

父亲垂下头,表情严肃,然后向 Carrie 沉重的摇了摇头,似乎说他不能开始。但酒吧里所有人都停止了走动和聊天,连吧台里的调酒师都把杯子放到一边。Will 也不由自主地站了起来,望着舞台上的父亲。

他看了 Will 一眼,又低下头,歌声便响了起来。是那首关于离开的歌,音调优雅,情绪充沛,咬字比唱片上的更好听,连低音时也是如此。

第一次进入副歌前,他抬起头,对 Carrie 笑了一下。Will 觉得他这里起调太高,唱到后半段,大概只能强行降调才能完成。但很快他就知道自己错了:父亲对呼吸的控制非常出色,演绎得热烈却又轻松。

Chris 走到他身边,拍了拍他的肩膀。他很感激 Chris 这个时候出现,因为人越来越多,他并不想从目前的位置往后挪,但又觉得自己站得离父亲太近了,一个人有点承受不住。

副歌之后是那些他非常熟悉的悲痛歌词。父亲唱到这部分时,再次直直地望着他。Will 心里盘算着如果给他和声应该如何去围绕他的声音,但表面上仍然非常平静地盯着那双始终望向自己的眼睛。

很快就到了著名的最后一段,父亲再次闭上眼睛,唱出颤音和长调。他在倒数第二句前停顿了半秒,但不是为了换气,而是让酒吧里每个人都感受到那份无声中的绝望,然后才进入最后一句,几乎是说白的低沉收尾。

唱完之后,父亲谦逊地向观众鞠了一躬,便没有再回应掌声,又望向自己。他这才意识到,接下来父亲可能走过来,或者只是继续这样望着自己,啥也不说。不管是哪种,他都没做好准备。他转身想要往下楼的方向跑,同时又有点不知道怎么才能让这事看起来很正常。

「天啊,唱得太好了」,Chris 拉住他说。

「是不错。但是我这会儿有点不舒服,要不我去车上喘口气,到我们演出的时候你们再给我打电话叫我上来吧。」

Chris 有点无奈地看着他。他也知道自己应该假装这只是个普通的傍晚,勇敢地和乐队来一场漂亮的演出,但他耸耸肩就下了楼。坐进车里,他才开始颤抖起来。天色暗了起来,街上的车灯晃得他满眼泪花。