为什么我学个 JAVA 就已经耗尽所有,而有些人还能同时学习多门语言?

微软:All in 印度(简称AI)

6596 👍 / 381 💬

问题描述

各种框架以及中间件,分布式微服务,权限,安全,优化,就已经一辈子学不完了,其它学习多门语言的是怎么做到的


借用一下这个老哥的回答


因为你学的不是java,而是spring那些东西的api

下面这些东西,都是java做的

live 2d,一个日本人编写的二次元动画制作软件

graalvm,一个java编写的,多语言的编译器,开发者是德语系,你想一下,这种东西是不是总是看到德国人在搞

minecraft,哦,这个太有名,我们换一个,spiral knight,螺旋骑士,steam上普遍好评的3d动作游戏

cassandra,一个java编写的nosql数据库

fxgl,一个英国布莱顿大学教游戏制作的发考题做的开源游戏引擎

现在他在做什么呢?他在探索3d的渲染,然后做一个重返德军总部的fps的demo,至于什么超级玛丽之类的,那个demo早就有了,然后结合graal的native image技术,将这些编写的游戏做成移动端app并发布到google play或者app store上去

nasa,是java的老用户了,以前java2d,3d,可能就是nasa什么在用了,当然现在技术也在升级,升级成javafx那些,这个软件叫做NASA missions,纳撒任务

多贴几张图吧

当然还有很多人都经常用的java写的ide系列,喷气脑的全家福

写各种软件的,对喷气脑的ide并不陌生吧?无论是php还是安卓

当然还有maven等build工具,这个也是java写的

那如果说的是框架的话,那就更多了,还有其他名气小一点的就不说了

那就问你了,这些东西你会吗?就按你在问题里面写的那样,你就算把java学到能把dubbo写出来的地步,这些东西你能写吗?这些东西都是java写的哦

那我替你回答吧,你写不出来,你就算能把dubbo写出来,这些东西你也写不出来

为什么?因为你学的那些框架,其实应用场景是有限的,简单说就是做一个网站,高延时,但是高吞吐(high latency,high throughput)的这么一个场景,比如电商

但是你换一个场景,你的那些所谓的框架的经验,基本上都没用了

因为很多场景要求低延时,比如live2d的渲染就不能太慢,否则用户骂娘了

那如果你写的是live2d的话,用java写,那你的那些dubbo的经验有用吗?

所以我们跟豹哥聊天,就经常拿豹哥开玩笑,因为豹哥之前的那家游戏公司,做了一个非常神奇的操作,就是做游戏的后台,用了dubbo,结果老板被坑死了,豹哥说,老板喝醉了,问为什么,老板心里苦啊,为啥苦啊?被搞互联网的坑了,怎么坑的?就是钱投了很多,搞了什么dubbo之类的上线,效果却不怎样,这个钱越砸越觉得血亏,我们就笑豹哥,你一搞游戏的,用dubbo?如果你用的是netty,还有点道理,或者vert.x,但是dubbo?哈哈哈哈哈,被坑不是意料之中的事吗?

所以你说你会java吗?不,我觉得你可能不太会java,你会的是基于java开发的那些框架,java的基础语法你可能都忘了,因为日常你不会用,你的jdk可能都卡在1.6之类的低版本上,java新增的那些功能,你可能都用不了

那为什么会这样呢?

因为中国在高速发展的过程中,很多系统都是大干快上,也不管合理不合理,能用就行,先用着,本来说,随着时间的推移,后续是要继续重构代码,比如单元测试没有的要补上,但是你觉得,大干快上之后,有多少公司会去补这些东西?

没有啦,管理层也没有这个意识,那原来的系统还能跑,那不就先用着么?

那时间一久,你这里面不都是些古老的渣渣么?

那豹哥之前那个老板,不懂技术,也去盲目投入,这不就是东施效颦么?

适得其反,画虎不成,是吧,反类犬,一个游戏公司,去学习什么电商经验,被坑不是天经地义么?

但是福州的朴朴,这种去学习电商经验,这种就有道理,所以福州的朴朴直接把盒马干出去了

所以很不幸地告诉你,你学的这些,其实都是为你进阿里等电商公司做准备

如果你的目的不是去做电商,那你的这些经验,其实没啥用

那阿里等电商公司怎么说也有几十万人呢,那几十万人随便每个人都弄一点知识出来,可不要你拼命学么?

但是那些东西,真的对其他业务有用么?

或者,真的有用么?

没用,基本上都是屎山雕花,跟java没什么关系,反而跟它们的业务有很大关系

所以你如果去东施效颦,你学到的,并不是java,而是业务,或者说服务于它们业务的技术,再通俗点说,如果我们把一个企业现有的业务代码比喻成屎山的话

那你学到的,其实并不是java等实际技术,而是如何去维护这个屎山

就像很多人喜欢去看什么阿里的java规范,这个就是屎山规范

为什么呢?因为阿里的业务可能需要这些规范,但是java自身的规范已经足够多了,为什么还要再加规范,这些规范难道放之四海而皆准?

我看不对吧,你去看看我上面列举的这些java项目,有谁吃饱了去遵守阿里规范吗?

没有嘛

但那是不是java?

当然是啊,怎么不是

那如果你学了一大堆阿里的业务技术,比如它们的java规范,比如dubbo什么的,对于你要做出我上面列举出来的东西来,有用吗?

没用嘛

所以你真的会java嘛?

我觉得很多人是不会java的,他们只是会一点java的基础语法,然后就是框架给他们强加的各种规范,约束,他们就天天学习这些东西,然后疲于奔命

因为框架,类库,java在这个领域,是极大丰富,你可以在maven central上找到2400多万indexed jars[1],差不多一个jar就是一个类库,每一个jar都有api,你学的是这些东西

如果你不去学java,而是学api的话,2400多万个工具的api,你要学到什么时候去?

而且maven central上的数量还在极速扩张,一年增加几百万轻轻松松,这几百万的jars的api,你就是看一遍,估计都困难吧?那你还要去“学”这些东西,能学完吗?

所以你的学习方法不对,真正这些工具的api啊,应该就是用的时候,随便看看就用了就是了,因为都是英语,你应该加强一下你的英语能力,要看懂老外在表达什么,英语不好的人,就容易陷入api学习的困境,表面上背了很多api,但是有什么用?没用

英语好的同学,其实第一眼看到api,就看api里面的英语在说什么,基本上对于这个api的使用就可以做到心中有数了,然后再看看相关的注释,再自己动手写点代码验证一下,这样百分之八九十都可以搞定了,剩下的,一些可能作者自身表达不清,可能会有歧义什么的,那你Google一下,也基本上都能搞定,所以叫:面向Google编程,就这个道理

所以你的英语不好,看不懂老外的表达,导致你陷入了api学习的错误怪圈,所以你学java学得比较慢,倾尽所有都还是学不好

而如果你的英语ok的话,看得懂老外的表达,那么大部分api是不需要花时间去学的,用的时候再查都来得及,然后你就可以腾出时间来,去看其他的语言,其实大部分编程语言的语法,不都是英语单词和符号的拼凑么?语法特性就那么点,写法上可能会有些差异,但都大同小异,你花点时间记一下不就行了,到用的时候用就是了,这就是为什么有些人能够快速掌握多种语言

举个例子,java至,跟swift,dart,kotlin都有class,enum,都用"""

但是有些地方会有差异,比如->,swift用in,dart用=>,不过大部分closure/lambda用的不是->就是=>,所以用->没问题

遇到这种差异,你记一下就行了,写不同语言时候切换一下

没什么难的,所以java是一个很好的多语言学习的入门,你只要掌握了正确的学习方法,学会多种语言是很轻松的一件事,甚至你可以自己动手改它的语法,jvm上那么多语言,kotlin,scala,groovy,clojure,不都是改了java编译器前端后定义出来的东西么?llvm上也有,rust和d都有llvm的后端,llvm前端也不仅仅是swift,obj c那些

说到底就是你没有正确掌握学习方法,导致学习java变成了api的记忆和背诵,英语不好,所以看不懂老外通过函数或者类名想表达什么,每个api都需要通过百度去查询,然后记忆,用这种方式学习,自然慢,而且学到的都是表面,没什么用的东西,因为api自己也变来变去,就像那个dubbo一样,我前面说的那些项目作者没有一个会dubbo,你说他们的java学得好不好呢?那你就算会dubbo,能写出我前面列举的那些项目中的哪一个?c也是同样道理,你就算把redis源码全部看懂了,又如何?redis如果你不用的话,看懂源码有什么意义?

没用,都不过是个工具而已,别把工具的使用经验太当回事


破千赞更新

谢谢各位厚爱,有人问说,要给一个方向

那这个其实是另外一个问题,跟这个问题本身没什么关系

我们不妨聊聊,下面的内容全部是歪题探讨人生的,如果你想看原文题的答案,下面的可以不用看了

java能干什么?java能写出软件来

至于你写什么软件,以及这个软件有没有市场价值,这个并不是java这个工具需要考虑的问题

是你自己需要去规划你的人生,就你要成为什么样的人,没有给出上下文,我怎么可能知道?

每个人的人生和职业都是不一样的,我只能告诉你说,java这个工具,能做什么,以及你该如何掌握该工具,那至于你掌握了这个工具,你用它来做什么,那是你自己需要思考的问题

这一点上说,java等编程技术跟炒菜,驾驶,游泳等实用技术,并没有什么本质上的不同

你说,你在考驾照时候,问师傅,一个什么方向,你说师傅能给你建议吗?

不行嘛,因为现在驾驶技术已经不值钱了,很多人都会开车,不像我们小时候,会开车,那是一门技术活,司机是一个收入相当不错的职业,现在,是吧,大家都会开,干嘛还需要花钱让你来开呢?

一个道理

以后软件就是随便找个人就能写了,我们并不需要985或者硕士博士或者计算机系毕业才能写代码,随便找个人就能写了,java尤其如此

所以如果你要思考方向,你应该想的是,我掌握了这门工具,我能用这个工具来做什么,然后再来看,你想做的这件事,有没有市场,有没有前途

但是我不能对此做任何的保证,因为我不是培训机构,而且我觉得对你做:学了某个工具,就能怎么人生巅峰了,这种承诺,是极其不负责任,而且是错误的,因为确实有可能你学了某个工具,你也还是找不到工作,完全有可能,就像你考了驾照,就能找到一份司机的工作吗?

驾校的师傅不会这么保证,我也同样不能做这样的保证,当然某些培训机构的老师,为了赚你的钱,他会跟你说,学了什么什么技术,就能去什么大厂之类的,那这个我觉得都是智商税,我唯一能告诉你的就是,这是一个工具,你掌握了这个工具,能写出什么样的软件来,以及目前还有哪些问题,以及面对这些问题,我们有什么办法绕开,或者有谁在处理,或者干脆就无解

举个例子,比如你说java,能不能编译成exe?这个问题就有解,你做不做aot/native image啊?不做,那就好办,jlink加上一个手写的bat脚本,然后你还可以把bat脚本做成exe,这样你就有一个能够直接启动的绿色软件了,然后你再根据操作系统做安装包

如果要做,那就要掌握graal编译器,要配置graal,maven这些,前一段群里来了个魔都学金融的硕士,英语不错,我们引导了一下,大概2天左右,就把配置什么都搞好了,把他写的程序给native image/aot编译掉了,就出exe了,当然同样遇到了问题,cutting edge的问题,然后gluon有人在处理这个问题,插件的问题,估计1.0.9会解决,那可以等插件作者解决

再比如,我想做async/await,那你有两个选择,一个是等java的project loom做好,毕业,那时候自然就有了,但如果你不想等,那么你可以换一个编译器前端,比如你可以改成kotlin,kotlin就有提供跟java共用编译器后端的前端,也就是kotlinc,那kotlin就有async/await,你就可以用了,vert.x就是用这个逻辑,实现了future.await

再比如,我想要让java的gc停顿,控制在1ns以内,那抱歉,我只能告诉你,做不到,但是你说,控制在10ms以内,那我可以告诉你,zgc和shenandoah都可以实现,zgc有代价,比如内存使用不要用得太满,最好要有15%的富余,否则zgc性能会突然大幅下降,shenandoah则没有这个要求,但是shenandoah同样不会给你gc控制在10ms以内结束的承诺,你有了具体的数值,那你就能去衡量,你想要写的软件,能不能接受这个停顿了

所以如果你要问一些关于人生规划,理想的问题,那这个肯定是因人而异的,我这里说的,只是告诉你,java就是一门技术,一个工具,你掌握了这个工具,能做什么,至于你最后用没用这个工具,以及用了这个工具做出了什么,那取决于你自己,而不是java,有些人用java,只会在spring上糊屎,有些人用java就写出了graal,这就好比,同样是开车,有些人可以成为赛车手,有些人却开出车祸,一个道理

如果你要问我在用java做什么,我什么都用java做,对我而言,java最大的好处就是在我毕业时候,让我混进了国企,在我出国时候,国外因为我会这门技能,所以给了我额外的加分,让我可以更早走出国门,当我回国的时候,java这个技术的发展,使得我可以用更加便宜的劳动,创作出让我自己满意的软件,可以用此创业,当我在国外的时候,java让我找到工作,并赚到了买房子的钱,为我解决了后顾之忧,所以我蛮喜欢java这个技术,并且确实我没有在java上投入多少,我生活中还有很多事要处理,比如在国外时候,一边工作还要一边读书,在国内,创业的同时还要照顾家人,如果我用其他语言,估计就做不到,比如出国加成,恐怕就没有了,创业估计成本就高了,我可能就失败了,工作可能就更困难了,我就没有办法边工边读了,但是你问我说,那我也学java,是不是就能出国和创业了,抱歉,不单纯是这样,这两者并不是简单的因果关系,因为我出国除了java以外,在大型国企悠闲的工作环境,以及法语英语等外语的学习,都给了一定的加成,这些综合起来,才让我更早走出国门,还有在国外时候,当地政府的资助,以及mcgill低廉的学费,还有英联邦给的钱,还有当时所在企业的福利,才让我可以边工作边读书,而且企业会提前放我下班,因为我有些课在晚上上,不算我的考勤出问题,加上家里的一些支持,让我可以在回国之前,边工作边读书,读了两个学位下来,赚钱和文凭都没耽误。但是你说这些东西,换个人,是不是能复制,嗯,多半不行,因为人跟人是不一样的,我有的条件可能你没有,我没有的条件,可能你有,就像很多同学,家里都是几千万资产,那么他们自费出国读个书,很容易的,但我就需要自己解决学费问题,否则我读不了,虽然说老爸老妈咬咬牙也能解决,但是我不希望他们这样干,也因为不需要他们花这个钱,所以我回国时候,创业时候,就有一定的底气,不是很着急去融资什么的,慢慢也就周转过来了

这些东西都跟java没什么关系,但确实java又扮演了很重要的角色,因为没有java,我就少了一技之长,确实有些机会可能我就无法把握住了,但是java又确实不是生活的全部,甚至都不是技术的全部,就像我创业时候,java在最开始确实有一些问题无法解决,比如无法编写ios的app,那这时候就要准备换一个编程语言,我们当时就做好了用swift编写app的准备,到后来flutter横空出世,然后graal,一下子,开发移动端的app又多了两种选择,那韩信将兵,多多益善,为什么不呢?

技术只是解决问题的工具,工具远不是生活的全部,不要太痴迷于这些东西,做多了无非那么一回事,没什么高级的,你觉得很神奇因为没有人告诉你怎么做,你百度百度不出来,就会觉得,这个技术好牛逼啊,因为你不会

但是我在国外混过,所以我经常跑去直接问作者,这个东西做什么用的,我遇到了这个问题,是不是bugs,但是多数问题我直接Google就能找到答案了,所以也就没太把这些东西当回事,无非工具,需要时候用就是了,又不是不会用,我会用就不觉得这些东西有什么了不起的

会者不难,难者不会嘛

如果你觉得某个技术很牛逼,那多半说明你不会,我就觉得技术很容易,因为我会

所以对于java学习正确的定位应该是,花点时间,将其掌握,然后其他的时间,你该干嘛就干嘛去,需要的时候用就是了,你觉得难是因为你学习方法不对,所以事倍功半,疲于奔命,我不觉得难是因为我会,我掌握了正确的学习方法和信息渠道,学起来自然就快

最后说一下,如果你有条件,还是去国外读大学,尤其是技术这种,因为国内的,你看谭浩强的c就知道什么德性了,国内这些老头子技术真的是不行,土法炼钢,估计要等现在这一批,从国外回来的青椒上位之后,才能真正改变,但是那个至少也是10年,20年以后的事了,现在这个阶段,国内职业技术的教育确实远不如国外,当然前提是你家里的经济能力能够承受,否则动不动近百万的学费,恐怕一般人拿不出来,如果你实在拿不出来,你也多看看我写的回答,其实也能照猫画个虎,是吧,反正看我的回答又不用花你的钱

工具而已