TA的每日心情 | 衰 2024-2-11 13:31 |
---|
签到天数: 141 天 [LV.7]分神
|
注:这是我很早以前从Joel Spolsky的一篇文章翻译的。原文出处http://www.joelonsoftware.com/oldnews/pages/June2006.html。/ t1 G) e& }$ x
+ w$ r8 F5 h! K. h
Joel曾在以色列伞兵部队服役,后来在微软做程序经理,现在在纽约开了一家自己的软件公司。非常有名的程序员问答网站stackoverflow.com的创始人之一。他在大学里面专修过写作,经常在他的网站上发表一些关于创业和软件开发的文章,在软件界非常著名。/ t2 ~8 N& y3 a* g: x7 J) `7 O2 }
7 T1 k9 u0 p0 @3 l1 g7 y! XExcel曾自带了一个非常糟糕的程序语言,当时这个语言还没有名字。我们称其为"Excel Macros".它没有变量、局部变量、子函数这些概念,几乎完全无用。虽然它有是还一些高级功能,比如“Goto”。; P- i8 |% d) h( {* @& ?3 E
$ R9 c/ V, M" U# ~. f' F它存在的唯一理由是:它看上去要比Lotus的宏要合理一些。Lotus的宏不过就是记录了一组键盘敲击的顺序,用来在单元格中输入长字符串。
. a; f% m( `5 X/ n4 }
8 [$ Y) l/ P5 X- m( U1991年6月17日,我开始为微软的Excel团队工作。我的头衔是“程序经理”(相当于写需求分析的),我的任务是为Excel Macro 找到一个合适的改进方案。有人建议我可以用Basic来做这个方案。
2 `1 q/ ^/ x8 k. u( S/ U' S9 o, g6 w& } a
Basic?!
$ ?, S- g" _7 I
8 z7 B, c, S+ k6 B我花了些时间和不同的开发团队商量。那时候Visual Basic 1.0 才刚刚推出,它简直是酷毙了!但在微软内部当时还有另外一个面临失败的项目"MacroMan". 他们试图开发另一种面向对象的Basic。这个团队好不容易才被告知他们的产品终于有了一个客户,就是我们Excel组. 当时他们的市场经理是Bob Wyman,是的,就是那个Bob Wyman(是谁?很有名吗)。可怜的Bob Wyan,我是唯一一个可以让他发挥推销才能的人。
% W) G' D! }6 `+ D
$ X7 q7 Y! n9 F9 _# }2 i: J( h4 h如我上述,MacroMan快失败了,虽然它有一些支持者,但最后还是面临被停掉。Excel团队确信他们这个Basic团队正是我们开发Visual Basic For Excel 所需要的。 我在这个项目的基础上试图再加入4个我喜欢的功能。Variant--一个通用的数据类型,可以随时保存其他类型的值。因为如果不这样的话,你必须先要定义一个转换声明才能保存单元格的值。后期绑定,也就是后来赫赫有名的IDispatch.另外两个特性是For Each语句(从csh中偷的)和With语句(从Pascal中偷的)3 Z7 d! w) n. j1 n1 y4 C! j2 w
, y' u, h9 B, l接下来我开始写Excel Basic的规格说明,它真是他妈的工程浩大,我想完成时大概有500页吧。(“瀑布模型?”(传统软件开发模式),也许你正在窃笑。是的,但是请你闭嘴)
% G" f% L; d9 p) H3 d$ l. L4 B( `+ u) ?, o
那时我们常常请Bill Gates作些review。基本上每个重要的特性Bill都得过一遍。我被告知把我的规格说明送到他办公室去,以便让他在review前做好准备。这个说明用了整整500页打印纸。
( y" e: z, _* D9 N* u/ }
' L& A: I+ f: Z我把说明打出来送到了他的办公室后,正好当天还有一点时间,于是我试图评估一下Basic的日期和时间函数是否能处理所有Excel的功能。) l' e% P. S. F
4 z' a: f- E: k4 [4 g在大多数现代程序开发环境中,日期被存为real数值。整数部分是从过去某天算起的天数。比如说Excel中,以1900年1月1日为1算起,今天2006年6月16日就是38884。0 o+ L+ n* M, _% B7 `: U
6 j( n W% p$ l8 i1 j/ p; {我开始把Visual Basic 中的日期和时间函数和Excel中的都过一遍,看看是不是都能对应。我注意到Visual Basic文档中有一个很奇怪的声明:Basic 使用1899年12月31日而非1900年1月1日作为日期的原点,但不知什么原因,Excel中今天的日期值居然和Basic的一摸一样。
) T: Y9 C3 v9 V D4 s4 }" B# O0 y0 X, b) b$ k% h0 s
出问题了!4 q1 a5 x5 Z' m! [1 I
9 W2 o* t1 U1 ?" a. S1 l我跑到Excel资深程序员Ed Fries的面前.我想他应该知道为什么。
; R( a; w" @" i& B* N# r- W“哦”,他告诉我:“看看1900年2月28日”3 Y! M. C; B. ^2 ^0 A! Q" i
“59”,我说
9 `5 d& u" |' n2 ^0 Y) X“现在再看3月1号”
2 |2 w" N1 I9 T" W- b“61”。3 D( k3 Q N! D( \; u3 X
“60哪里去了”Ed问道
7 ?6 N+ F2 l- i: ^“2月29?1900是闰年!它可以被4整除”, E1 R. f/ k- ~. Q9 Y
“很好的猜想,但不对”,Ed边说边走,留下我一个人在那里深思。
4 {# W8 n' k/ ~. G# q* y我又做了一些研究。发现可被100整除的年份不一定是闰年,除非它能被400整除。
1 ~5 U2 f3 }, x1 c原来1900不是闰年。
- }% K& z, p: Z7 A“找到了,这是Excel的Bug”.我欢呼起来。
/ W8 b6 j$ |% O$ Q$ @# Y- j @“错”,Ed说,"我们这样做是为了能导入Lotus 123(另外一种电子表格)的数据"。
, M4 s' I7 T2 J“那它是Lotus 123的Bug?”
$ G/ G! U) s; o3 x# U& _* I8 u"正确,但很有可能是故意的。Lotus必须适应640K的内存。但当时并没有那么多的内存,如果你忽略1900,你就可以根据一年的尾数是不是00来判断那年是不是闰年。这样做非常简捷方便。Lotus的小伙子们可能认为历史上两个月误差1天并不是很严重。而Basic团队看上去想给这两个月擦屁股,因此他们又把时间原点调回来了"
/ Z! Q6 n0 |' U* W7 J- d+ ^0 Y: n6 |( V2 ~( x* e
“啊!”我恍然大悟,然后开始继续研究为什么那里还有一个设置1904为时间原点的复选框。
3 M' @. n; G( u! e% ]7 `2 B: P3 P" v. M! @! _
Bill做review的那天来临了。0 w( u& Y9 R! J: m" M
O& g- Y6 w; R# S& z' P3 H
那是1992年6月30日。/ j7 G* W Z! a0 b7 I4 @1 p
% N! k5 Z* _0 V: M那时候MS还没有现在这么官僚化。我对Mike Conte,Mike Conte对Chris Graham,Chris Graham对Pet Higgins,Pet Higgins对Mike Maples,Mie Maples最终对Bill.自底向上大约有6级,而非现在的11级或12级。 我们和使用8层管理结构通用汽车一样,是个充满乐趣的公司。0 G0 O% l/ x; [" K
! i6 Q9 o& X2 ~' z9 {, e在Bill的review中,每一层负责报告的人都出席了,顺便带来他们的堂兄堂弟,表姊表妹,大姨小姑,还有一个专门记录Bill会上会说多少个“靠”的人。当然“靠”越少,结果就越好。
4 |0 X6 K% W6 T& L" N( b0 w6 [3 ` g. U4 n6 x' s
Bill进来了。$ [1 M1 t/ Z$ b. _8 Y. ]1 C
+ L/ R! {2 S! J }
他居然是两手两脚,一个脑袋.....看上去象个正常的人类。: v7 ^3 q' k% ~
) |( l t" ]6 Q* @9 B) g
他手里拿着我写的文稿。- M; R9 _2 U7 {
, j0 @5 m5 X6 n g& L9 A2 Q3 [# z他手里拿着我写的文稿!
' ?* t. r1 w4 K
* _1 F2 Z7 w0 M他坐下来和旁边的人开了个对我而言毫无意义的玩笑,有几个人在窃笑。& u8 p( _8 p) u
+ l0 S! n( K5 \: @+ F
Bill转向我了。8 Q3 x9 z/ _( y* i' u+ A% g
% ~) X) C. x- J; s* b+ ]% C. Z
我注意到在我的说明空白处写着一些注解。他读过第一页!(激动)4 G8 S- U" E) f7 A+ x, w, |
' \' H; b; O3 B/ @4 L$ g
他已经读过第一页并写下了他的笔记!(更激动)
) g6 b6 v, V1 a7 p" H! w/ c: P$ x1 n
因为从提交文稿到他手上不过一天时间,他一定在昨晚之前就读过。
7 j1 S9 _, u1 T8 d5 Z. `) I
. r* E k8 ^: \2 T我们开始一问一答。问题相当简单,但现在我已经记不清了,因为当时我一直在注意着他翻我的文稿...
1 P; @/ c+ B. Z! P& H) Y* R2 K8 X. ]7 E" q# l7 s
他在翻我的文稿!!!(冷静,冷静,你可不是小姑娘了)4 |3 D6 h6 E2 M) _
- ^5 i8 X! D" T5 n ...我看到每页空白都写满了注解,他妈的,他居然全部读完了,还写了注解。4 }$ h! y/ V7 T2 {; g& e) k
" ~7 x# M3 }% r/ t% N# D4 T& r他居然全部读完了! ?4 Q+ \& X. [7 i# s; t: I, q* h9 r
+ ^) O5 z8 E" I2 R/ L3 B
问题开始变得越来越难,越来越细。8 q* [8 L5 ~: K9 X
& ^9 b: h) X" {' p提问有些随机。过去我常常认为Bill是我的大爷,事实上他是一个真正的好淫!他读了我的说明,他的问题可能正记在说明的空白处。以后我一定要把这些问题都在Bug跟踪系统中标记出来。
# Z) r+ O# @/ B( u- ?& W' z% J8 c) ?4 C2 Y9 }; P
终于最难的问题来了。
$ l* O9 w- L9 d4 a, {& L$ ]
3 I4 {. p9 C& h5 b( ?4 t$ E “我不知道,小伙子们”,Bill说,“有人研究过这个细节没有,比如说这些日期和时间函数。Excel有很多日期时间函数,在Basic中是不是能一一对应,他们工作方式是不是都一样的?”
- K6 g0 s3 C/ ] x: P4 k- N0 l. _# ]) r2 u' j
“当然”,我说,“除了1900年的1月和2月”。
2 m# `; `" {% c& P" E* Y0 ^- G* |0 ~0 Y/ ?
沉默。
; p% V& @& ]3 x0 C0 B1 {% E' M" O
“靠”的记录人员和我老板惊讶的对视一眼。这家伙怎么知道的?1月,2月是什么东西?
8 G1 n2 R" F$ [5 y! f9 j6 A+ o
7 P; r) M4 s7 V8 t) ~“OK,很好”,Bill拿起我的说明。
e( S. l# B3 P5 y2 |8 B. Y4 S% b% `9 T$ @
....等等!我想知道....../ {- l/ D2 A2 P
1 g3 H; g: U7 G5 G8 i. ^
他们离开了。
5 q v8 b) ?0 J9 ], b0 w5 q$ f% F u+ e7 x4 q0 r3 t F
“4个”,“靠”的记录者宣布,"这是我有生以来记得最少的一次。也许Bill开始步入中年了"。如你所知,Bill当年36。
0 y; O, |7 d; Q* n
6 @- y. @2 p e后来我对这次Review终于有了一个解释,"Bill并没想真的想要review我的说明,他只是想确定一切是否在我控制之中。他的标准方式是问得越来越难,越来越难,直到你承认你不知道,然后,他就会提醒你你尚未准备好。如果我答起了他最刁钻的问题,没有人会确定会发生什么,因为这以前就没发生过。"! h3 t8 i2 q7 L" Z: A7 s. s
" E0 l- M6 p3 ]: K$ R9 o# F “如果是Jim Manzi在review上会怎么表现?”有人问道,“Manzi会反问,‘什么是日期函数???’”(Jim Manzi就是把Lotus带垮的MBA)
( V6 w- L% o" U1 ?0 V
\& B* E1 M* l* V' J! @' V正确。
9 \! l4 a7 H/ e- y( p1 X
! e- x7 I$ I) o* P Bill Gates是个令人吃惊的技术狂热者,他理解Variants,Com对象,和IDispatch,知道为什么自动化和vtable不一样,也知道这个区别会导致双接口。他担心日期函数,如果不是他信任的人在开发,他会难以入眠。你可以对此嗤之以鼻,但他确实是一个程序员,一个真实的,地地道道的程序员。不是程序员的人去运作一个软件公司就像不会滑板的人跑去冲浪一样。“得了,我有非常棒的顾问在岸边指导我”,他们会一边说一边一次次从滑板上掉下去。那些标准MBA就是相信管理是通用函数。鲍尔默会成为另外一个John Sculley吗?John Sculley曾差点把苹果公司搞垮,只因为董事会相信他卖百事的经历会对运作计算机公司有所帮助。MBA的迷信者通常相信这一点:你可以让组织做你完全不懂的事。
5 A+ u- |( a; _8 G- Q% ]! F" l# S4 T
过去数年,微软变大了,Bill的管理范围过度扩展,他不得不投入更多精力去和US政府打交道。Steve坐上了理论上的CEO这个位置,这可以让Bill花更多的时间做他最擅长的--领导软件开发,但这并不能克服11级管理层带来的问题。它导致无休无止的会议,顽固地不管如何也要创建每种产品的倾向,(微软在研发、官司、公司声誉上损失了多少亿美元,只因为决定开发一个Web浏览器,还让它免费。),还有就是过滥的招聘让微软正逐渐失去中层人员中的精英。(Douglas Coupland在Microserf*中写道:”在1992一年中他们雇佣3100人,你知道并非所有人都是珍珠“)$ [; h" D: s5 a' U' D$ K
& _5 d* m5 r" Z% L0 B! e+ |6 W- z+ _对了,派对已经搬家了。Excel Basic变成了Microsoft Visual Basic for Appliation for Microsoft Excel,这个名字里面的注册商标符号太多,以至于我都不知道应该把他们放在哪里。我于1994年离开了微软,想来Bill已经完全忘记了我。直到有一天我读到华尔街日报对BillGates的一次采访,他提到在过去,象招募一个Excel的程序经理的事情是多么困难,因为他们并非象苹果长在树上那样垂手可得。2 H( J4 S; Y7 w
9 x& h2 G+ i2 t2 s
他是谈我吗?或许应该是别人了吧。 |
|