按:本文发表于2007年11月《程序员》杂志。一些读者要求将此文发表于网上,现经征得原作者同意,在本人博客上将此文予以转载。
随着OOXML与ODF的竞争为世人所知,微软又一次与开放扯上了关系。9月初OOXML在ISO的投票失败之后,就免不了有一批微软的粉丝们忿忿不平,他们很无辜地质问道,不是要一个开放文档标准吗?OOXML不是开放文档标准吗?为什么要反对呢?难道微软提出的开放标准就不是开放标准吗?当然对面阵营的人士也不含糊,他们凭直觉抗拒把微软与开放并列,并且质疑OOXML厚达数千页的说明规范是一种阴谋,或者至少会反对在ODF之外另立一个开放文档标准。不过不能否认,仅从法理上看,OOXML的开放性并不存在什么问题。其唯一的问题就是OOXML背后的名字——微软。在越来越开放的软件产业里,微软几乎是传统封闭势力的最后一块保留地。尽管做出了一些小的、无足轻重的姿态,但是在整体上讲,它仍然强硬地抗拒开放的趋势,禁止在自己的几乎任何产品和项目中使用和参与开放软件,并且在各种场合散布反对开源的观点,试图使人们的思想重新回到十数年前的状态。这些都不假,但是具体到OOXML这件事情上,微软的“开放性”似乎又确实无可指责。这就给我们讨论这一话题带来了困难:总不能仅凭臆测就妄断是非曲直吧。
在这种时候,讲一点实证主义是有好处的,认真地了解一点历史故事,看看历史上微软在开放标准领域的所作所为,有助于我们更好地理解现在正在发生的事情。
很遗憾的,在微软不长的历史中,每次与开放扯上关系,几乎都是充当反面教员的角色。人们记忆犹新的,如微软分化和吞噬Java的企图,在Web标准方面与W3C唱对台戏的故事。然而有一段几乎被人遗忘的精彩故事,其实却能更全面、更深入地揭示微软对于开放标准的策略和手段。现在就让我们来回顾一下这个充满了权谋、利诱、屈膝投降和最终悲剧收场的真实往事。
1. 和平年代
这段往事发生在实时3D计算机图形API领域。
计算机图形学就是用数学计算和软硬件手段在计算机输出设备上绘制图形的学问,1970年代以来,随着相应设备和研究的进展,计算机图形学获得了快速的发展。人是视觉动物,因此图形毫无疑问是计算机最重要的应用领域之一。一开始,计算机图形的主要应用是在科学和工程方面,比如统计图表、CAD等。1970年代末期,视频游戏出现了,计算机图形学很快从壁垒森严的国家实验室和军方研究机构走出来。不过那个时候很少有人想到,计算机图形最终能够实施绘制以假乱真的三维真实感图形,营造一个虚拟现实。
1992年斯皮尔伯格的《侏罗纪公园》引起全球轰动,计算机绘制真实感图形的能力已经无人质疑,而这一领域的进展将给游戏、CAD、教育、科学、管理和军事等几乎所有IT应用领域带来完全革命性的变化。毫无疑问,这个领域是兵家必争之地。
但是怎么个争法呢?做图形硬件?当然好,但是很快就会有竞争对手。做应用软件或者游戏,不错,不过也是局限于一时之争。在IT领域里,真正高层次的竞争是工业标准的竞争,那么在计算机图形领域里,最重要的工业标准是什么呢?毫无疑问,就是图形API。所有的开发者都希望用统一的方式编写图形程序,这就给在这个领域里形成工业标准创造了条件。一旦这样的API标准出现并且被接受,那么所有的硬件设备制造商都得老老实实地实现这个API标准,并尽量对它实施优化件,所有的平台制造商都得支持这个API标准,所有软件开发商都得在这个API之上开发图形软件。谁要是掌握这个标准,就可谓挟天子以令诸侯,一呼天下应。意识到这一点,就不难明白,3D图形API是影响整个计算机图形工业的重大标准,兹事体大,不可等闲视之。也正是因此,绝不应该让这么重大的技术标准落入一家把持之下。
在当时,因为《侏罗纪公园》绘制逼真的恐龙场景而闻名于世的SGI当然是这个领域的领先者,事实上,当时SGI手上有三大法宝——其一是SGI图形工作站,其二是专门针对图形应用而优化的UNIX变体IRIS,其三是被称为IRIS GL的3D真实感图形API。这个IRIS GL这是经过在SGI工作的顶尖计算机图形学专家和工程师们数年心血的结晶,干净、清晰而且非常先进,在当时可谓无人可望其项背。
SGI本来坐居高端图形产业的顶峰,似乎可以高枕无忧。不过当时SGI也发现独孤求败的滋味并不好受,至少业绩的进一步成长受到了明显的限制。于是SGI决定将IRIS GL开放出来,让它尽快成为工业标准。SGI完全就是无私奉献吗?它是不是想凭借OpenGL控制图形工业?我们不得而知,不过无论是当时还是事后来看,这一举动有巨大的进步意义。相关厂商一拍即合,1992年初,OpenGL体系结构审核委员会(OpenGL Architecture Review Board,简称OpenGL ARB)正式成立,当年7月,经过认真审核和提高的OpenGL 1.0规范正式出炉,标志着3D图形API正式步入开放时代。
实事求是地说,虽然已经冠以“Open”的名号,不过OpenGL当时很大程度上还是受SGI影响的。你要在自己的平台上实现OpenGL,就得给SGI缴纳授权金。当然,也不是SGI一家独大,否则谈何开放?所谓开放,实际上是指OpenGL标准在制订过程中,ARB成员都可以充分讨论,自由发表意见,就标准的大小问题投票。应该说,这一过程还是能够保证标准的公平、公正和公开,在当时是相当不错的了。实际上Java刚出道的时候,也差不多是这个模式,在开源还没有大行其道的时候,这就算是开放了。当然,按照今天的标准,这个开放的程度还很不够,抚今追昔,今天的计算机用户和程序员,着实应该好好感谢1990年代末期的开源运动。
在OpenGL ARB的创始成员中,微软的名字赫然在列。那时候的微软,尽管还没有后来那样不可一世的霸气,但是也已经非常强大,它会甘心全心全意支持OpenGL的发展吗?
我们现在当然无法了解当时微软对于OpenGL的真实态度,但是最初微软的表现还是不错的。当时Windows NT正在研发当中,其主要的目标之一就是与基于UNIX的图形工作站竞争,因此微软内部的一个小组积极支持了Windows平台的OpenGL发展。随着PC上图形硬件的飞速发展,大约在1990年代中期,PC终于可以与高端图形工作站相比,在这个过程中,Windows与OpenGL之间的关系,即使不能用蜜月来形容,至少也是相当和谐的。
另一个很重要的原因,就是微软此时在图形领域还羽翼未丰,甚至可以说,还相当幼稚,根本不具备跟SGI相抗衡的实力。著名的WinG事件就暴露了当时微软在图形领域的薄弱实力。那个时候,Windows 3.0/3.1已经开始大肆流行,可是PC上所有像样子的图形和游戏程序无一例外是在DOS下直接访问视频缓冲区,Windows的GDI本身就是为静态图形设计的,在当时的硬件上慢得要死,因此还冒出来一种叫做“Windows图形加速卡”之类的硬件来帮助Windows GDI图形加速,根本就自身难保,别提还在上面开发高性能动画图形程序了。不过微软已经明确Windows就是它的未来,因此努力试图证明Windows可以成为合格的游戏开发平台。大约在1994或1995年,微软推出了一个叫做WinG的图形开发包。这个开发包的主要功能,就是帮助图形开发者在Windows 3.0/3.1中快速绘制2D图形,从而实现动画功能。WinG实际上是一组DLL,安装之后,它将替换Win16中CreateDIBSection()、SetDIBColorTable()、BitBlt()和StretchBlt()等API,并通过提供一种被称为WinGDC的设备上下文,提供对图形数据双向读写的能力,从而实现快速的像素矩阵Blit。那个时候的游戏和动画主要是2D的,衡量性能的核心指标就是Blit的速度。所以WinG也算是门当户对。笔者还记得当年运行WinG中的一些例子,屏幕上的窗口里眼花缭乱地快速绘制彩色方块和线条,看上去确实不慢。但是很显然,微软那时根本就不理解图形和游戏程序员的需求,WinG这个东西既没有提供直接访问视频缓冲区的能力,有没有提供高层的图形API,如同鸡肋,从来就没有流行开,从而也迅速被微软抛弃。事后,微软甚至根本就不承认WinG的存在,此事被传为“佳话”,为天下笑。在这样的局面下,微软对OpenGL采取合作态度,也是时势使然。
不管怎么样,这是一段风平浪静的和平年代。
一切看上去都很好,当PC图形硬件进一步发展,传统上用于科学与工程领域的OpenGL在游戏领域中也开始显现出巨大的潜力,它成熟、强大、干净而且特别适合于教学,似乎没有什么能阻挡OpenGL成为PC游戏的首选图形API。然而就在同时,随着Windows 95的巨大成功,微软成为业界霸主,实力空前壮大,心态也就悄悄发生了变化。1996年9月15日,微软在刚刚发布的DirectX套件中附带了一个被称为Direct3D的新组件,并且开始在各种场合宣称散步对OpenGL不利的言论,企图让程序员相信Direct3D才是专门针对游戏的3D图形API。美好的和平时代终结了。