外观
面试准备库复盘 · 2026-10-31
结论:资料结构完整,知识笔记整体可靠,已经具备持续准备的基础。当前主要风险是少量边界表述不准、简历主张比实现证据宽,以及缺少口述、独立编码与运行验证记录。优先进入验证和表达阶段,再按暴露的问题补内容。
检查范围与证据
- 阅读准备区知识笔记、两版简历、逐条追问及项目材料;准备区共有 90 个 Markdown 文件,其中知识正文 48 篇。
- 检查准备区 Markdown 本地文件链接,未发现不存在的目标。未检查全部标题锚点及外部链接可达性;统计排除了
02-项目/项目/下的源码和旧材料。 - 静态核对 EinoTalk 在线注册与清理、SimulSpeak 模型纠错失败分支,以及三个项目前端 package.json;这不是对三个项目全部代码的审计。
- 从现有笔记提取 JavaScript 示例运行:复现 myNew 的原型边界差异;循环引用拷贝和并发池的基础用例符合预期。没有运行三个项目的服务、完整测试或性能测试。
- 所有 48 篇知识笔记均标为“未准备”,算法题单也均为初始状态。它们只说明仓库没有记录准备成果,不能据此判断本人实际掌握程度。
一、知识错误与未声明的实现边界
1. channel 表格:发送阻塞条件有误,应优先修正
位置:channel 与 select,发送行写着“满或无接收者时等待”。
该表把两种 channel 混在一起:有缓冲且有空位时,即使没有接收者,发送仍可以完成。
建议把未关闭 channel 的说明改成:
| 操作 | 无缓冲 | 有缓冲 |
|---|---|---|
| 发送 | 等待接收者就绪 | 缓冲满时等待,否则可发送 |
| 接收 | 等待发送者就绪 | 缓冲空时等待,否则可接收 |
nil、关闭后的发送与接收说明可保留。例子:ch := make(chan int, 1); ch <- 1 不需要同时存在接收者;第二次发送在没有消费时才会阻塞。
依据:Go 规范:发送语句。
2. const:普通声明规则漏了循环头特例,属于精确性问题
位置:作用域、闭包与 this,写着“const 声明时必须初始化”。
普通词法声明确实需要初始化表达式,但 for (const item of items)、for (const key in obj) 不写 = ...,由循环逐轮初始化绑定。现有表述适合作为普通声明的口诀,作为完整规则则不够准确。
建议:“普通 const 声明必须带初始化表达式;for…of/in 循环头由每轮迭代初始化绑定。const 限制绑定重赋值,不禁止修改对象内部属性。”
本次 Node 运行确认 for (const x of [1, 2]) 合法。依据:ECMAScript:for-in / for-of。
3. 手写 new:简化范围内仍有未声明的原型边界
位置:常见手写题,myNew 使用 !Ctor.prototype 和 Object.create(Ctor.prototype)。
对于普通函数 function C() { this.ok = true },把 C.prototype 设为 null 或数字后,原生 new C() 仍可构造,实例原型回退为对应 realm 的 Object.prototype。当前 myNew 两种情况都抛 TypeError,本次已复现。
这不意味着必须实现完整 new;笔记已经明确排除了 class、绑定构造器等。但还应选择一种处理:
- 补充约定“仅支持 prototype 为对象的普通构造函数”;或
- 在教学代码中对非对象 prototype 回退到 Object.prototype,并注明不覆盖跨 realm 等完整语义。
依据:ECMAScript:GetPrototypeFromConstructor。
二、项目和简历主张需要收紧
4. EinoTalk:节点所有权不等于连接所有权
位置:Go 全栈简历跨实例消息路由条目、后端项目笔记第 2 项。
两处将效果概括为避免旧连接误删新映射,但源码比较的是 nodeID:
- registry.go:Register 写入 nodeID,Unregister 传入同一 nodeID 执行比较删除。
- A 节点旧连接与 B 节点新连接可以据此区分。
- 同节点重连时,两代连接的 nodeID 相同,仅凭此 Lua 无法区分;完整流程是否另有保护,还需沿本地连接管理检查。
建议简历改为:“清理路由时通过 Lua 比较节点所有权,防止跨节点重连后旧节点误删新映射。”
简历逐条追问 Q19已经写出了同节点限制,说明详细答案比简历摘要准确。应统一摘要与答案的承诺范围。
5. SimulSpeak:“异常降级”需要指出具体分支
位置:Go 全栈简历分阶段翻译编排条目。
interpreter.go 的 runLLMRevision 中,模型调用报错后记录错误并直接返回,空文本也直接返回。不能由这条路径推出“LLM 失败后自动采用快翻完成终态与配音兜底”。
这次核对只能确认该分支没有执行上述补偿,不能据此断言整个系统所有异常处理都不存在。逐条追问 Q22已正确提醒这一限制。
建议将简历正文改为:“组织快翻草稿与模型上下文纠错的分阶段输出,按句子状态与结果优先级处理异步返回,通过配音协调器管理任务派发顺序。”只有核实具体错误路径后,再加入对应降级效果。
三、当前准备质量
| 维度 | 观察 | 判断 |
|---|---|---|
| 知识广度 | 48 篇覆盖前端、Go 与公共基础 | 足够支持下一阶段,不必继续平均扩张 |
| 知识准确性 | 多数笔记主动说明适用条件与版本 | 整体可靠,本次找到的主要是局部边界问题 |
| 项目证据 | 有真实源码入口,区分机制与实测结果 | 比纯背诵材料更容易展开追问 |
| 答案深度 | 多为一句话、原理、边界、追问结构 | 适合作为复习提纲,部分主题还需机制级讲解与输出题 |
| 简历一致性 | Go 全栈版有前端实习,前端版没有 | 若该经历属实且用于投递,前端版应优先纳入 |
| 岗位匹配 | 两个方向的 JD 表仍为空 | 缺少真实岗位要求来决定主次 |
| 算法 | Hot 100 分类与链接齐全,无实际题解记录 | 只能确认题单已建,无法确认独立解题能力 |
| 复习闭环 | 待解决问题、模拟面试与个人复盘仍为模板 | 还不能用仓库追踪“哪里不会、是否修好” |
| 导航维护 | 首页仍提醒选择项目、形成简历初稿 | 与已有三套项目材料及两版简历正文不同步 |
值得保留的准确表述包括:Pipeline 不等于事务;Lua 原子执行不等于持久化或自动回滚;MVCC 不消除一切幻读;Context 取消不等于强杀或等待退出;React 状态快照不等于简单“异步”;Next 客户端组件仍可能参与首屏预渲染。
Vite 版本差异也不是笔记错误:本地 EinoTalk 声明 Vite 5,SimulSpeak 声明 Vite 8;Vite 8 使用 Rolldown 的说明与官方发布文档相符。package.json 声明不能代替锁文件或实际安装结果,但这里区分版本的做法正确。
四、内容深度优先补哪里
以下是根据现有材料提出的补强方向,不表示现有概念结论错误,也不是必须全部新增文件。
- 实习权限体系:补一组实际角色、科室、页面和操作权限;讲清权限数据来源、登录初始化、角色切换与退出清理、按钮指令更新,以及服务端如何独立授权。现有 Vue 通用知识不能代替实习案例。
- 前端高频推导:给事件循环、闭包与 this、React 状态队列各补 2—3 个能独立解释的短例;Vue 重点推导依赖建立与清理、computed 缓存、watch 调度及异步失效。当前不少追问只有一句结论,继续深入会需要更多支撑。
- 网络基础:现有 TCP/HTTP 内容较浓缩。优先能讲清一次 HTTPS 请求中的 DNS、连接与证书验证、HTTP 语义;再结合项目解释 WebSocket 信令与 WebRTC 媒体的区别。
- Go 同步与数据库:能用具体例子说明锁/channel 建立的 happens-before,以及 RR 下快照读、锁定读和写入的差别;现有笔记结论谨慎,但还需要可推演的执行顺序。
- 可靠性案例:围绕现有项目追踪一次落库失败、跨节点重连、LLM 失败。分别说出当前行为、用户看到什么、允许的承诺与最小改进,而不是继续罗列中间件。
五、建议执行顺序与完成标准
| 顺序 | 行动 | 完成标准 |
|---|---|---|
| 1 | 修正本次列出的 5 处表述/边界 | 简历、项目摘要和详细答案不再互相扩大承诺 |
| 2 | 整理可投递版本 | 基本信息、到岗情况、技能均有实际内容;实习在两个方向中合理取舍;项目来源和工作范围统一 |
| 3 | 明确主投方向并采集实际 JD | 用数份目标岗位的要求给已有笔记排优先级,避免两条路线平均用力 |
| 4 | 录一次项目模拟面试 | 主项目能在 2 分钟内讲清,随后回答 3 层追问;记录原话、卡点、证据与改法 |
| 5 | 用最小范围验证项目 | 每个主项目选一条正常链路和一个失败/竞态场景,记录环境、步骤、预期及实际结果;不要求先跑完全部测试 |
| 6 | 开始记录独立编码 | 先覆盖哈希、双指针、滑窗、链表、树和二分的代表题;隔几天不看答案重写,再升级状态 |
建议将“理解了”用于能解释机制;“能口述或独立写”必须有实际输出依据。首页只列近期具体任务,复习表记录已暴露的问题,不必把全部材料一次性排满。
本次只新增复盘记录,未直接修改原笔记、简历或项目代码。