葛一鸣
CSDN:请先做下自我介绍。
葛一鸣: 我毕业于浙江工业大学,2006年本科毕业后,有幸留在母校继续深造。2009年硕士毕业。毕业后,去了UT斯达康从事网管软件的开发工作,一直使用Java技术,后台是基于Java的服务器,前台客户端是基于JavaSwing的。从开始学习到现在使用Java,已经有超过10年了。
CSDN:你是从什么时候开始接触Java的?是什么地方吸引了你?
葛一鸣: 我在大三的时候接触了Java语言。说实话,刚刚接触的时候,Java并没有吸引我的地方。最初学习Java只是因为学校里有那么一门课程,并且都听说Java很好找工作。在那个时候,因为已经学过了C,所以对C比较有感觉。因此,对Java的感觉是后来慢慢培养起来的。初学的时候,都不认为Java是一门好的语言,但随着学习的深入,才慢慢体会到Java的一些优点。比如,相比于C/C++,GC这种自动的内存管理机制,确实可以帮助程序员节约不少时间,此外,对反射的支持,也让人感觉很灵活(当然只是相对于C++)。
CSDN:《实战Java虚拟机——JVM故障诊断与性能优化》一书中内容面非常广泛,它主要适合哪些开发者?在撰写过程中给你留下最深的印象是什么?
葛一鸣: 这本书也是酝酿了很久。因为发现现现在市场上有关Java虚拟机的书理论性都相对较强。初学者不好理解。于是我就琢磨着是不是能够写一本以实践为根本,并且理论联系实际,帮助初学者快速入门和理解Java虚拟机的书。一方面可以对大家有所帮助;另外一方面也可以作为自己的学习笔记。从内容上看,这本书对于Java开发人员(尤其是初、中级研发者)应该都会有所帮助。说实话,写一本书是非常艰难的。当中伴随着不知多少个不眠之夜。只有自己经历过,才知道其中的痛苦。这个过程也让我确信一点:把技术进行到底需要有极大的热情和坚韧的毅力。在此,借这个机会,我也想对还奋斗在技术岗位上的前辈们表达我的敬佩之心。
CSDN:你怎么看待Java目前的现状?你认为Java有哪些优缺点?
葛一鸣: 我认为Java目前正处于澎湃发展的好时期。可以看到,大量企业级应用都是用Java构建。尤其现在被广泛推崇的大数据,不少大数据软件如Hadoop,也都是用Java构建的。此外,基于Java虚拟机,还诞生了一大批优秀的语言,如Scala。基于Scala构建的大数据平台现在也是生龙活虎。可以说,目前Java作为一个生态系统,已经非常健壮了。当然,我认为这很大程度上归功于开源社区的支持,大家的无私奉献。这些都是Java语言本身的环境优势。而就Java语言而言,我认为它最大的优点是简单。不夸张地说,Java语言是我见过的最简单、最易理解的计算机语言了。但任何事物都具有两面性,Java也不是十全十美的。就Java语言来说,对泛型的不完全支持就是一个美中不足的地方。此外,我们也可以看到,使用传统Java框架构建的程序(比如SSH),往往要比用Python或者Ruby构建的应用,代码行数多出一大半。这种繁琐的编程方式,应该也得到不少批评。
CSDN:能否谈谈Java8的主要特性。
葛一鸣: Java8应该说是一个重大的版本升级。我认为比较重要的两个是:第一,增加了Lambda表达式的支持,也就是函数式编程;第二,在虚拟机实现上,移除了传统的Perm区,而改用使用元数据重新定义方法区的实现。此外,Java8还增加了一些小的功能增强,比如StampedLock、LongAddr,以及对避免伪共享的支持。这些都对提高并行程序性能有着非常重要的价值。
CSDN:Java8增添了Lambda表达式,但仍有开发者抱怨Java语法过于冗长,对此,你怎么看?
葛一鸣: Java的语法确实一个被人诟病的地方。Java8的函数式编程虽然可以在某种程度上大大简化原来的Java语法,但和Scala这些天生的函数式语言相比,也是相形见拙。但不管怎么说,Java能作出如此重大的改变,说明这依然是一门充满活力的语言,我相信将来它会越变越好。但对于Java语法过于冗长的问题,我还想发表一些不同的观点。
Java是一门很简单的语言,它推崇用很傻的方法写代码,因此会显得代码特别臃肿。但是,Java代码是特别容易理解的。对于一般性的代码,我们完全可以一目十行地阅读,而不会感到任何疲倦。这是因为,信息密度相对较低,看到的任何东西都很容易理解。而对比其他语言,比如Clojure(一种JVM语言,号称可以将Java的代码里压缩到原来的1/10),它代码的信息密度特别高,在一行语句中,可能已经做了好多事情,甚至在语句中一个不起眼的单词都充满着奥妙。
对于阅读这样的代码,我个人是倍感压力的。因此,我认为,虽然在写的时候Java会多花点时间,但在“读”的时候,倒反而让人轻松不少。考虑到Java的使用者可能会进行一些大规模企业级软件的开发,系统的可维护性要比系统的开发效率重要得多。因此,从这个角度说,舍弃简洁,而追求易懂,也不失为一剂良药。
同时,也由于Java软件很可能会涉及大型团队开发,因此,它最好不能玩出太多花样。像Perl、Lisp这种花样百出的语言,也只适合Geek个人使用,一旦在大规模团队中使用,我认为反而不利于彼此之间的交流,因为每个人都会更容易将自己的习惯带入项目,从而导致风格不一致。最近,我正在做一个C的项目,在这个项目中,对宏的使用,接近疯狂的程度,而宏作为一种非常灵活的东西,当多层嵌套时,往往使得代码很难理解。我很庆幸在Java中还没有类似的东西。因此,Java语法冗长,是个问题,但并非一无是处。你用Java玩不出太多花样,是Java重要的优点之一。正如BenEvans所说:保守的设计思想是Java的最大优势。
CSDN:目前主流的Java虚拟机有哪些?分别用于什么样的场景?
葛一鸣: 由于Oracle先后收购了BEA和Sun,先后将JRockit和Hotspot收入囊中,所以现在两者已经做了整合。目前使用最广泛的就是Hotspot。OpenJDK中使用的就是HotSpot。此外还有IBMJ9,它主要用于运行IBM的内部产品。另外还有一些商业的Java虚拟机版本。比如Zing,它是一个实时虚拟机,用于低延迟的场合。
CSDN:Java虚拟机主要有哪些垃圾回收器?它们之间有什么不同?
葛一鸣: 目前大致分为:串行回收器、并行回收器、CMS和G1。串行回收器就是最老牌的垃圾回收器,使用单线程进行垃圾回收。运行时,Java应用程序会完全中断。并行回收器适合多核CPU,使用多个线程进行垃圾回收,使用算法和串行回收器类似。CMS是一款并发回收器,它将垃圾回收分为几个阶段,尝试让垃圾回收和应用程序一起交替并发执行,目的是为了减少一次垃圾回收的停顿时间。G1是目前最新的一款垃圾回收器。它的目的是为了控制停顿时间。它将整个内存区域划分为若干个小区间,每次只是有选择性地回收几个,从而避免一次性回收全部内存带来的长时间停顿。
CSDN:目前基于JVM开发的主要流行技术有哪些?有何特性?
葛一鸣: 目前基于JVM的语言已经有不少了。除了Java外,Scala、Clojure、Groovy也是主要的几种JVM语言。其中,最引人注目的应该是Scala。它在高并发应用场景中有自己独特的解决方案。基于Scala的Spark也正在大数据领域崛起。Groovy比较适合做简单的脚本语言,方便实用。Clojure是一个Lisp语言在JVM平台上的一个变种,有着Lisp强大的表达力,但个人认为语法确实有些怪异,但非常适合Geek使用。此外,Python、Ruby等语言也在JVM平台上有着各自的实现。
CSDN:你平时最喜爱的开发工具有哪些?在日常工作中会用到哪些?
葛一鸣: 平时我使用最多的就是Eclipse。此外IntelliJIDEA也是一款不错的JavaIDE环境。阅读C/C++代码我会选择SourceInsight。此外,对于文本编辑器,我会用notepad++以及EmEditor。在Linux平台上就是Vi。版本控制我会选择git。也喜欢使用思维脑图Xmind来整理自己的想法。
CSDN:在日常生活中你是通过哪些方式来提升个人技能的?
葛一鸣: 从我个人的学习经历来说,首先要阅读大量的书籍,做系统性的学习。接着,需要动手实践。对于软件开发来说,实践是比学习更重要的环节。然后,学会从实践中去思考和总结,从另一个角度看待理论知识,会让人进步得更快。此外,多关注一些业内网站,如CSDN,了解最新信息和技术,紧跟时代潮流。
CSDN:给学习Java的开发者一些建议吧。
葛一鸣: 对于Java语言,首先需要了解它的基本语法和API使用。这个是最基础的。在此基础上,一种可以让自己快速成长的方法,我认为就是阅读一些开源代码,充分利用开源社区。比如,从JDK的源码中就可以学到不少知识。当遇到问题时,从框架的源码着手分析,不仅有利于对整个系统的了解,也可以让自己欣赏到高手的作品,对自身有相当的促进作用。
作者简介: 葛一鸣,系统分析师。10余年Java学习和开发经验,目前对Java性能调优、Java虚拟机、神经网络和数据挖掘等领域有浓厚的兴趣。著有《实战Java虚拟机——JVM故障诊断与性能优化》。
本文选自程序员电子版2015年5月B刊,该期更多文章请查看这里。2000年创刊至今所有文章目录请查看程序员封面秀。欢迎 订阅程序员电子版 (含iPad版、Android版、PDF版)。