如何面试前端面试题 知乎工程师

如何面试一个前端开发者? - 文章 - 伯乐在线
& 如何面试一个前端开发者?
我在Twitter和Stripe这两家公司工作期间会负责一些前端开发者的面试。在面试过程中我们有很大的决定权,这里和大家一起分享一些我设计的不同类型的面试问题。
首先,我要警告各位的就是: 招人很难!尤其是要在45分钟之内判断一个人是否适合岗位更是一项高难度的工作。 面试存在的问题就是大家都想招到像一个像自己一样的人。 每个通过我面试的人的思维方式可能都和我比较相似, 但这样肯定是不对的。 正因如此, 其实目前为止我做的每一个决定都有一部分运气成分。 但是我想这种方式会是个很好的开始。
理想情况下,应聘者应该有一份比较完整的‘简历’, 这样我们可以一起来回顾他们参与的开源项目。 通常我会先浏览他们的代码,然后针对某一个具体的代码设计问他们一些问题。 如果应聘者在这一部分表现非常优秀,就可以直接进入团队社交能力的考察部分。否则的话我会让他们做一些编程题目。
我面试的时候是非常注重实践的, 整个面试过程几乎全都是在写代码。 我不会问一些比较抽象的或者算法相关的问题。其他的面试官如果愿意的话可以考察这些方面, 但我觉得这些知识未必是一个前端开发者所必需的。我问的问题看起来比较简单,但实际上每一类问题都可以让我洞悉应聘者在JavaScript的某一方面的知识。
应聘者可以使用自己的笔记本电脑也可以用我的,但在我这里是不会用白板的。他们也可以使用任何适合自己的编辑器,但我通常直接用Chrome的控制台来检查的应聘者的程序输出结果。
第一部分:对象原型
我们先从简单的来。实现一个spacify函数:接受一个字符串作为参数,然后把这个字符串的每个字符都用空格隔开后返回。例如:
JavaScript
spacify('hello world') // =& 'h e l l o w o r l d'
spacify('hello world') // =& 'h e l l o w o r l d'
虽然这个问题看起来非常容易,但结果却证明从这个问题问起是很合适的,尤其是对于一些电话面试者,他们声称了解JavaScript,却连一个完整的函数都不会写。下面是这个题目的正确答案,有的应聘者通过循环来实现也是可以的。
JavaScript
function spacify(str) {
return str.split('').join(' ');
function spacify(str) {&&return str.split('').join(' ');}
接下来这个问题是让应聘者直接为String对象增加spacify的函数,像这样:
JavaScript
'hello world'.spacify();
'hello world'.spacify();
通过这个问题我可以了解到应聘者对于函数原型基础知识的掌握情况。另外这个问题经常会引发另外一个有趣的讨论:直接在prototypes上尤其是在Object的prototypes上定义属性的风险。
最终的答案类似下面的代码:
JavaScript
String.prototype.spacify = function(){
return this.split('').join(' ');
String.prototype.spacify = function(){&&return this.split('').join(' ');};
这时候我还会让应聘者解释函数表达式(expression)和函数声明(declaration)的区别。
第二部分:参数
接下来我会问一些简单的问题,这些问题可以帮我了解到应聘者对参数对象的理解程度。
首先,调用一个尚未定义的log函数:
JavaScript
log('hello world')
log('hello world')
然后我让应聘者去实现log函数:接受一个string参数然后直接传给console.log(),正确答案就在下面,但有些比较优秀的应聘者会直接使用apply函数来实现。
JavaScript
function log(msg){
console.log(msg);
function log(msg){&&console.log(msg);}
完成上一步后我会修改调用log的方式:传递多个参数。告诉应聘者我希望log函数不止接收一个数字作为参数,它应该可以接受任意个数字作为参数。同时我也提醒他们cosole.log()本身就可以接收多个参数。
JavaScript
log('hello', 'world');
log('hello', 'world');
理想情况下应聘者应当直接使用apply来实现这个功能。但有时他们会混淆apply和call的二者的区别,这时你可以给他们一些提示。另外将console作为上下文参数这一点也很重要。
JavaScript
function log(){
console.log.apply(console, arguments);
function log(){&&console.log.apply(console, arguments);};
然后我会让要求在每一条日志消息前加上“(app)”的前缀,例如:
JavaScript
'(app) hello world'
'(app) hello world'
现在,问题就有点棘手了。能力强些的应聘者应当知道arguments是一个伪数组,在使用它之前得先把它转换成标准数组。通常我们用Array.prototype.slice就可以实现这一点,像下面这样:
JavaScript
function log(){
var args = Array.prototype.slice.call(arguments);
args.unshift('(app)');
console.log.apply(console, args);
function log(){&&var args = Array.prototype.slice.call(arguments);&&args.unshift('(app)');&&console.log.apply(console, args);};
第三部分:上下文
下面的这一组面试题可以考察应聘者对于JavaScript中context和this的理解。我先给出下面的定义,注意,count的属性是从当前的上下文中读取的。
JavaScript
var User = {
getCount: function() {
return this.
var User = {&&count: 1,&&getCount: function() {&&&&return this.count;&&}};
然后我会让应聘者写出下面代码的输出结果:
JavaScript
console.log(User.getCount());
var func = User.getC
console.log(func());
console.log(User.getCount());var func = User.getCount;console.log(func());
这个题目正确的答案是1和undefined。令人吃惊的是有很多人会在这种关于上下文的基础知识上犯错。func函数被调用时,它的上下文是windows,而windows是没有count属性的。我把这些都和应聘者做了解释,然后我问他如何才能保证func函数始终都能以User作为上下文被调用,这样它就能正确运行从而返回1。
正确的答案是使用Function.prototype.bind,例如:
JavaScript
var func = User.getCount.bind(User);
console.log(func());
var func = User.getCount.bind(User);console.log(func());
通常我会告诉应聘者有一些老的浏览器是不支持bind函数的,然后让他们自己来写一个函数来模拟。有一些基础差的应聘者并不认可这一点,但对我来讲每一个被雇佣的应聘者对apply和call都应该有比较深入的理解,这一点很重要!
JavaScript
Function.prototype.bind = Function.prototype.bind || function(context){
var self =
return function(){
return self.apply(context, arguments);
Function.prototype.bind = Function.prototype.bind || function(context){&&var self = this;&&return function(){&&&&return self.apply(context, arguments);&&};}
如果应聘者像上面那样实现了bind并且还判断了当前浏览器是否已经支持bind函数,那么应聘者可以得到额外的加分。
此时,如果应聘表现的很出色,我会让他们去实现currying参数。
第四部分:Overlay库
面试的最后这一部分里,我会让应聘者做一些更加实际的事情,通常是去实现一个‘overlay’的库。这很方式很管用,它涉及到了整个前端开发所用到的技术:HTML、CSS 和JavaScript。如果应聘者在前面几个环节表现优秀,我会尽早的开始这一部分的问题。
具体的实现因人而异,但是这里几个关键点需要注意!
对于overlay covers,最好使用 position: fixed 而不是 position: absolute,这样即使窗口滚动的时候也可以保证层铺满整个窗口。如果应聘者没有注意到这一点我会提示他们,然后问他们这两者的区别。
.overlay {
bottom: 0;
background: rgba(0,0,0,.8);
.overlay {&&position: fixed;&&left: 0;&&right: 0;&&bottom: 0;&&top: 0;&&background: rgba(0,0,0,.8);}
从把内容放置到层的中心位置的方式也可以为面试官提供一些信息。有些应聘者可能会使用CSS和绝对位置,但这样的前提是内容必须是固定宽度和长度的。另外的应聘者也可能会选择用JavaScript来定位。
.overlay article {
left: 50%;
margin: -200px 0 0 -200
width: 400
height: 400
.overlay article {&&position: absolute;&&left: 50%;&&top: 50%;&&margin: -200px 0 0 -200px;&&width: 400px;&&height: 400px;}
我还会要求他们实现单击关闭层的功能,然后就可以顺势讨论下几种不同类型的事件传播机制。大多数应聘者会直接为层设置一个事件监听器。
JavaScript
$('.overlay').click(closeOverlay);
$('.overlay').click(closeOverlay);
看着是对的,但很快你就会发现在这个层的子元素上单击也会关闭层,这明显不是我们预期的效果。解决方法是先检查事件的targets来确保不是一个传播事件,像这样:
JavaScript
$('.overlay').click(function(e){
if (e.target == e.currentTarget)
closeOverlay();
$('.overlay').click(function(e){&&if (e.target == e.currentTarget)&&&&closeOverlay();});
其实这些问题只覆盖了前端知识的很小一部分,面试的时候你可以问很多其他方面的问题,例如性能、HTML5 APIs, AMD vs CommonJS modules、 构造函数、数据类型以及盒模型等。我经常会根据应聘者的兴趣来搭配不同类型的问题。
此外我推荐大家到和去寻找一些灵感!
关于作者:
可能感兴趣的话题
这是JS开发者,不是前端开发者。考官默认来面试的JSer都熟练掌握了html和css么
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;
欢迎您订阅我们的技术周刊
我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,
欢迎分享您的观点,经验,技巧,心得
让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;
本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(
订阅邮件周刊
5个经典的前端面试问题
注意 转载须保留原文链接,译文链接,作者译者等信息。&&
注* 相关阅读 JavaScript开发人员在IT界的需求量一直很大。如果你非常精通神这门语言,你会有很多机会换工作,涨薪水。但是在一家公司录用你之前,你必须顺利通过面试,证明你的技能。在本文中,我将向您展示5个关于前端相关的问题,以测试侯选者的JavaScript技能和他们解决问题的能力。有将会非常有趣! 问题1:Scope作用范围 考虑下面的代码: (function() {&& var a = b = 5;})();console.log(b);什么会被打印在控制台上? 回答 上面的代码会打印 5。这个问题的诀窍是,这里有两个变量声明,但 a 使用关键字var声明的。代表它是一个函数的局部变量。与此相反,b 变成了全局变量。这个问题的另一个诀窍是,它没有使用严格模式 ('use strict';) 。如果启用了严格模式,代码就会引发ReferenceError的错误:B没有定义(b is not defined)。请记住,严格模式,则需要明确指定,才能实现全局变量声明。比如,你应该写:(function() {&& 'use strict';&& var a = window.b = 5;})();console.log(b);问题2:创建“原生”(native)方法 给字符串对象定义一个repeatify功能。当传入一个整数n时,它会返回重复n次字符串的结果。例如: console.log('hello'.repeatify(3));应打印 hellohellohello。 回答 一个可能的实现如下所示: String.prototype.repeatify = String.prototype.repeatify || function(times) {&& var str = '';&& for (var i = 0; i & i++) {&&&&& str +=&& }&&};现在的问题测试开发者有关JavaScript继承和prototype的知识点。这也验证了开发者是否知道该如何扩展内置对象(尽管这不应该做的)。 这里的另一个要点是,你要知道如何不覆盖可能已经定义的功能。通过测试一下该功能定义之前并不存在: String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};当你被要求做好JavaScript函数兼容时这种技术特别有用。 问题3:声明提升(Hoisting) 执行这段代码,输出什么结果。 function test() {&& console.log(a);&& console.log(foo());&& var a = 1;&& function foo() {&&&&& return 2;&& }}test();回答 这段代码的结果是 undefined 和 2。 原因是,变量和函数的声明都被提前了(移到了函数的顶部),但变量不分配任何值。因此,在打印变量的时候,它在函数中存在(它被声明了),但它仍然是 undefined 。表示换句话说,上面的代码等同于以下内容: function test() {
function foo() {
console.log(a);
console.log(foo());
a = 1;} test();问题4:this在JavaScript中如何工作的下面的代码会输出什么结果?给出你的答案。 var fullname = 'John Doe';var obj = {
fullname: 'Colin Ihrig',
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.
}};console.log(obj.prop.getFullname()); var test = obj.prop.getF console.log(test());回答 答案是Aurelio De Rosa和John Doe。原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。 在第一个 console.log()调用中,getFullname() 被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。 问题5:call() 和 apply()现在让你解决前一个问题,使最后的console.log() 打印 Aurelio De Rosa。 回答 该问题可以通过强制使用 call() 或者 apply() 改变函数上下文。在下面我将使用call(),但在这种情况下,apply()会输出相同的结果: console.log(test.call(obj.prop));结论 在这篇文章中,我们已经讨论了用来测试JavaScript开发者的五个经典问题。面试的概念和涵盖的主题通常是非常相似的。如果你不知道的一些问题的答案,不必担心:学习和经验可以慢慢积累。 如果你有其他一些有趣的问题,不要犹豫,与我们分享。它会帮助很多开发者。
原文地址:
&热门文章 - 分享最多
&相关阅读 - JS学习
&关键字 - 前端
&欢迎订阅 - 技术周刊
我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;
我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊总结前端面试过程中最容易出现的问题
38416次浏览
之前在兴安得力的时候,我也出过前端的面试题。那么前端人员在外面面试的时候,一般技术人员都会考察我们那些地方呢?我在这里不妨总结一下!(PS:有点小邪恶,这个公开之后,对于面试者来说是方便了。但是,假如你是公司技术人员,是面试官,您不妨修改一下题目,变通一下!)
javascript常见题目
一、您对js的原型是如何理解的?您对js的继承是如何理解的?能否举例说明js的继承?
关于这个题目,我之前的一篇文章
,您可以看一下。理解一下原型prototype,关于继承,那主要是js原型链的继承。关于继承的理解及举例(我这里就不详细介绍了,简单介绍之后,你即使背过了,也不一定理解,对于公司也是不公平的)。我还是推荐面试者看一本书《[JavaScript高级程序设计(第3版)]》,这本书对js讲的很详细。关于这个题目,您可以阅读其第六章就可以了!认真阅读之后,相信你能理解,也能够简单的说出来!
关于js的继承,确实是重点和难点,我写过两篇博客,大家可以看下:
二、js闭包?举例并说明其主要的作用!
关于闭包,其实是指有权访问另一个函数作用域中变量的函数。具体我之前也写过一篇文章,可以看一看!
javascript闭包入门理解(二):
三、js数组主要有哪些方法?主要参数你了解吗?
具体你可以查一下,常用的一般有如下:
1 、shift():删除数组的第一个元素,返回删除的值。这里是0
2 、unshift(3,4):把参数加载数组的前面,返回数组的长度。现在list:中是3,4,0,1,2
3、pop():删除数组的最后一个元素,返回删除的值。这里是2.
4、push(3):将参数加载到数组的最后,返回数组的长度,现在List中时:0,1,2,3
5、concat(3,4):把两个数组拼接起来。
6、splice(start,deleteCount,val1,val2,...):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,...
7、reverse:将数组反序
var a = [1,2,3,4,5];
var b = a.reverse(); //a:[5,4,3,2,1] b:[5,4,3,2,1]
8、sort(orderfunction):按指定的参数对数组进行排序
var a = [1,2,3,4,5];
a.sort(); //a:[1,2,3,4,5] b:[1,2,3,4,5]
9、slice(start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组
var a = [1,2,3,4,5];
var b = a.slice(2,5); //a:[1,2,3,4,5] b:[3,4,5]
四、js迭代的方法
every() 、fliter()、forEach()、map()、some()具体大家可以查一下!
五、js数组去重和排序
具体我就不详细描述了。
六、js正则表达式
关于正则: ,这篇文章应对面试足够了!
让你写个简单的正则,去掉字符串左右空格。具体看看我之前的文章
关于正则,你可以去了解一下!
七、纯js的ajax请求原理
可以查询,了解一下!看下这几篇文章
和 最后关于js实现ajax的,最新出了js的fetch方法,很不错的!
八、js模块化
可以看下我之前的文章:
九、双等号隐性转换
具体看文章:
十、js操作符,字符串截取等
具体请看:
字符串截取,substr 、substring等的区别
十一、js中继承中call和apply()的区别
用法差不多,传递参数不同。具体你可以网上查查,也可以看下我的文章
jquery常见题目
一、jquery源码研究过没有?
二、jquery插件写过没有,一般如何写?
可以看我之前的一篇文章:
三、jquery的bind(),live(),delegate(),on() 区别
网上可以搜索一下,看一下!
前端常见题目
一、如何处理跨域?
jsonp等,可以看下我写的
二、如何处理缓存?如何清除缓存。
ajax随机数、ajax参数、meta中设置等。可以看下我写的
三、http请求问题,HTTP请求信息由那3部分组成?
1、请求方法URI协议/版本 (例如:GET/haorooms.jspHTTP/1.1)
2、请求头(Request Header)(例如:Accept:image/gif.image/jpeg.*/* Accept-Language:zh-cn Connection:Keep-Alive Host:localhost等等)
3、请求正文
关于图片的请求,可以看我之前的一篇文章
四、前端性能优化问题,你是如何处理前端性能问题的?
看我之前的一篇文章:
五、网站js和css如何压缩?有哪些方法?
ant+yuicompressor具体可以看看我之前的一篇文章:
SASS等 可以对css进行自动压缩!
也可以用构建工具进行。可以看下
六、用到哪些css插件?
bootstrap, 等
七、让你自己搭建一个网站,你是如何做架构的?
考察前端架构能力。
八、一些状态码你了解吗?
200成功类、300重定向类、400客户端类、500服务器端类。具体可以网上查一下!
九、如何用浏览器进行代码调试?
谷歌浏览器、火狐、IE等。(不明白的同学具体网上可以查一下)
十、json字符串转为json的方法
具体请看:
html+css+html5+css3 常见题目
一、假如一个页面,左侧固定,右侧自适应,你是如何做到的?
方法很多,一般是margin和浮动,具体可以网上查一下。很简单。
二、html5新的标签和特性有哪些?
html5标签有很多,你可以网上查一下。
三、你常用的css3有哪些?说出你记得的。
哈哈哈,这个很多,你要再复习一下css3包括其动画等等。
四、如何处理浏览器兼容性问题?
五、如何用css美化radio、checkbox等按钮样式?
具体可以看我的一篇文章:
web touch常见题目
一、做手机网站长见的兼容问题有哪些?
看下相关文章。
二、网站如何自适应的?响应式网站一般如何制作?
可以随便聊聊。可以看下
三、zepto.js使用过程中有哪些问题?jquerymobile用过吗?会有哪些问题?
用过的话,可以随便聊一下!
例如,你们聊到数据库,数一下如何用mongo做分页等等,包括mysql数据库等等。
聊到inux系统,linux常用的命令。
聊到angularjs,vue.js、angularjs的指令,双向数据绑定。MVVM模式和mvc模式的区别及mvp模式。
聊到前端架构,及百度fits的jello等。
聊到常用的版本控制工具git或者SVN,讲讲git常用的命令,git回滚到某个版本怎么做( $ git reset --hard 某个版本号)
人事面试和技术面试是有区别的,人事一般问一些概况总结方面的问题,我下面举一些列子吧!
一、你做了这么多项目,让你感受最深,印象最深的是哪个项目?你从中学到了什么?为什么会感受最深?
二、做前端开发这么多年来?说下你的感受吧!
三、简单自我介绍一下自己。
四、你对公司有什么需要了解的?
五、谈到薪资,谈到离职原因,谈到未来几年的规划等等,我在这里就不具体说了。
上面是我面试过程中最常见的一些问题。注意:面试的时候千万要真诚,不要撒谎,是什么就是什么,我列举上面题目的原因是有些前端人员可能技术很好,但是面试的时候紧张,没有准备。这样你简单准备了之后,就能发挥自己正常水平!广大朋友们,加油吧!
相关文章:
关键词搜索【面试经验】Google前端工程师6轮面试经验分享 - 乔布简历
打开微信,扫描二维码
点击微信右上角,分享到朋友圈
尝试在自己的博客上搜索点东西,结果发现 4 年多以前还在博客上写过一系列的recruiting events,把大四时候参加过的各种笔试面试都记录下来了。我从去年准备离开百度开始,到现在总过面试过4家公司:Google、Microsoft、Yahoo、Facebook,原本去年也想把面试经验写一写的,结果一拖就拖到现在。我不想写面试经验,因为我个人不喜欢漏题和背题的做法。我自己作为面试官,知道要设计出来一道好用的题目有多难,所以我希望面试者都是如实表现自己解题能力的。我更喜欢写面试体验,就是在整个面试过程中一家公司给人的印象是怎样的,HR 和面试官是否专业,能否让人信服这是一家值得长期工作的公司。
我想写的第一家公司是 Google,因为它是我在想要离开百度时第一家联系到我的公司。2010 年 12 月底的某一天早上,我突然感觉到我应该离开百度,因为如果这个时候已经没有勇气离开这家公司了,很可能就不会再想要离开了。当天中午在百度大厦西餐厅吃午饭,接到一个 Google 上海 HR 的电话,问我有没有兴趣去面试,我想既然你打电话来的时机那么好,我就答应你去面试吧。(在那一天之前,我对猎头的标准回复是「有美国或者香港的职位吗?」)她问我将来希望在北京还是上海工作,当时我对北京的厌恶程度还没有现在那么高,同时觉得搬家到上海又比较麻烦,于是就说在北京,接着我就变成跟北京 HR 沟通了。
Google 的 HR 会负责做两件简单得不需要面试官做的事情,这能够很好的提高招聘流程的效率。第一件是确认你能够适应工作环境中的英语,为此 HR 要我用英语跟她对话两三分钟,主要就是让我说说工作经验和其中的亮点。习惯在私企工作的人不要以为外企对英语的要求很高,其实大多数长期在中国工作的人说话或者发邮件都会很 Chinglish 啦,所以关键是要敢于用英语进行沟通。
然后 HR 发了一个 Codility 的地址给我,让我有空抽时间去做题。一个小时 3 道难度相当于 OI 基础题的题目,平均 20 分钟一道。最简单的题目一看就知道是 O(n) 能解决的,最复杂的题目看上去是O(n^2) 但想一下就能优化为 O(n log n)。对于有算法训练背景的人来说,这样的题目会让人感觉到很有把握。
对于没有经受过算法训练的人来说,掉进陷阱里是很容易的。很可能没有把 O(n^2) 优化为 O(n log n),结果超时;可能没仔细看题目说明的数值取值范围,某些变量选错了数值类型,结果溢出。考虑到Google重视算法的程度,再加上Google中国面试的额外难度,算法训练还是很必要的。
在我通过 Codility 测试后,HR 问我了对题目难度的反馈,然后约了一轮电话面试,并且告知面试主要围绕算法、数据结构、系统设计、编码来进行。Google 面试的格式都很固定,45 分钟内期望你能做出 3 道题来。这 3 道题最起码要能把人人都能想出来的「笨办法」用代码写出来,否则会让面试官感到不满意。如果有些题目能够比较快地做出来,面试官就会让你优化。就算你第一次给出的答案已经是业界已知最优解,面试官都还是会让你优化,因为谁也不知道有没有人能在面试过程中突然爆发,想出一些过去没人想到过的解法。如果面试官心中已有优化的方案,在你想不出优化方案时他可能会给你提供一些提示。
一轮电话面试后,HR 就开始约到 Google 办公室的面试了。第一次约了下午 3 轮面试,还是那个很固定的格式:每轮面试 45 分钟,两轮间隔 15 分钟。整个面试流程让人感觉到很人性化:在 Google 签到后,HR 会先带你去 kitchen 拿点吃的喝的,然后把你带到面试所用的会议室。多轮面试的话,HR 中间还会来问一下你要不要去洗手间,或者多拿两瓶水。面试完毕后 HR 会来问你感觉如何,同时也会让你知道面试官的初步反馈是否跟你的感觉一致。我在 3 轮面试中有一轮感觉不太好,因为面试官只给了 2 道题,并且我最终都没办法解出来,HR 也确认了就是这一轮的反馈不好。
此外,Google 的招聘流程还让人感觉到很有效率。作为面试官,我也知道自己写面试反馈有多喜欢拖延,而且公司填写面试反馈的系统越不人性化我就越想要拖延,然而公司内部系统做得人性化的又实在罕见。Google 的面试基本上隔天就有结果,然后 HR 就会约下一轮的面试。因为我在百度的时候每周哪个时间没有会议是很确定的,所以我总是选择下周同一个时间段来面试。在经过总共 4 轮面试后,HR 说因为前面有一轮的面试官反馈不好,所以希望再加一轮面试。因为前面反馈不好的面试官比较 senior,所以这次找了一位同样 senior 的面试官来面试,于是我又去了一次 Google 办公室。
完成 5 轮面试后,HR 把材料提交给 Google 的北京招聘委员会,结果没有通过。HR 说,因为 Google 都是按照后端工程师的标准来招聘,看重算法和数据结构,前端工程师要通过不容易。因为 Google 没有专门的前端工程师,只有一个软件工程师职位,所以所有人还是必须按照一个标准来衡量。她问我如果找到专门需要前端工程师的团队,并且需要额外再面试的话,我是否感兴趣。当时 Google 是我的第一选择,我当然说感兴趣啦。
后来 HR 跟我说,她帮忙问过Google Maps,可惜对方说不要专才只要通才。又过了几个星期,HR 发现 IME 需要专门做前端的人,于是帮我再约了一轮面试。这轮面试是在 Google 办公室做的,但实际上是视频会议,因为面试官在美国。(不确定面试官是在美国出差,还是美籍华人。)面试过程跟电话面试类似,用Google Docs写代码,比电话面试要好的是说话时能够见到人。
这一轮面试结束后,我的材料再次进入Google的北京招聘委员会。HR说这次专门找了对前端有经验的人来审阅我的材料,结果顺利通过了。接着 HR 问我要了一大堆的补充材料,包括高考成绩和GPA(连同成绩单),还包括当前薪酬和竞争对手的offer(我当时有 Yahoo 的 offer),甚至包括过去的获奖和晋升经历。所有这些材料都会发往Google美国总部审阅,具体流程HR没有细说,但看Don Dodge的文章可以了解一些。最后我被Google美国总部给拒绝了,然后 HR 还是一如既往地及时沟通,并且安慰了我几句。
整个Google招聘流程下来,可以感觉到人性化和高效率,同时也能感觉到HR确实在很努力地为候选人争取机会。可以说,无论是否通过,Google招聘流程至少能给候选人一个很好的印象。据我所知,尽管Google声称全球招聘标准一致,但因为中国聪明且懂算法的人实在太多,所以难度更高是很正常的。能够在Google中国以外的地区应聘的话,应该会容易一些。
更多关于Google谷歌校招/实习的攻略,请移步:
此话题已被删除}

我要回帖

更多关于 前端技术面试考什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信