這里說(shuō)說(shuō)我的經(jīng)歷吧。大學(xué)前以及大學(xué)前面三年的經(jīng)歷就不說(shuō)了,因為大學(xué)前的高中就是好好學(xué)習,大學(xué)前三年就是混過(guò)來(lái)的。
我上的學(xué)校還算可以,雖然不是北大清華這樣第一流名牌大學(xué),但至少也算中國的第二流名牌大學(xué)了。大學(xué)中前面三年都陪伴著(zhù)游戲過(guò)去,所學(xué)到的只是些計算機基礎知識。到大四后我突然發(fā)現就業(yè)的問(wèn)題就在眼前,而自己似乎什么也不會(huì ),于是開(kāi)始看書(shū)。最一開(kāi)始重點(diǎn)看的是C++,可是后來(lái)自從看了一本J2ME的書(shū)以后被Java所吸引。當時(shí)雖然學(xué)校上過(guò)Java課程,但是自己也只是學(xué)了很少的皮毛,也就只會(huì )寫(xiě)寫(xiě)Hello World和什么加減法之類(lèi)很簡(jiǎn)單的程序,連API都知道沒(méi)有幾個(gè),比如說(shuō)字符串長(cháng)度的API我都不知道。所以剛開(kāi)始自己學(xué)J2ME的時(shí)候屢屢受挫,自己也明白自己的缺點(diǎn),決定從J2SE開(kāi)始好好補上。
剛開(kāi)始為了熟悉Java開(kāi)發(fā)環(huán)境,買(mǎi)了本JBuilder開(kāi)發(fā)的教程,并且在自己的本本上安裝了JBuilder進(jìn)行演練。當時(shí)的我連JavaDoc都不知道,每次究竟什么API能做什么事情一點(diǎn)頭緒都沒(méi)有,還不知道哪里去查,后來(lái)同學(xué)告訴我有個(gè)JavaDoc這個(gè)東西,我還興奮不已,覺(jué)得自己被從黑暗中拉回來(lái)了。一開(kāi)始使用JBuilder的時(shí)候,馬上為之所吸引,有兩個(gè)原因,第一是因為它自動(dòng)標出語(yǔ)法錯誤,邊寫(xiě)代碼邊提示你什么地方語(yǔ)法出錯,記得以前使用VC++的時(shí)候,每次程序寫(xiě)好后先編譯,然后再Build,再運行,這其中每個(gè)步驟都會(huì )出不少錯誤。特別是在編譯的時(shí)候,寫(xiě)個(gè)200多行的程序一次編譯下來(lái)就有100多個(gè)錯誤,結果每次花在這上面的工夫都要好長(cháng)時(shí)間。而JBuilder使用了即時(shí)語(yǔ)法分析,所以基本上程序寫(xiě)完,就可以省略調試語(yǔ)法錯誤的步驟了。第二個(gè)原因是可以自動(dòng)提示代碼,這個(gè)功能可以讓你迅速熟悉API,免得每次去查幫助文檔那么麻煩,我就是這么很快掌握了許多API的。
可能大家會(huì )問(wèn)我為什么一開(kāi)始不學(xué)習《Java編程思想》,的確這本書(shū)我們宿舍就有好幾本,不過(guò)大家普遍反映效果不好,到最后都不知道說(shuō)的是什么,所以我也沒(méi)敢看。
經(jīng)過(guò)20天左右的學(xué)習,對Java有了更進(jìn)一步的了解,熟悉了不少API函數,由于在那本書(shū)上寫(xiě)開(kāi)發(fā)SWING占了不少篇幅,所以也對Swing的開(kāi)發(fā)了解了不少??赐暌院笠驗橥瑢W(xué)說(shuō)Java的靈魂就是多線(xiàn)程編程,所以開(kāi)始看Oreilly的《Java線(xiàn)程》。記得在大學(xué)中操作系統這門(mén)課我們就提到過(guò)線(xiàn)程的知識。并且課本上就是用Java實(shí)現的,當時(shí)有了一點(diǎn)點(diǎn)概念,但這次看這本專(zhuān)門(mén)說(shuō)線(xiàn)程的書(shū)后才發(fā)現我原來(lái)了解的那些根本是什么都不算(當然,現在回想起來(lái),我那時(shí)看書(shū)學(xué)到的也只是很簡(jiǎn)單的皮毛而已)??赐赀@本書(shū)后我自己學(xué)會(huì )在我的JBuilder下開(kāi)發(fā)很簡(jiǎn)單的多線(xiàn)程程序,并且模擬線(xiàn)程沖突,等待等情況。當時(shí)看著(zhù)自己寫(xiě)的一兩百行程序可以順利執行,那種興奮勁就別提了。這本書(shū)我看得也很快,大概就花了3個(gè)星期看完。
經(jīng)過(guò)上面的學(xué)習,自己相比以前來(lái)說(shuō)提升了不少,這時(shí)候自己也找到了工作,是做J2EE對日外包的,所以更加堅定了努力學(xué)習Java的信心。
在上面寫(xiě)的程序中,我自己寫(xiě)程序沒(méi)有規范性,在代碼編寫(xiě)的時(shí)候自己的盲點(diǎn)特別多,還容易犯低級失誤。同學(xué)有一個(gè)《Effective Java》中文版,可是我看了幾頁(yè)發(fā)現自己根本看不懂,里面什么靜態(tài)工廠(chǎng)啊,什么單例模式什么的根本不知道什么東東。我知道自己目前的水平還不夠,所以決定放下這本書(shū),去尋找別的適合我的書(shū)看。這個(gè)時(shí)候我看到了候捷先生翻譯的《Practical Java》一書(shū),當時(shí)是剛剛上的書(shū)架。這本書(shū)我在書(shū)店翻了下目錄后就感覺(jué)如獲至寶,馬上買(mǎi)回家,在回家的公車(chē)上就貪婪地讀起來(lái)。這本書(shū)不算很厚,但是自己看得卻很認真很仔細,也明白了不少東西,比如Java中等號和equals()方法的區別,究竟什么時(shí)候用什么。還有Exception處理機制,以前不知道什么叫Exception,只是JBuilder提示我要我拋出Exception我再拋出Exception,自己覺(jué)得這東西基本沒(méi)什么用呢。但是看了這本書(shū)后我改變了看法,我發(fā)現Exception是個(gè)很好的東西,可以迅速把程序從正常狀態(tài)和異常狀態(tài)區分開(kāi)來(lái),即使而準確地在指定位置得到處理。那時(shí)自己也有了以后寫(xiě)程序的時(shí)候注意編寫(xiě)異常處理部分的想法?!禤ractical Java》這本書(shū)雖然不厚,但是我卻非常仔細地去看了,大概花了1個(gè)月時(shí)間,我把這本書(shū)完全消化了下去。
當時(shí)聽(tīng)說(shuō)Java在網(wǎng)絡(luò )上的應用非常廣,我也不知道究竟是什么應用,我于是買(mǎi)了Oreilly的《Java網(wǎng)絡(luò )編程》這本書(shū)。這本書(shū)雖然很厚,其實(shí)前半部分內容不是很復雜,后半部分寫(xiě)什么RMI的東西我也看不大懂,只能理解個(gè)概念。通過(guò)這本書(shū),我了解了HTTP協(xié)議究竟是什么一個(gè)東西,在它上面利用Java傳輸數據該如何做,知道了什么是Request,什么是Response。這也為以后開(kāi)始我的J2EE之旅打下了很好的基礎。當時(shí)自己依然是邊看書(shū)邊自己寫(xiě)代碼來(lái)驗證,自己寫(xiě)了個(gè)服務(wù)器端Socket和客戶(hù)端Socket,成功進(jìn)行了通信,又在上面加上了安全Socket內容,實(shí)現了SSL通信。當時(shí)我把寫(xiě)的這個(gè)又套上了Swing的外殼,還和同學(xué)拿這個(gè)傳文件呢。不過(guò)當時(shí)也沒(méi)有考慮過(guò)什么校驗碼之類(lèi)的東西,所以傳傳小文件還是可以的,文件稍微一大一點(diǎn),傳過(guò)去的文件總是不對頭,和我原來(lái)的文件經(jīng)常會(huì )出一些差異,導致文件打不開(kāi)。
《Java網(wǎng)絡(luò )編程》這本書(shū)看了不少時(shí)間,因為書(shū)比較厚,東西也比較多,不過(guò)除了后面的一些知識以外,其他的還是容易理解的。大概花了2個(gè)月左右的時(shí)間看完??赐旰?,時(shí)間也到了2004年的3月。我也輪到開(kāi)始我畢業(yè)設計的時(shí)候了。我們的畢業(yè)設計導師都還不錯,給你自己選個(gè)課題,我選的是一個(gè)B/S結構的在線(xiàn)簡(jiǎn)歷處理系統,正好和我所學(xué)和下面所工作的東西是一條路上的了。這時(shí)我覺(jué)得我應該往B/S結構上轉了,當時(shí)在選擇先看Servlet還是先看JSP上猶豫不決。最終決定先看Servlet,后來(lái)也證明了我的決定是對的,我在熟悉了Servlet后再學(xué)JSP是非常容易的,基本上根本沒(méi)有遇到什么難點(diǎn)。
可能有人會(huì )覺(jué)得我看了好多Oreilly的書(shū),雖然我不能說(shuō)Oreilly本本都是好書(shū),不過(guò)相對來(lái)說(shuō),好書(shū)的概率總超過(guò)許多其他的出版社,而且體系比較齊全。我看得幾本書(shū)我都覺(jué)得還不錯?,F說(shuō)說(shuō)下面這本我學(xué)Servlet時(shí)候看的《Java Servlet編程》來(lái)說(shuō)吧,很不錯的一本書(shū),讓我迅速知道了什么是Servlet,然后通過(guò)最簡(jiǎn)單的實(shí)例,讓你知道了Servlet如何運行的,跟HTTP協(xié)議是如何配合的,如何返回HTML形式的文本,XML配置符該如何寫(xiě),究竟每個(gè)元素是什么意思等等。由于我原來(lái)有一定的XML基礎(知道XML語(yǔ)法各種格式的含義而已),所以掌握起來(lái)還算比較快。通過(guò)這本書(shū),我知道了如何動(dòng)態(tài)生成HTML文檔,知道如何把一個(gè)Servlet映射到一個(gè)虛擬的地址。在后半部分寫(xiě)到了數據庫操作部分,我對數據庫的了解其實(shí)也僅限于原來(lái)大學(xué)課本上的《數據庫系統原理》,如何從程序和數據庫交互是一竅不通。通過(guò)數據庫操作這章,我知道了如何使用JDBC語(yǔ)句如何編寫(xiě),大家不要笑,對于當初一個(gè)新手來(lái)說(shuō),這個(gè)真是一個(gè)全新的領(lǐng)域,做什么事情都需要Sample來(lái)對照,跟著(zhù)依葫蘆畫(huà)瓢吧,其實(shí)現在的軟件開(kāi)發(fā)也是這樣,我想現在大家誰(shuí)能直接手寫(xiě)Struts或者Hibernate的配置文件都很難吧。閑話(huà)少說(shuō),大概這個(gè)時(shí)候,我對畢業(yè)設計的雛形有了點(diǎn)思想上的概念??赐炅恕禞ava Servlet編程》后緊接著(zhù)就又看Oreilly的《JSP設計》,由于有了Servlet的基礎,學(xué)起JSP特別快。當時(shí)沒(méi)有著(zhù)重看Tag的自定義設計,光看了JSP的其他東西,終于在五一節后把畢業(yè)設計都寫(xiě)完了,當時(shí)總代碼量是2000多行,第一次寫(xiě)這么多代碼的程序覺(jué)得很有成就感?,F在看起來(lái)那時(shí)做的是標準垃圾,但是當時(shí)覺(jué)得還是很不錯。用了Servlet + JSP。其實(shí)Servlet也不是用來(lái)當控制器的,而是和JSP做的差不多功能,都是作view的功能的。很快,畢業(yè)設計交差過(guò)去了,寫(xiě)寫(xiě)畢業(yè)論文,準備答辯。在這個(gè)過(guò)程中,我又一次考慮自己下面該看什么書(shū)。
這次我又看中了侯捷翻譯的一本巨著(zhù),也就是鼎鼎大名的Martin Fowler寫(xiě)的《重構——改善既有代碼的設計》這本書(shū)。剛開(kāi)始聽(tīng)見(jiàn)重構這個(gè)名字,總覺(jué)得非常高深,加上都評論說(shuō)重構是和設計模式齊名的東東,感覺(jué)更加高深恐怖了。大概在6月初我開(kāi)始看了重構,剛開(kāi)始看的時(shí)候雖然抱著(zhù)試試看的心態(tài),不過(guò)還是非常認真的。但是,讓我頗感意外的是重構并不是很難,至少這本書(shū)中說(shuō)的非常通俗易懂,通過(guò)大量的實(shí)例讓你覺(jué)得重構是種很簡(jiǎn)單很基本的技術(shù)。雖然我看完了重構以后在真實(shí)的代碼編寫(xiě)中很少直接按照上面代碼所說(shuō)的方法進(jìn)行重構代碼,基本上都是通過(guò)IDE來(lái)重構代碼,但是卻大大提升了自己編程思維,從此以后寫(xiě)代碼就很少瞻前顧后了,因為我擁有了重構這個(gè)工具。這本書(shū)有點(diǎn)厚,再加上中間有答辯,拍畢業(yè)照,以及畢業(yè)手續等等,這本書(shū)我花了一個(gè)半月看完。我看書(shū)的速度也不算快,不過(guò)我看書(shū)比較有恒心,不像有部分人看幾天就不想看了,我能堅持天天看,所以總的來(lái)說(shuō)還是不慢的。我計算過(guò),如果我每天看10頁(yè)書(shū),堅持下去,那一年就是3650頁(yè)書(shū),平均一本書(shū)365頁(yè)來(lái)算,1年就是10本。如果這10本書(shū)中有8本不屬于垃圾書(shū)籍,那么你這年就能有非常大的提高了。
看重構這本書(shū)中間我也抽了一段時(shí)間看了兩本其他的書(shū),第一本是《Java夜未眠》,挺不錯的一本書(shū),雖然是散文,但是還是能讓你明白不少道理,受益匪淺。另外一本就是李維的《Borland傳奇》,由于自己當時(shí)最喜歡用的工具就是JBuilder,所以也對Borland公司非常敬仰,特別對安德森,簡(jiǎn)直就頂禮膜拜啊,哈哈。這本書(shū)寫(xiě)得很精彩,寫(xiě)了Borland公司二十年來(lái)的血淚史,寫(xiě)了如何跟微軟斗爭,如何在微軟和IBM的夾縫中生存。當然,也有很多的對于技術(shù)方面作者李維自己的見(jiàn)解,看了會(huì )有不少同感的。就這樣,磨磨蹭蹭地把重構看完了。
當看完了《重構》這本書(shū)之后,我也開(kāi)始去公司報到上班了??梢钥闯鰜?lái),我當時(shí)工作的時(shí)候水平也很有限,但總比一年前要好不少,至少很多東西都已經(jīng)知道了。那時(shí)外面極限編程聽(tīng)的比較多,自己也去書(shū)店買(mǎi)了本《Java極限編程》回來(lái)看,現在想想算是我看得第一本垃圾書(shū)籍了。不過(guò)也是有收獲的,這本書(shū)極限編程也就說(shuō)了點(diǎn)概念,然后就寫(xiě)了不少工具的使用方法。在看《重構》中對JUnit有了點(diǎn)認識,不過(guò)只是皮毛中的皮毛??戳诉@本《Java極限編程》后對JUnit的使用又了解了不少皮毛,對于Cactus有了點(diǎn)了解,對Ant了解了不少,至少可以自己寫(xiě)出自己需要的配置文件了,并且可以結合JUnit生成測試Report。由于我去的是日企,做對日外包的,所以公司開(kāi)始培訓日本語(yǔ),用的是《標準日本語(yǔ)》這套教材。我于是邊學(xué)日語(yǔ)邊看技術(shù),大概2個(gè)星期左右我把那本《Java極限編程》初步看完后就扔在了家里。這時(shí)的我已經(jīng)開(kāi)始會(huì )用Ant了,覺(jué)得是步入J2EE的重要一步。
很快啃掉那本垃圾書(shū)以后又看了本和Java不是非常有關(guān)的書(shū):《程序員修煉之道——從小工到專(zhuān)家》,原因其實(shí)很簡(jiǎn)單,大學(xué)同學(xué)都說(shuō)這本書(shū)是經(jīng)典書(shū),看書(shū)這東西,別人的評價(jià)還是能起不少作用的。這本書(shū)字數不是很多,不過(guò)排版的時(shí)候比較分散,導致書(shū)本有點(diǎn)厚,呵呵,可能也算出版社賺錢(qián)的一種方法吧。不過(guò)總的來(lái)說(shuō),我覺(jué)得出版社紙張質(zhì)量最好的是電子工業(yè)出版社,其次是中國電力出版社,最爛的恐怕就是機械工業(yè)出版社了,機械工業(yè)出版社有少量書(shū)紙張還能說(shuō)過(guò)去,但有不少簡(jiǎn)直讓人不得不有脾氣啊,紙張薄得感覺(jué)和寫(xiě)毛筆字的宣紙都差不多了。這本電子工業(yè)出版社的書(shū)紙張質(zhì)量的確不錯,不過(guò)也許是因為我功力尚淺,所以這本書(shū)雖然都看懂了,但是深有感觸并且銘記于心的沒(méi)有幾個(gè),現在再回想,也只記得軟件模塊設計時(shí)要正交等等少數幾點(diǎn)了。這本書(shū)由于內容不是非常多,所以我就看了半個(gè)月不到搞定。這時(shí)的我開(kāi)發(fā)IDE已經(jīng)轉移到了Eclipse上,畢竟商業(yè)開(kāi)發(fā)用D版有點(diǎn)說(shuō)不過(guò)去,而且公司也怕查,所以不允許用JBuilder,鼓勵大家用Eclipse。我用了一段時(shí)間的Eclipse后,從一開(kāi)始的不適應到后來(lái)覺(jué)得Eclipse很方便使用,JBuilder比Eclipse多的就是一些根據不同類(lèi)型開(kāi)發(fā)的模版而已,而這些可以由Eclipse的插件來(lái)彌補。到了這時(shí),我覺(jué)得我的Java基礎應該算還可以的了,API也熟悉了非常多。我覺(jué)得看《Effective Java》的時(shí)機成熟了。
由于大學(xué)已經(jīng)畢業(yè)了,所以也不會(huì )有同學(xué)的《Effective Java》放在邊上讓我看這樣的好事出現,老老實(shí)實(shí)地去了書(shū)店買(mǎi)了本《Effective Java》中文版回來(lái)研讀。呵呵,大家也許會(huì )問(wèn)我為什么不買(mǎi)本E文的看,雖然我大學(xué)早早也把英語(yǔ)4級過(guò)了,而且大學(xué)中不少計算機專(zhuān)業(yè)課程教材也是E文的,當時(shí)為了考試也認真讀了。但是畢竟英語(yǔ)不是我們的母語(yǔ),看起來(lái)速度上明顯比中文版的慢一截。當然,如果是那種垃圾翻譯者用機器翻譯出來(lái)的中文版,看那些垃圾中文版速度肯定比不上直接看英文原版的。這時(shí)的我看《Effective Java》已經(jīng)不再是當初的那么感覺(jué)很陌生了,覺(jué)得上面說(shuō)的那些要點(diǎn)自己想想還都是可以理解的。我個(gè)人覺(jué)得提高自身編程習慣以及水平最多的還是看類(lèi)似于《Practical Java》和《Effective Java》的這種按照條目來(lái)進(jìn)行說(shuō)明的書(shū),能把你自己平時(shí)容易忽略的地方按照重點(diǎn)一個(gè)個(gè)揪出來(lái)進(jìn)行修正。比如《Effective Java》中的第一條,使用靜態(tài)工廠(chǎng)來(lái)代替構造函數,自己原來(lái)在進(jìn)行開(kāi)發(fā)的時(shí)候,從來(lái)不怎么會(huì )主動(dòng)想到建立一個(gè)靜態(tài)工廠(chǎng),總覺(jué)得使用構造函數來(lái)新建一個(gè)對象是天經(jīng)地義的事情。但看完這個(gè)條目后,我的看法也隨之改變,發(fā)現靜態(tài)工廠(chǎng)還是非常好的,當然,也不是什么地方用靜態(tài)工廠(chǎng)都很好。上面也寫(xiě)到了靜態(tài)工廠(chǎng)的優(yōu)缺點(diǎn),比如在什么地方適合使用,什么場(chǎng)合最好不要使用等等。這本書(shū)我覺(jué)得翻譯的也不錯,絕對值,強烈向有一定開(kāi)發(fā)經(jīng)驗的人推薦。我大概看了3周半的樣子把這本書(shū)看完,這時(shí)的時(shí)間也到了2004年的9月初,新員工入司培訓也不再是第一個(gè)月純粹的日語(yǔ)培訓,而是技術(shù)培訓和日語(yǔ)培訓一起開(kāi)展,技術(shù)上培訓Java,Web開(kāi)發(fā),數據庫開(kāi)發(fā)這三門(mén)課程,日語(yǔ)則開(kāi)始進(jìn)行日本語(yǔ)國際三級的培訓。公司的日語(yǔ)培訓和技術(shù)培訓都還不錯,技術(shù)培訓純粹把大家當作什么都不懂的人,在Java上從最原始的Hello World開(kāi)始培訓,Web開(kāi)發(fā)上從HTML頁(yè)面開(kāi)始培訓,數據庫開(kāi)發(fā)則從Oracle的安裝,SQL語(yǔ)句的編寫(xiě)開(kāi)始培訓。當然,在培訓的過(guò)程中我也不會(huì )閑著(zhù),而是又開(kāi)始尋找自己要啃的書(shū)本,這次,我選中了Oreilly新出版不久的《Java與XML》第二版。
由于XML表達數據的自由性以及強大型,所以XML特別適合于做配置文件以及數據信息文件,在Java中XML的使用可謂是多如牛毛。在J2EE中,從Web Application的web.xml開(kāi)始就是XML文件,到下面的Framework配置等等,沒(méi)有一個(gè)沒(méi)有XML的身影,而且XML都起到了舉足輕重的作用。雖然我原來(lái)也懂一點(diǎn)XML,不過(guò)也僅限于XML的語(yǔ)法以及結構等等,那些深入下去的東西基本還是盲點(diǎn),關(guān)于Java中如何處理XML更是一竅不通。為了更好的學(xué)習J2EE,XML是必須征服得一座山峰。這次,我依然又再一次信任了Oreilly出版社,買(mǎi)了本當時(shí)出版不久的《Java與XML》中文第二版。這本書(shū)剛開(kāi)始并沒(méi)有過(guò)多介紹XML本身過(guò)多的東西,只是為了怕某些讀者并不了解XML而對XML語(yǔ)法結構等做了非常簡(jiǎn)要的介紹,不過(guò)也非常到位的介紹。介紹完了這些XML基礎知識后就開(kāi)始了SAX——〉DOM——〉JDOM——〉JAXP——〉Web Service的歷程。不過(guò)我現在覺(jué)得如果能介紹DOM4J就更好了,因為我現在覺(jué)得DOM4J是Java中最好用而且性能也不錯的XML處理工具。剛開(kāi)始的我其實(shí)什么是SAX,什么是DOM都不知道,對JAXP更是一無(wú)所知。這本書(shū)英文版據說(shuō)很受好評,中文版我只能說(shuō)一般,因為有些地方估計譯者并不擅長(cháng)這一塊,所以翻譯得很生硬,以至于部分段落難于理解??傮w來(lái)說(shuō),書(shū)的絕大多數內容還是可以看懂,由于沒(méi)有具體實(shí)際操作的經(jīng)驗,所以很多也就是把概念理解了,直到幾個(gè)月后做正式項目開(kāi)始應用這些XML處理工具進(jìn)行開(kāi)發(fā)的時(shí)候才達到了熟練運用的能力。在這本書(shū)中學(xué)會(huì )了JDOM的使用方法,JDOM也還是比較好用的,學(xué)會(huì )了JDOM,以后操縱XML也方便了許多。這本書(shū)我的建議就是,可以一口氣讀到第十章JAXP部分,后面的Cocoon以及SOAP等等部分那本書(shū)介紹的并不是很好。Cocoon我是看了官方專(zhuān)門(mén)的幫助文檔以后才感覺(jué)入了門(mén)。而SOAP是經(jīng)過(guò)別的書(shū)籍加上項目中的實(shí)際運用才真正學(xué)會(huì )的。
這時(shí)到我剛進(jìn)公司已經(jīng)兩個(gè)月過(guò)去了,時(shí)間已經(jīng)到了9月中旬的樣子,還有一個(gè)月我們公司新員工入司培訓就要結束,也意味著(zhù)還有一個(gè)多月我們就要開(kāi)始接觸正式項目。這時(shí)的我寫(xiě)B/S程序僅僅是JSP + JavaBean的水平,連JSP中的TAG都不會(huì )自定義,看見(jiàn)別人網(wǎng)上的程序自己還自己定義Tag很是羨慕,于是決定把那本《JSP設計》認真看完,把自定義Tag的功能實(shí)現。后來(lái)看了以后發(fā)現原來(lái)那本《JSP設計》的精華都在最后的150頁(yè)內,最后那部分先是介紹了自定義Tag的定義方法以及Tag定義所帶來(lái)的一些好處。自從學(xué)會(huì )了如何自定義Tag,在后來(lái)公司的項目中自己也根據項目的特點(diǎn)定義了一些共通的Tag,大大方便了不少項目中的開(kāi)發(fā)人員,提高了生產(chǎn)力。這本書(shū)而且也說(shuō)了一下B/S開(kāi)發(fā)的兩種Web Module。在這里,我第一次知道了Web開(kāi)發(fā)可以用一個(gè)Servlet作為控制器,用JSP僅僅作用于表現層,這也為以后掌握MVC打下了很好的基礎。
9月中下旬掃完了《JSP設計》的尾巴后,有一次跟公司給我們培訓的老師在閑聊時(shí)談到了項目開(kāi)發(fā),我詢(xún)問(wèn)他項目是不是用JSP和JavaBean來(lái)開(kāi)發(fā),他笑著(zhù)和我說(shuō)不是這樣的,而是基于Framework來(lái)進(jìn)行開(kāi)發(fā)。比如Struts就是公司的常用Framework。Struts這東西以前也好像聽(tīng)說(shuō)過(guò),不過(guò)從來(lái)也只是聽(tīng)說(shuō)而已,并沒(méi)有看過(guò)。得到這個(gè)信息的我,為了能盡快熟悉實(shí)際項目的開(kāi)發(fā)環(huán)境,便決心盡快學(xué)會(huì )Struts。當時(shí)的市場(chǎng)上講解Struts的書(shū)只有一本,也就是Oreilly的《Jakarta Struts編程》,不像現在連《Struts in Action》的中文版也有了。我去了書(shū)店買(mǎi)來(lái)開(kāi)始回家看,剛開(kāi)始看的時(shí)候覺(jué)得如同云里霧里一般,因為這本書(shū)歸納總結性的東西很多,比較適合當參考手冊,而真正帶領(lǐng)新手入門(mén)這一塊做的并不好。所以當我把這本書(shū)都看完了以后,還是不會(huì )用Struts編寫(xiě)一個(gè)程序,只是感覺(jué)自己朦朦朧朧懂了一些概念,比如MVC什么的。在公司我們的培訓也結束了,通知在國慶節過(guò)來(lái)以后的第一個(gè)星期——大概是10月10日左右進(jìn)行考試,最后根據培訓考核情況來(lái)調整薪水。當時(shí)跟我一起培訓的新員工基本上沒(méi)有人會(huì )Struts,其實(shí)這個(gè)時(shí)候連會(huì )用JSP + JavaBean寫(xiě)一個(gè)最簡(jiǎn)單的登錄畫(huà)面的人也沒(méi)有多少個(gè),大部分人還是模模糊糊懂一點(diǎn),但是具體做東西還是做不來(lái)的那種水平。國慶節大概10月5號的我去了趟書(shū)店,突然發(fā)現書(shū)架上新上了一本書(shū),就是孫衛琴編寫(xiě)的《精通Struts》這本書(shū)。孫衛琴的書(shū)我倒是聽(tīng)說(shuō)過(guò),就是在這之前出的一本關(guān)于Tomcat以及Web App開(kāi)發(fā)的書(shū),據說(shuō)挺容易上手的。我翻看了這本書(shū)的目錄結構,覺(jué)得可以值得一讀,于是雖然價(jià)格不菲,仍然買(mǎi)回家當天就研讀起來(lái)。憑我的讀后感覺(jué)來(lái)說(shuō),這本書(shū)也許學(xué)術(shù)價(jià)值并不高,說(shuō)得深入的東西基本沒(méi)有,但是特別適合初學(xué)者,通過(guò)Hello World這種例子迅速讓你手把手編寫(xiě)出第一個(gè)Struts程序。就這樣,在這本書(shū)買(mǎi)回來(lái)的第二天,我自己就用Struts寫(xiě)了一個(gè)很簡(jiǎn)單的登錄畫(huà)面程序,當時(shí)的感覺(jué)別提多興奮了,就感覺(jué)自己入了門(mén),以后的道路一片光明。在這里,我要由衷地感謝孫衛琴女士,寫(xiě)了這么一本適合初學(xué)者的書(shū),同時(shí)也建議沒(méi)有學(xué)過(guò)Struts但又想掌握Struts的Java程序員們買(mǎi)這本書(shū)回來(lái)看(不知道我是不是有書(shū)托之嫌,我只是說(shuō)我自己的心里想法)。
國慶的假期放完了,我也回到了公司準備考核,上午是筆試,下午是上機考試。筆試分為了4塊,分別是Java,Web開(kāi)發(fā),Oracle數據庫,以及CMMI規約。這四門(mén)除了Oracle數據庫我一向不是很擅長(cháng),只考了個(gè)中等分數以外,其他三門(mén)分數都名列前茅。不過(guò)CMMI規約老實(shí)說(shuō)我也不怎么會(huì ),不過(guò)碰巧考的很多都是我知道的東西。下午是上機考試,題目給出來(lái)了,我一看題目,原來(lái)是一個(gè)最簡(jiǎn)易的成績(jì)查詢(xún)系統,也就是數據庫里面已經(jīng)有一些學(xué)生成績(jì),我們寫(xiě)一個(gè)檢索頁(yè)面,可以輸入或者選擇檢索條件,把符合我們檢索條件的數據輸出并顯示在畫(huà)面中。我于是拿剛學(xué)會(huì )不久的Struts進(jìn)行編寫(xiě),在3個(gè)小時(shí)內把整個(gè)頁(yè)面都寫(xiě)好了,并且還自定義了一個(gè)Tag來(lái)顯示數據信息??纪暌院笪也胖揽偣惨簿臀辶鶄€(gè)人程序可以運行,而且只有我一個(gè)人用的是Struts,其他人基本都是最簡(jiǎn)單的JSP + JavaBean,有的人連JavaBean都沒(méi)有,數據庫操作全部寫(xiě)在了JSP頁(yè)面中。毫無(wú)疑問(wèn),這次上機考試我得到了好評,給了最高分。在全部的培訓成績(jì)中我也居前兩名,我們部門(mén)新員工我排第一名。帶著(zhù)這個(gè)成績(jì),我們的入司培訓基本結束,開(kāi)始進(jìn)入部門(mén)做實(shí)習項目。
雖然說(shuō)我們正式進(jìn)了部門(mén),不過(guò)試用期還沒(méi)有結束,我們試用期最后一個(gè)月的任務(wù)就是做一個(gè)實(shí)習項目,當然,每天還是要進(jìn)行日語(yǔ)培訓,因為要參加12月份的國際日語(yǔ)三級考試。公司也象征性得給大家培訓了三節課的技術(shù),第一節是Struts培訓,第二節是Web App的MVC結構的培訓,第三節是Log4j培訓,這幾次培訓下來(lái),大部分人感覺(jué)好象云里霧里一樣,基本什么都沒(méi)聽(tīng)懂,不過(guò)我由于有了點(diǎn)Struts的基本知識,所以感覺(jué)收獲比較大,特別是MVC的培訓中我真正明白了視圖——控制器——模型這三層每層應該怎么處理,知道了一個(gè)Web App中如何分Java Package比較好,明白了專(zhuān)門(mén)有一個(gè)DAO層來(lái)處理數據庫所帶來(lái)的便捷,明白了Log在Web開(kāi)發(fā)中的重要地位,這為以后的開(kāi)發(fā)帶來(lái)了很大的好處。實(shí)習項目的課題很快就下來(lái)了,要我們做一個(gè)電子相冊的B/S系統,要求有圖片上傳,圖片檢索,圖片顯示以及要用Struts來(lái)構建,這些是基本的要求,其他功能可以自由擴張。我們部門(mén)的新員工分為兩個(gè)小Group,都是一樣的課題,互相促進(jìn)和學(xué)習,每個(gè)Group還配備了一個(gè)老員工,作為督促我們的進(jìn)度,防止我們有過(guò)大的偏差等等,不過(guò)具體做東西上原則上要求是不會(huì )給我們什么幫助。首先每個(gè)小Group要選出一個(gè)Leader,結果我被大家一致選為我們Group的Leader。在小組討論中我們先進(jìn)行需求分析,大家的討論很是熱烈,主意也很多,不過(guò)基本上組員們也都是點(diǎn)子多,具體實(shí)現上面還都沒(méi)有想過(guò)。對于他們的那些建議,絕大多數我決定都作為我們要實(shí)現的目標,但也有少部分我覺(jué)得目前以我們的水平還無(wú)法實(shí)現的,就先否決了。會(huì )議開(kāi)完后,當天回家以后我就開(kāi)始排開(kāi)發(fā)計劃和個(gè)人的進(jìn)度,第二天寫(xiě)畫(huà)面的基本設計,第三天把組員拉過(guò)來(lái)開(kāi)始Review基本設計,我們組的速度還算比較快。從星期二公布課題,到星期五就和幾個(gè)組員一起把DEMO畫(huà)面設計出來(lái)了。原來(lái)的計劃是第二個(gè)星期一開(kāi)始Coding,大概花一個(gè)星期完成。不過(guò)其余組員似乎還是不怎么會(huì )Struts,于是我回家星期六星期天基本全天都在看書(shū)寫(xiě)代碼學(xué)習,花了兩天把項目基本Coding完畢。其中Web頁(yè)面部分也不再使用一開(kāi)始使用Frame的做法,而是采用了Tiles框架。Tiles的使用過(guò)后我感覺(jué)是非常好的東西,經(jīng)過(guò)簡(jiǎn)單的配置可以完成大批網(wǎng)頁(yè)中類(lèi)似部分的構建,而且生成的屬于一個(gè)頁(yè)面,這樣就省去了以前寫(xiě)Frame時(shí)提交頁(yè)面總是要考慮設置Target以及在引用對象的時(shí)候大批Parent或者top對象使用的麻煩事了。在開(kāi)發(fā)過(guò)程中我使用了Log4j,這為我的調試程序帶來(lái)了極大的方便,呵呵,可以想象,沒(méi)有Log來(lái)調試一個(gè)Web程序真是不可想象的。
這段時(shí)間我是邊開(kāi)發(fā)邊翻查那本《精通Struts》的,這樣,迅速把Struts中提供的許多Tag弄熟練了,為以后具體的項目開(kāi)發(fā)帶來(lái)了便捷。也許是一向以來(lái)公司的實(shí)習項目完成效果都不是很理想吧,這次我們的迅速完成比較出乎Leader的意料,綜合三個(gè)月的試用培訓,由于我在日語(yǔ)和技術(shù)以及實(shí)習項目中表現都還不錯,所以定工資級別時(shí)也是同一批進(jìn)公司的新員工中最高的,隨著(zhù)轉正會(huì )議的結束,我也在10月底成為了公司的正式員工。大概剛剛進(jìn)入11月份,我們Group便開(kāi)動(dòng)一個(gè)項目,項目不是很大。當時(shí)老員工們許多都在做項目的詳細設計,我便跟著(zhù)公司一位技術(shù)專(zhuān)家(也是當初給我們入司培訓的其中一位老師)做起項目的Framework構建工作。當時(shí)的我才進(jìn)公司,第一資歷尚淺,第二我的確也并不是很會(huì )什么東西,所以給我的任務(wù)很多都是一些模塊的Utility的設計。比如通用的Check方法啊,CSV以及定長(cháng)文件的讀取解析什么的啊,還有某些在IE中可以實(shí)現的效果如何在Netscape中也能實(shí)現同樣的效果等等。雖然這些東西在現在看來(lái)并不是很復雜,但是當時(shí)自己的確隨著(zhù)做這些東西而學(xué)到了很多很多。比如使用JDOM對XML文件的解析啊,很多Check方法的小技巧啊,IE和Netscape究竟有什么地方不一致,該如何解決等等,這些都在這幾天內了解了很多。在這幾天中,我通過(guò)網(wǎng)上查找資料,臨場(chǎng)迅速學(xué)習了Java反射的使用方法,并且自己邊學(xué)邊寫(xiě)實(shí)例,實(shí)現了各種情況下的反射案例。我個(gè)人覺(jué)得掌握Java反射技術(shù)是非常重要的,這讓你可以寫(xiě)一些通用的工具。如果不會(huì )反射技術(shù)的話(huà),也許你永遠只能寫(xiě)一些針對特定情況下的解決方法。而會(huì )使用反射以后,你可以寫(xiě)一些代碼,這些代碼可以用在許多地方,達到自己擴展甚至構建Framework的效果。在這個(gè)項目中,我使用了自定義Tag和Java反射技術(shù),定義了些項目中比較需要的通用的Tag,方便了大家。
后來(lái)聽(tīng)老員工說(shuō)新員工進(jìn)公司就開(kāi)始做Framework是以前從來(lái)都沒(méi)有過(guò)的事情,因為我們Leader對我希望比較大,所以想盡可能培養我,讓我早點(diǎn)挑起項目大梁,所以給我的成長(cháng)提供了一次又一次的機遇。11月中旬以后,項目開(kāi)始進(jìn)入編碼階段,我也第一次看到了正式的項目設計書(shū)。第一次看到設計書(shū)的時(shí)候我都覺(jué)得自己腦子有點(diǎn)懵,一大堆日語(yǔ)什么含義自己不是很清楚,而且感覺(jué)根本無(wú)從下手,不知道從哪里開(kāi)始看比較好。項目擔當耐心得和我說(shuō)了設計書(shū)的格式以及究竟什么地方是什么一個(gè)含義,以及Coding的時(shí)候按照什么個(gè)思路來(lái)看設計書(shū)。再加上項目中有老員工先寫(xiě)了個(gè)Sample,讓大家看了標準的一個(gè)流程,所以我們就依葫蘆畫(huà)瓢,慢慢得把一個(gè)畫(huà)面一個(gè)畫(huà)面Coding完畢。當然了,后來(lái)也有測試員來(lái)測試我們的畫(huà)面,發(fā)現bug后就發(fā)Bug Report給我,那一個(gè)月就是在Coding,修正Bug中渡過(guò)的,這個(gè)項目是用Struts做的,因為不大。所以也沒(méi)有再用其他的Framework,數據庫操作那里只有個(gè)非常簡(jiǎn)單的單表操作DAO層,其余的DB操作都是自己通過(guò)JDBC操作語(yǔ)句來(lái)完成的。在這第一個(gè)自己接觸的真正項目中,我自己學(xué)到了很多B/S設計的技巧,感覺(jué)很充實(shí)。不過(guò)書(shū)本學(xué)習方面我也沒(méi)有閑著(zhù),我為了能夠深入了解Java,大概在11月中旬左右開(kāi)始看《深入Java虛擬機》這本書(shū),由于內容比較深入,所以看得也有點(diǎn)吃力。書(shū)翻譯得和寫(xiě)得都還不錯,值得一看,我一直看了前八章,看到Java程序運行細節后就沒(méi)再看了,大概看到了12月底的樣子吧,呵呵,有時(shí)間的話(huà)決定把后面的部分也看完。這本書(shū)看完后收獲就是了解了Class文件的實(shí)質(zhì),Java的安全模型,虛擬機是如何工作的。這些知識對后來(lái)調試程序Bug或者Exception的時(shí)候非常有好處,可以把以前自己覺(jué)得莫名其妙的錯誤的原因找出來(lái),不像以前遇到很古怪的Exception的時(shí)候怎么死的都不知道,從讀完這本書(shū)以后,在以后的調試異常中很少再有不知所以然的感覺(jué)了。
2004年12月底的時(shí)候,我的第一個(gè)項目也做完了,由于我空閑著(zhù),Leader便在星期三的時(shí)候把一個(gè)公司內部開(kāi)發(fā)的Source統計的小工具讓我進(jìn)行修改,使得添加一個(gè)比較有用的功能。東西給我的時(shí)候基本沒(méi)有任何文檔,在我手上的就是一堆源代碼而已,界面是用Swing制作的,因為沒(méi)有專(zhuān)門(mén)在UI上進(jìn)行精心設計,所以說(shuō)不上好看,典型的Java編寫(xiě)的圖形界面的程序的樣子。軟件不是非常大,估計在1萬(wàn)行源代碼以?xún)?,不過(guò)對于只有一個(gè)人修改來(lái)說(shuō),也比較夠嗆了。還好我在剛學(xué)Java的時(shí)候用JBuilder寫(xiě)了一些Swing的程序,現在還是對Swing有概念的,所以拿到手上以后經(jīng)過(guò)仔細分析,逐漸理清了頭緒。經(jīng)過(guò)修改和自己測試完畢后,覺(jué)得還比較滿(mǎn)意,達到了預期的目標,于是在星期五的時(shí)候提交給了Leader。通過(guò)這次,對Swing的開(kāi)發(fā)又加深了印象,自然,在有的細節技巧方面受益匪淺。
元旦很快來(lái)臨了,在年底以前,公司覺(jué)得有必要學(xué)習下Hibernate,雖然我們目前的項目中還沒(méi)有用過(guò)Hibernate,而是用另外一個(gè)公司內部開(kāi)發(fā)的ORM工具,不過(guò)幾名技術(shù)專(zhuān)家初步對Hibernate感覺(jué)后覺(jué)得Hibernate的功能要強大的多,而且是開(kāi)源的,不斷有人在推動(dòng),升級,所以有必要我們要學(xué)Hibernate。這次的學(xué)習采用學(xué)習小組的形式,也就是公司內部先抽幾名員工(主要是技術(shù)部門(mén)的,當然,開(kāi)發(fā)部門(mén)如果有興趣的話(huà)也可以考慮)來(lái)進(jìn)行深入學(xué)習,然后定期開(kāi)會(huì )交流互相學(xué)習,達到短時(shí)間內先行的幾名成員迅速深入掌握Hibernate的形式。由于我第一處于空閑狀態(tài),第二也比較有興趣,而且跟技術(shù)部門(mén)的專(zhuān)家們也比較談得來(lái),所以我也加入了其中,成為幾名學(xué)習小組中成員的一部分。我們學(xué)習資料主要就是《Hibernate in Action》英文版一書(shū)以及官方的幫助手冊。我負責其中對象操作,Transaction和Cache,還有高級Mapping關(guān)系的設置幾個(gè)部分的學(xué)習。由于資料都是全英文的,所以看書(shū)速度并不是很快,不過(guò)還是初步得到掌握了。大概學(xué)習了半個(gè)多月的樣子,我們各自基本學(xué)習完畢,互相交流后并且寫(xiě)下了讀書(shū)筆記,用來(lái)后面具體項目開(kāi)發(fā)時(shí)候參考用。通過(guò)這大半個(gè)月的學(xué)習,我個(gè)人覺(jué)得提高了非常多,在這之前,我只知道有ORM這種東西,但是從來(lái)沒(méi)有使用過(guò),也從來(lái)沒(méi)有看過(guò)。自從學(xué)過(guò)了以后,我不僅對Hibernate在代碼編寫(xiě)時(shí)的使用比較熟悉了,而且對Hibernate的配置以及許多底層的知識有了很清楚的認識,讓自己在數據持久化方面的認識提高了大大的一步。
元旦過(guò)后,雖然一邊在學(xué)習Hibernate,不過(guò)由于下面項目的需要,Leader跟我說(shuō)要我學(xué)一下Unix下的Shell編程,因為 項目中許多批處理會(huì )用Shell來(lái)啟動(dòng)。UNIX命令在學(xué)校時(shí)候學(xué)過(guò)的,不過(guò)這個(gè)時(shí)候已經(jīng)忘記了很多,只是翻閱資料的時(shí)候還能回想起來(lái)不少命令。Shell并不難,如果有了編程基礎,學(xué)習Shell編程也很快的,總體感覺(jué)就是編程語(yǔ)言大同小異,從基本語(yǔ)法來(lái)說(shuō),不外乎賦值、條件、循環(huán)這幾種類(lèi)型。只要迅速掌握這幾種類(lèi)型在這種編程語(yǔ)言中的編碼格式,那么你就可以迅速掌握這門(mén)語(yǔ)言最基本的編程能力。Shell經(jīng)過(guò)一周的學(xué)習后覺(jué)得感覺(jué)不錯,不僅可以順利看懂別人寫(xiě)的Shell程序,而且自己可以在Linux下順利寫(xiě)出符合自己需求的Shell程序并能順利執行。但是突發(fā)事件總是有的,那個(gè)項目突然決定延后兩個(gè)月,所以前一個(gè)星期的學(xué)得Shell等于暫時(shí)派不上用場(chǎng)了。不過(guò)嘛,多學(xué)一樣技能總是沒(méi)有害處的,而且又復習了那么多Unix命令啦,感覺(jué)還是很不錯的。于是我又進(jìn)入了不在項目中的真空期了。
但是好景不長(cháng)啊,好日子還沒(méi)有過(guò)上兩個(gè)星期,公司去年做的一個(gè)比較大的項目開(kāi)始了2期開(kāi)發(fā),我也被一下拖入了項目中。說(shuō)起那個(gè)項目,公司好多人還心有余悸,據說(shuō)去年那個(gè)項目開(kāi)發(fā)的時(shí)候,大概50多號人干了好幾個(gè)月,每天都是11點(diǎn)以后才有可能回家,周六是鐵定加班,周日是看情況,晚上就算加班加到凌晨3點(diǎn)也不是什么奇怪的事情。當時(shí)大家都說(shuō)多來(lái)幾個(gè)這種項目大家就要死了,這次這個(gè)項目的2期過(guò)來(lái)了,大家精神又一次緊張起來(lái)咯。一開(kāi)始照例是項目會(huì )議,聽(tīng)完項目經(jīng)理描述以后,大家也放心了不少,這次雖然說(shuō)是二期,不過(guò)規模不大,只需要15個(gè)人左右干一個(gè)月就能搞定。主要是把項目一期里面一些地方進(jìn)行改修,當然也有需要新的畫(huà)面的開(kāi)發(fā),不過(guò)相對于去年的那塊不是很多而已。對我來(lái)說(shuō)這次是個(gè)很大的考驗,因為項目是二期,項目組內除了我,其他的人都做過(guò)1期開(kāi)發(fā),所以對項目結構都很清楚。這次項目開(kāi)始并沒(méi)有什么培訓,所以我只能單獨看1期的源代碼來(lái)熟悉項目結構什么的。這個(gè)時(shí)候項目經(jīng)理把我叫去要我辦理護照,準備這個(gè)項目派遣我去東京現場(chǎng)維護。
這個(gè)項目是個(gè)比較全面比較大的項目,服務(wù)器采取了集群的方式,數據量也是千萬(wàn)乃至上億級別的,所以性能要求特別高。在技術(shù)方面用到了很多,使用EJB來(lái)控制Transaction,使用了ORM工具來(lái)操縱DB數據等等等等。而且由于比較龐大,所以服務(wù)器初始化的那塊為了Load上去大批配置信息,代碼量極其龐大,在權限控制的那塊地方,代碼非常難以讀懂。這也給我一開(kāi)始的學(xué)習代碼帶來(lái)了很大的一塊麻煩。不過(guò)總算靜下心來(lái)后把整個(gè)項目框架以及實(shí)現手法基本摸清楚了,這個(gè)時(shí)候覺(jué)得非常開(kāi)心,而且對Web應用程序的構造心里面也非常充實(shí),覺(jué)得自己已經(jīng)具備寫(xiě)Framework的初步能力了。
項目是緊張的,基本上每天晚上都要加班到11點(diǎn),然后打車(chē)回家,哈哈,公司報銷(xiāo)。而且臨近過(guò)年,這么加班也一點(diǎn)都感覺(jué)不到過(guò)年的氣息。不過(guò)我也不能因此放松了自己的學(xué)習。我覺(jué)得自己的基礎應該算比較好了,便開(kāi)始啃起另外一本大部頭——《Java與模式》。一直以來(lái)我對設計模式的感覺(jué)就是一些已經(jīng)成型的,久經(jīng)考驗的代碼框架,具有非常好的可擴展能力以及非常好的代碼健壯性。不過(guò)初學(xué)者最好不要看設計模式,因為你接觸的代碼不多,如果貿然看設計模式的話(huà),會(huì )造成不明白為什么這種設計模式好,究竟好在什么地方的情況下就在代碼中亂套設計模式,對自己的以后編碼發(fā)展帶來(lái)不利的影響。每一種設計模式都有每一種設計模式的特點(diǎn),自然也有他們自身的適用范圍,比如拿最基本的單例模式(Singleton)來(lái)說(shuō),適合于做配置信息讀取器,主鍵產(chǎn)生器等全局唯一的東西。如果初學(xué)者不明白這些,拿單例模式亂套,什么都用單例模式,比如把普通傳遞數據用的JavaBean也做成了單例模式,帶來(lái)的惡果就嚴重了。這本《Java與模式》我是從頭到尾認認真真看了,每看完一個(gè)模式都會(huì )仔細回想以前看的代碼哪里用到過(guò)這個(gè)模式,總會(huì )自己想想這些模式適用于哪些地方。因為這個(gè)時(shí)候我自己編寫(xiě)的代碼行數也已經(jīng)很多了,所以看見(jiàn)這些模式就會(huì )特別有感覺(jué)。經(jīng)過(guò)50多天的認真研讀,所有模式都被我消化了下去,并且使得我的對程序開(kāi)發(fā)上面的認識提升了非常大的一步。順路說(shuō)一句,這本書(shū)寫(xiě)得非常好,例子很多,但是不復雜,有一定代碼編寫(xiě)經(jīng)驗的人就可以看懂了。不過(guò)看懂并不是最重要的,重要的是消化下去,用來(lái)理解以前看過(guò)的代碼的精華,這樣自己才能得到提高。
這個(gè)項目雖然很緊張很忙,不過(guò)我還是適應了下來(lái),而且對整個(gè)項目結構什么的都有了比較好的整體的把握。項目橫跨了整個(gè)過(guò)年期間,所以在過(guò)年的那幾天都必須開(kāi)著(zhù)手機,怕有什么突發(fā)事件要求去加班。簽證在2月4日左右送過(guò)去簽,Leader跟我說(shuō)因為在過(guò)年期間,所以簽證可能會(huì )比較緩慢,比較難簽,不過(guò)一般情況下1個(gè)月應該足夠了。原計劃我是跟另外兩個(gè)同事3月6日去東京,這樣算算也差不多。不過(guò)中國有句話(huà)叫好事多磨,呵呵,用在我身上的確不過(guò)分,我的簽證3月3日日本領(lǐng)事館才簽,三月四日送到南京。3月5日和3月6日是雙休日,所以3月7日簽證才送到我手上。由于計劃是3月6日派人去東京,所以只好派另外一個(gè)身上有簽證還沒(méi)有過(guò)期的人代替我過(guò)去,這次的機會(huì )就算泡湯咯。不過(guò)我并不是很在意,因為公司這里去東京出差的機會(huì )狠多,特別對于開(kāi)發(fā)人員,據說(shuō)工作幾年后一聽(tīng)到去日本出差就不樂(lè )意,畢竟也背井離鄉么。
在這個(gè)項目的途中,大概在2005年1月底2月初的時(shí)候公司也開(kāi)始進(jìn)行了制作詳細設計的培訓,我雖然在項目中,不過(guò)也成為了其中一員。這次培訓總共大概6次課,每次2個(gè)多小時(shí),雖然時(shí)間不長(cháng),不過(guò)把詳細設計的要點(diǎn)以及思路和容易出錯的地方都說(shuō)了出來(lái),感覺(jué)很是不錯,這幾次課的培訓后,雖然可能要我立即進(jìn)行詳細設計編寫(xiě)還有點(diǎn)困難,不過(guò)心里面已經(jīng)有了不少底,我覺(jué)得經(jīng)過(guò)一段時(shí)間后的鍛煉,我應該可以有進(jìn)行詳細設計的能力了。
3月初這個(gè)大項目結束后,本以為可以休整下,不過(guò)很快通知我3月7日加入另外一個(gè)項目,其實(shí)也不算一個(gè)正式的項目,屬于公司知識庫的一個(gè)信息查詢(xún)模塊。由公司的一個(gè)技術(shù)專(zhuān)家負責,那人也就是我進(jìn)公司時(shí)候第一個(gè)項目中帶著(zhù)我的那個(gè)技術(shù)專(zhuān)家,說(shuō)起來(lái)我和他還真有緣,現在我這個(gè)項目還是跟著(zhù)他,而且公司里面唯一一個(gè)和我同月同日生的人,真是很巧的巧合呢。他人挺好,很熱心,所以我也從他那學(xué)到了很多東西。這次由于不是正式項目,所以并沒(méi)有什么基本設計書(shū),而是他給我們開(kāi)會(huì )議的時(shí)候大致說(shuō)了下項目的內容,每個(gè)畫(huà)面的具體功能以及數據庫表格的設計。由于這次項目規模很小,總共就12個(gè)畫(huà)面的量,所以不采取Struts等Framework,而是采用比較原始的JSP + JavaBeans的構造。我們每個(gè)人根據他所跟我們講解得功能寫(xiě)每個(gè)人自己分配到的畫(huà)面的詳細設計,其實(shí)也不算真正的詳細設計,就是每個(gè)人把自己操作的那塊的具體邏輯設計寫(xiě)出來(lái),然后和他一起review一次,再開(kāi)始編寫(xiě)代碼。詳細設計這里我做的很快,當天下午就把自己分配到的兩個(gè)畫(huà)面業(yè)務(wù)邏輯什么的都寫(xiě)好了,星期一布置得任務(wù),我星期三的時(shí)候全部編碼自測完畢提交,所以我的感覺(jué)就好像這個(gè)小項目一瞬間就結束了。
日本每年財務(wù)結算是在3月份,所以我們歷來(lái)的習慣就是每年1月和2月很忙,3月開(kāi)始清閑,一直可以到5月左右會(huì )接到個(gè)大項目昨。所以接下來(lái)就真正到了我的空閑時(shí)期,沒(méi)有項目的壓力,我可以自由學(xué)我自己喜歡的東西。很久以前買(mǎi)了本《精通EJB》第二版,可是一直以來(lái)我覺(jué)得自己功力尚淺,所以沒(méi)有看,這次我想認真學(xué)學(xué)EJB。雖然大家公認EJB并不是很好,不過(guò)歷來(lái)受到批評的都是EJB中的Entity Bean部分,這部分我覺(jué)得可以借助Hibernate來(lái)彌補,而會(huì )話(huà)Bean和消息驅動(dòng)Bean則還是挺不錯的。這次也當學(xué)一門(mén)技術(shù),學(xué)習其好的東西,不是很好的東西就當作以后開(kāi)發(fā)時(shí)候的借鑒?!毒‥JB》這本書(shū)我的感覺(jué)是書(shū)質(zhì)量比較好,不過(guò)翻譯的水平稍微差了點(diǎn),特別是有不少錯誤,而且很低級的錯誤居然校對的時(shí)候都沒(méi)有發(fā)現,不能不說(shuō)是個(gè)比較大的瑕疵。但是它不失為一本EJB的好教材。從一開(kāi)始的JNDI開(kāi)始,然后講解了對象序列化,RMI-IIOP等等。這些以前都模模糊糊,或者是看過(guò)了但是還不知道究竟有什么用。但是經(jīng)過(guò)這次的學(xué)習以后,對這些分布式系統比較需要的東西有了進(jìn)一步的了解,感覺(jué)頭腦中比較清晰,究竟RMI是什么樣的工作原理,怎樣實(shí)現一個(gè)遠程方法調用等等。接下來(lái)的EJB學(xué)習,自己用Eclipse + Weblogic邊看書(shū)邊動(dòng)手,寫(xiě)了一個(gè)個(gè)自己的學(xué)習小程序。我個(gè)人感覺(jué)看書(shū)最好就是邊看邊自己動(dòng)手寫(xiě)小學(xué)習程序,這樣比光看不練能學(xué)到多得多的東西。學(xué)了EJB后覺(jué)得腦子又清晰了很多,看見(jiàn)一個(gè)案例后頭腦中就會(huì )有好幾種如何解決的方法,幾種方法互相在頭腦中自己比較,經(jīng)過(guò)這樣,大大提高了自己的思維活躍性。
3月中旬開(kāi)始由于公司比較清閑,大部分人處于沒(méi)有項目的狀態(tài),所以公司舉辦了第一屆全公司范圍的編程競賽。公司只指定了題目為一個(gè)日歷系統,要求具有日程記事等功能,其余功能自由發(fā)揮。這次不再采用團隊形式了,而是采取各自為戰的策略。自從培訓過(guò)詳細設計以后,我頭腦一直有如何寫(xiě)詳細設計的思路,這次我自己首先指定了開(kāi)發(fā)計劃,保證自己控制自己的進(jìn)度。接著(zhù)進(jìn)行了需求分析,確定了我有哪些功能。然后在自己的基本設計中開(kāi)始進(jìn)行數據庫結構設計。這次我決定采用Hibernate+Struts的結構進(jìn)行編寫(xiě),這樣我的數據持久層操作大大簡(jiǎn)化,而且功能上也增強了許多。DB設計好以后我開(kāi)始DEMO畫(huà)面的制作。說(shuō)實(shí)話(huà),我美工水平實(shí)在不怎么樣,可以說(shuō)雖然一般網(wǎng)頁(yè)的效果我都會(huì )自己做出來(lái),不過(guò)具體網(wǎng)頁(yè)設計成什么樣我還真是一竅不通。還好Dreamweaver我還算算是比較熟練,自己搗鼓搗鼓也想摸象樣把DEMO畫(huà)面給設計出來(lái)了,不過(guò)美觀(guān)不美觀(guān)我就覺(jué)得不怎么樣了,只是我能力有限,也沒(méi)辦法設計的更好看,這個(gè)時(shí)候我感受到了一個(gè)項目中美工是多么重要啊。下面的詳細設計自己寫(xiě)得很開(kāi)心,把需要的功能都用文字反映了出來(lái),這也算我寫(xiě)成詳細設計樣子的第一份詳細設計了,做完挺有成就感的。接下來(lái)首先構筑自己這個(gè)小項目的Framework,經(jīng)過(guò)公司兩個(gè)正式項目的洗禮后,那兩個(gè)項目的Framework我都認真研讀過(guò)源代碼的,所以我自己有了自己心里一套Framework的構造方法,特別是如何把Struts和Hibernate結合起來(lái)的結構,自己有自己的一些想法。在這次Framework構造中,我沒(méi)有復制任何公司以前的代碼段,都是憑著(zhù)自己對以前看的代碼理解后寫(xiě)出來(lái)的。這次項目我覺(jué)得對自己的提高也很大,首先鍛煉了自己詳細設計的能力。其次,自己雖然學(xué)習過(guò)Hibernate,不過(guò)從來(lái)沒(méi)有這么樣應用過(guò)Hibernate,這次讓自己大大提升了實(shí)踐運用的經(jīng)驗。公司由于直道這時(shí)也沒(méi)有一個(gè)真正的項目使用Hibernate,所以這時(shí)的我也算公司內部Hibernate使用經(jīng)驗最豐富的人了,這也為了后來(lái)我協(xié)助別的使用了Hibernate的項目解決問(wèn)題的原因。再次,我這次自己寫(xiě)了Framework,特別在批處理方面,運用了許多剛學(xué)會(huì )理解掉的設計模式,這些模式讓我的程序更具有健壯性和可擴展性,讓我在設計方面的能力大大提升了。
這次的編程競賽我寫(xiě)得比較認真,代碼量的確也很大,總代碼行數超過(guò)了3萬(wàn)行,有效代碼行數也在1萬(wàn)行以上。經(jīng)過(guò)公司專(zhuān)家們的評定后,我得到了第一名,雖然沒(méi)有什么獎品,不過(guò)肯定了我這段時(shí)間以來(lái)的努力,我還是很開(kāi)心的。而且這次的編程競賽讓我大大增加了編碼的熟練度,而且也在其中演練了許多自己想出來(lái)的編程技巧,為以后的發(fā)展帶來(lái)很大的好處。
從4月份開(kāi)始,公司由于比較清閑,所以部門(mén)內部開(kāi)始進(jìn)行各種培訓。我們部門(mén)開(kāi)展了3項培訓,第一項就是編程能力培訓,第二項是Oracle數據庫技術(shù)培訓,第三項是測試技巧培訓。在編程能力培訓中,主要就是把原來(lái)沒(méi)有注意的細節采取大家討論,輪流講課的方式進(jìn)行的,雖然其中很多東西我原來(lái)都是知道的,不過(guò)也有原來(lái)不清楚的地方。而且經(jīng)過(guò)了這次互相討論,更加加深了印象。在Oracle培訓中我覺(jué)得收獲很大,這個(gè)Oracle培訓采取了傳統的上課的模式,由我們開(kāi)發(fā)小組中一個(gè)取得OCM的老員工給我們講解。對于Oracle,我原來(lái)基本上就只會(huì )寫(xiě)寫(xiě)SQL語(yǔ)句,具體Oracle有什么特別的功能,可以做什么我也不是很清楚。但是這次上課從Oracle的啟動(dòng)原理開(kāi)始,讓我知道Oracle中究竟有什么,Oracle數據庫各部分在磁盤(pán)上是如何存放的,Control File,Redo File究竟是什么意思,在數據庫中起什么作用,數據庫是怎么依賴(lài)他們運行的,還有如何對Oracle進(jìn)行系統管理員級別的管理,如何在不停止數據庫運行的情況下進(jìn)行數據庫的更新、升級、備份等等。這些東西雖然非常有用,但在平時(shí)的開(kāi)發(fā)是學(xué)不到的,這次趁著(zhù)這個(gè)機會(huì )大大提升了自己Oracle的水平,感覺(jué)非常開(kāi)心。數據庫一向是我的弱項,在上大學(xué)的時(shí)候我SQL語(yǔ)句能力只是一般,數據庫管理配置什么基本一點(diǎn)都不懂,通過(guò)這次集中的培訓,我覺(jué)得自己的能力又進(jìn)一步增強了,弱項也在慢慢退卻。在三項培訓中最后進(jìn)行的測試培訓我承認我沒(méi)有怎么認真去學(xué),所以學(xué)會(huì )的也就是些測試概念,具體的測試技巧什么的還是不怎么會(huì )?,F在開(kāi)發(fā)和測試的結合性越來(lái)越高,看來(lái)要下下功夫,以免給淘汰咯。
提了這段時(shí)間在公司的進(jìn)展,還沒(méi)說(shuō)自己的學(xué)習呢,這段時(shí)間正好看見(jiàn)中文版的《JUnit in Action》出版了,在書(shū)的背后寫(xiě)著(zhù)“如果沒(méi)有看過(guò)這本書(shū),就不要對J2EE進(jìn)行單元測試”這句話(huà)。我早在去年就了解了JUnit的強大功能,再加上Ant的話(huà)對于回歸測試是非常便利的。趁有時(shí)間,我便于3月底4月初的時(shí)候開(kāi)始看這本書(shū)。當時(shí)的我看《精通EJB》第二版看了一半,發(fā)現其中錯誤越來(lái)越多,而且文字也有些地方不知所云了,所以扔下不再浪費時(shí)間看那本書(shū),專(zhuān)心攻讀《JUnit In Action》。憑良心說(shuō),Manning的這套In Action叢書(shū)的確很不錯,從我先前看的《Hibernate In Action》英文版就能看出來(lái),其中對代碼的編排非常方便讀者,感覺(jué)可以很順利的看到你所想看到的代碼片斷。這套《JUnit In Action》也是一樣,博文視點(diǎn)的紙張還是很好的,排版使用了Manning的風(fēng)格,閱讀起來(lái)很舒服,所以我讀得很快,大概就兩個(gè)多星期就讀完了這本400多頁(yè)的書(shū)。感覺(jué)的確收獲不淺,首先,原來(lái)的自動(dòng)化配置工具中只會(huì )使用一個(gè)Ant,其他的基本沒(méi)聽(tīng)說(shuō)過(guò),在這本書(shū)上詳細介紹了Maven。聽(tīng)過(guò)書(shū)中的講解以及自己的試驗,的確覺(jué)得Maven功能很強大,不過(guò)感覺(jué)起來(lái)配置比Ant要麻煩,所以我自己的感覺(jué)是Ant在項目中還是會(huì )廣泛應用,不過(guò)Maven在大型項目,特別是整個(gè)Site中有很大的用武之地,對于我們來(lái)說(shuō),使用的方法都是很簡(jiǎn)單的,掌握如何編寫(xiě)配置文件才是我們的關(guān)鍵。
本書(shū)對JUnit與Cactus在J2EE的測試手法上給了大量的事例,給人的感覺(jué)非常好,In Action這套叢書(shū)最大的優(yōu)點(diǎn)就在這里,用實(shí)例代碼片斷讓你迅速了解一樣東西。在實(shí)際工作中其實(shí)JUnit應用也是比較廣泛的,特別如果采取測試驅動(dòng)開(kāi)發(fā)的話(huà),JUnit是必不可少的一部分。在TagLib測試,JSP單體測試,數據庫測試和EJB測試都是我以前根本沒(méi)有看過(guò)的東西。其實(shí)這次雖然學(xué)是學(xué)會(huì )了,不過(guò)真正做的時(shí)候還是要有個(gè)代碼例子依葫蘆畫(huà)瓢。我想大家肯定也都有這種感覺(jué),寫(xiě)程序的時(shí)候先找一段有點(diǎn)相似的代碼片斷Copy過(guò)來(lái),然后看看要修改什么地方,真正從頭到尾自己用手寫(xiě)的代碼片斷是不多的,除非你已經(jīng)爛熟于心。不過(guò)這本書(shū)快看完的時(shí)候,項目又來(lái)了。
這次做一個(gè)企業(yè)的MIS系統,與以往不同的是,這次客戶(hù)給了一個(gè)比較龐大的基盤(pán),封裝了近100個(gè)Tag,基本上把各種各樣有可能遇到的操作都封裝到Tag里面了。而且所有的畫(huà)面顯示等信息都是放在數據庫的Table中,所以這次要求不寫(xiě)任何程序代碼,只是學(xué)會(huì )使用好這些Tag,然后利用這些Tag寫(xiě)出Jsp頁(yè)面。一開(kāi)始的時(shí)候還真是頭疼,這些Tag一個(gè)都不明白,而且文檔不是非常齊全,Tag的Source中注釋也比較少,學(xué)習起來(lái)不是很方便。我們一共3個(gè)人投入到這個(gè)項目的前期準備中,在第一個(gè)星期的學(xué)習中大家互相分配好個(gè)人學(xué)習的模塊,隨時(shí)互相交流。在后來(lái)的深入中發(fā)現這個(gè)項目的業(yè)務(wù)邏輯操作會(huì )使用PL/SQL以及存儲過(guò)程來(lái)進(jìn)行,對于我來(lái)說(shuō),PL/SQL是從來(lái)沒(méi)有做過(guò)的東西,就叫做一竅不通,于是我需要從頭開(kāi)始學(xué)習PL/SQL,以及如何編寫(xiě)存儲過(guò)程。我從網(wǎng)上下了一個(gè)PL/SQL的電子書(shū)籍,然后在公司花了一天時(shí)間進(jìn)行學(xué)習,個(gè)人用的是Toad來(lái)調試PL/SQL的,雖然別人喜歡用PL/SQL Developer來(lái)進(jìn)行開(kāi)發(fā),不過(guò)我還是比較鐘愛(ài)Toad,而且Toad的確功能也很強大,使用起來(lái)也很方便就是了。經(jīng)過(guò)第一天的PL/SQL的學(xué)習,基本掌握了全部語(yǔ)法以及存儲過(guò)程的書(shū)寫(xiě)格式等等,開(kāi)始能夠寫(xiě)寫(xiě)非常簡(jiǎn)單的PL/SQL。接下來(lái)的兩三天不斷鞏固熟練,客戶(hù)那里也發(fā)過(guò)來(lái)幾本詳細設計讓我們練習著(zhù)做一下。有了實(shí)際的詳細設計,再加上我們之間互相交流,我們提高的都很快,大概過(guò)了三四天,大家就把基本詳細設計代碼編寫(xiě)完畢了,而且經(jīng)過(guò)實(shí)際鍛煉,我的PL/SQL編寫(xiě)存儲過(guò)程的水平也大大提升,已經(jīng)可以滿(mǎn)足開(kāi)發(fā)中的需要了。
這個(gè)項目因為如果我們一開(kāi)始做的能讓客戶(hù)滿(mǎn)意的話(huà),后續的項目將會(huì )比較龐大,所以L(fǎng)eader決定把我們Group比較空閑的其他人也先培訓一下,讓他們有點(diǎn)感覺(jué),到以后正式開(kāi)發(fā)的時(shí)候也能迅速進(jìn)入狀態(tài),負責給他們培訓的任務(wù)也就交給了我。說(shuō)起來(lái)是培訓,其實(shí)也就是把大概流程以及方法通過(guò)一次會(huì )議的形式告訴他們,然后把我前面已經(jīng)作好的那個(gè)畫(huà)面作為他們的作業(yè),要他們看著(zhù)設計書(shū)自己把畫(huà)面制作出來(lái)。這個(gè)時(shí)候也要放勞動(dòng)節了,黃金周可以休息一個(gè)星期,想想就覺(jué)得很Happy。勞動(dòng)節的時(shí)候基本沒(méi)有怎么學(xué)習,只是先把XML-RPC仔細看了下,學(xué)會(huì )了如何去寫(xiě)一個(gè)XML-RPC的應用,接著(zhù)稍微看了點(diǎn)SOAP,看得也不錯,只是些簡(jiǎn)單的SOAP的例子而已,那些SOAP的復雜東西都沒(méi)有看。
很快就五一黃金周七天放假放完,八號開(kāi)始上班,上班后就開(kāi)始正式做節前就定好的那個(gè)項目,這次性質(zhì)屬于試做,也就是人家先發(fā)一批設計書(shū)過(guò)來(lái),我們然后開(kāi)始Coding,大概做了一周后,我自己害了急性結膜炎,只能回家休息,這次可真的是只能休息了,眼睛覺(jué)得特別漲,不要說(shuō)電腦了,連書(shū)都不能看,看了眼睛就疼。所以在家就只能睡大覺(jué),過(guò)了一周眼睛大概才復原,可以去公司上班了?;氐焦疽院?,Leader通知我說(shuō)我不用去做上次那個(gè)項目了,要我加入我們Group的一個(gè)新的項目,這個(gè)項目比較大,當時(shí)還處于東京剛剛做好基本設計,我們從東京把任務(wù)接下來(lái),準備發(fā)回來(lái)做詳細設計。我進(jìn)去的時(shí)候項目才開(kāi)始三四天,基本上還沒(méi)有做什么,這次我進(jìn)入了詳細設計制作小組,開(kāi)始進(jìn)行這個(gè)項目的詳細設計的制作。
由于我屬于第一次在正式的項目中參與詳細設計,所以很多東西都不明白,特別是業(yè)務(wù)上面的東西,許多日語(yǔ)中的業(yè)務(wù)術(shù)語(yǔ)我根本不明白,比如什么賣(mài)切,切替,仕入什么的??粗?zhù)基本設計書(shū),感覺(jué)跟以前看詳細設計書(shū)有很大的不同。具體的東西寫(xiě)的少了,業(yè)務(wù)流程邏輯框架什么的比較多,所以需要首先把業(yè)務(wù)內容都熟悉了,才可能寫(xiě)出詳細設計來(lái)。這次的詳細設計我也不是孤軍奮戰,而是有一個(gè)進(jìn)公司4年的老員工帶著(zhù)我一起做,我的任務(wù)很輕,不過(guò)重點(diǎn)是學(xué)會(huì )如何去寫(xiě)詳細設計,也許下次再有一個(gè)比較大的項目,就沒(méi)有別人再帶著(zhù)我,而是我自己一個(gè)人去完成詳細設計了。大概詳細設計寫(xiě)了20天左右,我被通知當天把手上的一份詳細設計寫(xiě)完,第二天進(jìn)入方式設計小組進(jìn)行方式的設計。