☰
AI写代码时代,程序员的内功修炼:从小工到专家
2026/9/28 14:51:09 网站建设 项目流程

写代码只是起点,真正的程序员修炼之道,在于你如何思考问题、如何构建系统、如何与人协作,甚至如何看待自己这门手艺。最近翻《程序员修炼之道:从小工到专家》(The Pragmatic Programmer),很多当年没读懂的章节,放到今天AI写代码满天飞的环境里,反而越嚼越有味道。这本书不教语法,不推框架,讲的是贯穿整个职业生涯的思维方式。不管你是刚入行的萌新,还是写了十来年业务代码的老手,只要还在跟代码打交道,这本书都值得放在手边反复翻。

很多人在后台问我,AI都能自动生成代码了,程序员是不是快没饭吃了?我通常先给一个判断:恰恰相反,越是AI能写代码的时代,越是考验程序员“人”的部分。代码只是最终的输出物,真正的价值在于你能不能把一个模糊的业务诉求,拆解成清晰、可维护、经得起推敲的系统设计。这正是《程序员修炼之道》一直在讲的核心:你修炼的不是打字速度,而是工程判断力。这篇文章会结合书里的核心章节和当下的技术环境,聊聊程序员该修炼的几项内功,以及怎么从小工逐步走向专家。

1. 这本书到底在讲什么

1.1 别被书名骗了,它不是一本代码大全

很多没读过的人一看到“从小工到专家”,第一反应是这书里肯定有一堆算法模板、框架源码分析之类的东西。实际上完全不是。这本书几乎没有多少具体代码,就算有,也都是帮助说明观点的短片段。它的主题是“Pragmatic Programmer”——务实主义程序员。说白了,就是教你怎么成为一个靠谱的、能在真实世界里把事办成的工程师。

整本书围绕几个核心原则展开,比如DRY原则(Don't Repeat Yourself,不要重复自己)、正交性、曳光弹开发、原型与骨架、契约式设计、无情的测试等等。每个原则看起来都是常识,但真正能在日常开发里持续做到的人很少。比如DRY,很多人以为就是“抽公共函数”,但书里强调的是“知识”不重复,是同一份业务规则只能有一个权威表达。这比单纯消除重复代码要深一层。

这本书适合谁?我觉得适合所有人,但不同阶段读到的收获完全不同。刚入行时读,你会记住一些原则;写了三五年再读,你会拍大腿,原来当年踩的坑,书里早就写过;到了带团队或者做系统设计的阶段再读,你会发现自己开始用这些原则去评判代码库和架构了。这也是为什么它能在程序员书单上长盛不衰。

1.2 挖井人的故事与“修炼”的本质

书里开篇有个著名的隐喻:一个路人看到两个石匠在凿石头,问他们在做什么。一个石匠说“我在凿石头”,另一个说“我在建一座大教堂”。这个隐喻不是让你每天在公司喊口号,而是提醒你,要时刻意识到自己在一个更大的系统里工作。

这正好对应了程序员成长的关键转折:从“完成这个功能”到“构建这个系统”。很多人写了好几年代码,依然困在“凿石头”的状态里——把分配给我的任务写完,跑通,提交,下班。但如果你永远只盯着自己眼前的那块石头,就很难理解为什么要有代码规范、为什么要写测试、为什么要做架构设计。这些“额外工作”单看都是麻烦,放在大教堂的视角里,才是让系统能长久活下去的基石。

我自己的体会是,所谓的“专家”,并不是会更多奇技淫巧的人,而是能够根据场景做出恰当工程决策的人。这种能力没有捷径,只能靠大量实践、复盘和阅读(包括读代码、读书、读事故报告)来慢慢积累。这本书第一部分讲的就是这些底层心态和习惯,值得反复读。

2. 程序员的专业主义:从态度到方法

2.1 对“软件熵”和“破窗户”要保持零容忍

《程序员修炼之道》里有个非常出名的“破窗户理论”。楼上一扇窗户破了没人修,很快其他窗户也会被打破,整栋楼走向破败。代码库也一样:一个临时绕开规范的补丁没人在意,不久后第二个、第三个补丁就会出现,整个项目腐烂速度超出想象。

这个理论我实测下来非常准。很多项目死掉,不是一开始就设计错了,而是中间有一次“算了,先这么上吧”之后,后续每一个想好好做事的人都会看到这扇破窗,然后默认“这个项目就是烂的,我也随便糊弄一下”。等你想回头收拾残局,改动成本已经高得离谱。

所以现在我在团队里提出的要求是:不要求代码完美,但绝不允许新伤口出现。遗留垃圾可以标记、可以排期,但新增代码必须符合当前约定的规范。哪怕今天这版写得慢一点,也不能再破一扇窗。半年下来你会发现,只要做到这一点,代码库的恶化的速度会明显放缓,老代码也更有动力去逐步清理。

还有“软件熵”这个概念。软件系统总是趋向于更加无序、复杂、难以维护。这不是任何一个人造成的,而是持续变更的必然结果。对抗熵增需要持续投入——重构、自动化测试、文档更新、依赖清理。这不是可选项,而是维持系统生命力的常规消耗。很多团队只顾着加功能,忘了“熵债”,最后系统膨胀到没人敢动。

2.2 石头汤、煮青蛙与干骆驼:三个必须知道的陷阱

书里三个故事级比喻也让我印象极深,每个对应一类现实问题。先说“石头汤”,讲几个士兵用“煮石头汤”的噱头,让村民一步步贡献出蔬菜和肉,最后真喝到了好汤。这个比喻在职场里的用法是:你想推动一个多人协作的改进(比如引入代码评审),不要一上来就要求大家做全套规范,可以挑一个最小的、能立刻见效的点先启动,然后慢慢吸引更多人参与。

我建议每个想推动技术改进的人都要学这招。比如想推单元测试,不需要先从“覆盖率80%”开始,而是先挑一个最容易出bug的模块,写几个测试拦住回归,把效果摆出来,再扩大到核心链路。这套打法比发一个全员邮件要求“从明天开始写测试”成功率高得多。

“煮青蛙”对应的是渐进式恶化。水温慢慢升,青蛙毫无察觉,等到察觉时已经没力气跳出去了。系统架构的腐化大多是渐进的:一次小改版、一次临时参数变更、一次跳过评审的合并……单独看每一次都是小问题,但累计起来就是巨大的技术债。所以你需要定期的“系统体检”机制,比如每周留半天做技术回顾,看看最近有没有不该发生的妥协。

至于“干骆驼”,说的是人难以承受最后一根稻草。很多项目在濒临崩溃时,还在往上加需求,最后某次例行小改动成了压垮骆驼的最后一根稻草。这个现象在今天的高可用系统场景下尤其需要警惕,后面的章节会展开讲。

3. 写代码之前的修炼:务实的设计思维

3.1 从“写好代码”到“设计好变更”

书里有句经典的话:“好的设计能轻松容纳新的需求,而糟糕的设计即使加一个字段都可能牵一发动全身。”这句话放到现在的“AI写代码”背景下尤其值得琢磨。用AI生成代码很容易,但它生成的是基于现有模式的延续性修改,如果底座设计得稀烂,AI只会帮你更快地生产出更多的垃圾。

以前端为例,很多人写代码之前不问业务逻辑,上来就照着原型一顿输出。书里反复强调,编程的核心活动之一就是“分析需求”。你需要先搞清楚这项改动在系统里属于哪个层次——是纯展示层的调整,还是涉及状态流转、权限判断、接口契约的变更?不同层次的改动影响范围完全不同。

我自己的前设计清单一般是:这次改动的上下游依赖是谁,哪些现有功能可能受影响,数据流怎么走,异常情况怎么兜底,怎么验证改动没破坏别的东西。这些想清楚再动键盘,真正的编码时间反而会大幅缩短。尤其在“写后端代码”时,一个需求没想清楚就往数据库加字段,等联调阶段才发现接口契约对不上,返工成本通常是把时间多花在思考上的好几倍。

3.2 DRY原则其实讲的是知识,不是代码

DRY是这本书被引用最多的原则之一,也是最容易误用的。很多人把DRY理解为“不要复制粘贴代码”,于是疯狂地做抽象、抽公共类。结果代码确实没有重复了,但耦合度暴涨,改一个公共逻辑要连带影响十几个调用方,反而更难维护。

原书的定义是:Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. 关键在于“知识”这个词。比如“订单金额满100元打八折”是一条业务规则,这条规则只能存在于一个地方。如果你在订单服务里算一次,在优惠券服务里又算一次,在报表系统里再算一次,那就算代码写得再精简,知识也已经重复了三份。将来规则从“满100打八折”改成“满200打七折”,你能保证三处都同步改对吗?

所以DRY的实际落地重点,是梳理业务概念、找到知识的唯一权威源。代码层面的重复,如果只是外观相似而演化方向不同,强行合并反而不对。这不是让你放弃减少重复,而是让你想清楚什么是该抽离的、什么是不该抽离的。特别是现在AI写代码特别擅长“根据已有代码生成类似代码”,如果不强调知识唯一性,AI会帮你把重复模式无限复制,制造表面繁荣下的巨大债务。

3.3 正交性:搭积木而不是绑麻绳

正交性这个概念听起来高深,其实就是两件事如果互不影响,它们就是正交的。对系统设计而言,我们追求的是模块之间尽量正交,这样改动一个组件不会波及其他组件。一个典型的反例是代码里到处直接操作用户Session、直接写死配置、把业务逻辑和外部服务强耦合在一起。这就是“绑麻绳”,绳子越绑越多,谁也别想单独动弹。

怎么判断系统好不好维护,一个简单办法是:新来一个同事接手一个模块,他需要了解多少“背景知识”。如果你告诉他“这个模块只管订单状态流转,输入输出都是标准结构,其他不用管”,那说明正交性不错。如果他得听你讲半小时“这个系统有历史包袱,那里有个特殊处理逻辑”,那说明你们已经被麻绳捆住了。

正交性也适用于团队协作。模块边界清晰,团队之间才不容易互相踩脚。契约先行、接口约定清楚,各自独立开发测试,联调成本会大幅下降。书里给的实践指引是把“频繁一起变化的逻辑”放在一起,把“各自独立变化的概念”拆开。这个原则比任何微服务架构方法论都更底层。

4. 掌握务实的开发策略:从原型到迭代

4.1 曳光弹开发:别在暗室里开空枪

书里用曳光弹来比喻一种开发方式。曳光弹是发光弹道,让射手看到弹着点从而校准方向,而不是等所有条件完美后再一枪中的。对应到软件开发,就是“尽快构建一条端到端的最小链路”,哪怕它很简陋,但能验证整个系统能跑通。

这个策略现在几乎贯穿了我所有项目。比如接一个新平台对接,不要先把所有逻辑都写完再联调,而是先调通一条最简链路:配置基础设施、打通认证、完成一次最简单的数据请求。这条链路就是曳光弹,它告诉你架构有没有致命问题、配置对不对、网络通不通、数据格式是否匹配。等弹着点确认了,再往这条链路上填功能。

曳光弹和传统“原型”的区别在于:曳光弹代码不会丢,它会逐步演变成正式系统。原型则倾向于验证完就扔。选哪种策略取决于不确定性在哪里。如果不确定的是业务需求(比如这个功能到底是不是用户想要的),用原型;如果不确定的是技术方案(比如这个中间件能不能满足性能要求),用曳光弹。这两种思路分开用,项目成功率会明显提升。

4.2 设计合约:防御式编程的正确姿势

关于写代码的可靠方式,书里讲了一个“死程序不说谎”的观点。程序出错时,与其吞掉异常继续运行,不如尽早暴露问题。“崩溃早”不是坏话,反而是负责任的表现。很多线上事故,追根溯源都是某个模块在异常状态下“礼貌地”返回了一个空值或有问题的数据,让下游误以为一切正常,直到灾难扩散到一层层之后才爆发。

与之配套的是“契约式设计”。把程序的每个模块看作一份契约:模块对输入有要求,对输出有承诺,对副作用有约定。调用方和实现方都按契约办事,出了问题是最好定位的。写代码时要明确前置条件、后置条件、类不变量,如果违反就直接报错,不要让数据带病往下游跑。

实践中的一点是,用异常而不是错误码来报告不可恢复的问题,但不要把异常当控制流用。对于外部服务的返回值,建议做边界校验,不要理所当然地认为一定有数据的场景。宁可早报错,让开发介入,也不要让一个脏数据在数据库里趴三个月之后才被发现。

4.3 重构的艺术:随时准备为代码“整容”

书中极重视重构,认为重构不是专门安排一个阶段,而是日常开发的一部分。每次看到一段代码“坏了”就顺手修好,这就是“不破窗”的延伸。最有价值的重构时机,是你在修改需求时发现现有结构不适配新需求,这时候重构既是给未来铺路,也能免除今后每次改需求都要绕弯子的痛苦。

重构的前提一定是有测试保护。没有自动化测试做底,重构就是徒手拆炸弹。哪怕只是提取一个函数,也可能因为隐藏关联造成回归。所以我在带项目时,总是先问“这个模块有测试吗,如果没有,我重构前会补上关键路径的测试”。这一步叫“测试支撑下的重构”。

要给重构几种常见策略:抽取函数/消除重复/理顺依赖/改名让代码意图清晰/拆分大类和长函数。不要试图一次重构太多,每次一小步,改完立刻跑测试,通过再走下一步。看看现在的AI辅助工具,重构这类工作其实特别适合配合AI做,但最后拍板的一定得是人。

5. 写的不是代码,是沟通

5.1 程序员的核心产出其实是“文档化思考”

也许这本书最容易被忽视的一部分,是“沟通”。书里明确指出,程序员不仅是在写代码,还是在和各种人沟通。沟通对象包括同事、上下游团队、产品经理、测试、运维,也包括“未来的自己”。写文档、写注释、写规范的commit message,本质都是在做“把思考可视化”这件事。

很多程序员排斥写文档,觉得浪费时间。但你换个角度想,代码本身也是文档,只不过它的读者主要是机器和执行者。而真正让人理解“为什么这么设计”的内容,代码是表达不出来的,这就要靠注释和文档来补充。书里有一个极其实用的建议:注释不要描述代码做了什么,而要描述代码为什么要这么做。任何“显而易见”的代码注释都是噪声,只有包含背景信息的注释才有价值。

5.2 记录文档的工具与习惯

现在越来越多程序员开始在意记录工具,相关的搜索里出现“程序员记录文档的工具”这类词。我见过有人用Typora搭配Git管理笔记,有人用Notion搭个人知识库,还有人用VS Code写Markdown同步云端。这些工具本身不是重点,重点是“记录”这个动作要形成闭环:想到就记、定期整理、经常回顾。否则记了一堆流水账,过三个月自己也看不进去。

我个人建议按“主题”组织文档,而不是按时间。比如某个系统的架构决策记录、某个模块的坑与对策、某类问题的排查手册。这样知识才能复用。就拿排查线上问题来说,我处理完一个问题后会顺手写一段“问题摘要+定位路径+根因分析+修复方案”,下次再遇到类似问题,直接翻阅,省掉大量重新排查的时间。

6. 把工具箱武装到牙齿:善用自动化与AI

6.1 如果能自动化,就不要手动重复

书里有一章专门讲“务实程序员”会主动提升效率,其中就包括“不要手动做可以自动化的事”。编译、测试、部署、依赖检查、格式检查、静态分析……凡是可以用脚本/工具做的,一律交给工具。从长期看,手工操作不仅慢,而且一定会在某个深夜毫无察觉地出一次不该出的错。

现在生态已经很成熟了。前端有ESLint/Prettier做格式统一,后端有CI管道做构建测试部署,Git提交前有Husky钩子跑校验。这些基础设施不是“为了显得专业”,而是把可重复的判断标准化、自动化,让人的精力专注在真正需要判断的事情上。如果你所在的项目还没有任何自动化防护,我强烈建议你从“提交前跑一遍测试”开始。

6.2 AI写代码时代,程序员该怎样自我定位

“AI写代码”相关的热搜词快把榜单霸占了,但我想说的是:AI写代码真正改变的,是“从需求到代码”这层翻译工作的人力成本下降,但它没有改变“判断代码对不对、该不该这么写、对系统长期影响是什么”这些依然要人来负责的部分。

换句话说,越是有AI辅助,程序员的“判断力”就越值钱。你需要能给出清晰的需求输入,能审查AI生成代码的正确性和边界情况,能发现AI在业务上的盲点,能在出问题时定位、回滚、修复。这就是为什么很多资深程序员现在强调:“用AI之前,先让自己成为能看出AI错误的人。”这需要扎实的基础知识、对业务的深入理解以及大量实践积累,市面上并没有可以一夜速成的捷径。

对于刚开始尝试用AI写代码的同学,我的建议是:先从手写能完全掌控的小功能开始,把AI当作补全工具,而不是甩手掌柜。你要能理解它生成的每一行代码在干什么,出了问题才能改。等你能判断AI的输出质量了,再把更大块的需求交给它处理,否则调试AI生成的烂代码,可能比你从头写还费时间。

7. 常见问题与排查技巧实录

7.1 学了原则,代码还是写不好

这是最常遇到的困惑。很多同学读完《程序员修炼之道》后,记住了DRY,记住了正交性,但做起项目来依然手忙脚乱。问题出在把“读书”当成了“修炼”本身。这些原则不是读一遍就能内化,需要在真实项目里反复碰壁、尝试、复盘,才能形成肌肉记忆。想加速这个过程,建议每次重构或改设计时,用书里的原则去自问:这次我是在重复知识吗?改动是不是正交的?有没有破窗?把书里的术语变成面试答辩和自我检查的工具,慢慢就上手了。

7.2 项目总是延期,是效率问题还是设计问题

如果项目总是赶不上预期,先别急着怪自己和团队“写代码慢”。很多时候,延期是设计问题的晚发症状。模块耦合重、测试缺失、领域概念混乱,导致一个小需求也要动多个地方,联调反复出问题,验收一路受阻。书里的“曳光弹开发”和“调试的早期暴露”都是为了应对这种局面的。下次赶工时,建议先冷静下来看一眼“到底是写代码的时间长,还是理清楚怎么改代码的时间长”。

7.3 面对遗留系统,如何开始改进

几乎每个程序员都会遇到一个“历史包袱”项目。代码烂、文档缺失、没人敢动,连加个日志都要小心翼翼。面对这种系统,务实的态度不是推到重写(这几乎总是更贵的方案),而是“在每个小改动中顺手清理一点点”:走到哪改到哪,把路过见到的坏味道修掉一点,积累起来效果惊人。注意不能一次性大改,而且必须有测试保障。最后,善于用代码评审去传播原则,你改得干净的地方自然会变成周围人参考的模板。

7.4 代码写完了,怎么判断好不好

我会用几个问题来自检:如果来了新需求,我能不能在不影响别人的前提下快速扩展?如果来了个新人,他看我这段代码要花多久才懂?如果线上出了故障,我能不能在十分钟内定位到相关逻辑?如果答案都是否定的,那这段代码还有待改进。这些维度比“跑不跑得通”更能衡量工程质量,也是“从小工到专家”这条路径上需要持续打磨的标尺。

8. 通往专家之路:扩大你的影响半径

8.1 专家不是“什么都懂”,而是“知道怎么弄清楚”

很多程序员对“专家”有一个误区,觉得专家应该什么都懂,什么都会。但从书里的思路来看,专家更像是掌握了“如何搞清楚”方法论的人。遇到未知技术,他们有搜索策略、快速实验方法、官方文档阅读路线;遇到陌生业务,他们知道该找谁问、关注哪些字段、怎么快速建立模型。

这个能力是可以刻意训练的。每次遇到未知问题时,别急着ctrl+F找答案,先问自己几个问题:这个问题的本质是什么?有没有类似问题解决过?想验证这个思路,最小实验是什么?长此以往,从“遇到问题”到“定位原因”的时间会大幅缩短。这种能力在“AI生成错误代码”时尤其有价值,因为AI很容易一本正经地胡说八道,你要有办法去验证它说的是不是对的。

8.2 程序员不止是“写代码的岗位”

“程序员”是职业名称,但你的价值绝不止于产出代码。代码只是手段,帮业务达成目标是目的。我会鼓励每位程序员去理解自己所在行业的业务逻辑,了解客户怎么用产品、运营怎么分析数据、老板怎么判断收益。你会发现,技术方案往往不是“最优算法”,而是“在当前业务约束下最合适的取舍”。能从业务视角出发做技术决策,你的方案才会真正被认可,这也是晋升到更高位置的分水岭。

程序员社区里经常能看到“黑马程序员”等培训机构相关的讨论。信我的,不管你是科班还是培训班出身,最终决定高度的都是这套底层工程素养。培训能带你入门,但从“小工”到“专家”的路,一定是一场持续的自我修炼。

8.3 职业生涯的长期主义

最后想聊聊职业焦虑。热搜里“程序员跳槽到海外”“程序员工资水平”之类的词一直热门,但我觉得职业生涯最关键的,不是短期换个平台涨一点薪水,而是你是不是在一条能长期积累的曲线上。这本书给的方向,就是积累“复用资产”——你对复杂系统的判断力、对代码库演进的经验、对团队和业务的洞察力。这些能力不会因为某个框架过时而归零,反而随着年限增长越来越值钱。

当你从“写代码的人”进化为“能解决问题、能带方向的人”,你会发现自己在哪儿都有选择的底气。技术圈变化很快,今天的热门框架明天可能被替代,但底层修炼可以穿越周期。

我个人这些年最深的体会是,程序员成长最有效的捷径,反而是那些看起来“慢”的事情:做记录、写测试、认真评审、深入复盘。我会在项目不忙的周期里,刻意拿出一部分时间做这些不紧急但重要的事,几个月后再回看,当时的坚持全都值回票价。希望这本书也能陪你走一段更远的路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询