本人学生,我自己是写 Java 的,最近发现身边技术能力远高于我的同学对于 Java 这门语言的态度并不友好。由于没有大型互联网项目的经验,所以还没有体会到 Java 相较于其他几种语言的瓶颈,自己能想到的缺点也就性能相对较弱,代码冗长(我本人觉得这种代码即注释挺方便理解的)。Java 的生态可能是最全的吧?并且现在互联网公司大头应该还是 Java (个人想法,我猜想一些公司仍然使用 Java 是因为换门语言的成本太高?所以求稳)。
想请教各位 V 友的看法,以及在国外编程语言的发展趋势是什么情况?
只做理性讨论,没有“XX 语言是最好的”这种想法,谢谢。
101
fox0001 2023-12-06 18:47:24 +08:00 via Android
#1 结帖,#9 补完。相比之下,个人喜欢 go 。但企业开发还是推荐 java ,spring 框架成熟,也好招人。
|
102
byte10 2023-12-06 18:49:20 +08:00
|
103
mmdsun 2023-12-06 19:00:22 +08:00 via iPhone 14
主要原因还是大多 Javaer 水平太低了,不愿意去碰新技术,特别是 Java 后端。
就拿多线程来说,很早就是 CompletableFuture+异步 Stream 流。 结果大多数人还得线程池 submit+get 。 还有就是 Rx 库、Reactive Programming 。Rxjava 、Rxjs 、RxSwift 在前端、移动端风靡时。Java 后端几乎没有声音,Spring Webflux 出了好多年了、R2dbc 反应式数据库 star 还不过 1 千。还各种吐槽 Webflux 不好用来劝退他人。我上上家公司外企几乎全栈反应式架构。 还有 fp ,当 Java 8 支持各种 Monad 、compose 、curry 化都没有问题时,居然看到有人反对在 Java 中用函数式编程,和 lambda 表达式,简直逆天了。 以后可能是虚拟线程,结构化并发,Data Oriented Programming ,然而面试官还在问 Java 8 的新特性😂 |
104
oamu 2023-12-06 20:54:18 +08:00
@mmdsun 异步编程确实不好,业务代码嵌套在异步流程结构中,可读性差;运行时脱离上下文,debug 和维护都更加困难。虚拟线程才是未来,希望有朝一日能用上吧。
|
105
chenjiangui998 2023-12-06 21:02:13 +08:00
语法这些都是其次, JDK 太垃圾了, 很难理解一个数组类型 jdk 能定义出一堆乱七八糟的东西来, 可能我水平不行吧,
|
106
james122333 2023-12-06 22:24:22 +08:00 via Android
1. 非脚本 命令行不友好
2. 开发需要偏重的工具否则累人 3. oop 并不直观 搭配使用一些动态语言特性更杂 难以直观的追溯问题原因 4. 包管理工具反人类 格式过于複杂 变相实现一种 dsl 语言 5. jar 包不能保护原始码不被 decompile 出来 6. 资源消秏过重 7. 学习耗时太多而学到的多半是专属的东西 cp 值并不高 |
107
CaptainD 2023-12-06 22:59:40 +08:00 2
@steelshadow39 #27 有的语言擅长系统编程比如 Cpp 、Rust ,有的语言擅长 ML 比如 python ,语言特点不同擅长领域不同,这是正常,如果说我长期在系统编程领域内混,看不起抽象程度更高的语言,显然是不客观的
|
108
adskhf 2023-12-06 23:04:34 +08:00
@ganbuliao 对 go 的拥护者我只能说,求求你们学习一下 programming language theory……学了就知道 go 的设计有多烂了(关键词 sum type ,null safety ,default zero value ),人家 java ,c++确实也烂,但是人家都几十年前出的语言了,你 go 这么晚才出……也不知道吸取教训……
|
109
ikas 2023-12-06 23:18:27 +08:00
语言而已,脚踏实地学一个比什么都好
规则相当复杂的 c++,然后规则相当容易的 java,两个掌握了,其它的不过是熟悉语法 真正要学的是技术不是语言语法,而是方法,思维 |
110
hez2010 2023-12-06 23:44:08 +08:00 2
@murmur 你首先排除的 C# 第一时间接受了龙芯的 LA64 移植合并进入了主线,而你说的 spring cloud alibaba 所谓国产的光缺因为某些懂得都懂的原因至今都没能将 LA64 的移植成功合并入 openjdk 上游。
|
112
IvanLi127 2023-12-07 02:28:48 +08:00 via Android
@pkoukk 我感觉 hashmap 这类 java 经典面试题,就是个死记硬背的题。 我以前应试前端、其他语言后端也会被问到这类 java 的题,还特别说了是 java 的 xxx 实现,所以该卷都卷🤣
|
113
fpk5 2023-12-07 02:39:41 +08:00
写 C 写多了 10000%会觉得 Java 又臭又长
|
114
LeeReamond 2023-12-07 04:08:25 +08:00
和其他语言相比,java 缺少一等公民变量,又缺少二等公民函数,那自然只能从三等公民算起了......
|
115
dayeye2006199 2023-12-07 05:15:06 +08:00
抛开场景搞语言引战纯属耍流氓啊
|
116
anjingdexiaocai 2023-12-07 08:18:01 +08:00 via Android
个人不觉得 Java 有啥问题,用过 kotlin 也没别人说的那么好,感觉相比高版本的 Java 没啥优势。
|
117
gtx990 2023-12-07 08:23:22 +08:00 via Android 3
@mmdsun
你知道 java 的 project loom 为什么第一版是 stackless coroutine 而最终版是 stackful coroutine 么?就是因为异步需要改代码,同步不需要。并且需要从上到下全都改,从 webflux 改到 r2dbc ,只要你有任何一个 dependency 是同步的就寄了。改完了你得到了什么呢,如果是 compute heavy ,改了跟没改一样,如果是 io heavy ,瓶颈还在数据库,压测的 tps 还是一样的,顶多省两台后端的机器。 你跟老板汇报,我花了一个月用最酷的技术重构了后端,老板问你除了让同事更难看懂之外有什么产出,你怎么回答? |
118
siweipancc 2023-12-07 08:43:06 +08:00 via iPhone
啥都用,体感 Lua 最难受,给饥荒写个 mod 难受的要死
|
119
keymao 2023-12-07 09:08:51 +08:00
企业级应用的基座,你拿来和 rust go 甚至是 C++去比? 这四位除了 rust 和 c++算一个赛道的,其他几位根本就没啥关系好嘛...
go 能做后端,但是企业级应用就是不认可那有什么办法? 光一个 Spring 就足以奠定 Java 的稳固根基了。 差的不是 Java ,你觉得 Java 有问题,多半是你自己的问题。 还有说什么 Java Boy 的 不清楚,但是说 Java 吃内存那简直是贻笑大方,带自动垃圾回收的就没有不吃内存的。 |
120
xinyu391 2023-12-07 09:19:03 +08:00
Java 的缺点 就是 入门太简单了!
|
121
73P2OdTjK6t29nk1 2023-12-07 09:26:13 +08:00
@bugmakerxs #98 这算什么语法糖
|
122
xiaocaiji111 2023-12-07 09:39:20 +08:00
@NessajCN gopher 和 ruster (秀儿)也一样,这个不必放在心里。看戏就好
|
124
xiaocaiji111 2023-12-07 09:47:45 +08:00
@NessajCN gopher 和 ruster (秀儿)也一样会这样说别得语言,这个不必放在心里。看戏就好
|
125
xiaocaiji111 2023-12-07 09:52:10 +08:00
@XCFOX 有没有可能大企业不让用 ORM ?我们让用 Mybatis 是因为,静态分析扫描代码得时候,写个小工具很容易知道 xml 中得 sql 有没有条件,会不会出现安全问题,是不是合理。如果用了 ORM 只能运行时候收集输出得 sql 。
另外代码不是一次性得,写的时候 orm 贼爽,过段时间调试优化 sql ,就没有手写 sql 那么显而易见了。 所以做项目是个工程性问题,写代码是其一个环节,不能只考虑写得爽。 |
126
bill110100 2023-12-07 10:01:21 +08:00
都是学生可以理解 ,等到了企业,见几个维护 5 年以上的项目,你就知道那所谓的啰嗦,呆板的模版代码有多可爱了。
|
127
ZZ74 2023-12-07 10:14:28 +08:00
确定就一个 入门简单
导致谁都能写,然后被喷 这不好那不好。 |
128
xiaocaiji111 2023-12-07 10:15:33 +08:00 1
用过 Java ,写过 go ,刚毕业也做过 php 。如果现在做一些规模项目依然会选择 Java ,生态太好了。一个 web 项目不是只有 http 接口和 curd 操作数据库。有 flink ,spark ,hadoop 这些,还有 es ,以及一些 cassandra ,甚至一些开源的推荐引擎,规则引擎,工作流等等。只要涉及到的,基本都会有 java 的影子。
还有一些三方 sdk ,举个例子:创业做自己项目时,有个 sdk 没有,用 go 能写吗,那肯定能,但是时间成本接受不了,如果官方更新了,还不能同步更新。时间成本=金钱。这些钱可以给 Java 项目多加一年几个 G 的内存。 如果做业务依然建议 Java ,如果基础设施中间件建议 Go 或者 Rust 。各做各擅长的事儿。 另外我大学时学 php 时,觉得 java 又臭又长,不待见 Java ,毕业后才发现 php 只能进小公司,还都是简单的 curd 。投入 Java 怀抱后才接触到不少行业解决方案,接触到不少更深的技术。这种心态让我走了不少弯路。可能跟你身边同学的态度差不多。 |
129
wangtian2020 2023-12-07 10:17:24 +08:00
脱裤子放屁的东西太多了,jdk 配置环境麻烦,读写文件要这个流那个流,第一次用 java 的正则竟然要我自己去玩迭代器!作为 js 熟练工无法想象这种事。
nodejs 是世界上最好的语言 |
130
pkoukk 2023-12-07 10:18:51 +08:00
@IvanLi127 #112 截止今日,java 面试要背的八股文也比其它语言多一大截。起码其它语言没见过有人问 spring 这种框架的源码实现的
|
134
Nazz 2023-12-07 17:29:10 +08:00 via Android
|
135
Nosub 2023-12-07 17:39:43 +08:00
不用怀疑,Java 就是目前来说最好的编程语言,不过你职业生涯慢慢会接触到其他语言的,先搞深度,再搞广度,把 Java 深挖就完事了。
|
136
zhazi 2023-12-07 17:41:22 +08:00
|
137
Nosub 2023-12-07 17:51:43 +08:00 1
说一个 Java 非常大的优点吧,把 Java 研究透了很容易就全栈了,这是一个很大的诱惑,就是 Spring 那一套,Web 三大框架之一 angular 基本就是为后端程序员量身定做的,很多概念基本相似,比如依赖注入,函数式编程,反应式编程,这些;
|
138
Nazz 2023-12-07 18:56:14 +08:00 via Android
|
139
MoTao 2023-12-07 19:08:28 +08:00
我学 JAVA 是真的《从入门到放弃》
|
140
xuld 2023-12-07 21:51:52 +08:00
1. 关于费内存:这关语言毛线关系?就像有的话听起来很流氓,然后你就觉得汉语很流氓吗?
没错,Java 主流框架写业务确实比同类产品费内存,但完全有可能用 Java 写一个不那么费内存的框架。 那为什么不费内存的框架没流行,主要原因还是内存费的可以忍受。就像你天天骂米贵,最后还是要去买。 2. 多数人工具用不好,就怪工具不好。这就是人性。 你找不到工作你赚不到钱你觉得很卷,是因为 Java 的种种问题吗?换个语言一样是菜鸡。 3. 流水线是让农民工干好活的利器,而 Java 的标准化繁琐更利于搭建流水线。 只有两类人会是 Java 的死忠,一类是被中国教育带入“程序员”岗位的科班小鲜肉,还有一类是“万恶的资本家”。 那些追求高效、有个性的野马则会觉得 Java 的开发效率实在太低。 4. 好厨师不会问铁锅做菜好吃还是钢锅做菜好吃,而是都会用。当然可能有些人看到这句话心理会想——做饭都是下人的事,你们好好卷去 |
141
chuck1in 2023-12-07 22:19:25 +08:00
Java 用来写业务是真的太棒了。没有哪个个语言有他棒。
|
142
hafuhafu 2023-12-07 22:24:43 +08:00
好像泛型比较费劲吧,因为历史包袱
|
143
dreamlike 2023-12-07 22:54:23 +08:00 via Android
void 不是类型导致的一系列泛型问题
举个例子 future<Void>, 说到泛型怎么能不提提经典的 function ,intfunction 呢?🤣 还有典中点只 arrays.sort 的各种重载 最后就是元编程能力,编译期 or 运行时元编程能力太弱 坐等 code reflection 实现,你可能说这跟我写 spring 有什么关系,请参考升级 jdk 但是不升级 spring 导致的 asm 版本问题 更何况 spring 自己依赖的 cglib 原始版本都没跟着版本兼容,还是 spring 自己魔改的,唉,要是 class file api 早点出来会有这事? 好特性出的太晚,远水解不了近渴 再吐槽下 openjdk group 对延迟到运行时 or 第一次使用时带来的冷启动问题,很多玩意本来就可以编译期搞定,结果一定要延迟到运行时,很多极其依赖于 jit ,说的就是你 lambda 和 switch!最后又得搞个 Leyden 擦屁股 |
144
omniversia 2023-12-08 00:05:51 +08:00
java 好学好上手,成熟工具,框架,解决方案多。出活快。
就是没有特别调优的话,启动慢,占内存,还有个 jvm 部署相对还是麻烦。 对于业务快速迭代和扩张的互联网企业来说还是挺适合的,能很容易的从单一系统迭代到复杂庞大的微服务系统,各种组件和解决方案很全。 go 跟 java 相似,好学好上手,但是更省内存,部署方便,在一些公司也在大量使用,就是普及度整体还是不如 java 。 rust 近几年吹得多,在高性能和底层领域开始有所展露,我个人持关注和观望态度 C++老牌语言,在众多底层领域,传统领域和有高性能,实时计算需求的领域地位还是暂时无法撼动的 |
145
elliottzhao87 2023-12-08 09:25:22 +08:00
现状是,Java 的下限很高,我这边有些脑子都不太清晰的人,写出来的东西居然也看起来有模有样的,稍微改一改也能用。
而同一个人,我让他写 Typescript 项目……惨不忍睹! |
146
zhazi 2023-12-08 09:34:35 +08:00 via Android
|
147
whp1473 2023-12-08 09:49:54 +08:00
@CuChulainn SpringBoot3 已经正式支持 Gravlm 了,可以编译为向 Go 一样的服务,速度飞快,内存占用非常低,就是很多旧时代的依赖包目前不支持,老项目不好改
|
148
whp1473 2023-12-08 10:00:21 +08:00 1
历史缺点:
(1)语法啰嗦 (2)占内存 (3)启动慢 (4)编译后包大 (5)不能直接跑,要依赖 JVM (6)对操作系统支持不好 (7)GUI 不好 但经过一段时间学习,其实很多都有方案,只是一直 Java8 不向前学习确实没办法: (1)语法啰嗦,接手老项目感动哭 (2)占内存,GraalVM SpringBoot3 Quarkus 是未来 (3)启动慢,GraalVM SpringBoot3 Quarkus 是未来 (4)编译后包大,GraalVM SpringBoot3 Quarkus 是未来 (5)不能直接跑,要依赖 JVM ,GraalVM SpringBoot3 Quarkus 是未来 (6)对操作系统支持不好,这个只能 Native 方法链接 C 之类的 (7)GUI 不好,IDEA 那家非常优秀成熟了,但大部分人又不学 |
149
zmal 2023-12-08 10:32:30 +08:00
语法层面的问题都不是大问题,大不了用 scala 、kotlin 。
Java 比较难改的是 JVM 层面的问题,比如:1.对象的属性是链式引用,没有结构体,在绝对性能场景下是劣势。2. 引以为傲的“一次编译到处运行” 、JIT 等技术在容器大时代下已经再不重要;启动慢、占用内存大的缺点被放大;等等。 换句话说,从生产角度讲,语法糖是无关紧要的;但 JVM 在现代场景下的劣势是所有 JVM 语言都要面对这些问题。 如果有一天 Java 被完全淘汰,那一定是 JVM 被淘汰了。 |
150
sotvokun 2023-12-08 11:18:23 +08:00 1
只从语言层面来看缺点的话,大概有以下几点:
1. Primitive Type 不是对象,不是对象就算了,也不像对象一样进行操作。 2. 没有值类型,到处都是引用类型,然后还没有 null-safety 的语言层面的配套设施。 3. 同上一条,因为都是引用类型,所以函数的传参在函数内部可能被修改,只能靠人为规范规避问题( C# 的话可以通过 ref/in/out 来显性标识)。 4. 没有原生的 getter/setter 支持,只能用 lombok 这种代码生成器来 hack 实现。 5. 标准库设计得稀烂。 单从语言层面上来看的话,Java 是一个彻底贯彻落实面向对象但是又仅此而已的语言……好处的话,语法糖很少,学起来很简单,所有人的写法都是差不太多的。对比 C++ 和 C# 这种,一个问题的解法每个人都可以写出自己的风格来,算是一种很强的优势了。 某种意义上来说 Java 在行业的应用和发展算是双向奔赴的结果,老板放心,打工人喜欢。 唯独不好的地方大概就是有如果你喜欢写代码的话,Java 这门语言用起来不会很开心。 和其他语言其他,C++ 的话就是自由,你想怎么写就怎么写,你甚至可以在 C++ 里面实现 Rust 的 trait 。Go 的话就是简单,写的时候没有任何心智负担,因为啥高级特性都没有。Rust 弥补了 C++ 中的部分缺点,用自由和编译速度换来了安全和更好的包管理。 来到更上层,大家其实都差不多,Java 的唯一优势就是这些年积累下来的生态比较丰富。但是这个优势又没那么大……出活速度不如 PHP, nodejs 快,速度不如 golang, Rust, C++ 快,那些引以为豪的生态,在绝大多数时候都不是一开始就需要考虑的问题。 不过语言这种东西顶多就是个工具,围绕他的一切事物甚至算不上知识。还是数据结构算法、系统设计、数据库设计,这些东西更重要。 |
151
Aresxue 2023-12-08 11:25:01 +08:00
1.语法,这点说实话 go 做的也一般,C#明显做的更好;
2.预占内存, jvm 的内存是直接分配的,对于中小项目内存的利用率不充分,这一点在稍大一点的企业级项目里并不是问题; 3.启动慢,其实本身 jvm 没有那么慢,传统应用慢主要受两个东西拖累,一个是 spring(用了太多反射以及 bean 必须串行注册),另一个是 UrlClassLoader 加载类的逻辑(这一点阿里自定义了一个 FastUrlClassLoader 优化了很多,实测应用启动时间可以降低 1/2~2/3); 4.对象头、字节对齐等各种操作导致在偏硬件的软件系统中性能很低下,没法充分利用寄存器,甚至容器到现在还不支持基本类型; 但我还是看好 java 的未来,庞大的生态,我心中最好的 VM(你可以永远相信 JVM)。官方也有一直在做事情:Loom 、Valhalla 、Amber ,虚拟线程也已经发布了,准备好埋葬异步编程回到 thread-per-request 的时代吧。 |
152
wanguorui123 2023-12-08 14:49:49 +08:00
JAVA 语言本身的缺陷:泛型残废、异步残废,其他的不算太大的问题,还有就是 Spring 框架的规范比较死板,某些注解 @也是一个大坑,稍不注意就掉下去,个人用比较喜欢 C#语法各方面支持的比较完善。
|
153
Mandelo 2023-12-08 15:07:35 +08:00
这种日经水贴应该进水生火热
|
154
higker 2023-12-08 23:17:04 +08:00 1
我只是觉得刚刚学习编程的话我还是建议 C 语言,因为这时你在学校有的是时间去研究各种项目的源代码,并且目前主流 OS 教材还是使用 C 。至于应用语言做服务器端开发只要支持网络编程都可以,但是我会推荐 Java ,目前企业里面使用的最多的 ,Java 在安卓 App 和服务器端都可以,Java 目前面临的问题是,要加新特性又要向前兼容,这才是不好搞的地方,至于某些刚刚出来的语言没有任何历史包袱嘲讽什么... 至于开发效率这个是取决于你能不能复制粘贴代码的问题。Java 刚刚入门确实需要写和传统编程语言不一样的东西例如 Class ,JVM 确实占内存,比较运行的时候还要跟踪程序状态做 JIT 也占用内存,现在可以 AOT 可以观察 GraalVM 这个项目,语言其次无法最后就是一个 AST 表达,主要是 JVM 这个东西,你研究 JS/TS 最后也是 V8 ,有虚拟机和运行时的语言好不了哪里去,因为运行时和虚拟机都是一个软件。但是某些人吹 Go ,Go 主要的特定可以认为把运行时这块一起打包成为 Native Code 了,不过目前 GraalVM 也是在做这个事情,GraalVM 是可以将 Java JS Py 这些一起打包为 Native Code ,看了这么多评论,感觉大家还在研究一些语言层面的东西,无非最后都是对于 CPU 指令而已,你如果要研究程序怎么从源代码到执行的这个过程才是有含量的。抛开这些第三方库和框架,还有是不是有很多公司使用这是关键,我希望国内程序员还是多上一些境外媒体看看,目前主流技术动态。
|
155
steelshadow39 OP @higker #154 研一,再一年找工作了,研究底层的时间确实不多了,个人发展方向也是后端应用。GraalVM 还有 Java21 新出的 loom ,virtual thread ,这些离普及还很远吧,我觉得公司做一套升级要考虑的太多了,求稳还是保守一些。当然个人可以提前开始学习了
|
156
higker 2023-12-09 17:39:59 +08:00
@steelshadow39 只是现在没有升级到 Java 21 LTS ,Java 17 占有比例已经比 Java 8 多了。
|
158
soft101team 2023-12-10 00:42:43 +08:00
内存吃的太多了~
|
159
5waker 2023-12-10 10:36:54 +08:00
说缺点的多,那我来补充下优点吧。(叠个甲,我最喜欢语言的是 rust )
在 docker 出来之前,Write once, run anywhere 这个特性对于开发人员真的太香了。想象下本地用 windows 开发出来的 jar 可以直接扔到 linux 服务器上运行是多么的惬意。不用考虑狗屎跨平台编译,或者连接特定编译机编译,最后上去发现 libc 版本不一致运行不了,一天下来省去的时间刚好够你喝一杯咖啡 =v=。 即使 docker 出来后,Write once, run anywhere 别的语言也能享受了,但那也只是在服务端。桌面端诸如 mc 、idea 、dbeaver 仍在享受这个优点。 从这个角度看,互联网行业在未来确实会逐渐放弃 java ,过大的产物(镜像 500 ~ 900mb )、特别吃内存,这些都是运营成本。降本增效迟早会砍到语言的头上。 也许未来 Java 应该深耕 gui 。 |