基础扎实和目标明确是提高水平的关键
通过读源代码提高自身水平通常有如下前提:
1、需要熟练掌握书写源代码的编程语言
这一点是显而易见的。在此基础上读源代码可以通过学习进一步提高编程语言的书写技巧。强化学习编程语言时容易忽略或错误理解的细节。
2、需要熟练掌握常用数据结构和算法
逐行阅读代码效率是很低的,如果熟练掌握了常用数据结构和算法,这时源代码在眼里就不再是一行行的表达式,而是具体化了的数据结构和算法。这样在阅读时就不会过于纠缠代码书写的细节,从而可以在全局上掌握源代码的架构,正确理解代码的含义并提高阅读效率。
3、需要掌握目标代码运行的运行环境
任何源代码最终都是需要在特定的运行环境中执行的,如果对运行环境了解不够的话,就无法真正理解代码与运行环境如何交互,自然就更无法理解之后对运行环境返回信息的处理过程了。因此对于解释型语言如 Javascript 或 Python 等等,需要掌握解释器本身的特点,如对异常处理的实现方式等等。对于编译型语言如 C,需要掌握执行时操作系统环境的特点,例如 unix 下的系统调用,Windows 下的应用程序编程接口 WinAPI 等等。还要包括相关的函数库等等。总之,对目标代码运行环境了解越深,就越容易抛开这些细节,专著于代码的逻辑实现。
4、需要掌握书写源代码所涉及的行业知识
计算机系统软件的操作对象一般是计算机本身,因此对计算机相关专业出身的人来讲很容易理解。但计算机应用软件的操作对象大多是非计算机领域的专业内容。例如 gimp,它主要是用来操作图象的。使用它需要学习很多绘画领域的专业知识如色系、滤镜之类等等,阅读源代码时自然也不例外,所以光靠学习计算机专业知识的完全不够的。对于计算机相关专业出身的人来说,学习这些和计算机技术本身八杆子打不着的东西更费脑子。因此如希望开发非计算机技术领域的应用软件,则相关的行业知识自然就跑不了了。
5、需要掌握项目管理的一般内容
为了提高开发效率,现代软件大多是靠团队来完成的。团队就意味着管理,典型的例子如版本控制系统的大量应用,以及模块化的设计理念。这些在客观上增加了源代码组织上的复杂度。因为管理信息的介入,很多源代码书写时会大量应用宏定义、条件编译、编译时常数之类方便管理的手段,造成源代码读起来不够直观。所以读源代码时,首先需要掌握一些项目管理知识,由此可以轻易地识别并分离掉那些为了管理而存在的内容。从而有效地避免这些信息对阅读造成的干扰。
6、需要掌握相关的开发工具
除了规模很小的源代码以外,大量源码开发都会使用一些可以提高效率的开发工具。但这些开发工具为了更有效地控制代码结构和格式,通常会自行加入一些固定的代码段,例如预定义模板中的内容等等。这使得最终生成的源代码由于在形式上过度分离显得“缺乏人味”,更象是适合“机器”阅读的东西。客观上造成了阅读的困难。因此阅读源代码者,必须对源代码相关的开发工具有足够的重视。只有对开发工具产生的效果有足够的认识,才能降低阅读这类源代码的难度。
综上所述,在选择阅读源代码,提高自身水平时。应根据自身当前的技术实力以及预定的发展方向来选择适合的源代码。
例如想搞计算机系统软件的研究和开发,如果去读 gimp 这样的源代码不光阅读困难而且意义就不大。
又如阅读 linux 内核源代码,linux 内核是用来管理计算机系统的所有硬件,并向用户层提供抽象接口的。这意味着读 linux 内核需要对计算机硬件有相当程度的熟悉,这个要求是非常高的。如果阅读者主要学习的是计算机软件开发,虽然对编程语言及操作系统接口比较熟悉,但通常对计算机硬件远没有专门学习计算机硬件专业的人熟悉。这样即使强行阅读 linux 内核也是勉为其难,效果不佳自然在情理之中。
因此我个人的经验是选择一款源代码规范、代码规模不大、和操作系统交互简单,且属于计算机系统软件范畴的源码来阅读。
在这里我推荐阅读 lighttpd,理由是:
1、规模适中:这是款轻量级 Web 服务器,不象 Aapche 那种具备工业级强度(除了性能外还意味着扩展性强带来的复杂架构)。就是实现一个 Web 的服务端功能,因此结构简单容易在全局上把握。
2、平台专一:是典型的 unix 风格软件,在 Windows 平台上是通过 Cygwin 移植的。这也就意味着读它时不会过于受跨平台设计带来的影响。
3、结构清晰:尤其是其中的网络引擎的设计,堪称经典。
4、实用性高:现代互联网几乎算得上是 “Web网”。因此掌握 Web 服务器的开发,乃至自行设计一个完全由自己掌控并能根据自己需要随心所欲修改的 Web 服务器,对以后的开发、调试、研发新品,甚至学习安全类知识(你懂的)等等都是非常有益的。
再多说几句:如果LZ有兴趣且发展方向相近的话,建议去下载 lighttpd 来阅读。当时我本人在设计自己的服务器 mws 时,一开始也是阅读的 lighttpd。这个过程大约持续了 5 个月,但让我直到现在都大受其益。