在开发的过程中,肯定很多同学都遇见过一些问题,比如看不懂代码、遇见一个Bug、程序很诡异的崩溃等。如果你还没遇见过,那你要么是大牛要么是小白。遇见问题的时候,相信每个人都有自己的解决方法。这里,我主要分享一下我自己的一些思维方法,供大家参考。
自信
首先不要害怕问题,要相信没有解决不了的问题。如果能做到这一点,你就成功了一半。看起来很诡异的问题往往到最后会发现是是一个很简单的失误导致的。
寻找切入点
这个是最重要的一点,需要对问题进行整体分析,找到可能的切入方向,尝试去解决问题。我自己的一些方法如下: - 从小到大。分解问题,将一个大问题划分成几个小问题,逐一排查,从小问题切入。举个例子,如果客户端调用服务端时有问题出现,那么可以首先检查服务端返回的数据是否有问题,如果没有问题则集中火力检查客户端。如果服务端数据有问题,那很大可能是服务端的问题。通过排除法,一步步的接近问题真相。 - 从简到难。同样是分解问题,将一个难问题去掉些旁支末节,将其转换为一个相对简单相对单纯的问题,解决了简单问题之后,再去解决那些旁支末节就容易多了。之前我们在研究地图引擎时,遇见一个函数主要实现OpenGL的从屏幕坐标转换到世界坐标,当时对OpenGL原理不熟悉,很难看懂该函数。因为涉及到OpenGL的旋转、z轴-旋转、平移等操作,看的眼花缭乱,一时不知怎么下手。后来我们在函数里把旋转都去掉,只看平移的流程,通过打日志看整个函数的执行过程,弄明白平移的流程后,基本对整个函数的目的和实现方法有了大致了解,然后再把旋转加入到整个流程中,就比较容易的弄明白了整个函数的实现原理。 - 打日志。调试时个人更倾向于打日志(某些人倾向于用Debug工具)。无论是看代码还是解Bug碰到困难时,建议多打一些日志,一步步的跟流程,比单纯的看代码效果要好。
逻辑推导
爱因斯坦通过光速不变假设推导出了整个狭义相对论,所以逻辑推导绝对是最有力的武器。在分析问题时,我们可以先提出一些假设,然后通过逻辑推导演绎出一些结论,再用实际观测到的结果验证结论是否正确,来决定假设是否成立。这个过程对知识能力要求比较高,多做这样的训练,不但可以促进自己去提升知识,同时也可以锻炼自己的思维严谨性。
抽象归纳
在解决一个问题后,不要着急结束,我们要做的不是解决这一个问题,而是从这个问题中学到知识,知其然而知其所以然。问题解决后需要从头到尾再回顾一下这个问题,想想为什么,这个问题真正的本质的是什么,有没有其他方法来解决这个问题等等。
方法论
解决完这个问题后,我们要想能不能把这个解决思路也应用到其他事情上,如果能并且解决的好,那就是一个方法论,就可以给别人传道解惑了。