字节前端校招面经|已拿offer

2,547 阅读12分钟

背景介绍

我本人是双非大三计算机专业的一名学生,在一家比较好的公司实习,但是看到秋招开始,想有更多的选择,开启了一段 9:00Am-9:00PM 完成公司的需求,早晨以及星期六星期天准备面试的一段007之路.

一面(7月31号 牛客视频面试 40分钟)
  1. 简单的自我介绍(本人的介绍-开始学习时间-实习过的公司-实习外写的项目)  

  2. 在。。的实习中你做了什么(没有深入问)

  3. 在。。。实习的时候干了什么(没有深入问)

  4. 你在实习的时候用了react,react setState完以后发生了什么事情,执行流程等做个描述

  5. react Fiber的作用是什么

  6. 我们一般结合状态管理工具,react redux 具体帮我们做了什么事情?

  7. css中垂直居中怎么实现,有几种实现方式?(我回答了3种方式,可以看我的博客,在CSS实现居中(完结篇))

  8. 缓存机制

  9. 描述一下TCP的3次握手4次挥手(我比较详细的描述了这个过程,提到了 initial sequence number ,window size, 为什么是3次和4次等等)

  10. 我们一般用二维码登陆,尽可能详细的描述一下前后端涉及的过程(我写的项目中我没有涉及过,因此我是从最初的HTTP无状态,然后出现了cookie,然后网络安全,性能,服务器存储session的压力等等原因,发展到了用token , 然后现在的oauth..然后说我确实没有写过扫码但是我大概知道鉴权的发展历史)

  11. 给了一个数组,让我排序(我首先用了sort,然后传一个callback 的方式实现了排序,然后用最简单的算法冒泡排序,然后我优化了冒泡排序,然后说给我一点时间的话,我可以写快速排序nlogn,比O(n*n)的冒泡排序快)

  12. ....200毫秒发起一个请求,写一个防抖的函数(我写完以后给面试官讲了一下我的思路)

我写完防抖后面试官直接说你过了,你等一会,2面面试官会过来,当时很兴奋,没有说等通知呀这类的,爽啊

2面(7月31号 视频面试 一个小时20分钟)
  1. 自我介绍

  2. 你介绍一下你刚才说的..小程序(是什么,项目背景,解决了什么问题,我学到了什么 )

  3. 你刚才说到了你的代码超过了2M限制(小程序的代码提及限制),然后再详细说一下你的解决方案

  4. 然后是性能(我首先通过lightHouse测试,然后从3个大方面,减少代码体积,减少请求次数,提高网络性能等,我详细的介绍了我从3个方面如何提高我小程序的性能)

  5. 你提到了懒加载,这里有3个属性 clientOffset ,offsetTop ..这3个属性的区别是什么

  6. 小程序里有rpx,你知道它的作用吗?以及怎么实现的

  7. H5里有rem等,他们的功能是什么 rem em rpx px的区别

  8. 看到小程序有图片上传等功能,这个功能是怎么实现的

  9. H5环境里实现的话,怎么实现 比如图片,文件比较大,怎么上传 然后我提到了blob ,让后他就问了blob,file的区别

  10. nodeJs如何连接数据库,并且操作数据的

  11. 你刚才提到异步,我们想实现一个网络超时检查,比如网络请求超过3秒认为是失败的,所以现在希望你用promise来写一下这样一个检查 (我在这里的思路是通过 now Date的方式来设置两个时间点,一个在请求开始为startTime ,另一个是请求结束后endTime,若endTtime-startTime超过3秒,就reject,否则resolve,我用setTimeOut来模拟了请求)

  12. 你了解promise.race这个方法吗?然后你觉得这个可以解决网络超时问题吗?你觉得怎么实现(说了整体的方法)

  13. 然后说如果让你实现这个promsie.race怎么实现(我说我没有说些过,但是让我实现我觉得(说了思路),然后面试官说我们不管是怎么实现的,自己实现一下吧,很期待你能写出来哦,,,一下子我的压力变小了很多,我感觉面试官不是在监视我写代码,而且一起hack这个问题的感觉,当时感觉很好)

  14. websocket和http的区别是什么

  15. webpack一个项目从0怎么搭建(我首先说了为什么会需要webpacj这样一个东西,构建是什么等,然后再讲了npm init,然后装webpack dev server ,babel loader 呀这类的)

  16. 你刚才提到了babel,babel loader 是怎么实现语法转换的(我回答了词法解析,语法解析,然后AST,然后es6的AST换成ES5的AST),然后更加详细的问题了AST(我没有回答出来)

  17. sum(1) sum(1,2) 你能不能写个方法都返回3(我用arguments来判断参数数量,然后给写出来了,,兴奋),然后时间原因到此为止,可以拓展一下,如果有多余2个参数,怎么解决?

  18. 你有什么问题要问我吗?(基于今天的表现,你有什么建议吗?)

当时比较慌,面试官没有像一面面试官一样说过了,但是我干了一件比较好的事情,我把问到的sum(1)和sum(1,2)的问题拓展自己做了一下,然后拍图发给了HR 面试很爽,我确实没有看过promsie.race怎么手写,准确来说,看过但是没有看懂,感觉不太好写,但在面试的时候跟面试官互动等,然后给写出来了

3面(8月4号)

面试官先介绍了一下部门以及所做的事情,然后说我们大概进行45分钟,然后再聊一聊其他的问题

  1. 介绍一下Hooks,它的背景呀这类的(我看多reaact config 里介绍Hooks的讲座,Dan Abramov那一个据介绍印象比较深,并且笔记过,比较好的回答了出来,从class的一些缺点,面向生命周期编程,wrapper Hell 等问题,然后如果用到state必须把funciton变成class等,然后再是Hooks是什么,然后常用的hooks有那些)

  2. 看你写小程序比较多,H5跟webbiew的区别是什么

  3. 然后提到了小程序双线程,你觉得为什么会是双线程 然后再一些基于我的回答的比较详细的问题

  4. map,video等原生组件,然后还有webview,这两个怎么通信(没有回答出来)

  5. 你提到Taro,rax(阿里的跨平台框架)等框架,那些框架你觉得是怎么做到多端统一的

  6. 浏览器渲染是什么样子的,就是浏览器拿到response以后怎么解析的?怎么展示的(我提到了html解析,词法解析,语法解析,然后css变成CSSOM,然后DOM树,然后render tree(然后我这里提到了一些DOM和render tree之间的区别以及性能优化的手段,然后他再详细的问了一下),然后reflow,repaint,然后他问了一下写css的时候有什么讲究等,怎么样减少重回和重拍)

  7. HTTP2.0(我回答完server push,堆头阻塞等题后,然后他再问了一下server push ,content-encoding等问题,一个域名最多可以请求几个请求,然后堆头阻塞是怎么解决的)

  8. XSS CSRF (我回答的时候按是什么,分为几个,然后怎么攻击的,然后怎么防范(提到了字节官网投简历的时候怎么做输入检查的))

  9. 后面就是我们聊了可不可以提前来,部门业务,以及我未来3年的规划等问题,他说如果你毕业之前来的话,字节会是正式员工的80%的工资来给你等。。然后我大概感觉到我的面试过了。。

然后3面结束后大概过了半个小时,来了HR的电话,是小哥哥,简单聊了下了后续流程,然后说3-5个工作日内有确认消息,然后星期五收到了意向书邮件

一些建议

  1. 简历,简历,简历超级重要,其实我可以感觉到字节一面是有题库的,面试官会说一下这个题目是问等,但是2,3面全是基于简历,项目经历以及我前一个回答来提问,因此你写简历的时候其实面试已经开始了,我写过两个小程序,因此我的面试中有关小程序的问题比较多

  2. 这些问题中有一些我没有回答出来,比如扫码验证等问题,但是我是从鉴权的历史Http无状态,cookie,token等来回答,webpack的从0到以的构建,我首先回答了为什么需要这个工具,模块化发展史,然后才是webpack项目怎么搭建,然后XSS,CSRF问题的时候,我结合了一下自己的经历,比如字节投简历的时候字节官网是怎么进行邮箱等的输入检查的,这个其实一方面是为了防范XSS攻击,因此可以总结回答问题模式的话,可以如下方式回答

  • 根本不会以及了解特别少的问题,直接说不会(比如node连接数据库的问题,我知道如何用node来CRUD,读文件等,但是我不懂node一些原理,因此为了不给自己挖坑,说了自己是用微信云开发提供的API来搞的,我只是会CRUD等如实地回答了该问题)

  • 不太会的问题(比如,扫码验证,我没有说不会,我先是从鉴权的发展史来回答,HTTP无状态,然后是cookie,然后cookie存在的问题,然后是token,然后说我没有搞过扫码验证)

  • 会的问题(是什么,为什么(发展史),实际问题中的例子,比如webpack项目的从0开始搭建问题,我先提到了模块化的历史发展,最初是 先引入a.js,然后是b.js等,然后是对象来包裹,然后是立即执行函数,然后是需要构建工具以及开发环境和线上发布环境的不同(开发环境,我们希望代码有模块化越好,但是线上环境我们为了减少请求次数,只有一个bundleJs好等,然后再回答了怎么npm init ,装常用的插件等),再比如,XSS,CSRF,我先是用一句话回答了XSS是什么(浏览器执行了用户输入的脚本,分为3种),怎么防范,然后跟实际结合了一下(字节投简历过程中输入校验等))

  • 编程题目 (暴力解决-再优化)

  1. 面试前一天我是绝对不会打开微信的,面试前几个小时前我就让手机飞机模式了,然后面试至少15分钟前,我会找到一个地方,安静的等待,心里想一想一些特别常见的问题怎么回答,我自己认为情绪,我的状态对面试有很大的影响,因此我希望我面试前尽量的安静,尽量的沉下心来.(以上是建议,当然对我管用的对你可能没用)

  2. 一定要笑,我是从自我介绍开始笑(我做过一些比较有意思的项目,比如提高深大人们的脱单率),然后整个面试氛围我都是尽量轻松,不要想的这个面试是决定我什么什么。。。公司很多。。不必那么紧张,并且你可以搜Dan Abramov(react core team 成员,还有一堆title的大神) 等大神的面试的一些段子,他也有回答不出来的问题,因此一个面试没有通过不会说明你就是菜,一个公司的一个部门不要你,不会说明其他部门不会不要你

  3. 看面经是可以的,但是看面经只是一个查漏补缺的方式,不可能看面经来获得比较好的offer, 啃书,啃官网才是最有效的方式,看面经的时候你可以进行分专题总结,比如计算机网络会问到那些点,react会问到什么,然后再带着问题看书,看官网的时候效果很很好

  4. 你需要 非常必要的废话 和一张白纸,这个是我自己的一个经验,面试官问一个问题,先思考思考大概30秒,再想不出来的话,我会说我遇到过这个问题,我了解过这个知识点等filters,比如,讲英语的时候,my name is em Abdulla and I am a ,you know,you know, software enginerr in ALibaba等,这里you know 是没有意义的,只是想不起来后面怎么说了,需要一个缓冲,面试的时候你也用这个技巧,给自己30,15秒思考的时间,然后白纸,我每一次回答问题的时候我会写上 1. 2. 3. 等来特别有逻辑性的回答,白纸上画一画比脑子里面单纯的想效果更加好,不会漏自己本应该知道的点。

如果你觉得对你有帮助,希望点赞关注,将会总结自己的前端学习之路,以及自己的大三上在腾讯实习,暑期实习进阿里,然后现在的校招经历过程.

最后祝大家都有一个好的offer,并且如果你正在找工作等需要内推,可以给我发邮件abdullaszu@gmail.com,可以内推你到字节并且给一些简历以及面试方面的建议