一.为什么要阅读代码
养成阅读高品质代码的习惯,可以提高编写代码的能力。
计算机科学是一门实践性很强的学科,很多内容在书本上根本学不到。就拿项目的组织来说,没有什么书籍专门论述应该如何组织与管理项目的目录结构,因为这本身就是一种见仁见智的活动,要受到各种因素的影响。代码中往往凝聚着许多实践性的知识,通过阅读代码才能真正掌握软件开发的真谛。我们可以将“书籍是人类进步的阶梯”,扩展为”一切承载人类知识的载体,都是人类进步的阶梯。
我曾向一个资深的开发人员询问过,应该如何提高资深的开发与设计能力,他的回答是,广泛的阅读一些现有的框架,比如Apple的开发框架、borland的OWL和Delphi、smalltalk、MFC等,了解他们是如何组织的,计算机科学是这样一门学科,入门十分容易,不需要深奥的教学知识,也没有复杂的物理模型,但要想提高却很难,真正能够叱咤风云,引领潮流的人却少之又少,这就有如人生,在蹒跚学步之时,主要的精力都要放在看脚下的路面上,注意路上的坎坷和荆棘,随着年龄的增长,当走路越来越稳健时,却迷失了方向,不知道应该走向何方,这个时候脚下的路已经不再重要,你需要从先哲们留下的只字片语,别人走过的”路”汲取灵感,确定自己的方向。
因为,学习编写伟大代码的方式是阅读代码,阅读大量的代码,高品质的代码、低品质的代码、汇编语言代码、haskell代码、千里之外的陌生人所写的代码以及我们自己上周刚刚编写的代码,因为,如果不这样,我们就会不断的重做别人已经完成的工作,重复过去已经发生过的成功和错误。
恐怕没有那个伟大的小说家从未读过其他人的著作,没有哪个伟大的画家从未研究过他人的作品,没有哪个技术熟练的外科医生从未观察过同时如何动手术,没有哪个播音747的机长不是首先在副驾驶的位置上观看如何实际操作的。
可是我们却期望程序员能够做到这些(即,不用读他人的代码就能够编写出优秀的代码),”本周的任务是编写……”。我么告诉开发人员语法和构造规则,之后,我们希望他们能够编写出相当于伟大小说的软件。
具有讽刺意味的是,对阅读代码来说,从来没有过比现在更好的时光。感谢开放源码社团所作出的巨大贡献,现在网络上有有数以千兆的源代码,等待我们去阅读。选定任何一种语言,你就能够找到源代码,选择一个问题域,也存在大量的源代码。选择一个级别,从微码到高级的商业功能,您都能够找到大量的源代码。
要养成一个习惯,经常花时间阅读别人编写的高品质代码。就像阅读高品质的散文能够丰富词汇、激发想象力、扩展思维一样,分析设计良好的软件系统的内部结构可以学到新的架构模式、数据结构、编码方法、算法、风格和文档规范、应用车需编程接口(API),甚至新的计算机语言。阅读高品质的代码还可以提高您编写代码的水准。
阅读代码的过程中,不可避免的会遇到一些在实践中应该尽量避免的代码。能够快速的从坏代码中区分出好代码是一项有价值的技能;接触一些编码的反面例子可能有助于您提高这种能力。通过下面这些征兆,可以容易的识别出低品质的代码。
- 编码风格不一致;
- 结构不必要的复杂或难以理解;
- 明显的逻辑错误或疏忽;
- 过度使用不可移植的构造;
- 缺乏维护;
然而,不应该期望能够从编写品质低下的代码中学习到如何正确的编程(看来爱迪生实验灯丝失败时采取的态度在阅读代码中是不可取的);如果将这样的代码作为文献来读,则是在浪费时间,尤其是考虑到现在能够访问到的高品质代码的数量。
请回答这个问题:我正在阅读的代码真的是最好的吗?开发源码运动的优点之一就是,成功的软件项目和想法激励竞争者不断的改进他们的结构和功能。我们常常有幸看到对软件设计的第二次或第三次重复;大多数情况下(但不总是如此)后面的设计要比先前的版本有显著的提高。根据您正在寻找的功能,使用相关的关键词,在web上搜索,可以容易的找到各种互相竞争的实现。
要有选择的阅读代码,同时,还要有自己的目标。您是想学习新的模式、编码风格、还是满足某些需求的方法?或者,您也许只是在浏览代码,获得其中的某些亮点。在这种情况下,要随时准备仔细的研究那些有趣但尚不了解的部分,语言特性(即使您对一种语言了解的很透彻,也不可能尽知它的所有特性,因为现代语言的发展离不开新特性,新的特性总是不断涌向)、API、算法、数据结构、架构和设计模式。
二.什么时候需要去阅读代码
1.修复bug
2.大多数情况下,您阅读代码不是为了修复一个bug,而是为了增加新的功能、修改现存的特性、改编代码使之适应新的环境和需求,或者重构它们来增强代码的非功能性品质。
不同的时候阅读源码采用的方法策略是不一样的,比如情况2,你只需要最小化阅读即可。不必拘泥于下面的一套流程。以下的内容可以拆开来使用,也可以合在一起使用。选择你需要的。下面的流程更多是一种自上而下的阅读方式,当然你也可以采用自底向上的阅读方式,可以先去了解某一块细节,然后在决定了解整体架构。
3.提取重用代码。