1. 程式人生 > >比爾·蓋茨評審產品時說 F**k 最少的一次

比爾·蓋茨評審產品時說 F**k 最少的一次

【導讀】:本文作者是 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 結果越好。

(看到上句標紅的地方,伯小樂不由自主想到這張漫畫