怎么阅读代码

  作为程序员来说,看代码是我们的必修课。记得以前《Linux内核修炼之道》的作者说过,学习linux最好的途径就是看代码。《深入浅出MFC》的作者侯捷也说过,代码面前没有秘密可言。但是,代码真的是那么容易读的吗?其实就我个人的经验而言,代码里面有的不仅仅是知识,更多的是对业务的一种提炼和理解。换句话说,我们在代码中看到的不仅仅是业务的处理,看得更多的可能是对异常和突发情况的处理。这在某种情况下很有可能会左右我们对代码的认识。不熟悉语言、不熟悉编译环境、不熟悉业务、不熟悉测试场景、不熟悉别人的开发思路,这些都会成为我们学习的障碍。那么,有什么办法可以提高自己看代码的能力呢?


(1)熟悉编程语言

    不同的项目有不同的编程语言,这一点在sourceforge、google code上面可以看得很清楚。现在开源的项目很多,小的代码库比如说有linux 0.11,前后大约有两万行左右,大的代码就不胜枚举了,什么linux 3.0、open office、mplayer、gimp、android,基本上每一个项目的代码行数都是在百万行以上。所以,如果你想对开源项目有一个基本的了解,那么你就需要对它的基本编程语言有一个透彻、详尽的了解。很难想象一个对C语言、汇编语言都不是很了记得人怎么能够看懂linux kernel的代码?当然了,这些还只是基础。它是你进一步提高的必要条件,却不是充分条件。


(2)学会使用开源项目的基本功能

    很多朋友在接触开源的时候都有一个很不好的习惯。那就是,不管是什么项目的代码,他都会不管三七二十一,下载下来立马解压,接着就看起代码来。至于说,这个代码有哪些功能,这个开源软件是怎么使用的,他全然不管。举个例子来说,很多朋友都喜欢notepad++这个工具,它也是一个很有名的开源项目。如果我们对notepad++的相关功能没有一个清晰的认识,那么我们就会把自己陷入到代码当中去,没有一个突破点。开源项目大多经过多年的发展,整个代码量远不是几千行那么简单。所以说,如果剥开软件的基本功能,只注重代码本身,你学到的东西其实是很少的。


(3)学会编译代码

    编译代码是我们学习软件的基本功课。在widnows上面,你要学会利用visual studio编译软件;在linux上面,你要学会gcc、ld、makefile等工具,同时还要学会自己搭建编译环境,不同的编译环境还要注意在版本上是否相互匹配。即使是Windows上面,由于版本的差别,有的软件代码只能使用高版本的visual studio才能编译,有的软件需要directx库、ddk才能参与编译。所以编译代码本身并不是那么简单的一件事情。就拿ucos嵌入式操作系统来说,相信很多人都看过它的代码。但是我想问的是,真正把ucos编译成可执行文件的朋友究竟有多少?


(4)学会看懂、修改代码

    在代码编译之后,我们常常就可以得到执行文件了。但是,这些工作只是一些基本工作,我们还有很多其他的工作要做。比如说,你要知道这个软件的入口点有哪些?实现了那些功能?基本机制是什么?模块和模块之间究竟是怎么衔接的?协议栈或者软件是怎么分层的?在真正看懂代码之前,你需要

a)分清代码的结构,这些一般可以从readme文件可以看出来;

b)弄清代码本身有多少线程,每个线程的功能是什么;

c)分清数据和代码的走向,理清楚代码的执行流程;

d)善于利用软件的基本功能点来看代码;

e)编译代码的时候添加-g选项,这样可以实现单步调试,查看每一步数据的变化情况;

f)给原来的开源模块添加新的功能,但是不能破坏原来的基本构架和机制,验证和深化自己的认识。


(5)学会仿真代码、重构代码

    如果我们看代码的目的只是为了利用某一些lib函数的使用方法,那么做到上面4点就已经很不错了。但是,我们常常有更高的要求。通过学习,我们可以发现原来的开源软件有哪些设计的闪光点?自己是不是可以对它的基本功能用相同的编程语言尽快仿真出来?甚至于,我们可以自己编写一个类似的开源软件,实现更多的功能,而在资源的利用和数据的访问速度上有一个质的提高。等到我们可以仿真代码、重构代码的时候,那个时候我们才能说对这个代码真正掌握了。


    不同的人看代码的目的是不一样的。但是,既然我们看了这些代码,那么至少需要掌握一些东西、学习一些东西,否则那不是在浪费时间吗?不管什么方法,有几个原则是我们必须牢记的,否则看代码的效果就会大打折扣的,

1】代码必须完全编译出来,不能编译的代码基本是没有什么用的;

2】代码必须单步调试,慢工才能出细活;

3】修改代码必须建立在对软件深刻理解的程度上,否则bug会越改越多的;

4】代码是需要反复看、反复验证的,通常每一次看都会有新的收获;

5】看代码的时候注意相互交流彼此的看法,这样会受益良多。


你可能感兴趣的:(编程,linux,语言,makefile,linux内核,嵌入式操作系统)