Web 站点和开发人员 Web 门户
java.sun.com
这是 JDK 的发源地,通常是 Java 开发人员下载 JDK 和文档副本的首要站点。除此之外,该站点还是查找有关整个 Java 平台的信息的好来源,包括一段非常详细的 JVM 介绍(Hotspot),它极其深入地描述了 JVM 的细节。
java.net
Java.NET 站点汇集了开源项目、文档、博客、wiki、新闻和其他社区资源等各种内容。它是 Java 技术的主要信息来源,不过提供的信息似乎过于繁杂。不过尽管如此,浏览项目列表也会找到一些真正有用的东西,如 FEST-Swing 项目,它旨在创建一个用于构建 Swing 应用程序的“方便接口”,大大简化了单元测试的创建。
InfoQ
由 Floyd Marinescu 创建,他是 The ServerSide 的名誉主编,InfoQ 与这里列出的许多其他参考资源的区别是,它是技术中立的,不仅包括 Java 代码,还包括 .NET 和 Ruby,并提供了大量灵活的方法和见解。尽管 InfoQ 上的评论社区并没有 TheServerSide 上的社区那么庞大和多样化,但是该社区中的讨论通常更加温和,而不会过于激烈。
TheServerSide
通常称为“the Slashdot of Java”,TheServerSide 是第一个公开质询、热烈讨论和积极研究企业 Java 主题的地方。有关轻量级容器(以 Spring 为代表)的一些最初理念就是从这里诞生的,这里产生了许多 Java 社区中的“思想领导者”。尽管最近的激烈争论有时会带有主观色彩,但 TSS 将始终是许多 Java 内容的发源地,这些内容构成了我们现在所拥有的 Java 系统;同样,从 TSS 总是可以了解各种 Java 技术的历史。
DZone
DZone 最初是一个面向 Java 开发人员的资源站点,但最近它扩展到了其他技术领域。包括 .NET 和 Ruby,以及其他几个主题“专区”。这样,不仅 Java 开发人员可以利用它来专门研究 Java 专区,还会有一些跨平台的内容,聪明的开发人员可以充分利用这一点。
developerWorks Java 技术专区
如果您正在阅读本文,那么您已经找到了 dw。为了解释清楚,我必须强调除本文外,我曾在该站点发表过其他一些文章,但我可以诚实地说,dw 是一个有关 Java 编码和 JVM 的文章和资源的优秀来源。特别注意,请务必查看 Java 理论与实践,这是一个由 Brian Goetz 撰写的长期系列,其中包含一个共分三部分的 JVM 垃圾收集器系列文章,它以一种浅显易懂的方式介绍了 GC 的核心概念。
IBM alphaWorks
alphaWorks 是 developerWorks 的姊妹站点,IBM 研究人员和员工在此提供他们认为会确定未来主流的工具和技术。alphaWorks 提供了十二种不同的类别,从而为 Java 开发人员提供了机会来尝试各种非常超前的工具、语言、库和其他项目 — 它们正处于研究阶段。注意,许多项目是为了证明一个特殊的研究点,然后就会停止,使项目保持在当前的效率状态。警告:有些项目不是开源的,而有些项目不包 含源代码。但相当数量的 alphaWorks 项目最终会成为主流,要么成为受 IBM 支持的产品,要么作为可从一些 IBM 开放源码位置下载的可用工具。无论如何,只要关注 alphaWorks,就可以了解 Java 发展的方向以及方式。
OnJava
OnJava 是一个独立运行的站点,用于跟踪活动、记录会议、提供各种有关企业 Java 的观点。事实上,这里提供的大部分信息也可以在别处找到,不过这一点对于几乎所有开发人员门户(包括上面提到的)都是一样的,想了解 Java 的各种开发的开发人员只需打开该站点上的 文章列表,然后逐一阅读。
Artima
Artima 由 Bill Venners 创建,目前已经发展成一个巨大的汇集了文章、博客和访谈的站点,它不是完全侧重于 Java 开发,并且其中还包括了 Java 著作方面的权威(查看 Bill Joy 自 Java 5 出版后,对 Java 语言复杂性的怀疑,以及他用于证明所担心问题的经典示例 — Enum <>)。该站点非常值得您访问。
博客(Weblog)
Blog 使开发人员可以轻松地表达想法、概念、理念、论点并围绕技术展开思想讨论,并了解特定技术领域中非常有影响力的“思想领袖”。此外,博客可以通过提要阅读 器在本地使用,提要阅读器将文章/条目下载到本地,以便在脱机时也可以使用。事实上,博客已经变得非常普遍,以至于出现了专门的设备(如 Amazon Kindle)来轻松获取开发人员所需要的信息。
关键在于从几百万个博客中找到感兴趣的内容。每位开发人员都有他自己的选择,哪些需要阅读,哪些不需要,但有些博客是最基本的,包括:
The Java Posse
The Java Specialists' Newsletter
Martin Fowler's Bliki
“Web 站点” 小节列出的 Web 站点所提供的全部 RSS 提要
注意(大多数)博客内容都属于个人观点;在这里分享的一些观点可能在以后被证明是错误的 — 永远不要只根据博客条目中的信息来对产品下结论。但如果要使思维过程突破常规,博客将是一种增强技能的强大资源。
包和/或库
跟踪 Java 生态系统中的所有库和包是一项繁杂的工作,并且 Java 开发人员很容易就会忽略这项工作。结果,开发人员常常发现自己正在编写的内容其实已经存在于平台内(只要他们浏览一下就会发现这一点)。
下面列出了“每位 Java 开发人员至少应该知道其存在(最好知道如何使用)的十大 Java 包”:
java.lang.reflect
许多 Java 库和工具都依赖于 Reflection 包,所以了解它成为了一项必要要求(如果在使用时不理解它,会因为安全策略或其他类型的基础设施不匹配问题而导致失败)。与 Reflection 结合使用的还有 Java 5 注释和 java.lang.annotation 。
javax.script
Java 系统一直在强调动态语言,了解如何从 Java 代码内部使用脚本语言可以使开发人员扩展他们的系统,而不用经历昂贵的编译-链接-运行-测试环节。
javax.management 和 java.lang.management
该管理包也称为 Java 管理扩展(Java Management Extensions,JMX),是一种监视 Java 应用程序运行的强大工具;因此,开发人员应该熟悉和习惯使用 JMX,以便构建实际上可以被系统管理员使用的软件。不要忘记查看随 JDK 一起发布的 jconsole 工具,它演示了一种应用程序健康状况指示板,同时演示了可以构建的内容,它本身就是一个很有用的工具(密切关注构建 jconsole 插件来在 jconsole 内启用脚本支持的脚本 demo,它是任何合格的系统管理员都应该掌握的一个强大工具)。
java.util.concurrent.*
并发性是开发人员在未来十年内将要面临的最大问题,Java 开发人员用来修复并发性 bug 的主要武器就是此包及其子包中的类( .atomic 和 .locks )。学习使用它将与学习编写类一样(甚至更)重要。了解它,使用它,并喜欢上它。
java.util
java.util 中的类同样重要。它们被频繁引用,特别是 Collections 类,所以 java.util.* 应该像 java.lang 那样自动导入。
java.beans
JavaBeans 无疑是整个 Java 生态系统中都要使用的核心元素之一,使用商业含义不是很明显的名称“POJO”(普通的旧 Java 对象)。POJO 仍然基于 JavaBeans 代码、API 和规范,因此花一点时间了解 java.beans 中的类可以帮助编写更好的 POJO。
java.util.logging
诊断和审计日志迅速成为跟踪运行程序执行的强大工具,不管是出于调试目的,还是出于管理和监视目的。我的忠告是:学习使用这个包和其开源的姊妹包 log4j。
java.security.*
Java 安全 API、策略机制和权限类是使 Java 环境成为安全计算平台的核心部分,但只有开发人员知道如何利用这个包。避开加密 API — 在详细了解每个对您有用的选项后再使用它们。它们不难使用,但要获取加密权限(意味着没有大的缺陷)需要花费几年的时间,有大量来自其他加密专家的相关评 论。首先使用其他机制,如 SSL/TLS 和 GuardedObject/SignedObject/SecureObject 类。
javax.xml.parsers.* 、 javax.xml.bind 和 javax.xml.transform.*
XML 逐渐出现在 Java 开发人员的视野中,能够解析(直接解析或通过对象-XML 库)和转换它(使用 XSLT)是开发人员必须拥有的一项重要技能。
javax.sound.*
这不是一项必需的技能,但知道如何偶尔弹出声音效果可以使原本乏味的代码充满生气。此外,在没有直接可用的显示时,还可以用声音来向系统提供信号和反馈。 除此之外,让抛出栈跟踪的机器发出恐怖电影里的尖叫,这样用户可以知道刚刚发生了不好的事情,从而增加了一些刺激的乐趣。
当然,还有许多其他(位于 JDK 内部和外部)的包值得学习,但掌握以上这些就足以使您很好地处理大多数项目,更不用说应付大多数工作面试。
研讨会
研讨会继续在 Java 开发人员的培训中扮演着主要角色,特别是那些还没有获得足够的认可,尚未成为大型培训公司培训课程的主题。研讨会也是开发人员结识其他具备各种技能和职责 的开发人员的绝好机会,使与会者有机会做一些非常过瘾的(并且是完全必要的)事情:发泄对工作环境的不满。
参加研讨会也会产生一种有用的副作用(如果积极管理,可以为研讨会锦上添花):与会者可以建立开发人员小组。通过可在世界范围内使用的电子邮件、邮件列表 (如 GoogleGroups 或 Yahoo Groups)和许多其他轻量级 groupware 通信工具,了解参加研讨会的人员的信息比以前更加容易。这些通过午餐和晚宴建立起来的友谊可以持续一生,并且随着时间流逝愈加有益,特别是在评估新技术时 更是如此。
让一位有着 30 年经验的与会者、演讲者、组织者(不是我,是我的一位朋友)的话为您提供指引:“技术新手参加研讨会是为了通过期间举办的各种会议获取知识,资深人士参加研讨会是为了宴会和结识朋友。宴会帮助您结识朋友,他们可以帮助您提升自己的职业”。
书籍
对开发人员而言,没有哪一种资源能比价格便宜的传统书籍更容易获取。只需要去当地的书店(如果您住在边远地区,可通过 Web 浏览器查找 Amazon 来购买书籍),就可以找到大量珍贵的技术知识和经验……只要您肯在大量资源中仔细寻找。
这些书籍假设读者已经有了 Java 语言和工具集的应用知识;Java 入门书籍非常普遍,而且大多数讨论的是相同的基本内容。选择书籍需要一定的技巧,要考虑作者的写作风格,有时甚至要考虑随书光盘中是否包含了练习的参考答案(如果包含了练习的话)。
掌握了基本知识后,考虑阅读以下书籍:
Effective Java(第 2 版),Joshua Bloch
每位 Java 开发人员的书架上必备的第一本书,必须定期翻阅、随时查看。
Java Concurrency in Practice ,Brian Goetz
每位 Java 开发人员书架上必备的第二本书,因为每位 Java 人员(不管他们愿意与否)都会操纵多线程环境的内部。
Better, Faster, Lighter Java ,Justin Gehtland 和 Bruce Tate
这一小巧的册子被许多 Java 开发人员当作攻下以 Spring 为首的“轻量级容器” 环境的“利器”,填补了大多数大型 EJB 服务器(如 WebSphere 或其他事务处理中间件)留下的空白。作者还介绍了基于 POJO 的开发周期,指出了该理念的优点和缺点,以及如何采取更轻量级的方法构建企业应用程序,使用了 Spring 和 Hibernate 这类不会降低生成系统的功能和能力的工具。
Effective Enterprise Java ,Ted Neward(我)
提供 75 种方法来确保企业 Java 应用程序(不管它们是用 Spring、EJB、Web 服务,还是其他技术实现)不会出现问题。就像 Effective Java 不是针对初级 Java 程序员一样,Effective Enterprise Java 同样也不是针对刚开始学习“企业 Java” 基础知识的开发人员。
Release It! ,Michael Nygard
任何打算编写针对生产服务器的软件的人都应该阅读本书 — 它深入探讨了生产环境中可能出现的错误,以及如何处理潜在的故障,要么恢复故障,要么完全避免故障。
Inside the Java 2 Virtual Machine ,Bill Venners 或 Component Development for the Java Platform ,Stuart Halloway
Java 开发人员一旦学习 Java 这门语言后,迟早要了解底层平台 — Java 虚拟机本身,这意味着垃圾收集以及 Reference 对象、ClassLoader、线程和监视器等主题将成为接下来探讨的重点领域。两本书中的任何一本(或两本)都是非常有用的指南。但是这两本书都有一个 很大的缺陷:它们的出版时间比较早。Inside 是 Java 1.2 期间出版的,此后不久便出版了 Component-Based。幸运的是,大多数 Java 虚拟机自那时起一直没有发生什么变化,所以如果读者遇到除 JDK 1.2 以外的问题时,可以暂时放下本书并继续研究下一主题。
Martin Fowler 撰写的 Patterns of Enterprise Application Architecture 、Gregor Hohpe 和 Bobby Woolf 撰写的 Enterprise Integration Patterns
说到设计方法和理念,这两本书都是典范,同样假定大部分读者都阅读过由 Gamma、Helm、Johnson 和 VlissidesBoth 合著的经典书籍 Design Patterns。模式书籍通常为开发人员提供了一些基本的概念构建块进行调整和组合,从而创建更健壮的设计,这些构建块在单独使用时就不怎么有效。
Java Power Tools ,John Smart
很多人推荐这本书,它详细介绍了 Java 生态系统中各种可用的工具。Smart 还提供了关于本书的培训课程(Java Power Tools Bootcamp),但大多数开发人员获取信息的最简单方式还是通过 dead-tree 版本。
The Pragmatic Programmer ,Andy Hunt 和 Dave Thomas
每个程序员应该人手一册,不管他实际使用的语言或平台是什么。本书适合有经验的读者和从事多年编程工作的程序员。本书可与 Fred Brooks 的经典著作 The Mythical Man-Month 媲美。
The Productive Programmer ,Neal Ford
这本最近出版的书籍与 Pragmatic Programmer 一样经典,它主要讨论各种技巧和技能,程序员可以借助这些技巧和技能提高他们的效率,获得比 IDE 更高的生产力。
The Pragmatic Starter Kit
本套件由 Pragmatic Unit Testing (with JUnit)、Pragmatic Project Automation 和 Pragmatic Source Control (with Subversion) 组成。每本书都清晰、针对性地讨论了各个主题的核心内容,它们直接深入主题,没有涉及其他无关内容。例如,Project Automation 是阅读 Ant in Action 的“开胃书”,但同时也讨论了什么是优秀的构建流程以及构建它们的原因。
Ant in Action(第 2 版),Erik Hatcher 和 Steve Loughran
Ant 是面向 Java 平台的优秀构建实用程序(参阅后面的工具内容了解更多详细信息),本书是目前为止介绍强大 Ant 功能的最佳读物。在学习如何使用 Ant 时,Ant in Action 还演示了单元测试、持续集成和生产部署实践,这一切都是从实际 Java 开发人员的日常实践的角度出发的。
工具
正如盖房子不仅仅是“抡起锤子在板上钉钉子” 一样,Java 开发也不仅仅是“掌握 IDE 并开始编写代码”。好的 IDE 当然能为编写 Java 代码出力不少,但其他的工具也可以提供与 IDE 相等的(也许更好的)价值。
工具
IDE
当然,工具讨论首先从 IDE 开始。在避开商业限制方面,Eclipse 和 NetBeans 都是开源且免费的,因而提供了吸引人的“第一步”。
单元测试
掀起单元测试革命的工具是 JUnit,但其他几个工具也得到普及,包括 TestNG,自然还有 JUnitPerf 等等。
持续集成
持续集成服务器不断检查不受源控制的代码,执行构建,对它运行单元测试,并通常通过电子邮件向开发人员报告所有构建故障。有几个开源版本可用,但有一个已 经得到了广泛关注,即 Hudson,它是一个拥有大量插件和具有高可扩展性的持续集成服务器,它源自 CruiseControl ,它正是因为这一点而声名斐赫。
静态分析
FindBugs 是一个运行 Java 代码的开放源码静态分析工具,执行 n 向深度分析来找出所有可能的代码路径,并基于一组可扩展规则报告找到的各种错误和警告。FindBugs 由 William Pugh 开发(这位 William Pugh 还发现了 Java 内存模型中的 bug),其最值得炫耀的地方是它能够分析 Java 代码来查找并发 bug,每位程序员都会为之欢呼。
网络包跟踪
WireShark (以前一般称为 Ethereal)使程序员可以查看网络上传播的内容,让他们有机会检查正在网络上传播的内容是否合适,而那些不 合适的内容(比如敏感信息和明文密码)没有出现在网路上。
虚拟化
类似 VMWare、Xen、VirtualBox 或 VirtualPC 之类的虚拟化工具(或者更准确地称之为平台)使程序员能够创建与生产机器将运行的环境相同的环境,而不失去主机 PC 环境的生产力。它还提供了一种便利方法来在本地尝试“处于试验阶段的” 软件,而不必让处于生产状态的机器冒险。如果不是完全的开源项目,大多数虚拟化工具都提供有某种免费选项。
未来趋势展望
动态语言
Groovy 和 JRuby 之类的语言衍生出了其他一些值得研究的项目,如 Clojure 和 Fan,试验表明,低强度类型的环境能提供更好的生产力和更多的选项。这并非鼓励您放弃 Java 语言,不过,最好的效果总是来自强强联合。
函数式语言
其兴起源于 Scala,由于函数语言一般支持复合函数并缺少共享状态,因此提供了隐式并发性的优点(尽管有时它的语法很难让人接受)。Jaskell 是一个 Haskell-on-JVM 实现,同样,Clojure 也适合在这里使用,您可以想象生产环境中的软件事务内存是什么样子。
Java 中的闭包
添加闭包支持(也称为 lambda 或匿名方法)将简化部分 Java 编码工作,对是否在 Java 7 发行版中包含此支持进行过热烈的讨论。社区对此问题的讨论深度不一,因此 Java 程序员有必要花点时间研究这个问题,并看看讨论的所有内容。
DaVinci 机器
JVM 的一个新版本对其他语言(比如上面提到的动态语言和函数式语言)更友好,这最终可能会也可能不会使它进入主流 JVM 发行版。随时关注这一点有助于理解在当前 JVM 上运行动态/脚本语言的利弊。
用户界面开发
在 Flash/Flex、Silverlight 和 JavaFX 的支持下,Web 浏览器得到了显著的(并且几乎是惊人的)改变。这还不考虑 Java 领域中的新服务器端 Web 框架和 Google Web 工具包(Google Web Toolkit,GWT)之类的特例。用户界面一直是、而且以后将继续是一个吸引人的亮点。了解一到两个(更不必说 Swing 或 SWT 之类的“富客户端” 库)库将对构建比 HTML 页面更具交互性的内容大有裨益。