两个月前,如果有人告诉我:
「你以后会自己做 AI Agent。」
我大概会笑一下。
不是因为我觉得 AI Agent 没什么。
恰恰相反。
而是因为那个时候的我,连代码都写不好。
我做了十年 CFD。
每天面对的是汽车、网格、流场、边界条件、收敛、结果后处理,还有各种各样的工程问题。
这些东西我已经做得很久了。
久到很多时候不需要特别想,就知道一个结果大概有没有问题。
但如果你把我扔到一个 Rust 项目里,让我从零开始写一个功能……
我还是会卡住。
而且经常卡在一些现在看起来非常基础的地方。
所以这篇文章不是一篇「从 CFD 工程师成功转型 AI 工程师」的故事。
因为我根本还没有转型成功。
我只是刚刚开始学。
01三十多岁了,又开始不会写代码
2026 年 4 月,我开始认真学 Rust。
说「认真」其实还有点不好意思。
因为刚开始的时候,我真的挺狼狈的。
我以前当然接触过代码。
也看得懂一些脚本。
做 CFD 的时候也会处理数据、自动化一些工作。
但那和真正做软件完全是两回事。
以前我更多是在解决:
「这个东西怎么计算?」
现在开始遇到:
「这个东西到底应该怎么组织?」
这两个问题差别非常大。
第一次看到 Rust 的时候,ownership、borrow、trait、lifetime 这些词一起出现。
我知道它们肯定很重要。
但知道「这个东西很重要」,和真正理解它,是两回事。
有时候一个看起来特别小的问题,我能折腾很久。
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable --> src/main.rs:24:9 | 24 | v.push(x); | ^ = note: this error originates in the borrow checker # 又卡住了 → 回到文档 → 发现还是没懂基本概念
最后发现不是 Rust 太复杂。
而是:
我连这里的基础概念都没搞明白。
这种感觉其实挺奇怪。
因为工作这么多年以后,你已经习惯了自己是一个「有经验的人」。
结果换一个领域。
经验突然没了。
02但 AI 确实让我开始做东西了
如果没有 AI,我现在可能还停留在学 Rust 的阶段。
这句话我觉得没必要谦虚。
我现在做项目,会大量使用 AI。
我会先把自己想做的东西说出来。
让 AI 帮我拆问题。
让它写一部分代码。
然后我拿回来跑。
报错。
再问。
改。
再跑。
有时候一个下午就在:
写 → 编译 → 报错 → 问 AI → 修改 → 再编译
这个循环里过去了。
但有一件事情以前确实很难做到:
一个完全不会系统写软件的人,现在可以真的把一个东西跑起来。
这件事对我的冲击其实挺大的。
以前我看到一个软件项目,会觉得:
「这个东西至少要懂很多代码才能做。」
现在不完全是这样了。
AI 可以帮你跨过最开始的那道门槛。
你甚至可以在还没完全掌握编程的情况下,先做出一个能工作的东西。
但这里也藏着一个很大的坑。
03最麻烦的,往往不是让它跑起来
我现在越来越觉得:
AI 帮你把一个项目做到 80%,可能比以前容易很多。
真正麻烦的是剩下的部分。
项目能跑起来以后,你开始遇到一些很烦的问题。
为什么这里的数据没有更新?
这个状态到底是谁改的?
为什么改了 A,B 又坏了?
这个错误到底应该在哪一层处理?
为什么这个 API 有时候成功,有时候失败?
为什么一个地方看着没问题,整个系统跑起来却不对?
这个时候,如果你完全不知道代码在做什么,就会很难受。
因为 AI 当然还是可以帮你。
你可以把错误贴给它。
它也可能马上给你一个修改方案。
问题是:
你不知道这个方案到底是不是对的。
甚至你改完以后,项目真的跑起来了。
但你不知道自己到底修好了什么。
这才是我现在最警惕的一件事情。
不是 AI 会不会写代码。
而是:
Will I slowly become someone who can only have AI fix my code — but can't explain how it works?我会不会慢慢变成一个只能让 AI 帮我修代码,却说不清楚代码为什么这样工作的「使用者」。
所以我最近反而越来越认真地补 Rust。
不是因为 AI 没用了。
恰恰是因为 AI 太有用了。
它让我太快地走到了「东西能跑」的地方。
然后我才发现:
真正需要自己补上的,是理解。
04做了十年 CFD,多少还是留下了一点东西
这也是我最近比较有意思的一个发现。
刚开始学代码的时候,我一直觉得:
「我以前做 CFD 的经验,对写软件应该没什么帮助。」
这句话其实只对了一半。
CFD 当然不会让我突然会 Rust。
不会因为我算过十年流场,就自动知道 trait 怎么设计。
也不会因为我会调湍流模型,就知道 async/await 到底是怎么回事。
这些东西都得重新学。
但是有一些习惯,好像确实留下来了。
比如:
我不太相信第一个结果。
以前 CFD 算完一个 case,我不会因为软件给出了一个数字,就觉得事情结束了。
Cd 变了。
压力分布变了。
流场看起来不一样了。
第一反应通常是:
为什么?
边界条件是不是有问题?
网格是不是有问题?
模型是不是有问题?
是不是哪里设置错了?
甚至如果我改了一个东西,结果变好了,我也会想:
真的是这个修改带来的?
还是刚好还有别的东西一起发生了变化?
这些习惯做久了以后,已经不像什么「方法论」。
更像条件反射。
05我第一次做 Agent 的时候,突然觉得这套习惯又出现了
刚开始接触 AI Agent,我其实没觉得它和 CFD 有什么关系。
网上讲 Agent,经常会出现一些很漂亮的描述:
Planning → Tool Use → Feedback → Next Action
看起来很完整。
但真正自己做的时候,事情没有那么漂亮。
一个 Agent 跑起来以后,你不能只看最后的答案。
你得看它中间到底干了什么。
为什么调用这个工具?
工具返回了什么?
它为什么决定下一步这么做?
是不是一直在重复?
什么时候应该停?
如果结果错了,到底是哪一步开始错的?
这时候我发现:
我以前做 CFD 的那套「查问题」的习惯又回来了。
我开始看过程,而不是只看最终结果。
开始找问题发生在哪里。
开始尝试一次只改一个关键因素。
开始重新跑。
然后比较。
这其实一点都不 AI。
甚至可以说很土。
但我做工程做了这么多年,已经习惯这样了。
现在只是把对象从:
流场
换成了:
代码和 Agent 的运行过程。
06也别把这件事情想得太浪漫
这可能是我现在越来越想说清楚的一点。
我以前做 CFD 十年,确实积累了一些工程经验。
但这些经验不能直接兑换成软件工程能力。
我可以凭经验感觉一个 CFD case 哪里可能有问题。
但到了 Rust:
我不知道 borrow checker 为什么这么设计。
不知道 trait 到底什么时候应该用。
不知道 lifetime 为什么需要存在。
不知道一个模块应该怎么拆。
不知道一个大型项目怎样组织才不会越来越乱。
- → Problem decomposition · 拆解问题
- → Verification · 验证结果
- → Debugging · 定位问题
- → Hypothesis testing · 假设检验
- → One-variable-at-a-time · 一次只改一个变量
- × Rust ownership
- × Borrowing
- × Traits
- × Lifetimes
- × Async
- × Software architecture
工程经验可以迁移,但技术知识不能凭经验凭空生成。
Engineering habits transfer. Technical knowledge does not.这些东西没有捷径。
就是不会。
不会就去学。
所以我最近的状态其实一直在这两边来回。
今天为了项目遇到一个 Rust 问题,就去学 Rust。
学着学着发现,这个问题背后还有一个更基础的概念,再去补。
补完以后回到项目,然后又遇到新的问题。
有时候挺烦。
尤其是那种:
折腾两个小时。
最后发现只是自己少写了一点东西。
这种时候真的会有点想骂人。
但也只能继续。
07现在让我说自己是「AI 工程师」,我反而觉得有点早
我甚至不太喜欢「转型」这个词。
因为我现在还没有完成什么转型。
我只是:
开始学 Rust。
开始认真写代码。
开始用 AI 做软件。
开始理解 Agent。
开始尝试把以前的工程经验带进新的东西里。
就这些。
现在让我完全不用 AI,从零开始写一个复杂软件,我还是做不到。
很多 Rust 概念我还在学。
软件工程很多东西我也还没真正经历过。
所以如果有人问:
「你现在算程序员了吗?」
我可能还是会犹豫一下。
但如果问:
「你现在是不是已经开始写软件了?」
那我可以回答:
是。
而且是真的在写。
这两个答案,对我来说差别很大。
08AI 真正改变我的地方,不是让我变成程序员
以前我会觉得:
一个不会代码的人,很难做软件。
这个判断以前基本没什么问题。
但现在已经开始发生变化。
AI 确实把门槛降低了。
你可以先描述。
先做。
先看到一个能跑的东西。
甚至可以在还没有完全理解代码的时候,就把第一版做出来。
对我这种没有系统学过编程的人来说,这个变化非常大。
但另外一面也越来越明显:
AI 越强,越容易让你产生一种「我已经懂了」的错觉。
代码是 AI 写的。
错误是 AI 帮你修的。
架构是 AI 给你的。
最后项目还能跑。
于是你很容易觉得:
「好像也没那么难。」
直到某一天系统出了一个 AI 解释不清楚的问题。
这时候你才发现:
原来真正缺的东西,一直在那里。
理解。
所以我现在给自己定的目标其实很简单:
不是不用 AI。
也不是证明自己可以不靠 AI 写代码。
而是:
AI can do it for me. But in the end, I want to be able to explain it myself.AI 可以帮我做,但最后我希望自己能够解释。
解释这段代码在干什么。
解释为什么这么设计。
解释数据从哪里来。
解释错误为什么发生。
解释为什么这个方案比另一个方案更合适。
如果这些事情做不到,我就不算真正掌握它。
09可能不是 CFD,而是做工程的习惯
如果现在让我重新回答这个问题:
「做十年 CFD,对现在学 AI 有没有帮助?」
我的答案会比较谨慎。
没有那么神奇。
它不会让你突然会编程。
不会让你自动成为 AI 工程师。
该学的东西还是得学。
Rust 还是 Rust。
软件工程还是软件工程。
AI 还是 AI。
但十年的工程工作,确实会留下点什么。
- 看到结果以后,先问一句:合理吗?
- 出了问题以后,不急着把错误盖掉,而是先问:到底哪里出了问题?
- 面对一个很复杂的问题,知道可以先拆开
- 做了一次修改,知道最好重新验证
这些以前都是我做 CFD 时每天都在做的事情。
现在换了一个对象。
以前研究的是:
「为什么这个流场变成这样?」
现在开始研究:
「为什么这个程序变成这样?」
看起来完全是两回事。
但解决问题的时候,某些习惯确实很像。
10这可能是我现在最真实的状态
做了十年 CFD 以后,我已经很久没有认真体验过「新手」是什么感觉了。
现在重新学代码,我又体验到了。
一个编译错误可以卡我半天。
一个很基础的概念,我可能要看好几遍。
别人觉得理所当然的东西,我可能完全不知道。
有时候甚至会觉得:
我怎么又什么都不会了。
但仔细想想,好像也没什么。
我第一次做 CFD 的时候,不也是这样吗?
第一次打开软件。
第一次建模型。
第一次划网格。
第一次跑算例。
第一次看到一个自己完全不知道该怎么解释的结果。
当时也不会想到:
后来我会在这个领域做十年。
所以现在重新面对 Rust、AI、Agent 和软件工程,我也没必要急着证明自己已经会了。
我现在就是一个新手。
这件事情没什么丢人的。
Still Learning · 项目仍在进行,没有完成什么「转型」
STATUS: STILL LEARNING
这不是一篇「转型成功」的总结。这是一份正在进行的工程现场记录。11最后
所以这篇文章如果一定要有一个结论,我现在反而不想写得特别漂亮。
我还不知道这条路最后会走到哪里。
可能两年以后,我会真的做成一个软件。
可能只是学会了一些代码,然后继续做我的工程。
也可能走到一个完全没想到的方向。
我不知道。
但至少现在,我已经开始了。
以前我花了十年时间,学着怎么把一个复杂的流场问题一点一点搞明白。
现在又重新开始。
学 Rust。
学软件。
学 AI。
学 Agent。
继续踩坑。
继续犯错。
继续让 AI 帮我。
也继续想办法搞明白 AI 到底帮我做了什么。
三十多岁重新当一个新手,确实有点狼狈。
但好像也挺有意思。
毕竟十年前,我也不知道自己最后会走到 CFD。
现在也一样。
Keep walking first. See where this leads.先走再说。
看看这一次,会走到哪里。