开场:把 AI 当成一个"函数"
如果要用程序员的语言描述 AI,我会这样定义它:
def ai_assistant(input: Context) -> Suggestion:
"""
输入:意图、代码、报错、文档
输出:一个"大概率正确"的建议
特性:幂等性不保证,边界条件兜底
"""它不是编译器,不保证正确;它更像一个高并发、低延迟、知识面极广的结对程序员。理解它的"接口契约",才能用好它。
一、写代码阶段:从 0 到 1 的"脚手架生成器"
1. 样板代码生成(Boilerplate)
写 CRUD、DTO、路由、配置类这些重复劳动,以前是复制粘贴改字段,现在直接描述需求:
"用 Spring Boot 写一个带分页、参数校验、统一异常处理的用户查询接口"
它几秒钟给出骨架,而我们只需 review 和调整。省下的不是打字时间,是切换上下文的心智成本。
2. 陌生 API / 语言的上手
遇到没写过的语言或框架(比如临时要写个 Rust 小工具、调某个云厂商 SDK),AI 相当于一个随时在线的"文档 + 示例"聚合器,比翻官方文档快得多。
3. 正则、SQL、Shell 这类"低频高痛"语法
正则表达式、复杂 SQL、awk/sed 命令,属于写一次忘一次的东西。这类任务 AI 准确率极高,是性价比最高的用法之一。
二、读代码阶段:一个"永不疲倦的代码讲解员"
1. 接手遗留代码
面对几千行没注释的老代码,直接问:
"这段代码的核心逻辑是什么?有哪些隐藏的副作用?"
AI 能快速给出调用链路和意图总结。注意:它的总结可能有偏差,要用调试器/日志验证关键路径。
2. 跨语言/跨框架翻译
把一段 Python 逻辑翻译成 Go,把 jQuery 改成 React——语义级转换比机械翻译靠谱得多。
三、调试阶段:一个"假设生成器"
这是我觉得 AI 最有价值的地方之一。
传统调试是人脑串行假设:猜一个原因 → 验证 → 排除 → 再猜。AI 相当于并行生成一堆假设:
贴上报错栈 + 相关代码 → "列出所有可能原因,按概率排序"
它不一定给出正确答案,但能帮我们跳出思维盲区。很多 bug 卡住不是因为难,而是因为想不到那个方向。AI 补的正是"想不到"。
但要警惕:AI 会一本正经地编造不存在的 API 和原因。它的输出是待验证的假设,不是结论。
四、测试阶段:测试用例的"第一稿作者"
- 根据函数签名和逻辑生成边界用例、异常用例
- 生成 mock 数据和 fixture
- 把手工测试步骤转成自动化脚本
测试代码的特点是量大、模式化、正确性由被测代码兜底,非常适合 AI 起草、人来补关键 case。
五、文档与沟通:把"内部语言"翻译成"外部语言"
- 给函数/模块生成注释和 README
- 把 commit diff 转成 changelog
- 把技术方案翻译成给产品/老板看的白话
- 代码 review 时先让 AI 过一遍,人只看它标出的疑点
程序员的隐性成本很大一部分在"沟通翻译"上,AI 在这里是纯增益。
六、学习与知识更新:一个"有问必答但有幻觉"的导师
新技术、新版本特性、最佳实践,AI 能快速给出入门路径。但知识有截止日期、且可能过时或编造,涉及关键决策(安全、性能、合规)必须回官方文档验证。
七、它帮不了什么(同样重要)
写清楚边界,才算真懂这个工具:
| 场景 | 原因 |
|---|---|
| 架构决策、技术选型 | 赖业务上下文、团队能力、长期成本,AI 没有我们的约束条件 |
| 复杂并发/分布式 bug | 需要真实运行时状态,AI 只能猜 |
| 安全敏感代码 | 幻觉 + 训练数据泄露风险,必须人工审计 |
| 性能调优 | 需要 profiling 真实数据,AI 给的是通用经验 |
| 理解"为什么这么设计" | 组织历史、人的决策,AI 不知道 |
八、我的实践原则(一条条像代码规范)
- AI 产出 = draft,不是 final。永远过一遍 review,像对待同事的 PR。
- 给它足够的上下文。报错 + 代码 + 期望行为,输入质量决定输出质量——garbage in, garbage out。
- 小步验证。让它一次改一个函数,而不是"重构整个项目"。
- 关键路径必须自己跑通。它能写出编译通过的代码,不代表逻辑正确。
- 敏感信息脱敏。别把密钥、用户数据、公司核心代码贴进公共模型。
结语
用一句话概括:
AI 把程序员从"记忆和重复"中解放出来,把价值压缩到"判断和决策"上。
它像一个能力很强但偶尔胡说、没有上下文的初级搭档。我们的角色从"写代码的人"变成"定义问题、审查结果、兜底正确性的人"——这恰恰是更难、也更值钱的部分。
把它当一个工具函数调用就好:result = ai(context),然后我们负责 assert result.is_correct()。