前两天同事接了一通电话,然后在部门群里提出一个在电话里对方问他的问题。

有10瓶无标签试剂,其中9瓶是盐,1瓶是化学品,该化学品放入水中10分钟后会变色。且无论是否与盐放在一起都会变色。问,最少用多少瓶水可以在10分钟内找出该化学品。也就是一次相溶就需要找到化学品。

在半小时内,大家给出了不同的答案,按照软件开发的方式,我将其分类如下。

敏捷之道:9瓶水,这是最容易想出来也是速度最快的办法。如果其中有一瓶变色,则是该化学品,如9瓶水均无变色,则没放水里的是该化学品。这是最快速解决该问题的办法,但却不是最优的,水资源浪费较大,属于排除法。


迭代之道:6瓶水,这是比较中庸的办法,在速度和数量之间取一个平衡。计算方法是
将10瓶编号,剔除第10瓶。123,456,789,147,258,369。各混成一瓶,取交集的方式考察出化学品,如123和147变色,则1号必然为化学品,以此类推。该方法在提问10分钟后提出

瀑布方法:4瓶水,这是最节省资源的办法,但是论证过程是最慢的,用二进制将各瓶水编号0001-1010,然后取二进制不同位的排列组合。该方法提出是最慢的,在20分钟后提出。

可能有人不太明白这个的计算,我把这个计算方法画成图就明白了。

试剂按0-9的二进制编号,0000 - 1001

0 | 0 | 0 | 0 ---> 0
0 | 0 | 0 | 1 ---> 1
0 | 0 | 1 | 0 ---> 2
0 | 0 | 1 | 1 ---> 3
0 | 1 | 0 | 0 ---> 4
0 | 1 | 0 | 1 ---> 5
0 | 1 | 1 | 0 ---> 6
0 | 1 | 1 | 1 ---> 7
1 | 0 | 0 | 0 ---> 8
1 | 0 | 0 | 1 ---> 9

将各个位上为1 的试剂加入1瓶水中
9,8 -->
7,6,5,4 -->
7,6,3,2 -->
9,7,5,3,1 -->
共4瓶,可检验出



歪门邪道:9滴水,将9滴水分别滴入9个试剂瓶,以破坏试剂的方法找出那个是化学品。这其实是最节省资源的办法,但是产生的效果是破坏性的。所以,其实这是个办法,但是不是最好的办法。不过不能说其是错的,目标是找出化学品而不是保留化学品。当然,能保存当然是更好。

这种问题,用什么办法解决都是对的,但是在成本考量,需要实验者通盘考量,按照我个人的理解,敏捷的方法是最能快速响应机会的。但是目前我们对机会的理解过于焦躁了,某一种产品,谁先推出就是谁的这种概念似乎已经深入人心。但是很多案例也能看出,有很多外在环境影响,并不都是这样。举个例子,京东的模式在我看来其实是在重复当年E国的方式。但当时物流业并不如现在这般发达,导致E国的物流成本超出了企业可承受范围。所以,如果想做一个半年一年生存期的产品,敏捷开发就足够了,如果画成波形图,从波峰到波谷的角度可能会是非常陡峭的。瞬间成功,瞬间失败,因为这种办法是最不用动脑子的,而且资源浪费是较大的。

而迭×××法,看上去是比较中庸的,虽不是最节省的,也不是最快速的,但是相比最节省的和最快速的,其成本在可控范围内,且开发时间介于敏捷和瀑布之间。不过相比敏捷,对开发人员的要求就高了一些,需要掌握一定的技巧。所以,看上去,迭代的办法是比较合理的。因为其速度可以达到比较快速的响应,且执行速度和算法是比敏捷要优化。

作为一个程序员,我觉得瀑布方法是最好的,最节省资源,但是我不是老板,我说了不算。如果碰上一个只要求上线速度不要求软件质量的,千万不要用瀑布方法。其论证过程也就是前期准备过于复杂繁琐,虽然软件质量是最高的,但是很有可能让人错过这个机会。但是我个人觉得,其开发出来的软件生存周期应该是最长的,大多数情况。不过也要求开发人员具备的基本素质和技巧是最高的,对于软件管理者来说也是要求最高。

逆向思维是个解决问题的办法,却不是软件开发的管理方法。逆向思维往往是一个问题的很好的解决方案,作为领导看来,只要能解决问题,比什么都重要。我不管你用什么办法,只要你能解决就可以了。前提是,不能破坏别的东西。

----------------------------------------

对于程序员来说,数学的能力真的很重要。

代码工:9瓶水,不考虑太多的情况,只要解决问题即可。

程序员:6瓶水,这就是程序员比代码工拿工资多的地方,程序员会思考一个比较优化的办法,由于经验或者知识面还不够宽的缘故,暂时考量不到更高级的算法。

架构师:4瓶水,架构师拿到问题,总会想到最优的解决办法,开发速度有可能慢于程序员和代码工,但是其工程质量是最高的,执行速度也是最快的。且从大局看是最节省公司的资源,虽然有时候架构师也会选择程序员的办法。

项目经理:瓶子管理员,程序员提出需求,项目经理协调水龙头资源。

简单的类比,供参考。