一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Java源碼閱讀的真實(shí)體會

 昵稱13039494 2013-12-25


剛才在論壇不經(jīng)意間,看到有關(guān)源碼閱讀的帖子?;叵胱约呵皫啄?,閱讀源碼那種興奮和成就感,不禁又有一種激動。
源碼閱讀,我覺得最核心有三點(diǎn):技術(shù)基礎(chǔ)+強(qiáng)烈的求知欲+耐心。

說到技術(shù)基礎(chǔ),我打個比方吧,如果你從來沒有學(xué)過Java,或是任何一門編程語言如C++,一開始去啃《Core Java》,你是很難從中吸收到營養(yǎng)的,特別是《深入Java虛擬機(jī)》這類書,別人覺得好,未必適合現(xiàn)在的你。
雖然Tomcat的源碼很漂亮,但我絕不建議你一開始就讀它。我文中會專門談到這個,暫時不展開。

強(qiáng)烈的求知欲,我認(rèn)為是閱讀源碼的最核心驅(qū)動力。我見到絕大多數(shù)程序員,對學(xué)習(xí)的態(tài)度,基本上就是這幾個層次(很偏激哦):
1、只關(guān)注項(xiàng)目本身,不懂就baidu一下。
2、除了做好項(xiàng)目,還會閱讀和項(xiàng)目有關(guān)的技術(shù)書籍,看wikipedia。
3、除了閱讀和項(xiàng)目相關(guān)的書外,還會閱讀IT行業(yè)的書,比如學(xué)Java時,還會去了解函數(shù)語言,如LISP。
4、找一些開源項(xiàng)目看看,大量試用第三方框架,還會寫寫demo。
5、閱讀基礎(chǔ)框架、J2EE規(guī)范、Debug服務(wù)器內(nèi)核。

大多數(shù)程序都是第1種,到第5種不光需要濃厚的興趣,還需要勇氣:我能讀懂嗎?其實(shí),你能夠讀懂的。

耐心,真的很重要。因?yàn)槟銟O少看到閱讀源碼的指導(dǎo)性文章或書籍,也沒有人要求或建議你讀。你讀的過程中經(jīng)常會卡住,而一卡主可能就陷進(jìn)了迷宮。這時,你需要做的,可能是暫時中斷一下,再從外圍看看它:如API結(jié)構(gòu)、框架的設(shè)計圖。

我就說說如何讀Java源碼,以及我曾經(jīng)的閱讀感悟。

Java源碼初接觸
如果你進(jìn)行過一年左右的開發(fā),喜歡用eclipse的debug功能。好了,你現(xiàn)在就有閱讀源碼的技術(shù)基礎(chǔ)。
我建議從JDK源碼開始讀起,這個直接和eclipse集成,不需要任何配置。

可以從JDK的工具包開始,也就是我們學(xué)的《數(shù)據(jù)結(jié)構(gòu)和算法》Java版,如List接口和ArrayList、LinkedList實(shí)現(xiàn),HashMap和TreeMap等。這些數(shù)據(jù)結(jié)構(gòu)里也涉及到排序等算法,一舉兩得。
面試時,考官總喜歡問ArrayList和Vector的區(qū)別,你花10分鐘讀讀源碼,估計一輩子都忘不了。

然后是core包,也就是String、StringBuffer等。
如果你有一定的Java IO基礎(chǔ),那么不妨讀讀FileReader等類。我建議大家看看《Java In A Nutshell》,里面有整個Java IO的架構(gòu)圖。Java IO類庫,如果不理解其各接口和繼承關(guān)系,則閱讀始終是一頭霧水。
Java IO 包,我認(rèn)為是對繼承和接口運(yùn)用得最優(yōu)雅的案例。如果你將來做架構(gòu)師,你一定會經(jīng)常和它打交道,如項(xiàng)目中部署和配置相關(guān)的核心類開發(fā)。

讀這些源碼時,只需要讀懂一些核心類即可,如和ArrayList類似的二三十個類,對于每一個類,也不一定要每個方法都讀懂。像String有些方法已經(jīng)到虛擬機(jī)層了(native方法),如hashCode方法。

當(dāng)然,如果有興趣,可以對照看看JRockit的源碼,同一套API,兩種實(shí)現(xiàn),很有意思的。
如果你再想鉆的話,不妨看看針對虛擬機(jī)的那套代碼,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源碼Zip包只有10來M,它像是有50來M,Sun公司有下載的,不過很隱秘。我曾經(jīng)為自己找到、讀過它很興奮了一陣。

Java Web開發(fā)源碼
在閱讀Tomcat等源碼前,一定要有一定的積累。我的切實(shí)體會,也可以說是比較好的階梯是:
1、寫過一些Servlet和JSP代碼。注意,不是用什么Struts,它是很難接觸到Servlet精髓的。用好Struts只是皮毛。
2、看過《Servlet和JSP核心編程》
3、看過Sun公司的Servlet規(guī)范
4、看過http協(xié)議的rfc,debug過http的數(shù)據(jù)包
如果有以上基礎(chǔ),我也不建議你開始讀Tomcat源碼。我建議你在閱讀Tomcat源碼前,讀過Struts源碼,Struts源碼比WebWork要簡單得多。這個框架是可以100%讀懂的,至少WebWork我沒有100%讀懂。我曾經(jīng)因?yàn)樽x懂了Struts源碼,自己寫過一個Web框架。

當(dāng)然,在讀Struts框架前,最好看過它的MailReader等demo,非常非常不錯的。
如果你做過一些Struts項(xiàng)目,那么讀它時就更得心應(yīng)手了。
在讀Struts前,建議看看mvnforum的源碼,它部分實(shí)現(xiàn)了Struts的功能,雖然這個BBS做得不敢恭維。

如果你讀過Struts,再開始考慮Tomcat源碼閱讀吧。
不過,我還是不建議直接讀它,先讀讀onJava網(wǎng)站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最簡易版。它告訴你HttpServletRequest如何在容器內(nèi)部實(shí)現(xiàn)的,Tomcat如何通過Socket來接受外面的請求,你的Servlet代碼如何被Tomcat容器調(diào)用的(回調(diào))。
學(xué)習(xí)JSP,一定要研讀容器將JSP編譯后的Servlet源碼。
為什么我總是稱呼Tomcat為容器,而不是服務(wù)器?這個疑問留給大家吧。

如果你一定要讀Tomcat,那么就讀Jetty吧。至少它是嵌入式,可以直接在eclispe里面設(shè)置斷點(diǎn)debug。雖然Tomcat也有嵌入式版本。

Java數(shù)據(jù)庫源碼閱讀
我建議,先讀讀Sun的JDBC規(guī)范。
我想你一定寫過JDBC的代碼,那么這時候可以開始閱讀源碼了。
如果了解JDBC規(guī)范(接口),那么它的實(shí)現(xiàn),JDBC Driver就一定要開始了解,我的建議是,讀讀mysql的jdbc驅(qū)動,因?yàn)樗_源、設(shè)計優(yōu)雅。在讀mysql的JDBC驅(qū)動源碼時,建議看看mysql的內(nèi)幕,官方正好有本書,《Mysql Internals》,我五年前讀過一部分。比如你可以知道m(xù)ysql的JDBC驅(qū)動,如何通過socket數(shù)據(jù)包(connect、query),給這個C++開發(fā)的mysql服務(wù)器交互的。

通過上面的閱讀,你可以知道,你的業(yè)務(wù)代碼、JDBC規(guī)范、JDBC驅(qū)動、以及數(shù)據(jù)庫,它們是如何一起協(xié)作的。
如果你了解這些內(nèi)幕,那么你再學(xué)習(xí)Hibernate、iBatis等持久化框架時,就會得心應(yīng)手的。

讀過JDBC驅(qū)動,那么下一步一定要讀讀數(shù)據(jù)庫了。而正好有一個強(qiáng)大的數(shù)據(jù)庫是用Java開發(fā)的,Hsqldb。它是嵌入式數(shù)據(jù)庫,比如用在桌面客戶端軟件里,如Mail Client。
我四年前為此寫過一篇小文,就不介紹了。

Java通訊及客戶端軟件
我強(qiáng)烈推薦即時通訊軟件wildfire和Spark。你可以把wildfire理解成MSN服務(wù)器,Spark理解成MSN客戶端。它們是通過XMPP協(xié)議通訊的。
我曾經(jīng)在一個項(xiàng)目中,定制過Spark,當(dāng)然也包括服務(wù)端的一些改動。所以它們的源碼我都讀過。
我之所以推薦它們。是因?yàn)椋?
1、XMPP夠輕量級,好理解
2、學(xué)習(xí)Socket通訊實(shí)現(xiàn),特別是C/S架構(gòu)設(shè)計
3、模塊化設(shè)計。它們都是基于module的,你既可以了解模塊化架構(gòu),還可以了解模塊化的技術(shù)支撐:Java虛擬機(jī)的ClassLoader的應(yīng)用場景。
4、Event Driven架構(gòu)。雖然GUI都是Event驅(qū)動的,但Spark的設(shè)計尤其優(yōu)雅

這么說吧,讀它們的源碼,你會為做一名程序員而自豪,因?yàn)闊o論是他們的架構(gòu)設(shè)計還是代碼,都太漂亮了。

Java企業(yè)級應(yīng)用
當(dāng)然了,就是Hibernate、Spring這類框架。
在讀Spring源碼前,一定要先看看Rod Johnson寫的那邊《J2EE Design and Development》,它是Spring的設(shè)計思路。注意,不是中文版,中文版完全被糟蹋了。
在讀Hibernate源碼前,一定要讀讀Gavin King寫的那本《Hibernate in Action》,同時,應(yīng)該再讀讀Martin Fowler寫的《企業(yè)應(yīng)用架構(gòu)模式》,它專門談到持久化框架的設(shè)計思路。當(dāng)你覺得這兩本書讀透了,再去看它們源碼吧。
而且,在讀源碼前,你會發(fā)現(xiàn)它們用到很多第三方Jar包,二三十個,你最好把那些Jar包先一個個搞明白。

說到企業(yè)應(yīng)用,一定會涉及到工作流。我當(dāng)年讀過jBPM的源碼,網(wǎng)上有介紹jBPM內(nèi)核的文章(銀狐)。我感覺它的內(nèi)核也就兩千行,不要害怕。我曾經(jīng)閱讀jBPM源碼的博客。
當(dāng)然了,讀工作流源碼,前提是一定要對其理論模型有深入的了解,以及寫過一些demo、或做過一些項(xiàng)目。

我上面介紹的這些,是我自己讀過的,也適合一般人閱讀。
我也讀過一些非Java源碼,感覺不錯,也推薦給大家:
dojo源碼 它的架構(gòu)設(shè)計得很優(yōu)雅,仿Java的import和extends。但實(shí)際應(yīng)用起來一塌糊涂。我們當(dāng)年基于這個開發(fā)了自己的框架,不過我不是主力。

Flex源碼 Flex 08年底剛剛開源后,我就用它做過一個中型項(xiàng)目,應(yīng)該說是國內(nèi)的技術(shù)先行者。當(dāng)時市面沒有有深度的書,也沒有開源項(xiàng)目。我純粹是看Flex的Help文檔和源碼,把項(xiàng)目搞定的。兩三年過去了,現(xiàn)在覺得系統(tǒng)設(shè)計得蠻優(yōu)雅的。

好了,先介紹到這里。
上面說到的這些Java源碼,我都是4年前、甚至更早讀過的。技術(shù)變化這么快,像互聯(lián)網(wǎng)的高速發(fā)展,催生很多高性能、分布式數(shù)據(jù)庫,如hadoop。我一看,發(fā)現(xiàn)自己已經(jīng)落伍了。
這幾年,想必已經(jīng)出現(xiàn)了很多優(yōu)秀的框架,大家不妨分享出來。


題后記
這三年,一直在創(chuàng)業(yè),主要是技術(shù)應(yīng)用,偏業(yè)務(wù),源碼閱讀不多,但很欣賞那些專注于技術(shù)的狂熱者。
現(xiàn)暫別創(chuàng)業(yè),進(jìn)入一家電子商務(wù)公司,負(fù)責(zé)其B2C網(wǎng)站的改版和運(yùn)營。
(廣告)如果你對技術(shù)、對高負(fù)載的大型B2C開發(fā)也情有獨(dú)鐘,不妨看看這里





    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    午夜视频成人在线观看| 少妇人妻中出中文字幕| 欧美大粗爽一区二区三区| 免费一区二区三区少妇| 亚洲欧美日本视频一区二区| 九九热视频免费在线视频| 少妇人妻无一区二区三区| 欧美国产日韩在线综合| 日本视频在线观看不卡| 成人国产激情在线视频| 欧美加勒比一区二区三区 | 狠色婷婷久久一区二区三区| 国产欧美日韩在线一区二区| 日本视频在线观看不卡| 日韩毛片视频免费观看| 国产精品欧美一区两区| 中文字幕人妻综合一区二区| 中国黄色色片色哟哟哟哟哟哟| 亚洲欧美日韩综合在线成成| 国产成人在线一区二区三区| 少妇特黄av一区二区三区| 九九热视频经典在线观看 | 亚洲在线观看福利视频| 日本精品啪啪一区二区三区| 国产免费一区二区不卡| 一本色道久久综合狠狠躁| 日韩人妻免费视频一专区| 一区二区日韩欧美精品| 国产传媒高清视频在线| 一本色道久久综合狠狠躁| 精品日韩av一区二区三区| 国产一区麻豆水好多高潮| 91人妻人澡人人爽人人精品| 日本欧美一区二区三区高清| 老司机精品视频免费入口| 国产亚洲欧美日韩精品一区| 国产不卡免费高清视频| 精品国模一区二区三区欧美| 一区二区三区日韩在线| 亚洲国产成人一区二区在线观看 | 国产一区二区三区香蕉av|