9 e+ A# E" O, U! W我跑到Excel资深程序员Ed Fries的面前.我想他应该知道为什么。) `0 s1 G+ }6 a# Y3 F
“哦”,他告诉我:“看看1900年2月28日”2 {3 V- q `4 J, j
“59”,我说! J# |" v. ^8 W% B0 x
“现在再看3月1号”/ I$ q1 b1 x2 \' ~# T6 l
“61”。 # _, W4 U, @0 K( R0 N1 k“60哪里去了”Ed问道' h$ ]- P% }2 n( }/ H
“2月29?1900是闰年!它可以被4整除”: `5 l4 Y$ n: R+ k
“很好的猜想,但不对”,Ed边说边走,留下我一个人在那里深思。* u1 \0 ]; @0 `* r- W
我又做了一些研究。发现可被100整除的年份不一定是闰年,除非它能被400整除。 0 Z. Y! C- _/ u2 L* {5 H+ x8 {) J+ `原来1900不是闰年。; v9 T2 x4 S- m% r3 B. P f! N L
“找到了,这是Excel的Bug”.我欢呼起来。 * w4 r8 H5 h7 V; Q“错”,Ed说,"我们这样做是为了能导入Lotus 123(另外一种电子表格)的数据"。7 x: k. S( z" {$ _4 ?) h
“那它是Lotus 123的Bug?” 4 N8 E* v9 o( h$ Q: e"正确,但很有可能是故意的。Lotus必须适应640K的内存。但当时并没有那么多的内存,如果你忽略1900,你就可以根据一年的尾数是不是00来判断那年是不是闰年。这样做非常简捷方便。Lotus的小伙子们可能认为历史上两个月误差1天并不是很严重。而Basic团队看上去想给这两个月擦屁股,因此他们又把时间原点调回来了"3 s; E' l* i `' V
. k; w8 p9 z$ z“啊!”我恍然大悟,然后开始继续研究为什么那里还有一个设置1904为时间原点的复选框。$ c. t" h# @; V8 z$ m. E7 x9 p
# f9 [& d+ m! n( l, N# g9 S! [Bill做review的那天来临了。 6 A; C7 |& y. Z; d( V! u2 x# P6 L# Y+ q* W- L7 ~
那是1992年6月30日。9 u' c3 z- l. g+ B. a9 c
$ ~6 T/ D7 T% o' L那时候MS还没有现在这么官僚化。我对Mike Conte,Mike Conte对Chris Graham,Chris Graham对Pet Higgins,Pet Higgins对Mike Maples,Mie Maples最终对Bill.自底向上大约有6级,而非现在的11级或12级。 我们和使用8层管理结构通用汽车一样,是个充满乐趣的公司。 - m) d+ `9 T, s% g+ i) f& G# {+ u: a0 n3 G$ h8 [8 B' d+ z
在Bill的review中,每一层负责报告的人都出席了,顺便带来他们的堂兄堂弟,表姊表妹,大姨小姑,还有一个专门记录Bill会上会说多少个“靠”的人。当然“靠”越少,结果就越好。 2 e, e4 j/ j- Z9 r8 z% L ! |2 A- g/ U% K9 O4 V# UBill进来了。 5 I7 }% p; z" O7 n( ]1 q4 A& k: Y" L; B: T9 B# v5 ^: P/ J. P
他居然是两手两脚,一个脑袋.....看上去象个正常的人类。 ) Q; u. w! n! Q: l' I! [, M5 G) z& Z, m. r, z! Z! A1 d
他手里拿着我写的文稿。4 l: H$ g+ \( X8 q4 d6 k
% g# Z9 h# p, G' p
他手里拿着我写的文稿! ]5 r7 J4 _/ E$ k6 ~. i* B, ~9 P! N1 z; R
他坐下来和旁边的人开了个对我而言毫无意义的玩笑,有几个人在窃笑。 ?& G! D* G' o7 I- m" Y) Z+ T1 Y, q( L0 Y6 T: d& c! L6 H7 ~
Bill转向我了。 0 c0 P3 p5 h* b) @5 @2 n - `, P& r; y5 k3 b% ]/ s* A我注意到在我的说明空白处写着一些注解。他读过第一页!(激动)5 F' H- p$ g0 g" K- r. H4 o' \
" ]8 I2 k6 t! D- k4 n1 L
他已经读过第一页并写下了他的笔记!(更激动) : k: W( I j% R6 m$ u* }* _$ p. r! B ( a4 M+ x2 i( @4 k& k因为从提交文稿到他手上不过一天时间,他一定在昨晚之前就读过。* M9 z# S8 B/ F" {& w9 i; C3 C
v7 I& }/ ?& e& E# A! {, G我们开始一问一答。问题相当简单,但现在我已经记不清了,因为当时我一直在注意着他翻我的文稿... ' c5 X# J% J) u0 v # r0 k _8 q$ `他在翻我的文稿!!!(冷静,冷静,你可不是小姑娘了) - H1 ~3 w8 y- B: B. R: v% x {) q % m) n9 R7 _/ z ...我看到每页空白都写满了注解,他妈的,他居然全部读完了,还写了注解。 5 {: {- t: s6 I" L6 s2 ? % x9 w) r2 @9 M; b0 V; a他居然全部读完了!5 S; e+ O1 _3 m& A5 u
+ O1 ]4 Y1 y$ M$ K8 m问题开始变得越来越难,越来越细。. F% V2 g8 X+ c) i" K
0 o: h0 @! b% W( A& N t) N
提问有些随机。过去我常常认为Bill是我的大爷,事实上他是一个真正的好淫!他读了我的说明,他的问题可能正记在说明的空白处。以后我一定要把这些问题都在Bug跟踪系统中标记出来。+ Z" N: J* h; h
+ H3 }" @9 q+ [ D1 L终于最难的问题来了。 f7 o1 H. r9 s. C 6 F+ m# C( l6 N “我不知道,小伙子们”,Bill说,“有人研究过这个细节没有,比如说这些日期和时间函数。Excel有很多日期时间函数,在Basic中是不是能一一对应,他们工作方式是不是都一样的?” $ q. s( }* q. X! r3 |* ~ 3 c: ^$ P+ |& ?$ o “当然”,我说,“除了1900年的1月和2月”。7 F. g9 o3 }7 x4 m" v/ e8 ^
+ J6 e: _8 y K' ]- S 沉默。; ]8 E7 P# R- |5 B. p+ `& F
. d( [4 \! Z2 v- V
“靠”的记录人员和我老板惊讶的对视一眼。这家伙怎么知道的?1月,2月是什么东西? / } t! N( w Q: J- B 5 G8 l# p- B& o) v2 H; g& t“OK,很好”,Bill拿起我的说明。 8 l3 b) X4 o; F0 n2 @. a! F3 [2 e8 ^$ f0 D
....等等!我想知道......" Q# [+ N: O H3 I: o8 }
7 M% g! {5 P, Q; M" T. u+ d
他们离开了。) S# s+ i& N! ]2 J7 W
, t% U8 d) N4 T |* X “4个”,“靠”的记录者宣布,"这是我有生以来记得最少的一次。也许Bill开始步入中年了"。如你所知,Bill当年36。 - S* q4 S! p2 u. Z6 W. e3 e) i" e" A& s
后来我对这次Review终于有了一个解释,"Bill并没想真的想要review我的说明,他只是想确定一切是否在我控制之中。他的标准方式是问得越来越难,越来越难,直到你承认你不知道,然后,他就会提醒你你尚未准备好。如果我答起了他最刁钻的问题,没有人会确定会发生什么,因为这以前就没发生过。" |, Z) F7 B' G3 j6 [' r2 | 8 G- [ X- p4 t( u3 a9 H “如果是Jim Manzi在review上会怎么表现?”有人问道,“Manzi会反问,‘什么是日期函数???’”(Jim Manzi就是把Lotus带垮的MBA) , z! q$ {% ]# h, }5 J - g) t9 {7 Z. t- G$ \正确。0 ], | k; V$ L0 B0 W0 A% ~( l( t
/ p! T8 K" N g1 u, Y2 g7 ?9 C! v n Bill Gates是个令人吃惊的技术狂热者,他理解Variants,Com对象,和IDispatch,知道为什么自动化和vtable不一样,也知道这个区别会导致双接口。他担心日期函数,如果不是他信任的人在开发,他会难以入眠。你可以对此嗤之以鼻,但他确实是一个程序员,一个真实的,地地道道的程序员。不是程序员的人去运作一个软件公司就像不会滑板的人跑去冲浪一样。“得了,我有非常棒的顾问在岸边指导我”,他们会一边说一边一次次从滑板上掉下去。那些标准MBA就是相信管理是通用函数。鲍尔默会成为另外一个John Sculley吗?John Sculley曾差点把苹果公司搞垮,只因为董事会相信他卖百事的经历会对运作计算机公司有所帮助。MBA的迷信者通常相信这一点:你可以让组织做你完全不懂的事。0 _% Z3 G$ S. V9 F& |. w+ h