——選自《軟體隨想錄:程式設計師部落酋長joel談軟體》
2006
年 6月 16
日 ,星期五
早先, excel[1]
有一種沒有名字的很蹩腳的程式語言。我們管它叫做 「 excel 巨集語言」( excel macros )。這是一種功能很弱的程式語言,它沒有變數(你不得不將值存在電子**的單元格中),沒有區域性變數( local ),沒有子例程的呼叫( subroutine call );一句話,它的程式幾乎無法維護。不過,它也有一些高階語言的特性,比如任意跳轉語句 goto ,但是 label 標籤實際上是看不到的 [2]
。 這種語言存在的唯一一點合理性,在於比起 lotus[3]
中的巨集語言,它看上去很強大。 lotus 巨集語言程式設計則僅僅是在單元格中敲入乙個長字串。
1991 年 6 月 17 日 ,我進入微軟公司的 excel 開發小組工作。我的頭銜是「程式經理 [4]
」( program manager ),安排給我的職責是為 excel 巨集語言找到乙個解決方案。實際上,所謂解決方案就是要讓它與 basic[5]
程式語言聯絡起來。
basic ?一點沒錯!
我花了一些時間,與不同的開發小組進行溝通。那時, visual basic 1.0[6]
剛剛發布,它真是太酷了。其中包括乙個方向錯誤但還在開發中的專案,代號是 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 頁。(「瀑布開發法 [7]
」,有人在偷笑了。是的,就是這樣,別笑了。)
那個時候,我們有一檔子事叫做「 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 開發人員,他資歷很老,應該記得這些事。艾德·弗萊斯 [8]
看來知道答案。
「哦,」他告訴我,「檢查一下 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 日期系統」 [9]
( 1904 date system )的選項對話方塊( options dialog )中有乙個核取方塊( check box )。
第二天就是令人緊張的 billg 審查日。
【繼續】http://blog.csdn.net/turingbooks/archive/2009/12/03/4933293.aspx
[1]
excel 是微軟公司的電子**軟體,第乙個版本是在 1985 年發布的,從 1993 年第 5 版起,被併入 microsoft office 軟體套裝中。
[2]
goto 語句通常和 label 配套使用,使程式直接跳轉到 label 處。一般認為,這種跳轉功能對結構 化程式設計是一種破壞,不提倡使用。作者在這裡說:「 label 實際上是看不到的」,意即 goto 語句在「 excel 巨集語言」中,只能直接跳轉到行號,比 label 還不如。
[3]
這裡 lotus 指的是電子**軟體 lotus 1-2-3 ,這是 20 世紀 80 年代最流行的電子**軟體。微軟開發 excel 的直接目的,就是與 lotus 1-2-3 進行競爭。
[4]
微 軟的程式經理是個很特殊的職位,選擇標準是:技術水平是程式設計師隊伍中的最高端別,能做最多且最難的工作,有人格魅力。比爾·蓋茨將程式經理描述為程式設計師隊伍中最聰明的那個傢伙。——編者注
[5]
basic 語言是高階程式語言之一,最早是在 1964 年出現的。它是微軟公司起家的程式語言。
[6]
visual basic 是微軟公司基於 basic 語言開發的第三代事件驅動的程式語言,主要特點是完全在圖形介面上進行程式設計。 visual basic 1.0 是在 1991 年 5 月發布的。
[7]
瀑布開發法( wate***ll ),是一種軟體開發方式,按照順序從頭到尾一步步完成,就好像垂直的瀑布一樣,完成上乙個階段後,再前進到下乙個階段。現在一般認為這種方式已經過時。
[8]
艾德· 弗萊斯 ( ed fries ),後來轉為開發遊戲,成為微軟遊戲部門的副總裁,並且是 xbox 的早期主要開發人員之一。他已於 2004 年 1 月離開微軟。
[9]
1904 日期系統是微軟公司為了解決 1900 年閏年問題設計的另乙個日期系統。它支援的日期紀元是 1904 年 1 月 1 日 。
比爾蓋茨是這樣審查專案的 1
選自 軟體隨想錄 程式設計師部落酋長joel談軟體 2006 年 6月 16 日 星期五 早先,excel 1 有一種沒有名字的很蹩腳的程式語言。我們管它叫做 excel 巨集語言 excel macros 這是一種功能很弱的程式語言,它沒有變數 你不得不將值存在電子 的單元格中 沒有區域性變數 l...
比爾蓋茨的審查
簡介 joel spolsky 技術部落格中的超級牛人,原來是微軟excel專案中的乙個程式經理,本文回憶了比爾.蓋茨第一次審查他的文件的故事 當小牛遇到大牛 非常有趣,excel 曾自帶了乙個糟糕透了的開發語言,當時這個語言還沒有名字。我們稱其為 excel macros 它沒有變數 區域性變數 ...
今天是比爾 蓋茨生日
下面是比爾 蓋茨先生的資料 1955年10月28日,比爾 蓋茨出生 微軟公司 microsoft 的創始人 現任總裁比爾 蓋茨是目前世界上最富有的人之一,他的資產逾千億,被美國人譽為 坐在世界巔峰的人 比爾 蓋茨70年代曾經就讀於美國哈佛大學,但是兩年以後,他沒有完成學業就離開了這座著名的校園,其中...