m佬腾讯TEG研发管理全栈开发一面
面试流程简述#
整体时间比较长,前面先做了一道手写题,后面主要围绕 Go 基础、项目、AI coding / agent 相关理解展开,最后有反问环节。岗位挂全栈,面试内容明显偏后端应用开发和 AI 工具工程化。
算法#
- 手写 LRU Cache。
- 追问:如果给 LRU 加过期时间怎么设计?
八股#
- goroutine 和线程的区别。
- GMP 模型。
- 本地队列挂在 P 还是 M?
- channel 的理解、常见使用场景。
- channel close 后的行为。
- defer 的用途和执行顺序。
项目 / 场景追问#
- 某网关项目里,如何把存量 API 适配成 MCP 调用形式?
- 为什么选择在网关层做协议转换?现成 SDK 的局限是什么?
- OAuth 相关鉴权流程怎么设计?
- 服务注册发现 / 配置管理怎么接?
- 高并发下网关怎么考虑扩展和治理?
- 大量调用失败时如何排查?
- skill 摘要索引 / 按需注入上下文怎么做?
- agent loop 为什么会死循环,怎么防护?
- 多 session 并发时如何避免上下文 / 记忆串扰?
- 长期记忆 / RAG 的基本理解和关键环节。
AI / 工程认知#
- 平时 AI coding 怎么用?
- AI 生成代码和人工 review 的关系。
- AI review AI 是否有效?
- 对 OpenClaw / OpenCode 一类工具的理解和使用感受。
反问#
- 部门业务方向。
- 团队当前在做的 AI + code 相关工作。
- 团队内部 AI coding 的使用方式和模型选择。
总体感受#
整体更像后端工程 + AI 工具方向的面试,项目会被追得比较细,尤其会看 Go 基础、项目真实性、工程化思考和 AI 工具理解。
参考答案(AI 生成)#
以下答案由 AI 生成,仅供面试复盘参考。
1. 手写 LRU Cache#
答:LRU 用哈希表 + 双向链表实现。哈希表负责 O(1) 定位节点,双向链表维护访问顺序;每次 Get 或 Put 命中节点时移动到链表头部,容量满时淘汰链表尾部节点。
2. LRU 加过期时间怎么设计?#
答:节点里增加 expireAt 字段,Get 时先判断是否过期,过期则从链表和哈希表中删除;Put 时写入新的过期时间。清理策略可以用惰性删除 + 后台定时清理,要求更高时可以额外维护小顶堆或时间轮按过期时间批量清理。
3. goroutine 和线程的区别#
答:线程是操作系统调度单位,创建和切换成本较高;goroutine 是 Go runtime 管理的轻量执行单元,初始栈小并可动态增长。大量 goroutine 会被调度到少量系统线程上执行,适合高并发 I/O 和大量并发任务。
4. GMP 模型,本地队列挂在 P 还是 M?#
答:G 是 goroutine,M 是系统线程,P 是调度器处理器。M 持有 P 才能执行 G,本地运行队列挂在 P 上;P 负责维护本地队列,也会从全局队列、netpoller 或其他 P 的队列中获取任务。
5. channel 的理解和使用场景#
答:channel 是 goroutine 之间通信和同步的机制。无缓冲 channel 适合强同步、任务交接、信号通知;有缓冲 channel 适合生产消费解耦、削峰、限流和 worker pool。
6. channel close 后的行为#
答:close 后继续接收会先读完缓冲区数据,缓冲区读完后继续接收会得到元素零值,ok=false。向已关闭 channel 发送会 panic,重复 close 也会 panic。通常由发送方负责 close。
7. defer 的用途和执行顺序#
答:defer 用于函数退出前的统一收尾,比如关闭文件、释放锁、回滚事务、恢复 panic、统计耗时。多个 defer 按后进先出执行,参数在注册 defer 时完成求值。
8. 存量 API 如何适配成 MCP 调用形式?#
答:核心是把 API 的能力抽象成 MCP tool。网关层读取 OpenAPI、内部接口描述或手工配置,生成 tool name、description、input schema,再把模型传入的结构化参数转换成 HTTP/gRPC 请求,调用后把响应统一封装成 MCP tool result。
9. 为什么在网关层做协议转换?#
答:网关层适合统一处理鉴权、限流、审计、协议转换、服务发现、错误码映射和可观测性。存量 API 可以通过网关集中暴露为 MCP tool,业务服务保留原有接口形态,接入成本更低,也方便统一治理。
10. OAuth 鉴权流程怎么设计?#
答:常见流程是用户跳转到授权服务完成登录和授权,授权服务回调并返回 code,网关或后端用 code 换 access token 和 refresh token。后续调用时网关校验 token、scope、audience 和过期时间,并把用户身份和权限上下文透传给下游服务。
11. 服务注册发现 / 配置管理怎么接?#
答:服务注册发现可以接 Consul、Etcd、Nacos 或 Kubernetes Service,网关按服务名发现实例并做负载均衡。配置管理可以接配置中心,支持动态刷新路由、限流规则、MCP tool 元数据、超时和熔断参数。
12. 高并发下网关怎么扩展和治理?#
答:网关本身保持无状态,依靠水平扩容承接流量;入口层做负载均衡,服务内做连接池、限流、熔断、超时、重试、隔离和降级。可观测性上记录请求量、错误率、P95/P99、下游耗时、重试次数和失败原因。
13. 大量调用失败时如何排查?#
答:先按维度拆分失败:接口、租户、模型、下游服务、地域、时间窗口。再看网关日志、trace、错误码、超时分布、下游健康状态、连接池、限流熔断命中、配置变更和发布记录。排查顺序可以从入口流量、网关处理、下游调用、外部依赖、最近变更推进。
14. skill 摘要索引 / 按需注入上下文怎么做?#
答:先为每个 skill 生成摘要、标签、触发词、输入输出和示例,并建立向量索引或关键词索引。用户请求进来后先检索候选 skill,再按相关性、权限、会话状态和 token 预算选择少量内容注入上下文,必要时只注入摘要,执行前再按需加载完整说明。
15. agent loop 为什么会死循环,怎么防护?#
答:常见原因是目标定义模糊、工具返回信息不足、模型反复选择同一工具、状态判断缺少停止条件。防护手段包括最大轮数、最大工具调用次数、重复动作检测、预算控制、失败次数阈值、明确 stop condition、人工确认和执行轨迹审计。
16. 多 session 并发时如何避免上下文 / 记忆串扰?#
答:核心是隔离。每个 session 使用独立的 conversation id、memory namespace、tool execution context 和权限上下文;长期记忆写入时带用户、租户、应用、来源和时间等元数据;检索时强制按身份和 namespace 过滤。
17. 长期记忆 / RAG 的基本理解和关键环节#
答:长期记忆负责沉淀用户偏好、项目事实和历史决策,RAG 负责从外部知识库召回相关内容增强回答。关键环节包括文档清洗、切分、embedding、向量检索、rerank、权限过滤、上下文拼装、引用溯源和效果评测。
18. AI coding 怎么用,AI 代码和人工 review 的关系#
答:AI coding 适合生成样板代码、补测试、读代码、解释报错、做重构草案和产出文档。人工 review 负责架构边界、业务语义、安全、性能、异常路径和可维护性判断。AI 可以提高产出速度,人工负责最终质量。
19. AI review AI 是否有效?#
答:有效性取决于审查目标和上下文质量。AI review 适合发现明显 bug、遗漏分支、风格问题、测试缺口和安全风险线索;关键业务代码仍要结合人工 review、自动化测试、静态扫描和线上观测形成闭环。
20. OpenClaw / OpenCode 一类工具怎么理解?#
答:这类工具的核心价值是把模型能力接进真实工程环境,让 AI 能读仓库、改代码、跑测试、调用工具和沉淀上下文。使用体验重点看模型能力、工具生态、权限控制、上下文管理、执行可观测性和失败恢复能力。