【复盘】一次看似“客户端事故”的问题
今天这篇文章,回顾一下最近我这边真实发生的一次线上问题。
那天下午,我正在忙手头的事情,客服群突然反馈了一个问题。我简单看了下描述,用户是鸿蒙端,表现上看是有个资源没加载出来,我第一反应是:
大概率是用户网络环境不好导致。
于是让客服向用户要操作录屏,以便后续排查。我继续干手头的事情。
过了一会儿,录屏发来了。客服表示用户没有任何特殊操作,正常使用就会复现。
这时我拿起手头的测试机尝试复现——结果没有复现。
这个时候我的思考:这个问题非常明显,但是这个功能最近端上没有任何改动,估计是偶发的兼容问题,等我有空的时候找一样的手机研究下。
然而,又过了一个小时后,客服再次反馈:
已经有 7 个进线客诉。
这一下我的警觉性被彻底拉起来了。
7 个客诉意味着什么?
这基本可以判定为非偶发问题。
我突然联想到:
昨天是鸿蒙端新版本放量的日子。
我瞬间“恍然大悟”,赶紧安装市场包测试——果然:
- 成功复现
- 每次必现
而换成最新代码版本:
- 不复现
这时候,说不慌是假的。
我立刻同步开发当前现状,同时联系版本负责人,希望问题修复后能加一个临时版本发市场。
对方回复:
正好有个新版本今晚要发,能修完就跟这个版本。
此时开发开始评估问题。
然而事情开始变得复杂起来。
由于结论是:
- 新版本没问题
- 市场包有问题
开发尝试把代码回退到老版本排查。
结果——老代码跑不起来了。
开发表示,是最近有很多依赖升级导致。客诉还在增长, 此时大家焦头烂额。
但是,当初的那个疑问依然困扰着我,也困扰着开发:
最近我们根本没有改动相关代码。
但鸿蒙这条线一直流程不够稳定,各团队又在快速适配,所以我们的思考方向是:
是不是被别人的改动影响了?
就在大家焦头烂额的时候,有人突然问了我一句:
版本负责人说今晚要发市场的是什么版本?
我一下子愣住了。
对啊。
今晚要发的到底是哪个版本?
当时我的脑子里只有“问题版本”和“新版本”,但没有建立清晰的版本坐标。
我马上回到客服群重新核对。
结果发现:
客诉既来自1版本,也来自2版本。
当时脑子确实太乱了,连这个信息都没有观察到。
再打开版本日历——瞬间全明白了:
- 当前市场:1版本
- 少量内测用户:2版本
- 今晚要发市场:2版本
- 下周合入 master:3版本
于是我赶紧继续验证,得到一个非常清晰的结论:
1、2版本必现,3版本一定没问题。
但新的疑问又出现了:
1版本已经放量一周。
如果问题这么严重——
为什么直到今天才爆发客诉?
而且还是集中出现。
这时,我终于走在了正确的道路上,开始怀疑:
真的是客户端问题吗?
马上抓包。
很快发现异常:
- 2版本少下发了一个字段。
- 3版本正常。
这时我突然想起:
最近后台似乎做过一次改动——支持鸿蒙版本的下发控制。
一个推测迅速形成:
在做版本控制时,不小心把老版本需要的字段截掉了。
为了验证,我直接 mock 了3版本的返回值给 2版本。
结果:问题彻底消失。
至此,基本实锤。
后面的动作就很顺畅了:
- 同步结论
- 告知版本今晚无需等待我们
- 找相关同事修复代码
一次看似“客户端事故”的问题,最终定位为:
服务端版本控制误伤老版本。
一切尘埃落定后,我开始进行复盘。没人来追究责任,只是需要看看到底问题出在哪,以及哪些地方可以做得更好。
1. 责任在谁?
引发问题的这个后台需求我是知道的,这个需求是为了配合我这边的一个需求而提出的。该后台需求完成后,我负责验证我这边的需求,至于谁来验证这个后台需求本身,我没有收到也没有主动进行沟通。事后我收集了信息,这个后台需求标注为自测需求,这个级别意味着由开发自测后即可上线。其实这个需求非常简单,从我的经验看标自测没有问题。此外,在需求文档中没有看到和版本控制相关的内容。
最后,我认为这是一起主要因流程不规范导致的问题,两个团队没有做好沟通。其次,导致问题的代码错误是一个低级错误。最后,产品经理没有重视这个改动,没有事先拟好版本控制的方案,开发也没有及时把他的方案同步出来。
2.客诉产生后我的表现如何?
1.第一次客诉
第一次客诉时,我快速判定为疑似网络问题,立即尝试复现,复现未果后要求录屏,没有立即跟进。不开上帝视角的情况下,我认为不立即跟进的行为无可厚非。然而,此处犯了一个很大的错误,在有客户端bug的可能性时,没有去安装用户的版本来复现,而是只用了手边的最新版本。虽然大概率来说旧版本的问题新版本可以复现,但也不能排除另一种可能性。
2.客诉快速上升之后
这个阶段我立即提升了问题的优先级进行跟进,然后也犯了一个很大的错误:没有分析问题产生的版本,这导致了后续花费了更多的时间排查问题。然后,在初步判定是客户端问题时,我立即通知了版本负责人,这一步没有问题。
这次最大的反思在于:一定要建立版本坐标系。
当被问到“今晚发哪个版本”时,我居然卡住了。确实因为鸿蒙接入不久,还没有形成肌肉记忆,然而,版本坐标系应当是主动去建立的。
以后我会强制自己做到:
- 当前市场版本
- 灰度版本
- 内测版本
- 开发主线
随时可答。
这是测试的基本盘。