作為計算機專業學生,最應該學習的課程前五位是什麼?
不論當前大學是否開設這些課程。
1. 數學課 (概率,統計,微積分等等)
2. 語言課(java,c++)
3. 數據結構和演算法
4. 計算機網路
5. 操作系統和編譯原理
計算機專業概念有點大。我本人畢業於國防科技大學計算機科學與技術專業,個人覺得就計算機科學與技術(CS)專業而言,以下這些是必修的:
1、計算機組成原理(包括先修課程「數字邏輯與數字系統」,簡稱「數電」):這是一門硬體基礎課,學完後你能清楚的知道如何從用最簡單的數字元件,像搭積木一樣構成整個計算機系統,那就算及格了。 一門名為計算機體系結構是本課程的擴充包,對於了解近代計算機結構體系當然是必要的,但由於這裡討論的是Top 5,因此我認為計算機組成原理更為基礎。2014-07-15:在評論里有人讓我推薦書目,我個人比較喜歡這本 Computer Systems - A Programer"s Perspective (2rd Edition)。中文譯本是《深入理解計算機系統》。在之前寫的,本文最後的補充閱讀中我也提過這本書。
2、線性代數,概率與統計和離散數學:要知道,凡是能稱之為「科學」的專業,就必須有一定的數學功底,否則難以稱作「科學」。這三門課我覺得是本科時期最重要的三門數學課,比高等數學重要。如果你想在計算機科學的道路上走遠點,那這三門可是必修的。
3、MIT開設的《Introduction To algorithm》,中文版叫《演算法導論》:我覺得應該學習它而不是國內習慣開設的《數據結構》。數據結構僅僅是演算法的一部分,國內的數據結構課程迴避了很多本質的東西,僅僅是對一些常見的數據結構的羅列,學起來總有些不痛不癢的感覺。《Introduction To algorithm》雖然有些章節夾雜著很多很讓人討厭的「數學」,但卻能從本質上帶你領略這門十分必要而且有趣兒的課。
4、操作系統與編譯原理:操作系統可以說是《演算法導論》的實驗課,最好能在學習期間自己實現一個小型的操作系統,或者操作系統各分系統的Demo。編譯原理可能是普遍本科生覺得難的一門課,但是作為CS本科生或者未來的軟體科學家,這是基礎中的基礎,學完之後所有的語言在你看來應該沒有太大的區別,這門課應該是離散數學+演算法導論的實驗課。最好能在學習期間自己實現一個小型的編譯器,語言最好能自創,或者是某個已有的你喜歡的語言的基本子集。
5、掌握一門常用的編程語言和編程技術:能了解你用過的所有的程序內部大致是怎樣的,能用你熟悉的語言編寫大部分的程序,至少不能是對任何一個程序滿頭霧水。
以上這些不難做到,我覺得是基礎中的基礎,我固執地以為,不能掌握他們就不應該獲得CS學士學位。
補充閱讀:
在評論中有位朋友這麼說道:
一看就是典型科班好學生。人生很短,學自己要用到的就好。多花時間在2、3、5是對的,甚至任選其二就能讓你受益良多、樂在其中。 1和4所起到的作用,比起它們的意義,更多的是讓一部分學生從一開始就對計算機產生失望和絕望,是抹殺學生本來的興趣的兇手。回到問題本身,既然是「應該學習」,1、4不該放在裡面,即使不學它們,我想在計算機專業的大多數領域是做得下去的。
首先,我自認為不是典型的中國式的「典型科班好學生」。這裡列出的Top 5不是為了成為「典型科班好學生」,因為光學好這5門絕不夠「好」;更不是為了「在計算機領域做得下去」,我相信在某個計算機領域,比如作為Microsoft Office的金牌培訓講師,只要精通Office就能幹得很棒。
這裡列出的Top 5是作為一個計算機科學與技術專業畢業生該有的知識儲備,是這個專業的根基。如果你對這個專業真正有興趣,並且熱愛它,那我認為學習這裡列出的Top 5會是個不錯的選擇。
當然,對於一個計算機世界的從業人員,學好它們也會收益良多。比如對於程序員來說,操作系統與編譯原理這門課能夠讓你對你的程序如何在計算機里出生,運行,死亡有個好的認識,在我的編程經驗中,我覺得這種認識讓我收益良多。很多朋友也許知道有一本經典的書籍叫「Computer Systems:A Programer"s Perspective」,裡面的基礎就是來源於操作系統與編譯原理。
還是那句話,如果你喜歡CS,這5門課是必須的,要是在這5門課上感到失望或者絕望,我想你該考慮換個專業了。
1。英語
業界所有從基礎到前沿的文檔,全是英語,英語不合格的人,或者不能流暢閱讀英文技術文檔的人根本不適合在該專業學習。所以我把它表明為 No. 1
2。編譯原理與操作系統。
上面兩個是你在實際工作中基本沒多少機會去學,但是又非常有用的基礎知識。另外,把編譯原理學通要求你至少精通一種語言,因此我就不再單獨列出需要學習什麼編程語言了。
3。邏輯與數學建模。
如果有這樣的課的話,應學,這本是國人比較缺乏的東西,但是作為程序員來說,又是必須要有的東西,用計算機的思想去思考現實中的事物與流程。
4。測試與用戶交互。
如果有這樣的課的話,應學,現實中,對很多產品,測試員成為最了解這個產品的人,他也最了解這個產品在用戶手中看起來是什麼樣子,用起來是什麼樣子。也最能夠理解下一款產品我們可能需要什麼功能。不需要什麼功能。
由於多了三個「與」字,我已經超五個了,就不說了。
八年前剛入行時候的排序:
- 數據結構和演算法
- Java或C++
- 操作系統
- 編譯原理
- 體系結構
現在的排序:
- 線性代數、離散數學、概率統計
- 體系結構
- 數據結構和演算法
- C,C++或Java(面向對象),Python或Ruby(腳本),Lisp或ML或Haskell(函數式)
- 操作系統原理加Linux或BSD內核
需要詳細解釋請回復。
我更想列一些能夠教人如何思考的課程而不是教給人新鮮知識的課程,因為後者可能有很多而且對不同的人都不一樣,但是前者可能會更統一一點。
1、演算法。沒學過演算法的人是不可能像計算機工作者一樣思考問題的。此門課程必不可少。
2、古典概率論。這裡指的是建立在組合計數基礎上的概率論而不是建立在分布函數基礎上的概率論。雖然後者可能更有用,但是前者更能教人如何正確地解決與直覺相悖的問題。
3、計算理論與複雜度理論。這門課程可以使人建立起對於「不能解決的問題」的正確感受。
4、近似演算法與隨機演算法。這門課程可以使人建立起對於「最優解決方案與較優解決方案」的正確感受。
5、並行協議與分散式演算法。這門課程可以使人建立起對於並行解決問題的直觀感受。
我理解的計算機系四大核心課程
1 計算機體系結構
2 數據結構與演算法分析
3 操作系統
4 編譯原理
============================
可是經過長期的實踐和各種交流之後,我發現最重要的3門課就是語數外了。遇到太多的人,連自己要問的問題都不能很好的表達,給了他一些資料,也無法很好地理解,遇到英文資料,直接就打退堂鼓。
正統篇
1. 編程入門(如C、python 等)
2. 數學基礎(一階邏輯系統、集合論、圖論、線性代數、微積分、概率論)
3. 數據結構與演算法
4. 軟體理論入門(形式語言、自動機)
5. 體系結構(數字電路、CPU設計、操作系統、編譯器、網路協議)
理論篇
1. 邏輯(一階邏輯、時序邏輯)
2. 代數(線性代數、抽象代數)
3. 演算法(設計、複雜度分析、證明)
4. 軟體理論(形式語言、自動機、可計算性理論)
5. 程序語言理論(Lambda 演算、類型系統、證明論等)
系統篇
1. C 語言是彙編的語法糖
2. 造台計算機(CPU)
3. 寫個工具鏈(編譯器後端工具鏈構建)
4. 操作系統(原理和實現)
5. 計算機網路(原理和協議棧實現)
機器學習篇
1. python入門
2. 概率論、統計
3. 機器學習導論
4. 人工神經網路
5. 調參實踐
前端篇
1. 前端審美基礎(HTML5、CSS)
2. javascript入門
3. 多範式編程(面向對象、函數式、非同步)
4. 工程管理導論(如何版本控制、如何炒別人網站的樣式、如何忽悠項目經理)
5. 前端項目實踐(如何使用框架)
======= 更新 2016-06-06 =======
前端進階篇
1. javascript進階
2. 數據可視化
3. UI 交互理論
4. 函數式編程
5. FRP (Functional Reactive Programming)
後端篇
1. 編程入門(python/PHP/etc.)
2. 網站開發導論(HTTP、Web 3.0、MVC 架構、流行的後端框架)
3. 資料庫架構設計
4. OAuth 與 Restful API 的哲學和設計
5. Saas 項目實戰
後端進階篇
1. 並行程序設計
2. 密碼學
3. 計算機網路
4. 函數式編程(Scala)
5. Reactive Programming
軟體工程(現實)篇
(假設已經有編程基礎)
1. 需求分析(如何與用戶撕*)
2. UML建模(如何增加文檔頁數)
3. 敏捷開發(如何壓榨程序員、為什麼用戶需求又變了)
4. 測試(如何用完項目經費)
5. 部署與運維(為什麼客戶老是反映系統有 bug)
軟體工程(理想)篇
(假設已經有編程基礎)
1. 軟體開發方法導論(瀑布式開發、敏捷開發、模型驅動開發)
2. Web 和移動端應用開發實戰
3. 軟體系統形式化建模(Petri 網、時間自動機、進程代數等)
4. 測試與驗證(單元測試、運行時驗證、模型檢測)
5. 模型驅動開發實戰
形式驗證篇
(假設已修:微積分、概率論、隨機過程、離散數學、代數)
1. 軟體理論基礎(形式語言、自動機、可計算性理論)
2. 程序構造與解釋
3. 模型檢測與軟體驗證(時序邏輯、模型檢測演算法、靜態分析、謂詞抽象)
4. 定理證明(Coq、Isabelle)
5. 形式化方法前沿專題(概率模型檢測、程序綜合、運行時驗證)
===== 回答幾個評論區的問題 =====
1. 英語放進去?
假設學術英語作為已修課程。
2. 軟體開發和數學的聯繫?
引用某老師課上的話,「如果你只是想做一個『碼農』,即項目的需求已經明確了,框架也有架構師搭好了,甚至於介面都已經定義清楚了,剩下你做的只是編碼去實現這個介面,那麼你確實不需要數學。但是如果你想做比這個高一點點層次的東西,就會發現數學是很用的。」
貼個鏈接吧
Students - Guide to Technical Development
直接學編程。
然後,在實際運用中慢慢補充各種知識。
「學習」沒有「應不應該」之分,
讓興趣當自己的導師 ~
比如,
當他發現他自己寫的排序怎麼這麼慢的時候,他自然會去學「數據結構和演算法」;
當他想做一個自動抓取網頁信息的robot的時候,他自然會去學「計算機網路」里數據包里有些什麼;
當他對谷歌街景里的方向識別技術感到神奇的時候,他自然會去學「計算機圖形學」和「線性代數」;
當他真的想知道CPU是怎麼工作的,他自然回去學「計算機組成原理」;
。。。
在你感興趣的方面,按我說的這樣學習,我不信你成不了牛人。
同意的頂!
=_=入坑十年後我的回答
1、數學(微積分、線代、概率論、數理統計、離散數學);
2、英語(最好IELTS 6分吧);
3、學精一門語言,推薦Python;
4、數據結構和演算法;
5、理解計算機系統。
沒事多鍛煉下「計算機思維」,
Ms Pro周以真有個這樣的講座來著。
五門課程如果推薦起來也許有些難度,因為每個人的興趣是不一樣的。
不認同數電是cs畢業必學的。
對cs有一個總體的認識的話,我覺得有五本書非常重要,也是你首先應該看的。它們分別對應了大部分cs畢業生,技術生涯中所要一直關注的五個重要領域。
《深入理解計算機系統》對應一門對cs學生來說可以說是最重要的課程:計算機導論
《TCP IP詳解》對應 計算機網路
《The C Programming Language》這本不用說了,國內的翔一樣的教材會讓你走很多彎路
《現代操作系統》對應操作系統
《演算法導論》這個也不用說了
作為一名程序員,演算法,OS,網路這些計算機科學本身的東西,會讓你走的更遠。1.操作系統。
2.數據結構。
3.計算機組成原理。
4.計算機網路。
5.c語言
1 英語,美國是計算機技術的前沿,掌握優秀的英語水平對於學習計算機幫助很大 《雪豹》里竹下俊說過這麼句話,你看譯本,最多能達到譯者對這本書的理解,看原本,你可以達到作者的理解
2 演算法,編程語言有許多,不同的人有不同的編程風格,唯有演算法萬變不離其宗。熟悉演算法,便可以化進任意一門語言當中
3 計算機組織與體系結構 從硬體層面了解計算機。現在的大學對計算機專業的教學普遍偏軟,卻忘了軟體的實現是建立在硬體的基礎上的。不了解計算機的構造,很難學好這個專業
4 網路 任何一台計算機都離不開互聯網。我這裡說的網路很寬泛,網路安全,無線感測器網路等等都算。一台連不上網的計算機真的什麼都幹不了。
5 數學 雖然我不喜歡數學,但不得不承認數學是一切理工科專業的基礎,其中也包含了基礎的演算法
本人現在是計算機專業大三的學生。結合自己學院課程的設置和個人的理解,想談談自己的看法,括弧中是本校相關課程的教材和開設時間,畢竟學院這麼多年教學,是有它開課的道理的。這裡感謝張小兵同學的精彩答案。
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)
總之,計算機專業的學習還是需要一個循序漸進的過程,追求系統的學習,對某些知識一定要理解深,挖得透,用我們體系結構老師的話,你要做一個沉在水底的人,而不是浮在水面上。你用一個月學習的東西,也許只夠你用一個月,你用三個月學習的東西,可能夠你用一年,但是你用十年學習的東西,一定夠你用一輩子。
2016年6月30日更新
看了下我原來的答案有點不知所云,我也不知道原來為什麼寫成這樣的一個答案。
重新更新下:
演算法(含數據結構),C++,彙編語言,編譯原理,計算機組成,面向對象
| 密碼學。
請注意,你可能未必同時投入精力去學全部成為全才,所以上面的分隔符是個「或」。
--
由於知乎扣了我的友好度,所以我沒辦法發表評論了。
1、操作系統原理
2、數據結構和演算法
3、計算機網路
4、英語
5、精通一門語言
精通C
精通各種數學
精通演算法
看得懂英文版《深入理解計算機系統》
精通體育
想到的第一個是:表達能力訓練課
俺見過不會表達(語言、文字)的計算機工程師,太多了
計算機專業。。雖然我不是CS的但是想轉CS,所以說一點自己的看法
首先是編程基礎。推薦MIT的6.00這門課用Python講了編程基礎,尤其有很多的演算法思想會令後面的學習更容易。當然改版前的6.00也很好對應的教材是SICP,語言是Scheme。
接下來是數學。
數學課的話離散是必須的,概率論,線性代數也是必須的。Knuth有一本書叫具體數學,據說涵蓋了計算機專業必須的數學知識。
演算法與數據結構
推薦演算法導論以及對應的MIT的課程,不過比較數學,如果側重實踐不如看Coursera上Princeton的演算法課,還能學一學Java。
可計算理論
今年剛上了這門課,我們的教材是computability:an introduction to recursive function theory.我們老師說這本書高中生就可以看懂。。總的來說挺難的,不過真的是非常有趣。能發現好多東西背後的邏輯。
然後系統方向
ics推薦CSAPP(中文譯名深入理解計算機系統)網上可以下到所有的slides和lab對應CMU15213
操作系統和編譯原理
操作系統推薦MIT6.828的lab
編譯原理的話交大用的是龍書,但是我其實學的有點懵,據說虎書對初學者更友好
其實還應該學一學程序設計語言的。能理解更多的編程范形。
以上。並不專業求輕噴。
上面的回答都太理論,EE/BME背景的非計算機專業的小生認為實踐乃是第一必修課,參考http://www.udacity.com/ 和 https://www.coursera.org/ 的現有網上課程(包括很多計算機相關的基礎課、中級乃至高級課程),推薦畢業後不以科學研究(讀博士,當教授)為目的的計算機前5門課程分別為:
1.計算機基礎(推薦https://www.coursera.org/course/cs101 )每周1天,大概6周就夠了,了解下計算機基本原理,懂點簡單的編程,並具體實踐操作,從實踐中體驗計算機的魅力。
2.簡單具體的編程實踐(項目)課(推薦http://www.udacity.com/overview/Course/cs101/ 建個搜索引擎),每周1天,大概7周就夠了。學計算機專業的人不懂搜索那簡直就是個大笑話,計算機專業有那麼酷應用,活生生的擺在現實生活中,自己若能獨立或幾個人合作做個小項目,比如建個學校bbs上面可以用的小小搜索引擎,那比讀一堆似懂非懂的理論然後n年後再來實踐有效多了。
3.數據結構或演算法導論(乃至概率統計、線性代數、離散數學),有了之前2門課程基礎,再學數據結構和演算法相關的,就沒那麼抽象了,邊學邊實踐,繼續以項目實踐為方法,從數學理論的角度比較系統的學習相關的經典理論,站在理論的高度上去理解計算機科學,並加於實踐、深入。(暫時沒有學過的好的網上課程,不過估計這門課會不錯https://www.coursera.org/course/algo )學這門課程同時結合c、java或c++等語言來做項目,理論聯繫實踐,只要功夫身,估計就可以畢業,並找到不錯的工作了。
4.計算機網路或操作系統。信息時代,互聯網、移動互聯網時代,學計算機的不懂操作系統,不懂網路之間的通訊、協議,那會被別人笑話的,以實踐為第一方法,通過項目實踐來學習。(找不到合適的網上課程,推薦稍微有點點相關的實踐課 http://www.udacity.com/overview/Course/cs253/ )
5.機器學習、人工智慧。推薦https://www.coursera.org/course/ml 這機器學習課程是我學過的最牛逼相對通俗易懂,通過實踐能收穫很大的網上課程。另外推薦http://www.udacity.com/overview/Course/cs373 跟世界上最牛逼的人工智慧專家之一學點機器人應用估計再也不會覺得學計算機沒用了,好好學正常前途無量,不管是在工業界還是學術界混。這應該算中高級課程了,能體現計算機與非計算機專業實力區別的好地方,繼續強調實踐動手(編程)能力,通過實踐深入理解並掌握相關的理論知識。
最後多廢話點,推薦1門以讀博為目的高級課程,課程水平應該是屬於研究生階段的,但學好前面4門課程並掌握好本科概率統計基礎課程的也可以開始學了,課程非常難、非常棒、也非常有用:6.Probabilistic Graphical Models(https://www.coursera.org/course/pgm )。學了這門科,不管你是做圖像分割、語言識別、還是搞生物信息學的,都大大有益。當然,這門課程絕對不是浮躁的人能學得來的,課程作業保證你累死累活的,不過若能努力堅持並完成裡面的編程、測試作業,那成就感不用說,學完後,你的計算機科學水平估計超過國內99%以上的學生,甚至超過許多國內計算機系的教授水平。走工業界的話,在大數據(海量數據)分析時代,你應該很容易、有很多機會大展身手。
推薦閱讀: