首先介绍一下背景
行业:我所在的行业IT很重要但并不是revenue center,属于烧钱部门,地位不能跟纯互联网公司或者游戏公司比
组:我们组最近几年的方向都是招一条龙的程序员,以便减少沟通成本和方便问责。这里的一条龙不但包括技术上写前后端和数据库的代码,也包括在公司内部和用户沟通拿需求,测试,发布部署前后的行政工作。基本上出了问题推都推不掉。
个人:我本人从来没有在国内工作过,所以经验上可能会有所偏差。我一般来说都是第二面,第一面主管已经面过了,简历上的问题问的差不多了,所以我很少会问简历上的问题。除非有匪夷所思的经历。
从最近几年招人的经验中得出的结论主要有以下几点。按重要性排序如下:
1 – 态度
这是我最看重的特质,当然这个态度说的不是对我的态度,而是思考问题和解决问题的态度。
个人来说比较偏好的是对自己感兴趣的领域具备‘打破砂锅问到底’的精神,具备这样精神的人往往有一种完美主义,对于自己的代码有强烈的mental attachment,会自己挤时间不断地fix bugs,增加unit tests或者refactoring,长远来看对项目质量非常有好处,组里有这样的人非常省心。(哎,我干嘛帮资本家去想这些)
这样的面试,我一般直接问candidate你最有自信的技术是什么?然后顺着这个不断地深入挖掘。通过“如果你来设计”这样的假设,来考察应聘者对自己自信的技术到底有何种程度的了解,到底有没有想过这些技术为什么会是这样的。
案例1,我对数据库很熟悉
那么“如果你来设计”的问题就会类似这样:
1,如果你来设计数据库,你会怎么管理文件的? 比如我insert了一行数据到employee表,具体在后台发生了什么事情? 会有什么样的写入操作?有哪些东西会被更新
2,好,现在record已经在数据里面了。我跑一句 select * from employee where last_name = ‘Smith’。你觉得数据库具体做了哪些事情把这一条数据给返回的? 它是怎么从文件系统中把这一条记录给找出来的?
3,假设我的employee表里已经有一些数据了,这时候我加了一个新的column,会发生什么事情? 文件系统中需要做哪些改动?
4,假设我的employee表里已经有一些数据了,这时候加了一个index,又会发生什么事情? 要写入哪些文件,具备什么特性的数据结构?
5,好,现在已经有index了,那么同样的查询 select * from employee where last_name = ‘Smith’ 在执行的过程中会有什么区别?看能不能具体展开解释
6,如果你来设计数据库,你会怎么实现join呢?如果两个表都建了索引是怎么做的?如果两个都没有呢?如果一个表有索引?
7, 等等等等。。。。
案例2,我用Spring用得最熟
1,singleton到底有什么用?我用static method为什么不能做同样的事情? 什么情况下会用static method更好一些?
2,dependency injection到底有什么用? interface在这里的作用到底是什么?
3,好,这么看来,spring确实可能在某些情况下有点用,那么如果你来改善spring的话,你会改进哪些点呢?
4,能不能大致讲讲,你觉得autowire具体是怎么实现的?实际使用中会有哪些问题呢?
5,constructor injection和method injection的优劣比较? 什么情况下用哪一个?
6,spring在unit test中起到什么作用,哪些情况下可以不用spring,给一下具体的例子?
7,如果有一天Oracle想在语言层面支持DI,你会怎么设计syntax?为什么?
8,等等等等。。。。
注意:这里主要考察的是思维能力,看看他有没有想过这些问题,而不要纠结于Sybase或者Spring是否真的是这么实现的。我再重复一遍,不要纠结回答的准确性,关键是这个人的思路怎么样,是不是能自圆其说。
这一部分一般持续20分钟到30分钟,取决于candidate的素质和话题本身能不能聊出东西来。可能因为我的这个面试方式比较少见,感觉许多candidate一开始会比较紧张。这时候作为面试官需要不断地给于正面回馈,让他觉得自己还不错,以便放松下来。当然,如果实在是太差的基本就直接“do you have any questions for us”了。
2 – 经验
这个经验不但包括过去公司里从事过哪些项目,也包括平时都做些什么。因为我的行业关系,我感觉纯大公司流或者纯互联网公司流的都有缺憾。前者过于保守死板沉闷,后者过于激进缺乏质量意识,都比较极端。最理想的是在大公司工作一段时间,同时业余维护一个github项目之类的。这种人一般既比较积极主动,又能理解并遵守历史遗留问题。属于兼容并包的好队友。
这一块一般10分钟,取决于有没有东西聊。
3 – 算法
这个可能会引起争议,算法上只要不是太差就行,毕竟我们日常工作牵涉算法的部分不是特别多。 由于一般我们第三面会有别的同时做pair programming,所以我这边都是大概问一个简单的但是实际的问题。举个例子,给你一列区间,如何把它合并起来?
def merge(ranges: List[Int, Int]): List[(Int, Int)] = ???
伪代码写在纸上就行了。就是看看基本的排序递归的使用。具体排序算法也不是非得写出来。
这一块一般15到20分钟。
4 – 对新技术的热情
最近有关注什么新技术吗?angularjs啊,好在哪儿呢?akka啊,解释解释什么是Software Transactional Memory啊?之类的。因为很多人很喜欢聊这些,也算是给自己充充电。
可能是我个人经历的关系,对新技术的热情是一个必要条件,但并不单独构成一个加分项,我见过很多对新技术很有热情,完全只是因为好奇,想尝鲜的想法。对于组和公司的利益却不怎么放在心上。把组里的项目当成试验场,这样的人最后往往需要其他组员帮他擦屁股。
这一块基本就是闲聊,当是收尾了,5到10分钟吧。
— 完 —
本文作者:庄生
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有 20 个回答,查看全部。
延伸阅读:
如何面试 iOS 工程师?
作为面试官,你主要考察面试人哪些方面的能力?