问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何精读或泛读别人编写的程序源代码?

发布网友 发布时间:2022-04-06 02:25

我来回答

5个回答

懂视网 时间:2022-04-06 06:47

相关学习推荐:javascript

我喜欢编程,它也是我的工作,而且我很高兴能够将大部分的时间都花在开发软件上。像许多程序员一样,我既着迷但又困惑的是,我写的代码到底怎么样,以及如何写得更好。

多年来,我已经阅读了许多有关软件开发的文章和书籍。其中不乏有许多墨宝(书上的或者网上的)告诉你如何提高编程,并成为一个像忍者一样的受过专业训练的编程高手!这些建议大多有一些共性,其中之一就是阅读源码。然而相比于其它建议,阅读源码通常也就是简单的一句话来概括:找一些很棒的开源软件,或是任何你喜欢的软件,打开它们(或打印出来)然后阅读它们。虽然总的来说,这确实是个很好的建议,但纸上得来终觉浅,实际去实践的时候才发现问题多多。在这篇文章中,我会尝试给出一些阅读源码的实用建议,但在这之前,首先让我们列举一下都有哪些问题。

对阅读源码的误解

别人一说阅读源码,给你的一般印象似乎他们就像编程大师一样,可以单纯地坐在椅子上,然后像看小说一样读着手上的代码。好吧,我敢肯定,确实有一些精湛的程序员,他们可以很享受地一边喝着咖啡、一边看着一堆类似英语句子的神秘符号,并且还能够在脑海里构建整个类的层次和体系结构。显然这篇文章并不是给他们看的,它的受众是像我一样的,觉得盯着一堆源码看就好比看一些无聊没有意义的练习题的人。当然,有人会争辩说,可以从一个完整项目里一点一点地看单个类或者单个函数来学习,但在我看来,除非是最简单的问题,大多数软件内部都是相互依赖的。在不了解系统其余部分的情况下,通常不可能理解一个特定函数或者类背后的设计思想和原理。

下一个问题是从哪里获得可以读的源码(当然,在此之前,你得能够鉴别哪些源码值得一读)。优秀的软件很多,既有开源软件可以免费获得,也有闭源软件需要授权。开源仓库有譬如 Sourceforge 和 GitHub 。如果你在软件开发公司工作,那么可以访问源代码库中的专有代码。第三种常见途径是软件开发书籍附带的程序,或者作为教育资源而提供的程序( Minix 是典型的例子)。确实,众多的选项使我们难以抉择,因此从茫茫代码世界中找出适合我们阅读的是一项艰巨而必不可少的任务。

另一个问题是程序所用的编程语言,读他人的代码已经足够困难了,如果同时还需要去熟悉一门夹杂着奇葩语法的新语言,它所带来的负担,在我看来简直就是个会带来极大挫败感的灾难。所以你需要找到用你熟悉的语言所编写的代码。但如果你要看的代码是来自书本上或作为教育资源所提供的,那懂不懂这门新语言并无关紧要,因为有导师可以解释上下文。倘若你明知山有虎偏向虎山行,在没有书或者导师指引下,去阅读一门并不熟悉的编程语言,那我建议你至少需要学习,并达到可以写出自己的程序的程度(Hello World 就不算了哈)。

前文有关上下文的问题使我想到了下一个问题,如果你不熟悉软件本身,弄清楚代码在做什么就困难得多。例如,如果你不是每天都在使用 Linux 并知晓 Linux 启动顺序,那么就很难在看一边 Linux 代码后弄清楚运行级别是什么。使用某个软件获得的经验、知识能够帮助我们更好地阅读它的源码,这包括常用的术语、软件的功能和特性,甚至包括你遇到的各种错误本身。

理解源码

对我而言,我意识到 “阅读源码” 并不能准确描述我所从事的活动,用 “理解源码” 来表述会更合适。对我来说,坐在笔记本屏幕前(或打印成纸),只是单纯地读满屏的代码是非常困难的。我需要代码之外其它的东西,比如我喜欢翻一翻文档,玩一玩这个软件,单步运行代码甚至写测试代码去跑一跑,然后才能真正欣赏它。因为我会为此投入非常大的时间和精力,所以我必须要精挑细选,寻找我要 “阅读”(理解)的软件。

我的第一层过滤是通过编程语言进行筛选,对我来说,我只阅读由 C#、VB.NET、Python 和 Javascript 编写而成的程序的代码(尽管我也熟悉 C++、Ruby 和 F#,但我并不认为自己有水平来理解其他人的代码)。接下来是寻找我使用过的软件,这会让我有种已经上车的感觉,因为我知道代码的意图,以及它不能做的事情还有它的局限性(如果我足够熟悉的话)。每天都在使用的开源软件正是优秀的候选项(比如,我使用用 C# 编写的开源工具 Cruise Control.NET、NANT 和 NUnit)

碰巧我在一家软件产品公司(一家微软的公司)工作,所以我阅读的源码选择项之一是我们公司在源代码库中的代码。如果碰巧你也在一家软件公司工作,你可以查看其他的项目,甚至你着手项目的较早期版本。这样,除了可以获得更深层次的代码理解之外,你还可以很好地了解之前和之后都曾尝试过哪些东西。不过有一些警告需要注意:

  • 首先,如果你没有权限访问其他项目,则需要征得许可,因为一些公司对其 “知识产权” 非常看重。
  • 其次,这些软件的质量可能没有你想像的那么高,因为通常情况下,专有代码没有经过像开源代码那样严格的代码走查。需要注意的是,如果缺乏常规的代码审查,那么代码的质量可能不佳。
  • 第三(这一点是从我的朋友提供的反馈中得到启发的),如果你的公司开发的是商业软件(HR、财务、ERP 等),则需要首先理解很多业务关系。而且,由于大多数代码受业务功能因素的影响,因此通常模块化程度不如应用程序或 API 高。
  • 寻找文档齐全的项目(这适用于开源以及专有代码)。我的意思是说,这样的文档应该突出总体设计,并说明代码背后的原理。如果只是简单地自动生成的 Java Doc 类型文档,则不能视之为我所描述的文档 :-)。其中一种寻找途径是利用为教育而创造的软件(例如 Minix)。由于它们的目的是通过软件进行教学,因此通常会有非常清晰的文档记录下来,并且有大量资料解释代码背后的设计原理。

    总结

    那么,现在你已经确定了要阅读源码的软件并下载了它的源代码和文档,让我们一步步阅读并理解它:

  • 浏览设计文档,并尝试了解代码的构建方式。好的软件项目遵循某些架构模式,这些决定了代码的组织。一旦掌握了这一点,理解代码就变得容易了很多。如果你还能画出类图,就能更好地了解整体布局。
  • 接下来要做的是编译并运行它。根据项目及其文档循序渐进,这可能很简单也可能很困难。
  • 现在是时候打开你喜欢的 IDE 并开始探索了。一个好的探索起点是,尝试一步步浏览你熟悉的功能的代码。这样一来,你可以遍历各个层和子系统,并了解它们之间的关联。例如,当我探索 NUnit 时,我首先编写了一个测试用例,然后查看涉及到的类。
  • 尝试确定代码中使用的设计模式。如果你还不知道什么是设计模式,那么立刻马上停止看本文,转去阅读设计模式的经典书籍。熟悉设计模式,它们是识别和理解优秀代码中所包含的设计的好方法。熟悉之后就可以更轻松地在阅读代码时将其牢记在心。它还可以帮助你更轻松地识别代码作者在原有设计模式上所做的细微调整和魔改。
  • 尝试为代码编写测试用例以完全理解它,这是理解代码不同部分之间的依赖关系的一种非常有用的方法。写测试用例之前,首先需要满足所有的依赖。接下来,了解代码的可能的入口点和返回值。这可以增进你对代码的理解,助你更上一层楼。
  • 最后,尝试重构代码。在这一步,你已经从单纯地理解代码迈向足够熟悉以能够对其进行修改。随着重构复杂程度的提高,你的理解也将随之增加。此时,如果需要,你可以为项目贡献自己的代码。
  • “源码阅读”在我看来,不仅仅是阅读,它是一组独特的活动,共同帮助人们理解代码。这似乎比简单的 “阅读代码” 更令人生畏,但它值得付出努力。

    现在,你可以更加轻松,快乐地“阅读源码”了吗?

    想了解更多编程学习,敬请关注php培训栏目!

    热心网友 时间:2022-04-06 03:55

    读代码这事,先要分是精读还是泛读。从学习的目的来看,一定要精读一定量的经典代码。而精读是指每行都读懂,不看代码脑子里就能勾画出程序的基本结构。这里有个很形象的状态,精读代码时会满脑子都是代码,放不下,甚至睡觉前脑子里也是代码。但这一篇里主要不是关注如何精读代码的,而是关于如何在工作中掌握既有代码的,等价于泛读。现存的很多系统往往很大,几十万行的可能也只算普通。这时候一旦加入了这样一个项目,那么如何去读代码?下面说点个人体会。读这类代码前,先得把规格大致弄清楚,而不能上来就读,比如:对于应用型程序,你要先大致整清楚它的使用方法。如果其中有涉及到领域知识,比如:流程、财会等,那也最好预先有些认识。这类东西从代码里反推回来是不太可能的。我个人感觉这对读程序是个很大的障碍,你不知道编码规则,却去读编码的程序,总是会云里雾里,这时候反倒不是因为程序难,而是因为不知道程序中所包含的专业知识。在这一步里,最好能抽取出来几个典型的应用场景,这在后面有用。一旦开始接触代码,那要先弄清楚代码的基本静态结构。如:包构成、类构成等。这里涉及一个层次问题。一下子把层次探的太深,就容易盯在细节上出不来。有设计文档的项目,大致上可以通过包来界定这个层次。没设计文档的就可怕了,只能靠自己划分,最好不要超过10个,超过了真记不住。在静态结构这步,要弄清楚每个部分的核心职责,可以简单,最好能记住。接下来就要用到上面的典型场景了。要在典型场景下考察上面的静态结构是如何发挥作用的。典型场景下用到的接口往往就是关键的接口,要整清楚,他们的定义和作用。也要整清楚,典型场景下数据流的变迁。这步骤算是弄清楚代码的时序。很像UML里的Sequence图。但牵涉到数据的时候,一般需要对数据的规格有所了解。接下来要关注进程、线程的结构。比如:都是什么时候开始、什么时候结束的,在上述典型场景下都负责干什么。上述四步(规格、静态结构、典型场景、进程线程)完成后,对程序的第一次泛读完成。检验标准很简单,这时应该能够单靠纸笔描述出程序典型场景的Sequence图。干这事儿的时候,要抑制自己的求知欲,因为总是很想在调试器里通过call stack把一个功能的实现细节整清楚,但至少在第一个层次里,可以先不要这样。第一次泛读后,就要进入深掘的过程,针对的对象应该是自己会负责的部分。这部分功能往往会隐藏在某个接口之下。这时候一般来讲可以放过功能型的模块,比如:XML解析的模块等。其他部分可以认为是需要把之前所说的四个步骤再重复一下。但这时候要关注细节和调用堆栈了。不管是在那个读代码的层次,有两个基本技巧总是需要的,一个是要掌握具体程序里内嵌的Log机制,要能看Log,必要时可能还得加Log;一个是基本调试方法。调试很难展开,《软件调试》一书写了1000多页。但只停留在设个断点等他停下来这个层次上还是会有点欠缺的。条件断点、多线程调试、多进程时的调试还是要知道一点的。程序类型太多,因此估计读程序的方法也很多。上面只是个人的一点经验,欢迎补充。

    热心网友 时间:2022-04-06 05:13

    首先要掌握需要阅读的代码的编程语言,再深入要了解代码作者的编程习惯,因为每个人习惯不同,代码也不一样。最后在代码方面
    1、代码包括如下部分
    1)页面本身,即前台代码
    2)页面后台,即各种事件
    3)在页面事件中调用到的其他代码(例如数据库访问代码、多层架构中分出的其他层代码等)2、阅读顺序
    1)阅读前台代码,对于初学者可以学习控件标签的使用方法,当然,事实上我们是用vs的设计工具来画页面的,察看代码只是为了更加熟悉,或者加深理解。
    2)阅读页面后台事件代码,分两步走。首先,宏观理解一个事件的功能,比如点击一个登陆按钮,是要做:取得输入用户名和密码,根据用户名和密码查找数据库,根据返回结果判断页面流向,提示登陆成功或失败信息,等等。只需要理解功能即可,不需要深入理解每句代码的作用。因为这个时候我们是初次察看别人的后台代码,对于封装很好的框架,我们是很难第一次阅读就读懂所有东西的。
    3)然后,在我们已经了解了一个事件的功能后,我们再次阅读,此时逐行分析。例如我们会碰到代码中定义了一个数据表对象(如User对象),然后执行数据库查询(此时我们可以熟悉项目中的数据库操作),然后对返回值进行操作(例如判断用户存在否,密码正确否)。在这些操作中我们可以(1)学习基础类库的使用,(2)熟悉框架代码的使用
    注:在学习代码过程中,了解框架是意识上的进步,学习代码是技术上的进步,所以在逐步理解代码阶段,碰到人家封装好的类,例如数据库访问类,不用太执着,只要理解即可;而碰到某些编程技巧,则需要深入理解。

    热心网友 时间:2022-04-06 06:47

    读代码这事,先要分是精读还是泛读。从学习的目的来看,一定要精读一定量的经典代码。而精读是指每行都读懂,不看代码脑子里就能勾画出程序的基本结构。这里有个很形象的状态,精读代码时会满脑子都是代码,放不下,甚至睡觉前脑子里也是代码。.

    热心网友 时间:2022-04-06 08:39

    边看边试,这样印象更深刻
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    土狗一般多大开始懂人性 如何训练 小土狗怎么训练才听话 新手训狗的好方法 跑跑卡丁车故事模式哪一关还海盗船长(人物)奖励的,骨灰玩家说下._百 ... 跑跑卡丁车手游被遗忘的炮塔的宝藏在哪_跑跑卡丁车手游被遗忘的炮塔的... 跑跑卡丁车手游在被遗忘的炮塔附近搜寻宝藏怎么做?遗忘炮塔宝藏攻略... 跑跑卡丁车手游被遗忘炮塔宝藏在哪 炮塔附近搜寻宝箱位置详解-新手攻略... 跑跑卡丁车被遗忘的炮塔附近宝藏在哪里_跑跑卡丁车被遗忘的炮塔附近宝藏... 跑跑卡丁车手游在遗忘的炮塔附近搜寻宝藏在哪 遗忘炮塔宝藏位置详解 迅捷路由器使用问题 ...MATLAB7.0的,程序总是在打开后一会,就自动关闭了。希望能帮忙哦,感... 如何读源代码 如何阅读程序源代码 airpods pro 空间音频是随时都有吗 空间音频不支持怎么办 airpods pro怎么关闭立体声 现在哪一种浏览器最安全 什么浏览器最安全最好用 最安全的浏览器 目前最好用最安全的一款浏览器是什么? 现在什么浏览器最好用?最安全? 什么浏览器是最好最快最安全的呢? 大家觉得那个浏览器最好啊,速度最快 什么浏览器最好用,速度最快? 哪个浏览器最好用?要速度快的,安全性强的, 苹果手机用app老闪退 iosapp老是闪退怎么办 airpods pro怎么在ipad和iphone之间切换 airpods2如何在iphone和ipad切换 ios14和ios15用airpods3的区别 airpods pro怎么无缝从iphone切换到ipad 如何正确的阅读源代码 如何阅读源码包 如何阅读别人的代码 如何阅读别人的代码? 如何阅读原代码 如何去阅读并学习一些优秀的开源框架的源码 为什么以及如何阅读源码 一个完全入门初学者如何学代码,读代码和写代码,,我想学代码不知道方向谁能给我指明一个方向? 谷歌浏览器怎么才能使用谷歌搜索引擎 谷歌浏览器怎么添加搜索框? 关于Chrome浏览器,怎么不能直接搜索了? 谷歌浏览器怎么调用ie内核 怎么让谷歌浏览器使用IE内核 谷歌浏览器装上的 ie tab插件怎么用 详细介绍如何设置谷歌浏览器的代理问题,可以设置成IE内核吗? 请问chrome如何调用IE9的内核?IE TAB有该选项,但用后发现还是IE7的内核。实在舍不得chrome的插件啊~~ 谷歌浏览器怎么设置啊? 如何让ie调用chrome内核 如何使chrome总是保持IE tab? google chrome 的IE插件使用的时候是什么内核浏览器