您还没有登录哦~,登录后才可以查看更多招聘信息,并可以参与社区讨论~, 现在登录
面试题考查应聘者的技术能力
编辑于 2年前
点赞 0
收藏 0 回复 0 浏览 333


    面试观察中发现,很多开发同学平时只注重各种框架、新技术的学习,对于基本功不够重视,然而对于框架的学习,很多时候也只停留在会用的水平,对于框架的实现原理以及框架能解决哪些问题不是非常清楚。日常的开发实践中,很多时候也只是照着现成的代码拷贝粘贴,然后再修改,最终是可以用的。但如果要从头开始,搭建一个完整的项目框架,或者写一些稍微复杂的代码,就完全暴露出真实水平了。



    问题下面是笔者在面试中经常让应聘者手写代码的一个题目。要求如下:



输入:一个带转义字符’’的字符串



要求:删除转义字符’’和它前面的字符,如果遇到多个连续的’’,则删除相同数量的转义字符和前面的字符



输出:最终的结果字符串



举例:输入"abcdghi",期望输出"ghi"



题目本身比较简单,主要涉及字符串操作,但和流行的C语言面试题目strcpy类似,可以从很多细节处考查应聘者多方面的能力。



基本功



下面总结应聘者常见的几类表现,来一一说明。



第一类:做不出来



做不出来分两种情况。



第一种是需求没有理解清楚。



1. 不知道转义字符,认为’’是两个字符,从而把问题复杂化



2. 简单地用字符串的replace操作替换’’字符



这类应聘者在你讲的时候,可能根本没有认真听,放到日常的工作中,可能一件事情要反复讲很多遍,才能达到你想要的结果。



第二种是真的做不出来,可以给适当提示,如果还是完成不了,可能基本功就不过关。



第二类:基本能实现需求



public String stringReplace1(String str) {



if (StringUtils.isEmpty(str)) {



return StringUtils.EMPTY;



}



int index = str.indexOf('');



if (index == -1) {



return str;



}



return stringReplace1(index <= 1 ? str.substring(index + 1)



: str.substring(0, index - 1) + str.substring(index + 1));



}



    这是一个典型的递归解决办法,可以看出对于String类的基本操作比较熟悉。从一些细节上,字符串的判空处理、substring的index处理,都可以看出来应聘者比较细心。我会追问效率问题,还有当输入是一个非常大的字符串时会不会有问题,如果应聘者能考虑到非递归方法和栈溢出的问题,会得到加分。



    技术面试是一个工程师成长到一定阶段后必然要承担的一项工作,优秀的技术面试官能帮助公司筛选出优秀的工程师,并且潜移默化的吸引候选人选择加入公司。相反,糟糕的面试不仅会错失优秀候选人,甚至还会给公司招来大麻烦。尽管技术面试如此重要,我还是了解到,很多公司的技术面试官都是“无证上岗”,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 特性,并且提示候选人越详细越好,以免候选人不能理解面试官的意图,答非所问。这样的问法让候选人言之有物,而且避免机械记忆性的背诵,更能测试出候选人是否真正的理解。





目前还没有评论
作者
嗖嗖课、职题库、智面官等所有的笔试面试求职资料包都可以找我免费领取(微信添加:sosojob)!