程式設計大師訪談人物——比爾·蓋茨

出版圈郭志敏發表於2011-12-15

《程式設計大師訪談錄》已經上市,在本書中,最具影響力的當屬比爾·蓋茨,圖靈社群將此篇訪談公佈出來,供大家賞讀。在訪談開始之前,先讓我們瞭解一下這位大師級人物。

enter image description here

青年時代的蓋茨

enter image description here

現在的蓋茨

威廉·亨利·蓋茨 (William Henry Gates)

暱稱比爾·蓋茨 (Bill Gates) 1955年10月28日出生,在西雅圖長大。他的父親威廉·亨利·蓋茨是一位律師,母親是一位教師,性格堅強,富有獨立性,善於與人交往。蓋茨是家中三個孩子中唯一的男孩,排行第二。從少年時代熱衷於電腦遊戲,富於想像力,14時不再上數學課,因為他已很好地掌握了數學知識。1973年進入哈佛大學法律系學習,19歲時退學,與同伴保羅·艾倫(Paul Allen)創辦電腦公司,直到後來創辦了微軟公司,自任董事長、總裁兼執行長。1998年1月,他將總裁一職讓給史蒂夫·鮑爾默,2000年1月13日,他宣佈不再擔任該公司的執行長一職,以便從對公司日常事務的管理中脫出身來,集中精力推進下一代視窗因特網平臺及其服務工作。 2008年6月27日是蓋茨在微軟全職工作的最後一天。不過,現在他依然擔任微軟的非執行主席。

進入訪談:

作為微軟的CEO,威廉•H. 比爾•蓋茨(William H. Bill Gates)被認為是當今個人計算領域和辦公自動化行業一個強有力的推動者。比爾•蓋茨從年輕時就開始了計算機軟體的職業生涯。當蓋茨和微軟的聯合創始人保羅•艾倫還在華盛頓州的西雅圖上高中時,兩人就開始做起了程式設計顧問的工作。1974年,蓋茨在哈佛大學讀本科時,他與艾倫合作為第一臺商用微型計算機MITS Altair開發了一套BASIC程式語言。在那個專案順利完成後,兩人創辦了微軟公司,為新興的微機市場開發並銷售軟體。

微軟為軟體產業在程式語言、作業系統和應用軟體等各方面設定了標準。蓋茨為微軟提出了新產品的創意和技術發展的遠景。在開發新產品時,他還會親自指導技術小組,投入時間複審和完善微軟所銷售的軟體。 蓋茨出生於1955年,是西雅圖本地人,至今一直居住在那裡。

*    *    *

採訪者:顯然,作為微軟的CEO,你的責任重大。你現在仍在程式設計嗎?

蓋茨:我現在不程式設計了。我仍會在演算法設計和基本方法上提供幫助,有時也會看看程式碼。但自從完成IBM PC BASIC和Model 100上的工作後,我就再也沒機會自己動手編寫程式了。

採訪者:在微軟的軟體開發過程中,你扮演了什麼樣的角色?

蓋茨:我做兩件關鍵的事情。一是選擇在程式中放入哪些功能。為了做到這一點,必須合理把握什麼事情容易做、什麼事情不容易做。還必須明白你追求的產品系列的策略是什麼樣的,並要關注硬體領域的進展。 此外,我還致力於實現新功能的最佳方案,也就是如何把新功能做得既小又快。例如,我寫過一個備忘錄,是關於如何設計和實施Excel中的一項功能的:每當螢幕發生變化時,程式都要重新計算其中的公式。

在公司成立後最初的4年,我參與編寫和設計了微軟所有的程式。在所有這些最初的產品中,無論是BASIC、FORTRAN、BASIC 6800還是BASIC 6502,沒有一行程式碼是我沒有檢查過的。但現在我們有大約160名程式設計師了,所以我主要是做產品和演算法的複查。

採訪者:你認為你在程式設計上最大的成就是什麼? 蓋茨:那得說是為8080編寫的BASIC了,因為程式當時所產生的影響,而且因為我們設法把程式做得很小巧,非常適合當時的使用場景。那是我們決定創辦微軟時所編寫的最早的程式。

我們三個人都清楚地記得那個最早的程式。我們得到了一個機會,在新墨西哥州的阿爾伯克基花了整整一個夏天,把程式徹底重寫了一遍。我認為可以節省幾個位元組,讓程式更精簡。我們非常非常仔細地除錯著,最終得到了那個4K的BASIC解釋程式。

當你非常瞭解一個程式,覺得沒有人在看了程式後會說“還可以做得更好”時,那種感覺真是太棒了,而且程式用在了很多機器中,讓人覺得編寫那樣一個程式是件很興奮的事情。

我還非常喜歡為Model 100編寫的那個程式,特別是我們把一個非常有用的小編輯器壓縮到了軟體中。我和一個名叫傑米•鈴木(Jey Suzuki)的日本程式設計師合作完成了那項工作。我們在非常有限的時間內完成了那個專案。如果編寫的軟體要燒入ROM,你是沒有機會可以犯錯的。

採訪者:你認為計算機程式設計中最困難的部分是什麼?

蓋茨:最困難的部分是確定採用什麼演算法,然後還要儘可能地簡化演算法。做到最簡單的形式是很難的。必須在心中模擬程式是如何工作的,必須完全瞭解程式各部分是如何一起工作的。最好的軟體是其中有一個程式設計師完全瞭解程式的工作方式。要做到這一點,必須要特別熱愛程式設計,集中精力讓程式變得極為簡潔。

採訪者:隨著計算機能力越來越強大、記憶體越來越多,程式設計會變得越來越複雜,還是會變得越來越拙劣呢?這對人們編寫程式的方式會產生什麼樣的影響?

蓋茨:我們已經不再生活在每一個程式都精雕細琢的時代了。但是你會發現,程式要做到頂尖,最重要的是,那些關鍵的內部程式碼都是由少數幾個知道自己在做些什麼的人編寫出來的。

現在把程式壓縮到4K的記憶體區域中已經不那麼重要了。你在很多情況下會看到人們使用C語言,而不再使用匯編語言了。遺憾的是,很多程式都太大了,已經沒有一個人可以真正瞭解整個程式的所有部分了,所以能得到的共享程式碼也不是很多。此外,因為一直要在同一個程式中新增新功能,所以也沒有太多機會讓你回去重寫程式碼。

最糟糕的程式是原來的程式設計師在開始時沒有打好基礎,而他們也沒有再參與到程式的後續開發中。在這類程式上繼續工作就會遇到一種我所說的“實驗性程式”的情況。程式設計師對那些程式瞭解得太少,他們不知道改動之後會影響什麼,比如說會不會影響執行速度。他們可能會使用已經存在的程式碼,他們也有可能並不知道如果修改了程式碼,會破壞何種依賴關係。於是他們加入了新程式碼,並在執行之後說:“噢,看哪,它不是那樣執行的。”這種處理程式的方法效率非常非常低,但很多專案到了最後卻都是這樣的。

採訪者:在一個像微軟這樣有160名程式設計師的公司中,你是如何創造一個環境以確保能開發出成功軟體的?

蓋茨:一種方法是建立小型的專案團隊,通常是四五個人一組,其中一個人經證實有能力掌控整個程式。如果這個專案帶頭人遇到不確定的事情,他會與經驗更為豐富的程式設計師一起討論。

我們的部分策略是讓所有程式設計師在進入編碼階段之前都先想清楚每一件事情。編寫程式設計文件是至關重要的,因為在把問題當做演算法看的時候,問題會得到很大的簡化。可以說演算法是最簡單的形式,從中可以看出問題在什麼地方是重疊的。

另一個重要因素是程式碼複查,要確保程式碼是看過的,看看資深人士是否能提出如何做得更好的建議。而且你必須參考類似的、做得特別特別好的專案。程式設計師可以看看以前其他人是怎麼做的,從其他專案獲得改進自己程式的想法和經驗。

採訪者:那些程式的構思是怎麼來的?

蓋茨:嗯,說實在的,還真沒有什麼正式的流程。在微軟,通常在晚上或週末會有一個集思會。大家會有些大致的想法,比如說,我們要做世界上最好的字處理器,我們希望技術出版部門藉助這個字處理器能夠做他們想做的每一件事。為此我們會坐下來討論:怎樣才能讓程式真正快捷?能夠嵌入繪圖功能嗎?能夠讓字型平滑但又不降低程式的效率嗎?各種各樣的問題都會透徹地討論,接著就會出現一些好的想法。

採訪者:大體說來,程式的構思是集體智慧的結晶?

蓋茨:對於決定要開發哪些程式,我們有一個相當大的團隊來提出建議。然後會有一個篩選的過程,最後由我決定哪些想法是有意義的。我要確保專案有一些專案帶頭人,能夠親自參與專案,確保產品開發成功。為了開發一個產品並制定新的世界級的標準,需要投入非常大量的資源,所以我們選擇的專案會非常非常少。

採訪者:很多人都在談論大型軟體公司要想吸引能開發出優秀軟體的人才有多難,因為這些大俠都太特立獨行了,他們喜歡獨自作戰。在微軟,你們是如何吸引並留住那些優秀人才的?

蓋茨:優秀的程式設計師對於軟體產品的開發是至關重要的。但是我們不贊同獨行俠的做法,不會僅僅因為一個人很優秀,就允許他在程式碼中不新增註釋,或允許他不與其他人溝通,或是允許他把自己的想法強加給別人。

我們希望程式設計師能夠相互尊重。我認為大多數優秀的程式設計師都希望周圍有其他優秀的程式設計師。當他們想出了一個很好的演算法時,他們希望周圍有能夠欣賞其絕妙之處的同事。因為你在構想那個演算法、腦海中產生那樣一個模型時,那是個寂寞的事情。如果你原來以為處理過程很複雜,但卻找到一個辦法,讓過程變得很簡單,那種感覺好極了。不過你需要從其他程式設計師那裡得到一些反饋。如果已經有了幾個優秀的程式設計師,就會吸引更多優秀的程式設計師。

傳統的管理規則是,程式設計師的管理者總是一個更加出色的程式設計師,沒有我們所說的“技術倒掛”,讓程式設計師為一個不知道程式設計為何物的人工作。我們仍舊遵循這一理念:在一定的級別上,我們會用業務經理,但不會用非程式設計師管理正在開發的軟體專案。

採訪者:你認為開發優秀的程式有什麼特定規則嗎?

蓋茨:有些人剛一進到專案中就開始坐下來編碼,而有些人則在編碼之前把所有的過程都想清楚,我認為你會發現那些一開始就坐下來編碼的程式設計師只是在把那些程式碼當做草稿使用。那些在他們頭腦中思考的內容才是最重要的。

你必須得有非常聰明的程式設計師。一個優秀的程式設計師會一直不斷地思考所開發的程式,無論是開車還是吃飯。不停地思考問題,需要耗費大量的腦力。

採訪者:你的程式設計風格是什麼?

蓋茨:我喜歡在坐下來編寫程式碼之前先把整個設計方案構想清楚。而在完成程式碼後,我喜歡回去把它從頭到尾再全部重寫一遍。

編寫程式最重要的部分是設計資料結構。接下來重要的部分是分解各種程式碼塊。在開發到那一步並寫出程式碼之前,你無法敏銳地感知那些公共子例程應該是什麼樣的。

我所寫過的真正優秀的程式都是在開始動手程式設計前已經花了大量時間去思考的。我在高中時為一臺小型機編寫了一個BASIC解釋程式。我在那個程式中犯了很多錯誤,後來我得到機會,看到了一些其他的BASIC解釋程式。這樣當我在1975年坐下來編寫微軟的BASIC解釋程式時,問題已經不在於是否能寫出程式來,而在於能不能把程式壓縮到4K,並得到非常快的執行速度。整個過程中我都在緊張地思考:“速度夠快了嗎?其他人會做得更快嗎?”

我一直記得一個人,他是我在TRW公司遇到的,名叫諾頓。我沒有做到特別好的時候,他總會給我指出來。所以當我草率或偷懶的時候,我總是想象著他會走過來,看一看程式,然後告訴我:“你看,這兒有一個更好的方法。”在程式設計的過程中很容易引入一些小的低效率的做法,要想獲得良好的感覺,就必須時刻保持警覺,不能讓這類東西侵入,這也是為什麼有時候和其他人在專案中一起工作會讓你覺得痛苦的原因。因為他們從來都不能按照你希望的方式編寫程式碼。記得當我們在做BASIC解釋程式時,我常常回去重新編寫其他人的部分程式,但又沒有做出什麼特別大的改進。這種做法會困擾你的同事,但有時你覺得必須那樣做。

採訪者:在和團隊一起工作時,你總是設計方面的帶頭人嗎?

蓋茨:是的,在我直接參與的所有專案中,我都是設計帶頭人。最初編寫BASIC時,我在紙上畫出了設計草案。我的合作者保羅•艾倫設計並實現了所有開發工具。

在坐下來編碼之前,大部分指令都已經在我的腦海中執行了。這並不是說所有的設計都已經很好地完成了,我也會做修改的,但所有好的想法在開始編碼之前就都想到了。如果在某處有一個bug,我會覺得很不舒服,因為如果存在bug,說明你在腦海中的模擬是不完美的。而一旦腦海中的模擬不完美,在程式中就有可能會有幾千個bug。我真的很討厭看到一些人在程式設計的時候不動腦筋。

我最有趣的程式設計經驗是在我們編寫BASIC程式的時候。那時我已經開發完成了8080上的BASIC程式,接下來有大約兩週的時間可以和馬克•查姆伯林(Mark Chamberlain)一起開發6809版本的BASIC程式。在那兩星期的開始幾天,我讀了新的指令系統,接著寫了三四個程式。我還讀了一些其他程式,看看別人是如何使用指令集的。把自己已經理解的問題對映到這個新的指令集中,看看如何將它們緊密地結合在一起,真是非常有趣。 如今的程式變得非常臃腫,因為人們在程式中加入了特殊檢查,所以功能的提升往往會降低程式的效率。當他們想增加功能時,就會加入某類檢查,卻不考慮這樣做也許會降低程式效率。必須有一個程式設計師能完全瞭解整個程式,防止這種現象的發生。比如我們在完成BASIC程式後,我和其他最初的開發人員都離開了那個專案,程式在此後大約3年的時間裡都沒有開發過任何創新的東西。直到在過去的一年半中,我們才有程式設計師感到自己完全掌握並全面瞭解了那個BASIC程式,能夠說:“哦,放些子例程進去,很容易就能去掉行號了。”直到那時我們才對程式做了更新。其實我們一直都想更新那個程式,但是如果程式設計師僅僅會在表面打些補丁,而不知道如何深入部件或語句分析器的內部,你是沒有信心去動那些程式的。

的確,我們會允許程式比本該有的稍臃腫些。但在速度方面,不允許因懶惰而不設法使程式儘可能地快,因為使用者會留意到程式是否非常非常快,即使他們未必能直言不諱。那些最成功的軟體,程式的執行速度都非常快。

採訪者:你是如何在速度和效能之間進行權衡的?

蓋茨:有時候是需要在新增功能和快速執行之間進行權衡的,但也有其他辦法,即使增加很多很多功能,速度也照樣快。一般來說,你要確定程式中最常見的情況是什麼,並要確保它們執行通暢,不會陷入到那些特殊情況的檢查中。因為如果在主要的互動迴圈流程中有各種各樣的檢查,程式就會比別人的慢。

採訪者:當你提出一個想法,要做世界上最好的字處理器時,你們是怎樣做的,如何設計的?是否考查過市面上所有的字處理器?

蓋茨:是的,我們考查了其他字處理器的功能。在考查時你會想:“會有人在螢幕上對字型做平衡處理嗎?還是說螢幕上顯示的與列印出來的完全一樣?執行速度怎麼樣?”通常,那些尖端的產品中,有人會採用非常非常昂貴的硬體,使用蠻幹而不動腦筋的方式解決問題。我們不能那樣做,因為執行我們軟體的微機速度有限。我們要做的很多事情在高階計算機上都已經有了,我們要在成千上萬的微機上也實現這些功能。

你可以在產品中使用大量的技巧。在建立功能列表的同時你要嘗試回答下面這個問題:“為什麼我們的演算法比別人的都好?”功能在某種程度上也可能使產品變得很糟,因為功能越多,使用者手冊就越厚。而功能只對那些肯花時間去使用它們的人才有用,這不像速度——如果列印頁面的速度更快,在螢幕上顯示的速度更快,重新計算的速度更快——那麼產生的價值是驚人的。如果能夠提供一些簡單的命令,程式通過這幾個簡單的命令就能有效地滿足使用者的需求,那麼結果會好得多。非常好的程式的一個標誌是在內部也能遵循簡單的理念。如果程式想實現複雜的功能,可以通過簡單的內部操作呼叫程式碼,而不必從頭開始去做一系列複雜的操作。

採訪者:終端使用者的重要程度如何?你如何知道資料庫管理員對資料庫或報表的真正需求和要求是什麼?

蓋茨:嗯,對於終端使用者究竟想要什麼,有些程式設計師用不著假裝對此有很直觀的洞察力,但他們仍是世界級的程式設計師。不過對市場的認識是很重要的,尤其是在應用程式組,所以我們有全職的工作人員,專門向客戶演示程式碼、調研行業規範或其他相關資訊。在微軟剛成立的時候,我們只開發系統程式。我們是程式設計師,所以知道程式設計師想要的是什麼。因此我們編寫了BASIC語言。

**採訪者:**BASIC在哪些方面是最具創新的?

蓋茨:我們提供了允許程式設計師使用機器全部能力的方法。我們嵌入了PEEK 和 POKE 指令,程式設計師可以讀寫機器狀態。我們提供了名為TRON和TROFE的跟蹤除錯例程。即使是高階語言,使用者也可以把他們想做的各種古怪的小功能新增到計算機中,並且無需使用BASIC程式就可以瞭解記憶體使用情況。我們讓他們覺得計算機是由他們自己掌控的。

為了把BASIC放到4K的記憶體中,我們使用了叫做單一表示法解釋程式的機制。這是一個非常好的選擇。此前我從來沒有見過哪一個解釋程式這樣做過。雖然有些冒險,但我卻對這種機制信心十足。我在腦子裡把它過了一遍,感覺很好。

採訪者:你在編寫BASIC解釋程式的時候,可曾想過它會如此成功嗎?

蓋茨:不,根本沒有想到。當時保羅•艾倫給我帶來一本介紹Altair的雜誌,我們就想:“老天,我們最好在上面做些事情,這些機器肯定會很受歡迎的。”於是我不再去上課了,我們開始沒日沒夜地工作起來。程式的雛形花了大約三個半星期,然後花了大約8個星期讓程式最後按我真正喜歡的方式充分完善。過了些時候,我又回去把它重寫了一遍。

沒有哪一個優秀的程式設計師會坐在那裡說:“我要賺一大筆錢。”或者說:“我要賣出成百上千個拷貝。”因為這種想法不會對你解決問題帶來任何幫助。一個優秀的程式設計師想的是:是否應當把整個子例程都重寫一遍,這樣就能夠讓4個人而不僅僅是3個人呼叫了?能讓程式快10%嗎?是否應當好好想一想這裡的常規狀況是什麼,這樣就可以對校驗條件進行排序了?如果是一個優秀的程式設計師,你會讓所有例程互相依賴,這樣就不會有什麼致命的錯誤了。這就是為什麼必須有精準的判斷,願意備份並修改程式的原因。

採訪者:當多人蔘與到同一程式中時,怎樣確保各種不同的人都能融洽地一起工作呢?

蓋茨:嗯,首先,專案組必須由能夠互相尊重的成員組成,因為這個工作需要密切配合,就像是打一場比賽一樣。程式設計專案需要很多的判斷力和創造力。有些優秀的程式設計師無法融入團隊工作,他們喜歡幹自己的。但我覺得優秀的一個要素來源於學習如何與其他人一起工作,並教導別人。我會因為和我一起工作的人成長為優秀的程式設計師而感到欣慰,雖然不像我自己寫程式那麼開心,但也是很好的事情。我讓別人成為一名優秀程式設計師的方式就是坐下來和他詳談,給他看我寫的程式碼。在一個專案團隊中,你的程式碼也是大家的程式碼。

採訪者:這種過程是自然演變的,還是刻意實施的結果?

蓋茨:在我和保羅創辦微軟之前,我們參與過一些大型的軟體開發專案,那些專案可真是災難。他們只是在不停地往專案組加人,卻沒有人知道要如何去穩定專案。我們發誓說自己可不能做成那樣,我們要做得更好。要多花一些時間組織規劃開發組的工作,這種想法對我們一直都非常重要。

最好的方法是顯而易見的:保持專案團隊精簡;確保小組中每個程式設計師都非常聰明;為他們提供強大的工具;有一套公用術語,以便大家很有效地溝通。而在這些小組外,找一些經驗豐富的資深人士,在遇到問題時能夠出謀劃策。在專案過程中遇到的困難型別有著驚人的共性。在做設計評審時,我非常樂於根據我自己的專案經驗提出建議。

採訪者:你認為人們程式設計或操作計算機的方式會發生很大的改變嗎?

蓋茨:軟體開發工具變得比以前好多了。最終我們可能只需要取得規格說明,以及一個怎樣有效使用機器的說明,然後就會有一些超高階的編譯器來完成很多目前由程式設計師所做的工作了。

儘管一個編譯器,比如C編譯器,還無法像人編寫的程式碼那樣好,人們仍舊會因此而感到非常滿意。但在今後三四年中,我們可以把這個過程中相當多的部分都做到機械化。人們仍然會設計演算法,但是很多實現工作都可以通過機器完成了。我認為,在未來5年內,出現的工具所能完成的工作將會像程式設計師一樣好。

採訪者:你剛才提到了數學。電腦科學和數學之間的關係是什麼?

蓋茨:數學對電腦科學有著很大的影響。大多數優秀的程式設計師都有一定的數學背景,因為它有助於學習證明定理過程中的純正性,在證明定理的時候不能做模糊的陳述,只能做精準的陳述。在數學中,不僅要建立完整的特徵描述,而且要以很不明顯的方式把定理結合起來。你常常會去證明一個問題是可以在更短的時間內解決的。數學與程式設計有很直接的聯絡,因為我是這麼看待這個問題的,所以我的這種觀點可能比別人更強烈一些。我認為兩者之間有著天然的聯絡。

採訪者:電腦科學真的是科學嗎?

蓋茨:會是的。這是一個非常新的事物。現在我們希望程式設計師能完成的一部分工作,在以前是人們用來做博士論文時要做的工作。電腦科學正在飛速發展,但它不像數學,數學天才在300年來一直在不斷地豐富著數學理論,而人們願意投身到計算機領域卻不過是最近20年的事情。一些卓越的人加入到電腦科學領域並做出了貢獻。和以前相比,程式設計現在已經是非常主流的工作了。人們在很小的時候就開始接觸計算機,這有助於改變電腦科學領域的思維方式。很多優秀的程式設計師在他們十幾歲時就開始程式設計了,在那個年紀思考問題的方法也許會更靈活一些。

在過去,人們認為單單成為優秀程式設計師是不夠的,你還得去管理別人或處理其他事情。幸運的是,這種情況正在改變,現在人們認識到計算機是一門科學,是值得堅持下去並教授給其他人的。

採訪者:經過多年的經驗積累後,程式設計是否一定會更容易呢?

蓋茨:不,我認為在過了最初的三四年後,就會非常明顯地顯現出你是否是一個優秀的程式設計師。剛開始的幾年中,你可能會更多地知道怎樣去管理大型專案和不同個性的人,但在三四年後,就能很清楚地看出你會成為什麼樣的程式設計師了。在微軟沒有哪個程式設計師是在平庸了幾年之後突然間一鳴驚人的。我和一個人談談他的程式,馬上就能知道他是否是個好程式設計師。如果他真的很棒,每個細節他都會脫口而出。

就像下棋的人一樣。如果你特別喜歡下棋,會很容易記住10盤棋中的每一步,因為你已置身其中了。其他人看到國際象棋選手或程式設計師能記住每個細節時,覺得他們像個怪物。其實這很正常。即使到了今天,在我寫了微軟的BASIC程式10年後,我仍可以在黑板上大段大段寫出當時的原始碼。

採訪者:你在程式設計時是什麼樣的感覺? 蓋茨:在編譯程式並計算出正確的結果時,我會非常開心。這是真的,不是開玩笑,所有偉大的事情都會有感情因素,程式設計也不例外。人們很想一上來就開始編碼,但是如果編寫程式碼只是為了得出結果,過後卻發現所有難題都還沒有處理,那麼沒有什麼比這更糟糕的做法了。因為如果真是那樣的話,你就不得不修改已經完成的程式。為了享受編碼並看著程式碼執行起來的樂趣,我喜歡等一等,把基礎打好。這就像吃飯時把最好的食物留到最後才吃一樣。

採訪者:你看到年輕的程式設計師和老程式設計師的程式設計方式有什麼不同之處嗎?

蓋茨:今天剛剛起步的程式設計師根本用不著對程式進行壓縮,他們認為要用到的資源總是能馬上得到,所以讓他們樹立一個正確的理念有點困難。10年前每個程式設計師都曾面臨資源有限的狀況,所以老程式設計師總是會想著對程式進行壓縮。

程式設計需要非常大量的精力,所以大多數程式設計師都比較年輕。這就會帶來一個問題,因為程式設計需要很多的訓練。在年輕時,目標不是很持久,可能會被這樣那樣的事分心。但是年輕的程式設計師應當堅持下去,他們會變得更出色。作為程式設計師,我認為自己在1975年到1980年之間的提高是最明顯的。在1975年,我會說:“嘿,看看,我什麼事情都能做。”我真的認為自己可以,因為我讀了大量程式碼,從來沒有發現哪段程式碼是我無法快速讀懂的。今天我仍舊認為檢驗程式設計能力的最好方法之一就是給程式設計師一本30來頁的程式碼,看看他閱讀和理解的速度有多快。

採訪者:你認為那是天賦嗎?

蓋茨:一定是天賦。有點像是純I.Q.(智商)。你必須只專注於程式碼,並把程式碼和你已經編寫的程式關聯起來。很多人會說:“我要花上好幾天來看這些程式碼。”而一個優秀的程式設計師則會說:“我把程式碼帶回家,晚上花一個小時就能全部看完。”這種能力的差異是巨大的。

採訪者:學習電腦科學是成為一名程式設計師的最佳途徑嗎?

蓋茨:不是,成為程式設計師的最佳途徑是編寫程式並研究其他人編寫的優秀程式。我自己以前就是去翻電腦科學中心的垃圾桶,找出他們的作業系統的程式清單。

你要願意去看別人寫的程式碼,然後寫自己的程式碼,再讓其他人複查你的程式碼。你需要身處這個不可思議的反饋迴圈當中,讓世界級的專家告訴你,你做錯了什麼。你不能讓一些小小的個人習性阻礙你獲得這些反饋資訊。有些世界級的專家會在一些純屬個人偏好的細節上喋喋不休,比如說該怎樣註釋程式。你必須跳過所有這些東西,因為在某種程度上,他們是試圖以自己的形象來塑造程式設計師,並試圖讓你按他們的方法行事。而這些可能並沒涉及程式的純質量問題。

如果和一個優秀的程式設計師聊一聊,你會發現他對他使用的工具非常熟悉,就像一個畫家瞭解他的畫具一樣。優秀程式設計師們開發程式的方式都有很多共同之處,這點令人驚奇——他們得到反饋的方式,以及他們是如何精準地進行規範的,哪些是草率成就的,哪些是認真完成的。當你請這些人來看一些程式碼時,你會發現他們的反應通常是非常非常一致的。

採訪者:是否有人對你編碼的方式產生了特別的影響?

蓋茨:每個編寫PDP作業系統的人都對我產生了影響。還有TRW公司的約翰•諾頓,他在讀別人的程式碼時會寫一些備忘錄——在此之前我從來沒有見過有人這麼做。後來我也開始嘗試那樣做了,看別人的程式碼時我會寫下心得。

我和保羅•艾倫一起編寫過很多程式,我們之間總會有些共同的想法。當你除錯程式碼或者不能確定一些特定的權衡時,馬上就可以找人交談,那種感覺真的很好。從某種意義上說,那就像是一種休息,可以緩解緊張情緒,不必轉換主題就可以與別人接著討論。在創作的過程中,能夠減輕一些壓力,但仍能集中注意力,這樣是很好的。我和保羅知道如何能夠有效地一起工作。你不會發現太多像我們這樣的搭檔。他對我的影響巨大。後來在微軟期間,查爾斯•西蒙尼和微軟其他一些人也影響了我。

採訪者:軟體行業會出現什麼情況?我們會繼續做另外一個出色的字處理軟體或電子表格軟體,還是說計算機行業會擴充套件到我們今天甚至連做夢都想不到的領域中?

蓋茨:我們正越來越多地思考計算機。我創造了“軟軟體”這一新詞,是指隨著時間的推移,程式自身會與使用者的需求和興趣相吻合。會出現更好的文書處理器和電子表格系統,我們會使用網路、影像和新的體系結構。並且將使用大容量的儲存光碟(CD),可以在上面儲存百科全書。

真正不同的將是基於規則的程式設計方式。其不同之處在於,程式設計不再是“如果發生這種情況,就這麼做;如果發生那種情況,就那麼做”。這是程式現在的工作方式。今後你會先寫下規則,然後讓小的推理引擎檢視當前的情況描述和規則。程式將嘗試推匯出新的情況描述並採取相應措施。例如,程式可能包含了重力規則,如果東西從桌子上掉下來,程式就會知道,如果掉下來的是玻璃的話,可能會摔碎。因此,相對於常規型別的程式設計,這種程式設計會以很不明顯的方式來產生結果。

所謂的專家系統就是基於這種技術構建的。基於規則的程式設計是通過證明機完成推導的過程,而不是在程式中做明確的說明。也許這些技術在今後的三四年或更長的時間內都不會產生影響。但一個想取得成功的年輕程式設計師會聰明地把注意力放到這種新的程式設計方式上。

採訪者:基於規則的程式設計的方式在處理差異很大的資訊時會比傳統的程式設計方式更有效嗎?

蓋茨:嗯,這有點兒不太好解釋。假設有一個程式是關於如何建造橋樑的,它採集了所有關於金屬壓力、彎曲度和特性的資訊,並在程式中嵌入了有關工程、材料和這類資訊的資料。但如果你跑過來對程式說:“我們想用塑料來建一座橋。”那麼這種變化是巨大的,就好像對它說“我想在火星上建一座橋”一樣。

基於規則的程式設計方式在極端情況下,所有體現了金屬可以承擔多大壓力、重力如何產生作用等物理原則都會作為一條一條的規則明確地闡述。所有的推論都來自對這些規則的檢查和運用。目前我們還沒有足夠好的用來證明規則的引擎,如果採取這種極端的方法的話,效率會低得讓人無法忍受。但這正是我們正在取得進展的一項技術,而且這種技術可能很快就會改變我們的程式設計方式。另外一個想法是,可以讓很多臺計算機同時並行執行。實際上,這可能會有助於提高這種基於規則程式設計的效率。這種重大的體系結構變革可能會影響人們的程式設計方式,或是影響他們對程式設計的看法。

對程式設計師來說最可怕的事情是,編譯器太好了或是計算機太快了,讓程式設計師變得不再重要了。我過去總是擔心,自己選擇了某個專攻的領域,但其重要性可能會隨著時間的推移而降低。

採訪者:微軟的涉及面很廣,而整個計算機行業的變化又非常迅速。你是如何做到與時俱進的?

蓋茨:嗯,我不會想著要跟上每一個變化。我正在和IBM、蘋果、DEC和日本計算機界的高層人士合作。我必須知道將要發生什麼,我不能浪費太多時間去猜測。我和微軟的工作人員飛往某處時,我們會談論計算機界發生的事情。微軟的電子郵件系統是一個高效的工具,可以幫助我跟得上行業的發展。

要跟得上行業的發展,方法之一是使用個人計算機。我要確保閱讀了使用者手冊,並使用了排名前十的軟體產品。這些產品不會經常變化,所以我對它們還是很熟悉的。如果你真的關心個人計算機軟體,就會使用每一個軟體,會去了解它們,並考慮你的軟體要如何才能比這些軟體包做得更好。

從某種意義上說,個人計算機已經變得簡單了。現在我們只有兩個體系結構,PC和Mac。而在美好的往昔,我們有三四十種完全不相容的機器,還有一大堆亂七八糟的語言混在一起。因為我們讓很多很多使用者使用計算機,所以必須讓計算機體系結構變成同類的、更加標準化的,以便使用者能夠了解其中的一些動向。很多在業內發生的事情並沒有推進行業的進展。網路和影像方面的工作可能和業內最先進的東西相關,我們會把注意力放在這上面,而不會去管什麼這個零售連鎖店會倒閉嗎,這傢伙有沒有行賄那個傢伙,這家公司給了那個人足夠的股票嗎?誰會管這些事情呢?真正聰明的人會把注意力放在自己的領域上,他們會給我提供他們認為有重要意義的東西,他們會帶給我能夠產生影響的專案。

採訪者:微軟在10年後會怎麼樣?

蓋茨:我們的目標很簡單。我們開發的軟體要能夠讓每一個家庭、每一張辦公桌上都放上一臺計算機。我不知道這是否要用10年的時間,我不擅長猜測準確的時間表。微軟還希望參與到生產更好的計算機的工作中,為計算機開發系統軟體,並開發很多執行在這些系統軟體上的重要的應用軟體。

即使會有越來越多的計算機,我們現在也並不認為需要擴充我們軟體開發小組的規模,因為我們可以開發那些銷量大的程式。我們可以獲得高額軟體收入,但公司的規模又不會比現在大很多。這意味著在公司中,我們可以瞭解每個人,可以一起討論,分享開發工具以保持高質量的開發水準。

當前微軟正專注的一個新領域是CD上的應用軟體。CD光碟將是我們用來把個人計算機引入家庭的技術。

採訪者:你為什麼認為CD的出現會讓微機進入家庭,而其他技術卻不行呢?

蓋茨:現在如果買一臺計算機,然後再買一個教育軟體,你會發現在使用後並不能達到預期的效果。程式在解答問題的數量上、問題的多元化上以及模擬現實生活中的方式上乏善可陳。隨著大容量儲存光碟CD的出現,教育軟體可以創造一個讓你產生直接共鳴的環境,其中包含的大量資訊、各種各樣的解答、親身參與其中的感覺,都會給人留下深刻印象。

這是一個競爭的世界。有了教育軟體,我們就要與報紙、書籍和電視競爭。而當今市面上的教育軟體並沒有什麼競爭力。除非你只是為了不讓孩子變傻,否則還真沒有什麼好的理由把這樣一臺機器買回家,因為它不會吸引你,不會吸引非計算機人員。

採訪者:你覺得在CD光碟上的新軟體能夠與電視競爭嗎?

蓋茨:電視是被動的娛樂。可以肯定地說,人們想要的是互動,是有多種路徑可以選擇,並且能夠從計算機得到他們想學習的內容的反饋。他們可以查詢感興趣的東西。CD光碟這種裝置是可以互動的,這種特性使它有別於只能觀看的電視。

採訪者:在設計CD光碟上的應用程式時,你們會採用很多與現在相同的設計原則嗎?

**蓋茨:**CD光碟軟體是完全不同的。我們希望使用者可以藉助於CD光碟地圖軟體檢視美國地圖,指到某處,點一下,放大地圖,然後說:“嘿,周圍有什麼旅館?”程式就會告訴你答案。如果使用的是百科全書,點到貝多芬的一首交響樂,計算機就會播放出來。這是一個新的介面程式,完全不像字處理器或電子表格那種提高生產力的工具軟體。CD光碟上的程式要解決的是完全不同的問題。它和任何一種新媒體一樣,有很強的競爭力。如何運用程式設計技術開發出比別人好的CD光碟應用程式?這是值得深思的。這個市場和我們已開發的程式所面向的市場不一樣。在這個市場中,我們希望我們的智慧能有助於開發出一些新穎而又適用的軟體。

採訪者:這麼說,它並不是簡單地把一堆報紙放到CD光碟中,再配上一個檢索程式?

蓋茨:嗯,有些人會那樣做,但我們不會,那沒什麼令人興奮的。我們深信將來在每一輛汽車、每一棟房屋裡都會有一個帶CD光碟的計算機。當你到了一個新地方,把那張小小的光碟放進去,拖動影像,它就會顯示出你要的路線,告訴你感興趣的資訊。

比如說體育運動。放進去一張體育CD光碟,就能看到運動員的記錄和照片。可以觀看過去的比賽,可以檢視比賽規則。每張CD都會有你希望瞭解的某個領域的資訊。每一張CD都會有小測驗,比如:“嘿,你以為你對棒球瞭如指掌嗎?嗯,這個人是誰,他做了什麼?”

每張CD上都有互動遊戲,在體育CD上這是很明顯的。而在音樂CD上,遊戲將是“這首曲子是什麼”,你可以檢視到得分,檢視作曲的人,聽不同樂器的聲音。你會坐在那裡,輸入自己的得分。如果你是個飛行員,很可能會對機場和飛機的圖片感興趣。所有這些我們都會放到光碟上。

採訪者:這些CD光碟上的軟體會在書店出售嗎?

蓋茨:最終會的。在起步階段,我們要確定哪些銷售渠道對CD光碟感興趣。特別是,會有一個專門銷售計算機軟體的零售商店嗎?我個人並不這麼認為,但這很難說。

某些CD應用軟體聽起來像是天方夜譚。但是發明一種新的媒體需要多長時間呢?我們幾乎沒有發明過新媒體。錄影帶不是新媒體,它並沒有什麼特別之處,只是電視節目的延遲播放。互動式視訊磁碟本來有機會成為一個新媒體,但它卻沒有足夠的使用者群。它沒有足夠的資訊資料,沒有低成本的播放器,使用也不方便。它沒有融入到大眾文化中。光碟是一種超級的互動式視訊,但我們必須做得更好。

CD引發的變革將是巨大的。我認為零部件商品目錄將不再會以印刷品的形式發行了。對於主要是用於參考的東西,你需要的不只是翻頁,還要以一種不同的方式來查詢、處理和檢視資訊,這種電子形式遠勝於其他大多數形式。我們最強的競爭對手顯然是書籍。我們不會損害圖書市場,但CD將取代商品目錄和某些型別的參考資料。

採訪者:你認為會從CD光碟中誕生出一種文化嗎?就像電視文化那樣。

蓋茨:我不知道這種文化是什麼,但CD比電視更具互動性。CD光碟軟體不像現在的個人計算機那樣只是針對程式設計的。但是仍舊會像個人計算機一樣讓人上癮、讓人能夠參與其中。你會參與進來,你會想做測驗,你會說:“我是一個超級巨星,讓我試試這個。”我們會提供測驗功能,這樣可以讓多人蔘與進來,挑選問題讓別人回答。如果一個孩子沉迷於個人計算機,我認為這遠比沉迷於電視要好,因為至少他需要做出選擇。我不是那種討厭電視的人,但我認為電視不會鍛鍊人的頭腦。我家裡現在剛好沒有買電視機。

採訪者:如果採用不同的標準,你認為CD光碟的發展會被削弱嗎?

蓋茨:對於微軟和那些規模比微軟大上百倍的公司來說,建立這一領域的標準需要強有力的政治手段。目前可能會出現兩種甚至三種不同的、相互不相容的光碟閱讀器。考慮到編寫不同版本的軟體的成本,這種做法是不合適的。所以在標準上我們投入了很多的注意力和精力。我們正在努力確保我們的標準就是標準。這是很難的,很有挑戰性。我們要非常非常迅速地讓所有的活動都圍繞一個標準開展,並且我們必須確保這個標準是合適的。

只有半導體行業才能做出這樣的光碟閱讀器。那些成本低得驚人的記憶體和高速處理器,視訊和音訊晶片,使我們能夠生產出多媒體計算機。半導體行業正在發生著奇蹟。單說最近兩年,使用者就在大量地購買各種零部件,因此價格也被降到一個很有吸引力的水平上。

採訪者:你覺得CD光碟會與專家系統合併嗎?

蓋茨:不會,這兩者並不相互依賴。因為CD上可以存放相當大的資料庫,所以可以把專家系統所需的資料放到CD上。但它們並不是互相需要的。它們有各自面臨的困難和挑戰。

CD是視訊,是音訊,是程式,還是互動的,所以要想開發世界上最好的CD軟體,需要各種技能組合在一起,這種要求是驚人的。像任何一種新媒體一樣,難度很大。當人們第一次看到電視時,覺得比電臺好多了,但電視也就那樣做出來了。過了很長時間後,才發明了豐富的色彩、所有的動作、三維填料,以及今天在電視上看到的各種特殊效果。就像電視一樣,隨著我們媒體經驗的增加,CD光碟軟體也會越來越好。我現在可以坐在這裡,告訴你所有我們不會犯的錯誤;但是5年後,我還可以坐在這裡,告訴你所有我們曾經犯過的錯誤。儘管我們有創意,也無法馬上就很充分地利用媒體。

採訪者:你可曾希望能再回去動手程式設計嗎?

蓋茨:哦,那是當然。程式設計時可以控制一切。程式設計時不存在妥協。每一行程式碼都是你的,每一行你都覺得很好。這麼想有點自私,但就像允許做純數學一樣,在程式設計中能夠看到一些東西運轉起來。我有時會忌妒我的同事,因為他們只需要關注他們正在編寫的程式。


續寫傳奇人生 比爾•蓋茨一直擔任微軟公司CEO,直到2000年卸任。在蓋茨的帶領下,微軟先後推出DOS、Windows、Office、企業伺服器等重量級軟體,四面出擊,並不斷進軍新的領域。1984年到1994年,微軟憑藉MS-DOS和Windows逐漸統治家用桌面電腦作業系統市場,1990年推出的Office最終成為辦公軟體領域的領導者。1995年到2005年,微軟將產品線擴充套件到計算機網路和全球資訊網,同時進軍其他行業和市場:1995年推出MSN入口網站,並將其與Windows 95繫結;1996年與NBC合資建立MSNBC,擴充有線電視新聞業務;2001年推出Xbox進入遊戲機市場。在蓋茨的領導下,微軟市值曾一度達到470億美元。

2000年蓋茨卸任CEO時,轉而為自己創造了一個“首席軟體架構師”的職位,並繼續擔任微軟主席。2006年6月,他宣佈將在兩年內淡出微軟公司日常事務,並將自己的職責分派給兩個人:雷•奧奇掌管日常管理,克萊 格•蒙代掌管長期產品策略。2008年6月27日是蓋茨在微軟全職工作的最後一天。不過,現在他依然擔任微軟的非執行主席。

蓋茨從本世紀初開始,就一直在慈善之路身體力行,他和妻子投入近半家產,建立了比爾•蓋茨與美琳達•蓋茨基金會。2008年從微軟退休時,他又將580億美元資產捐入該基金會。 在微軟以外,蓋茨投資的公司有:Cascade私人投資公司、bgC3(智囊公司)、Corbis(數字媒體許可和版權服務公司)和TerraPower(核反應設計公司)等。他還購買了由BBC錄製的費曼物理學講座的視訊版權。這些視訊現在通過微軟的Tuva網站向公眾開放。蓋茨還曾在紀錄片《等待超人》中出鏡,該片試圖分析美國公眾教育的失敗之處,並榮獲2010年聖丹斯影展“觀眾選擇獎”之最佳紀錄片獎。


相關閱讀

相關文章