解决问题的方法
作者姓名:钟华锦
作者职业:程序员
马克思:物质之间都有联系
知识就是用语言描述物质之间的联系。对物质世界的联系(知识)的描述就是把有关联的词组织在一起。问题的答案本身就是一种知识。所以解决问题的过程就是寻找有关联的词并把它们组织在一起。解决问题就像是一种文字游戏。
目前比较流行的思维模式比如结构性思维、思维导图、金字塔原理等都不是从探索解决不了问题的根本原因的角度出发而发明出来的,我认为它们共同的特点是使用树形结构组织熟悉的知识,通过对现有的比较熟悉的知识的有效组织来提高解决问题的效率。但是它们都不能用来挖掘出那些和答案有关,偏偏又不那么熟悉的知识,而往往就是因为不熟悉而忽略了这些知识从而导致解题失败。所以我认为这些方法都只是优等生用来锦上添花的方法,并不能给天生没那么优秀的人雪中送炭。
前言
解决不了问题
本身就是个问题,有没有方法可以解决解决不了问题 这个问题?目前流行的思维方法似乎都没有回答这个问题,本文尝试着给出一套方法,这套方法基于对解决不了问题的原因的探索之上,所以这里还给出了解决不了问题的原因,在给出解决不了问题的原因之后再提出怎么解决解决不了问题
的问题。文章最后还给出掌握这套方法的关键点。
一、探索解决不了问题的原因
(一)学生年代的常见问题
在讨论解决不了问题的原因之前,先回想一下学生年代有没有遇到过下面这些情况:
题目没做出来,但是看得懂答案; 有一个思路,但是没有沿着它思考下去,看了答案之后才发现那个思路是对的;
用了一个方法,没有解答出问题,于是换了另外一个方法,还是没有得到答案,然后觉得之前的方法更靠谱,又用原来的方法演算一遍......
有没有思考过出现这些情况的原因呢?出现上面这些情况的原因可能就是学生年代解决不了问题的原因。
(二)工作之后的常见问题
再回想一下,在工作中是不是也会碰到上面提到的类似的情况?尤其是从事技术类的工作。
举个例子,解决复杂问题往往需要查找大量资料,在查资料的过程中碰到过这种情况吗:有些文章刚开始看觉得没多大价值,但是在查阅了大量的资料之后才觉得那些文章好像更有用,可是再想查阅就已经找不着了,甚至连文章的题目都忘记了。
再比如下面这种情况: 在查资料的过程中发现很多貌似的好文章,然后花了大量的时间去阅读它们,时间都浪费在看“好文章”上面了,最后才发现问题还没解决。
(三)解决不了问题的原因
解决不了问题的原因可能有很多,但是只要给出一种原因,并提出针对性的解决方案,可能就可以缓解解决不了问题的情况。 如果把解决问题看成是一个过程,那么解决不了问题其实就是走不到整个过程中的最后一步,如果能找到走不到最后一步的原因,那么就能找到解决不了问题的原因。
我认为走不到最后一步的原因有两个,一个是走到某一步的时候再也走不下去了,另外一个是走到某一步的时候走错方向了。 那么为什么会出现走到某一步的时候就再也走不下去了的情况呢?而由于走到某一步的时候走错方向导致最终解决不了问题的情况又怎么处理?
二、解决解决不了问题
的问题
(一)为什么会出现走到某一步的时候就再也走不下去了?
走到某一步的之后就走不下去了的原因是因为什么都想不到了!想不到东西是不可能解决问题的,这是最基本的逻辑,这套方法最大的作用就是让人能想到更多的东西,从而提高解决问题的概率。
进一步追问,为什么会什么想不到东西呢?举个例子可能会容易说明一点:
如果我说“中华人民共和国”,你会想到什么?
如果我说“中华人民”,你会想到什么?
如果我说“中华”或者“人民”或者“共和”或者“国”,你会想到什么?
对于我来说,能想到的东西“中华人民共和国” < “中华人民” < “中华”或者“人民”或者“共和”或者“国”。
再举个例子:
如果我说“掌握关键技术”,你会想到什么?
如果我说“关键技术”,你会想到什么?
如果我说“关键”或者“技术”,你会想到什么?
对于我来说,能想到的东西“掌握关键技术” < “关键技术” < “关键”或者“技术”。
也就是说,接收的信息越多,能想到的东西反而越少。走到某一步的时候就再也走不下去了原因就是接收了太多的信息。太多的信息等价于太多假设,太多假设思路就会变得狭窄了。
所以要解决走到某一步的时候就再也走不下去的问题,就需要控制接收到的信息。但是怎么才可以控制自己接收到的信息呢?下面再介绍。
(二)由于走到某一步的时候走错方向而导致解决不了问题的情况又怎么处理?
处理这种情况关键是要找到出错的那一步。找到出错的一步听上去好像很容易,但是实际上不是都那么容易的,比如程序员找一个BUG就可能要花好多的时间。
那么既然找到出错的一步是关键,怎么样才能快速的定位到出错的那一步呢?可以把解决问题的过程记录下来。
把解决问题的过程记录下来同时也是上面提到的控制接收到的信息的方法。
把解决的过程记录下来既可以解决走到某一步的时候就再也走不下去的问题,也可以处理走到某一步的时候走错方向而导致解决不了问题的情况。
怎么样才能把解决问题的过程记录下来呢?先描述一下解决问题的常见过程。对这个过程的描述可能不是唯一的,但是我们只需要其中一种描述就够了:
看到问题(或者组织问题)
想到尝试的方法
用想到的方法尝试去解决
看到结果(如果结果不正确,返回第2步)
那么记录解决问题的过程,就相当于把问题记录下来,把想要做的尝试记录下来,把看到的结果记录下来。
(三)把解决问题的过程记录下来的有助于解决问题的具体原因
1.为什么把解决问题的过程记录下来可以解决走到某一步的时候就再也走不下去的问题
上面说过走不下去是因为想不到东西了,那么为什么把解决问题的过程记录下来就可以解决想不到东西的问题呢?换句话说,为什么把解决问题的过程记录下来就可以想到更多呢?这是因为把解决问题的过程记录下来就可以控制接收到的信息。
进一步的追问,为什么文字记录可以控制接收到的信息?因为写下一条记录之后(问题,想要做的尝试,结果),就可以选择记录中的词展开联想,可以选择就代表可以控制。
2.为什么把解决问题的过程记录下来有助于处理走到某一步的时候走错方向而导致解决不了问题的情况
这个好比较好理解。上面说过,处理走到某一步的时候走错方向而导致解决不了问题的情况关键是要定位到出错的一步,有记录就有迹可寻,当然是对定位问题有帮助的。
但是只是有助于定位出错的一步可能还不够,快速的定位出错的一步才更有意义。
(四)记录解决问题的过程的形式
为什么需要讨论记录的形式呢?因为解决问题的过程可能有很多步,特别是复杂问题,往往需要做很多尝试,会看到很多失败的结果,然后产生新的疑问。如果采用扁平的结构做记录,记录的结果就是一堆的文字,既不利于控制接收到的信息,也不利于快速定位到出错的一步。我们需要的记录形式必须有利于控制接收信息,又便于快速定位到出错的一步。用什么样的形式做记录才能得到这种效果呢?上面提到解决复杂问题的过程中会产生新的疑问,这是典型的嵌套问题,针对嵌套问题程序员很容易会联想到递归,而想到递归就很容易想到树结构,所以我最后采用了树形结构做记录,形式如下(圈圈中的数字表示记录的顺序):
原始问题 ①
针对原始问题想做的尝试2 ④
针对问题想要做的尝试3 ⑪
看到的结果(是想要的结果)⑫
尝试2看到的结果 ⑤
产生了疑问 ⑥
针对疑问做的尝试1 ⑦
针对疑问做的尝试2 ⑨
看到的结果(是想要的结果)⑩
看到的结果(不是想要的结果)⑧
针对原始问题想做的尝试1 ②
尝试1看到的结果(不是想要的结果) ③
这样的形式有利于控制接收的信息,选择任何一条记录的任何词展开联想;也有利于快速定位到出错的一步,因为出错的肯定是“针对问题想要做的尝试N”。
如果是在新领域的碰到的问题,树的结构会非常的复杂,因为所谓的尝试在很多情况下其实就是用不同的关键词搜索资料,而看到的结果就是搜索出来的文章,这些文章中往往含有很多陌生的知识,嵌套问题的情况就很容易发生,问题嵌套越深,越多,树的结构就越复杂,最后呈现出来的形式如下:
原始问题
针对原始问题想做的尝试1(其实就是解决问题的步骤1)
针对原始问题想做的尝试2(其实就是解决问题的步骤2)
针对原始问题想做的尝试3(其实就是解决问题的步骤3)
针对原始问题想做的尝试4(其实就是解决问题的步骤4)
......
针对原始问题想做的尝试N(其实就是解决问题的最后一步)
......
......(针对原始问题想做的尝试4的子节点)
......
......(针对原始问题想做的尝试3的子节点)
......
......(针对原始问题想做的尝试2的子节点)
......
......(针对原始问题想做的尝试1的子节点)
......
错误的尝试1
......
错误的尝试2
......
错误的尝试3
......
(五)重新审视学生年代的问题和工作中的问题
1.“题目没做出来,但是看得懂答案;”应该是学生年代印象非常深刻的常见问题。
看得懂答案,就表示对答案中概念(词/符号)都不陌生,完全拥有理解答案的知识,但是为什么问题没解决?以堆积木船为例子,看答案就相当于看一艘已经堆好了的积木船,正常人都看得懂它就是一艘船,也看得到它都用了什么积木部件,积木之间的联系也一目了然;但是如果自己去拼这首船,首先就需要在一堆积木中找出有用的积木,然后才考虑积木之间是怎么组织的,而这两件事情都不是一定能完成的。虽然不一定能完成,但是控制接收的信息,从而想到更多的东西,就增加了解决问题的可能性。理论上看得懂答案就应该能做得出来。
2.把过程都记录下来了,所以不管学生年代抛弃掉一些思路的问题,还是工作以后抛弃掉一些资料的问题,都可以得到解决。
四、掌握方法的关键点
这套方法是我在实践中总结出来的,对我是管用的。因为可操作性还算是比较强的,所以我觉得对各种人群都应该是普遍适用才对的。但是必须要严格遵守一些关键点,否则这套方法就不管用了。
使用这套方法的时候有以下几个关键点:
必须建立起做任何事情都是在解决问题的观念
必须简明扼要地描述问题
必须记录任何根据已有的记录迸发出来的想法(直觉),并且简明扼要地描述这个想法
必须组织形式上体现两条记录之间的关联
工作或者学习中不管做什么事都是有目的的,“怎么达到目的”就是一个问题,所以做任何有目的的事情都是在解决“怎么达到目的”这个问题。
因为联想是以记录下来的文字为起点的,所以在避免想不到东西的同时,还要避免想了不相关的东西。用尽量精简的文字做记录,能在一定程度上能减少想了不相干的东西的情况,少走弯路。上面提到过“在查资料的过程中发现很多貌似的好文章,然后花了大量的时间去阅读它们,时间都浪费在看“好文章”上面了,最后才发现问题还没解决。”这种情况,就是花了很多时间在不相关的事情上面,连自己要解决什么问题都忘记了。
记录的最重要目的之一是打开思路,让脑子能联想到更多的东西,千万不要否定根据记录迸发出的直觉,否则学生年代“有一个思路,但是没有沿着它思考下去,看了答案之后才发现那个思路是对的”的问题又会重新出现。
必须清晰当前的想法是根据哪条记录想到的,在组织形式上它就应该是那条记录的下一级节点,这就是所谓的“组织形式上体现两条记录之间的关联”。
五、例子
用例子进行讲解是大家都喜欢的手段,可惜的是这套方法很难用具体的例子来讲解。因为对于同样一个问题,每个人对问题的描述可能都不一样,想到的尝试方法也不一样,得到的结果自然也不一样,所以只能通过上面介绍记录形式提供一种感性的认识。
但是上面提到文字描述的重要性,是不是有合适的描述,直接影响能不能解决问题。所以可以从这个角度举个例子,看看能不能帮助理解:
你让某些人为你工作了七天,你要用一根金条作为报酬。这根金条要被分成七块。你必须在每天的活干完后交给他们一块。如果你只能将这根金条切割两次,你怎样给这些工人分?
如果这样描述:
一根金条,切割两次,分成七段
不可能
然后呢?然后就没有然后了,肯定做不下去。
但是如果这样描述:
一根金条,切割两次,分给工人
看过答案的人都知道,“工人”很重要,所以这样的描述是有可能从“工人”入手展开联想的,从而有可能想到正确的答案的。
当然了,这里只是为了说明合适的文字描述的重要性才这样举例子,实际上能不能做出这样的描述是说不好的。
后记
作者一事无成,但是搞了10几年技术,走的又是万金油的路子,所以天天都和问题打交道,逐渐就总结出了本文中所介绍的方法。这套方法是在读书的时候萌芽的,参加工作之后被工作中遇到的问题不断滋(催)养(残),另外再加上程序员对树结构印象深刻的这个催熟剂,最后就长成这个样子。
使用这套方法还有一些小技巧文中没有细述,而且没有例子也不太好理解。如果稍微看得懂,对这套方法感兴趣的话,可以直接联系我,我有时间的话可以专门针对你遇到的某个问题来讲解这套方法。方法是通用的,所以不限于技术问题。
声明
知道思维导图、结构性思维、金字塔原理的人可能会对这套方法有似曾相识的感觉。但是这套方法成熟的时候我都还不知道思维导图、结构性思维,更不知道金字塔原理的存在,所以不是抄袭它们的。
文中提到的一些原因/理论基础可能不是那么严谨的,这些原因/理论不一定真的是方法管用的原因,而只是我想到的可能的原因。但是其它方法论的描述不也是半斤八两么?也没看到它们有什么科学严谨的论证。
最后声明,不是有了有了通用的解决问题的方法就一定能解决问题的。除了上述的关键点不一定能掌握之外,因为解决不了问题的原因可能就是笨,就是因为笨,所以我才另辟途径总结出这套方法,尽可能的降低解决不了问题的情况。
其他文章预告:
学习方法论:学习方法和本文中提到的方法相辅相成。学习能力上不去解决问题的能力也会受阻,因为解决问题少不了要学习;没有解决问题的方法,学习中遇到的问题也不好解决。
主要怎么介绍查资料和看资料的方法,快速查到有用的资料,并且提高阅读效率都是很重要的。
其他方法论:抓住核心,涉及主次的矛盾的问题,目的是提高效率。