`
jnn
  • 浏览: 283187 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何研读开源项目代码

阅读更多

今天在微博上看到庄表伟在知呼上回答的如何更有效地学习开源项目的代码

我很认同他总结的 “学习开源,就尽可能在代码里找答案,而不是在代码之外找答案,那些都是二手的,而且很可能是不准确的。”  但是如何读好,读懂代码,我这边还是有不同的认识。

 

1. 需要从代码管理库下载完整的源代码,而不是简单的源代码文件包或者source.jar.

    这样做有很多好处,一个是你可以获取代码的修改记录,还有你可以获取到完整的测试代码,当你要提交patch的时候,你可以借助版本管理工具生成针对不同版本的patch。

 

2. 示例代码与单元测试

    示例代码可以帮助你学会使用相关开源项目的API。很多朋友在使用开源项目的时候遇到一个小问题就发信给开发者要这样或者那样的示例代码,其实他们没有发现大部分的开源项目在开发的过程中,为了验证其实现的功能,都会写很多单元测试代码。这些代码其实非常好的示例代码。可能是下源码,建工程会花费你几个小时的时间,但是如果你想深入了解开源项目的话,这点投资还是很有价值的。

 

     其实读单元测试的好处太多了,这里简单给大家列一下:

  • 由于一个单元测试一般也就是几个小时的开发工作量,你很容易就能读懂相关的代码。
  • 每个单元测试都是可以独立运行的,这样节省你跟踪调试的时间。
  • 单元测试在很大程度定义了软件的功能,可以帮助你快速掌握项目的相关API。
  • 如果你修改的开源项目的代码,你可以通过修改单元测试来验证你的修改是否正确。
3. 架构文档
     其实大部分的开源项目都会对其架构有一定的描述,这些描述可能会有点过时,但是通读一下会让你项目有一个比较深入的认识。这样做好比是让你对北京的二环,三环,四环,五环有个大体的认识。这样在你要对代码的某块内容进行详细研究的时候(例如找中关村的位置的时候,知道西北四环)就能很快定位了。

 

15
2
分享到:
评论
12 楼 Mybeautiful 2012-01-19  
前段时间在下也有一篇阅读源代码的文章,总的观点跟博主类似,不过我觉得动手调试是最重要的;
http://mybeautiful.iteye.com/blog/1156815
11 楼 jnn 2011-12-21  
jnn 写道

不知道你如何下载的源代码,现在spring framwork的代码可以从github下载了,你下载之后可以按照下面的步骤在编译生成工程文件。看上去Spring3使用的是Ant 而不是使用maven。


如果你不是要通读Spring的代码,同时也不打算修改Spring的代码,你可以使用maven eclipse:eclipse 来建立一个简单工程文件当然你需要在你的工程里面指明对Spring的依赖,这样maven会帮助你下载soure.jar 文件,你用eclipse是可能跟踪到spring代码内部的。
10 楼 jnn 2011-12-21  
mlc880926 写道
我构建开源项目就没成功过,比如spring的源码,我直接装了eclipse的maven插件,然后导入spring的maven,但肯定有X,依赖一直有问题
博主有看过类似经验吗,望指教


不知道你如何下载的源代码,现在spring framwork的代码可以从github下载了,你下载之后可以按照下面的步骤在编译生成工程文件。看上去Spring3使用的是Ant 而不是使用maven。
9 楼 mlc880926 2011-12-21  
我构建开源项目就没成功过,比如spring的源码,我直接装了eclipse的maven插件,然后导入spring的maven,但肯定有X,依赖一直有问题
博主有看过类似经验吗,望指教
8 楼 downpour 2011-12-21  
jnn 写道

我写这篇日志的主要目的是让大家在看代码的时候也留心一下单元测试,里面有很多宝藏。

好的单元测试不一定要把整个系统启动起来,因为这样做会耗费很多时间,而且单元测试跑得慢会降低开发人员跑测试的积极性。

单元测试已经把问题分解了,如果使用了mock对象,debug的过程中可能不能完全体现整个运行环境的情况。 这部分的工作可以由示例代码(example)来补足。

对于我参与的开源项目 Apache Camel来说,camel-test 模块中已经对启动环境进行了封装,用户只需要更改route 配置代码结合mock endpoint就可以进行测试了。如果只想验证代码写是否正确的话,这样的单元测试(测试业务模块)是很值得推广的。


我完全明白你的意思了。我顺着你的思路去看了一下XWork中的一些单元测试基类,果然发现了不少好东西。谢谢!
7 楼 jnn 2011-12-21  
downpour 写道
jnn 写道
downpour 写道
兄弟,你把人家最精髓的第一句话给漏了吧。人家最提倡的就是去debug源码,其次才是单元测试啥的。

debug源码最大的好处是可以看到源码的运行状态。实际上单元测试应该是一个局部的源码阅读方式,旨在解决某个领域的问题。


读代码不是看小说可以一页的看,有了单元测试就像是有了一个贴身导游,你可以让他带着你边走边看。


单元测试是很好的方法,不过老实说我觉得有点纸上谈兵的味道。因为单元测试所模拟的往往只是一个功能模块而不是整个运行环境。所以我认为只有把系统在一个轻便的环境中运行起来并且进入debug模式才是阅读的王道。


我写这篇日志的主要目的是让大家在看代码的时候也留心一下单元测试,里面有很多宝藏。

好的单元测试不一定要把整个系统启动起来,因为这样做会耗费很多时间,而且单元测试跑得慢会降低开发人员跑测试的积极性。

单元测试已经把问题分解了,如果使用了mock对象,debug的过程中可能不能完全体现整个运行环境的情况。 这部分的工作可以由示例代码(example)来补足。

对于我参与的开源项目 Apache Camel来说,camel-test 模块中已经对启动环境进行了封装,用户只需要更改route 配置代码结合mock endpoint就可以进行测试了。如果只想验证代码写是否正确的话,这样的单元测试(测试业务模块)是很值得推广的。
6 楼 downpour 2011-12-21  
jnn 写道
downpour 写道
兄弟,你把人家最精髓的第一句话给漏了吧。人家最提倡的就是去debug源码,其次才是单元测试啥的。

debug源码最大的好处是可以看到源码的运行状态。实际上单元测试应该是一个局部的源码阅读方式,旨在解决某个领域的问题。


读代码不是看小说可以一页的看,有了单元测试就像是有了一个贴身导游,你可以让他带着你边走边看。


单元测试是很好的方法,不过老实说我觉得有点纸上谈兵的味道。因为单元测试所模拟的往往只是一个功能模块而不是整个运行环境。所以我认为只有把系统在一个轻便的环境中运行起来并且进入debug模式才是阅读的王道。
5 楼 jnn 2011-12-20  
downpour 写道
兄弟,你把人家最精髓的第一句话给漏了吧。人家最提倡的就是去debug源码,其次才是单元测试啥的。

debug源码最大的好处是可以看到源码的运行状态。实际上单元测试应该是一个局部的源码阅读方式,旨在解决某个领域的问题。


读代码不是看小说可以一页的看,有了单元测试就像是有了一个贴身导游,你可以让他带着你边走边看。
4 楼 FX夜归人 2011-12-20  
学了,谢谢。
3 楼 downpour 2011-12-20  
兄弟,你把人家最精髓的第一句话给漏了吧。人家最提倡的就是去debug源码,其次才是单元测试啥的。

debug源码最大的好处是可以看到源码的运行状态。实际上单元测试应该是一个局部的源码阅读方式,旨在解决某个领域的问题。
2 楼 DiaoCow 2011-12-19  
正好在学习看源码,遗漏了看单元测试这么好的方法,学习了!
1 楼 gteam.yu 2011-12-19  
呵呵,这个不错,其中单元测试是重点,一般的框架下载都附上了单元测试代码的,都单元测试容易理清整个框架,也能专注于某一个部分的功能。

相关推荐

    【完整版20章】深度学习经典论文与开源项目实战

    课程分享——深度学习经典论文与开源项目实战,完整版20章,提供全部数据,代码,PPT。 深度学习经典论文解读与项目实战课程旨在帮助同学们掌握当下深度学习领域最核心论文思想及其源码实现。所选论文均是计算机...

    开源软件之道(中文高清版)

    第1篇 了解开源软件 第1章 开源软件概述 ...11.2 开源项目托管网站 第12章 开源组织和社区 12.1 Apache软件基金会 12.1.1 Apache的历史 …… 第13章 商业模式与实例 第14章 参与开源社区 第15章 开创事业

    C++开源程序库 C++开源程序库

    由于ICE的出现较晚,开发者比较系统地应用了新的C++编程风格,所以成为了研读C++代码的良好目标。 4、正则表达式:boost::regex 正则表达式是编程工作中最强有力的工具之一。C++的正则表达式支持一直以来是一个...

    开源软件许可协议简介PPT

    免去了研究那些专业的许可条款的麻烦 更方便的对开源项目贡献出自己的代码 能保护你作为作品的原创作者 确保你至少拥有由于贡献参与而带来的署名荣誉 阻止其他人企图声明对你的作品拥有所有权的行为

    Liferay 开源全面资料

    Liferay Themes[1].pdf Liferay+CMS系统培训.ppt Liferay+Portal+数据库介绍+.doc Liferay+权限管理.doc liferay-portal-5-2-systems-development-...Liferay代码研读.pdf Liferay环境搭建.doc

    开源软件之道.part2of2

    这是第二部分,两个部分需要一起下载后,放在同一级目录,解压即可。 ...15.3.1 sourceforge托管开源项目基础设施构建 249 15.3.2 google code托管开源项目基础设施构建 259 15.4 宣传与坚持 263

    EasyFlash | 让 Flash 成为小型 KV 数据库

    本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,...

    开源C# ASP.NET门户系统源代码 - mojoPortal(可以二次开发自己的定制功能)part2

    免费、开源,在浏览器中创建标准兼容的网页,强大的内容管理,易学易用,包含博客,论坛,事件日历,Google地图,相册,电子商务,安全的文件共享,新闻组,调查,投票等子系统。 在mojoPortal的基础上,可以二次...

    spydroid源码解读.rar

    spydroid的是一款优秀的开源视频服务软件,其短小精悍,特别适合小型视频传输。对其代码的分析有利于我们掌握视频实时传输技术的主要流程和关键细节,作为初学者分析其代码非常有意义。为了帮助大家快速入门,将自己...

    ILSpy源代码

    开源项目 ILSpy 源代码。 留下来备份,官网可以下载到最新代码

    优秀开源代码解读之JS与iOSNativeCode互调的优雅实现方案

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge。它优雅地实现了在使用UIWebView时JS与ios的ObjCnativecode之间的互调,支持消息发送、接收、消息处理器的注册与调用以及设置消息处理的回调。就像...

    NLP技术 自然语言处理技术知识讲解 自然语言处理通用框架BERT原理解读 共33页.pdf

    环境配置:选一款IDE即可,基于谷歌开源项目 提供所有数据与代码,追随热点持续更新 【自然语言处理通用解决方案】 需要熟悉word2vec,RNN网络模型,了解词向量如何建模 重点在于Transformer网络架构,BERT训练方法...

    微信开发框架wechat4j

    非常非常欢迎你能够参与本项目的建设,每人做出一点点贡献,对整个项目来说就是一个非常大的贡献,希望集合众人的力量,让项目走的更好,能够为更多的人服务。 ###贡献者列表 * [@chengn]...

    MultiButton | 一个小巧简单易用的事件驱动型按键驱动模块

    本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,...

    深度学习与Tensorflow2实战课程

    深度学习与Tensorflow2实战视频教程,2020最新...章节15 谷歌开源项目BERT源码解读与应用实例 章节16 对抗生成网络实战 章节17 基于CycleGan开源项目实战图像合成 章节18 经典网络架构Resnet实战 章节19 Tensorflow基础

    Python-深度学习-物体检测实战

    计算机视觉-物体检测-通用解决框架Mask-Rcnn实战课程旨在帮助同学们快速掌握物体检测领域当下主流解决方案与网络框架构建原理,基于开源项目解读其应用领域与使用方法。通过debug方式,详细解读项目中每一模块核心...

    EasyLogger | 一款轻量级且高性能的日志库

    本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,...

    深度学习-对抗生成网络实战(GAN).rar

    分享课程——深度学习-对抗生成网络实战(GAN);...第2章 基于CycleGan开源项目实战图像合成 第3章 stargan论文架构解析 第4章 stargan项目实战及其源码解读 。。。。。 第9章 基础补充-PyTorch卷积模型实例

Global site tag (gtag.js) - Google Analytics