再来说说上面的第2点,综合代码组织的能力。如果我们再站高一点看,其实好的代码都不一定非得是面向对象的,即便是过程式的代码,一样可以做好模块化、解耦,因此本质上我们考察的重点是候选人综合的代码组织能力。
另外,这样的面试也需要对编程语言的许多语言特性有准确的认知。比方说,如果面试题目明确指出了要求面向对象的方式来完成实现,那么除了代码设计层面,我们也能看出候选人对于封装、继承、多态等等一些现代编程语言基本特性的理解如何。
无论这一轮面试关注于上面说的哪一点,都要像我们前几讲介绍的那样,专注于具体问题的解决,即和候选人一起使用这些技能和工具解决实际问题,而不是单纯地做设计原则和设计模式理论和概念的问答。
事实上,**面向对象考察中,我观察到最常见的误区,恰恰就是纠结于设计模式。**说到底,代码层面的设计,最终目的是为了代码具备更好的可读性、可重用性和可扩展性。
因此,分层清晰,做到了良好的模块化、做到了合适的解耦,又留下了一定的扩展能力的代码,往往就已经是好代码了,不一定非得扯上某个著名的设计模式;反过来也一样,即便能够准确地说出某个设计模式的定义,它也不能作为对于代码设计能力的有力证明。
### API设计考察
现在对于很多大厂来说,业务都分得很细致,那么每一个团队往往都要维护若干个service,并且将业务能力通过API的形式暴露出来。在这种情况下,API的调用方就是团队的用户。
因为API的设计能力显得举足轻重,所以针对它的考察能够从相当程度上,看出候选人是否在代码接口和客户端与service的交互方面有一个平衡的理解。前者是对代码的理解,而后者是对系统的理解。
比方说,还记得[第7讲](https://time.geekbang.org/column/article/364712)中谈到的网约车系统吗?对于其中的Ride Service,我们就可以引导候选人完成类似如下的API接口设计表格:
假如说我们把这个提供API的模块当作一个黑盒,当它所有的API都已经清楚了,我们对于这个黑盒的功能,以及这个黑盒的用户怎样和它进行交互,这两件事情也就非常明确了。
上面这个API的设计,是从HTTP协议,或者说是从REST服务的角度来描述的,对于不符合这种情况的,或者候选人不熟悉网络协议,我们也可以简单从编程语言代码中方法签名的角度描述,说清楚方法的作用,入参、返回值和数据结构,以及常见的异常种类,其本质是一样的:
```
Response createRide(Request req);
```
### 测试能力考察
测试能力的考察,在某些北美的互联网大厂中更为常见。比方说,Google的工程师面试loop中,经常会单独放一轮由测试工程师主导的测试能力考察面试。
你可能会好奇,为什么这些大厂格外重视这点呢?
这里面的初衷是这样的,测试能力是对于一个具备全栈能力的工程师,所必须包含的一项重要素质,而这些企业的大多数负责开发的工程师岗位,都不会再匹配大量的测试工程师来完成项目,因此需要开发独立完成测试。
说白了,就是自己写的代码要自己测试,自己上线,自己oncall和修复问题,完成闭环。
对于测试能力的考察,有两种常见形式。
**第一种形式是针对已经完成的代码,做白盒测试。**面试官会期望候选人,能够拿着简单的测试用例来走一遍代码。之后也可能会提问,怎样设计测试用例才能将刚写的代码覆盖到,甚至要求写一小段单元测试代码,这是属于白盒测试。
白盒测试一般时间需求比较少,适合结合在每一轮包含编码的面试中,在编码完成后进行拓展。这种形式除了对于测试本身的考察,对于候选人在代码层面的理解也有着很明确的要求。
**而第二种形式,则是黑盒测试。**对于某一个产品,或者某一个功能特性,从黑盒的角度讨论,怎样才能做好它的测试。黑盒测试主要出现在单独的测试能力考察轮次,这种形式除了对于测试本身的考察,也要求候选人在系统和产品的层面有一定的理解。
举例来说,一个经典的黑盒测试能力考察的面试题是:
>
如果你负责Google Map地图的设计,系统给出了从A点到B的通行路径,你计划做怎样的测试,来保证从A到B的路径这一结果是合理的?
两种形式,黑盒白盒虽然差异很大,但是很多独立完成测试的工程师所需要的重要素质,比如问题场景的分析能力和用例设计的能力,其实都覆盖到了。
### 项目与任务管理
我们再来说说项目管理与任务管理方面的考察。在很多大厂的面试中,有一轮经常是由PM来负责的,这个PM有时候是Project Manager,更多时候则是Program Manager,他们会比较关注项目、任务和软件工程的流程方面。
最常见的考察方法是问经历,即直接了当地询问候选人,当前团队中,项目是怎样管理的,产品是怎样上线的,任务是怎样管理的,优先级又是怎样排的。其中很大一部分都可以用询问行为型问题的方法来操作,而这部分我们将在后面重点介绍。
好,上面介绍了一些常见的工程技能的考察类型,但是还有一些其它类型我并没有逐一展开来细数,比如针对产品思维的考察,一些在招聘团队中的产品经理很喜欢这种形式,抛出一个问题,和候选人一起挖掘用户的痛点,从产品角度讨论设计等等。
## 行为型问题
最后我想介绍一下行为型问题(Behavior Question),这是一种非常流行的非具体技术考察方式。这种方式不光很多重视价值观、领导力的大厂愿意采用,其中很多招聘团队中的Hiring Manager更是特别热衷于它。
### 概念与逻辑
首先,我们必须要弄清楚一个概念,什么是行为型问题?
**行为型问题基本上是一类用来观察候选人过去在特定的工作情境下,是怎样解决困难并取得成功的问题。**
这里要求候选人所描述的情境,包含的内容非常广泛,可以是与内部同事之间的,可以是与外部客户之间的,可以是关乎项目和任务的,可以是业务决策方面的,也可以是具体技术实现上的。
无论哪一种,**这里面的逻辑是,候选人在过去遇到困难的时候,遵循的逻辑和采取的行为,这相当程度上反映了未来候选人将怎样应对类似的困难。**
如果你还觉得不太清楚的话,可以看看下面这个行为型问题的例子:
>
你能否告诉我一个实例,让我了解你在工作中是怎样说服同事,采纳你的技术决策的?
从这个问题的回答,我们能够看出很多内容,譬如说,对于不同的技术决策,候选人是根据怎样的标准来评估优劣的,候选人是怎样和同事沟通的,等等。通过这样的问答方式,面试官可以看出候选人的许多品质,比如这个例子中,候选人对问题的分析思考能力,和同事的交流沟通能力,以及是否具备backbone(不轻易动摇)等等。
再比如下面这样的例子:
>
你在工作中是否遇到过不同意你主管(经理)看法的时候?你又是怎样处理的?
对于预先订立的项目目标,你有没有遇到过未能按时实现的情况?
对于在你做过的项目中的软件设计,有没有事后你觉得自己做错了的?
总之,**对候选人的性格态度、沟通方法、处事风格等等与团队文化密切相关的要素,我们可以通过行为型问题做比较有针对性的考察,可以说这是对技术层面考察的一个非常必要的补充。**这样的形式并不需要花很多时间,非常精心地准备技术问题,而且讨论非常自由,对于没有工程师技术背景的面试官,更是可以比较顺利地采用,因此这种形式还是比较流行的。
## 总结与思考
在前面几讲介绍了针对软件工程师候选人的算法和数据结构考察,系统设计考察之后,在这一讲我讲解了一些其它工程技能的考察路径,并对于非常常见的一种非技术范畴的考察方式——怎样问行为型问题做了解读。
我要特别给你强调的是,行为型问题很有价值,但是我们还是要保证整个面试过程中,大部分的时间,还是要放在软件工程相关的技术考察方面,这一点我在[第2讲](https://time.geekbang.org/column/article/360268)的计划制定部分已经说过了。
今天的主要内容就是这些。我想在最后留下一个问题,你能否在留言区和我一起讨论——在你的经历中,都有哪些我们没有介绍到的面试考察形式呢?
好,我是四火,我们下一讲见!