源碼閱讀,我覺得最核心有三點:技術基礎+強烈的求知慾+耐心。
說到技術基礎,我打個比方吧,如果你從來沒有學過Java,或是任何一門程式設計語言如C++,一開始去啃《Core Java》,你是很難從中吸收到營養的,特別是《深入Java虛擬機器》這類書,別人覺得好,未必適合現在的你。
雖然Tomcat的源碼很漂亮,但我絕不建議你一開始就讀它。我文中會專門談到這個,暫時不展開。
強烈的求知慾,我認為是閱讀源碼的最核心驅動力。我見到絕大多數程式員,對學習的態度,基本上就是這幾個層次(很偏激哦):
1、只關注項目本身,不懂就baidu一下。
2、除了做好項目,還會閱讀和項目有關的技術書籍,看wikipedia。
3、除了閱讀和項目相關的書外,還會閱讀IT行業的書,比如學Java時,還會去瞭解函數語言,如LISP。
4、找一些開源項目看看,大量試用第三方架構,還會寫寫demo。
5、閱讀基礎架構、J2EE規範、Debug伺服器核心。
大多數程式都是第1種,到第5種不光需要濃厚的興趣,還需要勇氣:我能讀懂嗎?其實,你能夠讀懂的。
耐心,真的很重要。因為你極少看到閱讀源碼的指導性文章或書籍,也沒有人要求或建議你讀。你讀的過程中經常會卡住,而一卡主可能就陷進了迷宮。這時,你需要做的,可能是暫時中斷一下,再從外圍看看它:如API結構、架構的設計圖。
我就說說如何讀Java源碼,以及我曾經的閱讀感悟。
Java源碼初接觸
如果你進行過一年左右的開發,喜歡用eclipse的debug功能。好了,你現在就有閱讀源碼的技術基礎。
我建議從JDK源碼開始讀起,這個直接和eclipse整合,不需要任何配置。
可以從JDK的工具包開始,也就是我們學的《資料結構和演算法》Java版,如List介面和ArrayList、LinkedList實現,HashMap和TreeMap等。這些資料結構裡也涉及到排序等演算法,一舉兩得。
面試時,考官總喜歡問ArrayList和Vector的區別,你花10分鐘讀讀源碼,估計一輩子都忘不了。
然後是core包,也就是String、StringBuffer等。
如果你有一定的Java IO基礎,那麼不妨讀讀FileReader等類。我建議大家看看《Java In A Nutshell》,裡面有整個Java IO的架構圖。Java IO類庫,如果不理解其各介面和繼承關係,則閱讀始終是一頭霧水。
Java IO 包,我認為是對繼承和介面運用得最優雅的案例。如果你將來做架構師,你一定會經常和它打交道,如項目中部署和配置相關的核心類開發。
讀這些源碼時,只需要讀懂一些核心類即可,如和ArrayList類似的二三十個類,對於每一個類,也不一定要每個方法都讀懂。像String有些方法已經到虛擬機器層了(native方法),如hashCode方法。
當然,如果有興趣,可以對照看看JRockit的源碼,同一套API,兩種實現,很有意思的。
如果你再想鑽的話,不妨看看針對虛擬機器的那套代碼,如System ClassLoader的原理,它不在JDK包裡,JDK是基於它的。JDK的源碼Zip包只有10來M,它像是有50來M,Sun公司有下載的,不過很隱秘。我曾經為自己找到、讀過它很興奮了一陣。
Java Web開發源碼
在閱讀Tomcat等源碼前,一定要有一定的積累。我的切實體會,也可以說是比較好的階梯是:
1、寫過一些Servlet和JSP代碼。注意,不是用什麼Struts,它是很難接觸到Servlet精髓的。用好Struts只是皮毛。
2、看過《Servlet和JSP核心編程》
3、看過Sun公司的Servlet規範
4、看過http協議的rfc,debug過http的資料包
如果有以上基礎,我也不建議你開始讀Tomcat源碼。我建議你在閱讀Tomcat源碼前,讀過Struts源碼,Struts源碼比WebWork要簡單得多。這個架構是可以100%讀懂的,至少WebWork我沒有100%讀懂。我曾經因為讀懂了Struts源碼,自己寫過一個Web架構。
當然,在讀Struts架構前,最好看過它的MailReader等demo,非常非常不錯的。
如果你做過一些Struts項目,那麼讀它時就更得心應手了。
在讀Struts前,建議看看mvnforum的源碼,它部分實現了Struts的功能,雖然這個BBS做得不敢恭維。
如果你讀過Struts,再開始考慮Tomcat源碼閱讀吧。
不過,我還是不建議直接讀它,先讀讀onJava網站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最簡易版。它告訴你HttpServletRequest如何在容器內部實現的,Tomcat如何通過 Socket來接受外面的請求,你的Servlet代碼如何被Tomcat容器調用的(回調)。
學習JSP,一定要研讀容器將JSP編譯後的Servlet源碼。
為什麼我總是稱呼Tomcat為容器,而不是伺服器?這個疑問留給大家吧。
如果你一定要讀Tomcat,那麼就讀Jetty吧。至少它是嵌入式,可以直接在eclispe裡面設定斷點debug。雖然Tomcat也有嵌入式版本。
Java資料庫源碼閱讀
我建議,先讀讀Sun的JDBC規範。
我想你一定寫過JDBC的代碼,那麼這時候可以開始閱讀源碼了。
如果瞭解JDBC規範(介面),那麼它的實現,JDBC Driver就一定要開始瞭解,我的建議是,讀讀mysql的jdbc驅動,因為它開源、設計優雅。在讀mysql的JDBC驅動源碼時,建議看看 mysql的內幕,官方正好有本書,《Mysql Internals》,我五年前讀過一部分。比如你可以知道mysql的JDBC驅動,如何通過socket資料包(connect、query),給這個C++開發的mysql伺服器互動的。
通過上面的閱讀,你可以知道,你的業務代碼、JDBC規範、JDBC驅動、以及資料庫,它們是如何一起協作的。
如果你瞭解這些內幕,那麼你再學習Hibernate、iBatis等持久化架構時,就會得心應手的。
讀過JDBC驅動,那麼下一步一定要讀讀資料庫了。而正好有一個強大的資料庫是用Java開發的,Hsqldb。它是嵌入式資料庫,比如用在案頭用戶端軟體裡,如Mail Client。
我四年前為此寫過一篇小文,就不介紹了。
Java通訊及用戶端軟體
我強烈推薦即時通訊軟體wildfire和Spark。你可以把wildfire理解成MSN伺服器,Spark理解成MSN用戶端。它們是通過XMPP協議通訊的。
我曾經在一個項目中,定製過Spark,當然也包括服務端的一些改動。所以它們的源碼我都讀過。
我之所以推薦它們。是因為:
1、XMPP夠輕量級,好理解
2、學習Socket通訊實現,特別是C/S架構設計
3、模組化設計。它們都是基於module的,你既可以瞭解模組化架構,還可以瞭解模組化的技術支撐:Java虛擬機器的ClassLoader的應用情境。
4、Event Driven架構。雖然GUI都是Event驅動的,但Spark的設計尤其優雅
這麼說吧,讀它們的源碼,你會為做一名程式員而自豪,因為無論是他們的架構設計還是代碼,都太漂亮了。
Java企業級應用
當然了,就是Hibernate、Spring這類架構。
在讀Spring源碼前,一定要先看看Rod Johnson寫的那邊《J2EE Design and Development》,它是Spring的設計思路。注意,不是中文版,中文版完全被糟蹋了。
在讀Hibernate源碼前,一定要讀讀Gavin King寫的那本《Hibernate in Action》,同時,應該再讀讀Martin Fowler寫的《公司專屬應用程式架構模式》,它專門談到持久化架構的設計思路。當你得這兩本書讀透了,再去看它們源碼吧。
而且,在讀源碼前,你會發現它們用到很多第三方Jar包,二三十個,你最好把那些Jar包先一個個搞明白。
說到公司專屬應用程式,一定會涉及到工作流程。我當年讀過jBPM的源碼,網上有介紹jBPM核心的文章(銀狐)。我感覺它的核心也就兩千行,不要害怕。我曾經閱讀jBPM源碼的部落格。
當然了,讀工作流程源碼,前提是一定要對其理論模型有深入的瞭解,以及寫過一些demo、或做過一些項目。
我上面介紹的這些,是我自己讀過的,也適合一般人閱讀。
我也讀過一些非Java源碼,感覺不錯,也推薦給大家:
dojo源碼 它的架構設計得很優雅,仿Java的import和extends。但實際應用起來一塌糊塗。我們當年基於這個開發了自己的架構,不過我不是主力。
Flex源碼 Flex 08年底剛剛開源後,我就用它做過一個中型項目,應該說是國內的技術先行者。當時市面沒有有深度的書,也沒有開源項目。我純粹是看Flex的Help文檔和源碼,把項目搞定的。兩三年過去了,現在覺得系統設計得蠻優雅的。
好了,先介紹到這裡。
上面說到的這些Java源碼,我都是4年前、甚至更早讀過的。技術變化這麼快,像互連網的高速發展,催生很多高效能、分散式資料庫,如hadoop。我一看,發現自己已經落伍了。
這幾年,想必已經出現了很多優秀的架構,大家不妨分享出來。
轉載地址:http://www.baidu.com/link?url=jG6WGJqjJ4zBBpC8yDF8xDh8vibi0ExoHW2BcokQ2cS5OEV6FjN-r1ooQ8G源碼閱讀,我覺得最核心有三點:技術基礎+強烈的求知慾+耐心。
說到技術基礎,我打個比方吧,如果你從來沒有學過Java,或是任何一門程式設計語言如C++,一開始去啃《Core Java》,你是很難從中吸收到營養的,特別是《深入Java虛擬機器》這類書,別人覺得好,未必適合現在的你。
雖然Tomcat的源碼很漂亮,但我絕不建議你一開始就讀它。我文中會專門談到這個,暫時不展開。
強烈的求知慾,我認為是閱讀源碼的最核心驅動力。我見到絕大多數程式員,對學習的態度,基本上就是這幾個層次(很偏激哦):
1、只關注項目本身,不懂就baidu一下。
2、除了做好項目,還會閱讀和項目有關的技術書籍,看wikipedia。
3、除了閱讀和項目相關的書外,還會閱讀IT行業的書,比如學Java時,還會去瞭解函數語言,如LISP。
4、找一些開源項目看看,大量試用第三方架構,還會寫寫demo。
5、閱讀基礎架構、J2EE規範、Debug伺服器核心。
大多數程式都是第1種,到第5種不光需要濃厚的興趣,還需要勇氣:我能讀懂嗎?其實,你能夠讀懂的。
耐心,真的很重要。因為你極少看到閱讀源碼的指導性文章或書籍,也沒有人要求或建議你讀。你讀的過程中經常會卡住,而一卡主可能就陷進了迷宮。這時,你需要做的,可能是暫時中斷一下,再從外圍看看它:如API結構、架構的設計圖。
我就說說如何讀Java源碼,以及我曾經的閱讀感悟。
Java源碼初接觸
如果你進行過一年左右的開發,喜歡用eclipse的debug功能。好了,你現在就有閱讀源碼的技術基礎。
我建議從JDK源碼開始讀起,這個直接和eclipse整合,不需要任何配置。
可以從JDK的工具包開始,也就是我們學的《資料結構和演算法》Java版,如List介面和ArrayList、LinkedList實現,HashMap和TreeMap等。這些資料結構裡也涉及到排序等演算法,一舉兩得。
面試時,考官總喜歡問ArrayList和Vector的區別,你花10分鐘讀讀源碼,估計一輩子都忘不了。
然後是core包,也就是String、StringBuffer等。
如果你有一定的Java IO基礎,那麼不妨讀讀FileReader等類。我建議大家看看《Java In A Nutshell》,裡面有整個Java IO的架構圖。Java IO類庫,如果不理解其各介面和繼承關係,則閱讀始終是一頭霧水。
Java IO 包,我認為是對繼承和介面運用得最優雅的案例。如果你將來做架構師,你一定會經常和它打交道,如項目中部署和配置相關的核心類開發。
讀這些源碼時,只需要讀懂一些核心類即可,如和ArrayList類似的二三十個類,對於每一個類,也不一定要每個方法都讀懂。像String有些方法已經到虛擬機器層了(native方法),如hashCode方法。
當然,如果有興趣,可以對照看看JRockit的源碼,同一套API,兩種實現,很有意思的。
如果你再想鑽的話,不妨看看針對虛擬機器的那套代碼,如System ClassLoader的原理,它不在JDK包裡,JDK是基於它的。JDK的源碼Zip包只有10來M,它像是有50來M,Sun公司有下載的,不過很隱秘。我曾經為自己找到、讀過它很興奮了一陣。
Java Web開發源碼
在閱讀Tomcat等源碼前,一定要有一定的積累。我的切實體會,也可以說是比較好的階梯是:
1、寫過一些Servlet和JSP代碼。注意,不是用什麼Struts,它是很難接觸到Servlet精髓的。用好Struts只是皮毛。
2、看過《Servlet和JSP核心編程》
3、看過Sun公司的Servlet規範
4、看過http協議的rfc,debug過http的資料包
如果有以上基礎,我也不建議你開始讀Tomcat源碼。我建議你在閱讀Tomcat源碼前,讀過Struts源碼,Struts源碼比WebWork要簡單得多。這個架構是可以100%讀懂的,至少WebWork我沒有100%讀懂。我曾經因為讀懂了Struts源碼,自己寫過一個Web架構。
當然,在讀Struts架構前,最好看過它的MailReader等demo,非常非常不錯的。
如果你做過一些Struts項目,那麼讀它時就更得心應手了。
在讀Struts前,建議看看mvnforum的源碼,它部分實現了Struts的功能,雖然這個BBS做得不敢恭維。
如果你讀過Struts,再開始考慮Tomcat源碼閱讀吧。
不過,我還是不建議直接讀它,先讀讀onJava網站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最簡易版。它告訴你HttpServletRequest如何在容器內部實現的,Tomcat如何通過 Socket來接受外面的請求,你的Servlet代碼如何被Tomcat容器調用的(回調)。
學習JSP,一定要研讀容器將JSP編譯後的Servlet源碼。
為什麼我總是稱呼Tomcat為容器,而不是伺服器?這個疑問留給大家吧。
如果你一定要讀Tomcat,那麼就讀Jetty吧。至少它是嵌入式,可以直接在eclispe裡面設定斷點debug。雖然Tomcat也有嵌入式版本。
Java資料庫源碼閱讀
我建議,先讀讀Sun的JDBC規範。
我想你一定寫過JDBC的代碼,那麼這時候可以開始閱讀源碼了。
如果瞭解JDBC規範(介面),那麼它的實現,JDBC Driver就一定要開始瞭解,我的建議是,讀讀mysql的jdbc驅動,因為它開源、設計優雅。在讀mysql的JDBC驅動源碼時,建議看看 mysql的內幕,官方正好有本書,《Mysql Internals》,我五年前讀過一部分。比如你可以知道mysql的JDBC驅動,如何通過socket資料包(connect、query),給這個C++開發的mysql伺服器互動的。
通過上面的閱讀,你可以知道,你的業務代碼、JDBC規範、JDBC驅動、以及資料庫,它們是如何一起協作的。
如果你瞭解這些內幕,那麼你再學習Hibernate、iBatis等持久化架構時,就會得心應手的。
讀過JDBC驅動,那麼下一步一定要讀讀資料庫了。而正好有一個強大的資料庫是用Java開發的,Hsqldb。它是嵌入式資料庫,比如用在案頭用戶端軟體裡,如Mail Client。
我四年前為此寫過一篇小文,就不介紹了。
Java通訊及用戶端軟體
我強烈推薦即時通訊軟體wildfire和Spark。你可以把wildfire理解成MSN伺服器,Spark理解成MSN用戶端。它們是通過XMPP協議通訊的。
我曾經在一個項目中,定製過Spark,當然也包括服務端的一些改動。所以它們的源碼我都讀過。
我之所以推薦它們。是因為:
1、XMPP夠輕量級,好理解
2、學習Socket通訊實現,特別是C/S架構設計
3、模組化設計。它們都是基於module的,你既可以瞭解模組化架構,還可以瞭解模組化的技術支撐:Java虛擬機器的ClassLoader的應用情境。
4、Event Driven架構。雖然GUI都是Event驅動的,但Spark的設計尤其優雅
這麼說吧,讀它們的源碼,你會為做一名程式員而自豪,因為無論是他們的架構設計還是代碼,都太漂亮了。
Java企業級應用
當然了,就是Hibernate、Spring這類架構。
在讀Spring源碼前,一定要先看看Rod Johnson寫的那邊《J2EE Design and Development》,它是Spring的設計思路。注意,不是中文版,中文版完全被糟蹋了。
在讀Hibernate源碼前,一定要讀讀Gavin King寫的那本《Hibernate in Action》,同時,應該再讀讀Martin Fowler寫的《公司專屬應用程式架構模式》,它專門談到持久化架構的設計思路。當你得這兩本書讀透了,再去看它們源碼吧。
而且,在讀源碼前,你會發現它們用到很多第三方Jar包,二三十個,你最好把那些Jar包先一個個搞明白。
說到公司專屬應用程式,一定會涉及到工作流程。我當年讀過jBPM的源碼,網上有介紹jBPM核心的文章(銀狐)。我感覺它的核心也就兩千行,不要害怕。我曾經閱讀jBPM源碼的部落格。
當然了,讀工作流程源碼,前提是一定要對其理論模型有深入的瞭解,以及寫過一些demo、或做過一些項目。
我上面介紹的這些,是我自己讀過的,也適合一般人閱讀。
我也讀過一些非Java源碼,感覺不錯,也推薦給大家:
dojo源碼 它的架構設計得很優雅,仿Java的import和extends。但實際應用起來一塌糊塗。我們當年基於這個開發了自己的架構,不過我不是主力。
Flex源碼 Flex 08年底剛剛開源後,我就用它做過一個中型項目,應該說是國內的技術先行者。當時市面沒有有深度的書,也沒有開源項目。我純粹是看Flex的Help文檔和源碼,把項目搞定的。兩三年過去了,現在覺得系統設計得蠻優雅的。
好了,先介紹到這裡。
上面說到的這些Java源碼,我都是4年前、甚至更早讀過的。技術變化這麼快,像互連網的高速發展,催生很多高效能、分散式資料庫,如hadoop。我一看,發現自己已經落伍了。
這幾年,想必已經出現了很多優秀的架構,大家不妨分享出來。
轉載地址:http://www.baidu.com/link?url=jG6WGJqjJ4zBBpC8yDF8xDh8vibi0ExoHW2BcokQ2cS5OEV6FjN-r1ooQ8G