要解决问题,首先是要定位问题,配合正确的推理方式,再仔细分析,“动手尝试”很可能只是验证推理是否正确的手段而已,其实大部分的情况都可以用思考来得出(或排除)。要定位问题,很重要的一点便是要把概念理清。很多朋友会轻视概念,认为那种“理论”有什么重要的,最关键的是“动手”——但殊不知概念能让您的“动手”少走很多弯路。
俗话说授之以鱼,不如授之以渔
意思是学习知识,不如掌握学习知识的方法
那么类似的解决问题,不如掌握解决问题的方法
解决问题的方法,我简单做了个总结,共8个字:
“纵向分解,横向对比”
纵向分解是把一个大的问题按照先后顺序分解成一些小的问题,个个击破,最后大的问题也就迎刃而解。
横向对比是通过条件控制,找到导致结果产生的主要原因 ,最后有针对性的解决问题。
对于技术人员,这两种方法在解决一个新的问题或者是寻找导致现有问题的原因方面都有很广阔的应用。
//added by zhangjun at 2011-03-09
再补充4个字:
“整体分类"
整体分类是把一个比较综合的问题分门别类,分成几种情况,解决每种情况意味着解决了整体问题。
什么是问题?
1. 上下文 -- 和问题相关的场景,指一组已经是明确已知的,关于问题的条件的描述。
2. 目标 -- 指关于构成问题的结论的明确的描述。
3. 障碍 -- 指问题的正确解决方法不是显而易见的,必须通过一定的思维活动,才能找到答案。
良好的定义问题是解决问题的关键步骤。
定义问题就是鉴别期望和现状的差异。有如下几个关键点:
1. 首要的是,收集整理关于现状的可信的信息,而不要假设已经拥有完备的可信信息;
2. 不暗示倾向于某种原因或者解决方法;
3. 只陈述现状和期望的状态;
4. 在解决问题的过程中,问题的定义可能(有必要)会不断的改进或者转换形式。
当很难预判断问题位置时,可以采用排除法:每次排除系统范围的一半左右,逐步将包围圈缩小到问题原因本身。应注意:排除的过程中,同样要注意验证排除的是否正确,即:排除、验证、排除、验证……
关注日志
很多问题解决过程中其实打开日志文件就能马上得到结论,但是开发人员宁可自己猜也不愿意动手打开日志。
另外也暴露了我们系统日志没有为开发人员提供足够的信息支持用以解决问题,后面的设计中要把异常设计作为一个重要部分。
充分利用工具,能得到事实就不猜测
比如:HttpFox等工具能将HTTP请求录下来,我们不需要猜测;还有Windows事件日志,性能计数器,Windbg等等工具可用
通过差异找到问题的原因
很多问题的解决可以不依赖开发态的调试,比如通过比较当前版本和上一版本的区别,比较产品和产品之间的差别就能通过差异来定位问题。
解决掉一个问题不是终结
之前往往满足于一个能够解决眼前问题的答案;这是远远不够的,一个问题的出现暴露出我们系统的缺陷,这是一个线索,需要避免同样的问题的出现
一个问题的出现我们要追究到问题的本质,例如前段时间SSO登陆失败和验证码本地使用失败,本质上都是由于配置文件中指定了Cookie的域。