最近要招一名中高级程序员, 有位同学的面试表现我们几位面试官都觉得不错: 思维很活跃, 知识面也还挺广, 尤其是主动提及最近还在研究Disruptor这个高性能框架, 并说出了基本实现原理, 表现出喜欢钻研技术的态度. 唯一的缺点就是逻辑思维不太缜密, 工作经验只有3年多. 但我们都觉得稍加培养他就能快速上手工作, 于是就把他招了过来. 毕竟目前我手头的项目,都是业务驱动型的互联网系统--业务不太复杂, 技术难度也不算太高.
谁知该同学在试用期的表现让我们大跌眼镜: 他跟同事沟通没有任何问题, 能清楚的表达自己的想法, 也能理解简单的业务需求, 但就是无法根据简单的需求做出对应的技术设计, 同样也不能根据技术设计做出代码实现, 开发速度比同等级程序员慢几倍不说, 写出的代码也是bug百出. 无奈之下, 只能让其试用期过完后离职.
之后我开始反思这次招人经历, 暴露了我们面试中存在的两个问题:
缺少全面考察程序员动手能力的笔试过程.
低估了逻辑思维严密的重要性.
对于程序员来说, 能将需求转化为代码实现的能力和写出健壮程序的能力恰恰是最基础的能力. 而我们面试时, 过多的考察了表达沟通能力和知识广度深度, 却缺失了对程序员最基本能力的考量. 结果招来了"眼高手低"的程序员.
那如何面试才能筛选出实战能力强的程序员呢?
我觉得除了基本的面试(项目经历的考察)之外, 还需要设计一些偏实战性的笔试题来测试程序员的能力.
以下是我为此设计的笔试题目之一:
题目1
现有遗留系统S1, 其关系数据库D1有一张表Table T1 , T1用户数据样例如下:
用户ID | 积分 | 修改日期 |
---|---|---|
1 | 20 | 2016-12-23 10:55:33 |
2 | 49 | 2015-09-12 11:11:23 |
3 | 60 | 2016-10-22 23:55:55 |
S1的主要业务为查询,修改和插入用户数据.
S1在线上运行, 目前T1每天大约会插入20万条数据, T1当前数据总量为5千万, 插入速度较慢.
由于业务发展需要, 需要开发新系统S2, 用来替换遗留系统S1.
S1的用户数据T1需要全部迁入到S2的数据库D2中, 并添加新的业务字段"用户等级","状态".
D2中用户数据样例如下:
用户ID | 用户等级 | 积分 | 修改日期 | 状态 |
---|---|---|---|---|
1 | 1 | 20 | 2016-12-23 10:55:33 | 1 |
2 | 1 | 49 | 2015-09-12 11:11:23 | 0 |
3 | 2 | 60 | 2016-10-22 23:55:55 | 1 |
其中"用户等级","状态"可通过以下逻辑确定:
用户等级1: 积分<50
用户等级2: 积分<100
用户等级3: 积分>=100
状态1: 修改日期 >= 2016-10-00 00:00:00
状态0: 修改日期 < 2016-10-00 00:00:00
问题1: 为了应对数据的增长速度, 减少业务响应时间, 请设计新系统S2的数据库D2, 并给出具体实现过程.
问题2: 假设S2已开发测试完毕, 请结合电商系统的日流量分布情况, 给出系统S2上线替换系统S1的方案, 列出详细实施步骤.
问题3: 假设S2的数据库D2为Mysql, D2采用针对问题1调整后的表结构保存用户数据. 请写出迁移程序, 保证在1个小时以内完成数据的迁移(所有用户字段都需要填充完).
这个笔试题比较偏实战性, 给定了一个特定的场景, 和需要解决的3个问题.
问题虽然简单, 但依然能暴露出不少面试者在思维和动手能力上的问题, 比如:
对问题1来说, 有些人能提出mysql分表, 但无法给出分表实施细节. 有人能给出mongodb自动分片方案, 但不了解如何实施自动分片.
对问题2来说, 不少人没有考虑到迁移时的数据完整性问题.
对问题3来说, 这是需要手写代码的问题, 很多动手能力差的程序员都没能写好并发处理的线程调度逻辑, 同样经验欠缺和逻辑思维不严密的程序员很多都没意识到mysql分页大偏移量带来的性能问题.
那如何评判答案呢?
如果面试者不能给出基本的解决方案, 直接pass.
如果面试者能给出基本解决方案, 但需要在面试官的指导下才能意识到自己方案的不足. 对于5年以上的程序员直接pass. 对于5年以下程序员, 如果他能在指导下给出方案的改进措施, 并能写出步骤, 则可以酌情考虑.
如果面试者能给出基本解决方案, 能主动发现方案中的不足, 指出需要改进的点, 并能写出改进措施的详细步骤. 说明该程序员的逻辑思维和动手能力都非常不错. 是很好的备选人员.
如果面试者能直接给出优化后的方案, 甚至给出不止一种解决方案, 同时能将细节用笔写出来. 则说明他是一名非常有经验和动手能力较强的程序员, 是不错的人选.
总之, 对于中高级程序员职位的面试, 用于衡量动手能力的笔试环节仍是不可或缺的一个环节.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。