作者:Joel Spolsky
译者:阮一峰
原文网址:http://www.joelonsoftware.com/items/2007/09/18.html
发表日期 2007年9月18日,星期二IBM公司最近发布了一套开源Office软件,叫做IBM Lotus Symphony,看上去大概是根据StarOffice
[1]修改的。但是,我怀疑起这个名字的真正目的,可能是想清除人们对最早那套Lotus Symphony
[2]的记忆。那套
软件在发布之前,被吹得天花乱坠,简直就像耶稣要复活一样,但是在发布之后一败涂地。它就是软件业中的Gigli
[3]。
上个世纪80年代后期,Lotus公司努力地想找到下一步的方向,升级他们的旗舰产品——电子表格和作图软件Lotus 1-2-3。他们很自然地就想到了两条路。第一条路是往软件中加入更多的功能,比如文字处理功能。这就是Symphony这个产品的由来。第二条看上去很显然的路,是做一个3D电子表格软件。这就是后来Lotus 1-2-3的3.0版本。
这两条路一开始就遇到了一个大麻烦:在古老的DOS环境中,内存占用不得超过640K。那个时候,IBM已经开始少量出售配备80286芯片的个人电脑,这种新的芯片能够提供更多的内存。但是,Lotus公司觉得,为这种售价高达10000美元的电脑开发专用软件,市场不会很大。所以,他们一个字节、一个字节地压缩,花了18个月,才将Lotus 1-2-3的新版本塞进了640K的内存中。但是,最终在白白浪费了许多时间之后,他们不得不放弃了3D功能,因为没有足够的内存可以塞进去。Symphony的遭遇也差不多,许多功能都被砍得干干净净。
这两条路都走错了。当Lotus 1-2-3的3.0版本上市的时候,每个人家中都已经有了一台80386芯片的电脑,配备了2MB或者4MB的内存。至于Symphony,它的电子表格功能很弱,文字处理功能也很弱,所有其他功能都很弱。
“够了,老同志,”你们会说。“谁如今还关心那些老掉牙的、只能在字符模式下运行的软件?”
请暂且忍耐我一分钟,因为历史正在以三种不同的方式重演。那么,最聪明的应对策略,就是压宝在同样的结局上面。
低速CPU和小容量内存的环境从最早的时候一直到大概1999年,程序员都极其关注软件的效率问题。在这段时期中,内存空间总是不够大,CPU主频也不够高。
到了20世纪90年代后期,一些像微软和苹果这样的公司,开始注意到摩尔定律
[4](其实它们只比别的公司早了一点点)。它们认识到,不必太在意软件的效率问题和内存占用……只要把很酷的功能做出来,然后等着硬件升级就可以了。微软公司首次发布Excel的Windows版本的时候,80386电脑还非常贵,实际上没什么人买得起,但是微软公司很有耐心。只过了几年,80386SX
[5]出来了,兼容机的价格下降到1500美元,你只要买一台,就能运行Excel。
由于内存的价格直线下降,CPU的速度每年都在翻番,所以作为一个程序员,你就面临选择。你可以花6个月用汇编语言,重写程序的内循环(inner loop)。你也可以休假6个月,找一支摇滚乐队当鼓手。不管是哪一种选择,6个月后你的程序都会运行得更快。实际情况是没有程序员真的喜欢用汇编语言编程。
所以,我们都不怎么关心软件的效率或优化问题。
不过有一个例外,那就是在浏览器的Ajax应用程序中使用的JavaScript语言。因为这是当前几乎所有的软件开发工作的方向,所以这是一个重大的问题。
眼下的许多Ajax应用程序,有一百万行甚至更多的客户端代码。现在的瓶颈已经从内存和CPU,转移到了带宽和编译时间。你真的必须想尽办法进行优化,才能使复杂的Ajax程序有良好的表现。
但是,历史正在重演。带宽正在变得越来越便宜,即使这样,还是有人在考虑如何对Javascript进行预编译(precompile)。
有一些程序员将大量的精力投入优化工作,要将程序变得更紧凑和更快速。某一天,他们醒来后将发现,这种努力或多或少是白忙一场。如果你喜欢用经济学家的口吻夸夸其谈,那么你最低限度可以说,这种努力“不会带来长期的竞争优势”。
那些不关心效率、不关心程序是否臃肿、一个劲往软件中塞住高级功能的程序员,在长期中,将拥有更好的产品。
跨平台的编程语言C语言的原始设计目标,就是为了让编写跨平台的应用程序变得更容易。它很好地实现了这个目标,但是并不是真的100%跨平台。所以,后来又出现了Java,它的通用性甚至要超过C语言。历史大概就是这样啦。
眼下,在跨平台这出连续剧中,正出现又一个高潮,那就是——没错,你猜对了——客户端Javascript的兼容性问题,尤其是浏览器DOM(文档对象模型)的兼容性问题。编写一个网络应用程序,让它在所有不同种类的浏览器上都能运行,这简直是一场可怕的噩梦。你根本找不到其他方法,只能精疲力竭地在Firefox、IE 6、IE 7、Safari和Opera上一一测试,猜猜发生了什么事?我没有时间在Opera上测试,所以只好不管Opera了。这意味着,新兴的互联网浏览器根本不会获得立足的机会。
未来会怎样?当然,你可以在心里企盼或祈求,微软公司和Firefox能够制作出更具备兼容性的产品。 祝你好运。不过,你还有另外一个选择,就是使用p-code虚拟机
[6]或者Java虚拟机模型,你在底层系统之上建立一个小小的沙箱(sandbox),再将软件的运行建立在沙箱之上。这样做的不利之处,就是沙箱有很多缺陷,它们非常慢而且错误百出,这就是为什么Java applet
[7]都死光光的原因。建立一个沙箱,你就等于走上了一条不归路,你能得到的运行速度只有底层系统的1/10,你也无法利用任何一个只有某个底层系统支持、而其他底层系统都不支持的特性。(直到今天,我都在翘首期待,有人能向我展示可以在智能手机上使用的Java applet。它能利用手机的所有功能,比如拍照、读取地址本、发送短消息、与全球卫星定位系统GPS互动等等。)
沙箱在过去行不通,在将来也不会行得通。
那么,未来会怎样?获胜的一方所采取的策略,正是贝尔实验室在1978年做出的决定,那里的科学家决定开发一种跨平台的、高效的编程语言,这就是后来的C语言。这种语言可以将程序编译成不同平台、不同系统可以理解的“本地”码(各种不同的Javascript和DOM就是本地码)。至于怎么编译,那是编译器作者需要解决的问题,与你无关。代码编译后的运行效果,与“本地的”Javascript直接运行完全一样,能够以一种统一的方式获取DOM模型的全部潜力,能够自动地和跨平台地,与IE和Firefox的核心代码融合在一起。对的,它还完美地支持CSS,能够以一种令人惊骇、但是事实证明是正确的方法,让你玩转CSS,所以你永远都不必为CSS的不兼容问题发愁。再也不会这样了,永远不会了。哦,等这一天到来的时候,该是多么美好啊。
完善的互动性和用户界面标准IBM 360大型机(mainframe)使用一种叫做CICS
[8]的用户界面,你今天在飞机场还能看到这个系统,你只要在办理登机手续的柜台上弯下身子就能看到。这种界面是80字符宽、24字符高的绿色屏幕,只有字符模式,没有图形界面,这是肯定的。主机发送一个表单给“客户端”(一台IBM 3270智能显示终端)。这个“客户端”是智能的,它知道如何将表单呈现给你,允许你将数据输入表单,在这个过程中,根本不与主机通信。这就是IBM大型机如此强大、远远超过Unix系统的原因之一,因为CPU根本不需要处理你的行编辑,这种任务由智能终端承担了。(如果你做不到为每个人都配置一台智能终端,那么你就去买一台System/1小型机,充当主机和哑终端
[9]之间的中介,为你承担表单编辑的任务。)
不管怎样,只要你填完了表单,按下“发送”键,你输入的所有数据就被送回服务器端处理。然后,服务器端又给你发来一个新的表单。整个过程周而复始。
一切都很棒。但是,如果你想在这种环境下,使用文字处理软件,你该怎么办?(你真的无法如愿。在大型机上从来都没有过一个像样的文字处理软件。)
这就是历史上的第一阶段。它与互联网时代的HTML阶段正好对应。HTML语言就是带有字体变化的CICS。
等到历史进入第二阶段,所有人都在写字桌上配备了PC。于是,突然之间,也不管程序员本人愿不愿意,他就是具有了在任意时间、任意场合,随意操弄屏幕上任意角落的任意文字的能力。实际上,你可以获取用户打字时的每一次击键,因此你就能做出一个很好很快的应用程序,不必等到用户按下“发送”键,CPU就能提前介入,做出相应的处理。比如说,你可以开发一个文字处理软件,一旦当前行快要写满了,软件就会自动换行,将结尾的最后一个词移到下一行的行首。一切都在瞬间完成。哦,我的老天,你能做到这一点?
第二阶段也有自己的问题,那就是缺乏一个明确的用户界面标准……程序员具备了空前强大的决定权,几乎可以随意按照自己的偏好来制作软件,因此每个人都用不同的方式写软件,这就给用户带来了困扰,如果你会用X软件,这并不代表你就会使用Y软件。WordPerfect
[10]和Lotus 1-2-3有截然不同的菜单设计、截然不同的键盘接口和截然不同的指令结构。在程序之间复制数据,根本没有可能。
这也正是我们今天在Ajax开发中面对的局面。当然,不可否认,Ajax应用程序的易用性比第一代DOS应用程序,有了很大的提高。因为从那时开始,我们已经学到了不少经验。但是Ajax应用程序没有规范的标准,如果想要协同工作,非常麻烦。你完全没有办法,将对象从一个Ajax应用程序中,剪切和粘贴到另一个中。举例来说,我就不太确定,你怎样才能将Gmail中的图片传到Flickr中。拜托,老兄,剪切和粘贴在25年前就发明出来了。
在历史上的第三个阶段中,出现了配备Macintosh操作系统和Windows操作系统的PC。一个统一的、标准的用户界面诞生了,包括多窗口和剪贴板这样的标准功能,这使得在多个程序间进行协同工作成为可能。这种崭新的GUI(图形用户界面),带给我们易用性和实用性的飞跃,导致了个人电脑爆炸式增长。
因此,如果历史会重演,我们就可以期待总有一天,Ajax程序的用户界面会出现某种程度的统一,它的诞生方式就如同Windows的诞生方式一样。总有人会写出一个具备压倒性优势的SDK(软件开发工具包),其他人就可以用它来开发功能强大的Ajax应用程序。不同的程序员使用同样的用户界面组件,使得开发出来的程序可以协同工作。那种赢得最多程序员认可的SDK,就具备了垄断性的竞争优势,堪称可于微软用Windows API获得的竞争优势媲美。
如果你是一个互联网开发者,你不想用别人都在用的主流SDK,那么越来越明显地,你将发现没有用户使用你的程序。原因其实你知道的很清楚,那就是你的程序不支持剪切和粘贴,无法进行地址本同步,也做不到其他所有在2010年流行的新奇的互动功能。
比如,请想像一下,假定你是Google公司的负责人,你为自家有Gmail这样的产品,感到沾沾自喜。但是没过多久,某家你从来没有听到过的公司,——很可能是一家桀骜不驯的初创公司,背后有Y Combinator
[11]的资助——开发出了一种NewSDK,销售状况好得难以置信。这种NewSDK使用一种性能优异的跨平台编程语言,可以直接编译生成Javascript,而且更出色的是,它还配备了一个大型Ajax库,能够执行所有种类的智能性的互动功能。不仅仅是剪切和粘贴,还有一些很酷的聚合(mashup)功能,就像同步和单点身份管理(single-point identity management)。有了单点身份管理,用户就不必将自己正在干什么告诉Facebook和Twitter了,只需要在网上任意一个支持这个功能的地方,输入就可以了。你对这一套NewSDK嗤之以鼻,因为它的大小居然高达惊人的232MB!……232MB啊!……编译生成的Javascript,单单载入一个页面就需要76秒。所以你认定,自家的应用程序Gmail不会流失任何用户。
但是就是从那时起,就当你在Google总部里、坐在Google式座椅上、细细品味Google味咖啡、感到洋洋得意、沾沾自喜、高枕无忧、踌躇满志的同时,新版本的浏览器发布了,支持缓存编译后的Javascript。于是,突然之间,NewSDK的载入速度变得真的很快。Paul Graham又及时地向这家初创公司补充了6000包方便面,让他们饿的时候有东西吃。这样一来,这家公司又可以继续运营三年,将产品不断完善。
你手下的程序员,不管是张三还是李四,都有相同的看法,那就是Gmail太庞大了,无法移植到那个呆呆的NewSDK上面去。如果那样的话,我们就必须改变每一行的代码。这接近于完全重写整个程序,太可怕了。整个系统模型会一团混乱,充满了嵌套。NewSDK使用的跨平台编程语言用到的括号,多得连Google也无法承受。几乎每一个函数的最后一行,都是一个包含连续3296个右括号的字符串。你因此不得不去买一个特殊的编辑器,才能数清到底有多少个右括号。
后面的事情是,NewSDK的工程师又发布了一个相当不错的文本处理软件,以及一个相当不错的电子邮件应用程序,还有一个杀手级的Facebook/Twitter式的事件发表器,能够将网上与你有关的所有事情都进行同步。人们开始使用他们的产品。
就在你不知不觉之间,所有人都开始编写基于NewSDK的应用程序。这些程序的表现真的很好,一转眼,产业界点名只想用基于NEWSDK的应用程序。所有老式的纯Ajax应用程序看上去都变得很寒酸,它们做不到剪切和粘贴,不能够聚合和同步,互相之间无法很好地协同工作。Gmail就这样成了遗迹,好比Email程序中的WordPerfect。未来的某一天,你对孩子们说,曾几何时当你得到2GB的空间储存Email时,你是多么激动。孩子们全都嘲笑你,他们的指甲油都不止2GB。
你是不是觉得这个故事太荒诞不经了?那你就将“Google Gmail”替换成“Lotus 1-2-3”。NewSDK将是微软公司Windows传奇的重现。整个过程完全是Lotus公司如何丢失电子表格市场的重演。在互联网上,这种事情将再发生一次,因为现在所有影响市场的因素和背后的动力,同当年完全一样。我们唯一不知道的就是,它到底发生在何时、何地、何人身上,但是它一定会发生。
注释:[1] StarOffice是Sun公司发布的一套Office软件,它的源代码在2000年7月开源,成为了后来的OpenOffice的基础。
[2] Lotus Symphony是Lotus公司在1984年发布的一套Office软件,在DOS环境下运行。1995年,IBM公司以35亿美元的价格,并购了Lotus公司。
[3] Gigli是一部2003年上映的美国电影,主演中包括Ben Affleck、Jennifer Lopez、Al Pacino等大明星。由于Ben Affleck和Jennifer Lopez在拍摄过程中爆出绯闻,这部电影在上映之前被大肆宣传,但是上映之后,口碑极差,被认为是有史以来最滥的电影之一。
[4] 摩尔定律(Moore’s Law)是指大约每隔18个月,芯片的晶体管容量比先前增加一倍,同时性能也提升一倍,而价格下降一半。这个定律描述了硬件的发展趋势,由Intel公司的共同创始人Gordon E. Moore在1965年提出。
[5] 80386SX是80386芯片的一个低价版,后者在1986年上市,前者在1988年上市。
[6] P-code是软件编译过程中产生的一种中间代码,不同于最终的机器码,可以使得编程语言不依赖于特定的平台或硬件。
[7] Java applet是用Java语言编写的、镶嵌在网页的小应用程序。它需要计算机安装了Java虚拟机以后才能运行。
[8] CICS是Client Information Control System(用户信息控制系统)的缩写。
[9] 哑终端(dumb terminal)就是连接主机而不做任何计算处理的终端机。
[10] WordPerfect是Coral公司拥有的文字处理软件,在20世纪80年代末和90年代初流行一时,是事实上的文字处理软件标准。后来,被微软公司的Word取代。
[11] Y Combinator是一家创业投资公司,专门为创业者提供种子资金。该公司由Paul Gramham等人在2005年创立。