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

[color=blue][size=medium][b]前言[/b][/size]
我的兄弟託德正準備從硬件工業轉移到程序設計領域,我曾向他建議,下一次技術革命的重點將是基因工程。

我們將使用微生物來製造食品﹑燃料和塑料;這些微生物不僅能清除污染,還能讓我們付出比現有少得多的代價就能主宰整個物質世界。我曾以爲,相比之下計算機革命將顯得微不足道。

後來我意識到自己犯了科幻小說家常犯的錯誤:迷信技術的力量(當然,這在科幻小說裏司空見慣)。有經驗的作家都知道,故事的重點不是技術,而在於人。基因工程將對我們的生活造成深遠的影響,但它未必就會使計算機革命(或者至少是信息革命)黯然失色,因爲正是計算機技術推動了基因工程的發展。信息指的是人與人之間的溝通。當然,汽車、鞋子、包括基因療法,這些都很重要,但它們最終都只是表面現象。人類如何與世界相處纔是問題的本質。這個相處的過程就是溝通。

本書恰好就是一個例子。很多人認爲我很大膽、或者有點狂妄,因爲我把所有資料都放在網絡上。“還有誰會購買呢?”他們這樣問。如果我的性格保守謹慎一些,我就不會這麼做。但是我真的不想再用傳統方式來編寫一本新的計算機書籍。我不知道這麼做會有什麼後果,但結果表明,這是我在寫書經歷中做過的最明智的一件事。

首先,人們開始把改正後的意見反饋給我。這是個令人驚歎的過程,因爲人們仔細檢查每個角落、每個縫隙,找出技術上和語法上的種種問題,讓我得以改正所有錯誤,而這些錯誤單憑我個人是很難覺察到的。人們對這種作法還有些顧慮,他們常常說“我並無冒犯之意…”,然後扔給我一大堆錯誤。無疑我自己從未察覺過這些錯誤。我很喜歡這種集體參與的過程,這也使這本書更加特別。這些反饋很有價值,所以我使用稱爲“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。

[size=small][b]第3版前言[/b][/size]
這一版的主要目的和大量工作都用在了與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中找到更多說明。

對於那些仍然不能忍受本書篇幅的讀者,我只能說聲抱歉。不管你信不信,爲了讓它儘可能薄,我已經作了很多努力。先不管書有多厚,我認爲還有許多替代方式可以令你滿意。比如,本書有電子版,如果你帶着便攜式電腦的話,你可以把電子版放進電腦,這樣也不會給日常生活帶來額外的負擔。如果你還想更輕巧些,可以使用本書的掌上電腦版本。(有人對我說,他喜歡躺在牀上,打開屏幕的背光看書,這樣就不會打擾他的妻子。但願這能幫助他進入夢鄉。)如果你一定用紙才能閱讀,我知道有人一次打印一章,然後放在公文包裏,在火車上閱讀。

[size=small][b]Java 2, JDK 1.4[/b][/size]
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》)。
[/color]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章