Post

AI + 前端面试题整理(Unity 开发视角版)

基于 linux.do 论坛面经整理原帖地址:【面试拷打】面试了十几家 Agent 岗位,整理了面试题 总共 14 家公司,涵盖 AI Agent、前端、全栈等岗位 目标受众:以我个人视角触发从 Unity 开发转行 AI/前端/全栈的开发者 本文章由AI总结撰写AIGC 1. AI

先搞技术 阅读 13 点赞 0 评论 0

基于 linux.do 论坛面经整理原帖地址:面试拷打】面试了十几家 Agent 岗位,整理了面试题

总共 14 家公司,涵盖 AI Agent、前端、全栈等岗位

目标受众:以我个人视角触发从 Unity 开发转行 AI/前端/全栈的开发者

本文章由AI总结撰写AIGC


1. AI / Agent 架构类

1.1 LangChain / LangGraph 主要用了什么 AI 技术?

回答思路:

  • LangChain:核心是链式调用,把 LLM + 工具 + 记忆 + 检索串起来

  • LangGraph:核心是状态机 + 图结构,支持循环、条件分支、多节点协作

  • 关键技术:LLM 调用封装、Tool Calling、Memory 记忆管理、Retrieval 检索、Agent 决策循环

Unity 转行视角:

可以类比 Unity 的状态机(State Machine)和行为树(Behavior Tree)。LangChain 像线性的行为序列,LangGraph 像带条件分支的状态机/行为树。你在 Unity 里做过的 FSM、BT、AI 决策逻辑,本质上和 Agent 的决策循环是一回事——都是"感知→决策→行动→反馈"的循环。


1.2 什么是多 Agent?为什么需要多 Agent?

回答思路:

  • 多 Agent = 多个智能体分工协作,每个 Agent 有明确的角色和职责

  • 为什么需要:

    1. 职责分离:每个 Agent 专注一件事,质量更高(如代码 Agent、文档 Agent、测试 Agent)

    2. 并行处理:多个任务同时进行,提高效率

    3. 复杂度管理:复杂任务拆解后,单个 Agent 更容易控制

    4. 容错性:一个 Agent 失败不影响整体

Unity 转行视角:

类比 Unity 的组件化设计 + 多角色 AI 系统。比如你做过的游戏里,玩家、敌人、NPC 各有各的 AI 逻辑,互相通信协作——这就是多 Agent。或者类比设计模式中的职责链模式、中介者模式。你在 Unity 里拆模块、解耦的经验,完全可以迁移到多 Agent 架构设计上。


1.3 单个 Agent 也可以分配多个职能,为什么还要多 Agent?

回答思路:

  1. 上下文限制:单个 Agent 上下文窗口有限,装不下所有领域的知识

  2. Prompt 工程复杂度:单个 Agent 要处理所有场景,Prompt 会非常臃肿,效果下降

  3. 专业化:每个 Agent 可以针对特定领域优化(Prompt、工具、知识库)

  4. 可维护性:修改某个职能只需要改对应 Agent,不影响其他

  5. 并行能力:多 Agent 可以同时工作,单 Agent 只能串行

Unity 转行视角:

类比 Unity 的单一职责原则(SRP)。你不会把所有逻辑都写在一个 MonoBehaviour 里,对吧?同样的道理,你会拆成 PlayerController、EnemyAI、UIManager 等多个组件。多 Agent 就是把单一职责原则应用到 AI 系统上。


1.4 什么场景下需要多 Agent 架构?

回答思路:

  • 复杂任务拆解:如软件开发(需求→设计→编码→测试→部署)

  • 多领域知识:如医疗 + 法律 + 财务的综合咨询

  • 长流程工作流:如客服→技术支持→售后的流转

  • 多角色协作:如产品经理 + 开发 + 测试的模拟团队

  • 需要并行处理的任务

Unity 转行视角:

类比你做过的游戏开发流水线:策划出需求→美术出资源→程序写逻辑→测试找 Bug。每个角色就是一个 Agent,有自己的工具和职责。或者类比游戏中的团队 AI:坦克 + 输出 + 治疗的配合,每个角色 AI 不同,但目标一致。


1.5 通用 Agent 一般分几层功能?(以 Manus / Claude Code 为例)

回答思路: 通用 Agent 通常分这些层:

  1. 用户交互层:接收输入、展示输出(CLI / Web / IDE 插件)

  2. 规划层(Planner):拆解任务、制定计划、分解步骤

  3. 决策层(Executor):选择工具、调用工具、执行动作

  4. 记忆层(Memory):短期记忆(对话历史)、长期记忆(知识库)

  5. 工具层(Tools):代码执行、文件操作、浏览器、API 调用等

  6. 反思/验证层:检查结果、自我修正、错误恢复

Unity 转行视角:

类比 Unity 的游戏架构分层:UI 层(交互)→ 逻辑层(决策)→ 数据层(记忆)→ 引擎层(工具)。或者类比游戏 AI 的感知-决策-行动三层架构。你在 Unity 里做过的 AI 架构思维,理解 Agent 分层会非常快。


1.6 Claude Code 的核心循环流程?

回答思路:

  1. 接收用户任务

  2. 理解任务,制定计划

  3. 查看当前上下文(文件、代码、终端状态)

  4. 决策下一步动作(读文件 / 写代码 / 执行命令 / 提问)

  5. 执行动作,获取结果

  6. 反思结果是否正确,是否需要调整

  7. 循环 3-6,直到任务完成

  8. 总结输出

Unity 转行视角:

这就是一个标准的感知-决策-行动循环(Sense-Think-Act Loop),和游戏 AI 的 Update 循环一模一样!每帧感知环境状态→做出决策→执行动作→下一帧再感知。你在 Unity 里写过的 AI 状态机 Update 函数,本质上就是这个逻辑。


1.7 Claude Code 的上下文治理是怎么做的?

回答思路:

  • 文件按需加载:不是把所有文件都塞上下文,而是用到哪个读哪个

  • 摘要压缩:对已读文件/历史对话做摘要,保留关键信息

  • 工具结果过滤:命令输出只保留关键部分,截断冗余信息

  • 记忆分层:短期记忆(当前对话)+ 长期记忆(项目摘要、用户偏好)

  • 滑动窗口:只保留最近的 N 轮对话

Unity 转行视角:

类比 Unity 的内存管理和资源加载策略。你不会把所有资源都加载进内存,而是按需加载(Resources.Load / Addressables),不用的卸载掉。上下文治理也是同样的思路——LLM 的上下文窗口就像显存/内存,要精打细算地用。


1.8 有没有构建过多智能体(Multi-Agent)架构?

回答思路:

  • 如果做过:说清楚架构(几个 Agent、各自职责、怎么通信、怎么协调)

  • 如果没做过:说清楚你的理解 + 学习过的方案 + 自己设计的思路

Unity 转行视角(如果没实际做过):

可以说:"虽然我在 AI 领域还没实际落地过多 Agent,但我在 Unity 游戏开发中有大量多角色 AI 协作系统的开发经验。比如我做过的 XX 系统中,有 N 种不同角色的 AI,它们通过事件系统/黑板(Blackboard)共享信息,通过状态机各自决策。我理解多 Agent 架构本质上是同样的思路,只是把决策主体换成了 LLM。如果让我设计,我会借鉴游戏 AI 中的黑板模式、仲裁者模式来设计多 Agent 的协作机制。"


1.9 MCP、Function、Skills 三者的区别?

回答思路:

  • Function Calling(函数调用):最基础的,LLM 调用单个函数/工具,是原子能力

  • Skills(技能):比 Function 更高一层,是一组相关功能的集合,有自己的逻辑和状态,类似"技能包"

  • MCP(Model Context Protocol):更高级的协议/标准,定义了模型如何与外部工具、数据源交互的规范,是跨平台的工具接入标准

简单说:Function → 单个工具;Skills → 工具包;MCP → 工具接入的标准协议

Unity 转行视角:

类比 Unity 的概念:

  • Function Calling = 单个方法调用(如 player.Jump()

  • Skills = 一个组件/脚本,包含一组相关方法(如 CombatSystem.cs 里有攻击、防御、技能释放等)

  • MCP = 一种接口规范/插件协议(类似 Unity 的 Package Manager 规范,或者 Editor 扩展协议),定义了第三方能力怎么接入系统


1.10 你自己的 AI 开发工作流程是怎么样的?

回答思路: 说清楚你平时怎么用 AI 写代码/做项目:

  1. 需求理解:先把需求拆清楚,明确目标

  2. 方案设计:让 AI 帮你出技术方案、架构设计

  3. 代码生成:分模块让 AI 写代码,边写边 review

  4. 调试优化:出问题了把错误信息扔给 AI,一起排查

  5. 测试重构:让 AI 写测试用例、帮忙重构

  6. 文档输出:让 AI 补注释、写文档

Unity 转行视角:

可以结合你做 Unity 开发的流程来说:"我做 Unity 开发时,习惯先搭框架、再填细节。用 AI 也是类似的思路——先让 AI 帮我搭整体架构(就像搭游戏框架),然后逐个模块填充实现。比如我会先让 AI 定义接口和数据结构,再实现具体逻辑,最后让 AI 帮我写单元测试。我觉得 AI 就像一个初级开发者,你得把任务拆清楚,它才能干好。"


2. RAG / 知识库类

2.1 简单介绍一下 RAG 的流程?

回答思路: RAG = Retrieval-Augmented Generation(检索增强生成)

离线流程(建库):

  1. 文档加载(PDF、Word、网页等)

  2. 文档切分(按段落、按 token 数)

  3. 向量化(用 Embedding 模型转成向量)

  4. 存入向量数据库

在线流程(查询):

  1. 用户提问

  2. 问题向量化

  3. 向量库检索(相似度匹配)

  4. 召回相关文档片段

  5. 把问题 + 召回片段拼成 Prompt

  6. 交给 LLM 生成回答

Unity 转行视角:

类比游戏中的资源查找 + 动态加载。建库过程就像你把游戏资源打包、建立资源索引;查询过程就像根据资源 ID 去 AssetBundle 里找资源,加载出来给游戏用。或者类比寻路系统——问题是起点,答案是终点,向量库是导航网格,检索就是找路径。


2.2 怎么加速 RAG 的检索过程?有啥策略?

回答思路:

  1. 索引优化:选择合适的索引算法(HNSW、IVF 等)

  2. 向量降维:用更低维度的 Embedding 模型

  3. 分层检索:先粗筛(关键词/标签),再精排(向量)

  4. 缓存:热门问题缓存结果

  5. 预计算:常见问题的向量预计算好

  6. 分片/分布式:数据量大时分片存储,并行检索

  7. 混合检索:关键词检索 + 向量检索结合,互相补充

Unity 转行视角:

这和游戏里的性能优化思路一模一样!比如:

  • 分层检索 = 游戏中的 LOD(细节层次)技术,远看低模,近看高模

  • 缓存 = Unity 的对象池(Object Pooling),频繁用的东西不销毁

  • 预计算 = 烘焙光照、烘焙寻路网格,运行时直接用

  • 分片 = 场景流式加载,只加载当前需要的部分


2.3 向量库使用的是啥?选型依据?

回答思路: 常见向量库:Milvus、Pinecone、Chroma、FAISS、Weaviate、pgvector

选型考虑因素:

  1. 数据规模:小数据量用 FAISS/Chroma,大规模用 Milvus/Pinecone

  2. 部署方式:SaaS 还是自建

  3. 性能要求:检索速度、并发量

  4. 功能需求:是否需要过滤、混合检索、实时更新

  5. 团队技术栈:是否容易集成

Unity 转行视角:

选型思路和你选游戏数据库/存储方案是一样的。比如选 SQLite 还是 PlayerPrefs 还是服务器数据库——看数据量、看性能要求、看团队会不会用。你在 Unity 里做技术选型的方法论完全适用。


2.4 向量库目前的数据量?

回答思路:

  • 根据实际情况说,比如"几十万条向量,大概 XX GB"

  • 如果没做过,就说你了解的量级和处理方式

Unity 转行视角:

可以类比游戏资源量的概念。比如"我之前做 Unity 项目时,管理过上万的资源文件,做过资源打包和加载优化。向量库的数据管理思路类似,都是索引 + 存储 + 快速检索。我理解几十万条向量属于中等规模,用 Milvus 单机就能扛。"


2.5 怎么确认召回的数据准确性?(政策文件场景)

回答思路:

  1. 人工审核:关键文档入库前人工审核

  2. 来源标注:每个回答都标注来源文档,可追溯

  3. 多文档交叉验证:同一个问题从多个文档召回,互相印证

  4. 置信度评分:给召回结果打相似度分数,低于阈值的不采用

  5. 引用片段展示:把原文片段展示给用户,让用户自己判断

  6. 拒答机制:召回不到相关内容就说"我不知道",不瞎编

Unity 转行视角:

类比游戏中的作弊检测/数据校验。比如你做游戏时,会校验玩家数据是否合法、操作是否在合理范围内。RAG 的准确性校验也是类似的思路——多重校验、可追溯、异常情况兜底。


2.6 上下文压缩的策略是什么?压缩质量有问题怎么解决?

回答思路: 常用策略:

  1. LLM 摘要:让大模型把长文本压缩成摘要

  2. 提取关键信息:只保留和问题相关的句子/段落

  3. 滑动窗口:按窗口切分,每个窗口单独处理

  4. 分层摘要:先做段落摘要,再做章节摘要,最后全文摘要

压缩质量问题的解决:

  1. 用更强的模型做压缩(如用 GPT-4 压缩,给弱模型用)

  2. 增加压缩后的质量校验(让另一个模型检查摘要是否准确)

  3. 保留原文引用,压缩错了可以回溯

  4. 关键信息不压缩,只压缩次要内容

  5. 人工审核 + Prompt 优化

Unity 转行视角:

类比游戏中的资源压缩。纹理压缩、模型减面、音频压缩——都是在尽量保持质量的前提下减小体积。上下文压缩也是同样的思路:平衡质量和体积。压缩质量出问题了怎么办?就像纹理压缩糊了,你会换更高质量的压缩格式,或者关键纹理不压缩。


2.7 文档、PDF、课件是如何切分、入库、人工审核的?

回答思路: 切分:

  • 按语义切分(段落、章节),不是硬切

  • 控制每块的大小(如 500-1000 token)

  • 保留上下文重叠(overlap),避免信息断裂

入库:

  • 解析不同格式(PDF 用 PyMuPDF,Word 用 python-docx)

  • 提取文本 + 元数据(标题、作者、时间)

  • 向量化后存入向量库

人工审核:

  • 第一道:入库前审核文档质量(是否有效、是否最新)

  • 第二道:入库后抽检召回效果,调整切分策略

Unity 转行视角:

这就像游戏的资源导入流水线:美术出图→程序导入 Unity→设置导入参数(压缩格式、Mipmap 等)→质检审核。文档切分就像你把大模型切成 LOD,入库就像资源打包进 AssetBundle,人工审核就像 QA 验收资源质量。


2.8 Elasticsearch + 向量库怎么做混合检索?

回答思路: 整体流程:

  1. 用户输入查询

  2. ES 关键词检索:用 BM25 算法做全文检索,召回相关文档

  3. 向量库语义检索:用 Embedding 做相似度检索,召回语义相关文档

  4. 结果融合:把两路结果合并,去重

  5. 重排序(Re-rank):用重排序模型对融合后的结果重新排序

  6. 返回 Top N 给 LLM

为什么要混合:

  • 关键词检索:精确匹配好,但同义词、语义理解差

  • 向量检索:语义理解好,但精确匹配差,可能漏关键词

  • 两者互补,效果更好

Unity 转行视角:

类比游戏中的多条件筛选。比如你找敌人,既要按距离筛选(空间检索),又要按类型筛选(标签检索),最后综合排序。混合检索就是把多种检索方式的结果融合起来,得到更准确的结果。


2.9 混合检索已经做过分组、排序、去重,为什么还需要 Re-rank?

回答思路:

  1. 粗排 vs 精排:前面的排序是粗排(基于关键词分数/向量相似度),Re-rank 是精排(用更强大的模型做深度语义匹配)

  2. 相关性更准:Re-rank 模型(如 BGE-Reranker)能更好地理解 query 和文档的语义相关性

  3. 融合不同维度:把关键词分数、向量相似度、文档质量等多个维度综合打分

  4. 业务规则注入:可以在 Re-rank 阶段加入业务规则(如时效性、权威性)

Unity 转行视角:

类比游戏中的两阶段碰撞检测:第一阶段用 AABB/球体做粗检测,快速排除不相交的;第二阶段用精确的网格/凸包做精检测。混合检索的粗排就是第一阶段,快速召回候选集;Re-rank 就是第二阶段,精确排序。


2.10 什么是查询改写?作用是什么?

回答思路: 查询改写(Query Rewriting):把用户的原始问题改写成更适合检索的形式。

常见方式:

  1. 补全:把省略的信息补全(如"它怎么样?"→"XX产品怎么样?")

  2. 拆分:把复杂问题拆成多个子问题

  3. 优化表述:把口语化问题改成更规范的表述

  4. 扩展同义词:加入相关词汇,提高召回率

作用:

  • 提高召回准确率

  • 处理用户表述不规范的情况

  • 支持多轮对话的上下文理解

Unity 转行视角:

类比游戏中的输入处理层。玩家的输入是原始的(按键、摇杆),你要转换成游戏能理解的指令(移动、攻击、跳跃)。查询改写也是一样——把用户的自然语言输入,转换成检索系统能更好理解的查询形式。


3. 大模型 / Prompt 工程类

3.1 大模型的选型逻辑?

回答思路: 选型考虑因素:

  1. 效果:能力是否满足需求(推理、代码、中文等)

  2. 成本:Token 价格、调用费用

  3. 速度:响应速度是否满足业务

  4. 合规性:数据是否可以出域、是否支持私有化部署

  5. 稳定性:API 可用性、SLA

  6. 生态:工具链、文档、社区支持

Unity 转行视角:

就像你选游戏引擎/第三方插件——看功能够不够、价格能不能接受、性能行不行、文档全不全、社区活不活跃。你在 Unity 生态里选插件的思路,完全可以迁移到大模型选型上。


3.2 AI 输出如何保证序列化/结构化?为什么选 Markdown 而不是 JSON?

回答思路: 保证结构化的方法:

  1. Prompt 里明确要求输出格式

  2. 用 Function Calling 强制输出 JSON Schema

  3. 后处理校验,格式不对就让模型重写

  4. 用结构化输出模型(如 GPT-4o 的 JSON mode)

为什么选 Markdown 而不是 JSON:

  • Markdown 人类可读性更好,用户直接就能看

  • Markdown 对 LLM 更友好,生成质量更高

  • JSON 容易语法错误,Markdown 容错性好

  • 如果是给人看的场景,Markdown 更合适;如果是给程序用的,JSON 更合适

Unity 转行视角:

类比游戏中的数据格式选择。比如你做配置表,是用 JSON 还是 Excel?给程序读的用 JSON,给策划看的用 Excel。Markdown 就像 Excel——人看着方便;JSON 就像序列化数据——程序用着方便。看场景选。


3.3 Prompt 提示词怎么写?你会怎么撰写需求交给 AI?

回答思路: 好的 Prompt 包含这些要素:

  1. 角色设定:告诉 AI 它是谁(如"你是一个资深前端工程师")

  2. 任务描述:清楚说明要做什么

  3. 背景信息:提供必要的上下文

  4. 输出要求:格式、长度、风格等

  5. 示例:给几个例子(Few-shot)

撰写需求给 AI 的思路:

  • 拆分成小任务,不要一次扔一个大需求

  • 先搭框架,再填细节

  • 给 AI 反馈,迭代优化

  • 重要的地方强调、重复

Unity 转行视角:

这就像你给初级开发者/实习生派活——你得说清楚背景、目标、要求、验收标准,不能只说"做个登录功能"。写 Prompt 也是一样,越清晰、越具体,AI 产出的质量越高。你带过人的话,写 Prompt 会很有感觉。


3.4 大模型有没有做过微调?是接入 API 还是私有化部署?

回答思路:

  • 如果做过:说清楚场景、数据量、微调方法(LoRA、全量微调)、效果提升

  • 如果没做过:说清楚你了解的方案,以及什么时候该用微调

什么时候需要微调:

  • 需要学习特定领域知识(但 RAG 可能更划算)

  • 需要特定的输出风格/格式

  • 需要降低 Prompt 长度,节省成本

  • API 调用速度不够,需要本地化部署

Unity 转行视角:

类比游戏中的定制化开发。用 API 就像用第三方插件,开箱即用;微调就像你改插件源码,适配自己的需求,但成本更高。私有化部署就像你把引擎源码买下来,自己编译部署,完全可控但成本最高。


3.5 有没有考虑过怎么节约 AI 成本?做了哪些优化?

回答思路: 常见成本优化方案:

  1. 选型优化:用小模型处理简单任务,大模型处理复杂任务(路由策略)

  2. Prompt 优化:精简 Prompt,去掉冗余内容

  3. 缓存:相同/相似问题直接返回缓存结果

  4. 上下文压缩:减少输入 token 数

  5. 批量处理:把多个请求合并成一个

  6. 流式输出 + 提前终止:不需要完整输出时提前停

  7. 降级策略:高峰期用便宜的模型

Unity 转行视角:

这和游戏性能优化/资源优化的思路一模一样!

  • 分级处理 = LOD 技术,简单场景用低模,复杂场景用高模

  • 缓存 = 对象池,复用不用销毁重建

  • 上下文压缩 = 纹理压缩,在可接受质量下减小体积

  • 批量处理 = Draw Call Batching,合并渲染批次


3.6 Token 消耗量大概多少?AI 投入前后的收益?

回答思路:

  • 根据实际情况说量级(如"每天几十万 token,每月 XX 美元")

  • 收益:效率提升百分比、人力节省、新业务机会等

  • 如果没实际数据,说你了解的行业平均水平

Unity 转行视角:

可以类比游戏的性能预算。比如你做游戏时,会给每帧分配多少 CPU 时间、多少显存。Token 消耗也是一种预算——你要算清楚每个功能花多少 token,整体预算多少,ROI 怎么样。这和你做游戏性能预算的思路是通的。


3.7 有没有做过国内外 AI 工具或模型的对比?

回答思路: 说几个主流的对比维度:

  • 国外:GPT-4o、Claude 3.5、Gemini——能力强、贵、可能有合规问题

  • 国内:通义千问、文心一言、DeepSeek、智谱——中文好、便宜、合规

  • 对比维度:推理能力、代码能力、中文理解、长文本、价格、速度、稳定性

Unity 转行视角:

就像你对比不同的游戏引擎/中间件——各有优劣,看场景选。比如做手游选 Unity,做 3A 选 Unreal;做简单 2D 选 Cocos。模型选型也是一样,没有最好的,只有最合适的。


4. 前端基础 - CSS / 动画

4.1 CSS3 你用得比较多的有哪些?

回答思路:

  • 布局:Flexbox、Grid

  • 动画:transition、animation、transform

  • 视觉效果:渐变(gradient)、阴影(box-shadow)、圆角(border-radius)

  • 选择器:伪类、伪元素

  • 响应式:媒体查询(media query)

Unity 转行视角:

可以说:"虽然我之前主要做 Unity,但 CSS 的很多概念和 Unity 的 UGUI/UI Toolkit 是相通的。比如 Flexbox 就像 Unity 的 Horizontal/Vertical Layout Group,都是自动布局。Transform 就像 GameObject 的 Transform,都是位移、旋转、缩放。动画系统也类似,都是关键帧动画的思路。我理解 CSS 的核心概念很快,因为底层原理是相通的。"


4.2 CSS 动画和 JS 动画有什么区别?

回答思路:

维度

CSS 动画

JS 动画

性能

更好,浏览器优化过(走 GPU)

差一些,JS 线程执行

复杂度

简单动画,控制有限

复杂动画,控制灵活

交互性

差,不能中途精确控制

好,可以随时暂停、倒放、修改

兼容性

一般

适用场景

过渡、简单循环动画

复杂路径、物理效果、游戏动画

Unity 转行视角:

类比 Unity 的动画系统

  • CSS 动画 = 动画状态机(Animator),提前做好状态和过渡,运行时自动播放

  • JS 动画 = 代码控制的动画(DOTween、iTween),灵活但需要自己写逻辑 性能上也是 CSS 动画更好,因为浏览器做了优化,就像 Unity 的 Animator 是引擎层面优化过的。


4.3 Canvas 有没有用过?做过什么场景?

回答思路:

  • 2D Canvas:画图、图表、游戏、特效

  • WebGL:3D 渲染、复杂可视化

Unity 转行视角(这是你的优势!):

这是你的强项!可以说:"我之前做 Unity 开发,对图形渲染、Canvas 概念非常熟悉。Unity 里的 Canvas 系统我用了很多年,包括 UGUI 的 Canvas 渲染模式、Canvas 合批优化等。Web 端的 Canvas 虽然 API 不同,但底层的渲染原理是一样的——都是逐帧绘制、状态机管理。我做过 XX(比如 2D 游戏、数据可视化、特效系统),如果做 Web Canvas 开发,我能很快上手。"


4.4 红包/福袋动画是怎么做的?

回答思路:

  • 简单的:用 CSS 动画 + 图片序列帧

  • 复杂的:用 Canvas 绘制,或者用 Lottie 动画

  • 打开动作:可以是图片切换,也可以是 Canvas 绘制

  • 抖动、浮动、缩放:CSS transform + animation

Unity 转行视角:

这就像游戏里的UI 特效/弹窗动画。你在 Unity 里做过的奖励弹窗、宝箱打开动画,思路完全一样——都是缩放、抖动、粒子特效的组合。Web 端只是实现工具从 UGUI + 粒子系统变成了 CSS + Canvas。


5. 前端基础 - JS / ES6

5.1 ES6 有哪些常用特性?

回答思路:

  • 变量声明:let、const

  • 函数:箭头函数、默认参数、剩余参数

  • 字符串:模板字符串

  • 对象/数组:解构赋值、扩展运算符

  • 异步:Promise、async/await

  • 类:class 语法

  • 模块化:import/export

  • 数据结构:Map、Set、Symbol

  • 迭代器:for...of

Unity 转行视角:

很多概念和 C# 是对应的:

  • let/const = C# 的 var/readonly

  • 箭头函数 = Lambda 表达式

  • Promise = Task/异步编程

  • class = C# 的 class(只是 JS 是原型链)

  • Map/Set = Dictionary/HashSet 你有 C# 基础,学 ES6 会非常快,因为很多概念都是相通的。


5.2 什么是柯里化函数?

回答思路:

  • 柯里化(Currying):把一个多参数函数转换成一系列单参数函数的技术

  • 例子:add(a, b, c)add(a)(b)(c)

  • 作用:参数复用、提前返回、延迟计算

Unity 转行视角:

类比 C# 中的闭包和委托链。或者类比方法的部分应用(Partial Application)——你先传一部分参数,得到一个新函数,再传剩下的参数。你在 Unity 里写过的闭包、回调函数,本质上就是类似的思路。


5.3 ES5 和 ES6 构造函数分别怎么写?

回答思路:

  • ES5:用 function + prototype

    function Person(name) {
      this.name = name;
    }
    Person.prototype.say = function() { ... }
  • ES6:用 class 语法糖

    class Person {
      constructor(name) { this.name = name; }
      say() { ... }
    }

Unity 转行视角:

ES6 的 class 语法就和 C# 的 class 很像了,你会很熟悉。ES5 的原型链写法可能一开始不太习惯,但本质上都是面向对象,只是实现方式不同——C# 是类式继承,JS 是原型继承。


5.4 Promise、扩展运算符、箭头函数了解吗?

回答思路:

  • Promise:异步编程解决方案,有 pending/fulfilled/rejected 三种状态,支持链式调用

  • 扩展运算符(...):把数组/对象展开成单个元素,用于数组合并、对象拷贝、函数参数

  • 箭头函数:简写函数,没有自己的 this,继承外层的 this

Unity 转行视角:

  • Promise = C# 的 Task + async/await,都是处理异步的

  • 扩展运算符 = 类似 C# 的 params 或者集合展开

  • 箭头函数 = C# 的 Lambda 表达式,都是简写匿名函数


6. 前端框架 - Vue / React

6.1 Vue 和 React 核心区别是什么?

回答思路:

维度

Vue

React

设计理念

渐进式、易用优先

函数式、灵活优先

模板写法

模板语法(HTML-like)

JSX(JS 里写 HTML)

响应式

数据劫持(Proxy/Object.defineProperty)

不可变数据 + setState

学习曲线

平缓

稍陡

状态管理

Pinia/Vuex

Redux/Zustand

Unity 转行视角:

类比 Unity 中的两种开发风格

  • Vue 像 Unity 的可视化编辑器 + 组件式开发,上手快,约定大于配置

  • React 像纯代码驱动的开发方式,更灵活,更考验架构能力 你有 Unity 组件化开发的经验,理解这两个框架的核心思想会很快——都是组件化、数据驱动,只是实现方式不同。


6.2 Vue 2 和 Vue 3 的区别是什么?

回答思路:

  1. 响应式原理:Vue2 用 Object.defineProperty,Vue3 用 Proxy

  2. API 风格:Vue2 选项式 API,Vue3 组合式 API(Composition API)

  3. 性能:Vue3 更快,体积更小

  4. TypeScript:Vue3 对 TS 支持更好

  5. 新特性:Teleport、Suspense、Fragment 等

Unity 转行视角:

就像 Unity 版本升级——从 Unity 5 到 Unity 202X,底层引擎改进了,API 更现代化了,性能更好了。组合式 API 就像 Unity 的模块化开发,把相关逻辑放在一起,而不是按类型分散。


6.3 Vue 2 响应式原理是什么?Vue 3 呢?

回答思路:

  • Vue 2:用 Object.defineProperty 劫持对象属性的 getter/setter,数据变化时通知依赖更新

    • 缺点:不能监听对象新增/删除属性、不能监听数组下标变化

  • Vue 3:用 Proxy 代理整个对象,可以拦截更多操作(新增、删除、数组等)

    • 优点:更全面的拦截、性能更好、支持 Map/Set 等

Unity 转行视角:

类比 Unity 中的属性系统。比如你写一个属性,在 setter 里触发事件通知 UI 更新——这就是数据劫持的思路。Vue2 的 Object.defineProperty 就像你只能拦截已有的属性;Vue3 的 Proxy 就像你给整个对象套了一层包装,什么操作都能拦截到。


6.4 Object.defineProperty 和 Proxy 有什么区别?

回答思路:

维度

Object.defineProperty

Proxy

拦截对象

单个属性

整个对象

拦截操作

只有 get/set

get/set/has/deleteProperty 等 13 种

数组

不能原生监听下标

可以原生监听

新增属性

监听不到

可以监听

性能

-

更好(批量处理)

兼容性

IE9+

不支持 IE

Unity 转行视角:

类比 Unity 中的两种监听方式

  • Object.defineProperty = 你给每个字段单独写属性,每个属性里触发事件

  • Proxy = 你用一个通用的包装类,把所有操作都拦截了,统一处理 后者更灵活、更强大,但需要更高版本的运行时支持。


6.5 Vue 2 里数组/对象变更为什么可能不触发视图更新?

回答思路:

  • 对象:Object.defineProperty 只能拦截已有的属性,新增的属性没有被劫持

  • 数组:Object.defineProperty 不能监听数组下标变化,也不能监听 length 变化

  • Vue2 的解决方案:

    • 对象:this.$set(obj, 'key', value)

    • 数组:重写了 7 个数组方法(push、pop、shift、unshift、splice、sort、reverse)

Unity 转行视角:

就像你在 Unity 里做数据绑定——如果你只监听了特定字段的变化,那新增的字段当然不会触发更新。要解决的话,要么用更通用的监听方式(比如 Proxy),要么提供专门的 API 来手动触发更新(就像 $set)。


6.6 Vue 3 在性能上做了哪些优化?

回答思路:

  1. 响应式优化:Proxy 比 Object.defineProperty 更快

  2. 编译优化

    • 静态节点提升(hoistStatic):不变的节点只创建一次

    • 补丁标记(PatchFlags):更新时只更新动态部分

    • 缓存事件处理函数(cacheHandlers)

  3. 体积优化:Tree-shaking 更好,按需引入

  4. Diff 算法优化:最长递增子序列算法

Unity 转行视角:

这些优化思路和游戏引擎优化一模一样!

  • 静态节点提升 = 静态批处理(Static Batching),不动的东西合并成一个

  • 补丁标记 = 脏标记(Dirty Flag)模式,只更新变化的部分

  • Tree-shaking = 代码裁剪,不用的功能不打进包 你有 Unity 性能优化经验,理解这些前端优化思路会非常快。


6.7 如果数据变了但是视图没变,可能是什么原因?

回答思路:

  1. Vue2 中新增了对象属性,没有用 $set

  2. 直接修改数组下标

  3. 响应式数据初始化时没有声明

  4. 用了 v-if 但 key 不对,组件复用了

  5. 异步更新,你在数据修改后立即读 DOM,还没更新

  6. 计算属性/侦听器的依赖没收集到

  7. 父组件传的 props 没响应式处理

Unity 转行视角:

就像游戏中"数据改了但 UI 没刷新"的问题——可能是没触发事件、可能是监听没注册上、可能是刷新时机不对。排查思路也是一样的:先确认数据真的改了吗?再确认事件触发了吗?再确认监听者收到了吗?


6.8 Vue 2 响应式原理,数组方法是如何重写拦截的?

回答思路:

  1. 创建一个新的原型对象,继承自 Array.prototype

  2. 在新原型上重写 7 个会改变数组的方法(push、pop、shift、unshift、splice、sort、reverse)

  3. 重写的方法里:先调用原生方法执行真实操作,然后通知视图更新

  4. 把数组实例的 proto 指向这个新原型(或者直接把方法挂到数组上)

Unity 转行视角:

这就是装饰器模式/代理模式的应用。就像你给 Unity 的某个组件加一层包装,在调用原方法前后插入自己的逻辑。比如你写一个自定义的 Transform 扩展,在 position 赋值时同时触发事件——思路是一样的。


6.9 Vue 2 中哪些数组方法无法被原生拦截?如何处理?

回答思路:

  • 无法原生拦截的:直接通过下标修改(arr[0] = xxx)、修改 length(arr.length = 0

  • 处理方式

    • this.$set(arr, index, value)arr.splice(index, 1, value)

    • 修改 length 用 arr.splice(newLength)

Unity 转行视角:

就像你封装一个集合类,只暴露特定的方法来修改数据,保证每次修改都能触发事件。直接下标访问就绕开了你的封装,所以监听不到。解决方案就是提供专门的 API 来做这些操作。


6.10 Vue3 Proxy 相比 Vue2 的优势?

回答思路:

  1. 可以监听对象新增/删除属性

  2. 可以原生监听数组变化

  3. 可以监听 Map、Set、WeakMap、WeakSet

  4. 性能更好(不需要遍历所有属性)

  5. 可以拦截更多操作(has、deleteProperty、ownKeys 等)

Unity 转行视角:

就像从"每个字段单独写属性"升级到"用一个通用的包装类拦截所有操作"。更强大、更灵活、代码更简洁。


6.11 Vue3 中的 WeakMap / 弱引用作用是什么?

回答思路:

  • WeakMap 的 key 必须是对象,而且是弱引用

  • 弱引用:如果 key 对象没有其他引用了,会被 GC 回收,不会造成内存泄漏

  • Vue3 用 WeakMap 存响应式数据的依赖:

    • key 是目标对象

    • value 是该对象的属性依赖 Map

  • 好处:对象销毁时,对应的依赖信息自动回收,不会内存泄漏

Unity 转行视角:

类比 Unity 中的弱引用(WeakReference)。比如你做一个对象池或者缓存,不想因为缓存导致对象无法销毁,就会用弱引用。Vue3 用 WeakMap 也是同样的思路——响应式系统不应该阻止对象被 GC。


7. 网络通信 - WebSocket / SSE

7.1 WebSocket 前端连接流程是什么?

回答思路:

  1. 创建 WebSocket 实例:new WebSocket(url)

  2. 浏览器发起 HTTP 握手请求(带 Upgrade 头)

  3. 服务器同意升级,返回 101 状态码

  4. 连接建立,变成全双工通信

  5. 监听 message 事件接收消息

  6. 用 send() 方法发送消息

  7. 关闭连接用 close()

Unity 转行视角:

这和 Unity 里的网络连接流程是一样的——建立连接→握手→收发消息→断开。比如你用 UNet、Mirror 或者 Photon,都是类似的流程。WebSocket 只是协议不同,但编程模型是相通的。


7.2 WebSocket 怎么监听消息?怎么和后端约定事件?

回答思路:

  • 监听消息:ws.onmessage = (event) => { ... }

  • 和后端约定事件:一般约定消息格式,比如:

    {
      "type": "chat_message",
      "data": { "content": "hello", "from": "user1" }
    }
  • 前端根据 type 分发到不同的处理函数

Unity 转行视角:

这就像游戏中的网络消息协议。你和后端约定好消息格式(消息ID + 消息体),前端收到后根据消息ID分发到不同的处理函数。和你在 Unity 里做网络同步的思路一模一样。


7.3 WebSocket 有没有做心跳/保活?断开后怎么重连?

回答思路: 心跳保活:

  • 前端定时发 ping 消息

  • 后端收到后回 pong

  • 如果一段时间没收到 pong,认为连接断了

断开重连:

  • 监听 close 事件,触发重连

  • 用指数退避策略(第一次等 1s,第二次 2s,第三次 4s...)

  • 重连成功后恢复状态(重新订阅、同步数据等)

Unity 转行视角:

这就是游戏网络编程的标准操作啊!心跳检测、断线重连、指数退避——你做过网游开发的话,这些概念肯定都熟。Web 端的 WebSocket 重连机制,和游戏客户端的重连逻辑几乎一模一样。


7.4 连接不上时怎么兜底?是否会降级成 HTTP 轮询?

回答思路:

  • 兜底方案:WebSocket 连不上时,降级成 HTTP 长轮询(long polling)

  • 长轮询:客户端发请求,服务器 hold 住,有消息就返回,没消息就超时后客户端再发

  • 轮询频率:根据业务场景调整,实时性要求高的频率高一些

  • 指数退避:连不上时,间隔逐渐增大,避免打爆服务器

Unity 转行视角:

就像游戏的网络降级策略——网速好的时候用 UDP 实时同步,网速差的时候降级成 TCP 或者降低同步频率。Web 端也是一样,WebSocket 是最优方案,不行就降级成轮询。


7.5 弱网情况下怎么提示用户?实时数据不准确时前端怎么做交互提示?

回答思路: 弱网提示:

  • 检测网络状态(navigator.onLine)

  • 检测请求超时/重连次数

  • 显示"网络不佳"的提示条

  • 弱网时降低刷新频率、减少数据量

实时数据不准确的交互:

  • 显示"数据同步中"的状态

  • 用灰色/半透明表示数据可能不是最新

  • 数据更新后给个视觉反馈(闪烁、高亮)

  • 允许用户手动刷新

Unity 转行视角:

这就像游戏中的网络延迟处理。延迟高的时候,你会显示"网络延迟高"的提示,会用预测/插值让画面看起来流畅,会告诉玩家数据可能有延迟。前端处理弱网的思路和游戏是一样的——提示用户、优雅降级、状态明确。


7.6 SSE 和 WebSocket 分别说说?区别是什么?

回答思路:

维度

SSE(Server-Sent Events)

WebSocket

通信方向

单向,服务器→客户端

双向,全双工

协议

HTTP 协议

WebSocket 协议(ws://)

数据格式

纯文本

文本/二进制都可以

连接数

HTTP/1.1 有 6 个限制

不受限

重连

自动重连

需要自己实现

适用场景

只需要服务器推送(通知、行情)

需要双向通信(聊天、游戏、协作)

Unity 转行视角:

类比游戏中的两种网络模式:

  • SSE = 服务器单向广播,客户端只接收(类似看直播)

  • WebSocket = 双向实时通信,客户端也能发(类似玩网游) 看业务场景选,不需要双向的就用 SSE,更简单更轻量。


7.7 SSE 断线续传怎么做?

回答思路:

  • SSE 自带自动重连功能

  • 关键是续传:从断开的地方继续接收,而不是从头开始

  • 实现方式:

    1. 每条消息带一个 ID(id: xxx

    2. 客户端记录最后收到的 ID

    3. 重连时,客户端在请求头里带 Last-Event-ID

    4. 服务器根据这个 ID,从断点继续发

  • 客户端关闭窗口再打开的话,可以把 last ID 存在 localStorage 里

Unity 转行视角:

这就像游戏中的断点续传下载——下载中断了,下次从已下载的位置继续,不用从头来。或者类比存档系统——记录当前进度,下次进来从存档点继续。


8. 后端基础 - Node.js / NestJS

8.1 Express 的底层原理?如果让你设计实现怎么做?

回答思路: Express 核心是:

  1. 中间件机制:一个请求经过一串中间件处理

  2. 路由系统:根据 method + path 匹配处理函数

  3. 请求/响应对象封装:封装 req 和 res,提供便捷方法

自己实现的话:

  1. 创建 http 服务器,监听 request 事件

  2. 维护一个中间件/路由数组

  3. 请求进来后,按顺序匹配执行

  4. 每个中间件可以调用 next() 传给下一个

  5. 封装 req/res,加一些常用方法

Unity 转行视角:

中间件机制就像 Unity 的管道/责任链模式。比如 UI 事件冒泡、或者编辑器的菜单系统,都是一个东西经过一串处理器。路由系统就像游戏中的状态机/消息分发——根据不同的输入,分发到不同的处理函数。


8.2 NestJS 的依赖注入中,Provider 默认是单例吗?

回答思路:

  • 默认是单例(Singleton)

  • NestJS 的 Provider 作用域:

    • DEFAULT(单例):整个应用只有一个实例

    • REQUEST:每个请求创建一个新实例

    • TRANSIENT:每次注入都创建新实例

Unity 转行视角:

单例模式你肯定熟!Unity 里的 GameManager、AudioManager 不都是单例吗?依赖注入就像 Unity 的组件注入/服务定位器——不用自己 new,系统帮你创建好注入进来。


8.3 单例模式的优点?

回答思路:

  1. 唯一实例:保证全局只有一个,避免重复创建

  2. 全局访问:方便在任何地方调用

  3. 节省资源:频繁创建销毁的对象,用单例更省

  4. 状态共享:全局状态统一管理

Unity 转行视角:

这就是你天天用的东西啊!Unity 里的各种 Manager 基本都是单例。比如 GameManager、UIManager、AudioManager——都是全局唯一、方便访问、统一管理状态。可以结合你做过的具体例子来说。


8.4 如何给几十上百个接口统一增加操作日志/接口监控?

回答思路:

  1. 中间件/拦截器:NestJS 用 Interceptor,Express 用 middleware

  2. 装饰器:给需要的接口加装饰器标记

  3. AOP 思想:不侵入业务代码,统一处理横切关注点

  4. 配置化:哪些接口要记日志,哪些不要,可配置

Unity 转行视角:

这就是AOP(面向切面编程)的思想。就像 Unity 中的拦截器/消息管道——比如你给所有网络请求加一个统一的日志记录,不用每个请求都写一遍日志代码。或者类比 Unity 的 Profiler,统一监控所有函数的性能。


8.5 Nest 管道(Pipe)的概念、作用和使用场景?

回答思路:

  • 概念:管道是处理请求数据的,在请求到达控制器之前处理

  • 作用

    1. 数据转换:把输入转换成需要的格式

    2. 数据验证:验证输入是否合法

  • 使用场景

    • 参数校验(用 class-validator)

    • 类型转换(字符串转数字等)

    • 数据清洗、格式化

Unity 转行视角:

就像游戏中的输入处理管道——玩家输入进来,先做合法性校验,再转换成游戏内的指令,然后才传给逻辑层。或者类比资源导入管线——资源导入时先做格式转换、验证,然后才能用。


8.6 TypeORM 有哪两种运行模式?

回答思路:

  1. Data Mapper(数据映射器):用 Repository 模式,实体和数据库操作分离

  2. Active Record(活动记录):实体本身就有 CRUD 方法,直接 user.save()

Unity 转行视角:

类比游戏中的两种数据访问模式:

  • Data Mapper = 你有一个 Manager/Repository 来负责数据操作,实体只是数据容器

  • Active Record = 数据对象自己带操作方法,类似 Unity 中 MonoBehaviour 自带各种方法 看团队习惯和项目规模选,大项目一般用 Data Mapper 更清晰。


8.7 TypeORM 查询缓慢时,如何抓取生成的 SQL 做调优?

回答思路:

  1. 开启 TypeORM 的日志功能,打印生成的 SQL

  2. getSql() 方法获取 SQL

  3. 把 SQL 拿到数据库里执行 EXPLAIN,看执行计划

  4. 检查有没有走索引、有没有全表扫描

  5. 优化:加索引、优化查询语句、减少关联查询

Unity 转行视角:

这就像游戏的性能分析流程——先 Profiler 看哪帧慢,再深入看是哪个函数慢,再看为什么慢(GC?计算量?Draw Call?),然后针对性优化。数据库调优也是一样的思路:先定位慢查询,再分析原因,再优化。


9. 数据库 - MySQL / Redis / ES

9.1 怎么保证数据库和缓存之间的数据一致性?

回答思路: 常见方案:

  1. 先更数据库,再删缓存(最常用)

    • 读:先读缓存,没有就读数据库,再写缓存

    • 写:先更数据库,再删缓存

    • 为什么是删缓存而不是更缓存?因为并发下更新缓存可能有脏数据

  2. 延时双删:删缓存→更数据库→延迟一会再删缓存(解决并发脏读)

  3. 消息队列异步更新:数据库更新后发消息,消费者更新缓存

  4. 订阅 binlog:监听数据库 binlog,自动更新缓存

Unity 转行视角:

这就像游戏中的数据同步问题——内存数据和持久化数据怎么保持一致。比如玩家金币变了,你要先改内存,再存数据库,还是反过来?缓存和数据库的一致性问题,本质上就是多级存储的数据同步问题,和游戏里的内存-磁盘数据同步思路是通的。


9.2 MySQL 大表优化怎么做?百万级数据后出现慢插入

回答思路: 慢插入优化:

  1. 批量插入代替单条插入

  2. 关闭自动提交,手动事务提交

  3. 减少索引数量(索引多了插入慢)

  4. 插入时按主键顺序插入(避免页分裂)

  5. 用 LOAD DATA 批量导入

  6. 分库分表

大表优化通用方案:

  1. 索引优化(加合适的索引,去掉没用的)

  2. 分库分表(水平分表、垂直分表)

  3. 读写分离

  4. 冷热数据分离

  5. 归档历史数据

Unity 转行视角:

这就像游戏中的大数据量优化。比如你做一个排行榜,有几百万玩家数据,怎么存怎么查?思路是一样的——索引优化、分块存储、冷热分离。你在 Unity 里做过数据结构优化、内存优化的话,理解数据库优化会很快,本质都是空间换时间、分而治之。


9.3 MySQL IO 爆红怎么排查?(三连表、每小时同步、查一个库插另一个库)

回答思路: 排查步骤:

  1. 先看慢查询日志,定位是哪个 SQL 慢

  2. EXPLAIN 看执行计划,有没有全表扫描、有没有走索引

  3. 看是不是查询数据量太大,一次查太多

  4. 看是不是插入太频繁,或者每次插入都要更新很多索引

  5. 看磁盘 IO 指标,是读多还是写多

优化方向:

  • 查询侧:加索引、优化 SQL、减少数据量、分页查询

  • 插入侧:批量插入、减少索引、事务合并

  • 架构侧:读写分离、加缓存、异步处理

Unity 转行视角:

这就像游戏中"某一帧突然卡了"的排查流程——先 Profiler 定位是哪个函数卡,再看是 CPU 还是 GPU 还是 IO,然后分析原因优化。排查思路是一样的:先定位问题点,再分析原因,再针对性优化。


9.4 数据库索引的最左匹配原则是什么?

回答思路:

  • 联合索引(a, b, c),查询时从最左边的列开始匹配

  • 遇到范围查询(>、<、between、like)就停止匹配

  • 例子:

    • where a = 1 and b = 2 and c = 3 → 走全索引

    • where a = 1 and b > 2 and c = 3 → a 和 b 走索引,c 不走

    • where b = 2 and c = 3 → 不走索引(缺了最左的 a)

Unity 转行视角:

类比字典查字——你要按拼音查,得先知道第一个字母,再第二个、第三个。如果只知道第三个字母,那就没法按拼音索引查了,只能全表扫描。或者类比游戏中的分层查找——先按大类分,再按小类分,跳过前面的直接查后面的就查不到。


9.5 MySQL5.6 和 8.0 有什么区别?

回答思路:

  1. 性能:8.0 性能更好,特别是读写负载、高并发场景

  2. 窗口函数:8.0 支持窗口函数(ROW_NUMBER、RANK 等)

  3. CTE:8.0 支持通用表表达式(WITH 语法)

  4. JSON 功能增强:8.0 JSON 功能更强大

  5. 默认字符集:8.0 默认 utf8mb4

  6. 优化器改进:8.0 优化器更智能

  7. 原子 DDL:8.0 DDL 操作是原子的

  8. 隐藏索引:8.0 可以隐藏索引来测试

Unity 转行视角:

就像 Unity 版本升级——新版本性能更好、功能更多、API 更完善。比如从 Unity 5 升到 Unity 202X,多了很多新功能,性能也提升了。数据库版本升级也是类似的。


9.6 什么是数据库事务?举例说明必须用事务的场景

回答思路:

  • 事务:一组数据库操作,要么全部成功,要么全部失败,保证数据一致性

  • ACID 特性:原子性、一致性、隔离性、持久性

必须用事务的场景:

  • 转账:A 扣钱和 B 加钱必须都成功或都失败

  • 下单:扣库存和创建订单必须原子

  • 数据迁移:旧表删数据和新表插数据要一致

Unity 转行视角:

就像游戏中的原子操作。比如玩家买东西,扣金币和给道具必须同时成功——不能扣了金币没给道具,也不能给了道具没扣金币。这就是事务的原子性。你在游戏里做过的交易系统、背包系统,本质上都需要事务的思想来保证数据一致性。


9.7 假设设计一个秒杀系统,怎么设计架构?高并发下如何避免超卖?

回答思路: 整体架构:

  1. 前端:页面静态化、CDN、按钮防重复点击

  2. 接入层:限流、熔断、负载均衡

  3. 业务层:Redis 预扣库存、消息队列异步下单

  4. 数据层:MySQL 最终一致性、分库分表

避免超卖:

  1. Redis 分布式锁 + Lua 脚本(原子操作扣库存)

  2. MySQL 乐观锁(版本号)

  3. MySQL 悲观锁(select for update)

  4. 库存单独存 Redis,用 decr 原子操作

Unity 转行视角:

这就像游戏中的抢红包/限时活动系统。大量玩家同时抢,怎么保证不超发、不卡顿?思路是一样的:

  • 前端防重复点击 = 防止玩家重复发包

  • Redis 预扣库存 = 内存里先扣,快

  • 消息队列异步 = 削峰填谷,不直接打数据库 你做过游戏活动系统的话,秒杀系统的设计思路你会很熟悉。


9.8 Redis 分布式锁或 Lua 脚本如何使用?

回答思路: 分布式锁:

  • 加锁:SET key value NX EX 过期时间(原子操作)

  • 解锁:用 Lua 脚本判断 value 是否匹配,匹配才删(防止误删别人的锁)

Lua 脚本:

  • 把多个操作写在 Lua 脚本里,Redis 执行时是原子的

  • 常用于:扣库存、抢红包、分布式锁解锁等需要原子性的场景

Unity 转行视角:

分布式锁就像游戏中的互斥锁/临界区——保证同一时间只有一个线程/进程能操作某个资源。Lua 脚本就像你把多个操作打包成一个原子操作,避免中间状态出问题。和你在 Unity 里做多线程同步的思路是一样的。


9.9 微信支付接入流程怎么设计?如何保证支付结果和系统状态一致?

回答思路: 接入流程:

  1. 前端下单,后端创建订单

  2. 后端调用微信支付统一下单 API,拿到支付参数

  3. 前端调起微信支付

  4. 用户支付完成

  5. 微信回调通知后端支付结果

  6. 后端验签,更新订单状态

  7. 前端轮询/接收推送,展示结果

保证一致性:

  1. 回调 + 主动查询:不仅等回调,还要主动查询支付状态

  2. 幂等性:回调可能重复,要保证重复处理结果一样

  3. 最终一致性:用定时任务对账,补单

  4. 事务消息:订单创建和支付状态更新要一致

Unity 转行视角:

这就像游戏中的充值/购买系统。玩家付钱→第三方回调→发货。核心问题都是:怎么保证钱付了就一定发货,怎么防止重复发货,怎么处理回调丢失。你做过游戏支付系统的话,这套流程会非常熟悉。


10. 运维 / DevOps - Docker / K8s / Linux

10.1 Docker 和 K8s 的关系?

回答思路:

  • Docker:容器技术,用来打包和运行应用,解决"在我这能跑"的问题

  • K8s(Kubernetes):容器编排平台,管理一堆 Docker 容器

  • 关系:Docker 是 K8s 的底层运行时之一,K8s 管理 Docker 容器的生命周期

  • 类比:Docker = 集装箱,K8s = 港口调度系统

Unity 转行视角:

类比游戏开发:

  • Docker = 打包好的游戏包(包含所有依赖,在哪都能跑)

  • K8s = 游戏服务器集群管理系统(管理几千台服务器上的游戏实例,自动扩容、故障转移、负载均衡) 你做过游戏服务器的话,理解 K8s 会很快——它就是个通用的容器集群管理系统。


10.2 Docker 中容器和镜像的关系?怎么进行挂载的?

回答思路:

  • 镜像(Image):只读的模板,是应用和依赖的打包,相当于"类"

  • 容器(Container):镜像运行的实例,是可读写的,相当于"对象"

  • 一个镜像可以创建多个容器

挂载:

  • 数据卷(Volume):Docker 管理,持久化数据

  • 绑定挂载(Bind Mount):直接挂载宿主机目录

  • tmpfs:挂载到内存,临时数据

Unity 转行视角:

  • 镜像 vs 容器 = Prefab vs 实例化出来的 GameObject

  • 挂载 = 游戏中的持久化数据目录,或者 StreamingAssets 目录——容器里的程序可以访问宿主机上的文件


10.3 K8s 中多个服务怎么进行通讯?

回答思路:

  1. Service:K8s 里的服务发现和负载均衡,通过 Service 名访问

  2. ClusterIP:集群内部访问,默认类型

  3. DNS:K8s 自带 DNS,服务名可以解析成 ClusterIP

  4. Ingress:集群外部访问 HTTP 服务

  5. 服务网格(Istio 等):更高级的服务治理

Unity 转行视角:

就像游戏服务器中的服务发现。比如游戏大厅服务怎么知道游戏服务器的地址?怎么负载均衡?K8s 的 Service 就是干这个的——自动服务发现、自动负载均衡,不用你自己写。


10.4 多租户场景下 K8s 怎么部署?一个租户一个 Pod 吗?

回答思路: 不一定,看隔离要求:

  1. 共享集群,Namespace 隔离:成本最低,隔离性一般(逻辑隔离)

  2. 每个租户一个 Pod:隔离性好一些,资源浪费多一些

  3. 每个租户一个 Node:物理隔离,成本高,安全性高

  4. 每个租户一个集群:完全隔离,成本最高

一般根据租户的重要性、数据敏感度来选。

Unity 转行视角:

就像游戏的多区服架构

  • 共享集群 = 多个服共用一组物理机,用进程隔离

  • 一个租户一个 Pod = 每个服一个独立进程

  • 一个租户一个 Node = 每个服独占一台物理机 都是根据隔离要求和成本来权衡的。


10.5 Linux 是否熟悉?给一条查询日志异常的命令

回答思路: 常用命令:

  • grep -i "error\|exception" app.log 查错误

  • tail -f app.log 实时看日志

  • grep "ERROR" app.log | wc -l 统计错误数

  • grep "ERROR" app.log | tail -n 100 看最近 100 条错误

  • awk '{print $1}' app.log | sort | uniq -c | sort -rn 统计各类型数量

Unity 转行视角:

可以说:"虽然我之前主要做 Unity 开发,但 Linux 命令我经常用——比如打包服务器、部署游戏服务端、查日志排查问题。我常用的有 grep、tail、awk 这些,和你说的查日志场景是一样的。而且我觉得 Linux 命令的思路和 Unity 编辑器的各种工具是相通的——都是高效处理文本和数据。"


10.6 WebAssembly 有了解过吗?

回答思路:

  • WebAssembly(Wasm):一种低级的字节码格式,可以在浏览器里运行

  • 特点:接近原生性能、安全、跨平台

  • 用途:

    • 高性能计算(游戏、视频编解码、密码学)

    • 把 C/C++/Rust 代码移植到 Web

    • 复杂的图形渲染、3D 应用

Unity 转行视角(这是你的强项!):

这是你的优势领域!可以说:"我对 WebAssembly 比较了解,因为 Unity WebGL 构建就是把 C# 代码编译成 WebAssembly 在浏览器里运行。我做过 XX 个 WebGL 项目,对 Wasm 的性能特点、内存管理、和 JS 交互都比较熟悉。比如 Wasm 调用 JS 有开销,所以要减少跨语言调用次数;Wasm 的内存是线性的,不能自动 GC 等等。"


11. 系统架构设计类

11.1 从 0 到 1 搭建一个项目,怎么设计架构?

回答思路:

  1. 需求分析:明确功能、性能、扩展性要求

  2. 技术选型:选框架、数据库、中间件

  3. 分层设计:前端层、网关层、业务层、数据层

  4. 模块拆分:按业务领域拆模块,高内聚低耦合

  5. 接口设计:定义好模块间的接口

  6. 基础设施:日志、监控、部署、CI/CD

  7. 考虑扩展性:哪里可能变,预留扩展点

Unity 转行视角:

这就像你从 0 开始做一个游戏项目——先定玩法和需求,再选引擎和技术方案,然后搭框架(UI框架、数据框架、网络框架),拆模块(战斗、背包、任务...),定义模块间的接口,最后做工具链和打包部署。思路是完全一样的,你有游戏项目架构经验,做 Web 项目架构会很顺手。


11.2 AI 系统从架构角度看,分成哪些层?

回答思路: 典型的 AI 系统分层:

  1. 接入层:Web、APP、API 网关

  2. 应用层:业务逻辑、Agent 编排、工作流

  3. 模型服务层:LLM 调用、Embedding、向量检索

  4. 数据层:向量库、关系数据库、缓存、消息队列

  5. 基础设施层:K8s、监控、日志、安全

或者按 Agent 视角分:

  • 交互层 → 规划层 → 执行层 → 工具层 → 记忆层

Unity 转行视角:

就像游戏架构分层:UI 层 → 逻辑层 → 数据层 → 引擎层。或者像游戏 AI 的分层:感知层 → 决策层 → 行动层。你在 Unity 里做过的架构设计,思路完全可以迁移过来。


11.3 假设做一个门店的 AI 数字化系统,你会怎么设计?

回答思路: 技术架构:

  • 前端:小程序/H5(给顾客用)、管理后台(给店员用)

  • 后端:业务服务 + AI 服务

  • AI 能力:智能客服、推荐系统、数据分析、语音交互

  • 数据:MySQL 存业务数据、向量库存知识库、Redis 缓存

模块拆分:

  • 用户模块:会员、积分、优惠券

  • 商品模块:商品管理、库存

  • 订单模块:下单、支付、配送

  • AI 模块:智能导购、客服机器人、销售预测

  • 数据模块:报表、分析、大屏

技术选型:

  • 前端:Vue/React + 小程序

  • 后端:Node.js/Java + NestJS/Spring Boot

  • AI:LangChain + 通义千问/DeepSeek + Milvus

  • 数据:MySQL + Redis + Milvus

Unity 转行视角:

这就像你设计一个游戏的商城系统/社交系统——拆模块、定接口、选技术。只是业务场景从游戏变成了门店,但架构设计的方法论是一样的。你可以说:"我之前做过 XX 游戏系统的架构设计,思路是相通的——都是先理解业务,再拆模块,再选技术,再考虑扩展性。"


11.4 传统业务系统的后端分几层?

回答思路: 经典三层架构:

  1. 表现层(Controller):接收请求、返回响应、参数校验

  2. 业务逻辑层(Service):核心业务逻辑

  3. 数据访问层(DAO/Repository):数据库操作

更细的话还有:

  • 网关层:路由、鉴权、限流

  • 通用层:工具类、公共组件

  • 基础设施层:数据库、缓存、消息队列

Unity 转行视角:

就像 Unity 项目的分层:UI 层(表现)→ 逻辑层(业务)→ 数据层(存储)。或者像 MVC 模式——Model、View、Controller。你做过 Unity 架构的话,对分层思想会非常熟悉。


11.5 解释下 Harness 相关概念?

回答思路: Harness 在 AI Agent 领域的意思是"框架/脚手架/ harness"——用来管理和运行 Agent 的基础设施。

  • 负责 Agent 的生命周期管理

  • 提供工具调用、记忆管理、多 Agent 编排等能力

  • 类似"Agent 的运行时环境"

Unity 转行视角:

类比 Unity 的游戏框架/游戏管理器。Harness 就像 GameManager + 各种 Manager 的集合——它提供 Agent 运行需要的各种基础设施,让 Agent 开发者专注于业务逻辑,不用管底层怎么调度、怎么调工具、怎么管理记忆。


11.6 canvas 无限画布是怎么实现的?

回答思路: 核心思路:视口渲染 + 坐标变换

  1. 只渲染视口内可见的内容,不渲染整个画布

  2. 用 transform 做平移、缩放变换

  3. 内容用数据驱动,需要时才创建/渲染

  4. 虚拟化:大量元素时只渲染可见的(虚拟列表的 2D 版)

  5. 分层渲染:背景层、内容层、UI 层分开

Unity 转行视角(这是你的强项!):

这就是游戏中的大世界/大地图渲染啊!你肯定做过——不可能把整个地图都渲染出来,只渲染相机视野内的。实现思路一模一样:

  • 视口裁剪 = 视锥体剔除(Frustum Culling)

  • 坐标变换 = 相机 Transform

  • 虚拟化 = 对象池 + 流式加载 你有 Unity 大地图/大世界开发经验的话,实现无限画布对你来说小菜一碟。


12. 项目管理 / 软技能 / 职业规划

12.1 怎么推动项目进度?

回答思路:

  1. 拆解任务:把大任务拆成小任务,明确每个任务的时间和责任人

  2. 里程碑:设定关键节点,定期检查进度

  3. 同步机制:每日站会、周报,及时暴露风险

  4. 风险预判:提前想可能出问题的地方,准备预案

  5. 问题解决:遇到阻塞及时协调资源解决

  6. 沟通协调:和产品、设计、测试保持沟通,对齐目标

Unity 转行视角:

可以结合你做游戏项目的经验来说。比如:"我之前做 Unity 项目时,负责过 XX 模块的开发推进。我的方法是先把需求拆成具体的任务,估好时间,然后每天跟进进度,遇到问题及时拉通对齐。我觉得不管是游戏项目还是 Web 项目,推动进度的核心都是——拆解清楚、及时同步、快速解决问题。"


12.2 入职后如何快速上手分配的业务需求?

回答思路:

  1. 先看文档:项目文档、技术文档、业务文档

  2. 跑通代码:本地把项目跑起来,跟着流程走一遍

  3. 找 mentor 问:不懂就问,不要自己瞎琢磨

  4. 从小需求做起:先做简单的,熟悉代码和业务

  5. 多问为什么:不仅要知道怎么做,还要知道为什么这么做

  6. 记笔记:把学到的东西记下来,形成自己的知识库

Unity 转行视角:

这就像你刚进一家游戏公司,接手一个新项目的思路——先看设计文档,再把项目跑起来玩一玩,然后跟着老员工学,从小功能做起。道理都是一样的,快速上手的关键是主动学习+多问+动手实践。


12.3 说一说职业中比较具有挑战性的问题

回答思路: 选一个你真实遇到的、有代表性的问题:

  1. 背景:什么情况下遇到的

  2. 挑战:难在哪里

  3. 你做了什么:怎么分析、怎么解决

  4. 结果:最终效果怎么样

  5. 收获:学到了什么

Unity 转行视角(建议选技术类挑战):

可以说一个你在 Unity 开发中遇到的技术挑战,比如:

  • 性能优化:某场景帧率太低,你怎么分析怎么优化,最后从 30 帧升到 60 帧

  • 架构重构:老代码太乱,你怎么重构,怎么保证不影响业务

  • 技术难点:某个复杂功能怎么实现,踩了哪些坑 重点突出你的分析能力、解决问题的能力、学习能力。


12.4 AI 时代程序员价值是什么?

回答思路:

  1. 需求理解和拆解:AI 不会自己理解业务需求,需要人来拆解成可执行的任务

  2. 架构设计:AI 可以写代码,但设计整体架构还是需要人

  3. 质量把控:AI 写的代码需要人来 review、测试、保证质量

  4. 问题排查:出了问题,AI 不一定能定位到根因,需要人来分析

  5. 业务理解:深刻理解业务,知道用技术解决什么问题

  6. 创新和探索:AI 是工具,用 AI 创造什么价值还是需要人来想

Unity 转行视角:

可以结合你的经历说:"我觉得 AI 就像游戏引擎的进化——引擎越来越强大,内置的功能越来越多,但并不意味着游戏设计师/程序员就没用了。反而,你可以把更多精力放在创意、玩法、用户体验这些更有价值的地方。AI 也是一样,它帮你写重复的代码、做机械的工作,你可以把精力放在架构设计、业务理解、产品创新这些更核心的事情上。"


12.5 你认为自己编程的优点和缺点?

回答思路: 优点(结合 Unity 转行):

  1. 架构思维好,做过复杂系统设计

  2. 性能优化经验丰富,对代码质量有追求

  3. 学习能力强,从 Unity 转 AI/前端很快

  4. 解决问题能力强,喜欢钻研技术难点

  5. 图形/渲染基础好,做可视化、Canvas 有优势

缺点(要真诚但不致命):

  1. 前端某些细分领域经验还不够深(比如某框架的高级特性)

  2. 有时候会过度设计,想把代码写得太完美

  3. 某块技术(比如运维)接触不多,还在学习中

Unity 转行视角:

重点突出你从 Unity 带过来的优势——架构能力、性能优化能力、图形学基础、解决问题的能力。这些是很多纯前端开发者不具备的。缺点要说真实但不影响核心工作的,并且说明你在怎么改进。


12.6 最近学什么?

回答思路: 说你最近在学的、和面试岗位相关的东西:

  • AI 相关:LangChain、Agent 开发、RAG 优化

  • 前端相关:React/Vue 新特性、性能优化、工程化

  • 后端相关:Node.js、数据库、微服务

重点说你为什么学、学到了什么、有什么实践。

Unity 转行视角:

可以说:"我最近主要在学 AI Agent 开发和前端技术栈。因为我想从 Unity 开发转型到 AI + 前端方向。我学了 LangChain、LangGraph,自己做了几个小项目;同时也在补前端的基础,比如 React、Vue、性能优化这些。我觉得我的 Unity 开发经验能很好地迁移过来——比如架构设计、性能优化、图形渲染这些,都是相通的。"


12.7 职业规划是什么?3~5 年规划?

回答思路: 结合你转行的情况,说一个清晰但务实的规划:

  • 短期(1年):快速熟悉新领域的技术栈,成为合格的 XX 开发者

  • 中期(2-3年):深入某个方向(比如 AI Agent、前端架构),成为团队核心

  • 长期(3-5年):成为技术专家或者技术管理者,能独当一面负责一个产品/项目

Unity 转行视角:

可以说:"我的职业规划是结合我之前的 Unity 开发经验,在 AI + 前端这个方向深入发展。短期来看,我需要快速补齐前端和 AI 的基础,能独立完成项目;中期来看,我想在 AI Agent 或者可视化方向深入,发挥我图形和架构的优势;长期来看,我希望能成为既懂 AI 又懂前端、还懂产品的全栈型人才,负责更复杂的项目。"


12.8 你应聘这个岗位自身有什么优势?

回答思路(Unity 转行专属):

  1. 架构能力强:做过复杂游戏系统的架构设计,系统思维好

  2. 性能优化经验:游戏对性能要求高,这方面经验丰富

  3. 图形/渲染基础:Canvas、WebGL、可视化方向有天然优势

  4. 解决问题能力:游戏开发经常遇到各种疑难杂症,排查能力强

  5. 学习能力强:从 Unity 转 AI/前端,证明学习能力不错

  6. AI 理解深:游戏 AI + 大模型 AI,对 AI 的理解更全面

重点: 不要只说"我学习能力强",要用具体例子支撑。


12.9 你的缺点是什么?

回答思路: 说真实但不致命的缺点,并且说明你在怎么改进:

  • 例子:

    1. "前端某些细分领域经验还不够,比如 XX,我现在正在通过 XX 方式补"

    2. "有时候会过度关注技术细节,忽略了业务优先级,我在有意识地调整"

    3. "某块技术(比如运维/测试)接触不多,还在学习中"

原则: 真诚、不致命、有改进行动。


12.10 从前端转型全栈,你是如何学习并胜任的?

回答思路(可以套用你的 Unity 转行经历):

  1. 先建立知识框架:知道全栈需要学什么,列个清单

  2. 项目驱动学习:边做项目边学,不是光看书

  3. 从简单到复杂:先做小功能,再做完整项目

  4. 善用工具和 AI:用 AI 辅助学习,提高效率

  5. 总结沉淀:做笔记、写博客、整理知识体系

  6. 找反馈:做出来的东西找人 review,或者上线看效果

Unity 转行视角:

你可以把你从 Unity 转行的学习过程套进去说。比如:"我之前从 Unity 转 AI/前端也是类似的思路——先建立知识体系,然后通过做项目来实践,遇到问题就查资料、问 AI,做完后总结沉淀。我觉得学习新领域的方法都是相通的——项目驱动、快速迭代、持续总结。"


🎯 Unity 转行面试策略总结

你的核心优势

  1. 架构思维:游戏开发的复杂度远超普通 Web 项目,你见过复杂系统

  2. 性能优化:游戏对性能的极致追求,让你有很强的性能意识

  3. 图形渲染:Canvas、WebGL、可视化是你的天然优势领域

  4. 解决问题:游戏开发经常踩各种坑,排查能力强

  5. AI 基础:游戏 AI(状态机、行为树)和大模型 Agent 思路相通

面试话术模板

"虽然我之前主要做 Unity 开发,但我觉得很多经验是可以迁移的。比如 XX(架构/性能优化/图形),我在 Unity 里做过 XX 项目,思路是相通的。而且我学习能力比较强,已经通过 XX 方式学习了 XX 技术,做了 XX 项目。我相信我能很快上手这个岗位。"

需要补的短板

  1. 前端基础:HTML/CSS/JS 基础、框架原理

  2. Web 生态:构建工具、工程化、浏览器原理

  3. 后端知识:数据库、缓存、消息队列、微服务

  4. AI 工程化:RAG、Agent、Prompt 工程的实际落地经验


💡 建议:面试前把你最熟悉的 Unity 项目准备好,想清楚每个技术点怎么和面试问题关联起来。重点不是你已经会了多少,而是你能多快学会、以及你有多少可迁移的能力。

评论