书名门牌号:How to read code – a primer
书名作者:technikhil
翻译者:newbiewang
校对者:李建华
我讨厌程式设计,它也是我的组织工作,而且我很高兴能将大部分的时间都花在开发应用软件上。像很多开发人员那样,我既著迷但又疑惑的是,我写的标识符到底怎么样,以及怎样写得更好。
多年来,我已经写作了很多有关应用软件设计的文章和书刊。当中鲜有有很多手迹(文末的或是网上的)告诉你怎样提高程式设计,并成为两个像妖怪那样的经验丰富专业培训的程式设计剑客!这些提议大多有很多共通点,当中之一就是写作源标识符。然而相比于其它提议,写作源标识符一般来说也就是简单的一句话来概括:找很多很酷的开放源码应用软件,或是任何你讨厌的应用软件,打开它(或列印出来)接着写作它。虽然总体而言,这的确是个很好的提议,但纸上狂蛛属花笺浅,实际去实践的时候才发现难题喔。在这首诗中,我会尝试给出很多写作源标识符的新颖提议,但在这之前,首先让我们列出一下都有什么样难题。
对写作源标识符的误会
别人一说写作源标识符,给你的一般印象似乎她们就像程式设计巨匠那样,能单纯地坐在椅子上,接着像看小说那样读着手上的标识符。好吧,我并不认为,的确有很多高超的开发人员,她们能很享受地默默地喝着咖啡、默默地看着一大堆类似英语语句的神秘符号,并且还能在脑海中里构筑整个类的层级和数据库系统。显然这首诗并不是给她们看的,它的广告主是像我那样的,觉得盯着一大堆源标识符看就比方说看很多无趣没有意义的习题的人。总之,有人会争论说,能从两个完整项目里慢慢地看一般而言类或是一般而言表达式来学习,但事实证明,除非是最简单的难题,大多数应用软件内部都是互相冲突的。在不了解系统永古约省的情况下,一般来说不可能理解两个特定表达式或是类背后的设计思想和原理。
下两个难题是从哪里赢得能读的源标识符(总之,在此之后,你得能辨别什么样源标识符值得一读)。优秀的应用软件很多,既有开放源码应用软件能免费赢得,也有ZETA应用软件需要授权。开放源码库房有例如 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 时,我首先编写了两个测试用例,接着查看涉及到的类。尝试确定标识符中使用的设计模式。如果你还不知道什么是设计模式,那么立刻马上停止看本文,转去写作设计模式的经典书刊。熟悉设计模式,它是识别和理解优秀标识符中所包含的设计的好方法。熟悉之后就能更轻松地在写作标识符时将其牢记在心。它还能帮助你更轻松地识别标识符作者在原有设计模式上所做的细微调整和魔改。尝试为标识符编写测试用例以完全理解它,这是理解标识符不同部分之间的依赖关系的一种非常有用的方法。写测试用例之前,首先需要满足所有的依赖。接下来,了解标识符的可能的入口点和返回值。这能增进你对标识符的理解,助你更上一层楼。最后,尝试重构标识符。在这一步,你已经从单纯地理解标识符迈向足够熟悉以能对其进行修改。随着重构复杂程度的提高,你的理解也将随之增加。此时,如果需要,你能为项目贡献自己的标识符。“源标识符写作”事实证明,不仅仅是写作,它是一组独特的活动,共同帮助人们理解标识符。这似乎比简单的 “写作标识符” 更令人生畏,但它值得付出努力。
现在,你能更加轻松,快乐地“写作源标识符”了吗?