李開復(fù)說,練內(nèi)功,不要只花功夫?qū)W習(xí)各種流行的編程語言和工具,以及一些公司招聘廣告上要求的科目。要把數(shù)據(jù)結(jié)構(gòu)、算法、數(shù)據(jù)庫、操作系統(tǒng)原理、計算機體系結(jié)構(gòu)、計算機網(wǎng)絡(luò),離散數(shù)學(xué)等基礎(chǔ)課程學(xué)好。不妨試試Donald Knuth的Art of Computer Programming里的題目,如果你能夠解決其中的大部分題目,就說明你在算法方面的功力不錯了。 Donald Knuth自傳的開頭這樣寫道:“Donald Knuth真的只是一個人么?”作為世界頂級計算機科學(xué)家之一,Knuth教授已經(jīng)完成了編譯程序、屬性文法和運算法則的前沿研究,并編著完成了已在程序設(shè)計領(lǐng)域中具有權(quán)威標(biāo)準(zhǔn)和參考價值的書目的前三卷。在完成該項工作之余,Knuth還用了十年時間發(fā)明了兩個數(shù)字排版系統(tǒng),并編寫了六本著作對其做了詳盡的解釋說明,現(xiàn)在,這兩個系統(tǒng)已經(jīng)被廣泛地運用于全世界的數(shù)學(xué)刊物的排版中。隨后,Knuth又發(fā)明了文件程序設(shè)計的兩種語言,以及“文章性程式語言”相關(guān)的方法論。 到目前為止,Knuth已經(jīng)出版發(fā)行了17部書籍,一百五十余篇論文,包括了巴比倫算法、圣經(jīng)、字母“s”的歷史等多方面的內(nèi)容。作為一名數(shù)學(xué)家,Knuth曾開創(chuàng)了幾門新的課程,為純計算數(shù)學(xué)做出了很大貢獻(xiàn)。他所獲得的獎項和榮譽數(shù)不勝數(shù),其中最值得注目的有1974年美國計算機協(xié)會圖靈獎(ACM Turing Award),1979年美國前總統(tǒng)卡特授予的科學(xué)金獎(Medal of Science)以及1996年11月由于發(fā)明先進(jìn)技術(shù)榮獲的極受尊重的京都獎(Kyoto Prize)。在不多的業(yè)余時間里,Knuth不僅寫小說,還是一個音樂家、作曲家、管風(fēng)琴設(shè)計師。 是Knuth獨特的審美感決定了他興趣廣泛、富有多方面造詣的特點,Knuth傳奇般的生產(chǎn)力也是源于這一點。對于Knuth來說,衡量一個計算機程序是否完整的標(biāo)準(zhǔn)不僅僅在于它是否能夠運行,他認(rèn)為一個計算機程序應(yīng)該是雅致的、甚至可以說是美的。計算機程序設(shè)計應(yīng)該是一門藝術(shù),一個算法應(yīng)該像一段音樂,而一個好的程序應(yīng)該如一部文學(xué)作品一般。 早期經(jīng)歷Knuth,1938年1月10日生于美國威斯康星州密爾沃基市。他在模式方面辨別和熟練操作的能力在八年級的時候開始顯現(xiàn)出來。當(dāng)時,當(dāng)?shù)氐囊患姨枪圃焐膛e辦了一項比賽,比賽要求選手用其品牌“Ziegler's Giant Bar”中的字母組成新的單詞,規(guī)定時間內(nèi)組成單詞數(shù)量最多者獲勝。Knuth參加了比賽,并以單詞總數(shù)4500余個遠(yuǎn)遠(yuǎn)超過了裁判的2500個的標(biāo)準(zhǔn),輕松贏得頭獎。賽后,Knuth說道,如果自己當(dāng)初想到回答時用些省略符號的話,還能寫出更多。這次比賽Knuth為學(xué)校贏得了一臺電視機,還為每個同學(xué)贏得了一根糖果棒。 Knuth多產(chǎn)的出版事業(yè)開始于他的高中時代,當(dāng)時他的科技設(shè)計被Westinghouse Science Talent Search 光榮提及。他的“Potzebie System of Weights and Measures ”的基礎(chǔ)章節(jié)被登在“Mad”雜志第26號,“Power”的基礎(chǔ)章節(jié)被叫作“whatmeworry”?!癕ad”的編輯認(rèn)識到了年輕的Donald著作的重要性,以25美元買下了他的文章,并刊登在了其1957年6月的期刊上。 高中的時候,Knuth對數(shù)學(xué)并沒多大興趣,而是把主要精力放在主修的課程:聽音樂和作曲上。他在高中的樂隊里吹薩克斯、大號時,曾把Dragnet、 Howdy Doody Time 和 Brylcream的主題曲聯(lián)成一段新的音樂。這位著名的科學(xué)家在近期評論自己的早期作品時承認(rèn):“對于版權(quán),我一無所知?!?/p> 雖然 Knuth的等級平均分是學(xué)校歷史上最高的,但是他和他的指導(dǎo)老師還是對他能否成功學(xué)習(xí)大學(xué)數(shù)學(xué)持懷疑態(tài)度。Knuth說在他高中階段和大學(xué)早期一直有一種自卑感,這個問題一度是他的一個障礙。作為一個大學(xué)新生,Knuth沒有對于失敗的恐懼,他花了許多時間攻克額外的數(shù)學(xué)難題,幾個月后,他在這方面的能力已經(jīng)遠(yuǎn)遠(yuǎn)超過了其他同學(xué)。 高等教育和早期的計算機工作當(dāng)Knuth在Case科學(xué)院(現(xiàn)在的Case Western Reserve)獲得物理獎學(xué)金時,夢想成為一個音樂家的計劃改變了。Knuth回去繼續(xù)研究數(shù)學(xué)是在大二,當(dāng)時一個愛出難題的教授提出了一個特殊的問題,并說哪個學(xué)生能解決這個問題就立刻記成績“A”。Knuth跟大多數(shù)同學(xué)一樣,也認(rèn)為那是道解不出來的題目,直到有一天,他錯過了公共汽車,只能步行去看一個演出,Knuth利用路上這點空閑時間決定嘗試一下。那陣子他運氣真的是非常好,不僅問題很快就解開了,得到了“A”,還成功地經(jīng)常逃課。雖然 Knuth也承認(rèn),逃課讓他有負(fù)罪感,但是很明顯,他完全有能力補上落下的功課,接下來的一學(xué)年,他的離散數(shù)學(xué)就又得了個“A”,而且還獲得了給自己不能參加的課程評定論文等級的工作機會。 1956年,作為Case的新生,Knuth第一次接觸到了計算機,那是一臺IBM 650。Knuth說直到一年后,女孩才進(jìn)入了他的生活。這又是計算機科學(xué)界一直以來虧欠科學(xué)家們的一個事例之一。 Knuth 熬夜讀IBM 650的說明手冊,自學(xué)基本的程序設(shè)計。那時,在高等計算機語言發(fā)明之前,程序編寫只能用第二代或是匯編語言。這個工作既耗時又困難,因為指令必須根據(jù)每臺機器特定的構(gòu)造編寫,而實際上指令只須一步就可從二進(jìn)制0、1系列轉(zhuǎn)存到計算機硬盤上。Knuth說,有了第一次使用650的經(jīng)歷,他便肯定自己能編寫出比說明手冊上介紹的更好的程序。 Knuth很快便開始“閑逛”,編寫可以執(zhí)行數(shù)學(xué)函數(shù)的程序。他的第一個程序是把數(shù)字轉(zhuǎn)化為素數(shù),第三個是做井字游戲(或者說是讓計算機在改正每次輸?shù)腻e誤的過程來學(xué)會玩井字游戲)。作為學(xué)?;@球隊的經(jīng)理,Knuth編寫了一個根據(jù)不同成績標(biāo)準(zhǔn)評定每個運動員對球隊貢獻(xiàn)等級的程序,他的努力贏來了那些認(rèn)為這樣做有助于球隊贏得同盟冠軍的教練的好評(雖然,無庸質(zhì)疑,不是每一個運動員都這樣認(rèn)為)。 Knuth的成就成了新聞周刊的標(biāo)志,他和教練、計算機的照片也被刊登在IBM650后來的說明手冊上。 1960年,Knuth從 Case畢業(yè)時享有著最高榮譽,在由全體教員參加的選舉上,他因其公認(rèn)的出眾成就獲得了碩士學(xué)位。1963年,Knuth回到加利福尼亞理工學(xué)院攻取了數(shù)學(xué)博士學(xué)位,之后成為了該院的數(shù)學(xué)教授。在加利福尼亞理工學(xué)院任教期間,Knuth作為Burroughs 公司的顧問繼續(xù)從事軟件開發(fā)工作。1968年,他加入了斯坦福大學(xué),九年后坐上了該校計算機科學(xué)學(xué)科的第一把交椅。1993年,Knuth成為斯坦福大學(xué) “the Art of Computer Programming”(計算機程序設(shè)計藝術(shù))的榮譽退休教授。 早期成就和計算機程序設(shè)計藝術(shù)的開端1962 年,Knuth還是個研究生的時候就開始了他計算機程序的工作。那時,他已經(jīng)開始了個人咨詢,為不同的機器編寫編譯程序。編譯程序是一種翻譯原始或高級語言和對象或二進(jìn)制機器語言的中間語言。在不知道眾多軟件公司正高額尋求成百上千的編輯者的情況下,Knuth編寫了一個程序,賺得5000美元,他的名字立刻響譽了整個行業(yè)。世界上一流的出版社Addison-Wesley找到Knuth,請他寫一本關(guān)于編譯程序的書。到1966年,Knuth已經(jīng)發(fā)表了 3000頁的手寫設(shè)計草圖,并且發(fā)明了一種綜合方法,用于分析或決定結(jié)構(gòu)翻譯所客觀需要的文法規(guī)則。最近,關(guān)于他的那第一部著作,Knuth自己這樣評述:“用三年半的時間寫第一章可并不是件好事?!?/p> 當(dāng)Knuth的出版商計算出他的那3000頁的筆跡打印成文章大約需要2000頁時,大家才發(fā)現(xiàn)這實際上是一項多么大的工程。Knuth決定將它詳述,成為一部更大的關(guān)于程序設(shè)計科學(xué)的縱覽,共分為七個部分。一部巨著就這樣——誕生了。《計算機程序設(shè)計藝術(shù)》,至今仍是各程序類圖書書架上標(biāo)志性的書籍。微軟首席執(zhí)行官比爾蓋茨在1995年接受一次采訪時說,“如果你認(rèn)為你是一名真正優(yōu)秀的程序員,就去讀第一卷,確定可以解決其中所有的問題。”值得注意的是,蓋茨本人讀這本書時用去了幾個月的時間,并同時進(jìn)行了難以置信的訓(xùn)練。蓋茨還說:“如果你能讀懂整套書的話,請給我發(fā)一份你的簡歷?!?/p> 依Knuth本人所講,《計算機程序設(shè)計藝術(shù)》是他畢生最重要的事業(yè),其目的是“組織和總結(jié)所知道的計算機方法的相關(guān)知識,并打下堅實的數(shù)學(xué)、歷史基礎(chǔ)”。Knuth撰寫的前三卷被翻譯成多種語言,到1976年為止,已賣出超過一百萬冊。他目前正全神貫注地編寫第四卷,他期望第四卷的篇幅約為2000頁,并分為三個獨立的章節(jié)。為了完成叢書的其余部分,Knuth現(xiàn)在進(jìn)入了一種引退的狀態(tài),全身心地投入這項工作。Knuth說,一般說來,他更喜歡在一段時間內(nèi)集中精神完成一項工作,正像他自己在書中提出的:按“一批”的模式。 Knuth從他主要的工作計劃中拿出了十年,即從1976年起,致力于對數(shù)字排版的研究,設(shè)計了著名的文件準(zhǔn)備TeX系統(tǒng),字體生成程序METAFONT。這項工作帶來的值得注意的副產(chǎn)品是用于結(jié)構(gòu)文件和“文章性程式語言”附隨方法論的WEB和CWEB語言。 現(xiàn)在,Knuth和他的妻子Jill,兩個孩子John 和Jennifer一起,住在斯坦福大學(xué)校園里。他繼續(xù)著《計算機程序設(shè)計藝術(shù)》第四卷的編寫工作。雖然說Knuth是全身心的投入這一項工作,但他還是能擠出時間研究MMIX的設(shè)計,那是一臺64位RISC(精簡指令集計算機)。而他的業(yè)余愛好仍然是音樂,還一直邀請那些能夠即興演奏四手聯(lián)彈鋼琴曲的人們給他留下便條,以便安排一些活動。 成就簡要回顧編譯程序: 編譯程序能夠?qū)崿F(xiàn)高級語言和二進(jìn)制機器語言之間的翻譯。二十世紀(jì)六十年代初期,Knuth教授致力于這方面的研究,雖然現(xiàn)代的軟件已經(jīng)可以使其變的簡單一些,但編寫編譯程序仍被認(rèn)為是一項極為困難的工作。 Knuth教授在這方面最著名的成就是LR(k)分析的研究,那是一個能使確定一串字符文法規(guī)則的過程更加順暢的值得注目的方法。 屬性文法: 在編譯程序的工作之后,Knuth教授走上了形式上定義程序語言意義、語義的研究道路。他建立起一個更加經(jīng)濟的方法去通譯聯(lián)合規(guī)則,他把這種方法稱作“屬性規(guī)則”。該方法創(chuàng)立的同時,計算機科學(xué)的子域被稱作“屬性文法”。 算法: 也許Knuth教授在計算機科學(xué)領(lǐng)域最原創(chuàng)的貢獻(xiàn)就是他對于算法的分析。算法是編寫一個程序,使之能去完成一項任務(wù)的基礎(chǔ),例如搜索或分類等。在加利福尼亞理工學(xué)院時,Knuth教授在一個畢業(yè)生的協(xié)作下,開發(fā)了用來探究數(shù)學(xué)公理推論的Knuth-Bendix算法。1968年,Knuth教授在斯坦福,和他的一個學(xué)生開發(fā)了Knuth-Morris-Pratt算法,該法則使計算機在文章中搜索一串字符的過程更加連貫。他所著的《計算機程序設(shè)計藝術(shù)》是一個詳盡的算法實踐和科學(xué)的概觀。 數(shù)字化排版: “數(shù)學(xué)書籍和雜志已經(jīng)不像從前那樣漂亮了?!盞nuth教授在一篇早期關(guān)于數(shù)學(xué)排版的文章中這樣寫道。由于對計算機排版的校樣的低質(zhì)量感到無法忍受,Knuth教授從他史詩性的七卷集巨著的編寫過程中拿出了十年時間,來開發(fā)一個高質(zhì)量的計算機排版系統(tǒng)。其間,Knuth開發(fā)了兩個用于文件排版和字體生成的軟件系統(tǒng),這兩個系統(tǒng)現(xiàn)在已被世界大多數(shù)出版社運用。它們分別是TeX,用于出版業(yè)的科學(xué)排版,和“優(yōu)美文章”的產(chǎn)品;METAFONT,一個字體生成程序。 結(jié)構(gòu)化文件和文章性程式語言: Knuth教授的排版研究,引領(lǐng)他發(fā)明了文件構(gòu)造的兩種語言和一個方法論,叫作“文章性程式語言”。語言分別是WEB和CWEB,它們促進(jìn)了程序編寫向“文學(xué)作品,是用來閱讀的”這個方向發(fā)展。這兩種語言的結(jié)合,一種是文件格式化,另一種是程序設(shè)計,這就使程序員能夠同時創(chuàng)建兩個不同的系統(tǒng)程序,一個面向人,另一個面向機器。當(dāng)一條過程清楚地描述程序并促進(jìn)其維護(hù)時,另外一個則產(chǎn)生一個機器可執(zhí)行的程序。這些工作就是Knuth教授在實現(xiàn)其使程序設(shè)計為讀者易懂、甚至感覺漂亮的目標(biāo)的過程中,在計算機領(lǐng)域里所做出的巨大貢獻(xiàn)。 |
|