三年前端面试思考
985本科,软件工程专业,前端。
工作三年半,第一家创业公司,半年。
第二家前端技术不错的公司,两年半。
第三家,个人创业半年。
可以看出,我是个很喜欢折腾的人,大学期间也做过很多项目,非常愿意参与到产品中去。技术上勉强合格,不过独自负责过很复杂的前端项目,所以一般基础面试题还有项目经历都没有太大问题。然而面对一些框架的实现原理、源码、工具等研究较少,加上技术栈比较陈旧,对 React 和 Vue 了解较少,导致水平一般都在阿里 P6 级,无法突破到技术专家的评级(P7)。
在换工作的时候,我也认真思考了下一份工作的核心诉求——踏实成长。
具体的讲:
技术沉淀
视野+平台
所以,一开始就拒绝了所有初创公司,只看大平台,自己心中的第一优先级是蚂蚁金服、头条。
一共面试了四家
美团新零售
贝壳装修
蚂蚁网商银行
头条商业化
美团 2-3+
蚂蚁 6+
头条 2-1
贝壳因气场不合没有发 offer。
这里就不说具体的 offer 情况了,还蛮有竞争力的。
基础问题永远绕不开,前端技术面的考点无外乎:
事件原理,闭包,调用栈,Promise,ES6, 工程化,webpack, 性能优化,跨域,安全问题, React、Redux 思想,Virtual DOM,Diff 算法, 移动端布局,浏览器渲染原理,Event Loop 等
还有手写代码,主要考察一些基本 API 和 ES6 的使用。最常见是在 Array、String prototype 上写一个函数。
比如 'abcd'.f() => 'd-c-b-a'
还有一些常用的函数,比如 bind (好多家都考……),throttle, debounce 等
总之,这些都是前端绕不开的概念,也建议可以真正的夯实基础,多看书,多总结。在面试的时候,面试官通常也是看人下菜,『高级』的概念不清楚,面试官也会主动降低问题的难度。从我面试来看,基本上大厂对于候选人技术的定位还是蛮准的,在面试前我也知道我自己的技术水平就是阿里的P6,结果也是,美团 2-3,头条 2-1 评价基本一致。
至于薪水还需要考虑自己其他的软技能,这个会在业务面的时候重点考察。
有些公司还是会考一些算法,比如美团、头条。但是不多也不难。
如果平常刷过 leetcode 的话应该问题不大,对于前端同学来说 leetcode 上的 medium 题目应该就可以了。
这里分享一个很有意思的问题,来自头条:
100 * 100 的 Canvas 占内存多大?
感觉非常有新意,各位同学可以思考。
分享一个算法题:
给定一个数组排序,使得奇数位的值不大于相邻偶数位的值。
《100*100的 canvas 占多少内存?》
一般第二面或者第三面的时候都会结合业务聊技术
我个人非常喜欢这一面,因为自己独自负责过非常复杂的前端项目,基本上从技术选型、前端工程化、架构、设计模式、复杂模块、性能、安全问题、团队管理等都可以扯到。所以这一面往往聊的比较嗨,一个项目就可以面1-1.5小时左右。
以蚂蚁举例,由于我自己面过两次蚂蚁,在聊二面的时候都是这么一个问题,从我个人的业务出发,基本上把项目开发中所有我自己认为可以展示自己思考的点都问了一遍,蚂蚁的面试官也会提出很多临时需求,主要查看面试者面对多变需求如何灵活调整技术方案。
在二面过程中,一定要熟悉自己的项目,尽可能多的参与到项目中去,也尽可能深的了解项目,当然,了解是一方面、表达是一方面、心态又是另一方面。
这三者层层递进,毕竟对于项目的了解是基础,这个需要我们深入业务,多思考,多总结。没事给新来的同学梳理业务,画画业务框架图,主动承担一些有技术难度的工作(比如性能优化、安全排查、工具上提升开发效率等),多分享自己的工作,多和产品经理撕逼,锻炼自己的表达总结能力。如果前两步做的比较好,就可以自信的展示自己的项目了,面对变化的需求,相信也可以快速的想出更好的解决方案。
基本上前两(三)面就可以对一个同学的技术水平有一个比较全面的了解,也方便公司进行技术评级。
第三面一般都是老生常谈:过往工作的选择,换工作的原因,自己的职业规划,自己平常是如何提高自己的等。
这个虽然都差不多,但还是希望各位同学可以多多思考这些问题,毕毕竟工作的目的都是为了自己可以更好的成长,更多的创造价值,顺便获得一份不错的薪水。工作本身就是一种生活的态度,还是要认真面对自己的选择。
终面的时候,一般都会留有一个向面试官询问的阶段。我自己总结了几个问题,可以分享给大家。
目前咱们的业务,有一个什么样时间规划,这期间有哪些milestone?
我的过往工作经历,有哪些是对咱们团队有帮助的?
您对我在团队中的定位是怎么样的?
对于团队成员的成长,您有哪些方案?
第一个问题主要是看一下目前的业务是处于一个什么阶段,也看一下业务负责人是否靠谱,毕竟面试时双向选择嘛。
第二个问题,主要是想让面试官夸夸自己……
第三个问题,主要是看一下面试官对自己的评价,定位又比评价来的更委婉而又深入一点,看看自己未来在团队中大概是什么定位,一位面试官对我说:我希望你在深入业务的同时,承担一些横向的职责。这就说明面试官对于我的协调能力很欣赏,我也可以暂且推断出我在面试官心中分量也蛮重的。
第四个问题,关系到日常工作中如何平衡业务开发和个人成长,看看这个老板是否真正关心下属的成长,也蛮重要的。
最后,最好留下每一位面试官的微信,毕竟面试时间有限,面试结束后,发一段感谢的话,感谢这次面试,肯定面试的内容很有水平,希望以后可以多多交流。一是表现自己的素养,二是可以看出面试官对于自己的态度。实在不去这家公司,也方便以后挖人嘛……
确定核心诉求、筛选目标公司
一份确保可以拿到 offer 的简历
打磨自我介绍
打磨项目介绍
面试录音(征得许可后)、面后复盘
私下与业务负责人互动
offer 谈判
关于这些内容先不展开,下次接着聊~
一些思考
总结完了自己的面试过程,我也想说一下自己的一些其他思考。
每个程序员都是同学中的佼佼者,学习能力都应该是出类拔萃的。工作中需要的知识技能又相对固定,面对每次工作和面试中碰到的问题,还是要踏踏实实的去理解和总结。
广度深度两手抓,一是主动承担业务,主动解决问题。二是技术栈也不要给自己设限,React, Vue, 客户端开发,Node,Canvas … 撸起袖子就是干,当然拓展广度的同时,对于目前紧迫的业务涉及的技术也需要深入了解,买书,买视频,多多投资自己。
多多思考和总结平常的工作和技术。
乐于分享,一是督促学习,二是锻炼自己的表达总结能力,三是这些分享的材料都是自己学习能力的证明,四是找到同类,扩大影响力。
不要排斥猎头,在换工作前,我拜托女朋友挑选了一个口碑很不错的猎头,全程辅导。
更重要的是,有了第三方的介入,可以客观的帮助自己梳理自己的优势劣势,模拟面试,安排面试节奏,稳定情绪,还有谈价格的时候可以避免尴尬。总之,一个靠谱的猎头是个很不错的选择。
至于最后的选择,由于我的三份 offer 都很有竞争力,我自己也非常纠结,这个时候就应该不断的问自己:
下一份工作,你想获得什么?
几个选择,分别工作三年,你认为哪个更值得?
你想在哪个领域深耕?
如果对于业务不是很了解,之前要到的联系方式就很重要,主动约终面的业务负责人再进行一些深入的沟通,真正做到没有疑虑了,再做出选择吧。
反馈和解答
先来看看掘金评论区有哪些反馈 :D
三年多经验本科本身就很难拿到 p7 吧?
6,7 是个坎。我理解的 7-技术专家,在某些领域需要有一定沉淀或者具有很强的综合能力,具有推动事情落地的能力。
在我接触过的朋友中,有三年到7的,也有工作10年到7的。其中三年就能到7的朋友在 React Native 中有很深的造诣,出过很出名的技术书籍。
至于p6,则是可以独当一面,完成核心工作。正常情况下,一个团队的主要开发者应该都属于这个级别,朋友当中也不乏工作刚刚一年就拿到 p6 offer 的。
所以职级这件事,自身的定位要清楚,不要妄自菲薄就好~
前端base这么高吗?后台哭晕在厕所
其他岗位大可不必这样想,薪资永远都是价值交换,能为公司带来什么样的价值才有可能什么样的薪水。
对 React 和 Vue 了解较少,能 p6?
不做过多评价,首先了解少不代表我真的不懂 React Vue, 只是面试是用来发现面试者亮点的过程,实在不明白为什么要去暴露自己明显的短板,一般情况下我都会如实告诉面试官我对于样式、React Vue 了解不多。这样就可以把时间放在我擅长的领域了呀。可以把 ng1 玩的很溜不也是一种学习能力的体现么?
这里援引一位朋友的评价:
看重点,1. 非常愿意参与到产品中去,2. 独自负责过很复杂的前端项目,3. 过往的创业经历锻炼了他的沟通表达与业务理解能力。这是核心竞争力,到这个薪资水平,技术水平占的位置已经不重要了,产品能力,带队能力,表达能力,理解能力,任何一个都比技术重要
和大佬的经历非常相似,应该都是15年毕业的,同工作三年半,211,但是和大佬相比明显差很多。
和别人比较是最没有意义的一件事情。通过努力比以往的自己更优秀就可以了~
质疑薪资
为了避免不必要的尴尬选择保密。
这里举个其他例子,前同事,北航本硕,前端,工作一年,跳槽,50w+。
当然举例子的意思并不是要嫌贫爱富,挣得多就了不起(薪资永远都是比上不足比下有余),例子是说,对于别人的薪资没有必要说三道四,如果身边有非常高薪资的朋友,应该去请教他们的是如何面试,如何准备,以至于如何工作,如何学习。心态要摆正。
而且职级之间的薪资是有很大重叠的,很有可能 p6 比 p7 高,这应该是一个薪酬设计的常识。(而且还有一个可怕的词:薪资倒挂。)
薪资水平不仅仅反应技术人员的专业技术能力,还有非常多的软素质。
交流群中的问题合集
项目经历问题。
基础知识问题。
项目经历问题。
知识融会贯通。
基础知识问题+知识融会贯通。
知识融汇贯通。
以上问题可以大致划分成
如何夯实基础知识
技术如何融会贯通
如何丰富项目经历
首先,基础知识点重要性再怎么强调都不为过,就像高中对于函数基本性质理解不到位,数学的学习会折磨整个高中生涯;物理受力分析掌握不好,基本上就可以和物理说拜拜了。
对于基础知识:多看书,多 coding,多总结,无他。
哪些书? 前端开发工程师必读书籍有哪些值得推荐?
我自己比较推荐 《JavaScript高级程序设计》 《You-Dont-Know-JS》 系列 《JavaScript忍者秘籍》
很多同学说基础不牢怎么办,其实我们心中早已知道答案——恶补基础。
我在工作的前半年内,差不多就把 《JavaScript高级程序设计》看了三遍左右,一开始的确实什么闭包,原型链等非常不理解,但是这些都是基础知识嘛,只能硬着头皮去读。那时候由于工作的原因,刚刚接触 angularjs,大家也知道 angularjs 的学习曲线非常陡峭,service 的几种方式, directive 如何写等都非常难理解。只能在工作之余找书来看,我记得《AngularJS权威教程》《 AngularJS深度剖析与最佳实践》也是看了很多遍。
罗列一些我自己看过的书 我读过的书 (不过有些是非技术书籍)
这里我也推荐一个好朋友-老姚,大家可以看看他写的前端学习经验,他也在前端面试群中,有问题大家也可以向他提问。
《前端网老姚浅谈:怎么学JavaScript?》
《前端网老姚:那些年我看的前端书籍》
通过上面的例子是想说明,夯实基础不是一句简单的话,就像老姚,看过的前端书籍就不下百本,这点我也是自叹不如。
总之,基础是我们进行业务开发的工具,在业务开发过程中都是在解决一个一个的具体问题,这个时候基础知识不过关,对于闭包等概念理解不清楚,在理解业务层次问题的时候再去应付这样细枝末节的技术问题肯定会导致研发周期变长,在不同层次上思考问题,肯定会一团浆糊嘛。
磨刀不误砍柴工,多看书,多 coding!
总结分享的形式有很多,比如写博客,在自己的团队做技术分享等, 这里分享一个我前同事的博客,他工作只有一年半,目前在头条,可以看看他平常写的文章是什么水平。
这个是 老姚的博客
https://www.qdfuns.com/u/17398/works/articles/page/1.html
老姚写的正则表达式教程
https://zhuanlan.zhihu.com/p/27653434
通过上面的例子,大家可以发现,这些基础知识扎实的同学也是在一个概念一个概念的深入研究,慢慢的才能有输出。并且在输出过程中也是一次在学习,同样的也会巩固自己的基础知识。
记得我在公司内部组织过前端技术分享会,会每周分享一些工作中碰到的技术问题和解决思路。
我们在平常的开发过程中,肯定会碰到很多技术问题,在寻找和讨论解决方案的时候就伴随着很多思考,应该把解决问题的过程记录下来,这些都是技术分享非常好的素材。
如果是个通用的问题,那么举一反三,就可以写成一个小的主题来进行分享。这个是我之前在公司做的关于如何使用 gulp 的分享。
这样既保证了和平常业务的贴合,也可以对具体的问题深度了解,还能和同伴分享,增加在团队中的影响力,如果还能写成文章,发表到 github、掘金等,也能提高在业界的知名度~ 何乐而不为呢?
而且很重要的是,一旦决定要做技术分享了,心态上也会发生转变,自己必然会专心的面对,从资料搜集筛选、demo 创建,到模拟分享 真实分享,大家提问自己再进行讲解,团队讨论,最后成文发表,和读者讨论再修改等。
一套流程下来,长期以往,各个方面的能力都会得到显著的提升:包括资料搜集、筛选的能力,组织成文的能力、演讲能力、讲解能力、社区知名度等等等等,总之,大有裨益!
对于知识技能的融会贯通和项目经历的积累,很多同学会讲,很多前端『高级』知识其实也用不到,自己很多概念仅仅是了解,总是不知道如何使用,自己没有复杂的项目可以展示。
事实上真的如此么?
举个简单的例子,我们学习 Vue 和 React 框架的时候,经常用 to-do-list 这个项目来练手。
我们想想这个项目除了来了解框架基本知识之外,还有什么可以考虑?
项目目录结构为何是现在这个样子,每个部分的含义是什么样的?
业务代码是如何组织的?当业务复杂的时候,这样组织还可以么?
工程化是如何做的?
构建流程是怎么样的?对于构建工具了解么?
上线流程是怎么样的?
本地开发和部署有什么区别?
git 使用规范是怎么样的?怎么做好分支管理?
怎么做好团队协作?
前后端如何分工的?如何联调的?跨域如何做?
产品功能是如何产生的?你在其中的角色是怎么样的?
你们的研发流程是怎么样的?
如果增加一个搜索框,如何解决快速输入导致频繁发起 ajax 请求的问题?
这个项目有哪些技术上的难点?
动画的实现方案有哪些?有哪些动画优化的方案?
性能优化有哪些?
用户键入不安全的内容怎么办?常见的安全问题有哪些?
经典面试题『某上海客户说,他的 h5 页面打不开,你如何解决这个问题?』
当然这篇文章肯定是不会解决这些问题的,我想说的是,麻雀虽小五脏俱全,每一个产品在开发的时候都有诸多的问题,有业务上的,有产品上的,有团队上的,有技术上的,每一个问题都有我们研发人员可以参与改进的地方。面对这些具体的问题,如果怕自己积极参与,知识技能还不能融会贯通么,项目的经历还能不丰富么?
我之前的一位同事,曾经在离职找工作的时候找我辅导,几轮面试下来向我感慨:『如果当时那些工作我自己也能主动参与就好了,这样回过头来看自己真的没有做过特别复杂的功能。不像你,都是在抢活干,当初很不理解,现在终于知道项目经历和自己的能力都是这样一点一点积累出来的。』
对于我们这些1-3年工作经历的前端,如何才能在同龄人中脱颖而出呢?只有踏实的基本功,加上丰富的实战经验。换位思考一下,如果你是面试官,面前的同学不光是对于基础知识掌握的好,业务不糊弄,主动挑战复杂业务,还能给团队的成员进行技术讲解,大家碰到问题都会想到你,这样的同事,有谁会不喜欢呢?
这些可以划分成
自我管理
面试求职
软技能等
内容较多,我们下次再聊!