面灵AI→

华为 OD 技术二面:工厂模式、HTTP 与 Git

轮次
二面
时间
2026-09
来源
牛客网

《面试题目》

  1. 手撕:一道二维 DP 题(原帖记为 leetcode 1361),限时 30 分钟;可以先写 DFS 把思路跑通,再向面试官讲 DP 的状态定义与转移过程。
  2. 实习里用的工厂模式设计原理是什么?为什么能解决问题?你们的数据在这个工厂模式里是怎么走的?
  3. 抽象工厂了解过吗?能不能用在这个项目上?它和工厂模式有什么联系?
  4. 实习有没有遇到过安全问题?你预防过哪些安全问题?(编码安全、权限控制)
  5. 有没有接触过高可用?实习中遇到的高可用部分,数据恢复或备份机制是怎么做的?
  6. 实习用的哪个版本的 HTTP?HTTP 各版本的区别是什么?
  7. 日常了解过 AI 吗?了解过 harness 吗?harness 和 agent 的区别是什么?
  8. 代码管理用 gitee 还是 git?git 常用命令有哪些?git 冲突怎么处理?git 缓存是什么?

《参考解析》

工厂模式与抽象工厂:工厂方法解决的是「调用方不知道具体要 new 哪个实现类」的问题——把创建动作收敛到一个工厂里,调用方只依赖接口。判断它是否用得对,看两点:新增一种实现时是不是只改工厂一处(开闭原则),以及创建逻辑里有没有 if/else 分支堆叠。抽象工厂则是「一族产品」的工厂:当需要成套创建互相关联的对象(比如同一套 UI 组件、同一种存储引擎的 reader/writer/formatter),抽象工厂保证这套东西来自同一个家族。区别可以一句话概括:工厂方法管一个产品等级结构,抽象工厂管多个产品等级结构的组合;抽象工厂内部通常靠一组工厂方法实现。如果项目里只有单一产品、且没有多套家族实现,硬上抽象工厂就是过度设计——面试时敢把这一点说出来,比背定义更加分。

「数据在这个工厂模式里怎么走」:这是面试官在验证你是不是真的用过。答法是画一条链路:入口层拿到原始数据 → 按数据类型/来源匹配工厂 → 工厂返回对应的处理器实现 → 处理器做校验和转换 → 结果统一回写。要能说出扩展点在哪(新增数据源时加一个实现类 + 注册一行映射),以及工厂本身怎么拿到依赖(配置驱动还是注册表)。

HTTP 各版本区别:HTTP/1.0 一个请求一个连接,默认短连接;HTTP/1.1 默认长连接(Keep-Alive)、支持管道化但存在队头阻塞,增加了 Host 头、分块传输、更多缓存控制字段;HTTP/2 在 TCP 之上做二进制分帧与多路复用,同一个连接上并发跑多个流,头部用 HPACK 压缩,支持服务端推送与流优先级,但 TCP 层的队头阻塞仍未解决;HTTP/3 换到基于 UDP 的 QUIC,把流控和重传下沉到用户态,单个流丢包不再阻塞其它流,连接迁移(换网不断连)和 0-RTT 建连是它最实际的收益。回答时按「连接复用 → 多路复用 → 传输层替换」这条主线讲,比逐条背字段清楚。

harness 与 agent 的区别:agent 指具备「感知—决策—行动」循环、能自己调工具完成任务的智能体;harness 是承载它运行的那套外壳与基础设施,负责会话管理、工具注册与沙箱执行、上下文与记忆的注入、权限与审批、可观测性。可以用类比说:agent 是司机,harness 是车和交通规则。面试官追问插件机制时,重点是「插件即能力」——工具、模型、存储都以插件形式注册,运行时按需装卸,harness 只保留调度和约束,这样新增能力不需要动核心循环。

Git 冲突、缓存与安全预防:git stash 就是所谓的 git 缓存,把工作区未提交的改动暂存起来,切分支前用它避免污染;git stash pop 恢复,git stash list 查看,多份 stash 时用 stash@{n} 指定。冲突处理的标准流程是 git fetch + git rebase(或 merge)→ 手工解冲突 → git add → git rebase --continue;解冲突时先弄清两边的意图,别简单选一边了事,改完务必本地跑一遍构建和测试。安全问题按三个层面答:输入层做参数校验和转义(防 SQL 注入、XSS),权限层做鉴权与最小权限(接口级校验、数据行级隔离,不能只靠前端隐藏按钮),密钥层做配置隔离与脱敏日志(密钥进配置中心,禁止硬编码和打印)。线上高可用则从备份与恢复切入:定期全量 + 增量备份、异机存放、定期做恢复演练——没演练过的备份不算备份。