如何轻松拿到淘宝前端 offer
前言
从某种角度来讲,这里的 “轻松” 并不轻松,因为没有一定的技术功底,面试依然很难,可是换个角度来想,你面的又不是 P7、P8、P9、P10、P11……如果你面的仅仅是一个工作在一线的普通工程师,不需要多年工作积累的人脉和管理经验,也不一定需要很强的业务能力,只要你在技术的某些方面有过人之处,你就有机会,这样想是不是轻松了很多呢?
准备
如果你要面试一些大厂,(这里以个人经历的淘宝面试为例),准备肯定是需要的,就算是网上的各种技术大神,从繁忙的业务项目中脱离,回答一些具体的技术问题时,在没有准备的情况下,也很难回答的出色,毕竟这不像他们写文章或者回答问题时有充足的查阅、消化和总结的时间。
比如我以前在学 JavaScript 的时候,看过冴羽的《JavaScript 深入系列》,当时觉得作者真是一个技术功底扎实的人,后来有幸在面试前与冴羽有所交流,他告诉我他当时为了准备面试,把自己写的文章又看了一遍,我以为是这类人都比较认真的缘故,然后他跟我说,因为他忘了……忘了……(/□\*)
嗯,回到正题,那么我们要准备哪些内容呢?要知道技术题目的准备其实并不是最重要的,能够明白一些面试的道理才是准备的开始。
准备范围
前端的知识繁杂琐碎,即便你想面面精通,也是心有余而力不足,准备面试的时候,也是这样,没有人会精通各个方面,说精通的往往各个方面都很浅,面试官其实也非常了解这一点,毕竟爷爷也是从孙子走过来的,尤其是面试官往往还是各技术团队的主管,尤其明白团队成员擅长的方面并不是一样的,面试的时候也不会要求面试者面面精通,部分有深入理解,部分熟悉,部分了解即可。
所以对于面试者而言,面试不一定就要准备的非常充分,什么算法、React 原理、Vue 源码、游戏引擎、EcmaScript 规范,都能答得头头是道,深入浅出,回答之余还能展示点 leader 的潜质,获得面试官内心的阵阵惊叹……醒醒吧,少年,你的能力或许能超过面试官,但是见识肯定比不过。
而且抱着这样幻想的人,往往在准备面试的过程中非常痛苦,因为很多知识并不是你看看书,查下资料就能明白的了,没有那么久的时候去实践、思考、消化,你是很难有深刻理解的,强行理解也只会顾此失彼,背个知识点而已。背知识点倒不是问题,就怕你说的自己很牛逼,面试的时候稍微问个有点深度的问题,理解程度就被看穿了,这就很容易拉低面试官对你的印象分了。
所以如果你要准备,先做的就是断舍离,精简自己要准备的知识范围,从自己的实际业务、以及擅长或感兴趣的技术出发,深入探究和准备,比如我就选择了自己擅长的方面,重点准备了 JavaScript 底层、React、HTTP 等方面的知识,什么算法、Canvas、Vue,这方面的知识一点都没有看,也许你会想,如果你被问到了怎么办?
如果被问到了,就直接说不会!绝大部分的不会对面试官而言并不是扣分项,反而还能快速的帮助面试官找出面试者擅长的方向,最讨厌的就是明明不是很熟,却还想要随口装下逼,搞得自己高大上、涉猎广、有深究,然后就被面试官不断追问,最后只能尴尬的说其实我平时还是干什么什么比较多……面试官心里肯定也是 MMP,不熟扯什么犊子!
如何准备
嗯,回到正题,确定了要准备的范围,那么该如何准备呢?
既然选了实际业务、以及擅长或者感兴趣的技术,你一定知道一些你知道自己不知道的知识点,就比如说我是刚学习前端的新人,虽然我对原型及原型链的概念不明白,但是我听说过,知道自己不知道原型链,那我就可以把“原型”这个关键词记录下来,这样的关键词初期你会记很多,记录下来后分个类,然后逐个在 Google、知乎上搜相关文章,优先找一些高浏览量、高赞的文章或者回答阅读和消化,觉得自己理解的差不多了,尝试以一个面试者或者给新人介绍的角色去梳理这些知识点,梳理的同时最好能及时记录下来。
此外学习的时候肯定会遇到很多新的不知道的知识点,接着记录下来,只要你确定了自己的范围,新的知识点会越来越少的。
也许你会想,这个准备说的如此简单,可真到准备的时候,就比如说准备 React,那么多知识点呢,我岂不是至少要准备一两个月?
再具体一点,就比如研究虚拟 DOM 的实现,在平时还有工作的情况下,至少也要一个月吧?
其实还真是的,如果你基础比较欠缺,准备几个月确实是需要的,要不然你还真以为有什么秘籍就能轻松拿各种大厂的 offer 吗?
但是你也要知道,这已经是比较快的路了,不走弯路才是最快的路。
此外,如果你真的花一个月的时间只准备一个虚拟 DOM 的实现,对其中 diff 算法、最短编辑算法非常清楚的话,说真的,我肯定要面一场讲一次,讲一次虐面试官一次!
准备程度
确定了要准备的范围、以及如何准备,那么要准备到什么程度呢?
绝大部分的知识点,你知道就可以了,但是,如果所有的知识点都只是了解一下,这样的准备是远远不够的。
难道在学习的过程中就没有一点疑问?有疑问的时候有没有尝试去深究一下呢?
做项目的时候有没有过想过这个项目如果有什么什么功能就好了?又有没有尝试去实现这个功能,哪怕要自己写个插件来实现呢?
在多人合作的时候,有没有觉得某些方面的流程需要优化,又有没有想过该怎么优化,加快合作效率?
在团队建设的时候,有没有觉得团队中哪个地方没有做好,或者是规范、或者是脚手架、或者是组件库、或者是某些技术沉淀,有没有想过帮助团队做的更好?
如果你有这样的想法,请珍惜并且努力的去做,因为这样的想法你不需要实现太多,几个就行,而且你做这些东西占用的时间将不到你学习和工作的 5%,但却能撑起你面试中 50% 的内容。
案例
面试中经常会讲到什么 STAR 法则,在我看来,就是准备些能够展示你优秀特质的案例,既然是案例,一需要你事先准备,二需要从你的实际经历出发。
上文讲到的各种想法,你努力实现后,就非常适合改写成案例。
案例的基本结构就是当时你遇到了什么问题,然后怎么去解决的,最后收获了什么,或者你在学习什么的时候对什么问题感到很好奇,然后深入研究,探索出了原因。
这个东西很重要,又很难,首先是你要从自己的业务或者自己感兴趣的问题出发,其次是努力的解决或者研究问题。
举两个稍微具体的例子,就比如你开发一个脚手架,然而脚手架并不能完全满足你的需求,你就会想到如果能实现某个自动的功能就好了,然后你对网上找的各种解决方案都不是很满意,于是你自己去研究实现,花了一周时间写了一个插件,发布在 npm 上,漂亮的解决了这个问题,然后插件在公司的各个项目中都有应用到。
或者是说在学习 JavaScript 乱序的时候,看到了一种 Math.random() 实现乱序的方式,虽然方法很惊艳,但是大家却说这种方式是不能实现真正的乱序的,为了了解本质,我深入探究了 V8 源码,最终明白是 V8 插入排序算法导致的问题。
基本套路就是这样,解决的方式或者研究的东西越有深度越好,这些真实立体的例子会极大的提高你在面试官的印象分。
面试
什么是面试?如果 Google 搜这个问题,你会得到这样的定义:
面试,是一种在特定场景下,经过精心设计,通过考官与应试者双方面对面地观察、交谈等双向沟通方式,科学测评应试者能力素质、个性品质等要素的人员甄选方式。
虽然书面上是写着考察能力素质、个性品质这种看似抽象的东西,其实说白了就三点:
- 技术能力达标,能够完成团队的日常工作
- 让人愿意与之相处
- 会在公司呆很久
在此基础上,如果你工作年限比较少,能够展示出不错的学习能力、或者对于技术的热情,如果工作年限比较长,对于技术有更广泛的视野,有人脉和管理经验,这些都是大大的加分项。
关于第一点,能够完成团队中现在的工作,不一定就需要面试者与团队的技术栈匹配,就比如说团队主要的技术栈是 React,你如果 Vue 很好,只要你对技术没有偏见,依然是可以的,因为你如果 Vue 能做的很好,React 也一定能做的很好,不过真正的问题在于,当技术栈不匹配的时候,面试者是否能在面试官不熟悉的情况下表现出自己的深入研究,还有就是能否表明自己愿意重新开始,重新学习的一种 open 的心态。
关于第二点,让人愿意与之相处,因为对于面试官而言,招的不仅仅是下属,还是同事,能够融入团队是件很重要的事情,而对于面试者而言,就需要展现自己一些比较亮眼的特质,比如什么国家二级运动员、钢琴六级、二次元小 V、单车去西藏等等,这些事情不仅会给面试官留下深刻的印象,而且会让人觉得这人很有趣,愿意与之相处,实在没有的话,也没有太大关系,可以先好好反思人生,然后被问到的时候简单说下自己的兴趣爱好就行,最最基本的要做到面试官态度好时我也态度好。
关于第三点,会在公司呆很久,如果你在上一家公司工作稳定,呆了两年以上,这个问题倒不用太担心,对于那些频繁跳槽的人来说,如果能真诚的解释下频繁跳槽的原因,表明愿意好好工作的心意,相信面试官和 HR 也会好好理解的。
面试官
与面试官交流的时候,你可能会感到恐慌,觉得面试官好可怕的一个人,但是如果你入职后与之接触或者问他身边的人,一般都会是一个比较随和的人,想想也确实如此,面试时间短暂,又是从完全陌生到部分陌生,一方又是能决定你工作机会的人,万一对方是大厂,自己内心还有几分想要这个 offer,各种不对称很容易就造成了自己内心的恐惧,在面试的过程中如果遇到点挫折,很容易就直接自暴自弃,任由宰割,但是如果你能意识到面试官其实也是个随和的人,在发挥不好的时候,你大可以坦荡承认自己的紧张、不足,然后再重振旗鼓,引导面试到自己擅长的方面,最怕的就是遇到些不会的问题,然后就气势直降,发挥越来越差,最后只能内心怀着一点点期望,希望面试官还能给自己一次机会,这样的自己想想都觉得好可惜。
回到正题,除了面试官比较随和之外,面试官的水平还可能不如你,不过要注意仅仅是可能,有的面试官是团队中的一线主力,这种还好,整天忙着加班做业务项目的人,绝大部分是没有足够时间去研究技术细节实现的,还有的面试官是团队的主管,更注重管理和业务,这些时候都需要你去谈一些比较深入的细节实现,充分体现出你在某些技术方面的深入研究。
当然了,面淘宝的话,对很多细节实现的人都非常了解的人还是有的,不过是不是,其实面试的时候面着面着就感受出来了,因为有某些特长的人一般都忍不住秀下自己的特长,对于这些技术大神也是一样,技术就是他们的特长,这些人往往在追问你细节的情况下,还能根据你的回答,给你普及知识,然后引导你更加深入,这种情况就只能靠个人发挥了,但如果面试官在追问细节的情况下,仅仅是听你讲,你倒是可以尝试深入细节去讲讲。
刷题
在没有明确自己要准备的技术范围时,去刷题只是用战术上的勤奋掩盖战略上的懒惰,而且如果你要面淘宝,你在网上刷的那些面试题真不一定适合你……
但是!刷题是要的,只是要明确范围。
引导
如果任由面试官提问,绝大部分的面试官会习惯性的将问题带到他所擅长的部分,这种是最危险的,因为此时面试官对于提问的问题往往是有比较明确的答案,而对于这些问题的理解程度你很可能达不到面试官的理解水平,很容易就被面试官掌握节奏,所以你需要一开始就引导面试官去提问你擅长的方向,无论是简历、还是自我介绍、还是回答、哪怕是承认自己知识的不足之后,也要努力的引导面试官往你擅长或者准备的方向走。
简历
简历很重要,很重要,很重要,一般面试官都会根据你的简历进行提问,简历所以很大程度上决定了面试官对你的提问方向。
那么我们该如何写好一个简历呢?我个人认为就一个标准:不要写废话!
这要求你在简历写的每一句话都必须是有意义的,并且做好了被提问的准备。
什么是有意义,写个人姓名和联系方式是有意义的,写星座是有意义的吗?这个问题还真是见仁见智,细细一想好像没有什么意义,但再细细一想,假如我面得是运营,写个水瓶座会不会表明自己年轻的一种心态呢?
又比如写项目经历是有意义的,写自我评价是有意义的吗?这个又是见仁见智了,我确实见过很多简历写了自我评价,但在我看来,写的既没有干货,也不让人信服,丝毫作为不了判断的依据,感觉更像是凑字数,但确实也见过有些简历自我评价写的不错,可以作为加分项。
讨论这些只是希望你写简历的时候能够斟酌每一句话的意义所在,以及换成其他的内容意义是否更大?
除了内容要有意义外,对于写的每一句,你是否都做好了被提问的准备?
就比如说其实你主要的技术栈是 Vue,然后曾经在其他项目里参与了一点 React 相关的开发,而自己对于 React 其实也就是了解点基本语法,再加上偶尔看到文章的那么一点了解,那你是否还要在项目经历中提及 React 呢?
如果是我的话,我一句都不会写,因为搞不好你的面试官对 React 比较熟一点,Vue 提问不了什么有深度的地方,就深挖你 React 的知识,而你其实又不熟,最后搞得两者都很尴尬,所以干脆一点都不写,不给面试官留任何机会。
当然如果面试官直接提问你 React 方面的知识,你大可以说以前做项目的时候,接触过一点,基本语法是熟悉的,不过还是 Vue 最熟悉,相比面试官也不会为难你,再追问 React 的知识,这可比简历上装逼写 React ,然后被提问,问到怂可好太多了。
如果你这样逐渐精简你的简历,对于绝大部分人来说,很快你就会发现你的简历可能连半页纸都不到,不过没有关系,少即是多,去掉就是一种进步,因为你去掉的那些内容在面试官看来其实没有任何意义,也不会成为选取依据,反而还分散了面试官的注意力,搞不好还会带来一种劣质简历的既视感,引起厌恶。
那么我实在没有内容可写了怎么办呢?总不能空着一半简历吧?说真的,没有内容就去努力准备,造一些能写上去的内容,拿些没有意义的内容充数更多的作用是自我安慰。
最后在这里补充一个技巧,如果你做过移动端的作品,你可以直接在简历上印上二维码,方便面试官直接看到你的作品。
自我介绍
在阿里的面试要求里,自我介绍是一定要有的流程,面试官不可以因为时间紧急就省略掉面试者的自我介绍环节,而自我介绍环节又是面试官开始与你直接产生交流的第一步,一定要大概率确保面试官会往你准备的方向提问。
首先简历上的重复信息就不用说了,建议是简单介绍完自己后,就直接上个人主要的项目经历,或者技术栈,或者这几年的成长经历,言语间最好能勾起面试官的提问兴趣,但是不要只罗列你做了什么,重点是表达你做了什么,学到了什么,收获了什么,如果有具体的数字证明就更好了。
其次是介绍的时候,不要说的太流畅,语速也不要太快,在重点关键词比如具体的数字,技术栈的时候,最好装作思考的样子故意说慢一点,这样会更容易引起面试官的注意。
最后是内容越短越好,这可能会有些反常识,因为一般都会告诉你满打满算,但实际上技术面试一般都会至少 40 分钟起,真正决定面试者是否能通过还是在于一系列的问题,讲短些一是不用担心时间限制,二是说多了面试官也记不住,留下关键信息让面试官提问就好了,三是就是这么有个性,与众不同,没有想到吧……
回答问题
回答问题的时候,遇到不会的问题不要慌,先直接说不会,不要“啊……嗯……”的拖时间,然后想想是否有相关的知识点可以说一下,然后讲讲相关的知识点,对这一方面实在不了解的话,直接承认自己的不足,然后讲讲自己擅长或者准备好的方向。
其实是如果遇到实现准备好的问题时,不要说的太流畅,至少要有点思考和回忆的样子,该有的卡顿还是要有的。
还有就是切忌装逼以及急于展现自己,有的面试者为了显示自己涉猎广,讲某个东西的时候,会扯到自己其实并不熟悉的内容,然后就被面试官不停追问……因为你实在是不清楚面试官会根据什么进行追问和深挖,而且有经验的面试官往往都会提问些你之前可能没有注意的问题,所以尽量还是往在你擅长的方面上扯。
开放性题目
在面试的后期,你还会遇到很多开放性题目,常见的不外乎以下 14 道题目,所以以下题目请都准备一份回答,剩下的就看你自由发挥了。
- 你的优点
- 你的缺点
- 最近在看什么书? 怎么学习的前端知识? 保持自我学习?
- 为什么要从事前端?
- 为什么离职?
- 你的职业规划
- 有什么问题问我的吗?
- 最近项目解决的一个技术难点,即项目中遇到了哪些坑?怎样解决的?
- 最近做的最成功的一次分享是什么
- 说一件你做的最酷的事情是什么
- 怎样理解前端工程化?
- 前端发展趋势?
- 框架选型依据?
- 所在团队工作流程的介绍、以及你在团队中的定位和技术排名
以上问题请不要太如实回答,回答的时候请再配上一个具体的案例,案例的基本套路上面有讲,能编成有意思的段子最好,案例可在多个问题中复用,真实面试的时候,请装的越真越好。
如果你能明白以上这些点,其实我面试时候的题目就不那么重要了,不过想必你肯定很好奇,所以我也来讲一讲。
内推
内推其实是阿里最大的招人渠道,尽自己所能找学长、找朋友、找大神,而且成功内推一个比如说 P6 级别的人,内推人可以获得几千的推荐费,所以你如果找他们帮忙内推,他们一般都会非常乐意。
不过这些我是直到进来后才知道的,我当时知道的是内推一般都会直接获得面试机会,所以我还是鼓足勇气,忐忑的在知乎给冴羽大大发了私信,因为平时有关注他的博客,觉得为人很随和,希望至少能给我个建议之类的,不过冴羽大大人真的很好,不仅帮我修改简历,内推,还给我讲了很多面试技巧,深表感谢。
第一轮电话面
内推的第二天晚上大约 7 点钟,就接到了面试官的电话,一般面试官都会先询问你的时间是否合适,我当时刚准备回家,接到电话后,就说正在回家的路上,约到了 7 点半再面试。
于是我果断喝了一杯水,然后带了电脑、纸条和中性笔,找了一个会议室,反锁后就开始回顾纸条上写的一些系统的知识点,比如说什么性能优化和跨域的解决方法……
7 点 32 分,面试官打了电话,说真的,这种说好 7 点半,然后晚了 2 分钟打电话,真的是严重消耗面试者的精神,严重消耗。
面试的开始永远是一个自我介绍,一句话表明身份后,就开始介绍自己的项目经历和主要的技术栈,然后面试官就我所做的项目做了一些提问和了解,我则重点阐述了我基于项目所做的一些优化点和带来的效果。
然后因为我简历中单独写了一项“技术关键字”,于是面试官就提问了一些技术问题,比如
- 什么是作用域链?
- 继承的原理和应用
- 虚拟 DOM 的原理
所幸都是些基本的问题,作用域链可以看冴羽大大的 JavaScript 深入系列,继承的话,如果写过 EventEmitter 和几个原生组件应该就会有体会,虚拟 DOM 算是准备 React 知识时一个必定要准备的知识点,可以直接搜到很多文章,我在准备时因为时间充足,所以重点看了 React keys 的作用,以及由 keys 引发的一个数组发生了增加、删除、移动操作,如何根据前后两个数组算出具体由哪些步骤可以从之前的数组到之后的数组,虽然这个算法我也是迷迷糊糊的,但是感觉面试官肯定对这方面也没有深入的了解,毕竟这个知识点很深入,所以就讲的很果断,希望我是秀了一把……
然后就问了性能优化,还好我有准备,嘿嘿……
最后是一些开放性题目,比如还有什么是你擅长但没有展示的,这几年工作的收获之类。
最最后就是有什么问面试官的吗?其实没有,不过我还是问了一个,“根据我今天的表现,面试官对我有什么建议?”
面试官给的评价是“知识比较有体系,但是脱离业务”。
说的很准确,我差不多也感受到可以准备二面了。
第二轮电话面
第一轮如果说比较偏技术的话,第二轮就比较偏开放,这主要是因为面试官的等级提升了,关注的点也会有所不同。
自我介绍后,然后就我的技术栈进行了提问,比如说我即做过移动端的活动页面,又做过 PC 端的后台项目,就问了我移动和 PC 以及 toB 和 toC 项目的区别。又比如说我讲到我写了一套脚手架,就问我有没有什么二次开发?然后我就讲了我写插件的经历。然后又问了我如何在团队推广我的脚手架之类的。
然后就是各种开放性问题,比如:
- 1 - 3 年的规划
- 为什么会选择离开?
- 如果你再待一年,你会做什么?
- 如何选择新的技术选型?
- 前端发展趋势
- 团队的组成、在团队的定位、技术排名
最后就是有什么问面试官的吗?其实也没有,但我又问了跟一面同样的问题。
面试官给的建议主要是学习和技术选型上的建议,我差不多也感受到可以准备三面了。
技术三面及 HR 面
这次是视频面,嗯,如果有什么建议的话,就是一定要稳住、一定要稳住、一定要稳住。
因为这次的面试官不仅又提高了一个等级,而且技术也是业界杠杠的,对于各种语言也颇有了解,不仅从多个语言的角度碾压了我,而且还利用面试官优势强行将话题转到他擅长的话题上,结果他讲的比我还多,虽然我面着面着就知道我一定能过了,但依然被面得心态失衡,导致我在回答 HR 的问题时发挥的也很糟糕,总之是一次很惨的经历,惨的我此时回顾既愤恨又无奈……
总结
面试的内容就这么多啦,想要拿到大厂的 offer 又怎么会是件轻松的事情呢?平时学习的时候要有总结,做项目的时候要有优化,点滴积累才能有面试的轻松,但根本上还是要有对于技术的兴趣,对于优秀的追求,有这些的时候那些技巧和方法才能发挥最大的价值。
作者:冰冻柚子茶
发表评论 (审核通过后显示评论):