【导读】:本文作者是 StackOverflow 联合创始人、知名博主 Joel Spolsky。本文讲述他于 1991 年在微软做 Excel 的 Program Manager 的时候,与 Bill Gates 一起 review 产品的感受,行文生动有趣。另外,微软鼎盛时期的 Program Manager ,技术能力很强的。

图0:比尔·盖茨评审产品时说 F**k 最少的一次

(补图:1991 年 Bill Gates 接受今日美国的采访)

我的第一次 BillG 评审

在早些时候,Excel 有一种非常难用的没名字的编程语言。我们叫它“Excel 宏(Excel Macros)”。这是一种功能严重失调的编程语言,它没有变量(你必须将值存储在一个工作表的单元格中)、没有局部变量(locals)、没有子例程调用(subroutine calls)。简而言之,它几乎完全无法维护。它有像任意跳转语句 Goto 这样的高级特性,但标签(labels)实际上是看不见的。

唯一使它看起来合理的是,它和 Lotus 宏相比看上去太好了。Lotus 宏只不过是把一系列的键盘敲击作为一个长字符串输入到一个工作表单元格。

1991 年 6 月 17 日,我开始在微软 Excel 团队工作。我的头衔是“程序经理(Program Manager)”。我应该为 Excel 宏的问题想出一个解决办法。言外之意就是,解决方案会与 Basic 编程语言有关。

Basic?一点都没错!

我花了一些时间,与不同的开发小组磋商。Visual Basic 1.0 那时刚刚发布,酷到不行。有一个在误导中进行的开发,代号为 MacroMan,以及另一个面向对象(Object-Oriented)的 Basic 也在开发,代号为“Sliver”。Sliver 团队得知,他们的产品将会有一个客户端:Excel。Sliver 的市场经理 Bob Wyman,没错,就是那个 Bob Wyman,他只用把技术售卖给一个人:我。

图1:比尔·盖茨评审产品时说 F**k 最少的一次

(2014 年的 Joel Spolsky,补图 )

正如我所说的,MacroMan 误入歧途,也采纳了一些劝告,但最终它被关闭了。Excel 团队使 Basic 团队确信,我们真正需要的是一种针对 Excel 的 Visual Basic。我设法在 Basic 中添加了四个受宠的特性。我让他们添加了变型(Variants),一个可以存储任何其他类型的数据类型,否则在没有 switch 语句的判断下,你就不能以一个变量存储电子表格单元格的内容。我还让他们加上了后期绑定(late binding),也叫做 IDispatch,或是 COM 自动化。因为Silver的原始设计需要对类型系统(type systems)有深入理解,而宏的开发者根本不需要懂这个。然后,我有两个受宠的语法特性:For Each 结构是从 csh 中借鉴的;With 结构是从 Pascal 中借鉴的。

之后,我坐下来编写 Excel Basic 的规格说明书,一份巨大的文件,长到几百页。我想起写完的时候,它有 500 页了。(“瀑布式开发”有人在偷笑了,是的没错,别笑了。)

那时候,我们通常会有一件事叫做“BillG 审查”。Bill Gates 基本上会审查每个重大的功能。我被通知送一份规格说明书复印件到他的办公室,为审查做好准备。这基本上用掉了一令打印纸。(注:令,英文纸张计数单位。1 令为 500 张)

我赶去把规格说明书打印出来,送到了他的办公室。

那天晚一点的时候,我有了一些时间,因此我开始工作于计算 Basic 是否有足够的日期和时间函数来完成所有在 Excel 里能做的任务。

在多数现代编程环境中,日期是以实数形式存储的。这个实数的整数部分,是从以前某个公认的日子至今所经过的天数。这个公认的日子叫做“纪元(epoch)”。在 Excel 中,例如,今天的日期——2006 年 6 月 16 日,以 38884 存储着;计算日期 1900 年 1 月 1 日的话,就是 1。

我开始彻底地测试 Basic 和 Excel 的各种日期和时间函数,在那之后,我注意到 Visual Basic 的文件里有异常——Basic 以 1899 年 12 月 31 日为纪元,而不是 1900年 1 月 1 日,但不知何种原因,当天日期的值在 Basic 和 Excel 里是一样的。

哈?

我去找到一个资历老练到记得背后原因的 Excel 开发者。Ed Fries 看起来知道答案。

他告诉我:“检验一下 1900 年 2 月 28 日。”

我说:“存储值是 59。”

“那再试下 3 月 1 日。”

“是 61。”

Ed 问:“60 哪去了?”

“2 月 29 日,1900 年是闰年,它能被 4 整除!”

Ed 说:“猜测的不错,但还不够。”接着让我想了一会儿。

天呐,我又思索了一番,能被 100 整除的年份,除非它还能被 400 整除,否则就不是闰年。

1900 年不是闰年。

我惊呼道,“这是一个 Excel 里的 bug。”

“不完全是,”Ed 讲到,“我们不得不用那种方式,为了能导入 Lotus 123 的工作表。”

“所以这是 Lotus 123 里的 bug?” (补充:Lotus 123 是一种电子表格软件,1983 年由莲花公司推出,后来被 IBM 收购。Lotus 123 就是 Excel 的竞品。)

“是的,但很有可能是故意为之。Lotus 内存小于 640 k。那是很小的内存。如果忽视 1900 年,你能只是看最右两位是否为零来计算某一年是不是闰年。这样快速且容易。Lotus 的人可能认为在过去的日子里只有这两个月受到影响并不是什么重大的错误。但看起来,Basic 的人对这两个月吹毛求疵,所以他们把纪元回退了一天。”

“天啊!”我感叹到。然后继续研究为什么在名为「1904 Date System」的选项对话框里有一个复选项。

第二天就是重要的 BillG 审查。

1992 年 6 月 30 日。

过去,微软公司是很少官僚的。我向 Mike Conte 汇报,Mike Conte 经过 Chris Graham、Pete Higgins、Mike Maples 的层层汇报,最终 Mike Maples 就能向 Bill 汇报了。不像现在的 11 或是12 层,以前自顶向下只有 6 个层级左右。我们曾经取笑像通用汽车(General Motors )这样的公司,因为他们有 8 个管理层或是天知道做什么的层。

在我 BillG 评审的会议上,以上的汇报层都到场了,他们还带着一堆我怀疑是表兄表妹姑婶的人。还有一个我团队里的人,他负责准确记录 Bill 整场爆了几次粗口。Bill 说 Fxxx 的次数越少,review 结果越好。

Bill 进来了。

我感觉太奇怪了,他竟然有两条腿、两个胳膊和一个脑袋。几乎和普通人类完全一样。

在他手上拿着我的规格说明书。

我的规格说明书在他手上!

他坐下,和一个我不认识的高管,戏谑了几句对我而言没什么意义的话。一些人笑了。

Bill 转向我。

我注意到我的规格说明书边缘上有一些评论。他已经看过第一页了!

他已经看过我规格说明书的第一页了,而且还在边上写了几句笔记!

想到我们刚在 24 小时前把规格说明书送给他,他一定是在昨天晚上阅读它的。

他问了几个问题。我回答了。它们非常简单,但我之后再也记不起都问了什么,因为我目不转睛地看着他翻阅着规格说明书……

他在翻阅着规格说明书!(冷静,你是没见过世面的小女孩么?)

……并且,边上都写着笔记。在规格说明书的每一页都有。天啊,他已经阅读过了整个文件,并且在所有边缘写上了笔记。

他读了整个文件!(天啊,怎么可能!)

提问越来越难,越来越细。

问题似乎有点随机。那时我已经把 Bill 当成自己人了。他是个不错的家伙!他读完了我的规格说明书!他可能只是想问我几个和写在边上的评论相关的问题。我要打开错误提交系统,把他的每一条笔记都放进去,并且确保得到重视和解决,要快!

最后是一个很要命的问题。

Bill 说,“我不知道你们有谁真的看过如何去做的所有细节?比如,所有的日期和时间函数。Excel 有大量的日期和时间函数,Basic 是否也有一样的函数?它们工作的方式一样吗?”

“看过,”我回答到,“除了 1900 年的 1 月和 2 月。”

一片寂静。

粗口记录员和我上司惊讶地对视了一眼。我是怎么知道的?1 月 和 2 月怎么了?

“好。那么,做的不错,”Bill 这么说。他拿起他做了笔记的规格说明书复印件。

……等等!我想要那个!

然后他走了。

“4 次。”粗口记录员汇报道。所有人都说:“哇。这是我记忆中的最低记录。Bill 随着年龄大起来越来越稳重了。” 那年,他 36 岁。

后来,我自己解释:“Bill 并不是真的要评论规格说明书,只是想确保你已经完全掌握了它。他的标准做法是不断提问,越问越难,直到你承认你不懂,接着他就会吼你‘为什么没准备好?’没人真的知道,如果答出来了那个他抛出的最难得问题会怎么样,因为之前还没人答上过。”

“你能想象如果 Jim Manzi 在那个会上吗?”有人问。“Manzi 会问你‘什么是日期函数?’”

Jim Manzi 是 MBA 类型的领导,他把 Lotus 带上了下坡路。(补注:Jim Manzi 1982 年加入 Lotus 公司。1984 年成为 Lotus 总裁。)

这是很重要的一点。Bill Gates 是个惊人的技术人员。他理解可变数据类型、COM 对象、IDispatch 接口,以及 Automation 和虚表有什么不同,为什么这样会导致双重接口(dual interfaces)。他担忧日期函数。他不会干涉软件,如果他信任为此工作的人。但你一分钟也不能糊弄他,因为他是一个程序员。一个真真正正的程序员。

看那些不懂编程的人想经营一家软件公司,就像看不会冲浪的人硬要去冲浪一样。

“没关系。我有极好的顾问站在岸边告诉我如何去做!”他们这样说,结果他们会一次又一次的从滑板摔落。这是那些 MBA 的标准说辞,他们相信管理是一项通用技能。鲍尔默会成为另一个 John Sculley 吗? John Sculley 几乎差点让苹果(Apple)破产,就因为那时苹果的董事会相信一个整天想着卖百事可乐的人能准备好经营一家计算机公司。MBA 的崇拜者乐于相信人可以经营一家公司,而根本不懂公司业务。

几年过去,微软逐渐变得庞大。Bill 精力分散,一些道德上名声不好的决策,使得公司管理需要在很多方向上与美国政府抗争。鲍尔默接手微软 CEO 的角色,在理论上能够让 Bill 把更多时间放在他的长处上,去经营软件开发组织,但这似乎并没有解决由于一些特殊原因造成的问题。像是11 层的管理结构、无尽的开会文化、一种将所有可能产品都制造出来的固执,无论那是什么。(微软流失了不可计数的美元,在研发、法律费用和名誉损失上,只因为他们决定不仅必须要做一个浏览器,而且还必须要免费发布。)以及几十年以来匆忙、草率的招聘使微软中层的水平下降。(Douglas Coupland 在 Microserfs 中说:他们在 1992 年雇佣了 3100 人,其中并不都是人才。)

好了。聚会已经搬到了其他地方。Excel Basic 成为了 Microsoft Visual Basic 应用程序微软 Excel 版,有太多注册商标(TM)和(R)以至于我不知道该把它们放哪。我在 1994 年离开了微软公司,以为 Bill 已经完全忘记了我,直到我发现《华尔街日报》上一篇 Bill Gates 的小专访。里面他讲到招聘是多么难的事时,几乎只是顺便一提地说了,就像一个优秀的 Excel 程序经理,他们不是简单地长在树上,诸如此类的话。

他会不会是在说我?不会吧,那可能是别的什么人。

一切都定格在过去了。

余下全文(1/3)

本文最初发表在伯乐在线,文章内容属作者个人观点,不代表本站立场。

分享这篇文章:

请关注我们:

发表评论

电子邮件地址不会被公开。 必填项已用*标注