作為計算機專業學生,最應該學習的課程前五位是什麼?【知乎】
阿新 • • 發佈:2019-01-11
本人現在是計算機專業大三的學生。結合自己學院課程的設定和個人的理解,想談談自己的看法,括號中是本校相關課程的教材和開設時間,畢竟學院這麼多年教學,是有它開課的道理的。這裡感謝張小兵同學的精彩答案。
1. 數學類的課程:離散數學(《離散數學教程》,北大出版社)
其實個人覺得圖論是最有用的部分,無論是演算法設計還是工程應用,而群論,組合學,數理邏輯部分卻始終不知道具體如何應用,還得繼續學習。至於線性代數和概率統計,同樣重要,特別是線性代數體現了很多計算機的思維方式,不過相比於圖論,個人覺得離散數學更重要。當然先修課程高等數學是必不可少的,甚至我覺得概率統計應該在高數學完後立刻學,不該拖到大三。
(高等數學:大一上下;線性代數:大一上;離散數學:大二上下,大三上;概率統計:大三上)
2. 硬體類課程:計算機體系結構(《計算機組成與設計》,David Patterson;John Hennessy著,機械工業出版社)
這門課是理解計算機內部的構造,指令體系的設計(基本是都是學MIPS的),流水線以及硬軟體藉口,學完該課程應該能自己模擬一個CPU或者Cache,其中的成就感是無法描述的。這門課在UC Berkeley是大一學的,從理解課程的角度,大一學生完全沒有問題的,前提是改變學習的方式。
重點無疑是理解,上課時老師講的一個例子是,我們統計資料的時候,平均數大多用算術平均數,在他博士時有一次發現算術平均數不對,需要用幾何平均數才符合計算結果。雖然幾何平均數我們初中就學會了,但是當時除了做不等式,我們基本從來沒想過它有什麼用,那次實驗讓他真正理解了幾何平均數,也值得我們反思國內的教學。
事實上,目前從我們學院看來先修課程有數字邏輯設計和微機原理,其實內容很多重複,包括DRAM,SRAM講了三遍等等。
(數字邏輯設計:大二上;數字邏輯設計實驗:大二下;微機原理,微機實驗:大二下;計算機體系結構:大三上)
3. 軟體類課程:資料結構與演算法 (《資料結構與演算法》,高等教育出版社)
事實上,如果大一開始學習的是C++語言的話,要想真正理解面向物件的部分,包括STL,容器等等,需要學習資料結構與演算法。演算法的學習確實很重要,也很有趣,但是對於大多數將來在企業工作的普通人來說,對於演算法的追求絕不是ACM大賽上那種情形,更多的是基本知識,基本演算法的掌握和應用。而學好了資料結構與演算法這門基礎課,對你理解C++大有裨益,最大化地發揮了C++的特點。這裡補充一點,這門課和圖論同時學習效果會更好。其實學好了C++之後對於其它語言的學習也會很有幫助。
(計算概論:大一上;程式設計實習:大一下;資料結構與演算法:大二上;資料結構與演算法實習,大二上;演算法設計與方法:大二下)
PS:我們演算法設計與方法課用的教材是:《演算法導論》(應該是MIT那本教材),同時正好也是室友和他導師翻譯的最新一版,推薦閱讀。
4.編譯原理 (《編譯原理》,北大出版社;推薦使用:龍書,虎書)
編譯原理看上去很枯燥難懂,特別是對詞法,語法的分析等。雖然將來只有一少部分人會從事這方面工作,但是對於你理解各種程式語言會獲益匪淺,訓練的是基本的素質和能力,一般學完這課之後,能夠自己實現編譯器,比如我們專業編譯實習課做的是一個基於Android平臺的mini java編譯器。
(編譯原理:大二下;編譯實習:大三上)
5.作業系統(《現代作業系統》,Andrew S. Tanenbaum著,機械工業出版社)
實話說,我在上課的時候,更多的是覺得這課有點像一門科普課,但是每次的實習作業卻和上課完全不同,需要自己去查API,尋找演算法,一般是Windows和Linux兩個平臺作業。個人覺得作為一個學習計算機的人,對作業系統的理解是必須的,將來的用處也會很多。個人最大的感受就是學會查詢API,並且使用,完成大量的資料處理,這和之後一系列的開發都很有關,同時增加對Linux的熟悉。學完該課應該能自己實現一個小型作業系統,比如我們專業作業系統實習要求做的是一個小型Windows。
(作業系統原理:大三上;作業系統實習:大三下)
當然,除了這些,最好還能掌握JAVA語言,其實作為一種入門語言,我一直覺得可能JAVA比起C++更有優勢,畢竟漂亮的圖形介面比起黑框顯然更能引人入勝,當然有了C++的基礎,學習JAVA相對是會輕鬆的,JAVA學習前期不推薦使用IDE。至於其他的語言,國外那套經典的動物書是最好的選擇了,自學應該沒有問題,可以考慮一下LISP這門函式語言。除此以外,像網路,彙編,資料庫類的課程都是根據個人的興趣愛好而定了,並非基礎課程。
(JAVA,大二下,推薦書籍:瘋狂JAVA講義,雖然名字很俗,但是確實900頁的書說的非常詳細,深入淺出,很到位;程式設計技術與方法,大三上,計算機程式的構造和解釋,俗稱SICP)
總之,計算機專業的學習還是需要一個循序漸進的過程,追求系統的學習,對某些知識一定要理解深,挖得透,用我們體系結構老師的話,你要做一個沉在水底的人,而不是浮在水面上。你用一個月學習的東西,也許只夠你用一個月,你用三個月學習的東西,可能夠你用一年,但是你用十年學習的東西,一定夠你用一輩子。
1. 數學類的課程:離散數學(《離散數學教程》,北大出版社)
其實個人覺得圖論是最有用的部分,無論是演算法設計還是工程應用,而群論,組合學,數理邏輯部分卻始終不知道具體如何應用,還得繼續學習。至於線性代數和概率統計,同樣重要,特別是線性代數體現了很多計算機的思維方式,不過相比於圖論,個人覺得離散數學更重要。當然先修課程高等數學是必不可少的,甚至我覺得概率統計應該在高數學完後立刻學,不該拖到大三。
(高等數學:大一上下;線性代數:大一上;離散數學:大二上下,大三上;概率統計:大三上)
2. 硬體類課程:計算機體系結構(《計算機組成與設計》,David Patterson;John Hennessy著,機械工業出版社)
這門課是理解計算機內部的構造,指令體系的設計(基本是都是學MIPS的),流水線以及硬軟體藉口,學完該課程應該能自己模擬一個CPU或者Cache,其中的成就感是無法描述的。這門課在UC Berkeley是大一學的,從理解課程的角度,大一學生完全沒有問題的,前提是改變學習的方式。
重點無疑是理解,上課時老師講的一個例子是,我們統計資料的時候,平均數大多用算術平均數,在他博士時有一次發現算術平均數不對,需要用幾何平均數才符合計算結果。雖然幾何平均數我們初中就學會了,但是當時除了做不等式,我們基本從來沒想過它有什麼用,那次實驗讓他真正理解了幾何平均數,也值得我們反思國內的教學。
事實上,目前從我們學院看來先修課程有數字邏輯設計和微機原理,其實內容很多重複,包括DRAM,SRAM講了三遍等等。
(數字邏輯設計:大二上;數字邏輯設計實驗:大二下;微機原理,微機實驗:大二下;計算機體系結構:大三上)
3. 軟體類課程:資料結構與演算法
事實上,如果大一開始學習的是C++語言的話,要想真正理解面向物件的部分,包括STL,容器等等,需要學習資料結構與演算法。演算法的學習確實很重要,也很有趣,但是對於大多數將來在企業工作的普通人來說,對於演算法的追求絕不是ACM大賽上那種情形,更多的是基本知識,基本演算法的掌握和應用。而學好了資料結構與演算法這門基礎課,對你理解C++大有裨益,最大化地發揮了C++的特點。這裡補充一點,這門課和圖論同時學習效果會更好。其實學好了C++之後對於其它語言的學習也會很有幫助。
(計算概論:大一上;程式設計實習:大一下;資料結構與演算法:大二上;資料結構與演算法實習,大二上;演算法設計與方法:大二下)
PS:我們演算法設計與方法課用的教材是:《演算法導論》(應該是MIT那本教材),同時正好也是室友和他導師翻譯的最新一版,推薦閱讀。
4.編譯原理
編譯原理看上去很枯燥難懂,特別是對詞法,語法的分析等。雖然將來只有一少部分人會從事這方面工作,但是對於你理解各種程式語言會獲益匪淺,訓練的是基本的素質和能力,一般學完這課之後,能夠自己實現編譯器,比如我們專業編譯實習課做的是一個基於Android平臺的mini java編譯器。
(編譯原理:大二下;編譯實習:大三上)
5.作業系統(《現代作業系統》,Andrew S. Tanenbaum著,機械工業出版社)
實話說,我在上課的時候,更多的是覺得這課有點像一門科普課,但是每次的實習作業卻和上課完全不同,需要自己去查API,尋找演算法,一般是Windows和Linux兩個平臺作業。個人覺得作為一個學習計算機的人,對作業系統的理解是必須的,將來的用處也會很多。個人最大的感受就是學會查詢API,並且使用,完成大量的資料處理,這和之後一系列的開發都很有關,同時增加對Linux的熟悉。學完該課應該能自己實現一個小型作業系統,比如我們專業作業系統實習要求做的是一個小型Windows。
(作業系統原理:大三上;作業系統實習:大三下)
當然,除了這些,最好還能掌握JAVA語言,其實作為一種入門語言,我一直覺得可能JAVA比起C++更有優勢,畢竟漂亮的圖形介面比起黑框顯然更能引人入勝,當然有了C++的基礎,學習JAVA相對是會輕鬆的,JAVA學習前期不推薦使用IDE。至於其他的語言,國外那套經典的動物書是最好的選擇了,自學應該沒有問題,可以考慮一下LISP這門函式語言。除此以外,像網路,彙編,資料庫類的課程都是根據個人的興趣愛好而定了,並非基礎課程。
(JAVA,大二下,推薦書籍:瘋狂JAVA講義,雖然名字很俗,但是確實900頁的書說的非常詳細,深入淺出,很到位;程式設計技術與方法,大三上,計算機程式的構造和解釋,俗稱SICP)
總之,計算機專業的學習還是需要一個循序漸進的過程,追求系統的學習,對某些知識一定要理解深,挖得透,用我們體系結構老師的話,你要做一個沉在水底的人,而不是浮在水面上。你用一個月學習的東西,也許只夠你用一個月,你用三個月學習的東西,可能夠你用一年,但是你用十年學習的東西,一定夠你用一輩子。