【第一部分 面试前的准备】
从决定找工作开始,我其实经历过一系列思想斗争,最开始想的是,等自己完全准备充分之后,再开始投简历面试。然而,由于惰性,我发现自己很难判断什么时候是完全准备好的时候。
这次换工作的第一次面试,当时的心态就是抱着学习的态度,总要迈出第一步,也许当你放低了自己的预期,实际面试过程中可能也就不会那么紧张和不自然了,我当时报的期望就是通过面试查找自己有哪些不足,以及了解一下市场上的真实需求。我的目标很明确,就是要通过大厂面试。这次现场面试,让我一下就找到了状态,决定全力准备面试。
依稀记得当时自己一共投了7家公司,当时有四家公司(此时没有阿里和美团)觉得有意向,还想进一步了解我一下,商量之后再和我约时间。后续接到面试邀约电话时,我意识到,自己还需要再准备一下。这里有个心得是,当你觉得自己还需要再准备一下的时候,可以诚恳地和HR或者面试官约定时间,通常时间为1周左右,一般面试官也会理解。你可以说自己很珍惜这次面试机会,需要再好好准备一下。
然后,我为接下来的面试做了如下准备:
1)阅读了《浏览器原理与工作实践》专栏中关于浏览器渲染原理等内容
2)当时和一些同学组织了leetcode刷题小组,大概每周至少3-5题的刷题速度。每周参与线上刷题分享的活动,刷题活动共持续大概1-3个月左右,这期间穿插着面试、总结和查缺补漏。
基本上以上准备,让我面试前增加了不少信心。
【第二部分 面试题目】
美团、阿里的具体面试题目,我按照「前端基础知识、前端框架的底层原理、性能优化、计算机网络、算法、前端工程化、项目经验」这七大部分来给大家总结:
前端基础知识,主要从前端四大模块 HTMLCSSJavaScriptDOM, BOM 方面以及前端框架如ReactVue 等准备。
CSS:
大概会有1-2个问题,主要考察各个常见布局的实现,比如垂直水平居中、双栏布局、随窗口变化的正方形、网格布局等等,一般需要手写代码,这里推荐张鑫旭老师的 CSS 世界,多看几遍足够应对面试。
HTML:
在我面试的过程中这个问的不多,之前 winter 老师有一道面试题,说说你常用的 HTML 标签,然后由这道问题可以延伸出很多细节,进而考察你对 HTML 知识的掌握。
JavaScript:
考察 JavaScript 的细节问题是最多的,通常包括但不限于:
1)JavaScript的基本类型
2)setTimeout、Promise、async/await 三者之间异步解决方案的区别?
3)宏任务和微任务,通常会给出一段代码,让你给出输出结果,并解释?
4)解释 JavaScript 的单线程模型,以及为什么这样设计?setTimeout 的延时为何做不到精确?
5)手写实现 Promise?
6)原型链知识的考察,形式也是给出一段代码,让你给出输出结果,并解释?
7)说说你用过的 ES6 语法的功能点,对 ES2017-9 的新增功能点是否有关注?
8)解释 JavaScript 的闭包?解释 this 指针指向的问题以及常用改变 this 指针指向的函数? apply, bind, call 三者之间的区别?
9)JavaScript 继承的几种方式及优缺点?
10)实现节流或者防抖代码?
11)fetch 是否可以共享 Cookie?两个 then 分别对应着什么?
12)手写代码实现红绿灯效果,红灯3秒,绿灯1秒,黄灯2秒,循环重复?
13)JavaScript 是如何操作 Cookie 的?
DOM API:
这方面也很少被问到,印象中有这几道:
1)如何翻转 DOM?冒泡和捕获机制,实际应用有哪些?
2)冒泡和捕获机制,以及实际应用?
前端框架的底层原理
我们以 React 为例,经常会考察内容包括:
1)setState 的内部实现?
2)什么是虚拟 DOM,引入虚拟 DOM 的目的,虚拟 DOM 一定能解决性能问题么?
3)React Hooks 有哪些了解?
4)react redux 的底层原理?如何完成异步请求?介绍自己常用哪些 redux 中间件?以组合函数的方式手写代码实现中间件的级联功能?
5)react 的 diff 算法了解么?
6)react 的 fiber 算法了解么?
7)react pureComponent 和 Component 有何区别?
8)react 的生命周期,新版和旧版都需要了解
9)react 的单向数据流如何理解?
10)如何设计组件?
11)react memo?
12)react 无尽列表是如何实现的?
性能优化
1)浏览器的渲染原理是一定会被问到的?
2)浏览器输入一个 url 之后的过程,以及过程中应用了哪些缓存,如何优化?
3)script 标签和 link 标签的先后顺序对页面加载的影响?
4)async 和 defer 的区别?
5)react native(因为我的简历中有写到使用过 RN)有哪些坑?
计算机网络
1)解释 TCP/IP 的三次握手和四次挥手?
2)解释跨域问题以及前端常用的解决方案?
3)CORS 的细节,哪些是简单请求?哪些是非简单请求?
4)解释 HTTPS? 解释 HTTP/2?
5)HTTP 报文的格式?
算法
1)手写冒泡排序?
2)给定两组数,分别以链表方式存储,求和?注意进位
3)数组去重?
4)微信红包是如何实现的?
5)给定一组数,求和函数是带延时的网络请求,如何在最快的时间内计算出这组数据的和?
前端工程化
1)webpack 如何拆分大文件?
2)webpack 打包的过程?
3)webpack 的基本配置?
项目经验
这部分大概很多同学都很关心,到底应该怎么写自己的项目经验。出场率最高的问题也是介绍一下你做得最出色的项目?
如果你想要学好WEB前端,在学习过程中,身边没有一个能够指导你学习的人,可以到这个WEB前端裙:484,757,760,里面有我根据目前市场需求,录制的最新的系统教程,不管是计算机专业想要往WEB前端方向发展,还是零基础想转行,都可以跟着教程学,有什么不懂的可以在里面问。
首先最重要的是,实事求是。
这方面我认为主要考察候选人在工作中所承担的角色,以及平时工作中是否注意积累和总结,其实大多数人平时是不善于总结的,我自己也是,所以平时注意写“详历”是对自己很有帮助的。
关于简历如何写,极客时间《面试现场》专栏中有提到,我觉得非常好,分享给大家
详历的结构如下:
开头,“有段经历,正好遇到了这个问题……”。(讲清问题背景)
发展,“一般的做法是做不到的,因为……”。(讲问题的复杂性和挑战)
高潮,“我一开始用到……后来……”。(讲解决方案的形成过程)
结局,“成果是……”。(讲结果、影响、意义)
所谓“详历”,是相对于“简历”更详细的工作经历和能力的总结,用故事的方式,记录工作的成果、职位、经验和能力发展,相当于你的工作档案,用于回顾个人工作经历,撰写简历,也是回答面试问题的经历素材库。这些素材体现你的个人经验、技能、潜力、动机。详历是你个人工作经历的故事汇编,是你能力的索引,是给你自己参考用的,随着经历的增加而越来越充实;而简历是给面试官看的,最好因职位而异。
详历主要有三个作用:有助于职业规划,可视化技能体系、经验分布和成长路径。是定制简历的母版。提供面试素材。当被问到“这个项目最大的提高是什么”,或者“你失败的一次沟通是怎样的”,你可以从准备好的详历中,快速选取恰当的故事,讲给面试官。
【第三部分 面试流程,以及美团、阿里面试有什么不同的体会】
(待大量补充,比如:)
可能很多同学都想知道大厂的面试流程,这里我也简要分享一下:
总的来说大厂对于候选人的基础知识要求还是非常严格的,当然也更看重候选人的潜力和心智,因为在大厂看来知识是死的,只要时间足够,通常都可以掌握,但是潜力和心智状态,却和每个人的成长轨迹和阅历有关。
一面面试官通常是你未来的同事。面试主要考察候选人的基础知识,我遇到的面试官都非常nice,会寒暄几句,帮助你脱离紧张的情绪,然后进入正式面试环节。我记得看过一个TED的演讲,内容是关于紧张,里面讲就算你真的紧张的不行,也不必担心,因为人总是比较在意自己的,所以就算你觉得自己非常紧张了,在面试官眼中你表现得也没有你想象的那么紧张。
二面面试官通常是你未来的直级leader。这里阿里和美团不一样的点在于,当时阿里主要考察了我对于过往项目的掌握程度,以及我在项目中的角色,然后和我聊了很多个人成长方面的心得和看法;美团则侧重考察了我一面面试官没有问到的基础知识点,这里其实每个公司可能都不太一样。
三面面试官通常是你整个部门的leader,主要从职业发展和候选人背景方面进行考察,过程中也会穿插着考些算法题,不过都不难,主要考察候选率的编程能力的。美团到这里就结束了,之后就是HR和你聊聊薪水,个人背景,跳槽原因等等。
阿里比较特殊,会多一轮交叉面试,四面是HRG和集团技术大佬混合面试,我个人觉得主要考察候选人的沟通、应变及潜力等等,没太问技术相关的问题,可能我比较幸运吧
想说的是如果想求职阿里,就要做好打持久战的准备,阿里的面试周期比较长,1-2个月也是很正常的,所以要做好心理准备,如果面试完没有收到阿里的邮件,应该就通过面试了,没有消息就是最好的消息。美团就很快,当然也看部门是否急需招人,我面试的部门当天就走完了全部流程。
【第四部分 其他 Tips】
下面这些 Tips,都是我平常自己准备面试会遵循的,希望也可以帮助到你。
简历编写,如何过初步筛选
网上优化简历的方法论很多,我就不多展开了,我列举一下我的简历框架,希望能给你一些启发
1)尽量一页纸展示自己的内容。
2)总体分为7个模块:个人信息、教育及工作背景、技能清单、项目经验、开源项目、个人博客、自我评价,其中开源项目和个人博客部分可有可无,如果有,自然是加分项。
3)技能清单里面,写清楚自己熟悉的语言、框架,甚至能证明你有某方面能力的证书。这里需要注意的是,千万别写“精通”,除非你这门语言或者框架的缔造者,一般来说精通一门语言或者框架确实很难。
4)项目部分,我的书写方式是 工作+结果。挑选项目中我参与的比较重要的部分,然后描述清楚工作内容和我的产出结果,尽量数字化自己的成果,比如项目时间、代码量、提高百分比等。再者,项目部分一定要真实,你需要对你写的内容了如指掌并且负责,否则面试官可能会认为你人品有问题。
5)自我评价部分,通常来说,适当包装自己的优点即可。如果某个企业你十分心仪,也可以参考对方的企业文化,重点匹配自己的内容即可。另外,你写的优点最好能用1-2个例子来佐证,比如我写了自己自驱力强,阿里面试官问到我的时候,我就介绍了自己主动学习,参与前端训练营的培训、买了很多专栏并学习、关注了很多技术博客,并写文章总结等等。
怎么谈薪资
如果到了谈钱的时候,首先恭喜你前期的努力终于快见到回报了。我们程序员通常都比较内向,不善于谈这些,我也一样,但谈钱其实没有什么不好意思的。你可能跟我一样,有着错误的心理认知:自己少要点,公司看到我们要的不多,可能会考虑给 Offer。实际上,当你几轮面试过后,你应该可以判断出自己是否有可能拿到 Offer的。这时候,你可以先调研一下行业薪资水平,然后再结合自己的水平给出自己的预期,这种情况下,你拿到的 Offer才可能不至于让自己委屈。有时候,不敢多要也是正常的,多面试几次,多拿到几个 Offer,底气自然也就足了。
养精蓄锐
面试前吃饱饭也是很重要的,记得有次面试一个大厂,没吃早饭,然后坐地铁1个小时,3轮面试3.5个小时,三面的时候自己的专注力和精力能明显感觉到是跟不上的,这样也是会影响自己临场发挥的
【最后的心得】
以上就是我的面试经历分享了,最后,还有几点心得来跟大家分享:
临时抱佛脚搜面经、背题,通常来说是没用的,但是我们通过面试查找不足,然后努力补足短板,及时总结是很有必要的。在找工作的过程中我每面试一家公司,都会写面试总结,记录面试遇到的题目,回忆自己回答好和不好的地方。
面试过程中,对于完全不知道的答案的题目,回答不知道也没有什么。面试是一个综合考察的过程,不会因为你一两个题目回答不够好就将你淘汰,而且面试过程中如果遇到不太明白细节的问题,可以和面试官老师做进一步沟通,这也是你展示自己沟通能力的好机会,千万别自己闷头苦想。试想想如果项目中遇到不会的,也会是需要虚心请教的,不然闷头苦干只会 delay 项目进度。
在我看来,每一次面试都是一次绝佳的学习机会,尤其是大厂的面试官老师无论是经验、阅历以及专业知识,都能很好的给我正向反馈。在面试百度时,二面面试官就和我聊了很多人生选择以及个人成长方面的思考,面试阿里时也是二面面试官和我聊了很多工作方法论方面的思考,这些对我来说,比熟记几个知识点更有价值和意义。