拒绝做概率模型的“赌徒”:我是如何用 Copilot 进行结提示编程的
本文分享了使用Copilot作为代码助手的实用工作流。作者强调不应让AI直接编写核心业务代码,而是将其作为"结对编程助手"主导开发过程。工作流分为五个阶段:1)通过AI快速解析代码结构和数据流;2)需求分析阶段与AI讨论方案并验证思路;3)编码时先提供详细逻辑再让AI补充代码;4)利用AI编写测试脚本和查找潜在bug;5)处理文档和配置等杂务。文章指出,AI的上限取决于开发者如
文章目录
很多人用 Copilot 的方式是:给个注释,敲个回车,然后祈祷大模型生成的代码能跑通。
但大模型本质上是概率模型,直接让它上手写业务代码,随机性太大,翻车是迟早的事。
在我的日常开发中,我根本不会让大模型直接上手写核心代码。我把它当成一个需要我来主导的“结对编程助手”。以下是我在实际项目中总结出的一套 Copilot 实用工作流。
一、 快速接手与梳理:让 AI 当“代码导游”
面对庞大的项目或陌生的源码,自己一行行啃效率太低。我会先让 AI 帮我建立全局观。
1. 解析代码与关键参数
我会让 Copilot 阅读文件,让它帮我提炼核心逻辑。
** 我的 Prompt 示例:**
- 帮我阅读 `concurrent_object_pool.h` 这个文件
- 解析这个无锁对象池的核心作用和底层数据结构
- 列出初始化和调用 `GetObject` 时,必须传入的关键参数及其含义
- 总结使用该类时需要注意的前置条件
2. 画 Mermaid 图理清数据流
文字说明有时候不够直观,我会让 AI 直接画图。
** 我的 Prompt 示例:**
- 根据当前代码逻辑,画一个 Mermaid 流程图
- 直观展示出一个 Message 数据从接收、进入对象池、被多线程消费,到最终触发自定义删除器归还的完整流动方向
二、 需求分析与设计:先动口,后动手
接到 MT(Leader)给出的需求后,我绝不会马上写代码,而是先和 AI “吵”一架,把方案盘清楚。
3. 讨论方案与收敛需求
我会给出背景,让 AI 提供选项,然后我来做决策和细化。
我的 Prompt 示例:
- MT 给了一个需求:要在现有的无锁对象池中加入“对象存活时间监控”功能
- 请给出 3 种实现方案(例如:后台线程轮询、获取时惰性检查等)
- 详细对比这几种方案在 CPU 占用、锁竞争开销上的优缺点
- (后续追问):我觉得方案二不错,但如果并发极高,怎么优化这里的伪共享问题?
4. 写伪代码验证思路
方案定下后,先写伪代码验证逻辑链路。
我的 Prompt 示例:
- 就按我们刚才讨论的“获取时惰性检查”方案
- 先不要写具体的 C++ 代码,用伪代码把核心逻辑写出来
- 重点展示时间戳比对和过期对象销毁的流程,我需要验证一下整体思路对不对
三、 核心编码:我的“防翻车”控制流
这是最关键的一步。我提供具体方案 -> 探讨实现细节 -> 查漏补缺 -> 最终才让 Copilot 生成代码。
5. 探讨细节与查漏补缺(核心!)
我会先用自然语言把我的逻辑描述一遍,让 AI 帮我找漏洞。
我的 Prompt 示例:
- 我现在要实现 `GetObject` 的无锁弹栈逻辑,我的思路如下:
1. 先 load 当前的 `free_head_`
2. 检查 node 是否为空
3. 组装 new_head,把 count + 1 解决 ABA 问题
4. 用 `compare_exchange_weak` 做 CAS 循环
- 请围绕我的这个方案,在实现细节上帮我查漏补缺
- 看看多线程并发下有没有我没考虑到的边界情况?
- 确认逻辑严密后,再严格按照我的思路生成 C++ 代码
6. 补充防御性代码
AI 生成主体逻辑后,我会让它把脏活累活补齐。
我的 Prompt 示例:
- 检查上面生成的代码,帮我补充以下容易遗漏的部分:
- 关键路径上的 glog 日志打印(INFO/ERROR)
- 异常情况的错误返回和状态码
- 边界判断和指针的空值判断
7. 对齐团队码风
团队协作最怕代码风格割裂,我会让 AI 帮我统一格式。
我的 Prompt 示例:
- 统一一下这段代码的码风
- 我之前写的是直接声明变量并赋值的方式,请帮我全部改成使用 glog/protobuf 规范的 `.Set()` 或 `.add_()` 链式调用形式
四、 测试与排错:利用好 AI 的其他价值
代码写完,测试和 Review 同样可以交给 AI。
8. 编写自动化测试脚本
我的 Prompt 示例:
- 帮我为 `concurrent_object_pool.h` 写一个简单的 gtest 单元测试脚本
- 实现自动化测试,需要包含多线程并发 Get 和 Release 的用例
- 帮我构造几组极端的边界测试数据
9. 猜测潜在 BUG
在跑测试之前,我会让 AI 充当“刺客”来找茬。
我的 Prompt 示例:
- 仔细观察这段 CAS 循环代码
- 结合 C++ 内存模型(memory_order),猜测在弱内存序架构下,这里最可能出现数据竞争或 BUG 的地方在哪里?
10. 提交前的最终 Review
我的 Prompt 示例:
- 测试完效果没问题了,准备 commit
- 请以资深 C++ 开发的视角,最后 review 一遍这段代码
- 看看有没有隐藏的性能隐患或不优雅的地方
五、 杂活全包:文档、清理与配置
最后,把那些不想写但又不得不写的东西丢给 Copilot。
11. 清理代码冗余
我的 Prompt 示例:
- 检查当前文件是否有冗余代码
- 帮我去掉未使用的局部变量、多余的头文件包含,以及过时的注释
12. 快速生成文档与注释
我的 Prompt 示例:
- 帮我给这个类快速写一份接口说明文档
- 为所有 public 函数生成 Doxygen 格式的注释
13. 编写脚本与配置文件
写 Bazel 或 CyberRT 的配置往往需要查文档,AI 能直接搞定。
我的 Prompt 示例:
- 帮我写一个 Bazel 的 `BUILD` 文件,把这个对象池编译成 `cc_library`,并链接 glog
- 帮我写一个 CyberRT 的 `.dag` 配置文件,把刚才写的 Component 挂载进去,并配置好 Channel 订阅关系
总结
大模型不是全知全能的自动编程机,它的上限取决于你如何引导它。
把控好架构设计,理清逻辑细节,让 AI 去做填空题和检查题,这才是当下最高效、最安全的 Copilot 打开方式。
更多推荐

所有评论(0)