目录

【复盘】一次看似“客户端事故”的问题

目录

今天这篇文章,回顾一下最近我这边真实发生的一次线上问题。

那天下午,我正在忙手头的事情,客服群突然反馈了一个问题。我简单看了下描述,用户是鸿蒙端,表现上看是有个资源没加载出来,我第一反应是:

大概率是用户网络环境不好导致。

于是让客服向用户要操作录屏,以便后续排查。我继续干手头的事情。

过了一会儿,录屏发来了。客服表示用户没有任何特殊操作,正常使用就会复现。

这时我拿起手头的测试机尝试复现——结果没有复现

这个时候我的思考:这个问题非常明显,但是这个功能最近端上没有任何改动,估计是偶发的兼容问题,等我有空的时候找一样的手机研究下。

然而,又过了一个小时后,客服再次反馈:

已经有 7 个进线客诉

这一下我的警觉性被彻底拉起来了。

7 个客诉意味着什么?

这基本可以判定为非偶发问题。

我突然联想到:

昨天是鸿蒙端新版本放量的日子。

我瞬间“恍然大悟”,赶紧安装市场包测试——果然:

  • 成功复现
  • 每次必现

而换成最新代码版本

  • 不复现

这时候,说不慌是假的。


我立刻同步开发当前现状,同时联系版本负责人,希望问题修复后能加一个临时版本发市场。

对方回复:

正好有个新版本今晚要发,能修完就跟这个版本。

此时开发开始评估问题。

然而事情开始变得复杂起来。

由于结论是:

  • 新版本没问题
  • 市场包有问题

开发尝试把代码回退到老版本排查。

结果——老代码跑不起来了。

开发表示,是最近有很多依赖升级导致。客诉还在增长, 此时大家焦头烂额。

但是,当初的那个疑问依然困扰着我,也困扰着开发:

最近我们根本没有改动相关代码。

但鸿蒙这条线一直流程不够稳定,各团队又在快速适配,所以我们的思考方向是:

是不是被别人的改动影响了?


就在大家焦头烂额的时候,有人突然问了我一句:

版本负责人说今晚要发市场的是什么版本?

我一下子愣住了。

对啊。

今晚要发的到底是哪个版本?

当时我的脑子里只有“问题版本”和“新版本”,但没有建立清晰的版本坐标。

我马上回到客服群重新核对。

结果发现:

客诉既来自1版本,也来自2版本

当时脑子确实太乱了,连这个信息都没有观察到。

再打开版本日历——瞬间全明白了:

  • 当前市场:1版本
  • 少量内测用户:2版本
  • 今晚要发市场:2版本
  • 下周合入 master:3版本

于是我赶紧继续验证,得到一个非常清晰的结论:

1、2版本必现,3版本一定没问题。


但新的疑问又出现了:

1版本已经放量一周。

如果问题这么严重——

为什么直到今天才爆发客诉?

而且还是集中出现。

这时,我终于走在了正确的道路上,开始怀疑:

真的是客户端问题吗?


马上抓包。

很快发现异常:

  • 2版本少下发了一个字段。
  • 3版本正常。

这时我突然想起:

最近后台似乎做过一次改动——支持鸿蒙版本的下发控制。

一个推测迅速形成:

在做版本控制时,不小心把老版本需要的字段截掉了。

为了验证,我直接 mock 了3版本的返回值给 2版本。

结果:问题彻底消失。

至此,基本实锤。

后面的动作就很顺畅了:

  • 同步结论
  • 告知版本今晚无需等待我们
  • 找相关同事修复代码

一次看似“客户端事故”的问题,最终定位为:

服务端版本控制误伤老版本。


一切尘埃落定后,我开始进行复盘。没人来追究责任,只是需要看看到底问题出在哪,以及哪些地方可以做得更好。

1. 责任在谁?

引发问题的这个后台需求我是知道的,这个需求是为了配合我这边的一个需求而提出的。该后台需求完成后,我负责验证我这边的需求,至于谁来验证这个后台需求本身,我没有收到也没有主动进行沟通。事后我收集了信息,这个后台需求标注为自测需求,这个级别意味着由开发自测后即可上线。其实这个需求非常简单,从我的经验看标自测没有问题。此外,在需求文档中没有看到和版本控制相关的内容。

最后,我认为这是一起主要因流程不规范导致的问题,两个团队没有做好沟通。其次,导致问题的代码错误是一个低级错误。最后,产品经理没有重视这个改动,没有事先拟好版本控制的方案,开发也没有及时把他的方案同步出来。

2.客诉产生后我的表现如何?

1.第一次客诉

第一次客诉时,我快速判定为疑似网络问题,立即尝试复现,复现未果后要求录屏,没有立即跟进。不开上帝视角的情况下,我认为不立即跟进的行为无可厚非。然而,此处犯了一个很大的错误,在有客户端bug的可能性时,没有去安装用户的版本来复现,而是只用了手边的最新版本。虽然大概率来说旧版本的问题新版本可以复现,但也不能排除另一种可能性。

2.客诉快速上升之后

这个阶段我立即提升了问题的优先级进行跟进,然后也犯了一个很大的错误:没有分析问题产生的版本,这导致了后续花费了更多的时间排查问题。然后,在初步判定是客户端问题时,我立即通知了版本负责人,这一步没有问题。

这次最大的反思在于:一定要建立版本坐标系

当被问到“今晚发哪个版本”时,我居然卡住了。确实因为鸿蒙接入不久,还没有形成肌肉记忆,然而,版本坐标系应当是主动去建立的。

以后我会强制自己做到:

  • 当前市场版本
  • 灰度版本
  • 内测版本
  • 开发主线

随时可答。

这是测试的基本盘。