开场:把 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 不知道

八、我的实践原则(一条条像代码规范)

  1. AI 产出 = draft,不是 final。永远过一遍 review,像对待同事的 PR。
  2. 给它足够的上下文。报错 + 代码 + 期望行为,输入质量决定输出质量——garbage in, garbage out。
  3. 小步验证。让它一次改一个函数,而不是"重构整个项目"。
  4. 关键路径必须自己跑通。它能写出编译通过的代码,不代表逻辑正确。
  5. 敏感信息脱敏。别把密钥、用户数据、公司核心代码贴进公共模型。

结语

用一句话概括:

AI 把程序员从"记忆和重复"中解放出来,把价值压缩到"判断和决策"上。

它像一个能力很强但偶尔胡说、没有上下文的初级搭档。我们的角色从"写代码的人"变成"定义问题、审查结果、兜底正确性的人"——这恰恰是更难、也更值钱的部分。

把它当一个工具函数调用就好:result = ai(context),然后我们负责 assert result.is_correct()。