非科班二本前端大厂面试的心路历程和总结(腾讯、头条、阿里、京东) | 掘金技术征文

35,534 阅读14分钟

现状和背景

个人背景

我是17年毕业的,大三升大四的暑假期间开始学习前端;在这之前一直在小公司打滚;而且至今已经换了四家公司了(算上接下来入职的公司),可谓跳槽非常频繁(其实是小公司容易倒闭)。如果说别人的经历的是如何的加分,那我得经历大概是负无穷。

在这样的背景下,我从2019年末到2020年三月底为止;基本面完了深圳大多大公司和一些小公司;这篇文章主要就是讲个人简历准备、面试准备和心态方面的经历。

面试情况

  • 腾讯 - offer
  • 京东凹凸实验室 - 谈薪环节
  • 字节跳动 - 谈薪环节
  • 富途证券 - offer
  • Coding - 谈薪谈崩
  • 顺丰 - 笔试 + 一面(薪酬面试官直言给不到,就没继续下去)
  • 还有一些中途挂了的公司(蚂蚁、阿里国际化、大疆、微众)

可能大家觉得面试收获不错,但其实我拿到的大厂offer基本是2020年3月份左右收到的,而面试挂掉的基本是2019年年末;当时真是陷入了自我怀疑和崩溃之间。下面具体说一下,个人的整个心路历程吧。

写作本文目的

写作本文的目的,除了抒发自己最近面试的一些感想,另外就是为了给有技术实力却缺少背景的技术同学提供一些进大厂的实操经验;对于背景过硬的同学其实参考价值不大(飞龙骑脸还能输?)。

面试前准备

技术基础

扎实的技术基础是面试大厂的前提

  • JavaScript基础(ES6+)
  • 浏览器基础(Dom Api、Bom Api、运作机制、渲染原理等等)
  • 算法基础(常见数据结构的应用(栈、队列、树、链表)、dfs、bfs、简单的dp)
  • 网络基础(https、http、http2、dns、tcp等等)

上面这些基础知识算上是基本要求,而且大多需要日常的积累,基础问题最好还要答出具体的应用场景和解决了什么问题。

例子:

  • 栈的应用:实现面包线或者路由组件,是典型的栈。
  • dfs:vue diff过程中采取的策略就是dfs,优势是****。
  • http2解决了什么问题?解决了http大请求阻塞等等。

另外就是原理题目要答的够细致:

  • 浏览器加载/解析流程
  • 浏览器渲染原理
  • event loop工作原理

最好能够去看一遍HTML Standard

上述这些问题如果停留在看技术文章,如果遇到深入的问题会被问懵。

如果对自己这方面的技术有信心后,就可以去刷面试题进行查漏补缺(面试题真的只能当查漏补缺看)

另外不要看不起一些基础技术,觉得用到去查就行了,常见被我们忽略的基础:

  • 正则表达式(我一开始忽略了,死的很惨)
  • 隐式转换(我一开始忽略了,死的很惨)

可能其他同学也会有各种平时觉得用不上的技术,压根看不上的技术,觉得没必要看。但到真的问到就凉了,所以我觉得是看的越多成功率越高。

框架层面,类似react和Vue反而没有太多问题,基本上了解实现原理,看过核心源码,理解设计上的理念就问题不大。

工程项目基础

个人之前还发过一条沸点吐槽自己项目不够优秀,老实说大多数前端同学的日常业务就是写写后台管理界面、切切图;业务毫无复杂度,即使业务有复杂度也不一定和面试岗位契合。

个人也是这样的,做得是金融方面的业务,虽然存在一定的复杂度,但业务专业性太强,面试官根本不懂我做得是啥;一开始我只要聊自己写的业务,面试官基本处于懵逼状态,然后就挂了。

所以后面工程和项目相关,我主要说的就是大家都能听得懂的方向了:

  • 性能优化(内存、初始化)
  • 前端监控(用户轨迹埋点、错误监控)

如果项目不大行的同学可以考虑聊这方面的实践。

在聊项目实践的时候需要注意的是深度的问题,在小公司的场景下,往往对工程化的实践是非常浅薄的。

比如说问初始化优化回答的就是:dll分包、按需加载、图片base64、gzip压缩。

显得非常苍白,在回答工程化实践的过程中个人个人认为需要说清楚下面的问题:

  • 为什么要做这件事情(交代背景和原因)
  • 实施过程是怎么样的,遇到了什么困难,如何解决?(确认你参与度)
  • 最后取得了什么样的成效(最好能提供实际数据)?
  • 拓展:在大量的用户(数据)环境下,会遇到什么样的问题?
    • 比如:监控海量日志怎么样写入(小公司哪有海量日志,所以需要自己拓展思考)

这些问题都要在面试前,自己提前想清楚,临场发挥往往不如意。

面试过程中技巧

面试过程中除了写编程题和问一些基础问题;其余时间基本都属于聊天,所以重点在于能把天聊下去。聊得开心也就过了;聊得卡顿,让面试官频繁看简历找问题问,基本就凉了。

所以事先准备一套能够足够深入聊下去的技术方向就显得非常重要,自己脑补好一套连续的问题,自问自答;在面试过程中,引导面试官到自己事先准备好的方向。

心态

不得不说心态非常重要,面试是双方互相选择的过程,最终结果受多方因素的影响:

对于面试者来说:扎实的技术 + 运气 = Offer

毕竟不同的公司、不同的部门、不同的面试官的面试偏重都是不一样的,要拿到一个合适的offer不仅技术重要,其实运气也很重要。

在我个人的经历中:一面面试官赞赏我技术基础扎实,二面面试官直接说我技术基础不扎实的情况也是发生过的。

在现在相对内卷的环境下,面试更多是要表现比其他人更好,而不是达到某个标准;所以摆正心态还是蛮重要的,没面过也不代表自己技术不行。

另外就是制定好目标,规划好自己到底为了什么而跳槽,打算去哪家公司?为了平台还是钱,亦或是纯粹想换个环境。

就我个人而言,一开始锁定的目标就是腾讯,中间迷茫了一段时间考虑要不要去中小公司算了;后面觉得跳槽去小公司并非我的目的,最后坚持下来才拿到了腾讯的offer(可以看到我有些公司谈薪谈崩了,有部分原因就是我故意开的很高)。

简历的准备

最好当然是每一份岗位单独准备一份简历。但是对于个人而言,我投出去的简历并没有把握收到面试邀请(背景不够硬),所以每份单独准备时间成本太大,所以我这里是只准备了一份简历的。

对于简历而言,个人认为大概三个方面:会什么、做过什么、能做什么

项目描述遵从star原则;而不是单独罗列做过的东西,最好的检测方式我认为就是,如果自己是面试官,看到这份简历能够问什么问题,这样的问题足不足够支撑我进入大厂?

另外有个雷区就是切忌简历过于夸大,被问到自己无法hold住的面试题就完了。

例子:

  • 初始:我写了推广落地了http2(在小公司的环境下基本改个配置,做一些测试就行了);在大公司的环境下更换应用层传输协议,其中工作量和技术评估相差巨大。
  • 后续改进:在前面加了限定词,公司内部项目推广落地了http2;这样把影响范围网络环境限定在比较简单的环境下,也说明了自己实际使用过http2。

在面试的过程中,应该不断修改自己的简历,把自己回答的好的问题凸显在简历上,吸引面试官提问;把答得不好的问题在简历中边缘化。

下面是个人简历部分的截图,能够获得面试邀请基本是因为这部分吧,各位看官可以做个简单参考

各大大厂的面试风格

每个厂之间的面试风格都不一样,甚至每个部门之间的风格都不一样;面不同的公司进行有针对性的准备可以提高成功几率。下面我说下个人经历下来的一些看法。

头条飞书、富途证券(算法扎实优先考虑)

把这两个放在一起说是因为这两家都喜欢写算法题。

富途证券这边一共三轮技术面试,基本上每轮都两道以上的编程题或者概率题,全程基本不会问项目,只有第一轮面试会过一遍前端基础问题,后续基本写题就完事了;反馈非常快,大概面试完第二天就能知道面试结果。

头条这边面得是飞书,每轮面试官除了固定的编程题外,像是有明确的问题方向;第一轮偏重前端基础,第二轮偏重项目设计,第三轮主要是针对某一方向深入挖掘和有点压力面得感觉。

另外头条比较好的地方是每轮面试记录比较详细,基本不会出现两轮面试之间问重复问题的情况;头条的反馈也是非常快的,基本上也是面完第二天就有反馈了。

这两家基本上要对自己的算法有一定信心才去尝试,因为算法题占面试的比重极大。

京东凹凸实验室(适合复杂工程化和nodejs方向)

京东也是三轮技术面试,京东是我面的唯一一家没有编程题的大厂。

三轮技术面试基本偏宏观,比较少落到具体某个点的细节;也是唯一一家问了webpack的(我简历中并未提及webpack);京东面的是凹凸实验室,场景比较核心(负责618和京东PC首页),内部平台使用nodejs;成员基本上全栈开发。

着重nodejs的工程化方案、部署运维(内存管理、监控方案);webpack内部原理和针对小程序的应用;面试官对小程序、多端方案、前端微服务这些比较感兴趣。

另外据反馈,商家平台经常挂(nodejs),所以有这方面经验的同学去面基本很稳;基础题极少。

阿里和蚂蚁

这两个都挂了,而且说实话并不知道为啥挂了;二面之前会有道编程题并不难,但不能debug,到时间会自动提交;而且不知道执行结果。

总体的面试风格比较务实,一面基础,二面会根据项目展开进行提问;

个人建议的话,面阿里还是选择杭州的岗位比较靠谱。

腾讯(比较综合,但题目不算难)

腾讯面试轮次很多和流程较慢,如果像我这样下定决心要进腾讯的,要做好长期作战准备;个人面试腾讯经历了五轮技术面,一轮GM,一轮HR一共七轮;前后一个多月的时间。

腾讯因为技术面比较多,所以总体问的会比较面面俱到,编程题、前端基础、项目、设计都会有所涉及;

个人经历大概是组员负责面基础、leader会根据项目进行展开提问、总监(非前端)聊技术视野、面试委员会会比较难类似头条三面、GM聊人生;leader后面的面试基本都会问职业规范和跳槽原因;这些面试之中会穿插编程题。

总得来说,腾讯面试难度并不高,但是容错率比较低,一些问题没回答到点上就会挂;因为本身轮次也非常多,所以造成了面腾讯非常考验心态,两次面试之间的间隔非常随机,有可能隔一天,有可能隔一周;所以面试腾讯心态是最重要的。

一些面试题

编程题

  • 实现Promise
  • 实现xss-filter
  • 实现正则获取url params
  • 合并n个有序链表
  • 渲染一个超长的list,实现dom节点的复用
  • random7实现random10
  • 实现正则切分千分位(10000 => 10,000)
  • 实现正则切分银行卡卡号(像实体卡一样四位一个空格)
  • 实现jsonp
  • 判断一个ipv4地址是否存在已有的1000万条ipv4地址中(bitmap)
  • 实现bind,实现new
  • 一次可以走一步或者两步,n个阶梯的楼梯有多少种走法
  • 实现扫雷(二维数组,随机分布地雷坐标)
  • 计算累进税率
  • 求一个数组中比左边和右边的元素都大的元素(On)
  • 实现双向绑定
  • 实现InputNumber

上面基本上是个人半年来遇到大部分的编程题,还有一些不大好描述的;还有一些闭包相关的编程题都算比较常见的题目了。

网络和安全

  • https原理(握手过程)
  • http1和http2有什么区别,http2优势
  • http常见返回码及其含义
  • http缓存控制,协商缓存相关的几个头部的之间的优先级关系
  • 什么是cors?为什么要用cors?
  • xss是什么?如何防范?具体例子,jsonp如何防止xss?
  • cookie有什么用?存在什么问题?如何解决?crsf如何防范?
  • dns寻址过程?简述cdn原理

其他简述题

  • 谈下vue和react的差异
  • 谈下对react hook的理解
  • 谈下对typescript的理解
  • 谈下对前端微服务的理解,有什么好处,有什么坏处
  • 谈下对serverless架构的理解
  • 谈下react fiber的理解
  • 浏览器输入url后流程,尽可能详细
  • 前端适配方案
  • 谈下mobx和redux的差异和选择
  • 如果让你从零主导一个项目,描述下整体思路,前端后端,开发到部署
  • 如果让你搭建一套前端监控方案,具体思路
  • 如何定位内存泄露

除了这些比较通用的问题,大多还是聊项目具体内容会多一些;由于面试完有点久了,题主一个只能回忆大概这么多问题,实际远不止这么多题目;实际可以发现简述题和我写的简历是息息相关的,所以其实除了基础面试题可以翻阅一下面经;这类简述题只能当做参考。

没有标明具体的公司是考虑到可能会有部分公司不允许发面经;如果有同学对具体某个公司感兴趣可以留言

总结

疫情期间总体行情还是只有头部公司在进行招聘,题主面得小公司都是去年面得;头部公司岗位还是比较充足的,但是竞争也比较激烈;实际上可以看到有部分岗位题主已经面完HR了,却迟迟不肯发offer,可能也被丢到备胎池里面就行对比了。

所以总体建议还是充实自己,充分准备;不要浪费面试机会。

最后祝大家都拿到心仪的offer。