标题: Bill Gates 的一次Review [打印本页] 作者: mark 时间: 2011-10-5 17:10 标题: Bill Gates 的一次Review 注:这是我很早以前从Joel Spolsky的一篇文章翻译的。原文出处http://www.joelonsoftware.com/oldnews/pages/June2006.html。 8 A, D3 s( l$ J5 Y' |. D$ S: ^5 N, J
Joel曾在以色列伞兵部队服役,后来在微软做程序经理,现在在纽约开了一家自己的软件公司。非常有名的程序员问答网站stackoverflow.com的创始人之一。他在大学里面专修过写作,经常在他的网站上发表一些关于创业和软件开发的文章,在软件界非常著名。1 M$ Z& f' n o( X3 U
; A0 h- Y# q F$ R' u) Y2 n1 ]Excel曾自带了一个非常糟糕的程序语言,当时这个语言还没有名字。我们称其为"Excel Macros".它没有变量、局部变量、子函数这些概念,几乎完全无用。虽然它有是还一些高级功能,比如“Goto”。 3 m. a) G* ~' }; A- \: Y5 K4 z) r/ n
它存在的唯一理由是:它看上去要比Lotus的宏要合理一些。Lotus的宏不过就是记录了一组键盘敲击的顺序,用来在单元格中输入长字符串。 k6 ~1 v! z \( f# k" U
( y" C( `! V6 X$ G
1991年6月17日,我开始为微软的Excel团队工作。我的头衔是“程序经理”(相当于写需求分析的),我的任务是为Excel Macro 找到一个合适的改进方案。有人建议我可以用Basic来做这个方案。 ' ]( Z. y5 r$ B9 @" _. \4 R! j a _. B' s$ E
Basic?! ; `6 W' T: f6 D$ [1 ~4 Z( N 4 \& O- P+ Z4 R: X: J" p; C+ y: y# G我花了些时间和不同的开发团队商量。那时候Visual Basic 1.0 才刚刚推出,它简直是酷毙了!但在微软内部当时还有另外一个面临失败的项目"MacroMan". 他们试图开发另一种面向对象的Basic。这个团队好不容易才被告知他们的产品终于有了一个客户,就是我们Excel组. 当时他们的市场经理是Bob Wyman,是的,就是那个Bob Wyman(是谁?很有名吗)。可怜的Bob Wyan,我是唯一一个可以让他发挥推销才能的人。+ H7 ~+ P" ]% Z- _" e2 v3 l8 u4 e9 O
# q$ Z4 R% g2 H
如我上述,MacroMan快失败了,虽然它有一些支持者,但最后还是面临被停掉。Excel团队确信他们这个Basic团队正是我们开发Visual Basic For Excel 所需要的。 我在这个项目的基础上试图再加入4个我喜欢的功能。Variant--一个通用的数据类型,可以随时保存其他类型的值。因为如果不这样的话,你必须先要定义一个转换声明才能保存单元格的值。后期绑定,也就是后来赫赫有名的IDispatch.另外两个特性是For Each语句(从csh中偷的)和With语句(从Pascal中偷的)- q1 y! ?' N$ d
# ^) I; X; Q5 j. O
接下来我开始写Excel Basic的规格说明,它真是他妈的工程浩大,我想完成时大概有500页吧。(“瀑布模型?”(传统软件开发模式),也许你正在窃笑。是的,但是请你闭嘴)% H# s+ i8 l5 p; _9 _! v
7 z% P* f+ ?$ Q7 d/ x# [
那时我们常常请Bill Gates作些review。基本上每个重要的特性Bill都得过一遍。我被告知把我的规格说明送到他办公室去,以便让他在review前做好准备。这个说明用了整整500页打印纸。- H3 z0 j+ C: n. b2 f" b
6 d5 G1 o7 A: @( M
我把说明打出来送到了他的办公室后,正好当天还有一点时间,于是我试图评估一下Basic的日期和时间函数是否能处理所有Excel的功能。 * Y; K% l, q; z5 q5 ~. `0 i" r7 J2 w" l# K, m" v# ~2 t2 X( p
在大多数现代程序开发环境中,日期被存为real数值。整数部分是从过去某天算起的天数。比如说Excel中,以1900年1月1日为1算起,今天2006年6月16日就是38884。 , X' [# ^/ y6 a' u1 r 0 U8 p( o+ X* F! R我开始把Visual Basic 中的日期和时间函数和Excel中的都过一遍,看看是不是都能对应。我注意到Visual Basic文档中有一个很奇怪的声明:Basic 使用1899年12月31日而非1900年1月1日作为日期的原点,但不知什么原因,Excel中今天的日期值居然和Basic的一摸一样。 % \: y4 |. U3 G ; x5 k# W$ L2 S. E4 e: j出问题了! / c3 D( E' a6 G' d# T3 y5 l* Y( T$ i0 ^
我跑到Excel资深程序员Ed Fries的面前.我想他应该知道为什么。 ' m% o) [7 E4 c$ ?0 |; q“哦”,他告诉我:“看看1900年2月28日” . m% n( z: Q$ F! x: T6 a: U“59”,我说+ {# B' N6 S: r, ?0 o1 x+ ^' u
“现在再看3月1号” n' n6 ]) Z4 A& P
“61”。 4 G2 c& b0 J+ k. W“60哪里去了”Ed问道+ w) f' H- W" j/ [$ Z9 K
“2月29?1900是闰年!它可以被4整除”. h( W+ t& a1 J% W
“很好的猜想,但不对”,Ed边说边走,留下我一个人在那里深思。8 ~! M u' _* Q: `; Q/ d
我又做了一些研究。发现可被100整除的年份不一定是闰年,除非它能被400整除。1 H1 U) z! W1 ?: ~5 C0 Z
原来1900不是闰年。" m+ Y, ]% {/ Y5 Z V/ d6 l3 I8 L
“找到了,这是Excel的Bug”.我欢呼起来。! p3 {, j5 S- | W3 R/ Y6 l
“错”,Ed说,"我们这样做是为了能导入Lotus 123(另外一种电子表格)的数据"。 3 |' ?9 V3 l) P7 h. C8 _6 U“那它是Lotus 123的Bug?”* g( ]% [( y' ^ W
"正确,但很有可能是故意的。Lotus必须适应640K的内存。但当时并没有那么多的内存,如果你忽略1900,你就可以根据一年的尾数是不是00来判断那年是不是闰年。这样做非常简捷方便。Lotus的小伙子们可能认为历史上两个月误差1天并不是很严重。而Basic团队看上去想给这两个月擦屁股,因此他们又把时间原点调回来了" ) J) Q [$ g+ s# P% M0 r 2 i7 ^6 Z. J: h) h* W+ H“啊!”我恍然大悟,然后开始继续研究为什么那里还有一个设置1904为时间原点的复选框。 * \8 x0 K# T1 _ i3 q5 q! H" M4 i% |, K- n R' e% d! L$ O: I i7 U
Bill做review的那天来临了。7 P3 k0 ?- b! r) ?
2 }' W. A/ d# Z6 d \
那是1992年6月30日。& d K" | a8 F5 r: v1 `6 \8 z7 w
7 r k/ e% R% z
那时候MS还没有现在这么官僚化。我对Mike Conte,Mike Conte对Chris Graham,Chris Graham对Pet Higgins,Pet Higgins对Mike Maples,Mie Maples最终对Bill.自底向上大约有6级,而非现在的11级或12级。 我们和使用8层管理结构通用汽车一样,是个充满乐趣的公司。5 N$ w( h9 U- s$ C
" N3 O3 p/ e. X2 ]
在Bill的review中,每一层负责报告的人都出席了,顺便带来他们的堂兄堂弟,表姊表妹,大姨小姑,还有一个专门记录Bill会上会说多少个“靠”的人。当然“靠”越少,结果就越好。1 i- ~% J: y1 C' M, p) ^