刚才无意间在论坛里看到一篇关于源码阅读的帖子。回想这几年阅读源码的兴奋感和成就感,不禁再次激动起来。源码阅读,我觉得核心有3点:技术基础+强烈的好奇心+耐心。说到技术基础,我打个比方。如果你没学过Java,或者C++之类的任何编程语言,你很难从中吸收营养,尤其是《深入Java虚拟机》这种书,别人觉得不错,现在可能不适合你。虽然Tomcat的源代码很漂亮,但我绝对不建议您先阅读它。这篇文章我会专门讲这个,暂时不展开。强烈的求知欲,我认为是阅读源代码的核心驱动力。我见过绝大多数的程序员,他们对学习的态度基本是这几个层次(很极端):1.只关注项目本身,不懂就百度。2.除了做好项目之外,还会阅读与项目相关的技术书籍,阅读wikipedia。3、除了阅读项目相关的书籍,还会阅读IT行业的书籍。比如学习Java的时候,也会学习函数式语言,比如LISP。4、找一些开源项目,尝试很多第三方框架,写demo。5.阅读基本框架、J2EE规范、调试服务器内核。大多数节目都是第一种,第五种不仅需要浓厚的兴趣,还需要勇气:我能看懂吗?其实你可以理解的。耐心真的很重要。因为你很少看到阅读源代码的指导性文章或书籍,也没有人要求或推荐你阅读。在阅读的过程中经常会卡住,卡主可能掉入迷宫。这时候,你需要做的可能是暂时停止它,然后从外面看:比如API结构和框架的设计图。先说说如何阅读Java源码,以及我的阅读心得吧。初接触Java源码如果你开发了一年左右,喜欢用eclipse的debug功能。好了,你现在已经具备阅读源代码的技术基础了。推荐阅读JDK源码,直接与eclipse集成,无需任何配置。可以从JDK工具包入手,也就是我们学习的?的Java版本,比如List接口和ArrayList,LinkedList实现,HashMap和TreeMap等,这些数据结构中也涉及到排序等算法,杀两个鸟一石。面试的时候考官总喜欢问ArrayList和Vector的区别。如果你花10分钟阅读源代码,你一生都不会忘记它。然后是核心包,也就是String、StringBuffer等。如果你有一定的JavaIO基础,不妨看看FileReader等类。我建议你看看《Java In A Nutshell》,里面有完整的JavaIO架构图。JavaIO类库,如果不了解它的接口和继承关系,阅读时总会一头雾水。我认为JavaIO包是继承和接口的最优雅示例。如果以后做架构师,肯定会经常和它打交道,比如项目中部署和配置相关的核心类的开发。阅读这些源码时,只需要了解一些核心类,比如类似于ArrayList的二十、三十个类。对于每个类,没有必要了解每个方法。有些方法像String已经到了虚拟机层(nativemethod),比如hashCode方法。当然,如果你有兴趣,可以看看JRockit的源码,同一套API,两种实现,很有意思。想再钻的话,不妨看看虚拟机的那套代码,比如SystemClassLoader的原理,JDK包里没有,JDK是基于它的。JDK的源代码Zip包只有10M左右,好像有50M左右,Sun下载了,但是很隐秘。我很高兴能自己找到并阅读它。JavaWeb开发源码必须要有一定的积累,才能阅读Tomcat等源码。我的实践经验也可以说是一个比较好的阶梯:1.写过一些Servlet和JSP的代码。注意什么Struts都没有用过,很难接触到Servlet的本质。很好地使用Struts只是触及表面。2.阅读《Servlet和JSP核心编程》3.阅读Sun的Servlet规范4.阅读http协议的rfc,调试http上的数据包。如果你有以上基础,我不建议你开始阅读Tomcat源码。我建议您在阅读Tomcat源代码之前先阅读Struts源代码。Struts源代码比WebWork简单得多。这个框架100%看得懂,至少我对WebWork不是100%看懂。曾经自己写过一个Web框架,因为看懂了Struts的源码。当然,在阅读Struts框架之前,我看过它的MailReader等demo,非常非常好。如果你做过一些Struts的项目,读起来会更得心应手。在阅读Struts之前,建议先看看mvnforum的源码,它部分实现了Struts的功能,虽然这个论坛不敢恭维。如果你读过Struts,开始思考Tomcat源码阅读。不过还是不建议直接看,先看Java系列文章《How Tomcat Works》,是Tomcat最简单的版本。它告诉你HttpServletRequest是如何在容器内部实现的,Tomcat是如何通过Socket接受外部请求的,以及你的Servlet代码是如何被Tomcat容器调用(回调)的。学习JSP,必须要研究JSP容器编译出来的Servlet源码。为什么我总是把Tomcat称为容器,而不是服务器?这个问题留给大家。如果您必须阅读Tomcat,请阅读Jetty。至少是嵌入式的,可以直接在eclispe中设置断点调试。虽然Tomcat也有嵌入式版本。Java数据库源码阅读建议先阅读Sun公司的JDBC规范。我想你一定是写过JDBC代码的,那么这时候就可以开始阅读源码了。了解了JDBC规范(接口),就必须开始了解它的实现,JDBCDriver。我的建议是阅读mysql的jdbc驱动,因为它开源而且设计优雅。在阅读mysql的JDBC驱动源码的时候,推荐阅读mysql的内幕。有一本官方的书,《Mysql Internals》,我五年前读过一部分。比如mysql的JDBC驱动是如何通过socket数据包(connect、query)与C++开发的mysql服务器进行交互的。通过以上阅读,您可以了解您的业务代码、JDBC规范、JDBC驱动程序和数据库是如何协同工作的。如果你了解了这些内幕,那么你在学习Hibernate、iBatis等持久化框架时就会得心应手。读完JDBC驱动,接下来就是读数据库了。而正好有一个用Java开发的强大的数据库,Hsqldb。它是一个嵌入式数据库,例如用在桌面客户端软件中,例如MailClient。Java通信和客户端软件我强烈推荐即时通讯软件wildfire和Spark。你可以把wildfire理解为一个MSN服务器,把Spark理解为一个MSN客户端。它们通过XMPP协议进行通信。我曾经在一个项目中定制过Spark,当然也包含了一些服务端的改动。所以我阅读了他们的源代码。我推荐他们的原因。原因是:1.XMPP足够轻量级,容易理解2.学习Socket通信实现,尤其是C/S架构设计3.模块化设计。它们都是基于模块的,你既可以理解模块化的架构,也可以理解模块化的技术支持:Java虚拟机的ClassLoader的应用场景。4.事件驱动架构。虽然GUI是事件驱动的,但是Spark的设计特别优雅。这么说吧,读了他们的源码,你会以身为程序员而自豪,因为他们的架构设计和代码都太美了。当然,Java企业应用就是Hibernate、Spring等框架。在阅读Spring源码之前,必须先阅读RodJohnson写的《J2EE Design and Development》,这就是Spring的设计思想。注意,不是汉化版,汉化版完全毁了。在阅读Hibernate源码之前,你必须阅读GavinKing写的《Hibernate in Action》一书。同时,你应该看看MartinFowler写的《企业应用架构模式》,里面专门讲了持久化框架的设计思想。当你觉得这两本书都读透了,再去看它们的源代码。而且,在看源码之前,你会发现他们用了很多第三方的Jar包,二十三十个,你得先把那些Jar包一一了解。说到企业应用,就必须涉及到工作流。当年看了jBPM的源码,网上有介绍jBPM核心(SilverFox)的文章。我感觉它的核心只有2000行,不用怕。以前看jBPM源码的博客。当然,要阅读工作流源码,前提是必须对其理论模型有深入的了解,并且写过一些demo或者做过一些项目。以上介绍的是我自己看过的,也适合普通人阅读。也看了一些非Java的源码,感觉不错,推荐给大家:dojo源码。它的架构设计非常优雅,模仿了Java的导入和扩展。但是实际应用起来一团糟。我们当时就以此为基础开发了自己的框架,但我不是主力军。Flex源码2008年底Flex刚刚开源,我用它做了一个中等规模的项目。应该说是国内的技术先锋。那时候市面上没有深入的书籍,也没有开源的项目。我只是阅读了Flex的帮助文档和源代码来完成项目。两三年过去了,现在感觉系统设计还是挺优雅的。好了,先说到这里吧。我在4年前甚至更早的时候就已经阅读了上面提到的Java源代码。技术变化太快了,比如互联网的飞速发展,催生了很多高性能、分布式的数据库,比如Hadoop。我看了一下,发现我落伍了。这几年肯定有很多优秀的框架,大家不妨分享一下。
