程序員的十層樓
(感言:拋開俗世的紅塵,回 歸科學,自然的本真。科學,哲學的任一分支,都足以讓人窮盡一生。比起玩弄政治于掌摑之間,指點江山于帷幄之內,無病呻吟于生活不公,腐蝕生命于聲色之 際,震撼人心的永遠是推進人類發展前進的偉人,他們之所以被稱為泰斗,是因為他們的余暉經歷幾千年之后,仍讓世人高山仰止!)
自 西方文藝復興以來,中國在自然科學方面落后西方很多,軟件領域也不例外。當然現在中國的許多程序員們對此可能有許多不同的意見,有些人認為中國的程序員水 平遠落后于西方,有些則認為中國的程序員個人能力并不比西方的程序員差,只是整個軟件產業落后而已。那么,到底中國的程序員水平比西方程序員水平差,還是 中國有許多優秀的程序員達到或超過了西方程序員同等水平呢?要解決這個問題,必須先知道程序員有多少種技術層級,每個層級需要什么樣的技術水平,然后再比 較中國和西方在各個技術層級的人數,就可以知道到底有沒有差距,差距有多大。
當然,對于如何劃分程序員的技術層級,不同公司或不同人會有不同的劃分標準,下面的劃分僅代表個人的觀點,如有不當之處,還請砸板磚予以糾正。
第1層 菜鳥
第1層樓屬于地板層,邁進這層樓的門檻是很低的。基本上懂計算機的基本操作,了解計算機專業的一些基礎知識,掌握一門基本的編程語言如C/C++,或者Java,或者JavaScript,...,均可入門邁進這層。 在這層上,中國有著絕對的優勢,除了從計算機專業畢業的眾多人數外,還有大量的通信、自動化、數學等相關專業的人士進入這一行,此外還有眾多的其他專業轉行的人士,人數絕對比西方多出甚多。并且還有一個優勢就是我們這層人員的平均智商比西方肯定高。
沒有多少人愿意一輩子做菜鳥,因為做"菜鳥"的滋味實在是不咋的,整天被老大們吆喝著去裝裝機器,搭建一下測試環境,或者對照著別人寫
好的測試用例做一些黑盒測試,好一點的可以被安排去寫一點測試代碼。當然如果運氣"好"的話,碰到了國內的一些作坊式的公司,也有機會去寫一些正式的代碼。 所以,菜鳥們總是在努力學習,希望爬更高的一層樓去。
第2層 大蝦
從第1層爬到第2層相對容易一些,以C/C++程序員為例,只要熟練掌握C/C++編程語言,掌握C標準庫和常用的各種數據結構算法,掌握STL的基本實現和使用方法,掌握多線程編程基礎知識,掌握一種開發環境,再對各種操作系統的API都去使用一下,搞網絡編程的當然對socket編程要好好掌握一下,然后再學習一些面向對象的設計知識和設計模式等,學習一些測試、軟件工程和質量控制的基本知識,大部分人經過2~3年的努力,都可以爬到第2層,晉升為"大蝦"。 中國的"大蝦"數量和"菜鳥"數量估計不會少多少,所以這層上仍然遠領先于西方。 大蝦們通常還是有些自知之明,知道自己只能實現一些簡單的功能,做不了大的東西,有時候還會遇到一些疑難問題給卡住,所以他們對那些大牛級的人物通常是非常崇拜的,國外的如Robert C. Martin、Linus Torvalds,國內的如求伯君、王志東等通常是他們崇拜的對象。其中的有些人希望有一天也能達到這些大牛級人物的水平,所以他們繼續往樓上爬去。
第3層 牛人
由于"大蝦"們經常被一些疑難問題給卡住,所以有了"大蝦"們只好繼續學習,他們需要將原來所學的知識進一步熟練掌握,比如以熟練掌握C++編程語言為例,除了學一些基礎性的C++書籍如《C++ Primer》,《Effective C++》,《Think in C++》,《Exception C++》等之外,更重要的是需要了解C++編譯器的原理和實現機制,了解操作系統中的內部機制如內存管理、進程和線程的管理機制,了解處理器的基礎知識和代碼優化的方法,此外還需要更深入地學習更多的數據結構與算法,掌握更深入的測試和調試知識以及質量管理和控制方法,對各種設計方法有更好的理解等。 學習上面說的這些知識不是一揮而就的,不看個三五十本書并掌握它是做不到的。以數據結構算法來說,至少要看個5~10本這方面的著作;以軟件設計來說,光懂結構化設計、面向對象設計和一些設計模式是不夠的,還要了解軟件架構設計、交互設計、面向方面的設計、面向使用的設計、面向數據結構算法的設計、情感化設計等,否則是很難進到這個樓層的。
雖然成為"大牛"的條件看起來似乎很高似的,但是這層樓并不是很難爬的一層,只要通過一定的努力,素質不是很差,還是有許多"牛人"可以爬到這一層的。由此可知,"大牛"這個樓層的人數其實并不像想像的那么少,例如比爾·蓋茨之類的人好像也是屬于這一層的。 由于"大牛"這層的人數不少,所以也很難統計除到底是中國的"大牛"數量多還是西方的大牛數量多?我估計應該是個旗鼓相當的數量,或者中國的"大牛"們會更多一些。 看到這里,可能會有很多人會以為我在這里說瞎話,Linus Torvalds寫出了著名的Linux操作系統,我國并沒有人寫出過類似的東西啊,我國的"大牛"怎么能和西方的比呢? 不知大家注意到沒有,Linus Torvalds只是寫出了一個"象模象樣"的操作系統雛形,Linux后來真正發展成聞名全球的開源操作系統期間,完全是因為許多支持開源的商業公司如IBM等,派出了許多比Linus Torvalds更高樓層的幕后英雄在里面把它開發出來的。 可能有些菜鳥認為Linus Torvalds是程序員中的上帝,不妨說個小故事: Linus,Richard Stallman和Don Knuth(高德納)一同參加一個會議。
Linus 說:"上帝說我創造了世界上最優秀的操作系統。"
Richard Stallman自然不甘示弱地說:"上帝說我創造了世界上最好用的編譯器。"
Don Knuth一臉疑惑的說:"等等,等等,我什么時候說過這些話?"
由此可以看出,Linus Torvalds的技術水平并不像想像中那么高,只是"牛人"和"大蝦"覺得"大牛"比他們更牛吧了。在我國,有一些當時還處于"大蝦"層的人物,也能寫出介紹如何寫操作系統的書,并且書寫得非常出色,而且寫出了一個有那么一點點象模象樣的操作系統來。我想中國的"大牛"們是不會比西方差的,之所以沒有人寫出類似的商業產品來,完全是社會環境的原因,并不是技術能力達不到的原因。
"大牛"們之所以成為大牛,主要的原因是因為把"牛人"給蓋了下去,并不是他們自己覺得如何牛。也許有很多菜鳥、大蝦甚至牛人覺得"大牛"這層已經到頂了,但大多數"大牛"估計應該是有自知之明的,他們知道自己現在還沒有爬到半山腰,也就勉強能算個半桶水的水平,其中有些爬到這層沒有累趴下,仍然能量充沛,并且又有志者,還是會繼續往更上一層樓爬的。 看到這里,也許有些菜鳥、大蝦、牛人想不明白了,還有比"大牛"們更高的樓層,那會是什么樣的樓層?下面就來看看第5層樓的奧妙。
第4層 大牛
從第3層爬到第4層可不像上面說過的那幾層一樣容易,要成為大牛的話,你必須要能做牛人們做不了的事情,解決牛人們解決不了問題。比如牛人們通常都不懂寫 操作系統,不會寫編譯器,不懂得TCP/IP協議的底層實現,如果你有能力將其中的任何一個實現得象模象樣的話,那么你就從牛人升級為"大牛"了。
當然,由于各個專業領域的差別,這里舉操作系統、編譯器、TCP/IP協議只是作為例子,并不代表成為"大牛"一定需要掌握這些知識,以時下熱門的多核編 程來說,如果你能比牛人們更深入地掌握其中的各種思想原理,能更加自如的運用,并有能力去實現一個象開源項目TBB庫一樣的東西,也可以成為"大牛",又或者你能寫出一個類似Apache一樣的服務器,或者寫出一個數據庫,都可以成為"大牛"。
要成為"大牛"并不是一件簡單的事情,需要付出比牛人們多得多的努力,一般來說,至少要看過200~400本左右的專業書籍并好好掌握它,除此之外,還得經常關注網絡和期刊雜志上的各種最新信息。當"牛人"晉升為"大牛",讓"牛人們"發現有比他們更牛的人時,對"牛人"們的心靈的震撼是可想而知的。由于牛人們的數量龐大,并且牛人對大蝦和菜鳥階 層有言傳身教的影響,所以大牛們通常能獲得非常高的社會知名度,幾乎可以用"引無數菜鳥、大蝦、牛人競折腰"來形容,看看前面提過的Linus Torvalds等大牛,應該知道此言不虛。
雖然成為"大牛"的條件看起來似乎很高似的,但是這層樓并不是很難爬的一層,只要通過一定的努力,素質不是很差,還是有許多"牛人"可以爬到這一層的。由此可知,"大牛"這個樓層的人數其實并不像想像的那么少,例如比爾·蓋茨之類的人好像也是屬于這一層的。
由于"大牛"這層的人數不少,所以也很難統計除到底是中國的"大牛"數量多還是西方的大牛數量多?我估計應該是個旗鼓相當的數量,或者中國的"大牛"們會更多一些。
看到這里,可能會有很多人會以為我在這里說瞎話,Linus Torvalds寫出了著名的Linux操作系統,我國并沒有人寫出過類似的東西啊,我國的"大牛"怎么能和西方的比呢? 不知大家注意到沒有,Linus Torvalds只是寫出了一個"象模象樣"的操作系統雛形,Linux后來真正發展成聞名全球的開源操作系統期間,完全是因為許多支持開源的商業公司如 IBM等,派出了許多比Linus Torvalds更高樓層的幕后英雄在里面把它開發出來的。可能有些菜鳥認為Linus Torvalds是程序員中的上帝,不妨說個小故事:
Linus,Richard Stallman和Don Knuth(高德納)一同參加一個會議。
Linus 說:"上帝說我創造了世界上最優秀的操作系統。"
Richard Stallman自然不甘示弱地說:"上帝說我創造了世界上最好用的編譯器。"
Don Knuth一臉疑惑的說:"等等,等等,我什么時候說過這些話?"
由此可以看出,Linus Torvalds的技術水平并不像想像中那么高,只是"牛人"和"大蝦"覺得"大牛"比他們更牛吧了。在我國,有一些當時
還處于"大蝦"層的人物,也能寫 出介紹如何寫操作系統的書,并且書寫得非常出色,而且寫出了一個有那么一點點象模象樣的操作系統來。我
想中國的"大牛"們是不會比西方差的,之所以沒有人 寫出類似的商業產品來,完全是社會環境的原因,并不是技術能力達不到的原因。
"大牛"們之所以成為大牛,主要的原因是因為把"牛人"給蓋了下去,并不是他們自己覺得如何牛。也許有很多菜鳥、大蝦甚至牛人覺得"大
牛"這層已經到頂 了,但大多數"大牛"估計應該是有自知之明的,他們知道自己現在還沒有爬到半山腰,也就勉強能算個半桶水的水平,其中
有些爬到這層沒有累趴下,仍然能量充 沛,并且又有志者,還是會繼續往更上一層樓爬的。 看到這里,也許有些菜鳥、大蝦、牛人想不明白了,還有比"大牛"們更高的樓層,那會是什么樣的樓層?下面就來看看第5層樓的奧妙。
第5層 專家
當大牛們真正動手做一個操作系統或者類似的其他軟件時,他們就會發現自己的基本功仍然有很多的不足。以內存管理為例,如果直接抄襲Linux或者其他開源操作系統的內存管理算法,會被人看不起的,如果自動動手實現一個內存管理算法,他會發現現在有關內存管理方法的算法數量眾多,自己并沒有全部學過和實踐過,不知道到底該用那種內存管理算法。 看到這里,可能有些人已經明白第5層樓的奧妙了,那就是需要做基礎研究,當然在計算機里,最重要的就是"計算"二字,程序員要做基礎研究
,主要的內容就是研究非數值"計算"。
非數值計算可是一個非常龐大的領域,不僅時下熱門的"多核計算"與"云計算"屬于非數值計算范疇,就是軟件需求、設計、測試、調試、評估
、質量控制、軟件工程等本質上也屬于非數值計算的范疇,甚至芯片硬件設計也同樣牽涉到非數值計算。如果你還沒有真正領悟"計算"二字的含義,那么你就沒有機會進到這層樓來。可能有人仍然沒有明白為什么比爾·蓋茨被劃在了大牛層,沒有進到這層來。雖然比爾·蓋茨大學未畢業,學歷不夠,但是家有藏書2萬余冊,進入軟件這個行業比絕大部分人都早,撇開他的商業才能不談,即使只看他的技術水平,也可以算得上是學富五車,頂上幾個普通的計算機軟件博士之和是沒有問題的,比起Linus Torvalds之類的"大牛"們應該技高一籌才對,怎么還進不了這層樓呢? 非常遺憾的是,從Windows操作系統的實現來看,其對計算的理解是很膚淺的,如果把Google對計算方面的理解比做大學生,比爾·蓋茨只能算做一個初中生,所以比爾·蓋茨永遠只能做個大牛人,成不了"專家"。 看到這里,也許國內的大牛們要高興起來了,原來比爾·蓋茨也只和我等在同一個層次,只要再升一層就可以超越比爾·蓋茨了。不過爬到這層可沒有從"牛人"升為"大牛"那么簡單,人家比爾·蓋茨都家有2萬多冊書,讓你看個500~1000本以上的專業書籍并掌握好它應該要求不高吧。當然,這并不是主要的條件,更重要的是,需要到專業的學術站點去學習了,到ACM,IEEE,Elsevier,SpringerLink,SIAM等地方去下載論文應該成為你的定期功課,使用Google搜索引擎中的學術搜索更是應該成為你的日常必修課。此外,你還得經常關注是否有與你研究相關的開源項目冒出來,例如當聽到有TBB這樣針對多核的開源項目時,你應該第一時間到Google里輸入"TBB"搜索一下,將其源代碼下載下來好好研究一番,這樣也許你的一只腳已經快邁進了這層樓的門檻。 當你象我上面說的那樣去做了以后,隨著時間的推移,總會有某天,你發現,在很多小的領域里,你已經學不到什么新東西了,所有最新出來的研究成果你幾乎都知道。此時你會發現你比在做"牛人"和"大牛"時的水平不知高出了多少,但是你一點也"牛"不起來,因為你學的知識和思想都是別人提出來的,你自己并沒有多少自己的知識和思想分享給別人,所以你還得繼續往樓上爬才行。 我不知道國內的"專家"到底有多少,不過有一點可以肯定的是,如果把那些專門蒙大家的"磚家"也算上的話,我們的磚家比西方的要多得多。
第6層 學者
當"專家"們想繼續往上一層樓爬時,他們幾乎一眼就可以看到樓梯的入口,不過令他們吃驚的是,樓梯入口處豎了一道高高的門檻,上面寫著"創新"二字。不幸的是,大多數人在爬到第5層樓時已經體能消耗過度,無力翻過這道門檻。 有少數體能充足者,可以輕易翻越這道門檻,但是并不意味著體力消耗過度者就無法翻越,因為你只是暫時還沒有掌握恢復體能的方法而已,當掌握了恢復體能的方法,將體能恢復后,你就可以輕易地翻越這道門檻了。 怎么才能將體能恢復呢?我們的老祖宗"孔子"早就教導過我們"溫故而知新",在英文里,研究的單詞是"research",其前綴"re"和"search"分別是什么意思不用我解釋吧。或許有些人覺得"溫故而知新"和"research"有些抽象,不好理解,我再給打個簡單的比方,比如你在爬一座高山,爬了半天,中途體力不支,怎么恢復體力呢?自然是休息一下,重新進食一些食物,體力很快就可以得到恢復。 由此可知,對體能消耗過度者,休息+重新進食通常是恢復體能的最佳選擇。可惜的是,國內的老板們并不懂得這點,他們的公司里不僅連正常國家規定的休息時間都不給足,有些公司甚至有員工"過勞死"出現。所以國內能翻越"創新"這道門檻的人是"少之又少",和西方比起來估計是數量級的差別。 再 說說重新進食的問題,這個重新進食是有講究的,需要進食一些基礎性易消化的簡單食物,不能進食山珍海味級的復雜食物,否則很難快速吸收。以查找為例,并不 是去天天盯著那些復雜的查找結構和算法進行研究,你需要做的是將二分查找、哈希查找、普通二叉樹查找等基礎性的知識好好地復習幾遍。以哈希查找為例,首先 你需要去將各種沖突解決方法如鏈式結構、二次哈希等編寫一遍,再試試不同種類的哈希函數,然后還需要試試在硬盤中如何實現哈希查找,并考慮數據從硬盤讀到 內存后,如何組織硬盤中的數據才能快速地在內存中構建出哈希表來,...,這樣你可能需要將一個哈希表寫上十幾個不同的版本,并比較各個版本的性能、功能方面的區別和適用范圍。 總之,對任何一種簡單的東西,你需要考慮各種各樣的需求,以需求來驅動研究。最后你將各種最基礎性的查找結構和算法都了然于胸后,或許某天你再看其他更復雜的查找算法,或者你在散步時,腦袋里靈光一現,突然間就發現了更好的方法,也就從專家晉升為"學者"了。 學者所做的事情,通常都是在前人的基礎上,進行一些小的優化和改進,例如別人發明了鏈式基數排序的方法,你第1個發現使用一定的方法,可以用數組替代鏈表進行基數排序,性能還能得到進一步提高。 由于學者需要的只是一些小的優化改進,因此中國還是有一定數量的學者。不過和國外的數量比起來,估計少了一個數量級而已。 也許有人會覺得現在中國許多公司申請專利的數量達到甚至超過西方發達國家了,我們的學者數量應該不會比他們少多少。因此,有必要把專利和這里說的創新的區別解釋一下。 所 謂專利者,只要是以前沒有的,新的東西,都可以申請專利;甚至是以前有的東西,你把他用到了一個新的領域的產品里去,也可以申請專利。比如你在房子里造一 個水泥柱子,只要以前沒有人就這件事申請專利,那么你就可以申請專利,并且下次你把水泥柱子挪一個位置,又可以申請一個新的專利;或者你在一個柜子上打上 幾個孔,下次又把孔的位置改一改,...,均可申請專利。 這層樓里所說的創新,是指學術層面的創新,是基礎研究方面的創新,和專利的概念是完全不同的,難度也是完全不同的。你即使申請了一萬個象那種打孔一類的專利,加起來也夠不到這層樓里的一個創新。 當你爬到第6層樓時,你也許會有一種突破極限的快感,因為你終于把那道高高的寫著"創新"二字的門檻給翻過去了,實現了"0"的突破。這時,你也許有一種"獨上高樓,欲望盡天涯路"的感覺,但是很快你會發現看到的都是比較近的路,遠處的路根本看不清楚。如果你還有足夠的體力的話,你會想爬到更高一層的樓層去。
第7層 大師
從第6層樓爬到第7層樓,并沒有多少捷徑可走,主要看你有沒有足夠的能量。你如果能象Hoare一樣設計出一個快速排序的算法;或者象Eugene W. Myers一樣設計出了一個用編輯圖的最短路徑模型來解決diff問題的算法;或者象M.J.D. Powell一樣提出了一個能夠處理非線性規劃問題的SQP方法;或者你發現基于比較的排序算法,它的復雜度下界為O(NLogN);或者你發現用棧可以將遞歸的算法變成非遞歸的;或者你設計出一個紅黑樹或者AVL樹之類的查找結構;或者你設計出一個象C++或Java一樣的語言;或者你發明了UML;...,你就爬到了第7層,晉升為"大師"了。 上 面舉的這些例子中,其中有些人站的樓層比這層高,這里只是為了形象說明而舉例他們的某個成就。從上面列出的一些大師的貢獻可以看出,成為大師必須要有較大 的貢獻。首先解決問題必須是比較重要的,其次你要比前輩們在某方面有一個較大的提高,或者你解決的是一個全新的以前沒有解決過的問題;最重要的是,主要的 思路和方法必須是你自己提供的,不再是在別人的思路基礎上進行的優化和改進。 看了上面這些要求,如果能量不夠的話,你也許會覺得有些困難,所以不是每個人都能成為"大師"的。中國軟件業里能稱得上是"大師"的人,用屈指可數來形容,估計是綽綽有余。值得一提得是,國外的"大師"就象我們的"大牛"一樣滿天飛的多。我把我猜測本國有可能進到這層樓的大師列一下,以起個拋磚引玉的作用。漢王的"手寫識別"技術由于是完全保密的,不知道它里面用了什么思想,原創思想占的比重有多少,因此不知道該把它劃到這層樓還是更高一層樓去。原山東大學王小云教授破解DES和MD5算法時,用到的方法不知道是不是完全原創的,如果是的話也可進到這層樓來。 陳景潤雖然沒有徹底解決哥德巴赫猜想,但他在解決問題時所用的方法是創新的,因此也可以進到這層樓來。當然,如果能徹底解決哥德巴赫猜想,那么可以算到更高的樓層去。 求伯君和王志東等大牛們,他們在做WPS和表格處理之類的軟件時,不知是否有較大的原創算法在里面,如果有的話就算我錯把他們劃到了大牛層。由于所學有限,不知道國內還有那些人能夠得上"大師"的級別,或許有少量做研究的教授、院士們,可以達到這個級別,有知道的不妨回個帖子晾一晾。 鑒于"大師"這個稱號的光環效應,相信有不少人夢想著成為"大師"。或許你看了前面舉的一些大師的例子,你會覺得要成為大師非常困難。不妨說一下,現在有一條通往"大師"之路的捷徑打開了,那就是多核計算領域,有大量的處女地等待大家去挖掘。 以前在單核時代開發的各種算法,現在都需要改寫成并行的。數據結構與算法、圖像處理、數值計算、操作系統、編譯器、測試調試等各個領域,都存在大量的機會,可以讓你進到這層樓來,甚至有可能讓你進到更高一層樓去。
第8層 科學家
科學家向來都是一個神圣的稱號,因此我把他放在了“大師”之上。要成為科學家,你的貢獻必須超越大師,不妨隨便舉一些例子。 如果你象Dijkstra一樣設計了ALGOL語言,提出了程序設計的三種基本結構:順序、選擇、循環,那么你可以爬到第8層樓來。順便說一下,即使拋開這個成果,Dijkstra憑他的PV操作和信號量概念的提出,同樣可以進到這層樓。 如果你象Don Knuth一樣,是數據結構與算法這門學科的重要奠基者,你也可以進到這層樓來。當然,數據結構和算法這門學科不是某個人開創的,是許多大師和科學家集體開創的。 如果你象巴科斯一樣發明了Fortran語言,并提出了巴科斯范式,對高級程序語言的發展起了重要作用,你也可以進到這層樓來。 或者你象Ken Thompson、Dennis Ritchie一樣發明了Unix操作系統和功能強大、高效、靈活、表達力強的C語言,對操作系統理論和高級編程語言均作出重大貢獻,那么你也可以進到這層樓來。 或者你有Frederick P. Brooks一樣機會,可以去領導開發IBM的大型計算機System/360和OS/360操作系統,并在失敗后反思總結,寫出《人月神話》,對軟件工程作出里程碑式的貢獻,你也可以進到這層來。 或者你提出了面向對象設計的基本思想,或者你設計了互聯網的TCP/IP協議,或者你象Steven A.Cook一樣奠定NP完全性的理論基礎,或者你象Frances Allen一樣專注于并行計算來實現編譯技術,在編譯優化理論和技術取得基礎性的成就,…,均可進入這層。 當然,如果你發明了C++語言或者Java語言,你進不到這層來,因為你用到的主要思想都是這層樓中的科學家提出的,你自己并沒有沒有多少原創思想在里面。 看了上面列出的科學家的成就,你會發現,要成為“科學家”,通常要開創一門分支學科,或者是這個分支學科的奠基者,或者在某個分支學科里作出里程碑式的重大貢獻。如果做不到這些的話,那么你能象Andrew C. Yao(姚期智)一樣在對計算理論的多個方向如偽隨機數生成,密碼學與通信復雜度等各個方向上作出重要貢獻,成為集大成者,也可以進入這層樓。 成為“科學家”后,如果你有幸象Dijkstra一 樣,出現在一個非常重視科學的國度。當你去世時,你家鄉滿城的人都會自動地去為你送葬。不過如果不幸生錯地方的話,能不挨“板磚”估計就算萬幸了。從上面 隨便舉的一些例子中,你可能能猜到,西方科學家的數量是非常多的,于是你會想中國應該也有少量的科學家吧?我可以很負責任地告訴你一個不幸的結果,中國本 土產生的科學家的數量為0。目前在國內,軟件領域的唯一的科學家就是上面提過的姚期智,還是國外請回來的,并不是本土產生的。 可能你不同意我說的本土科學家數量為0的結論,因為你經常看到有許多公司里都有所謂“首席XX科學家”的頭銜。我想說的是,這些所謂的“首席XX科學家”都是遠遠夠不到這層樓的級別的,有些人的水平估計也就是一個“牛人”或“大牛”的級別,好一點的最多也就一個“學者”的級別。尤其是那些被稱作“首席經X學家”的,基本上可以把稱號改為“首席坑大家”。 雖然我國沒有人能爬到這層樓上來,但是西方國家仍然有許多人爬到了比這層更高的樓上。如果要問我們比西方落后多少?那么可以簡單地回答為:“落后了三層樓”。下面就來看看我們做夢都沒有到過的更高一層樓的秘密。
第9層 大科學家
進入這層樓的門檻通常需要一些運氣,比如某天有個蘋果砸到你頭上時,你碰巧發現了萬有引力,那么你可以進到這層樓來。當然,萬有引力幾百年前就被人發現了,如果你現在到處嚷嚷著說你發現了萬有引力,恐怕馬上會有人打110,然后警察會把你送到不正常人類的聚集地去。因此,這里舉萬有引力的例子,只是說你要有類似的成就才能進到這層樓來。 牛 頓發現萬有引力定律開創了經典物理運動力學這門學科,如果你也能開創一門大的學科,那么你就從科學家晉升為“大科學家”。比如愛因斯坦創建了相對論,從一 個小職員變成了大科學家。當然大科學家可遠不止這兩人,數學界里比物理學界更是多得多,如歐幾里得創建了平面幾何,笛卡爾開創解析幾何,還有歐拉、高斯、 萊布尼茨等數不清的人物,跟計算相關的大科學家則有圖靈等人。 從 上面列出的一些大科學家可以發現,他們的成就不僅是開創了一個大的學科,更重要的是他們的成就上升到了“公理”的層面。發現公理通常是需要一點運氣的,如 果你的運氣不夠好的話,另外還有一個笨辦法也可以進到這層樓來,那就是成為集大成者。例如馮·諾伊曼,對數學的所有分支都非常了解,許多領域都有較大的貢 獻,即使撇開他對計算機的開創貢獻,成為大科學家照樣綽綽有余。 當 然,程序員們最關心的是自己有沒有機會變成大科學家。既然計算機這門大學科的開創性成果早就被馮·諾伊曼、圖靈等人摘走了,那么程序員們是不是沒有機會變 成大科學家了呢?我們的古人說得好:“江山代有才人出,各領風騷數百年”,現在在計算機這門學科下面誕生了許多非常重要的大的分支,所以你還是有足夠的機 會進到這層樓的。 如果你能夠徹底解決自然語言理解(機器翻譯)這門學科中的核心問題, 或者你在人工智能或者機器視覺(圖像識別)方面有突破性的發現,那么你同樣可以輕易地晉升為“大科學家”。這樣當某天你老了去世時,或許那天國人已經覺醒,你也能享受到如Dijkstra一樣的待遇,有滿城甚至全國的人去為你送葬。 現在還剩下另外一個大家感興趣的問題沒有討論,那就是這層中已經出現了牛頓、愛因斯坦、高斯等我們平常人都認為是頂級的科學家,是不是這層已經是樓頂了呢?相信還記得本文標題的人應該知道現在僅僅是第9層,還有第10層沒有到達呢。可能不少人現在要感到困惑了,難道還有人站在比牛頓、愛因斯坦、高斯等人更高的樓層上? 這個世界上確實存在可以用一只手的手指數得清的那么幾個人,他們爬到了第10層樓上。因此,第10層樓不是虛構的,而是確實存在的。如果對此有疑惑或者認為我在胡謅一番的話,那么不妨繼續往下看下去,窺一下第10層樓的秘密。
第10層 大哲
看 了這層樓的名字“大哲”,可能不少人已經猜到了這層樓的秘密,那就是你的成果必須要上升到哲學的高度,你才有機會能進到這層來。當然,上升到哲學高度只是 一個必要條件,牛頓的萬有引力似乎也上升到了哲學的高度,因為不知道引力到底是怎么來的,但是牛頓沒有被劃到這一層,因為進到這層還有另外的條件,那就是 你的成果必須引起了哲學上的深度思考,并能讓人們的世界觀向前跨進一大步。竊以為牛頓、愛因斯坦等人的成就還達不到讓人們世界觀向前跨進一大步的程度。 所 以,這層樓中的人的成就對我們普通人認識世界非常重要,你可以不學相對論,但是你不可以不對這層樓的人所作出的成就不了解,否則你的世界觀就是極其不完整 的,會犯許多認識上的錯誤。不幸的是,中國的科普知識普及還不夠到位,知道這層樓成就的人好像并不多,程序員中恐怕更少。下面就來看看這些用一只手的手指 數得清的大哲們,到底有什么成就,能比萬有引力定律和相對論還重要。
1、希爾伯特 (1862~1943)
第1位 進到此樓層是一位名叫“希爾伯特”的大數學家,如果你學過《泛函分析》,那么你在學習希爾伯特空間時可能已經對這位大數學家有所了解;如果你不是學數學出 身的,又對數學史不感興趣的話,恐怕你從來沒有聽說過這個名字。不過如果我問一下,知不知道二次世界大戰前世界數學中心在那里,你肯定會有興趣想知道。 不妨說一下,二戰前整個世界的數學中心就在德國的哥廷根,而我們這位大數學家希爾伯特便是它的統帥和靈魂人物。即使在二戰期間,希特勒和丘吉爾也有協定,德國不轟炸牛津和劍橋,作為回報,英國不轟炸海德堡和哥廷根。 整 個二十世紀上半期的超一流數學家,幾乎都出自其門下。這里不妨舉幾個我們熟悉的人物,例如馮·諾伊曼就曾受到他和他的學生施密特和外爾的思想影響,還到哥 廷根大學任過希爾伯特的助手,錢學森的老師馮·卡門是在哥廷根取得博士學位的。順便提一下,這位大數學家發現當時物理學上出了很多大的成果如相對論和量子 力學,但是這些物理學家的數學功力明顯不足,因此有一段時間帶領他的學生們研究過物理學,并獨立發現了廣義相對論,只是不好意思和物理學家爭功勞,將廣義 相對論的功勞全部讓給了愛因斯坦。 廣 義相對論相對于這位大數學家在數學上的貢獻,其實是算不了什么的,只是由此可看出這位大數學家品格的高尚之處。如果再去看看牛頓之流的人物的品行,整天和 萊布尼茨、虎克等人爭功勞,利用自己的優勢地位打壓他人,甚至鬧得上法庭,和這位希爾伯特先生比起來,簡直就是個小丑。 說 到這里,你可能對這位大數學家“希爾伯特”有了一些初步映象,感覺到了他的重要性,不過他在數學上的主要成就可不是幾句話說得清楚的。首先,他是一位集大 成者,精通當時數學所有分支領域,在數學的各個領域都有較大的貢獻,當然這些成就只能讓他成為一個大科學家,不能帶他進入這層樓。事實上這位“希爾伯特” 解決的任何一個數學問題都夠不到這層樓的高度,那么他怎么混到這層樓來了呢? 話得從1900年說起,當時還很年輕的希爾伯特在當時的世界數學大會上做了一個報告,高屋建甌地提出了著名的23個未解決的數學問題,然后整個二十世紀上半期,全世界的數學家們都在這23個問題的指導下展開研究,直到現在仍然有許多數學家受這23個問題的指導在進行研究。例如我們熟知的哥德巴赫猜想,就屬于其中第8個問題素數分布的一個子問題。 如果用“高瞻遠矚”來形容這位大數學家的話,那么這個世界上恐怕沒有第二個人再配得上“高瞻遠矚”這四個字,不論是歐拉、高斯、牛頓、愛因斯坦還是被譽為最有才華的數學家伽羅華,概不例外。 雖然那23個 問題是歸納總結出來的,并不全是原創,但是其中有不少問題是可以上升到哲學的高度,引起深度思考的。可能大多數人都會覺得希爾伯特是進不到這層樓的,我們 知道提出問題的人和解決問題的人是一樣偉大的,何況他提出的問題是如此之多,基于這點,個人覺得應該讓希爾伯特跨進這層樓的門檻里。 看完這位希爾伯特的成就,你可能會覺得對你的世界觀并沒有產生任何影響。確實如此,他提出的問題不是用來影響你的,而是用來影響其他大科學家和大哲的,下面再來說說另一位對他提出的23個問題中的第2個問題有杰出貢獻的大哲,你就會感覺到大哲們的成果的威力了。
2、哥德爾 (1906~1978)
這位大哲的名字叫“哥德爾 (G?del) ”,你可能從來也沒有聽說過這個名字,即使你讀了一個數學系的博士學位,如果你的研究方向不和這位大哲對口的話,你也不一定了解這位大哲的成就,更不知道他的成果對我們這個世界有何意義。 簡單地說,這位大哲20多歲時就證明了兩個定理,一個叫做“哥德爾完全性定理”,另一個更重要的叫做“哥德爾不完全性定理”。你也許會覺得奇怪,第9層樓的成就就已經上升到了公理的高度,這種證明定理的事情不是學者和大師們做的事情嗎?怎么能比第9層樓的成就還高呢?下面就來簡單說一下這兩個定理的含義,你就會明白這屬于系統級的定理,絕不是普通的定理和公理所能比擬的。 “哥德爾完全性定理”證明了邏輯學的幾條公理是完備的,即任何一個由這些公理所產生出的問題,在這個公理系統內可以判定它是真的還是假的,這個結論表明了我們人類所擁有的邏輯思維能力是完備的。這條定理并不能將其帶入這層樓來,帶其進入這層樓的是另一條定理。 “哥德爾不完全性定理”是在1930年證明的,它證明了現有數學的幾條公理(ZF公理系統)是不完備的,即由這些公理產生出的問題,無法由這幾條公理判斷它是真的還是假的。例如希爾伯特23個問題中的第1個問題,也就是著名的康托爾連續統假設,哥德爾在1938年證明了現有公理系統中不能證明它是“假”的,科恩(Cohen,或許也可以稱得上是“半”個大哲)在1963年證明了現有公理系統不能證明它是“真”的。最有趣的是,即使你將某個不可判定的問題,作為一條新的公理加入進去,所組成的新的公理系統仍然是不完備的,即你無法構造一個有限條公理的系統,讓這個公理系統是完備的。 也許你仍然無法理解上面這段話的含義,不妨先說一下它對我們現實世界的影響。你可能知道1936年出現的圖靈機是現代計算機的理論模型,如果沒有哥德爾不完全性定理的思想,圖靈機什么時候能出來是很難說的,所以這位哥德爾可以算作計算機理論的奠基者的奠基者。計算機對
我們這個世界產生的影響比原子彈大了多少,我想不用我說大家也都清楚。當然,對現實世界的影響只能把哥德爾同圖靈等人一樣劃到大科學家那一層去,能進入這層乃是另有原因。 可能你看過《未來戰士》、《黑客帝國》、《I,Robot》之類的科幻電影,于是你產生制造一個和人一樣或者比人更高一級的智能機器人的想法,這就引入了一個達到哲學高度的問題,“人到底能不能制造出具有和人一樣的思維能力的機器來?”。 我 只能告訴你,“你的愿望是良好的,但現實是殘酷的”。如果你仔細思考一下不完全性定理的含義,并結合現代計算機所具有的能力分析一下,你會發現這個問題的 答案暫時是否定的。如果你想造出和人一樣思維能力的機器,那么你需要去好好學習這位大哲及其后續研究者的成果,并在他們的基礎上有新的突破才行。 為 了說明這位大哲所研究領域的重要性,這里順便再討論一個我們日常爭議不休的問題,那就是孔夫子的“人之初、性本善”以及西方認為“人之初、性本惡”的觀點 孰優孰劣的問題。可能有許多人發現西方社會現在領先我們,于是就認為“性本惡”是對的,“性本善”是錯的,中國應該拋棄以前的舊思想,改用西方的思想。當 然也有一些老學究們,認為中國的人文思想是領先于西方的,自然而然地認為“性本善”是對的,“性本惡”是錯的。 如 果你學過大哲用過的公理化的分析方法,你就知道一套系統的多條公理間只要不會推導出矛盾的地方,即可以自圓其說,那么它可以看作是對的。這樣你可以很輕易 地給這個問題下一個結論,即“性本善”和“性本惡”是對等的,不存在孰優孰劣的問題,更不存在誰對誰錯的問題。只要你不同時將“性本善”和“性本惡”放入 一個系統內,那么是不會有問題的,甚至你也可以認為“人之初、既無善、亦無惡”,或者認為“人之初、部分善、部分惡”,都是可以自圓其說的,所以我們的老 祖宗提出的思想并沒有問題,之所以落后乃是其他原因造成的。這個問題其實在高斯所處的時代就有了結論,那時有人提出了非歐幾何,即平行線公理問題,有人認 為過一點可以作多條平行線,還有人認為平行線在無窮遠點是相交的,和歐氏幾何關于過一點只能作一條平行線的公理都是矛盾的,但是他們各自的系統內推導出的 結論都是正確的。上面說的只是對哥德爾不完全性定理的一些粗淺解析,實際上如果深入思考一下它的含義的話,你會發現它對物理學等許多學科有重大影響,包含 的道理實在是深刻,遠非一般的思想所能比擬,有興趣者不妨“google”或“百度”一下“哥德爾”。或許只有我們的老祖宗“老子”提出的哲學思想,深度可以有得一比。 哥德爾不完全性定理也給那些認為科學是嚴謹的人當頭一棒,原來連數學這樣的純理論學科都是不嚴謹的,其他學科就更不用說了。 至此,已經說完數學上的大哲,下面不妨再看看物理學上的大哲,物理學上好像只出過一位叫“海森堡”的大哲(注:由于本人對物理學不甚
了解,不知道“霍金”夠不夠得上大哲的稱號)。
3、海森堡 (1901~1976)
海森堡這個名字相信沒有幾個人不知道的,大部分人在學習物理時都學過他的“測不準關系”,也就是因為這個“測不準關系”,海森堡爬到
了第十層樓。 如果你看過《時間簡史》和《霍金講演錄-黑洞、嬰兒宇宙及其他》,你也許已經了解測不準關系的威力,所以這里不想做過多的討論,只談一些和本土產生的哲學思想相關的東西。 首 先看看爭論了幾千年,并且現在仍然有人在爭論不休的“宿命論”問題。霍金認為,只要這個宇宙有一個初始狀態,粒子的運動是按照一定物理定律進行的(比如相 對論、量子力學屬于這些物理定律的一部分),那么所有的粒子運動軌跡將是確定的,然后只要你承認唯物論,即精神是由物質決定的,那么宿命論就是“對”的。 當然由于測不準關系的存在,對人而言,又是無法準確預測的,因此也可以將其看作是“不對”的。簡單的說,可以認為宿命論是“對”的是絕對的,宿命論是“不 對”的是相對的。 可 能上面這段話你現在仍然難以理解,或許你又覺得你的命運并不是上天注定的,而是可以通過自己的努力可以改變的。我要告訴你的是,你在想什么也是事先已注定 的,包括你在預測本身也是事先注定的,因為大腦思考問題最終是基本粒子運動的結果,而這些粒子的運動必然要遵循物理定律進行,所以你會不會努力,想不想努 力,包括你在想你該不該努力這件事本身也是事先注定的。順便說一下,你現在正在看這篇文章,可能正在想這個宿命論問題值得懷疑,或者覺得寫得不夠好,準備 砸個板磚上來;或者你在想這篇問題寫得有點意思,準備看完后轉給朋友看一看;又或者你看到這里,覺得很累了,準備休息一下;…;這些都是上天事先就注定 的。從你自身的相對角度看,因為你事先不知道后來會發生什么,也可以認為不是事先注定的,可能這句話有些不好理解,不妨好好理解前面說過的公理化思想。 如 果你沒看過《霍金講演錄-黑洞、嬰兒宇宙及其他》,你可能會覺得很驚訝,宿命論歷來不都被認為是唯心論嗎,怎么由唯物論推導出了宿命論呢?現實就是這樣和 你開了一個大的玩笑,不過這個玩笑也是事先注定的。如果你再仔細用公理化的方法思考一下唯物論和唯心論的矛盾性,就像前面分析性善論和性惡論一樣,你會發 現唯物論、唯心論不一定就是沖突的,矛盾的雙方是可以統一的,只要你不要同時將唯物和唯心放進同一個系統中就行。 當 然也有聰明者仍然會懷疑宿命論問題的正確性,因為這里有一個前提條件,即宇宙要有一個初始狀態。宇宙有沒有初始狀態,我們并不知道啊,雖然有大爆炸學說, 但那也只是假說而已,并沒有得到確證,有些人就認為宇宙是一直都存在的。這樣看來似乎你又有合理的理由在懷疑宿命論了,不過我仍然要告訴你,你現在在懷疑 宿命論仍然是事先注定的,不相信的話就來看看下面的分析。 雖然宇宙的初始狀態值得懷疑,但是這個宇宙至少已經存在了一段時間,這點我想是毋庸置疑的。我們可以在我們已知的宇宙存在的這段時間內,任意取一個時間點t0,那么在這個時間點t0上,所有的粒子都有一個運動狀態。在時間點t0之后的時間里,由于粒子運動是按照物理定律進行的,因此粒子運動軌跡由時間點t0的狀態決定。說白一點,如果取100年前的一個時間點作為t0,那么現在的所有粒子運動狀態100年前就已經確定了,如果取10000年前一個時間點作為t0,那么最近10000年內所有粒子運動的軌跡在10000年前就確定了,當然,你可以取更早的時間,比如100億 年前的時間點。總之,現在你會發現宇宙有沒有初始狀態并不會影響宿命論的正確性,所以這個世界的一切都是注定的。只不過由于粒子間相互影響過于復雜,我們 無法知道這些粒子的運動軌跡而已。當然,如果將測不準關系用上的話,那么就是這個運動軌跡對人來說是無法準確預測的,所以不妨開個玩笑:“算命先生經常算 得不準大概是測不準關系的緣故吧”。 如 果你再深入思考一下測不準關系,你會發現這是一個測量系統的問題。由于宿命論的存在,這個世界本身實際上是確定的,是“準“的,之所以測不準乃是我們人類 所具有的測量能力依賴于基本粒子造成的。所以我在前面說宿命論是“不對”的是相對的,它是相對于我們人類的測量能力而言的。根岑(Gentzen,曾任希爾伯特的助手)在一個更強的系統內證明了ZF系統內的問題都是可判定的,從一個側面說明這個世界本身是確定的。(注:它和哥德爾不完全性定理并不矛盾,由于數學上的復雜性,這里就不詳細解釋了) 不 妨再想想我們老祖宗提出的“是莊周夢見了蝴蝶?還是蝴蝶夢見了莊周?”,“風動?幡動?還是心動?”之類的問題,當然以前你都認為這是純粹的唯心主義,甚 至認為是封建糟粕,但是如果結合測不準關系的內涵,再結合前面所說的公理化分析方法進行分析,估計你現在不敢輕易地下結論。也許到現在你仍然無法理解為什 么把大哲們劃在了大科學家的上一層,你可能仍然覺得萬有引力、相對論等成果是最偉大的。
下面就來談談為什么大哲比大科學家高一層。 如果把人類在現有能力情況下,將來所能夠擁有的知識總集看成是一個集合A,人類現在已有的知識總集看成是集合B,顯然,集合B只是集合A的一個子集,并且是很小的一個子集。牛頓力學、相對論這些理論只能算作集合B里的一個子集,相對于集合A,只能算作是滄海一粟。 換句話說,在人類現有能力可做的事情集合中,牛頓力學和相對論等理論給出了詳細的辦法讓你可以做其中的一些事情,當然剩下的更多的事情是牛頓力學和相對論所無法解決的。 哥德爾不完全性定理和測不準關系的意義在于,它指出集合A的 范圍,即將人類現有能力發揮到極限的情況下,那些事情是你能做到的,那些是你不能做到的。當然,它并沒有給出具體的方法讓你去做你能做到的事情,它只是告 訴我們我們人類現在發現的能力所能達到的極限。或許將來發現人類有其他新的未發現的能力,那么這個極限就被打破了。比如將來能發現不依賴于基本粒子的其他 測量方法,并且測量過程中不會改變其他粒子的狀態,那么測不準關系就被打破了。 看 到這里,估計你已經發現了一些秘密,科學兜了一大圈,最終還是回到了哲學,也就是我們所認為的玄學上。同時你也會發現,我們老祖宗提出的所謂玄學,原來和 現代科學是相通的,并非象某些人想像的那樣全是糟粕。如果有人認為西方現代暫時領先我們,進而就認為西方古代就已經超越我們,我們老祖宗就已經落后西方, 他們的思想都是糟粕的話,那么我認為他可能犯了崇洋媚外的毛病。我不得不化用一句周杰倫在春晚上的歌詞送給他:“你不妨抓一副我們祖傳的中醫良方,治一治 你那崇洋媚外的內傷”。順便告訴他一下,中醫用的陰陽五行理論,它的前提假設就是宿命論。 上面說的這幾位大哲的成果,可能對你的世界觀會有很大的影響,于是你可能會羨慕起這些大哲們的成果來。如果你有大志的話,你會希望有朝一日你也能變成大哲,但是你發現上面的大哲是研究數學和物理學的,而你是學計算機的程序員,那么是不是沒有機會變成大哲呢? 如果你能將NP難 題給徹底解決掉,意味著計算機內的計算的奧秘基本被揭開,或許你可以進到這層樓來;或者你能發現另外一套計算機可以理解的數學公理系統,并且這個公理系統 是完備的,那么計算機取代人類進行思維的一個必要條件就滿足了,計算機將具有真正意義上的“邏輯思維和推理能力”,你可以輕松地進到這層樓來。如果你發現 了新的方法可以打破測不準關系,同樣你也可以輕松地進到這層樓來。如果你能徹底揭開人類抽象思維的奧妙,并讓計算機懂得了如何創建抽象,具備抽象思維能 力,那么也就具備了“設計能力”,可以取代人類進行各種設計了,你也可以輕松地進到這層樓來。順便說一下,如果你對軟件設計有真正深刻理解的話,就會明白 這不是在寫科幻小說。對此感興趣者,不妨好好地研究一下程序切片方面的技術,會讓你對軟件設計和測試等方面的理解有質的提高,或許有一天你能打開這扇大 門。 當然,計算機要完全取代人還有其他必要條件,后面還會提及。值得一提的是,雖然第10層樓是本文中所寫的最高層,但是大哲們并沒有覺得他們到了頂層,他們通常都還會努力尋找通往更高一層的樓梯。如果你也有成為天下第一的想法,那么你或許會想要做什么事情才能超越大哲們的成就,當然,這都得依賴于找到更高一層樓的樓梯。 個人認為,再往上一層樓的樓梯是通往天堂的道路,也就是說第11層樓的名字叫“天堂”,是“上帝”住的地方,而不是人住的地方。如果將來某天有人能爬到天堂的話,那么他已經不是人了,而是由人變成了“上帝”。 你也許會懷疑這個世界到底有沒有“天堂”,“上帝”是否根本就不存在,我也很有同感。因此有必要再寫上一段文字,討論一下“上帝”的問題。如果你想了解天堂的奧妙,有沒有辦法讓你變成“上帝”,不妨看看繼續往下看看第11層樓的玄妙。注意我這里用的是“玄妙”二字,因為上帝在大部分人眼里估計都是“玄之又玄”的東西。
第11層 上帝
看了上面的小標題,你可能會覺得奇怪,這篇文章不是講“程序員的十層樓”嗎?怎么冒出了第11層來了? 其實這并不矛盾,程序員確實只有十層樓,因為爬到第11層時,已經變成上帝,不再是程序員了;所以超出10層樓本身并不重要,關鍵的問題是看你有沒有能力變成上帝。
1、誰是上帝?
菜鳥們認為Linus Torvalds是程序員中的上帝,看完了前面各層樓的介紹,此時再看到這句話,相信你要忍不住在心里笑起來。當然,你會不會笑起來是事先注定的。Don Knuth也不是上帝,他離上帝還有三層樓的距離。即使是大哲們,他們離天堂也還差一層樓,因此這個世界上有史以來還沒有任何一個人變成過上帝。 我們感興趣的是,將來會不會有人爬到比大哲們更高的樓層上,變成了上帝。 要變成上帝,你得有上帝一樣的能力,上帝會造人,你會嗎? 你也許會怯生生地問:“我可以和愛人生小孩,算不算造人?”,你可能還會理直氣壯地說:“現在生物學上都可以克隆人了,早就有人掌握了造人的方法”。 事實上克隆人需要有人的體細胞,必須要先有人才會有體細胞。上帝造人時,這個世界上并沒有人,是從無生命的物質“塵土”中創造出的人。因此,用最原始的方法生人和克隆人都是從有生命信息的物質中生人,不能算作造人。 這樣看來,你根本不會造人,不過我可以告訴你一個“玄方”,讓你有機會學會如何造人。 如果你揭開了人類情感的奧秘,讓計算機也可以擁有和人類一樣的情感,那么計算機將可以理解人類的需求,具有了“情商”,將具有完整的和人一樣的能力。此時,人類進化到了機器人,科幻小說將變成現實,也就是說你已經掌握了真正的造人能力,晉升為“上帝”了。 未來到底有沒有人能變成“上帝”,人能不能進化到機器人,這是宿命論中事先注定了的。說到這里,不妨再告訴你一個打破宿命論的方法,這個方法就是你要爬到比上帝還要高的樓層。 “還有比上帝還高的樓層?”,你可能會第1時間內冒出這個問題,其實我也有同樣的懷疑。因此在寫第12層樓前,有必要弄清楚它到底存不存在,即你可不可以騎到上帝的頭上的問題。
2. 騎到上帝的頭上?
為了解決是否可以騎到上帝的頭上這個問題,不妨先假設存在比上帝高的樓層,也就是存在打破宿命論的方法。宿命論的本質原因是因為時間是單向運行,不可逆轉造成的。如果你找到一種可以使時間逆轉的方法,那么你就打破了宿命論,爬到了比上帝還高的樓層。 看到這里,你也許會擺脫剛才陷于宿命論的困惑情緒,變得充滿希望般高興起來。不過,如果你的邏輯思維能力足夠好,仔細思考一下,會發現存在一個邏輯上的悖論。 在你找到時間逆轉的方法之前,顯然這個世界仍然是需要服從宿命論的,也就是說你能不能找到打破宿命論的方法是事先注定的。假設你在某個時間點t0處找到了打破宿命論的方法,你在打破宿命論后,想利用時間逆轉的方法回到某個時間點t2。下面來看看你到底能不能回到時間點t2。 取位于t0和t2之間的任意一個時間點t1,你在回到時間點t2之前,必須先經過時間點t1,考慮你到達t1的那一時刻,由于t1比t0要早,這個時間點上你還沒有找到時間逆轉的方法,所以到了時間t1點后,你無法再使用時間逆轉的能力回到時間點t2去,所以你永遠也回不到時間點t2,由于時間點t2是任意取的,因此,你永遠也無法使時間逆轉,或者說你根本就沒打破過宿命論,這與你在時間點t0打破了宿命論產生了矛盾。 上面這段話看起來似乎有點像“人永遠邁不出一步”的詭辯一樣,你可能會想返回到時間點t1時,仍然可以擁有時間逆轉能力啊。不過你又會發現一個新的問題,時間點t1本來是沒有時間逆轉能力的,現在又認為時間點t1又有時間逆轉能力,那時間點t1到底是有還是沒有時間逆轉能力呢?或者說在時間點t0前,宿命論注定了時間點t1是沒有時間逆轉能力的,現在你又認為時間點t1具有時間逆轉能力,那么這兩個時間點t1究竟是不是同一個時間點?如果不是同一個時間點,說明你沒有回到過去;如果是同一個時間點的話,豈不是自相矛盾嗎? 為了說得更形象一些,不妨假設你坐一艘超光速飛船,準備從時間點t0回到時間點t2去,假設你回到t2后,隨著時間的流逝,又達到了時間點t0,如果這時你又再次坐超光速飛船返回時間點t2,那么一個值得思考的問題就出現了,“你在時間點t2能不能看到上次返回時間點t2的飛船?” 如果回答不能看到飛船,那么上次返回的飛船那里去了呢?顯然很難解釋通。如果回答能看到飛船,那么你可以到達時間點t2后,下次時間到達t0時,你又坐飛船返回t2,這次你將可以看到上兩次的兩艘飛船。如果這樣一直循環下去,最后你會發現你可以在時間點t2看到無窮多的飛船。用程序員的術語說,叫做“程序陷入了死循環”,最后系統必然會出現“Out of Memory”現象而崩潰。 當然,你也可以認為有其他的方法,不需要飛船,可以一次性從時間點t0直接跳躍到時間點t2,并不需要經過時間點t1。下面不妨來分析一下這個方法是否可行。 既然是直接跳躍到時間點t2,那么你必然是在一個無窮小的時間里出現在時間點t2的某個空間里,例如你要在時間點t2回到某個廣場上。首先說明一下為什么是無窮小的時間里出現的,因為如果不是無窮小的時間里出現的話,那么必然可以取到一個時間點t1,會導致前面所說的時間點t1上出現悖論。 你 在廣場上出現的時,廣場上的空氣必然要為你讓開空間,而這是在無窮小的時間里完成的,那么很容易推導出你周圍的空氣獲得的加速度和速度都是無窮大,因而它 具有的動能也是無窮大,無窮大的能量和無窮大的速度意味著什么?一只鳥都可以將飛機撞下來,如果宇宙是有限大的話,它可以讓這個宇宙炸毀無窮次;即使宇宙 是無限大,它也足以讓宇宙炸毀一次。宇宙都毀滅了,又何來的時間?還能說你回到了時間點t2嗎? 也許上面說的這些你仍然難以相信,不妨再說得更現實一些,假設你要回到100年前的一個時間點,這100年中,天上有多少流星湮滅了?有多少新星生成了?宇宙膨脹了多少?你有能力讓湮滅的流星復原、生成的新星重新返回未生成前的狀態,膨脹的宇宙收縮回去嗎?如果這些東西的狀態沒有回復到100年前,又怎么能說明你回到的是100年前的時間點呢? 根據上面的推導和分析,個人認為使時間逆轉的方法是不存在的,所以第12層樓是不存在的,自然沒有人可以騎到“上帝”的頭上。 宿命論將在有時間的時間里永遠統治這個世界。
計算機科學與技術反思錄
計算機科學與技術這一門科學深深的吸引著我們這些同學們,上計算機系已經有近三年了,自己也做了一些思考,我一直認為計算機科學與技術這門專業,在本科階段是不可能切分成計算機科學和計算機技術的,因為計算機科學需要相當多的實踐,而實踐需要技術;每一個人(包括非計算機專業), 掌握簡單的計算機技術都很容易(包括程序設計),但計算機專業的優勢就在于,我們掌握許多其他專業并不“深究”的東西,例如,算法,體系結構,等等。非計 算機專業的人可以很容易地做一個芯片,寫一段程序,但他們做不出計算機專業能夠做出來的大型系統。今天我想專門談一談計算機科學,并將重點放在計算理論 上。
計算機理論的一個核心問題——從數學談起:
記得當年大一入學,每周六課時高等數學,天天作業不斷(那時是六日工作制)。頗有些同學驚呼走錯了門:咱 們這到底念的是什么系?不錯,你沒走錯門,這就是計算機科學與技術系。我國計算機科學系里的傳統是培養做學術研究,尤其是理論研究的人(方向不見得有問 題,但是做得不是那么盡如人意)。而計算機的理論研究,說到底了,如網絡安全,圖形圖像學,視頻音頻處理,哪個方向都與數學有著很大的關系,雖然也許是正 統數學家眼里非主流的數學。這里我還想闡明我的一個觀點:我們都知道,數學是從實際生活當中抽象出來的理論,人們之所以要將實際抽象成理論,目的就在于想 用抽象出來的理論去更好的指導實踐,有些數學研究工作者喜歡用一些現存的理論知識去推導若干條推論,殊不知其一:問題考慮不全很可能是個錯誤的推論,其 二:他的推論在現實生活中找不到原型,不能指導實踐。嚴格的說,我并不是一個理想主義者,政治課上學的理論聯系實際一直是指導我學習科學文化知識的航標 (至少我認為搞計算機科學與技術的應當本著這個方向)。
其實我們計算機系學數學光學高等數學是不夠的(典型的工科院校一般都開的是高等數學),我們應該像數學系一樣學一下數學分析(清華計算機系開的好像就是 數學分析),數學分析這門科學,咱們學計算機的人對它有很復雜的感情。在于它是偏向于證明型的數學課程,這對我們培養良好的分析能力極有幫助。我的軟件工 程學導師北工大數理學院的王儀華先生就曾經教導過我們,數學系的學生到軟件企業中大多作軟件設計與分析工作,而計算機系的學生做程序員的居多,原因就在于 數學系的學生分析推理能力,從所受訓練的角度上要遠遠在我們之上。當年出現的怪現象是:計算機系學生的高中數學基礎在全校數一數二(希望沒有冒犯其它系的同學),教學課時數也僅次于數學系,但學完之后的效果卻不盡如人意。難道都是學生不努力嗎,我看未見得,方向錯了也說不一定,其中原因何在,發人深思。
我個人的淺見是:計算機系的學生,對數學的要求固然跟數學系不同,跟物理類差別則更大。通常非數學專業的所謂“高等數學”,無非是把數學分析中較困難的 理論部分刪去,強調套用公式計算而已。而對計算機系來說,數學分析里用處最大的恰恰是被刪去的理論部分。說得難聽一點,對計算機系學生而言,追求算來算去 的所謂“工程數學”已經徹底地走進了誤區。記上一堆曲面積分的公式,難道就能算懂了數學?那倒不如現用現查,何必費事記呢?再不然直接用Mathematics或是Matalab好了。
我在系里最愛做的事情就是給學弟學妹們推薦參考書。中文的數學分析書,一般都認為以北大張筑生老師的“數學分析新講”為最好。萬一你的數學實在太好,那就去看菲赫金哥爾茨的“微積分學教程”好了--但 我認為沒什么必要,畢竟你不想轉到數學系去。吉米多維奇的“數學分析習題集”也基本上是計算型的東東。書的名氣很大,倒不見得適合我們,還是那句話,重要 的是數學思想的建立,生活在信息社會里我們求的是高效,計算這玩意還是留給計算機吧。不過現在多用的似乎是復旦大學的《數學分析》也是很好的教材。
中國的所謂高等代數,就等于線性代數加上一點多項式理論。我以為這有好的一面,因為可以讓學生較早感覺到代數是一種結構,而非一堆矩陣翻來覆去。這里不 得不提南京大學林成森,盛松柏兩位老師編的“高等代數”,感覺相當舒服。此書相當全面地包含了關于多項式和線性代數的基本初等結果,同時還提供了一些有用 的又比較深刻的內容,如Sturm序列,Shermon-Morrison公 式,廣義逆矩陣等等。可以說,作為本科生如能吃透此書,就可以算高手。國內較好的高等代數教材還有清華計算機系用的那本,清華出版社出版,書店里多多,一 看就知道。從抽象代數的觀點來看,高等代數里的結果不過是代數系統性質的一些例子而已。莫宗堅先生的《代數學》里,對此進行了深刻的討論。然而莫先生的書 實在深得很,作為本科生恐怕難以接受,不妨等到自己以后成熟了一些再讀。
正如上面所論述的,計算機系的學生學習高等數學:知其然更要知其所以然。你學習的目的應該是:將抽象的理論再應用于實踐,不但要掌握題目的解題方法,更 要掌握解題思想,對于定理的學習:不是簡單的應用,而是掌握證明過程即掌握定理的由來,訓練自己的推理能力。只有這樣才達到了學習這門科學的目的,同時也 縮小了我們與數學系的同學之間思維上的差距。
概率論與數理統計這門課很重要,可惜大多數院校講授這門課都會少些東西。少了的東西現在看至少有隨機過程。到畢業還沒有聽說過Markov過 程,此乃計算機系學生的恥辱。沒有隨機過程,你怎么分析網絡和分布式系統?怎么設計隨機化算法和協議?據說清華計算機系開有“隨機數學”,早就是必修課。 另外,離散概率論對計算機系學生來說有特殊的重要性。而我們國家工程數學講的都是連續概率。現在,美國已經有些學校開設了單純的“離散概率論”課程,干脆 把連續概率刪去,把離散概率講深些。我們不一定要這么做,但應該更加強調離散概率是沒有疑問的。這個工作我看還是盡早的做為好。
計算方法學(有些學校也稱為數學分析學)是最后一門由數理學院給我們開的課。一般學生對這門課的重視程度有限,以為沒什么用。不就是照套公式嘛!其實, 做圖形圖像可離不開它,密碼學搞深了也離不開它。而且,在很多科學工程中的應用計算,都以數值的為主。這門課有兩個極端的講法:一個是古典的“數值分 析”,完全講數學原理和算法;另一個是現在日趨流行的“科學與工程計算”,干脆教學生用軟件包編程。我個人認為,計算機系的學生一定要認識清楚我們計算機 系的學生為什么要學這門課,我是很偏向于學好理論后用計算機實現的,最好使用C語言或C++編程實現。向這個方向努力的書籍還是挺多的,這里推薦大家高等教育出版社(CHEP)和施普林格出版社(Springer)聯合出版的《計算方法(Computational Methods)》,華 中理工大學數學系寫的(現華中科技大學),這方面華科大做的工作在國內應算是比較多的,而個人認為以這本最好,至少程序設計方面涉及了:任意數學函數的求 值,方程求根,線性方程組求解,插值方法,數值積分,場微分方程數值求解。李慶揚的那本則理論性過強,與實際應用結合得不太緊。
每個學校本系里都會開一門離散數學,涉及集合論,圖論,和抽象代數,數理邏輯。不過,這么多內容擠在離散數學一門課里,是否時間太緊了點?另外,計算機 系學生不懂組合和數論,也是巨大的缺陷。要做理論,不懂組合或者數論吃虧可就太大了。從理想的狀態來看,最好分開六門課:集合,邏輯,圖論,組合,代數,數論。這個當然不現實,因為沒那么多課時。也許將來可以開三門課:集合與邏輯,圖論與組合,代數與數論。(這方面我們學校已經著手開始做了)不管課怎么開,學生總一樣要學。下面分別談談上面的三組內容。
古典集合論,北師大出過一本《基礎集合論》不錯。 數理邏輯,中科院軟件所陸鐘萬教授的《面向計算機科學的數理邏輯》就不錯。現在可以找到陸鐘萬教授的講課錄像,http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自己去看看吧。總的來說,學集合/邏輯起手不難,普通高中生都能看懂。但越往后越感覺深不可測。
學完以上各書之后,如果你還有精力興趣進一步深究,那么可以試一下GTM系列中的《Introduction to Axiomatic Set Theory》和《A Course of Mathematical Logic》。這兩本都有世界圖書出版社的引進版。你如果能搞定這兩本,可以說在邏輯方面真正入了門,也就不用再浪費時間聽我瞎侃了。
據說全中國最多只有三十個人懂圖論。此言不虛。圖論這東東,技巧性太強,幾乎每個問題都有一個獨特的方法,讓人頭痛。不過這也正是它魅力所在:只要你有 創造性,它就能給你成就感。我的導師說,圖論里面隨便揪一塊東西就可以寫篇論文。大家可以體會里面內容之深廣了吧!國內的圖論書中,王樹禾老師的“圖論及 其算法”非常成功。一方面,其內容在國內教材里算非常全面的。另一方面,其對算法的強調非常適合計算機系(本來就是科大計算機系教材)。有了這本書為主,再參考幾本翻譯的,如Bondy & Murty的《圖論及其應用》,人民郵電出版社翻譯的《圖論和電路網絡》等等,就馬馬虎虎,對本科生足夠了。再進一步,世界圖書引進有GTM系列的“Modern Graph Theory“。此書確實經典!國內好象還有一家出版了個翻譯版。不過,學到這個層次,還是讀原版好。搞定這本書,也標志著圖論入了門。
離散數學方面我們北京工業大學實驗學院有個世界級的專家,叫邵學才,復旦大學概率論畢業的,教過高等數學,線性代數,概率論,最后轉向離散數學,出版著 作無數,論文集新加坡有一本,堪稱經典,大家想學離散數學的真諦不妨找來看看。這老師的課我專門去聽過,極為經典。不過你要從他的不經意的話中去挖掘精 髓。在同他的交談當中我又深刻地發現一個問題,雖說邵先生寫書無數,但依他自己的說法每本都差不多,我實在覺得詫異,他說主要是有大綱的限制,不便多寫。 這就難怪了,很少聽說國外寫書還要依據個什么大綱(就算有,內容也寬泛的多),不敢越雷池半步,這樣不是看誰的都一樣了。外版的書好就好在這里,最新的科 技成果里面都有論述,別的先不說,至少是“緊跟時代的理論知識”。組合感覺沒有太適合的國產書。還是讀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“為最優。對入門而言,這一本已經足夠,不需要再參考其它書。
再說說形式語言與自動機。我看過北郵的教材,應該說寫的還清楚。但是,有一點要強調:形式語言和自動機的作用主要在作為計算模型,而不是用來做編譯。事實上,編譯前端已經是死領域,沒有任何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(離散)。不管連續數學還是離散數學,都是有用的數學!
理論與實際的結合——計算機科學研究的范疇
前 面主要是從數學角度來看的。從計算機角度來看,理論計算機科學目前主要的研究領域包括:可計算性理論,算法設計與復雜性分析,密碼學與信息安全,分布式計 算理論,并行計算理論,網絡理論,生物信息計算,計算幾何學,程序語言理論等等。這些領域互相交叉,而且新的課題在不斷提出,所以很難理出一個頭緒來。想 搞搞這方面的工作,推薦看中國計算機學會的一系列書籍,至少代表了我國的權威。下面隨便舉一些例子。
由于應用需求的推動,密碼學現在成為研究的熱點。密碼學建立在數論(尤其是計算數論),代數,信息論,概率論和隨機過程的基礎上,有時也用到圖論和組合學等。很多人以為密碼學就是加密解密,而加密就是用一個函數把數據打亂。這樣的理解太淺顯了。
現代密碼學至少包含以下層次的內容:
第一,密碼學的基礎。例如,分解一個大數真的很困難嗎?能否有一般的工具證明協議正確?
第二,密碼學的基本課題。例如,比以前更好的單向函數,簽名協議等。
第三,密碼學的高級問題。例如,零知識證明的長度,秘密分享的方法。
第四,密碼學的新應用。例如,數字現金,叛徒追蹤等。
在分布式系統中,也有很多重要的理論問題。例如,進程之間的同步,互斥協議。一個經典的結果是:在通信信道不可靠時,沒有確定型算法能實現進程間協同。所以,改進TCP三次握手幾乎沒有意義。例如時序問題。常用的一種序是因果序,但因果序直到不久前才有一個理論上的結果....例如,死鎖沒有實用的方法能完美地對付。例如,......操作系統研究過就自己去舉吧!
如果計算機只有理論,那么它不過是數學的一個分支,而不成為一門獨立的科學。事實上,在理論之外,計算機科學還有更廣闊的天空。
我一直認為,4年根本不夠學習計算機的基礎知識,因為面太寬了......
這 方面我想先說說我們系在各校普遍開設的《計算機基礎》。在高等學校開設《計算機基礎課程》是我國高教司明文規定的各專業必修課程要求。主要內容是使學生初 步掌握計算機的發展歷史,學會簡單的使用操作系統,文字處理,表格處理功能和初步的網絡應用功能。但是在計算機科學系教授此門課程的目標決不能與此一致。 在計算機系課程中目標應是:讓學生較為全面的了解計算機學科的發展,清晰的把握計算機學科研究的方向,發展的前沿即每一個課程在整個學科體系中所處的地 位。搞清各學科的學習目的,學習內容,應用領域。使學生在學科學習初期就對整個學科有一個整體的認識,以做到在今后的學習中清楚要學什么,怎么學。計算機 基本應用技能的位置應當放在第二位或更靠后,因為這一點對于本系的學生應當有這個摸索能力。這一點很重要。推薦給大家一本書:機械工業出版社的《計算機文 化》(New Perspective of Computer Science), 看了這本書我才深刻的體會到自己還是個計算機科學初學者,才比較透徹的了解了什么是計算機科學。另外在廈門大學趙致琢老師的著作《計算科學導論》當中的很 多經典理論都是在同類書籍中很難找到的。看看他也許你才會明白一個最基本的問題:為什么計算機科學叫計算科學更為準確。這本書在世界上也可成為精品級的著 作。
一個一流計算機系的優秀學生決不該僅僅是一個編程高手,但他一定首先是一個編程高手。我上大學的時候,第一門專業課是C語言程序設計,念計算機的人從某種角度講相當一部分人是靠寫程序吃飯的。在我們北京工業大學實驗學院計算機系里一直有這樣的爭論(時至今日CSDN上 也有),關于第一程序設計語言該用哪一種。我個人認為,用哪種語言屬于末節,關鍵在養成良好的編程習慣。當年老師對我們說,打好基礎后學一門新語言只要一 個星期。現在我覺得根本不用一個星期,前提是先把基礎打好。不要再猶豫了,學了再說,等你抉擇好了,別人已經會了幾門語言了。
匯編語言和微機原理是兩門特煩人的課。你的數學/理 論基礎再好,也占不到什么便宜。這兩門課之間的次序也好比先有雞還是先有蛋,無論你先學哪門,都會牽扯另一門課里的東西。所以,只能靜下來慢慢琢磨。這就 是典型的工程課,不需要太多的聰明和頓悟,卻需要水滴石穿的漸悟。有關這兩門課的書,計算機書店里不難找到。弄幾本最新的,對照著看吧。組成原理推薦《計 算機組成與結構》清華大學王愛英教授寫的。匯編語言大家拿8086/8088入個門,之后一定要學80x86匯編語言。實用價值大,不落后,結構又好,寫寫高效病毒,高級語言里嵌一點匯編,進行底層開發,總也離不開他,推薦清華大學沈美明的《IBM—PC匯 編語言程序設計》。有些人說不想了解計算機體系結構,也不想制造計算機,所以諸如計算機原理,匯編語言,接口之類的課覺得沒必要學,這樣合理嗎?顯然不合 理,這些東西遲早得掌握,肯定得接觸,而且,這是計算機專業與其他專業學生相比的少有的幾項優勢。做項目的時候,了解這些是非常重要的,不可能說,僅僅為 了技術而技術,只懂技術的人最多做一個編碼工人,而永遠不可能全面地了解整個系統的設計,而編碼工人是越老越不值錢。關于組成原理還有個講授的問題,在我 學這門課程時老師講授時把CPU工作原理譽微程序設計這一塊略掉了,理由是我們國家搞CPU技術不如別的國家,搞了這么長時間好不容易出了個龍芯比Intel的還差個十萬八千里,所以建議我們不要學了。我看這在各校也未見得不是個問題吧!若真是如他所說,那中國的計算機科學哪個方向都可以停了,軟硬件,應用,有幾項搞得過美國,搞不過別人就不搞了,那我們坐在這里干什么?教學的觀念需要轉變的。
模擬電路這東東,如今不僅計算機系學生搞不定,電子系學生也多半害怕。如果你真想軟硬件通吃,那么建議你先看看邱關源的“電路原理”,也許此后再看模擬 電路底氣會足些。教材:康華光的“電子技術基礎”(高等教育出版社)還是不錯的(我校電子系在用)。有興趣也可以參考童詩白的書。
數字電路比模擬電路要好懂得多。推薦大家看一看我們北工大劉英嫻教授寫的《數字邏輯》業績人士都說這本書很有參考價值(機械工業出版社的)。原因很明 了,實用價值高,能聽聽她講授的課程更是有一種“享受科學”的感覺。清華大學閻石的書也算一本好教材,遺憾的一點是集成電路講少了些。真有興趣,看一看大 規模數字系統設計吧(北航那本用的還比較多)。
計算機系統結構該怎么教,國際上還在爭論。國內能找到的較好教材為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“.作為知識的完整性,還推薦大家看一看機械工業出版社的《數據倉庫》譯本。
計算機網絡的標準教材還是來自Tanenbaum的《Computer Networks》(清華大學有譯本)。還有就是推薦謝希仁的《計算機網絡教程》(人民郵電出版社)問題講得比較清楚,參考文獻也比較權威。不過,網絡也屬于Hardcore System,所以光看書是不夠的。建議多讀RFC,http://www.ietf.org/rfc.htm里可以按編號下載RFC文檔。從IP的讀起。等到能掌握10種左右常用協議,就沒有幾個人敢小看你了。再做的工作我看放在網絡設計上就比較好了。
數據結構的重要性就不言而喻了,學完數據結構你會對你的編程思想進行一番革命性的洗禮,會對如何建立一個合理高效的算法有一個清楚的認識。對于算法的建立我想大家應當注意以下幾點:
當遇到一個算法問題時,首先要知道自己以前有沒有處理過這種問題.如果見過,那么你一般會順利地做出來;如果沒見過,那么考慮以下問題:
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.鼻祖嘛!
關于網絡安全我也想在這里說兩句,隨著計算機技術的發展,整個社會的信息化水平突飛猛進,計算機網絡技術日新月異,網絡成了當即社會各個工作領域不可缺 少的組成部分,只要有網絡存在,網絡安全問題就是一個必須解決好的問題,學習網絡安全不是簡簡單單的收集一些黑客工具黑一黑別人的網站,而是要學習他的數 學原理,實現原理,搞清底層工作機制,這樣才能解決大部分的現有問題和新出現的安全問題。
關于計算機科學的一些邊緣科學我想談一談軟件工程技術,對于一個企業,推出軟件是不是就是幾個程序員坐在一起,你寫一段程序,我寫一段程序呢?顯然不 是。軟件工程是典型的計算機科學和數學,管理科學,心理學,社會學等學科的綜合。它使我們這些搞理論和技術的人進入了一個社會。你所要考慮的不僅僅是程序 的優劣,更應該考慮程序與軟件的區別,軟件與軟件產品的區別,軟件軟件產品的市場前景,如何去更好的與人交流。這方面我還在學習階段,以后這方面再寫文章 吧,先推薦給大家幾本書:暢銷20年不衰的《人月神話》(清華大學中文版,中國電力出版社影印版),《軟件工程-實 踐者研究的方法》(機械工業出版社譯本),《人件》(據說每一位微軟公司的部門經理都讀過這本書,推薦老總們和想當老總的同學都看看,了解一下什么是軟件 企業中的人)以及微軟公司的《軟件開發的科學與藝術》和《軟件企業的管理與文化》(研究軟件企業的制勝之道當然要研究微軟的成功經驗了!)
關于計算機技術的學習我想是這樣的:學校開設的任何一門科學都有其滯后性,不要總認為自己掌握的某門技術就已經是天下無敵手了,雖然現在Java,VB,C,C++用的都很多,怎能保證沒有被淘汰的一天,我想.NET平臺的誕生和X#語言的初見端倪完全可以說明問題。換言之,在我們掌握一門新技術的同時就又有更新的技術產生,身為當代的大學生應當有緊跟科學發展的素質。舉個例子,就像有些同學總說,我做網頁設計就喜歡直接寫html,不愿意用什么Frontpage,Dreamweaver。能用語言寫網頁固然很好,但有高效的手段你為什么不使呢?僅僅是為了顯示自己的水平高,unique? 我看真正水平高的是能夠以最快的速度接受新事物的人。高級程序設計語言的發展日新月異,今后的程序設計就像人們在說話一樣,我想大家從xml中應是有所體會了。難道我們真就寫個什么都要用匯編,以顯示自己的水平高,真是這樣倒不如直接用機器語言寫算了。反過來說,想要以最快的速度接受并利用新技術關鍵還是在于你對計算機科學地把握程度。
計算機技術牽扯的內容更為廣泛些,一項一項說恐怕沒個一年半載也說不清。我只想提醒大家的還是那句話,技術與科學是不能分家的,學好了科學同時搞技術,這才是上上策。猶如英語,原先人們與老外交流必須要個翻譯,現在滿馬路的人都會說英語。就連21世 紀英語演講比賽的冠軍都輪不到英語系的學生了。計算機也是一樣的,我們必須面對的一個現實就是:計算機真就只是一個工具,如果不具備其它方面的素養,計算 機系的學生雖然不能說找不到工作,不過總有一天當其他專業性人才掌握了計算機技術后將比我們出色許多。原因就在于計算機解決的大都是實際問題,實際問題的 知識卻是我們少有的。單一的計算機技術沒有立足之地。
我 想是時候指出:學習每一個課程之前,都要先搞清這一課程的學習目的。這一學科的應用領域。據我自身所了解到的同齡同學和低年級的同學的學習狀況:他們之中 很少有人知道學一個學科的學習目的,期末考試結束了也不知道學這科做什么用。這就失去了讀計算機科學的意義。當然這與現存的教育思想不能說一點關系都沒 有。
總的來說,從教育角度來講,國內高校的課程安排不是很合理,強調理論,又不愿意在理論上深入教育,無力接受新技術,想避開新技術又無法避得一干二凈。我 覺得關鍵問題就是國內的高校難于突破現狀,條條框框限制著怎么求發展。我們雖然認識得到國外教育的優越性,但為什么遲遲不能采取行動?哪怕是去粗取精的取 那么一點點。我們需要改變。從我們自身角度來講,多數人4年 下來既沒有學習計算機科學的學術水平,也沒有學習計算機技術的那種韌勁。在我剛上大一時,我的計算機科學入門導師,淮北煤炭師范學院王愛平教授曾經對我說 過這樣一番話:“當你選擇了計算機這一門科學,就意味著你踏上了一條不歸路,就意味著你一生都要為之奮斗……你的身后是懸崖,只有向前走,不能往后退。”
有 些同學說按照這樣學習學的東西太多,有的未見得有用,我想打個形象的比方:學校學出來的人都是一個球體,方方面面的知識都應具備。可是社會上需要球體的地 方很少,反而需要的是磚和瓦,即精通某一行的人才。但是對于同等體積的物體,用球體來改造是最方便最省事的。學校的學生很多,為了能夠使更多的學生來適應 這個社會,學校也就不得以把所有的學生都打造成一個球體,然后讓社會對這些學生進行再加工,成為真正能夠有用的人才。即使你非常清楚自己的將來要干什么, 并且非常下定決心要走自己的路,這一步你也必須走,世界是在不斷變化的,你不能預料未來。想清楚,努力去干吧!
必須結束這篇“胡侃”了,再侃下去非我力所能及。其實計算機還有很多基礎課都值得一侃。怎奈我造詣有限,不敢再讓內行恥笑。對于博大精深的計算機科學,我只能說我永遠都是個Beginner.最后聲明:這些只針對本科階段的學習。即使把這些全弄通了,前面的路還長,計算機科學需要我們為之奮斗......學習計算機科學需要韌性,更需要創新,需要激情。深刻學習理論知識,勇于接受新技術的挑戰,這才是我們這一代人應具有的素質。最后送大家一句話“Wake up every day with a feeling of passion for the difference technology will make in people’s life!”。
在我大一時無意中找到了南京大學網友sir的
帖子“胡侃(理論)計算機學習”,這個帖子對我的大學生活起了至關重要的作用,也因此同他成為了好友,本帖子在原有帖子的基礎上改進了其中我認為不太合適
的理論,修正了一些觀點,在推薦教材方面結合我的學習情況有了較大改變。值得一提的是增加了一些計算機理論的內容,計算機技術的內容結合我國的教學情況和
我們學習的實際情況進行了重寫。感謝大家的支持,這篇文章才能比較快的完成,這里也只是寫下了我在學習計算機科學時的所思所想,很不成熟。與原文相比增加
了一些推薦參考書,刪去了一些過陳舊的難以找到的材料。并且對一些問題作了更為詳細地闡述,也增加了一些新觀點。希望大家多多討論,改進不足,讓我們共同
努力吧!
來自:http://blog.163.com/otrewyi191@126/blog/static/6368212920101174750329/