字节跳动面经
杂谈 | 共 4278 字 | 2020/3/29 发表 | 2020/3/29 更新
大一还没结束的时候在滑铁卢的事,算是我第一次大厂面试经历
背景
我是加拿大滑铁卢大学数学系大一的学生,Co-op 实习项目的,简单来说就是除了八个四个月的学习学期还有六个四个月的实习学期才能毕业。本来我是在加拿大找实习的,但是因为疫情等原因没找到。周二晚上我突然收到了来自“字节跳动前端研发”的邮件,说是看到我在 GitHub 上的项目,他可以内推我,问我要不要投份简历。
我一开始还以为又是诈骗邮件或者 bot 发的垃圾邮件,因为我没觉得我 GitHub 上有啥拿的出手的前端项目。但仔细一看发件人确实是bytedance.com
,所以试着回了个邮件,没想到他秒回。于是我加了他微信聊了聊然后周三做了个中文简历发给他,简历刚交上去就接到了北京办公室的电话,跟我核实信息。
不得不说效率真挺快的,在加拿大这边投了很多公司都没收到几个面试,而且都是小公司,所以我本来都没抱多大希望。没想到字节跳动的 HR 周五早上就加我微信约面试了,虽然我没怎么最准备,但还是约了一个最近的时间,我这边周六晚上十一点,北京时间周日上午十一点。周五那天要赶微积分作业没时间看面试相关的内容,就只能周末看了。
(可能是在加拿大习惯了,一开始我还以为是北京的周一,没想到国内周末还上班,差点就弄错时间了,还好家长打了个电话。我本来以为有两天的时间准备,结果只有一天。
我是从小学开始就接触编程了,各个方面都有接触但是都没有精通的。基本功方面高一在信息社参加过竞赛,但是还处于很初级的阶段。所有的项目都是自己随便整的个人小项目,没有工作经历,所以我一直没抱多大希望。
我问了下内推我的老哥,他说建议我看下牛客的面经。我把最近所有字节跳动我前端面经都看了一遍,发现问的大多是比较底层和理论的东西。我根据自己的实际情况,果断放弃了 css 相关的内容,看了一些 js 和 vue 比较常见的问题,发现一时半会根本搞不明白。于是我周六下午开始刷 leetcode,之前几乎没刷过,周六晚上吃完饭家长给我打电话我才发现马上就要面试了,准备时间顿时少了一半。不过准备的过程中我发现自己不会的东西还是太多,再给我一天也不会好多少,所以心态也还算 ok 吧。
一面
一面提前半个小时开始的,面试官是个小姐姐。
-
上来我先简单介绍了一下我的情况,说了说自己的小项目。
-
根据项目问 WebSocket 多路复用的实现
我当时只是做了最基础的功能,就是把数据包封装加上连接的 ID 和包的 ID
-
根据项目问了 Base64 的实现——没什么难的,然后为什么要用 Base64
把非文本数据变成文本,可以把数据放到 url 里面之类的,感觉答的不太全面
-
我了解的前端技术
CSS 是需要现搜的了解不多,JS 方面说了说 NPM 方便开发者这种,之后说了下 http 协议一些 Get Post WebSocket 这种
-
GET 和 POST 的区别
说实话我是多次看到了这个作为面试题出现,但是我也没去系统的研究区别,就是根据自己的经历大概说了说,答的不太好。
设计上 Get 的获取数据 Post 是提交数据,不过 Get 也可以用来写数据,只是没有 Body 数据都在 url 里所以传不了多少数据,而 Post 的 Body 里面可以放很多数据。
-
Post 的 Body 里面数据的处理问题
我之前其实写过 multipart 的库,但是好久没接触了,这个答的不太好
-
跨域
这个之前自己写项目的时候遇到过,有过一些了解。
a.baidu.com
和baidu.com
算跨域因为域名不一样。解决方式有 jsonp 把数据打包到 js 文件里,浏览器会放行 script 标签的请求。或者服务器的 header 里面可以允许跨域之类的。 -
问我有没有接触过数据结构和算法
大一嘛,校内学的不多,但是自己接触过所以没准会
-
两个排好序的数组 merge
没想到问这么简单的,先说了下思路,就是每次比前一个谁大就放到新的里面,然后我用 Go 写了一下。但是当时我比较紧张而且好久没写 Go 了,所以语法一直写错。好在思路没问题而且小姐姐不会 Go,过程没问题就过了
-
JS 基础数据类型
昨天刚看过,number,object,function,bigint,还有别的但是 js 我不太熟(基础不太好
-
本来想问个 css 的问题但是想起来我接触的不多就换了过问题
-
浏览器加载过程
dns 解析->建立 http(s)连接->分析 html->加载 css/js->好像不设置的话是都加载完好像会开始显示
-
图片会后加载吗
不确定,但是根据经验显然不会因为图片没加载完整个网页是白的
-
遇到 css 标签浏览器会怎么处理
应该是浏览器会“下载”css 文件然后替换到网页里面,不太熟答的不好
-
head 里面 js 没加载完 body 会显示吗
我记得是不会显示的,要等加载完,但平时网站统计代码官方都是说放到 head 里的,似乎不加载完 body 不显示也不太合理,不太确定。这其实是非常基础的,没答上来属实不应该。
-
队列和栈了解吗,用两个队列实现栈
其实这属于非常非常基础的,面经里面之前扫到过但是没有看,所以只能现场想。差不多花了十多分钟,想到一种 push 的时候倒一遍 pop 直接 pop 的方法,每次操作都要 O(n),当时觉得这个方法好蠢,以为不是最优方法。
-
有什么问题吗
到这里已经过了将近一个小时了,我感觉自己的表现不咋样,已经没戏了。所以问了她觉得我缺少哪方面的技能,她说一般不要求前端基础多扎实,计算机基础合格就行,缺少我基础也不太扎实。
我本来以为到这就结束了,她说让我等会。于是我上网查了两个队列实现栈,发现网上发方法也是 O(n),只不过是 pop 麻烦直接 push。然后又跟面试官聊了聊,非常意外的发现我竟然进入了二面,我本来以为很多没答上来已经凉了。
二面
-
介绍自己
-
为什么选择前端
网站大多数人都能看到有成就感,好上手,我其实觉得前端还是后端都可以,内推的我是前端岗位
-
基础了解的少,怎么去学习
之前都是自己的小项目,没有系统性学,都是想实现什么功能现搜。今年开始找工作意识到了自己的缺点,开始多看文档,刷题,学校里也在讲
-
https 建立连接的过程
一句话说就是建立 tls 连接然后当成正常的 http 连接用。tls 建立过程我之前写过 WebSocket 代理所以了解比较多,说了一大堆。
-
http/2,http/1.1 有什么缺点
不太了解,说了多路复用和 google 那个 spdy 还有 udp 之类的,总之是更快。面试官说那是 http/3 了
-
浏览器缓存
浏览器可以根据之前服务器响应 header 里面的设置缓存,或者 etag 和 last modifiy 这种。了解不深后来面试官还详细跟我说了。
-
最深数组
我说暴力算法肯定会但是应该有更好的,面试官说可以先写一下暴力算法,简单写完发现并没有更好的算法
-
二分法查数组变种
这个是刚刚写过的 cs 作业,而且是用 hoare logic 证明的,还挺熟练的。但是当时解释过程的时候说的不是很清楚
-
js 的 prototype 那种问题,问输出结果的
这个我确实不太会,分析半天,可以说错了一半
其实二面的过程一直在聊天,我发挥一般吧,暴露的 js 水平不行的问题。面试官和三面的面试官说了半天,因为我大一实习情况比较特殊,问了以后实习的时间,最后二面还是过了。
三面
-
回行打印矩阵
面经里看到这个题了但是没有做,但是感觉不难。现场分析了一下写了代码,我感觉思路上是没问题的,但是代码里面的行和列我搞混了好多(可能线代学的不扎实)。这道题就整了二十分钟,时间问题跳到下应该问题了,所以算是不成功吧。
-
js 的原型继承
自己写代码的时候基本没接触过,没看过文档,看面试题才开始学的。
-
介绍自己的项目
-
为什么用 vue
双向绑定和 mmvm(当时说错了)都是现看的
-
双向绑定好处,原理
开发过程可以更细化之类,都是现看的说的也不清楚
-
css 缺点,saas/less 解决什么问题
了解的不多
-
cookie,session,localStorage
之前有了解过一些,cookie 是服务端响应 header 里面设置的,浏览器请求会带着放到 header 里面发送,localStorage 用来存 leetcode 代码这种数据,session 是服务器用的,不是很熟悉,用到的不多
-
动画
没用过
-
实习的情况
大概介绍了一下我们学校 co-op 项目,后面比较灵活
-
有什么问题吗
问了一下对我有什么建议,大致是说打好基础就好,对后面了解框架之类的会有帮助
三面时间比较短大概不到四十分钟,但当时我这边已经凌晨一点半了,平时睡的比较早,状态实在不行,可以说发挥是非常差了。虽然很意外的进入了三面,但还是觉得自己机会不大,确实不会的太多了。
反思
首先是准备时间太少,很多面试题都非常基础,答不上来想那么久真的不应该。但凡有一周时间好好刷一遍都会好很多,面试官给我的感觉是计算机基础是最重要的。
其次是对于前端基础知识的了解,这方面的内容其实也没多少,平时写项目的时候多读读文档,多注意细节慢慢就会掌握了。
还有就是介绍自己的项目其实可以写一篇提前准备,要不然介绍的时候很可能说不到重点,导致后面会比较紧张。这是第一次在国内面试,可能多面试几次会好很多吧。
最后就是要对自己有自信,如果没有内推我完全不会想到申请字节跳动这样的大公司,事实证明还是有一定机会的。感觉国内大三大四的学生平时打好基础,进入这样的大公司不是问题。