Loading...
墨滴

舒米勒

2021/07/18  阅读:47  主题:橙心

复盘篇:问题解决经验总结复盘

大家好,我是杰哥

最近在项目中有机会真正独立去解决很多技术难题。大概梳理了一下,几乎是一个多月时间解决了10个左右的疑难问题

现在坐在这里写总结的我,是轻松的。但是在解决每个问题的过程中,可是承受着大大小小的精神压力的,曾多次怀疑自己是否是能力有限,而在解决完之后,又肯定了自己:嗯,我还是很强的。可能人都是这样,在遇到困难之时与渡过困难之后的心情总是相差比较大的。所以过程中的自信心的保持、解决问题的能力的提升等还是比较重要的。否则很容易出现遇到难题,心情易浮躁,容易放大精神压力,从而降低了自己解决问题的效率......

因此,为了提升自己的解决问题的能力,给自己增加一点自信,还是总结一下,告诉自己解决难题还是有很多方法的,也同时希望能够对正在看文章的你有所帮助

一、解决问题的基本方法

解决问题,往往是耐心分析,不断找到问题的根因的过程

解决的思路可以有很多。比如查 Bug,就可以先复现问题,然后跟着问题的正常逻辑一步步往下走,确定问题真正出现的地方,然后再去分析出现这个问题的原因。找到了原因,那么问题的解决方案一般很快就确定了;

对于一个新领域的研究,比如为了规避 ES 一次查询数据量太大加载特别慢,甚至导致进程卡死的问题,就需要通过搜索或者与别人的沟通来寻找到它的解决方案,然后对这个方案进行验证

对于一些线索很少的问题,就可以首先是对原因的猜测,然后不断试错;若有成功的场景,那就对比一下失败场景与成功场景的不同点以这个不同点作为突破口进行研究解决;

再者,就是通过自己的经验了。一般来说,每个人解决的问题越来越多,就形成了自己的一套知识体系,它会帮助你快速定位到问题的原因所在。而这套知识体系,就需要你平常持续的输入与主动实践,才会被构建得越来越成熟;

最后一点,我觉得也是比较重要的一点,就是定期复盘每次解决完一个问题之后,需要有一个解决思路的复盘,回忆自己是否走了弯路,或者本来要是怎么样做,就会更早解决掉这个问题,这一点以后可以避免;如果说这次因为做到了哪一点,所以这个难题就被轻松解决掉了,那么点就可以继续保持。每个阶段,比如某个版本发布之后,也可以做一个总体的复盘,从而提炼出一些自己的经验库出来

基本思路大家都是没有问题的,今天我就来强调几项比较重要的软技能

二、解决问题的几项重要软技能

1、心态:自信,坚信自己一定能够解决掉它。只会越来越强

首先,一定坚信项目中遇到的问题,自己能够解决它,毕竟问题都有解决的方案的,即使一时半会解决不了,也可以通过另一种思路去达到它。我之前的qq昵称叫“彩虹般的微笑”,很多朋友调侃我说,觉得像是非主流的名称,有点俗气。但是他们却不知道,背后的含义

想想,彩虹一般是在什么时候出现的呢?是的,要经历过暴风雨才会出现。出现之后,大家看着它都觉得很美,很开心。对应到现实生活中,经历过一段人生的坎坷之后的喜悦,岂不就像看到了自己的那道彩虹吗?比如说经历高考,你一直想着最终要给自己那份喜悦,那么你就会在过程中更加努力,直到获得那份“彩虹般的微笑”

我比较爱跑步,但是比较奇怪的是,往往在刚开始的两三公里的时候,就会觉得很累,会产生放弃的念头,这个时候,脑子里便会弹出另一个观点:再坚持一会儿,你的实力往往不止于此,再坚持一会儿,你会看到不一样的风景。于是乎,一公里,再多一公里...... 最终往往会跑到7公里以上。最终,截个图,保存下来。这个时候,觉得身心似乎得到了真正的放松,潜意识里面,感觉自己的确是很厉害,于是在后来的每次跑步中,就会觉得自己的实力是在7公里以上的,绝不会轻易放弃

是的,每次一定要坚信自己能够达到,然后你的心态便会形成记忆,觉得自己的实力还可以更高。奠定了这个基础,遇到问题,你首先就不会慌了

2、冷静分析,不用心急,对于紧急问题先找出应急方案来应对

在项目中解决问题的过程中,有很多问题是比较紧急的,比如因为多个服务器被迁移,你们的 Git 流水线突然就无法执行了,最要紧的是项目打不了包了。大家完成了功能开发,或者完成了 Bug 的修改,等着出包验证,却无法打包。这个时候,大家都盯着你,似乎项目组的进度都卡在了你这里。而且,由于他们不了解其技术细节,还总是会催你尽快解决。甚至对于经验缺乏的你,在过程中不断遇到各种艰难险阻的时候,你也会对自己的能力产生怀疑。越是这个时候,你千万要从专业的角度,告诉大家,也告诉自己目前的问题点在哪里,让他们了解问题并不是那么简单的。也让自己真正感觉到是问题对于自己太复杂了,之前很少接触到这块的东西,所以得需要一定的时间

对于这种使得项目卡住的问题,解决当然是第一优先级的,但是为了缓解当前卡住的局面,你也可以先找出一种临时应急方案,需要体验会差一点,但是却可以使项目能够正常进行下去

就类似于餐馆里一般都会准备一个小的发电机一样,以防在停电了还能够继续营业,不至于完全垮掉,尤其是在夏天晚上的用电高峰期,停电的频率总是会比较高。本来是通过 Git 流水线一键打成镜像的,那么现在完全可以先在本地打好最新的包,换到当前的镜像中即可,步骤会稍微多一点点,但是完全不影响效果啊

先让火势缓下来,接下来,你再去专心研究救火的具体方案

3、确定问题的优先级,创造良好的精神状态

刚刚提到了一定要冷静下来,才能专心解决问题。其实,保持良好的精神状态,也尤为重要。试想一下,当你最近每天都加班到很晚,或者每天要同时回复各种各样的消息,项目中很多决策还需要你拍板或者讨论确定,或者在解决这个问题的过程中,又出现了另一个疑难问题等等。你总是会被打断,经常会出现刚刚有一点灵感,就被中断了。因为你也知道,往往很多灵感都是在经过一步步分析之后才会有那么火光乍现的感觉,然后突破口才会被找到,所以经常被打断的现实就是对你的挑战

那么,你就需要为所有事情确定好优先级,比如对于阻塞性的、计划中的以及不解决掉会对项目构成较大风险的,这些事情的影响面往往更大,往往要被优先解决。在这里,必须得强调一下,优先级真的特别重要。确定好了优先级,聚焦那些优先级最高的事情,然后跟相关的人也可以沟通说明一下,尽可能地减少被打断的次数。若真的很难避免,那么就要给自己定一个阶段性的目标,比如早上可以集中的那半个小时至少要找到问题的根因;下午可以集中的那半个小时,一定要确定一个解决的大概方案。这样的话,你的效率就自然变高了

4、及时找有经验的人沟通

有时候,自己一个人独立解决问题的能力固然很重要,但是与其他有经验的人沟通一下,往往可以让你轻松打开一扇窗,让阳光照进来

有些问题你百思不得其解,感觉自己的思路明明没有问题,但是现象却总是不按常理出牌。这个时候,如果跟有过经验的人沟通一下,他们毕竟经验比你多一点,不仅会站在旁观者的角度,帮你重新审视你的解决思路,并且由于他们可能也踩过类似的坑,直接跟你说通过什么方式可以避免,或者协助你排查问题,你会惊叹于原来问题还可以以这样的思路去思考。即使最终他们无法帮助你解决问题,也有可能在跟你沟通中的一些思维碰撞,让你就产生了一些新的思路。所以这样不仅会加快解决问题的速度,还可能会让你打开思路,拓宽认知,何乐而不为?

比如说,上次我们需要构造最大的数据量,供测试的同事来做性能测试。说是要构造数据量,那根据我们的认知,第一反应则是,可以直接通过 Java 代码,快速插入大量数据。但是再想了一下,应该还有更简单快捷的方式吧,毕竟数据量还是挺大的。于是请教了一位测试过 ES 性能的同事,他说他们的数据量更大,当初是通过构造文件,由 Flink 读取处理之后,输出到 Kafka 中,然后再由 Logstash 写入到 ES 中去进行大量数据构造的。我一听,感觉恍然大悟啊,对啊,Logstash 不也支持文件的数据读取吗?那我只需要不断构造好一些文件数据,那么只需要通过简单的配置,就可以轻松实现数据量的构造了,你说是不是既节省了时间,又拓宽了思路?

其实沟通的过程,当你在为别人讲述自己当前遇到的问题点的时候,实际上往往是你在重新整理思路的过程。有时候,你在讲的过程中,可能突然就发现自己之前的考虑有不完全的地方,或者方向有误,或者说哪些方面还没有做尝试等等,紧接着就是恍然大悟!我还遇到过好几次同事这样的状态

再者,我觉得对于技术人来说,其实沟通实际上是一件很重要但往往被轻视的能力。要知道,从一定程度上来讲,沟通起来,你运用的就是整个团队的力量。毕竟一个人的力量,还是很难敌得过一个团队的力量的。毕竟改革开放,总是比闭关锁国效果好多了

5、搜索资料:搜索注意要精准

对于自己未涉猎过的领域,往往要通过网络搜索等方法来确定解决方案,要么是官网,要么是各种大佬的实战博客。但是,这里强调一点,搜索一定要精准,否则,你的方向会偏离。比如说,我们最近使用的是 7.X 版本的 ES,但是网上大部分资料都是针对 6.X 版本甚至更低的版本的,而 ES 的各个版本的功能使用方面差异貌似还很大。所以,很多现成的方案,直接拿过来进行使用,往往不起作用

而如果在搜索的时候,直接限制搜索的范围为你当前正在使用的版本的话,那么问题就会很快找到正确的解决方案,方向对了,效率自然就高了

6、精简问题的验证方案

比如验证问题的方法可以简化,从而快速验证我们的思路是否正确。比如我们需要确定 ES 的翻滚方案是否可行,则只需要将其最大文档数设置为 2 个,那么,只要索引中达到了 2 条 记录,翻滚的动作就可以执行,而你就会快速看到成果

7、培养自己的前瞻能力,提前发现问题,给出解决或者规避方案

项目管理过程中,现在会提倡做项目沙盘,也就是说在项目开始前就对项目进行一个战前的预演,考虑到项目各个阶段可能会出现的各个场景以及各种可能的风险。其实在最开始的架构设计与模块设计过程中,也应该尽可能全面地考虑到可能出现的问题以及风险点。那么,到时候排出一个优先级,提前通过技术预言确定好解决方案。基本确定好之后,再去实际进行项目的开发工作,那么整个项目就会更为可控。而且也不用在项目过程中因为某些未考虑到的问题的解决,而耽搁了项目的整体进度,甚至出现方案或者需求的变更的情况。要是这种情况频繁出现,那只会导致项目变得不可控,甚至出现项目延期、甚至失败等后果

8、调动团队的执行力与主动性,营造良好的团队氛围,实现团队的螺旋上升

最后一点,也是一位技术负责人的职责:要善于观察和沟通,洞察出影响当前团队效能的瓶颈在哪,然后解决掉,以求团队有更高的产出。还是那句话,团队的力量往往是无穷大的,尤其是团队中保持着主动学习,主动承担的氛围,每个人都有他擅长的技术点,又善于分享讨论,那么团队中的每个人都会成长得很迅速,并且整个团队也会越来越成熟,默契度越来越高,那么自然会越来越强,问题的解决效率只会越来越高

所以说,团队氛围的培养也是完全不可忽视的一点

三、总结

最近在解决问题的过程中,感触最深的是小学课本中学到的那句话:困难像弹簧,你弱它就强,你强它就弱。的确是这样,只有不断修炼,不断总结,才能提升自己解决问题的能力,从而增强自己的自信,来应对越来越具有挑战的技术难题!从自我出发来说,我们可以抱着成长的态度解决问题,把当前的工作岗位,当成自己成长和表演的舞台,尽情展现自己。而且每解决一个问题,你就更上了一层楼

嗯,就这样。每天学习一点,时间会见证你的强大~

舒米勒

2021/07/18  阅读:47  主题:橙心

作者介绍

舒米勒

深信服-架构师