2022 年冬月, Java 后端工程师拒绝使用 kotlin 的技术原因有哪些?

2022-12-13 20:54:24 +08:00
 yazinnnn

除去一些非技术的原因(如:领导不让用,同事看不懂,学不会,没时间,不挣钱,对比 java 没优势等)

可能对比 java 没优势算是一个技术原因

有哪些技术原因呢? 比如

14905 次点击
所在节点    Java
145 条回复
Aurt
2022-12-14 10:37:13 +08:00
kotlin+gradle ,简直是英特尔和 AMD 战略合作伙伴
TWorldIsNButThis
2022-12-14 10:41:21 +08:00
@loshine1992 主流的无栈协程就是靠编译器 /解释器的科技与狠活编译成 event loop 调用,所以可以做到更低的开销
这个而已指的是?
superchijinpeng
2022-12-14 10:44:04 +08:00
我司后端所有项目,全是 Kotlin + Gradle ,包括 Flink 、Spark Jar 任务,连 CI 都是,用了就回不去了
jklove123bai
2022-12-14 10:49:32 +08:00
@superchijinpeng 国内还是国外的公司? gradle 源问题咋解决的?有专线吗
yazinnnn
2022-12-14 10:49:35 +08:00
append 了一些我个人的认为的 kotlin 技术 /语言层的优势

然后再说一下对比 java 和其他语言的不足(?)

1. 没有模式匹配,这点 kotlin 官方貌似对它不感兴趣,目前只有 when 表达式,模式匹配上还不如 java 有进展,更别提 scala 或者 rust 了
2. 没有三元运算,只能 if ( condition ) a else b , 不知道是编译器实现上有困难还是什么原因
3. 无法自定义运算符(指望一下 kotlin 2 吧,如果有的话)
4. kotlin 协程染色问题,java 无法直接调用 kotlin suspend 方法,需要 kotlin 侧工程师拯救

再补充一下上面漏掉的优点
空安全和 elvis 表达式(很多语言都有,js ts csharp swift 等等,不过 kotlin 初学者或者 java 工程师对 kotlin 的?非常抵触)
与 java 的互操作性优秀(对比 scala 和 f#与 c#,不过我不懂.net ,初看 f#和 c#互操作有点麻烦)
inline 及 refied ,可以把一些多于的工作交给 kotlin 编译器,并且提高了运行时的效率
object 关键字实现单例,by lazy 实现延迟加载,:InterfaceA by a 实现代理模式(比较高效的开发手段)
potatowish
2022-12-14 11:02:41 +08:00
非技术原因更重要,就是不挣钱。
相比较 kotlin ,我更愿意去用 go 。

说用 java 的不愿意换 kotlin 就是保守,这话我不认同,用什么语言那是市场需求决定的。
TWorldIsNButThis
2022-12-14 11:07:57 +08:00
@yazinnnn pattern matching 这个
我看 youtrack 的相关讨论是他们目前的主要精力是在忙活新编译器 k2 ,等搞好后再开始加一些 big feature
不然代码要写两遍 老编译器一份 新编译器一份
0xZhangKe
2022-12-14 11:15:41 +08:00
@loshine1992 不是对线程的封装,而是协程底层仍然是基于线程的,这一点无论如何没法改变,协程类似于线程池,但是在 Kotlin 中会更优雅。
0xZhangKe
2022-12-14 11:18:22 +08:00
@kwh 效率提升也是利益。
而且 Kotlin 结合 Compose 可以写跨平台 UI ,KMM 也可以跨平台。
superchijinpeng
2022-12-14 11:24:32 +08:00
@superchijinpeng 国内国企,公司内部源
yty2012g
2022-12-14 11:26:51 +08:00
最近在搞 JDK8 升级到 JDK17 ,感觉还是蛮简单的。基本不使用高版本的语言特性,只使用高版本的 JVM 特性。成本非常低,基本就是 javax 包添加一下,加一堆 VM 参数就完事儿了。但是如果是加入 kotlin ,那语言特性就多太多了,对于生产环境,语言特性带来的收益“显著低于”JVM 特性带来的收益。
ClosureEleven
2022-12-14 11:27:08 +08:00
非后端,感觉 kotlin 在安卓上的流行度已经超过 java 了
gongquanlin
2022-12-14 11:40:13 +08:00
因为语法糖太迷了,本来同事的代码写的就和屎山一样看不懂,再来个 kotlin 岂不是……

曾经有一个同事自认为自己代码非常牛逼,实际上非常垃圾毫无规范,命名变量全部都是 a ,aa ,aa1 这种,胜似混淆。有一次维护他的代码看到一串 类似于“12+421+142+56”纯数字加法,整的我以为混淆过了,问他为啥这样写,这个是干啥用的,答曰“我也忘记了,可能是乱码吧”

在这种情况下上 Kotlin ,岂不是……
yjll9102
2022-12-14 11:45:52 +08:00
看团队吧,现在小项目我用 Groovy ,不离开 Java 生态,写起来还很爽
flyingghost
2022-12-14 12:07:09 +08:00
我在另一个思路上有所感悟。

相比于前端、移动端,盘子小,稍微折腾下就遇到了盘子的天花板。于是多余的心智怎么办?
放在业务领域上,十有八九码农不喜,而且领域之间也缺乏共性缺乏沟通基调,你放了也没法和别人讲。
放在通用知识上,加解密、音视频、算法、安全等等都算,但说实话确实机会确实少。
放在内卷和求新求变上。来了!各种语言各种框架它来了!

而后端,盘子太大,一入后端深似海。抛开毫无探索心智可言的 CRUDboy 不谈,一个后端真的是要深挖的东西太多太多。
后端语言和框架,这是个好的开始。
网络,包括 HTTP 以及其他,任何一个网络话题都可以深挖。扩展开来可以从 DNS 开始到服务器网络性能到传输层链路优化,挖都挖不完。
数据库,CRUDboy 分分钟遇到各种性能墙。尤其是大数据情况下。
常用基础中间件,项目里随手用个三五种不稀奇,都得懂。
容器化、DevOps 、云服务、监控报警,大部分知识都和服务器各个环节有关。
安全,后端的安全要求比前端更高更全面。
性能挖掘,以上每个环节都有性能优化的空间,涉及了从算法到架构从服务配置到奇技淫巧大大小小各种东西。

更别忘了还有那该死的业务领域知识。

以上每个话题的子话题,分分钟埋进去一个专家。

所以自从我从移动端开发转型技术架构以来,每个领域我最多学一种语言,还得按需排优先级排学习深度和广度。

既然我已经学了 Java ,对不起,Kotlin 真的没空了。
chrisia
2022-12-14 12:34:49 +08:00
因为太难
Pantheoon
2022-12-14 12:51:57 +08:00
上家公司用的 kotlin 做的后端,kotlin 本身就是基于 java 的语言,类似可以理解成 java 的二次封装,将 java 很多没有的语言特性给封了进去,所以在生态上,它是和 java 能统一的,java 能用的它都能用,选择 kotlin 其实就是选择了它的语法糖,个人感觉 kotlin 的优势如下:
1.更强大的函数式编程,比如拓展函数,中缀函数,这些使用起来确实比 java 的伪函数式编程顺手很多,而且它的使用习惯也更贴近一个人正常的思考方式,当然也存在它的缺点,如果对函数式编程一点都不懂的,或者用的很少的同学会有学习成本.
2.空指针处理,这点我特地把它单独拿出来说,可以说是 kotlin 很大的一个特性,java 当然也有空指针处理,但是对比 kotlin 简直差的太远
3.文件组织方式,相对于 java9 里面用模块来组织文件,kotlin 用 kt 文件,这样的话相同模块的一些功能可以全部写到 kt 文件里面,会减少很多 java 类的出现,最最最常见的就是 dto 和 vo 这些数据 model,其实单独写一个类很没有必要,组织进 kt 文件,会让项目看起来更简洁也更容易维护
4.协程,这个东西对于后端来说就是一个线程池,只要把方法写进 launch 里面就可以异步,但是对于客户端的同学来说,帮助会更大,因为涉及到线程切换的问题,kotlin 已经完全封装好了
5.其他一些特性,比如密封类,数据类等等,都在实际项目中用的很多,尤其是数据类,基本就是用来写 dto 和 vo

以上提到的一些特性,java 也都能处理,比如函数式编程,它也可以通过自定义接口的方式来实现,协程也可以用线程池来搞,当然它都处理回调的问题,数据类其实就是一个普通的 class,所以当有一个给你封装好了的语言,能够优雅的解决这些问题,为何不尝试以下呢?唯一的问题就是学习成本,kotlin 其实学习成本并不高,难以理解的也就函数式编程和协程,其他特性都是一眼会的那种,建议真的可以尝试下.最后说一句,jetbrain 出品,必属精品
ayayui
2022-12-14 12:58:43 +08:00
个人看法,替 Kotlin bb 两句:
Java 其实越来越像 Kotlin 了,比如现在加的 var | Record class | switch 增强等等
Kotlin 只是个选择,互操作、空安全、协程、扩展函数等,对 Java 来说是个不错的选择;少些不少代码不是;至于可读性见仁见智吧
Kotlin 并只是个语法糖,把.java Ctrl+Shift+Alt+K 转完就完事了, 写 idiomatic Kotlin 是需要点学习和练习的
Kotlin 并不是完美的,有些语法也怪怪的,现在摊子也大了,不知道以后咋样,

总之,Kotlin 还不错,值得一试; C# 这么 NB , 不也是曲高和寡;
Torpedo
2022-12-14 13:13:37 +08:00
@Leviathann 根据我 7 年的和后端合作经验,首先各个语音都有水平高的。

但是只有写 java 遇到过多次。你和他定协议,讲个 http header 啥的,然后他给你讲 spring 没有对应的注解、功能、拦截器没有 xxx 。或者有对应的,他不知道怎么用。还有对 json 字段,直接甩我一段 java 代码
给我的感觉就是 java 水平不够的,完全就是面向框架编程

相反,别的语言后端讨论的时候,大家都只聊 http 协议或者 json 的接口格式就行了。基本不会让我一个前端知道他用的啥,怎么实现的
lchynn
2022-12-14 13:34:31 +08:00
@zapper scala 和 groovy 呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/902298

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX