【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

作为程序员来说,看代码是我们的必修课。记得以前《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】看代码的时候注意相互交流彼此的看法,这样会受益良多。

随想录(怎么阅读代码)相关推荐

  1. 微软资深软件工程师:阅读代码真的很难

    编者按:原文作者EricLippert是一名资深软件设计工程师,从1996年起一直在微软开发部门任职,协助设计并实现VBScript.JScript.JScript.NET.Windows Scrip ...

  2. 阅读代码和修改别人代码的一些技巧以及注意事项

    作为刚刚走上工作岗位的fish,都要熟悉前辈们留下来的代码.这段时间是fish最痛苦的时间同时也是最轻松的时间.痛苦是因为要看大量的代码,同时要慢慢从学生到社会人士的转变(*-*,再不能睡懒觉了,不能 ...

  3. 电脑常用工具(阅读代码、文件搜索、思维导图、图片处理、文件比较、流程图、桌面效率工具)

    目录 1.阅读代码--Notepad++ 2.编写代码--Source Insight 3.代码便捷器--sublime text3 4.本地搜索文件--Everything 5.思维导图软件--Xm ...

  4. 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得...

    谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...

  5. 编写可阅读代码的艺术 培训实践 第一部分 表面层次的改进

    java 1.6 帮助文档 中文链接:http://download.csdn.net/detail/qw599186875/9608735 Java1.8 帮助文档 中文 – 谷歌版 在线版: ht ...

  6. 随想录(开源代码的学习方法)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 一.历史     开源代码作为一种特色的产物,随着物联网的进步得到了前所未有的发展.一开始,很 ...

  7. 目标检测——阅读代码需要了解的内容

    1 阅读代码需要了解的内容 模型检测的过程: 模型训练的过程: 网络的具体结构:loss函数的构成: 网络推理的流程: 网络的超参数设置:lr和batch_size: 数据的增广操作:

  8. 阅读代码时,用excel做笔记。

    我在阅读代码时,因为代码量大,用以下方式做了笔记. 1.利用dir /s/b > d:\a.txt 将java目录下的文件目录导入a.txt. 2.把a.txt中文件名拷入excel文件,作为标 ...

  9. 转:Eric Lippert:阅读代码真的很难

    转自:http://blog.jobbole.com/438/ 相关文章 微软资深软件工程师:阅读代码真的很难(第2篇) 阅读优秀代码是提高开发人员修为的一种捷径 学会阅读源代码 如何阅读大型代码库? ...

  10. android 代码阅读,代码阅读器手机版-代码阅读器appv1.0 安卓版-腾牛安卓网

    代码阅读器app,一款非常不错的手机阅读开源代码软件,不但能够让你们在上面选择自己喜欢的阅读代码,还能够选择大量的阅读主题,方便你们在任何时候,都能够获得最佳的阅读环境. 代码阅读器app简介 一款简 ...

最新文章

  1. 大数据与数据挖掘考试题_北京2020届中考物理出题策略大揭秘!
  2. 学习笔记Flink(一)—— Flink简介(介绍、基本概念、应用场景)
  3. 一篇文章弄懂Java反射基础和反射的应用场景
  4. 双11不过瘾?双十二低至半价继续抢,更有免费学的机会等你抢!
  5. 理解 Linux 中 `ls` 的输出
  6. c语言sleep函数_做游戏,学C语言,小球碰撞游戏,菜鸡者从黑窗口到图形化编程...
  7. 如何利用PHP会话显示出当前在线的用户
  8. 英特尔:把基带卖给苹果 完全是高通逼的
  9. 索尼爱立信k510驱动_未来人工智能驱动的电信网络:爱立信案例研究
  10. Nginx初学者指南
  11. JS实现联欢会抽奖滚动数字效果
  12. HelloWorld
  13. latex参考文献编译不成功
  14. C++课本的练习题及答案(第五章)
  15. ae2018怎么打开2019_ae2018中英文切换的方法
  16. Linux perm
  17. Dockerfile中的指令与使用教程
  18. 融合收敛因子和樽海鞘群的蝴蝶优化算法
  19. 东北大学软件学院数据库系统概述第二章(关系模型)
  20. mysql数据库实验报告二

热门文章

  1. 从VSS到SVN再到Git 记Git的基本操作
  2. git 常见问题的解决方案
  3. 了解一下JAVA中的NIO模块
  4. SQLiteDatabase中query、insert、update、delete方法参数说明
  5. [Python]爬虫v0.1
  6. 人生是什么?——感悟2:绝望时候要相信自己
  7. 一种增强的md5加密算法
  8. RADIO控件变量添加
  9. layer.prompt添加多个输入框
  10. 99%的人都理解错了GET与POST的区别