首页 > 笔经面经 > 一次fail的技术面试使他得到5个Offer(3D视觉招聘)

一次fail的技术面试使他得到5个Offer(3D视觉招聘)

头像
走神儿-梅卡曼德hr
编辑于 2019-12-09 14:46:49 APP内打开
赞 2 | 收藏 1 | 回复0 | 浏览3690
以下是我整理的一份web开发岗位的面试经验,其中最精彩的部分是招聘公司给予了这位求职者非常详尽的面试反馈。针对面试问题、求职者答案,甚至是求职者的思考过程(思路是否最优,解决办法是否高效)给予了相当详实的剖析,以解释最终无法给出offer的理由。
即便是一场fail的面试,但是就像武侠片里十年磨一剑的隐士突然现身,和世外高人对垒的精彩场面一般,针尖对麦芒,双方都对彼此负责地进行交流,不是比一个简单顺畅的offer更有趣,也更锻炼人嘛?

- 正文 -

前段时间,我拿到了我人生中的第一个前端工程师的onsite。
都说第一次面试没有“好下场”,我也不例外。
虽然结果让我沮丧,但我还是痛定思痛,仔细回忆并记录下了整个面试过程,然后总结了经验。在这之后,我成功拿到了其他5家公司的offer。
以下,就是我当时面试过程的全记录
面试那天,我准时到达面试地点,在楼道里遇见了面试官,寒暄后我被带到一个会议室里。
面试的最开始还算顺利,都是关于soft skills的问题
面试官先是让我自我介绍一下;然后问我觉得编程最困难的部分是哪,以及我想学习什么样的技术、想教给别人什么样的技术等等。
随后,技术面试部分正式开始(我分为5个部分还原全过程如下)
Part 1
讨论我的“家庭作业”
来onsite面试之前,公司给我布置了一个任务,让我做完再来面试,我把它称作我的“家庭作业”。
任务是这样的:给定一组数据,通过分页的形式把它们显示出来。(create pagination for a dataset, and display it in a list)
我是用React完成这个功能的。在技术面试的最开始,面试官和我一起浏览了我的“家庭作业”中的代码,并进行了讨论。
我被问到了如下的问题:
1. 什么是单元测试(unit testing)?代码的哪一部分可以进行单元测试?
老实说,回答完我就觉得我答错了,我不记得我具体回答了什么(我好像跑题答成了integration testing相关的)。
正确答案应该是:单元测试是一段代码,用于验证源代码的单元或特定部分是否执行其预期目的,且没有副作用。
2. 你会如何改进这个程序?
这个问题其实是我“家庭作业”里已经写过,我还纳闷面试官是不是没看过我写的答案。
但马上,我就悟出来面试官一定是想听到我更详细地解释,于是我详细说了我作业里的***括:错误处理,移动优化,加载Ajax时的用户反馈,以及在数据量比较大的情况下的页面管理等。
3. 什么是BEM?你写的代码里用了BEM吗?
我是这样回答的:BEM是处理CSS项目的命名约定,是Block,Element,Modifier的缩写。
我还回答说我在CSS类命名中受到BEM的启发,但它并不完全是BEM,因为它没遵循BEM的全部规则。
4. 你如何让这个页面适合移动端(mobile friendly)?
我的回答围绕 “CSS 媒体查询(CSS Media Queries)”展开。然后面试官问了我会如何处理媒体、如何使网站响应等细节。
以上就是围绕“家庭作业”的面试阶段,我感觉自己做的大体还可以。

Part 2
挑战来了:现场编程
接着,就到了本次面试最最激动人心的现场编程的环节。面试官让我实现一个根据names和numbers排序的算法
在动手写代码之前,我问了面试官一些问题,其中一个是:我是该用JavaScript sort function,还是构建我自己的function(后面我会细说,问这个问题简直是血的教训)。
数据的存在形式是一个数组,其中包含了若干个子数组,每个子数组又包含了20个objects。
我提出了以下算法:
1. 将所有子数组合并成一个新的数组。
2. 对新数组进行排序。
3. 然后再对新数组进行分页处理。
思路有了,就得开始写代码了。通过事后的反思和总结,我总共犯了这样几个错误:
失误1. 我在合并数组上花了太多时间
当时我几乎紧张到脑子一片空白,脑子有些乱。明明有更简单的方法去合并数组,我却用的是特别复杂的方法:
失误2. 粗心大意,没考虑到细节
完成了提取包含所有数据的数组,我就准备写个用来排序的逻辑。
可是代码写到一半,我卡住了。

此时,数组中的大多数names都已正确排序,但在顶部的还有一些names没被正确排序!
说实话当时我紧张的脑子就是一团浆糊,不知道该怎么办。
在面试官的提示下,我终于想起来,字符串按是按照ASCII值排序的。大写字母的值是从65到90,小写字母的值从97到122。在顶部那些未能正确排序的地方,首字母是大写的,因为大写字母的ASCII值低于小写字母,因此会首先对它们进行排序。(这个错误我发誓我这辈子都不会再犯第二次,简直印象太深刻。)
明白情况后,我立即使用 “.toLowerCase()” 解决了问题。
终于,要迎来最后的一步:Passing the sorted data into the pagination function.
但就在快要大功告成时,我发现我……又……卡……住……了……
失误3. 急于求成,步骤混乱
这时我又发现,分页函数需要一个Ajax响应作为参数,并将这个参数的每个元素经过formatData函数的处理后返回。
但是,当我把处理完毕的数组进行返回时,它的original property names不见了!而且函数还出现了错误。
强忍住内心的崩溃与绝望,理智告诉我,深呼吸,接着搞。研究了一会儿后我发现,我应该在调用分页函数之前调用formatData
虽然又浪费了时间,但终于把问题给解决了。
算是费了九牛二虎之力,技术面试在我出了一身汗的情况下结束了。身体已经被掏空。
Part 3
收到拒信
在回家的路上,我就知道我完蛋了。
但是,我还想最后挽回一下。于是,我花了3小时,把我面试代码中,我能想到的、需要改进的地方,通通以邮件的形式发给了面试官。
不过没过多久,拒信还是来了:
Part 4
面试反馈与错误反思
虽然被拒绝了,但面试官还是很nice地给了我一份详细的面试反馈,这里我也跟大家分享一下:
Piece of Feedback #1:
我的面试官写道:
“面试者不熟悉如何组合数组,我给了他一次查询机会。但面试者却没有选择去查JavaScript手册(比如w3schools或MDN),而是选择上网搜索,并错误地使用了网上搜来的示例(array.concat返回一个新数组)。
没有人能记住API中的所有内容,因此熟悉使用JS手册类工具很重要。”
我的反思:面试官期望看到你能熟练使用JS手册类工具。
Piece of Feedback #2:
面试官写道:
“在排序任务中,面试者首先使用了一种奇怪的手动算法。幸运的是,他选择了在JavaScript中使用内置的排序功能,但面试者不确定内置排序功能是如何工作的,面试者查阅相关文件过于频繁。”
我的反思:在面试沟通中,要把话说清楚,保证沟通的准确性。在面试过程中,我询问了面试官是该用内置的JavaScript排序函数,还是构建我自己的函数。我当然没打算去自己构建函数,我的本意只是想让这个问题更清晰、我能更清楚地了解面试官的意思,遗憾的是,面试官误解了我的意图,而我还浑然不知。
Piece of Feedback #3:
面试官写道:
“当代码运行时,文本会因‘区分大小写’而排序(case sensitive),这是一个经典问题(classic scenario)。不幸的是,面试者在这一问题上停留太久,不过当面试者意识到错误时,他立即纠正了错误。”
我的反思:解决问题的速度至关重要。 编写程序时总会出现错误,但尽可能快地解决它们。 找到问题的本质,如果你无法弄清楚,请迅速去查资料。
Piece of Feedback #4:
面试官写道:
“面试者花了一些时间来理解为什么需要在分页函数之外调用formatData。”
我的反思:同样,解决问题的速度至关重要。
Piece of Feedback #5:
面试官写道:
“很多foreach循环,都使用了array.map或array.reduce。 了解更多函数式编程(functional programming)是有益的。“
我的反思:学好array.map,array.filter和array.reduce也是很有用的。这是一项艰巨的任务,虽然你不需要学习全部相关内容,但你要确保掌握基础知识。扎实的编程的基础是基石。
Piece of Feedback #6:
面试官写道:
“面试者需要对单元测试有更多的了解。”
我的反思:重要的事情重复三遍:测试很重要。 测试很重要。 测试很重要。 学会并学好使用它。
Piece of Feedback #7:
反馈邮件剩下的部分是一些表扬的话,意义不大(而且你看了别笑),也放在这里给大家作为参考:
面试者能熟练使用编辑器
面试者在Chrome中使用调试器(了解高级调试工具很重要)
面试者在继续编写代码之前,会检查已完成代码是否有效(使用console.log)
面试者会将代码分成较小的逻辑部分
面试者使用带有名称的变量,而不是带有注释的变量,这使得代码更具可读性
面试者拥有拥有除编程能力之外的其他积极品质

Part 5
如果重来一次,我会怎么做?
1. 更透彻地去研究公司布置的任务
有一些公司,会在面试前几个星期,给你布置一些“家庭作业”。在onsite前,一定要好好复习你在“家庭作业”中写的答案,以免时间太久而忘记细节。
此外,别单纯地做完“家庭作业”就算了,得从中去举一反三,彻底了解“家庭作业”里你写出的代码、以及相关知识和延伸知识,这有助于你更好地在面试上发挥。
2. 做一些有实际意义的项目
我在面试前做了很多理论准备工作。 理论工作固然重要,但是解决实际问题的能力更重要!杜绝纸上谈兵,多接触一些实用的项目,练习自己JS在实际应用中的能力,是必须的。
如果平时缺少实战练习的机会,除了网上的一些内容,也可以考虑优质的培训课程。
3. 打好基础+拓宽知识面
好的编程基础是一切的基石。技术面试对新手来说的确不容易,需要克服内心的紧张,需要在舒适区外保持冷静,如果你有足够牢固的基础知识,则可以避免犯一些初级错误。
此外,拓宽知识面,就算懂得不是十分深入,也可以让你自如应付面试官抛出的问题,减少紧张程度。
4. 面试是可以练习和提高的,多看mock interview
每次onsite技术面试,就像被剥了一层皮,整个人被抽空,是智力和体力的双重挑战。不过,面试就像考试一样,可以准备,可以练习,可以取得经验,从而提高
你可以事先找朋友帮你做mock interview,也可以选择优质的培训机构和课程来助你一臂之力。
看了我的面试过程和总结,机智的你是否得到一些启发呢。
后来,我又针对自己的不足去加强,然后经历了无数轮的技术面试,一次比一次感觉好,最后,我拿到了5个特别满意的offer。
所以,只要勤加练习,不断努力,大家都会拿到梦想中的offer。加油!

- 完 -




你以为这只是发生在发达国家、全球500强里的理想化情景吗?不,我们梅卡曼德机器人就可以最大的诚心给予面试者最高的尊重,我们技术面试同样会有细节反馈——只要你问,我们一定会答。


面完试心灰意冷了?没关系,如果你现在没准备好,我们给你们时间锤炼自己,过几个月再谈一回,我们不放弃任何一个有潜力也有好态度的人,这才是真正在诠释我们的企业文化。


想了解这篇震撼人心的面试经验的出处和背景?欢迎联系我交流:梅卡曼德机器人的HR ,微信号 531532409


作为3D视觉+AI领域的进军者,梅卡曼德拥有一支十分高素质的管理和研发团队。CEO本科就读于清华,硕士就读于慕尼黑工业大学机器人相关专业,并以最高成绩等级毕业。研发负责人为清华博士,其他研发同学多为985、211、外国名校背景的硕士研究生,院校背景包括美国密歇根、卡耐基梅隆、上海交大、西安交大、电子科技大学等。
我们是一家年轻的创业公司,背靠全球五百强【英特尔】的强大背书,以深度学习和传统计算机视觉技术研发高性能的3D视觉工业相机。
成立至今,梅卡曼德多次参加国内外(如德国汉诺威、日本)最高水准的工业博览会,凭借出色的产品性能获取了客户的广泛好评,并已在海内外获得大量订单。
每一次成就之后,从不止步。梅卡曼德永远把目光投向远方更强大的竞争对手,目前正在积极部署日韩欧美等全球化市场,成为中国科技公司出海的积极力量。

公司正在积极招聘深度学习、计算机视觉方向的算法工程师,项目应用工程师,视觉软件开发工程师,嵌入式软硬件工程师,光学设计师等多个岗位


看上我们了?
就投个简历聊聊

0条回帖

回帖
加载中...
话题 回帖

推荐话题

相关热帖

笔经面经近期热帖

近期精华帖

热门推荐