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