字节跳动面试真题及答案:按岗位浏览
74 道题,按知识分类阅读完整解析和面试追问。
大模型基础面试题2 道
RoPE 旋转位置编码是什么?Transformer 为什么需要位置信息?
从 Q、K 旋转解释 RoPE 位置编码与相对位置关系,说明 Transformer 为什么需要位置,以及长度扩展和缓存坐标的边界。
MHA、MQA、GQA 有什么区别?为什么 GQA 能减少 KV Cache?
比较 MHA、MQA、GQA 的查询头与键值头关系,解释 GQA 如何减少 KV Cache,以及缓存比例、总显存和吞吐为何不能混为一谈。
Agent面试题4 道
什么是 Tool Calling?大模型是如何调用外部工具的?
Tool Calling 并不是大模型自己去执行某个工具,而是模型和应用之间约定的一套调用方式。应用会先把工具名称、用途和参数结构告诉模型。模型判断需要使用工具时,会返回一份结构化的调用请求,里面通常包含工具名称、参数和调用标识。
Agent 上下文太长怎么办?压缩与关键信息保留
Agent 的上下文压缩,不能只是把聊天记录缩写一遍。因为后面的执行依赖前面留下的目标、限制、证据和进度,漏掉其中一项,任务就可能走偏。因此,我会先把这些内容分开处理:当前目标和操作限制单独保留;已经完成的过程整理成摘要;
Agent Harness 是什么?模型之外的执行与状态管理
Agent Harness 可以理解为围绕模型搭建的一套运行系统。模型负责根据当前信息做判断,Harness 则负责把需要的信息交给模型、执行允许的工具调用,再把结果送回去。
Computer Use 是什么?Agent 如何看懂页面并操作电脑?
Computer Use 是让 Agent 通过电脑界面完成任务的一种方式。模型可以读取截图,判断当前页面,并提出点击、输入、滚动等操作;真正操作鼠标和键盘的,仍然是应用中的执行工具。
AI应用工程面试题3 道
AI 文件解析与建索引的异步任务怎么设计?
文件上传和解析建索引要分开。上传接口把文件可靠保存下来,再创建一条任务,返回文件 ID、任务 ID 和当前状态;OCR、切片、Embedding、写索引由后台 Worker 执行。
大模型结构化输出怎么校验?JSON 入库与失败处理
合法 JSON 不能直接入库。它只说明语法上能解析;即使用 JSON Schema 约束了字段和类型,也只能说明结构符合预期,不能证明金额、订单归属和业务条件正确。我会把链路分几关:先检查模型调用是否完成、有没有拒答或截断;再做结构校验;
Agent 执行越来越慢,应该怎么定位性能瓶颈?
Agent 执行变慢,不能直接判断是大模型的问题,需要先把一次任务的耗时拆开。例如,用户提交任务后,可能先在队列里等待。开始执行以后,又会经历模型判断、工具调用和多轮重试。
前端面试题26 道
JavaScript 事件循环是什么?宏任务、微任务和 async/await 怎么执行?
浏览器中的 JavaScript,通常先执行当前任务里的同步代码。当前调用栈清空后,会在微任务检查点处理排队的微任务,随后浏览器才有机会渲染、选择下一项任务。Promise 的后续回调和 await 后面的继续执行,通常进入微任务队列;
HTTP 强缓存和协商缓存有什么区别?Cache-Control、ETag 和 304 怎么配合?
强缓存是浏览器在缓存仍然新鲜时,直接复用已有响应,不需要为了这个资源向服务器验证。常用 Cache-Control: max-age 指定新鲜期。协商缓存是在需要验证时,带着资源标识询问服务器。
React 的 useEffect 怎么工作?依赖数组、清理函数和重复执行如何理解?
useEffect 用来让组件与外部系统保持同步,比如建立连接、订阅事件或管理浏览器资源,不是把所有渲染后的逻辑都装进去。组件提交后,React 根据依赖决定是否运行 Effect。
Vue 3 响应式原理是什么?Proxy、ref 和 reactive 有什么区别?
Vue 3 的 reactive 为对象创建响应式代理。依赖执行时读取属性,系统记录这段逻辑依赖哪个属性;属性改变后,再通知相关依赖更新。Proxy 负责拦截操作,依赖收集和触发机制负责建立对应关系。
XSS 和 CSRF 有什么区别?HttpOnly、SameSite 和 Token 分别防什么?
XSS 是不可信输入被页面当作可执行内容,攻击者因此获得当前页面里的脚本能力。主要防护是按输出上下文正确编码,富文本使用可靠净化,并避免危险的动态执行入口,CSP 可作为额外防线。
JavaScript 原型链是什么?new 和继承是怎么实现的?
原型链就是 JavaScript 查找对象属性的一条路径。先查对象自己的属性,没有找到,再查它的原型,继续往上找,直到原型为 null。用 new 创建实例时,实例通常会连接到构造函数的 prototype 对象。
防抖和节流有什么区别?搜索框和滚动事件分别怎么选?
防抖会把一段连续触发合并处理。常见的尾部防抖,是每次触发重新计时,等一段时间没有新触发,再执行最后一次。因此,搜索建议、输入校验这类关心最终输入的功能,通常适合防抖。节流则控制执行频率。
Promise.all、allSettled、race、any 有什么区别?失败后其他任务会停止吗?
Promise.all 要求全部成功,只要有一个失败,聚合结果就会失败。适合几个结果缺一不可的情况,例如页面必须同时拿到配置和权限。allSettled 会等所有任务有结果,再分别给出成功或失败,适合允许局部失败、需要完整报告的批量处理。
ES Module 和 CommonJS 有什么区别?循环依赖时会发生什么?
ES Module 通过 import/export 表达模块依赖,导入通常与导出的绑定相连。CommonJS 则通过 require 执行模块并取得 module.exports,可以在运行过程中按条件加载。
TypeScript 的 any、unknown、never 有什么区别?
any 允许咱们按需要访问属性、调用方法,编译器会放宽相关检查。这在迁移旧代码时有时方便,但错误也可能一路传到后面的代码。unknown 同样可以接收各种值,但使用前要先判断它是什么。
BFC 是什么?为什么能解决浮动塌陷和部分外边距重叠问题?
BFC 是普通块布局中的一个独立格式化区域。理解它时,我会先看容器内部和外部哪些布局关系被隔开。建立 BFC 的容器在计算自动高度时会包含内部浮动,内部子元素的外边距也不会与这个容器的外边距合并。
从输入 URL 到页面显示,浏览器到底经历了什么?
浏览器先解析 URL,确定导航目标,再按缓存、已有连接和协议情况获取页面。需要时进行域名解析与连接建立;HTTPS 还涉及安全握手,但不能把每次导航都说成重新走完整 TCP 流程,HTTP/3 也不使用 TCP。
React Fiber 是什么?为什么渲染可以暂停和继续?
Fiber 可以理解成 React 用来表示组件及其渲染工作的一种内部结构。React 不再只依赖一次递归调用走完整棵树,而是能记录工作进度,并在合适的工作单元边界调度后续计算。
Tree Shaking 是什么?为什么没用到的代码仍然进了包?
Tree Shaking 是根据模块依赖和导出使用情况,移除可以安全删除的代码。ESM 的静态结构更有利于分析,但使用 ESM 并不保证所有无用代码都能删干净。副作用是关键限制。
pnpm 和 npm 有什么区别?lockfile 为什么应该提交?
pnpm 使用内容寻址存储复用包文件,再通过项目中的虚拟存储和链接组织依赖关系。不同项目可以复用内容,但各自仍有自己的依赖图和版本组合。lockfile 记录依赖解析结果和相关信息,让后续安装更可复现。
JavaScript 怎么判断数据类型?typeof、instanceof 和 Array.isArray 有什么区别?
typeof 适合先判断字符串、数字、布尔值等基本类别,但它不能细分普通对象、数组和日期,null 的结果也是 object,函数则返回 function。instanceof 通常沿原型链检查一个对象是否与指定构造器关联。
Git merge 和 rebase 有什么区别?为什么共享分支要谨慎变基?
merge 把两条历史合到一起。分支已经分叉时,通常建立一个连接两边历史的合并提交;如果可以快进,也可能只是移动指针,不产生新的合并提交。rebase 则把待迁移提交的改动,在新的基点上重新应用。
CSS 的 px、em、rem、vw、vh 有什么区别?响应式布局怎么选单位?
px 是 CSS 像素,不必等于一个设备物理像素。em 与字号有关:用于 font-size 时,按继承的字号计算;用于 padding 等属性时,通常按元素自身字号计算。rem 则按根元素字号计算。
React 合成事件是什么?和原生 DOM 事件有什么区别?
React 合成事件是 React 提供给事件处理函数的事件对象,封装了常用属性与行为,让组件通过 onClick 等声明式接口处理交互,也可以通过 nativeEvent 访问底层原生事件。
React 错误边界 Error Boundary 是什么?为什么捕获不到所有错误?
Error Boundary 是包住部分 React 子组件树的特殊组件。当子组件在渲染等受支持的阶段抛错时,它可以显示 fallback,避免这个区域的故障直接破坏整个页面。
React 的 useLayoutEffect 和 useEffect 有什么区别?什么时候需要在绘制前测量 DOM?
React 的 useLayoutEffect 和 useEffect 有什么区别?什么时候需要在绘制前测量 DOM?只有必须在显示前测量并纠正布局,才值得阻挡绘制。讲清两者在绘制时机上的差别。
CSS 伪类和伪元素有什么区别?::before 能代替真正的 HTML 内容吗?
CSS 伪类和伪元素有什么区别?::before 能代替真正的 HTML 内容吗?状态选择和局部生成不是一回事,重要内容仍需要真实语义。讲清选择器写法差异与可访问性边界。
React Suspense 是什么?为什么包住组件以后,接口请求仍然没有显示 loading?
React Suspense 是什么?为什么包住组件以后,接口请求仍然没有显示 loading?Suspense 只响应能让渲染挂起的加载来源,普通 Effect 请求需自行管理状态。讲清两种加载路径的区别。
Webpack 的 Loader 和 Plugin 有什么区别?分别在构建的哪一步执行?
沿着模块转换与构建生命周期解释 Webpack Loader 和 Plugin 的区别,说明普通 Loader 顺序、pitch 边界及 Plugin 钩子,纠正常见执行顺序误解。
Babel 是怎么把新语法转成旧语法的?为什么还需要 Polyfill?
解释 Babel 的解析、AST 转换与代码生成,区分语法兼容、辅助函数和 Polyfill,说明 preset-env、core-js 配置及应用与库的不同兼容责任。
JavaScript 函数柯里化是什么?如何实现支持多次传参的 curry?
用 TS 与 Python 实现固定参数数量的 curry,解释闭包、分支复用、默认参数、function.length、this 和占位符边界,并区分柯里化与偏函数应用。
后端面试题13 道
JWT 和 Session 有什么区别?Cookie 在登录认证中负责什么?
Session 方案通常在服务端保存会话状态,浏览器携带会话标识,服务端查到有效记录以后才接受身份。JWT 是一种 Token 格式。常见签名 JWT 携带声明,服务端验证签名、过期时间、签发方和目标接收方等条件后才能接受。
消息队列如何保证消息不丢失?为什么收到 ACK 还不一定代表业务完成?
消息是否可靠,需要分别检查业务到生产者、生产者到 Broker、Broker 存储与复制,以及消费者处理这几段。生产者要处理发送失败和确认不确定,Broker 要按产品机制配置持久化、复制与故障恢复。
Node.js 如何利用多核?worker_threads、cluster、child_process 怎么选?
Node.js 常见应用主线程上的 JavaScript 执行是单线程,但整个运行时不只有一条线程。异步 I/O、底层线程池和应用 JavaScript 的执行要分开理解。多进程或多个服务副本可以承接更多请求,并提供进程隔离。
HashMap 和 ConcurrentHashMap 有什么区别?并发读写为什么不能混用?
HashMap 不提供并发读写的同步保证。多个线程共享并修改时,需要外部同步或选择合适的并发容器。ConcurrentHashMap 支持安全的并发访问,但它不是给整个 Map 加一把大锁。读取通常不阻塞,更新按其实现协调。
Express 和 Koa 的中间件有什么区别?洋葱模型是怎么执行的?
Express 和 Koa 都用中间件组织请求处理,但 next 的约定不同。Express 调用 next(),把处理交给后面的中间件。
Spring 的 @Transactional 为什么会失效?事务传播行为怎么选?
@Transactional 是事务配置元数据,不是写上去就一定生效。默认代理模式下,要通过容器管理的代理进入匹配的方法;内部调用、自己创建对象或不合适的方法与代理配置,都可能让预期事务没有建立。事务建立后,还要看回滚规则。
REST、GraphQL 和 gRPC 有什么区别?接口设计应该怎么选?
这三者不是同一层面的三种数据格式。REST 是一组架构约束,常见 HTTP 资源接口用资源、方法和状态表达操作;GraphQL 用类型化 Schema 描述数据,让客户端选择字段;
ThreadLocal 是什么?为什么在线程池中容易出现内存泄漏和数据串用?
ThreadLocal 让不同线程分别保存和读取自己的变量值。同一个 ThreadLocal 对象,在不同线程中可以对应不同的值,不是让所有线程共享一个普通字段。线程池会复用线程,因此任务结束不等于线程结束。
SQL 注入是什么?为什么参数化查询能防注入,拼接排序字段却仍有风险?
SQL 注入为什么能生效?参数化查询把输入挡在语法结构之外,那动态排序字段为什么仍有风险?讲清预编译的边界与白名单兜底方式。
JWT 无感刷新怎么实现?多个请求同时 401 怎么办?
解释 JWT 无感刷新、并发 401 和晚到旧请求的处理方法,区分凭据失效与网络故障,并说明写请求重试的幂等边界。
N+1 查询是什么?为什么一个列表接口会执行上百次 SQL?
解释 ORM 的 N+1 查询如何产生,比较 JOIN、批量查询与 DataLoader,结合查询次数、结果膨胀和分页判断优化方案。
单点登录 SSO 怎么实现?不同域名的网站如何共享登录状态?
从 Cookie 域边界解释 SSO 与 OIDC 跳转、授权码兑换和会话建立,说明应用验证要求及单点退出为什么不自动成立。
Spring 的 @Async 为什么会失效?异步方法的线程池和异常怎么处理?
解释 Spring @Async 的代理调用与自身调用失效,区分线程池排队、Future 和 void 异常处理,讲清事务、ThreadLocal 与重要任务持久化的边界。
数据库与缓存面试题6 道
MySQL 索引为什么用 B+ 树?与 B 树、哈希索引有什么区别?
这里通常讨论的是 InnoDB 的常见索引,不能把所有 MySQL 索引都说成同一种结构。B+ 树内部节点主要保存键和指向下一层的指针,一个页能容纳较多分支,因此树通常较矮。
Redis 分布式锁怎么实现?为什么加了锁仍然可能重复执行?
Redis 分布式锁常见的基础做法,是用一条 SET 命令同时完成“不存在才设置”和“设置有效期”。锁值使用本次申请的唯一标识,释放时只有值仍属于自己,才原子删除。但这只是有租期的互斥。锁过期以后,原来的程序不会自动停止;
MySQL 主从复制是怎么工作的?主从延迟时怎样保证读到刚写的数据?
MySQL 常见主从复制,是主库把变更记录到 binlog,从库接收后写入 relay log,再由应用线程执行这些变更。接收和应用是两个阶段,所以从库可能落后。异步复制不要求主库每次提交都等从库。
Redis 事务和 Lua 脚本有什么区别?原子执行等于失败回滚吗?
Redis 的 MULTI 把命令入队,EXEC 时按顺序集中执行,其间不会插入其他客户端的普通命令。但执行期某条命令报错,不会自动回滚此前成功的修改,其他排队命令仍可能继续执行。
Redis Pipeline 为什么能提高吞吐量?和批量命令、事务有什么区别?
Redis Pipeline 是客户端连续发送多条命令,不在每条后都停下来等待回复,再按顺序处理结果。它主要减少往返等待,并提高批量 IO 效率。服务器仍要执行这些命令,Pipeline 不把十条操作变成一条,也不保证整批原子执行。
MySQL Online DDL 是什么?ALGORITHM=INSTANT、INPLACE 和 COPY 有什么区别?
MySQL Online DDL 是什么?ALGORITHM=INSTANT、INPLACE 和 COPY 有什么区别?在线能力取决于具体操作和版本,不代表完全无锁、无重建。讲清三种算法的代价与适用条件。
计算机基础面试题18 道
进程、线程和协程有什么区别?CPU 密集与 I/O 密集任务怎么选?
进程是操作系统中的资源与隔离单位,通常有独立地址空间;同一进程里的线程共享很多资源,各自有执行状态,可以由操作系统调度。协程则通常由语言运行时或库安排。
TCP 为什么要三次握手、四次挥手?TIME_WAIT 有什么作用?
TCP 三次握手的核心,是同步双方初始序号,并确认各自发送的 SYN 已经被对方收到。客户端先发 SYN,服务端用 SYN 加 ACK 既确认客户端,又提出自己的序号,客户端再发 ACK 确认服务端。
HTTP 和 HTTPS 有什么区别?TLS 怎样防止窃听、篡改和冒充?
HTTP 定义请求和响应的语义,HTTPS 通常指通过 TLS 保护的 HTTP 通信。HTTP/3 使用 QUIC,而 QUIC 也集成了 TLS 1.3 的安全机制。TLS 主要处理保密性、完整性和身份验证。
HTTP/1.1、HTTP/2、HTTP/3 有什么区别?队头阻塞是怎么解决的?
HTTP/1.1 支持连接复用,但同连接的流水线响应仍受顺序限制,实践中常用多连接并发。HTTP/2 使用二进制帧和流,让多个请求在一个连接上交错传输,并通过 HPACK 压缩头字段。
DNS 解析过程是什么?递归查询、迭代查询和 DNS 缓存有什么区别?
DNS 的作用是查询域名对应的记录,不只查询 IP。应用通常先经过本机解析机制,再向配置的递归解析器请求结果。递归查询是把查到答案的责任交给对方;迭代查询是对方给出答案或下一步该问的服务器,查询方继续查。
虚拟内存是什么?页表、TLB 和缺页异常如何配合?
程序通常使用虚拟地址,硬件结合页表把它翻译到物理页。这样可以隔离进程、控制访问,也能让不连续物理页组成连续的虚拟地址范围。页表保存映射,TLB 缓存地址翻译。
进程间通信有哪些方式?管道、消息队列、共享内存怎么选?
IPC 是进程间交换数据或通知的机制。管道适合连接生产者和消费者;消息队列强调消息组织;共享内存让进程访问同一片数据;Socket 适合连接式通信,Unix 域 Socket 用于本机,网络 Socket 可以跨机器。
互斥锁、自旋锁和信号量有什么区别?等待资源时该睡眠还是忙等?
互斥锁主要提供独占临界区,并通常有持有者语义。自旋锁获取失败时反复检查,消耗 CPU,适合很短、能很快结束的临界区,不适合在持锁期间做耗时或阻塞操作。信号量管理可用许可计数。计数为零时等待,释放后允许继续;
BFS 和 DFS 有什么区别?什么时候能用 BFS 求最短路径?
BFS 按距离起点的层次扩展,常用队列;DFS 沿分支深入再回退,用递归栈或显式栈。邻接表下完整遍历常见复杂度都是 O(V+E)。在无权图或各边等权的情况下,BFS 可以找最少边数的路径;
OSI 七层模型和 TCP/IP 四层模型有什么区别?一次请求经过哪些层?
OSI 七层是理解通信职责的参考模型;TCP/IP 四层则更贴近互联网协议体系的组织方式。两者不是两套需要同时逐层运行的机器。常见对应是:OSI 的应用、表示、会话合到 TCP/IP 应用层;传输层对应传输层;网络层对应网际层;
操作系统的进程调度算法有哪些?时间片轮转和多级反馈队列有什么区别?
进程调度从就绪任务中选择下一位使用 CPU 的任务。先来先服务按到达顺序,短任务优先更关注完成时间,优先级调度按优先级,时间片轮转则让就绪任务轮流运行一段时间。
HTTP Keep-Alive 和 TCP Keepalive 有什么区别?长连接能保证对方一直在线吗?
HTTP Keep-Alive 和 TCP Keepalive 有什么区别?长连接能保证对方一直在线吗?连接复用、空闲探测和业务健康是三个不同目的。讲清三者各自解决什么、又解决不了什么。
两数之和怎么用哈希表实现?为什么要先查再存,不能重复使用同一个元素?
两数之和怎么用哈希表实现?为什么要先查再存?每轮只在已经经过的元素里找补数,找到的自然就是另一个位置,也不会重复使用同一个元素。讲清查与存的顺序为何不能颠倒。
最长无重复子串怎么用滑动窗口实现?为什么左边界只能向前移动?
最长无重复子串怎么用滑动窗口实现?为什么左边界只能向前移动?重复字符只影响当前窗口,已经离开窗口的位置不能把左边界拉回去。讲清窗口收缩的判断依据。
僵尸进程和孤儿进程有什么区别?为什么 kill 不掉僵尸进程?
僵尸进程和孤儿进程有什么区别?为什么 kill 不掉僵尸进程?僵尸已经退出但尚未被回收,孤儿只是父进程先退出,两者不能混为一谈。讲清资源回收的责任在谁手上。
fork 和 exec 有什么区别?写时复制 COW 是怎么工作的?
fork 和 exec 有什么区别?写时复制 COW 是怎么工作的?fork 创建子进程,exec 替换程序映像,私有内存通常在写入时才复制页面。讲清两个调用为何总是成对出现。
哈希冲突怎么解决?链地址法和开放寻址法有什么区别?
对比链地址法与开放寻址法,通过冲突和删除算例解释探测路径、墓碑、实际键比较、负载因子与扩容,说明平均复杂度和最坏情况边界。
合并区间怎么做?为什么要先按区间左端点排序?
提供 TS、Python 合并区间实现,解释左端点排序、包含关系与不变条件,区分闭区间和半开区间,分析最后追加、输入校验及时间空间复杂度。
系统设计面试题2 道
分布式事务怎么实现?2PC、TCC、Saga 有什么区别?
跨服务各自使用本地事务,无法直接靠一个普通数据库事务覆盖全部资源。2PC 让支持协议的参与者准备后统一决定提交或回滚,但有协调、等待和恢复成本。
分库分表怎么设计?分片键、跨库查询和在线扩容怎么处理?
分库分表可以按职责垂直拆分,也可以按分片键把同结构数据水平分到多个表或库。它用于处理单节点容量与负载约束,不是数据库变大就自动必须做。水平分片先看访问模式。能带分片键的查询可以定向路由,不带就可能散射到多片再汇总;
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。