TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
最近我们公司要招的人比较多,每天都要面上两三个人,从刚实习完的到工作了几年的都有。
我是个不爱照搬考题面试的人,就喜欢直接聊到哪算哪,一般过程是这样的:
1、先介绍下过去做过的项目,负责哪些模块。
这块一般会被当成开场白,因为泛泛介绍一下以后通常还会深入探讨细节。不过有一个人例外,他直接在这个阶段就打动我了。
他当时除了介绍他的项目和模块是干嘛的,还拿张纸给我画了他们的代码业务流程图,从哪个模块调用哪个模块,哪个系统调用哪个系统,先做什么再做什么,还包括了如果哪步出问题,他们是怎么处理的,有条有理,思维严谨,虽然没有涉及什么高级技术,我当时就下定决心这个人要了。后来入职的半个月也充分证明了这是我最正确的选择之一,他总能提前干完还一直缠着问还有没有活干了,比很多老员工效率要高。
2、介绍完毕,我通常会先就对方的项目介绍问清楚项目的来龙去脉,这个项目是些什么人在用,有哪些角色,每种角色能干什么事情。
这个阶段就有人被淘汰了,有的人表达得结结巴巴,不懂如何描述,或者前后不连贯,想到哪算哪,最后对他的项目干嘛用的还是一头雾水。感觉就是个照猫画虎干死活的,我肯定这样的人和产品需求人员沟通一定会出大问题,误会和返工少不了,因为他没法表达清楚他做的项目的业务。
3、开始就他用过的主流框架问些细节。
一般先问持久层,不外乎是hibernate mybatis或者jdbc,用jdbc的,先来解释下他们是怎么开启事务的,统一配好就不管了呢,还是会按需调整事务的特性。工作几年的我一般不再问事务有什么意义,一年以下的我会问事务有什么用,没有会怎么样。结果令我很意外,那些做了半年多项目的实习生们,只有一个人答对了,事务能保证一致性,出错会回滚,其他人都是些什么能让条理更清晰啊,性能更好啊......少年们,事务对于使用数据库的意义就像盐对于炒菜一样重要好不好,做为一个做了大半年增删改查项目的人,请不要老拿:我们就是做功能的,原理不清楚来应付。弄懂事务的意义10分钟就可以了吧。
当然也有人记得那个经典的银行转帐的例子来讲事务的作用,我很刁难地问了一个:如果出帐的帐户和入帐的帐户不在一个数据库里怎么办?然后就没有然后了
然后我会问的一般还有,事务开启了,有什么办法在事务过程中,出了异常也不回滚数据库操作。这个问题答不上来也没关系,因为需要这么干的时候不多,在分布式系统里可能会有这种需要。我主要是观察对方的反应,我最欣赏不知道的反应是立即请教怎么样能做到,最讨厌的反应是说不会有这种需要的,脸上带着一副懂这有什么用的不屑。
hibernate可问的问题还挺多的,但我不会问些什么save和saveOrUpdate有什么区别,我觉得这真是八股,一共就两方法,一个保存不了换一个试试就解决了,百度都不需要。我更想问,怎么样在代码中动态控制延时加载的效果,怎么样用hibernate实现只查一张表的部分字段而不是整个表get出来,这些对开发质量更有实在意义。
其他的问题也不一一描述了。
4、三大框架的高级用法我不会怎么问,我不需要你深入研究透这个框架,当然如果你真的研究透了绝对加分。我更希望你用得清晰,用得明明白白,而不只是“别人这么用的我也就这么照抄了”。
比如对于初级开发人员我有个喜欢问的很简单的问题是,你从你的控制层,调service层的一个保存数据的方法时,service一般会返回什么类型的值。有的人回答boolean,有的人回答String,boolean的我会追问那如何获得保存后的数据库记录主键,String的会追问保存失败以后应该返回什么。这个问题确实太简单了,做法很多,但是我想看的是对方的思考方式是否有条理,合理,而不是逮着什么方便就怎么写。有的新手会对着自己的代码想,这样写好吗,换个写法是不是更优雅合理,有的人却是能实现就行了,让他想想其中的道理时,就真的一头雾水。
这个问题我最讨厌的回答是:太久了,已经忘了。这你都能忘你还能记得什么!你的项目真的是你做的么?
最喜欢的回答:我们封装了一个返回结果的基本类,里面有一些处理结果标识和通用的异常定义,不同的方法会返回不同的子类,子类中定义了调用端所需的各种信息对象DTO。没有人类似这么答过,我自己YY而已。
5、接下来是知识广度,从缓存到集群到分布式调用,nosql,MQ队列,maven、svn,看他们对这些技术了解多少,也许因为项目经历所限,你没机会用过这些技术,但是随便上一些技术网站,都能了解到现在流行什么,这些技术是为了解决什么问题存在的,你看这些技术也说明你注意到了一些问题的存在。视野开阔的人,说明他的求知欲强。也许应聘者很多关于各种技术的回答是错的,但是我能看出来他是想过还是没想过,是有自己的一套认知还是胡说八道。你说错没关系,我们团队里有懂的人,他以后会给你把观点改正过来,但是想都没想过,差距就显而易见。
我隔壁办公室的一个项目经理招人的时候和我最大的差别就在这,他要那些尽可能答得正确的,懂得多的,有经验的,因为他们团队没有架构师,全靠程序员的知识准确性保证质量,他得依赖招来的人的知识准确度。我不缺解决问题的人,尤其不缺依靠搜索引擎就能解决问题的人,我只要你能够思考问题就行。
接下来说说我对各层次的人的印象,我这里是杭州。
新手:在公司呆过半年以上,做过一两个简单项目。
这类有好多都是只会简单增删改查,框架细节不知,java基础的集合也了解甚少,只会用用最常见的两三个,甚至有一半以上说不清request和session的区别,还有事务的作用。
工作两三年的:分化严重,有的思维很清晰,知道自己的发展瓶颈,渴望有更好的项目锻炼。有的日复一日,年复一年,毫无进步,就是一只井底之蛙,熟练地用着自己的三板斧,稍微变化一下跳出熟悉的条条框框,就迷茫了。
研究生:这个有点特别,我一共遇到两个,差别截然相反,他们都还没毕业,一个对互联网大型分布式系统已经很了解,看得出来不但有项目经验还基础扎实,抵得上工作两三年的人,而且有好机会,在大公司实习过,并且表现不错,还想有更好的选择。另一个就停留在很初级的阶段,只能做最简单的增删改查,还是在读研途中报的培训学的,虽然就培训生的水准来说,他学得相当不错,原理常识也基本都懂得,只可惜自我定位不对,要价高得离谱,放弃。
老手:一般三五年以上,有的也是日复一日年复一年,还不如要一两年的。有的就懂得相当多,兴趣已经从如何实现需求有所转移,比如如何管理技术团队,如何提高开发效率,提高代码质量。
最后我得补充,我的面试方式不一定具有通用参考价值,面试官都是各具个性的,有时我眼中欣赏的东西换个地方不一定会被欣赏,我不喜欢的可能有人会喜欢,最重要的,还是自身技术过硬,眼界开阔,思维表达清晰吧。
最后的最后我得说:我们公司招聘已经满员了,不用求报名。
|
|