計算機科學與技術學習心得之計算機理論的一個核心問題--續談其他的一些計算數學(轉載)

                    組合數學我看的第一本好像是北大捐給我們學院的,一本外版書。感覺沒有太適合的國產書。還是讀Graham和Knuth等人合著的經典"具體數學"吧,西安電子科技大學出版社有翻譯版。

                    《組合數學》,《空間解析幾何》還有那本《拓撲學》,看這三本書的時候是極其費事的,原因有幾點,首先是這三本書無一例外,都是用繁體字寫的,第二就是書真得實在是太髒了,我在圖書館的座位上看,同學們都離我做得很遠。我十分不自然,不願意影響同學,但是學校不讓向外借這種書(呵呵,說起這是也挺有意思,別人都不看這種書,只有我在看,老師就特別的關注我,後來我和他講了這些書的價值,他居然把他們當作是震館之寶,老師都不許借,不過後來他們看我真得很喜歡看,就把書借給了我,當然用的是館長的名義借出去的。)不過收穫是非常大的,再後來學習計算機理論時裏面的很多東西都是常會用到的。當然如果你沒看過這些書絕對理解不到那個層次。拿拓撲學來說,我們學校似乎是美開設這門課程,但是這門課程的重要性是顯而易見的,沒有想到的是在那本書的很多頁中都夾着一些讀書筆記,而那個筆記的作者及有些造詣,有些想法可以用到現代網絡設計當中。

                    抽象代數,國內經典爲莫宗堅先生的《代數學》。此書聽說是北大數學系教材,深得好評。然而對本科生來說,此書未免太深。可以先學習一些其它的教材,然後再回頭來看"代數學"。國際上的經典可就多了,GTM系列裏就有一大堆。推薦一本談不上經典,但卻最簡單的,最容易學的:http://www.math.miami.edu/~ec/book/這本"Introduction to Linear and Abstract Algebra"非常通俗易懂,而且把抽象代數和線性代數結合起來,對初學者來說非常理想,我校比較牛的同學都有收藏。

                    數論方面,國內有經典而且以困難著稱摹凍醯仁邸?(潘氏兄弟著,北大版)。再追溯一點,還有更加經典(可以算世界級)並且更加困難的"數論導引"(華羅庚先生的名著,科學版,九章書店重印,繁體的看起來可能比較困難)。把基礎的幾章搞定一個大概,對本科生來講足夠了。但這只是初等數論。本科畢業後要學計算數論,你必須看英文的書,如Bach的"Introduction to Algorithmic Number Theory"。

                    計算機科學理論的根本,在於算法。現在很多系裏給本科生開設算法設計與分析,確實非常正確。環顧西方世界,大約沒有一個三流以上計算機系不把算法作爲必修的。算法教材目前公認以Corman等著的《Introduction to Algorithms》爲最優。對入門而言,這一本已經足夠,不需要再參考其它書。
                  深一點的就是大家作爲常識都知道的TAOCP了。即是《The Art of Computer Programming》3冊內容全世界都能看下來的本身就不多,Gates曾經說過"若是你能把這書上面的東西都看懂,請把你的簡歷發給我一份"我的學長司徒彥南兄就曾千里迢迢從美國託人買這書回來,別的先不說,可見這書的在我們計算機科學與技術系中的分量。

                     再說說形式語言與自動機。我看過北郵的教材,應該說寫的還清楚。有一本通俗易懂的好書,MIT的sipser的《introduction to theory of computation》。但是,有一點要強調:形式語言和自動機的作用主要在作爲計算模型,而不是用來做編譯。事實上,編譯前端已經是死領域,沒有任何open problems,北科大的班曉娟博士也曾經說過,編譯的技術已相當成熟。如果爲了這個,我們完全沒必要去學形式語言--用用yacc什麼的就完了。北郵的那本在國內還算比較好,但是在深度上,在跟可計算性的聯繫上都有較大的侷限,現代感也不足。所以建議有興趣的同學去讀英文書,不過國內似乎沒引進這方面的教材。可以去互動出版網上看一看。入門以後,把形式語言與自動機中定義的模型,和數理邏輯中用遞歸函數定義的模型比較一番,可以說非常有趣。現在才知道,什麼叫"宮室之美,百官之富"!

                    計算機科學和數學的關係有點奇怪。二三十年以前,計算機科學基本上還是數學的一個分支。而現在,計算機科學擁有廣泛的研究領域和衆多的研究人員,在很多方面反過來推動數學發展,從某種意義上可以說是孩子長得比媽媽還高了。但不管怎麼樣,這個孩子身上始終流着母親的血液。這血液是the mathematical underpinning of computer science(計算機科學的數學基礎),也就是理論計算機科學。原來在東方大學城圖書館中曾經看過一本七十年代的譯本(書皮都沒了,可我就愛關注這種書),大概就叫《計算機數學》。那本書若是放在當時來講決是一本好書,但現在看來,涵蓋的範圍還算廣,深度則差了許多,不過推薦大一的學生倒可以看一看,至少可以使你的計算數學入入門,也就是說至少可以搞清數學到底在計算機科學什麼地方使用。

                    最常和理論計算機科學放在一起的一個詞是什麼?答:離散數學。這兩者的關係是如此密切,以至於它們在不少場合下成爲同義詞。(這一點在前面的那本書中也有體現)傳統上,數學是以分析爲中心的。數學系的同學要學習三四個學期的數學分析,然後是複變函數,實變函數,泛函數等等。實變和泛函被很多人認爲是現代數學的入門。在物理,化學,工程上應用的,也以分析爲主。

                    隨着計算機科學的出現,一些以前不太受到重視的數學分支突然重要起來。人們發現,這些分支處理的數學對象與傳統的分析有明顯的區別:分析研究的問題解決方案是連續的,因而微分,積分成爲基本的運算;而這些分支研究的對象是離散的,因而很少有機會進行此類的計算。人們從而稱這些分支爲"離散數學"。"離散數學"的名字越來越響亮,最後導致以分析爲中心的傳統數學分支被相對稱爲"連續數學"。

                    離散數學經過幾十年發展,基本上穩定下來。一般認爲,離散數學包含以下學科:
                  1) 集合論,數理邏輯與元數學。這是整個數學的基礎,也是計算機科學的基礎。
                  2) 圖論,算法圖論;組合數學,組合算法。計算機科學,尤其是理論計算機科學的核心是算法,而大量的算法建立在圖和組合的基礎上。

                  3) 抽象代數。代數是無所不在的,本來在數學中就非常重要。在計算機科學中,人們驚訝地發現代數竟然有如此之多的應用。
                  
                  但是,理論計算機科學僅僅就是在數學的上面加上"離散"的帽子這麼簡單嗎?一直到大約十幾年前,終於有一位大師告訴我們:不是。D.E.Knuth(他有多偉大,我想不用我再說了)在Stanford開設了一門全新的課程Concrete Mathematics。 Concrete這個詞在這裏有兩層含義:
                    首先:對abstract而言。Knuth認爲,傳統數學研究的對象過於抽象,導致對具體的問題關心不夠。他抱怨說,在研究中他需要的數學往往並不存在,所以他只能自己去創造一些數學。爲了直接面嚮應用的需要,他要提倡"具體"的數學。在這裏我做一點簡單的解釋。例如在集合論中,數學家關心的都是最根本的問題--公理系統的各種性質之類。而一些具體集合的性質,各種常見集合,關係,映射都是什麼樣的,數學家覺得並不重要。然而,在計算機科學中應用的,恰恰就是這些具體的東西。Knuth能夠首先看到這一點,不愧爲當世計算機第一人。其次,Concrete是Continuous(連續)加上discrete(離散)。不管連續數學還是離散數學,只要是能與我們研究的內容掛上鉤的都是有用的數學!

                  2、理論與實際的結合--計算機科學技術研究的範疇與學習方法
                    前面主要是從數學角度來看的。從計算機角度來看,理論計算機科學目前主要的研究領域包括:可計算性理論,算法設計與複雜性分析,密碼學與信息安全,分佈式計算理論,並行計算理論,網絡理論,生物信息計算,計算幾何學,程序語言理論等等。這些領域互相交叉,而且新的課題在不斷提出,所以很難理出一個頭緒來。想搞搞這方面的工作,推薦看中國計算機學會的一系列書籍,至少代表了我國的權威。下面隨便舉一些例子。

                    由於應用需求的推動,密碼學現在成爲研究的熱點。密碼學建立在數論(尤其是計算數論),代數,信息論,概率論和隨機過程的基礎上,有時也用到圖論和組合學等。很多人以爲密碼學就是加密解密,而加密就是用一個函數把數據打亂。這樣的理解太淺顯了。

                    現代密碼學至少包含以下層次的內容:
                  第一,密碼學的基礎。例如,分解一個大數真的很困難嗎?能否有一般的工具證明協議正確?
                  第二,密碼學的基本課題。例如,比以前更好的單向函數,簽名協議等。
                  第三,密碼學的高級問題。例如,零知識證明的長度,祕密分享的方法。
                  第四,密碼學的新應用。例如,數字現金,叛徒追蹤等。
                    密碼學方面值得推薦的有一本《應用密碼學》還有就是平時多看看年會的論文集,感覺這種材料實用性比較強,會提高很快。 
                    
                    在分佈式系統中,也有很多重要的理論問題。例如,進程之間的同步,互斥協議。一個經典的結果是:在通信信道不可靠時,沒有確定型算法能實現進程間協同。所以,改進TCP三次握手幾乎沒有意義。例如時序問題。常用的一種序是因果序,但因果序直到不久前纔有一個理論上的結果....例如,死鎖沒有實用的方法能完美地對付。例如,......操作系統研究過就自己去舉吧!

                    如果計算機只有理論,那麼它不過是數學的一個分支,而不成爲一門獨立的科學。事實上,在理論之外,計算機科學還有更廣闊的天空。

                    我一直認爲,4年根本不夠學習計算機的基礎知識,因爲面太寬了,要是真學的話,我想至少8年的學習能使你具有一定的科學素養......

                    這方面我想先說說我們系在各校普遍開設的《計算機基礎》。在高等學校開設《計算機基礎課程》是我國高教司明文規定的各專業必修課程要求。主要內容是使學生初步掌握計算機的發展歷史,學會簡單的使用操作系統,文字處理,表格處理功能和初步的網絡應用功能。但是在計算機科學系教授此門課程的目標決不能與此一致。在計算機系課程中目標應是:讓學生較爲全面的瞭解計算機學科的發展,清晰的把握計算機學科研究的方向,發展的前沿即每一個課程在整個學科體系中所處的地位。搞清各學科的學習目的,學習內容,應用領域。使學生在學科學習初期就對整個學科有一個整體的認識,以做到在今後的學習中清楚要學什麼,怎麼學。計算機基本應用技能的位置應當放在第二位或更靠後,因爲這一點對於本系的學生應當有這個摸索能力。這一點很重要。推薦給大家一本書:機械工業出版社的《計算機文化》(New Perspective of Computer Science),看了這本書我才深刻的體會到自己還是個計算機科學初學者,才比較透徹的瞭解了什麼是計算機科學。科學出版社的《計算科學導論》(趙致琢先生的著作)可以說是在高校計算機教育改革上作了很多的嘗試,也是這方面我受益很大的一本書。 

                    一個一流計算機系的優秀學生決不該僅僅是一個編程高手,但他一定首先是一個編程高手。我上大學的時候,第一門專業課是C語言程序設計,念計算機的人從某種角度講相當一部分人是靠寫程序吃飯的。在我們北京工業大學實驗學院計算機系裏一直有這樣的爭論(時至今日CSDN上也有),關於第一程序設計語言該用哪一種。我個人認爲,用哪種語言屬於末節,關鍵在養成良好的編程習慣。當年老師對我們說,打好基礎後學一門新語言只要一個星期。現在我覺得根本不用一個星期,前提是先把基礎打好。不要再猶豫了,學了再說,等你抉擇好了,別人已經會了幾門語言了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章