一名程序员在旧式工作台与自动建造软件的机械结构之间修复一条断开的反馈回路

Software Craft Essay · 2026

手艺会失传吗?
AI 时代,程序员的工⁠匠精神何以为继

经典不会过时,但把它变成判断力的那条路正在断裂

26 分钟阅读 发布于 2026 年 8 月 7 日 更新于 2026 年 8 月 8 日

摘要

《计算机程序设计艺术》《代码大全》《重构》《设计模式》《人月神话》不会因为 AI 能写代码就失去价值。真正的风险在别处:程序员过去通过亲手实现、排查故障、维护旧系统和承担后果,把书中的概念变成工程直觉;AI 却可能让人越过这些过程,直接抵达一份看似完成的结果。

因此,经典知识面临的不是内容过时,而是传承路径断裂。我们不必把下一代赶回纯手工编程,也不应把痛苦浪漫化。需要保留的是另一组东西:对结果作出预测,进入实现细节,观察因果反馈,解释设计选择,并长期承担系统后果。只有把这些环节重新嵌入 AI 工作流,经典才不会从实践智慧退化成提示词。

程序员文化真正需要传承的,不是手工敲代码的仪式,而是与复杂性保持直接接触的能力。经典著作是被压缩的经验;AI 时代的任务,是重建一条能让这些经验重新展开的学习回路。

第一部分 · 经典保存的不是答案

01从“这些书还有用吗”说起

最近我问自己一个听起来很实际的问题:《代码大全》《重构》《设计模式》这些书,在 AI 时代还有多大作用?最顺手的回答是,它们当然有用,因为人仍要判断 AI 写出的代码好不好。这个回答没有错,却避开了更难的部分:一个没有亲手被坏代码折磨过的人,凭什么获得这种判断力?

我们这一代人对“坏味道”的认识,往往先于术语。那种不舒服,是身体先知道的。改一个几千行的方法,修好了 A,B 却在另一个文件里悄悄裂开;你盯着屏幕,隐约觉得这段代码“不对劲”,却一时说不出到底哪里不对。沿着十几层调用去追一个含义暧昧的字段,越往下越像走进一栋不断加盖的老楼,每一层都留着上一任住户的隔断和走线,谁也不敢先拆哪一堵墙。面对没有测试保护的共享状态,你在深夜按下发布键,手指会有一瞬间的迟疑——那点迟疑本身,其实已经是一种知识。等到后来翻开书,才知道那些说不清的别扭各有名字:职责混乱、发散式变化、隐式耦合。书没有凭空制造这些感觉,它只是把你身体里早已积攒的经验一一点名,让模糊的直觉第一次有了可以说出口、也可以传下去的词。

AI 时代的年轻程序员可能走上另一条路:描述需求,生成实现,运行测试;失败后把日志交给模型,修不好就再生成一版。问题仍然发生,复杂性仍在那里,但它不一定直接作用在人的手上。就像每天坐车经过崎岖山路的人,能熟记沿途每一处景色,却未必知道路基为什么会塌;等到某天山体真的滑下来,他既说不清成因,也找不到自己能下手的地方,只能站在原地,等另一个懂路的人来抢修。委派掉的不只是敲键盘的动作,还有“出事时我知道该往哪看”的那份底气。

所以问题已经从“经典是否过时”变成了“经典赖以生效的经验从哪里来”。

02一整面书架,其实保存着不同层次的手艺

把所有经典都归为“教人写好代码”会低估它们。它们覆盖的是从计算到组织的一整条链。

经典工程知识保存了什么
层次 代表性著作与文章 它们训练的不是
计算与抽象 《计算机程序设计艺术》、SICP、《谦卑的程序员》[1][2][3] 背出算法,而是知道时间、空间、状态与抽象从不免费
软件构造 《代码大全》《程序员修炼之道》[4][5] 统一格式,而是把可读性、防御性和个人责任落实到局部选择
安全演进 《重构》《修改代码的艺术》[6][7] 把旧代码写得更漂亮,而是在反馈保护下改变仍在工作的系统
设计语言 《设计模式》及后来的模式著作[8] 收集类图,而是描述上下文、变化压力与取舍
系统与组织 《人月神话》《人件》《没有银弹》、“Programming as Theory Building”[9] 管理口号,而是理解概念完整性、沟通成本与共同心智模型

这些书里,有的厚得让人望而生畏,注定不适合从第一页读到最后一页;有的例子带着上个时代的包浆,讲的是早已退役的机器和语言;还有的观点,本就该被今天的类型系统、框架和工程实践大方地修正甚至推翻。承认这些,丝毫不影响它们的分量。它们至今重要,不是因为每一页都能原样搬进下一次提交,而是因为它们像地层一样,保存了整个行业“如何一步步学会思考”的那段历史——哪些坑是前人替我们踩过的,哪些教训是用真金白银、宕机和加班换来的。读它们,某种意义上是在和几代人对话,听他们说:这条路我走过,别再摔在同一个地方。

Donald Knuth 把编程称为“艺术”,强调的并非神秘天赋,而是把积累的知识、技巧和创造力用于真实世界。TAOCP 甚至用虚构机器的汇编语言逼读者看清算法在机器上如何付出成本。SICP 则让人反复经历另一种震动:同一个问题,因为求值模型、状态表示和抽象边界不同,会长成完全不同的程序。高级工具可以替我们完成实现,却无法取消这些差异。它只是把差异藏得更深——藏进一份看起来完美运行的输出里,然后在某个规模、某个边界条件上,把当初省下的代价一次性讨回去。

03模式是被压缩的事故史

今天让 AI “用 Strategy 模式优化代码”,几秒钟后就能得到接口、实现类、工厂和测试。形式太容易出现,以至于我们忘了模式原本从哪里来。

一个模式之所以成立,通常是因为人们在不同系统里反复遇到同一种张力:某个行为确实独立变化;某个外部依赖不断污染核心;一组条件分支本质上表达状态迁移。名称只是压缩后的索引。它背后还有适用上下文、冲突力量、已知后果,以及不用它会怎样。

以 Strategy 为例。它很少诞生于“我想要一个优雅的接口”,更多是从一个不断膨胀的计费函数里长出来的:普通用户、VIP、限时促销、跨境税率、退款回滚逐项叠加,直到几百行分支没人敢动,改一处就可能破坏另一处。最终,有人把“如何计算价格”这个会独立变化的部分从主流程中分离出来。模式为这种反复出现的变化压力提供了名字。生成一个 Strategy 只需复刻它的结构;理解它,则要判断眼前的代码是否真的承受着同一种压力。

这也是为什么读懂模式和生成模式不是一回事。生成只需要复现形状;判断则要回答:这里真的存在稳定的变化轴吗?新增间接层带来的理解成本,是否小于未来变化的成本?这个抽象在什么条件下应该被删除?

经典不是标准答案的仓库,而是一代代工程师把昂贵失败压缩之后留下的索引。

这句话也解释了传承的困难。索引可以复制,索引指向的经验却不能靠下载获得。

第二部分 · AI 改变了经验形成的路径

04旧的反馈回路,既低效又有效

传统的成长路径并不优雅,甚至有点狼狈。程序员亲手写下代码,也亲手在里面埋下雷;过一阵,一个需求变更或者一次半夜的线上告警,让雷炸开。于是他被迫俯下身:追踪状态在哪一行被改写,翻阅一个自己从没打开过的模块,给一段裸奔的逻辑补上第一个测试,再用一系列小到几乎不出错的改动,把系统一点点拉回安全区。这样的循环走过几轮,他身上会长出一种东西——还没动手,指尖就先替他发凉,提前感到“这里危险”。代码评审借给他另一双眼睛,让他看见自己看不见的盲区;长期维护则像一张迟到的账单,让当初图省事的短期选择,连本带利地显出真实价格;经典著作最后出场,把这些零散的、带着体温的遭遇,整理成可以迁移、可以命名、可以传给下一个人的概念。这条回路很慢,却每一步都在往人身上刻东西。

Peter Naur 在 1985 年提出“编程即理论建构”:程序员真正建立的不只是一份文本,而是一套关于现实问题如何被程序解决的理论。当原团队离开,代码和文档可能还在,这套理论却会消失;接手者必须重新建构它。[9]

这个观点在今天尤其刺眼。凡是接手过“文档齐全、代码尚在、写它的人却已离职”的系统的人,都懂那种无力:每个函数你都读得懂,合在一起却猜不透当初为什么要这样切分;改一个看似无害的默认值,三天后在一个毫不相干的角落引发事故——因为那套把种种权衡串起来的理论,已经随着某个人的离开一起蒸发了。AI 把这件事推到了新的极端。它可以比任何人都快地产出文本,还能对着每个文件侃侃而谈,却不等于团队真的拥有了一套能应对新问题的共同理论。解释,是模型面对当下这个问题、当场生成的一个答案;理论,是维护者在证据不足、约束互相打架时,依然能做出前后一致判断的那种底气。前者可以随时召唤,后者只能慢慢长成。

两条程序员成长路径的对照:一侧的人在故障、追踪、修复和维护中形成完整反馈环,另一侧的人隔着透明界面指挥自动机械,反馈环在交付与理解之间断开

图 1 · 被 AI 缩短的,不只有交付路径。 旧回路迫使人从行动进入因果,再从后果回到判断;AI 回路如果只优化“尽快得到可运行结果”,交付可以完成,理解却可能停在环外。

05“完成”与“理解”第一次可以大规模分离

AI 辅助编程的速度收益是真实的,也高度依赖任务。2022 年的一项受控实验中,使用早期 GitHub Copilot 的参与者完成一个标准化 JavaScript HTTP 服务器任务快了 55.8%;研究者同时明确说明,它没有测量大型项目中的协作和代码质量。[11] 2025 年 METR 让熟悉自己仓库的资深开源开发者处理真实任务,却观察到早期工具让完成时间增加了 19%;到 2026 年,更新实验出现可能提速的信号,但研究团队认为选择偏差使结果不足以可靠估计幅度。[16]

这些数字不必被拼成一场“AI 到底更快还是更慢”的擂台赛,那是个问错了的问题。把它们放在一起,真正有用的提醒是:答案高度取决于任务的边界、你对这个代码库有多熟,以及手里工具是哪一代;换任何一个前提,结论都可能改变。而比“快慢”更要紧的一点是,完成速度和理解深度,本就是量在两根不同轴上的东西。一个人可以在一小时内交付一个能跑的功能,同时对它为什么能跑、会在什么情况下不跑一无所知。过去这两根轴多少还绑在一起:你写得快,通常也意味着你想得清;如今 AI 让“又快又不懂”第一次成为一种寻常、甚至高效的状态。

一项对 21 名编程初学者的观察发现,20 人借助生成式 AI 完成了任务。但对原本就不善于判断自己是否真正理解问题的学生,AI 并没有自动补上这种能力;有些人甚至因为任务做完了,误以为自己已经掌握了方法。[12]

另一项实验让 15 名计算机专业研究生在已有代码库中修改功能。使用 Copilot 时,他们完成得更快,通过的测试更多,但对原有代码的整体理解没有相应提高。两项研究的样本都很小,不能据此下普遍结论。它们共同提示的风险更具体:完成任务,不等于理解系统。[13]

这种分离过去也存在。复制 Stack Overflow 上的答案、套一个框架、调一次云服务,同样可能让人跳过底层。但那些跳跃都是短的、局部的——你至少还得自己把这块拼图嵌进整幅画里,接缝处的别扭会逼你多看两眼。AI 的不同在于跨度:理解需求、选择架构、落地实现、补齐测试、解释报错,整条认知链可以在一句提示里被一次性委派出去。抽象层不再是往上挪了一格,而是像一张幕布,可以临时把整条路径盖住。你按下回车,另一头递回来一份看似完成的东西,中间那段本该由你走一遍、也本该在你身上留下脚印的路,被悄悄跳过了。省下的是时间,隐形扣掉的,是你原本会在这段路上长出来的判断。

06三种能力会在无痛中变薄

第一种是因果地图。 亲手追踪故障的人会知道状态在哪里改变、异常如何传播、某个“多余判断”其实挡着三年前的一次线上事故。只看最终 diff 的人,会把这行判断当成噪声顺手删掉,代码更干净了,测试也照样通过——直到同一个故障在某个凌晨重新回来。他知道系统里有什么,却不知道每一样东西是被什么按住的;地图上画满了地名,却没有一条标着“此处水深”。

第二种是校准能力。 工程嗅觉不是列出“长方法、重复、耦合”这些词,而是判断坏味道是否值得现在处理;两段相似代码是真共性还是偶然相似;一层抽象是在隔离变化,还是提前设计。判断依赖预测与结果之间的多次对照:你先押一个注,“我猜这里改下去会崩”,再看它到底崩不崩。一次次对账,直觉才逐渐有了刻度。而 AI 恰恰最擅长替人跳过“押注”这一步:它直接端出一个看起来就对的结果,你来不及先判断,也就收不到“我判断错了”这条最有价值的反馈。

第三种是作者责任。 自己写下的错误会在心里刻一道印子:“这个坑是我挖的,下次手到这里会先停一下。”当模型生成、模型修复、模型解释,失败就很容易被记成“这次模型没写好”——一句话把自己摘干净。问题是解决了,可那道印子没有留在任何人身上;下一次,同样的坑会由同样放松的手,再挖一遍。

对 319 名知识工作者的调查,也捕捉到一种相似的张力:一个人对生成式 AI 越信任,他报告出来的批判性思考投入反而越少——仿佛把判断这件事,连同任务一起外包了出去。值得留意的是,研究并没有说思考就此凭空消失,它只是换了个地方发生:从“亲手把东西做出来”,转向了验证、整合和对结果的把关。这不是一项专门针对程序员的实验,也依赖参与者的自我报告,结论要留有余地;但它指出的方向很有用——AI 时代需要我们有意识地设计出新的思考动作,而不能想当然地以为,旧的那些动作会在工具更迭中自动幸存下来。不去主动保留的东西,往往就在无人察觉中悄悄流失了。[14]

07当经典从实践智慧退化成提示词

最可能出现的未来,并不是没人再谈经典。相反,SOLID、DDD、Clean Architecture、Strategy、Repository 会充满提示词和代码库。每个名字都很专业,每一层也都能得到合理解释,却没有人说得清它正在抵抗哪一种真实变化。

于是,“请遵循 SOLID 并使用合适的设计模式重构”成为一句咒语。AI 可能把一个二十行的函数,端端正正地摊成 Factory、Manager、Provider、Handler、Resolver 五层结构;测试全绿,目录比以前整齐得多,评审时也挑不出错——每一层都能自圆其说,每个类名都写在教科书里。可等到真要改一个字段,你会发现自己得在五个文件之间来回跳转,才拼得出原来那二十行做的事。系统没有变简单,只是把复杂度换了个更体面的包装。过去的过度设计至少是人亲手堆的,堆的人多半会在日后的维护里,一点一点把学费交回来;如今抽象可以批量生产,账单却被推迟——推给另一个人、另一个季度、另一次没人记得起因的重构。

这就是我更担心的文化空心化:术语像潮水一样铺开,孕育这些术语的经验却在退潮。一个程序员可以在架构评审上谈边界、谈内聚、谈依赖倒置,讲得漂亮又自信;可一旦线上冒出一个并发竞争、一处数据对不上、一段莫名其妙变慢的接口,他却在栈的深处停住了脚——因为那些词他是从别人嘴里、从模型口中接过来的,而不是自己在某个凌晨、对着一屏日志一寸寸挣出来的。词还在,词背后那个会疼、会记事的身体,却空了。

第三部分 · 在 AI 时代重读经典

08大部头的价值,是训练对成本的敬畏

TAOCP 显然不是一本日常 Web 开发手册,也不该被当成入行的门槛——今天没有任何理由,要求每位工程师先用 MMIX 手写一遍排序,才有资格去调用一个标准库里的 sort。把大部头供成必须通读的圣经,恰恰误解了它。它真正持久的价值,是一种近乎生理的提醒:一个在你眼里“不就是排个序、查个表”的简单操作背后,其实压着一整套模型、证明、边界和代价,只是平时被库和硬件替你悄悄承担了。读过它的人,面对任何“看起来很简单”的东西时,心里会多一分本能的敬畏,而不是轻慢。

AI 会把“我能生成一个实现”变成极其廉价的能力,也因此更容易诱导人把“能生成”误认成“已理解”。屏幕上那段代码跑通了、测试也过了,人很自然地以为自己懂了;直到数据量翻了两个数量级,那个悄悄用了平方复杂度的实现,在某个周一早晨把整台机器拖垮。读算法、读计算模型,不是为了在脑子里和模型比谁记得多——那场比赛人从一开始就会输——而是为了给自己配一把尺:输入规模翻十倍、百倍时,会发生什么?正确性到底压在哪几条不变量上,抽掉一条会怎样?把随机性、精度、内存和并发换个前提,原来的结论还站得住吗?什么时候可以放心地信任一个成熟的库,什么时候又必须硬着头皮读进它的实现,甚至读到那篇原始论文?有了这把尺,AI 生成的东西才从“我猜它对”变成“我能说清它为什么对、又会在哪里错”。

同样,SICP 的意义也不只在 Scheme。它训练人穿过语法看见求值、组合、状态和解释器。一个能生成十种语言的 Agent,反而让这种穿透力更重要,因为表面差异越来越容易消失,语义差异仍会在运行时索要代价。

09《重构》应从“美化术”恢复成实验方法

在所有经典里,《重构》可能比过去更重要。Fowler 对重构的定义很精确:通过一系列保持外部行为的小变化改善内部结构。小步不是审美偏好,而是风险控制;测试也不只是最后验收,它是每一步仍处于已知世界的反馈。[6]

AI 很擅长“重新生成一个更干净的版本”。你让它整理一个模块,它常常一并把接口换了、把依赖升了级、顺手改了某个异常的语义,再补上一组与新实现严丝合缝的测试——绿灯亮起,看起来一切安好。可是等到几周后,一个上游调用方突然报错,你回头翻提交记录,会发现根本分不清:到底是哪一步改动动了外部行为?测试为什么没拦住?因为那一次提交里,重写和重构被搅在了一起,而它们本该泾渭分明。重构的全部安全感,来自“外部行为不变”这个铁律:正因为行为不动,你才敢放心大胆地重排内部结构。一旦把“换个更好的实现”混进来,这条安全绳就断了,团队也随之失去了追溯变化来源的能力——出了事,谁也说不清是哪一刀划的。

《修改代码的艺术》进一步提醒我们,旧系统最先缺的通常不是漂亮结构,而是可以感知行为、隔离依赖的接缝。[7] AI 时代可以把它变成一份明确契约:重构前列出可观察行为和未知区域;先建立特征测试;限制写入范围;每个小差异独立运行验证;只有证据允许,才进入下一步。Agent 可以执行大部分机械劳动,人仍需定义什么不能改变。

10把设计模式当作可证伪的假设

模式不应被禁用,也不应被默认启用。更好的用法,是把每个模式写成一项可以被现实推翻的设计假设:

一个模式在进入代码前应回答的问题

  • 上下文: 当前哪一组职责或依赖正在造成真实摩擦?
  • 变化压力: 哪个维度已经变化过,或有可靠证据会独立变化?
  • 最小方案: 不引入完整模式时,最小可行隔离是什么?
  • 代价: 新的间接层会增加哪些导航、调试和测试成本?
  • 反证: 出现什么证据说明抽象选错了?
  • 删除条件: 如果变化没有发生,何时合并或移除这一层?

这样一来,Strategy 就不再是四个整整齐齐的类名,而是一句需要被证据支持的断言——“这里确实有一根会独立变化的轴”;Adapter 也不再是随手套上的统一外壳,而是一道边界,专门拦住外部的语义,不让它渗进核心;Observer 更不是天生就比一次直接调用高级,它只是拿“调用链变得不那么一目了然”这个代价,去换时间和依赖上的松绑,值不值得,要看具体处境。在这套用法里,AI 反而如虎添翼:它可以在几秒内生成好几种候选结构,摆出对照方案,甚至主动造出让某个模式露馅的反例。人不必再亲手敲这些样板,人要做的是那件机器做不了的事——当那个把模式拉上被告席、逼它拿证据说话的法官。

11组织类经典提醒我们:代码之外还有共同理论

《人月神话》《人件》和 Naur 的文章,讨论的范围各不相同,却共享一个常被忽略的前提:软件从来不是一份孤立的文本。它同时是一套概念、一张人与人之间的沟通网、一种工作环境,以及一个说得清“谁对什么负责”的结构。当 AI 把局部实现的速度拉高之后,这些因素非但不会随之缩小,反而会因为对比更悬殊而浮上水面,成为真正卡住整体的那道瓶颈——代码几分钟就生成好了,可到底该不该合、由谁拍板、出了事找谁,这些老问题一个都没被自动回答,只是被衬托得更刺眼。布鲁克斯当年那句“没有银弹”,说的正是这件事:真正的难,从来不在造出代码,而在想清楚要造什么、以及一群人如何就此达成共识。

DORA 2025 把 AI 描述成组织能力的一个放大器:它会放大既有的优势,也会同样忠实地放大既有的毛病;真正的收益不在工具本身,而藏在它接入的那套组织系统里。[15] 这与经典的判断并不冲突,反而像隔了几十年的一次互相印证。一个概念完整、边界清楚的仓库,会给 Agent 一批稳定可依的范例,让它照着既有的纹理往下写;一个测试快、反馈紧的团队,能安全地吸收比过去多得多的变更;一个责任清晰的组织,遇到风险时知道该由谁点头。反过来,边界含混、知识过期、谁也说不清系统为什么长成这样的团队,只会更快地量产出一堆彼此矛盾的“局部正确”——每一块单独看都对,拼在一起却谁也接不上谁。AI 不创造这些差距,它只是把差距拉得更快、更明显。

所以,AI 时代的经典阅读不能停在个人修养。它必须进入代码评审、任务设计、事故复盘、架构决策和团队培养,否则读完的知识仍然找不到附着点。

第四部分 · 建立 AI 时代的新学徒制

12不要恢复稀缺,要恢复反馈

要求年轻程序员放弃 AI、先老老实实手写几年代码,听上去像是在守护基本功,其实既不现实,也犯了一个更根本的错误:把手工劳动本身当成了学习。可过去那些痛苦,很多只是在纯粹地消耗时间——翻文档查一个记不住的语法,一行行抄写千篇一律的样板,把同一段逻辑机械地从旧框架搬到新框架,对着进度条等编译。这些苦从没让谁变得更聪明,它们消失,一点都不可惜,该庆幸才对。

但不是所有摩擦都该被抹平。真正值得留下的,是那些能改变“下一次判断”的经历:动手前先预测结果,再观察它是否兑现;亲自追踪一次关键的状态变化;向别人解释为什么选择这个抽象;几个月后再回来维护自己曾经接受的代码。它们的价值不在于制造痛苦,而在于把判断与后果连接起来。我们要去掉的是消耗,保留的是反馈。

认知学徒制的经典模型讲究一整套动作:先示范,再辅导,搭起脚手架,让学徒把思路说出来、回头反思、放手探索,然后随着他越来越稳,一根一根地把脚手架抽走。[10] 这套模型天然适合 AI,甚至 AI 可能是它有史以来最理想的脚手架:它可以当着你的面演示一位专家会怎样追一个故障,可以按你卡住的程度一级一级地给提示,可以随手造出一个反例逼你重新想,可以把三种方案摊在一起让你比较取舍。问题在于,最省事、也最危险的用法恰好把这套顺序整个倒了过来——在学徒连问题的模样都还没看清时,就把一份完整、漂亮、可直接运行的答案塞到他手里。脚手架本该最后才撤,这里却让人的参与第一个消失;扶手还在,学步的人却已经被抱到了终点,从来没有真正自己走过一步。

13把学习模式与生产模式分开

团队不需要在每个任务上牺牲交付速度。更实际的做法,是承认“完成工作”和“培养能力”是两种不同模式,并为后者保留明确预算。

同一套 AI 工具,两种不同工作模式
维度 生产模式 学习模式
目标 在风险边界内高效交付 建立可迁移的因果模型与判断力
AI 角色 实现者、搜索者、验证执行者 教练、反方、提示提供者、模拟故障者
人的动作 定义约束、评审证据、承担发布 先预测、亲自追踪、解释取舍、比较结果
任务选择 低风险机械工作尽量自动化 选择代表性故障、旧代码和边界问题
完成标准 功能、测试、性能、可回滚 能解释、能修改、能识别错误迁移

对新人,与其划一片笼统的“禁用 AI 区”(既难执行,也容易被当成惩罚),不如设一份更精确的 困难预算:明确规定哪些地方必须先由人尝试。关键练习中,AI 不应一开始就给出完整方案;调试时,先由人画出调用链,写下状态假设,再去验证;算法题则先写清复杂度和不变量,让 AI 按需逐级提供提示。等这些基础真正建立起来,再逐步放开生成能力。让自动化程度适应人的能力,而不是让人被工具为交付设计的默认设置牵着走。

对资深工程师,学习同样没有到站。他们要练的,是一批手工时代根本不存在的新手艺:怎样把一个大任务切成 Agent 接得住、也交得清的小块;怎样在一片看起来无比整洁的代码里,嗅出那种正在悄悄发生的架构漂移——它不报错,只是让系统一点点偏离原本的构想;怎样设计出信息量足够高的验证,让一次通过真的说明点什么,而不只是让灯变绿;以及怎样审阅比过去多出数倍、且不再由人逐字写下的代码产出,还不被它的体量冲垮判断。经典在这里提供的是一套判断的坐标系,新实践要做的,是把这套坐标重新焊到已经变样的生产方式上。老手也在重新当学徒,只是这一次,没有前人趟过完全一样的路。

14六个可以进入团队日常的反馈装置

生成前先预测。 在提示词前写下受影响模块、风险最高的行为、预期测试和不变量。没有预测,就没有校准。
把重构写成契约。 明确外部行为、允许修改的范围和每一步验证,拒绝用一次大规模重写伪装小步重构。
保留人工故障解剖。 对生产事故、并发问题和数据错误,由人先画时间线、调用链和状态转换,再让 AI 补充反例。事故不是只需关闭的工单,也是稀缺教材。
给抽象留下案底。 记录引入模式的真实压力、未选方案、预期收益和删除条件。评审“为什么存在”,而不只评审命名是否漂亮。
让理解成为交付物。 重要变更除代码与测试外,还要能由负责人不用 AI 解释关键路径、失败模式和回滚方式。答不出时,任务尚未完成。
让所有权穿过时间。 让开发者维护自己与 AI 共同生成的系统,参与值班、复盘和下一次变更。只有后果能跨越季度,短期选择才会变成长期经验。
程序员与 AI 位于一个循环工作台中,依次经过预测、受限生成、压力测试、人工追踪、解释和长期维护,运行证据不断返回下一轮判断

图 2 · AI 时代的新反馈回路。 AI 不必退出工作台,但它不能把人送到因果链之外。预测、受限行动、验证、解释和长期所有权共同把一次交付转化为下一次可复用的判断。

15未来的高级程序员,仍然要能闻到味道

团队也得改一改自己丈量事情的尺子。如果考核只盯着关掉多少工单、写了多少行、合并得有多快,那么最聪明的做法,就是把理解的成本悄悄推给未来——反正账不会记在这个季度、这个人头上。人会诚实地朝着被测量的方向生长。所以除了交付指标,还值得盯住另外几件更难量化、却更接近真相的事:返工总是扎堆出现在哪几个模块?一个关键模块,全队到底有几个人能不看文档、不问 AI 就把它讲清楚?三个月前那批 AI 生成的改动,如今想动一动要付多大代价?一次事故过后,除了关掉告警,有没有沉淀出一条可复用的测试或规则?代码评审里,人究竟是在挑出真正的语义问题,还是只是把变量名和缩进抹得更顺眼?这些问题没有漂亮的仪表盘,却比任何速度曲线都更早地告诉你,一支团队是在积累理解,还是在借未来的债。

这并不意味着人人都得啃完整套 TAOCP,也不意味着资深工程师就该逞能手写每一个函数。一种健康的工程文化,从来不是全体成员背诵同一份书单、说同一套黑话。它更像一组心照不宣的共同习惯:对复杂度保持敬畏,不把“测试通过”轻易当成“我已经理解”;发现一个抽象错了,愿意亲手把它删掉,而不是再糊一层上去;动系统之前,先把“哪些行为绝对不能破坏”摆到台面上说清楚;故障来临时,第一反应是走进现场,而不是转身甩锅给模型;以及最朴素、也最难的一条——真心接受“上线之后的结果,我有份”。这些习惯不写在任何书里,却是一本本经典真正想教会人的东西。

经典著作仍会参与这套文化,但读法会改变。《计算机程序设计艺术》可以和性能剖析、模型生成的算法对照着读;《重构》可以变成 Agent 修改协议;《设计模式》可以变成设计假设的审查表;《人月神话》和《人件》则帮助团队抵抗“更多 Agent 自然等于更多产出”的简单想象。书不再等待某一天从头读完,而是在人遇到真实问题时,提供更长的历史和更准确的语言。

我们不必让下一代重新踩完所有坑,但必须让他们看见坑是怎样形成的,并真正负责把路修好。

AI 正在让“写出来”变得越来越便宜,也因此让另一些能力更加重要:知道为什么这样写,知道什么不该写,知道出了问题由谁负责。手艺不会因为键盘敲得少了就自然消失,也不会因为经典仍在书架上,就自动传到下一个人手里。它能否延续,取决于我们是否把“理解”重新设计进工作流程,把“反馈”留在回路里,并把“责任”交给具体的人。

一个没有经历过所有旧式苦役的程序员,仍然可以形成可靠的工程判断。但有一个前提不能少:他不能始终被隔在系统之外,只做结果的旁观者。他需要亲自进入现场,追踪故障,解释原因,作出修复,并继续承担修复后的结果。把人留在因果回路里,或许就是 AI 时代传承这门手艺最重要的事。

参考资料与延伸阅读

  1. Donald E. Knuth, The Art of Computer Programming, Stanford University.
  2. Harold Abelson, Gerald Jay Sussman, Julie Sussman, Structure and Interpretation of Computer Programs, MIT Press.
  3. Edsger W. Dijkstra, “The Humble Programmer”, ACM Turing Award Lecture, 1972.
  4. Steve McConnell, Code Complete, Second Edition, Microsoft Press, 2004.
  5. David Thomas and Andrew Hunt, The Pragmatic Programmer, 20th Anniversary Edition, 2019.
  6. Martin Fowler, Refactoring: Improving the Design of Existing Code, second edition, 2018.
  7. Michael Feathers, Working Effectively with Legacy Code, 2004.
  8. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, 1994.
  9. Peter Naur, “Programming as Theory Building”, 1985.
  10. Allan Collins, John Seely Brown, Susan E. Newman, “Cognitive Apprenticeship: Teaching the Craft of Reading, Writing, and Mathematics”, 1987.
  11. Sida Peng, Eirini Kalliamvakou, Peter Cihon, Mert Demirer, “The Impact of AI on Developer Productivity: Evidence from GitHub Copilot”, 2023.
  12. James Prather et al., “The Widening Gap: The Benefits and Harms of Generative AI for Novice Programmers”, ICER 2024.
  13. Yunhan Qiao et al., “Code Comprehension with GitHub Copilot: Performance Gains, Comprehension Trade-offs, and Behavioral Predictors in Brownfield Programming”, preprint, revised 2026.
  14. Hao-Ping Lee et al., “The Impact of Generative AI on Critical Thinking”, CHI 2025.
  15. DORA, State of AI-assisted Software Development 2025, Google Cloud, 2025.
  16. METR, early-2025 experienced open-source developer study and 2026 experiment-design update.