水木网友提供的阅读代码的方法
时间:2010-06-23 来源:ymll
如果没有太多经验的话,可以从简单的看起,推荐看ftp的代码(下载服务器和客户端代码),毕竟逻辑上来讲ftp要简单一点,容易理清一点
其实看代码,每个人有适合自己的方法,当然这个只能靠自己不断看,不断实践总结。
我说一下我的方法,希望对你有点用,我讲的都是基于linux下的代码,其实windows下也类识。
看代码,首先要知道逻辑业务上的东西,比如ftp,先要搞清什么是控制连接,什么是数据连接,然后大致支持哪些操作,ls,get,....具体操作上
1)动手配好ftp server, client,实际操作,动手搭配服务器,在客户端下文件
2)可以用tcpdump抓包看实际client/server交互的过程
就是说,首先要知道你的代码是干什么的,大致都有哪些操作,如果你经验够丰富的话,你就能猜到大致可以代码是怎么实现的
其次,看代码,像服务器这种程序,
一般有几大模块,如核心逻辑模块,和其它自用的库模块(如内存管理,timer管理,事件管理,log, list, hash, ..),一般每个模块一个目录,
1)第一步,main函数,一般先初始化动作(初始化子模块,初始化核心数据结构),
2)第二步, main函数,检查是由什么驱动的,一般的由timer/event事件驱动,一般daemon程序是长时间运行的,必然大部分时间在睡眠/阻塞,等待timer或描述符可读等事件来唤醒之,
3)追踪某一个操作,具体代码是如何执行的,比如ftp get一个文件操作,具体代码,一步一步是怎么执行到的。你会通过函数变量命名或者程序代码自身的log信息/字串,猜测某个函数肯定被调用,但不知道从main()是一步一步如何调的,用gdb 断点,一进入某个函数,程序stop,
然后你可以bt查看调用栈,其它的如自己增加log信息(或者daemon前台运行,或者fprintf你要看的信息到某一个文件,哪个你最喜欢就用哪个,当然要通过你的实践去判断总结你喜欢哪个...),这些其实都是细节的方法,需要你平时积累总结
4)一般每个操作都弄清楚后,脑中就有了一张程序运行图, 先初始化, 然后程序睡眠,等待某个事件发生(比如新连接到来,ls,get命令到来),然后程序如何响应该事件,处理完毕后,程序又阻塞在什么事件上。。。
如果运行图建立起来了,代码就差不多读完了,就该学习总结人家设计的优秀之处
还有,
一般程序都比较大,但都有一个模式,如服务器程序,都是那个模子,几个核心模块,几个支撑模块,
代码这么大,光靠脑袋记是不够的,我个人的经验的是
1)像支撑模块(memory 管理,timer管理,list管理)的数据结构,有什么成员,及支持的操作,先扫以下代码,看懂,这个代码也好懂,只是可能比较多比较难记,我的方法是理清楚以后,将核心数据结构/接口记在一张纸上,脑中只有一个抽象概念,减少脑的记忆负担
2)某些个别数据结构的成员,一时可能不知道有什么用,没关系,用grep工具,把代码和功能联系上,连不连联系得上,要看你的悟性了
总之,读代码就是要多读,多总结,读多了,你就知道别人一般会怎么设计了,那么设计的目的何在,然后,这些经验都可以帮助你快速地消化理解其它的新代码
其实看代码,每个人有适合自己的方法,当然这个只能靠自己不断看,不断实践总结。
我说一下我的方法,希望对你有点用,我讲的都是基于linux下的代码,其实windows下也类识。
看代码,首先要知道逻辑业务上的东西,比如ftp,先要搞清什么是控制连接,什么是数据连接,然后大致支持哪些操作,ls,get,....具体操作上
1)动手配好ftp server, client,实际操作,动手搭配服务器,在客户端下文件
2)可以用tcpdump抓包看实际client/server交互的过程
就是说,首先要知道你的代码是干什么的,大致都有哪些操作,如果你经验够丰富的话,你就能猜到大致可以代码是怎么实现的
其次,看代码,像服务器这种程序,
一般有几大模块,如核心逻辑模块,和其它自用的库模块(如内存管理,timer管理,事件管理,log, list, hash, ..),一般每个模块一个目录,
1)第一步,main函数,一般先初始化动作(初始化子模块,初始化核心数据结构),
2)第二步, main函数,检查是由什么驱动的,一般的由timer/event事件驱动,一般daemon程序是长时间运行的,必然大部分时间在睡眠/阻塞,等待timer或描述符可读等事件来唤醒之,
3)追踪某一个操作,具体代码是如何执行的,比如ftp get一个文件操作,具体代码,一步一步是怎么执行到的。你会通过函数变量命名或者程序代码自身的log信息/字串,猜测某个函数肯定被调用,但不知道从main()是一步一步如何调的,用gdb 断点,一进入某个函数,程序stop,
然后你可以bt查看调用栈,其它的如自己增加log信息(或者daemon前台运行,或者fprintf你要看的信息到某一个文件,哪个你最喜欢就用哪个,当然要通过你的实践去判断总结你喜欢哪个...),这些其实都是细节的方法,需要你平时积累总结
4)一般每个操作都弄清楚后,脑中就有了一张程序运行图, 先初始化, 然后程序睡眠,等待某个事件发生(比如新连接到来,ls,get命令到来),然后程序如何响应该事件,处理完毕后,程序又阻塞在什么事件上。。。
如果运行图建立起来了,代码就差不多读完了,就该学习总结人家设计的优秀之处
还有,
一般程序都比较大,但都有一个模式,如服务器程序,都是那个模子,几个核心模块,几个支撑模块,
代码这么大,光靠脑袋记是不够的,我个人的经验的是
1)像支撑模块(memory 管理,timer管理,list管理)的数据结构,有什么成员,及支持的操作,先扫以下代码,看懂,这个代码也好懂,只是可能比较多比较难记,我的方法是理清楚以后,将核心数据结构/接口记在一张纸上,脑中只有一个抽象概念,减少脑的记忆负担
2)某些个别数据结构的成员,一时可能不知道有什么用,没关系,用grep工具,把代码和功能联系上,连不连联系得上,要看你的悟性了
总之,读代码就是要多读,多总结,读多了,你就知道别人一般会怎么设计了,那么设计的目的何在,然后,这些经验都可以帮助你快速地消化理解其它的新代码
相关阅读 更多 +