源代码阅读技巧

                                      转载请注明出处,作者:罗立树


    最近有人问我怎么学习源代码?怎么分析开源代码?的确在互联网行业中,采用了很多开放源代码,互联网的发展促进了开源代码的快速发展,在项目开发过程中,为了降低成本和提升项目的质量、开发效率等等,我们的思维形式往往就会考虑,这个系统实现是否有一些成熟的开源软件可以支持。正因为是开源的,质量其实也不能得到百分百的保证,有些问题可能本身开源的作者也没有遇到过或者没考虑周全,所以在拿过来用的时候也是存在风险的,另外我们通过源代码的分析阅读,掌握技术细节,这样就更加有利于我们今后线上的稳定,当然技术本身就是存在比较高的门槛的,能够熟练掌握,对于我们工作中有很多好处,这里不多说了。


很多人看源代码,一开始就一头扎进一堆代码中,然后跟着各个类文件或者代码流程,一点一点的跟踪,结果跟来跟去,把自己搞的越来越糊涂了,这种方式是不太高效的。


下面,根据我自己的一些经验,和大家分享一些阅读源代码的技巧。


1.阅读源代码前必须要有扎实的基础知识,没有扎实的基础知识,很难能够了解代码的实现细节。譬如阅读一个NIO框架必须要了解NIO的实现原理和细节,阅读Tomcat代码必须要知道JVM内存管理、Servlet标准、http协议、java类加载策略、线程池、网络IO等等知识。阅读Redis得掌握C语言编程、常用的数据结构、网络IO、系统内存管理、系统线程管理、libevent(知道redis为什么不用,和memcached做一些比较)等等,这里不一一列举了。所以即使不会,我们必须要在阅读源代码前做好准备,做好理论上的支持,没有理论的支持很多东西理解起来都是比较困难的。
2.先了解源代码都有哪些功能特性,在熟练使用的时候,再去深入挖掘。我们常说,知其然,再知道其所以然的一个过程。
3.先网上搜索一下相关开源框架的介绍,学习别人对该框架的评价和使用、分析等,分析出开源软件的设计思想,这是站在别人的基础上,牛顿说:站在巨人的肩膀上。
4.掌握软件工程,得学会软件设计的一些原则,什么依赖倒转原则、开闭原则、里氏代换原则等等,假如实现上采用面向对象的语言的话,还得学会设计模式,懂得变与不变分离的思想。
5.学会使用工具,精通debug技巧,先分析出各个子工程或者代码模块的依赖关系,然后将依赖关系理清楚,整理它的先后顺序和优先级,当我们把依赖关系弄明白了,自然入手也更加方便。
6.学会总体概括思维,理解好抽象,把握其总体架构,抓关键点,
  譬如学习Spring源代码,那Spring的核心功能就是IOC和AOP,那基于IOC的实现来说,是BeanFactory,而BeanFactory是通过分层的模式来对不同的运行环境进行隔离的,IOC的支持是通过BeanDefinition来进行管理的,而Bean的配置通过命名空间的支持。而AOP来说,它的入口是AopProxy(实现方式有Cglib和AopProxy),一方面是通过AOP来实现事务,支持Aspectj的面向切面编程,基于Aop实现一些不通过非入侵性编码就可以实现的功能。
Spring的哲学就是面向接口的,相互之间的调用关系可以通过接口分析就可以明确。
7.多动手应用实践和测试,根据以上的总体了解,然后构建相应的应用场景,边实践边debug,因为在软件设计过程中,代码量是非常大的,不做试验很难知道它到底是怎么回事。
8.学会总结、归纳,对所学的知识进行系统化概括,然后不仅局限于当前技术,学会比较,将多个同类产品之间的优缺点比较一下,譬如:redis和memcached都有什么优缺点,各自的应用场景在哪里更加好一些。在什么样的场景更加适合。
9.学会以审视的眼光来看,开源代码不一定就是最好的,在一些特别重要的关键设计中,看看该代码是否存在缺陷,假如自己来设计的话,是否有改进的地方。
10.技术码农是一个很苦很累的活,一定要有兴趣,需要坚持的去做,没有兴趣的话学什么都想急于求成,这样在理解过程中是有所遗漏和不全的,要学会在技术上进行多交流、多分享,这样才能更多的了解自己哪里存在不足。


好了,做了这么多总结,在今后的时间中,我会给大家带来一些源代码方面的分析的分享,短期的目标是以下内容:
1.《Spring源代码解读》
2.《Struts2源代码解读》
3.《Redis源代码解读》 
4.其它等。。。。。


关于源代码阅读的一些技巧,和学习的一些方法论,欢迎大家一起讨论,共同进步

你可能感兴趣的:(方法论,开放源代码,设计模式,http协议,java,开源代码)