(點選上方公號,快速關註我們)
英文:joelonsoftware,編譯: 伯樂線上/Lada
【導讀】:本文作者是 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 結果越好。
(伯樂線上補圖。看到上句標紅的地方,不由自主想到這張漫畫 ?)
Bill 進來了。
我感覺太奇怪了,他竟然有兩條腿、兩個胳膊和一個腦袋。幾乎和普通人類完全一樣。
在他手上拿著我的規格說明書。
我的規格說明書在他手上!
他坐下,和一個我不認識的高管,戲謔了幾句對我而言沒什麼意義的話。一些人笑了。
Bill 轉向我。
我註意到我的規格說明書邊緣上有一些評論。他已經看過第一頁了!
他已經看過我規格說明書的第一頁了,而且還在邊上寫了幾句筆記!
想到我們剛在 24 小時前把規格說明書送給他,他一定是在昨天晚上閱讀它的。
他問了幾個問題。我回答了。它們非常簡單,但我之後再也記不起都問了什麼,因為我目不轉睛地看著他翻閱著規格說明書……
他在翻閱著規格說明書!(冷靜,你是沒見過世面的小女孩麼?)
……並且,邊上都寫著筆記。在規格說明書的每一頁都有。天啊,他已經閱讀過了整個檔案,並且在所有邊緣寫上了筆記。
他讀了整個檔案!(天啊,怎麼可能!)
提問越來越難,越來越細。
問題似乎有點隨機。那時我已經把 Bill 當成自己人了。他是個不錯的傢伙!他讀完了我的規格說明書!他可能只是想問我幾個和寫在邊上的評論相關的問題。我要開啟錯誤提交系統,把他的每一條筆記都放進去,並且確保得到重視和解決,要快!
最後是一個很要命的問題。
Bill 說,“我不知道你們有誰真的看過如何去做的所有細節?比如,所有的日期和時間函式。Excel 有大量的日期和時間函式,Basic 是否也有一樣的函式?它們工作的方式一樣嗎?”
“看過,”我回答到,“除了 1900 年的 1 月和 2 月。”
一片寂靜。
粗口記錄員和我上司驚訝地對視了一眼。我是怎麼知道的?1 月 和 2 月怎麼了?
“好。那麼,做的不錯,”Bill 這麼說。他拿起他做了筆記的規格說明書影印件。
……等等!我想要那個!
然後他走了。
“4 次。”粗口記錄員彙報道。所有人都說:“哇。這是我記憶中的最低記錄。Bill 隨著年齡大起來越來越穩重了。” 那年,他 36 歲。
後來,我自己解釋:“Bill 並不是真的要評論規格說明書,只是想確保你已經完全掌握了它。他的標準做法是不斷提問,越問越難,直到你承認你不懂,接著他就會吼你‘為什麼沒準備好?’ 沒人真的知道,如果答出來了那個他丟擲的最難得問題會怎麼樣,因為之前還沒人答上過。”
“你能想象如果 Jim Manzi 在那個會上嗎?”有人問。“Manzi 會問你‘什麼是日期函式?’”
Jim Manzi 是 MBA 型別的領導,他把 Lotus 帶上了下坡路。(伯樂線上補註:Jim Manzi 1982 年加入 Lotus 公司。1984 年成為 Lotus 總裁。)
這是很重要的一點。Bill Gates 是個驚人的技術人員。他理解可變資料型別、COM 物件、IDispatch 介面,以及 Automation 和虛表有什麼不同,為什麼這樣會導致雙重介面(dual interfaces)。他擔憂日期函式。他不會幹涉軟體,如果他信任為此工作的人。但你一分鐘也不能糊弄他,因為他是一個程式員。一個真真正正的程式員。
看那些不懂程式設計的人想經營一家軟體公司,就像看不會衝浪的人硬要去衝浪一樣。
“沒關係。我有極好的顧問站在岸邊告訴我如何去做!”他們這樣說,結果他們會一次又一次的從滑板摔落。這是那些 MBA 的標準說辭,他們相信管理是一項通用技能。鮑爾默會成為另一個 John Sculley 嗎? John Sculley 幾乎差點讓蘋果(Apple)破產,就因為那時蘋果的董事會相信一個整天想著賣百事可樂的人能準備好經營一家計算機公司。MBA 的崇拜者樂於相信人可以經營一家公司,而根本不懂公司業務。
幾年過去,微軟逐漸變得龐大。Bill 精力分散,一些道德上名聲不好的決策,使得公司管理需要在很多方向上與美國政府抗爭。鮑爾默接手微軟 CEO 的角色,在理論上能夠讓 Bill 把更多時間放在他的長處上,去經營軟體開發組織,但這似乎並沒有解決由於一些特殊原因造成的問題。像是11 層的管理結構、無盡的開會文化、一種將所有可能產品都製造出來的固執,無論那是什麼。(微軟流失了不可計數的美元,在研發、法律費用和名譽損失上,只因為他們決定不僅必須要做一個瀏覽器,而且還必須要免費釋出。)以及幾十年以來匆忙、草率的招聘使微軟中層的水平下降。(Douglas Coupland 在 Microserfs 中說:他們在 1992 年僱傭了 3100 人,其中並不都是人才。)
好了。聚會已經搬到了其他地方。Excel Basic 成為了 Microsoft Visual Basic 應用程式微軟 Excel 版,有太多註冊商標(TM)和(R)以至於我不知道該把它們放哪。我在 1994 年離開了微軟公司,以為 Bill 已經完全忘記了我,直到我發現《華爾街日報》上一篇 Bill Gates 的小專訪。裡面他講到招聘是多麼難的事時,幾乎只是順便一提地說了,就像一個優秀的 Excel 程式經理,他們不是簡單地長在樹上,諸如此類的話。
他會不會是在說我?不會吧,那可能是別的什麼人。
一切都定格在過去了。
看完本文有收穫?請轉發分享給更多人
關註「程式員的那些事」,提高程式設計技能
淘口令:複製以下紅色內容,再開啟手淘即可購買
範品社,使用¥極客T恤¥搶先預覽(長按複製整段文案,開啟手機淘寶即可進入活動內容)
近期,北京地區正常發貨,但派件時間有所延長。