01 · 项目全景与面试开场
这一章解决面试的第一个问题:「介绍一下你这个项目」。 90% 的候选人在这里就丢分——因为他们在背功能列表,而面试官想听的是问题 → 方案 → 取舍。
一、先想清楚:面试官在听什么
一个 Agent 岗位面试官听到「我写了个 AI 编程助手」时,脑子里同时转着三个问题:
| 面试官的心理活动 | 他实际想验证 | 你要给的证据 |
|---|---|---|
| 「又是一个调 API 的?」 | 你有没有做过难的部分 | ReAct 收敛、并发编排、上下文压缩、权限模型 |
| 「他懂底层吗?」 | 你知不知道框架帮你藏了什么 | 手写 SSE 解析、手写 token 估算、手写压缩策略 |
| 「能干活吗?」 | 你能不能把复杂系统拆清楚 | 13 章分阶段落地、每章 spec + checklist + 单测 |
所以自我介绍的正确结构是 「我遇到了什么问题 → 我怎么解决的 → 我做了什么取舍」,而不是「我实现了 A、B、C、D」。
二、三档自我介绍(按时间背下来)
🕐 30 秒版(电梯陈述,用于 HR 面 / 开场)
我独立用 Go 手写了一个终端 AI 编程助手 MewCode,对标 Claude Code。 它不用任何 Agent 框架——ReAct 循环、工具系统、五层权限护栏、两层上下文压缩、MCP 协议接入、Skill/Hook/SubAgent 扩展机制,全部从零实现。 一共 13 个功能章节、1.7 万行 Go,每章都有设计文档和验收清单。 我最满意的两个设计是:工具执行的保序分批并发,和上下文的两层压缩 + 熔断——这两个是框架不会替你解决的问题。
为什么这么说:30 秒里塞进了「规模(1.7 万行)」「深度(五层权限、两层压缩)」「差异化(不用框架、手写)」「亮点(两个具体设计)」。面试官一定会顺着「两层压缩」追问。
🕔 3 分钟版(技术面主体介绍)
背景:我想真正搞明白 Agent 是什么。看 Claude Code 的文档和开源实现时,我发现框架把关键部分都藏起来了——你不知道循环怎么收敛、上下文什么时候爆、权限在哪一层拦。所以我决定用 Go 从零写一个:
架构分六层:协议层(
llm.Provider抽象 Anthropic/OpenAI 双协议)、循环层(ReAct 内核)、执行层(工具注册中心 + 五层权限引擎)、状态层(对话历史 + 两层压缩 + JSONL 存档 + 自动记忆)、扩展层(MCP / Skill / Hook / SubAgent)、交互层(Bubble Tea TUI)。三个我认为最有价值的设计:
第一,保序分批并发。模型一次可能请求 5 个工具。全串行太慢,全并发又不安全(写文件顺序不确定)。我的方案是扫描调用序列:连续的只读调用合并成一个并发批,遇到有副作用的调用单独串行执行,结果按原始顺序回灌。这样
read×3的耗时等于单个 read,而write → bash → read严格串行。第二,两层上下文压缩。工具结果占 token 的 80-90%,是上下文爆炸的主因。第一层在工具结果产生的瞬间动手:超过 50000 字节就落盘,对话里只留 2048 字节预览 + 文件路径 + 重读提示,并且冻结替换决策——同一个 tool_use_id 之后每轮回放的字符串逐字节一致,这样 Prompt Cache 才不会被打破。第二层是兜底:token 估算达到
上下文窗口 - 20000 - 13000时,发起一次 LLM 全量摘要(9 段固定结构),摘要后追加「恢复三段」(最近读过的文件快照 + 当前工具列表 + 边界提示),再从尾部保留 10000 token 的近期原文。第三,五层权限防御。黑名单(危险命令正则,bypass 模式也拦)→ 路径沙箱(禁止读写项目目录外)→ 三层规则引擎(本地/项目/用户,支持
Bash(git *)、Write(*.go)、mcp__github__*三种模式)→ 模式兜底(Default/AcceptEdits/Plan/Bypass 四档矩阵)→ 人在回路(TUI 三选一:允许本次/永久允许/拒绝)。每一层命中即短路。工程上,我用 Spec 驱动开发:每章先写
spec.md(功能需求编号 F1、F2…)、plan.md、task.md、checklist.md,再写代码,最后对照 checklist 逐项验收。并发路径跑go test -race。
🕙 10 分钟版(深挖版,用于「详细讲讲这个项目」)
3 分钟版之后,面试官已经选中了他感兴趣的点。这时应该按他的兴趣展开,而不是继续念稿。
推荐的展开地图:
如果面试官问「循环怎么转」 → 讲 §03 章:五类停止条件 + 历史一致性 + 取消传播
如果面试官问「工具安全吗」 → 讲 §05 章:五层权限 + 沙箱逃逸防护 + 人在回路
如果面试官问「上下文怎么办」 → 讲 §06 章:两层压缩 + 锚点估算 + 熔断 + PTL 重试
如果面试官问「怎么扩展」 → 讲 §08 章:MCP 配置驱动 + Skill 渐进式披露 + Hook 拦截
如果面试官问「多 Agent」 → 讲 §09 章:Fork + 上下文隔离 + 权限升级链 + 后台任务
如果面试官问「为什么 Go」 → 讲 §10 章:channel 事件流 + 单二进制 + 并发原语三、简历怎么写(STAR 变体:问题 - 方案 - 结果)
MewCode · 从零实现的终端 AI Coding Agent(个人项目 / Go / 1.7 万行)
GitHub: github.com/Bin-hy/EasyCoding
背景:框架(LangChain / Eino)把 Agent 的关键机制封装成黑盒,
无法验证「循环如何收敛、上下文何时爆炸、权限在哪一层拦截」。
实现(分 13 章迭代,Spec 驱动开发):
· Agent 内核:手写 ReAct 循环,5 类停止条件(自然完成/迭代上限/幻觉工具熔断/
用户取消/流出错),25 轮上限,连续 3 轮未知工具熔断;
工具执行采用「保序分批并发」——连续只读调用并发执行、有副作用调用串行,
结果按原始顺序回灌,兼顾延迟与确定性。
· 上下文工程:两层压缩策略。L1 工具结果预防性落盘(50KB 单条 / 200KB 聚合阈值),
替换决策冻结保证 Prompt Cache 逐字节稳定;L2 LLM 全量摘要(9 段结构 + 恢复三段
+ 近期原文保留),估算基于 provider 真实 usage 锚点,连续失败 3 次熔断;
支持 provider 撞墙(prompt_too_long)后的紧急压缩 + 自动重试。
· 安全护栏:五层权限防御(危险命令黑名单 → 路径沙箱 → 三层规则引擎 →
四档模式兜底 → 人在回路),支持 Bash(cmd) / Write(*.go) / mcp__* 模式匹配,
"永久允许"自动写入本地规则层。
· 扩展体系:MCP 客户端(stdio + Streamable HTTP 双传输,配置驱动零改码,
mcp__server__tool 命名空间隔离,单 server 失败不影响其他);
Skill 系统(Markdown + frontmatter,渐进式披露);Hook 引擎(11 个生命周期事件,
exit code 2 阻断);SubAgent(定义式 + Fork 式,上下文隔离,三层权限升级链)。
· 协议抽象:llm.Provider 接口屏蔽 Anthropic / OpenAI 差异,支持任意
OpenAI-compatible 端点;系统提示按模块 priority 装配并分离缓存通道。
结果:单二进制部署,115 个 Go 文件,go test -race 通过;
端到端可完成「读代码 → 分析 → 改多文件 → 跑测试 → 按报错修复」的多轮任务。写简历的三个技巧:
- 量化阈值:写「50KB / 200KB 阈值」「25 轮」「连续 3 轮熔断」比写「实现了上下文压缩」强 10 倍——数字证明你真的调过。
- 写取舍,不写功能:写「保序分批并发,兼顾延迟与确定性」而不是「实现了并发执行工具」。
- 主动暴露边界:可以在「结果」里加一句「当前未覆盖:工具 panic 兜底、跨进程断点续跑」——面试官会觉得你诚实且知道生产差距。
四、开场 90 秒的「钩子」设计
你需要在开场埋下 2-3 个「钩子」,让面试官顺着你准备充分的方向追问:
| 钩子话术 | 引导面试官问 | 你的准备 |
|---|---|---|
| 「工具结果占 token 的 80-90%,是上下文爆炸的主因」 | 「那你怎么优化上下文?」 | §06 章全套 |
| 「全并发有顺序问题,全串行太慢,我做了保序分批」 | 「具体怎么分批?怎么保证顺序?」 | §03 章 §3.3 |
| 「模型会幻觉出不存在的工具,我做了熔断」 | 「还有哪些异常路径?」 | §03 章 §3.5 |
| 「我刻意不用框架,因为框架藏了关键机制」 | 「你觉得框架帮你藏了什么?」 | §12 章企业级对照 |
| 「我用了 Spec 驱动开发,每章先写验收清单」 | 「你怎么保证质量?」 | §02 章工程化 |
⚠️ 不要埋你答不上来的钩子。如果你对「Prompt Cache 断点设计」只看过文档没实践过,就不要提;提了必被追问到崩。
五、什么时候说「不知道」
面试 Agent 岗位必然会遇到超出项目范围的问题,比如:
- 「你 Context Window 200K 是怎么算出来的?」(真实答案:按 provider 默认值)
- 「你的 token 估算误差有多大?」(真实答案:字符数 / 3.5,粗估,没做过误差标定)
- 「向量检索的召回率多少?」(项目里根本没有 RAG)
正确姿势:
「这块我项目里没有实现/没有做过标定。我的理解是……(给出方案思路)。如果要做,我会先……(最小验证路径)。」
比硬编答案强得多——面试官最怕的是候选人编。
六、本章速记卡
一句话定位 Go 手写的终端 Coding Agent,对标 Claude Code,不用框架
规模 13 章 / 115 个 Go 文件 / 1.78 万行
架构六层 协议 → 循环 → 执行 → 状态 → 扩展 → 交互
三个亮点 ① 保序分批并发 ② 两层上下文压缩 ③ 五层权限防御
工程方法 Spec 驱动(spec/plan/task/checklist)+ go test -race
埋钩子 上下文 80-90% 是工具结果 / 全并发有顺序问题 / 模型会幻觉工具
诚实边界 工具 panic 未兜底、token 估算未标定、无断点续跑