聊聊解决问题的套路

作为开发者,每天都会遇到新的问题,甚至于说我的工作就是不断地解决问题。碰到问题总会让人苦恼,怎样能快速的解决问题,在找不到思路的时候,能否有一些方法来指导,推进问题的解决,本文简单聊聊解决问题的常用套路,仅仅是自己的一些见解,期待有所共鸣。

一个问题从发现到解决的闭环,大致分成发现问题、分析问题、解决问题、总结问题等四个步骤,下面分别介绍

1. 发现问题

问题是什么

首先要能清楚的描述你的问题是什么,并提供必要的信息,比如

  • 问题的现象是什么:透过现象才能看到问题的本质,有截图或者视频最好
  • 在什么场景下复现:在哪种场景下能复现,缩小问题排查的范围
  • 是必现、大概率复现还是偶现:如果是稳定复现,可以根据复现路径,快速找到问题的原因
  • 唯一性id:比如用户id,昵称等
  • 关键性信息:比如发生时间,在WiFi还是移动网络下,有无日志信息和报错提示等

问题描述得越清晰,提供的有用信息量越多,越有利于问题的解决。怎样合格的报告一个问题,可以参考前面写的文章。在求助别人时,要言简意赅地描述问题,如果描述不清楚,可以加上背景介绍,让别人能快速了解你的问题。

2. 分析问题

分析问题是最为关键的一环,如果原因找到了,问题也能迎刃而解。

改动了什么

问题的发生,通常与某些改动有关系,通过对比改动前后的差异,能大致确定排查的范围,或者通过不断回退改动,从而找到触发问题点的关键改动

  • 改动点有哪些:归类列举改动点有哪些,全面暴露改动点,不放过任何细节,不让错误藏身
  • 改动的思路是什么:如果改动点比较多,可以简述自己改动的方案是什么,让别人了解你的改动,评价方案的不足

有时候改动与问题之间不是直接联系的,可能是某种异常的输入,导致其他模块出现问题,也要通盘考虑

收集异常信息

出现问题,必定是走了非正常逻辑,有没有异常日志、crash,或者其他反常之处。发现和收集异常信息,按图索骥。如果没能发现异常信息,在关键分支处,加上日志或断点,查看变量值,对象地址有无变化、有无null或者负值,发现异常点。

定性分析,缩小范围

是哪一块出现了问题,是网络,可以抓包,是数据库,可以拉取数据,是埋点找埋点,是ui找对应的view。根据这些推导,大致定位到具体模块,缩小问题的范围。

基于事实,认真求证

在找原因的过程中,通常需要不断尝试,是否是这个原因,基于事实来求证和推理,切忌想当然去猜想,往往这些主观的猜想最后证明是错的。在没有思路的过程中,可以不断假设、一个个排除,但是得出的结论需要经过验证。有时也不需要每个都验证,根据已有的现象,通过简单的推理得出矛盾,也能说明不成立。

  • 大胆建设,认真求证
  • 推理出矛盾
  • 正向验证:从正面验证问题的矛盾
  • 反向验证:从反向推理出矛盾

假设一个个被求证,最后会慢慢缩小范围,一定是不断缩小求证的范围,不要扩大而去。沿着这个方向,问题总会被逼到死角。

聚焦主线,逐步逼近

在分析问题过程,记着沿着解决问题的主线,不要被不断涌现出的新问题干扰,遇到新的问题,先记录,梳理下思路,解决完主要问题后,再来看这些新问题,逐步击破。不要在解决过程中被新问题干扰,忘记当初解决问题的主线。

求助他人,集思广益

当没有思路时,拉群找更多相关的人来协助解决,自己往往由于经验不足,当局者迷,研究问题常会陷入死胡同,让更多的人参与,每个人看问题的角度不同,群策群力,会对问题解决有至关重要的作用。

3. 解决问题

当原因找到了,接下来就是解决问题。问题不同,解决的方法各不相同,这里不介绍具体做法,而简单介绍几种思路。

没有条件,创造条件

问题有时候是条件不具备导致的出错,可以通过各种方式来创造这个不满足的条件,缺啥补啥。比如是生命周期不完整导致,那就补齐这个生命周期。

换个方向

在原来道路上直接解决不好做,可以想下,能否换个方向?有没有其他方式绕过去,条条大路通罗马,不一定就用一种方法,往往换个思路,带来转机。

善用搜索

自己遇到的问题,前辈可能都遇到过,多用搜索引擎,变换关键词,中文和英文,百度和谷歌等多种渠道去搜索,解决问题才是王道。

4. 总结问题

每一个问题的解决,都有所收获,在解决完问题后,也可以思考下。对于特定的问题,能否泛化,找下共性。争取下次不再遇到,一劳永逸地解决问题。及时地把问题做好总结,分享出去,对自己也是一个成长。