关于战略问题的通信之六(译文)

作者: 阮一峰

日期: 2009年3月30日

珠峰培训

《Joel谈软件》一书的翻译,我好久没提了。

合同规定今年1月交稿。假定我没有违约的话,此书现在应该上市了。可是,实际上......就算到下个月,我恐怕都翻译不完。......我也不想多解释了,反正这本书现在是我最大的烦恼,只能争取今年夏天上市了。

下面的文章是该书的第21篇。

=========================

关于战略问题的通信之六

作者: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年创立。

(完)

QCon

腾讯课堂

留言(20条)

浏览了一下中文:

1). Sandbox 好像译成“沙盘”的比较多;

2). 这一部分的最后一段 -“那么,未来会怎样?获胜的一方所采取的策略,正是贝尔实验室在1978年做出的决定,那里的科学家决定开发一种跨平台的、高效的编程语言,这就是后来的C语言。”

从上下文和原文看,这种新的编程语言还未出现,所以是否可以改为“那么,未来会怎样?将来的赢家所采取的策略,将类似于贝尔实验室在1978年所寻找到的解决方案,即开发一种像 C 语言那样跨平台的、高效的编程语言。”

3). 倒数第二段的 nail polish 超过 2GB 好像不太好理解,不知 nail polish 是另有所指还是作者纯粹在说笑。

@stardust


3). 倒数第二段的 nail polish 超过 2GB 好像不太好理解,不知 nail polish 是另有所指还是作者纯粹在说笑。

我觉得 Nail Polish 应该是指U盘吧,觉得应该是说笑成分居多。

可以理解成,连我的羊城通里头的存储器都不止2G啦!!!


@stardust

1). Sandbox 好像译成“沙盘”的比较多;

看到的翻译成"沙箱"也比较多。应该没有什么问题

2). 这一部分的最后一段 -“那么,未来会怎样?获胜的一方所采取的策略,正是贝尔实验室在1978年做出的决定,那里的科学家决定开发一种跨平台的、高效的编程语言,这就是后来的C语言。”

从上下文和原文看,这种新的编程语言还未出现,所以是否可以改为“那么,未来会怎样?将来的赢家所采取的策略,将类似于贝尔实验室在1978年所寻找到的解决方案,即开发一种像 C 语言那样跨平台的、高效的编程语言。”

没有看英文原文,但觉得stardust的解释更合理一些。在读阮兄的翻译时读到这里也有些疑惑。因为下文接着说“这种语言可以将程序编译成不同平台、不同系统可以理解的“本地”码(各种不同的Javascript和DOM就是本地码)。”显然C语言是无法完成这种工作的


To stardust:

谢谢你看得那么仔细,让我觉得很有压力,呵呵。

1)我认为这里的sandbox指的是一个中间层,译成“沙盘”容易让读者联想到“沙盘推演”,所以我译成了“沙箱”。

2)你的译文更符合原文,确实比我说。不过,忍不住小声嘀咕,我觉得我也没错,因为C语言在贝尔实验室在1978年发布的。

3)我在网上查nail polish足足查了半小时,没发现有其他意思,所以只好按照原意译了出来。

本文成文较早,虽提到了CPU和内存一直在变快这一事实,但没有提到浏览器执行Javascript的速度的提高。
补充一下,文中提到NewSDK有数不清的右括号,其实就是暗指Lisp了。Joel和Paul Graham都是Lisp的狂热支持者。

书出的时候请在博客上说明,或者发一封邮件告知,谢谢!看了这么久您的博客,也转载了很多篇您的文章,如果您出书我一定会买的。

很少见如此高水准的译文

請問有計畫出繁體字版嗎?

引用Kevin的发言:

請問有計畫出繁體字版嗎?

大陆的人民邮电出版社只购买了简体中文版权,所以应该不会出繁体字版。

如果台湾有出版机构愿意引进此书,可以写信给我,我会帮忙联系。

刚才看了楼上的留言去看了下LISP的相关知识......
对于一个C++程序员来说,这种语言简直简洁的令人崩溃.....
让我感觉有点像shell脚本的编写........
而且确实有着数不清的右括号...

其实这个newSDK要是出来,很可能是先被Google给做出来。这就是Google这家公司与众不同的地方啊,唉!

等著買書。3) 中的nail polish根據全文看,可能是指AJAX代碼 - AJAX和指甲油的功效都是看起來亮閃閃地改善了用戶體驗。另外nail和mail發音接近,所以作者會從gmail跳到nail polisher咯。

引用Ruan Yifeng的发言:

3)我在网上查nail polish足足查了半小时,没发现有其他意思,所以只好按照原意译了出来。

引用arbeitandy的发言:

nail和mail發音接近。

你点醒我了,这里是指他们的指甲油都不止2克!

真是太感谢了。

sandbox翻译为“沙盒”比较恰当,在计算机软件和测试流程中sandbox指一套介于原型与成熟版本之间的开放的中间阶段。
和“沙盘”推演有相似之处,沙箱听起来比较别扭,沙盒这个词接触得比较多也比较熟悉了。

读你的文章,突然感觉释然了:是阿,说自己想说的话,做自己想做的事情,日子就是这样de过,平实而有韵味。。。

640KB 就在做3D了,真的是周而复始

呵呵,你的日志,真的很好看。特别是90年代就开搞电脑。

看到你最新的关于LISP的译文,忽然想起从前这篇里“nail polish”的问题。我现在怀疑这是从thumbnail(缩略图)引申来的——我们thumbnail上涂的油就不止2GB,何况是thumbnail,何况是图片本身?

引用必填的发言:

忽然想起从前这篇里“nail polish”的问题。我现在怀疑这是从thumbnail(缩略图)引申来的

后来出版时,我的注解是这样写的,我现在还是觉得这个解释更合理一些:

“在英语中,mail(邮件)和nail(指甲)发音相近。这里的意思是,孩子们将2G空间的电子邮件听成2克(2g)的指甲油,因此嘲笑说他们的指甲油都不止2克。”

引用Ruan YiFeng的发言:

孩子们将2G空间的电子邮件听成2克(2g)的指甲油,因此嘲笑说他们的指甲油都不止2克。”

可是拒绝与国际接轨的的美国人几乎不用克做单位……

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接