匿名职言 面试题:你工作中碰到的印象比较深的 bug,你怎么处理的?

尹思 · 2021年01月11日 · 最后由 Jacky 回复于 2021年06月05日 · 14782 次阅读

我感觉自己说的拉垮了:

  1. 测试中发现了一个使用 Integer 作为自增 id 的,当数值过大时,自增 id 开始变为负数

  2. 测试的时候先抓接口查看报错情况,再查询服务器日志(撒谎的),定位到报错的原因,发 bug,然后转给相应的开发,最后跟踪没问题了关闭 bug

3.把该问题加入到回归测试用例里面,对其他数据库的自增 id 进行排查

面试官:你在这个没起到多少作用呀

我:???

求问基础扎实的大神,这类问题该怎么回答

共收到 31 条回复 时间 点赞

我觉得可以朝着三个方向拓展回答。

第一个方向,往业内大厂开源的类库引发的 bug 说,这类 bug 往往比较知名,有可能就能引起面试官的共鸣,例如 druid,fastjson 等引起的性能的或安全的 bug,这些是如何影响你们的业务的,你们是怎么排查出来的,怎么解决的。

第二个方向,往 jvm,操作系统层面说,比如莫名奇妙 cpu 利用率 100%、GC 异常、OOM、socket 连接数过大等,如何分析这些问题,有什么样的工具可以用,这些问题如何解决的,怎么验证是否得到了解决等。

第三个方向,往业务、需求、用户行为方面说,如何发现这些低复现率 bug,你的埋点方案是什么,都采集了哪些数据,如何进行的数据分析,出现 bug 的根因是什么,以后如何避免再出现类似的 bug

楼上的 k8s 走天下

印象深指的是难发现、难处理、较稀有的 bug,例如:通过工具扫描发现 php 的版本漏洞绕过证书验证直接控制用户系统,或者说一些事件比较大条的线上 bug,导致损失的。

孟越彬 回复

我是最擅长 k8s, 不过这有错么😂 😂

这位小哥,一看就是老面试人了,

孙高飞 回复

厉害

我也提供一个例子。上家公司有个很简单的点赞取赞功能,测试时正常点赞取赞功能正常,但是用 jmeter 去压这 2 个接口,虽然都是取赞点赞,但是最终的点赞数却一直变大,不是理想的 0/1。然后后面就开始扯定位了,开发的代码里锁没有加好,队列消费有问题。。。。。

https://testerhome.com/topics/16406
这个是我记忆比较深刻的一个 bug。当时在对某个接口进行压测的时候分析总数据对不上,开发一直没有头绪。经过测试结果分析,代码排查,最后帮开发定位到了原因。

感谢大佬们,学到了很多了

楼主的回答主要还是没体现技术含量。一般问这个问题其实是想通过这个例子了解你的技术水平,以及是否能说得清 bug 背后的原理、原因及解决方案。

如果沿着楼主这个例子,作为面试官期望听到:
1、为何会出现这个问题,是 mysql 某个版本的 bug 还是官方有明确说过会出现这个问题?官方给出的正确用法是什么?
2、开发的具体修复方式是怎样的,改了什么代码或者配置?这个改进方案会不会只是掩盖问题,而非解决问题?(比如 Integer 改为 Long ,延迟问题的发生)
3、后续怎么把这个变成规范或者流程,尽可能保障以后其他人、其他项目不会再踩同样的坑?

之前遇到一个 bug,购物车增加商品时,当遇到有小数的商品价格,购物车的金额显示了很长的小数,最终定位到是 JS 的浮点数相乘导致的精确度不准确,属于语言本身问题,可用其他方式规避,例如 *100 后再计算等等,不过对于价格类的更推荐是后端去计算。

以前发现一个 bug,开发找了 1 个周没找到原因,后面开发请假,帮他修改了打了个补丁,后面开发请吃了顿饭。哈哈

能体现技术含量的,比如性能问题,可靠性问题,安全性问题,底层问题等,你怎么推动解决这个问题的。进一步讲会不会存在类似的共性问题,总结出什么经验分享给团队。

最好讲下你是如何通过技术手段,一步一步去分下排查原因的。

记一个自己写的 bug(对全局变量,类变量生命周期不理解导致的)
有个变量叫 today,是格式化后的今天日期,很多地方用到,我就把它封装到了工具类的全局变量中。

本地调试没问题,结果是正常,在服务端跑也是正常的。可是第二天获取的日期就不对,还是前一天的日期。
难道是缓存的问题?重试服务试试,结果还真的就行了。搞定,笑嘻嘻~
可是到第三天,怎么又是变成了前一天的日期???真的是见鬼了。
本地调试看看,代码没问题啊,能正常获取。这到底是怎么回事啊!
难道 Python 标准库出问题了?不会吧。换 Django 日期工具类试试。
推送代码,重新部署服务,看看获取结果,一切正常。妥妥的。这下应该不会再有问题了吧?
又是一天早上,哦豁,怎么结果又是获取了昨天的日期。
我不信,重启服务。嗯,结果是对的,果然重启能解决 99% 的问题。
就这样,通过定时任务每天重启服务的方式过了几个月。

直到有一天,要获取一个当前时间戳的变量,也是很多地方用到。代码大概是这样

一看日志,恍然大悟

[12/Jan/2021 21:17:15] "GET /api/kafka/config/ HTTP/1.1" 200 216
time is: 1610457411.562096
[12/Jan/2021 21:17:26] "GET /api/kafka/template/ HTTP/1.1" 200 5838
time is: 1610457411.562096
[12/Jan/2021 21:17:29] "GET /api/kafka/template/ HTTP/1.1" 200 5838
time is: 1610457411.562096
[12/Jan/2021 21:17:31] "GET /api/kafka/template/ HTTP/1.1" 200 5838

可以看到打印的 t 一直是没变化的,但日志时间是不停变化的
t 是类变量,并不会在 list 方法结束后就释放内存,然后下次请求进来重新获取。而是程序重启之后才会重新获取。
之前 today 那个坑不容易看出来,因为是日期,隔天才变化。

孙高飞 回复

你这是一招鲜,吃遍天。。。😂

钱天磊 回复

不明白你想说什么,YYGQ?

钱天磊 回复

你从另一个角度看,就是专精某一个领域。 这年头不都说要成为领域专家不要做杂而不精么。

而且我好像写过挺多其他的类似自动化测试啊, 持续集成啊,大数据啊之类的东西。 我也不是除了 k8s 什么都不会。 只不过我最擅长 k8s 那我就总拿 k8s 来说事呗

孙高飞 回复

飞哥这一套连招,面试官听完,直接就缴械投降了

lv 回复

面试,要学会装逼😂

胡致远 回复

阴阳怪气?汉字不会打了?
而且我哪里阴阳怪气了?我的意思不就是单纯表达他精通这个领域吗?你心里这么阴暗的吗?鸡脑子一天天想什么呢?

孙高飞 回复

我的意思就是想说你对这个精通【没想其他】,也不知道上面一个人怎么就说我是阴阳怪气,我也是无语了

钱天磊 回复

淡定淡定, 文字比较冰冷。 感受不到语气,比较容易误解

还是要说清楚和需求的关系,和开发的关系,自己的工作流程和关键技术难点,最后还要强调他人的合作。
套路,千层套路。

郝黎昕 回复

补充一下,这个不是语言的问题,是本身浮点数精度有限造成的,比如,每个语言都有这个问题,比如:https://draveness.me/whys-the-design-floating-point-arithmetic/

所以如果要做金额类精确计算,要不全部转整数进行计算,要不用各个语言提供的科学计算库(如 java 的 BigDecimal)。

所以说,这道题考的是语文

孙高飞 回复

请教下,这个问题你说是 k8s 1.8 版本的问题,后面是升级到 1.16 版本解决了,为啥是高版本升低版本?可能是我没理解,求解,感谢大佬

严博超 回复

那个啥 1.16 比 1.8 高了 8 个版本号呢~~ 你理解错了

孙高飞 回复

他这是当小数算呢😄

这种问题,总归要是耗时间,耗精力,多学习,多合作的才是高逼格。
楼主确实做的不错,不过在后面两点不涉及,可以换个 case 说说

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册