乐趣区

关于源码:初学者如何阅读源码

  • 原文:How to read code – a primer
  • 原文作者:technikhil
  • 译者:newbiewang

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

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

对浏览源码的误会

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

下一个问题是从哪里取得能够读的源码(当然,在此之前,你得可能甄别哪些源码值得一读)。优良的软件很多,既有开源软件能够收费取得,也有闭源软件须要受权。开源仓库有譬如 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 时,我首先编写了一个测试用例,而后查看波及到的类。
  • 尝试确定代码中应用的设计模式。如果你还不晓得什么是设计模式,那么立即马上进行看本文,转去浏览设计模式的经典书籍。相熟设计模式,它们是辨认和了解优良代码中所蕴含的设计的好办法。相熟之后就能够更轻松地在浏览代码时将其牢记在心。它还能够帮忙你更轻松地辨认代码作者在原有设计模式上所做的轻微调整和魔改。
  • 尝试为代码编写测试用例以齐全了解它,这是了解代码不同局部之间的依赖关系的一种十分有用的办法。写测试用例之前,首先须要满足所有的依赖。接下来,理解代码的可能的入口点和返回值。这能够增进你对代码的了解,助你更上一层楼。
  • 最初,尝试重构代码。在这一步,你曾经从单纯地了解代码迈向足够相熟以可能对其进行批改。随着重构复杂程度的进步,你的了解也将随之减少。此时,如果须要,你能够为我的项目奉献本人的代码。

“源码浏览”在我看来,不仅仅是浏览,它是一组独特的流动,独特帮忙人们了解代码。这仿佛比简略的“浏览代码”更令人生畏,但它值得付出致力。

当初,你能够更加轻松,高兴地“浏览源码”了吗?????

零根底学习 Java 编程,能够退出我的十年 Java 学习园地。

退出移动版