在以前的文章中,已经提过“技术人员的价值,不在于你能写出如许柔美的代码,也不在于你能设计出一个如许大而全的高屋建瓴的架构,而在于你实实在在的解决问题的能力,在于你应用技术手段服务于业务的能力”。
最近一段时间,因工作中遇到一些景象,让我重又想起这句话,并且试图思考如何来进步解决问题的能力,有没有一种方法论的伎俩或者技术性的框架来实际?
先列举一两个遇到的景象:
- 某共事汇报,测试提了一个Bug,当某个用户绑定的卡信息超过50个的时候,后盾显示数据就会呈现凌乱,问能不能限度绑定的卡不超过50个。我问:数据显示呈现凌乱是什么意思?答:不分明;我再问:为什么超过50个就会凌乱了,少于50个有没有可能呈现凌乱,造成凌乱的起因是什么?答:不晓得。我说你先去搞清楚什么叫“凌乱”,而后再搞清楚为什么会呈现“凌乱”再来说解决办法。通过与测试人员的一番沟通后,跟我反馈说不是显示凌乱,是显示不全,本人通过查看实现是因为在服务端做了字符串拼接,超过多少就被截断了。
- 某共事在埋怨,这个问题很难复现,我不晓得怎么解决,要不要把这块整体优化下算了。我问他你优化的目标是什么,是优化目前实现的流程、构造?还是通过优化来解决这个难以复现的问题?答:来解决这个问题。我说你问题都没定位到,怎么通过优化来解决,不怕老问题没解决,优化出新的问题进去了?
你有没有也已经说过或听过“这个问题太简单了, 我解决不了”,“这个性能我没方法实现”,“我也不晓得为什么会呈现这个问题”之类的话语。
以上的景象与话语,可能都是一个人解决问题的能力或形式办法还不成熟的体现。那么如何来进步解决问题的能力,我想首先须要先从思维形式或思维习惯上寻求扭转。在网上看到有这么一篇文章——《How to think like a programmer — lessons in problem solving》(文章地址见文末参考局部),介绍了通过5个步骤来帮忙人们建设高效解决问题的思维框架。本文以这5个步骤为根底,联合本身的了解与领会进行介绍。
“这个国家的每个人都应该学计算机编程,因为它会教你如何思考”
像程序员一样思考
像程序员一样思考,到底意味着什么,须要如何来做?
像程序员一样思考实质上来说,是一种更为无效的解决问题的办法。
解决问题的能力是一项元技能
什么叫元技能?
类比于元数据——形容数据的数据叫元数据,我了解元技能就是晋升技能的技能,就是说当你把握了解决问题的能力,你就能够通过这种能力去晋升其它各项专业技能。
解决问题的能力也是最重要的能力,比精通编程语言,调试能力,以及零碎设计能力都更为重要。
进步解决问题能力的办法
咱们平时解决问题的形式可能是:
- 尝试一种解决方案。
- 如果这种解决方案有效,再尝试另一种计划。
- 如果还是没有用,反复第二步直到你碰巧把问题解决了。
这种办法被作者 Richard Reis 定义为解决问题最蹩脚的形式。因为它岂但浪费时间,而且能不能达到目标还得看运气。
通过对优良程序员在编程时的思维框架的剖析,作者总结出进步解决问题能力的最好办法包含:
- 有一个解决问题的框架
- 依照这个框架重复练习
那么,当你遇到一个新的问题时,该如何来解决?
第一步:了解
遇到问题时,咱们应该先要弄明确问题自身。大部分状况下,问题之所以难解决只是因为你没真正了解它们(很多时候是出于沟通的不充沛),了解问题是解决问题的第一步。
如何确定本人是否真正了解一个问题?
最无效的办法是,尝试用本人的语言来说出它,看有没有逻辑破绽。当你能讲清楚一个问题时,阐明你了解了它。优良的程序员编程时,个别都会写下本人遇到的问题,画出流程或序列草图,或同产品经理、其它开发人员、测试人员等一起探讨确认。这个过程,就是在确定本人对问题的了解有没有偏差。
“如果你不能用简略的语言来解释一个事件,那意味着你基本就没有了解它” —— Richard Feynman
面对一个新需要时,你应该理解这个需要产生的场景——什么人,在什么时候通过执行什么操作,来达到什么目标?这个场景及其中的行为逻辑是否正当,设计是否存在破绽,而后带着问题来与需要提出方探讨确认,而不是断章取义或不经任何思考间接编码开干。不做代码的搬运工,要做有思维的程序员。
同样,面对一个 Bug 时,你应该首先理解这个 Bug 产生的场景——什么人,在什么场景,通过什么操作会产生这个问题?要寻根究底,定位问题的根源在哪里。
我认为定位问题的根源比解决问题更重要!因为你只有正确地找到了问题的症结,才有可能去解决它,而解决办法却可能有多种。且从破费的工夫来说,定位问题往往会占整个解决问题工夫的一半以上。
如果没有找到问题的根源,只是头痛医头脚痛医脚,那么可能不仅对解决问题无事无补,甚至还可能引进新的问题。常见的头痛医头脚痛医脚的解决形式包含,CPU占用高了,内存溢出了——降级服务器配置(可能过两天又得降级了!);接口超时了——增大超时工夫(可能导致用户投诉或其它依赖的服务级联超时),等等。
那么日常工作中,如何来定位问题的本源?对于个别问题来说,可能通过查看日志大抵就能找到问题所在,对于比拟辣手的问题,针对问题的性质个别可通过如下办法进行定位:
- 对于易复现的问题: 罕用的就是 Debug,通过 IDE 断点来跟踪数据的流转与变更,一个个环节检查数据输入输出是否正确来进行排查。可借助条件断点、异样断点等技巧来进步 Debug 效率。
- 对于不易复现的问题:可通过比照法——比照其它中央的相似性能或实现,寻找两者之间的差别,差别之处往往就是问题所在;分析法——走读整体流程代码,捋清各个环节的逻辑,剖析定位问题;日志法——在各个关键环节增加日志,将场景镜像下来,当下次复现的时候,通过剖析日志定位问题。
第二步:打算
了解了问题,接下来就是解决问题的计划。没有明确的计划打算时,不要轻易去着手解决问题,不要寄希望于碰运气蒙混过关。许多开发人员习惯于疾速扫一眼需要,就关上 IDE 开始垒代码,垒完发现要么与需要不符,要么漏洞百出。
制订打算,就是制订解决问题的策略步骤。
不管面对需要还是 Bug,都应该好好打算你的解决方案。设计好解决方案中的各个环节,如业务需要的数据表设计、接口设计、流程逻辑,Bug 修复的具体实施步骤。并给本人一点工夫思考与预演,该解决方案可能存在的破绽与影响有哪些,除了这样解决,还有没有另外更好的解决方案。
在没有想分明解决方案时,不要间接上来就撸代码,暂停一下,给你的大脑一些剖析问题和解决信息的工夫。
第三步:合成
这是思维框架中最重要的一步。
合成,就是化繁为简,就是咱们常说的分治思维,拆分法——将大问题拆分为若干个小问题,而后一一击破各个小问题,再合并总结。微服务架构,MapReduce 算法,都是这一思维(或思维)的体现。
不要尝试一次解决一个简单的大问题,而应把简单的大问题分解成若干个简略的小问题(或子问题),从最简略的子问题开始(最简略意味着你晓得怎么解决它或它更容易被解决,也或者这个子问题的解决不须要依赖于其它子问题),一个一个逐渐解决。一旦你解决了所有的子问题,把它们串联起来,个别就意味着你解决了之前的那个简单的大问题。
合成问题的能力是解决问题的基石。这也是优良的程序员在编程中最罕用到的技能,对于他们来说,合成问题的能力,要比编程语言的熟练度、零碎设计等技术更为重要。
第四步:卡壳了怎么办?
当你了解了问题,做出了解决方案的打算,将简单问题合成为子问题后,在解决子问题时仍然卡壳了怎么办?
首先,淡定!而后通知本人,这很失常,每个人都会遇到。
优良程序员或解决问题的高手,与普通人之间的差异就在于,他们对问题更有求知欲,更有急躁,他们的注意力更多地是在如何解决问题上,而不是为此恼火或甩锅发牢骚。
当遇到卡壳的状况时,能够试试这几种办法:
- Debug:与后面定位问题一样,一步一步调试,直到找出到底哪里出错了。
“Debug 的艺术关键在于你到底让软件干了些啥,而不是你认为你让软件干了些啥。”—— Andrew Singer
- 从新评估问题:退回去,从另一个角度从新扫视问题,别让本人迷失在细节里,有时候咱们容易迷失在具体的细节中而疏忽了更个别的准则。从新评估问题的另一种路径是推倒重来,能够删除(回滚)所有已做的事,从新开始,有时这是十分卓有成效的形式。
- 搜寻解决方案:利用搜索引擎找到相似问题的解决办法,向他们学习。应用搜索引擎须要学会提炼关键字,关键字越有代表性,越容易找到答案。对搜寻后果应该抱着参考的态度,而不是照搬,要明确为什么如此这般解决就能解决问题,并在解决问题后能顺次延长理解其上下游或相干常识,比方SQL查问慢,发现是索引未失效,则能够延长理解都有哪些场景会导致索引生效;比方并发问题,则能够依此理解如何保障线程平安,同步机制,锁机制等相干常识。事实上,即便问题曾经解决,你也能够常常这么做,因为这样你能够从其他人的解决方案中及上下游常识中学到更多。
- 寻求声援:当通过以上办法都无奈取得解决办法时,向你的共事、下级或敌人求援,如果是开源我的项目,到开源社区、技术群,或 github 的 issue 列表中发帖求援。
- 记录问题与解决方案:将你本次遇到的问题与最终的解决方案用(电子)笔记本记录下来,便于前面回顾或参考。
第五步:练习
罗马不是一天建成的,你也不可能期盼通过解决一两个问题就能成为解决问题的高手。然而,如果你能以学习的态度来寻求问题的解决办法,通过以上四个步骤来建设一套解决问题的思维框架,每一个问题的解决都是进步你能力的机会。那么间隔成为一个解决问题的高手,就只差一步了,那就是:练习,练习,再练习。在问题中练习,训练你的思维形式与习惯。
“我不胆怯一次练习1000个踢打动作的人,但我胆怯将一个踢打动作练习1000次的人”
总结
其实,解决问题的能力,不管在IT技术畛域,还是在其它各个领域,都是一种最根本的技能。当你在说出“这个问题我解决不了”,“这个问题我没方法定位”前,试试本文介绍的了解、打算、合成、卡壳时怎么解决的倡议办法,多一些急躁,一步步实际,说不定缓缓就看到曙光了。依照这个解决模式或习惯,在与日俱增的问题解决中,你可能已在人不知;鬼不觉成为了解决问题的高手。
参考:
- https://www.freecodecamp.org/...
原文地址:http://blog.jboost.cn/think-l...
[转载请注明出处]
作者:雨歌,能够关注下作者公众号:半路雨歌