为什么感觉 Java 面试难度更难?
背景:笔者在公司内属于多语言工作(做项目杂)
在出去面试的时候,同样的后端开发工程师差不多等级的公司和薪资水平的岗位,对于 Java 的面试难度感觉’背’的知识点是最多的,其他语言比如 Go 面试时,问的内容就会相对变少很多。
我认为是 Java 行业的从业人员巨大,门槛现在变的比较高,大家怎么看。(无语言攻击性……)
背景:笔者在公司内属于多语言工作(做项目杂)
在出去面试的时候,同样的后端开发工程师差不多等级的公司和薪资水平的岗位,对于 Java 的面试难度感觉’背’的知识点是最多的,其他语言比如 Go 面试时,问的内容就会相对变少很多。
我认为是 Java 行业的从业人员巨大,门槛现在变的比较高,大家怎么看。(无语言攻击性……)
做点啥都需要各种拐杖。搞不了 cluster 要上各种数据库,搞不了 messaging 要上各种 broker,以前还得有 Tomcat Jetty 这种完全没用的东西,以前同步 Spring 性能菜的抠脚,一个 Exception 挂一个线程。这也不行那也不行,所以做点啥简单的东西就要学上几十样技术。全家人伺候的小少爷,创造了无数就业岗位。
不服?对比 Erlang/Elixir,一般的需求各种 Redis,Kafka,Zookeeper,Job scheduler 都用不上,复杂的偶尔用一下,一般最多用个数据库。锁?并发?分布式?全白送,根本不用学到头破血流。
说白了 Java 难完全是因为所有人都非得用一个不适合 Web 的语言来写 Web,所以人人都得学到能造火箭的程度。
厉害的东西有得是,但是编程又不是决斗,差一点就会死,只要不是写不出来,人就会一直用已有工具,很少会关心有没有更好的方案。
再比如 Map filter 这些 60 年代就已经很成熟了, 业界 2013 年主流才用上,还不像其他有 trade off 的技术,Martin Fowler 认为 map filter 是 net win 。现在能用 map 还有谁用 for 循环,但是中间这半个多世纪人都干嘛去了……
更底层的一些知识其实并不能只算到 Java 头上,简而言之就是不会这些你也可以搞 Java
但不是合格的程序员
有点类似松下 vs 三星的等离子 vs 液晶问题,如果反过来三星持有等离子,松下持有液晶还是同样的策略世界可能就是反过来了。一旦市场被挤没,几乎就没有翻身的可能。
这块 Java 刚好相反毕竟发展了那么多年,先不说配套的中间件和环境这些,JVM 衍生出来的二级语言和场景都有很多,哪个不是知识点,但 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 进程写就没什么特别需要考虑的了。
— 这个不赞同
当你的数据量上去了,或者应用莫名其妙崩了的时候,你就知道 JVM 知识的用处了,否则连排查思路都找不到
难学么,感觉也还行吧,如果说大家都要做到 60 分的话,确实可能 Python 做的快很多,而且效率也高
但是如果大家都要往 80 分做,Java 会明显更简单一点(毕竟 GIL 挡在那 CPU 密集型操作除了换成 C 写没有别的方法
Java 生态上,只做后端 Server 基本就是 Spring 大一统(国内),入门成本虽然高,但是换家公司几乎一样的技术栈
其他语言生态虽然看起来简单,但是每个公司实现都不太相同,没有一种一致的 pattern,有好有坏吧
但是很多技术也是一样的,比如并发读写 map 这个最简单的场景吧,Python/Golang/Java 都得加锁
当然每个语言都提供了对应的解决方案,但是前提要有意识才能用对….
Java 蛋疼的就在于有直接关键字加锁,还有可重入锁接口加锁,还有官方给的带锁 map,还不止一个。每一个的实现方式不一样,加锁的关键字在不同 jdk 版本的实现方式也不一样,这些都要考……其他语言面试也这么问吗?
我学 JVM 就纯粹觉得有意思而已…看看自己每天用的东西到底咋实现的
但是再想想的话,其实作为后端开发,也就语言上的问题不一样。
后续的数据库 /缓存 /MQ/分布式,无论是 Go 开发还是 JAVA 开发,大家需要掌握的东西是一样的。
整体看来,大家需要掌握的知识量其实差不多。