软件的实现,是一个从抽象到具体的过程。在开发的过程中,经常出现这样情况,软件从需求到实现的过程中,中间会有多次转述,而不同人的表达能力和理解能力是不同的,最终导致结果往往是客户说:我要一个梯子,最后客户得到的可能是一个秋千。
而在这个场景中,我们面对的主要困难就是没有理解客户的真实需求,即没有明白客户真正要解决的问题。在识别问题的时候,我们非常容易犯两个错误:
被告知要处理一个问题,结果得到一个解决方案,而不是问题本身
被告知要处理一个问题,直觉上就得出一个或几个解决方案,然后考虑方案落地
有这么一个笑话,妻子对丈夫说:老公,把袋子里的土豆切一半下锅。然后,男主人就把袋子里面的土豆每一个都削了一半下锅。女主人真正的是想要做饭,给了男主人一个实现方案,男主人按照自己的理解努力执行了妻子交代的任务,结果,这可能是又一个争吵的开端。
如果相同情景发生在具体项目中的话,得到的结果可能是,每个人都做了大量的工作,每个人都认为自己做的是对的,客户也付出了时间和精力,但是,最后的结果却不尽人意。那当我们面对问题时,该如何识别呢:
识别问题的主语,这是谁的问题
识别这个一个什么样的问题
实际工作中,我们需要解决的大多是别人的问题,因此,识别是谁的问题是第一步也是最重要的一步,这就相当于给问题定义了一个边界和方向,之后我们才能识别这是一个什么样的问题。因为方向错了,很可能不管你花多大的精力去做,最终却是徒劳。
那什么是问题的主体呢,如果你是一个建筑师,有个客户找你说要建一个鸡窝,首先你要理解鸡窝是给谁用的。客户说我:的鸡窝要三层的,带电梯,饮水池,厕所,饮水池要自动判断水位供水,电梯要可以同时乘坐10只鸡。。。滔滔不绝不觉讲了一大堆,客户要表达的意思其实是,这个鸡窝是客户用来自己住的。那既然是客户用来自己住的,怎么会没有卧室呢,这个就是客户潜在需要表达的需求,就像之前的例子女主人最后做出来的菜是需要给家里人吃的。
明白了问题的主体,相当于给问题添加了许多的边界和约束,比如鸡窝是要住的,土豆是要吃的。然鸡窝是要住的,就少不了卧室,既然土豆是要吃的,就需要清洗和削皮。
这时候,我们才能理解真正的问题是什么,再去针对性的思考解决方案。这就带来了其它的问题,很可能客户提供的方案就是有问题或者有缺陷的!对于有些无法解决的问题,我们需要尽快识别,通过其他的解决方案替代或者规避,比如客户说:我们那里有黄鼠狼,一楼就不用盖了,之间盖二楼和三楼。你一合计,这个方案实现不了啊,然后你给客户建议:一楼给客户用坚固的钢筋架子支撑,客户一听,这个也比较合理。
最后,我们再总结一下,识别问题,最重要的是理解两件事情:这是谁的问题,这是什么问题。如果我们对其中任何一个问题不够理解的时候,就需要警觉了,我们对问题的理解到位么?
文章想法的出处,推荐你也看看:http://www.infoq.com/cn/talk-arch