忍不住来 v2 吐槽了,由于业务需要,我们部门和另一个部门的系统要做频繁的接口交互,但是,他们的接口有百分之几的概率会出险空指针异常,各种 504,更奇葩的还会出险访问 A 接口会返回 B 接口的数据。。
这样的情况持续了大半年,年前任务不多昨天终于忍不住找到他们一个开发,帮他找到日志,定位到了一个存储 sql 数据的对象,对其引用居然是 static 的。。
他们部门接近 10 个 java 程序员,项目上线这么久居然才发现,还是我这个其他部门的 phper 发现并给出解决方案的,觉得有点奇葩
我没有那边代码库权限,回忆了一下,情况差不多就是这样,大家瞻仰一下,刚看到代码时我的心情也是崩溃的
public class SqlCore {
public static SqlRes sqlRes = null;
public static void query(String sql) {
SqlCore.sqlRes = Db.excuse(sql);
}
// 后边还有各种static,非static方法,感觉那边分不清什么时候用static
}
public class XService {
void main() {
SqlCore sqlXX = new SqlCore();
String sql = "select * from tablename";
SqlCore.query(sql);
SqlRes sqlRes = SqlCore.sqlRes;
}
}
1
wxsm 2018-02-09 13:16:19 +08:00 3
少见多怪
|
2
yulitian888 2018-02-09 13:17:47 +08:00
这事程序员不背锅吧,架构师呢,代码审查呢,单元测试呢?
|
3
3a3Mp112 2018-02-09 13:18:38 +08:00
为什么不能引用 static?
|
4
ai277014717 2018-02-09 13:20:48 +08:00
@3a3Mp112 用 static 估计多线程时变量有了两种状态
|
5
XinLake 2018-02-09 13:23:50 +08:00 via Android
在这样的公司有个可以预料的未来。
问题解决了你可能揭别人的短,影响你的职业发展。 问题没解决碰一鼻子灰。 反正都是得罪人没收益的事情,楼主做法真是下策啊 |
6
imnpc 2018-02-09 13:24:23 +08:00
应该是引用的条件 /参数 是动态的 根据传参来变动 然后他们直接写死了?
|
7
zjsxwc 2018-02-09 13:25:45 +08:00
楼主不应该高兴吗,以后甩锅有人可以接了
|
8
lfzyx 2018-02-09 13:30:33 +08:00 1
java 程序员基本上是培训班出来的,这事挺正常的
|
9
feverzsj 2018-02-09 13:32:41 +08:00
java 码农这各群体,水平比较低是正常的
|
11
winglight2016 2018-02-09 13:35:47 +08:00
static 一般要和 final 联合使用,不然就会多线程会出问题
|
12
qce7 OP @yulitian888 代码审查,单元测试都不存在的,架构师有没有履行指责不知道。。因为并发才会出现问题,又是概率性的,在他们的内部系统里面让员工重新点击一下就可以
@XinLake 你说的很有道理,之前我每天基本要花好多时间检查跟他们对接日志,手动修改数据库,浪费不少时间,总之就是咽不下这口气,还是年少气盛😂 @ai277014717 @imnpc 写死全局共用一个静态对象属性存放所有查询结果,还在每次调用前初始化👀 |
13
gxbb097528 2018-02-09 13:41:54 +08:00
类成员变量用不用 static 并发都会有问题的吧
|
15
overhell 2018-02-09 13:44:24 +08:00
话说我看到个做 8 年的 java 的 ,一样出现这样的问题 ,问题是他找半天还找不出问题。
我用 Threadlocal 帮他包了一下,他还问我 threadlocal 是什么东西。。。 java 程序员真的 10 个里面真的难找出 1,2 个稍微好的。。。或许不应该叫他们程序员 。。。 |
16
choulinlin 2018-02-09 13:45:43 +08:00 via Android 1
@winglight2016 多线程要用互斥锁 跟 final 有啥关系
不都不要装好佬 |
17
calming 2018-02-09 13:47:49 +08:00
开始黑 java 了?好吧,你们的语言都是最好的。
|
18
overhell 2018-02-09 13:48:17 +08:00
@choulinlin 他可能是觉得 final 的一般是基本类型 。。哈哈
|
19
choulinlin 2018-02-09 13:54:34 +08:00 via Android
事实上 java 码农还看不起 phper 呢
没有完整异常体系啊 低级啊 连 class 都不需要啊 错误难以找到啊 没有好 ide 啊 php 国内以前找工作的确很亏 都是 discuz phpwind 垃圾代码 没啥好工作 有些 java 码农反而一培训毕业就有 6 7k 那时 phper 毕业生才 2 3k php 的悲哀啊 |
20
ppaapc 2018-02-09 13:54:48 +08:00
这就是写这段代码的人水平太差,跟其他人有什么关系,一个内部系统谁没事还看同事的代码
|
21
veelog 2018-02-09 13:57:57 +08:00 via iPhone
phper 竟然还有权限看 java 代码呀
|
22
yufpga 2018-02-09 14:01:07 +08:00
这个不单单是 java 程序员,现在很多程序员都有这个问题,代码写的不多,废话特多,不会 debug,出现问题全靠猜
|
23
willakira 2018-02-09 14:01:31 +08:00 2
@overhell
ThreadLocal 用不好很容易 memory leak,一般直接加锁来共享 mutable 的 object,或者 static final immutable 的 黑 Java 没啥必要,其他语言不好的程序员也是一抓一大把 这里很明显是流程上的问题,既没有 Code review 也没有 unit test,想必也就没有 integration 和完整的部署流程,例如 canary release 之类的吧 而且看样子对方那个组也没有 SLO/SLA 来保证对外服务的质量 |
24
alamaya 2018-02-09 14:08:05 +08:00
@choulinlin 安全发布看一下
|
26
KasonPasser 2018-02-09 14:09:31 +08:00
还有就是还有很多人都不会异常的处理,更是有的是捕获异常了都不处理。
|
27
picasso250 2018-02-09 14:14:13 +08:00
你看,楼主发了一条,在我看来是实锤的.
底下仍然一个:为什么不能 static? ??? 都出 bug 了,实际情况都在这里了,不管茴香豆的茴字有几种写法,这里肯定是不能用的. |
28
irisfor 2018-02-09 14:19:49 +08:00
@picasso250 问的应该是 用 static 会出什么具体的问题(比如被覆盖?有泄漏?)吧。。并不是说能不能用
|
29
picasso250 2018-02-09 14:22:07 +08:00
|
30
willakira 2018-02-09 14:26:08 +08:00 2
|
31
sean328 2018-02-09 14:38:34 +08:00
有这么黑 java 的吗,php 和 java 的 static 关键字的作用不一样吧,而且 java 对象引用使用 static 到底怎么了?
|
33
cuebyte 2018-02-09 14:44:53 +08:00
麻烦各位 phper 查下薪资统计再来黑 java,谢谢。
|
34
x7395759 2018-02-09 15:29:21 +08:00
一个多线程问题而已,你只是遇到了工资没有你高的程序员呀。非要上升到语言的高度,拿衣服啊。
|
35
th00000 2018-02-09 15:49:05 +08:00
楼主这个问题看似是来吐槽的, 实际上已经发展为吐槽 java 这个语言有多 low 这个问题的讨论
@overhell 这个同志连 java 程序员不算程序员这种话都说得出来, 我得问您高就啊? 说出来让我们乐呵乐呵 |
36
orangeTop 2018-02-09 16:04:45 +08:00
那大家都用什么语言啊
|
37
Rickkkkkkk 2018-02-09 16:08:40 +08:00
|
38
luosuosile 2018-02-09 16:14:25 +08:00
java 程序员都不算程序员了,那还有哪些程序员敢说自己是程序员?
真觉得程序员这职业很高大上了? |
39
wfd0807 2018-02-09 16:16:57 +08:00
最基础的知识都不会,却张嘴闭嘴设计模式、系统架构、高可用、千万并发...张嘴就要百万年薪、应聘都是技术经理级别起步,我就纳闷了,这个行业咋变成这样了?
|
40
potatowish 2018-02-09 16:18:20 +08:00
黑 java 的自己的水平也可见一斑,也好意思出来评论
|
41
overhell 2018-02-09 16:29:45 +08:00
|
42
th00000 2018-02-09 16:55:47 +08:00
楼主手动沉底算拉倒了, 真不想在 v2 看见这种帖子, 阴阳怪气
|
43
flight2006 2018-02-09 16:59:01 +08:00
什么情况下接口 1 能返回接口 2 的数据? 难道接口返回的是字符串?
|
44
WuwuGin 2018-02-09 17:06:40 +08:00 via Android
明明是业务水平的讨论怎么就有人看成黑 Java 了,玻璃心不管学什么语言一样改变不了,楼上各位所谓 Java 程序员一看就是什么都不懂一直黑 PHP,遇见跳脸的直接急了。不信另开一贴黑 PHP 大家都很快乐🤣。
|
45
gowk 2018-02-09 17:18:04 +08:00
呵呵呵,被 Spring 搞昏了头的一群废柴
|
46
ppaapc 2018-02-09 17:21:25 +08:00 1
这种贴子最大的好处就是 block 一些眼瞎和有脑残言论的人
|
48
yuchenyang1994 2018-02-09 17:46:57 +08:00
少见多怪,我们有个 sql 把库删了,虽然那张表没啥用,但我尿都吓出来了,这个东西维持了 2 年
|
49
tanszhe 2018-02-09 17:59:16 +08:00
这么明显的问题 出现这么久原因就两个:
1. 态度太差 敷衍了事 不想解决 2. 水平太差 |
50
pmispig 2018-02-09 18:02:11 +08:00
为了解决这个问题,我们做了日志关键字监控,专门抓空指针,检测到就报警抓人处理,从开始一天几百几千,到现在几乎没有了
|
51
wizardforcel 2018-02-09 18:09:58 +08:00 via Android
php 应该不会出这问题吧,对象生命周期都不一样。
|
53
whello 2018-02-09 18:16:42 +08:00 via Android
其实很多 985 的入门语言就是 Java
|
54
woscaizi 2018-02-09 18:17:03 +08:00 via iPhone
static 部分的代码可以简单贴一下吗?我觉得这更多的是开发流程的问题吧,楼主说的那些问题应该在自测,code review 阶段消灭。程序员的水平有高有低,应该让开发流程来让程序可用。
|
55
TheBestSivir 2018-02-09 18:17:27 +08:00
@overhell 哭哭,Java 程序员遍布所有一二线互联网公司啊。淘宝,网易和我司甚至几乎全线 java,都被地图炮了呀,哭哭
|
56
kaneg 2018-02-09 18:39:42 +08:00 via iPhone
这是人的问题,Java 不背这个锅。这样的人给他们什么语言都一样。
|
57
HangoX 2018-02-09 22:16:39 +08:00 via Android
楼主少见多怪。。JAVA 后台很多都这样
|
58
willakira 2018-02-10 11:09:13 +08:00
这个其实 Code Review 就差不多可以检查出来了…
流程需要改进 不过那个团队的心态还蛮有问题的… 一副“代码部署后,那管洪水滔天“的样子… |
59
ligo 2018-02-10 14:40:18 +08:00 via Android
请教为什么 query 结果不直接返回,这是设计模式吗
|
61
enzohobmg 2018-02-10 21:04:51 +08:00
跟 java 有什么关系 扯犊子
|
62
beginor 2018-02-11 07:01:58 +08:00 via Android
这个也碰到过,非 static 也的 connection 对象也会这样, 并发量一大就出现了。 不只是代码审核,压力测试也能测出问题。
|
63
atcdef 2018-02-11 08:59:16 +08:00 1
就是把本该作为对象成员的设置成了类成员,导致 new 了两个类的实例,A 对象设置 sql 设置完,还没来得及执行查询,B 对象又设置了 sql,由于这个 sql 成员是静态成员,所有该类的对象共享的,然后 A 类再执行查询时执行了 B 设置的 sql,结果当然不对啦。
|
64
atcdef 2018-02-11 09:01:19 +08:00
不过我觉得,这一般不该由程序员背锅,是架构的锅,缺少责任心。
|
65
renke 2018-02-11 09:38:08 +08:00
sqlRes 指得难道不是 sqlResult ?
并发时,客户端 1 调用 A,客户端 2 调用 B,1 查询结束,sqlRes=result1,还来得及没有返回,2 查询结束,sqlRes=result2 ,此时返回 sqlRes 其实是 result2,所以,调用 A,返回了 B 结果。 另外,你们好像天生就知道每个关键字的用法? 目前的大环境下面,有多少人是因为对应业务场景或者工作需求去研究语言细节,又有多少人因为兴趣去研究语言细节? |
66
49gd 2018-02-11 11:18:03 +08:00
可能是菜 可能是没责任心 跟什么语言没什么关系吧
|
67
TZ 2018-02-11 14:49:11 +08:00
写出这样的垃圾代码,我服气
|