V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
qce7
V2EX  ›  程序员

我可能遇到了假 Java 程序员

  •  
  •   qce7 · Feb 9, 2018 · 9517 views
    This topic created in 3009 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

    java 程序员真的 10 个里面真的难找出 1,2 个稍微好的。。。或许不应该叫他们程序员 。。。
    choulinlin
        16
    choulinlin  
       Feb 9, 2018 via Android   ❤️ 1
    @winglight2016 多线程要用互斥锁 跟 final 有啥关系
    不都不要装好佬
    calming
        17
    calming  
       Feb 9, 2018
    开始黑 java 了?好吧,你们的语言都是最好的。
    overhell
        18
    overhell  
       Feb 9, 2018
    @choulinlin 他可能是觉得 final 的一般是基本类型 。。哈哈
    choulinlin
        19
    choulinlin  
       Feb 9, 2018 via Android
    事实上 java 码农还看不起 phper 呢
    没有完整异常体系啊
    低级啊
    连 class 都不需要啊
    错误难以找到啊
    没有好 ide 啊
    php 国内以前找工作的确很亏 都是 discuz phpwind 垃圾代码 没啥好工作 有些 java 码农反而一培训毕业就有 6 7k 那时 phper 毕业生才 2 3k
    php 的悲哀啊
    ppaapc
        20
    ppaapc  
       Feb 9, 2018
    这就是写这段代码的人水平太差,跟其他人有什么关系,一个内部系统谁没事还看同事的代码
    veelog
        21
    veelog  
       Feb 9, 2018 via iPhone
    phper 竟然还有权限看 java 代码呀
    yufpga
        22
    yufpga  
       Feb 9, 2018
    这个不单单是 java 程序员,现在很多程序员都有这个问题,代码写的不多,废话特多,不会 debug,出现问题全靠猜
    willakira
        23
    willakira  
       Feb 9, 2018   ❤️ 2
    @overhell
    ThreadLocal 用不好很容易 memory leak,一般直接加锁来共享 mutable 的 object,或者 static final immutable 的
    黑 Java 没啥必要,其他语言不好的程序员也是一抓一大把
    这里很明显是流程上的问题,既没有 Code review 也没有 unit test,想必也就没有 integration 和完整的部署流程,例如 canary release 之类的吧
    而且看样子对方那个组也没有 SLO/SLA 来保证对外服务的质量
    alamaya
        24
    alamaya  
       Feb 9, 2018
    @choulinlin 安全发布看一下
    overhell
        25
    overhell  
       Feb 9, 2018   ❤️ 1
    @willakira 感谢回复 , 只遇到过内存溢出 ,内存泄漏可以举个例子看下吗。
    KasonPasser
        26
    KasonPasser  
       Feb 9, 2018
    还有就是还有很多人都不会异常的处理,更是有的是捕获异常了都不处理。
    picasso250
        27
    picasso250  
       Feb 9, 2018
    你看,楼主发了一条,在我看来是实锤的.

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

    ???

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

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

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

    10 个里面 10 个都是大牛

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

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

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

    流程需要改进

    不过那个团队的心态还蛮有问题的… 一副“代码部署后,那管洪水滔天“的样子…
    ligo
        59
    ligo  
       Feb 10, 2018 via Android
    请教为什么 query 结果不直接返回,这是设计模式吗
    qce7
        60
    qce7  
    OP
       Feb 10, 2018
    @ligo 我猜是为了在其他的对象方法中可以简化调用查询结果,而不是用形参传递
    enzohobmg
        61
    enzohobmg  
       Feb 10, 2018
    跟 java 有什么关系 扯犊子
    beginor
        62
    beginor  
       Feb 11, 2018 via Android
    这个也碰到过,非 static 也的 connection 对象也会这样, 并发量一大就出现了。 不只是代码审核,压力测试也能测出问题。
    atcdef
        63
    atcdef  
       Feb 11, 2018   ❤️ 1
    就是把本该作为对象成员的设置成了类成员,导致 new 了两个类的实例,A 对象设置 sql 设置完,还没来得及执行查询,B 对象又设置了 sql,由于这个 sql 成员是静态成员,所有该类的对象共享的,然后 A 类再执行查询时执行了 B 设置的 sql,结果当然不对啦。
    atcdef
        64
    atcdef  
       Feb 11, 2018
    不过我觉得,这一般不该由程序员背锅,是架构的锅,缺少责任心。
    renke
        65
    renke  
       Feb 11, 2018
    sqlRes 指得难道不是 sqlResult ?
    并发时,客户端 1 调用 A,客户端 2 调用 B,1 查询结束,sqlRes=result1,还来得及没有返回,2 查询结束,sqlRes=result2
    ,此时返回 sqlRes 其实是 result2,所以,调用 A,返回了 B 结果。
    另外,你们好像天生就知道每个关键字的用法?
    目前的大环境下面,有多少人是因为对应业务场景或者工作需求去研究语言细节,又有多少人因为兴趣去研究语言细节?
    49gd
        66
    49gd  
       Feb 11, 2018
    可能是菜 可能是没责任心 跟什么语言没什么关系吧
    TZ
        67
    TZ  
       Feb 11, 2018
    写出这样的垃圾代码,我服气
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5665 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 154ms · UTC 07:42 · PVG 15:42 · LAX 00:42 · JFK 03:42
    ♥ Do have faith in what you're doing.