新编程语言当道,现在入行Java是不是晚了?
写在前面
22 岁,对于一个技术人来说可谓正当壮年。但对于一门编程语言来说,情况可能又有不同。各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样?
从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了 22 年,最新的 Java 版本也已经迭代到 Java 9。当年 Java 语言的跨平台优势如今看来也只不过是家常小菜,Go、Rust 等语言横空出世,进一步拓宽了编程语言的边界。当年发明 Java 语言的 Sun 公司早已被 Oracle 收购,Oracle 现在也正处于水深火热的云计算浪潮当中,甚至连 Java 之父 James Gosling 也加入了当今世界最大的云计算公司 AWS。
Java 语言发展的这 20 年也正是全球互联网迅猛发展的 20 年,Java 语言同时也见证了电商浪潮、移动互联网浪潮、大数据浪潮、云计算浪潮,所以在现今各大互联网公司身上都能看到 Java 的身影。
纵看 Java 语言的发展,不禁让人联想到辛弃疾的一首词:
千古江山,英雄无觅,孙仲谋处。舞榭歌台,风流总被雨打风吹去。斜阳草树,寻常巷陌,人道寄奴曾住。想当年,金戈铁马,气吞万里如虎。元嘉草草,封狼居胥,赢得仓皇北顾。四十三年,望中犹记,烽火扬州路。可堪回首,佛狸祠下,一片神雅社鼓。凭谁问,廉颇老矣,尚能饭否?
Java 社区情况介绍
我们按照两个方面介绍 Java 社区情况。
Java User Group(JUG,Java 用户组) 目前全世界范围有 100 多个 JUG 组织,分布在各个大洲各个国家,一般来说以地域命名。目前最有影响力的两个 JUG 分别是伦敦的 LJC(London Java Community) 和巴西的 SouJava,目前都是 JCP 的 EC(执行委员会) 成员。国内目前有 GreenTea JUG(北京和杭州),Shanghai JUG,GuangDong JUG, Shenzhen JUG, Nanjing JUG 等。GreanTeaJUG 以阿里巴巴研发部门成员为核心,包括北京和杭州两地各个公司从事 Java 开发的研发人员,过去几年成功举办了很多有业界影响力的活动,特别是邀请到众多国外的 Java 技术专家来分享知识,目前是国内最大的 JUG 开发者组织。
Java 开源社区 Java 是一门开放的语言,其开源社区也是参与者众多。最有名的应当数 Apache 社区,目前已经拥有近 200 个顶级项目,其中绝大多数是 Java 语言项目。在 Java 生态圈中,具有重要地位的如 Ant、Commons、Tomcat、Xerces、Maven、 Struts、Lucene、ActiveMQ、CXF、Camel、Hadoop 等等。很多技术时代,一大批 Java 项目加入,如 Web 时代的 Velocity、Wicket;JavaEE 相关的 Tomee、OpenJPA、OpenWebBeans、Myfaces;WebService 时代的 jUDDI、Axis、ServiceMix;Osgi 时期的 Flex、Karaf;大数据时代的 HBase、Hive、ZooKeeper、Cassandra;云时代的 Mesos、CloudStack 等等。
涉及到软件开发的方方面面,可以说当今几乎所有的中型以上 Java 应用中,都会有 Apache 开源项目的身影。国内最早参与 Apache 社区的以国外软件公司国内研发团队成员为主,如红帽、IONA、Intel、IBM 研发中心等。如今国内互联网公司和软件公司也不断的参与,特别是开始主导一些 Apache 项目,如 Kylin 等。
JBoss 开源社区,包含了 50 多个 Java 开源项目,其中有 Hibernate、Drools、jBPM 等业界知名开源项目,也有 Undertow、Byteman、Narayana 等名气不算大,但绝对是相应领域业界的顶级优秀项目。当前 JBoss 开源社区主要以企业应用中间件软件为主,RedHat 是主要的技术贡献力量。
Eclipse 开源社区,之前主要是包含 Eclipse IDE 的项目,后来也逐步进行多方面的扩展,比如 OSGi,服务器等,目前一些知名 Java 项目,如 Jetty、Vertx 等都是 Eclipse 开源组织成员。此外 IOT 目前是 Eclispe 的一个重点方向,在这里可以找到完整的 IOT Java 开发方案。
Spring 开源社区,以 SpringFramework 为核心,包括 SpringBoot、SpringCloud、SpringSecurity、SpringXD 等开源项目,在国内有广泛的应用场景。
目前大的玩家
Java 语言和品牌都是 Oracle 公司所有,所以 Oracle 公司是 Java 最主要的厂商。绝大多数 JSR(Java 规范提案) 的领导者都是 Oracle 的雇员。
Java 是一个庞大的生态圈,全世界的软件和互联网公司绝大多数都是 Java 用户,同时也可以参与推动 Java 语言的发展。任何组织或者个人都可以加入 JCP(Java Community Process),并提交 JSR 来给 JavaSE,JavaEE,JavaME 等提交新的 API 或者服务定义。Java 拥有当今最完备的语言生态,几乎所有能想到的应用范围,都有软件厂商提出过标准化的构想,其中很多已经被接纳为 JSR 提案。如今 JSR 总数已经都 400 多个。
GC 方面的进展
JDK 中主要的 GC 分类有:
- Serial,单线程进行 GC,在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
- Parallel,相比 Serial 收集器,Parallel 最主要的优势在于使用多线程去完成垃圾清理工作,这样可以充分利用多核的特性,大幅降低 GC 时间。
- CMS(Concurrent Mark-Sweep),是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。实现 GC 线程和应用线程并发工作,不需要暂停所有应用线程。
- G1(Garbage First Garbage Collector),G 设计初衷是为了尽量缩短处理超大堆(大于 4GB)时产生的停顿。相对于 CMS 的优势而言是内存碎片的产生率大大降低。
与其他语言的对比,Java 的优势
Java 是最好的语言么?不是,因为在每个领域都有更合适的编程语言。
C 语言无疑是现代计算机软件编程语言的王者,几乎所有的操作系统都是 C 语言写成的。C++ 是面向对象的 C 语言,一直在不断的改进。
JavaScript 是能运行在浏览器中的语言,丰富的前端界面离不开 Javascript 的功劳。近年来的 Node.js 又在后端占有一席之地。Python 用于系统管理,并通过高性能预编译的库,提供 API 来进行科学计算,文本处理等,是 Linux 必选的解释性语言。
Ruby 强于 DSL(领域特定语言),程序员可以定义丰富的语义来充分表达自己的思想。Erlang 就是为分布式计算设计的,能保证在大规模并发访问的情况下,保持强壮和稳定性。Go 语言内置了并发能力,可以编译成本地代码。当前新的网络相关项目,很大比例是由 Go 语言编写的,如 Docker、Kubernetes 等。
编写网页用 PHP,函数式编程有 Lisp,编写 iOS 程序有 Swift/ObjectiveC。
一句话概括,能留在排行榜之上的语言,都是好的语言,在其所在的领域能做到最好。
Java 语言到底有什么优势可以占据排行榜第一的位置呢?
- 其一,语法比较简单,学过计算机编程的开发者都能快速上手。
- 其二,在若干了领域都有很强的竞争力,比如服务端编程,高性能网络程序,企业软件事务处理,分布式计算,Android 移动终端应用开发等等。
最重要的一点是符合工程学的需求,我们知道现代软件都是协同开发,那么代码可维护性,编译时检查,较为高效的运行效率,跨平台能力,丰富的 IDE,测试,项目管理工具配合。都使得 Java 成为企业软件公司的首选,也得到很多互联网公司的青睐。
没有短板,容易从市场上找到 Java 软件工程师,软件公司选择 Java 作为主要开发语言,再在特定的领域使用其他语言协作编程,这样的组合选择,肯定是不会有大的问题。
所以综合而言,Java 语言全能方面是最好的。
Java 未来方向的展望
如今的 Java,已经在功能上相当丰富了,Java 8 加入 Lambda 特性,Java 9 加入模块化特性之后,重要的语言特性似乎已经都纳入进来。如果要说值得考虑的一些功能,我觉得有以下几点:
- 模块化改造完毕之后,可能会出现更多专业的 JDK 发行软件商,提供在功能方面,比如针对于分布式计算,机器学习,图形计算等,纳入相关的功能库作为文件。这样专业行业客户可以选择经过充分优化后的 JDK 版本。
- Java 语义上对“模式匹配”有更强的支持,如今的 switch 语句能力还是比较欠缺,可以向 Erlang, Scala 等语言借鉴。
- 多线程并发处理,Java 做的已经很好了。不过我个人觉得可以在多进程多线程配合,以及语言级别数据管道表示上,可以进行改造和优化。
- JDK9 会有 HTTP/2 client 端的能力,但毫无疑问会有更多更好的三方库出现,JDK 可以和这些三方库通力合作,提供一个更好 API 界面和 SPI 参考实现。
- 目前 Java 在云计算方面遇到的最大问题还是占用内存过大。我个人认为从两个方面来看:
- 如果该应用的确是长时间运行的服务,可以考虑结构清晰的单体结构,算下来总的内存消耗并不会比多个微服务进程占用的更多。
- 微服务应用,未来可以采用编译成本地代码的方式,并使用优化过的三方库,甚至本地 so 文件,减少单个进程的过多内存占用。
- 安全框架更加清晰,SPI 可以允许三方库提供更强大更高效的安全功能。
- JavaEE 方向则有更多的改进的地方:
- EJB 重构目前的 Corba 分布通信基础,参考 gRPC 进行远程系统调用。
- 分解 EJB 规范,把 JVM 进程相关的特性,如注入 / 加强 / 事务 / 安全都统一到 CDI 规范中;对 EJB 进行裁剪,保留远程访问特性和作为* 独立执行主体分布式对象能力。
- 加强 JMS 和 MDB,媲美 Akka 目前的能力。
- JaxRS 适度优化,不必要依赖 Servlet,或者适度调整,来提供更大的能力。
- JPA 借鉴 JDO,以及融入一部分特性,做到对 NoSQL 更良好的支持。
一些个人的心得和经验分享
软件业有个 Hype Cycle 模型,有很多技术受到市场的追捧而成为明星,也有些身不逢时而备受冷漠。
- EJB 是一个广泛被误解的技术,在企业应用分布式计算方面,EJB 给出了非常完备的技术体系。只是目前所有的应用服务器都实现的不够好。对于目前打算转型微服务设计的架构师,EJB 也是一个非常值得学习借鉴的技术。
- Java 的慢是相对的,有些是当前实现的不够好。比如原来有人对 Java 的网络 IO 性能提出质疑,然而稳定的 Netty 框架出现后,就没有人再怀疑 Java 处理网络 IO 的能力了,甚至在 JDK8 中自身的 NIO 也相当出色。要知道 Java 为了实现跨平台能力,采用的是各个操作系统的一个公共能力子集,而且其设计哲学就是给出 API 框架,实现是可以自行实现和加载服务的。
- Java 在处理界面方面,Swing 和 Swt 表现可圈可点(Idea 和 Eclipse 分别采用的图形基础库),JavaFX 已经运用到很多的行业软件上。在浏览器界面表现上,SpringMVC 在模板渲染页面方面使用者最多;GWT 似乎使用者不多,但基于 GWT 的 Vaddin 在国外企业中用户众多,而且很多服务器管理软件也用 GWT 写成;JSF 也在企业软件中得到广泛使用,状态信息直接在后端进行管理,配合 js 前端框架,可以充分发挥各种技术的优势。
打个广告
熟练掌握语言仅仅只是第一步,懂得利用语言搭配形成架构图中的一个个框架和模块,才是技术人和企业沉淀下来的财富。
以上这些是我自己收集的Java学习资料,现在免费送给我的粉丝
资料领取方式:
转发+收藏+关注后私信【资料】即可免费送给大家!保证干货绝无套路!
欢迎加入我的微信群和大家一起讨论专研技术!群内技术点有里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatisNetty,Redis,Kfka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料,以及不定期的内推BAT企业!希望大家共同努力,构建一个自己的人脉交流圈!