本書系統(tǒng)地介紹了常見的服務器Java編程錯誤,以及這些錯誤產生的原因和解決方案。書中涵蓋了基本Java和J2EE概念的反模式,如servlet、JSP、EJB、企業(yè)連接模型和可擴展性等,通過代碼示例展示了Java編程中常見的陷阱,還提供了重構代碼,并解釋了為什么新方案是安全的。本書適合中級水平的Java程序員、分析員或架構師閱讀,通過研究書中介紹的反模式,可以吸收別人的經驗教訓,在工作中少走彎路。[前言]到了夏天,得克薩斯河水就幾近干涸。為了尋找急流,漂流者不得不跟著暴風雨的腳步走。那是1996年夏天的一天,我和一個同伴晚上8點離開奧斯汀,沖入狂暴的風雨中,一直來到阿肯色州的Cossatot河。等我們到了那里,壞天氣好像跟我們開了個殘酷的玩笑,居然繞過這條河徑直走了。我們筋疲力盡,失望之極,只好在河岸上扎營休息。那天晚上我們根本沒有聽到一絲雨聲。到了早上,我還是垂頭喪氣,頭昏眼花地走出帳篷,然后幾乎跌倒……在河里。Cossatot河素來就有漲水極快的壞名聲,僅僅因為上游10英里處下了2個小時的雨,水位就突漲了6英尺。現(xiàn)在我們倒是可以漂流了,但是水位又太高。我們決定等第二天早上再來對付難度大的這一段,先到相對容易一些的上游漂流。原來水流遲緩的1級水域現(xiàn)在已經變成了洶涌的3級急流。指南上說這一段要漂流“4個小時”,但我們只花了20分鐘就飛馳而下?!爸虚g”河段更糟糕:湍急的河水已經達到4級,猛烈地咆哮著。經過仔細偵察,我們輪流在河岸上執(zhí)守,一個人在河水中漂流時,要系著安全帶,由另一個人在岸上監(jiān)視情況。然后我們把皮劃艇放在營地,徒步走下去,看看下面的河段情況怎么樣。讓我們驚訝的是,居然有幾十個當地人在河岸旁放著躺椅,像看風景一樣看著河面。以往他們看到的只是4級瀑布,如今這條河已經完全被可怕的大漩渦所籠罩。此前,我們很少看到當地人,他們在這里只是看有沒有人出風頭,有沒有驚險的事情發(fā)生。這種景象讓我們目瞪口呆,所以我和同伴也各自坐在一塊大石頭上開始看熱鬧。追溯到2000年,盡管當時我的職位已經不低,而且待遇優(yōu)厚,但我還是離開了IBM,去加入一家名叫allmystuff的創(chuàng)業(yè)型(startup)公司。當時經濟已經開始衰退,但是在奧斯汀其他創(chuàng)業(yè)型公司紛紛垮臺之際,這家公司卻剛剛拿到了贊助。這家公司的企業(yè)運作并不取決于廣告收入,所以盡管廣告收入日薄,似乎也影響不大,另外allmystuff里集結了許多精兵良將。我加入公司之時,它的銀行資金有一千萬美元,不僅有固定客戶,而且擁有著高新技術,這一切都預示著它很可能成為炙手可熱的成功企業(yè)。我見過許多朋友都離開IBM大旗,轉而投奔其他公司,雖然新公司的待遇不能比,也沒有安全感,但是很有冒險性。我想反正在必要時還可以回去,所以面對著即將到來的黑暗,我迎頭沖入到這場風暴中。在奧斯汀新聞笑談曾經紅極一時的創(chuàng)業(yè)型公司都紛紛落馬之時,allmystuff也開始在困境中掙扎。我們日以繼夜地工作,為很少的幾個客戶部署解決方案。盡管我們的質量一流,有讓人自豪的業(yè)績記錄,但最后還是被衰退的經濟所累。風險投資者決定最好還是關門大吉,再找尋一種適應這種經濟衰退局勢的新概念東山再起。盡管這件事本身讓人很難受,但是在我的職業(yè)生涯中,那個時期我學到的東西卻是任何其他時候都比不上的。就像Cossatot河岸上的當地人一樣,如果一個冒險故事是我們身邊發(fā)生的真事,很刺激,甚至很危險,那我們大多數人都無法抵擋它的吸引力。不論是看一個久負盛名的希臘悲劇故事,還是看像電視劇“生存者”(Survivor)這樣一些最新的流行節(jié)目,我們的獵奇思想永無止境。程序員也不例外。我們很喜歡聊最近發(fā)生的冒險事情(我們把這稱為“實境談話”(merctalk)),這有很多原因。我有許多鮮活的工作記憶就是在allmystuff的乒乓球臺邊留下的。在那里我們討論過管理哲學;討論過代碼基是不是已經失控;另外還討論過,與日益復雜的JSP模型相比,有專門瀏覽器的XML是不是一種更簡單的方案。我們還討論過,眼看著進度不斷推遲,圖形化設計人員能不能把他設計的用戶界面映射為越來越復雜的Java命令。正是這些討論燃起了我的熱情,促使我離開了原本安穩(wěn)的職位,做著百萬富翁的夢,投向這個待遇更低、沒有安全感的新工作。這些經驗使我成為一個更好的程序員、管理人員和架構師。不記得在哪個場合下,前IBM主席JohnAkers曾說過,太多的人“整天都只是喝水聊天,無所事事”。我記得聽了這話我們都很生氣,他不知道,往往在喝水(或喝酒)時或者在乒乓球臺邊聽到的東西會決定一個項目(甚至一個公司)的成敗。在這里,必須聽些程序員的故事,受些熏陶,因為這些會影響一生。我準備把其中一些故事放到《BitterJava》這本書里。再回到早先,那時我還沒有加入allmystuff,正準備在一個會議上演講。我報告的題目是“BitterJava”。在會議期間,我遇到了一位著名的Java程序員,JSP的創(chuàng)始人之一。他告訴我曾經在Pamplona參加過“公牛奔跑”(runwiththebulls)活動(譯者注:這是一個很經典的活動,人們拼命地在公牛前面奔跑,一路上公牛會踩傷、踢傷或用角刺傷很多人,但人們還是樂此不疲,認為這是勇敢者的游戲),還被刺傷了。他還很起勁地給我解釋他在參加公牛奔跑時的策略。我對他講的不以為然。在Pamplona,早有無數的人告訴過我怎樣避免被刺傷。我還向O.J.Simpson咨詢過這方面的問題。每年都有數萬個熱衷于此的人參加,但只有十幾個被刺傷。不過,慢慢地我有了想法:如果我要參加公牛奔跑,那我就會和他討論。我想知道他是怎么計劃的,他又怎么實施他的計劃,哪里出了問題。這些信息我能用得上。后來發(fā)現(xiàn),這個被刺傷的程序員正是allmystuff工程部的副總裁,他招募我?guī)椭⑺姆諜C構。再來說我的報告,盡管講這個Pamplona故事可能會讓我失去在allmystuff工作的機會,但我還是決定用這個故事來開始我的演講。它充分體現(xiàn)了《BitterJava》中的概念。要說能幫助避免一個微妙的圈套或陷阱,一個關于失敗的故事往往抵得上10個成功的故事。這個故事牢牢地吸引住了聽眾,而且……我也得到了我的工作。像許多程序員一樣,我很喜歡極限運動。我們曾劃著小艇遭遇危險,有時甚至遇到生命危險。WilliamNeely曾經講過漂流界很有名的一個法則:你注視一個急流的時間與它吞掉你的危險往往成正比。換句話說,如果看上去漩渦大到能吃掉你,它很可能就會吃掉你。漂流者有自己的一套辦法來描述如何沿河下行。漂流指南中會指出一條路線,還會指出路線沿線以及路線之外的一些危險地方。指南中可能說,“接下來,你會看到中間有一塊大石頭,你要向左。如果誤撞到右邊,那這個急流就會成為‘終結者’,用殘酷的方式告訴你錯了。”我很清楚,即使你沒有真正了解一條河的威力,你也很想知道哪些地方可能出問題。我想知道水下有沒有巖石,有沒有陷阱等著我。我想知道哪里可能遇到漩渦,怎么躲過瀑布底下的大石頭。我想知道,是不是有人在這條河上喪生,那是怎么回事。如果沒有足夠的了解,就算有高超的技術,我往往也會回避,甚至頂著小船沿河岸一路走下去,就是不下水。程序員(包括我)也是一樣。我要了解應用和項目會在哪里失敗。我要知道是不是與某個接口的通信太多了,所用的技術能不能解決這個問題。我得明白一個技術可能在哪里出問題,這個技術能不能擴展。我深信,要想成功,軟件開發(fā)中總少不了失敗,而且勢必要從中學習。我還沒有看到哪個組織能系統(tǒng)地從錯誤中學習,并以正規(guī)、系統(tǒng)的方式仔細分析為什么要修改一個有問題的設計模式或過程。我曾經看過許多代碼,但并不是所有代碼都很好。我已經領會到“bitterJava”的魅力,希望你也一樣。