EasyCoding 面试深挖 · 项目入口
本页是本项目的入口页(属于「面试项目深挖」栏目)。先读本页建立全局认知与事实校正,再按下面的文档地图进入正文。
⚠️ 本项目最大的风险不是「项目不够好」,而是「简历和代码说的不一样」。动嘴之前先把本页第五节的事实校正表读完。
一、一句话定位
MewCode / EasyCoding 是一个用 Go 从零手写的终端 AI 编程助手(对标 Claude Code):单二进制、Anthropic + OpenAI 双协议、多轮 ReAct 闭环、五层权限防御、MCP 工具生态、两层上下文压缩、JSONL 会话存档 + 流式 TUI。
面试开场用它,一句话说清「是什么 / 多难 / 有什么」。
命名提醒:简历写 EasyCoding、仓库也叫 EasyCoding,但代码里的 module 名和二进制名是
mewcode,README 写 MewCode。面试官打开 GitHub 会疑惑,第一次提到时补一句:「项目英文名是 MewCode,仓库叫 EasyCoding。」
二、事实底盘(可背诵的硬数字)
| 维度 | 数值 | 出处 |
|---|---|---|
| 语言 / 模块 | Go 1.25.8,module mewcode | mewcode/go.mod |
| 代码规模 | 101 个非测试 Go 文件 / 14,082 行;17 个测试文件 / 3,902 行 | find + wc -l |
| 包结构 | 18 个 internal 包 + cmd/mewcode + cmd/smoke | mewcode/internal/ |
| 内置工具 | 6 个:read_file / write_file / edit_file / bash / glob / grep | tool.NewDefaultRegistry() |
| Agent 迭代上限 | 25 轮(不是简历写的 10 轮) | agent/agent.go:150 |
| 幻觉熔断 | 连续 3 轮整轮只请求未注册工具即停 | agent/agent.go:151 |
| 权限模式 | 4 档:Default / AcceptEdits / Plan / BypassPermissions | permission/mode.go |
| 危险命令黑名单 | 10 条正则,不可配置放开,Bypass 也拦 | permission/blacklist.go |
| MCP 命名空间 | mcp__<server>__<tool>(双下划线) | mcp/tool.go:adaptTool |
| 压缩触发阈值 | ContextWindow − 20000 − 13000 | compact/const.go |
| Token 估算系数 | 3.5 字符 / token(启发式,中文会低估) | compact/const.go |
| 测试 | go test ./... 全绿,但 7 个包无测试文件 | 见第五节软肋 1 |
完整 30+ 条数字底牌见 00-导读-项目速览与事实校正 第三节。
三、文档地图(本目录文件清单与用法)
| 文档 | 作用 | 建议用法 |
|---|---|---|
00-导读-项目速览与事实校正 | 项目定位 + 可背诵数字 + 简历与代码不一致的地方 + 项目软肋 | 第一遍精读,之后每天扫一遍校正表 |
01-项目口述稿-多版本 | 30 秒 / 1 分钟 / 3 分钟 / 8 分钟口述稿 | 大声朗读,掐表练 |
02-简历五大技术点拆解 | 简历 5 条逐条拆成「口述 + 原理 + 代码依据 + 备注」 | 主力背诵材料 |
03-面试题库-协议与Agent循环 | 多协议抽象 + ReAct 循环深挖题 | 面试前一天刷 |
04-面试题库-权限与安全 | 五层权限深挖题(字节最爱的安全题) | 重点刷,容易被追 3 层以上 |
05-面试题库-MCP与会话压缩 | MCP + 上下文压缩 + 持久化深挖题 | 重点刷 |
06-压力面-陷阱题与简历修正 | 简历被质疑、你不会的题、主动暴露的缺陷 | 一定要看,防翻车 |
07-白板手写题与反问收尾 | 可能的现场编码题 + 反问清单 | 面试当天早上看 |
08-口袋速背卡片 | 一页速背卡片 | 当天早晨看 |
每道题的格式固定为四段:① 面试官想听什么 → ② 口述答案(可直接背)→ ③ 备注讲解(为什么、代码在哪、数字多少)→ ④ 可能的追问。
四、推荐阅读顺序
| 时间 | 做什么 |
|---|---|
| 第 1 遍 | 00 精读(尤其第六节事实校正)→ 01 口述稿出声读到不卡壳 |
| 第 2 遍 | 02 简历五条逐条拆解(主力背诵材料)→ 04 权限与安全 |
| 面试前一天 | 03 + 05 题库 → 06 压力面 |
| 面试当天早上 | 07 白板与反问 + 08 速背卡片 |
| 如果只有时间准备两篇 | 04-面试题库-权限与安全 + 06-压力面-陷阱题与简历修正 |
面试时间分配(按 45 分钟一场):自我介绍 3–5 min → 面试官挑一个点深挖 15–20 min(大概率是权限或 ReAct 循环)→ 第二个点 10–15 min(大概率 MCP 或上下文压缩)→ 白板 5–10 min → 反问 5 min。
五、诚实边界(简历 ↔ 代码的 6 处校正 + 必须主动暴露的软肋)
5.1 事实校正表(改口,别被抓)
| # | 简历写的 | 代码真相 | 严重度 |
|---|---|---|---|
| 1 | 迭代上限 10 轮 | 25 轮(agent.go:150,连停止文案都写死 25);10 轮是早期数字,README 没同步 | 🔴 必须改 |
| 2 | MCP 命名空间 mcp<server><tool> | mcp__<server>__<tool>,双下划线是刻意的消歧设计(讲出来反而是加分点) | 🟡 建议改 |
| 3 | 「连续幻觉检测自动停止」 | 判定是 allUnknown:一整轮全部工具名都未注册才计一次,连 3 轮才停;中途试对一次就清零 | 🟡 说准 |
| 4 | 「五层权限防御」 | Engine.Check 只实现前四层,第五层「人在回路」由 agent 包编排(引擎负责判定,Agent 负责审批;包注释自己就这么写) | 🟡 说准 |
| 5 | 「从零手写」 | 「零」= 不依赖 Agent 框架(无 LangChain / Eino);协议层用官方 SDK、MCP 用 go-sdk、TUI 用 Bubbletea 是有意取舍 | 🔴 必须准备 |
| 6 | 30 天会话清理 / 实时 fsync | 都是真的,可以放心讲 | ✅ |
5.2 软肋(抢答,不要被挖)
- 🔴 7 个包没有测试文件,且恰好包含简历重点吹的
compact/session/llm——答法:坦诚 + 说清取舍失误 + 给出「纯函数优先」的具体补救计划。 - 🔴
bash能绕过文件沙箱:沙箱是参数级的,只解析文件类工具的 path,bash完全不生效;当前靠「默认判 Ask」兜底,用户配了全放行或切 Bypass 就失守。正解是下沉到进程级隔离(seccomp / landlock / sandbox-exec)。 - 🔴
mcp__server__*通配规则实际失效(extractTarget无 MCP 分支 → target 恒为空串;且规则语法不支持工具名通配)。一定要强调它是 fail-safe 的(匹配不上就不放行,继续弹窗),只影响可用性、不是安全漏洞。说这个 bug 是全场最强加分项之一。 - 🟡 后台 Agent 的 Skill 工具白名单因大小写不一致(
load_skillvsLoadSkill)形同虚设。 - 🟡 权限检查与工具执行之间存在 TOCTOU 窗口;单用户本地场景不算现实威胁,上多租户必须修(
openat+O_NOFOLLOW)。 - 🟡
compact的 token 估算是启发式的(3.5 字符/token),靠 13,000 余量 +ErrPromptTooLong紧急压缩兜底,且「锚点 + 增量」让误差不累积。 - 🟡
session恢复后并非立刻压缩,等下一轮 Agent Loop 才判定(效果等价)。 - 🟡
Conversation的两个Add方法按引用存切片,与深拷贝的读接口语义不一致(当前不触发 bug,但是隐患)。
➡️ 开始阅读:00-导读-项目速览与事实校正 | 返回栏目:面试项目深挖总览 | 同栏项目:Vistack · BinRag