Joel的比尔盖茨评审回忆介绍
Joel的比尔盖茨评审回忆介绍
Joel的比尔盖茨评审回忆
[这篇回忆很是珍贵,于是我把它翻译成中文,以便更多人能够了解这个巨无霸公司成功的背后。我知道现在有不少人并不喜欢盖茨,但这篇是关于从前的微软,一个挑战IBM、立志要让每个人都有一台PC的公司。]
在早期,Excel有个没有名字的很蹩脚的编程语言,我们叫它“Excel Macros”。这是个严重机能不良的语言,没有全局变量(你必须在表单的单元格里存数据),没有局部变量,没有子过程;简单的说,它完全不可维护。它有Goto这样的高级功能,而Goto的目标标签却不可见。唯一让它看起来可用的理由是它看起来比只能记录击键序列的Lotus Macros强得多。
1991年6月17日,我开始在微软的Excel项目组工作。我的头衔是项目经理。我得为这个问题提出一个解决方案。这意味着这个解决方案要和Basic语言有关。
Basic?没错!
我花了些时间与各个开发组进行了讨论。那时Visual Basic 1.0刚诞生,并且看起来相当的酷。同时有个代号为MacroMan的方向错误的项目,还有一个代号为Silver的做面对对象的Basic的项目。Silver项目组被告知他们只有一个客户——Excel。Silver的营销经理Bob Wyman只有一个推销他们的产品的对象——我。
如前所述,MacroMan项目方向错误,虽然他们进行了游说,但最终还是被停掉。Excel团队最终说服了Basic团队我们很需要一种用于Excel的Visual Basic。我说服了他们向Visual Basic里添加了4个小功能。我让他们加入了变体类型——一个可以包含任何类型数据的类型,因为除此之外没有任何办法可以不用switch语句在一个变量里保存一个表单单元格的内容。我让他们加入了延后绑定,即IDispatch,又叫COM自动化,因为Silver最初的设计要求严格的类型系统,而写宏脚本的人却根本不在意类型。我还使他们加入了两个语法特性:从csh借来的For Each,和从Pascal借来的With。
然后我开始写Excel Basic的规格说明书,那是一个数百页的大文档。我想当时大约写了500页。(你们可能在窃笑“瀑布模式”,是的,没错,闭嘴。)
那些日子我们有叫做比尔盖茨评审的东西。基本上每一个主要的特性都要经过比尔盖茨的评审。我被告知要发一份规格说明书的拷贝到他的办公室。那是一大打激光打印纸。我匆忙地打印了规格说明书并送了过去。
那天的晚些时候,我趁有些时间,开始检查Basic是否有足够的日期和时间函数以满足Excel的需求。在大多数现代编程环境中,日期是用实数保存的。整数部分表示从约定的特定一天起的天数。在Excel里,今天的日期2006年6月16日保存为38884,以1900年1月1日算做1。
我开始对比Basic和Excel里的各种时间日期函数,这时我注意到Visual Basic文档里一些奇怪的内容:Basic使用1899年12月31日作为日期起点,而不是1900年1月1日。但今天的日期的值却竟然和Excel相同。
啊?
我于是去找一个资深到能够记得原因的Excel程序员。Ed Fries似乎知道原因。
“哦,”他对我说,“你查一下1900年2月28日。”
“是59,”我说。
“现在你再试试3月1日。”
“是61!”
“60哪去了?”Ed问。
“是2月29日啊,1900年是闰年!它能被4整除!”
“猜得好,但不奖励雪茄,”Ed说,然后让我苦思了一会。
天埃我研究了一下,能被100整除的不是闰年,除非能被400整除。1900年不是闰年!
“这是Excel的一个bug!”我惊呼。
“这个嘛,并不算,”Ed说,“我们不得不那么做,因为我们需要能够导入Lotus 123的表单。”
“那么,这是Lotus 123的bug?”
“对,但可能是有意这么做的。Lotus必须能装进640K的内存。那不是很多。如果你忽略1900年,那你就可以通过检查最后两个比特是否为0来判断闰年。这既快又简单。Lotus的开发人员可能认定仅仅是遥远的过去的两个月错误并无大碍。但似乎Basic的开发人员对那两个月很臭屁,所以他们把起点前移了一天。”
“哦~!”我说,然后我回去研究为什么选项对话框里有个叫做1904日期系统的复选框。明天就是传说中的比尔盖茨评审。
1992年6月30日。
在那些日子,微软内部不像现在这么官僚。不像今天的11到12层的管理体系,那时我报告给Mike Conte, Mike Conte报告给Chris Graham,Chris Graham报告给Pete Higgins,Pete Higgins报告给Mike Maples,Mike Maples报告给比尔。从顶到下大约6层。我们取笑像通用汽车这样有8层的管理体系的公司。
在我的比尔盖茨评审会上,各层的经理都在,还有他们的兄弟姐妹,还有一个从我的项目组来的人,他在会议上的唯一工作就是准确地记录在评审中比尔说F***这个词的次数。次数越少越好。
比尔进来了。我开始想他竟然有两条腿,两支胳膊,一个脑袋,几乎和一个普通人一样!
他手里拿着我的规格说明书。
他手里拿着我的规格说明书!
他坐下来,和一个我不认识的执行官互相开了几个玩笑,几个人笑了。
比尔转向我。我注意到他手里的规格说明书的边缘写了评注。他读了第一页!他读了第一页并且做了评注。想一想我在24小时前给他的规格说明书,他必定在夜晚前看过。
然后他开始提问,我回答。问题很简单,但我却不记得,因为我一直在注意他不停地翻页……
他在一页一页地翻!“冷静,冷静,难道你是个坐不住的小女孩么?”我对自己说。但是,每一页的边上都有评注!他读了这该死的说明书的每一页,并且做了评注!他全部读过了!我的天!
问题开始变得越来越困难和深入。虽然有些散乱,但我开始把比尔当成我的伙伴。他是个不错的人!他读了我的规格说明书!他大概只是要问我那些做了评注的问题!我要为他的每一条评注在bug追踪系统里添加一条记录,并确保它们被处理,马上!
终于,杀手级的问题到来了。
“我不知道,你们这些家伙,”比尔说,“是否有人研究了做这些的细节?比如,所有的日期和时间函数。Excel有相当多的日期和时间函数。Basic会有这些函数吗?它们工作方式相同吗?”
“有,”我说,“但除了1900年的1月和2月。”
沉默……
数F***次数的家伙和我的老板互相惊讶地瞟了一眼——我这么知道那个?1月和2月怎么了?
“好,干得不错,”比尔说。他拿起他评注过的规格说明书拷贝……喂,等等!我还要说……他走了。
“4次,”F***计数员宣布道,然后每个人都惊叹道:“哇,这是我所记得的最少次数。比尔年级大了,开始变得老练了。”你知道,那年比尔36岁。
后来,我听到了原因。“比尔并不是真正想评审你的规格说明书,他只是要确保你使项目处于可控的状态下。他的标准操作模式是问越来越难的问题,直到你承认你不知道,然后他就可以对你大发雷霆。没有人知道如果你答出了最困难的问题会怎么样,因为以前从没发生过。”