经过提示,发现:idea翻译一下源代码以后就会变成varX。
我看了一下github,代码似乎不是这样的。
这是mybatis里面io / defaultVFS的代码:
protected boolean isJar(URL url, byte[] buffer) {
try {
InputStream is = url.openStream();
Throwable var4 = null;
boolean var5;
try {
is.read(buffer, 0, JAR_MAGIC.length);
if (!Arrays.equals(buffer, JAR_MAGIC)) {
return false;
}
if (log.isDebugEnabled()) {
log.debug("Found JAR: " + url);
}
var5 = true;
} catch (Throwable var16) {
var4 = var16;
throw var16;
} finally {
if (is != null) {
if (var4 != null) {
try {
is.close();
} catch (Throwable var15) {
var4.addSuppressed(var15);
}
} else {
is.close();
}
}
}
return var5;
} catch (Exception var18) {
return false;
}
}
}
大概几个月前,遇见一个很难排除的bug。
很多人看我的文档,都以为我写的内容是:系统出了bug,所有的人都束手无策,这时候我蹦出来,三下五除二直接解决。
其实不是,真实的情况是:项目经理老菜鸟看着我这个小菜鸟,两个人开始分析、讨论、分锅、吵架。
两个菜鸟盯着一个bug一起修,修不完第二天继续修。最多的一次一个bug修了五天,吵了大概十个小时。快的bug大概七八个小时能搞定。有时候不止两个人,四五个人一起修。
有的时候是项目经理全责,有的时候是我全责,有的时候已经离职的开发全责。
最后简化一下过程,分析一下故障原因,如果当天记录的就几千字起步,如果不是当天那就只剩一两千字了。
这次的bug是个老bug。
系统的业务逻辑是这样的:XX用户买了100只鸡,这一百只鸡的名字是:鸡1、鸡2 ……鸡100。
我们的每个产品都有自己的名字,比如用户买100头驴、200只鸡、300只鸭子,我们的打的单据是:
- 用户买100头驴、200只鸡、300只鸭子
- 用户买的100头驴的名字是驴1、……鸡的名字是:鸡1……鸭子的名字是:鸭1……
假如有人说:为啥一只鸭子也要有编号?你直接计数鸭子数目不行吗?
- 问用户,用户要求系统这么设计。
- 我们的每个产品贵的几万一年,便宜的几百一个,起个名字卖给谁了、用了多久。
有一天,用户有一个正常的业务卡住了。
点击没反应。
项目经理和我一起排查这个故障,我花了五分钟直接定位了:不是用户的问题,我们系统崩了。
项目经理他不承认,他认为是我推卸责任:正常修bug不是这么快的。
于是项目经理就往前端写入数据,提交。我认为不是这个问题,所以袖手旁观。(我们一起修bug)
名场面来了:
用户提供的数据有300条,他用CV大法输入了300次,选了半个小时,然后点提交,卡死了。
项目经理不死心又刷新。前端的数据全丢了。
项目经理还是不死心,又把300条数据全部从前端输入。又丢了。
我是真的很无语:你说他不负责任吧,他勤勤恳恳的把300个数据输入进入系统,与工作态度上和袖手旁观的我天壤之别。
说他能力强吧。给他说:前面有个沟,他说:有沟我还要往前走!!!
摔的眼泪汪汪的,又可气又可笑。
我还能害他不成?我给他说前面有沟就看一下啊!
我是如何快速定位bug的呢?
是这么回事:
我们有一个用户买了价值几百元的设备,买了一万多个。
那时候我记得另一个项目组的开发说过in有最大值限制,这时候正好用得着。
bug直接排除。mysql in里面最大是1M的报文,oracle是1024个。我们用的mysql。
我直接认为是sql in炸了。单个sql可能超过1M的限制了。
PS:之前看小说斗破的时候,那个小说大概10M左右???我们单个sql1M,十个sql一本斗破。
// in里面一万条数据
select * from t1 where id in (……………………)
update t1 set condition = 1 where id in (………………)
第二种可能:select in是O(MN)的时间复杂度,估计这个sql正跑着呢,(我怀疑是第二个update炸了)
项目经理对我表示:这个业务很重要。你处理一下。
我不为所动。
干啥啊?SQL炸了,开发全锅(虽然写这个代码的人离职了,但是继任的开发接起来啊!!!数据量过大系统就炸咋做的功能??测试呢?咋通过的测试用例?)
价值千万的一条工单卡单?我担得起这个责任吗?
就算我解决了,那也应该往上抛,给开发改代码啊!系统下一次卡单也让我刷?
我认为流程是:去找开发。可是项目经理不想去找。
- 我们系统的开发是摊派过来的,负责多个系统,所以修bug要排期。
- 项目经理给开发安排任务,不给钱不给奖金也没有绩效,所以能拖就拖。
- 项目经理和开发同级
项目经理去求开发,任务直接排到这个周周末了,还得项目经理催。
用户可不会领会这一套。
有人说:你忍心让你项目经理吃这个苦?
- 他薪资是我的4-6倍。我操这个心干嘛。能者多劳,拿了这个钱可是烫手的很。
- 开发代码有问题,你让开发给我讲业务逻辑,把bug修了。可以;你给源代码让我自己看,也可以。什么都不给你让修,修啥修。
- 几千万的业务,刷错了责任谁认? 刷错了,那我可是真的全责哥了。
这时候,项目经理的将驴脾气上来了:我认为这个业务很简单啊!
之前在大学的时候,遇见过很多这样的人:不管多难的问题就认为很简单,无脑接下来;过了几天就开始哭鼻子。
项目经理一个是没办法,一个是人自负。麻溜的接下来了。
这个业务是这个样子的:改数据的话需要修改大概10多个业务表。业务逻辑是比较清晰的。
项目经理他脑子是一团浆糊,半懂不懂的。你让他去刷数据要了他命。一个业务十个表,还有其中的映射关系够令他头大的了。
忙活了大概4个小时,啥也没做出来。
- 我们系统报文是Json,项目经理看不懂Json。我给他说Json可以直接解析出来看,他说JSON解析了以后丢格式。
- 他想写个sql替换掉Json报文中错误的部分,然后问我如何用replace替换Json格式。
- 处理不了以后,他就把JSON当做字符串,用\n把数据拆分了。看着Json看不懂,问我为啥(格式都裁错了当然看不懂)
- 我给他说,你看键值对,他说他不懂啥叫做键值对。让他括号分隔,他非要/n分隔(因为核心业务在列表里面)
这几板斧下去,是个人就知道和他说话费脑子。
懂业务啥啊,网上关于JSON的课程就一个小时包教包会,你四个小时够看四遍的。你不看JSON解析抱着你那三板斧不放???
我看不下去,给他补了。补了大概半个小时。
坏消息是:补错了。
为啥补错了呢?
- 我没有技术文档。也没有给源代码。我实际上是不知道这个业务执行了哪些sql……只能靠经验瞎琢磨。
- 所有的东西都在我脑子里面存着,可是取出来的时候取错了。
- 一般计费的业务我是死活不碰的,这个业务也就刷了两三次,业务不精。
我一时犯浑,弄错了一个字段。
责任在我。
过了几天,用户找过来了:数据没有。
项目经理又是在系统几十个表里面查。最后定位到是我的问题。
因为出的问题是比较简单的,所以直接排除了。
项目经理又不高兴了:你干的是啥啊!!!拍着我肩膀说:下一次上上心。
真·全责哥。你说你可以刷、你刷了、你弄错了,你当然全责。对吧?
工作本应该是开发、项目经理负责的。应该他们两个人把bug修了。
开发啥也没做,项目经理啥也没做,非逼着维护不按照业务流程刷数据。干完了以后对了一点奖励没有、不领情,出了问题维护又全责。
保证没有下一次了,下一次让你自己去找开发去。
作者:青碧凝霜
链接:https://leetcode-cn.com/circle/discuss/c40Pde/