大部头与网路短篇

新年前后开始打算学习 OpenGL。按照惯常的思路:像 API 出了小毛病这样小问题靠上网查查资料;像 OpenGL 这样大的主题要找本厚厚的大部头从头到尾慢慢研究。于是我从家里的书架上取出一本搁置已久的《Interactive Computer Graphics: A Top-Down Approach Using OpenGL》 —— 这是我的另外一个习惯:看到感兴趣的先买下来,不管有没有时间学,也不管当时兴趣能持续多久,于是书架上会有不少这样的『储备』(可谓『高束焉,度藏焉』)。不过很多『储备』也并未一直束之高阁下去,日后一旦兴趣恢复也会阅读。所以坚持想买就买的原则,不怕买错也不怕买了不读。

当初买这本《Interactive Computer Graphics: A Top-Down Approach Using OpenGL》之后发现 Windows 对 OpenGL 的支持日薄西山,一下子没了兴趣。不料多年之后转到了Mac OS X —— 对 OpenGL 优化最好的平台之一。也算验证了书不怕搁置的理论。

可惜真正开始读之后发现内容并不理想。这本书是国外大学的教材,有教材的通病 —— 前言和泛泛的介绍罗里罗嗦,而且大部分是以前就了解的知识。好不容易读完了泛泛介绍,后面的内容也不流畅。3D 是一个要求对基础数学和对 API 的了解都很深入的主题。可惜这本书对二者的结合并不理想。讲 API 的时候对需要了解的数学基础一笔带过或者根本不提。也许是因为 3D 实在不是一个很容易在一本书里用一套结构讲述清晰的知识体系。这个主题似乎更需要这样的阅读:分别精读两本书,先完整的学习 3D 的数学工具,比如变换矩阵,homogenous 坐标系,等对数学工具了解透彻再学习一本讲具体 API 的书。

也就是说,当学习的主题越来越脱离具体的产品,学习者就会越来越发现大部头的问题所在。每个大部头都在试图讲解自己的一套体系,但是这套体系会和其它的体系发生很多平行的联系。从根本上说,这是我们需要学校的原因:学校帮助我们组织各个大部头之间的平行联系。另一方面,这也是非计算机专业的人可以通过自学学习计算机科学达到比较高的工作水平的原因,因为计算机科学的各个分支和其它分支的平行联系都比较弱。学习一门计算机科学的分支往往不需要了解其它分支或者需要很少的时间准备一些独立的知识点即可。而像通信、自动化、电力这样的学科分支之间就有比较强的平行联系。

但是无论如何,计算机科学里还是有像 3D 这样与另一门或者几门分支具有较强的复杂平行联系的分支。对于离开学校很久的人来说,学习这样的知识要比学习运用一个数据库或者服务器产品困难很多。

不过我不想再体验学校的学习方式,转而尝试一下应用更多的网络资源 —— 这算是我离开通信行业进入软件业之后养成的一个新习惯。一方面,网络上像 Google 和 Wikipedia 这样的工具在三年前离开通信之后有了很大发展,另一方面,软件行业面临的跨系统的希奇古怪的问题比通信业多出十倍。在通信行业能用官方的文档解决大多数问题。而在软件业里遇到的种种问题,没有 Google 这样的工具是不可能解决的。

结果相当顺利。第一个例子是 OpenGL 的投射矩阵(projection matrix)。《Interactive Computer Graphics: A Top-Down Approach Using OpenGL》对这个概念完全没有任何解释。只是对 gluPerspective() 的效果做了一个简单的介绍。gluPerspective() 只是投射矩阵的一种特例(从它的 glu 前缀就能看出来)。单单介绍这个 API 的作用根本不能理解投射矩阵的意义,而用 Google 搜索『OpenGL transformation』能找到这篇文章,介绍了投射矩阵在整个 pipeline 中的位置;顺藤摸瓜即可找到对投射矩阵的详细解释 —— 而不了解投射矩阵的一个重要相关概念 homogenous 坐标也没有关系,因为这篇详细解释的链接里就指向了这篇。这种超链接的组织是 HTML 的本意,不过整个网站的 wiki 风格说明在 Wikipedia 成功之后,这种知识组织方式才越来越被更多人运用的更为娴熟而超过了书籍。

第二个例子是 OpenGL 的选择模式(Selection Mode)。这次书里很遗憾地有很多基本错误。比如对 gluPickMatrix() 何时调用以及调用前后需要哪些其它 API 的辅助的代码例子都有错误;对 glPushName()glLoadName() 的区别也没有任何解释就直接在代码例子里使用了后者。其实 glLoadName()glPopName()glPushName() 共同使用的一个快捷方式。这种对基本操作不加解释就直接利用快捷方式是很让读者迷惑的。Google 查找『gluPickMatrix』的结果指向这篇,对选择模式的解释很令人满意。

其实,在第一个例子中网上资料比书的解释更详细的时候,我就犹豫是继续按照书的结构学习还是完全采用网上的资料。后来还是决定暂且按照书的组织结构。岂料不过一天就又卡在选择模式这个问题上。经过第二个例子,我倒是发现学习资料的组织结构不像以前认为的那么重要。以前我选择书籍最看重的是组织结构里注重知识的循序渐进,减少或者消除前向引用 —— 就是前面的章节引用后面的章节介绍的概念(哪怕是说明了必要性也很令人不快)。而今天参考网上的资料,不用理会原本的结构如何,遇到不太懂的概念只要在网上顺藤摸瓜即可。

回顾这几年的学习经历,Google 和 Wikipedia 已经彻底的改变了我的学习方式。相比网络上的资料,大部头有更强的知识集中、系统性和结构性。可是这种结构性是出于作者对读者背景和理解力的主观预测。结果往往是详略和节奏都和读者期望的不同。特别是像 3D 这样把数学和具体 API 结合起来的,在不同分支之间有平行联系主题,如果仅靠阅读大部头就需要从头到尾阅读多部,然后主要凭借记忆自己建立起平行联系。

网络上的知识一般被认为是零乱而且缺乏组织的。不过这些年已经不知不觉发生了巨变。首先是个人 blog 的发展让很多作者把网络资料的水准从 BBS 的帖子提高到了出版物的水平。再有,Wikipedia 这样的网站在本身收集知识的同时,也把组织知识的先进方式公开给了所有知识传播者。让 HTML 在传播知识方面有了高层次的范例。最后,Google 让所有这些知识片段按读者的自我需求动态组织成为一个个较大的主题。这三者缺乏任何一种都不可能让网络知识的水平达到传统书籍的水平。而现在的情形是它们的协作已经至少在工程技术领域让网络化组织的知识已经基本可以取代长篇的出版物。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s


%d 博主赞过: