
很长一段时间,我的博客停更了。
不是没东西写,而是潜意识里有个声音一直在说:你是软件工程师,写代码才是正经事,写文章能证明什么?
这个声音听起来很务实,其实是一种偏见。
直到有一天,我开着车堵在高架上,脑子里突然冒出一句话:
写作就是编程,编程也是写作。
这个念头一开始有些莫名其妙,但越想越觉得准确。
尤其是在 AI 编程工具越来越强的今天,我更加确信:工程师真正的竞争力,从来不是"会敲代码",而是能够在头脑中建立一个清晰的抽象世界,并把它准确地表达出来。
AI 可以生成代码,但它不会替你完成真正困难的那部分工作——理解问题、建立模型、划定边界、做出取舍,并判断结果是否正确。
这些,才是工程师的护城河。
编程的本质,不是写代码,而是建模
很多非技术人员以为,软件开发的核心动作是"敲代码"。
这种理解,就像认为建筑设计的核心动作是"画图纸"一样,只看到了最后的表达形式,忽略了背后真正复杂的部分。
一个软件系统在被写出来之前,首先应该存在于工程师的大脑里。
你需要想清楚:
- 系统里有哪些核心实体?
- 实体之间是什么关系?
- 状态如何变化?
- 哪些约束必须始终成立?
- 哪些操作是幂等的?
- 并发情况下会发生什么?
- 网络失败、消息重复、事务中断时,系统应该表现出什么行为?
- 哪些问题是当前必须解决的,哪些复杂度应该推迟引入?
这些问题的答案,构成了系统的抽象模型。
代码只是这个模型在某种编程语言中的投影。
一个真正清晰的系统,不是从第一行代码开始变清晰的,而是在工程师的头脑中先被想清楚,然后才通过代码固化下来。
反过来,很多混乱的系统,也不是因为代码写得不够优雅,而是因为一开始就没有建立清晰的模型。
实体职责混在一起,状态流转没有定义,业务边界靠口口相传,异常处理依靠经验补救。这样的系统,即使每一行代码都符合规范,也会随着业务演进变得越来越难维护。
所以,编程的第一性原理不是语法、框架或工具,而是建模能力。
AI 不是传统意义上的编译器
AI 编程助手刚流行起来的时候,很多人喜欢用"编译器"来形容它:
以前我们用 Java、Python 写代码,交给编译器翻译成机器指令;现在我们用自然语言描述需求,交给 AI 生成代码。
这个类比很直观,但并不准确。
传统编译器处理的是形式语言。语法规则是明确的,输入和输出之间有严格定义。同一份代码,在相同编译条件下,结果应当是确定的。
而大语言模型处理的是自然语言。自然语言天生模糊,充满省略、歧义和上下文依赖。同一个需求,换一种说法,AI 可能生成完全不同的实现。
这意味着,自然语言并不会因为我们用它来写代码,就自动变得精确。
你对 AI 说:
帮我实现一个用户登录功能。
它可以生成一个看起来完整的接口:接收用户名和密码,校验账号,返回 JWT。
但这离生产可用还差得很远。
一个真正的登录系统,还涉及密码哈希算法、盐值管理、登录失败次数限制、验证码策略、Token 过期时间、Refresh Token 轮换、会话失效、设备管理、权限模型、日志脱敏、防重放攻击、审计追踪等一系列问题。
AI 不知道你的系统边界、安全等级、业务约束,也不知道哪些异常可以接受,哪些事故绝对不能发生。
除非你把这些东西讲清楚。
所以,AI 不是把"任何人说的话"自动变成正确软件的魔法编译器。它更像一个能力很强的实现者:你给它的模型越清楚,它交付的结果越接近你的预期;你脑子里本来就很模糊,它只会把你的模糊放大成一堆看似完整、实则漏洞百出的代码。
工程师的核心竞争力:清晰地抽象,准确地表达
AI 时代,工程师最核心的能力可以浓缩成一句话:
在头脑中建立一个清晰的抽象世界,然后清晰地思考,准确地表达。
这件事听起来简单,实际上非常困难。
所谓"清晰的抽象世界",不是知道几个设计模式,也不是能画出一张漂亮的架构图,而是能把一个混乱的现实问题,转化成边界明确、关系清楚、可以被验证的系统模型。
它至少包括四种能力。
第一,识别本质问题的能力
很多需求表面上是在说"做一个功能",背后真正要解决的可能是效率、信任、成本或协作问题。
如果工程师只是机械地接收需求,就很容易把系统设计成一个功能的堆叠。
而优秀的工程师会继续追问:
- 用户真正要完成的任务是什么?
- 哪个环节是瓶颈?
- 这个需求是否只是某种更深问题的表层症状?
- 有没有更简单的路径可以达到同样的目标?
这种能力决定了你是在"实现需求",还是在"解决问题"。
第二,建立系统模型的能力
面对一个复杂业务,工程师需要找到核心概念,定义它们的关系,并识别系统里的不变量。
比如设计交易系统,你要知道订单、支付、库存、履约之间如何协作;设计消息系统,你要知道消息状态如何流转,重复投递如何处理,消费失败如何补偿;设计权限系统,你要知道用户、角色、资源和动作之间应该怎样组合。
这些模型不一定一开始就完美,但必须清晰、可讨论、可修正。
模糊的想法无法被可靠地实现,更无法被 AI 可靠地实现。
第三,拆解与组合的能力
工程师既要把大问题拆成小问题,也要保证小问题组合起来之后,仍然构成一个完整的系统。
拆解不是简单地把任务列成 TODO,而是找到合理的边界:
- 哪些职责应该放在同一个模块?
- 哪些依赖必须被隔离?
- 哪些状态应该集中管理?
- 哪些变化最容易发生,应该通过抽象隐藏起来?
- 哪些复杂度现在不该引入?
很多人只会拆,不会合。
他们可以把一个系统分成十几个服务,却说不清楚服务之间的数据一致性如何保证;可以把代码拆成几十个类,却无法解释这些类共同表达了什么业务概念。
真正的架构能力,不是"拆得多",而是拆完之后,整体依然简单。
第四,验证结果的能力
AI 生成代码之后,工程师不能只负责点"接受"。
你需要判断:
- 这个实现是否真的满足需求?
- 有没有隐藏的边界条件?
- 并发下是否安全?
- 失败时是否会留下脏数据?
- 性能瓶颈在哪里?
- 测试是否真的覆盖了关键路径?
- 日志和监控能否支撑问题排查?
- 这个方案短期有效,长期是否会成为负担?
AI 可以帮你提高效率,但责任仍然在工程师身上。
越是强大的工具,越需要强大的判断力来驾驭。一个无法验证结果的人,用 AI 写代码,只是在更快地制造风险。
为什么写作能力和编程能力是同一件事
我后来越来越觉得,写作和编程训练的是同一种底层能力。
写文章时,你要先想清楚核心观点,再决定结构:哪些内容先说,哪些内容后说,哪些概念需要铺垫,哪些细节可以省略。
这和设计软件架构几乎是一样的。
文章的核心观点,相当于系统的核心领域模型;文章的结构,相当于模块划分;段落之间的衔接,相当于接口;论据是否充分,相当于测试是否覆盖;读者能否顺畅理解,相当于系统的可维护性和易用性。
写代码时也是一样。
函数名和变量名,是在给抽象概念命名;接口定义,是在表达模块之间的契约;注释和文档,是在说明代码背后的意图;架构设计文档,则是在描述整个系统的心智模型。
一个表达混乱的人,很难写出结构清晰的代码。
因为代码里的混乱,往往不是从键盘开始的,而是从大脑开始的。
同样,一个能把复杂技术问题讲清楚的人,通常也能把系统边界想得更清楚。因为"讲清楚"的前提,是他已经在头脑中完成了抽象、拆解和重组。
写作不是编程之外的闲事,而是编程能力的另一种训练方式。
它训练的不是修辞,而是思维的秩序。
AI 时代,代码变得更便宜,判断变得更昂贵
过去,工程师的大量时间消耗在"把想法翻译成代码"上。
记住 API、熟悉框架、处理语法、排查环境问题,这些工作占据了很多精力。一个人能否快速写出代码,曾经是衡量工程能力的重要标准。
但 AI 正在快速压低这部分能力的稀缺性。
未来,写出一个 CRUD、生成一段正则、补全一个测试用例,甚至搭起一个 Demo,都会变得越来越容易。
真正稀缺的,会变成另外一些东西:
- 你是否知道应该构建什么?
- 你是否理解系统真正的约束?
- 你是否能识别方案中的风险?
- 你是否能在成本、性能、可维护性之间做出合理取舍?
- 你是否能把一个复杂系统讲清楚,让团队和 AI 都能沿着同一个模型工作?
- 你是否能对最终结果负责?
换句话说,代码会变得越来越便宜,但清晰的思考、准确的设计和可靠的判断,会变得越来越昂贵。
这不是说编程能力不重要了。恰恰相反,工程师必须懂技术,而且要懂底层。
否则,你根本不知道该向 AI 提出什么约束,也无法判断它生成的方案是否可靠。
技术能力并没有消失,而是从"亲手写出每一行代码",升级为"理解每一层抽象,并控制系统朝正确的方向演化"。
同一个需求,不同工程师会给 AI 完全不同的指令
假设你要优化一个接口。
普通表达可能是:
这个接口太慢了,帮我优化一下。
AI 也许能给出一些通用建议:加索引、加缓存、减少查询、异步处理。
但一个成熟工程师会这样描述问题:
当前订单列表接口在 10 万订单数据量下,P95 响应时间约 800ms,目标降低到 200ms 以内。系统使用 MySQL,核心查询按用户 ID 过滤,并按创建时间倒序分页。初步怀疑存在深分页和不合理索引问题。请先分析执行计划,检查是否存在全表扫描、回表过多或 N+1 查询;再给出索引优化、覆盖索引、游标分页和缓存方案,并说明各自的数据一致性风险、改造成本和适用条件。最后补充对应的基准测试方案。
这两个指令得到的结果,完全不会处在同一个水平。
区别不在于谁更会"写提示词",而在于谁真正理解系统。
提示词只是表达方式,背后仍然是工程能力:问题定位、性能分析、数据库原理、架构权衡、验证方法。
所以,不要把 AI 时代的竞争力误解成"会不会提问"。
提问能力只是表层,底层是你对问题的理解深度。
你思考得越清楚,表达得越准确,AI 交付的结果就越接近你的目标。
写在最后
我现在重新开始写作,不是为了证明自己会表达,也不是为了追逐某种内容红利。
而是因为写作本身就是一种高强度的思维训练。
它迫使我面对那些原本模糊的想法:一个概念到底是什么?两件事之间是什么关系?这个判断的依据是什么?有没有反例?能不能用更简单的结构说清楚?
这些问题,和软件设计中每天遇到的问题,本质上完全相同。
写作是把模糊的思考整理成清晰的文章,编程是把复杂的世界抽象成可运行的系统。
一个输出文字,一个输出代码;一个面向读者,一个面向机器;但它们共享同一个内核:
建立清晰的抽象,并把这种抽象准确地表达出来。
所以,如果你问我,AI 时代工程师最核心的竞争力是什么?
我的答案不是"熟练使用 AI",也不是"掌握更多框架",更不是"比 AI 写代码更快"。
而是:
你能不能在头脑中建立一个清晰、完整、可被验证的抽象世界。
AI 可以帮你写代码。
但你必须先想清楚,这个世界应该长什么样。