然而这还不够,我们还要精益求精。Pair programming (结对编程)是我最喜欢的一种工作方式,可以协助我们更快地完成工作。你需要向同伴解释自己的思路,当你累了还可以得到同伴的帮助。所以,我找到 Stephen Best 来一起解决这个问题。前20分钟我们没有安装工具,而是做出问题草图、搭建测试环境等等。我们假装是在面试环境中解决这个问题。
我们所有的基本操作都已完成,并具有良好的测试覆盖率。我可以指出实现 List 所必须的但 Java 类型系统无法支持的部分,这些部分留给实施者去实现就好。我们没有做范围检查的接入,当你查询任意位置的元素时会报空指针异常,而不是提示范围错误。我们跳过这部分是因为这不是必要的而且我们时间有限。
我想象不出那些初级开发人员在遇到这样的问题时脑袋里会想什么。这是一个 Ruby 的开发岗位,我搞不懂为什么让一个新人去实现如此复杂的接口。当然,很多面向对象的想法可以从 Java 移植到 Ruby,也许这才是面试的侧重点。我和 Stephen 能够承担这项任务的唯一原因是我很熟悉如何构建 Java 通用系统。当你写出如下代码时:
private A reduceNodes(A accumulator, NodeCallback callback) {
其中涉及一个类类型参数、一个方法类型参数和一个匿名回调接口,好像并没有用到 Java 语言。这个命令可以让后面的实现更简单直接,在面试中这样做的话,我很确定面试官一定会很困惑。如果 Stephen 和我这样解答的话,可能无法通过这次面试,这是个危险信号。
继续上面的话题,这究竟说明了什么。这是一个压力面试,面试官给出一个问题,而很显然求职者无法在规定的时间内解决。再次重申一下,我很肯定没人能在 30 分钟内实现 List 链表。这很不公平,那些擅长某种思维的人才会被过滤掉,因为平常很少有程序员会遇到这样的测试。更糟的是,这会打击很多人的信心。下一节中,我们将探讨一下这样给初级开发人员带来的影响。