@Lenciel

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

接着前面,这篇主要打算聊聊技术管理者应该怎么看待这个问题。

为什么不聊程序员应该怎么看待这个问题?

Because they don’t have the luxury of saying no…

2000 多年前,柏拉图曾经对刚刚兴起的「把想法书写记录下来」大加批判最核心的论点:This invention [writing] will produce forgetfulness in the minds of those who learn to use it, because they will not practice their memory. Their trust in writing, produced by external characters which are no part of themselves, will discourage the use of their own memory within them. You have invented an elixir not of memory, but of reminding; and you offer your pupils the appearance of wisdom, not true wisdom, for they will read many things without instruction and will therefore seem to know many things, when they are for the most part ignorant. ,认为这会使得学生们不再锻炼自己的记忆力,而且书写只提供了智慧的表象而没有口头讨论时传递的那些真正的智慧。

但他的这番话,正好是因为被他写进了《斐德罗》得以流传至今。

所以这篇文章主要针对技术管理者。

对新技术保持批判和怀疑是正确的态度。但我们要知道自己的判断和决策不能建立在无形的特权之上:当我们没有压力去使用某个工具时,拒绝它是很容易的。

大多数员工没有办法说「不」:他们的工作受绩效评估、迭代周期或我们这些管理者决策的影响,他们并不仅仅在技术原则上讨论是否使用 AI,他们在努力弄清楚如何保住工作。

如果我们不是真的站在他们的角度去使用和评估,仅仅用 AI 影响创造力或者初级程序员成长作为理由,草率地说「不」,那么这既不是勇气也不是智慧,而是一种傲慢代表这种态度的典型做法是用一种类比来抽象的分析,比如 AI 就像化纤终究会被有品味的人类抛弃,或者 AI 就像可卡因终究会被证明是有毒的。

真正威胁创造力或者工匠精神的不是 LLM 或者历史上任何一个技术,而是一个奖励速度而非深度,追求规模而非成长,引入自动化但不提升工作意义只想着降成本的职场。

话说得略重,无非是希望听的人上心。

让我们切入正题。

目前对 AI 辅助编程有一左一右的两个态度并且它跟之前技术圈子里那种我觉得 rust 你觉得 go 更好完全不一样,各自的看法往往非常的绝对和极端。

近期支持一方最火的帖子应该是 Thomas Ptacek 的这篇,而反方最打到痛点的是苹果发表的这篇论文其实是之前的相关研究的一个延续,所以这是不是石头姐觉得 Apple 在 AI 时代完全落后了的原因之一呢?

熟悉我的人可能知道,我一直看空所谓的 AGI,更不用说 LLM 会带领我们去到 AGI:因为神经网络在它们接触到的训练数据分布内泛化,但往往在该分布之外泛化就会失效,从未解决。

不用着急劝我,这反而对我采用 LLM 干活是一个积极的事情。

因为它就是个工具。

人工智能发展初期使用拟人化的表达(智能、学习等词汇)带来了很多混乱的讨论,所有的技术管理者应该对得起自己 title 里的「技术」两个字,按照李飞飞在自传里说的去补完课再出来聊 AI:

请大家不要每天只从arXiv下载最新的预印本作品了。去读一读拉塞尔和诺维格的著作,去读明斯基、麦卡锡和威诺格拉德的书,读哈特利和西塞曼的作品,读一读帕尔默写的东西。不要因为这些材料距离现在时间久就忽略它们。我们就是要多读一些以前的东西,他们的理念经得起时间的考验,依然非常重要。

理解和接受 LLM/LRM 以及基于它们的各种东西就是工具,会带来下面这些我觉得可能是可喜可贺的变化:

  • 工具是有局限的:LLM/LRM 有自己非常擅长的地方,比如在不断增加的推理长度下展开某种近似。理解局限性为什么时候用好这个工具奠定了基础,可以带来各个领域的进步——实际上我们发明计算机也是出于类似的原因;
  • 工具是可控的:人类可以少花一些精力在超出对工具如何被使用、误用或滥用范围的担忧。我真的厌倦了每天有这么多媒体更别说自媒体讨论哪个 AI 工具或者模型要划时代或者要送我们上西天了;
  • 工具是可用的:承认你在用它编程或者用它写作业不再变得可耻,开发个插件也不再需要面对那么大的监管压力我们这儿当然还得备案了。
  • 工具不用交付那么高的期待:AI 已经经历过两次寒冬了,期望与现实之间的不匹配会导致崩溃,不如大家一起降低一下这种风险。

因为不承认它的工具身份,我们今天看到各种吊诡的情况,比如一些老师花巨大的成本检查学生是不是使用了 LLM 完成作业,同时自己也忍不住用 LLM 做课件。

在我们公司,我不但鼓励所有人都使用 LLM,我还觉得面试程序员的时候都应该允许候选人使用 AI 辅助(其实我一直不太理解为啥我们的考场不能带计算器)。

我的面试题里面会加上:

  • 现在各种 LLM 有什么特点,擅长什么,不擅长什么?
  • 如果需要写需求文档,使用哪个 LLM?为什么?如果需要编码,使用哪个 LLM?为什么?
  • 有没有自己的提示词库?Cursor 配置文件
  • 展示实际使用 AI 辅助生成代码的过程:是否理解生成的代码?能解释吗?能评价吗?品味如何?
  • 知不知道 MCP,有没有自己构建过 agent,尝试什么方法进行知识管理?

就像上一篇说的,如果 AI 可以降低成为程序员的门槛,就意味着更多有品味,有产品工程思维,仅仅是缺乏编码实践的人,可以进入这个行业。

让我们把门打开。

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 工具运用上怎么办?我们下次继续…