今天聊聊问题,我在工作中会遇到各种大大小小的问题:有的是我产生,有的不是我产生的;有的是我必须面对的,有的是我可以避免的;有的是我了解原因的,有的是我不了解原因的;有的是我能解决的,有的是我不能解决;以上的类型自由组合也就说我会遇到 2 * 2 * 2 * 2 = 16种问题。这些问题都有个共同的特征,那就是都是我能发现的,也就是说我发现了某个地方出现了问题,然而影响更大的是我不能发现的问题,也就是说我以为一切正常,或者存在某个表面问题,其实事情内部存在影响更大的问题但我并没有发现。

1、什么是问题

上面说了很多种问题,我想先退一步,想想什么叫做问题?或者说问题本质的是什么?我觉得问题是一种主观概念,再退一步补充一下,我觉得某件事情的发展就像一个复杂的系统,一切都是按照客观存在的逻辑运行的(所以这就叫唯物主义?),我们的对这件事情的采取的行为就像是往属于这个事情的复杂的函数里传个参数,这个函数运行后会返回一个结果,也就是我们行为所产生的影响。如果我们对这个事情的函数(也就是这件事情发展背后的逻辑)非常了解,那么我们就能采取非常准确的行为从而得到我们想要的结果,而如果我们对这个函数存在错误的认识,那我们采取的行为也就可能得不到我们想要的结果,本质上这种结果和之前的结果都是客观逻辑运行带来的,并没有区别,但是由于不是我们主观上想要的结果,所以我就认为这个事情出了问题,也就是说问题是一种主观概念,本质上是客观逻辑在某种条件下带来的必然结果。当然,还有一种更深刻的问题,存在在我们生活的方方面面,叫做“矛盾”,太祖的文章里讲的很透彻,我这里不敢妄谈这种哲学层面的问题。

2、如何解决问题

在了解了问题的本质后,我们能很自然的想到如何解决问题,就是关键要了解产生这个问题的真正的客观逻辑,然后才能从根本上去解决问题,否则,就算通过一些方法解决了问题,也有可能带来新的问题,就好比是为了隐瞒某件事情撒了个谎,后来为了圆这个谎,不断的撒新的谎。那如何了解真正的客观逻辑?在软件工程里,这方法有时候可能比较简单,就是直接看代码,有时候可能需要划定排查范围,然后将这个范围里的逻辑分成几大块,每块先看成黑盒,了解他们实际的逻辑关系,然后就能排查问题出在哪块黑盒里,在继续将这块黑盒划分成更小的盒黑,找出之间的逻辑关系,直至找到问题代码。

在产品需求上,其实道理也一样,因为合理的产品需求其实也是一套完整的逻辑,而且和该产品的代码逻辑是一种上下层的关系,可以理解为对代码逻辑进行高度抽象就是产品的逻辑。也就是说最上面一层是产品的逻辑,再往下一层就是系统架构层的逻辑,再往下一层就是各个功能模块的逻辑,再往下就是各种方法的逻辑,一直往下就是操作系统的逻辑了。现在来看如何解决产品需求的逻辑,答案也就好找了,就是把出问题的需求,和它的上下游的需求抽象成一个个的逻辑单元,这样就回到了软件工程里的解决问题的方法上了。

其实,还有一种解决问题的讨巧的方法,是基于一个客观规律吧,就是人海茫茫,我们遇到的问题别人肯定都遇到过,只要我们善于搜索,是能找到几个解决方法,我们要做的就是甄别这些方法。

3、更难的是如何发现问题

以设计系统为例,我觉得设计系统就是设计一套逻辑,要找出系统中那些虽然想要的功能能实现,但是总感觉逻辑上有点变扭的单元,重点分析这些单元的内部逻辑的同时,还要跳出来站在整个系统的角度,反思这个单元在整个逻辑链上到底应当起什么作用,它应该充当的本质是什么,再回到单元内部,看看我们的实现逻辑的本质是不是和它应当充当的本质相符,如果不符,可能我们就是在用一种trick的方法“巧妙”的实现了我们想要的功能,这其实就会带来潜在的问题,至于原因,我在我之前的文章《产品思考》里面的判断需求是否合理的第一点讲的很清楚。

至于如何发现技术之外的问题,我觉得要首先要明确当前面临的主要矛盾,然后分析当前情况下,哪些事情是不利于或者在加剧这个矛盾的,那这些事情就应该是我们遇到的问题了。但是这里的前提条件就是能明确当前面临的主要矛盾,这本身就是一个更高级的问题,所以,那如何发现这个更高级的问题呢?在有的比较单纯的场景很容易发现这个高级问题,但是在稍微复杂的场景就很难,以我的水平当然不知道啊。