阅读 10676

2020两年前端面试20家公司感悟 | 掘金技术征文

看过很多篇面试经验的分享,大多都是关于面试考察问题的总结。比起问题总结,我更想结合自己的面试经验谈谈我对面试的理解。

总共面了大大小小20家公司(字节,阿里,百度,快手等),总结下从面试的准备阶段到面试结束中遇到的问题,希望能帮到正在或准备找工作的同学。

用一句话概括找工作的感受:重在基础(技术知识及原理),丰富项目(项目经验及细节),理解全面(技术及产品),积累是前提(工作中积累和总结),会说很重要(表达到位)

面经可以作为公司面试范围的参考,但不代表全部,因为每个人的情况都不一样,所以考察的内容也不完全相同。有的人简历上有写node,就会问到node;有的人简历上写到redux,就会被问到redux。如果你这些方面确实没看过,可以如实回答。因此不能把面经当作唯一参考,只复习面经出现的问题,还是应该根据自己简历上的内容再进行扩充学习和准备。

有的同学不知道该怎么准备,下面就结合面试的基本流程讲讲每阶段怎么准备,同学可根据这几方面充分准备。

简历

简历是公司的敲门砖,只有通过第一步的简历筛选,才能到下一步,所以首先应该把简历写好,不要出现错别字或者语句不通的地方。如果有条件,可以让有经验的朋友帮你看看简历,力求把简历改到最好。

网上有太多教你如何写简历的文章,百度搜索如何写简历,结果的前几页每篇多多少少都有不一样的地方。有的人推荐你把技术点罗列出来,有的人则不推荐,看到最后你可能都困惑了。

从我的角度来看,这些要根据你自己的实际情况区分。比如技术点的罗列:如果你的项目经验能充分体现你所涉及的所有技术点,你可以不写;但如果不能充分体现出来,罗列出来就很有必要。这些问题你有必要自行斟酌取舍。

但是归根结底,简历的核心应该是你的能力体现,是展示你能力的地方,所以要能把核心表达出来。

下面推荐三篇我认为比较好的介绍如何写简历的文章。

blog.csdn.net/lhjuejiang/…

github.com/nzbin/resum…

juejin.im/post/684490…

基础知识(一面)

基础知识通常会在一面中考察,包含从html(5)、css(3)、js到node、webpack、vue、react所有可能考察的知识点。但通常不会考察的太深入,是对知识广度的了解(但不代表你只需知道是什么)。

基础知识不仅要知道是什么,更要明白怎么用,为什么这么用(深入理解最好)。死记硬背能应付一时,但遇到需要深入谈谈的面试官,死记硬背真的作用不大。所以每一个知识点最好能做到理解透彻,讲的明白。

有的面试官可能对某个知识点稍作变形,比如问你数组的slice方法,然后让你自己实现,所以不能只会用。

更重要的一点,对基础知识的理解深度,影响到你的职级评定(当然这个评定也会根据工作年限)。举个例子,同样一个知识点,如果你知道是什么:初级水平;如果能知道怎么用:中级水平;如果知道原理并能自己实现:高级水平;再进一步,如果知道背后牵扯到其他的哪些知识点并能对这个知识点有自己的见解:专家水平。

这个可能有点夸张,不一定就能达到专家,但是你应该明白我的意思,对一个问题的理解深度,决定你的水平,影响你的级别。

比如我在面试中就遇到面试官给我了一道基本的变量声明以及函数调用的题,虽然简单,但是要求是把从创建到结果输出过程中尽可能的所有包含的知识点说出来。所以同学们在准备阶段有必要把每个知识点都搞清楚,讲的明白。

下面是一个博主总结的基础知识点(包含css,js,js高频手写题,vue题,以及http、浏览器题目),我觉得总结的很好,也是面试中常会出现的问题。大家有必要每个点过一遍,但是一些解答不是很充分,在此基础上补充了自己面试中遇到的基础问题以及对应的比较好的问题解答。

某博主面试总结: www.cnblogs.com/chenwenhao/…

JS篇

继承: www.cnblogs.com/ranyonsue/p…

原型链: www.jianshu.com/p/7119f0ab6…

this指向: blog.csdn.net/YongxiaWu/a…

设计模式: www.cnblogs.com/imwtr/p/945…

call, apply, bind, new实现: www.jianshu.com/p/097f99517…

防抖截流实现: www.cnblogs.com/momo798/p/9… www.jianshu.com/p/c8b86b09d…

let, var, const 区别: www.lizenghai.com/archives/38…

event loop: juejin.im/post/684490… juejin.im/post/684490… juejin.im/post/684490…

promise使用及实现: segmentfault.com/a/119000001…

promise并行执行和顺序执行: www.jianshu.com/p/dbda3053d…

闭包: zhuanlan.zhihu.com/p/22486908

垃圾回收和内存泄漏: juejin.im/post/684490…

数组方法: www.cnblogs.com/jiuxia/p/11… www.runoob.com/jsref/jsref…

数组乱序, 数组扁平化: www.cnblogs.com/guolao/p/10… www.cnblogs.com/wind-lanyan…

事件委托: www.cnblogs.com/liugang-vip…

事件监听: zhuanlan.zhihu.com/p/73091706

事件模型: blog.csdn.net/qq_36356218…

axios: www.jianshu.com/p/73f636288… cloud.tencent.com/developer/a…

typescript: www.tslang.cn/docs/home.h…

CSS(3) & HTML(5) 篇

flex布局: www.ruanyifeng.com/blog/2015/0…

垂直居中: www.jianshu.com/p/907f99004… www.cnblogs.com/AdamCenWeb/…

清楚浮动: www.jianshu.com/p/4d0bc8776…

bfc: www.jianshu.com/p/0d713b32c…

三栏布局: www.cnblogs.com/webtaotao/p… www.jianshu.com/p/7d7cf4f05…

两栏布局: blog.csdn.net/weixin_4012…

动画(考察频率很高): www.cnblogs.com/www-123456/… segmentfault.com/a/119000001… www.jianshu.com/p/ec150b884… www.jianshu.com/p/780340d89…

盒模型: www.cnblogs.com/axinmir/p/1… www.jianshu.com/p/824eed8ce…

HTML5新特性: www.jianshu.com/p/37c0b1eb4… www.php.cn/html/html5-…

Vue篇

vue数据双向绑定原理: www.cnblogs.com/libin-1/p/6… github.com/DMQ/mvvm#_2… segmentfault.com/a/119000001… www.cnblogs.com/wangjiachen…

vue computed原理: my.oschina.net/u/3060934/b…

vue编译器结构图: www.processon.com/view/link/5…

生命周期: www.jianshu.com/p/ff8f9bbc7…

vue组件通信: segmentfault.com/a/119000001…

mmvm模式、mvc模式理解: www.ruanyifeng.com/blog/2015/0…

vue dom diff: www.cnblogs.com/wind-lanyan…

vuex: blog.csdn.net/qq_36407748… www.uml.org.cn/ajax/201812…

vue-router: www.jianshu.com/p/4295aec31… www.cnblogs.com/gaosirs/p/1… www.cnblogs.com/keepfool/p/…

React篇

dom-diff: blog.csdn.net/one_girl/ar…

列表key属性: segmentfault.com/a/119000002…

jsx原理(createElement): www.jianshu.com/p/6f3473d39…

react-router原理: www.jianshu.com/p/d991a4a55…

redux原理: segmentfault.com/a/119000001…

生命周期: www.jianshu.com/p/b331d0e4b…

react setState: www.jianshu.com/p/89a04c132…

react组件通信: blog.csdn.net/qq_25134721…

性能优化: www.sohu.com/a/252022209…

网络篇

HTTP1, HTTP2, HTTPS: www.jianshu.com/p/dc64f8063… www.jianshu.com/p/11c2614ef…

浏览从输入网址到回车发生了什么: www.cnblogs.com/aiqiqi/p/11…

前端跨域: www.imooc.com/article/291… juejin.im/post/684490…

浏览器缓存: www.jianshu.com/p/54cc04190…

cookie, session, token, localstorage, sessionstorage: blog.csdn.net/cadi2011/ar… www.jianshu.com/p/7a24216cf…

xss和csrf攻击: github.com/dwqs/blog/i…

状态码: blog.csdn.net/qq_35689573…

TCP连接(三次握手, 四次挥手): www.cnblogs.com/welan/p/992…

工程化

工程化这方面由于自身经验有限,所以只罗列了自己面试中被问到的一些问题,不代表全部。

webpack loader & plugin: www.codercto.com/a/30917.htm…

性能优化: mp.weixin.qq.com/s?__biz=MzU…

nodeJs: www.jianshu.com/p/3416a0bf3…

错误监控: fex.baidu.com/blog/2014/0… cdc.tencent.com/2018/09/13/…

算法篇

作为前端虽然对算法要求不高,但是刷的多了,慢慢对前端有新的认识:越是厉害的前端对算法、数据结构、系统的要求越高,所以掌握好算法是有必要的。

前端面试基本上前两轮都会问算法,但不一定就是leetcode上的算法题,有可能考察一些具体问题的实现,比如我被问到类似https://www.cnblogs.com/weiyf/p/5996671.html这个问题(但是是居中显示)、数组转树https://www.cnblogs.com/mengfangui/p/10494601.html等这类问题。这类题我觉得还是比较容易的,只要平常代码写的多。

除此类问题外,就会考到leetcode上的算法题。每个人遇到的情况都不同,就算是同样面试头条,有的人问的就比较简单,有的人问的就比较难,还有人可能不问。所以面试不仅是靠准备,也有一部分运气成分,但前提是你得准备好(不要心存侥幸!!!万一问到了呢)。

一开始刷算法确实很累,10道题没几道能一下想出来的。但是不要紧,刷多了就有感觉了,要坚持下来。每天可以用简单题先”热脑“,找点感觉,如果能解出来,就会有信心了,然后尝试中等难度和高难度。不推荐开始就刷难题,做不出来的话会备受打击。

算法不求全部刷完(如果时间充足就多刷,平均是100道左右)重点是总结规律。easy,medium,hard都要刷(hard可以少刷,但不能不刷)。要把每种数据结构都刷到(不要心存侥幸!!!我就被问到双链表,之前没有刷,结果尴尬了),重要题型要重复刷,尝试多种解法,总结各类题型规律

leetcode: leetcode-cn.com/

经典排序算法: www.cnblogs.com/onepixel/ar…

算法总结: [github.com/CyC2018/CS-…](github.com/CyC2018/CS-… 题解 - 目录.md)

算法总结2: github.com/Alex660/Alg…

链表题总结: segmentfault.com/a/119000001…

动态规划讲解: zhuanlan.zhihu.com/p/107479278

二叉树: www.jianshu.com/p/d1133ef8b…

项目经验(二面)

项目经验很重要,也是作为面试考察以及职级评定的标准,对一个问题能否有自己的理解,并给出具体的实现方案是决定你是否能通过面试的重要一环。

一般都会或多或少问你一些技术上的问题,但相较于一面的广度来说更倾向于深度。比如mvvm模式是如何实现的,setState原理,可能会让你写代码来实现,但一般都是说出思路即可。当然如果你能把代码流畅的写出来,对你的评分肯定不会低。所以这也是我说的理解程度影响你的评级。

其次,会问的问题包含但不限于

  • 项目开发流程
  • 技术架构
  • 说说做的的比较好的项目(突出你的贡献的地方)
  • 你担任的角色(多见于三面)
  • 项目中的收获
  • 项目亮点
  • 项目中遇到的难点
  • 简历中的某一个点干什么的,怎么实现的(比如用了css,具体某个属性和值要能说出来),如果让你自己做你会怎么做 (根据你简历问)
  • 组件设计与实现思路
  • 兼容性问题
  • 底层原理
  • 性能优化
  • 工程化
  • 前端学习规划(多见于三面)
  • 算法(有的面试官会问)

技术架构: baijiahao.baidu.com/s?id=164415…

项目亮点: www.jianshu.com/p/c0dbe77cf…

项目中遇到的难点: segmentfault.com/q/101000002…

项目经验的文章: juejin.im/post/684490…

领导面(三面)

对于所面试的部门和产品要有充分的了解,涉及的问题包含但不限于

  • 职业规划
  • 产品理解
  • 项目理解
  • 技术广度
  • 学习方式
  • 稳定性
  • 工作方式等

具体来说就是对于你现在以及未来的考察,根据你对技术的广度与深度的认知以及项目的理解(包含项目开发,多人协作,工作方式等)结合学习规划、稳定性等问题,对你现在以及未来潜力进行评估,判断你是否适合所面试团队并能为团队带来贡献。

这些问题要提前想清楚,不要回答的模棱两可,最后可能把自己坑了。

这一面很少考察算法以及技术和项目,可以和面试官充分交流,了解所在团队工作习惯、学习氛围、所要做的项目等。毕竟之后你要来所面试的团队,有必要提前了解清楚,避免之后不适应。

HR面(四面)

聊天

和hr聊天我认为也是需要技巧的,有的该说,有的不该说。如果非常期待进这家公司,就要表现出诚意,之前我在和一家HR聊天的时候,当问及还有其他offer没,我说了一堆在面的公司,现在想想,觉得不是很好,如果非常想进一家公司,至少得表现出在等着这家公司的答复,让别人感受到你真的想进。

其次,有的问题,比如问你绩效、离职原因之类的,最好能快速回答,如果想了半天,或者含含糊糊,别人有可能认为你不诚实,最后有可能把你拒掉。这些问题要提前准备好,最好给你朋友说说,如果别人认可你说的,至少说明你的理由能说得过去。所以,在HR面之前这些问题都要提前想清楚。

谈薪

这也是面试考察的很重要一点,是否能对自己有正确的判断。要根据自己的实际情况(包括面试情况以及工作年限)以及市场相应职位薪资来要。一般来说是涨幅10%-30%,但也不是绝对,你可以要50%、60%,甚至double,但要结合市场行情以及自身情况(包括面试情况以及工作年限)。

举个例子,如果感觉面试的很好,可以尝试按市场高点的价位来要(50%, 60%);如果差了点,适当降低10%-20%(30%,40%);如果再差,就再降点。**切记薪资不能乱要!!!**有一家还挺大的公司要的太高了(60%,当时面试的自我感觉不是特别好,但看了别人说的,要高点会被砍,所以就直接报了这个价),结果直接被拒了:(。

当然每个公司情况都不一样,有的公司最高能double,有的可能最高才50%,所以这些问题都需要提前了解清楚,可以问问有了解的朋友,或在相关平台咨询。

总结的话:不要看别人要多少你就要多少,要根据自己实际情况,每个人的自身水平和面试情况都是不一样,别人说的也不一定准,可以参考。在面试后自我评估基础上,增加幅度或减少幅度,但切记不要乱要!!!,对方很可能不和你谈,直接把你拒了(因为不止你一个人投这个岗位,还有很多人和你竞争,别人性价比你高,除非你很自信你的优势比别人高很多)。如果在和想去的公司hr谈之前能有别的offer最好,这样就可以用这个offer来argue。

其他补充

大公司与小公司面试区别

从我面的小公司和大公司来看,大公司套路少,流程基本一致,一面基础知识,二面项目经验,三面领导面,四面hr面。

而小公司一般对项目细节抓的深,上来一面就可能开始问你项目经验,包括用到的什么技术,怎么实现的,具体原理是什么,兼容性问题有哪些,设计模式在开发中怎么用的,某个模块或页面设计思路及实现方案。对具体实践,技术实现的要求比较高。

所以面试大公司和小公司都要分别做好相应的准备。

其他推荐的面试经验总结

JS问题总结: github.com/mqyqingfeng…

基础考察点: juejin.im/post/684490… juejin.im/post/684490… juejin.im/post/684490… juejin.im/post/684490…

前端面试总结: cloud.tencent.com/developer/a…

前端知识点总结: yuchengkai.cn/

前端知识点总结: github.com/Advanced-Fr…

这个博主写的三篇文章都值得前端的同学们反复阅读,不仅仅是为了面试,也是对自己职业的规划与反思: jartto.wang/2018/03/29/… jartto.wang/2018/04/29/… jartto.wang/2018/04/29/…

项目经验: blog.csdn.net/FL63Zv9Zou8…

总结 + 反思

从刚开始第一家面试被虐得体无完肤到后来面试都说出答案和自己的理解,其中经历了痛苦、煎熬、不相信自己、快要放弃到最后有所顿悟、收到多个offer,所以只要坚持下去,前方总会有希望。

总结来说,面试 = 基础知识 + 项目经验 + 技术理解, 产品理解 + 表达技巧 + 运气,我们控制不了运气,就得在其他方面多下功夫,每一部分都要能充分的准备,深入的准备。当然表达技巧这个要长期锻炼才能提升,不过我们可以对每一部分都提前进行讲述练习,并进行一定量扩充。

目前来看,面试对知识点考察的越来越细,有的需要你能写框架的某个实现原理(源码的了解程度),所以每一个考察点都要深入的学习和理解,只死记硬背是没有办法应付全部面试的。未来可能面试就要能手写框架了。

虽然我们面试一方面是为了找一份不错的工作,或者能够升职加薪,但是从另一方面来说也是对我们自身的考察。而我看来,面试成功的前提不仅仅在于面试前的学习,更重要的是平时工作中对于每一个知识点、每一次项目开发、每一个遇到的难点的积累、实践与总结,仅仅靠面试前的突击是无法走的更远的。

想要走的更远,就必须抓住每一次机会,不能放过遇到的问题。在每一次项目中提升自己,突破自己,并且要记得总结反思,希望所有的技术同学能共勉。

以上就是我对于面试的看法,如果有其他问题,欢迎大家留言。