學完以上各書之後,如果你還有精力興趣進一步深究,那麼可以試一下GTM系列中的《Introduction to Axiomatic Set Theory》和《A Course of Mathematical Logic》。這兩本都有世界圖書出版社的引進版。你如果能搞定這兩本,可以說在邏輯方面真正入了門,也就不用再浪費時間聽我瞎侃了。
組合感覺沒有太適合的國產書。還是讀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“為最優。對入門而言,這一本已經足夠,不需要再參考其它書。
電腦系統結構該怎麼教,國際上還在爭論。國內能找到的較好教材為Stallings的“Computer Organization and Architectureesigning for Performance“(清華影印
本)。國際上最流行的則是“Computer architecture: aquantitative approach“, by Patterson & Hennessy。
作業系統可以隨便選用《作業系統的核心設計與實現》和《現代作業系統》兩書之一。這兩部都可以算經典,唯一缺點就是理論上不夠嚴格。不過這領域屬於Hardcore System,所以在理論上馬虎一點也情有可原。想看理論方面的就推薦清華大學出版社《作業系統》吧,高教司司長張堯學寫的,我們教材用的是那本。 另外推薦一本《Windows作業系統原理》機械工業出版社的,這本書是我國作業系統專家在微軟零距離考察半年,寫作曆時一年多寫成的,教作業系統的專家除了清華大學的張堯學(現高教司司長)幾乎所有人都參加了。Bill Gates親自寫序。裡面不但結合windows2000,xp詳述作業系統的核心,而且後面講了一些windows編程基礎,有外版書的味道,而且上面一些內容可以說在國內外只有那本書才有對windows核心細緻入微的介紹,
如果先把形式語言學好了,則編譯原理中的前端我看只要學四個演算法:最容易實現的遞迴下降;最好的自頂向下演算法LL(k);最好的自底向上演算法LR(k);LR(1)的簡化SLR(也許還有另一簡化LALR)。後端完全屬於工程性質,自然又是another story。
推薦教材:Kenneth C.Louden寫的“Compiler Construction Principles and Practice”即是《編譯原理及實踐》(機械工業出版社的譯本)
學資料庫要提醒大家的是,會用VFP,VB, Power builder不等於懂資料庫。(這世界上自以為懂資料庫的人太多了!)資料庫設計既是科學又是藝術,資料庫實現則是典型的工程。所以從某種意義上講,資料庫是最典型的一門電腦課程——理工結合,互相滲透。另外推薦大家學完軟體工程學後再翻過來看看資料庫技術,又會是一番新感覺。推薦教材:Abraham Silberschatz等著的 “Database System Concepts“.作為知識的完整性,還推薦大家看一看機械工業出版社的《資料倉儲》譯本。
資料結構的重要性就不言而喻了,學完資料結構你會對你的編程思想進行一番革命性的洗禮,會對如何建立一個合理高效的演算法有一個清楚的認識。對於演算法的建立我想大家應當注意以下幾點:
當遇到一個演算法問題時,首先要知道自己以前有沒有處理過這種問題.如果見過,那麼你一般會順利地做出來;如果沒見過,那麼考慮以下問題:
1. 問題是否是建立在某種已知的熟悉的資料結構(例如,二叉樹)上?如果不是,則要自己設計資料結構。
2. 問題所要求編寫的演算法屬於以下哪種類型?(建立資料結構,修改資料結構,遍曆,尋找,排序...)
3. 分析問題所要求編寫的演算法的數學性質.是否具備遞迴特徵?(對於遞迴程式設計,只要設計出合理的參數表以及遞迴結束的條件,則基本上大功告成.)
4. 繼續分析問題的數學本質.根據你以前的編程經驗,設想一種可能是可行的解決辦法,並證明這種解決辦法的正確性.如果題目對演算法有時空方面的要求,證明你的設想滿足其要求.一般的,時間效率和空間效率難以兼得.有時必須通過建立輔助儲存的方法來節省時間.
5. 通過一段時間的分析,你對解決這個問題已經有了自己的一些思路.或者說,你已經可以用自然語言把你的演算法簡單描述出來.繼續驗證其正確性,努力發現其中的錯誤並找出解決辦法.在必要的時候(發現了無法解決的矛盾),推翻自己的思路,從頭開始構思.
6. 確認你的思路可行以後,開始編寫程式.在編寫代碼的過程中,儘可能把各種問題考慮得詳細,周密.程式應該具有良好的結構,並且在關鍵的地方配有注釋.
7. 舉一個例子,然後在紙上用筆執行你的程式,進一步驗證其正確性.當遇到與你的設想不符的情況時,分析問題產生的原因是編程方面的問題還是演算法思想本身有問題.
8. 如果程式通過了上述正確性驗證,那麼在將其進一步最佳化或簡化。
9. 撰寫思路分析,注釋.
對於具體的演算法思路,只能靠你自己通過自己的知識和經驗來加以獲得,沒有什麼特定的規律(否則程式員全部可以下崗了,用機器自動產生代碼就可以了).要有豐富的想象力,就是說當一條路走不通時,不要鑽牛角尖,要敢於推翻自己的想法.我也只不過是初學者,說出上面的一些經驗,僅供大家參考和討論。
關於人工智慧,我覺得的也是非常值得大家仔細研究的,雖然不能算是剛剛興起的學科了,但是絕對是非常有發展前途的一門學科。我國人工智慧創始人之一,北京科技大學塗序彥教授(這老先生是我的導師李小堅博士的導師)對人工智慧這樣定義:人工智慧是模仿、延伸和擴充人與自然的智能的技術科學。在美國人工智慧官方教育網站上對人工智慧作了如下定義:Artificial Intelligence, or AI for short, is a combination of computer science, physiology, and philosophy. AI is a broad topic, consisting of different fields, from machine vision to expert systems. The element that the fields of AI have in common is the creation of machines that can “think“.
這門學科研究的問題大概說有:
(1)符號主義: 符號計算與程式設計基礎,知識表達方法 :知識與思維,產生式規則,語意網路,一階謂詞邏輯問題求解方法:搜尋策略,啟發學習法搜尋,搜尋演算法,問題規約方法,謂詞演算:歸結原理,歸結過程專家系統:建立專家系統的方法及工具
(2)聯結主義(神經網路學派):1988年美國權威機構指出:資料庫,網路發展呈直線上升,神經網路可能是解決人工智慧的唯一途徑。
我想對於人工智慧的學習,大家一定不要像學數學似的及一些現成的結論,要學會分析問題,最好能利用程式設計實現,這裡推薦給大家ACM最佳博士論文獎獲得者塗曉媛博士的著作《人工魚—電腦動畫的人工生命方法》(清華大學出版社)。搞人工生命的同學不會不知道國際知名的塗氏父女吧。關於人工智慧的書當然首選《Artificial Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛!
關於網路安全我也想在這裡說兩句,隨著電腦技術的發展,整個社會的資訊化水平突飛猛進,電腦網路技術日新月異,網路成了當即社會各個工作領域不可缺少的組成部分,只要有網路存在,網路安全問題就是一個必須解決好的問題,學習網路安全不是簡簡單單的收集一些駭客工具黑一黑別人的網站,而是要學習他的數學原理,實現原理,搞清底層工作機制,這樣才能解決大部分的現有問題和新出現的安全問題。
電腦技術牽扯的內容更為廣泛些,一項一項說恐怕沒個一年半載也說不清。我只想提醒大家的還是那句話,技術與科學是不能分家的,學好了科學同時搞技術,這才是上上策。猶如英語,原先人們與老外交流必須要個翻譯,現在滿馬路的人都會說英語。就連21世紀英語演講比賽的冠軍都輪不到英語系的學生了。電腦也是一樣的,我們必須面對的一個現實就是:電腦真就只是一個工具,如果不具備其它方面的素養,電腦系的學生雖然不能說找不到工作,不過總有一天當其他專業性人才掌握了電腦技術後將比我們出色許多。原因就在於電腦解決的大都是實際問題,實際問題的知識卻是我們少有的。單一的電腦技術沒有立足之地。
我想是時候指出:學習每一個課程之前,都要先搞清這一課程的學習目的。這一學科的應用領域。據我自身所瞭解到的同齡同學和低年級的同學的學習狀況:他們之中很少有人知道學一個學科的學習目的,期末考試結束了也不知道學這科做什麼用。這就失去了讀電腦科學的意義。當然這與現存的教育思想不能說一點關係都沒有。
總的來說,從教育角度來講,國內高校的課程安排不是很合理,強調理論,又不願意在理論上深入教育,無力接受新技術,想避開新技術又無法避得一乾二淨。我覺得關鍵問題就是國內的高校難於突破現狀,條條框框限制著怎麼求發展。我們雖然認識得到國外教育的優越性,但為什麼遲遲不能採取行動?哪怕是去粗取精的取那麼一點點。我們需要改變。從我們自身角度來講,多數人4年下來既沒有學習電腦科學的學術水平,也沒有學習電腦技術的那種韌勁。在我剛上大一時,我的電腦科學入門導師,淮北煤炭師範學院王愛平教授曾經對我說過這樣一番話:“當你選擇了電腦這一門科學,就意味著你踏上了一條不歸路,就意味著你一生都要為之奮鬥……你的身後是懸崖,只有向前走,不能往後退。”
有些同學說按照這樣學習學的東西太多,有的未見得有用,我想打個形象的比方:學校學出來的人都是一個球體,方方面面的知識都應具備。可是社會上需要球體的地方很少,反而需要的是磚和瓦,即精通某一行的人才。但是對於同等體積的物體,用球體來改造是最方便最省事的。學校的學生很多,為了能夠使更多的學生來適應這個社會,學校也就不得以把所有的學生都打造成一個球體,然後讓社會對這些學生進行再加工,成為真正能夠有用的人才。即使你非常清楚自己的將來要幹什麼,並且非常下定決心要走自己的路,這一步你也必須走,世界是在不斷變化的,你不能預料未來。想清楚,努力去幹吧!
必須結束這篇“胡侃”了,再侃下去非我力所能及。其實電腦還有很多基礎課都值得一侃。怎奈我造詣有限,不敢再讓內行恥笑。對於博大精深的電腦科學,我只能說我永遠都是個Beginner.最後聲明:這些只針對本科階段的學習。即使把這些全弄通了,前面的路還長,電腦科學需要我們為之奮鬥......學習電腦科學需要韌性,更需要創新,需要激情。深刻學習理論知識,勇於接受新技術的挑戰,這才是我們這一代人應具有的素質。最後送大家一句話“Wake up every day with a feeling of passion for the difference technology will make in people’s life!”。