如题,这是晨风面字节的面经,感谢他的投稿,将这次宝贵的面经分享给大家。
后面还有一份有赞的,最硬核的是字节三面,硬核的CSAPP
都出来了,我看完题目的第一反应是
如果你没有看过CSAPP这本书籍的话,或者对计算机底层相关有所涉及的话,恐怕一些相关的问题,回答起来挺吃力的。
这里的CSAPP书籍,全称是:深入理解计算机系统
深入理解计算机系统
至于对本书的评价,可以逛逛一些社区,看看大佬们对它的评价如何,不过工作之余有时间的话,我挺推荐大家去阅读的,周末在家细细品读。
介绍完这本书籍后,我们回到正题,为什么我强调字节三面是很硬核的(可能我涉及面太少了)
比如第一个问题:说一下 js 代码到 CPU 单个时钟周期指令的执行的流程。
围绕这个问题展开的话,没有看过计算机系统相关的书籍,应该回答挺吃力。
这里我猜想,可能跟他前面的面试表现有关系,可能是压力面,可能是简历上面有涉及到相关。
友情提示:只开放了部分问题,没有答案,面经应该就是如此,思辨的过程应该留给屏幕前的你。
以下是正文。
字节跳动某部门面试
一面
- 浏览器缓存有哪几种类型?
- chrome 80+ 对 cache 的改动点了解吗?
- cache 如何做到在不同域的情况下,还可以共享cookie,且不考虑 samesite 和 domain 设置
- 如果本地资源里面有一个 10 mb+ 的图片,它又是整个网页的背景图片,你如何优化它,让它不影响网页的渲染速度?
- react 17 和 18 分别做了什么优化
- react 17 的合成事件的具体改进点在什么地方
- react 什么情况下 state 是同步的什么情况下是异步的
- react 的 state 异步的情况下是个宏任务吗?
- 看见你使用了 MVC 的形式开发组件,依赖注入的原理说下
- 如果我想让某个类的属性继承其他的类,那么这步的依赖注入应该如何做?
- 看你了解 js v8,那么隐藏类主要是解决什么问题
- 知道隐藏类的作用后,我们在编码的时候应该做哪些操作可以提高编码执行效率,至少说两点
- babel 我看你也挺了解的,请说明如何优化直接 import polyfill 整个包的情况。
- babel runtime 和 helper 有何区别?
- 它们和 preset-env 有何关系?
- 为什么最新的 babel 草案(Array.prototype.at),没在 preset-env 的支持范围
- preset-env 的 stage 和上一个问题的关系
- babel 的原理
- babel-plugin-import 主要做了什么操作
- import 插件对于当前的 bundle 环境,你认为还有什么价值?
二面
很多都是项目问题,这里略过
- Http 2.x 和 Http 1.x 有啥区别?
- Http 2.x 有哪些特性?
- Hpack 做了什么?
- PSK 有啥缺点?
- 为什么选择 qiankun,什么场景需要使用微应用?
- qiankun 和其他方案相比到底做了什么,有什么优势?
- qiankun 和 single-spa 的区别?
三面
这是我目前所有面过交流中给我最大压力的,论难度,排在我面经中的 top1 当之无愧。
形式:我根据问题,自由回答,它会直接打断提出言论,让我最难受的就是——我回答完毕一个问题,面试官总会希望追加,还有吗?你说不出他会给你一个方向,让你现场想,比较耗费脑力
- 说一下 react 的 fiber。
- 说一下 fiber 的属性
- 为什么需要设计可中断的模式?为什么最后选择了类似 fiber 这样的数据结构?
- 由于 fiber 是可中断的审核节点的更新,那么 fiber 检查完毕某个节点时,我又去修改了此节点,这里 react 会如何处理?
- 为什么一定要使用可中断更新的模式?其核心需求是什么?就算现在的结构是链表,但是用递归也可以实现的。
- 究竟为什么 v15 递归不行?如果我记录一个全局变量,那么虽然递归无法直接回溯到制定的状态,但是我们依旧可以通过计算得出上一次递归的中间结果。
- 为什么数据结构必须要是链表,数组呢?
- schedule 是如何设置对于组件更新、删除状态的优先级,这个调度是如何伴随 fiber 节点的 diff 而产生变化的?
- 这个优先级节点在源码中还是比较难的,这样吧,你自己去设计一个动态优先级调度的 schedule 你会怎么做?(没答好,没经验)
- 说一下 react 组件异步加载
- 自己实现一个 react 异步加载组件说一下思路,我就是想看看你对组件理解有多深
- react 的 jsx 是如何通过 React.createElement 生成最后的数据结构的
- 说一下你常用的 react hook,以及在项目中的优化使用。
接下来看一下 webpack
- 之前异步加载你提到了 require.ensure。说一下 require.ensure 的原理
- 使用 jsonp 的 require.ensure 只是一种模式,但是已经过时了,还有其他解决思路吗?
- webpack loader 是如何进行排序的,这个规则在什么 webpack hook 中出现?
- acron 解析代码至 ast 后,内部是如何解析模块关系的?
- 你写过 webpack plugin 吗?
- 关于 tapable , 你从最基础的角度说它主要是用于做什么,怎么让 webpack 跑起来的?
- http2 做了啥,把知道的全部说一下
好了,前面只是开胃菜,下面开始考 CSAPP。
- 说一下 js 代码到 CPU 单个时钟周期指令的执行的流程
- 函数中调用函数,在计算机中是用了 rbp 和 rsp 去做栈帧顶和底的保存,那么如果函数中调用了新的函数,它是怎么保持调用关系的?
- 你执行一条机器指令时,你在函数中声明的变量和语句都会进入调用栈帧吗?
- 数组在堆内存中的表现形式是怎么样的?
- 字节码解析的时候它是怎么去读取内存的?
- 这样,我再给你一段代码,你把这段代码的 v8 执行过程说一遍。
function a() {
let x = [12,3]
console.log(x)
}
- 这里在解析成 AST 前引擎会先做什么事?
- 这里的那些元素是不会进入计算机调用栈帧的?
- console.log 这个在内存中(字节码态)是如何读取的?
代码题
- 看代码写输出,中间有 promise 的问题时,写一下 promise 源码伪代码,以说明前一个 promise 何时被 resolve,才会触发 then(这里我提到了,如果返回值是一个新的promise 以及 thenable 的处理方式)
- 数组去重,每个数组元素内部内部可能是对象(我一开始用了排序+序列化的手段消除了不一样的对象元素,他看完后,禁止我使用这种方式,由于面试时间也长了,它让我用其他方式说一下思路。我说了递归,并且用 Map 做一个递归节点的记录,以防出现死循环,之后它又问,如果不允许你 Map 呢。。。。这个留给读者自己思考吧)
有赞面经
一面:
- 观察者与访问者模式的区别:
- 宏任务和微任务种类:
- MessageChannel 是什么?
- http 与 https 区别
- 证书是如何加密的,用了什么算法,如何确保安全性
- 有方法可以破解 https?
- 301 和 302 除了临时重定向外还有什么本质区别
- 307 和刚刚的 301 和 302 有啥区别
- 307 会出现在什么场景中?
- 为什么有同源机制,同源机制的触发条件是什么?
- 简单请求默认允许修改报文的那些部分
- 带 cookie 修改 cookie 还是简单请求吗?
- 说说所有你知道的跨域实现方式
- 说说 jsonp 的实现
- 说说如何扩展简单跨域
- 说说复杂跨域和简单跨域的区别
- 同源策略如果是二级域名会不会影响
- 复杂跨域还问了,但问了啥,我忘了。
- react class 与 hook 区别
- js 各种判断类型的所有方式,综合考
- instanceof 的缺点
- ts 的优缺点
- 你平时如何使用 ts?
- 你怎么看 ts 的泛型?
- 使用 ts 如何只继承一部分元素
- let const var 的区别
- 说说 var 和 const 的特殊情况(var 和块级作用域的函数同名会触发浏览器的行为不统一,const 声明失败会触发永久性死区)
二面
- monorepo + sudmodule 如何绑定私有 gitlab 与 github 的关联
- 为什么要用 monorepo 架构?
- 你认为的 monorepo 在你的项目中的优势是啥?
- 看你使用过 qiankun 你认为微前端到底是为了解决什么问题而生,用在你这的场景合适吗?
- 你是因为什么场景需要解决微应用 css 污染和挂载问题?(扯到 shadow dom )
- 问 shadow dom 的浏览器事件的冒泡机制
- 你认为微前端的未来是什么样的?
- 如果让你优化现有的架构模式,你会怎么做?
三面
三面实际难度很高,重点深挖项目,此处不包含项目问题。
- 你认为自己最大的优势是什么?并举例证明自己的观点。
- webpack 中 loader 在哪个 hook 触发的?
- loader 实际上是怎么 run 的?
- loader 和 plugin 本质区别是啥?
- plugin 可以干涉 webpack hook 中的 run 这个钩子吗?
- 你写了什么 webpack plugin,说说为什么要写。
- 聊跨段引擎实现
- 聊我未来的规范和想法