計算機科學與技術這一門科學深深的吸引着咱們這些同窗們,上應用數學系已經有近三年了,本身也作了一些思考,原先無論是國內仍是國外都喜歡把計算機系分爲計算機軟件理論、計算機系統、計算機技術與應用。後來又合到一塊兒,變成了如今的計算機科學與技術。我一直認爲計算機科學與技術這門專業,在本科階段是不可能切分紅計算機科學和計算機技術的,由於計算機科學須要至關多的實踐,而實踐須要技術;每個人(包括非計算機專業),掌握簡單的計算機技術都很容易(包括原先Major們自覺得得意的程序設計),但計算機專業的優點是:咱們掌握許多其餘專業並不"深究"的東西,例如,算法,體系結構,等等。非計算機專業的人能夠很容易地作一個芯片,寫一段程序,但他們作不出計算機專業可以作出來的大型系統。今天我想專門談一談計算機科學,並將重點放在計算理論上。
一、計算機理論的一個核心問題--從數學談起:
[1]高等數學Vs數學分析
記得當年大一入學,每週四課時高等數學,每天做業不斷(那時是七天工做制)。很有些同窗驚呼走錯了門:我們這到底唸的是什麼系?不錯,你沒走錯門,這就是計算機科學與技術系。我國計算機科學系裏的傳統是培養作學術研究,尤爲是理論研究的人(方向不見得有多大的問題,可是作得不是那麼盡如人意)。而計算機的理論研究,說到底了,如網絡安全學,圖形圖像學,視頻音頻處理,哪一個方向都與數學有着很大的關係,雖然也許是正統數學家眼裏非主流的數學。這裏我還想闡明個人一個觀點:咱們都知道,數學是從實際生活當中抽象出來的理論,人們之因此要將實際抽象成理論,目的就在於想用抽象出來的理論去更好的指導實踐,有些數學研究工做者喜歡用一些現存的理論知識去推導若干條推論,卻不知其一:問題考慮不全極可能是個錯誤的推論,其二:他的推論在現實生活中找不到原型,不能指導實踐。嚴格的說,我並非一個理想主義者,政治課上學的理論聯繫實際一直是指導我學習科學文化知識的航標(至少我認爲搞計算機科學與技術的應當本着這個方向)。
其實咱們計算機系學數學僅學習高等數學是不夠的(典型的工科院校通常都開的是高等數學),咱們應該像數學系同樣學一下數學分析(清華計算機系開的好像就是數學分析,咱們學校計算機學院開的也是,不過老師講起來好像仍是按照高等數學講),數學分析這門科學,我們學計算機的人對它有很複雜的感情。在於它是偏向於證實型的數學課程,這對咱們培養良好的分析能力和推理能力極有幫助。個人軟件工程學導師北工大數理學院的王儀華先生就曾經教導過咱們,數學系的學生到軟件企業中大多做軟件設計與分析工做,而計算機系的學生作程序員的居多,緣由就在於數學系的學生分析推理能力,從所受訓練的角度上要遠遠在咱們平均水平之上。當年出現的怪現象是:計算機系學生的高中數學基礎在全校首屈一指(但願沒有冒犯其它系的同窗),教學課時數也僅次於數學系,但學完以後的效果卻不盡如人意。難道都是學生不努力嗎,我看未見得,方向錯了也說不必定,其中緣由何在,發人深思。
我我的的淺見是:計算機系的學生,對數學的要求當然跟數學系不一樣,跟物理類差異則更大。一般非數學專業的所?quot;高等數學",無非是把數學分析中較困難的理論部分刪去,強調套用公式計算而已。而對計算機系來講,數學分析裏用處最大的偏偏是被刪去的理論部分。說得難聽一點,對計算機系學生而言,追求算來算去的所謂"工程數學"已經完全地走進了誤區。記上一堆曲面積分的公式,難道就能算懂了數學?那倒不如現用現查,何須費事記呢?再否則直接用Mathematica或是Matlab好了。
退一萬步講,即便是學高等數學我想你們看看華羅庚先生的《高等數學導論》也是比通常的教材好得多。華羅庚在數學上的造詣不用我去多說,可是他這光輝的一輩子作得我認爲對咱們來講,最重要的幾件事情:
首先是它籌建了中國科學院計算技術研究所,這是咱們國家計算機科學的搖籃。在有就是他把不少的高等數學理論都交給了作工業生產的技術人員,推進了中國工業的進步。第三件就是他一輩子寫過不少書,可是對高校師生價值更大的就是他在病期間在病牀上和他的愛徒王元寫了《高等數學引論》(王元與其說是他的愛徒不如說是他的同事,是中科院數學所的老一輩研究員,對歌德巴赫猜測的貢獻全世界僅次於陳景潤)這書在咱們的圖書館裏竟然找獲得,說實話,當時那個書上已經長了蟲子,別人走到那裏都會閃開,但我卻格外感興趣,上下兩冊看了個遍,個人最大收穫並不在於理論的闡述,而是在於他的理論徹底的實例化,在生活中去找模型。這也是我爲何比較喜歡具體數學的緣由,正如我在上文中提到的,理論脫離了實踐就失去了它存在的意義。正由於理論是從實踐當中抽象出來的,因此理論的研究纔可以更好的指導實踐,不用於指導實踐的理論能夠說是毫無價值的。
我在系裏最愛作的事情就是給學弟學妹們推薦參考書。沒有別的想法,只是但願他們少走彎路。中文的數學分析書,通常都認爲以北大張築生老師的"數學分析新講"爲最好。張築生先生一輩子寫的書並不太多,可是隻要是寫出來的每一本都是本領域內的傑做,這本固然更顯突出些。這種老書看起來不只是在傳授你知識,而是在讓你體會科學的方法與對事物的認識方法。萬一你的數學實在太好,那就去看菲赫金哥爾茨?quot;微積分學教程"好了--但我認爲沒什麼必要,畢竟你不想轉到數學系去。吉米多維奇的"數學分析習題集"也基本上是計算型的書籍。書的名氣很大,倒不見得適合咱們,仍是那句話,重要的是數學思想的創建,生活在信息社會裏咱們求的是高效,計算這玩意仍是留給計算機吧。不過如今多用的彷佛是復旦大學的《數學分析》,高等教育出版社的,也是很好的教材。
中國的所謂高等代數,就等於線性代數加上一點多項式理論。我覺得這有好的一面,由於可讓學生較早感受到代數是一種結構,而非一堆矩陣翻來覆去。這裏不得不提南京大學林成森,盛松柏兩位老師編的"高等代數",感受至關舒服。此書至關全面地包含了關於多項式和線性代數的基本初等結果,同時還提供了一些有用的又比較深入的內容,如Sturm序列,Shermon-Morrison公式,廣義逆矩陣等等。能夠說,做爲本科生如能吃透此書,就能夠算是高手。國內較好的高等代數教材還有清華計算機系用的那本,清華出版社出版,書店裏多多,一看就知道。從抽象代數的觀點來看,高等代數裏的結果不過是代數系統性質的一些例子而已。莫宗堅先生的《代數學》裏,對此進行了深入的討論。然而莫先生的書實在深得很,做爲本科生恐怕難以接受,不妨等到本身之後成熟了一些再讀。
正如上面所論述的,計算機系的學生學習高等數學:知其然更要知其因此然。你學習的目的應該是:將抽象的理論再應用於實踐,不但要掌握題目的解題方法,更要掌握解題思想,對於定理的學習:不是簡單的應用,而是掌握證實過程即掌握定理的由來,訓練本身的推理能力。只有這樣才達到了學習這門科學的目的,同時也縮小了咱們與數學系的同窗之間思惟上的差距。
[2]計算數學基礎
機率論與數理統計這門課很重要,惋惜大多數院校講授這門課都會少些東西。少了的東西如今看至少有隨機過程。到畢業尚未據說過Markov過程,此乃計算機系學生的恥辱。沒有隨機過程,你怎麼分析網絡和分佈式系統?怎麼設計隨機化算法和協議?聽說清華計算機系開有"隨機數學",早就是必修課。另外,離散機率論對計算機系學生來講有特殊的重要性。而咱們國家工程數學講的都是連續機率。如今,美國已經有些學校開設了單純的"離散機率論"課程,乾脆把連續機率刪去,把離散機率講深些。咱們不必定要這麼作,但應該更增強調離散機率是沒有疑問的。這個工做我看仍是儘早的作爲好。
計算方法學(有些學校也稱爲數學分析學)是最後一門由數理學院給咱們開的課。通常學生對這門課的重視程度有限,覺得沒什麼用。不就是照套公式嘛!其實,作圖形圖像可離不開它,密碼學搞深了也離不開它。並且,在不少科學工程中的應用計算,都以數值的爲主。這門課有兩個極端的講法:一個是古典的"數值分析",徹底講數學原理和算法;另外一個是如今日趨流行的"科學與工程計算",乾脆教學生用軟件包編程。我我的認爲,計算機系的學生必定要認識清楚咱們計算機系的學生爲何要學這門課,我是很偏向於學好理論後用計算機實現的,最好使用C語言或C++編程實現。向這個方向努力的書籍仍是挺多的,這裏推薦你們高等教育出版社(CHEP)和施普林格出版社(Springer)聯合出版的《計算方法(Computational Methods)》,華中理工大學數學系寫的(現華中科技大學),這方面華科大作的工做在國內應算是比較多的,而我的認爲以這本最好,至少程序設計方面涉及了:任意數學函數的求值,方程求根,線性方程組求解,插值方法,數值積分,場微分方程數值求解。李慶揚先生的那本則理論性過強,與實際應用結合得不太緊,可能比較適合純搞理論的。
[3]也談離散數學
每一個學校本系裏都會開一門離散數學,涉及集合論,圖論,和抽象代數,數理邏輯。不過,這麼多內容擠在離散數學一門課裏,是否時間太緊了點?另外,計算機系學生不懂組合和數論,也是巨大的缺陷。要作理論,不懂組合或者數論吃虧可就太大了。從理想的狀態來看,最好分開六門課:集合,邏輯,圖論,組合,代數,數論。這個固然不現實,由於沒那麼多課時。也許未來能夠開三門課:集合與邏輯,圖論與組合,代數與數論。(這方面咱們學校已經着手開始作了)無論課怎麼開,學生總同樣要學。下面分別談談上面的三組內容。
古典集合論,北師大出過一本《基礎集合論》不錯。
數理邏輯,中科院軟件所陸鍾萬教授的《面向計算機科學的數理邏輯》就不錯。如今能夠找到陸鍾萬教授的講課錄像,
http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm本身去看看吧。總的來講,學集合/邏輯起手不難,普通高中生都能看懂。但越日後越感受深不可測。
學完以上各書以後,若是你還有精力興趣進一步深究,那麼能夠試一下GTM系列中的《Introduction to Axiomatic Set Theory》和《A Course in Mathematical Logic》。這兩本都有世界圖書出版社的引進版。你若是能搞定這兩本,能夠說在邏輯方面真正入了門,也就不用再浪費時間聽我瞎侃了。
聽說全中國最多隻有三十我的懂圖論。此言不虛。圖論這門科學,技巧性太強,幾乎每一個問題都有一個獨特的方法,讓人頭痛。不過這也正是它魅力所在:只要你有創造性,它就能給你成就感。個人導師說,圖論裏面隨便找一塊東西就能夠寫篇論文。你們能夠體會裏面內容之深廣了吧!國內的圖論書中,王樹禾老師的"圖論及其算法"很是成功(順便推薦你們王先生的"數學思想史",我的認爲了解科學史會對咱們的學習和研究起到很大的推進做用)。一方面,其內容在國內教材裏算很是全面的。另外一方面,其對算法的強調很是適合計算機系(原本就是科大計算機系教材)。有了這本書爲主,再參考幾本翻譯的,如Bondy & Murty的《圖論及其應用》,人民郵電出版社翻譯的《圖論和電路網絡》等等,就馬馬虎虎,對本科生絕對足夠了。再進一步,世界圖書引進有GTM的"Modern Graph Theory"。此書確實經典!國內好象還有一家出版了個翻譯版。不過,學到這個層次,仍是讀原版好(說實話,主要是親身體驗翻譯版的弊端,這個你們本身體會)。搞定這本書,也標誌着圖論入了門。
離散數學方面咱們北京工業大學實驗學院有個世界級的專家,叫邵學才,復旦大學機率論畢業的,教太高等數學,線性代數,機率論,最後轉向離散數學,出版著做無數,論文集新加坡有一本,堪稱經典,你們想學離散數學的真諦不妨找來看看。這老師的課我專門去聽過,極爲經典。不過你要從他的不經意的話中去挖掘精髓。在同他的交談當中我又深入地發現一個問題,雖然說邵先生寫書無數,但依他本身的說法每本都差很少,我實在以爲詫異,他說主要是有大綱的限制,不便多寫。這就難怪了,不多據說國外寫書還要依據個什麼大綱(就算有,內容也寬泛的多),不敢越雷池半步,這樣不是看誰的都同樣了。外版的書好就好在這裏,最新的科技成果裏面都有論述,別的先不說,至少?quot;緊跟時代的理論知識"。
原先離散數學和數據結構歸在一塊兒成爲離散數學結構,後來因爲數據結構的內容比較多,分出來了,不過最近國外好像有些大學又把它們合併到了一塊兒,道理固然不用說,可能仍是考慮到交叉的部分比較多。比較經典的書我看過得應算是《Discrete Mathematical Structures》了,清華大學出版社有個影印版的。
[4]續談其餘的一些計算數學
組合數學我看的第一本好像是北大捐給咱們學院的,一本外版書。感受沒有太適合的國產書。仍是讀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(離散)。無論連續數學仍是離散數學,只要是能與咱們研究的內容掛上鉤的都是有用的數學!
二、理論與實際的結合--計算機科學技術研究的範疇與學習方法
前面主要是從數學角度來看的。從計算機角度來看,理論計算機科學目前主要的研究領域包括:可計算性理論,算法設計與複雜性分析,密碼學與信息安全,分佈式計算理論,並行計算理論,網絡理論,生物信息計算,計算幾何學,程序語言理論等等。這些領域互相交叉,並且新的課題在不斷提出,因此很難理出一個頭緒來。想搞搞這方面的工做,推薦看中國計算機學會的一系列書籍,至少表明了我國的權威。下面隨便舉一些例子。
因爲應用需求的推進,密碼學如今成爲研究的熱點。密碼學創建在數論(尤爲是計算數論),代數,信息論,機率論和隨機過程的基礎上,有時也用到圖論和組合學等。不少人覺得密碼學就是加密解密,而加密就是用一個函數把數據打亂。這樣的理解太淺顯了。
現代密碼學至少包含如下層次的內容:
第一,密碼學的基礎。例如,分解一個大數真的很困難嗎?可否有通常的工具證實協議正確?
第二,密碼學的基本課題。例如,比之前更好的單向函數,簽名協議等。
第三,密碼學的高級問題。例如,零知識證實的長度,祕密分享的方法。
第四,密碼學的新應用。例如,數字現金,叛徒追蹤等。
密碼學方面值得推薦的有一本《應用密碼學》還有就是平時多看看年會的論文集,感受這種材料實用性比較強,會提升很快。
在分佈式系統中,也有不少重要的理論問題。例如,進程之間的同步,互斥協議。一個經典的結果是:在通訊信道不可靠時,沒有肯定型算法能實現進程間協同。因此,改進TCP三次握手幾乎沒有意義。例如時序問題。經常使用的一種序是因果序,但因果序直到不久前纔有一個理論上的結果....例如,死鎖沒有實用的方法能完美地對付。例如,......操做系統研究過就本身去舉吧!
若是計算機只有理論,那麼它不過是數學的一個分支,而不成爲一門獨立的科學。事實上,在理論以外,計算機科學還有更廣闊的天空。
我一直認爲,4年根本不夠學習計算機的基礎知識,由於面太寬了,要是真學的話,我想至少8年的學習能使你具備必定的科學素養......
這方面我想先說說咱們系在各校廣泛開設的《計算機基礎》。在高等學校開設《計算機基礎課程》是我國高教司明文規定的各專業必修課程要求。主要內容是使學生初步掌握計算機的發展歷史,學會簡單的使用操做系統,文字處理,表格處理功能和初步的網絡應用功能。可是在計算機科學系教授此門課程的目標決不能與此一致。在計算機系課程中目標應是:讓學生較爲全面的瞭解計算機學科的發展,清晰的把握計算機學科研究的方向,發展的前沿即每個課程在整個學科體系中所處的地位。搞清各學科的學習目的,學習內容,應用領域。使學生在學科學習初期就對整個學科有一個總體的認識,以作到在從此的學習中清楚要學什麼,怎麼學。計算機基本應用技能的位置應當放在第二位或更靠後,由於這一點對於本系的學生應當有這個摸索能力。這一點很重要。推薦給你們一本書:機械工業出版社的《計算機文化》(New Perspective of Computer Science),看了這本書我才深入的體會到本身仍是個計算機科學初學者,才比較透徹的瞭解了什麼是計算機科學。科學出版社的《計算科學導論》(趙致琢先生的著做)能夠說是在高校計算機教育改革上做了不少的嘗試,也是這方面我受益很大的一本書。
一個一流計算機系的優秀學生決不應僅僅是一個編程高手,但他必定首先是一個編程高手。我上大學的時候,第一門專業課是C語言程序設計,念計算機的人從某種角度講至關一部分人是靠寫程序吃飯的。在咱們北京工業大學實驗學院計算機系裏一直有這樣的爭論(時至今日CSDN上也有),關於第一程序設計語言該用哪種。我我的認爲,用哪一種語言屬於末節,關鍵在養成良好的編程習慣。當年老師對咱們說,打好基礎後學一門新語言只要一個星期。如今我以爲根本不用一個星期,前提是先把基礎打好。不要再猶豫了,學了再說,等你抉擇好了,別人已經會了幾門語言了。
[1]專談計算機系統的學習
彙編語言和微機原理是兩門特煩人的課。你的數學/理論基礎再好,也佔不到什麼便宜。這兩門課之間的次序也比如先有雞仍是先有蛋,不管你先學哪門,都會牽扯另外一門課裏的東西。因此,只能靜下來慢慢琢磨。這就是典型的工程課,不須要太多的聰明和頓悟,卻須要水滴石穿的漸悟。有關這兩門課的書,計算機書店裏不難找到。弄幾本最新的,對照着看吧。組成原理推薦《計算機組成與結構》清華大學王愛英教授寫的。彙編語言你們拿8086/8088入個門,以後必定要學80x86彙編語言。實用價值大,不落後,結構又好,寫寫高效病毒,高級語言裏嵌一點彙編,進行底層開發,總也離不開他,推薦清華大學沈美明的《IBM-PC彙編語言程序設計》。有些人說不想了解計算機體系結構,也不想製造計算機,因此諸如計算機原理,彙編語言,接口之類的課以爲不必學,這樣合理嗎?顯然不合理,這些東西早晚得掌握,確定得接觸,並且,這是計算機專業與其餘專業學生相比的少有的幾項優點。作項目的時候,瞭解這些是很是重要的,不可能說,僅僅爲了技術而技術,只懂技術的人最多作一個編碼工人,而永遠不可能全面地瞭解整個系統的設計,而編碼工人是越老越不值錢。關於組成原理還有個講授的問題,在我學這門課程時老師講授時把CPU工做原理譽微程序設計這一塊略掉了,理由是咱們國家搞CPU技術不如別的國家,搞了這麼長時間好不容易出了個龍芯比Intel的還差個十萬八千里,因此建議咱們不要學了。我看這在各校也未見得不是個問題吧!若真是如他所說,那中國的計算機科學哪一個方向均可以停了,軟硬件,應用,有幾項搞得過美國,搞不過別人就不搞了,那咱們坐在這裏幹什麼?教學的觀念須要轉變的。咱們學校如今有一個學弟就專攻CPU設計,平時交流很多,發現他可以將軟件的設計思想應用到芯片設計上,我看真的是不錯的,比起那些望而生畏的恐怕要強上百倍。
模擬電路這個學科,現在不只計算機系學生搞不定,電子系學生也多半懼怕。若是你真想軟硬件通吃,那麼建議你先看看邱關源的"電路原理",也許此後再看模擬電路底氣會足些。教材:康華光的"電子技術基礎"(高等教育出版社)仍是不錯的(我校電子系在用)。有興趣也能夠參考童詩白的書。
數字電路比模擬電路要好懂得多。推薦你們看一看北京工業大學劉英嫺教授寫的《數字邏輯》。業績人士都說這本書頗有參考價值(機械工業出版社的)。緣由很明瞭,實用價值高,能聽聽她講授的課程更是有一種"享受科學"的感受。清華大學閻石的書也算一本好教材,遺憾的一點是集成電路講少了些。真有興趣,看一看大規模數字系統設計吧(北航那本用的還比較多)。
計算機系統結構該怎麼教,國際上還在爭論。國內能找到的較好教材爲Stallings的《Computer
Organization and Architectureesigning for Performance》(清華影印本)。國際上最流行的則是《Computer architecture: aquantitative approach》, by Patterson & Hennessy。
[2]一些其餘的專業課程
操做系統能夠隨便選用《操做系統的內核設計與實現》和《現代操做系統》兩書之一。這兩部均可以算經典,惟一缺點就是理論上不夠嚴格。不過這領域屬於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不等於懂數據庫。(這世界上自覺得懂數據庫的人太多了!)數據庫設計既是科學又是藝術,數據庫實現則是典型的工程。因此從某種意義上講,數據庫是最典型的一門計算機課程--理工結合,互相滲透。另外推薦你們學完軟件工程學後再翻過來看看數據庫技術,又會是一番新感受。至少對一些基本概念與描述方法會有很深的體會,好比說數據字典,E-R圖之類的。推薦教材:Abraham
Silberschatz等著的 "Database System
Concepts".做爲知識的完整性,還推薦你們看一看機械工業出版社的《數據倉庫》譯本。
計算機網絡的標準教材仍是來自Tanenbaum的《Computer Networks》(清華大學有譯本)。還有就是推薦謝希仁的《計算機網絡教程》(人民郵電出版社)問題講得比較清楚,參考文獻也比較權威。不過,網絡也屬於Hardcore System,因此光看書是不夠的。建議多讀RFC,
http://www.ietf.org/rfc.html裏能夠按編號下載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.鼻祖嘛! 關於網絡安全我也想在這裏說兩句,隨着計算機技術的發展,整個社會的信息化水平日新月異,計算機網絡技術突飛猛進,網絡成了立即社會各個工做領域不可缺乏的組成部分,只要有網絡存在,網絡安全問題就是一個必須解決好的問題,學習網絡安全不是簡簡單單的收集一些黑客工具黑一黑別人的網站,而是要學習他的數學原理,實現原理,搞清底層工做機制,這樣才能解決大部分的現有問題和新出現的安全問題。 總的來講信息安全學的研究仍是很是深奧的,這方面體會比較深的要算是在最近的微軟杯程序設計大賽中利用.NET平臺開發的那個項目My E-business Fairy.NET過程當中了。 [3]閒聊軟件工程 關於計算機科學的一些邊緣科學我想談一談軟件工程技術,對於一個企業,推出軟件是否是就是幾個程序員坐在一塊兒,你寫一段程序,我寫一段程序呢?顯然不是。軟件工程是典型的計算機科學和數學,管理科學,心理學,社會學等學科的綜合。它使咱們這些搞理論和技術的人進入了一個社會。你所要考慮的不只僅是程序的優劣,更應該考慮程序與軟件的區別,軟件與軟件產品的區別,軟件軟件產品的市場前景,如何去更好的與人交流。這方面我還在學習階段,之後這方面再寫文章吧,先推薦給你們幾本書:暢銷20年不衰的《人月神話》(清華大學中文版,中國電力出版社影印版),《軟件工程-實踐者研究的方法》(機械工業出版社譯本),《人件》(聽說每一位微軟公司的部門經理都讀過這本書,推薦老總們和想當老總的同窗都看看,瞭解一下什麼是軟件企業中的人)以及微軟公司的《軟件開發的科學與藝術》和《軟件企業的管理與文化》(研究軟件企業的制勝之道固然要研究微軟的成功經驗了!) 看完上面的書,結合本身作的一些團隊項目,個人一些比較深的體會有這麼幾點: 1.How important a plan is for a project development. 2.How to communicate with your team members in a more effective way. 3.How to solve unexpected situations. 4.The importance of unification. 5.The importance of doing what you should do. 6.The importance of designing before programming. 7.The importance of management. 8.The importance of thinking what your teammates think. 在軟件開發過程當中咱們應當具備如下能力: 1.Like it if you would like to do it. We believe that your attitude toward your work will definitely makes great effect on the project. 2.The spirit of group working. Take myself as an example. I am just a part of the team, just a little part. You must make it clear that you are just a member of the team, but your effort will change your project a lot. 3.Passion With passion, you can do your job in a more effective way. 4.The ability of solving unexpected problems. 5.Learning New things in a very short time It is the basic requirement for we computer major to learn new technology. 6.Creativity The tools are changing. As for us, what's more important is to use these new tools and technology to enable people and businesses throughout the world to realize their full potential. 7.The ability to do your work independently. Every member has his own business. In a team, your work cannot be replaced by others' so you must do your business well in order to assure the project development process. 團隊開發當中的一些具體精神應當有: <1> Success and Failure is not one person's effect. Your team's success is not the contribution of a single person. Success contributes to the whole team. If your project failed, it also is not just because of one person's poor work. It is also your failure. <2> Learn from each other. Every person has his own specialty. Even Bill Gates cannot know all the things about software development. We often learn from each other and gains a lot. The old saying goes like this: There must be one out of three who can be your teacher. In our team we say: Every person is your teacher. <3> Help those who have problems. Use the group working spirit to overcome all the difficulties. There is no need to explain it. As the old saying: Two heads are better than one. We always find it difficult to solve all the problems just by oneself. <4> Praise them who have got some improvement. In our team, I always praise the members when they have finished something or just solved one problem, and they think that it is interesting and gains a lot. Because they can see their efforts. <5> Say something if needed. 這個是一次軟件大賽當中的體會,和你們也作個交流,不過不能再說了,軟件工程學提及來寫本2000頁的書一點也很少,恕我才疏學淺,再也不作過多論述了。 [4]談談學習態度的問題 關於計算機技術的學習我想是這樣的:學校開設的任何一門科學都有其滯後性,不要總認爲本身掌握的某門技術就已是天下無敵手了,雖然如今Java,VB,C,C++用的都不少,怎能保證沒有被淘汰的一天,我想.NET平臺的誕生和X#語言的初見端倪徹底能夠說明問題。換言之,在咱們掌握一門新技術的同時就又有更新的技術產生,身爲當代的大學生應當有緊跟科學發展的素質。舉個例子,就像有些同窗總說,我作網頁設計就喜歡直接寫html,不肯意用什麼Frontpage,Dreamweaver。能用語言寫網頁當然很好,但有高效的手段你爲何不使呢?僅僅是爲了顯示本身的水平高,unique? 我看真正水平高的是可以以最快的速度接受新事物的人。高級程序設計語言的發展突飛猛進,從此的程序設計就像人們在說話同樣,我想你們從xml中應是有所體會了。難道咱們真就寫個什麼都要用匯編,以顯示本身的水平高,真是這樣倒不如直接用機器語言寫算了。反過來講,想要以最快的速度接受並利用新技術關鍵仍是在於你對計算機科學地把握程度。 計算機技術牽扯的內容更爲普遍些,一項一項說恐怕沒個一年半載也說不清。我只想提醒你們的仍是那句話,技術與科學是不能分家的,學好了科學同時搞技術,這纔是上上策。猶如英語,原先人們與老外交流必需要個翻譯,如今滿馬路的人都會說英語。就連21世紀英語演講比賽的冠軍都輪不到英語系的學生了。計算機也是同樣的,咱們必須面對的一個現實就是:計算機真就只是一個工具,若是不具有其它方面的素養,計算機系的學生雖然不能說找不到工做,不過總有一天當其餘專業性人才掌握了計算機技術後將比咱們出色許多。緣由就在於計算機解決的大都是實際問題,實際問題的知識倒是咱們少有的。單一的計算機技術沒有立錐之地。 我想是時候指出:學習每個課程以前,都要先搞清這一課程的學習目的。這一學科的應用領域。據我自身所瞭解到的同齡同窗和低年級的同窗的學習情況:他們之中不多有人知道學一個學科的學習目的,期末考試結束了也不知道學這科作什麼用。這就失去了讀計算機科學的意義。固然這與現存的教育思想不能說一點關係都沒有。 總的來講,從教育角度來說,國內高校的課程安排不是很合理,強調理論,又不肯意在理論上深刻教育,無力接受新技術,想避開新技術又沒法避得一乾二淨。我以爲關鍵問題就是國內的高校難於突破現狀,條條框框限制着怎麼求發展。咱們雖然認識獲得國外教育的優越性,但爲何遲遲不能採起行動?哪怕是去粗取精的取那麼一點點。咱們須要改變。從咱們自身角度來說,多數人4年下來既沒有學習計算機科學的學術水平,也沒有學習計算機技術的那種韌勁。在我剛上大一時,個人計算機科學入門導師,淮北煤炭師範學院王愛平教授曾經對我說過這樣一番話:"當你選擇了計算機這一門科學,就意味着你踏上了一條不歸路,就意味着你一輩子都要爲之奮鬥……你的身後是懸崖,只有向前走,不能日後退。" 有些同窗說按照這樣學習學的東西太多,有的未見得有用,我想打個形象的比方:學校學出來的人都是一個球體,方方面面的知識都應具有。但是社會上須要球體的地方不多,反而須要的是磚和瓦,即精通某一行的人才。可是對於同等體積的物體,用球體來改造是最方便最省事的。學校的學生不少,爲了可以使更多的學生來適應這個社會,學校也就不得以把全部的學生都打形成一個球體,而後讓社會對這些學生進行再加工,成爲真正可以有用的人才。即便你很是清楚本身的未來要幹什麼,而且很是下定決心要走本身的路,這一步你也必須走,世界是在不斷變化的,你不能預料將來。想清楚,努力去幹吧! 必須結束這篇"胡侃"了,再侃下去非我力所能及。其實計算機還有不少基礎課都值得一侃。怎奈我造詣有限,不敢再讓內行恥笑。計算機科學博大精深,我只是個初學者。最後聲明:這些只針對本科階段的學習。即便把這些全弄通了,前面的路還長,計算機科學須要咱們爲之奮鬥......學習計算機科學須要韌性,更須要創新,須要激情。深入學習理論知識,敢於接受新技術的挑戰,這纔是咱們這一代人應具備的素質。最後送你們一句話"Wake up every day with a feeling of passion for the difference technology will make in people's life!"。 在我大一時無心中找到了南京大學網友sir的帖子"胡侃(理論)計算機學習",這個帖子對個人大學學習起了相當重要的做用,後來也同他進行了一些交流,寫這份材料時也引用了其中的很多觀點,並獲得了sir的支持。再有就是每次和本系司徒彥南兄的交談,都能從中學到不少東西,在這份材料中也有不少體現。這份材料是我原來在實驗學院進行新生入學教育的講稿之一,原有基礎上改進了其中我認爲不太合適的理論,修正了一些觀點,在推薦教材方面結合個人學習狀況有了較大改變。值得一提的是增長了一些計算機理論的內容,計算機技術的內容結合我國的教學狀況和咱們學習的實際狀況進行了重寫。這裏所做的工做也只是將各位學長和同窗們的學習體會以及我在學習計算機科學時的所思所想彙總在一塊兒寫了下來,很不成熟。目的就是但願可以給一些剛入學或者是學習計算機科學尚未入門的同窗以一些建議。不期可以起到多大的做用,但求能爲同窗們的學習計算機科學與技術帶來微薄的幫助。仍是那句話,計算機科學博大精深,我只是個初學者,不當之處但願你們批評指正。