C++ 开发者与人工智能
随着能够自信地编写代码的模型出现,许多初学者提出了一个合理的问题:现在还值得进入这个行业吗?这是一个诚实的问题,用”没事,一切都会和以前一样”来敷衍它是不对的。让我们看看实际上发生了什么。
简短的回答是:工程师仍然是需要的,但门槛已经变了。下面解释为什么。
AI 只会重现它被训练过的东西
模型是在海量已经写好的代码上训练出来的,就其本质而言,它输出的是这些数据中最常见的东西。对于人类已经解决过成千上万次的任务,它表现得非常出色:解析 JSON、搭建一个 HTTP 服务器、为一个容易理解的函数编写测试。
它的局限性正是从同一个根源生长出来的:
- 不典型的问题处理得很差。 你所在的业务领域、你的硬件约束、你这个具体场景下内存与延迟之间的权衡——这些都不在训练数据里。而工程工作在很大程度上正是由这些”可我们这里不一样”的情况组成的。
-
偏向旧代码。 开源 C++ 代码积累了几十年,而且大多是用旧风格写的。因此模型很乐意给你
new/delete而不是智能指针,给你裸循环而不是算法,给你 C 字符串而不是std::string_view。代码是能跑的,但不是你希望在自己项目里看到的那种代码。 - 自信不等于正确。 模型可能会引用一个不存在的标准库函数,或者搞错某个重载的行为——而它陈述这些内容时的语气,和正确答案时一模一样。
为什么在 C++ 中犯错的代价更高
在有托管内存的语言里,错误代码通常会立刻大声地崩溃。在 C++ 中并非如此。
- 未定义行为可能不会在测试中暴露。 数据竞争、访问已释放的内存、数组越界——这些都可能在你的机器上”正常”运行好几年,然后在用户的机器上、或者在编译器升级之后爆发。没有任何测试能保证生成的代码不存在这些问题。
- 对象的生命周期是最微妙的地方。 这恰恰是模型最容易出错的地方:返回对局部对象的引用、按引用把变量捕获进 lambda、不去思考究竟由谁拥有这个对象。
- 多线程。 看起来正确的代码可能含有一个竞态,它在高负载下一周才复现一次。
结论很简单:你只能接受你有能力验证的代码。而要验证 C++ 代码,你对 C++ 的了解必须不亚于手写代码时。可以帮忙的工具——sanitizers、静态分析器、模糊测试——都在语言工具包一文中有介绍。
开发的瓶颈不是打字速度
这是最重要的一点。工程师的工作从来都不只是敲字符。它包括:
- 弄清楚客户真正需要什么(通常他自己也不是一次就能说清楚);
- 决定系统中绝不能出现哪些错误,以及当它们还是发生时该怎么办;
- 各种权衡:速度对可读性、工期对技术债、可靠性对成本;
- 对结果负责。
这些任务没有一项可以委托给模型——不是因为它”不够聪明”,而是因为这些是关于人、钱和责任的问题。如果应用程序伤害了用户,承担责任的是公司和具体的工程师,而不是工具。在软件需要认证的领域——医疗、航空电子、汽车(见编码标准与合规要求)——这已经不是哲学,而是字面意义上的要求:结果上要有人签字。
还有一个早在神经网络之前就为人所知的观察:读别人的代码比写自己的代码更难。当代码越来越多、而且写得越来越快时,瓶颈就不再是编写,而是理解和评审。这是工程师的工作,而且它的工作量更可能是增加的。
真正在改变的东西
说什么都没发生是不诚实的。确实有变化,而且现在就已经能看到:
- 重复性工作在贬值。 快速写出又一个样板类的能力,本身已经不再是优势。
- 验证能力和系统思维的价值在上升。 能够察觉一个方案虽然优雅、但扛不住负载、或者放不进现有架构,成为一项关键技能。
- 入门门槛提高了。 以前对初级开发者的期待是会写代码。现在越来越多地还期待他能评估别人的代码——包括机器写的代码。
由此得出的实用结论:应该投资于基本功——内存模型、对象生命周期、多线程、架构、调试。所有这些让你能够判断一个方案是否正确的东西。而这正是路线图所讲的内容。
给正在学习者的一个陷阱
对初学者来说,AI 最严重的风险不是”抢走工作”,而是妨碍你学会。
技能是从与问题的搏斗中生长出来的:你尝试、你犯错、你弄明白为什么,然后脑子里就留下了对正在发生的事情的一个心智模型。如果一遇到困难就立刻去问助手,问题是解决了,可心智模型没有。这样练习一年之后你会发现,你根本没有办法去检验助手的答案。
该怎么办:
- 在练习题上,先自己解,然后带着做好的方案去找助手做评审——”这里哪里本可以做得更好,为什么”。
- 请它解释,而不是给代码:为什么是这样、有哪些替代方案、条件变化时什么会坏掉。
- 不要粘贴你无法逐行解释的代码。这条规则对来自 Stack Overflow 的代码和来自模型的代码同样适用。
- 时不时地完全不用助手写点东西——好让你诚实地看到自己真实的水平。
如何用得有价值
- 作为处理重复工作的加速器: 样板代码、测试骨架、理解陌生的 API、文档草稿。
- 作为帮你讲解的对话者: “为什么编译器会这样报错?”——对 C++ 模板错误的解读,模型明显比编译器更容易懂。
- 作为陌生代码库中的导航员: 快速搞清楚什么东西在哪里、彼此如何关联。
- 作为评审者: 请它找出你代码中的问题。不是当作最终定论,而是当作又一双眼睛。
还有三条最好始终记住的规则:验证生成的内容、遵守公司关于把代码发送到外部服务的政策、记住许可风险。更多内容见 AI 工具一节。
没有人知道的事
老实说:这个职业十年后会是什么样子,没有人知道——本路线图的作者不知道,模型本身的作者也不知道。任何人如果自信地预言”所有人都会被取代”或者”什么都不会变”,都是在把一厢情愿当成事实。
可以有把握地说的是:对那些理解系统如何运作、并能为结果负责的人的需求,到目前为止一点也没有消失。开发中的工具一直在变——汇编、编译器、IDE、自动补全、互联网搜索。每一次都有人说”现在任何人都能编程了”,而每一次工作反而更多而不是更少,因为开发变便宜之后又开辟出了新的问题。这一轮或许会有所不同——但迄今为止,还没有理由去赌深厚的知识会突然贬值。