前言软件开发工作无论从宏观还是微观角度都可以看成是一个解决问题的过程。从宏观上看,软件开发,简单来说就是搞清楚客户的需求是什么,然后通过分析、设计、编码、测试等一系列活动,解决如何将需求转化为代码的问题.从微观上看,开发者在日常工作中也面临着各种各样的问题。例如,如果用于调试代码的Web服务器突然无法启动,开发人员必须首先解决这个问题,否则手头的工作可能无法进行。作为开发者,与其抱怨加班,不如反思一下自己的时间都花在了哪里。我相信开发人员的大部分时间都花在了解决各种问题上。无论你是资深开发者还是新手,在日常工作中都会遇到各种各样的问题。不同的是,高级开发人员几秒钟就能解决的问题,新手可能要花几个小时,甚至一两天!可见,提高开发者解决问题的能力,对个人和团队都具有重要意义。事实上,心理学作为一门独立的学科,对解决问题有自己专门的研究。其研究成果值得我们借鉴,以提高我们自己和团队其他成员解决问题的能力。本文将向读者介绍解决问题的心理学知识,并结合软件开发工作的特点,给出提高解决问题能力的相关指导。没有心理学背景的读者不必担心“交错如山”。这篇文章涉及的大部分心理学术语都很容易理解。重新审视什么是“问题”,提高解决问题的能力,首先要搞清楚“问题”是什么,然后才能谈如何更高效地解决问题。心理学将“问题”定义为“需要克服给定信息和目标之间的一些障碍的刺激情况”。通俗的理解是,对于给定的事物初始状态(所谓“给定信息”)和目标状态,我们不知道如何将初始状态转换为目标状态(所谓“障碍物”),而“问题”出现了。例如,在著名的Vannota问题中,初始状态是64个圆盘在A极,目标状态是所有圆盘都在C极,每个小圆盘都在大圆盘之上。需要克服的“障碍”是如何将64个圆盘从A移动到C。图1.瓦诺塔问题根据上述定义,问题求解就是克服“障碍”的过程,即寻找从初始状态到目标状态的路径的过程。比如在Vannota问题中,我们反复使用B杆,最后把A杆上的所有盘子“原封不动”的移到C杆上就是解题的过程。那么,提高解决问题的能力就是提高我们找到从初始状态到目标状态的路径的能力。为了后面讨论方便,将软件开发领域的“问题”简单分为Well-definedproblems和Ill-definedproblems。前者是指初始状态和目标状态明确的问题,如范诺塔问题。后者是指初始状态、目标状态或两者都模棱两可的问题,这类问题往往更难解决,对问题解决者提出更高的要求。大多数与软件运维有关的问题都属于这一类。比如这样一个问题:生产环境中的数据库系统自动重启,需要排查原因。解决问题的心理过程就像理解计算机如何处理信息有助于我们更好地使用计算机,理解人类解决问题的过程有助于我们更好地解决问题。心理学家一般将问题解决过程分解为四个步骤:问题表征、问题解决方案设计、问题解决方案执行和监控。问题表征是指明确问题的初始状态、目标状态和必须满足的允许操作和约束条件。在Vannota问题中,求解者首先对问题进行表征,即弄清楚:A极上有64个盘子,小盘子在大盘子上(初始状态),目标是移动这64个盘子到C杆上,C杆上的每个盘仍然保持小盘在上,大盘在下(目标状态),移动过程中可以使用B杆,但是小盘一直在移动过程中在大板上(允许操作,必须满足限制)。设计解决问题的计划是指确定解决问题的步骤。Vannota问题的求解器比较了问题的初始状态和目标状态,准备借助B极递归地将A极上的所有盘子移动到C极,也就是设计一个问题——解决方案。问题解决者设计出问题解决方案后,执行问题解决方案,在执行过程中,时刻检查当前操作是否有助于解决问题,相关操作是否满足问题的约束条件,即执行监控。例如Vannota问题的解题者在移动盘子的过程中要注意小盘子是否在大盘子上面,移动盘子的结果是否能让越来越多的盘子放在上面C棒果然提前预料到了。下面我们讨论影响问题解决的心理因素。影响解决问题的心理因素问题表征解决问题第一步的问题表征又可进一步分为两个小步骤:??问题表面理解和深度理解。问题表面理解是用问题解决者自己的语言描述问题的过程,是解决问题最基本的步骤。对问题的深刻理解是在对问题表面理解的基础上,进一步将问题的每一个陈述综合为条件和目标的统一体。在这个子步骤中,区分问题中相关和不相关的信息非常重要。对于不相关的信息,可以忽略,也可以用不同的方式理解和表达(即表示)。 在深入理解问题的过程中,问题的表述方式可能对解决问题的难度有很大的影响。这一点可以从一个典型的问题——和尚上山的问题中体现出来(见上图)。和尚上山问题的直观反映是,似乎不太可能存在这样一个点,因为和尚上山和下山的速度是不一样的。但是,当我们发现这个问题可以看作是这样一个问题:两个和尚下山,而另一个在同一时间点上山时,答案就很直白了:这条山路上一定有一个点,在某个时候,这两个和尚会相遇。那么,原问题的答案是肯定的。解决这个问题的关键步骤是,在深入理解问题的过程中,我们用不同于表面理解问题的方式来表示问题:表面理解中的问题描述了同一个和尚上去和上去。下山,而深度理解当我们发现一个和尚是否上下山是一个“无关紧要”的信息时,我们可以将这个信息理解为两个和尚同时上下山。我们来看一个软件开发中的实际例子:我们要检查网页上代表文章关键词列表的字段值的有效性。校验规则是该字段的值不能为空。如果字段值不为空,多个关键字之间用英文分号隔开。例如:“关键字1;关键字2;关键字3”。显然,这可以用正则表达式来检查。问题转化为这个正则表达式怎么写。根据问题的粗浅理解(如上文所述),关键字列表字段值的格式将表征为:(关键字1)+;+(关键字2)+;+(关键字3)+...这样的刻画直截了当简单,但是根据这个刻画,相应的验证正则表达式就没那么好写了。相反,如果将字段值的格式换成另一种表示,对应的正则表达式就容易写很多:(关键字1)+(;关键字2)+(;关键字3)+...根据以上表征(即从第二个关键字开始,每个关键字都需要以“;”为前缀),可以得到对应的正则表达式(Javascript语言表达式)为:“^[^;]*(;[^;]+)*$”。因此,我们在解决问题,尤其是一些疑难问题的时候,如果没有进步,没有新的思路,不妨回到问题的本源,重新定性问题,用新的方法来解决问题。问题。表示问题。或许,在这个时候,会豁然开朗。这就像我们在侦探题材影视作品中经常看到的场景:侦探在侦查过程中耗费了大量的人力和时间,却毫无进展。此时突破困境的一个好办法,就是从“零”开始:回到案发现场,重新寻找线索,重新推敲。这个时候,案情往往水落石出!Well-RepresentedProblemIfIhadanhourtosavetheworld,Iwouldspend59minutesdefiningtheproblemandoneminutefindthesolution(如果我有一个小时来拯救世界,我会花59分钟定义问题,然后再花一分钟寻找解决方案——阿尔伯特·爱因斯坦)。心理学研究表明,专家解决常规问题的速度比新手快得多。在解决疑难问题时,专家比新手花更多的时间刻画问题,他们会花更多的时间收集问题的相关信息,从而更全面地刻画问题。有这样的情况。运维人员反馈某生产环境进程过多,请求研发人员帮助定位问题。对方提供的信息只说“主机上的进程数过多”,监控软件上报了一条告警信息:“XXX主机上的进程数超过260”。这个问题的解决方法如下:首先,搞清楚所谓的“进程太多”到底是什么意思。结合监控软件的告警信息,可以回答这个问题:所谓进程数过多,就是主机上启动的进程数大于监控软件预设的进程数(比如260).至此,问题似乎清楚了:找出260个进程中有哪些进程,问题应该解决了。但是还有一个问题,假设定位到问题的时候,宿主机上的进程数是265,每一个对我们来说都是一样的,怎么把这些进程分成两部分呢??进一步向对方询问后了解到,问题涉及的主机是一个集群环境中的一台(一共几十台主机),目前已经确认其他主机没有出现该问题。然后,通过将这台主机上的进程名称列表与集群环境中另一台主机的进程名称列表进行比较,就可以找出问题主机上有哪些进程是“多余的”。***发现问题是运维人员自定义了一个定时任务,定时任务调用的shell脚本反复运行(上一个脚本运行对应的进程没有结束,新的脚本运行又开始了),导致进程数越来越多。当笔者将上述问题写成问题定位案例让新手定位时,新手的反应是一头雾水,不知从何下手。从上面的案例可以看出,软件行业遇到的问题,大部分都是定义模糊的,尤其是在一些生产环境中。对于此类问题,专家可以通过自己的分析判断,进一步收集与问题相关的信息,使问题逐渐转化为定义明确的问题,然后通过合适的问题解决策略(如上述比较法)。新手往往不知所措。因此,对于一个定义模糊的问题,解决方案一般是通过分析判断,收集更多关于问题的信息,试图将其转化为一个定义明确的问题。对于新手来说,通过观察专家的解题过程并尝试模仿,也是一种提高解题能力的方法。观察能力所有的推理都应该来自观察和实验。–––伽利略在软件行业解决问题的过程中,视觉是人脑获取信息的主要途径。人脑在解决问题的过程中,并不是被动地接受视觉信息,而是通过有意识、有目的的主动观察来获取信息。另外,软件开发过程中遇到的问题大多是定义模糊的问题,通过观察获取更多的问题信息,有助于全面刻画问题的特征。因此,在解决问题的过程中,观察能力是非常重要的。我们在日常工作中不难发现一件事:专家在解决问题的过程中可以从一堆视觉信息中快速捕捉到自己需要的关键信息,而新手往往面对的是专家解决问题所依赖的信息。假装没看见!例如,在图2所示的几十行CallStack信息中,专家可以快速定位到第35行的关键信息,并断定是磁盘空间不足导致的问题,而新手则可能无从下手。图2从错误信息中快速定位关键信息日志文件、软件界面等呈现的错误信息是问题定位的重要信息来源。但经验告诉我们,“28原则”在这里同样适用:这些错误信息中的大部分对于解决问题没有什么用处或者不是很有用,而那些能够对定位和解决问题起到决定性作用的关键信息往往只是一个几行甚至一行。因此,我们能否在这些大量的错误信息中快速找到自己需要的关键信息,往往决定了解决问题的效率。快速找到我们需要的关键信息,需要问题定位者敏锐的观察能力。要提高观察力,首先要认识到观察力的重要性。其次,在日常工作中,逐渐学会区分自己在定位问题过程中遇到的错误信息,哪些是关键的,哪些不是很有帮助。再次,掌握一些获取关键信息的基本技能。例如,对于与数据库相关的错误信息,需要能够关注数据库系统上报的错误代码。对于JavaCallStack信息,请关注“Causedby”部分的前几行。作者曾引导团队成员认识到自己观察能力的弱点和重要性,并向他们展示了如何通过实际问题定位快速获取关键信息,在一定程度上帮助团队成员提高了观察能力。小结本文介绍了问题解决的心理过程,以及在问题表征阶段影响问题解决的一些心理因素。并结合作者实际经验的例子,通过比较高手和新手在解决问题时的差异,对提高问题定位和解决能力给出指导。下一部分将介绍影响问题解决的其他心理因素,并给予相关指导。
