Java的最大优势是保守的设计思想

一位Java大牛和一位普通Java程序员之间的区别是什么?

我认为可以把程序员的层次看作一个金字塔,其中可以大致分成3个层次。在最底层的是很勤劳的程序员,但是他们可能对编程本身兴趣不大,他们也能做好工作,但是他们下班之后就不会再想关于编程的事。这是很正常的现象,软件业需要很多程序员,并且这个需求仍然在不断增长。中间层次上的程序员,想再多做一些,他们阅读科技新闻和网站上的消息,他们会跟进下一个版本的进展,他们关心自己的技能,这个层次的程序员很有趣。而最上层的程序员则是时刻对技艺以及技术的本质着迷。当你到达了这个金字塔的最顶层时,你就会开始有反馈环,你可以从自身学习,对技艺的了解也更深刻。但是我认为最难的部分就是如何从第二层突破到最顶层。如果你对你所做工作之外的知识有一丁点兴趣,你就要寻找属于自己的那个点,这个点对于每个人都不一样,一旦发现那个让你着迷的领域,你就可以随着好奇心的驱使深入学习下去。

  关于开源软件有一个说法,一个好的开源开发者必须找到自己的痛点,他们不得不去解决这个困扰他们的问题。这是大多数人对开源软件感兴趣的原因,也是很多人称为Java开发者的原因。你找到了一个让你感兴趣的点,由于不明所以,你一直学习下去,这就是成长的秘密。

开发者之间始终有关于Java语法过于冗长的抱怨。你认为这是很多开发者和团队不愿意使用Java的主要原因吗?

  我不这么认为。James Gosling有三句话可以解释Java的语言设计,以及为什么Java是现在这个样子。第一句就是英语中所说的“蓝领”语言,蓝领工人是从事第一线工作的人,而白领则代表了办公室以及经理们的工作。Java就是一种蓝领语言,它的设计是为了让工作中的程序员解决真正的问题。Java是实用的语言,它解决的是真实世界中的业务。

  James Gosling在2014年JavaOne大会上谈到了Lambda以及Java的早期版本中没有出现的一些设计,他说:如果我没有找到完成一件事的正确方法,那我就什么都不做。这句话表达了一种缓慢而保守的演进设计思想,要想理解Java是什么,就必须要明白这点。很多人觉得Java老了,编程语言需要改变,但是他们没有搞清楚的是,真正变化的是他们自己。他们在能力上有了发展,他们想看得更远更深,而语言反映出了这一点。并不是语言需要改变,而是提出这个观点的程序员自身发生了变化。Java从过去到未来都是一种设计保守的语言。这也是Java的一大优势。

  当James解释他设计Java的初衷时说:当我在设计的时候,我知道人们想要自动内存管理,人们想要強型式,但是这些功能会吓跑蓝领工人。比如说Smalltalk,这是一门很优秀的语言,但是它太先进了,它和现实中开发者们在构建应用时的思维脱离开来。所以Java继承了其中的一些理念,并将其简化,把这些理念放入一种语言和格式中。这些事解释了这门语言设计的基本动机。

所以你当然可以说Java是一种冗长的语言,但我认为额外的内容是为了方便阅读。特别是当你还是一位初级或中级程序员的时候,那些看似多余的文字能够帮助到你。人们永远都铭记我们对于生产力的需求越来越高,但是代码仍然是写出来的。所以我不认为Java冗长,虽然我们可以加入一些高级功能,但是有些事永远都无法在一个语言中改变,这很遗憾。当然我们也会进步,但是就像我总说的一句话,人们总是过于关心语法,而不是能用语言来实现什么。

作为近些年来有趣的产品之一Twitter,如果你观察一下他们的发展你会发现他们最开始用的是Ruby on Rails。三四年前,他们的网站开始出现一个非常可爱的卡通形象,失败鲸。这是一件很尴尬的事,为了弄明白到底发生了什么,他们做了很多调查,在查看了Ruby的垃圾收集之后,他们发现自己无能为力。同时,他们的Java试点项目获得了成功,他们意识到Java能解决他们的扩展性问题。然后在接下来的18个月,他们使用了一些JRuby作为中转站,然后将整个系统改写成Java。最终的效果也很好,他们围绕Java引入了新的服务,新的架构。曾几何时,Ruby被视为企业级软件的未来,但现如今,Ruby只是众多编程语言中的一种。现在应用最广的三种语言是Java,JavaScript,以及C/C++,但是大部分的JavaScript代码都是在客户端,如果把这三种语言去掉,其他语言的市场份额都非常小。

直到现在,Java应用的虚拟托管模型需要分配给整个x86虚拟机用来托管一个单独的JVM实例,相对来说实例上也托管了单独的Java应用。这样的方法效率很低,但是Java本地并不支持多租户虚拟以及云计算配置。幸运的是,在社区里可以找到一些为了解决云计算问题而产生的多租户Java解决方案,你认为哪个方案足够成熟可以应用到生产环境?

这里面包含了两件事,把虚拟和云以及多租户混在一起并不完全正确。比如说在QCon上海上有很多分享是关于docker的(docker是一个并不依赖于虚拟化的平台),其中一个精彩的分享来自Chris Swan。他展示了将CPU内存从虚拟环境转移到以Docker为基础的环境所带来的好处,虽然仍不够完善,但是它已经为Java带来了额外的优势,只要在Docker上运行Java你就能感受到。我们应该把云和虚拟的关系梳理清楚。另外,有很多其他你可以做的事,比如你可以建立多个JVM主机。

但是这个问题真正在问的是多租户。关于这个问题,有一个产品在我心中是当之无愧的冠军,那就是Waratek。Waratek可以把一个单独的非热点JVM分开,并在其中运行主机JVM,在JVM里运行的是Java虚拟多租户JVC,而JVC可以做到很轻量级。我认为Waratek是一个很成熟、可以投入使用的产品,德意志银行刚刚宣布把自己的第一个工作JVM挪到Waratek上,既然德意志银行已经认可了这个产品,那么这个产品应该也值得你花时间研究一下。

Java经常被拿来和Scala做比较,这两种语言的设计目的有什么不同?在未来,这两种语言是否可能发展方向完全一致?

  Java和Scala是有着很大不同的语言。之前我们谈到过Java的设计哲学,现在我们可以来说一说Scala的设计思想,以及它们之间有什么不同。Scala最初是一门来自学术界的语言,最开始Martin Odersky创造的语言叫做Pizza,那时候Java还是版本4,这个时候Pizza开始逐渐加入了一些类似于Java范型的功能,Java 5中也加入了一些Pizza的功能作为范型。

  Martin是一个很聪明的人,Scala也有很多很棒的设计。但是同时,这个语言也有自己的问题。有时候它被称为“厨房水槽”语言,可见人们对这门语言又爱又恨。这个比喻的意思是:水槽里面装了各种各样数量过多的东西。这确实是Scala的一个问题,它的功能太多了。有一条语言设计的准则,同时也是Java设计过程中的一个重要原则——保守。具体说来,就是每当你添加一个新特性的时候(《Java程序员修炼之道》14页谈到了了一个具体的例子),可能你也造成了新的问题。如果你的语言有200种特性,而这个时候你想再加入一个,我需要检验它和所有其他特性的交互情况。对于Scala来说,它总是频繁地加入新的特性。要想知道这些特性之间的交互情况是很困难的。就算Scala有一个很灵活,能够拥抱改变的社区,语言特性的变动也是件不容易的事。所以你会发现虽然Scala拥有很多优秀的工作性能,但是你需要决定哪些特性是你想要的,而哪些特性是你不能碰的。当你在团队中编程的时候,这不是个问题。真正的问题在于,现代社会的软件栈从来都不是仅仅依赖于代码,问题来自于函数库。有一些Scala特性的动作不仅影响目标对象,还会影响其他一些东西。Scala的特性越多,这些问题就更容易互相重叠。

  另外,他们一直都纠结于二进制兼容的问题。Java、Sun以及Oracle一直都认为这是对Java来说最重要的设计理念,所以我可以用Java 1.0写程序,编译一下,放到Java 8的虚拟机中,仍然可以运行,而且运行速度会比以前快很多倍。而Scala从未做出这方面的承诺,哪怕就是上一个版本也会出现问题。在函数库空间中,这个问题就更严重了,我知道很多项目都放弃了Scala,就是因为每次只要升级函数库,整个系统就会崩溃。

  所以说,这两种语言的设计思想很不相同。人们总是喜欢新鲜事物,第一个尝鲜的人也会第一个享受到很多好处,但是在更多的情况下,人们更愿意做第二个尝试的人。你可以观察第一个人犯下的错误,然后从中学习。而Java就是这样一个从别人的错误中学习的语言。我刚才提到过程序员的金字塔,我认为Scala并不适用于底层,它的作用更多在于为最顶层的程序员们激发思考。而Java是一种适用于整个金字塔的语言,而且它对底层和中层的程序员尤其适用。我相信在未来的很多年内都会有一个强大且健康的Scala社区,我也希望能和他们一起交换思想。但是我并不认为Scala会从一种小众语言成长成一种大众语言。现在地球上可能有上百个Scala程序员,但是这个数量顶多也就是Java程序员的百分之一,而这个比例很可能不会继续增长了。

免费领取兄弟连php原创视频教程光盘,详情咨询官网客服:http://www.lampbrother.net

时间: 2024-10-11 01:05:55

Java的最大优势是保守的设计思想的相关文章

Java的核心优势

Java为消费类智能电子产品而设计,但智能家电产品并没有像最初想象的那样拥有大的发展.然而90年代,Internet却进入了爆发式发展阶段,一夜之间,大家都在忙着将自己的计算机连接到网络上.这个时侯,遇到了一个大的问题.人们发现连接到Internet的计算机各式各样,有IBM PC.苹果机.各种服务器等等,不仅硬件CPU不同,操作系统也不同,整个的网络环境非常复杂.这个时候,程序员们希望他们编写的程序能够运行在不同的机器,不同的环境中,这需要一种体系中立的语言(即跨平台).Java的研发小组忽然

Java之------单机版书店管理系统(设计思想和设计模式系列六)销售模块

书店管理系统 书店管理系统可以说是设计模式及设计思想的一个比较经典的例子. 本系列将分为多个部分讲述此输电管理系统. 书店管理系统将分为:用户.图书.进货.销售和库存五个模块,另外还有公共包.工具包和登录包,另外还有一个框架. 对于分层设计,都是表现层可以调用逻辑层,逻辑层调用数据层,数据层调用工具和公共包,方向不可打乱,必须严格按照这种模式. 本篇将做销售模块. 注:本篇需要使用到的框架在本系列二的用户模块: 链接:http://blog.csdn.net/x121850182/article

Java多个数相加源代码流程图设计思想

一.设计思想: 1.理解题目要求,即  编写程序完成多个数字相加并输出结果,题目中的难点就是命令行的参数为字符串,需要经过转化变为数字后进行计算,通过查询互联网得到解决问题方法,用“*.nextInt()”函数即可解决此问题. 2.设计程序的结构,先申请动态空间,完成可输入多个数字的要求. 最后通过输入.计算.输出完成程序. 二.程序流程图 三.源代码 package sum; import java.util.Scanner; public class Text { public static

《Java程序性能优化》学习笔记 Ⅰ设计优化

豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞吐量: 响应时间: 2.木桶定律   系统的最终性能取决于系统中性能表现最差的组件,例如window系统内置的评分就是选取最低分.可能成为系统瓶颈的计算资源如,磁盘I/O,异常,数据库,锁竞争,内存等. 性能优化的几个方面,如设计优化,Java程序优化,并行程序开发及优化,JVM调优,Java性能调

java之 ------ 设计思想

java的设计思想 (设计思想.是须要不断领悟的.. . ) 一.封装 学java的人都知道这是向对象的编程语言,从字面上理解,就是针对对象的一些操作,将具有某一特性的实体封装成一个类或者是将具有一定功能的方法,抽取出来封装成一个供外面调用的方法,然后通过new这个类或方法生成对象,最后通 过对对象进行操作或者实现对应的功能. 如将一个人封装成一个人的类.人有属性:性别,年龄,出生日期.家庭住址等,外界对人进行操作时.仅仅能改变其属性值.可是不能改变属性的种类,这要更安全.并且当对人进行操作时.

Java设计思想(1)

前言:接下来学习的是java中非常重要的东西,也是非常抽象的东西,有种只可意会不可言传的感觉,不过没那么神秘咯,要相信代码功底好,这些都不在话下塞.不过设计思想需要的是不断的学习,不断的领悟,才能更好的体会设计思想. 一.组件 下面通过一个图片抽象的了解下: 这是一种"组件"封装体设计思想,图中的组件(1~k)很显然是组件,还有模块(1~m),子系统(1~n)也是可以看成是组件,而且系统也可能是组件,如果一个很大的软件,那么这部分系统只是项目的一角. 二.Java程序设计的基本原则1

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

Java的最大优势还是跨平台么?

之前码农界有码农说Java的最大优势是跨平台,真的是这样么?其实当时网络没这么火爆的时候,确实是这样的,但现在这已然不是了. 跨平台还是Java的最大优势么? 有跨平台需求的仅仅是客户端应用,而不是服务端.例如桌面应用,你的客户可能是Windows用户,也可能是Linux用户,这时候如果不想多投入成本对各个平台进行适配,那么Java所谓的”Write once,run everywhere”就显得异常光彩.然而今天,整个软件世界都在向B/S应用倾倒(嵌入式除外,点击了解更多的嵌入式开发),即使要

Java最大的优势真的在于跨平台吗?

以下讨论只针对PC端和移动端. 以前是,但现在已经不是了. 有跨平台需求的仅仅是客户端应用,而不是服务端.例如桌面应用,你的客户可能是Windows用户,也可能是Linux用户,这时候如果不想多投入成本对各个平台进行适配,那么Java所谓的"Write once, run everywhere"就显得异常光彩.然而今天,整个软件世界都在向B/S应用倾倒(嵌入式除外),即使要做客户端跨平台,QT等第三方框架远远比Swing更强大,Java在桌面应用领域基本被淘汰已经是不争的事实了,而当初