Java在2015年再次被评为年度编程语言,王者再次归来。现总结一下Java的发展历史。
95年前,Java前世
1991 年 Sun 公司 James Gosling 领导的的 Ork 项目。
1995年
Java诞生
Sun 公司正式起名为 Java,并提出“Write once, Run anywhere”的口号。
1996年
Java版本:JDK 1.0
发布时间:1996年1月23日
开发代号:Oak
类和接口的数量:211
新特性或功能:初始版本
1996 年 1 月 Java 1.0 发布,提供了一个解释执行的 Java 虚拟机,其时恰逢互联网开始兴起,Java 的 Applet 能在 Mozilla 浏览器中运行,被看作是未来的互联网语言。
我的故事:1996年我以全校第二的成绩考入了我们当地的省重点高中,在小地方即便是重点中学,硬件条件也是没办法跟大城市比的,但是值得庆幸的 是学校还是为我们高一学生开设了计算机课。那时候上计算课纯粹是好奇和好玩(能在DOS系统下玩拷贝在3.5寸软盘中的五子棋和足球游戏),说实在的连打 字都没有怎么练好,但是那一年我第一次接触到了程序设计的概念,知道可以用命令或代码控制计算机做我想让它做的事情。还记得有一次上课的时候,老师出了一 个BASIC的编程题让大家写代码,用穷举法找出一个问题的答案,当时全班就我和我的同桌(此君大学选择的专业以及现在从事的工作都和计算机相关,目前是 深圳卫视做后期制作的负责人,这也算是三岁看老)写出了正确的代码。在期末的计算机考试中,我和同桌都获得了A级(好像有ABCD四等,A当然是最好 的),这个A成为了我后来填写高考志愿时选择了计算机专业的原因之一。
1997年
Java版本:JDK 1.1
发布时间:1997年2月19日
开发代号:无
类和接口的数量:477
新特性或功能:
改进AWT事件模型
JavaBean
JDBC(Java数据库连接)
内部类
RMI(远程方法调用)
反射(只支持内省)
1997 年 2 月 Java 1.1 发布,Java 语言的基本形态基本确定了,比如反射 (reflection), JavaBean, 接口和类的关系等等,一直到今天都保持一致。然而,Java 最初的一些目标,如在浏览器中执行 Applet,以及跨平台的图形界面 Awt 很快遭遇到负面的评价。
1998年
Java 2企业平台发布
Java版本:JDK 1.2 (Java 2)
发布时间:1998年12月8日
开发代号:Playground
类和接口数量:1524
新特性或功能:
集合框架
JIT编译器
JFC(Java基础类库)
JDBC可滚动结果集、BLOB、CLOB、批处理
1998 年 12 月,Java 第一个里程碑式的版本,即 Java 1.2 发布了。这个版本使用了 JIT(Just in time)编译器技术,使得语言的可迁移性和执行效率达到最优的平衡,同时 Collections 集合类设计优良,在企业应用开发中迅速得到了广泛使用。Sun 公司把 Java 技术体系分成三个方向,分别是 J2SE(面向桌面和通用应用开发),J2EE(面向企业级应用开发),J2ME(面向移动终端开发)。这个分类影响非常久远,体现出主流语言设计者的思想:针对于不同的应用领域,在形态,API 集合等进行划分。
1999年
SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)、微缩版(J2ME)
我的故事:这一年,我参加了在中国几乎算得上是人生分水岭的高考。那年对个别老师的反感,对填鸭式教学的叛逆以及其他种种原因让我的内心非常的浮 躁,在这种状态显然无缘自己的第一志愿,最终被四川大学录取,专业是计算机科学与技术。高考结束后,为了度过这个漫长的没有作业的假期,在朋友介绍下去了 一家计算机培训学校学习,学费100元。说是学校,其实就是一个老师两个房间的环境。那时候,计算机对我以及周围的很多人来说仍然是神秘的、不会经常触碰 到的东西,在那里学习的东西基本上就是五笔打字而已。那是一段愉快的经历,因为我很快和那家培训学校的唯一的老师“王哥”成为了朋友,因为我去了两天后基 本上就能解决其他学员的所有问题,成了他最好的助手并经常帮他看店。“王哥”是个非常聪明的人,逻辑思维能力极强,这一点从他的象棋水平就能看出来。他用 一年的时间自学了七门计算机课程,然后就在这家学校当了老师。一个月后,当我离开家到成都上大学的时候,我从他那里学到了如何用程序控制计算机发出声音。
2000年
发布时间:2000年5月8日
产品代号:Kestrel
类和接口的数量:1840
新特性或功能:
内置HotSpot JVM
改进RMI对CORBA的兼容性
动态代理相关类
Sound API
JNDI
JPDA(Java平台调试器体系)
2000 年 5 月,Java 1.3 发布,这个版本中 Corba 作为语言级别的分布式对象技术,成为 J2EE 的一个技术前提。J2EE 受到 Corba 的设计的影响较大,早期 EJB 的 Home,接口和实现就是 Corba 在 C 语言的实现,被移植到 Java 语言之中。J2EE 中的 Servlet 规范获得了极大的成功,伴随着互联网的兴起,和浏览器直接通过 HTTP 协议交互的 Servlet,和众多的 MVC 框架,成为 Web1.0 的网红。
我的故事:2000年,我在大学里面学习了第一个有生产力的编程语言也是我迄今为止最钟爱的编程语言——C语言。学习C语言的过程并不轻松愉快, 原因一:以前学到的一点点BASIC对学习C语言基本没有帮助,原因二:教C语言的老师的水平实在不敢恭维,很多时候我们有问题都更愿意请教我们班的高手 (他现在在国家安全局工作,在我眼中他算得上是一名真正的黑客)。我现在都清楚的记得最后一次C语言课的时候,老师直接从教材的85页讲到了216页,这 一百多页中包括了二维数组、函数、编译预处理、指针、结构体等重要内容,是的,他就用了一节课把这些东西强加给我们。当时我们用的教材是谭浩强老师的《C 程序设计》,很多高校都选择了这本书,当然我个人对这本书的评价是比较低的,因为这本书确实没有教给我任何有用的东西,当然最可恨的是它有一本配套的习题 集,上面的很多题目其实都没有所谓的标准答案(因为在不同的开发平台和操作系统上会得到不同的答案),但是谭浩强老师假定了我们一定会使用Turbo C(一个古老的16位环境下的C程序集成开发环境)。在这一年的下半年,我开始了我的初恋,她希望我好好学习编程并把我学会的东西教给她,于是有一次逛书 店的时候,我找到了一本叫《Java 2傻瓜书》的书,就是这本书带着我步入了Java的殿堂。那个年代,周围的同学们关注更多的是VC++(微软的Visual Studio for C++)以及MFC(微软基础类库)的东西,认为那是在我们毕业的时能够给我们带来高薪的技术,但是我只看了半天就被那些丑陋的API和恶心的Macro 给搞晕了,于是我下定决心不走寻常路(直到现在,我都认为当时的决定非常正确)。那时候我对Java的了解其实很少很少,但是那本傻瓜书中一些精美的 Java代码却深深的吸引了我。
2001年
Nokia宣布到2003年将出售1亿部支持Java的手机
9月24日,J2EE 1.3发布
2002年
Java版本:JDK 1.4
发布时间:2002年2月26日
产品代号:Merlin
类和接口的数量:2723
新特性或功能:
计算能力提升
XML处理
Logging API
JDBC 3.0 API
断言
支持正则表达式
NIO
支持IPv6
图形I/O API
Java Web Start
Preference API
2002 年 2 月,Java 1.4 发布,Java 语言真正走向成熟,提供了非常完备的语言特性,如 NIO,正则表达式,XML 处理器等。同年微软的.NET 框架发布,两者开始了为期十几年的暗自竞争。从语言特性上来说,.NET 后发先至,一直处于优势。但 Java 依赖良好的开发者生态,绝大多数大型软件公司的使用者众多和不断贡献,以及对 Linux 操作系统良好的支持,渐渐的在服务器端获得优势地位。
我的故事:这一年我和初恋分手了,痛定思痛,我告诉自己不应该再浪费时间去做那些没有结果的事情,于是我结识了我们年级的编程第一人“阿 牟”,那时候他对Java已经有很深的认识和研究了,他带着我把我之前了解过的Java知识在一个项目中实践了一遍,这时我才算真正感受到了程序的魅力, 真正学会用程序去解决问题并在代码中表达自己的精神和情感,这是我大学生涯最重要的事情之一。这一年的10月,“阿牟”邀我一起作为创始人在四川大学成立 了Java技术俱乐部,成立伊始我们就接纳了400名以上的会员,此后我们几个负责人轮流为大家讲解如何用Java技术进行软件开发,同时也为会员提供 SCJP(SUN认证的Java程序员)和SCJD(SUN认证的Java开发者)考试的培训和辅导,做这件事情不仅提升了自己也帮助了别人,很有意义。
2003年
我的故事:这一年我被保送到西南交通大学读硕士研究生,本来是一件挺高兴的事情,但是由于家里的经济状况出现了严重的问题,让我怎么也高兴不起 来。于是我开始寻思着出去做点事情来赚一些外快。这一年的暑假,我接下了人生的第一个私单,为一家公司写一个做数据处理的程序,用的是J2ME中的 kXML API在手机上用XML对语音数据进行编码和解码。至始至终我都没有和这家公司的任何人见过面,以至于我其实并不能准确的叫出这家公司的名字,所有的需求 和代码都是通过邮箱来传递的,在邮件中,这家公司的名字叫“Li-Tong Communication”。遗憾的是当时用的邮箱以及当时写的代码已经再也找不回来,不然还能留下一些美好的回忆。那一年,我结交了第二位女友,她把 她的电脑和PDA都给了我,让我有了谋生的工具,并且帮助我度过了经济上最困难的时候,谢谢她。
2004年
Java版本:Java 5
发布时间:2004年9月30日
开发代号:Tiger
类和接口的数量:3279
新特性或功能:
泛型
for-each循环
自动装箱和拆箱
枚举
可变参数
静态导入
注解
java.util.concurrent
2004 年 9 月,Java 5 发布,Sun 不再采用 J2SE, J2EE 这种命名方式,而使用 Java SE 5, Java EE 5 这样的名称。我认为 Java 5 是第二个里程碑式的版本。Java 语言语法发生很大的变化,如注解 (Annotation),装箱 (Autoboxing),泛型 (Generic),枚举 (Enum),foreach 等被加入,提供了 java.util.concurrent 并发包。Java 5 对于 Java 语言的推动是巨大的,特别是注解的加入,使得语言定义灵活了很多,程序员可以写出更加符合领域定义的描述性程序。
我的故事:为了在学习和科研之余不荒废Java,我自己做了一个数据库的GUI(图形用户界面)工具,能够以可视化的方式操作数据库中的表 和视图等,也能够执行SQL(结构化查询语言)语句并显示执行结果。虽然没有不是什么有技术含量的作品,但是里面却包含了我对Java的热爱。后来这个作 品被我当作研究生中期遴选的作业提交了,不过它并没有获得什么好评,因为那时候从老师到学生根本不关注Java技术,Java在行业中已经火了但是在高校 中还没有火,等到Java在高校中火了,Java在行业中已经显得有些明日黄花了(这算是从某个方面折射出中国高等教育的失败)。于是,这一年我最好的作 品就被忽略掉了,后来我也没有继续去改进和维护它。这一年我找到两家软件公司做兼职程序员的工作,同时还在一家培训学校做兼职讲师,生活状况终于得到了一 些改善。这一年,我遇到了我现在的妻子,初次的印象是美丽、勤谨、善良。
2005年
SUN公司宣布,Java三个版本更名为Java SE、Java EE和Java ME
我的故事:这一年我被保送继续攻读博士研究生,我希望在这个过程中找到Java程序和科研工作的交集。当时,我试图用Java为我们要做的一个路 由器测试系统开发一套测试配置和管理平台,但是老板否决了我的方案,因为他更信任有效率的C语言以及平台无关的测试语言TTCN-3。现在想起来,当时我 并不应该放弃我的想法,我应该做一个快速原型然后展示给老板看,并说服他接受我的方案。无数的事实证明,很多时候我们缺少的并不是idea,我们缺少的是 行动力(执行力)。这一年我继续着学习、科研和兼职工作,并从中获益良多。当然,给我启发最多的是我的室友“小胖子”,当时他的专业是密码学,我的专业是 计算机网络,我们经常“秉烛夜谈”,交换我们在自己研究领域的一些研究心得,同时也谈人生、谈理想、谈情感、谈国家大事,我们都期望着自己做的事情对国家 和社会有所贡献,就如同很多知识分子那样“位卑未敢忘忧国”,那是一段非常美好的时光。“小胖子”现在是中科院研究生院的老师,我想他现在应该不经常写代 码了,但他仍然是我很佩服的科研工作者和程序员。他的乒乓球技术一直都没有超过我,就如同我的编程技术从来没有超过他。
2006年
Java版本:Java 6
发布时间:2006年12月11日
产品代号:Mustang
类和接口的数量:3793
新特性或功能:
支持脚本语言
Compiler API
JDBC 4.0 API
逃逸分析
WebService增强
安全相关增强
2006 年 5 月, JavaEE 5 发布,其中最主要是 EJB3.0 的版本升级。在此之前,EJB2.X 版本被广泛质疑,SpringFramework 创建者 Rod Johnson 在经典书籍“J2EE Development without EJB“中,对 EJB2 代表的分布式对象的设计方法予以批驳。EJB3 则重新经过改造,使用注解方式,经过应用服务器对 POJO 对象进行增强来实现分布式服务能力。在某种程度,可以说 EJB3 挽救了 JavaEE 的过早消亡。
2006 年 12 月,Java 6 发布,这个语言语法改进不多,但在虚拟机内部做了大量的改进,成为一个相当成熟稳定的版本,时至今日国内的很多公司依然以 Java6 作为主要 Java 开发版本来使用。同年 Sun 公司做出一个伟大的决定,将 Java 开源。OpenJDK 从 Sun JDK 1.7 版本分支出去,成为今天 OpenJDK 的基础。OpenJDK6 则由 OpenJDK7 裁剪而来,目前由红帽负责维护,来满足 Redhat Enterprise Linux 6.X 用户的需要。
我的故事:这一年因为一些原因我去了广西,广西省会南宁的软件产业在那个时候应该是不怎么景气的,没有几家专业的软件公司(现在什么情况我 就不知道了)。当时我的想法是做一家专业的软件公司并让这家公司走进大学,或者让大学生走进这家公司来参与软件项目,把公司的项目经验传授给计算机相关专 业的大学生,帮助他们成为更优秀的职业人。第二年我的另一个朋友也有这样的想法,于是邀我去他们公司做项目经理同时也担任技术顾问。但是我们的想法在操作 上有着重重障碍,到我离开广西的时候,理想仍然没有照进现实,留下了一堆的遗憾。但是,这一年我清楚的感觉到我能够做一名优秀的职业培训师,我觉得我有能 力传道、授业、解惑。当然,这可能只是当时的一种错觉。接下来的很长一段时间,我在成都和南宁这两个城市之间无数次的往返,为了学业、工作和将来。那段时 间,我在乘坐各种交通工具的过程中结实了几位朋友,其中有两位后来还介绍了项目给我做,这也让我的经济状况一直保持良好。
2009年
SUN公司发布Java EE 6
SUN公司被Oracle公司收购
2009 年 12 月,JavaEE 6 发布,这个版本应该说是 JavaEE 到目前为止改进最大影响最深远的一个版本。因为 JavaEE5 只有 EJB3 适应了 Java 注解语法的加入,而 EE6 全面接纳了注解。CDI 和 BeanValidation 规范的加入,在 POJO 之上可以定义完备的语义,由容器来决定如何去做。Servlet 也升级到 3.0 版本,并在接口上加入异步支持,使得系统整体效率可以大幅提高。EE 划分为 Full Profile 和 Web Profile,用户可以根据自己的需要选择不同的功能集。
在此之前,Oracle 已经以 74 亿美金的价格收购了 Sun 公司,获得了 Java 商标和 Java 主导权。也收购了 BEA 公司,获得市场份额最大的应用服务器 Webogic。JavaEE 6 虽然是收购之后发布的版本,但主要的设计工作仍然由原 Sun 公司的 Java 专家完成。
我的故事:这一年是我从最好走向最糟糕的一年。由于上一年的努力,我的几篇科研论文被国际会议录用了,于是我有幸在一堆来自世界各地的科研工作者 跟前用我不算标准和流利但也不影响交流的英语向他们讲述我的研究成果并接受他们的提问和质疑。这一年,我完成了我的博士论文,但是我突然间发现,从 2003到2009年的六年时间,我交出的竟然是这样的一份答卷,如果一篇博士论文就是这样的水准,对自己所从事的领域毫无贡献,这样的论文还不如付之一 炬。我开始重新思考我要的到底是什么样的生活,我究竟要做一个什么样的人!?本来一切都很顺利的生活开始悄悄的发生了改变,我变得懒散和消极,开始逃避问 题,不敢面对困难,我用各种方式欺骗和麻醉自己,这让我失去了原来的善良、乐观和从容。这一年我没有诚实的面对自己、面对朋友、面对亲人,自然也就伤害了 自己,也伤害了朋友和亲人,就像朴树在他的《平凡之路》中描述的那样:”我曾经跨过山和大海,也穿过人山人海;我曾经拥有着一切,转眼都飘散如烟……;我 曾经毁了我的一切,只想永远的离开;我曾经堕入无边黑暗,想挣扎无法自拔……”。
2010年
Apache宣布退出JCP(Java执行委员会)
我的故事:这一年生活给我的打击就如同Apache退出JCP给Java世界的打击一样,不过都是过去的事情了,过去的不愉快也算是一种幸福!这 一年我用了半年时间颓废,又用了半年时间从颓废中走出来。其实后来总结这一年的时候,我清楚的知道,不是生活给了我打击,而是我没有用正确的态度去面对生 活。这一年我喜欢上黄易的小说《寻秦记》,赵雅死之前和项少龙的那段对话是我最喜欢的,”看!这大雪多么美丽,把人世间一切丑恶的事都净化了……”,我喜 欢这段文字是因为我也希望有一场大雪能够将我彻底的净化。那一年,不太会下雪的成都真的下了雪。Thank god almighty!
2011年
Java版本:Java 7
发布时间:2011年7月28日
产品代号:Dolphin
类和接口的数量:4042
新特性或功能:
switch的增强
钻石语法(泛型推断)
异常的改进
JVM多语言支持
TWR(try-with-resources)
NIO.2
2011 年 7 月,Oracle 发布 Java 7, 其中主要的特性是 NIO2 和 Fork/Join 并发包,尽管语言上没有大的增强,但我个人认为,自从 Oracle JDK(包括 OpenJDK7),Java 虚拟机的稳定性真正做到的工业级,成为一个计算平台而服务于全世界。
我的故事:终于走出了阴霾,我开始像以前一样把自己的生活安排得满满的,但是我也清楚的知道自己已经过了而立之年,生活状态却仍然是随遇而 安的,这是一个大问题。这一年我自己接了项目来做,也带了一些学生,教他们用Java写程序做软件,同时也在代码中表达自己的精神和情感,就如同我当年一 样。 这一年,我结识了一位优秀的程序员“二万”,他对编程充满了热情,对代码有着近乎于苛刻的要求。除了写代码,其他时候他基本上都犯二,所以才有了“二万” 这样一个光荣的绰号。我确信他是一位优秀的程序员是因为他有良好的编码习惯,我现在仍然坚信一个程序员是否优秀跟他做过什么样的项目没有必然联系(现在有 很多面试官却经常拿这个说事),也就是说即便你参与开发过像12306那样牛逼的系统,也不能证明你的水平有多么厉害,你可能仍然是一只菜鸟或者小白。正 所谓,善战者无赫赫之功。
2013年
2013 年 6 月,Oracle 发布 JavaEE 7,这个版本加入了 Websocket,Batch 的支持,并且引入 Concurrency 来对服务器多线程进行管控。然而所有的子规范,算上可选项 (Optional) 总共有 40 多项,开发者光是阅读规范文本就很吃力了,更不要说能够全局精通掌握。JavaEE 规范的本质是企业级应用设计的经验凝结,每一个 API 都经过众多丰富经验的专家反复商议并确定。各个版本之间可以做到向后兼容,也就是说,即使是 10 年前写的 Servlet 程序,当前的开发者也可以流畅的阅读源码,经过部分代码调整和配置修改,可以部署在当今的应用服务器上。反过来,今后用 Servlet4 写的程序,浏览器和服务器通信使用全新的 HTTP/2 协议,但程序员在理解上不会有障碍,就是因为 Servlet 规范的 API 非常稳定,基本没有大的变化修改。
2014年
发布时间:2014年3月18日
产品代号:无
类和接口的数量:尚不清楚
新特性或功能:
Lambda表达式
集合的流式运算
函数式编程
2014 年 3 月,Oracle 发布 Java 8,这个版本是我认为的第三个有里程碑意义的 Java 版本。其中最引人注目的便是 Lambda 表达式了,从此 Java 语言原生提供了函数式编程能力。语言方面大的特性增加还有:Streams,Date/Time API, 新的 Java 引擎 Nashorn,集合的并行计算支持等,Java8 更加适应海量云计算的需要。
我的故事:在2011年到2014年的两年多里面,Java一直都很沉寂,很多Java程序员在千呼万唤中等待Java 8的出场。其实我对Java 8没有什么期待,因为我坚信像Oracle这样以利益为核心的公司不会在Java上面投入多少力量。但是我自己在这两年多里却是变化很多,2013年我结 婚并有了小孩,妻子就是九年前遇见的她,她不再像当年初遇时那般年轻可爱,但是却依然美丽善良。我们女儿的名字是1和0的谐音,这一个比特的两种状态记录 了每个程序员的艰辛与骄傲。
2015年
我的故事:Java又回到了编程排行榜的第一位,但是在Java的第20年,我暂时告别了Java,不再是一名Java程序员……
对Java技术的一些思考
2010年以后,我对Java的未来总体态度是比较悲观的,因为就像上面说的那样,作为全球首屈一指的软件公司,Oracle注重的是利 益,Oracle收购Sun要拿下的绝对不是Java,而是Solaris以及它带来的服务器产品市场。而在完成收购以后,Oracle清理了Sun很多 管理精英和优秀的工程师(包括Java之父James Gosling),从惠普挖来一个人品并不怎么好的人接手了Sun的硬件生命线。在Oracle收购Sun的第二年,Apache就宣布退出JCP,原因 当然是Oracle将开源世界对Java的贡献拒之门外,要独自控制Java平台。
同年,Oracle还跟Google干上了,告Google的 Android系统侵犯了Java相关知识产权。如果我没有记错,Oracle在2012年日销售额就达到了近1亿美金,但是只要Oracle的市值没有 超越微软,拉里·埃里森的个人财富没有超过比尔·盖茨,他就不会停止他追逐财富的脚步,这些都无可厚非,就像卡尔·马克思所说的”资本来到世间,每个毛孔 都流着血和肮脏的东西”。
作为一个Java程序员,真的不愿意看到Java就这样走上一条通往没落的道路或者最终被Oracle毁掉。当然也没有必要因此 而沮丧,至少目前Java的生态系统还是非常良好的,无数的工具、框架、产品都是基于Java的,就像有人说的”像Java这样的开源技术就如同百足之虫 死而不僵”,所以没有必要担心自己的职业生涯会就此终结。
我经常跟自己的学生讲:”重要的不是技术细节,而是技术背后的思想”,如果你在学习和使用这门语 言时,关注得更多的不是某些API或框架,而是这些API的设计理念以及框架背后的指导思想,就算不使用Java做开发,你仍然可以是一名优质的程序员。 不管TIOBE发布的数据还是作为一个职业人的直觉,我们都能感受到编程语言时下流行的趋势是动态语言和函数式编程,只要想想最近几年 JavaScript有多么火爆,新生贵族Swift有多么受宠,Java 8为什么要引入Lambda表达式,这个结论就不应该被质疑。
当然,我个人最希望看到的Java的改变包括:真正的泛型(不是糖衣语法)、传引用(方法调 用不仅仅是传值)、元组、类型推断、可选择的垃圾回收机制(可以让程序员执行显示的内存释放操作)、微内核等。
2016年
2016 年初 Java 语言就出现了明显的下颓趋势,开发者社区也出现了一些唱衰 Java 语言的论调。
标题
重点内容