本文来自作者
幻海之巅
在
GitChat
上分享「如何拿到互联网巨头的前端 offer」,
「
阅读原文
」查看交流实录
「
文末高能
」
编辑 | 子东
说在前面的话
首先我必须要说 chat 的题目取得有点大。但是正如开头所言,这个 chat 是给准备或者即将成为前端工程师的同学们的。
其实,我目前也正处于这个阶段,所以我希望能与大家共勉。在本场 chat 中,我可能更多的分享的是关于自己在求职过程中的一些经历和想法。
希望能给大家带来一点帮助。下面进入正题:
1. 一个合格的前端开发需要那些知识储备?
1.1 前端专业技能储备
其实专业技能的储备是比较抽象的,因为大多数专业都不会有前端相关的课程。
因此,前端开发工程师一般都是自学成才,那么是否就意味着前端工程师就不需要关注自己的硬技能呢?其实不是。
前端开发工程师牵涉的知识范围是非常广的,特别是随着 nodejs 的出现,使得 javascript 开发者面临着前所未有的知识荒原等待着我们去开阔。
下面我列举一些在前端工程师面试中遇到的专业技能问题。而这些问题是作为前端开发工程师必须去深入学习的问题,就像英语学习中的单词记忆一样重要。下面列举我认为比较重要的知识点:
-
javascript 相关
-
原型链与作用域
-
闭包
-
模块化(amd/cmd/umd/ES6 module)
-
跨域多种方式,如 jsonp
-
javascript 中的 this 指向问题
-
CORS
-
AJAX 的几种状态,ajax与fetch,hijax
-
iframe 与 onload 阻塞主页面
-
前端安全与 CSRF,XSS,SQL注入,DDOS
-
js 异步加载
-
IE 内存泄露
-
js 创建对象的几种方式
-
js 继承的几种方式与优缺点
-
SEO
-
ES6 新特性
-
promise 与 generator
-
服务器推
-
jQuery 相关
-
js 捕获与冒泡
-
drag 和 drop 实现拖拽
-
cookie/session/本地存储
-
雅虎网站优化的军规
-
css 与 js 的阻塞加载
-
chrome / IE 浏览器事件兼容
-
css 相关
-
垂直水平居中
-
盒模型
-
浮动与定位
-
排版引擎与js引擎
-
GPU 加速与动画性能
-
DOM1,DOM2,DOM3 规范
-
css 性能
-
h 标签与 title 标签
-
em 与百分比等
-
浏览器缓存与应用缓存
-
div 与 table 布局
-
web 标准
-
css 的 hack 技术
-
png/jpg/webp 图片格式
-
canvas 与 svg
-
css3 的新特性,如 flex 布局等
-
响应式布局
-
link 与 import 区别
-
三栏自适应
-
b 和 strong,i 和 em 区别
-
减少页面回流
-
BFC
-
硬件加速与动画优化
-
前端自动化相关
-
webpack 相关
-
webpack-dev-server 相关
-
单页面打包工具+多页面打包工具
-
babel 相关
-
其他知识
-
http/1.1 与 http2
-
http 三次握手协议
-
http 状态码
-
json 与 xml
-
前端性能优化
-
nodejs/npm 相关内容
-
算法
-
几种排序算法
-
回文字符
-
递归(很重要)
-
其他常见的前端算法
上面牵涉到的任何一部分内容都应该要能够融汇贯通。很多人都强烈反对刷题,其实我认为刷题本身没有什么坏处,只要你能真正的将这部分知识弄懂,那么也是一个好的学习方式。
比如上面我说的一个点,如硬件加速。那么很多人就会想到:
能够开启GPU加速,那么你对于GPU加速又了解多少?webkit的网页分层了解吗?你知道将动画放到一个独立的图层中能够减少页面的回流吗?你知道软件加速和硬件加速区别吗?
我以前也尝试了解了这部分的内容,后面发现当你越深入了解,你感觉自己会的东西越少,但是当你真正从头到尾去仔细学习了的时候,你会发现你真的是在成长。
这样,当面试官问到这部分内容的时候,你也能够信手拈来。如果你想要深入了解硬件加速和软件加速,你可以仔细学习一下这部分内容,当然也包括动画性能优化。
我想,当你能将硬件加速在面试中表达这么多的时候,任何一个面试官都会对你产生兴趣。
又比如这几年比较火的打包技术 webpack,你可能知道它能够解决模块化开发的问题,它相对于 gulp/grunt 等有诸多优点。
但是你依然需要深入的了解它,比如: webpack 的 loader 与 plugin 的区别,webpack 的 tree-shaking 技术,webpack 集成 webpack-dev-server ,webpack 的 HMR 等等。
通过上面两个例子,我是想要告诉你:任何一个前端技术,你都要学会问为什么?只有你学会问为什么才说明你在思考。
这是刷题与学习的最重要的区别,所以我觉得,如果是抱着学习的态度去刷题本身就无可厚非,因为它能让你快速积累相关的知识,有问题的地方才能孕育知识。
1.2 沟通交流能力
这一部分内容往往来自于hr,他们是一群很敏感的群体。他们一般都不会问你技术问题,你需要告诉他,你很喜欢这个公司,你很看重这个机会,如果你过来了你会怎么怎么样。
我记得阿里HR当时还问了我这样一个问题:“你为什么选择做前端?你觉得前端和后端主要区别是什么?”
当然,这都是很开放性的问题,任何人都会有不同的回答,你只需要正确的表达你的观点,但是切记不要极端。
因为,谁也不想和一个思想很极端的人一起工作!我下面讲述一下我面试的几家公司HR阶段都问了什么问题:
-
阿里巴巴
拿到阿里的 offer 道路是比较坎坷的。实习阶段经过了三轮面试,虽然都是电话面试,但是感觉还是挺难的。
经过我上面说的那种刷题方式,技术上的问题基本都能够回答上来,当然这也可能是因为公司本身对于应届生的要求比较简单而已,或者说我具备了一定的面试技巧。
当然,后面又经过了实习生转正的3轮面试,包括技术面试和HR面试,不过这个阶段一般都是由于部门HC的限制,所以很多实习生都没有能够留下来,所以我算幸运的一批。
当时HR问过我几个问题,比如:你为什么选择前端?你觉得你最大的缺点是什么?对于未来你有什么规划?这些问题其实在网上都能看到,但是很多人可能回答的并不怎么好,最后结局往往很悲剧。
所以在面试前,你一定要想好这几个问题,如果是电话面试最好能够写下来。而如果是现场面试,那一定也要能很快的说出来,并且有条理,同时也不要给别人一种感觉你是在背题目。
这点很重要,因为别人在考察你的沟通能力,而不是你的记忆能力。
-
美团
美团的面试算法居多,当时技术上主要写了几个递归算法,这里就不再多说。
可能是因为在前面三轮面试中我表述了自己在实习阶段的一些不如意,所以 HR 阶段主要 focus 在这个方面。
比如:如果你的上一家公司和我们同时给了你offer,那么你会选择谁,为什么?你实习是在杭州,我们的 base 地点主要在北京和上海,你有没有考虑?这一类的问题,我的回答都是没关系,会考虑这一类的。
当然,这一点有点违心,但是至少能够让HR看到你对他们公司感兴趣,你是带着真诚来的,而不是来玩玩。
况且招聘的过程就是双向的,所以你很难保证别人是否会给你机会,那么你当然应该去争取,而不用主动断了自己的路。
当然,到了HR阶段,如果你没有说什么不能说的,或者特别让别人认为你不适应这个岗位的,那么一般都是没有问题的。
最后,美团也如我预期的给了我 offer,而且是第一个 offer,虽然最后没去。
-
网易游戏
网易的校招面试难点在于笔试,这一点我已经领教过了,我加上在实习阶段的经历,在网易笔试上挂了3次。
最后一次我是跑去北京霸笔的,因为我实习回来的时候已经错过了网易的校招,所有就只赶上了网易游戏的单独招聘。
最后,做了笔试题,比较崩溃,感觉自己应该是没有机会了。最后游戏部分的 HR 姐姐告诉我,系统又开放了,我可以到校招系统中再次录入我的信息,这一点真的感谢网易游戏的 HR 姐姐。
网易游戏前端候选人团队当时给我惊呆了,几乎都是985类的研究生,而且一般都是拿着 BAT 等级别的前端 offer 来的。
不过,留下来的也少得可怜。到了HR阶段,也没有问我什么过多的问题,就和我聊了聊在杭州实习的经历。
当然,还有就是谈工资了,那么是第一次谈工资,最后结果比较被动。
其实,我觉得在HR阶段说明你在技术上已经得到认可了,至少能达到你面试的公司的基准线了。
但是在面试之前,你最好要想清楚几个问题:你为什么要来这个公司?你觉得你能给公司带来什么?你觉得你还有那些地方不足,需要改进?
等等诸如此类,而不要不做任何准备,那么HR姐姐肯定会给你一惊的。
2. 面试前你应该做怎样的准备?
2.1 学习式的刷题
说实话,在面试前我一直都在”刷题”。因为面试就短短的几十分钟,除了保持知识的广度,你也需要保证知识的熟悉程度,所以那段时间我一直都在反复的复习我上面提到的这些知识点。
几乎你只要问其中的任何一个问题,我都能立马回答出来。
当然,每天如果仅仅做这些,你会感到很烦,所以那段时间我也会学习一些新的东西,写一些小项目托管到 github 上,频繁更新自己的博客,甚至有时候一天更新了好几篇(看jQuery源码的时候)。
所以你可以去我的博客看看那段时候我都写了些什么。这里我需要强调下,博客和 github 是面试官比较看重的点。
记得当时收到新浪的一个面试邀约就是因为我的博客,当时面试官说,看你博客中有写 node 内容的,是否有兴趣参加新浪的面试。
当然,最后因为工作地点的原因放弃了。
但是我想说的是,保持记录知识和问题的习惯是自我提升一个重要的方面。当时,我们一起找前端职位的小伙伴,几乎每人都有一个自己的博客。
我们回到刷题的问题上来。请记住,刷题的初衷应该是为了扩宽自己知识的深度,深度的学习才能让你成长,而不是总是走马观花。当时和我一起面试阿里的还有好几个同学,但是最终都没能通过。
其实,我觉得他们的问题主要是太关注自己知识的广度,而忽略了知识的深度。
比如,同一个问题,我可能会说出 A+B+C+D,但是他们却只能说出A+B,而且A+B往往都是网上现成的答案。
能参加这场 chat,我需要告诉你,如果你想要进BAT等大型互联网公司,千万别只关注知识的广度而忽略了深度。
特别是对于前端的开发职位来说,css+js+nodejs+打包工具等等内容,常常会让你眼花缭乱,但是一定别忘了深度问题。
2.2 简历猜题
我参加阿里面试之前没有任何实习经历,唯一有的就是自己做过一个小项目,包括前端和后端都是我写的。
其实,它本身都算不上一个项目,就是为了面试搞的(其实并不全是),当时好几个同学也开发了一个类似的网站,目的就是为了能让面试官在简历里面找问题。
简历里面找问题很容易,但是在简历里面自己找问题也很容易,你可以参考上面第一部分提到的基础知识,然后揣测面试官会问那些问题。
最后你会发现,面试官问的问题要么就是上面你准备的基础知识,要么就是你已经在简历中揣测出来的问题。大多数情况下都是如此。
2.3 反客为主
我经历的每一场面试最后都会有这个问题:你还有什么问题吗?其实每次面试之前我都会想好我需要问什么,有些问题来自于本身的思考,有些问题来自于上一次面试和其他公司的比较等等诸如此类。
还有就是,在每一轮面试的时候,如果面试官在表述的时候我都会记录下来他的主要内容,然后想好那些地方我需要进一步深入了解的。所以在这个阶段我往往会有很多话说,或者说有很多问题要问。
比如我上次到了网易游戏的第三轮技术面试的时候问了面试官一个问题:上次网易邮箱出了一次用户信息泄露的问题,这个问题会和前端有关系吗?
网易前端在安全方面是否做了处理,比如 CSRF,XSS,SQL 注入等等。
所以,在这个阶段,我觉得有问题问说明在整个面试的过程中你在思考。我是鼓励在这个阶段提出你自己的问题的。