2021 前端实习面经

梨子2021-4-11,更新于 2021-4-19
本文最后更新于 763 天前(2021-4-19),其中的信息可能已经有所发展或者不再适用于现阶段。
本文全长 16394 字,全部读完大约需要 47 分钟。

有个叫做“校招巴士”的公众号说 2021 年是找工作最容易的一年,很多大厂都在扩招。这次运气还不错,到目前为止,按时间先后拿到了美团、携程、阿里、小马智行的 offer call,挂了滴滴和腾讯,也算是成功上岸,总算可以松了口气。花了好多天时间,把经历整理了一下。因为我没有录音,全都是凭回忆整理的,可能会有很多遗漏,慢慢想起来了就补充。

认真对待,提早准备

一定要认真对待!

大三的时候我也找过一次实习,那次我开始的时候已经 5 月了,本来很多公司都不招了,然后也没去网上收集很多招聘的资料,我的学长们天天鼓吹我内推,结果给我一种想进很轻松的幻觉。结果我当时就面了阿里和字节跳动两家,然后阿里一面还好,当时看了一些面经,就问一些什么 TCP 三次握手四次挥手之类的问题,都答出来了。二面就挺惨的,我被内推的是 Java 研发工程师,是蚂蚁金服做分布式计算的部门,然后就问我一些很难的我根本不会的问题,什么有一个主从集群,主节点现在故障离线了,要从从节点中随机选举出一个新的主节点,怎么实现。我就想啊想啊,面试官说,换一道题吧,然后又想啊想啊,面试官说,那问问算法吧。算法也很难,问什么有几亿个 ip 地址,怎么从里面查找出什么大概这样一个问题,我又想不出来,最后毫无悬念地凉了。字节我投的是前端,我就记得一面的时候面试官问我前端的基础问题,我好几次回答完,面试官就说“哈?”,脸上大写的质疑和鄙夷,凄惨凉凉。美团和腾讯让我笔试,我当时想,别人公司都不用笔试这个怎么还要笔试,就没做。华为让我去线下面试,我说我在山大交流不在学校,她说那下次吧。就这样我没找到实习,备受打击。

虽然现在看来那时候太草率了,但是当时内心也是很煎熬的,也到处看面经,为什么就是不过呢。因为那时候心存幻想,总想着这个好好准备争取一个公司就过了。这是十分不对的,想要有好的结果,一定是要竭尽全力做万全的准备!

一定要多投,海投

这是去年我的高中朋友校招的时候教我的,我谨记在心。去年年底去参加 PyCon 一个前辈也是这么说,他底子很差,非本科非科班,他说他把成都的公司全都投遍了,告诫我们一定要认真努力,放弃幻想,坚持斗争。这是真理中的真理,所有别人的经验都不及这一句话有用。当你经历了足够多的面试,所有的经验都能自己总结出来,所有的知识再难背也能烂熟于心。不要直接投自己想去的,先多投些其他的,战略性步进,一会我会详细讲。

给算法不好的同学

一直以来我觉得自己是个算法基础很差的人,可能因为周围一直围绕着 ACM 大佬的缘故。我的建议是,去读《算法导论》,比任何的刷题都有用。很长一段时间以来,我一直停留在“没有入门”的状态,不知道为什么要这样做,觉得好难(而且没意义,没乐趣,逃避)。周围的人都说刷题刷题刷题,而我刷题只会受打击,不能让我有系统性的提升。直到研一学校算法课用《算法导论》这本教材,我在考试的逼迫下把这本书读了一遍,我才感觉“入门”了,不怕了。我现在遇到题知道它像个贪心题,还是动态规划,还是分治。算法导论会告诉你如何分析问题具有什么样的性质,拥有什么样性质的问题可以用什么算法思想来解。它不难!它的英文名叫《Introduction to Algorithms》,introduction 而已,国内过分神话它了。读这本书最好的时候是大二,这时你还会级数求和,概率分析,假设检验。不要怕,像要考试一样读它,把里面的证明都读懂了。然后再稍微刷点题练一下思维和打码的速度,很幸运,前端对可以说是对算法要求最不高的岗位了。

给想找前端工作的同学

前端面试真的很简单。我加了字节跳动深圳飞书的内推群,群里分享的这个链接 前端年后面试真题,会80%直接进大厂。里面的知识点非常全面,我这么多面试下来都没有超出里面的范围!我复习全靠它,把它们都背熟,真的能过 80% 的大厂面试。

给还在读书的同学

尽力想好自己的未来,相信自己的感觉。喜欢开发的人不会喜欢算法,喜欢打工的人不会喜欢科研,做适合自己的事,不然迟早会放弃还是逃不了做适合自己的事。我大学的时候梦想着读研,还想做机器学习,但其实这些我并不喜欢,只是受到了别人做出的成绩或者金钱的诱惑。越早明确自己的方向,竞争力就越强。

给在/找实习的同学

如果有时间实习的话,一定要抓住机会别闲着。即使不是大厂,只要努力工作,也一定会有回报的。我之前在墨墨背单词实习,啥都做,不光写前端,还写后端,还写客户端,还当产品助理,颇有些觉得做的事太杂而不精了。但是现在很感谢这段经历,面试官看中的不光是你做了多难的事情,有没有惊艳的成绩,只要在和你交流的过程中发现你对业务和技术有扎实的理解,对工作有自己的思考,就是很大的加分。

和我面试的其他 50 人以内的小厂(或者大厂的小部门)相比,墨墨科技 是有百万用户和流量的互联网公司,发展很稳健很蓬勃。在这里如果好好工作确实能有活干,有很大的提升。同事们也很友好谦虚,相比之下应该也是非常不错的选择。


好啦,干货基本上说完了,接下来要开始长篇大论流水账了。

准备阶段

我在 12 月底的时候就开始准备了。其实我是分了几步:看书 - 写项目 - 刷题 - 刷面经 - 写简历 - 投简历面试。

我读了《CSS世界》和《JavaScript设计模式》两本书,CSS世界很好,让我收获颇多,对一些古老的属性比如浮动、BFC,还有对 position 定位也有了更深刻的认识。后面那本书,讲的东西都是 ES6 之前的,我不喜欢。如果时间多的话,其实可以再读一读红宝书和 DOM 的那本书,但我没时间了就没读。

然后就过年了,春节期间我糊出了 Kokoro Player 的 UI,一个是这个是我一直想写的项目,再也觉得自己没什么太拿的出手的作品,想写一个自己满意的作品贴到简历上。然而写好了感觉不是很满意,还是时间太仓促了,还需要优化。不过从后面面试的经历来看,面试能讲的时间有限,大部分面试官还是更感兴趣以前实习工作的内容。

写完项目我就开始刷题,每天做 10 道 leetcode 题,坚持了十几天。然后后来我开始面试了就忙着复习基础,没刷题了。

开始投递

之前字节跳动有两个 HR(都是广告系统的)来找我,问我要不要去,加了他们微信。到了 3 月他们就开始在朋友圈发招聘广告。然后 3 月六七号的样子我在腾讯和阿里的朋友也给我发了内推的海报,我就知道招聘的季节开始了。

第一件事是写简历,这件事我拖了很久,因为我一直觉得一个小时就能搞定。所以在写简历之前,我想去多刷一些面经。最开始我看的面经是这一份,abc-club/js-paradise,里面有篇文章叫 面试官到底想看什么样的简历? 写得非常好,很有指导意义。但是收集的那些简历模板都很糟糕,很花哨。有些培训机构的简历模板也是很花哨,他们自己还尬吹上了天。后来我忘了怎么发现了 超级简历 这个网站,它的简历模板很好,里面给的建议也很专业。但是不好用,于是我花了两天时间自己复刻了一个 satouriko/wonderfulcv,这样就写出一个不错的简历了。

我在写简历的时候努力控制在了一页,因为去年有实习,所以几乎是把原来简历里的东西全删了,只留了最近一页的经历。事实证明效果还是不错的,因为在有限的面试时间里,面试官只会问你一个项目的问题,所以第二页罗列再多其实也没什么用,只要把最能讲最能突出自己能力的工作经历写出来就好。

然后就是找投哪些公司,我只用了三个渠道,大厂官网、牛客网以及 BOSS 直聘。大厂官网,就是你能想到的那些大厂(大概有十个八个),去找他们的校招网站。牛客网我从校招推荐那个网页上从上往下开,把感兴趣的公司都打开,我主要投的都是游戏公司和金融公司,觉得游戏有意思,金融有钱。然后把它们汇总到一张表上,按照想去的顺序排序分组。我是分了四组,3 - 不考虑去只为刷经验的,2 - 没有更好的选择就去的,1 - 想去的,0 - 非常想去的。第一批次我投了 3 组和 2 组,第二批次投了 1 组,最后是 0 组。

因为大量地投简历,要填很多表单,所以方便起见,可以把一些问题整理在备忘录上,复制粘贴用。我备忘录里面有自我评价、专业成绩、校园经历、竞赛获奖、游戏经历:这些我的 PDF 简历上没有,但是公司系统如果让填我就填上。

笔试和面试

滴滴一面

滴滴是我在 BOSS 直聘上联系的 HR,官网没有招聘的岗位。我联系过 HR 以后,那个 HR 秒回说不好意思哈,职位已经关闭了,期待有机会再合作。然后过了 5 分钟(可能看了我的简历觉得还不错?),问我,你会 react 吗?我说会,她说希望尽快安排一个面试,当天下午就面。这是我第一次面试,是通过腾讯会议面的,面的时候感觉还自信满满,后来回顾的时候发现槽点其实很多:

答错了两题:

面试官问 JavaScript 的基本类型有什么?我当时甚至没有理解到「基本类型」指的是「标量类型」,以为基本和内置是一个意思。我回答了 null、undefined、number、string、symbol、object、function,没错太紧张漏说了 boolean,被面试官提示了。这还不是最要命的,function 根本就不是内置类型,面试官问我 function 是 object 吗,我回答不是。这都是因为想当然地以为 typeof 的结果 object 和 function 不一样,没有好好复习。

面试官问 position 的取值有哪些,回答了。然后问 absolute 是相对什么的,回答了。然后问如果元素祖先没有 position 的元素,那么相对什么,回答相对根元素(不是很肯定)。又问那这种情况和 fixed 有什么区别,没答上来,回答没区别。实际上 fixed 是相对视口的。

还有一些题回答的不好:

面试官问怎么判断一个对象是不是 Array,我答 instanceof,面试官问还有别的方法吗,我说转字符串,但是不如 instanceof 好。(但是这里并没有回答出来怎么转,如果现在的话我会知道回答 Object.prototype.toString.call)面试官显然不满意,追问我还有别的方法吗,我说既然有 instanceof 这么好一个方法就用呗。(现在我觉得他希望我回答 Array.isArray)

面试官问 let 和 var 的区别,我想了一会,说 let 的 scope 是以大括号为单位的,然后又卡了一会才说出「块级作用域」这个词。面试官问还有吗,我说我理解这个就是最重要的了,再就是没定义就用会报错之类的。(后来面试再问我,我就会一口气答出块级作用域、不能重复定义、暂时性死区)

又问我箭头函数和匿名函数的区别,我说箭头函数没有 this。面试官问还有吗,不知道了。现在再问我的话,我就会一口气答出 this 和 arguments 定义时捕获,不能 call、apply、bind,没有 prototype,不能 new。

问了怎么清除浮动,我答了 clear: both 和 BFC 两种,但是没答清楚在哪里放 clear: both,把谁设成 BFC,那时候我还是糊涂的。

问了 http2,我只答出了多路复用,问还有别的吗,我说最重要的就是这个吧。(二进制分帧、多路复用、头部压缩)

问了 https,对称还是非对称,回答的也比较模糊,不肯定。(握手和密钥协商是非对称,数据传输是对称)

React 问我知道哪些生命周期函数,我也不记得,我说名字太长记不住,他说说大概什么用就行,我就比划了一番。问我事件订阅、http 请求一般写哪,我说 mount 的时候。(后来我就都背下来了,还能背下来哪些是 render 阶段的,哪些是 commit 阶段的)

最后让我写 debounce,写了。

所以总之复习还是很重要的,有些东西给人感觉理解个大概,不是很扎实,和一看就是背过用心准备过,给人的印象差距很大。

但是我当时年少轻狂,自我感觉非常良好。然后面试完我问面试官几个问题,我说部门业务做什么的,他说做数据展示的,我问数据可视化吗,他说其实就做一些表格,也有少量图表。我问前端团队规模,3 个人。又问对新人的培养这块有什么可以介绍的,回答说没什么可介绍的,来了就熟悉熟悉业务。

我想着这垃圾部门肯定要我,我才不去呢。结果一天没消息,第二天我问,她说,“不好意思,不太合适哈”。我问为什么,她说,“基础太差了,JS 基本类型都答错”。感觉被狠狠羞辱了一番,心情巨差。不过现在想想,很感谢这番羞辱,让我认识到自己的问题,才有了后面的好运。

富途网络笔试

那些从校招官网上和牛客网上投的公司,大多都要先笔试。我刚投了之后就收到了若干笔试。我做的第一个笔试是富途集团的,牛客网,两道题,第一题要不用算术运算符实现 32 位整数加减乘除,我人直接傻了。我在那画真值表勉强想起了全加器怎么写,乘法只会用循环来模拟,减法我记不清补码表示是怎么回事了,除法更是完全不会。这道题就过了 10%。

第二题考了个这道题 Largest Number,我就差一点就写对了,我当时脑子短路写成了 judge(a.substring(len), b.substring(len)),实际上我知道应该是 a.length > b.length ? judge(a.substring(len), b) : judge(a, b.substring(len))。但是样例不知道为什么特别强,一直是 0%,我考试的时候怎么构造样例都检查不出问题。在线笔试的时候不像在 LeetCode 做题那样样例错了会报出来,什么提示都没有。最后就凄惨 0% 结束了。然后我去 LeetCode 上交这道题,不到 5 分钟就过了。

这次笔试对我打击很大,我觉得刷题没用,考试跟 LeetCode 完全不是一个难度,考试不光得有算法能力,还得会构造样例,这真是个很难的活。又觉得一个没听说过的公司都这么难,大厂不得难死我。

携程笔试

第二个收到的是携程的笔试,赛码网,开之前我在赛码网做了一些携程的题,有一道题让计算信息熵,然后没给公式,题没啥难的,不会公式就 gg。还有一道题让计算线性方程组的解,我做都不想做,且不说一小时根本写不出来,就算写出来,还有除以零和数值稳定的问题。我当时一度觉得这行业太傻逼,不适合我。

结果这次很走运,第一题考了个 Best Time To Buy And Sell Stock,我是用动态规划解的,后来我去 LeetCode 上看我以前交过的代码是用贪心解的。这题花了点时间,但是最后还算很顺利地过了。

第二题是小数化分数+分数加减法,这题还挺简单,只要会 gcd 就没什么难度,复杂度要求也不苛刻,我很快就通过了。

携程笔试我两小时用了一个半小时就交了,成绩是两个 100%。感觉很开心,有时候笔试也真的是靠运气。

竞技世界笔试

竞技世界是成都一个游戏公司,我投的岗位还是 H5软件工程师,笔试是牛客网,然后结果题目一打开只能用 C++ 或者 Python。我 Python 很久没写过忘了怎么写,只好用 C++。第一题考了 Frog Jump,这题我只过了 50%,后来我去 LeetCode 上做这道题,发现考试的时候题目把 2^31 写成了 231,无语。不过这题真挺难的,我后来在 LeetCode 上交也一直 TLE。第二题考了个图的 dp,还挺简单,我过了。这次的成绩是 50% 100%,还行不算太惨。

美团笔试

美团我其实没抱太大希望,因为牛客网上有好多美团的题,那些题都好难。然后以前也看一些美团的博客,一直觉得美团的技术要求还是很扎实的。笔试是牛客网,一打开发现果不其然,两小时 5 道题,因为题太多了没记下来是什么,成绩是 54% 36% 0% 18% 18%,没有一道 AC 的。那道 0% 的是一道整数规划题,我一看就吓死了。其他的有动态规划题、贪心题、搜索题、模拟题,考得很全,载体也有数的、矩阵的、图的都有,我全都停留在“我觉得我可对了但只能过这些”和“我觉得我确实考虑的不周全但我只能做到这样了”的程度。我这成绩 5 道题加起来才 100 多分,也够惨的。大厂太难进了,不应该心存幻想。

云瑞科技一面

应该是深圳的一个 0~20 人小厂,做金融的。是电话面,那个感觉就像是在跟一个不懂技术的人说话,她对着一张表问问题,然后我无论回答什么,她都只顾把答案记下来。这次面试又问了我 JS 的基本类型,我太紧张了,明明背过,又漏了一个,应该是 7 个(加上 bigint),我少答了 symbol。虽然这次错得不那么要命,面试结束了我还是懊悔不已(我是个傻逼这么简单的问题错两次)。

这次面试再有个地方没答好是,问我 http 的 keep-alive,我讲了复用 TCP 连接,又问我 TCP 的 keep-alive,没答出来。

不过总体来说成绩似乎还不错,很快就约了我二面。

贝尔信息HR面

也是深圳一个小厂,做 AI 的。很奇怪上来就是 HR 面,也是电话,跟我聊说你是怎么申请的美国的学校的呀啥啥啥的,聊完之后问我对机器学习算法了解的如何,我说我投的是开发岗呀,算法会但不太熟,如果你们要求不高也还凑合。他说哎那我们要求还是挺高的,然后说那给我调到开发岗去,让我做一份笔试题。

贝尔信息笔试

这个笔试似乎是他们自己的一个系统,分两部分,第一部分是十道选择题,前三道是什么进程优先级、信号量啥的,不会,瞎蒙。后 7 道是数据结构和算法的,好多题感觉不严谨。然后这十道题下面就只有一个是「交卷」,我就点了,因为赛码网就是这样每部分分别交卷交了就回不来了。结果直接就交卷了,第二部分是什么我都没看到,有毒。然后第二天,那个 HR 打电话说,笔试通过了,问我什么时候有空面试,我说了,然后他也没当场预约,似乎就是想了解一下我什么时候有空。然后就再没联系过我。

携程一面

到这为止我真的是很绝望。前面的笔试面试,也就携程的笔试还算顺利。这次面试前我非常紧张,我觉得这是一个转折点的面试,如果面得开心,后面就可以开始转运了,如果又凄凄惨惨,我可能还得再多复习一段时间。

面试还是赛码网,面试官开了视频。基础方面这次很顺利,问的问题我准备过了。比如 flex 的相关属性和取值,position 有哪些取值,分别是什么作用;怎么清除浮动;cookie 有哪些字段;localStorage 和 sessionStorage 有什么区别;事件委托;阻止事件冒泡。真的很感谢字节跳动的文档。

还被问了 get 和 post 的区别,我答了很多,面试官问还有吗,说不出来了。他补充说缓存呢,我答说 post 没有缓存,get 服从缓存策略。(这个问题也是后面经常被问的高频问题)

问会 ts 吗,会。问知道泛型吗,知道,解释一下泛型有什么好处,我。。。(说得不是很清楚),然后我写了一个 a + b 的函数,说你看这个可以是数也可以是字符串,就不用多写一个版本了。面试官替我回答了,说就是把类型作为参数对吧。然后问知道 ts 有哪些内置的功能,好久没看了,思来想去就答出一个 Pick。问你能不能实现一下,我没有 IDE,说你让我这么凭空写我有点困难,面试官笑笑说那你写个 interface 的派生吧,写了,问如果这个既可以是数也可以是字符串怎么办(用 | 运算符)。

最后面试官先是考了正则,让我写正则匹配手机号,然后又给我加需求,我又改。正则我很熟。又问我 ES6+ 有哪些新特性,我罗列了许多。又我让我写 Array 的常用方法,我当时并没能把我知道的都写出来,但是也写了整整一屏。

然后我问了几个问题,面试官向我介绍了团队,是做国际化业务的,好像是有 150 人的大团队。总之这次面试聊得很开心。

上面总结说过面试的时候不要把最想去的公司直接先投,要分批,而步进的关键就在于这个转折点。我跟一起在找工作的朋友交流中也发现,面试这个事真的是面几次就会了,刚开始都会有一段黑暗的时期,这时候虽然看面经,但还是不得要领。等到遇到这个转折点的时候,基本上已经能把面试常问的问题烂熟于心了。

云瑞科技二面

还是电话面,这次的面试官感觉像是那种典型的小厂 leader,什么都会一点的所谓全栈。这次面试体验很差,全程在那鸡同鸭讲,我搞不清楚他想问什么,他对我也不满意。

他问我你们通信用轮询还是 ws,我说轮询。我说客户端是主要流量,通讯不是实时的,适合轮询。他问那用过 ws 吗,我说用过,以前写机器人用。他问遇到过什么问题,我说没什么问题,客户端先请求网页,然后协议升级,握手完以后就可以双向推数据了,因为是异步的收发顺序得自己处理。他又问那长连接太多怎么办,我说根据业务特点,可以改为长轮询,或者横向扩展。他问我怎么横向扩展,我说有负载均衡,多加点容器。他问负载均衡怎么调度,我说根据后面服务器的资源分比例流量均衡,没懂什么叫怎么调度,有什么好调度的。他问知道 4 层负载均衡和 7 层负载均衡吗,我说不知道,我是前端。(后来我去查了一下,4 层的是传输层的负载均衡。)

他说看你的简历写得很乱,你能不能说说你这里面有什么难点,我说了一堆,我说应用很大,业务很复杂,交互很复杂,性能很差。然后他又问了一遍,说他没听懂难点在哪,我无语,我说就我刚才讲的呀。他说能不能具体说说,我说列表很长,无限滚动,性能不好,需要虚拟滚动,然后他似乎就没懂为什么列表很长会性能不好,问我为什么列表很长会性能不好,我无语。他又问怎么实现,我说 Angular 自带这个功能,实现的话就是只留靠近视口内的一定范围的元素,根据高度实时计算滚动的偏移量,把太远的 DOM 卸载掉,他似乎也没听懂。

然后他又开始问一些奇怪的我根本听不懂的问题。他说,你现在有一个组件,你想给他定义几种不同的样式,你怎么实现。我说要是有限的几种,就写了然后暴露一个 prop 来控制;要是允许用户自定义,就暴露 prop 把样式委托给外面来定义。好像回答不是他想要的,他又问,你现在有一个组件,它有一个图片一串文字,两个属性,你现在想给他加一个选项,但是又不想改变它的接口,你怎么做。我说,你不想改变它的接口,那你加一个选项做什么用呢,他沉默了 5 秒钟。他又问,你现在写了一个组件,它的数据怎么绑定。我说你把数据定义成 prop,在模板里用,数据变了自然它就会变,这是框架自带的功能。他可能想考我某种抽象方法,但我真的搞不懂他这些莫名其妙的问题究竟是想问什么,语气还高高在上的,好像自己是前端抽象大师一样。

真的感觉他啥也不懂还想装逼,还抓着我使劲问,最后很尴尬地挂了电话。他也很没礼貌,说今天面试就到这了,然后就把电话挂了。

面完这个我觉得前途好渺茫,我以前觉得,大厂进不去还可以去小厂,从小厂慢慢做起。这次面试之后,我感觉如果大厂进不去,像这种小厂也根本不可能要我。下定了决心要进大厂就必须要进去,否则会很惨。

美团一面

接到美团的面试预约,我很惊喜,因为我以为我笔试肯定没过。是牛客网,面试官开了视频。面试体验比小公司好太多了,面试官很有耐心。虽然问的问题我有时候也理解不到位,但是他会提示,慢慢引导我。

最开始他问我以前的项目哪里有困难,我也说了一大堆,他也没 get 到点。他说你这些解决方案都是常见的解决方案,我想知道你具体的困难在哪,我就把 angular 的原理和机制讲了,我说随着应用变复杂性能开销会成倍增加。然后又跟他探讨了一些场景,比如说通过预测对方用户在不在线来智能地降低轮询的频率,就逐渐地让他满意了。

基础问了原型链,盒模型,问了 flex,问了水平和垂直居中。除了 flex 以外,水平居中我答的内联元素用 text-align: center,块级元素用 margin: 0 auto,问还有吗,答绝对定位加 transform: translate。垂直居中我答出三种方法,居中元素定高用绝对定位加 margin,容器定高用 line-height,和不定高用一个高度 100% 的元素内联对齐。还问了如何注册事件,问第三个参数是什么,答出了 capture 和 passive(漏了 once);问 passive 有什么作用,答显式声明不会 preventDefault,在移动端滚动(其实是 touch 事件,scroll 事件是没法阻止的)的时候可以快速响应。

然后他问知道哪些 React hooks,说了一堆。又问说假设有这么一个东西,var [data, setData] = useState(0),你现在想给它加一,你就这么写吗 setData(data + 1)。问完他就笑了,可能他也觉得他问的有问题,就说这样写会不会存在什么问题。我还是很懵逼,为什么会存在问题,他说那让你写这个需求,你怎么写。我说一般不会在 render 函数里就直接 +1 吧,一般都是在什么事件的回调里加一,然后我写了一个。然后他又提示说,这个 setData 可以传一个函数,那这样和传函数有什么区别。我才懂他想问什么。我说你写两个 setData(data + 1); setData(data + 1),它还是 1。他笑说,嗯,靠点边了。我说因为是异步提交的,如果是对象的话真正提交之前会合并,合并的时候 data 一直是 0,后面的会覆盖前面的;而函数是串行运行的,每次参数是之前的结果,就会变成 2。问 react 的性能优化,答 useCallback,useMemo,React.memo,问还有吗,不知道了。

他问我,给你一个数组,要变成奇数在前偶数在后,我就先写了一个 [...arr.filter(), ...arr.filter()] 这样的版本。他说你这个复杂度 2n,我说就多了个常数不要紧,然后我又写了个用 sort 的,他说你这个复杂度多少,我说取决于实现,数据少的话插入排序,数据多的话归并排序 nlogn(其实后来查了一下应该是 TimSort)。然后我又写了个最朴素的,循环遍历,复杂度是 n 的,我说小于 n 的我得想一想,他说可以了,不用想了。

最后他说,给你个对象,{a: 1, b: 2} 这种,让我变成 url string。我写的是 Object.keys(params).map(key => `${key}=${encodeURIComponent(params[key])}`).join('&'),因为牛客网上运行环境不支持,面试官说可以把 encodeURIComponent 去掉了。然后他说前面还有个问号,我就改成了 '?' + Object.keys(params).map(key => `${key}=${params[key]}`).join('&')。他问有没有更好的方法,我就很为难, 我说哪种意义上更好。他提示说 reduce,说你看你这一开始有个问号,我就懂他什么意思了,然后我给他写了,边写我就边说,我觉得你这个可读性没我的好,Object.keys(params).reduce((a, c) => `${a}&${c}=${params[c]}`, '?'),写完一运行,这个 ? 后面还多出来一个 &,我说你看看你这个还多出来一个。我俩就笑,然后很愉快地结束了面试。我问面试官这边的业务和技术栈,业务是做物流的,技术栈面试官说桌面、移动、Electron、React Native、小程序都有,说得我很向往。

美团 11 点面试的,下午 2 点 HR 就给我打电话说通过了,又约了我第二天的二面,好开心。

博乐科技笔试

博乐科技是北京的一个游戏公司,是我高中朋友推荐我去试试的。笔试牛客网,巨简单,4 道题两小时,前两道是水题,第三道是 dfs,最后一道是个很简单的一维动态规划题,半小时我就做完了。

腾讯一面

腾讯我投的是 PCG 腾讯文档。腾讯用的是腾讯会议,并且面试官不开视频。一面自我介绍,聊项目聊了挺久的,基本都是我在讲,面试官没怎么质疑。然后基础的问题问了 localStorage 和 sessionStorage 和 cookie,onstorage 事件,浏览器缓存,事件冒泡和事件捕获,事件循环,xss 和 csrf,https,还有 http2。

这次面试没答好的问题,面试官问完 http2 以后,问我,http2 能完全解决队头阻塞问题吗,我懵逼。又问 http3 了解吗,我说知道 QUIC,具体就不知道了。后来面试完回去又复习了 http3,果然三面被问了。

最后让我合并两个有序数组,我一看到这个“两个数组”,脑子里就想起了那道两个有序数组求中位数的题,于是我写完了之后跟面试官说,我记得还有复杂度更低的,是 LeetCode hard 题(其实并不是),但我写不出来。面试官问我刷了多少题,我说刷的不多就刷了 200 多道。

这次面试体验适中,面试官和和气气,不开视频让我有点不爽,但总体来说感觉发挥的不错。面完当晚系统里状态就进到复试了。

美团二面

美团二面很轻松,已经有点类似 HR 面的气氛了,聊聊以前的工作,聊聊我学习 Web 前端的经历。聊完之后问我同时在面哪些公司,我说差不多招的都在面吧。二面完了以后不久就有 HR 来加我微信,说面试已经通过了,跟我讲了实习的待遇,说给我一些时间考虑,如果我接受就在系统里帮我申请 offer。

阿里一面

阿里我投的是 深圳 ICBU 团队。阿里的面试没有那种发短信又发微信又发邮件的正式预约,这个一面的预约甚至没亲自跟我约,还是内推我的朋友帮我转达的。也没有链接,就是电话面试,面试官迟到了 2 分钟。

问我最近在学什么,我说 wasm,介绍了我写的一个从图片中提取主题色的项目。面试官问算法,说了个大概,然后说就是抄 Android 的实现。面试官问知道 jpeg、png 之类的格式编码的算法吗,不了解,但我说知道区别和用途,然后介绍了 jpeg、png、webp、svg 的特点。问知道 webp 是怎么做到体积小的吗,不知道。

对我会写 C++ 很感兴趣,我说我以前实习的时候写过一个单词排序的系统,简单介绍了这个有什么用,他追问算法和实现,我说公司有保密协议不方便透露,他说没关系没关系。

React 上来就问我受控组件和非受控组件,没听说过(这次面试之后我去把 React 的文档从头到尾全看了一遍,其实非常简单),他说没关系没关系。问知道哪些生命周期函数,说了。然后我又解释了 React 的原理。问我 vue 和 react 的区别,觉得更喜欢哪个,讲了。

问了我 new 的原理,问了 get 和 post 的区别,问了 csrf,问了 promise 是宏任务还是微任务,setTimeout 呢。问我 throttle 和 debounce 的区别,什么时候用这些,我答出搜索防抖用 debounce,throttle 不知道什么场景需要。最后问我 http header 有哪些,没被问过这个问题,答的不是很全,就答出几个,cookie、user-agent。

面试官态度很好,很有礼貌,是我到这个时间点为止见过态度最好的,末了还说“谢谢你的时间”。但是这次表现有点不够好。

携程二面

携程二面也很轻松,没太问技术,类似美团的二面,聊聊以前的工作,问了几个简单的基础问题,又问我什么时候能来,有多大可能来。很开心地结束了。

腾讯二面

腾讯二面预约的时候态度非常生硬,说,“你是某某某是吧?跟你约一下面试时间,周几几点”,然后说“你到时候准备好电脑,需要你编程”。吓死宝宝了,一度非常后悔上次跟面试官说我刷过题。

结果面试体验非常好,面试官还是照例没开视频,但是他看我开了视频,就跟我解释说,在工作区不能开视频。面试官着重问了我性能优化的问题,我回答完以后,面试官问我说,你这个有数据吗,你这性能差具体是哪差,追着我要数据。我解释说没数据,但是我在优化之前已经明显有问题,帧率 30 以下,优化过 50 以上。

面试官问了我一个问题,说现在你有一个应用,你想知道生产环境的性能表现怎么样,我回答说插入一些埋点,比如监测组件的渲染时间啊,首屏加载时间啊,帧率之类的,然后上传到服务器。面试官问那你比如性能很差,卡死了怎么办。我说如果来得及可以先存 localstorage,下次打开再上传,如果连这机会都没有,比如死循环了,进程被用户杀了,那就没办法了。面试官提示说 web worker,我回答说那可以开一个新线程,我知道不能访问 DOM,但不知道 web worker 里能不能访问到 BOM。面试官说你不用管能不能,就这个问题你怎么办,我说可以 postMessage,建立一个心跳机制,如果主线程不响应,就说明卡死了,上报给服务器。

最后考我一道算法题,给两个单向链表,判断它是否交叉,如果交叉返回交叉点。我开始写了一个用 symbol 和 map 的,面试官说空间复杂度能不能降低一点。我想不出来。面试官提示说,如果是两个等长的链表呢,我回答说交替步进,直到完成或者判等。面试官说,那不等长的呢,我就懂了,我说先遍历获得长度,然后让长的步进差值,然后再交替步进。面试官让我写,我写了。

这次面试的面试官真的是表现出了那种前辈的感觉,在面试的过程中不断地给我提示和引导,让我开阔思路。最后面试官表现出很积极的态度,跟我说觉得我解决问题思路很清晰,值得培养一下,这次他会给我通过。又说看到我 dock 上既有网易云又有QQ音乐,我说网易云体验好,但是版权少,他说他也两个都用。然后说他不看重那些基础的东西,那些东西谁背一个月都会,但是别的面试官可能看重,让我回去好好复习,还有就是如果有数据的话准备一下会更好。又说三面大老板很忙,好多人等着他面试,他帮我催一催。

博乐科技一面

面试是牛客网,只问了算法题,题很简单,一个数组取前 k 大的元素,我说如果 k 是个常数就一次遍历,如果 k 是动态的就用二叉堆。面试官听说二叉堆竟然还有点懵逼,我还解释了一番二叉堆。然后我就开始向他了解公司的情况,真的很不错,感觉团队氛围很好,大家都玩得很开心,公司福利也很多。而且是几百人的中等公司,每个团队也有几十人,写 lua。如果有朋友想转游戏的话应该是个不错的选择,或者不错的开始。博乐科技的 HR 小姐姐加了我微信,是个很可爱的小姐姐,我跟她吐槽公司的笔试和面试过于简单,感觉是个同龄人,聊起来很轻松。

小马智行一面

这个公司的 HR 早早地就加了我微信,然后来问我,题刷的怎么样了,“我们面试要手撕代码的”。我说不错,给我约面试吧,然后她就没动静了。过几天又跑来问我题刷的怎么样了?这么几次三番之后终于给我约上了面试,一下约到了两周之后。面试邮件是用 MokaHR 的系统,然后在备注里发了 zoom 的链接。后来等到真正快面试了,Moka 的系统又给我来了一封邮件,说是电话面试,我就忘了 zoom 链接了。结果我在那空等了 10 分钟,面试官也等了我 10 分钟,直到 HR 来找我。

考了两道算法题,第一题我先写了一个 n^2 的算法,然后面试官说复杂度太高了,我用 map 改进了一番,变成了 n 时间的算法。第二题应该是个动态规划或者数据结构题,一维数组,我只写了一个朴素的算法,这个算法是向前遍历,但是遍历的过程中需要经常回溯,最坏是 n^2。面试官感觉不是很满意,但是时间到了,就结束了。感觉体验不是很好,但是后来告诉我还有二面。

阿里二面

阿里的二面面试官迟到了 8 分钟,然后给我打电话,说他临时有事,15 分钟之后再开始。结果我又等了 30 多分钟才开始。也是几乎基础都没问,问了我最近在学什么,我说 wasm,讲了一些我对 wasm 的理解,问 wasm 怎么加载,wasm 和 js 怎么互相调用,讲了。

又问我会 ts 吗,我说用的。问我觉得 ts 有哪些好处,答静态类型检查。问 ts 有哪些多的特性,答枚举,然后不知道别的了。问 es6+ 呢,答了一堆。

然后也是整个过程中唯一的面试官关注到了我简历上写的音乐播放器。我就开始讲这个播放器的构思,它希望解决的问题,技术选型的考量,我遇到了哪些问题,怎么解决的,滔滔不绝地把时间都讲完了。面试官吐槽我说我讲话没重点,希望我以后能分一二三,先讲个大概,然后他再深入问,我再深入解释,不要一下就哗啦哗啦讲一堆。然后面试官称赞我可以看出以前做的东西也是有自己的思考的,当场就告诉我通过了,完后还说加我微信,说我如果还有问题可以直接微信问。除了等了好久以外体验还不错。

阿里三面

三面是有一天一大早 9 点打电话给我,预约的 11 点,是个说话声音非常好听的小哥哥。然后也迟到了几分钟,见怪不怪了。面试官说话很好听,但是态度很中立,说就是补充了解几个问题,而且是唯一一个面试官刚开始就说我们打算聊多久。整个过程中面试官对时间和谈话的掌控也是所有面试里感觉最好的。问了我两个问题,一个是过去在 web 前端的学习历史,又深入问了一下在大学学生组织里带团队写跳蚤市场的事。然后又问了我简历上写的重构的事情,我说这是后端的,他说“我感兴趣,你做的我都感兴趣”。我详细讲了我做了哪些重构,设计目标还有实现的方法,以及这些目标带来的意义。面试官很欣赏,问我说,这不像是一个还没出校门的同学能做出来的,你是怎么做的。我回答也有跟公司前辈交流,又问我在公司跟前辈交流学到了什么,回答了。最后很愉快地结束了,但是面试官没有表态,很中立。

博乐科技二面

又是只问了算法题,问的又很简单,我记得是一道手写把一个字符串按照换行 split 开的题。然后没什么问的,就结束了。

携程HR面

携程的 HR 是一个非常可爱的胖胖的小姐姐,她迟到了 15 分钟,不过她一来就说不好意思上一个面试拖太久了。然后她问我以前遇到过什么困难,我跟她一顿吐槽,我俩边说边笑,聊得很开心。

阿里HR面

阿里的 HR 也是电话面的,先是问了我面试的反馈,我吐槽了面试官总迟到,还有官网上没有进度。然后又表示阿里的面试官比较在乎经历和实际的东西,我比较喜欢。又问我自己的优点和缺点,以及为什么读研,为什么转专业,为什么做 web 开发。她也反馈说我说话虽然细节很丰富,但是没有总体的框架,给不了她一个整体的印象。最后我问她我的表现,她说觉得我很自信,很诚实,很踏实。

腾讯三面

面到这个时候,我已经很久没有被考基础了,所以已经有点生疏,三面之前一面的面试官还来加了我微信,本来自信满满,然后被腾讯的三面狠狠地教育了。三面是电话面,而且我当时在外面骑着电动车,突然就电话来要面我,面试官感觉很凶,我跟他说我在外面不方便,约到了下午。面试官说能不能提前 10 分钟,我说可以。结果他非但没提前还晚了 40 分钟。

面试官很冷漠,不管我答什么都问,还有补充吗。先是问我知道什么设计模式,我答面向对象,函数式,观察订阅,消息中心,事件委托,MVVM。然后他问我什么发布订阅有什么好处, factory 有什么好处,单例有什么好处,我不知道有什么好处,就说就是一种抽象方法吧,反正就是需要用的时候用。然后又让我解释希尔排序,说了个大概印象,具体就不会了。又让我解释归并和快排,讲的我自己感觉也不是很清楚,讲完了他就问,还能再详细点吗。

又让我解释 this,我问解释什么方面,他说说你所有知道的。我吧啦吧啦说了一堆,给我出了一道题,

const a = {
  b () {
    function c () {
      console.log(this)
    }
    c()
  }
}
a.b()

我答的是 a,还解释了一通。面试官质疑了一下,我沉默了好久,因为是电话我就去运行了一下,发现是 window,面试官在那等着我回答,我就很尴尬地说是 window,面试官问为什么,我又解释了一通……

然后问我熟悉什么框架,我说 Angular 和 React,问我看过源码吗,没看过,让我解释原理,解释了一通。又问我用过什么 ui 框架,我说 antd,问我看过它架构的源码吗,我说看过一些组件的,他说看过架构的吗,没看过。然后又上来就问 http3,讲了,又问 http2,讲了。又问了 xss 和 csrf,讲了。又问了 http 缓存,讲了。

然后问我网络怎么优化,我有点懵,就说开 http2,面试官问,完了?我又想了一会,才缓过神来,回答 bundle 拆分,懒加载,小图片合并雪碧图,图片压缩裁剪,用 webp,preload 和 prefetch,开 gz,面试官还算满意。

最后问我,在前端的学习中有什么事是你一定要做到的,卧槽这问题太难了,以前没思考过,胡乱说了一堆。然后他非常冷漠地说,面试结束了,就挂了,都不问问我想问他什么问题。

之前面试官跟我说别的面试官可能重视基础,没想到三面面试官这么看重基础。我以为这样肯定凉了,但是还是进到 HR 面了。不过有种说法是腾讯过不过都能继续,最后会综合挂。

腾讯HR面

腾讯 HR 面照样是腾讯会议,直接约到了晚上 9 点,照样没开视频。感觉虽然很有礼貌,但是说话好傲慢。听声音感觉比我大不了多少,却感觉很凶。让我自我介绍,介绍以前实习中学到了什么,然后说着说着就打断我,说,我们有好多候选人排队面试,你就20分钟,你要好好表现自己,你都没说出你有什么亮点,我们为什么要选择你。又问我是不是不擅长总结,问我为什么工作而不是上学,问我除了有工作经验还有什么优势,问我自己的优点和缺点,问我对自己职业发展的期望,对 leader 的期望。反正说的感觉不是很满意,我说的也确实不够清楚,她也没太理解。最后还问我是哪里人,父母做什么的,父母对我有什么期望。(莫名其妙的问题,别的面试官只是问愿不愿意来这座城市工作,家里愿不愿意,从来没被问过父母是做什么的。)

本来想催催她说我已经有阿里的录用意向了,希望这边能快一点。结果别人这种态度,没说出口。最后问了 HR 确实会综合挂,告诉我如果过了要审批大约一周时间才有 offer call。感觉面试官可能也确实是太累了,三面和四面体验都好差。虽说 AlloyTeam 也是名字最响亮的团队了吧,给人的感觉好压抑。

后来过了几天都没联系我,我觉得不对,如果过了的话就算还要走流程审批,之前加我微信的面试官肯定早就迫不及待跑来告诉我这个喜讯了。然后上系统一查,果然,流程已结束,期待有机会再合作。也不奇怪,三面四面感觉都答得不好。现在回想一下,这个四面简直就是在跟我说,“你已经挂了,你快好好表现,兴许还能把你捞起来”。

小马智行二面

有些出乎意料从二面开始他们就修复了之前的问题,系统再发提醒邮件变成“视频面试”了,看来我上次迟到的事情他们还蛮认真地检讨并迅速地解决了。这次还是照例考两道算法题,第一题是一个数的题,n 维数组迭代 m 次,朴素的解法是 O(m),m 很大,但是运行一段时间就有规律了,然后可以求个模,变成 O(n)。第二题是 dfs。这次完成得不错,做完两道题之后问了面试官前端这块的业务,说是有 toC 的也有后台数据展示的,具体分团队,每个团队配一个。

这次面试应该是表现得很好,面完之后 HR 就来给我打电话,很详细地介绍了一番。介绍说公司对新人的培养力度很大,转正机会也比大厂要好,在广州生活成本也相对低一点,等等。不过最重要的是,开价真的很高,我大致问了一下转正的薪资,和字节的 SP 相当了。

小马智行三面

还是两道算法题,第一题是个二分查找题,我写完了,测过了,他说有 case 有问题,结果没问题。然后我做第二题的时候听见他跟同事说,“我今天一定要找出 break 这个的反例”(XD)。第二题是个贪心题,但是我用动态规划做的,没写完被打断了,说时间不够了。我讲了我的思路,他说复杂了,可以用贪心。然后这次面试倒是聊了不少 web 前端的东西,我详尽介绍了以前做的项目以及我承担的工作,然后又深入问了一些问题,跟别的面试差不多,在这个环节上花了不少时间。这次网太卡了,我们全程就在那喂喂喂能听到吗能听到你能听到我吗,体验很糟糕,最后实在没办法换成打电话了,不过聊得还不错。

博乐科技三面

三面是个年龄稍大的大老板,是他们的制作人。他看我接下来还要回美国读书,说实习几个月不太合适。(这个其实在意料之中,因为本来网站上就没招实习生,但我还是投了。)然后鼓励我在美国抓住机会,找到工作,他说他回来之前也是在美国工作过几年。最后说我给他们技术总监留下了深刻的印象,期待有机会再合作。

小马智行HR面

最后一面是卡车团队的负责人,据说也是个从 Google 回来的大佬。问的问题是典型的 HR 问题,问我以前的工作职责,问我的追求是什么,还有为什么要投他们公司,对公司了解多少。面试官一边问还一边看我博客,总感觉他想找出我的文章批判一番。全程面试官一点都没笑,我最后问面试官一些问题,他也很诚实地反映说这边技术追求不是很新潮,需要的是能负责任地把业务做好。总体感觉有些压抑但还行。

面完 HR 就跟我说过了,要开始 offer 流程了。我说面试官不苟言笑,她说他平时不是这样的,可能今天面试太多太累了,给我的评价也很高。总体来说小马的面试很像国外的,以算法为主,而且每个面试官都会说“谢谢你的时间”这么洋气的话。给钱真的多,福利也很好,6 点半就下班,周末双休,上下班可以免费坐公司的自动驾驶汽车(还没对公众开放的专属福利)。

尾声

到这为止应该就所有的面试都结束了,一个月面了 20 多场,好累。

阿里的面试过了之后,我二面的面试官(也就是我的主管)就在微信上跟我说我过了。然后说帮我催 offer,还给我介绍了一个师兄加我微信,说等我去了带我,跟我聊以后我去了做什么,还说我去了请我吃饭。录用意向下来了以后,还把我拉到他们微信群里,好多同事都来加我,非常热情,就打算去了,希望能有所成长。

字节跳动我投的是深圳飞书,还要笔试,因为感觉阿里和腾讯能过我就没做。结果没做也没有下一次,流程直接结束了。后来被其他部门的 hr 捞起来,给我打电话,我才知道有笔试是因为简历没过,如果过了是没有笔试的。=。=

还有京东、网易、斗鱼、华为都还停留在笔试阶段,还在不停地给我发邮件。

网易互娱杭州的 HR 给我打过电话,说看我笔试没做,问原因。我说已经有 offer 了。希望下次他们能动作快一点。

腾讯流程结束一周以后,微信小程序团队的面试官给我打电话,问要不要面试,我也婉拒了,说期待秋天。我觉得微信团队比腾讯文档好呀,竟然被那边挂了这边又捞起来,有些神奇。

除特殊说明以外,本网站文章采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。