源碼閱讀

原文:http://www.iteye.com/topic/1113732mysql

源碼閱讀,我以爲最核心有三點:技術基礎+強烈的求知慾+耐心。 

說到技術基礎,我打個比方吧,若是你歷來沒有學過Java,或是任何一門編程語言如C++,一開始去啃《Core Java》,你是很難從中吸取到養分的,特別是《深刻Java虛擬機》這類書,別人以爲好,未必適合如今的你。 
雖然Tomcat的源碼很漂亮,但我毫不建議你一開始就讀它。我文中會專門談到這個,暫時不展開。 

強烈的求知慾,我認爲是閱讀源碼的最核心驅動力。我見到絕大多數程序員,對學習的態度,基本上就是這幾個層次(很偏激哦): 
一、只關注項目自己,不懂就baidu一下。 
二、除了作好項目,還會閱讀和項目有關的技術書籍,看wikipedia。 
三、除了閱讀和項目相關的書外,還會閱讀IT行業的書,好比學Java時,還會去了解函數語言,如LISP。 
四、找一些開源項目看看,大量試用第三方框架,還會寫寫demo。 
五、閱讀基礎框架、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等源碼前,必定要有必定的積累。個人切實體會,也能夠說是比較好的階梯是: 
一、寫過一些Servlet和JSP代碼。注意,不是用什麼Struts,它是很難接觸到Servlet精髓的。用好Struts只是皮毛。 
二、看過《Servlet和JSP核心編程》 
三、看過Sun公司的Servlet規範 
四、看過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,固然也包括服務端的一些改動。因此它們的源碼我都讀過。 
我之因此推薦它們。是由於: 
一、XMPP夠輕量級,好理解 
二、學習Socket通信實現,特別是C/S架構設計 
三、模塊化設計。它們都是基於module的,你既能夠了解模塊化架構,還能夠了解模塊化的技術支撐:Java虛擬機的ClassLoader的應用場景。 
四、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。我一看,發現本身已經落伍了。 
這幾年,想必已經出現了不少優秀的框架,你們不妨分享出來。 程序員

相關文章
相關標籤/搜索