`

请您先登录,才能继续操作

阅读源码技巧

 
阅读更多
转载--原文地址:www.不知道.com
刚才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动。 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。说到技术基础,我打个比方吧,如 ...
刚才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动。
源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。

说到技术基础,我打个比方吧,如果你答?没有学过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为容器,而不是服务器a氢个疑问留给大家吧。

如果你一定要读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。我一看,发现自己已经落伍了。
这几年,想必已经出现了很多优秀的框架,大家不妨分享出来。

题后记
这三年,一直在创业,主要是技术应用,偏业务,源码阅读不多,但很欣赏那些专注于技术的狂热者。
现暂别创业,进入一家电子商务公司,负责其B2C网站的改版和运营。
(广告)如果你对技术、对高负载的大型B2C开发也情有独钟,不妨看看这里。
分享到:
评论

相关推荐

    关于那些阅读源代码技巧

    文章提供了关于阅读源代码的技巧和方法,其中涉及多个方面,包括目的、工具、知识准备、笔记制作和实用技巧等。 首先,阅读源代码的目的可以多种多样,包括纯粹为了学习、添加新功能、重构代码以及修复Bug。不同的...

    引擎源码.zipGameOfMir俗称GOM引擎源代码全套版

    "引擎源码.zipGameOfMir俗称GOM引擎源代码全套版"这个压缩包包含的是GameOfMir(GOM)引擎的源代码,这是一款广泛应用于网络游戏开发的引擎,特别是对于传奇类游戏的开发有着重要的作用。GOM引擎以其强大的功能和...

    Linux内核源代码的阅读及相关工具介绍

    2. **提高编程能力**:Linux内核源代码是高质量C语言编程的典范,通过对它的学习,能够显著提升个人的编程技巧。 3. **贡献社区**:参与开源项目不仅可以帮助社区改进软件,还能提高自己的知名度和技术影响力。 ###...

    25个经典网站源代码

    这个资源"25个经典网站源代码"提供了一个宝贵的参考资料库,适合初学者和经验丰富的开发者参考,以理解不同的设计趋势、布局技巧以及功能实现方法。以下是这些源代码中可能包含的一些关键知识点: 1. HTML结构:每...

    一款阅读源码

    这款“阅读源码”很可能是一款电子阅读应用的源代码,用于处理和展示各种格式的电子书籍。 在深入探讨之前,我们先明确几个基本概念。源码,即源程序,是程序员用高级语言编写的、可读性强的代码,它是程序的原始...

    易语言小刀电子书阅读器源码.zip

    《易语言小刀电子书阅读器源码》是一款基于易语言开发的电子书阅读软件,其源代码提供了详细的实现逻辑,对于学习易语言和电子书阅读器开发的开发者来说,是一份宝贵的参考资料。易语言是一种面向对象、可视化编程的...

    小说阅读器源码(3款APP)可解压直接导入AS.zip

    标题中的“小说阅读器源码(3款APP)可解压直接导入AS”指的是这是一个包含三款Android小说阅读应用的源代码,用户可以下载后直接在Android Studio (AS) 开发环境中进行解压和导入,便于学习、修改或开发自己的阅读...

    Windows游戏编程大师技巧(第二版)源码及美术素材

    此资源包包括了作者精心编写的源代码以及用于游戏场景的美术资源,是学习游戏编程者宝贵的实践材料。 1. **游戏编程基础**:书中涉及的基础知识涵盖C++编程语言、DirectX图形库、游戏引擎架构、物理模拟、音频处理...

    精典源码delphi源码下载 超市管理系统源代码.zip

    通过深入学习和实践这个Delphi超市管理系统源代码,读者不仅可以掌握Delphi编程的基本技巧,还能了解到实际项目开发中的常见问题及解决策略,为今后的软件开发积累宝贵经验。同时,这也是一个良好的案例,展示了...

    网络流行游戏魔域源代码

    9. **优化技巧**:源代码可能会包含性能优化的策略,如内存管理、多线程并行计算等,这对于提升游戏运行效率和用户体验至关重要。 10. **错误处理与调试**:源代码中的错误检查和调试机制,是保证游戏稳定运行的...

    飞控源码.rar_STM32F4飞控源码_飞控源代码_飞控源码 stm32

    这个压缩包文件包含了基于STM32F4系列微控制器的飞行控制系统的完整源代码,该源码经过验证,能够正常运行,且无任何恶意软件,因此对于开发者来说是一个非常宝贵的参考资料。 STM32F4是意法半导体...

    微软计算器源代码

    源代码中可能包含了一些针对特定场景的优化技巧,这些对于提升程序运行效率和降低资源消耗具有实际意义。 最后,对于科学计算部分,源代码可能会使用到复杂数学运算和数值分析方法。这为我们提供了一个了解如何在...

    Java源码:比较经典的一些Java源代码,适合于初学者

    Java源码是学习编程语言的重要资源,特别是对于初学者来说,通过阅读和分析源代码,可以深入理解语言的特性和编程技巧。这个压缩包包含了140个经典的Java源代码程序,涵盖了各种基础到进阶的编程概念。下面,我们将...

    易语言源代码(全部极品源码)

    9. **界面设计**:易语言支持图形用户界面设计,源代码中的窗口布局和控件操作,展示了用户交互的设计技巧。 通过研读和分析压缩包内的源代码,我们可以逐步掌握易语言的编程精髓,提升编程能力和问题解决能力。...

    用Source Insight打开linux内核源代码

    8. Linux 内核源代码的阅读技巧:开始阅读 Linux 内核源代码之前,应该知道 Linux 内核源代码的整体分布情况。然后可以按照纵向或横向的方法阅读代码。在每个功能函数内部应该一步步来。实际上这是一个反复的过程,...

    Android 小说阅读器CoolReader源码.rar

    在CoolReader的源码中,这个文件将详细介绍项目的背景、技术栈以及如何编译和运行源代码。对于想要了解和学习该项目的开发者来说,readme.md是必不可少的入门资料。 核心部分在于“安卓Android开源小说阅读器...

    传奇3游戏源码分析,传奇源代码,Pascal

    3. **源码分析**:源码分析是软件工程中的一个重要环节,通过对源代码的研究,可以理解程序的设计思想、算法实现以及数据结构等,对于学习和优化现有系统至关重要。在游戏开发中,源码分析有助于开发者理解和改进...

    C++ Builder编程技巧、经验与实例(光盘、源代码、源码)

    光盘中包含的源代码和源码提供了宝贵的学习资源。通过对这些代码进行阅读和分析,可以了解各种编程技巧的实际应用,包括内存管理、性能优化、错误处理等。同时,这些源码也可以作为模板,为自己的项目提供灵感和起点...

Global site tag (gtag.js) - Google Analytics