最近在和团队讨论问题时经常会遇到未知问题(不知道但理解或不知道且不理解的问题),最后的结论基本都是无能为力。除非它真实发生了,我们知道它存在了,否则我们怎么可能去处理一个我们不知道的事情呢?那针对这类问题我们应该怎么办呢?
未知问题是可以被认知的
我们对问题的认知可以分为三个层次,核心层是我们知道且理解的问题,中间层是我们知道但不理解的问题,最外层是我们不知道的问题,也就是未知问题。
当我们遇到未知问题时,我们就知道了它的存在。如果我们理解它,它就变成了我们知道且理解的问题,例如编译错误,编译之前我们不知道它的存在,但发现之后任何人都可以根据语法理解并修复它。如果我们不理解它,它就变成了我们知道但不理解的问题,例如新冠,爆发之前我们不知道它的存在,发现之后我们既无法理解其病理,也无法制造出有效的疫苗,只能把它作为一个不理解的事物由专家进行研究。
未知问题的认知是有代价的
面对未知问题,我们既不知道它是什么,也不知道它什么时候发生,同时也不能保证在它发生之后就一定能感知它,所以损失几乎是不可避免的。有的问题出现之后我们就能够快速的感知它,准确的定义它,从而找到解决方案。有的问题出现之后我们并不能感知它,只有在问题严重到一定程度或发生次数足够多的时候,我们才能注意到它,从而尝试定义它。有的问题出现之后虽然我们可以感知它,但无法准确的定义它,从而不得不等待它的再次发生,以便有机会通过收集足够多的数据来定义它。例如新冠初期大家都认为是普通肺炎,直到病例越来越多,病情越来越严重,大家才开始意识到它是一种新的疾病,从而开始尝试收集更多数据,研究病理和研发疫苗
所以,未知问题的认知是建立在不可避免的损失之上的,只有在损失可接受时,我们才有机会去感知,定义和研究它,否则我们可能将无法再继续相关活动,这些问题对我们来说也就没有意义了。 以开车为例,生命安全就是我们的底线,如果生命在车祸中逝去,研究如何在以后的驾驶中避免鬼探头,爆胎,泥石流等问题对我们来说已经没有任何意义。
如何处理未知问题?
降低损失
我们一般把问题定义为通过努力获得的结果(现状)与期望的结果(目标)之间的差距。虽然我们可能不清楚问题是什么,但我们一般对目标都有清晰的定义,对没有达到目标所造成的损失有清晰的了解。例如我们虽然不知道系统为什么会出错,但知道系统的任何错误都可能影响用户的体验和公司的收入,并可以在不知道系统内部逻辑情况下降低这些损失。
我们可以借用项目管理三角形中的概念,从问题的持续时间,问题的影响范围和功能的投入三个方面来降低损失。
问题持续时间越短,造成的损失就越小。以地震为例,不管震级有多高,范围有多广,相对而言,地震持续的时间越短,造成的损失也会越小。在软件开发中,我们可以通过告警监控缩短问题发现的时间,通过使用Feature Toggles,蓝绿部署,灾备等缩短系统回滚的时间,通过良好的自动化测试缩短问题定位的时间,通过快速的CI/CD缩短问题修复的时间。
问题影响的范围越小,造成的损失就越小。以火灾为例,相对而言,过火面积越小,造成的损失也会越小。在软件开发中,我们可以通过A/B测试或金丝雀发布控制某个功能的影响范围,从而控制问题的影响范围。
功能的投入越小,出现问题后造成的损失就越小。还是以地震为例,震区的人口密度,建筑数量,经济规模等越小,造成的损失也就越小。在软件开发中,我们可以通过迭代来减少每次发布的功能数量,从而减少功能错误所带来的损失。我们还可以进一步通过拆卡来减少每张故事卡的时间和人力投入,从而减少故事卡错误所带来的损失。当然,这里的假设都是,我们不会基于未验证的的功能构建新的功能,如果违反该假设的话,我们需要把所有未验证的功能作为一个整体考虑,如果出错,损失也会变大。
建立反馈
仅仅通过降低损失还不足以应对未知问题,我们还需要建立反馈机制把未知问题变成已知问题。即使我们把损失降到最低,如果同样的问题反复发生的话也会累积成很大的损失。把未知问题变成已知问题后,我们就可以从问题中学习,减少类似问题的发生。
反馈的前两步是定义问题和寻找根因,我们已经在超越表象,深入核心:让ChatGPT帮你进行深度思考中对其进行了详细的介绍,这里想要强调的是我们寻找到的原因越深,能够避免的潜在问题就越多。
第三步是制定方案,我们已经在如何做出合格的技术分析和 如何进行Bug分析中进行了详细的介绍,就不再缀述,这里想要强调的是解决方案一定落到优化流程和提升能力两个方面。
第四步是实施方案。这是最关键的一步,有了方案不代表就一定能够实施,笔者看到过太多的方案最后不了了之。究其原因,有的是因为方案不切实际,有的是因为方案不够聚焦,团队疲于应对,还有的是因为方案没有落实到人。这里的重点是,我们需要对方案的实施情况进行度量,及时对方案进行改进。
在软件开发中,迭代复盘会议和PIR是最常见的两个反馈机制,但它们都侧重于反馈流程中的前三步,团队内部需要建立相应的机制来确保方案的实施,度量和改进,这样我们才能不断的将未知问题转换为已知问题,形成一个持续学习改进的良性循环。
总结
承认未知问题的存在并不意味着我们可以不用努力避免问题,恰恰相反,我们需要尽最大努力来避免问题,做到零缺陷。只有在零缺陷的前提下,通过降低损失和建立反馈来处理未知问题才有意义。否则,我们将无法区分未知问题和已知问题。
所以,战术上我们要确保零缺陷,战略上我们要承认未知问题的存在,培养从问题中学习的能力,尽可能降低问题造成的损失并建立反馈机制,这样我们才能处理好未知问题。