`
kingaragorn
  • 浏览: 117384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Thinking.In.Java.3rd.Edition.Chinese(前言)

阅读更多
前言
我的兄弟托德正准备从硬件工业转移到程序设计领域,我曾向他建议,下一次技术革命的重点将是基因工程。

我们将使用微生物来制造食品﹑燃料和塑料;这些微生物不仅能清除污染,还能让我们付出比现有少得多的代价就能主宰整个物质世界。我曾以为,相比之下计算机革命将显得微不足道。

后来我意识到自己犯了科幻小说家常犯的错误:迷信技术的力量(当然,这在科幻小说里司空见惯)。有经验的作家都知道,故事的重点不是技术,而在于人。基因工程将对我们的生活造成深远的影响,但它未必就会使计算机革命(或者至少是信息革命)黯然失色,因为正是计算机技术推动了基因工程的发展。信息指的是人与人之间的沟通。当然,汽车、鞋子、包括基因疗法,这些都很重要,但它们最终都只是表面现象。人类如何与世界相处才是问题的本质。这个相处的过程就是沟通。

本书恰好就是一个例子。很多人认为我很大胆、或者有点狂妄,因为我把所有资料都放在网络上。“还有谁会购买呢?”他们这样问。如果我的性格保守谨慎一些,我就不会这么做。但是我真的不想再用传统方式来编写一本新的计算机书籍。我不知道这么做会有什么后果,但结果表明,这是我在写书经历中做过的最明智的一件事。

首先,人们开始把改正后的意见反馈给我。这是个令人惊叹的过程,因为人们仔细检查每个角落、每个缝隙,找出技术上和语法上的种种问题,让我得以改正所有错误,而这些错误单凭我个人是很难觉察到的。人们对这种作法还有些顾虑,他们常常说“我并无冒犯之意…”,然后扔给我一大堆错误。无疑我自己从未察觉过这些错误。我很喜欢这种集体参与的过程,这也使这本书更加特别。这些反馈很有价值,所以我使用称为“BackTalk”的系统创建了一些应用,来对这些建议进行收集和分类。

但是,很快我就开始听到“嗯,很好。把书做成电子版放到网络上是个好主意,可是我希望购买印刷出版并装订成册的书籍”。我曾经作出努力,让每个人都能很容易地打印出美观的书籍,但这样仍然无法满足人们对印刷书籍的需求。大多数人都不习惯在计算机屏幕上阅读整本书,也不喜欢总是带着一捆捆的纸,所以即使这些打印出来的书籍再美观,也吸引不了他们(而且激光打印机的碳粉并不便宜)。看来即使是计算机革命,也难以抢走出版商的生意。不过,有个学生提出这也许会在未来成为一种出版模式:先在网络上出版书籍,当它引起足够的关注以后,才考虑制作纸质版本。目前,绝大多数书籍都不赚钱,这种新方式或许可以给整个出版业带来更多的利润。

在另一方面,这本书也带给我一些启迪。开始,我认为Java“只不过是另一种程序设计语言”。从许多方面看的确如此。但随着时间流逝,以及对Java学习的深入,我才开始明白,这个编程语言的目的,与我所见过的其它语言根本不同。

程序设计就是对复杂度的管理。它包括:待解问题的复杂度和所依赖的底层机器的复杂度。正是因为这种复杂度的存在,导致了大多数项目的失败。并且据我所知,还没有哪个程序设计语言全力将主要设计目标放在“征服程序开发与维护过程中的种种复杂度”上【1】。当然,许多编程语言设计时也确实考虑到了复杂度问题,但它总是与被视为更本质的问题混在一起。当然,那些也都是会让程序员感到困扰的问题。比如,C++必须向上兼容于C(为使C程序员容易过渡),并具有执行效率高的优点。这两点都很有用,并且帮助C++取得了成功。不过,两者也引入了额外的复杂度,使得某些项目无法完成。(当然,你可以归咎于开发或管理人员,但如果有某种语言可以帮助我们找到错误,何乐而不为呢?)Visual Basic(VB)是另一个例子,它被局限于BASIC语言(它并不把可扩展能力作为设计目标),这就使得所有堆积于VB 之上的扩充功能,都造成了可怕且难以维护的语法。Perl 也向上兼容于Awk、Sed、Grep、以及其它Unix工具,这就导致了被诟病为“能写不能读”的程序代码(也就是说,一段时间之后,你就无法看懂这些代码)。另一方面,C++、VB、Perl、Smalltalk 之类的编程语言,都为复杂度问题付出了相当大的努力,在解决特定类型问题的时候非常成功。

当我开始理解Java 之后,印象最深的莫过在Java上体现出的Sun公司的设计目标:为程序员降低复杂度。就好象说:“我们关注的是降低编写健壮代码的困难程度和需要的时间”。以前,编写健壮代码将导致性能降低(尽管有许多承诺,Java总有一天能够执行得足够快),不过Java的确大大缩短了开发时间;相比同等功能的C++ 程序,它只需一半甚至更少的时间。只凭这一点,就足以省下大量的时间与金钱。不过,Java 并不仅仅如此。它又持续引入了一些日益重要的复杂任务,比如多线程和网络编程。并且通过语言本身的特性和程序库,使得这些工作变得轻而易举。最后,Java还着眼于某些有着极高复杂度的问题:跨平台程序、动态程序代码联编、甚至安全问题,它们都属于复杂度问题的重要方面。所以尽管存在已知的效率问题,Java 带来的许诺却极其诱人:它能使我们程序员的生产率大大提高。

根据我的观察,Web是Java影响最深远的地方之一。网络程序设计总是非常困难,但Java使它得以简化(Java的设计者仍在努力使它变得更简单)。网络程序设计所关注的,就是研究如何让我们用比使用电话更有效率、更廉价的方式进行沟通(单是电子邮件就已经使许多业务领域发生了革命性的变化)。当我们能更有效地进行沟通时,奇妙的事情就开始发生,这也许要比基因工程所作出的许诺更让人感到神奇。

通过所有方式:编写程序、团队开发、设计用户界面(让程序可以和用户交互)、跨平台执行、轻松编写跨互联网的通讯程序等,Java扩展了人与人之间的通讯带宽。我认为,通讯革命的成果也许不应以海量数据的传输来衡量;我们将体会到真正的革命,因为我们能更容易和他人沟通:可以是一对一的形式、可以是分组形式、也可以是全球通讯的形式。我曾经听人主张,随着足够多的人之间产生了足够多的相互联系,下一次革命将会是一种全球化思维的形成。Java可能是、也可能不是这场革命的引线,但至少这种可能性使我觉得,教授这门语言是一件非常有意义的事情。

1 在本书第二版我收回这句话:我认为Python语言非常接近这个目标。请参考www.Python.org。

第3版前言
这一版的主要目的和大量工作都用在了与Java 1.4版保持同步上。不过,本书的主旨也更加清楚:使大多数读者通过本书牢牢抓住语言的基本概念,以便深入学习更复杂的主题。因为Java还在不断地演化,所以重新定义“基础知识”的涵义就很有必要,再说本书也不应过于面面俱到。这就意味着,比如,完全重写了“并发”这一章(以前称为“多线程”),它能使你对线程的核心概念有一个基本的了解。没有这一点,你就很难理解线程中那些更复杂的概念。

我还认识到了代码测试的重要性。如果没有内置的测试框架及相应测试用例,并在每次构造系统的时候都进行测试,那么你就无法知道代码是否可靠。在本书中,为了做到这一点,专门编写了单元测试框架,用来演示和验证每个程序的输出。这些内容在第15章中有介绍,里面还解释了ant(Java构建系统的事实标准,与make类似),JUnit(Java单元测试框架的事实标准),日志和断言机制(是JDK1.4新引入的),以及对调试和性能分析的介绍。为了涵盖所有这些概念,我把这一章命名为“发现问题”,里面介绍的内容都是我认为所有的Java程序员都应该具有的基本技能。

此外,我复查了书中所有的示例,并同时问自己:“为什么要用这种方法呢?”。多数情况下我会作出一些修改和润色,这样会使例子更贴切,同时还有助于演示一些我认为比较好的Java编程实践(至少在比较基础的范围内)。此外,我还删除了一些不再有意义的示例,并加入了一些新的示例,许多已有示例也被重新设计和修改过。

全书分为16章,涵盖了对Java语言的基本介绍。它可以用作基础课程的教材,但那些更高级的主题又该如何处理呢?

我原计划为本书加入一个新部分,专门介绍“Java 2企业版”(J2EE)的基础知识。其中许多章节由我的朋友﹑以及一同授课或开发项目的同事编写,他们有:Andrea Provaglio, Bill Venners, Chuck Allison, Dave Bartlett,和Jeremy Meyer。当我把这些新章节的进度和出版日期相对照的时候,我就有些担心。并且我注意到,前16章的篇幅就已经与本书第二版的全部篇幅一样大了。而即使是这个篇幅,读者也会经常抱怨。

对于本书的前两版,读者给予了极高评价,当然我也十分欣慰。但有时他们也会抱怨。其中常被提及的就是“这本书太厚了”。在我看来,如果这就是你挑出的唯一毛病,那真是令人哭笑不得。(这会让人联想到奥地利国王对莫扎特作品的抱怨:“音符太多了”。我并没有任何与莫扎特相比的意思)此外,我只能认为发出这种抱怨的人尚未了解Java语言的博大精深,也未见识过其它Java书籍。尽管如此,我还是在这一版中尽量删减掉那些已经过时,或是不那么关键的内容。总之,我仔细检查了所有地方,在第三版中删除了那些不必要的内容,并尽可能作出了修改和润色。这么做我很放心,因为本书的前两个版本还可以从网站(www.BruceEckel.com)上免费下载,附在书后的光碟中也有。如果你还需要那些老资料,这些地方都能找到。对于作者,这样可以减轻很多负担。比如,“设计模式”这一章太大了,已经可以独立成书:《Thinking in Patterns (with Java)》(也可以从网站上下载)。

在Java的下一个版本(JDK 1.5)中,预计Sun公司会效法C++引入泛型这个新功能。我本来已经决定,到时候把本书分为两册,以加入新的内容。但有个声音悄悄在问:“为什么要等呢?”。于是,我决定在这一版中就这么做,于是一切问题迎刃而解。我以前往一本介绍性的书籍塞入了太多内容。

这本新书并不是第二卷,而是包含了一些高级主题。书名叫《Thinking in Enterprise Java》,它现在可以从www.BruceEckel.com免费下载。由于是一本单独的书,因此它的
篇幅可以随着内容的需要而扩展。与《Thinking in Java》一样,它的目标是向读者提供一本容易理解,涵盖J2EE技术基础知识的介绍。并为读者能学习更深入的内容做准备。你能在附录C中找到更多说明。

对于那些仍然不能忍受本书篇幅的读者,我只能说声抱歉。不管你信不信,为了让它尽可能薄,我已经作了很多努力。先不管书有多厚,我认为还有许多替代方式可以令你满意。比如,本书有电子版,如果你带着便携式电脑的话,你可以把电子版放进电脑,这样也不会给日常生活带来额外的负担。如果你还想更轻巧些,可以使用本书的掌上电脑版本。(有人对我说,他喜欢躺在床上,打开屏幕的背光看书,这样就不会打扰他的妻子。但愿这能帮助他进入梦乡。)如果你一定用纸才能阅读,我知道有人一次打印一章,然后放在公文包里,在火车上阅读。

Java 2, JDK 1.4
JDK的发布版本以1.0,1.1,1.2,1.3表示,本书针对1.4版。尽管这些版本号还是“各自独立”的,但JDK 1.2或更高版本的标准称呼是“Java 2”。这表明“旧式Java”(我在本书的第一版中讨论了其中的许多缺陷。)和Java的改进版本之间存在巨大差异,后者的缺陷要少得多,而且引入了很多优秀的设计。
本书针对Java 2编写,尤其是JDK 1.4(很多代码不能在以前版本的JDK下编译,如果你试图这么做的话,构建系统将给出出错信息并终止。)。本书大刀阔斧地删除了一些过时的内容,并且重写了语言新引入和改进的部分。那些过时的内容可以在本书的以前版本中找到(可以通过Web或者本书光碟)。此外,任何人都可以从java.sun.com 免费下载JDK,也就是说,本书针对JDK1.4,不会给任何人带来因为升级而造成的经济负担。
Java的以前版本在Linux系统上发布的速度稍慢(参见www.Linux.org),这个问题正在得到改进,针对Linux的新版本与针对其它平台的版本将同时发布,现在甚至是Macintosh也开始能跟上Java的新版本。与Java相互配合,Linux现在正处于非常重要的发展阶段,它正迅速成为市场上最重要的服务器平台,因为它快速﹑可靠﹑健壮﹑安全﹑易于维护,并且是免费的。这是计算机历史上的一场真正的革命,我认为以前的任何工具都没能具备所有这些特征。Java在服务器端编程中占据了重要位置,它采用了Servlet和Java 服务器页面(JSP)技术,这与传统的通用网关接口(CGI)技术相比是一个巨大的进步(相关主题请参考《Thinking in Enterprise Java》)。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics