今天先讲Google的一道面试题,它其实是考察候选人的工程思维,题目是这么说的:
给你两个一模一样的玻璃球。这两个球如果从一定高度掉到地上就会摔碎,当然,如果在这个高度以下往下扔,怎么都不会碎,超过这个高度肯定就一次摔碎了。
现在已知这个恰巧摔碎的高度范围在1层楼到100层楼之间。如何用最少的试验次数,用这两个玻璃球测试出玻璃球恰好摔碎的楼高。
为了便于你理解这道题,我不妨讲两个具体的策略。
第一个策略是从第一层楼开始,一层一层往上试验。 你拿着球跑到第一层,一摔,没有碎,接下来你又跑到第二层去试,也没有摔碎。你一层层试下去,比如说到了第59层摔碎了,那么你就知道它摔碎的高度是59层。这个策略能保证你获得成功,但显然不是很有效。
第二个策略是预测一下,试一试, 你跑到30层楼一试,没有碎,再跑到80层楼一试,碎了。虽然你把摔碎高度的范围从1-100减小到30-80,但接下来你就犯难了,因为你就剩一个球了,再这样凭感觉做试验,可能两个球都摔碎了,也测不出想知道的高度。
这道题好的方法是什么呢?两个球,一个用来做粗调,一个用来做精调,具体做法是以下这样的。
首先拿第一个球到10层楼去试,如果没有摔碎,就去20层楼,每次增加10层楼。如果在某个十层摔碎了,比如60层,就知道摔碎的高度在51-60层之间,接下来从51层开始一层层地试验,这样可以保证不出二十次,一定能试出恰巧摔碎玻璃球的高度。
数学好的读者朋友可以去证明一下这是从统计的角度讲最优的策略,为了照顾所有的读者,我就不占用时间证明了。
这道题和计算机技术完全无关,和产品设计或者市场推广似乎也无关,那么为什么Google要考这道题?其实有两个目的, 一是为了找到聪明人,二是为了判断这个候选人的工程素养。
如果我要问,有一个数字是40.365,比如说天文望远镜的焦距,你怎样达到它?
一般人按照生活直觉,直奔这个数字去就可以了。但是在工程上,这样简单的一个数字并非抽象的,而是非常具体的。
如果是天文望远镜的焦距,你是否会用手把握着望远镜的那个圆筒,前后移动,估摸着镜片之间的距离来调整呢?如果这是导弹发射的角度,你自己是否会用个量角器估算导弹和水平线的角度呢?
显然我们不能这么做,我们必须有一个可以准确达到这个数字的办法,这就是工程的思维—— 不仅仅要知道目标在哪里,还必须设计一个能够达到目标的道路。