V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yannxia
V2EX  ›  问与答

为什么感觉 Java 面试难度更难?

  •  1
     
  •   yannxia · 2020-05-10 09:09:44 +08:00 · 8885 次点击
    这是一个创建于 1418 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:笔者在公司内属于多语言工作(做项目杂)

    在出去面试的时候,同样的后端开发工程师差不多等级的公司和薪资水平的岗位,对于 Java 的面试难度感觉'背'的知识点是最多的,其他语言比如 Go 面试时,问的内容就会相对变少很多。

    我认为是 Java 行业的从业人员巨大,门槛现在变的比较高,大家怎么看。(无语言攻击性……)

    第 1 条附言  ·  2020-05-10 11:14:07 +08:00
    不讨论语言设计问题之类,JVM 居然在初级开发面试里面都要占很大一部分,这的确有点奇怪。从我看来 JVM 通过阅读了《深入理解 JVM 》这类书籍只会也并不会初级阶段的工作产生什么太过于有效的帮助。(并不是说不用学,对于大部分人来说这部分内容属于锦上添花),在 Go 面试的过程中,初级职位可能对于如何实现 Goroutine 的实现原理即可,而 Java 甚至于对 '锁' 产生了极度变态的要求要求。
    68 条回复    2020-07-26 21:26:48 +08:00
    linvon
        1
    linvon  
       2020-05-10 09:22:41 +08:00
    Java 有他自己的一套知识体系,比较庞大复杂
    kidult
        2
    kidult  
       2020-05-10 09:33:08 +08:00
    轮子多,车型多,当然企业招你的时候最好你会开的车型越多越好咯
    limbo0
        3
    limbo0  
       2020-05-10 09:38:12 +08:00 via iPhone
    Java 的知识点本来就比较多,一个 map 就有好多种实现
    charlie21
        4
    charlie21  
       2020-05-10 09:40:58 +08:00
    怎么就不肯承认自己基础不行呢?
    yjxjn
        5
    yjxjn  
       2020-05-10 09:58:23 +08:00
    没办法,确实好多东西需要背,不像其他,Java 语言体系丰富,从 Java 基础来说,重载重写,抽象类接口,多态,final 之类的,list,set map 也能问不少,还可以再问问 SQL 调优啥的,你想想这就得多少时间过去了,还不包括问框架的内容和 Java 项目经验
    namelosw
        6
    namelosw  
       2020-05-10 09:59:54 +08:00   ❤️ 13
    因为 Java 渣哇。

    做点啥都需要各种拐杖。搞不了 cluster 要上各种数据库,搞不了 messaging 要上各种 broker,以前还得有 Tomcat Jetty 这种完全没用的东西,以前同步 Spring 性能菜的抠脚,一个 Exception 挂一个线程。这也不行那也不行,所以做点啥简单的东西就要学上几十样技术。全家人伺候的小少爷,创造了无数就业岗位。

    不服?对比 Erlang/Elixir,一般的需求各种 Redis,Kafka,Zookeeper,Job scheduler 都用不上,复杂的偶尔用一下,一般最多用个数据库。锁?并发?分布式?全白送,根本不用学到头破血流。

    说白了 Java 难完全是因为所有人都非得用一个不适合 Web 的语言来写 Web,所以人人都得学到能造火箭的程度。
    dcalsky
        7
    dcalsky  
       2020-05-10 10:02:44 +08:00 via Android
    光是 jvm 就够喝一壶的了( ´͈ ⌵ `͈ )
    wysnylc
        8
    wysnylc  
       2020-05-10 10:03:23 +08:00
    @namelosw #6 是是是您说得对
    hlwjia
        9
    hlwjia  
       2020-05-10 10:04:50 +08:00
    @namelosw EVM 牛逼!
    woshiaha
        10
    woshiaha  
       2020-05-10 10:18:41 +08:00
    都 2020 年了还有人说 Java 渣的 都已经懒得反驳了
    murmur
        11
    murmur  
       2020-05-10 10:19:55 +08:00
    别的语言在造轮子,java 已经是一个帝国了,难度能是一个级别么
    Sapp
        12
    Sapp  
       2020-05-10 10:27:50 +08:00   ❤️ 1
    @charlie21 #4 基础行的人是真的不好招,我招了俩月前端,也就一两个基础可以的(知道基本数据结构,能说清各个版本 http,能说清 js 事件循环,vue 、react 的一些基础实现原理),然而并没有什么用,这种人根本不缺工作,招了他也不一定来,来了也不一定留下。其实大多数时候只能矮子里挑将军,差不多就行,只有人实在多到挑花眼才会要求越来越高。
    jin7
        13
    jin7  
       2020-05-10 10:28:28 +08:00   ❤️ 5
    记忆力越好 脑容量越大 面试越容易
    charlie21
        14
    charlie21  
       2020-05-10 10:39:02 +08:00
    @Sapp 开的钱多 就好招了
    araaaa
        15
    araaaa  
       2020-05-10 10:40:34 +08:00 via iPhone
    就是因为没啥东西可以面了所以才会问你所谓原理。
    HiShan
        16
    HiShan  
       2020-05-10 10:44:36 +08:00   ❤️ 2
    @namelosw Java 不渣啊,怎么张口就来。。。Erlang/Elixir 要是厉害的话用的人为什么不多呢?
    namelosw
        17
    namelosw  
       2020-05-10 10:54:34 +08:00
    因为业界和我国一样,是按闹分配的。简单说,把 Sun 和爱立信换一下,Erlang 给 Sun,Java 给爱立信,这个世界就反过来了。

    厉害的东西有得是,但是编程又不是决斗,差一点就会死,只要不是写不出来,人就会一直用已有工具,很少会关心有没有更好的方案。

    再比如 Map filter 这些 60 年代就已经很成熟了, 业界 2013 年主流才用上,还不像其他有 trade off 的技术,Martin Fowler 认为 map filter 是 net win 。现在能用 map 还有谁用 for 循环,但是中间这半个多世纪人都干嘛去了……
    yannxia
        18
    yannxia  
    OP
       2020-05-10 11:07:13 +08:00
    @charlie21 只是表达相同招聘情况下觉得 Java 向更吃力,没说自己基础扎实哈。
    yannxia
        19
    yannxia  
    OP
       2020-05-10 11:16:07 +08:00
    @dcalsky Java 初级开发搞定 JVM 在面试过程中的成本 > go 初级开发搞定面试的成本。
    cabing
        20
    cabing  
       2020-05-10 11:16:53 +08:00
    供大于求。
    noogler67
        21
    noogler67  
       2020-05-10 12:49:31 +08:00 via iPhone
    @Sapp 介绍一下你给基础好的人开的薪资
    luckyrayyy
        22
    luckyrayyy  
       2020-05-10 12:50:54 +08:00   ❤️ 2
    因为内卷
    silvernoo
        23
    silvernoo  
       2020-05-10 13:19:12 +08:00   ❤️ 2
    感觉 java 的东西并不多。主要是 jvm 的东西有点多,java 作为最不 native 的语言,竟然经常纠结一些原理上的东西。
    noogler67
        24
    noogler67  
       2020-05-10 13:20:46 +08:00
    @Sapp 对基础很有信心的,可能不会去干前端。你说的基础我也不知道。知道事件循环就可以。vue,react 实现原理不算基础吧。计算机原理才算。vue react 实现原理属于对框架不光知道怎么用,还知道基本怎么实现。
    AslanFong
        25
    AslanFong  
       2020-05-10 13:25:21 +08:00
    Erlang 没有和 java 一样在 90 00 10 年代运用和发展是有原因的。
    Making reliable distributed systems in the presence of sodware errors 这篇里面有讲。
    所以不能说,站在现在的背景下,说前面发展 java 是不对的。要考虑历史的进程不是?
    AslanFong
        26
    AslanFong  
       2020-05-10 13:29:43 +08:00
    上面有个同学说的,内卷,是真的。
    现在招聘,都是问这些问题。比方说校招,问很多虚拟机的问题,但是一般学生平时真的不会碰到这些问题,只有背。
    别人背,你不背,就是输了是不是。没办法。
    yannxia
        27
    yannxia  
    OP
       2020-05-10 15:41:27 +08:00
    @silvernoo Java 的考点可能一大半在 JVM 上,我是觉得有点扯,JVM 作为 C++构建的东西,不管你怎么背,就像是学《操作系统》那本书,你永远只是知道有进程线程这些概念,对于真正的实现是无从得知的。那如果深入 JVM 了,怕不是可以去撸 CPP 了。所以就到现在大家都需要背点 JVM 的知识,然而又都算不上多深入。
    HongJay
        28
    HongJay  
       2020-05-10 15:45:33 +08:00   ❤️ 2
    就是人多内卷。哪有什么为什么
    fishCatcher
        29
    fishCatcher  
       2020-05-10 15:52:16 +08:00 via iPhone   ❤️ 2
    因为 go 市面上没那么多面经
    drackzy
        30
    drackzy  
       2020-05-10 16:14:54 +08:00
    语言流行程度减去培训班数量基本等于大概的面试相对难易度
    我之前小众语言的看 java 和 php 的面经总结的特别细
    mmdsun
        31
    mmdsun  
       2020-05-10 16:41:40 +08:00 via Android
    因为 Java 面试的人多,程序员基数大。所以只能加大面试难度来筛选人。
    AaronChan
        32
    AaronChan  
       2020-05-10 16:45:00 +08:00 via Android
    都想转其他语言了
    HENQIGUAI
        33
    HENQIGUAI  
       2020-05-10 17:12:52 +08:00
    Java 太强了,天下第一不是吹出来的。

    更底层的一些知识其实并不能只算到 Java 头上,简而言之就是不会这些你也可以搞 Java

    但不是合格的程序员
    realkenshinji
        34
    realkenshinji  
       2020-05-10 17:17:28 +08:00 via iPhone
    @HiShan 因为没有国内培训班
    realkenshinji
        35
    realkenshinji  
       2020-05-10 17:18:26 +08:00 via iPhone
    @silvernoo 国内面试要纠结这些,国外面试用不着,一般考两个 leetcode 题目外加系统设计聊聊就行了
    xiaofan305
        36
    xiaofan305  
       2020-05-10 20:00:15 +08:00
    考试为什么考这么多偏题难题?
    最近不是禁止考偏题怪题了嘛.
    为什么? 两个原因,
    1, 人太多, 原来的筛选方式不合适, 要用新的筛选方式.
    2. 选择偏题怪题, 考官的出题水平不够, 所以用偏题怪题来筛选人.
    CoderGeek
        37
    CoderGeek  
       2020-05-10 20:05:42 +08:00
    看市场
    namelosw
        38
    namelosw  
       2020-05-10 20:06:40 +08:00
    @AslanFong 我没说前面发展 Java 不对,而是说完全是一个自由市场的产业生态问题,砸钱推广和自生自灭效果完全不一样。公平只考虑历史进程的话 Java 绝不可能在 95 年跳出来突然大杀四方。

    有点类似松下 vs 三星的等离子 vs 液晶问题,如果反过来三星持有等离子,松下持有液晶还是同样的策略世界可能就是反过来了。一旦市场被挤没,几乎就没有翻身的可能。
    hello2060
        39
    hello2060  
       2020-05-10 20:47:28 +08:00
    @yjxjn 重载重写,抽象类接口,多态,final 之类的,list,set map 也能问不少 这些难道不是任何面向对象语言都有的东西吗?有哪个正常一点的语言还没有 list set map, 原理都是一样的啊
    mosfet
        40
    mosfet  
       2020-05-10 21:10:36 +08:00
    Go 一般都直接内部转了,真要在市场招个合适的还是有点难的
    Go 也相对“简陋”,不像 Java,光 JVM 就有一大堆可说的
    wm5d8b
        41
    wm5d8b  
       2020-05-10 21:47:24 +08:00
    面试造火箭,来了拧螺丝,有什么意义吗?更何况实际只会画火箭,真要求造一节,还造不出来。
    wm5d8b
        42
    wm5d8b  
       2020-05-10 21:49:17 +08:00
    不说造火箭,真能把每一颗螺丝都安在正确的位置,就可以算得上是优秀人才了
    cedoo22
        43
    cedoo22  
       2020-05-10 21:54:07 +08:00
    @wm5d8b 比喻太贴切了, 各种型号螺丝 扳手, 能用正确的扳手(配置)扳动正确的螺丝的人 都能找到一碗饭吃。所以记忆力好的人 优势很大
    chihiro2014
        44
    chihiro2014  
       2020-05-10 21:55:03 +08:00   ❤️ 1
    深入理解 JVM 感觉其实并没有任何用,不如把代码写写好才是王道
    feelinglucky
        45
    feelinglucky  
       2020-05-10 22:03:56 +08:00
    面 golang 的人员话其实可能更多的不会在语言本身方面,其实很多用 golang 的都是第二甚至第 N 语言了,例如一般其实问 iface 和 eface 之间的区别差异能回答清楚其实就差不多了,但是其他配套的生态例如微观层面系统、容器、网络这些;宏观层面架构、高可用等等,用 golang 的话还是必须需要了解的(这里黑下某宇宙条,就是个拧螺丝的面你 mb 的算法)

    这块 Java 刚好相反毕竟发展了那么多年,先不说配套的中间件和环境这些,JVM 衍生出来的二级语言和场景都有很多,哪个不是知识点,但 Java 的从业人员又太多了很多时候不问些比较「为难」的问题,根本就不知道应聘者的知识边界在哪里。再加上很多业内甚至很多大厂的技术出生的面试官压根就没有经过系统面试培训的,因此根本就不知道怎么去客观判断应聘者的能力,只能靠这些所谓的面试题「错一杀百」反正僧多粥少也不缺应聘者。
    yc8332
        46
    yc8332  
       2020-05-10 22:12:31 +08:00
    感觉面 jvm 的,除非真搞底层优化的,平时开发真心毛用都没有。
    NeinChn
        47
    NeinChn  
       2020-05-10 22:44:27 +08:00
    @namelosw
    "一个 Exception 挂一个线程。"
    评价一下 Golang 的 panic 挂掉整个进程,不仅仅是 Goroutine 的设计呗
    "搞不了 messaging 要上各种 broker"
    除了 Erlang 天生自带 messaging,那 Python 和 Golang 是不是也都坑呢
    "同步 Spring 性能菜的抠脚"
    怎么看待大部分场景 Python 连长连接都没法做,只能短链接同步调用的情况....
    namelosw
        48
    namelosw  
       2020-05-10 23:26:10 +08:00   ❤️ 1
    @NeinChn
    大部分进程模型都有这些问题,只是 Java 被用得太多了,所以大部分 Critical 场景都用了 Java 。但是 Java 搞这些东西很难,只能交给专业人士才能写,还不能保证一次写对。我的意思是 Java 这么难学,是把 Java 当银弹的后果。

    相比之下人们不会让 Python 去做这些事。但是简单或者中等的这些场景 Python 很简单,或者参考 Rails,其实一个中型的 Rails 网站往往也不需要这些中间件,一点普通的东西加个 Sidekiq 就搞定。虽然理论上和 Java 一样差,但是至少开发效率有优势,也没那么多所谓的组件,模式,架构各种造火箭的东西要学。

    Go 比较特殊,因为它现在已经逐渐被用在 critical 组件上了。
    但是考虑到 Java 的面试里入门就有很多严苛的锁问题,所以有 Goroutine 就不用 suffer 这个问题。
    不过 Goroutine 没有解决异常,所以相比之下 Erlang 进程不会 suffer 这个问题。所以比起来 Go 还是有它的局限性的,不过我发现异常没有锁那么难搞,所以差不太多。

    个人认为一个技术场景“适合”,不考虑生态问题,技术本身航讲,一定程度上就是在要解决的问题上不要新增额外的技术问题,也就是不“添乱”。比如写个 HTTP server 本来是很简单的事情,本质上就是 socket 上的字符串来回:
    用 Java 用线程写就要特别仔细考虑异步 /锁 /异常,一不小心就有隐秘的 bug
    用 Go 的 Goroutine 写就只需要特别考虑异常
    用 Erlang 的默认 one_for_one 进程写就没什么特别需要考虑的了。
    starmoon1994
        49
    starmoon1994  
       2020-05-10 23:27:56 +08:00
    @chihiro2014 深入理解 JVM 感觉其实并没有任何用,不如把代码写写好才是王道

    --- 这个不赞同

    当你的数据量上去了,或者应用莫名其妙崩了的时候,你就知道 JVM 知识的用处了,否则连排查思路都找不到
    gadsavesme
        50
    gadsavesme  
       2020-05-10 23:39:08 +08:00
    说深入理解 jvm 没有任何作用的人是认真的吗。。你们的工作只有码 if else 代码吗?没有出 bug 需要做优化调优的时候吗。。。
    NeinChn
        51
    NeinChn  
       2020-05-10 23:52:01 +08:00   ❤️ 1
    @namelosw

    难学么,感觉也还行吧,如果说大家都要做到 60 分的话,确实可能 Python 做的快很多,而且效率也高
    但是如果大家都要往 80 分做,Java 会明显更简单一点(毕竟 GIL 挡在那 CPU 密集型操作除了换成 C 写没有别的方法
    Java 生态上,只做后端 Server 基本就是 Spring 大一统(国内),入门成本虽然高,但是换家公司几乎一样的技术栈
    其他语言生态虽然看起来简单,但是每个公司实现都不太相同,没有一种一致的 pattern,有好有坏吧

    但是很多技术也是一样的,比如并发读写 map 这个最简单的场景吧,Python/Golang/Java 都得加锁
    当然每个语言都提供了对应的解决方案,但是前提要有意识才能用对....
    chihiro2014
        52
    chihiro2014  
       2020-05-10 23:58:06 +08:00
    @starmoon1994 除非你真的从编译层面去理解 JVM,不然你平时开发,根本不会去进行 JVM 调优。
    luckyrayyy
        53
    luckyrayyy  
       2020-05-11 00:06:10 +08:00 via iPhone
    @NeinChn 我不太了解 Python 和 golang,就针对对 map 加锁的场景,请问这两个语言是否提供了简易好用的加锁方式?

    Java 蛋疼的就在于有直接关键字加锁,还有可重入锁接口加锁,还有官方给的带锁 map,还不止一个。每一个的实现方式不一样,加锁的关键字在不同 jdk 版本的实现方式也不一样,这些都要考……其他语言面试也这么问吗?
    huntcool001
        54
    huntcool001  
       2020-05-11 00:09:46 +08:00
    99.9%的公司也用不上 JVM 调优. 最多就调一下 GC, 到了 Java 8 后面的版本默认 G1 了也没啥值得调的了.

    我学 JVM 就纯粹觉得有意思而已...看看自己每天用的东西到底咋实现的
    NeinChn
        55
    NeinChn  
       2020-05-11 00:27:14 +08:00   ❤️ 1
    @luckyrayyy
    锁都是类似的,不过 Java 的锁确实多很多
    但是基础的读写锁 /互斥锁各个语言基本一样
    Golang 的 sync.Map 目前 clean+dirty 双读然后加锁回写的机制,没有类似 ConcurrentHashMap 那种分桶锁+红黑树实现
    Python 虽然说有 GIL 很多情况下可以不考虑 thread-safe,但是实际非 atomic 操作一样要加锁
    主要是 Java 实现太完善了,有 hashmap,有 linked map,有 tree map.基本业务需要的都有...
    还都是基础库....
    knowckx
        56
    knowckx  
       2020-05-11 00:27:44 +08:00   ❤️ 1
    我最近在面 Golang 的高级开发,go 语言本身常规的面试问题无非是:
    1.runtime ( GMP 和 GC )
    2.一些语言内建类型的源码问题
    3.协程并发常见的实践,上下文,sync 包之类的
    然后基本上语言这块就 OK 了。
    JAVA 就不一样了,面试的时候面试官的问题更多,更细致,更理论化。

    但是再想想的话,其实作为后端开发,也就语言上的问题不一样。
    后续的数据库 /缓存 /MQ/分布式,无论是 Go 开发还是 JAVA 开发,大家需要掌握的东西是一样的。
    整体看来,大家需要掌握的知识量其实差不多。
    zackwan95
        57
    zackwan95  
       2020-05-11 03:16:18 +08:00
    @Sapp "各个版本 http,能说清 js 事件循环,vue 、react 的一些基础实现原理" 这些玩意儿叫基础?这些破问题有辨识度?假如培训班群体作案你今天问完明天全部人都有面经了你怎么区分?说到底你们这些人为啥会觉得别人应该会这种问题啊,下班没事去背题库么。还有数据结构,你招前端问哪个数据结构? linkedlist ? tree ?你做前端你用过?
    zackwan95
        58
    zackwan95  
       2020-05-11 03:24:46 +08:00   ❤️ 2
    @Sapp 我并不是说面试不能问这些破题,反正横竖得用一些不客观的东西来衡量,但是会不会这些题真的跟基础没关系好么,也跟技术关系不大好么
    Sapp
        59
    Sapp  
       2020-05-11 08:35:37 +08:00 via iPhone
    @zackwan95 你可真有意思,哪个培训班会背这些?你去看看培训班都是背的什么问题好吗?数据结构队列和堆是不是要知道? 这不是基础中的基础? HTTP 不是基础中的基础? js 事件循环不是基础中的基础? react 原理不是基础?
    Sapp
        60
    Sapp  
       2020-05-11 08:36:32 +08:00 via iPhone
    @zackwan95 看来 v2 人多之后真是水货暴增
    zackwan95
        61
    zackwan95  
       2020-05-11 09:02:55 +08:00
    @Sapp 哟,搬砖码农还有优越感呢。react 原理是哪门子基础,哪个大学教,http 哪个大学教,js 哪个大学教,大学不教,好的培训班教,算哪门子基础?
    zackwan95
        62
    zackwan95  
       2020-05-11 09:05:06 +08:00
    @Sapp 你说的这些玩意儿脑瓜子正常的人看两分钟能不会?初中生看看文档都能学会好么
    p1gd0g
        63
    p1gd0g  
       2020-05-11 09:11:35 +08:00
    所以 goroutine 实现原理是什么。。。(一年应届 golang 开发。
    另外 golang 的 panic 只挂协程,不会挂进程。
    yannxia
        64
    yannxia  
    OP
       2020-05-11 10:10:02 +08:00
    @knowckx 嗯嗯,主要难在第二点上,GO 的 MAP 内建实现相对简单,而 JAVA 的内建实现总是能给你扯到一些 JVM 的实现上去。所以 JAVA 面试过程中总是夹带着虚拟机的问题,而 GO 就没啥人问你 GO 的编译器又是怎么做的。
    Junzhou
        65
    Junzhou  
       2020-07-26 19:30:30 +08:00
    我说我怎么产生了学 Java 比学 C++麻烦的念头,曾经一度纠结 要不我还是撸 C++吧?
    yannxia
        66
    yannxia  
    OP
       2020-07-26 19:45:55 +08:00
    @Junzhou 现在转 Java 不怎么划算,略看好 Rust……
    Junzhou
        67
    Junzhou  
       2020-07-26 20:52:22 +08:00
    @yannxia 我现在主是 Java,一边还在看 golang 。
    yannxia
        68
    yannxia  
    OP
       2020-07-26 21:26:48 +08:00
    @Junzhou 这个也不错,我觉得中间件领域 Java 应该会日益萎缩,也就是大数据还能撑一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3487 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:00 · PVG 19:00 · LAX 04:00 · JFK 07:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.