刚才在论坛不经意间, 看到有关源码阅读的帖子 http://www.iteye.com/topic/854647 . 回想自己前几年, 阅读源码那种兴奋和成就感 (1 http://www.iteye.com/topic/80532 ), 不禁又有一种激动.
源码阅读, 我觉得最核心有三点: 技术基础 + 强烈的求知欲 + 耐心.
说到技术基础, 我打个比方吧, 如果你从来没有学过 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.
我四年前为此写过一篇小文 http://www.iteye.com/topic/80532 , 就不介绍了.
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 源码的博客 http://zwchen.iteye.com/blog/123579 .
当然了, 读工作流源码, 前提是一定要对其理论模型有深入的了解, 以及写过一些 demo, 或做过一些项目.
我上面介绍的这些, 是我自己读过的, 也适合一般人阅读.
我也读过一些非 Java 源码, 感觉不错, 也推荐给大家:
dojo 源码 它的架构设计得很优雅, 仿 Java 的 import 和 extends. 但实际应用起来一塌糊涂. 我们当年基于这个开发了自己的框架, 不过我不是主力.
Flex 源码 Flex 08 年底刚刚开源后, 我就用它做过一个中型项目, 应该说是国内的技术先行者. 当时市面没有有深度的书, 也没有开源项目. 我纯粹是看 Flex 的 Help 文档和源码, 把项目搞定的. 两三年过去了, 现在觉得系统设计得蛮优雅的.
好了, 先介绍到这里.
上面说到的这些 Java 源码, 我都是 4 年前, 甚至更早读过的. 技术变化这么快, 像互联网的高速发展, 催生很多高性能, 分布式数据库, 如 hadoop. 我一看, 发现自己已经落伍了.
这几年, 想必已经出现了很多优秀的框架, 大家不妨分享出来.
来源: http://www.bubuko.com/infodetail-3164049.html