赞
踩
https://shimo.im/docs/f3qkswc1OysVUFvN/read
石墨文档是一款轻便、简洁的在线协作文档工具,PC端和移动端全覆盖,支持多人同时对文档编辑和评论,让你与他人轻松完成协作撰稿、方案讨论、会议记录和资料共享等工作。
我是如何拿到阿里、美团 Offer 的?—Lighting
大家好,我是 Lighting,目前是一名前端开发。去年底我从上家公司裸辞之后,进行了一段时间的准备,开始面试找工作,最后拿到比较满意的 Offer 是美团和阿里的。
作为前端训练营的毕业生,极客大学的班班最近给我安排了不少分享,比如整理了我的用户故事,安排我分享面经等等,一时间感觉到了自己人生的高光时刻哈哈哈。
其实我觉得应该有不少极客时间用户还有更好的经历,但如果我的面试经历,能帮助到正在准备面试或者打算跳槽的你,我还是非常开心的。也欢迎其他同学一会儿共同讨论,分享一下你们的面经,毕竟这个时候打算面试的同学还不少吧。
另外,如果你最近不打算跳槽,我也建议你多看看面经,了解一下行业内各个企业招聘都在考察什么,对自己日常的提升和学习有很大帮助。
好啦,言归正传,开始我今天的分享。今天,我主要结合我在美团、阿里两家公司的面试经历,来给大家进行总结。
【第一部分 面试前的准备】
从决定找工作开始,我其实经历过一系列思想斗争,最开始想的是,等自己完全准备充分之后,再开始投简历面试。然而,由于惰性,我发现自己很难判断什么时候是完全准备好的时候。
这次换工作的第一次面试,还是在极客大学前端训练营上,毕业典礼的 Offer 直通车环节开始的。当时的心态就是报着学习的态度,总要迈出第一步,也许当你放低了自己的预期,实际面试过程中可能也就不会那么紧张和不自然了,我当时报的期望就是通过面试查找自己有哪些不足,以及了解一下市场上的真实需求。我的目标很明确,就是要通过大厂面试。这次现场面试,让我一下就找到了状态,决定全力准备面试。
依稀记得当时 Offer 直通车现场自己一共投了 7 家公司,当时有四家公司(此时没有阿里和美团)觉得有意向,还想进一步了解我一下,商量之后再和我约时间。后序接到面试邀约电话时,我意识到,自己还需要再准备一下。这里有个心得是,当你觉得自己还需要再准备一下的时候,可以诚恳地和HR或者面试官约定时间,通常时间为 1 周左右,一般面试官也会理解。你可以说自己很珍惜这次面试机会,需要再好好准备一下。
然后,我为接下来的面试做了如下准备:
1)又大致过了一遍前端训练营的课程内容
2)阅读了极客时间《浏览器原理与工作实践》专栏中关于浏览器渲染原理等内容,这里主要选读了训练营中没有覆盖到的知识部分
3)当时训练营期间和一些同学组织了 Leetcode 刷题小组,大概每周至少 3-5 题的刷题速度。每周参与线上刷题分享的活动,刷题活动共持续大概 1-3 个月左右,这期间穿插着面试、总结和差缺补漏。
基本上以上准备,让我面试前增加了不少信心。
【第二部分 面试题目】
美团、阿里的具体面试题目,我按照「前端基础知识、前端框架的底层原理、性能优化、计算机网络、算法、前端工程化、项目经验」这七大部分来给大家总结:
1. 前端基础知识,主要从前端四大模块 HTML\CSS\JavaScript\DOM, BOM 方面以及前端框架如 React\Vue 等准备。
CSS:
大概会有1-2个问题,主要考察各个常见布局的实现,比如垂直水平居中、双栏布局、随窗口变化的正方形、网格布局等等,一般需要手写代码,这里推荐张鑫旭老师的 CSS 世界,多看几遍足够应对面试。
HTML:
在我面试的过程中这个问的不多,之前 winter 老师有一道面试题,说说你常用的 HTML 标签,然后由这道问题可以延伸出很多细节,进而考察你对 HTML 知识的掌握。
JavaScript:
考察 JavaScript 的细节问题是最多的,通常包括但不限于:
1)JavaScript 的基本类型
2)setTimeout、Promise、async/await 三者之间异步解决方案的区别?
3)宏任务和微任务,通常会给出一段代码,让你给出输出结果,并解释?
4)解释 JavaScript 的单线程模型,以及为什么这样设计?setTimeout 的延时为何做不到精确?
5)手写实现 Promise?
6)原型链知识的考察,形式也是给出一段代码,让你给出输出结果,并解释?
7)说说你用过的 ES6 语法的功能点,对 ES2017-9 的新增功能点是否有关注?
8)解释 JavaScript 的闭包?解释 this 指针指向的问题以及常用改变 this 指针指向的函数? apply, bind, call 三者之间的区别?
9)JavaScript 继承的几种方式及优缺点?
10)实现节流或者防抖代码?
11)fetch 是否可以共享 Cookie?两个 then 分别对应着什么?
12)手写代码实现红绿灯效果,红灯3秒,绿灯1秒,黄灯2秒,循环重复?
13)JavaScript 是如何操作 Cookie 的?
DOM API:
这方面也很少被问到,印象中有这几道:
1)如何翻转 DOM?冒泡和捕获机制,实际应用有哪些?
2)冒泡和捕获机制,以及实际应用?
2. 前端框架的底层原理
我们以 React 为例,经常会考察内容包括:
1)setState 的内部实现?
2)什么是虚拟 DOM,引入虚拟 DOM 的目的,虚拟 DOM 一定能解决性能问题么?
3)React Hooks 有哪些了解?
4)react redux 的底层原理?如何完成异步请求?介绍自己常用哪些 redux 中间件?以组合函数的方式手写代码实现中间件的级联功能?
5)react 的 diff 算法了解么?
6)react 的 fiber 算法了解么?
7)react pureComponent 和 Component 有何区别?
8)react 的生命周期,新版和旧版都需要了解
9)react 的单向数据流如何理解?
10)如何设计组件?
11)react memo?
12)react 无尽列表是如何实现的?
3. 性能优化
1)浏览器的渲染原理是一定会被问到的?
2)浏览器输入一个 url 之后的过程,以及过程中应用了哪些缓存,如何优化?
3)script 标签和 link 标签的先后顺序对页面加载的影响?
4)async 和 defer 的区别?
5)react native(因为我的简历中有写到使用过 RN)有哪些坑?
4. 计算机网络
1)解释 TCP/IP 的三次握手和四次挥手?
2)解释跨域问题以及前端常用的解决方案?
3)CORS 的细节,哪些是简单请求?哪些是非简单请求?
4)解释 HTTPS? 解释 HTTP/2?
5)HTTP 报文的格式?
5. 算法
1)手写冒泡排序?
2)给定两组数,分别以链表方式存储,求和?注意进位
3)数组去重?
4)微信红包是如何实现的?
5)给定一组数,求和函数是带延时的网络请求,如何在最快的时间内计算出这组数据的和?
6. 前端工程化
1)webpack 如何拆分大文件?
2)webpack 打包的过程?
3)webpack 的基本配置?
7. 项目经验
这部分大概很多同学都很关心,到底应该怎么写自己的项目经验。出场率最高的问题也是介绍一下你做得最出色的项目?
首先最重要的是,实事求是。
这方面我认为主要考察候选人在工作中所承担的角色,以及平时工作中是否注意积累和总结,其实大多数人平时是不善于总结的,我自己也是,所以平时注意写“详历”是对自己很有帮助的。
关于祥历如何写,极客时间《面试现场》专栏中有提到,我觉得非常好,分享给大家
详历的结构如下:
开头,“有段经历,正好遇到了这个问题……”。(讲清问题背景)
发展,“一般的做法是做不到的,因为……”。(讲问题的复杂性和挑战)
高潮,“我一开始用到……后来……”。(讲解决方案的形成过程)
结局,“成果是……”。(讲结果、影响、意义)
所谓“详历”,是相对于“简历”更详细的工作经历和能力的总结,用故事的方式,记录工作的成果、职位、经验和能力发展,相当于你的工作档案,用于回顾个人工作经历,撰写简历,也是回答面试问题的经历素材库。这些素材体现你的个人经验、技能、潜力、动机。详历是你个人工作经历的故事汇编,是你能力的索引,是给你自己参考用的,随着经历的增加而越来越充实;而简历是给面试官看的,最好因职位而异。
详历主要有三个作用:有助于职业规划,可视化技能体系、经验分布和成长路径。是定制简历的母版。提供面试素材。当被问到“这个项目最大的提高是什么”,或者“你失败的一次沟通是怎样的”,你可以从准备好的详历中,快速选取恰当的故事,讲给面试官。
【第三部分 面试流程,以及美团、阿里面试有什么不同的体会】
可能很多同学都想知道大厂的面试流程,这里我也简要分享一下:
总的来说大厂对于候选人的基础知识要求还是非常严格的,当然也更看重候选人的潜力和心智,因为在大厂看来知识是死的,只要时间足够,通常都可以掌握,但是潜力和心智状态,却和每个人的成长轨迹和阅历有关。
一面面试官通常是你未来的同事。面试主要考察候选人的基础知识,我遇到的面试官都非常 nice,会寒暄几句,帮助你脱离紧张的情绪,然后进入正式面试环节。我记得看过一个 TED 的演讲,内容是关于紧张,里面讲就算你真的紧张的不行,也不必担心,因为人总是比较在意自己的,所以就算你觉得自己非常紧张了,在面试官眼中你表现得也没有你想象的那么紧张。
二面面试官通常是你未来的直级 leader。这里阿里和美团不一样的点在于,当时阿里主要考察了我对于过往项目的掌握程度,以及我在项目中的角色,然后和我聊了很多个人成长方面的心得和看法;美团则侧重考察了我一面面试官没有问到的基础知识点,这里其实每个公司可能都不太一样。
三面面试官通常是你整个部门的 leader,主要从职业发展和候选人背景方面进行考察,过程中也会穿插着考些算法题,不过都不难,主要考察候选率的编程能力的。美团到这里就结束了,之后就是 HR 和你聊聊薪水,个人背景,跳槽原因等等。
阿里比较特殊,会多一轮交叉面试,四面是 HRG 和集团技术大佬混合面试,我个人觉得主要考察候选人的沟通、应变及潜力等等,没太问技术相关的问题,可能我比较幸运吧
想说的是如果想求职阿里,就要做好打持久战的准备,阿里的面试周期比较长,1-2 个月也是很正常的,所以要做好心理准备,如果面试完没有收到阿里的邮件,应该就通过面试了,没有消息就是最好的消息。美团就很快,当然也看部门是否急需招人,我面试的部门当天就走完了全部流程。
【第四部分 其他 Tips】
下面这些 Tips,都是我平常自己准备面试会遵循的,希望也可以帮助到你。
1. 简历编写,如何过初步筛选
网上优化简历的方法论很多,我就不多展开了,我列举一下我的简历框架,希望能给你一些启发
1)尽量一页纸展示自己的内容。
2)总体分为 7 个模块:个人信息、教育及工作背景、技能清单、项目经验、开源项目、个人博客、自我评价,其中开源项目和个人博客部分可有可无,如果有,自然是加分项。
3)技能清单里面,写清楚自己熟悉的语言、框架,甚至能证明你有某方面能力的证书。这里需要注意的是,千万别写“精通”,除非你这门语言或者框架的缔造者,一般来说精通一门语言或者框架确实很难。
4)项目部分,我的书写方式是 工作+结果。挑选项目中我参与的比较重要的部分,然后描述清楚工作内容和我的产出结果,尽量数字化自己的成果,比如项目时间、代码量、提高百分比等。再者,项目部分一定要真实,你需要对你写的内容了如指掌并且负责,否则面试官可能会认为你人品有问题。
5)自我评价部分,通常来说,适当包装自己的优点即可。如果某个企业你十分心仪,也可以参考对方的企业文化,重点匹配自己的内容即可。另外,你写的优点最好能用 1-2 个例子来佐证,比如我写了自己自驱力强,阿里面试官问到我的时候,我就介绍了自己主动学习,参与前端训练营的培训、买了很多专栏并学习、关注了很多技术博客,并写文章总结等等。
2. 怎么谈薪资
如果到了谈钱的时候,首先恭喜你前期的努力终于快见到回报了。我们程序员通常都比较内向,不善于谈这些,我也一样,但谈钱其实没有什么不好意思的。你可能跟我一样,有着错误的心理认知:自己少要点,公司看到我们要的不多,可能会考虑给 Offer。实际上,当你几轮面试过后,你应该可以判断出自己是否有可能拿到 Offer 的。这时候,你可以先调研一下行业薪资水平,然后再结合自己的水平给出自己的预期,这种情况下,你拿到的 Offer 才可能不至于让自己委屈。有时候,不敢多要也是正常的,多面试几次,多拿到几个 Offer,底气自然也就足了。
3.养精蓄锐
面试前吃饱饭也是很重要的,记得有次面试一个大厂,没吃早饭,然后坐地铁 1 个小时,3轮面试3.5个小时,三面的时候自己的专注力和精力能明显感觉到是跟不上的,这样也是会影响自己临场发挥的。
【最后的心得】
以上就是我的面试经历分享了,最后,还有几点心得来跟大家分享:
1. 临时抱佛脚搜面经、背题,通常来说是没用的,但是我们通过面试查找不足,然后努力补足短板,及时总结是很有必要的。在找工作的过程中我每面试一家公司,都会写面试总结,记录面试遇到的题目,回忆自己回答好和不好的地方。
2. 面试过程中,对于完全不知道的答案的题目,回答不知道也没有什么。面试是一个综合考察的过程,不会因为你一两个题目回答不够好就将你淘汰,而且面试过程中如果遇到不太明白细节的问题,可以和面试官老师做进一步沟通,这也是你展示自己沟通能力的好机会,千万别自己闷头苦想。试想想如果项目中遇到不会的,也会是需要虚心请教的,不然闷头苦干只会 delay 项目进度。
3. 在我看来,每一次面试都是一次绝佳的学习机会,尤其是大厂的面试官老师无论是经验、阅历以及专业知识,都能很好的给我正向反馈。在面试百度时,二面面试官就和我聊了很多人生选择以及个人成长方面的思考,面试阿里时也是二面面试官和我聊了很多工作方法论方面的思考,这些对我来说,比熟记几个知识点更有价值和意义。
以上,就是我的全部分享了,大家如果有什么问题,欢迎提出来。我说的不对的地方,也欢迎大家指正。真心地祝愿群里每位兄弟,都能面上自己心仪的厂,拿到想要的 Offer!
报名前端进阶训练营,戳链接>>>http://gk.link/a/10gZJ
头条、蚂蚁金服面经分享—阿皓
大家好,我是阿皓,很高兴算法训练营的班主任邀请我来给大家做分享。因为对于我来说,这也是个自我总结的机会,正好我可以面试的一些收获总结。希望今天我总结的这些经验,能够帮助到大家。
我今天主要给大家介绍这几个部分:
1)如何选择公司以及什么时间投递
2)投递渠道
3)接到面试邀请如何准备
4)不同阶段的面试官考察点
5)头条、蚂蚁金服面试题
6)面试方法
【如何选择公司以及什么时间投递简历】
首先,从我个人而言,因为我自己的岗位是 NLP 算法,之前做对话方向,所以我明确了未来3年的一个主体方向,就是继续深入做技术,深耕 NLP 领域。其次,我是 18 年硕士毕业,还需要继续镀金。结合以上两点,我一开始就明确了要去大公司,比如 BAT、头条这种,最好是 NLP 比较强相关的部门。如果去不了大公司,那么一些垂直领域涉及 NLP 比较多并且实力也还不错的公司,比如猿辅导、宝宝树这一类公司,也是可考虑范围内的选择。
综上,我建议你在选择所要应聘的公司时,可以从自己所专攻的专业方向、个人职业规划和与自身岗位相匹配的公司等方面去考虑。
关于投递时间,我认为这个没有特别的限制。不过可以先从一些自己不感兴趣或者不是很想去的公司开始练手,通过面试不断查漏补缺,对自己的知识体系进行完善。
【简历的投递渠道】
**内推永远是第一位的。**这句话一定要牢记!能直接内推到组里是最好的。其次社招可以找猎头,但是猎头参差不齐,一定要多多打听清楚。
顺便说一句,算法训练营毕业之后就提供内推服务,我看我们班就有同学目前正在由算法训练营的服务团队进行内推。
【接到面试邀请如何准备】
首先,对于社招同学而言,项目是重中之重。自己做过的项目一定要说清楚来龙去脉,每个细节都要推敲清楚。面试官在你项目问题答的很满意的情况下,对于做题比如 LeetCode 的笔试题,就会稍微看淡些。另外,结合自己的简历以及招聘 JD,把公司需要的技能额外准备一下。再次强调:切记,一定要把自己做过的项目搞得非常透彻!
【不同阶段的面试官考察点】
面试一般情况是 3~4 轮,最多的面了 6 轮,视情况会增加两轮交叉面。
第一轮:一般都是考察基础,会涉及到一些技术底层东西,比如某个算法实现,某个模型结构,比如做两道题等等。
第二轮:一般都会是项目相关,项目为主问的非常细。
第三轮:三面开始就会考察系统设计 + 软技能,看具体公司了。
额外要注意的是,字节跳动是全程都会有 LeetCode 题的测试。
【头条、蚂蚁金服考的面试题】
合并 K 个有序链表
求数独
二叉树的层级遍历
二叉树的锯齿形层级遍历
字符串翻转
重排链表
二叉树插入节点
二叉搜索树节点删除
链表翻转
接雨水
旋转有序数组的峰值数字
有序矩阵的第k小数字
编辑距离
二分查找
找出小于并且最接近目标数字的数
寻找旋转排序数组中的最小值
不同路径
两两交换链表中的节点
山脉数组的峰顶索引
盛最多水的容器
我主要给大家分享一些算法面试题,大家可以对照看看。
【面试中的常用技巧】
关于离职原因:
参照着来哈!第一段介绍背景,第二段阐述宏观原因,第三段阐述个人原因,第四段人在屋檐下,捧一捧客户公司也是基本的礼貌,利于自己留下一个好印象。
例:是这样,目前公司这边其实挺好的,公司的平台、行业认可度或者薪资都还不错,选择离开也挺纠结的,但也是不得已(一定要说差异化、具体细节化的理由):
(1)这边的业务最近发生了很多变化,原来的项目进行到一半客户方和高层出现变动。涉及商业机密,具体我也不太方便透露请见谅,所以影响到我这边就是工作内容发生调整,自己范围内的职责变少了,而且可能有转岗或者边缘化的趋势,那这样我的自身价值就体现不出来,与其被动的等待安排,还不如主动的看看机会;(或者其他原因)
(2)另外,一般员工离职和上级都有必然的联系。举个例子:公司在 XX 项目中的规划,前期设计的时候我就明确表示过这样不合理,可能会出现这样那样的问题,同事也同意我的想法,但是上级在这块重视度不够,最后出现问题反而开始追责下属,未能够担起领导的职责,但从这个层面,就觉得挺憋屈的,虽然平日领导待我不薄,所以好聚好散,虽然想法不一,还是朋友嘛;(或者其他案例)
(3)还有一个最主要的原因,就是我关注(应聘公司)这边的机会已经有很长时间了,这边的项目内容和技术氛围是我比较欣赏的,之前一直想来没有找到合适的时机,现在这个节点正好有猎头推荐咱家的职位,我觉得挺好的,不能再错过了,不管能不能面试通过最终 Offer ,能和你们聊聊我就觉得挺好的。
嗯,就是这样!!
技术面试注意事项:
无论多少轮技术面试,原理都是一样的:
(1)**任何问题都要回答:**因为一个问题如果你不回答就是零分,但凡找你答了就会是加分项的,至于怎么回答这个问题,提供一个思路。比如说,面试官问了你一个专业名词,这个你也不理解,可以试试这种方式:由于之前工作性质的原因,这方面接触的比较少,但是我知道这其中的基本原理,在我之前项目当中的,主要是通过某某某的方式来实现这样的一种技能,但是我认为自己学习能力和领悟能力挺强的,如果咱们这边对这块要求比较高的话,我认为自己在几周之内把它掌握应该不是什么太大的问题;
(2)**面试官需求:**在回答面试官问题的时候,一定一定要认真地思考,面试官问这个问题的原因是什么,他在问你的时候千万不要着急回答,一定要在脑海里面先等个一两秒钟,让自己有一个思考的过程,想一下他问这个问题的目的是什么?然后再去作答,确保你回答的问题和你的答案就是面试官想听的,回答在点儿上的;
(3)**专业亮点项目经验:**在问到这块项目经历时候,一定要特别特别格外重视,这是面试的重中之重,确保把自己所知道所了解的一切内容都能用面试官能接受的方式输出出来;
(4)**面试官问问题的方式:**就是有时候面试官再问你问题的时候他会不经意间就会把答案告诉你,比如说我们是通过某种方式实现怎么样的功能,你怎么看待这个问题呢,这时候你一定要清楚面试官已经把他的答案告诉你了,这时候,你就得围绕这个点展开叙述加上一些你自己对于这个问题的理解;
(5)**回答问题的深度:**这在面试过程当中也是很重要的,因为比如说面试官问到一个问题你是可以回答的,但如果这个问题,一个刚毕业的大学生或者是研究生也能够答得出来,那你和他们的差别在哪儿呢。所以一定要体现出你作为一个有很长工作年限和大学生的区别,即使这个问题你会,也一定要更详细,更具体更深度化一点儿,体现出你的专业度。
(6)**回答问题的思路:**思路一定要清晰,没想好不要回答,开始回答就要有明确的思路,有简到难,先让自己气儿顺了,再让论点表述出来,层层递进。
(7)开放性的问题:这种问题要了命,答好了就出彩,答得一般就会挂,问到开放性问题,切记两点:第一,开放的问题开放地回答,答案不唯一,多给出几种观点或者解决方案;第二,开放性的问题必须有自己独到的想法加入进去,自己的感悟和解决方案相结合才是王道。
和 Boss 的面试注意事项:
(1)**体现你的格局能力:**虽不及老板的这种专业视角,但不能差别太多,让老板看到你的可塑造性,具备值得培养成为合伙人的潜质;说白了就是谦卑的同时能会吹。
(2)**多认可少评判:**多多表达对亮亮品牌战略规划的认可,人在屋檐下,多说几句认可别人的话,别人也会相当认可你,也会给你涨薪不少;
(3)体现出你和老板及公司是在一条战线上的,做一些功课,了解一下他们公司的部门环境、产品优势、市场情况、所取得的成就,以及对未来模式的看好,表现出十分感兴趣;
(4)**个人认知:**个人生活问题+职业生涯规划+理想,回答一定要干练准确明了。
面试基本原则和重要注意事项:
(1)用真诚的态度去面试沟通、用开放的心态去交流学习;
(2)用干脆爽朗的态度面对一切,杜绝惺惺作态,杜绝满腹踌躇,杜绝啰嗦;
(3)你是有梦想的,让他们看到你的梦想和想做出一番事业的决心;
(4)面试官信息:一定得要,原因有三:
①你去要他的微信或者电话,体现出你对他本人的认可,认可这个平台;
②多认识了一位行业中的大拿,绝对没有坏处;
③能给对方留下一个好印象,日后问面试反馈可以跳过 HR ,直接拿到一手信息。
话术:
(1)**向技术面试官要联系方式的话术:**面试之前询问对方称呼,比如说,“您好,我是来面试的xxx ,怎么称呼您”,面试结束之后补充一句“ xxx,今天面试和您聊的很开心,不管我能否通过今天的面试,从您身上学到不少新知识,我能否要一下您电话或者加一下您微信呢,以后有机会及时向您切磋学习”;Boss 联系方式话术,前面都一样,聊完之后,套路也是一样的,您的格局太强了,受益匪浅,希望能够和您保持长期联系,多向您学习,我能加一下您的微信,留一下您的电话吗?)
(2)薪资谈判:
①开始谈薪资的时候,两个原则:
不要说具体的薪资期望;
千万不能透露自己的薪资底线;
② HR 问期望薪资的时候:(一定要表现出对薪资毫不 care 的态度,另外还得吹捧客户公司,不要觉得难为情,每个月能多拿好几 k 呢,说几句好话又咋的,哈哈)
**第一层话术:**薪资这东西不是我最关心的,通过前几段的面试,我感觉我们这边的面试官的技术实力挺强的,专业素养很高,跟这样的领导学习无疑是非常明智的;而且和面试官聊项目内容的时候,聊得挺好,和我也很对口,是我喜欢的范围,也是兴趣点所在;(目的是让 HR 知道你是真正意义上喜欢这个团队才加入,是愿意一起奋斗而不是来捞一把的人)
**第二层话术:**所以说薪资我倒不是很在意,我知道咱们这边是根据评级来定薪资的,所以我相信咱们这边的专业眼光,你们觉得我的技术和软实力值多少钱,给我定多少都可以,这就是你们的事情啦,辛苦费心了;(目的是让 HR 了解到你的一个态度,是认可他们而不是为了突出自己)。
第三层话术:(这一段就很关键了,真正关乎拿多少钱的问题)我目前的薪资是每个月多少 × 多少 + 多少,总共多少万左右(这边分两种情况:第一有 Offer,你可以说,现在拿到一家多少多少的 Offer,[薪资结构一定要具体],也挺好的,不过就是项目没有咱们这边有意思,技术氛围也一般,所以意愿度不强;第二是没有 Offer,你可以说:现在刚开始找,还没接触几家,暂时还没有 Offer,就是有朋友或者之前的老大拉我过去一家小的互联网公司,承诺能给 40 w、35 w等等随你说,但是考虑到规模不成熟,风险比较大,所以还在考虑当中),但我觉得整体上来说从目前来看我是非常满意也很希望加入进来。(这一段一定要小心说,目的是让 HR 知道虽然你很喜欢这边,但你也是有一些选择的,不是非他家不可,而且你说了一些薪资,HR 肯定会对照你说的薪资来参考,最终会权衡给你考量定薪)
最后说一下在算法训练营的感受吧,我报了第 5 期的算法训练营,在这两个月的时间里,还是有很多收获的:
1、强化了自己的数据结构体系,这点其实还是很关键的,毕竟很多时候基础不牢固再去做别的也会有很多困难
2、对常见的一些算法题有了更深刻的认识,比如之前自己一些没想清楚的解法,通过训练营的学习理解更为透彻
3、最关键的一点,就是有助教及时答疑,疑点没有遗留太长时间,能够在很短时间内就得到解决。
所以总的来讲,我觉得性价比还是很高的。而且学习完算法训练营之后,还有内推服务哦~
报名算法训练营,戳链接>>>http://gk.link/a/10gZK
作为面试官,我是怎么考察候选人的?—老吴
大家好,我是程序员老吴,目前在某电商公司从事技术专家相关工作,之前在美团工作。因为工作需要,我也经常会面试一些候选人,我这里主要是面试的第二轮,考察候选人的基本技术能力和项目相关经验。
同时,我还是极客大学算法训练营的助教,目前已经带了 450+ 学员。带班期间,除了算法题之外,同学们问我最多的,基本就是关于找工作、面试这些问题。今天,我就把我面试中,结合日常同学们最关注的点,来给大家分享“面试官都是怎么考察候选人的”。
【该如何准备简历?】
面试前非常重要的一步,就是准备简历了。什么样的简历,对初筛更有利呢?我们来从简历的「专业技能、工作经验、工作项目、个人亮点」四大部分,逐一说来。
第一,专业技能
这部分,主要跟大家分享几个一定要避免的点:
1. 一定要避免写人人会用的基础技能
举个例子:一些基础知识,Java 集合,垃圾回收,多线程,IO等,这些属于我们必知必会的。放上去特意强调反而没有亮点。更好的方式是,可以把上述换成做过线上JVM性能调优,我使用过某些工具或者组件进行过线上抓包和工具分析。并且深入我们对应的源代码进行问题排查,修复了某个问题,消除了oom相关问题,这些既包含了我们对基础知识的掌握,又体现了我们对线上排查问题的能力。
2. 慎重使用“精通”
面试官通常看见对某方面知识写到“精通”二字,一般都会对该知识和面试者进行深入的讨论和研究。从点到面扩展到各个部分。主要会看面试者是否真的精通,如果面试者只是了解一小部分或者只是知道个概念,这样在面试官心里的印象分会大减。比如曾经面试过的同学写对netty精通。我会针对于 netty 的实现,比如 netty 线程模型,ByteBuf,nio 部分,select epoll,poll 区别,甚至于多线程,锁等相关知识发问。然而此同学只是看到过一些概念或者写过一些小的 demo,甚至于对 api 的使用都不甚了解。一问三不知,这样是严重减分项。
大家切记:一定按照自己真实情况来描述自己对某知识的了解。一般对于自己用的顺手的一些知识点。大家可以项目中应用过或者有过研究和了解。如果真的很精通想做为加分项可以列举一些自己的总结(最好有自己的博客或者文章)。这样一目了然。如果针对于自己知识用过的知识或者只是看过概念。建议写了解甚至于不写。这样避免给自己造成不必要的面试麻烦。
3. 可以突出关键字和技术,但切忌堆砌
曾经看过很多同学简历上列举了很多当前比较流行的框架和技术。比如 rpc 框架,自己经历过的很多公司都会有自己内部的一些框架。大家也都列举上去了。比如之前遇到过的一个同学写了自己熟悉 dubbo,grpc,motan,dubbox,spring cloud 等等。这样通常会给面试官蜻蜓点水的感觉。都了解,但是都不深入的错觉。建议大家只重点写 1-2 个。区分类别。
比如针对于这位同学的建立描述。我可以换成:深入了解过一些 rpc 框架的实现,深入学习过 dubbo 的相关架构设计,对于其他同一类型框架自己也做过相关的技术调研和对比。这样会更好一些。重点会明确和突出。
4. 尽量避免主观表述,少一点语义模糊的形容词,比如说"有点熟悉",“可能”,"大概"之类的词语。
这些语义模糊的词放上去就本身证明了自己对知识或者自己做过的项目的有些环节并不是很了解。试想一下,如果自己都不了解。怎么让面试官来相信你的能力和在项目中有过优异的表现。所以大家在建立中一定要避免诸如此类的词语。如果是自己了解和认为有把握的。一定要给出肯定的结论和答案。必要的时候把自己的总结或者成果展示。
第二 ,工作经验
我会通过工作经验部分,去初步判断候选人的技术能力。因此,在准备自己工作经验时,可以阐明最近几份工作经历中所参与过的产品、项目、角色 ,毕竟,最让人信服的,是真材实料的项目经历和过硬的技术。
怎么体现自己的技术实力呢?可以介绍:
在工作中做的项目的技术细节
克服过的技术难点与细节
感兴趣的技术
在程序马拉松上参加的项目或者是业余的个人项目(+link)
如果领导过技术团队,写下带的团队的规模与管理风格
第三,工作项目
一些情况下,项目经验和工作经验是可以合并到一起的,但作为有几年工作经验的程序员来说,一定经历过几家公司,每一个公司里面担任什么样的角色,做过的项目也很多,为了条理清晰,逻辑清楚,分开写是明智的选择。而对于刚刚毕业参加校招或者社会招聘的实习生来说,没有过多的经验和项目,则合并在一起。
通常来说,面试官只会对你的 1-2 段经历感兴趣,然后通过你对项目的描述,再对你所使用的技术或者你主导的技术方案深挖。所以我们在简历项目介绍上,一定不要大而全,而是要挑选重点的、有亮点的项目介绍。
怎样算是比较有亮点的项目呢?比如你从 0 到 1 搭建的项目,或者你作为主要项目框架的搭建者,再或者数据量和访问量比较高的项目。这些项目最好能体现出用到的技术比较新颖,或者是你主导解决了若干技术问题。
另外,每个公司建议放 2-3 段项目经历。如果项目中有一些比较明确的成果,比如稳定性、开发时间,或者给业务带来突飞猛进的增长,以及个人获奖等,一定要补充上去。这说明你完成的项目是有始有终,能看到结果。
对于项目介绍,给大家介绍一个比较重要的法则,star法则:https://baike.baidu.com/item/STAR%E6%B3%95%E5%88%99
简言之,项目介绍一定要围绕着这 4 个原则:
Situation::事情是在什么情况下发生
Target:你是如何明确你的目标的
Action::针对这样的情况分析,你采用了什么行动方式
Result:结果怎样,在这样的情况下你学习到了什么
一个好的样例:
项目背景(Situation):
我们目前的订单系统访问量和数据量日益增长(此处可列举数据:订单表单表过亿,系统的 pv 和 uv 多少)。目前的系统出现了大量的慢 sql 和接口超时问题,用户客诉较多。针对于当前系统的新需求上线和改动耗时过高(比如rd研发需要一周+qa 验收回归需要一周),时间成本较高。所以我们准备花1个月的时间对系统进行重构。提升订单系统的性能,稳定性,和可扩展的能力
项目目标(Target):
新的重构系统消灭慢 sql 问题。接口平均响应时间在 50ms 以下。系统可用性大于等于 4 个 9。新的需求开发加测试上线在一周之内。要支撑未来 2-3 年的一个扩展
项目角色和行动(Action):
我的项目角色:项目负责人和核心架构开发人员
我作为项目负责人参与了和 pm 的需求讨论工作。制订了项目排期和资源锁定。召开项目立项会。每天的站会组织,项目成员日报,周报的收集。定时检查项目风险和代码 review。组织上线工作。
作为项目核心架构开发人员,我规划了订单系统的拆分。对分库分表技术做了相关的技术调研和预演,对当前订单表进行了重新的模型设计。带领团队开发了数据迁移组件(全量和增量)。并且对新的订单存储模块进行了全方位压测。
项目成果(Result):
系统比预期时间提前一周完成上线。上线之后客诉率相比之前降低百分之 95,接口性能在 40ms 以下,系统稳定性稳定在 4 个 9 以上。我个人获得技术部优秀个人奖。
第四,个人亮点(加分项)
工作之后,大家可以在简书和知乎上写博客,并且留下自己的联系方式,如果技术博客在网上流传广泛,或者自己的开源项目被很多人 star,相信这些加分项,可能让你不需要简历,就获得一些应聘的机会。
常见的加分项:
1)一般能力:语言能力(比如英语四六级证书, 托福雅思分数.日语等级),全国计算机等级证书(比如网络工程师、数据库工程师、软件测试工程师、信息安全工程师),ACM 竞赛等
2)技术博客,GitHub 项目,尤其是有亮眼或者高star的项目
3)自己写的电子小册,书籍,运营的公众号等
【什么时间投递简历被查看率较高?】
我们都知道投简历是由我们自己决定的,但在简历投递后,HR 能不能看到那就是另外一回事了。
总结来看,周三早上是投递简历的最佳时间。星期一是本周的开始,HR 部门正在总结前一周的工作,计划本周的安排。跟很多人一样,星期一,HR 们极大可能是在会议和计划中度过。所以,这一天 HR 的情绪,可能并不是特别好。他们没有多余的时间来仔细阅读你的简历,因此简历的要求可能会更高。
而到了周五,HR 部门可能需要进行一周的总结,而且临近周末,心灵相对宽松,所以周五收到的简历很少在同一天读到,通常会累积到下周,但周末邮件积累两天,你的简历已被压在他们的邮箱底部。
因此,尽量在周二~周四去投递简历,最佳的时间,是周三的早上。
【技术面试阶段】
一般来说技术面 2-5 轮:
1)一面面试官一般是面试部门的核心开发人员,有可能是你入职以后的 mentor(导师)角色。
2)二面面试官一般是面试部门的组长级别,一般是项目负责人或者小团队的组长级别。
一面和二面通常是所有级别面试者必经的环节。
如果你级别较高(P6 或者 P6+)或者面试表现优异,就会经历三面四面甚至五面:
3)三面面试官:第三面一般是直属部门的技术 Leader。
4)四面面试官:这一面一般会是交叉面或者技术委员会的同学进行面试,考察综合能力。
5)五面面试官:这一面一般会是 CTO 或者大公司业务部门负责人。
不同公司可能会根据组织架构或者面试流程有所不同。通常来说,一般都是:一线开发人员——项目 Leader——业务部门技术 Leader——交叉面——CTO 或者业务部门总负责人这几个环节。
【我通常会如何考察候选人?】
首先,肯定会考察算法。
通过一个人算法题的能力,确实能看出他的基本功水平、未来的学习能力,以及,是不是有认真的准备面试。如果算法这部分答得很不好,我多半会觉得这位候选人准备不充分。按理来说,常考的算法点很多同学都知道,下下功夫,是能够准备好的。
那数据结构和算法部分,我会考什么呢?
比较基础的如快排、归并、二分查找的题目,我希望候选人能分析出时间和空间复杂度,并展示出相关推演的过程。对于高级一些的内容,我最低的要求是有思路,知道什么情况下用什么样的数据结构和算法,并写出模板即可。比如我会问:
Redis 底层数据结构设计,引申出跳表的原理,再扩展到Hash的实现及扩容实现,希望考察候选人是否了解跳表优缺点, 以及 Redis 为什么这么设计。
MySQL B+ 树索引结构的时间复杂度以及选型原因,希望考察为什么使用 B+ 树而不是红黑树或 Hash、跳表。
关于手写算法:
对于大多数需要面试的初级和中级程序员来说,作为技术面第一轮的白板算法题,一般会出 LeetCode 上 easy 到 medium 的题目,这类题目一般可以暴力求解、能够优化,有多种解法和思路,同时候选人最好能够展示一些软件工程方面的实力。
在做题过程中,有几点需要注意:
理解题目,在这个过程中要和面试官沟通,澄清题目的要求和相关疑问,而不是一上来就开始写程序。
设计算法,在这个过程中和面试官不断互动,一步一步探寻最优解,而不是一声不吭,一个人”埋头苦干“。
实现算法,在这个过程中可以展示你对软件开发和测试的理解。
代码完成后,酌情可以和面试官讨论一些相关东西,比如 TDD、BDD、CI/CD 等。
算法面试后,就是技术面试部分。我的提问会分为两个环节:
**首先是工程实践。**这部分我会结合项目经验和所用到的技术来综合考察,考察候选人知识的深度和广度。
拿后端工程师的技术栈举例,就会包括但不限于以下这些:
1)分布式分层架构设计理解
2)LB 负载均衡、前端压缩/CDN 缓存/DNS相关知识
3)多级缓存、MQ 异步解耦
4)无状态化设计 -> 快速扩缩容
5)DB Sharding 、读写分离、分库分表、SQL 和慢查询优化、JVM 优化等措施
6)ES检索、数据异构、大数据处理
7)一致性设计:批量异步、串行改并行、同步改异步
8)数据协议、通信协议
9)微服务相关概念,DDD,容量预估规划、全链路压测、灰度发布设计、降级/熔断/限流的设计、RPC服务治理
10)分布式配置、注册、监控
11)CI/CD:“Docker + Kubernetes”架构
有时候,我喜欢在一个点上去扩展,检查面试人的技术深度和全面性,举个例子:
比如你的简历在项目中用到了Redis,我可能就会发散很多点去问:
为什么选取Redis做缓存:考察的是你技术选型能力。
你都用到哪些Redis数据结构:考察的是你对Redis数据结构的了解。
Redis的底层实现机制是什么样的:考察的是你对数据结构知识的了解。
如何处理缓存失效,一致性问题,雪崩的问题:考察的是对Redis以及缓存相关工程实践的了解。
大key,热key的处理:考察的是你的技术方案,比如序列化,数据拆分,本地Cache等。
缓存的cluster,主备,以及AOF和RDB的实现原理:考察的是你的运维能力以及分布式的设计能力。
第二部分,是软素质考察:
学习能力:一般会考察一个新技术你是如何去学习,去应用,如何处理学习过程中面对的问题。
带队能力:目前带几个人。组内成员分布,如何管理,组内制定技术规划等
项目管理能力:你带过的一个项目,如何分配任务,如何做排期。面对可能出现的deley如何处理,如何保证项目质量。故障级别以及如何处理故障。项目复盘等
责任心和owner意识:一般会通过问如何看待加班来体现
业务理解能力:如何看待你现在的业务。以及你要面试岗位的业务了解,b端c端业务区别等等。
下面还原一个真实的面试过程:
面试准备:
我作为面试官接收到了一个面试同学的简历。这个简历是hr同学提前几天发过来的。会简单介绍一下当前同学的背景。然后安排面试时间。我作为面试官会提前查看面试者资料:
关注点:
1)个人简介(年龄,毕业学校,每段工作经历时长)
2)经历过行业公司背景(此处大厂会有些亮点),相关职位
3)是否有个人博客和开源项目
4)所做过的项目经历,项目中的角色,项目中的架构,使用到的技术,项目取得的成果
总体来说作为2面面试官对上面的1和2点只是作为了解和参考。重点关注于 3 和 4。
面试阶段(1-2 个小时):
我提前会到会议室,或者打开坐在电话机旁。准备当场或者远程的面试,一般会提前 5-10 分钟
面试人进入会场或者接通电话以后:
1)我通常会做自我介绍:
我是来自xx公司xx部门的某职位的面试官,很高兴今天参加你的面试工作
2)首先我通常会让面试者做自我介绍( 5 分钟):
我的关注点基本在于通过面试者介绍自己的履历,判断是否符合大概的简历经历。以及简单的了解一下面试者的沟通和汇报总结能力。一般 5 分钟之内结束。这一段我比较希望面试者能提炼出自己最近1-2段的经历和亮点,
3)一道笔试题(30 分钟之内):
在上面我已经介绍了关于手写算法的一些需要注意的点。我作为面试官基本会给出半个小时时间让面试同学完成笔试题的代码编写和运行过程。
首先第一个要点,我们要能够正确的写出代码。能够在各种 case 下正常运行。在面试同学思考的过程中我会观察面试同学的反应,如果针对于题目不清楚或者没有思路的情况下我适当的进行一些提示。在这里有一个点是加分项,有些同学会做一些算法推演,包括画图或者伪代码。这些是我比较欣赏的。如果实在没有思路我会考虑降低题目难度或者要求写伪代码。
如果实在写不出来我这边会适时终止笔试流程,进行下一个环节提问。
如果面试者能够写出代码。我会检查一些边界条件是否考虑。一般来说笔试题的解法会有好几种。一般我会要求面试者说出自己写出的算法的时间空间复杂度。如果面试者的算法不是最优解。我会让他进一步考虑一些最优解法。这个步骤一般就是加分项。考虑时间因素一般伪代码即可
4)项目部分考察(30 分钟之内):
项目部分我通常会要求面试者首先基于 star 原则的介绍。上面也提到了 star 原则。大家可以重温一下。针对于每个项目我会尽量要求面试者画出对应的架构图。以及简单说出项目的一些技术数据指标。作为一个研发人员我觉得应该全面了解我们的项目。而不是简单地只是做编码工作。
如果你是项目负责人,我会了解你的项目组组成情况。业务理解能力,项目管理能力,包括时间的把控和进度的检查。如何控制代码质量。
技术方面的考察我会针对于项目中的技术点,比如你用到的存储,rpc,消息中间件,缓存等每个点去考察,由点到面。在上面工程实践的讲解中我提到了一些我经常会问的。我通常会举一个实际的场景。比如如何做一个分布式限流。如何做一个秒杀系统,结合上面的工程实践考察。全面的了解面试者对一个系统的技术实践把控。
5)基础能力的考察(20 分钟内):
项目考察完成后我适当的考一些语言和数据库方面的基础知识。比如设计模式,java 集合,多线程,锁,反射,mysql 索引实现,数据库所,事务隔离级别,io 方面的知识等等。重点考察面试者对于一些基础知识是否能熟练应用。在这个阶段通常会针对于我们通用的一个框架深入的来探讨,比如 spring 的 ioc 和 aop 怎么实现。动态代理有几种实现方式等等
上述面试完成以后我会给面试者一个向我提问的一个过程(5 分钟)
通常会问你有什么想了解我们公司,团队以及业务的,通常我会介绍一些公司和团队背景。以及组内成员的一些简单情况。尽可能的向面试者来正向反馈我们目前的业务和团队情况。让面试者对我们也有一个好的印象。
面试官的评判标准:
面试流程完成后。我会给出面试者的一个综合评价。结合上述面试流程面试者的表现:算法面试。项目考察,基础能力考试,软素质几部分给出自己的评论。一般是 1-5 分。通常来说各个方面要达到及格水平。没有明显的短板。比如笔试写码题。最低标准一定要顺利完成并且正常运行。这是及格状态。如果给出时间和空间复杂度较好的解法。算是优秀的评分。所以大家一定要在算法上下功夫。这是第一道关。项目考察和基础考察至少要对于项目中用到的知识点能够清楚地说出如何使用,如何调优或者踩过坑。针对于技术点的原理也要概念性的了解。至少不能出现明显的错误。优秀的评分是能够做到举一反三,能够深入源代码,或者进行过技术调研等。如果架构师至少是能够说出为何项目采用这种架构和选用技术,包括领域模型设计思路等等。软素质就是项目管理能力,学习能力,沟通能力以及分享这些。至少要体现出相关素质的一部分才能达标。
结束语:
以上是我从一个面试官的角度来给大家分享一些面试的环节和套路。不同的公司有不同的面试环节和流程。大体上来讲不会脱离我上面讲的。希望能够给大家一些启示和思路。在这里一定要强调一下我们算法学习的重要性,在我自己做面试官的体会来讲,大家通常都是在算法题目的笔试阶段没有好的发挥,导致面试不能顺利通过到下一轮。这个真的比较可惜。作为极客大学算法训练营的助教,给大家推荐一下我们的算法训练营。我带过很多学员在反复的算法训练和覃超老师的悉心指导下都拿到了满意的 Offer。这里欢迎大家踊跃报名,和覃超老师还有助教一起来学习算法,大家一起攻克难关。课程目前也有各种各样的优惠。课程内容也在不断地更新和迭代。非常实惠。在最后也希望大家能够进入自己心仪的公司拿到满意的 Offer,谢谢大家。
报名算法训练营,戳链接>>>http://gk.link/a/10gZK
技术面试是一个工程师成长到一定阶段后必然要承担的一项工作,优秀的技术面试官能帮助公司筛选出优秀的工程师,并且潜移默化的吸引候选人选择加入公司。相反,糟糕的面试不仅会错失优秀候选人,甚至还会给公司招来大麻烦。尽管技术面试如此重要,我还是了解到,很多公司的技术面试官都是“无证上岗”,hr 随便抓壮丁去面试,面试质量参差不齐。本文就这个问题,根据我自己的面试经验和思考,总结了一些面试技巧分享跟大家,希望有所帮助。
如何阅读候选人简历
阅读候选人的简历,这是招聘流程中摆在我们面前的第一项工作。候选人的简历各式各样,我曾经见过很多人的简历写超过 10 页,项目零零总总罗列几十个,也有见过个人评价可以像散文一样写半页纸的,工程师们一般都比较忙,如何快速的阅读简历又不失重点呢?我总结了两点:忽略掉主观性太强的描述,比如简历中的自我评价,重复性的项目经历,一些熟悉某某技术,精通某某语言的主观性很强的描述,这些都可以一眼带过。另一方面,抓住候选人的亮点,亮点就是那些非常有力的能证明候选人能力的经历,我根据自己的经验罗列了一些,供大家参考:
首先,对于候选人来讲,大公司的工作经历是很重要的能力背书,而且级别越高可以粗略等同认为越优秀,虽然也会有个例,但一般情况下,阿里 P8 要比 P7 技术能力优秀,百度的 T7 要比 T6 优秀,腾讯的 T3.1 要比 T2.3 优秀。但是这种情况只针对大公司,对于一些创业公司,小公司来讲,Title 并不与能力划等号,小公司技术总监的技术能力不如大公司的一个普通的资深工程师的情况也是常有的事情。
其次,有很好的教育背景,GPA 高也是很大的加分项,比如清北复交毕业,虽然都说做技术学历不重要,但好学校的学生对计算机基础知识/通识知识掌握的更好,计算机思维,逻辑思维更强,相对要聪明一些,而且在工作中发现成绩好的同学往往在工作中表现出很高的执行力和快速交付能力 / 沟通能力,工作中的表现更优秀。
再次,有比较有技术含量的项目经历。为什么强调是“有技术含量”的项目经历呢?因为我发现,有很多工作年限比较长的候选人,简历十几页,项目大大小小几十个,而很多项目都是 3,5 个月就做完,用到的技术也比较重复/浅显,对于候选人的技术积累来说,10 年的经验跟一年的经验差不多,所以项目不在多,而在于能提现候选人的技术能力。
还有,有高质量的开源项目;项目背景比较切合;有在技术网站发表过文章或高质量的技术博客;做过一些业余项目等,都可以作为加分项。
如何设计面试题目
一般来讲,大部分的面试流程都会先安排一轮电话面试,通过之后再安排现场面试。电话面试的主要作用就是简历挤水分筛选掉特别差的候选人,因为电话面试毕竟不便于沟通,对于一些复杂问题也没有其他辅助方式来帮助理解和表达,所以面试题目最好不要过于开放,能够有标准答案的最好,类似笔试,也以基础知识或过往项目的简单询问为主。而现场面试一般比电话面试在沟通上更有优势,在题目设计上可以更灵活。
一般来讲,公司里面是没有面试题库的,一般都是面试官自己想的,来源有很多,网上看到的,项目里面涉及到的,自己被面试时遇到的问题等。拿来主义得到的面试题最好要修改一下,特别是网上常见的,以免候选人也看到过。
面试题目的设计一定要有同理心,简单的讲就是要学会换位思考,要站在候选人的角度去看待面试题目是否合适,是不是难度太大?题目背景是否容易解释的清楚?是否能让候选人对题目的理解跟面试官一致等等。这一点听起来比较简单,但做好比较难。张小龙说过最牛逼的产品经理要有能瞬间把自己变成小白用户来认识自己设计的产品的能力。我们在设计面试题目的时候,也要学会放空自己,努力做到忘记答案,再去考量这个问题的难度。不过我们还有一个侧面的方法了解面试题目设计的是否得当:先把题目讲给周围的同事听,看看他们是否能很容易的理解,能够答出来。
面试题目最好能层层递进,先从简单的问起,如果候选人能很好的回答,再继续深挖,逐级递进,当面试者无法继续回答出来时,大体上就能知道面试者对此方面知识掌握的深度了。
举一个我经常用的面试题: “有一个数组,数组中存储的是 Cat 对象,每个 Cat 对象有多个成员变量,其中一个代表颜色 color,有两个值白色和黑色,要求编写一个函数将数组中所有的白猫都放到黑猫前面。”
如果候选人能够顺利解答,我会继续加大难度:“如果猫的颜色有三种,白色、黑色、灰色,编写一个函数将数组中白猫放到最前面,灰猫放到中间,黑猫放到最后面,比如:原来数组为 黑白灰白白黑灰灰,经过排序之后白白白灰灰黑黑”。
还可以继续加大难度:“不仅白灰黑之间按顺序排列,而且白猫,灰猫,黑猫各自内部原来的先后顺序也不能变。” 虽然解题思路差不多,但显然需要处理的细节变多了,难度比之前两个都要大了。
这样一层一层递进,难度逐渐加大, 这样的面试题一方面有区分度,另一方面不至于太难导致候选人完全答不上来。
少问记忆性问题和太理论性问题
有些 JAVA 面试官逢人便问 JVM 几种垃圾回收算法优劣对比,这种文科题目在我看来是没有太大意义的,一方面没有区分度,另一方便容易突击准备,往往考察不出候选人的真实能力,所以我面试有个原则,不直接问记忆性问题,也不直接问理论性问题,比如 Spring AOP,IOC 的实现原理,Spring Transaction 有哪几种事务传播方法,分布式一致性的解决方法有哪些啊?JVM 垃圾回收算法?Zookeeper 的应用场景有哪些啊?
并不是说这些技术不重要不需要考察,而是换个问法,将这些记忆性的、理论性的知识融入实践,比如考察刚刚提到的 Spring 中的 AOP, IOC 原理概念,我一般会这样子设计面试题目: 给一些包含 Spring 功能特性的代码片段,让候选人阐述一下从应用启动到代码执行都经过了哪些主要的操作?当然还会告诉候选人主要考察 spring 的 AOP/IOC 特性,并且提示候选人越详细越好,以免候选人不能理解面试官的意图,答非所问。这样的问法让候选人言之有物,而且避免机械记忆性的背诵,更能测试出候选人是否真正的理解。
再比如,有些面试官为了考察候选人多线程方面的知识,经常会问到的题目比如 ConcurrentHashMap 的实现原理,volatile 关键词的作用等,我之前也多次拿这些题目当做过面试题,但总结下来发现,大部分候选人都能答得七七八八,区分度很低。我之后换了一种问法,要求候选人将一个线程不安全的类改写成线程安全的类,这期间涉及到 volatile,lock, 并发容器,Atomic 原子操作,CAS 无锁编程等,发现只有极少部分候选人给出锁粒度小,并发度高的代码,部分候选人在提示下可以解决,一些候选人则仅能写出一把 synchorinzed 大锁的并发度很低的代码。事实很明显,那些能够给出优秀答案的候选人,必定是有着实践经验,并且深入思考过,真正理解的人,而相反,其他人可能只是临时看了几篇技术博客而已。
白板编程真的有必要吗
白板编程就是在面试现场让候选人在白板上写一段代码,当然白板只是一个代指说法,也可能是白纸上,也有可能是 Google Doc 共享文档里。白板编程外企面试比较流行,国内有些候选人不怎么接受,特别是工作年限较长的,一说要写个代码,求职者就觉得是在“羞辱”他,觉得不应该从这么基础的问起。不过根据我的面试经验发现,这种拒绝写代码的大龄码农,满嘴架构,高可用,高性能,分布式,往往一写代码就抓瞎,代码写的惨不忍睹。所以只要是面试一线技术研发岗位,不管是资深工程师,架构师,还是开发 leader,我都会要求候选人现场至少写一段代码。
哪种类型的题目适合白板编程呢?举一个我之前经常用的例子:
“写一个函数将 ipv4 地址字符串 (仅包含数字,点,空格) 转化成 32 位整数,另外,数字和点之间的空格是合法的,其他情况均为非法地址,要求输出合法地址的 32 位整型结果。”
这个题目不需要任何的算法背景和技巧,纯粹考察候选人的基本编程素质:逻辑思维是否清晰,细节是否考虑全面,是否能写出 bug free 的代码,是否有计算机思维能关注时间空间复杂度等。而且在候选人完成代码之后,我还会要求候选人将代码讲给我听,当然不是因为我看不懂,而是这样还能顺带考察候选人的表达能力,沟通能力,毕竟讲给别人听让别人理解要比单纯自己理解难很多。
除此之外,我个人也不建议编程题目涉及需要记忆的算法,比如被很多人诟病的面试题:写个快排,没有人会天天背诵快排算法,写不出来也理所应当,如果换个问法,比如给候选人讲一下快排的思想,然后让候选人代码实现,测试候选人是否能写出 bug free 的代码,我觉得这反倒是一个比较好的编程题目。
还有,我也不建议面试需要特殊解题方法或技巧的编程题目,比如需要用到动态规划,线段树,Trie 树等高级一点的解题思路,毕竟大家工作中不常用到。
智力问题为什么会收到青睐
我们经常在网上看到说谷歌,微软等大外企经常会面试智力题目,面试智力问题到底有没有意义呢?答案是肯定的,我认为智力问题不在于候选人最终是否能提出标准答案,而在于提供一个话题跟面试者讨论,考察候选人是否是一个有想法的人,是否跟面试官在一个思维层次上,沟通流畅;更重要的是考察候选人思路是否清晰,逻辑推理能力是否够强,信息挖掘能力是否强,总结能力是否够强等等基本素质。
举一个我之前曾经用的面试题目,也是我面试谷歌时被问到的一个问题:新建了一栋 100 层的办公楼,设计一个电梯调度系统,能让大家上下楼都节省时间,这个问题没有标准答案,你会发现不同的候选人回答相差很大,优秀的候选人会不停的挖掘背景信息,定义清晰需求,理清楚思路,通过一步一步严密的逻辑推理计算,合理的假设,让问题变得清晰可解,而有些候选人则无从下手。
我个人认为智力问题最好是比较开放性的问题,一定不要太难的问题,也不要是抖机灵的问题。有很多面试官拿数学难题考候选人,希望 45 分钟答出来标准答案,这本身就是不可能,除非之前候选人已经看过,这样的问题也就没有意义了。比如网上比较流行的“扔鸡蛋测楼高的问题”“沙漠如何背最多水问题”。
当然,智力问题也并不是适合所有的公司。一般成熟型的大公司,对候选人可以接受比较长的培养时间,而且默认聪明的人学习能力都很强,所以对过往技术经验并非特别的看中,所以一般喜欢面试算法,智力问题。对于一些创业型公司,更看重候选人的工作经验,青睐技术多面手,来了就能产出,所以就不适合在智力问题上浪费太多的面试时间。
把面试当做一场技术讨论
筛选候选人就是筛选将来与你共事的人,所以为了更准确的反应候选人在以后的工作中的表现,不妨把面试当做一场与未来同事的技术讨论,在讨论的过程中感受候选人的技术能力。
技术面试就好比打乒乓球,一来一往中感受彼此的技术实力,面试的过程切忌类似与笔试一样的一问一答单向沟通。特别是一些开放性问题,架构设计的问题,本身就没有标准答案,背景又过于复杂开放,如果只是丢给候选人回答,中间没有任何沟通交流和引导,候选人是很难抓住重点展现出面试官心里期望的表现。
比如我们面试过程中经常会让候选人介绍某个项目的架构设计,当候选人讲解完项目的架构设计,如果面试官一个问题都不提然后就跳到其他问题,这种体验对不管是候选人来说还是面试官来说都不是很好的。而相反,如果面试官能一语中的的提出设计中的缺陷,或者追问架构中的技术难点,深入的跟候选人讨论,这样一方面能给候选人充分发挥的机会,另一方面,也会赢来候选人对公司技术的认可。
最后,总结
相信很多工程师随着面试经验的积累,即便没有经过培训,面试工作也可以做的非常好,因为毕竟优秀的工程师都逻辑清晰思维敏锐,也希望本文能给大家在成长的过程提供一点帮助。
作者介绍
王争,前 Google 工程师,现某互金独角兽公司资深系统架构师,核心业务接口平台负责人,毕业于西安交通大学计算机本硕连读专业,关注高性能高可用系统架构,对微服务、分布式系统开发有比较多的项目经验和研究。
报名前端进阶训练营,戳链接>>>http://gk.link/a/10gZJ
报名算法训练营,戳链接>>>http://gk.link/a/10gZK
注:此文章内容整理自极客大学,未经允许不得转载
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。