专栏名称: 伯乐在线
关注职业资讯;学习各类职业感悟、心得和经验分享,扩大职业视野;体会求职、工作和创业的历程 - 就在JobBole.com 伯乐在线
目录
相关文章推荐
码农翻身  ·  漫画 | ... ·  18 小时前  
OSC开源社区  ·  3月8日妇女节,来一场职场姐妹茶话会 ·  昨天  
程序员小灰  ·  DeepSeek俱乐部,7000人了! ·  3 天前  
程序人生  ·  嘿,朋友!我们好久不见你在哪里 ·  1 周前  
51好读  ›  专栏  ›  伯乐在线

比尔盖茨爆粗越少,review 结果就越好

伯乐在线  · 公众号  · 程序员  · 2017-09-20 19:40

正文

(点击 上方蓝字 ,快速关注我们)


编译: 伯乐在线/Lada

如有好文章 投稿,请点击 → 这里了解详情


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

(伯乐在线补图: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,他只用把技术售卖给一个人:我。

(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 这么说。他拿起他做了笔记的规格说明书复印件。

……等等!我想要那个!







请到「今天看啥」查看全文