AI 辅助开发
AI 辅助开发是使用编码 Agent 或编码助手阅读代码、生成修改并验证结果的过程。助手可以运行命令,再根据输出继续修改;开发者负责明确需求、选择方案和验收交付。
本文从一次开发任务入手,依次说明怎样获取代码上下文、描述任务和反馈问题,最后讨论质量审查。面试既会询问实际使用方法,也会让候选人借助 AI 完成现场编码。两种形式都要求候选人解释修改,并用检查结果证明任务完成。
1. 面试核心
先记住这几条,再读正文- 开发流程。 AI 辅助开发以验收条件为依据,完成代码阅读、小步实现、检查和差异审查。卡 · 一次开发任务的流程
- 提示与反馈。 有效提示说明目标、约束和代码位置,失败反馈给出实际输出与预期行为。卡 · 提示与反馈
- 代码检索。 关键词搜索能直接定位代码标识符,语义检索可以补充按功能描述查找的能力。卡 · 代码库上下文
- 质量验证。 行为测试、类型检查、静态分析和人工评审共同验证生成代码的质量。卡 · 质量保障
- 评审重点。 人工评审优先检查接口、数据、权限和并发变更,格式与类型问题交给自动检查。卡 · 质量保障
2. 一次开发任务的流程
开发任务需要先定义完成标准,后续每一步才有判断依据。一次任务可以按以下七个环节推进:
- 需求与验收:写清输入、输出、约束和验收用例。会影响实现的歧义先澄清,比如配置解析失败时是保留旧配置还是报错。
- 理解代码:让 Agent 阅读入口、相关模块和现有测试,再说明调用关系。发现它理解有误时,先纠正,再进入实现。
- 计划:多文件或风险较高的修改,需要列出改动点和验证方法。简单修改可以直接实施。
- 实现:每次完成一个可验证的小单元,及时查看 diff,也就是修改前后的代码差异。这样更容易把失败结果对应到具体改动。
- 验证:运行相关测试和类型检查,按影响范围补充构建与回归。新增行为缺少测试时,补上正常、边界和失败用例。
- 审查:检查接口兼容和错误处理,再查看是否混入无关修改。被删除的断言、被吞掉的异常和硬编码的值都要有合理解释。
- 交付:说明修改内容、已完成的验证和未验证部分。开发者需要能解释每处修改的原因。
验收方式应与改动相匹配。纯文案或低影响修改可以采用格式检查、差异检查等方式。
现场 AI Coding 面试中,第一版完成后还会遇到追加需求或缺陷反馈。候选人需要定位问题、给出具体反馈,并解释后续修改。因此,要给验证和修正留出时间。
3. 代码库上下文
编码助手需要先找到与任务有关的实现,才能沿用项目已有设计。获取上下文时,可以结合以下四种方式,逐步缩小阅读范围。
| 方式 | 适用问题 | 使用边界 |
|---|---|---|
| 关键词搜索 | 函数名、错误文本、配置项 | 依赖命名与搜索范围 |
| 语义检索 | 按功能描述寻找实现 | 依赖切块、索引更新和权限过滤 |
| 符号与调用关系 | 定义、引用与调用链 | 依赖语言服务和项目解析 |
| 仓库规则 | 命令、结构与约定 | 加载规则取决于具体工具 |
代码里的函数名、类名和错误文本都适合精确匹配。Agent 可以先用 grep 或文件名搜索找到入口,再读完整函数,沿引用继续查找。直接搜索读取当前磁盘内容,所以刚修改的代码也能立即搜到,省去了索引维护。
语义检索先把代码切成片段,再建立用于相似度查询的向量索引。它适合大型仓库、命名不规范的代码,以及只有功能描述的查找任务。不过,切块会割断函数或类的上下文,代码变更后也需要更新索引。所以,检索命中后还要读相关文件,确认调用关系和当前版本。
语言服务器协议(LSP)让编辑器查询定义和引用,代码图谱也能帮助追踪调用关系。这类工具依赖语言服务与项目解析,可以和关键词搜索、语义检索一起使用。
开发者可以提供以下定位信息,减少无关搜索:
- 指出相关目录、文件和调用入口。
- 说明业务术语在代码中对应什么名称。
- 提供复现命令和错误输出。
检索方案是否提高了任务成功率,见编码 Agent 评测。
仓库中的长期约定怎样组织,见仓库指令。
4. 提示与反馈
任务描述需要把目标变成可验证的行为。下面以进程内缓存为例,把代码位置、调用方、约束和验收条件放在一起。
LRU 按最近访问顺序淘汰最久未使用的条目,TTL 则规定条目的有效时间。两者控制的行为不同,因此都要在需求中写清。
目标:在 src/cache/ 中实现进程内 LRU 缓存。
调用方:UserService。
约束:
- 容量可配置,默认 1000;支持 TTL。
- 多线程读写安全;沿用已有依赖。
- 保持 UserService 的公开接口兼容。
验收:
- 测试覆盖命中、过期、淘汰顺序和并发行为。
- 现有相关测试全部通过。
先阅读相关实现,再给出修改点和验证方式。
如果缓存用于查询用户资料,可以进一步说明 UserService 中的调用位置。仓库已有 src/cache/README.md 时,也应让 Agent 先阅读其中的约定,再确定修改方案。
第一版完成后,反馈要提供足以指导修改的具体差异:
- 测试失败时,给出用例、期望值和实际值,也可以让 Agent 直接运行测试读取结果。
- 设计存在问题时,指出代码路径和受影响的约束。比如,全局锁让所有访问串行执行,需要结合并发要求检查锁的范围。
- 同类错误反复出现时,让 Agent 说明当前假设,保留已确认事实,再缩小修改范围。
锁策略也要结合缓存的具体行为。LRU 的 get 会更新访问顺序,也就是命中时仍会修改共享状态。因此,评估读写锁或分段锁时,要同时检查顺序维护和淘汰是否正确。
这些反馈比单纯要求“再检查一下”更有用,因为模型能据此定位具体差异。失败会话的恢复方式见 AI 代码调试。
5. 质量保障
生成代码需要同时满足业务行为和工程约束。程序运行成功后,还需要继续检查边界输入、失败路径和设计是否合理。
评审时要留意以下常见缺陷及成因:
- 需求只描述主流程时,生成实现容易遗漏并发、错误处理和兼容性要求。
- 读取的代码范围不足时,助手会重复实现已有工具函数,或采用与项目不同的约定。
- 围绕失败用例反复修改时,助手会放宽断言、跳过用例,或加入只匹配该输入的特殊分支。
- 为了尽快完成任务,生成代码还会出现吞掉异常、硬编码配置或残留无用代码的问题。
- 多轮修改各自解决局部问题后,模块职责会变得混乱,增加维护难度。
因此,编码前要在提示和仓库指令中写明项目约定与禁止事项。复杂修改先检查计划,完成后再按下表验证。
| 检查对象 | 验证方式 |
|---|---|
| 业务行为 | 从需求推导正常、边界和失败用例 |
| 兼容性 | 核对调用方、接口和数据格式 |
| 错误处理 | 验证异常传播与资源清理 |
| 并发 | 检查共享状态与执行顺序 |
| 改动范围 | 审查 diff 和已有断言变化 |
| 机械规则 | 类型检查、lint、构建和静态分析 |
行为契约就是程序约定要满足的输入输出和边界要求。测试场景应从这些要求独立推导,AI 可以帮助编写测试。同一个错误假设会同时影响实现和测试,因此评审还要检查已有断言是否被放宽、用例是否被跳过。
类型检查、lint 和静态分析负责发现机械错误,安全扫描可补充检查已知风险。另一个模型实例也可以梳理调用关系、提出疑点,但结论仍需代码、需求或运行结果支持。
长方案先检查验收条件,再看数据模型、接口、一致性和失败处理的取舍。超出当前需求的设计需要说明必要性。代码则按功能和依赖拆开审查,优先看接口、数据、权限与并发变更。变更大到无法解释时,拆成更小的单元,确认每处改动的用途后再交付。
6 · 面试题卡片
本页题目与参考回答
6.1 AI 辅助开发的完整工作流是什么?讲一下和 AI 交互完成一个功能的过程。
考察重点
- 解释需求、代码阅读、计划、实现、验证和审查怎样衔接。
- 说明开发者负责哪些判断,以及用什么证据验收交付。
相关内容:一次开发任务的流程。
参考回答
完整流程从需求与验收条件开始,经过代码阅读和小步实现,再用检查与评审完成交付。
开发者先写清输入输出、约束和验收用例,澄清影响实现的歧义。Agent 阅读相关代码后,说明调用关系与修改点,理解有误时先纠正。多文件或高风险任务再列出计划,拆成可验证的小单元。
每个单元完成后运行相关检查,缺少的行为测试按需求补充。失败输出交回 Agent,供它定位和修正。随后审查 diff,检查无关修改、断言变化和异常处理。交付时说明已验证范围与剩余问题,并解释每处修改的原因。AI 加快阅读与执行,开发者负责方案取舍和最终验收。
6.2 假如要基于内存实现一个缓存,写一下 AI Coding 流程中的提示词。
考察重点
- 给出包含目标、约束、相关代码和验收条件的任务描述。
- 根据运行结果说明实际行为与预期行为的差异。
相关内容:提示与反馈。
参考回答
提示应写清缓存的用途、行为约束和验收标准,让第一版实现有明确目标。
可以这样描述这项缓存任务:
- 在
src/cache/实现进程内 LRU 缓存,供 UserService 查询用户资料。 - 容量可配置,默认 1000,并支持 TTL 和多线程安全访问。
- 沿用已有依赖,保持 UserService 的公开接口兼容。
- 测试覆盖命中、过期、淘汰顺序和并发行为,现有相关测试全部通过。
- 先阅读调用方和已有缓存约定,再给出修改点与验证方式。
失败时提供具体输入、实际结果和期望结果。比如,全局锁限制了并发,需要检查锁覆盖了哪些操作。LRU 命中会更新访问顺序,所以调整锁策略后也要验证顺序维护。反复失败时先核对假设,再缩小修改范围。
6.3 编码 Agent 为什么常用 grep 检索代码而不是 RAG?两者有什么区别?
考察重点
- 解释精确搜索和语义检索分别适合什么代码查找任务。
- 说明索引新鲜度、代码结构和多轮搜索怎样影响查找结果。
相关内容:代码库上下文。
参考回答
grep 能直接匹配函数名、类名和错误文本,适合代码中的精确查找,也省去了索引维护。
搜索读取当前磁盘文件,所以 Agent 改完代码就能搜到新内容。它可以先搜索、再读函数、继续沿调用关系搜索,只把当前需要的代码放进上下文。
基于语义检索的 RAG 可以按功能描述查找,适合大型仓库或命名不规范的代码。代价是切块会割断函数与类的结构,代码变化后也要同步索引。语义相似的代码仍需通过调用关系确认是否相关。因此,两种搜索可以结合,再配合 LSP 查询定义和引用。具体产品采用何种索引,应以公开实现为准。
6.4 怎样保证 AI 生成的代码质量?为什么 AI 生成的代码能跑但逻辑很差?
考察重点
- 解释生成代码为什么会遗漏约束、重复实现或降低可维护性。
- 说明任务约束、行为测试、自动检查和评审怎样共同保证质量。
参考回答
生成代码的质量要由行为测试、自动检查和人工评审共同验证,能运行只证明部分路径可用。
- 测试覆盖真实需求。 从输入输出和边界推导用例,检查并发、错误处理及兼容性,并审查断言是否被放宽。
- 自动检查发现机械错误。 运行类型检查、lint、静态分析和适用的安全扫描。
- 人工评审判断设计与副作用。 核对职责划分、已有能力复用、权限和数据变更,确认每处修改都能解释。
另一个模型可以帮助发现疑点,结论仍需代码或运行结果支持。
6.5 AI 一次生成大量代码或很长的技术方案时,人应该如何评审?
考察重点
- 根据变更的影响范围安排审查顺序,并拆分过大的改动。
- 区分自动检查、AI 辅助审查和人工判断各自能确认的事项。
相关内容:质量保障。
参考回答
评审应按需求和风险安排重点,并把过大的方案或代码拆成可解释的单元。
方案主要检查三个方面:
- 是否满足验收条件。
- 数据模型、接口、一致性和失败处理的取舍是否合理。
- 超出需求的复杂设计是否有必要。
代码按功能与依赖拆分,优先检查接口兼容、数据修改、权限和并发。格式与类型问题交给自动检查,AI 可以帮助梳理调用关系和提出疑点。每个结论都要有代码或运行证据,多个模型意见一致也需要验证。变更超出可审查范围时继续拆小,最终由人说明验证范围并对交付负责。