天天看點

軟體随想錄:程式員部落酋長Joel談軟體(阮一峰譯)-11. 我的第一次BillG審查

1. 我的第一次BillG審查

2006年6月16日,星期五

早先,Excel[①]有一種沒有名字的很蹩腳的程式設計語言。我們管它叫做“Excel宏語言”(Excel Macros)。這是一種功能很弱的程式設計語言,它沒有變量(你不得不将值存在電子表格的單元格中),沒有局部變量(local),沒有子例程的調用(subroutine call);一句話,它的程式幾乎無法維護。不過,它也有一些進階語言的特性,比如任意跳轉語句Goto,但是label标簽實際上是看不到的[②]。

這種語言存在的唯一一點合理性,在于比起Lotus[③]中的宏語言,它看上去很強大。Lotus宏語言程式設計則僅僅是在單元格中敲入一個長字元串。

1991年6月17日,我進入微軟公司的Excel開發小組工作。我的頭銜是“程式經理[④]”(Program Manager),安排給我的職責是為Excel宏語言找到一個解決方案。實際上,所謂解決方案就是要讓它與Basic[⑤]程式設計語言聯系起來。

Basic?一點沒錯!

我花了一些時間,與不同的開發小組進行溝通。那時,Visual Basic 1.0[⑥]剛剛釋出,它真是太酷了。其中包括一個方向錯誤但還在開發中的項目,代号是MacroMan。另外,還有一種面向對象(Object-Oriented)的Basic也在開發,代号是Silver。Silver開發小組被告知,他們的産品将有一個客戶:Excel。Silver的銷售經理是Bob Wyman(是的,就是Bob Wyman那個家夥),他隻需将他們的技術推銷給一個人:就是我。

就像我前面說的,MacroMan的方向錯了,開始有人還不信,不過最後它還是停止了開發。Excel開發小組說服Basic開發小組,我們真正需要的是針對Excel開發的某種Visual Basic。我設法在Basic裡加上了4樣好東西。我讓他們加上了變型(Variant),這是一種可以儲存任何類型資料的資料類型,否則每次要儲存一個單元格中的變量值,你就不得不用switch語句先進行一番判斷。我還讓他們加上“後期綁定”(late binding),後來它被叫做IDispatch接口,又稱COM自動化,因為Silver的原始設計對了解類型系統(type system)的要求很高,而Excel宏語言的各種程式設計者根本不需要懂這個東西。另外兩個我得到的很棒的文法結構是從UNIX的shell語言csh中借鑒的For Each結構,以及從Pascal語言中借鑒的With結構。

然後,我開始坐下來,寫Excel Basic的規格說明書。這個文檔真是巨大,有幾百頁。在我的記憶中,寫完的時候,長度是500頁。(“瀑布開發法[⑦]”,有人在偷笑了。是的,就是這樣,别笑了。)

那個時候,我們有一檔子事叫做“BillG審查”。基本上,比爾·蓋茨會審查每一個重大的功能。我被通知将規格說明書影印一份,送到他的辦公室,準備接受審查。那差不多用掉了整整一包列印紙。

我急忙将規格說明書列印了出來,送到了他的辦公室。

那天晚些時候,我有了一點兒空閑時間。于是,我就開始琢磨,Basic的日期和時間函數是否足以完成所有能在Excel中完成的任務。

在大多數現代程式設計環境中,日期都是以實數形式存儲的。實數的整數部分是從過去某個公認的日期至今所經過的天數,這個公認的日期在Excel中叫做“紀元”(epoch)。比如,今天是2006年6月16日,存儲的值是38884,而對1900年1月1日來說,存儲的值就是1。

我開始看Basic和Excel裡的各種日期和時間函數,東試試西試試,結果我注意到Visual Basic的文檔有一個問題:Basic的紀元不是1900年1月1日,而是1899年12月31日,但是奇怪的是,當天日期的值在Basic和Excel裡居然是相同的。

原因何在?

我找來一位Excel開發人員,他資曆很老,應該記得這些事。艾德·弗萊斯[⑧]看來知道答案。

“哦,”他告訴我,“檢查一下1900年2月28日。”

“存儲值是59。”我說。

“再去看3月1日。”

“存儲值是61!”

“60是哪一天?”艾德問。

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

“思路正确,不過猜錯了。”艾德說,我愣在那裡。

噢,可惡。我又想了想。所有能夠被100整除的年份中,隻有能夠被400整除的年份才是閏年。

1900年不是閏年。

“Excel裡有bug!”我驚呼。

“嗯,其實不是啦,”艾德說,“我們不得不這樣設計,因為我們需要導入Lotus 1-2-3的工作表。”

“你是說,這是Lotus裡的bug?”

“對,不過可能這是故意設計的。Lotus占用的記憶體不能大于640KB。這是很有限的空間。如果忽略1900年,那麼就可以根據最右面的兩位數字是否為0,判斷任意一年是否為閏年。那就簡便多了。Lotus的那些家夥可能覺得,過去的所有時間中隻有兩個月受到影響,不是很重要的事。但是看起來,Basic的那些家夥不想放過這兩個月,是以他們将紀元向前推了一天。”

“天啊!”我發出了一聲感歎,轉而繼續研究,為什麼一個名為“1904日期系統”[⑨](1904 Date System)的選項對話框(options dialog)中有一個複選框(check box)。

第二天就是令人緊張的BillG審查日。

1992年6月30日。

那個時候,微軟還沒有那麼多官僚機構。今天,整個微軟公司的管理層一共有11到12個層級吧。那時不是這樣,我向Mike Conte報告,他向Chris Graham報告,後者再向Pete Higgins報告,後者再向Mike Maples報告,後者再向比爾·蓋茨報告。從上到下,一共6層。我們曾經取笑通用汽車那樣的公司,因為它們有8個管理層或者天知道是幹什麼的層。

在我的BillG審查會上,上面提到的那些人都到場了,每一個人還帶着一大堆聽衆,我懷疑他們将表兄表妹、七大姑八大姨都帶來了。另外,還有一個家夥是和我一個團隊的,他在會議期間的所有工作,就是負責準确記錄比爾爆了多少次粗口。比爾說Fxxx這個詞的次數越少,就代表審查的結果越好。

比爾進來了。

我覺得很不正常,他幾乎和普通人一模一樣,也是兩條腿、兩隻手、一個腦袋。

他的手裡拿着我寫的規格說明書。

他的手裡拿着我寫的規格說明書!

他坐下後,同一個我不認識的經理說了幾句俏皮話,我沒聽懂。一些人倒是哈哈大笑。

比爾轉向我。

我注意到,規格說明書的頁邊空白處寫有評語。他看過第一頁!

他看了我寫的規格說明書,并且在空白處留下了幾句評語!

因為我們是在大約24小時前交給他這份檔案的,是以他一定是在昨天晚上看的。

他提問,我回答。那些問題很容易,但是後來我極盡所能,也想不起來他當時到底問了些什麼問題。因為我一直目不轉睛地看着他快速翻動那份說明書……

他在翻我寫的規格說明書![淡定,難道你是沒見過世面的小姑娘?]

……我還看到,所有的空白處都寫着評語。檔案的每一頁都是如此。天哪,他居然從頭看到了尾,并且在空白處寫了評語。

他看了所有内容![我的老天啊,怎麼可能!]

他的提問越來越難,也越來越細了。

那些問題似乎不太有條理。到這個時候,我已經把比爾當成自己人了。他真是不錯!他看了我寫的規格說明書!他想問我的,大概都跟那些頁邊上的評語有關吧!我要在錯誤送出系統中,把他的每一條評語都放進去,并且確定得到處理,一定要快!

最後是一個很要命的問題。

“我不知道,諸位,”比爾說,“你們有人真地看過有關實施的所有細節嗎?比如,所有這些日期和時間函數。Excel有那麼多日期和時間函數,Basic也要有相同的函數嗎?能保證它們的行為都一樣嗎?”

“是的,”我說,“隻有1900年的1月和2月除外。”

一片寂靜。

那個粗口記錄員和我的上司驚訝地對視了一眼。他們一定奇怪,我怎麼會知道那個?1月和2月是什麼鬼東西?

“行了。好,做得不錯,”比爾說。他拿起那份寫滿評語的規格說明書。

……别啊!我要那個……

他離開了。

“4次,”粗口記錄員宣布,每個人聽了都說:“哇,這是我記憶中的最低紀錄。比爾随着他的年齡增長變穩重了。” 那一年,你們都知道,他36歲。

後來,我自己是這樣想的:“比爾并不是真地想來評論你寫的東西,他隻是想确定你對實作那些目标是不是有把握。他的标準做法是不斷地提問,越問越難,直到你答不上來,承認自己不知道為止。然後,他會沖着你吼‘為什麼沒有準備好’那個他準備好的最難的問題,如果你答出來了,沒人知道會怎麼樣,因為還沒有人答出來過。”

“如果提問題的是Jim Manzi呢?他會提什麼問題?”有人問。“他大概會問你,‘什麼是日期函數?’”

Jim Manzi隻知道MBA(工商管理碩士)。Lotus在他的上司下,走了下坡路。

這是很重要的一點。比爾·蓋茨對技術的了解令人驚歎。他了解可變資料類型、COM對象、IDispatch接口以及Automation與虛表有何不同,他明白這種不同可能會導緻雙重接口(dual interface)。是以,他擔心日期函數并非心血來潮。如果他信任那個幹事的人,他就不會幹涉軟體。但是,你不要糊弄他,哪怕是一分鐘,因為他也是一個程式員,一個真正的、現實的程式員。

不懂程式設計的人管理軟體公司,就好像不懂沖浪的人硬要去沖浪。

“沒關系的!我請了非常棒的顧問,他們在岸上告訴我怎麼做!”那些人會這樣說。但話音未落,就會一頭從沖浪闆上摔下來,而且樂此不疲。這是那些MBA的标準說辭,他們從心底裡相信,管理是一種通用職能。史蒂夫·鮑爾默[⑩]會不會成為第二個約翰·斯考利[11]?後者幾乎讓蘋果公司破産,原因僅僅是,那時的蘋果公司董事會相信,知道如何賣百事可樂就可以管理好一家計算機公司。迷信MBA的人們總是願意相信,懂不懂公司業務沒關系,隻要懂管理就行。

多年以來,微軟公司逐漸變得龐大,比爾·蓋茨的精力被分散了,一些道德上有瑕疵的決策使公司的管理層不得不将大量的精力轉向與美國政府抗争[12]。史蒂夫·鮑爾默接任CEO[13],在理論上可以讓比爾将更多的時間花在他最擅長的事情上,也就是管理軟體開發組織。但是,這看上去好像無助于解決某些因為特殊原因引起的内部問題,比如像11層的管理結構,永無止境的開會文化,一種要将所有可能的東西都創造出來而不管這樣東西是什麼的頑固傾向(想一想吧,他們決定做一個網絡浏覽器,而且還要免費釋出,結果在研發、打官司、公司名譽上面損失了幾十億美元),以及長期以來使得中層幹部素質下降的匆忙、草率的招聘機制。(就像Douglas Coupland在Microserfs[14]一書中所說的:“他們在1992年雇用了3100人,其中并不都是人才。”)

好了,不說了。聚會要到其他地方開了。後來,Excel Basic成了微軟Visual Basic應用程式語言Excel版(Visual Basic for Applications for Microsoft Excel),裡面的注冊商标标志™和權利保留符号®多到我都不知道怎樣才能将它們都放進去。我在1994年離開了微軟,我覺得比爾已經徹底将我忘了。直到我在《華爾街日報》上看到一篇不長的比爾·蓋茨專訪,他在談到招募優秀員工是多麼困難時,順帶舉了一個例子,說比如一個優秀的Excel軟體經理,他們不會自動從樹上長出來,諸如此類的話。

他會不會在說我?不會,可能是在說其他人吧。

都過去了。

[①]  Excel是微軟公司的電子表格軟體,第一個版本是在1985年釋出的,從1993年第5版起,被并入Microsoft Office軟體套裝中。

[②]  Goto語句通常和label配套使用,使程式直接跳轉到label處。一般認為,這種跳轉功能對結構化程式設計是一種破壞,不提倡使用。作者在這裡說:“label實際上是看不到的”,意即Goto語句在“Excel宏語言”中,隻能直接跳轉到行号,比label還不如。

[③]  這裡Lotus指的是電子表格軟體Lotus 1-2-3,這是20世紀80年代最流行的電子表格軟體。微軟開發Excel的直接目的,就是與Lotus 1-2-3進行競争。

[④]  微軟的程式經理是個很特殊的職位,選擇标準是:技術水準是程式員隊伍中的最進階别,能做最多且最難的工作,有人格魅力。比爾·蓋茨将程式經理描述為程式員隊伍中最聰明的那個家夥。——編者注

[⑤]  Basic語言是進階程式設計語言之一,最早是在1964年出現的。它是微軟公司起家的程式設計語言。

[⑥]  Visual Basic是微軟公司基于Basic語言開發的第三代事件驅動的程式設計語言,主要特點是完全在圖形界面上進行程式設計。Visual Basic 1.0是在1991年5月釋出的。

[⑦]  瀑布開發法(Waterfall),是一種軟體開發方式,按照順序從頭到尾一步步完成,就好像垂直的瀑布一樣,完成上一個階段後,再前進到下一個階段。現在一般認為這種方式已經過時。

[⑧]  艾德·弗萊斯(Ed Fries),後來轉為開發遊戲,成為微軟遊戲部門的副總裁,并且是Xbox的早期主要開發人員之一。他已于2004年1月離開微軟。

[⑨]  1904日期系統是微軟公司為了解決1900年閏年問題設計的另一個日期系統。它支援的日期紀元是1904年1月1日。

[⑩]  史蒂夫·鮑爾默,微軟公司CEO。1977年,他從哈佛大學大學畢業,專業是數學和經濟學。1980年,他從哈佛商學院退學,應比爾·蓋茨的邀請,加入微軟公司,擔任微軟的第一任商業事務經理(business manager)。他是微軟曆史上的第24名員工。

[11] 約翰•斯考利,一位美國專業經理人。1977年至1983年,他擔任百事可樂公司的總裁。1983年4月,他應創始人斯蒂夫·喬布斯的邀請加入蘋果公司,擔任CEO,一直到1993年離職。1985年,他與喬布斯之間的沖突更新,迫使後者離開蘋果公司。此後,在他的上司下,蘋果公司的業績一落千丈,幾乎破産。

[12] 1998年,微軟公司釋出Windows 98作業系統,其中捆綁了IE浏覽器。這遭到了美國司法部起訴,原因是“濫用壟斷”(abusive monopoly)。2000年4月3日,微軟公司一審敗訴,被判一分為二。這個判決後來被聯邦上訴法院部分推翻。2001年,微軟公司與美國司法部達成和解。

[13] 鮑爾默2000年1月被任命為微軟公司的CEO。1998年,他被任命為總裁,比爾·蓋茨自己擔任董事會主席和CEO。

[14]        該書由HarperCollins出版社在1995年出版,是一本書信體小說,講述Windows 95釋出前的計算機行業的狀況。

繼續閱讀