V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qce7
V2EX  ›  程序员

我可能遇到了假 Java 程序员

  •  
  •   qce7 · 2018-02-09 13:12:49 +08:00 · 8432 次点击
    这是一个创建于 2260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    忍不住来 v2 吐槽了,由于业务需要,我们部门和另一个部门的系统要做频繁的接口交互,但是,他们的接口有百分之几的概率会出险空指针异常,各种 504,更奇葩的还会出险访问 A 接口会返回 B 接口的数据。。

    这样的情况持续了大半年,年前任务不多昨天终于忍不住找到他们一个开发,帮他找到日志,定位到了一个存储 sql 数据的对象,对其引用居然是 static 的。。

    他们部门接近 10 个 java 程序员,项目上线这么久居然才发现,还是我这个其他部门的 phper 发现并给出解决方案的,觉得有点奇葩

    第 1 条附言  ·  2018-02-09 13:59:26 +08:00
    语言之争没必要,我只是工作用 PHP,业余搞 Python。。Java 是好语言,只是和 PHP 有同样的问题就是使用者水平参差不齐,没有好的规范和开发流程什么系统到后期都是一坨翔
    第 2 条附言  ·  2018-02-09 14:24:16 +08:00
    抱歉之前没说清楚,他们开发的是公司内部核心业务系统,这个问题发生在整个系统的数据查询类,所有接口都要调用这个对象,所以不是小问题,只是对于他们下面的人觉得这个问题不是自己造成的,是“框架问题”,他们老大对自己曾经写的东西又不会重新检查,我们提了这个问题提了半年都是敷衍了事~
    第 3 条附言  ·  2018-02-10 10:55:43 +08:00

    我没有那边代码库权限,回忆了一下,情况差不多就是这样,大家瞻仰一下,刚看到代码时我的心情也是崩溃的

    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;
        }
    }
    
    67 条回复    2018-02-11 14:49:11 +08:00
    wxsm
        1
    wxsm  
       2018-02-09 13:16:19 +08:00   ❤️ 3
    少见多怪
    yulitian888
        2
    yulitian888  
       2018-02-09 13:17:47 +08:00
    这事程序员不背锅吧,架构师呢,代码审查呢,单元测试呢?
    3a3Mp112
        3
    3a3Mp112  
       2018-02-09 13:18:38 +08:00
    为什么不能引用 static?
    ai277014717
        4
    ai277014717  
       2018-02-09 13:20:48 +08:00
    @3a3Mp112 用 static 估计多线程时变量有了两种状态
    XinLake
        5
    XinLake  
       2018-02-09 13:23:50 +08:00 via Android
    在这样的公司有个可以预料的未来。

    问题解决了你可能揭别人的短,影响你的职业发展。
    问题没解决碰一鼻子灰。

    反正都是得罪人没收益的事情,楼主做法真是下策啊
    imnpc
        6
    imnpc  
       2018-02-09 13:24:23 +08:00
    应该是引用的条件 /参数 是动态的 根据传参来变动 然后他们直接写死了?
    zjsxwc
        7
    zjsxwc  
       2018-02-09 13:25:45 +08:00
    楼主不应该高兴吗,以后甩锅有人可以接了
    lfzyx
        8
    lfzyx  
       2018-02-09 13:30:33 +08:00   ❤️ 1
    java 程序员基本上是培训班出来的,这事挺正常的
    feverzsj
        9
    feverzsj  
       2018-02-09 13:32:41 +08:00
    java 码农这各群体,水平比较低是正常的
    3a3Mp112
        10
    3a3Mp112  
       2018-02-09 13:33:09 +08:00
    @qce7 楼主能不能说一下为什么不能引用 static
    winglight2016
        11
    winglight2016  
       2018-02-09 13:35:47 +08:00
    static 一般要和 final 联合使用,不然就会多线程会出问题
    qce7
        12
    qce7  
    OP
       2018-02-09 13:36:02 +08:00
    @yulitian888 代码审查,单元测试都不存在的,架构师有没有履行指责不知道。。因为并发才会出现问题,又是概率性的,在他们的内部系统里面让员工重新点击一下就可以
    @XinLake 你说的很有道理,之前我每天基本要花好多时间检查跟他们对接日志,手动修改数据库,浪费不少时间,总之就是咽不下这口气,还是年少气盛😂
    @ai277014717 @imnpc 写死全局共用一个静态对象属性存放所有查询结果,还在每次调用前初始化👀
    gxbb097528
        13
    gxbb097528  
       2018-02-09 13:41:54 +08:00
    类成员变量用不用 static 并发都会有问题的吧
    qce7
        14
    qce7  
    OP
       2018-02-09 13:43:17 +08:00
    @3a3Mp112 static 所标记的对象属性在全局共享,并发请求会相互覆盖,我的理解,不知道用 java 黑话咋说
    overhell
        15
    overhell  
       2018-02-09 13:44:24 +08:00
    话说我看到个做 8 年的 java 的 ,一样出现这样的问题 ,问题是他找半天还找不出问题。
    我用 Threadlocal 帮他包了一下,他还问我 threadlocal 是什么东西。。。

    java 程序员真的 10 个里面真的难找出 1,2 个稍微好的。。。或许不应该叫他们程序员 。。。
    choulinlin
        16
    choulinlin  
       2018-02-09 13:45:43 +08:00 via Android   ❤️ 1
    @winglight2016 多线程要用互斥锁 跟 final 有啥关系
    不都不要装好佬
    calming
        17
    calming  
       2018-02-09 13:47:49 +08:00
    开始黑 java 了?好吧,你们的语言都是最好的。
    overhell
        18
    overhell  
       2018-02-09 13:48:17 +08:00
    @choulinlin 他可能是觉得 final 的一般是基本类型 。。哈哈
    choulinlin
        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 的悲哀啊
    ppaapc
        20
    ppaapc  
       2018-02-09 13:54:48 +08:00
    这就是写这段代码的人水平太差,跟其他人有什么关系,一个内部系统谁没事还看同事的代码
    veelog
        21
    veelog  
       2018-02-09 13:57:57 +08:00 via iPhone
    phper 竟然还有权限看 java 代码呀
    yufpga
        22
    yufpga  
       2018-02-09 14:01:07 +08:00
    这个不单单是 java 程序员,现在很多程序员都有这个问题,代码写的不多,废话特多,不会 debug,出现问题全靠猜
    willakira
        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 来保证对外服务的质量
    alamaya
        24
    alamaya  
       2018-02-09 14:08:05 +08:00
    @choulinlin 安全发布看一下
    overhell
        25
    overhell  
       2018-02-09 14:08:49 +08:00   ❤️ 1
    @willakira 感谢回复 , 只遇到过内存溢出 ,内存泄漏可以举个例子看下吗。
    KasonPasser
        26
    KasonPasser  
       2018-02-09 14:09:31 +08:00
    还有就是还有很多人都不会异常的处理,更是有的是捕获异常了都不处理。
    picasso250
        27
    picasso250  
       2018-02-09 14:14:13 +08:00
    你看,楼主发了一条,在我看来是实锤的.

    底下仍然一个:为什么不能 static?

    ???

    都出 bug 了,实际情况都在这里了,不管茴香豆的茴字有几种写法,这里肯定是不能用的.
    irisfor
        28
    irisfor  
       2018-02-09 14:19:49 +08:00
    @picasso250 问的应该是 用 static 会出什么具体的问题(比如被覆盖?有泄漏?)吧。。并不是说能不能用
    picasso250
        29
    picasso250  
       2018-02-09 14:22:07 +08:00
    @irisfor 是我激动了.

    从现象看:
    问 A 接口会返回 B 接口的数据

    分析:
    这个应该每个接口 new 一个才正确.(至少)
    sean328
        31
    sean328  
       2018-02-09 14:38:34 +08:00
    有这么黑 java 的吗,php 和 java 的 static 关键字的作用不一样吧,而且 java 对象引用使用 static 到底怎么了?
    overhell
        32
    overhell  
       2018-02-09 14:41:20 +08:00
    @willakira 感谢,其实点出来问题,我应该自己好好搜搜去看看的 ,麻烦兄台了。。
    cuebyte
        33
    cuebyte  
       2018-02-09 14:44:53 +08:00
    麻烦各位 phper 查下薪资统计再来黑 java,谢谢。
    x7395759
        34
    x7395759  
       2018-02-09 15:29:21 +08:00
    一个多线程问题而已,你只是遇到了工资没有你高的程序员呀。非要上升到语言的高度,拿衣服啊。
    th00000
        35
    th00000  
       2018-02-09 15:49:05 +08:00
    楼主这个问题看似是来吐槽的, 实际上已经发展为吐槽 java 这个语言有多 low 这个问题的讨论
    @overhell 这个同志连 java 程序员不算程序员这种话都说得出来, 我得问您高就啊? 说出来让我们乐呵乐呵
    orangeTop
        36
    orangeTop  
       2018-02-09 16:04:45 +08:00
    那大家都用什么语言啊
    Rickkkkkkk
        37
    Rickkkkkkk  
       2018-02-09 16:08:40 +08:00
    php 果然是最好的语言

    10 个里面 10 个都是大牛

    java 就不一样了, 10 个里面只有一个勉强能称呼为程序员

    @overhell
    luosuosile
        38
    luosuosile  
       2018-02-09 16:14:25 +08:00
    java 程序员都不算程序员了,那还有哪些程序员敢说自己是程序员?
    真觉得程序员这职业很高大上了?
    wfd0807
        39
    wfd0807  
       2018-02-09 16:16:57 +08:00
    最基础的知识都不会,却张嘴闭嘴设计模式、系统架构、高可用、千万并发...张嘴就要百万年薪、应聘都是技术经理级别起步,我就纳闷了,这个行业咋变成这样了?
    potatowish
        40
    potatowish  
       2018-02-09 16:18:20 +08:00
    黑 java 的自己的水平也可见一斑,也好意思出来评论
    overhell
        41
    overhell  
       2018-02-09 16:29:45 +08:00
    @Rickkkkkkk
    @th00000

    不好意思,让你们误解了。我本身也是 java 码农 ,技术也渣的很 。不是程序员不是指所有,而是那 10 个里面的 8,9 个。
    th00000
        42
    th00000  
       2018-02-09 16:55:47 +08:00
    楼主手动沉底算拉倒了, 真不想在 v2 看见这种帖子, 阴阳怪气
    flight2006
        43
    flight2006  
       2018-02-09 16:59:01 +08:00
    什么情况下接口 1 能返回接口 2 的数据? 难道接口返回的是字符串?
    WuwuGin
        44
    WuwuGin  
       2018-02-09 17:06:40 +08:00 via Android
    明明是业务水平的讨论怎么就有人看成黑 Java 了,玻璃心不管学什么语言一样改变不了,楼上各位所谓 Java 程序员一看就是什么都不懂一直黑 PHP,遇见跳脸的直接急了。不信另开一贴黑 PHP 大家都很快乐🤣。
    gowk
        45
    gowk  
       2018-02-09 17:18:04 +08:00
    呵呵呵,被 Spring 搞昏了头的一群废柴
    ppaapc
        46
    ppaapc  
       2018-02-09 17:21:25 +08:00   ❤️ 1
    这种贴子最大的好处就是 block 一些眼瞎和有脑残言论的人
    veightz
        47
    veightz  
       2018-02-09 17:45:22 +08:00
    @ppaapc 以及年末划水图开心~
    yuchenyang1994
        48
    yuchenyang1994  
       2018-02-09 17:46:57 +08:00
    少见多怪,我们有个 sql 把库删了,虽然那张表没啥用,但我尿都吓出来了,这个东西维持了 2 年
    tanszhe
        49
    tanszhe  
       2018-02-09 17:59:16 +08:00
    这么明显的问题 出现这么久原因就两个:
    1. 态度太差 敷衍了事 不想解决
    2. 水平太差
    pmispig
        50
    pmispig  
       2018-02-09 18:02:11 +08:00
    为了解决这个问题,我们做了日志关键字监控,专门抓空指针,检测到就报警抓人处理,从开始一天几百几千,到现在几乎没有了
    wizardforcel
        51
    wizardforcel  
       2018-02-09 18:09:58 +08:00 via Android
    php 应该不会出这问题吧,对象生命周期都不一样。
    asuka02
        52
    asuka02  
       2018-02-09 18:13:39 +08:00 via iPhone
    @overhell 那你告诉我什么叫程序员?
    whello
        53
    whello  
       2018-02-09 18:16:42 +08:00 via Android
    其实很多 985 的入门语言就是 Java
    woscaizi
        54
    woscaizi  
       2018-02-09 18:17:03 +08:00 via iPhone
    static 部分的代码可以简单贴一下吗?我觉得这更多的是开发流程的问题吧,楼主说的那些问题应该在自测,code review 阶段消灭。程序员的水平有高有低,应该让开发流程来让程序可用。
    TheBestSivir
        55
    TheBestSivir  
       2018-02-09 18:17:27 +08:00
    @overhell 哭哭,Java 程序员遍布所有一二线互联网公司啊。淘宝,网易和我司甚至几乎全线 java,都被地图炮了呀,哭哭
    kaneg
        56
    kaneg  
       2018-02-09 18:39:42 +08:00 via iPhone
    这是人的问题,Java 不背这个锅。这样的人给他们什么语言都一样。
    HangoX
        57
    HangoX  
       2018-02-09 22:16:39 +08:00 via Android
    楼主少见多怪。。JAVA 后台很多都这样
    willakira
        58
    willakira  
       2018-02-10 11:09:13 +08:00
    这个其实 Code Review 就差不多可以检查出来了…

    流程需要改进

    不过那个团队的心态还蛮有问题的… 一副“代码部署后,那管洪水滔天“的样子…
    ligo
        59
    ligo  
       2018-02-10 14:40:18 +08:00 via Android
    请教为什么 query 结果不直接返回,这是设计模式吗
    qce7
        60
    qce7  
    OP
       2018-02-10 15:37:51 +08:00
    @ligo 我猜是为了在其他的对象方法中可以简化调用查询结果,而不是用形参传递
    enzohobmg
        61
    enzohobmg  
       2018-02-10 21:04:51 +08:00
    跟 java 有什么关系 扯犊子
    beginor
        62
    beginor  
       2018-02-11 07:01:58 +08:00 via Android
    这个也碰到过,非 static 也的 connection 对象也会这样, 并发量一大就出现了。 不只是代码审核,压力测试也能测出问题。
    atcdef
        63
    atcdef  
       2018-02-11 08:59:16 +08:00   ❤️ 1
    就是把本该作为对象成员的设置成了类成员,导致 new 了两个类的实例,A 对象设置 sql 设置完,还没来得及执行查询,B 对象又设置了 sql,由于这个 sql 成员是静态成员,所有该类的对象共享的,然后 A 类再执行查询时执行了 B 设置的 sql,结果当然不对啦。
    atcdef
        64
    atcdef  
       2018-02-11 09:01:19 +08:00
    不过我觉得,这一般不该由程序员背锅,是架构的锅,缺少责任心。
    renke
        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 结果。
    另外,你们好像天生就知道每个关键字的用法?
    目前的大环境下面,有多少人是因为对应业务场景或者工作需求去研究语言细节,又有多少人因为兴趣去研究语言细节?
    49gd
        66
    49gd  
       2018-02-11 11:18:03 +08:00
    可能是菜 可能是没责任心 跟什么语言没什么关系吧
    TZ
        67
    TZ  
       2018-02-11 14:49:11 +08:00
    写出这样的垃圾代码,我服气
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5362 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:00 · PVG 17:00 · LAX 02:00 · JFK 05:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.