我的第一次BillG审议

作者:周思博(Joel Spolsky)
属于Joel on Software, http://www.joelonsoftware.com

很久很久以前,Excel有一个功能非常弱的程式语言。我们叫它「Excel巨集」。它实在是一个很蹩脚的程式语言,没有变数(你得把数值存在工作表的储存格里),没有区域变数(locals),没有副函式呼叫,简单的说它根本就不能维护。它有像是Goto这样的先进功能,但是实际上看不到标记(labels)。

惟一一件看起来合理的事,是它看起来比Lotus的巨集要好,后者只不过是储存一长串的按键,像长字串一样的被存在储存格里。

1991年6月17日,我进入微软开始在Excel团队工作。我的职称是程式经理。我的责任是为这个问题带来解决方案。隐含的期待是这个解决方案要跟Basic程式语言有关连。

「Basic?没错!」

我花了些时间与不同的开发团队沟通。Visual Basic 1.0 刚刚诞生,而它实在是非常地酷。私底下有个方向错误的计画在进行着,代号是「巨集者」,另一个想造出物件导向Basic 的计画「银色」也进行中。「银色」的团队被告知它们的客户就是Excel,而「银色」的市场经理Bob Wyman(是的,就是那个Bob Wyman)只有一个销售对象:就是我。

巨集者就如我所说的方向错误,虽然游说花了一些工夫,最后还是把它终止了。Excel团队说服Basic团队,说我们真正需要的是某种给Excel用的Visual Basic。我想法子要Basic加入四个可爱功能。我要他们增加Variant,一个可以包含任何资料结构的大一统型别(否则就得动用switch述句,才能把试算表储存格内容存到变数里)。我让他们加入了晚期系结(late binding),后来被称为IDispatch(又名COM Automation),因为「银色」的原始设计要求使用者深入了解资料型别系统,但是写巨集的人根本就不会管这些东西。我又加了两个语法:从csh偷来的’For Each’,以及从Pascal偷来的’With’。

然后我坐下来开始写Excel Basic规格,一份后来长达数百页的超大文件。我想当它完成时应该有500页吧。(「瀑布开发法」,你窃笑着。是啊是阿…你闭嘴吧!)

当时我们习惯有BillG审议这档事。基本上每个重大功能都得经过比尔.盖兹的审查。有人叫我在审查前先送一份规格到他的办公室,那是一大叠用雷射印表机印出的文件。

我急忙把规格印出并送到比尔的办公室。

那一天我还有点时间,所以开始想弄清楚,Basic里是否有足够的日期时间函式,足以完成所有在Excel能做到的事。

在大部分的现代编程环境中,日期会被储存成实数。整数部分是过去某个大家协议好的过去日期(叫做纪元(epoch))到今天的天数,今天的日期2006年6月16日在Excel中会储存成38884,就是1900年1月1日为1开始数出的天数。

我开始浏览Basic中各种时间日期函式与Excel中的各种时间日期函式,做各种尝试,而我注意到Visual Basic的文件中有些不寻常,Basic用1899年12月31日当做纪元而非1900年1月1日,但是基于某种原因,今天的天数在Excel跟在Basic中的是一样的。

呃?

我得去找一个年资够久到会记得原因的Excel程式师,Ed Fries看起来知道答案。

「喔,」,他告诉我,「1900年2月28日是多少?」

「59」我说。

「那3月1日呢?」

「是61!」

「60怎么了?」Ed问。

「2月29日!1900年是闰年!它是4的倍数!」

Ed说「猜得好,不过猜错了。」,让我一阵错愕。

喔喔。我做了一些研究,可以被100整除的那一年不是闰年,除非它也能被400整除。

所以1900年不是闰年。

「这是Excel的一个臭虫!」我惊叫。

「嗯,不『完全」是,」Ed 说,「我们得这么做才能汇入Lotus 123的工作表。」

「所以这是Lotus 123的臭虫啰?」

「嗯,不过也许是故意的。Lotus只能在640K记忆体内执行。这样的记忆体并不怎么多。如果忽略1900年,只要看最右边两位是不是00,就可以知道判断是否闰年了。这样快又简单多了。Lotus那些家伙也许认为这过去的两个月的错误无关紧要。但是Basic的那些家伙也许认为这两个月非对不可,所以把纪元往前移了一天。

「哇!」我惊叹着,然后又继续研究为什么选项对话视窗有个叫「1904日期系统」的勾选框。

隔天就是伟大的BillG审议。

1992年6月30日。

当时微软的组织扁平多了。他们现在有11或12层管理阶层,而当时我的上司是Mike Conte,他的上司是Chris Graham,再上去是Pete Higgins,再往上是Mike Maples,最后是比尔盖兹。从下到上大概有6层。我们嘲笑那些像通用汽车那种有着8层管理组织的公司。

在我的BillG审查会议中,由我往上的所有上司全部都在那里,还有他们的下属、同级、同级的上司等等,以及一个从我的团队来的人,他的工作就是精准的记录比尔说了几次F开头的粗话,F***的次数愈少表示愈好。

比尔盖兹走进来了。

想想也真是奇怪,他有两条腿,两只手,一个头…嗯,就跟个正常人一样。

他手上拿着我的规格。

「他手上拿着我的规格文件!」

他坐下并跟一个我不认识的高阶主管交换了一个诙谐的玩笑,那对我来说毫无意义。一小撮人笑了。

比尔盖兹转向我。

我注意到在我写的规格页边写着一些注解。他读了第一页!

「他读了我写的规格的第一页而且写了一些注解在页边上!」

想想看,我们只让他在24小时前拿到这份文件,他一定是在前一晚才读的。

他一直在问问题。我也逐一回答。那些问题非常简单,但我终其一生都记不起来是什么…因为我无法不注意他在翻弄手上的文件…

「他在翻弄那些文件!」[冷静一下,你是个发春的女孩吗?]

… 「所有页边都写了注解。文件的每一页都有。他该死的读了整份文件还在页边上写了注解。」

「他读了全部的内容!」[「噢我的天啊啊啊啊啊啊….」]

问题开始变得愈来愈难也愈来愈细。

那些问题似乎不太有条理。但此时我才把比尔盖兹当做自己的同伴。他真是个厉害的家伙!他读了我的文件!他也许只是想问我一些关于页边上注解的问题!我会「马上」把他所有的意见都输入错误追踪系统,以确保每个意见都有处理!

最后是个杀手级问题。

「我真弄不懂,你们这些家伙,」 比尔盖兹说,「有人『真的』深入搞懂这些东西实作的细节吗?比如说这全部的时间日期函式。Excel有这么多的时间日期函式。Basic也要有这么多相同的函式吗?他们的作法都一样吗?」

「是的,」我说「除了1900年的1月跟2月。」

一片安静。

F***记录员与我上司交换了惊讶的眼神。我怎么会知道那玩意?1月跟2月什么鬼东西?

比尔说「OK。好吧,做的好。」然后拿起了他那份写满字的文件

「…等一下!我要那份文件…」

离开了。

「四次,」f***记录员宣布结果,而每个人都在说「喔,这可是我所记得最低的记录呢。比尔随着他的年纪变稳重了。」你知道的,他那时的年纪是36岁。

稍后我对我自己解释说,「比尔盖兹并不是真的想要审阅你的文件,他只是想确定你把一切事都做好了。他的标准做法就是问愈来愈难的问题,直到你承认你投降为,然后他就可以对你咆哮说你什么都没准备好。没有人真的确定当你答出那最难的问题后会怎样,因为那从未发生过。

有人问「你能想像如果Jim Manzi在这场会议中会怎么吗?」。「日期函式是什么东西?」Manzi一定会这样问。

Jim Manzi是带着Lotus走向下坡的那种企管硕士。

这是个重点。比尔盖兹是个惊人的技术人。他了解Variants、COM物件、IDispatch,也了解Automation为何与vtable不同,而这种不同又如何导致双重介面。他关心日期函式。如果负责的部下能让他信任,他就不会干涉软体上的事,但你无法唬弄他一分钟,因为他是一个程式设计师。一个货真价实的程式设计师。

看着试图经营软体公司的非程式师,就好像看着一个人不会冲浪却想要冲浪。

他们说「这不要紧!我有一群伟大的顾问在岸边告诉我要做什么」,然后一次又一次跌离甲板。这是那种认为管理是个通测的企管硕士标准的哀嚎。Ballmer会成为另一个John Sculley吗?John Sculley几乎让苹果电脑完蛋,只是因为董事会认为会卖百事可乐就足以经营好电脑公司。MBA信徒总是希望相信,即使不了解其产品,你还是可以经营一个组织。

一年一年过去,微软变得愈来愈大,比尔盖兹已经过度扩张了,而某些隐晦道德决策使公司必须就美国政府的对抗投入太多高层关注。Steve已经接管CEO的角色,理论上这能让比尔去做他最擅长的事:经营一个软体开发组织,但这似乎无法治愈这11层组织所引起的风土病,一个持续永无休止的开会文化,顽固地坚持创造所有可能的产品而不管是什么产品。微软在研发、法律费用和声誉损害上不知损失了几十亿美元,只因为他们决定不只要得做出一个web浏览器,还得完全免费。20年来松散,快速的召募动作,确定了微软的中等雇员脑力水准下降。(Douglas Coupland在「Microserfs」一书里说:「他们在1992年一年就雇用了3100人,而你知道他们并不是全都是珍宝。)

反正。重点转移到别的地方。Excel Basic变成了给Excel用的Microsoft Visual Basic for Application,伴随着一大堆我不知道那里才能摆得下的TM与®。我在1994年离开微软,心中假定比尔已经完全忘了我,直到我注意到华尔街日报关于比尔盖兹的一篇专访,在那里面他提到(简直是顺便说的)说找个好的Excel程式经理有多么困难,他们不会果子一般从树上长出来等等之类的话。

他是在讲我吗?嗯,那也许只是另外一个人罢了。

没差啦。

这些网页的内容为表达个人意见。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.