【转】高效阅读代码

CSDN前辈经验借鉴。

原文地址:http://blog.csdn.net/oncoding/article/details/4434315

源码阅读,自然是计算机学习的捷径之一,其重要性在此就不再赘述。
因项目需要,最近在读OpenSSH & OpenSSL 的源码库,一开始进展奇慢,龟速,后来掌握了一些技巧后,快了一些。在此,将我总结的所谓的“技巧”贴上来,我先扔出一块砖,大家拿玉的砸过来!!

1.工欲善其事,必先利其器——铁锹?
源码阅工具推荐: 桌面软件或web开发推荐 ms vs 或eclipse+plugins,即相应的IDE即可; Linux项目相关推荐使用source insight(wine/samba)。 可以根据个人习惯确定。
2.选择好的项目——什么才算宝藏?
好的项目:质量过关的项目; 个人认为,质量过关的代码应该至少具备: 1)软件架构、模块接口设计良好,高内聚、低耦合; 2)代码书写规范、流程清晰; 3)注释、文档、及相关网络资料齐全; 具体到某个项目的优劣可以参考主流论坛对之的评价。 除此之外,好的项目,也必须是适合自己的项目。 根据自己的水平,兴趣,专业方向等做出选择,更多情况是因为一些限制条件,比如:工作或学习需要。 这样做的目的是,让我们能够有目标的去读,一则因为实际需要,易于端正态度、不会轻言放弃;二则于情景中阅读源码,更容易理解,事半功倍。 举例说明: 要学习 asp.NET的架构设计、设计模式的相关内容,并且毕业设计想实现一个电子商务网站的,可以阅读一下 petshop; 如果要学习http协议的具体实现,可以阅读一些web server的源码,micro_httpd、shttpd、boa、apache…… 如果学习龙芯或MIPs CPU架构,熟悉mips汇编,建议阅读mips模拟器源码,pcspim 、vmips、msim …… ……
3. 关注Doc——关于宝藏

很多开源项目中的readme、Q&A、buglist、manual等都会提供大量的信息,了解这些文档,显然会对整个项目的把握很大的帮助,然而这部分也是最容易被我们忽略的。 我们也可以通过 wiki & google扩展这些资料。
4.搭建环境——出发前的准备

一个可运行的环境对于代码阅读会有很大的帮助: 1)便于我们从功能面上了解项目; 2)通过调试、跟踪等手段,理解源码运行的流程。
5.分析项目架构——画地图

通过以上几步已经大体把握了项目的架构,我们再结合源码,即可分析出项目的架构,常用手段如下: 1)借助项目目录; 2)分析项目管理工具Makefile,分析模块的依赖关系; 3)浏览源码,这里不必具体到每个函数,遇到关键函数可以阅读注释即可; 4)阅读文档、借助google等 做到这里,我们已经对项目的架构应该有了七八分的了解,有些问题即使想不透彻也没关系,留到下面,咱们秋后算账。 在继续下一步之前,我们应该动手将项目的架构图画出来,和概要设计时的系统模块图类似,不清楚的地方空出来,可以借助visio、Rose、smartDraw等工具。 注:这一步是必须的,因为这是我们寻宝的地图,它可以使我们不至于迷失在茫茫的源码海洋之中。
6.深入源码——给我搜
根据上一步的地图,我们开始深入到各个模块,逐个歼灭,顺序大体如下: 1)自底向上的原则 这和我们在软件设计阶段自顶向下,逐步求精的思想相反;对模块内部的分析,我们需要从底部实现着手,结合地图,逐步cover此模块,蚕食之。这也是我们画地图的主要原因。
2)公共模块优先 公共模块基本上是一些通用性比较强的代码,可复用性比较高,例如一些工具性代码; 这些代码的模块接口通常比较清晰,这些代码基本上可以算是金子啦,这里的很多代码、甚至整个模块我们都可以直接用到其他项目中去。我们要将这些代码存入自己的代码库,这样还不行,我们还要加上这些代码的使用说明和可运行的实例代码。
3)虚拟数据,模拟接口,让每个模块都可以独立运行。 模拟这个概念比较重要,有点孤立敌军的意味。用虚拟数据包围当前模块、切断与其他模块的关系,将模块独立开来,歼灭之。 这一步需要的技巧比较多,难度通常和所选的项目有关,这也是前文中我们强调低耦合的原因。关于这些我们可以参考单元测试中的Mock原理,在书写大量伪装数据的同时,我们对模块间接口交互、数据流等有了更深层的了解。 这一步我们可以站在软件设计者的角度来思考,此时应该可以写出此模块的详细设计文档。
7.总结

一个源码项目阅读完了,我们再要回顾整个过程,把开始地图中留下的空填上。 我们不能满足于抽取了一些代码,对这个项目甚至类似的项目有了一些了解,这些仅仅是鱼;更重要的是要学会打渔的方法,正所谓:千金在手,不如一技傍身。 早期党为啥能够在如此艰苦的环境下存活甚至发展壮大,个人认为,主要是源于不断地思考和不断地总结!我们要时常猜测设计者的设计意图: 为什么这样做?为什么不那样做? 如果是我来设计,我应该怎么实现?应该避免什么,注意什么? 这样做真的最好吗?有没有其他更好的实现方法?
把这个将这些思路整理出来,可以称之为源码阅读心得。
就这样我们阅读一个项目基本上三遍就差不多了: 1)浏览,得出模块设计概要图; 2)细品,得出模块的详细设计,丰富了个人代码库; 3)回顾,得到此项目设计的精髓;
最后不要忘记在相关主流社区共享这些资料,留下联系方式,如有纰漏,会有人给你指出的,人人为我,我为人人。

欢迎转载,烦请注明来自see-see

时间: 2024-08-29 22:56:12

【转】高效阅读代码的相关文章

从《如何高效阅读》到如何阅读代码

?<如何高效学习>是一本主张通过整体性学习的方法来提高学习效率的书.书中结合信息的几种不同类型(随意的.观点的.过程的.具体的.抽象的),从信息的获取.理解.拓展.纠错和应用这几个逐步深入的层次,提出了如何高效学习的假说,指出了不少具有实用价值的方法,例如快速阅读.笔记流.比喻内化.图表.纠错和项目应用等. 刚看这本书的时候,我是一口气大约在一个多小时快读完的,记了十几条笔记.后面两天都回头来翻一番书后的总结和自己的笔记,每次都有些新的感想.这里尤其想整理的是:这本书给自己在阅读代码方面的几点

阅读代码的姿势

作为程序员坚持阅读代码是持续自我提升的有效方法之一.有心的程序员不仅要找到优秀代码阅读,更要注意阅读的方法,从整体架构掌握再逐步深入细节,先“广度优先”,再选自己感兴趣的方面进行“深度历险”. 一般地,在一个程序员的日常工作之中,绝大多数时间都是在「阅读代码」,而不是在「写代码」.但是,阅读代码往往是一件很枯燥的事情,尤其当遇到了一个不漂亮的设计,反抗的心理往往更加强烈. 事实上,变换一下习惯.思路和方法,代码阅读其实是一个很享受的过程.阅读代码的模式,实践和习惯,集大成者莫过于希腊作者Diom

程序猿如何高效阅读

从读书谈起 一開始我的问题是:"程序猿应该如何读书?" 假设把程序猿去掉,问题就变成"读书的方法或者做笔记的方法". 这个问题有非常多大家已经给出了回答: 张五常:读书的方法:理解比记忆或做笔记更重要,学会提问与抓重点. 李敖介绍他的读书方法:对书籍进行"拆卸",留下自己想要的素材和观点,再归档.分类为我所用. 杨绛:钱钟书是如何做读书笔记的:广泛阅读,多语言,多学科.勤做笔记,每读完一些内容都会把感想和心得记录下来. 阅读本身是有一些有用技巧的

程序员怎样高效阅读

从读书谈起 一开始我的问题是:"程序员应该怎样读书?" 如果把程序员去掉,问题就变成"读书的方法或者做笔记的方法".这个问题有很多大家已经给出了回答: 张五常:读书的方法:理解比记忆或做笔记更重要,学会提问与抓重点. 李敖介绍他的读书方法:对书籍进行"拆卸",留下自己想要的素材和观点,再归档.分类为我所用. 杨绛:钱钟书是怎样做读书笔记的:广泛阅读,多语言,多学科.勤做笔记,每读完一些内容都会把感想和心得记录下来. 阅读本身是有一些实用技巧的,比

如何高效阅读论文

如何高效阅读论文 吴恩达 理解一篇论文需要花多少时间? 对于刚接触机器学习的人来说,理解一篇相对简单的论文可能需要一个小时,这并不罕见.但是,有时你可能会偶然发现需要3个小时甚至更长时间才能真正理解的论文. 最重要的是不断学习,变得更好是指更加稳定的学习,而不是集中一段时间内读大量的论文.与其在短时间内死记硬背,不如从明年开始每周读两篇论文. 大体上的方法 Step 1. 编写一份论文列表 尝试创建一份研究论文列表.包括你拥有的任何文本(例如微信公众号等)或学习资源. Step 2. 过一遍列表

学习PHP精粹,编写高效PHP代码之自动测试

如果要制造出完美的产品,必须对它进行全方面检验测试.这里有几种类型的测试,每一种测试都针对应用程序的某个具体方面. 本文将对单元测试.数据库测试.系统测试.负载测试进行介绍. 一.单元测试 单元测试是测试应用程序的每一步,要确保其各个组成部分运转正常.若没有单元测试,在应用程序中找出导致错误运行的原因一般来说相当困难. 单元测试通常采用一个单元测试框架,它提供了编写和运行测试并输出结果所需要的基本结构. 一些较为常用的单元测试框架包括: PHPUnit:http://phpunit.de/ Si

从阅读Discuz的核心代码并给出注释的经历分析程序员该如何阅读代码?

本文标签:   程序员 php Discuz的核心代码 框架 深度学习框架 阅读优秀的代码,是技术水平成长的最佳途径.记得每个进来的新人,我都做过阅读优秀代码的要求,但几乎都只能坚持很少一段时间而已. 前晚大家还在开玩笑的讨论,都是因为看了前人的一些写法,才学会了一些乱七八糟的花招. 晚上我又开始重新阅读Discuz的核心代码,花了1h多的时间,才完成一个core文件的注释. 注释后的代码: <?php /** * [Discuz!] (C)2001-2099 Comsenz Inc. * Th

高效阅读文章的“三步曲”

高效阅读文章的“三步曲” 通读杨春玲老师的两篇博文“我科研过程中走过的弯路及纠偏探索 ”.“如何有效阅读文献(图) ”及其中链接的文章How to Read a Paper http://blog.sciencenet.cn/home.php?mod=attachment&filename=howtoread.pdf&id=47254,现给出自己对于这一问题的思考,以下没有标注的引号里的内容均来自杨老师的两篇博文中. 一.认真研读自己专业的经典教材,“教材是一个领域里最佳参考,研究之前先查

如何编写高效android代码

基于Android相关设备作为嵌入式设备范畴,在书写App应用的时候要格外关注效率,并且受电池电量的限制.这就导致嵌入式设备有诸多考虑.有限处理能力,因此就要求我们尽量去写高效的代码.本文讨论了很多能让开发者使他们的程序运行更有效的方法,遵照这些方法,你可以使你的程序发挥最大的效力. 引言 对于占用资源的系统,有两条基本原则: 不要做不必要的事 不要分配不必要的内存 所有下面的内容都遵照这两个原则. 1.避免建立对象 世界上没有免费的对象.虽然GC为每个线程都建立了临时对象池,可以使创建对象的代